File: /var/www/zaklada/html/node_modules/node-haste/lib/HasteDependencyLoader.js
/**
* Copyright 2013 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Simple utility for automating the loading and ordered traversal of
* dependencies, given some form of a starting point resource.
*/
/**
* A marker to mark modules as being currently visited. Helps breaks circular
* dependencies when recursing.
*/
var CURRENTLY_VISITING = {};
/**
* @param {object} orderedResources Lookup map of already traversed nodes
* @param {Resource} resource Haste Resource object.
* @param {ResourceMap} map Haste resource map.
*/
var debugResourceVisit = function(orderedResources, resource, map) {
console.log(
'[node-haste] module(' + resource.id + ') => ',
resource.requiredModules
);
for (var j = 0; j < resource.requiredModules.length; j++) {
var dependencyMod = resource.requiredModules[j];
if (orderedResources[dependencyMod.id]) {
var msg =
orderedResources[dependencyMod.id] === CURRENTLY_VISITING ?
'[node-haste] Not traversing CIRCULAR DEPENDENCY:' :
'[node-haste] Not traversing already orderedResources:';
console.log(msg, dependencyMod.requiredModules[j]);
}
if (!map.getResource('JS', resource.requiredModules[j])) {
console.log('[node-haste] Not found:', resource.requiredModules[j]);
}
}
};
/**
* Recurses through required modules graph.
*/
var getOrderedDependencies = function(map, resource, orderedResources, debug) {
if (!resource || !resource.id || orderedResources[resource.id]) {
return;
}
orderedResources[resource.id] = CURRENTLY_VISITING; // Break circ deps.
debug && debugResourceVisit(orderedResources, resource, map);
for (var i = 0; i < resource.requiredModules.length; i++) {
var dependencyResource = map.getResource('JS', resource.requiredModules[i]);
getOrderedDependencies(map, dependencyResource, orderedResources, debug);
}
orderedResources[resource.id] = resource;
};
/**
* Using a provided `Haste` instance, discovers the ordered set of dependencies
* for `options.rootJSPath`. Invokes the `options.done` callback with the
* ordered resources and the resolved resource ID `options.rootJSPath`.
*
* @param {object} options Object containing options: {
* @property {Haste} haste Configured haste instance.
* @property {ResourceMap} resourceMap ResourceMap to reuse.
* @property {string} rootJSPath Path of root JS file to load dependencies of.
* @property {function} done Invoked as done(err, rootID, orderedResources)
* @property {boolean} debug Should debug package dependencies.
* }
*/
var loadOrderedDependencies = function(options) {
var rootJSPath = options.rootJSPath;
var rootDependencies = options.rootDependencies;
var debug = options.debug;
options.haste.updateMap(options.resourceMap, function(newResourceMap) {
var orderedResources = {};
if (rootDependencies) {
for (var i = 0; i < rootDependencies.length; i++) {
var dependency = newResourceMap.getResource('JS', rootDependencies[i]);
getOrderedDependencies(
newResourceMap, dependency, orderedResources, debug
);
}
}
var resource = newResourceMap.getResourceByPath(rootJSPath);
if (!resource) {
var msg = 'Following module not in specified search paths: ' + rootJSPath;
return options.done(new Error(msg));
}
getOrderedDependencies(newResourceMap, resource, orderedResources, debug);
options.done(null, resource.id, orderedResources);
});
};
var HasteDependencyLoader = {
loadOrderedDependencies: loadOrderedDependencies
};
module.exports = HasteDependencyLoader;