Skip to content

Commit

Permalink
support node core module loading
Browse files Browse the repository at this point in the history
  • Loading branch information
guybedford committed Aug 20, 2015
1 parent 18f9bd8 commit 9427408
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 35 deletions.
12 changes: 12 additions & 0 deletions lib/cjs.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,18 @@
};
});

hook('normalize', function(normalize) {
return function (name, parentName) {
// dynamically load node-core modules when requiring `@node/fs` for example
if (name.substr(0, 6) == '@node/') {
if (!this._nodeRequire)
throw new TypeError('Can only load node core modules in Node.');
this.set(name, this.newModule(getESModule(this._nodeRequire(name.substr(6)))));
}
return normalize.call(this, name, parentName);
};
});

hook('instantiate', function(instantiate) {
return function(load) {
var loader = this;
Expand Down
3 changes: 2 additions & 1 deletion lib/conditionals.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@

// standard environment module, starting small as backwards-compat matters!
this.set('@system-env', this.newModule({
browser: isBrowser
browser: isBrowser,
node: !!this._nodeRequire
}));
};
});
Expand Down
34 changes: 34 additions & 0 deletions lib/proto.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,40 @@ function group(deps) {
return { names: names, indices: indices };
}

var getOwnPropertyDescriptor = true;
try {
Object.getOwnPropertyDescriptor({ a: 0 }, 'a');
}
catch(e) {
getOwnPropertyDescriptor = false;
}

// converts any module.exports object into an object ready for System.newModule
function getESModule(exports) {
var esModule = {};
// don't trigger getters/setters in environments that support them
if (typeof exports == 'object' || typeof exports == 'function') {
if (getOwnPropertyDescriptor) {
var d;
for (var p in exports)
if (d = Object.getOwnPropertyDescriptor(exports, p))
defineProperty(esModule, p, d);
}
else {
var hasOwnProperty = exports && exports.hasOwnProperty;
for (var p in exports) {
if (!hasOwnProperty || exports.hasOwnProperty(p))
esModule[p] = exports[p];
}
}
}
esModule['default'] = exports;
defineProperty(esModule, '__useDefault', {
value: true
});
return esModule;
}

function extend(a, b, prepend) {
for (var p in b) {
if (!prepend || !(p in a))
Expand Down
37 changes: 3 additions & 34 deletions lib/register.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,6 @@
*/
(function() {

var getOwnPropertyDescriptor = true;
try {
Object.getOwnPropertyDescriptor({ a: 0 }, 'a');
}
catch(e) {
getOwnPropertyDescriptor = false;
}

/*
* There are two variations of System.register:
* 1. System.register for ES6 conversion (2-3 params) - System.register([name, ]deps, declare)
Expand Down Expand Up @@ -385,33 +377,10 @@
// create the esModule object, which allows ES6 named imports of dynamics
exports = module.exports;

if (exports && exports.__esModule) {
if (exports && exports.__esModule)
entry.esModule = exports;
}
else {
entry.esModule = {};

// don't trigger getters/setters in environments that support them
if (typeof exports == 'object' || typeof exports == 'function') {
if (getOwnPropertyDescriptor) {
var d;
for (var p in exports)
if (d = Object.getOwnPropertyDescriptor(exports, p))
defineProperty(entry.esModule, p, d);
}
else {
var hasOwnProperty = exports && exports.hasOwnProperty;
for (var p in exports) {
if (!hasOwnProperty || exports.hasOwnProperty(p))
entry.esModule[p] = exports[p];
}
}
}
entry.esModule['default'] = exports;
defineProperty(entry.esModule, '__useDefault', {
value: true
});
}
else
entry.esModule = getESModule(exports);
}

/*
Expand Down
8 changes: 8 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -967,4 +967,12 @@ asyncTest('Importing a script with wrong integrity fails', function() {
});
});

if (typeof process != 'undefined')
asyncTest('Loading Node core modules', function() {
System['import']('@node/fs').then(function(m) {
ok(m.writeFile);
start();
});
});

})(typeof window == 'undefined' ? global : window);

0 comments on commit 9427408

Please sign in to comment.