sproutit-narwhal 0.1.106

Sign up to get free protection for your applications and to get access to all the features.
Files changed (291) hide show
  1. data/DISTRIBUTION.yml +15 -0
  2. data/README.md +86 -0
  3. data/Rakefile +349 -0
  4. data/VERSION.yml +7 -0
  5. data/bin/activate +50 -0
  6. data/bin/activate.bash +50 -0
  7. data/bin/activate.cmd +3 -0
  8. data/bin/js +67 -0
  9. data/bin/json +2 -0
  10. data/bin/narwhal +67 -0
  11. data/bin/narwhal.cmd +29 -0
  12. data/bin/sea +45 -0
  13. data/bin/sea.cmd +25 -0
  14. data/bin/tusk +2 -0
  15. data/bin/tusk.cmd +5 -0
  16. data/catalog.json +902 -0
  17. data/docs/available-packages.md +32 -0
  18. data/docs/browser-api-plan.md +290 -0
  19. data/docs/browser-api.md +153 -0
  20. data/docs/download.md +25 -0
  21. data/docs/engines.md +32 -0
  22. data/docs/json-tool.md +121 -0
  23. data/docs/lib/binary.wiki +242 -0
  24. data/docs/lib/file.wiki +325 -0
  25. data/docs/lib/os/popen.md +70 -0
  26. data/docs/modules.md +38 -0
  27. data/docs/narwhal.md +487 -0
  28. data/docs/packages-howto.md +32 -0
  29. data/docs/packages.md +30 -0
  30. data/docs/posts/2009-07-29-hello-0.1.md +19 -0
  31. data/docs/quick-start.md +69 -0
  32. data/docs/sea.md +49 -0
  33. data/engines/browser/lib/binary.js +2 -0
  34. data/engines/browser/lib/reactor.js +21 -0
  35. data/engines/browser/lib/system.js +3 -0
  36. data/engines/default/lib/array.js +164 -0
  37. data/engines/default/lib/binary-engine.js +53 -0
  38. data/engines/default/lib/binary.js +755 -0
  39. data/engines/default/lib/date.js +8 -0
  40. data/engines/default/lib/file-engine.js +119 -0
  41. data/engines/default/lib/function.js +119 -0
  42. data/engines/default/lib/global.js +11 -0
  43. data/engines/default/lib/io-engine.js +26 -0
  44. data/engines/default/lib/json.js +488 -0
  45. data/engines/default/lib/object.js +69 -0
  46. data/engines/default/lib/os-engine.js +3 -0
  47. data/engines/default/lib/reactor.js +12 -0
  48. data/engines/default/lib/string.js +84 -0
  49. data/engines/default/lib/system.js +20 -0
  50. data/engines/default/lib/worker.js +133 -0
  51. data/engines/jsc/README.md +18 -0
  52. data/engines/jsc/bootstrap.js +53 -0
  53. data/engines/jsc/deps/http-parser/LICENSE +77 -0
  54. data/engines/jsc/deps/http-parser/README.md +145 -0
  55. data/engines/jsc/deps/http-parser/http_parser.c +6087 -0
  56. data/engines/jsc/deps/http-parser/http_parser.h +141 -0
  57. data/engines/jsc/deps/http-parser/http_parser.rl +500 -0
  58. data/engines/jsc/deps/http-parser/test.c +858 -0
  59. data/engines/jsc/include/binary-engine.h +11 -0
  60. data/engines/jsc/include/io-engine.h +23 -0
  61. data/engines/jsc/include/narwhal.h +427 -0
  62. data/engines/jsc/lib/file-engine.js +31 -0
  63. data/engines/jsc/lib/http.js +1 -0
  64. data/engines/jsc/lib/io-engine.js +202 -0
  65. data/engines/jsc/lib/os-engine.js +25 -0
  66. data/engines/jsc/lib/system.js +18 -0
  67. data/engines/jsc/lib/zip.js +1 -0
  68. data/engines/jsc/narwhal-jsc.c +273 -0
  69. data/engines/jsc/narwhal.c +29 -0
  70. data/engines/jsc/package.json +8 -0
  71. data/engines/jsc/src/binary-engine.cc +290 -0
  72. data/engines/jsc/src/file-engine.cc +405 -0
  73. data/engines/jsc/src/io-engine.cc +423 -0
  74. data/engines/jsc/src/jack/handler/jill.cc +710 -0
  75. data/engines/jsc/src/os-engine.cc +210 -0
  76. data/engines/rhino/bin/narwhal-rhino +68 -0
  77. data/engines/rhino/bin/narwhal-rhino.cmd +34 -0
  78. data/engines/rhino/bootstrap.js +119 -0
  79. data/engines/rhino/jars/jline.jar +0 -0
  80. data/engines/rhino/jars/jna.jar +0 -0
  81. data/engines/rhino/jars/js.jar +0 -0
  82. data/engines/rhino/lib/binary-engine.js +83 -0
  83. data/engines/rhino/lib/concurrency.js +6 -0
  84. data/engines/rhino/lib/event-queue.js +18 -0
  85. data/engines/rhino/lib/file-engine.js +216 -0
  86. data/engines/rhino/lib/http-client-engine.js +90 -0
  87. data/engines/rhino/lib/http-engine.js +10 -0
  88. data/engines/rhino/lib/io-engine.js +347 -0
  89. data/engines/rhino/lib/md5-engine.js +40 -0
  90. data/engines/rhino/lib/os-engine.js +150 -0
  91. data/engines/rhino/lib/packages-engine.js +71 -0
  92. data/engines/rhino/lib/sandbox-engine.js +70 -0
  93. data/engines/rhino/lib/system.js +38 -0
  94. data/engines/rhino/lib/worker-engine.js +23 -0
  95. data/engines/rhino/lib/zip.js +78 -0
  96. data/engines/rhino/package.json +4 -0
  97. data/engines/secure/lib/file.js +6 -0
  98. data/engines/secure/lib/system.js +6 -0
  99. data/engines/template/bin/narwhal-engine-name +32 -0
  100. data/engines/template/bootstrap.js +40 -0
  101. data/engines/template/lib/file-engine.js +118 -0
  102. data/engines/template/lib/system.js +17 -0
  103. data/examples/browser-deployment-jackconfig.js +35 -0
  104. data/examples/fibonacci-worker.js +35 -0
  105. data/examples/fibonacci.js +19 -0
  106. data/examples/hello +2 -0
  107. data/examples/narwhal +3 -0
  108. data/examples/not-quite-a-quine.js +1 -0
  109. data/extconf.rb +44 -0
  110. data/gem_bin/narwhal +5 -0
  111. data/gem_bin/sea +4 -0
  112. data/gem_bin/tusk +4 -0
  113. data/lib/args.js +849 -0
  114. data/lib/base16.js +16 -0
  115. data/lib/base64.js +120 -0
  116. data/lib/codec/base64.js +8 -0
  117. data/lib/crc32.js +60 -0
  118. data/lib/file-bootstrap.js +187 -0
  119. data/lib/file.js +659 -0
  120. data/lib/hash.js +28 -0
  121. data/lib/hashp.js +65 -0
  122. data/lib/html.js +16 -0
  123. data/lib/http-client.js +134 -0
  124. data/lib/http.js +17 -0
  125. data/lib/io.js +98 -0
  126. data/lib/jsmin.js +315 -0
  127. data/lib/jsonpath.js +89 -0
  128. data/lib/logger.js +55 -0
  129. data/lib/md4.js +146 -0
  130. data/lib/md5.js +164 -0
  131. data/lib/mime.js +166 -0
  132. data/lib/narwhal.js +102 -0
  133. data/lib/narwhal/client.js +261 -0
  134. data/lib/narwhal/compile.js +99 -0
  135. data/lib/narwhal/env.js +140 -0
  136. data/lib/narwhal/inline.js +106 -0
  137. data/lib/narwhal/json.js +324 -0
  138. data/lib/narwhal/json.md +178 -0
  139. data/lib/narwhal/repl.js +96 -0
  140. data/lib/narwhal/server-test.js +6 -0
  141. data/lib/narwhal/server.js +270 -0
  142. data/lib/narwhal/tusk.js +170 -0
  143. data/lib/narwhal/tusk/bin.js +13 -0
  144. data/lib/narwhal/tusk/bundle.js +0 -0
  145. data/lib/narwhal/tusk/catalog.js +22 -0
  146. data/lib/narwhal/tusk/clone.js +66 -0
  147. data/lib/narwhal/tusk/consolidate.js +25 -0
  148. data/lib/narwhal/tusk/create-catalog.js +80 -0
  149. data/lib/narwhal/tusk/engine.js +42 -0
  150. data/lib/narwhal/tusk/freeze.js +0 -0
  151. data/lib/narwhal/tusk/init.js +56 -0
  152. data/lib/narwhal/tusk/install.js +288 -0
  153. data/lib/narwhal/tusk/list.js +20 -0
  154. data/lib/narwhal/tusk/orphans.js +0 -0
  155. data/lib/narwhal/tusk/reheat.js +15 -0
  156. data/lib/narwhal/tusk/remove.js +15 -0
  157. data/lib/narwhal/tusk/search.js +145 -0
  158. data/lib/narwhal/tusk/update.js +21 -0
  159. data/lib/narwhal/tusk/upgrade.js +0 -0
  160. data/lib/os.js +33 -0
  161. data/lib/packages.js +423 -0
  162. data/lib/printf.js +169 -0
  163. data/lib/promise.js +352 -0
  164. data/lib/querystring.js +176 -0
  165. data/lib/ref-send.js +257 -0
  166. data/lib/regexp.js +12 -0
  167. data/lib/sandbox.js +422 -0
  168. data/lib/sha.js +112 -0
  169. data/lib/sha256.js +102 -0
  170. data/lib/struct.js +228 -0
  171. data/lib/term.js +179 -0
  172. data/lib/test/assert.js +95 -0
  173. data/lib/test/equiv.js +188 -0
  174. data/lib/test/jsdump.js +165 -0
  175. data/lib/test/runner.js +129 -0
  176. data/lib/unload.js +13 -0
  177. data/lib/uri.js +378 -0
  178. data/lib/url.js +5 -0
  179. data/lib/utf8.js +64 -0
  180. data/lib/util.js +985 -0
  181. data/lib/uuid.js +89 -0
  182. data/lib/xregexp.js +521 -0
  183. data/local.json.template +1 -0
  184. data/narwhal.gemspec +105 -0
  185. data/narwhal.js +213 -0
  186. data/package.json +26 -0
  187. data/packages/readline/engines/default/lib/readline.js +4 -0
  188. data/packages/readline/engines/rhino/lib/readline.js +6 -0
  189. data/packages/readline/package.json +5 -0
  190. data/sources.json +207 -0
  191. data/tests/all-tests.js +17 -0
  192. data/tests/args.js +31 -0
  193. data/tests/args/domain.js +215 -0
  194. data/tests/args/options.js +36 -0
  195. data/tests/args/shifting.js +92 -0
  196. data/tests/args/validation.js +31 -0
  197. data/tests/base64.js +23 -0
  198. data/tests/commonjs.js +3 -0
  199. data/tests/commonjs/all-tests.js +12 -0
  200. data/tests/commonjs/bytearray-encodings-tests.js +69 -0
  201. data/tests/commonjs/bytearray-tests.js +465 -0
  202. data/tests/commonjs/bytestring-encodings-tests.js +89 -0
  203. data/tests/commonjs/bytestring-tests.js +263 -0
  204. data/tests/commonjs/es5/all-tests.js +3 -0
  205. data/tests/commonjs/es5/bind.js +29 -0
  206. data/tests/commonjs/file-tests.js +315 -0
  207. data/tests/commonjs/file/dirname.js +31 -0
  208. data/tests/commonjs/file/extension.js +45 -0
  209. data/tests/commonjs/file/is-absolute.js +11 -0
  210. data/tests/commonjs/file/iterator.js +101 -0
  211. data/tests/commonjs/file/normal.js +27 -0
  212. data/tests/commonjs/file/path.js +17 -0
  213. data/tests/commonjs/file/relative.js +42 -0
  214. data/tests/commonjs/file/resolve.js +44 -0
  215. data/tests/commonjs/module-tests.js +9 -0
  216. data/tests/commonjs/modules/absolute/b.js +1 -0
  217. data/tests/commonjs/modules/absolute/program.js +5 -0
  218. data/tests/commonjs/modules/absolute/submodule/a.js +3 -0
  219. data/tests/commonjs/modules/absolute/test.js +9 -0
  220. data/tests/commonjs/modules/all-tests.js +47 -0
  221. data/tests/commonjs/modules/config.js +11 -0
  222. data/tests/commonjs/modules/cyclic/a.js +4 -0
  223. data/tests/commonjs/modules/cyclic/b.js +4 -0
  224. data/tests/commonjs/modules/cyclic/program.js +10 -0
  225. data/tests/commonjs/modules/cyclic/test.js +9 -0
  226. data/tests/commonjs/modules/determinism/program.js +3 -0
  227. data/tests/commonjs/modules/determinism/submodule/a.js +8 -0
  228. data/tests/commonjs/modules/determinism/submodule/b.js +2 -0
  229. data/tests/commonjs/modules/determinism/test.js +9 -0
  230. data/tests/commonjs/modules/exactExports/a.js +3 -0
  231. data/tests/commonjs/modules/exactExports/program.js +4 -0
  232. data/tests/commonjs/modules/exactExports/test.js +9 -0
  233. data/tests/commonjs/modules/hasOwnProperty/hasOwnProperty.js +0 -0
  234. data/tests/commonjs/modules/hasOwnProperty/program.js +3 -0
  235. data/tests/commonjs/modules/hasOwnProperty/test.js +9 -0
  236. data/tests/commonjs/modules/hasOwnProperty/toString.js +0 -0
  237. data/tests/commonjs/modules/method/a.js +12 -0
  238. data/tests/commonjs/modules/method/program.js +8 -0
  239. data/tests/commonjs/modules/method/test.js +9 -0
  240. data/tests/commonjs/modules/missing/program.js +8 -0
  241. data/tests/commonjs/modules/missing/test.js +9 -0
  242. data/tests/commonjs/modules/monkeys/a.js +1 -0
  243. data/tests/commonjs/modules/monkeys/program.js +4 -0
  244. data/tests/commonjs/modules/monkeys/test.js +9 -0
  245. data/tests/commonjs/modules/nested/a/b/c/d.js +3 -0
  246. data/tests/commonjs/modules/nested/program.js +3 -0
  247. data/tests/commonjs/modules/nested/test.js +9 -0
  248. data/tests/commonjs/modules/relative/program.js +5 -0
  249. data/tests/commonjs/modules/relative/submodule/a.js +1 -0
  250. data/tests/commonjs/modules/relative/submodule/b.js +2 -0
  251. data/tests/commonjs/modules/relative/test.js +9 -0
  252. data/tests/commonjs/modules/transitive/a.js +1 -0
  253. data/tests/commonjs/modules/transitive/b.js +1 -0
  254. data/tests/commonjs/modules/transitive/c.js +3 -0
  255. data/tests/commonjs/modules/transitive/program.js +3 -0
  256. data/tests/commonjs/modules/transitive/test.js +9 -0
  257. data/tests/file/all-tests.js +61 -0
  258. data/tests/file/fnmatch.js +102 -0
  259. data/tests/file/glob.js +466 -0
  260. data/tests/file/match.js +102 -0
  261. data/tests/global.js +6 -0
  262. data/tests/global/array.js +19 -0
  263. data/tests/hashes.js +94 -0
  264. data/tests/html.js +13 -0
  265. data/tests/io/stringio.js +21 -0
  266. data/tests/os/all-tests.js +4 -0
  267. data/tests/os/popen.js +41 -0
  268. data/tests/os/system.js +22 -0
  269. data/tests/printf.js +123 -0
  270. data/tests/query-string.js +87 -0
  271. data/tests/sandbox/byte-io.js +20 -0
  272. data/tests/sandbox/fileName.js +3 -0
  273. data/tests/sandbox/foo.js +0 -0
  274. data/tests/sandbox/reload.js +79 -0
  275. data/tests/string.js +35 -0
  276. data/tests/uri.js +41 -0
  277. data/tests/util/all-tests.js +79 -0
  278. data/tests/util/array.js +207 -0
  279. data/tests/util/array/is-arguments.js +29 -0
  280. data/tests/util/array/is-array-like.js +29 -0
  281. data/tests/util/case.js +9 -0
  282. data/tests/util/collection.js +104 -0
  283. data/tests/util/eq.js +57 -0
  284. data/tests/util/expand.js +45 -0
  285. data/tests/util/object.js +125 -0
  286. data/tests/util/operator.js +25 -0
  287. data/tests/util/range.js +19 -0
  288. data/tests/util/repr.js +26 -0
  289. data/tests/util/string.js +34 -0
  290. data/tests/util/unique.js +12 -0
  291. metadata +434 -0
@@ -0,0 +1,21 @@
1
+
2
+ var tusk = require("../tusk");
3
+ var util = require("util");
4
+ var args = require("args");
5
+ var http = require("http");
6
+
7
+ var parser = exports.parser = new args.Parser();
8
+
9
+ parser.help('downloads the newest package catalog');
10
+
11
+ parser.action(function (options) {
12
+ exports.update.call(this, options);
13
+ });
14
+
15
+ exports.update = function (options) {
16
+ this.print('\0blue(Downloading catalog.\0)');
17
+ var catalogData = http.read('http://github.com/tlrobinson/narwhal/raw/master/catalog.json');
18
+ this.print('\0green(Saving catalog.\0)');
19
+ tusk.getCatalogPath().write(catalogData, 'b');
20
+ };
21
+
File without changes
data/lib/os.js ADDED
@@ -0,0 +1,33 @@
1
+
2
+ var engine = require('os-engine');
3
+ for (var name in engine) {
4
+ if (Object.prototype.hasOwnProperty.call(engine, name)) {
5
+ exports[name] = engine[name];
6
+ }
7
+ }
8
+
9
+ var system = require("system");
10
+
11
+ if (!exports.system) {
12
+ exports.system = function (command, options) {
13
+ var process = exports.popen(command, options);
14
+ return process.communicate(
15
+ system.stdin,
16
+ system.stdout,
17
+ system.stderr
18
+ ).status;
19
+ };
20
+ }
21
+
22
+ exports.command = function (command) {
23
+ var process = exports.popen(command);
24
+ var result = process.communicate();
25
+ if (result.status !== 0)
26
+ throw new Error(result.stderr.read());
27
+ return result.stdout.read();
28
+ };
29
+
30
+ exports.enquote = function (word) {
31
+ return "'" + String(word).replace(/'/g, "'\"'\"'") + "'";
32
+ };
33
+
data/lib/packages.js ADDED
@@ -0,0 +1,423 @@
1
+
2
+ var system = require('./system');
3
+ var util = require('./util');
4
+ var json = require('./json');
5
+ var fs = require('./file');
6
+
7
+ exports.main = function main() {
8
+ // finds, reads, and analyzes packages,
9
+ // then applies its findings (synthesizes)
10
+ // to the loader and system.
11
+ // this involves a breadth first search for packages
12
+ // and packages within packages (read),
13
+ // and performing engine-specific analysis and
14
+ // synthesis.
15
+
16
+ if (system.prefixes === undefined)
17
+ throw new Error(
18
+ "system.prefixes is undefined in packages loader. " +
19
+ "(engine=" + system.engine + ")"
20
+ );
21
+
22
+ exports.load(system.prefixes);
23
+
24
+ };
25
+
26
+ exports.load = function (prefixes) {
27
+
28
+ // the packages engine module, if it exists,
29
+ // performs engine-specific actions on each package.
30
+ var packagesEngine;
31
+ try {
32
+ packagesEngine = require('packages-engine');
33
+ } catch (exception) {
34
+ }
35
+
36
+ // depth first search of the packages tree and roots
37
+ var catalog = {};
38
+ var root = exports.read(prefixes, catalog);
39
+
40
+ exports.verify(catalog);
41
+
42
+ // normalize data in the catalog, like Author objects
43
+ exports.normalize(catalog);
44
+
45
+ // a topological sort of the packages based on their
46
+ // stated dependencies and contained engine-specific
47
+ // components
48
+ var order = exports.sortedPackages(catalog);
49
+
50
+ // analysis
51
+ var analysis = {};
52
+ exports.analyze(analysis, order);
53
+ // engine-specific analysis
54
+ if (packagesEngine)
55
+ packagesEngine.analyze(analysis, order);
56
+
57
+ // synthesis
58
+ exports.synthesize(analysis);
59
+ // engine-specific synthesis
60
+ if (packagesEngine)
61
+ packagesEngine.synthesize(analysis);
62
+
63
+ // preload modules
64
+ analysis.preloadModules.forEach(function(id) {
65
+ system.log.debug("Preloading module: "+id);
66
+ try {
67
+ require(id);
68
+ } catch (e) {
69
+ system.log.warn("Error preloading module: " + id + " " + e);
70
+ }
71
+ });
72
+
73
+ // record results
74
+ exports.catalog = catalog;
75
+ exports.order = order;
76
+ exports.root = root;
77
+ exports.analysis = analysis;
78
+ exports.engines = analysis.engines;
79
+ return exports;
80
+ };
81
+
82
+ /*** read
83
+ recursively loads all package data from package.json files
84
+ and packages/ directories.
85
+ */
86
+ exports.read = function read(prefixes, catalog) {
87
+ // construct an object graph from package json files
88
+ // through a breadth first search of the root package and
89
+ // its transitive packages/ directories.
90
+
91
+ if (!catalog)
92
+ throw new Error("must pass a package data object as the second argument to packages.read.");
93
+
94
+ var visitedPackages = {};
95
+ var root;
96
+
97
+ prefixes = util.copy(prefixes);
98
+ if (typeof prefixes == 'string')
99
+ prefixes = [prefixes];
100
+
101
+ // queue-based breadth-first-search of the package
102
+ // tree starting with the "root"
103
+ while (prefixes.length) {
104
+ var queue = [fs.path(prefixes.shift())];
105
+ while (queue.length) {
106
+
107
+ var packageDirectory = queue.shift();
108
+ var name = packageDirectory.basename();
109
+
110
+ // check for cyclic symbolic linkage
111
+ var canonicalPackageDirectory = packageDirectory.canonical();
112
+ if (Object.prototype.hasOwnProperty.call(visitedPackages, canonicalPackageDirectory))
113
+ continue;
114
+ visitedPackages[canonicalPackageDirectory] = true;
115
+
116
+ // check for duplicate package names
117
+ if (Object.prototype.hasOwnProperty.call(catalog, name)) {
118
+ continue;
119
+ }
120
+
121
+ if (!packageDirectory.join('package.json').isFile()) {
122
+ //system.log.warn('No package.json in ' + packageDirectory);
123
+ continue;
124
+ }
125
+
126
+ var packageDatum;
127
+ try {
128
+ var packageDatumJson = packageDirectory.join('package.json').read().toString();
129
+ packageDatum = json.parse(packageDatumJson || '{}');
130
+
131
+ // look for local, user overrides
132
+ var local = packageDirectory.join('local.json');
133
+ if (local.isFile()) {
134
+ local = json.parse(local.read().toString());
135
+ for (var name in local) {
136
+ if (Object.prototype.hasOwnProperty.call(local, name)) {
137
+ packageDatum[name] = local[name];
138
+ }
139
+ }
140
+ }
141
+
142
+ name = packageDatum.name || name;
143
+ catalog[name] = packageDatum;
144
+ packageDatum.directory = packageDirectory.join('');
145
+
146
+ // enqueue sub packages
147
+ var packagesDirectories = packageDatum.packages;
148
+ if (typeof packagesDirectories == "string")
149
+ packagesDirectories = [packagesDirectories];
150
+ if (packagesDirectories === undefined)
151
+ packagesDirectories = ["packages"];
152
+ packagesDirectories.forEach(function (packagesDirectory) {
153
+ packagesDirectory = packageDirectory.join(packagesDirectory);
154
+ if (packagesDirectory.isDirectory()) {
155
+ packagesDirectory.listPaths().forEach(function (packageDirectory) {
156
+ if (packageDirectory.isDirectory()) {
157
+ queue.push(packageDirectory);
158
+ }
159
+ });
160
+ }
161
+ });
162
+
163
+ // the first package we encounter gets
164
+ // top-billing, the root package
165
+ if (!root)
166
+ root = packageDatum;
167
+
168
+ } catch (exception) {
169
+ system.log.error("Could not load package '" + name + "'. " + exception);
170
+ }
171
+
172
+ }
173
+ }
174
+
175
+ return root;
176
+ };
177
+
178
+ /*** verify
179
+ scans a package object for missing dependencies and throws away
180
+ any package that has unmet dependencies.
181
+ */
182
+ exports.verify = function verify(catalog) {
183
+ for (var name in catalog) {
184
+ if (Object.prototype.hasOwnProperty.call(catalog, name)) {
185
+ try {
186
+ scan(catalog, name);
187
+ } catch (exception) {
188
+ if (typeof exception == "string") {
189
+ } else {
190
+ throw exception;
191
+ }
192
+ }
193
+ }
194
+ }
195
+ };
196
+
197
+ var scan = function scan(catalog, name) {
198
+ var packageDatum = catalog[name];
199
+ if (!packageDatum)
200
+ throw name;
201
+ try {
202
+ if (packageDatum.dependencies) {
203
+ packageDatum.dependencies.forEach(function (dependency) {
204
+ scan(catalog, dependency);
205
+ });
206
+ }
207
+ } catch (exception) {
208
+ if (typeof exception == "string")
209
+ system.log.error(
210
+ 'Threw away package ' + name +
211
+ ' because it depends on ' + exception +
212
+ '.'
213
+ );
214
+ delete catalog[name];
215
+ throw name;
216
+ }
217
+ };
218
+
219
+ /*** sortedPackages
220
+ returns an array of packages in order from the most
221
+ dependent to least dependent, sorted based on
222
+ their transitive dependencies.
223
+ */
224
+ exports.sortedPackages = function sortedPackages(info) {
225
+ var order = topo(info);
226
+ var sorted = [];
227
+ for (var i = 0; i < order.length; i++)
228
+ sorted[i] = info[order[i]];
229
+ return sorted;
230
+ };
231
+
232
+ var topo = function topo(graph) {
233
+ var sorted = [],
234
+ visited = {};
235
+ for (var name in graph) {
236
+ if (
237
+ Object.prototype.hasOwnProperty.call(graph, name) &&
238
+ !Object.prototype.hasOwnProperty.call(visited, name)
239
+ ) {
240
+ sorted.push.apply(sorted, _topo(graph, name, visited));
241
+ }
242
+ }
243
+ return sorted;
244
+ };
245
+
246
+ var _topo = function _topo(graph, name, visited) {
247
+ var node = graph[name];
248
+ if (Object.prototype.hasOwnProperty.call(visited, node))
249
+ return [];
250
+ visited[name] = true;
251
+ var sorted = [];
252
+ if (graph[name] === undefined) {
253
+ system.log.error('"' + name + '" package does not exist.');
254
+ }
255
+ var dependencies = graph[name].dependencies || [];
256
+ for (var i = 0; i < dependencies.length; i++) {
257
+ var dependency = dependencies[i];
258
+ if (Object.prototype.hasOwnProperty.call(visited, dependency))
259
+ continue;
260
+ visited[dependency] = true;
261
+ sorted.push.apply(sorted, _topo(graph, dependency, visited));
262
+ }
263
+ sorted.push(name);
264
+ return sorted;
265
+ };
266
+
267
+ /*** analyze
268
+ constructs prioritized top-level module paths
269
+ based on the given sorted package array.
270
+ */
271
+ exports.analyze = function analyze(analysis, catalog) {
272
+ analysis.libPaths = [];
273
+ analysis.preloadModules = [];
274
+ analysis.engines = {};
275
+ catalog.forEach(function (info) {
276
+
277
+ // libraries
278
+ if (typeof info.lib == 'string')
279
+ info.lib = [info.lib];
280
+ if (!info.lib)
281
+ info.lib = ['lib'];
282
+
283
+ // resolve the lib paths
284
+ for (var i = 0; i < info.lib.length; i++) {
285
+ info.lib[i] = info.directory.resolve(info.lib[i]);
286
+ }
287
+
288
+ if (!info.engine) {
289
+
290
+ // engines
291
+ var engines = 'engines';
292
+ var engineLibs = [];
293
+ if (info.engines)
294
+ engines = info.engines;
295
+ system.engines.forEach(function (engine) {
296
+ var engineDir = info.directory.join(engines, engine, 'lib');
297
+ if (engineDir.isDirectory())
298
+ engineLibs.push(engineDir);
299
+ });
300
+
301
+ for (var i = 0; i < engineLibs.length; i++) {
302
+ engineLibs[i] = info.directory.resolve(engineLibs[i]);
303
+ }
304
+
305
+ analysis.libPaths.unshift.apply(
306
+ analysis.libPaths,
307
+ engineLibs.concat(info.lib)
308
+ );
309
+
310
+ } else {
311
+ // the package is an engine. install its lib path
312
+ // if it is active.
313
+
314
+ var name = info.engine || info.name;
315
+ analysis.engines[name] = info;
316
+ if (util.has(system.engines, name)) {
317
+ analysis.libPaths.unshift.apply(
318
+ analysis.libPaths,
319
+ info.lib
320
+ );
321
+ }
322
+
323
+ }
324
+
325
+ // add any preload librarys to analysis
326
+ if (info.preload)
327
+ analysis.preloadModules.unshift.apply(analysis.preloadModules, info.preload);
328
+ });
329
+ };
330
+
331
+ /*** synthesize
332
+ applies the results of the analysis on the current
333
+ execution environment.
334
+ */
335
+ exports.synthesize = function synthesize(analysis) {
336
+ exports.addJsPaths(analysis.libPaths);
337
+ };
338
+
339
+ /*** addJsPaths
340
+ */
341
+ exports.addJsPaths = function addJsPaths(jsPaths) {
342
+ // add package paths to the loader
343
+ if (require.paths)
344
+ require.paths.splice.apply(
345
+ require.paths,
346
+ [0, require.paths.length].concat(jsPaths)
347
+ );
348
+ };
349
+
350
+ /*** normalize
351
+ */
352
+ exports.normalize = function (catalog) {
353
+ for (var name in catalog) {
354
+ if (Object.prototype.hasOwnProperty.call(catalog, name)) {
355
+ exports.normalizePackage(catalog[name]);
356
+ }
357
+ }
358
+ };
359
+
360
+ /*** normalizePackage
361
+ */
362
+ exports.normalizePackage = function (info) {
363
+
364
+ var names = [];
365
+ // normalize authors
366
+ if (!info.contributors)
367
+ info.contributors = [];
368
+ info.contributors = info.contributors.map(function (contributor) {
369
+ var author = new exports.Author(contributor);
370
+ names.push(author.name)
371
+ return author;
372
+ });
373
+
374
+ ['maintainer', 'author'].forEach(function (name) {
375
+ if (info[name])
376
+ info[name] = new exports.Author(info[name]);
377
+ if (names.indexOf(name) < 0)
378
+ info.contributors.unshift(info[name]);
379
+ });
380
+
381
+ };
382
+
383
+ /*** Author
384
+ */
385
+ exports.Author = function (author) {
386
+ if (!(this instanceof exports.Author))
387
+ return new exports.Author(author);
388
+ if (typeof author == "string") {
389
+ var match = author.match(exports.Author.regexp);
390
+ this.name = match[1].trim();
391
+ this.url = match[2];
392
+ this.email = match[3];
393
+ } else {
394
+ this.name = author.name;
395
+ this.url = author.url;
396
+ this.email = author.email;
397
+ }
398
+ };
399
+
400
+ exports.Author.prototype.toString = function () {
401
+ return [
402
+ this.name,
403
+ this.url ? "(" + this.url + ")" : undefined,
404
+ this.email ? "<" + this.email + ">" : undefined
405
+ ].filter(function (part) {
406
+ return !!part;
407
+ }).join(' ');
408
+ };
409
+
410
+ exports.Author.regexp = new RegExp(
411
+ "(?:" +
412
+ "([^\\(<]*)" +
413
+ " ?" +
414
+ ")?" +
415
+ "(?:" +
416
+ "\\(" +
417
+ "([^\\)]*)" +
418
+ "\\)" +
419
+ ")?" +
420
+ " ?" +
421
+ "(?:<([^>]*)>)?"
422
+ );
423
+