sproutit-narwhal 0.1.106
Sign up to get free protection for your applications and to get access to all the features.
- data/DISTRIBUTION.yml +15 -0
- data/README.md +86 -0
- data/Rakefile +349 -0
- data/VERSION.yml +7 -0
- data/bin/activate +50 -0
- data/bin/activate.bash +50 -0
- data/bin/activate.cmd +3 -0
- data/bin/js +67 -0
- data/bin/json +2 -0
- data/bin/narwhal +67 -0
- data/bin/narwhal.cmd +29 -0
- data/bin/sea +45 -0
- data/bin/sea.cmd +25 -0
- data/bin/tusk +2 -0
- data/bin/tusk.cmd +5 -0
- data/catalog.json +902 -0
- data/docs/available-packages.md +32 -0
- data/docs/browser-api-plan.md +290 -0
- data/docs/browser-api.md +153 -0
- data/docs/download.md +25 -0
- data/docs/engines.md +32 -0
- data/docs/json-tool.md +121 -0
- data/docs/lib/binary.wiki +242 -0
- data/docs/lib/file.wiki +325 -0
- data/docs/lib/os/popen.md +70 -0
- data/docs/modules.md +38 -0
- data/docs/narwhal.md +487 -0
- data/docs/packages-howto.md +32 -0
- data/docs/packages.md +30 -0
- data/docs/posts/2009-07-29-hello-0.1.md +19 -0
- data/docs/quick-start.md +69 -0
- data/docs/sea.md +49 -0
- data/engines/browser/lib/binary.js +2 -0
- data/engines/browser/lib/reactor.js +21 -0
- data/engines/browser/lib/system.js +3 -0
- data/engines/default/lib/array.js +164 -0
- data/engines/default/lib/binary-engine.js +53 -0
- data/engines/default/lib/binary.js +755 -0
- data/engines/default/lib/date.js +8 -0
- data/engines/default/lib/file-engine.js +119 -0
- data/engines/default/lib/function.js +119 -0
- data/engines/default/lib/global.js +11 -0
- data/engines/default/lib/io-engine.js +26 -0
- data/engines/default/lib/json.js +488 -0
- data/engines/default/lib/object.js +69 -0
- data/engines/default/lib/os-engine.js +3 -0
- data/engines/default/lib/reactor.js +12 -0
- data/engines/default/lib/string.js +84 -0
- data/engines/default/lib/system.js +20 -0
- data/engines/default/lib/worker.js +133 -0
- data/engines/jsc/README.md +18 -0
- data/engines/jsc/bootstrap.js +53 -0
- data/engines/jsc/deps/http-parser/LICENSE +77 -0
- data/engines/jsc/deps/http-parser/README.md +145 -0
- data/engines/jsc/deps/http-parser/http_parser.c +6087 -0
- data/engines/jsc/deps/http-parser/http_parser.h +141 -0
- data/engines/jsc/deps/http-parser/http_parser.rl +500 -0
- data/engines/jsc/deps/http-parser/test.c +858 -0
- data/engines/jsc/include/binary-engine.h +11 -0
- data/engines/jsc/include/io-engine.h +23 -0
- data/engines/jsc/include/narwhal.h +427 -0
- data/engines/jsc/lib/file-engine.js +31 -0
- data/engines/jsc/lib/http.js +1 -0
- data/engines/jsc/lib/io-engine.js +202 -0
- data/engines/jsc/lib/os-engine.js +25 -0
- data/engines/jsc/lib/system.js +18 -0
- data/engines/jsc/lib/zip.js +1 -0
- data/engines/jsc/narwhal-jsc.c +273 -0
- data/engines/jsc/narwhal.c +29 -0
- data/engines/jsc/package.json +8 -0
- data/engines/jsc/src/binary-engine.cc +290 -0
- data/engines/jsc/src/file-engine.cc +405 -0
- data/engines/jsc/src/io-engine.cc +423 -0
- data/engines/jsc/src/jack/handler/jill.cc +710 -0
- data/engines/jsc/src/os-engine.cc +210 -0
- data/engines/rhino/bin/narwhal-rhino +68 -0
- data/engines/rhino/bin/narwhal-rhino.cmd +34 -0
- data/engines/rhino/bootstrap.js +119 -0
- data/engines/rhino/jars/jline.jar +0 -0
- data/engines/rhino/jars/jna.jar +0 -0
- data/engines/rhino/jars/js.jar +0 -0
- data/engines/rhino/lib/binary-engine.js +83 -0
- data/engines/rhino/lib/concurrency.js +6 -0
- data/engines/rhino/lib/event-queue.js +18 -0
- data/engines/rhino/lib/file-engine.js +216 -0
- data/engines/rhino/lib/http-client-engine.js +90 -0
- data/engines/rhino/lib/http-engine.js +10 -0
- data/engines/rhino/lib/io-engine.js +347 -0
- data/engines/rhino/lib/md5-engine.js +40 -0
- data/engines/rhino/lib/os-engine.js +150 -0
- data/engines/rhino/lib/packages-engine.js +71 -0
- data/engines/rhino/lib/sandbox-engine.js +70 -0
- data/engines/rhino/lib/system.js +38 -0
- data/engines/rhino/lib/worker-engine.js +23 -0
- data/engines/rhino/lib/zip.js +78 -0
- data/engines/rhino/package.json +4 -0
- data/engines/secure/lib/file.js +6 -0
- data/engines/secure/lib/system.js +6 -0
- data/engines/template/bin/narwhal-engine-name +32 -0
- data/engines/template/bootstrap.js +40 -0
- data/engines/template/lib/file-engine.js +118 -0
- data/engines/template/lib/system.js +17 -0
- data/examples/browser-deployment-jackconfig.js +35 -0
- data/examples/fibonacci-worker.js +35 -0
- data/examples/fibonacci.js +19 -0
- data/examples/hello +2 -0
- data/examples/narwhal +3 -0
- data/examples/not-quite-a-quine.js +1 -0
- data/extconf.rb +44 -0
- data/gem_bin/narwhal +5 -0
- data/gem_bin/sea +4 -0
- data/gem_bin/tusk +4 -0
- data/lib/args.js +849 -0
- data/lib/base16.js +16 -0
- data/lib/base64.js +120 -0
- data/lib/codec/base64.js +8 -0
- data/lib/crc32.js +60 -0
- data/lib/file-bootstrap.js +187 -0
- data/lib/file.js +659 -0
- data/lib/hash.js +28 -0
- data/lib/hashp.js +65 -0
- data/lib/html.js +16 -0
- data/lib/http-client.js +134 -0
- data/lib/http.js +17 -0
- data/lib/io.js +98 -0
- data/lib/jsmin.js +315 -0
- data/lib/jsonpath.js +89 -0
- data/lib/logger.js +55 -0
- data/lib/md4.js +146 -0
- data/lib/md5.js +164 -0
- data/lib/mime.js +166 -0
- data/lib/narwhal.js +102 -0
- data/lib/narwhal/client.js +261 -0
- data/lib/narwhal/compile.js +99 -0
- data/lib/narwhal/env.js +140 -0
- data/lib/narwhal/inline.js +106 -0
- data/lib/narwhal/json.js +324 -0
- data/lib/narwhal/json.md +178 -0
- data/lib/narwhal/repl.js +96 -0
- data/lib/narwhal/server-test.js +6 -0
- data/lib/narwhal/server.js +270 -0
- data/lib/narwhal/tusk.js +170 -0
- data/lib/narwhal/tusk/bin.js +13 -0
- data/lib/narwhal/tusk/bundle.js +0 -0
- data/lib/narwhal/tusk/catalog.js +22 -0
- data/lib/narwhal/tusk/clone.js +66 -0
- data/lib/narwhal/tusk/consolidate.js +25 -0
- data/lib/narwhal/tusk/create-catalog.js +80 -0
- data/lib/narwhal/tusk/engine.js +42 -0
- data/lib/narwhal/tusk/freeze.js +0 -0
- data/lib/narwhal/tusk/init.js +56 -0
- data/lib/narwhal/tusk/install.js +288 -0
- data/lib/narwhal/tusk/list.js +20 -0
- data/lib/narwhal/tusk/orphans.js +0 -0
- data/lib/narwhal/tusk/reheat.js +15 -0
- data/lib/narwhal/tusk/remove.js +15 -0
- data/lib/narwhal/tusk/search.js +145 -0
- data/lib/narwhal/tusk/update.js +21 -0
- data/lib/narwhal/tusk/upgrade.js +0 -0
- data/lib/os.js +33 -0
- data/lib/packages.js +423 -0
- data/lib/printf.js +169 -0
- data/lib/promise.js +352 -0
- data/lib/querystring.js +176 -0
- data/lib/ref-send.js +257 -0
- data/lib/regexp.js +12 -0
- data/lib/sandbox.js +422 -0
- data/lib/sha.js +112 -0
- data/lib/sha256.js +102 -0
- data/lib/struct.js +228 -0
- data/lib/term.js +179 -0
- data/lib/test/assert.js +95 -0
- data/lib/test/equiv.js +188 -0
- data/lib/test/jsdump.js +165 -0
- data/lib/test/runner.js +129 -0
- data/lib/unload.js +13 -0
- data/lib/uri.js +378 -0
- data/lib/url.js +5 -0
- data/lib/utf8.js +64 -0
- data/lib/util.js +985 -0
- data/lib/uuid.js +89 -0
- data/lib/xregexp.js +521 -0
- data/local.json.template +1 -0
- data/narwhal.gemspec +105 -0
- data/narwhal.js +213 -0
- data/package.json +26 -0
- data/packages/readline/engines/default/lib/readline.js +4 -0
- data/packages/readline/engines/rhino/lib/readline.js +6 -0
- data/packages/readline/package.json +5 -0
- data/sources.json +207 -0
- data/tests/all-tests.js +17 -0
- data/tests/args.js +31 -0
- data/tests/args/domain.js +215 -0
- data/tests/args/options.js +36 -0
- data/tests/args/shifting.js +92 -0
- data/tests/args/validation.js +31 -0
- data/tests/base64.js +23 -0
- data/tests/commonjs.js +3 -0
- data/tests/commonjs/all-tests.js +12 -0
- data/tests/commonjs/bytearray-encodings-tests.js +69 -0
- data/tests/commonjs/bytearray-tests.js +465 -0
- data/tests/commonjs/bytestring-encodings-tests.js +89 -0
- data/tests/commonjs/bytestring-tests.js +263 -0
- data/tests/commonjs/es5/all-tests.js +3 -0
- data/tests/commonjs/es5/bind.js +29 -0
- data/tests/commonjs/file-tests.js +315 -0
- data/tests/commonjs/file/dirname.js +31 -0
- data/tests/commonjs/file/extension.js +45 -0
- data/tests/commonjs/file/is-absolute.js +11 -0
- data/tests/commonjs/file/iterator.js +101 -0
- data/tests/commonjs/file/normal.js +27 -0
- data/tests/commonjs/file/path.js +17 -0
- data/tests/commonjs/file/relative.js +42 -0
- data/tests/commonjs/file/resolve.js +44 -0
- data/tests/commonjs/module-tests.js +9 -0
- data/tests/commonjs/modules/absolute/b.js +1 -0
- data/tests/commonjs/modules/absolute/program.js +5 -0
- data/tests/commonjs/modules/absolute/submodule/a.js +3 -0
- data/tests/commonjs/modules/absolute/test.js +9 -0
- data/tests/commonjs/modules/all-tests.js +47 -0
- data/tests/commonjs/modules/config.js +11 -0
- data/tests/commonjs/modules/cyclic/a.js +4 -0
- data/tests/commonjs/modules/cyclic/b.js +4 -0
- data/tests/commonjs/modules/cyclic/program.js +10 -0
- data/tests/commonjs/modules/cyclic/test.js +9 -0
- data/tests/commonjs/modules/determinism/program.js +3 -0
- data/tests/commonjs/modules/determinism/submodule/a.js +8 -0
- data/tests/commonjs/modules/determinism/submodule/b.js +2 -0
- data/tests/commonjs/modules/determinism/test.js +9 -0
- data/tests/commonjs/modules/exactExports/a.js +3 -0
- data/tests/commonjs/modules/exactExports/program.js +4 -0
- data/tests/commonjs/modules/exactExports/test.js +9 -0
- data/tests/commonjs/modules/hasOwnProperty/hasOwnProperty.js +0 -0
- data/tests/commonjs/modules/hasOwnProperty/program.js +3 -0
- data/tests/commonjs/modules/hasOwnProperty/test.js +9 -0
- data/tests/commonjs/modules/hasOwnProperty/toString.js +0 -0
- data/tests/commonjs/modules/method/a.js +12 -0
- data/tests/commonjs/modules/method/program.js +8 -0
- data/tests/commonjs/modules/method/test.js +9 -0
- data/tests/commonjs/modules/missing/program.js +8 -0
- data/tests/commonjs/modules/missing/test.js +9 -0
- data/tests/commonjs/modules/monkeys/a.js +1 -0
- data/tests/commonjs/modules/monkeys/program.js +4 -0
- data/tests/commonjs/modules/monkeys/test.js +9 -0
- data/tests/commonjs/modules/nested/a/b/c/d.js +3 -0
- data/tests/commonjs/modules/nested/program.js +3 -0
- data/tests/commonjs/modules/nested/test.js +9 -0
- data/tests/commonjs/modules/relative/program.js +5 -0
- data/tests/commonjs/modules/relative/submodule/a.js +1 -0
- data/tests/commonjs/modules/relative/submodule/b.js +2 -0
- data/tests/commonjs/modules/relative/test.js +9 -0
- data/tests/commonjs/modules/transitive/a.js +1 -0
- data/tests/commonjs/modules/transitive/b.js +1 -0
- data/tests/commonjs/modules/transitive/c.js +3 -0
- data/tests/commonjs/modules/transitive/program.js +3 -0
- data/tests/commonjs/modules/transitive/test.js +9 -0
- data/tests/file/all-tests.js +61 -0
- data/tests/file/fnmatch.js +102 -0
- data/tests/file/glob.js +466 -0
- data/tests/file/match.js +102 -0
- data/tests/global.js +6 -0
- data/tests/global/array.js +19 -0
- data/tests/hashes.js +94 -0
- data/tests/html.js +13 -0
- data/tests/io/stringio.js +21 -0
- data/tests/os/all-tests.js +4 -0
- data/tests/os/popen.js +41 -0
- data/tests/os/system.js +22 -0
- data/tests/printf.js +123 -0
- data/tests/query-string.js +87 -0
- data/tests/sandbox/byte-io.js +20 -0
- data/tests/sandbox/fileName.js +3 -0
- data/tests/sandbox/foo.js +0 -0
- data/tests/sandbox/reload.js +79 -0
- data/tests/string.js +35 -0
- data/tests/uri.js +41 -0
- data/tests/util/all-tests.js +79 -0
- data/tests/util/array.js +207 -0
- data/tests/util/array/is-arguments.js +29 -0
- data/tests/util/array/is-array-like.js +29 -0
- data/tests/util/case.js +9 -0
- data/tests/util/collection.js +104 -0
- data/tests/util/eq.js +57 -0
- data/tests/util/expand.js +45 -0
- data/tests/util/object.js +125 -0
- data/tests/util/operator.js +25 -0
- data/tests/util/range.js +19 -0
- data/tests/util/repr.js +26 -0
- data/tests/util/string.js +34 -0
- data/tests/util/unique.js +12 -0
- metadata +434 -0
data/lib/querystring.js
ADDED
@@ -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
|
+
|