react / wstein / node_modules / jest-cli / node_modules / node-haste / lib / HasteDependencyLoader.js
80657 views/**1* Copyright 2013 Facebook, Inc.2*3* Licensed under the Apache License, Version 2.0 (the "License");4* you may not use this file except in compliance with the License.5* You may obtain a copy of the License at6*7* http://www.apache.org/licenses/LICENSE-2.08*9* Unless required by applicable law or agreed to in writing, software10* distributed under the License is distributed on an "AS IS" BASIS,11* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12* See the License for the specific language governing permissions and13* limitations under the License.14*/1516/**17* Simple utility for automating the loading and ordered traversal of18* dependencies, given some form of a starting point resource.19*/2021/**22* A marker to mark modules as being currently visited. Helps breaks circular23* dependencies when recursing.24*/25var CURRENTLY_VISITING = {};2627/**28* @param {object} orderedResources Lookup map of already traversed nodes29* @param {Resource} resource Haste Resource object.30* @param {ResourceMap} map Haste resource map.31*/32var debugResourceVisit = function(orderedResources, resource, map) {33console.log(34'[node-haste] module(' + resource.id + ') => ',35resource.requiredModules36);37for (var j = 0; j < resource.requiredModules.length; j++) {38var dependencyMod = resource.requiredModules[j];39if (orderedResources[dependencyMod.id]) {40var msg =41orderedResources[dependencyMod.id] === CURRENTLY_VISITING ?42'[node-haste] Not traversing CIRCULAR DEPENDENCY:' :43'[node-haste] Not traversing already orderedResources:';44console.log(msg, dependencyMod.requiredModules[j]);45}46if (!map.getResource('JS', resource.requiredModules[j])) {47console.log('[node-haste] Not found:', resource.requiredModules[j]);48}49}50};515253/**54* Recurses through required modules graph.55*/56var getOrderedDependencies = function(map, resource, orderedResources, debug) {57if (!resource || !resource.id || orderedResources[resource.id]) {58return;59}60orderedResources[resource.id] = CURRENTLY_VISITING; // Break circ deps.61debug && debugResourceVisit(orderedResources, resource, map);62for (var i = 0; i < resource.requiredModules.length; i++) {63var dependencyResource = map.getResource('JS', resource.requiredModules[i]);64getOrderedDependencies(map, dependencyResource, orderedResources, debug);65}66orderedResources[resource.id] = resource;67};6869/**70* Using a provided `Haste` instance, discovers the ordered set of dependencies71* for `options.rootJSPath`. Invokes the `options.done` callback with the72* ordered resources and the resolved resource ID `options.rootJSPath`.73*74* @param {object} options Object containing options: {75* @property {Haste} haste Configured haste instance.76* @property {ResourceMap} resourceMap ResourceMap to reuse.77* @property {string} rootJSPath Path of root JS file to load dependencies of.78* @property {function} done Invoked as done(err, rootID, orderedResources)79* @property {boolean} debug Should debug package dependencies.80* }81*/82var loadOrderedDependencies = function(options) {83var rootJSPath = options.rootJSPath;84var rootDependencies = options.rootDependencies;85var debug = options.debug;86options.haste.updateMap(options.resourceMap, function(newResourceMap) {87var orderedResources = {};88if (rootDependencies) {89for (var i = 0; i < rootDependencies.length; i++) {90var dependency = newResourceMap.getResource('JS', rootDependencies[i]);91getOrderedDependencies(92newResourceMap, dependency, orderedResources, debug93);94}95}96var resource = newResourceMap.getResourceByPath(rootJSPath);97if (!resource) {98var msg = 'Following module not in specified search paths: ' + rootJSPath;99return options.done(new Error(msg));100}101getOrderedDependencies(newResourceMap, resource, orderedResources, debug);102options.done(null, resource.id, orderedResources);103});104};105106var HasteDependencyLoader = {107loadOrderedDependencies: loadOrderedDependencies108};109110module.exports = HasteDependencyLoader;111112113