Index: lib/snippets.js |
=================================================================== |
--- a/lib/snippets.js |
+++ b/lib/snippets.js |
@@ -148,8 +148,42 @@ |
} |
} |
} |
return tree; |
} |
exports.parseScript = parseScript; |
+ |
+/** |
+ * Compiles a script against a given list of libraries into executable code |
+ * @param {string} script |
+ * @param {string[]} libraries |
+ * @return {string} |
+ */ |
+function compileScript(script, libraries) |
+{ |
+ return ` |
+ "use strict"; |
+ { |
+ const libraries = ${JSON.stringify(libraries)}; |
+ |
+ const script = ${JSON.stringify(parseScript(script))}; |
+ |
+ let imports = Object.create(null); |
+ for (let library of libraries) |
+ new Function("exports", library)(imports); |
kzar
2018/07/10 14:35:15
I wonder why we take include all libraries, instea
kzar
2018/07/10 14:35:15
If I got it right, `compileScript` has a string re
Manish Jethani
2018/07/12 09:48:31
The idea is that there will be a local library, wh
Manish Jethani
2018/07/12 09:48:32
libraries is an array of strings. The only way to
kzar
2018/07/12 10:21:43
I still don't see the point of stringifying it, ju
Manish Jethani
2018/07/12 11:05:29
The JSON.stringify is what converts your first sni
kzar
2018/07/12 11:19:55
It's really not, but nevermind.
Manish Jethani
2018/07/12 11:35:16
OK, perhaps I am misunderstanding. If you can rewr
Sebastian Noack
2018/07/16 19:14:53
So we are generating code that generates code just
Manish Jethani
2018/07/17 19:57:15
The library looks like this:
https://github.com/a
|
+ |
+ for (let [name, ...args] of script) |
+ { |
+ if (Object.prototype.hasOwnProperty.call(imports, name)) |
kzar
2018/07/10 14:35:15
Why not `name in imports`, you created the `import
Manish Jethani
2018/07/12 09:48:31
It's just safer this way. Right now it's a null pr
kzar
2018/07/12 10:21:43
Alright, I disagree but won't insist.
Manish Jethani
2018/07/12 11:05:29
Acknowledged.
|
+ { |
+ let value = imports[name]; |
+ if (typeof value == "function") |
kzar
2018/07/10 14:35:15
Could this check ever fail?
Manish Jethani
2018/07/12 09:48:31
Yes, a library could export a "constant" for whate
kzar
2018/07/12 10:21:43
Acknowledged.
|
+ value(...args); |
+ } |
+ } |
+ } |
+ `; |
+} |
+ |
+exports.compileScript = compileScript; |