Skip to content

Instantly share code, notes, and snippets.

@krisselden
Created September 23, 2015 17:06
Show Gist options
  • Save krisselden/a83aa922be5695947d3a to your computer and use it in GitHub Desktop.
Save krisselden/a83aa922be5695947d3a to your computer and use it in GitHub Desktop.
function Module(dir) {
this.dir = dir;
this.exports = {};
}
function loadModule(dirname, filename) {
var i = Realm.create();
Realm.eval(i, '__dirname = '+ JSON.stringify(dirname));
Realm.eval(i, '__filename = '+ JSON.stringify(filename));
Realm.eval(i, 'module = new Realm.shared.Module(__dirname)');
Realm.eval(i, 'exports = module.exports');
Realm.eval(i, 'require = module.require.bind(module)');
try {
Realm.eval(i, read(filename));
return Realm.eval(i, 'module');
} catch(e) {
print('failed to load '+filename);
throw e;
}
}
const cached = Object.create(null);
const splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
Module.prototype.require = function require(request) {
var file = resolve(this.dir, request);
var parts = splitPathRe.exec(file);
var dirname = parts[1] + parts[2];
var basename = parts[3];
var ext = parts[4];
var filename = dirname + basename;
if (!ext) {
filename += '.js';
}
var module = cached[filename];
if (module) {
return module.exports;
}
module = loadModule(dirname, filename);
cached[filename] = module;
return module.exports;
};
Realm.shared = {
Module: Module
};
if (typeof arguments === 'undefined' || arguments.length === 0) {
print('d8 d8cjs.js -- path/to/require');
} else {
var m = new Module(cwd());
m.require(arguments[0]);
}
function cwd() {
return os.system('pwd').trim();
}
function resolve(dir, path) {
var parts = dir.split('/').concat(path.split('/'));
parts = normalize(parts);
return '/' + parts.join('/');
}
function normalize(parts) {
var res = [];
for (var i = 0; i < parts.length; i++) {
var p = parts[i];
if (!p || p === '.') {
continue;
}
if (p === '..') {
if (res.length && res[res.length - 1] !== '..') {
res.pop();
}
} else {
res.push(p);
}
}
return res;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment