UNPKG

systemjs

Version:

System loader extension for flexible AMD & CommonJS support

86 lines (65 loc) 2.81 kB
/* SystemJS CommonJS Format */ function cjs(loader) { loader._extensions.push(cjs); // CJS Module Format // require('...') || exports[''] = ... || exports.asd = ... || module.exports = ... var cjsExportsRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.]|module\.)(exports\s*\[['"]|\exports\s*\.)|(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.])module\.exports\s*\=/; // RegEx adjusted from https://github.com/jbrantly/yabble/blob/master/lib/yabble.js#L339 var cjsRequireRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF."'])require\s*\(\s*("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\s*\)/g; var commentRegEx = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg; function getCJSDeps(source) { cjsRequireRegEx.lastIndex = 0; var deps = []; // remove comments from the source first, if not minified if (source.length / source.split('\n').length < 200) source = source.replace(commentRegEx, ''); var match; while (match = cjsRequireRegEx.exec(source)) deps.push(match[1].substr(1, match[1].length - 2)); return deps; } var loaderInstantiate = loader.instantiate; loader.instantiate = function(load) { if (!load.metadata.format) { cjsExportsRegEx.lastIndex = 0; cjsRequireRegEx.lastIndex = 0; if (cjsRequireRegEx.exec(load.source) || cjsExportsRegEx.exec(load.source)) load.metadata.format = 'cjs'; } if (load.metadata.format == 'cjs') { load.metadata.deps = load.metadata.deps ? load.metadata.deps.concat(getCJSDeps(load.source)) : getCJSDeps(load.source); load.metadata.executingRequire = true; load.metadata.execute = function(require, exports, module) { var dirname = (load.address || '').split('/'); dirname.pop(); dirname = dirname.join('/'); // if on the server, remove the "file:" part from the dirname if (System._nodeRequire) dirname = dirname.substr(5); var globals = loader.global._g = { global: loader.global, exports: exports, module: module, require: require, __filename: System._nodeRequire ? load.address.substr(5) : load.address, __dirname: dirname }; var source = '(function(global, exports, module, require, __filename, __dirname) { ' + load.source + '\n}).call(_g.exports, _g.global, _g.exports, _g.module, _g.require, _g.__filename, _g.__dirname);'; // disable AMD detection var define = loader.global.define; loader.global.define = undefined; loader.__exec({ name: load.name, address: load.address, source: source }); loader.global.define = define; loader.global._g = undefined; } } return loaderInstantiate.call(this, load); }; }