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,176 @@
1
+ // Query String Utilities
2
+
3
+
4
+ var QueryString = exports;
5
+
6
+ QueryString.unescape = function (str, decodeSpaces) {
7
+ return decodeURIComponent(decodeSpaces ? str.replace(/\+/g, " ") : str);
8
+ };
9
+
10
+ QueryString.escape = function (str) {
11
+ return encodeURIComponent(str);
12
+ };
13
+
14
+
15
+ var stack = [];
16
+ /**
17
+ * <p>Converts an arbitrary value to a Query String representation.</p>
18
+ *
19
+ * <p>Objects with cyclical references will trigger an exception.</p>
20
+ *
21
+ * @method stringify
22
+ * @param obj {Variant} any arbitrary value to convert to query string
23
+ * @param sep {String} (optional) Character that should join param k=v pairs together. Default: "&"
24
+ * @param eq {String} (optional) Character that should join keys to their values. Default: "="
25
+ * @param name {String} (optional) Name of the current key, for handling children recursively.
26
+ * @static
27
+ */
28
+ QueryString.stringify = function (obj, sep, eq, name) {
29
+ sep = sep || "&";
30
+ eq = eq || "=";
31
+ if (isA(obj, null) || isA(obj, undefined) || typeof(obj) === 'function') {
32
+ return name ? encodeURIComponent(name) + eq : '';
33
+ }
34
+
35
+ if (isBool(obj)) obj = +obj;
36
+ if (isNumber(obj) || isString(obj)) {
37
+ return encodeURIComponent(name) + eq + encodeURIComponent(obj);
38
+ }
39
+ if (isA(obj, [])) {
40
+ var s = [];
41
+ name = name+'[]';
42
+ for (var i = 0, l = obj.length; i < l; i ++) {
43
+ s.push( QueryString.stringify(obj[i], sep, eq, name) );
44
+ }
45
+ return s.join(sep);
46
+ }
47
+ // now we know it's an object.
48
+
49
+ // Check for cyclical references in nested objects
50
+ for (var i = stack.length - 1; i >= 0; --i) if (stack[i] === obj) {
51
+ throw new Error("QueryString.stringify. Cyclical reference");
52
+ }
53
+
54
+ stack.push(obj);
55
+
56
+ var s = [];
57
+ var begin = name ? name + '[' : '';
58
+ var end = name ? ']' : '';
59
+ for (var i in obj) if (obj.hasOwnProperty(i)) {
60
+ var n = begin + i + end;
61
+ s.push(QueryString.stringify(obj[i], sep, eq, n));
62
+ }
63
+
64
+ stack.pop();
65
+
66
+ s = s.join(sep);
67
+ if (!s && name) return name + "=";
68
+ return s;
69
+ };
70
+
71
+ QueryString.parseQuery = QueryString.parse = function(qs, sep, eq) {
72
+ return qs
73
+ .split(sep||"&")
74
+ .map(pieceParser(eq||"="))
75
+ .reduce(mergeParams);
76
+ };
77
+
78
+ // Parse a key=val string.
79
+ // These can get pretty hairy
80
+ // example flow:
81
+ // parse(foo[bar][][bla]=baz)
82
+ // return parse(foo[bar][][bla],"baz")
83
+ // return parse(foo[bar][], {bla : "baz"})
84
+ // return parse(foo[bar], [{bla:"baz"}])
85
+ // return parse(foo, {bar:[{bla:"baz"}]})
86
+ // return {foo:{bar:[{bla:"baz"}]}}
87
+ var pieceParser = function (eq) {
88
+ return function parsePiece (key, val) {
89
+ if (arguments.length !== 2) {
90
+ // key=val, called from the map/reduce
91
+ key = key.split(eq);
92
+ return parsePiece(
93
+ QueryString.unescape(key.shift(), true),
94
+ QueryString.unescape(key.join(eq), true)
95
+ );
96
+ }
97
+ key = key.replace(/^\s+|\s+$/g, '');
98
+ if (isString(val)) {
99
+ val = val.replace(/^\s+|\s+$/g, '');
100
+ // convert numerals to numbers
101
+ if (!isNaN(val)) {
102
+ var numVal = +val;
103
+ if (val === numVal.toString(10)) val = numVal;
104
+ }
105
+ }
106
+ var sliced = /(.*)\[([^\]]*)\]$/.exec(key);
107
+ if (!sliced) {
108
+ var ret = {};
109
+ if (key) ret[key] = val;
110
+ return ret;
111
+ }
112
+ // ["foo[][bar][][baz]", "foo[][bar][]", "baz"]
113
+ var tail = sliced[2], head = sliced[1];
114
+
115
+ // array: key[]=val
116
+ if (!tail) return parsePiece(head, [val]);
117
+
118
+ // obj: key[subkey]=val
119
+ var ret = {};
120
+ ret[tail] = val;
121
+ return parsePiece(head, ret);
122
+ };
123
+ };
124
+
125
+ // the reducer function that merges each query piece together into one set of params
126
+ function mergeParams (params, addition) {
127
+ return (
128
+ // if it's uncontested, then just return the addition.
129
+ (!params) ? addition
130
+ // if the existing value is an array, then concat it.
131
+ : (isA(params, [])) ? params.concat(addition)
132
+ // if the existing value is not an array, and either are not objects, arrayify it.
133
+ : (!isA(params, {}) || !isA(addition, {})) ? [params].concat(addition)
134
+ // else merge them as objects, which is a little more complex
135
+ : mergeObjects(params, addition)
136
+ );
137
+ };
138
+
139
+ // Merge two *objects* together. If this is called, we've already ruled
140
+ // out the simple cases, and need to do the for-in business.
141
+ function mergeObjects (params, addition) {
142
+ for (var i in addition) if (i && addition.hasOwnProperty(i)) {
143
+ params[i] = mergeParams(params[i], addition[i]);
144
+ }
145
+ return params;
146
+ };
147
+
148
+ // duck typing
149
+ function isA (thing, canon) {
150
+ return (
151
+ // truthiness. you can feel it in your gut.
152
+ (!thing === !canon)
153
+ // typeof is usually "object"
154
+ && typeof(thing) === typeof(canon)
155
+ // check the constructor
156
+ && Object.prototype.toString.call(thing) === Object.prototype.toString.call(canon)
157
+ );
158
+ };
159
+ function isBool (thing) {
160
+ return (
161
+ typeof(thing) === "boolean"
162
+ || isA(thing, new Boolean(thing))
163
+ );
164
+ };
165
+ function isNumber (thing) {
166
+ return (
167
+ typeof(thing) === "number"
168
+ || isA(thing, new Number(thing))
169
+ ) && isFinite(thing);
170
+ };
171
+ function isString (thing) {
172
+ return (
173
+ typeof(thing) === "string"
174
+ || isA(thing, new String(thing))
175
+ );
176
+ };
data/lib/ref-send.js ADDED
@@ -0,0 +1,257 @@
1
+ /*
2
+ * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
3
+ * at http://www.opensource.org/licenses/mit-license.html
4
+ *
5
+ * ref_send.js version: 2009-05-11
6
+ */
7
+ "use strict";
8
+
9
+ var enqueue = require('reactor').enqueue;
10
+
11
+ /**
12
+ * Enqueues a task to be run in a future turn.
13
+ * @param task function to invoke later
14
+ */
15
+ exports.run = enqueue;
16
+
17
+ /**
18
+ * Constructs a rejected promise.
19
+ * @param reason value describing the failure
20
+ */
21
+ exports.reject = reject;
22
+
23
+ /**
24
+ * Constructs a promise for an immediate reference.
25
+ * @param value immediate reference
26
+ */
27
+ exports.ref = ref;
28
+
29
+ /**
30
+ * Constructs a ( promise, resolver ) pair.
31
+ *
32
+ * The resolver is a callback to invoke with a more resolved value for
33
+ * the promise. To fulfill the promise, simply invoke the resolver with
34
+ * an immediate reference. To reject the promise, invoke the resolver
35
+ * with the return from a call to reject(). To put the promise in the
36
+ * same state as another promise, invoke the resolver with that other
37
+ * promise.
38
+ */
39
+ exports.defer = defer;
40
+
41
+ /**
42
+ * Gets the current value of a promise.
43
+ * @param value promise or immediate reference to evaluate
44
+ */
45
+ exports.near = function (value) {
46
+ return ('function' === typeof value) ? value() : value;
47
+ };
48
+
49
+ /**
50
+ * Registers an observer on a promise.
51
+ * @param value promise or immediate reference to observe
52
+ * @param fulfilled function to be called with the resolved value
53
+ * @param rejected function to be called with the rejection reason
54
+ * @return promise for the return value from the invoked callback
55
+ */
56
+ exports.when = function (value, fulfilled, rejected) {
57
+ var r = defer();
58
+ var done = false; // ensure the untrusted promise makes at most a
59
+ // single call to one of the callbacks
60
+ forward(promise(value), 'WHEN', function (x) {
61
+ if (done) { throw new Error(); }
62
+ done = true;
63
+ r.resolve(ref(x)('WHEN', fulfilled, rejected));
64
+ }, function (reason) {
65
+ if (done) { throw new Error(); }
66
+ done = true;
67
+ r.resolve(rejected ? rejected(reason) : reject(reason));
68
+ });
69
+ return r.promise;
70
+ };
71
+
72
+ /**
73
+ * Gets the value of a property in a future turn.
74
+ * @param target promise or immediate reference for target object
75
+ * @param noun name of property to get
76
+ * @return promise for the property value
77
+ */
78
+ exports.get = function (target, noun) {
79
+ var r = defer();
80
+ forward(promise(target), 'GET', r.resolve, noun);
81
+ return r.promise;
82
+ };
83
+
84
+ /**
85
+ * Invokes a method in a future turn.
86
+ * @param target promise or immediate reference for target object
87
+ * @param verb name of method to invoke
88
+ * @param argv array of invocation arguments
89
+ * @return promise for the return value
90
+ */
91
+ exports.post = function (target, verb, argv) {
92
+ var r = defer();
93
+ forward(promise(target), 'POST', r.resolve, verb, argv);
94
+ return r.promise;
95
+ };
96
+
97
+ /**
98
+ * Sets the value of a property in a future turn.
99
+ * @param target promise or immediate reference for target object
100
+ * @param noun name of property to set
101
+ * @param value new value of property
102
+ * @return promise for the return value
103
+ */
104
+ exports.put = function (target, noun, value) {
105
+ var r = defer();
106
+ forward(promise(target), 'PUT', r.resolve, noun, value);
107
+ return r.promise;
108
+ };
109
+
110
+ /**
111
+ * Deletes a property in a future turn.
112
+ * @param target promise or immediate reference for target object
113
+ * @param noun name of property to delete
114
+ * @return promise for the return value
115
+ */
116
+ exports.remove = function (target, noun) {
117
+ var r = defer();
118
+ forward(promise(target), 'DELETE', r.resolve, noun);
119
+ return r.promise;
120
+ };
121
+
122
+ function reject(reason) {
123
+ return function (op, arg1, arg2, arg3) {
124
+ if (undefined === op) {
125
+ return { '!' : reason };
126
+ }
127
+ if ('WHEN' === op) { return arg2 ? arg2(reason) : reject(reason); }
128
+ return arg1 ? arg1(reject(reason)) : reject(reason);
129
+ };
130
+ }
131
+
132
+ function ref(value) {
133
+ if (null === value || undefined === value) {
134
+ return reject({ $: [ 'NaO' ] });
135
+ }
136
+ if ('number' === typeof value && !isFinite(value)) {
137
+ return reject({ $: [ 'NaN' ] });
138
+ }
139
+ return function (op, arg1, arg2, arg3) {
140
+ if (undefined === op) { return value; }
141
+
142
+ var r;
143
+ switch (op) {
144
+ case 'WHEN':
145
+ r = value;
146
+ break;
147
+ case 'GET':
148
+ r = (undefined === arg2) ? value : value[arg2];
149
+ break;
150
+ case 'POST':
151
+ if (undefined === arg2) {
152
+ r = reject({});
153
+ } else {
154
+ r = value[arg2](arg3);
155
+ }
156
+ break;
157
+ case 'PUT':
158
+ if (undefined === arg2) {
159
+ r = reject({});
160
+ } else {
161
+ value[arg2] = arg3;
162
+ r = {};
163
+ }
164
+ break;
165
+ case 'DELETE':
166
+ if (undefined === arg2) {
167
+ r = reject({});
168
+ } else {
169
+ delete value[arg2];
170
+ r = {};
171
+ }
172
+ break;
173
+ default:
174
+ r = reject({});
175
+ }
176
+ return arg1 ? arg1(r) : r;
177
+ };
178
+ }
179
+
180
+ /**
181
+ * Enqueues a promise operation.
182
+ *
183
+ * The above functions, reject() and ref(), each construct a kind of
184
+ * promise. Other libraries can provide other kinds of promises by
185
+ * implementing the same API. A promise is a function with signature:
186
+ * function (op, arg1, arg2, arg3). The first argument determines the
187
+ * interpretation of the remaining arguments. The following cases must be
188
+ * handled:
189
+ *
190
+ * 'op' is undefined:
191
+ * Return the most resolved current value of the promise.
192
+ *
193
+ * 'op' is "WHEN":
194
+ * 'arg1': callback to invoke with the fulfilled value of the promise
195
+ * 'arg2': callback to invoke with the rejection reason for the promise
196
+ *
197
+ * 'op' is "GET":
198
+ * 'arg1': callback to invoke with the value of the named property
199
+ * 'arg2': name of the property to read
200
+ *
201
+ * 'op' is "POST":
202
+ * 'arg1': callback to invoke with the return value from the invocation
203
+ * 'arg2': name of the method to invoke
204
+ * 'arg3': array of invocation arguments
205
+ *
206
+ * 'op' is "PUT":
207
+ * 'arg1': callback to invoke with the return value from the operation
208
+ * 'arg2': name of the property to set
209
+ * 'arg3': new value of property
210
+ *
211
+ * 'op' is "DELETE":
212
+ * 'arg1': callback to invoke with the return value from the operation
213
+ * 'arg2': name of the property to delete
214
+ *
215
+ * 'op' is unrecognized:
216
+ * 'arg1': callback to invoke with a rejected promise
217
+ */
218
+ function forward(p, op, arg1, arg2, arg3) {
219
+ enqueue(function () { p(op, arg1, arg2, arg3); });
220
+ }
221
+
222
+ /**
223
+ * Gets the corresponding promise for a given reference.
224
+ */
225
+ function promise(value) {
226
+ return ('function' === typeof value) ? value : ref(value);
227
+ }
228
+
229
+ function defer() {
230
+ var value;
231
+ var pending = [];
232
+ var tail = function (op, arg1, arg2, arg3) {
233
+ if (undefined === op) { return pending ? tail : value(); }
234
+ if (pending) {
235
+ pending.push({ op: op, arg1: arg1, arg2: arg2, arg3: arg3 });
236
+ } else {
237
+ forward(value, op, arg1, arg2, arg3);
238
+ }
239
+ };
240
+ return {
241
+ promise: tail,
242
+ resolve: function (p) {
243
+ if (!pending) { return; }
244
+
245
+ var todo = pending;
246
+ pending = null;
247
+ value = promise(p);
248
+
249
+ var i, len = todo.length, task;
250
+ for (i = 0; i < len; ++i) {
251
+ task = todo[i];
252
+ forward(value, task.op, task.arg1, task.arg2, task.arg3);
253
+ }
254
+ }
255
+ };
256
+ }
257
+
data/lib/regexp.js ADDED
@@ -0,0 +1,12 @@
1
+ // RegExp
2
+
3
+ /*** RegExp.escape
4
+ accepts a string; returns the string with regex metacharacters escaped.
5
+ the returned string can safely be used within a regex to match a literal
6
+ string. escaped characters are [, ], {, }, (, ), -, *, +, ?, ., \, ^, $,
7
+ |, #, [comma], and whitespace.
8
+ */
9
+ RegExp.escape = function (str) {
10
+ return str.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, "\\$&");
11
+ };
12
+
data/lib/sandbox.js ADDED
@@ -0,0 +1,422 @@
1
+
2
+ // NOTE: this file is used is the bootstrapping process,
3
+ // so any "requires" must be accounted for in narwhal.js
4
+
5
+ var system = require("system");
6
+
7
+ exports.Loader = function (options) {
8
+ var loader = {};
9
+ var factories = options.factories || {};
10
+ var paths = options.paths;
11
+ var extensions = options.extensions || ["", ".js"];
12
+ var timestamps = {};
13
+ var debug = options.debug;
14
+
15
+ loader.resolve = exports.resolve;
16
+
17
+ loader.find = function (topId) {
18
+ // if it's absolute only search the "root" directory.
19
+ // file.join() must collapse multiple "/" into a single "/"
20
+ var searchPaths = system.fs.isAbsolute(topId) ? [""] : paths;
21
+
22
+ for (var j = 0; j < extensions.length; j++) {
23
+ var extension = extensions[j];
24
+ for (var i = 0; i < searchPaths.length; i++) {
25
+ var path = system.fs.join(searchPaths[i], topId + extension);
26
+ if (system.fs.isFile(path))
27
+ return path;
28
+ }
29
+ }
30
+ throw new Error("require error: couldn't find \"" + topId + '"');
31
+ };
32
+
33
+ loader.fetch = function (topId, path) {
34
+ if (!path)
35
+ path = loader.find(topId);
36
+ if (typeof system.fs.mtime === "function")
37
+ timestamps[path] = system.fs.mtime(path);
38
+ if (debug)
39
+ print('loader: fetching ' + topId);
40
+ var text = system.fs.read(path, {
41
+ 'charset': 'utf-8'
42
+ });
43
+ // we leave the endline so the error line numbers align
44
+ text = text.replace(/^#[^\n]+\n/, "\n");
45
+ return text;
46
+ };
47
+
48
+ loader.evaluate = function (text, topId) {
49
+ if (system.evaluate) {
50
+ var fileName = loader.find(topId);
51
+ var factory = system.evaluate(text, fileName, 1);
52
+ factory.path = fileName;
53
+ return factory;
54
+ } else {
55
+ return new Function("require", "exports", "module", "system", "print", text);
56
+ }
57
+ };
58
+
59
+ loader.load = function (topId) {
60
+ if (!Object.prototype.hasOwnProperty.call(factories, topId)) {
61
+ loader.reload(topId);
62
+ } else if (typeof system.fs.mtime === "function") {
63
+ var path = loader.find(topId);
64
+ if (loader.hasChanged(topId, path))
65
+ loader.reload(topId);
66
+ }
67
+ return factories[topId];
68
+ };
69
+
70
+ loader.reload = function (topId, path) {
71
+ factories[topId] = loader.evaluate(loader.fetch(topId, path), topId);
72
+ };
73
+
74
+ loader.isLoaded = function (topId) {
75
+ return Object.prototype.hasOwnProperty.call(factories, topId);
76
+ };
77
+
78
+ loader.hasChanged = function (topId, path) {
79
+ if (!path)
80
+ path = loader.resolve(topId);
81
+ return (
82
+ !Object.prototype.hasOwnProperty.call(timestamps, path) ||
83
+ system.fs.mtime(path) > timestamps[path]
84
+ );
85
+ };
86
+
87
+ loader.paths = paths;
88
+ loader.extensions = extensions;
89
+
90
+ return loader;
91
+ };
92
+
93
+ exports.MultiLoader = function (options) {
94
+
95
+ var factories = options.factories || {};
96
+
97
+ var self = {};
98
+ self.paths = options.paths || [];
99
+ self.loader = options.loader || exports.Loader(options);
100
+ self.loaders = options.loaders || [
101
+ ["", self.loader],
102
+ [".js", self.loader]
103
+ ];
104
+
105
+ self.resolve = exports.resolve;
106
+
107
+ self.find = function (topId) {
108
+ // if it's absolute only search the "root" directory.
109
+ // file.join() must collapse multiple "/" into a single "/"
110
+ var searchPaths = system.fs.isAbsolute(topId) ? [""] : self.paths;
111
+
112
+ for (var j = 0; j < self.loaders.length; j++) {
113
+ var extension = self.loaders[j][0];
114
+ var loader = self.loaders[j][1];
115
+ for (var i = 0; i < searchPaths.length; i++) {
116
+ var path = system.fs.join(searchPaths[i], topId + extension);
117
+ if (system.fs.isFile(path)) {
118
+ // now check each extension for a match.
119
+ // handles case when extension is in the id, so it's matched by "",
120
+ // but we want to use the loader corresponding to the actual extension
121
+ for (var k = 0; k < self.loaders.length; k++) {
122
+ var ext = self.loaders[k][0];
123
+ if (path.lastIndexOf(ext) === path.length - ext.length)
124
+ return [self.loaders[k][1], path];
125
+ }
126
+ throw "ERROR: shouldn't reach this point!"
127
+ }
128
+ }
129
+ }
130
+ throw "require error: couldn't find \"" + topId + '"';
131
+ };
132
+
133
+ self.load = function (topId, loader, path) {
134
+ if (!loader || !path) {
135
+ var pair = self.find(topId);
136
+ loader = pair[0];
137
+ path = pair[1];
138
+ }
139
+ if (
140
+ !Object.prototype.hasOwnProperty.call(factories, topId) ||
141
+ (loader.hasChanged && loader.hasChanged(topId, path))
142
+ )
143
+ self.reload(topId, loader, path);
144
+ return factories[topId];
145
+ };
146
+
147
+ self.reload = function (topId, loader, path) {
148
+ if (!loader || !path) {
149
+ var pair = self.find(topId);
150
+ loader = pair[0];
151
+ path = pair[1];
152
+ }
153
+ loader.reload(topId, path);
154
+ factories[topId] = loader.load(topId, path);
155
+ };
156
+
157
+ self.isLoaded = function (topId) {
158
+ return Object.prototype.hasOwnProperty.call(factories, topId);
159
+ };
160
+
161
+ return self;
162
+ };
163
+
164
+ exports.AttenuatedLoader = function (loader) {
165
+ var self = {};
166
+
167
+ self.resolve = Object.freeze(function (id, baseId) {
168
+ return loader.resolve(id, baseId);
169
+ });
170
+
171
+ self.fetch = Object.freeze(function (topId) {
172
+ if (/\./.test(topId))
173
+ throw new Error("Invalid module identifier: " + topId);
174
+ return loader.fetch(topId);
175
+ });
176
+
177
+ self.load = Object.freeze(function (topId, path) {
178
+ if (/\./.test(topId))
179
+ throw new Error("Invalid module identifier");
180
+ return loader.load(topId, path);
181
+ });
182
+
183
+ self.reload = Object.freeze(function (topId) {
184
+ if (/\./.test(topId))
185
+ throw new Error("Invalid module identifier");
186
+ return loader.reload(topId, path);
187
+ });
188
+
189
+ return Object.freeze(self);
190
+ };
191
+
192
+ exports.Sandbox = function (options) {
193
+ options = options || {};
194
+ var loader = options.loader;
195
+ var subsystem = options.system || system || {};
196
+ var modules = options.modules || {};
197
+ var debug = options.debug !== undefined ? !!options.debug : !!system.debug;
198
+
199
+ // managed print free variable in the sandbox forwards
200
+ // to system.print in the sandbox
201
+ var subprint = options.print || function () {
202
+ return subsystem.print.apply(subsystem, arguments);
203
+ };
204
+
205
+ var debugDepth = 0;
206
+ var mainId;
207
+
208
+ var sandbox = function (id, baseId, force, reload) {
209
+ id = loader.resolve(id, baseId);
210
+
211
+ /* populate memo with module instance */
212
+ if (!Object.prototype.hasOwnProperty.call(modules, id) || force) {
213
+
214
+ if (sandbox.debug) {
215
+ debugDepth++;
216
+ var debugAcc = "";
217
+ for (var i = 0; i < debugDepth; i++) debugAcc += "\\";
218
+ print(debugAcc + " " + id, 'module');
219
+ }
220
+
221
+ var globals = {};
222
+ if (sandbox.debug) {
223
+ // record globals
224
+ for (var name in global)
225
+ globals[name] = true;
226
+ }
227
+
228
+ if (!Object.prototype.hasOwnProperty.call(modules, id) || reload)
229
+ modules[id] = {};
230
+ var exports = modules[id];
231
+ if (reload)
232
+ loader.reload(id);
233
+
234
+ var factory = null;
235
+ try {
236
+ factory = loader.load(id);
237
+ } finally {
238
+ // poor man's catch and rethrow (Rhino sets file/line to where the exception is thrown, not created)
239
+ if (!factory) {
240
+ delete modules[id];
241
+ if (sandbox.debug)
242
+ debugDepth--;
243
+ }
244
+ }
245
+ var require = Require(id, factory.path);
246
+ var module = {
247
+ 'id': id,
248
+ 'path': factory.path
249
+ };
250
+ factory(require, exports, module, subsystem, subprint);
251
+
252
+ if (sandbox.debug) {
253
+ // check for new globals
254
+ for (var name in global)
255
+ if (!globals[name])
256
+ system.log.warn("NEW GLOBAL: " + name);
257
+ }
258
+
259
+ if (sandbox.debug) {
260
+ var debugAcc = "";
261
+ for (var i = 0; i < debugDepth; i++) debugAcc += "/";
262
+ print(debugAcc + " " + id, 'module');
263
+ debugDepth--;
264
+ }
265
+
266
+ } else {
267
+ if (sandbox.debug) {
268
+ var debugAcc = "";
269
+ for (var i = 0; i < debugDepth; i++) debugAcc += "|";
270
+ print(debugAcc + " " + id, 'module');
271
+ }
272
+ }
273
+
274
+ /* support curryId for modules in which it is requested */
275
+ var exports = modules[id];
276
+ var imports = {};
277
+ var importsUsed = false;
278
+ var curryUsed = false;
279
+ for (var name in exports) {
280
+ try {
281
+ // This try/catch block is needed to handle wrapped Java
282
+ // objects in Rhino.
283
+ curryUsed = (
284
+ typeof exports[name] == "function" &&
285
+ exports[name].xNarwhalCurryId
286
+ );
287
+ } catch (exception) {};
288
+
289
+ if (curryUsed) {
290
+ importsUsed = true;
291
+ imports[name] = (function (callback) {
292
+ var curried = function () {
293
+ return callback.apply(
294
+ this,
295
+ [baseId].concat(Array.prototype.slice.call(arguments, 0))
296
+ );
297
+ };
298
+ curried.xNarwhalCurryId = callback;
299
+ return curried;
300
+ })(exports[name].xNarwhalCurryId);
301
+ } else {
302
+ imports[name] = exports[name];
303
+ }
304
+ }
305
+
306
+ if (!importsUsed)
307
+ imports = exports;
308
+
309
+ return imports;
310
+
311
+ };
312
+
313
+ var Require = function (baseId, fileName) { // XXX deprecated fileName
314
+ var require = function (id) {
315
+ //try {
316
+ return sandbox(id, baseId);
317
+ //} catch (exception) {
318
+ // if (exception.message)
319
+ // exception.message += ' in ' + baseId;
320
+ // throw exception;
321
+ //}
322
+ };
323
+ require.loader = loader;
324
+ require.main = mainId;
325
+ require.paths = loader.paths;
326
+ require.extensions = loader.extensions;
327
+ require.async = sandbox.async;
328
+ /* offers a facility to request the module id
329
+ * in which a function was imported */
330
+ // XXX deprecated (will need to be moved to module object)
331
+ require.xNarwhalCurryId = function (callback) {
332
+ var curried = function () {
333
+ return callback.apply(
334
+ this,
335
+ [baseId].concat(Array.prototype.slice.call(arguments))
336
+ );
337
+ };
338
+ curried.curryId = callback;
339
+ return curried;
340
+ };
341
+ return require;
342
+ };
343
+
344
+ sandbox.force = function (id) {
345
+ return sandbox(id, '', true);
346
+ };
347
+
348
+ sandbox.main = function (id) {
349
+ mainId = id;
350
+ return sandbox(id);
351
+ };
352
+
353
+ sandbox.loader = loader;
354
+ sandbox.system = system;
355
+ sandbox.paths = loader.paths;
356
+ sandbox.extensions = loader.extensions;
357
+ sandbox.debug = debug;
358
+
359
+ return sandbox;
360
+ };
361
+
362
+ exports.PrefixLoader = function (prefix, loader) {
363
+ var self = this || {};
364
+
365
+ self.resolve = function (id, baseId) {
366
+ return loader.resolve(id, baseId);
367
+ };
368
+
369
+ /**** evaluate
370
+ */
371
+ self.evaluate = function (text, topId) {
372
+ return loader.evaluate(text, prefix + topId);
373
+ };
374
+
375
+ /**** fetch
376
+ */
377
+ self.fetch = function (topId) {
378
+ return loader.fetch(prefix + topId);
379
+ };
380
+
381
+ /**** load
382
+ */
383
+ self.load = function (topId) {
384
+ return loader.load(prefix + topId);
385
+ };
386
+
387
+ return self;
388
+ };
389
+
390
+ exports.sandbox = function(main, system, options) {
391
+ options = options || {};
392
+ var prefix = options['prefix'];
393
+ var loader = options['loader'] || require.loader;
394
+ var modules = options['modules'] || {};
395
+ var print = options['print'];
396
+ var debug = options['debug'];
397
+ if (!loader) throw new Error(
398
+ "sandbox cannot operate without a loader, either explicitly " +
399
+ "provided as an option, or implicitly provided by the current " +
400
+ "sandbox's 'loader' object."
401
+ );
402
+ if (prefix)
403
+ loader = exports.PrefixLoader(prefix, loader);
404
+ var sandbox = exports.Sandbox({
405
+ modules: modules,
406
+ loader: loader,
407
+ system: system,
408
+ print: print,
409
+ debug: debug
410
+ });
411
+ return sandbox.main(main);
412
+ };
413
+
414
+ exports.resolve = function (id, baseId) {
415
+ if (typeof id != "string")
416
+ throw new Error("module id '" + id + "' is not a String");
417
+ if (id.charAt(0) == ".") {
418
+ id = system.fs.dirname(baseId) + "/" + id;
419
+ }
420
+ return system.fs.normal(id);
421
+ };
422
+