Created
September 23, 2015 17:06
-
-
Save krisselden/a83aa922be5695947d3a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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