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