Skip to content

Instantly share code, notes, and snippets.

@thheller
Created June 16, 2017 20:27
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save thheller/f5eba1ac3ee8fdccd6b85f4deb34ea3b to your computer and use it in GitHub Desktop.
var SHADOW_IMPORT_PATH = "/Users/zilence/code/shadow-cljs/target/shadow-cljs/node-repl/dev/cljs-runtime";
var SHADOW_ENV = {};
try {require('source-map-support').install();} catch (e) {console.warn('no "source-map-support" (run "npm install source-map-support --save-dev" to get it)');}
SHADOW_ENV.CLOSURE_NO_DEPS = true;
SHADOW_ENV.CLOSURE_DEFINES = {"shadow.cljs.devtools.client.env.autoload":false,"shadow.cljs.devtools.client.env.proc_id":"4553d9c9-bc8b-4e6b-9a20-ed188e9ffd05","shadow.cljs.devtools.client.env.module_format":"goog","goog.LOCALE":"en","shadow.cljs.devtools.client.env.repl_host":"localhost","shadow.cljs.devtools.client.env.build_id":"node-repl","goog.DEBUG":true,"shadow.cljs.devtools.client.env.reload_with_state":false,"shadow.cljs.devtools.client.env.after_load":null,"shadow.cljs.devtools.client.env.before_load":null,"shadow.cljs.devtools.client.env.repl_port":8200,"shadow.cljs.devtools.client.env.enabled":true,"goog.TRANSPILE":"never"};
var SHADOW_ROOTS = ["goog"];
var goog = SHADOW_ENV.goog = {};
// SHADOW_ENV becomes goog.global which may access some of these
SHADOW_ENV.setTimeout = global.setTimeout;
SHADOW_ENV.clearTimeout = global.clearTimeout;
SHADOW_ENV.setInterval = global.setInterval;
SHADOW_ENV.clearInterval = global.clearInterval;
SHADOW_ENV.setImmediate = global.setImmediate;
SHADOW_ENV.clearImmediate = global.clearImmediate;
SHADOW_ENV.SHADOW_IMPORTED = {};
var PATH = require("path");
var VM = require("vm");
var FS = require("fs");
// extract [root] for all goog.provide('[root].something');
// we need to pull them into local scope for every eval
var SHADOW_EXTRACT_ROOTS = function(js) {
var re = /goog.provide\(([^)]+)\);/g
var match = null;
while (match = re.exec(js)) {
var provide = match[1];
var end = provide.indexOf('.');
if (end == -1) {
end = provide.length - 1;
}
// skip first char as match will be "cljs.core" or 'cljs.core' but always with quotes
// end at either the first dot or end of provide-1 for one-segement namespaces
var root = provide.substring(1, end);
if (!SHADOW_ROOTS.includes(root)) {
SHADOW_ENV[root] = {};
SHADOW_ROOTS.push(root);
}
}
};
var SHADOW_PROVIDE = function(name) {
return goog.exportPath_(name, undefined, SHADOW_ENV);
};
var SHADOW_REQUIRE = function(name) {
return true;
};
var SHADOW_WRAP = function(js) {
var code = "(function (require, module, __filename, __dirname, SHADOW_ENV) {\n";
// this is part of goog/base.js and for some reason the only global var not on goog or goog.global
code += "var COMPILED = false;\n"
SHADOW_ROOTS.forEach(function(root) {
code += "var " + root + "=SHADOW_ENV." + root + ";\n";
});
code += js;
code += "\n});";
return code;
};
var SHADOW_WRAP_OFFSET = function() {
// -1 because we have one more lines than original (the wrapper above)
return (2 + SHADOW_ROOTS.length) * -1;
};
var SHADOW_IMPORT = SHADOW_ENV.SHADOW_IMPORT = function(src) {
if (SHADOW_ENV.CLOSURE_DEFINES["shadow.debug"]) {
console.info("SHADOW load:", src);
}
SHADOW_ENV.SHADOW_IMPORTED[src] = true;
// NODE_INCLUDE_PATH points to an absolute path, injected by shadow/cljs/node.clj
var filePath = SHADOW_IMPORT_PATH + '/' + src;
var js = FS.readFileSync(filePath);
SHADOW_EXTRACT_ROOTS(js);
var code = SHADOW_WRAP(js);
var fn = VM.runInThisContext(code,
{filename: filePath,
lineOffset: SHADOW_WRAP_OFFSET(),
displayErrors: true
});
// the comment is for source-map-support which unfortunately shows the wrong piece of code but the stack is correct
try {
/* ignore this, look at stacktrace */ fn.call(SHADOW_ENV, require, module, __filename, __dirname, SHADOW_ENV);
} catch (e) {
console.error("SHADOW import error", filePath);
throw e;
}
return true;
};
SHADOW_ENV.NODE_EVAL = function(js, smJson) {
var prefix = "return (";
var code = SHADOW_WRAP(prefix + js + ");");
if (smJson) {
code += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,";
code += new Buffer(smJson).toString('base64');
}
// console.log(code);
var fn = VM.runInThisContext(code,
{filename: "<eval>",
lineOffset: SHADOW_WRAP_OFFSET(),
columnOffset: prefix.length,
displayErrors: true
});
return fn.call(SHADOW_ENV, require, module, __filename, __dirname, SHADOW_ENV);
};
SHADOW_IMPORT("goog.base.js");
goog.provide = SHADOW_PROVIDE;
goog.require = SHADOW_REQUIRE;
SHADOW_IMPORT("goog.debug.error.js");
SHADOW_IMPORT("goog.dom.nodetype.js");
SHADOW_IMPORT("goog.string.string.js");
SHADOW_IMPORT("goog.asserts.asserts.js");
SHADOW_IMPORT("goog.reflect.reflect.js");
SHADOW_IMPORT("goog.math.long.js");
SHADOW_IMPORT("goog.math.integer.js");
SHADOW_IMPORT("goog.object.object.js");
SHADOW_IMPORT("goog.array.array.js");
SHADOW_IMPORT("goog.string.stringbuffer.js");
SHADOW_IMPORT("cljs.core.js");
SHADOW_IMPORT("clojure.walk.js");
SHADOW_IMPORT("cljs.spec.gen.alpha.js");
SHADOW_IMPORT("clojure.string.js");
SHADOW_IMPORT("cljs.spec.alpha.js");
SHADOW_IMPORT("cljs.repl.js");
SHADOW_IMPORT("cljs.user.js");
SHADOW_IMPORT("shadow.cljs.devtools.client.env.js");
SHADOW_IMPORT("shadow.npm.ws.js");
SHADOW_IMPORT("cljs.reader.js");
SHADOW_IMPORT("shadow.cljs.devtools.client.node.js");
SHADOW_IMPORT("shadow.cljs.devtools.client.console.js");
SHADOW_IMPORT("shadow.cljs.devtools.client.node_repl.js");
SHADOW_IMPORT("shadow.module.append.shadow-node-repl.js");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment