mirror of
https://github.com/systemjs/systemjs.git
synced 2026-01-18 14:53:14 +00:00
spec update rewrite, wip
This commit is contained in:
parent
d9da574341
commit
3cb9b6f657
13
Makefile
13
Makefile
@ -1,15 +1,10 @@
|
||||
|
||||
START = \
|
||||
cat lib/banner.js \
|
||||
lib/polyfill-wrapper-start.js \
|
||||
lib/polyfills.js > dist/$@.js;
|
||||
START = cat lib/banner.js lib/polyfill-wrapper-start.js > dist/$@.js;
|
||||
|
||||
END = \
|
||||
cat lib/polyfill-wrapper-end.js >> dist/$@.js;
|
||||
|
||||
END = cat lib/polyfill-wrapper-end.js >> dist/$@.js;
|
||||
|
||||
SystemJS = core formats formatAMD formatCJS formatGlobal map plugins bundles register versions
|
||||
SystemProductionAMD = core productionAMD bundles register versions
|
||||
SystemJS = core meta register global cjs amd map plugins bundles versions
|
||||
SystemProductionAMD = core register scriptLoader map bundles versions
|
||||
|
||||
all: system system-production-amd uglify
|
||||
|
||||
|
||||
933
dist/system-production-amd.js
vendored
933
dist/system-production-amd.js
vendored
File diff suppressed because it is too large
Load Diff
2
dist/system-production-amd.min.js
vendored
2
dist/system-production-amd.min.js
vendored
File diff suppressed because one or more lines are too long
1619
dist/system.js
vendored
1619
dist/system.js
vendored
File diff suppressed because it is too large
Load Diff
1
dist/system.min.js
vendored
1
dist/system.min.js
vendored
File diff suppressed because one or more lines are too long
170
lib/extension-amd.js
Normal file
170
lib/extension-amd.js
Normal file
@ -0,0 +1,170 @@
|
||||
/*
|
||||
SystemJS AMD Format
|
||||
Provides the AMD module format definition at System.format.amd
|
||||
as well as a RequireJS-style require on System.require
|
||||
*/
|
||||
function amd(loader) {
|
||||
|
||||
// AMD Module Format Detection RegEx
|
||||
// define([.., .., ..], ...)
|
||||
// define(varName); || define(function(require, exports) {}); || define({})
|
||||
var amdRegEx = /(?:^\s*|[}{\(\);,\n\?\&]\s*)define\s*\(\s*("[^"]+"\s*,\s*|'[^']+'\s*,\s*)?(\[(\s*("[^"]+"|'[^']+')\s*,)*(\s*("[^"]+"|'[^']+')\s*)?\]|function\s*|{|[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*\))/;
|
||||
|
||||
/*
|
||||
AMD-compatible require
|
||||
To copy RequireJS, set window.require = window.requirejs = loader.require
|
||||
*/
|
||||
function require(names, callback, errback, referer) {
|
||||
// 'this' is bound to the loader
|
||||
var loader = this;
|
||||
|
||||
// in amd, first arg can be a config object... we just ignore
|
||||
if (typeof names == 'object' && !(names instanceof Array))
|
||||
return require.apply(null, Array.prototype.splice.call(arguments, 1, arguments.length - 1));
|
||||
|
||||
// amd require
|
||||
if (names instanceof Array)
|
||||
Promise.all(names.map(function(name) {
|
||||
return loader['import'](name, referer);
|
||||
})).then(function(modules) {
|
||||
callback.apply(null, modules);
|
||||
}, errback);
|
||||
|
||||
// commonjs require
|
||||
else if (typeof names == 'string') {
|
||||
var module = loader.get(names);
|
||||
return module.__useDefault ? module['default'] : module;
|
||||
}
|
||||
|
||||
else
|
||||
throw 'Invalid require';
|
||||
};
|
||||
loader.require = require;
|
||||
|
||||
function makeRequire(parentName, staticRequire, loader) {
|
||||
return function(names, callback, errback) {
|
||||
if (typeof names == 'string')
|
||||
return staticRequire(names);
|
||||
return require.call(loader, names, callback, errback, { name: parentName });
|
||||
}
|
||||
}
|
||||
|
||||
var lastDefine;
|
||||
function createDefine(loader, getCJSDeps) {
|
||||
if (loader.global.define && loader.global.define.loader == loader)
|
||||
return;
|
||||
|
||||
loader.global.define = function(name, deps, factory) {
|
||||
if (typeof name != 'string') {
|
||||
factory = deps;
|
||||
deps = name;
|
||||
name = null;
|
||||
}
|
||||
if (!(deps instanceof Array)) {
|
||||
factory = deps;
|
||||
// CommonJS AMD form
|
||||
if (!getCJSDeps)
|
||||
throw "AMD extension needs CJS extension for AMD CJS support";
|
||||
deps = ['require', 'exports', 'module'].concat(getCJSDeps(factory.toString()));
|
||||
}
|
||||
|
||||
if (typeof factory != 'function')
|
||||
factory = (function(factory) {
|
||||
return function() { return factory; }
|
||||
})(factory);
|
||||
|
||||
// a module file can only define one anonymous module
|
||||
if (!name && lastDefine)
|
||||
throw "Multiple defines for anonymous module";
|
||||
|
||||
// remove system dependencies
|
||||
var requireIndex, exportsIndex, moduleIndex
|
||||
if ((requireIndex = indexOf.call(deps, 'require')) != -1)
|
||||
deps.splice(requireIndex, 1);
|
||||
|
||||
if ((exportsIndex = indexOf.call(deps, 'exports')) != -1)
|
||||
deps.splice(exportsIndex, 1);
|
||||
|
||||
if ((moduleIndex = indexOf.call(deps, 'module')) != -1)
|
||||
deps.splice(moduleIndex, 1);
|
||||
|
||||
lastDefine = {
|
||||
deps: deps,
|
||||
execute: function(require, exports, moduleName) {
|
||||
|
||||
var depValues = [];
|
||||
for (var i = 0; i < deps.length; i++) {
|
||||
var module = require(deps[i]);
|
||||
if (module.__useDefault) {
|
||||
module = module['default'];
|
||||
}
|
||||
else if (!module.__esModule) {
|
||||
// compatibility -> ES6 modules must have a __esModule flag
|
||||
// we clone the module object to handle this
|
||||
var moduleClone = { __esModule: true };
|
||||
for (var p in module)
|
||||
moduleClone[p] = module[p];
|
||||
module = moduleClone;
|
||||
}
|
||||
depValues.push(module);
|
||||
}
|
||||
|
||||
var module;
|
||||
|
||||
// add back in system dependencies
|
||||
if (moduleIndex != -1)
|
||||
depValues.splice(moduleIndex, 0, exports, module = { id: moduleName, uri: loader.baseURL + moduleName, config: function() { return {}; }, exports: exports });
|
||||
|
||||
if (exportsIndex != -1)
|
||||
depValues.splice(exportsIndex, 0, exports);
|
||||
|
||||
if (requireIndex != -1)
|
||||
depValues.splice(requireIndex, 0, makeRequire(moduleName, require, loader));
|
||||
|
||||
var output = factory.apply(loader.global, depValues);
|
||||
|
||||
output = output || module && module.exports;
|
||||
|
||||
if (output && output.__esModule)
|
||||
return output;
|
||||
else if (output !== undefined)
|
||||
return { __useDefault: true, 'default': output };
|
||||
}
|
||||
};
|
||||
|
||||
// attaches to loader.defined as dynamic
|
||||
if (name)
|
||||
loader.defined[name] = lastDefine;
|
||||
};
|
||||
|
||||
loader.global.define.amd = {};
|
||||
loader.global.define.loader = loader;
|
||||
}
|
||||
|
||||
|
||||
var loaderInstantiate = loader.instantiate;
|
||||
loader.instantiate = function(load) {
|
||||
var loader = this;
|
||||
|
||||
if (load.metadata.format == 'amd' || !load.metadata.format && load.source.match(amdRegEx)) {
|
||||
load.metadata.format = 'amd';
|
||||
createDefine(loader, load.metadata.getCJSDeps);
|
||||
|
||||
lastDefine = null;
|
||||
|
||||
// ensure no NodeJS environment detection
|
||||
loader.global.module = undefined;
|
||||
loader.global.exports = undefined;
|
||||
|
||||
loader.__exec(load);
|
||||
|
||||
if (!lastDefine)
|
||||
throw "AMD module " + load.name + " did not define";
|
||||
|
||||
load.metadata.deps = load.metadata.deps ? load.metadata.deps.concat(lastDefine.deps) : lastDefine.deps;
|
||||
load.metadata.execute = lastDefine.execute;
|
||||
}
|
||||
|
||||
return loaderInstantiate.call(loader, load);
|
||||
}
|
||||
}
|
||||
@ -14,6 +14,9 @@
|
||||
*/
|
||||
|
||||
function bundles(loader) {
|
||||
if (typeof indexOf == 'undefined')
|
||||
indexOf = Array.prototype.indexOf;
|
||||
|
||||
// bundles support (just like RequireJS)
|
||||
// bundle name is module name of bundle itself
|
||||
// bundle is array of modules defined by the bundle
|
||||
@ -23,6 +26,9 @@ function bundles(loader) {
|
||||
|
||||
var loaderFetch = loader.fetch;
|
||||
loader.fetch = function(load) {
|
||||
if (!loader.bundles)
|
||||
loader.bundles = {};
|
||||
|
||||
// if this module is in a bundle, load the bundle first then
|
||||
for (var b in loader.bundles) {
|
||||
if (indexOf.call(loader.bundles[b], load.name) == -1)
|
||||
@ -40,27 +46,4 @@ function bundles(loader) {
|
||||
}
|
||||
return loaderFetch.apply(this, arguments);
|
||||
}
|
||||
|
||||
var loaderLocate = loader.locate;
|
||||
loader.locate = function(load) {
|
||||
if (loader.bundles[load.name])
|
||||
load.metadata.bundle = true;
|
||||
return loaderLocate.call(this, load);
|
||||
}
|
||||
|
||||
var loaderInstantiate = loader.instantiate;
|
||||
loader.instantiate = function(load) {
|
||||
// if it is a bundle itself, it doesn't define anything
|
||||
if (load.metadata.bundle)
|
||||
return {
|
||||
deps: [],
|
||||
execute: function() {
|
||||
loader.__exec(load);
|
||||
return new Module({});
|
||||
}
|
||||
};
|
||||
|
||||
return loaderInstantiate.apply(this, arguments);
|
||||
}
|
||||
|
||||
}
|
||||
115
lib/extension-cjs.js
Normal file
115
lib/extension-cjs.js
Normal file
@ -0,0 +1,115 @@
|
||||
/*
|
||||
SystemJS CommonJS Format
|
||||
*/
|
||||
function cjs(loader) {
|
||||
|
||||
// CJS Module Format
|
||||
// require('...') || exports[''] = ... || exports.asd = ... || module.exports = ...
|
||||
var cjsExportsRegEx = /(?:^\s*|[}{\(\);,\n=:\?\&]\s*|module\.)(exports\s*\[\s*('[^']+'|"[^"]+")\s*\]|\exports\s*\.\s*[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*|exports\s*\=)/;
|
||||
var cjsRequireRegEx = /(?:^\s*|[}{\(\);,\n=:\?\&]\s*)require\s*\(\s*("([^"]+)"|'([^']+)')\s*\)/g;
|
||||
var commentRegEx = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg;
|
||||
|
||||
function getCJSDeps(source) {
|
||||
cjsExportsRegEx.lastIndex = 0;
|
||||
cjsRequireRegEx.lastIndex = 0;
|
||||
|
||||
var deps = [];
|
||||
|
||||
// remove comments from the source first
|
||||
var source = source.replace(commentRegEx, '');
|
||||
|
||||
var match;
|
||||
|
||||
while (match = cjsRequireRegEx.exec(source))
|
||||
deps.push(match[2] || match[3]);
|
||||
|
||||
return deps;
|
||||
}
|
||||
|
||||
var loaderTranslate = loader.translate;
|
||||
loader.translate = function(load) {
|
||||
load.metadata.getCJSDeps = getCJSDeps;
|
||||
return loaderTranslate.call(this, load);
|
||||
}
|
||||
|
||||
|
||||
var noop = function() {}
|
||||
var nodeProcess = {
|
||||
nextTick: function(f) {
|
||||
setTimeout(f, 7);
|
||||
},
|
||||
browser: typeof window != 'undefined',
|
||||
env: {},
|
||||
argv: [],
|
||||
on: noop,
|
||||
once: noop,
|
||||
off: noop,
|
||||
emit: noop,
|
||||
cwd: function() { return '/' }
|
||||
};
|
||||
loader.set('@@nodeProcess', Module(nodeProcess));
|
||||
|
||||
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)) : load.metadata.deps;
|
||||
|
||||
load.metadata.execute = function(require, exports, moduleName) {
|
||||
var dirname = load.address.split('/');
|
||||
dirname.pop();
|
||||
dirname = dirname.join('/');
|
||||
|
||||
var globals = loader.global._g = {
|
||||
global: loader.global,
|
||||
exports: exports,
|
||||
module: { exports: exports },
|
||||
process: nodeProcess,
|
||||
require: function(name) {
|
||||
var module = require(name);
|
||||
if (module.__useDefault) {
|
||||
module = module['default'];
|
||||
}
|
||||
else if (!module.__esModule) {
|
||||
// compatibility -> ES6 modules must have a __esModule flag
|
||||
// we clone the module object to handle this
|
||||
var moduleClone = { __esModule: true };
|
||||
for (var p in module)
|
||||
moduleClone[p] = module[p];
|
||||
module = moduleClone;
|
||||
}
|
||||
return module;
|
||||
},
|
||||
__filename: load.address,
|
||||
__dirname: dirname
|
||||
};
|
||||
|
||||
var glString = '';
|
||||
for (var _g in globals)
|
||||
glString += 'var ' + _g + ' = _g.' + _g + ';';
|
||||
|
||||
load.source = glString + load.source;
|
||||
|
||||
loader.__exec(load);
|
||||
|
||||
loader.global._g = undefined;
|
||||
|
||||
var output = globals.module.exports;
|
||||
|
||||
if (output && output.__esModule)
|
||||
return output;
|
||||
else if (output !== undefined)
|
||||
return { __useDefault: true, 'default': output };
|
||||
}
|
||||
}
|
||||
|
||||
return loaderInstantiate.call(this, load);
|
||||
};
|
||||
}
|
||||
@ -1,58 +1,169 @@
|
||||
/*
|
||||
SystemJS Core
|
||||
Adds normalization to the import function, as well as __useDefault support
|
||||
*/
|
||||
* SystemJS Core
|
||||
* Code should be vaguely readable
|
||||
*
|
||||
*/
|
||||
function core(loader) {
|
||||
(function() {
|
||||
|
||||
var curSystem = System;
|
||||
|
||||
/*
|
||||
__useDefault
|
||||
|
||||
When a module object looks like:
|
||||
new Module({
|
||||
Module({
|
||||
__useDefault: true,
|
||||
default: 'some-module'
|
||||
})
|
||||
|
||||
Then the import of that module is taken to be the 'default' export and not the module object itself.
|
||||
Then importing that module provides the 'some-module'
|
||||
result directly instead of the full module.
|
||||
|
||||
Useful for module.exports = function() {} handling
|
||||
Useful for eg module.exports = function() {}
|
||||
*/
|
||||
var checkUseDefault = function(module) {
|
||||
if (!(module instanceof Module)) {
|
||||
var out = [];
|
||||
for (var i = 0; i < module.length; i++)
|
||||
out[i] = checkUseDefault(module[i]);
|
||||
return out;
|
||||
}
|
||||
return module.__useDefault ? module['default'] : module;
|
||||
}
|
||||
|
||||
// a variation on System.get that does the __useDefault check
|
||||
loader.getModule = function(key) {
|
||||
return checkUseDefault(loader.get(key));
|
||||
var loaderImport = loader['import'];
|
||||
loader['import'] = function(name, options) {
|
||||
return loaderImport.call(this, name, options).then(function(module) {
|
||||
return module.__useDefault ? module['default'] : module;
|
||||
});
|
||||
}
|
||||
|
||||
// support the empty module, as a concept
|
||||
loader.set('@empty', Module({}));
|
||||
|
||||
|
||||
var loaderImport = loader['import'];
|
||||
loader['import'] = function(name, options) {
|
||||
// patch loader.import to do normalization
|
||||
return new Promise(function(resolve) {
|
||||
resolve(loader.normalize.call(this, name, options && options.name, options && options.address))
|
||||
})
|
||||
// add useDefault support
|
||||
.then(function(name) {
|
||||
return Promise.resolve(loaderImport.call(loader, name, options)).then(function(module) {
|
||||
return checkUseDefault(module);
|
||||
});
|
||||
|
||||
/*
|
||||
Config
|
||||
Extends config merging one deep only
|
||||
|
||||
loader.config({
|
||||
some: 'random',
|
||||
config: 'here',
|
||||
deep: {
|
||||
config: { too: 'too' }
|
||||
}
|
||||
});
|
||||
|
||||
<=>
|
||||
|
||||
loader.some = 'random';
|
||||
loader.config = 'here'
|
||||
loader.deep = loader.deep || {};
|
||||
loader.deep.config = { too: 'too' };
|
||||
*/
|
||||
loader.config = function(cfg) {
|
||||
for (var c in cfg) {
|
||||
var v = cfg[c];
|
||||
if (typeof v == 'object') {
|
||||
this[c] = this[c] || {};
|
||||
for (var p in v)
|
||||
this[c][p] = v[p];
|
||||
}
|
||||
else
|
||||
this[c] = v;
|
||||
}
|
||||
}
|
||||
|
||||
// override locate to allow baseURL to be document-relative
|
||||
var baseURI;
|
||||
if (typeof window == 'undefined') {
|
||||
baseURI = __dirname + '/';
|
||||
}
|
||||
else {
|
||||
baseURI = document.baseURI;
|
||||
if (!baseURI) {
|
||||
var bases = document.getElementsByTagName('base');
|
||||
baseURI = bases[0] && bases[0].href || window.location.href;
|
||||
}
|
||||
}
|
||||
var loaderLocate = loader.locate;
|
||||
var normalizedBaseURL;
|
||||
loader.locate = function(load) {
|
||||
if (this.baseURL != normalizedBaseURL) {
|
||||
normalizedBaseURL = toAbsoluteURL(baseURI, this.baseURL);
|
||||
|
||||
if (normalizedBaseURL.substr(normalizedBaseURL.length - 1, 1) != '/')
|
||||
normalizedBaseURL += '/';
|
||||
|
||||
this.baseURL = normalizedBaseURL;
|
||||
}
|
||||
|
||||
return Promise.resolve(loaderLocate.call(this, load));
|
||||
}
|
||||
|
||||
|
||||
// Traceur conveniences
|
||||
var aliasRegEx = /^\s*export\s*\*\s*from\s*(?:'([^']+)'|"([^"]+)")/;
|
||||
var es6RegEx = /(?:^\s*|[}{\(\);,\n]\s*)(import\s+['"]|(import|module)\s+[^"'\(\)\n;]+\s+from\s+['"]|export\s+(\*|\{|default|function|var|const|let|[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*))/;
|
||||
|
||||
var loaderTranslate = loader.translate;
|
||||
loader.translate = function(load) {
|
||||
var loader = this;
|
||||
|
||||
loader.__exec = exec;
|
||||
|
||||
// support ES6 alias modules ("export * from 'module';") without needing Traceur
|
||||
var match;
|
||||
if (!loader.global.traceur && (load.metadata.format == 'es6' || !load.metadata.format) && (match = load.source.match(aliasRegEx))) {
|
||||
var depName = match[1] || match[2];
|
||||
load.metadata.deps = [depName];
|
||||
load.metadata.execute = function(require) {
|
||||
return require(depName);
|
||||
}
|
||||
}
|
||||
|
||||
// detect ES6
|
||||
if (load.metadata.format == 'es6' || !load.metadata.format && load.source.match(es6RegEx)) {
|
||||
console.log('load traceur');
|
||||
load.metadata.format = 'es6';
|
||||
|
||||
// dynamically load Traceur for ES6 if necessary
|
||||
if (!loader.global.traceur)
|
||||
return loader['import']('@traceur').then(function() {
|
||||
return loaderTranslate.call(loader, load);
|
||||
});
|
||||
}
|
||||
|
||||
return loaderTranslate.call(loader, load);
|
||||
}
|
||||
|
||||
// always load Traceur as a global
|
||||
var loaderInstantiate = loader.instantiate;
|
||||
loader.instantiate = function(load) {
|
||||
var loader = this;
|
||||
if (load.name == '@traceur') {
|
||||
loader.__exec(load);
|
||||
return {
|
||||
deps: [],
|
||||
execute: function() {}
|
||||
};
|
||||
}
|
||||
return loaderInstantiate.call(loader, load);
|
||||
}
|
||||
|
||||
|
||||
// define exec for easy evaluation of a load record (load.name, load.source, load.address)
|
||||
// main feature is source maps support handling
|
||||
var curSystem
|
||||
function exec(load) {
|
||||
if (load.name == '@traceur')
|
||||
curSystem = System;
|
||||
// support sourceMappingURL (efficiently)
|
||||
var sourceMappingURL;
|
||||
var lastLineIndex = load.source.lastIndexOf('\n');
|
||||
if (lastLineIndex != -1) {
|
||||
if (load.source.substr(lastLineIndex + 1, 21) == '//# sourceMappingURL=')
|
||||
sourceMappingURL = toAbsoluteURL(load.address, load.source.substr(lastLineIndex + 22));
|
||||
}
|
||||
|
||||
__eval(load.source, this.global, load.address, sourceMappingURL);
|
||||
|
||||
// traceur overwrites System - write it back
|
||||
if (load.name == '@traceur') {
|
||||
this.global.traceurSystem = this.global.System;
|
||||
this.global.System = curSystem;
|
||||
}
|
||||
}
|
||||
loader.__exec = exec;
|
||||
|
||||
// Absolute URL parsing, from https://gist.github.com/Yaffle/1088850
|
||||
function parseURI(url) {
|
||||
var m = String(url).replace(/^\s+|\s+$/g, '').match(/^([^:\/?#]+:)?(\/\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/);
|
||||
@ -93,54 +204,6 @@ function core(loader) {
|
||||
(href.protocol || href.authority || href.pathname ? href.search : (href.search || base.search)) +
|
||||
href.hash;
|
||||
}
|
||||
var baseURI;
|
||||
if (typeof window == 'undefined') {
|
||||
baseURI = __dirname + '/';
|
||||
}
|
||||
else {
|
||||
baseURI = document.baseURI;
|
||||
if (!baseURI) {
|
||||
var bases = document.getElementsByTagName('base');
|
||||
baseURI = bases[0] && bases[0].href || window.location.href;
|
||||
}
|
||||
}
|
||||
|
||||
// System.meta provides default metadata
|
||||
System.meta = {};
|
||||
|
||||
// override locate to allow baseURL to be document-relative
|
||||
var loaderLocate = loader.locate;
|
||||
var normalizedBaseURL;
|
||||
loader.locate = function(load) {
|
||||
if (this.baseURL != normalizedBaseURL)
|
||||
this.baseURL = normalizedBaseURL = toAbsoluteURL(baseURI, this.baseURL);
|
||||
|
||||
var meta = System.meta[load.name];
|
||||
for (var p in meta)
|
||||
load.metadata[p] = meta[p];
|
||||
|
||||
return Promise.resolve(loaderLocate.call(this, load));
|
||||
}
|
||||
|
||||
// define exec for custom instantiations
|
||||
loader.__exec = function(load) {
|
||||
|
||||
// support sourceMappingURL (efficiently)
|
||||
var sourceMappingURL;
|
||||
var lastLineIndex = load.source.lastIndexOf('\n');
|
||||
if (lastLineIndex != -1) {
|
||||
if (load.source.substr(lastLineIndex + 1, 21) == '//# sourceMappingURL=')
|
||||
sourceMappingURL = toAbsoluteURL(load.address, load.source.substr(lastLineIndex + 22));
|
||||
}
|
||||
|
||||
__eval(load.source, loader.global, load.address, sourceMappingURL);
|
||||
|
||||
// traceur overwrites System - write it back
|
||||
if (load.name == '@traceur') {
|
||||
loader.global.traceurSystem = loader.global.System;
|
||||
loader.global.System = curSystem;
|
||||
}
|
||||
}
|
||||
|
||||
})();
|
||||
|
||||
|
||||
@ -1,199 +0,0 @@
|
||||
/*
|
||||
SystemJS AMD Format
|
||||
Provides the AMD module format definition at System.format.amd
|
||||
as well as a RequireJS-style require on System.require
|
||||
*/
|
||||
function formatAMD(loader) {
|
||||
loader.formats.push('amd');
|
||||
|
||||
// AMD Module Format Detection RegEx
|
||||
// define([.., .., ..], ...)
|
||||
// define(varName); || define(function(require, exports) {}); || define({})
|
||||
var amdRegEx = /(?:^\s*|[}{\(\);,\n\?\&]\s*)define\s*\(\s*("[^"]+"\s*,\s*|'[^']+'\s*,\s*)?(\[(\s*("[^"]+"|'[^']+')\s*,)*(\s*("[^"]+"|'[^']+')\s*)?\]|function\s*|{|[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*\))/;
|
||||
|
||||
/*
|
||||
AMD-compatible require
|
||||
To copy RequireJS, set window.require = window.requirejs = loader.require
|
||||
*/
|
||||
var require = loader.require = function(names, callback, errback, referer) {
|
||||
// in amd, first arg can be a config object... we just ignore
|
||||
if (typeof names == 'object' && !(names instanceof Array))
|
||||
return require.apply(null, Array.prototype.splice.call(arguments, 1, arguments.length - 1));
|
||||
|
||||
// amd require
|
||||
if (names instanceof Array)
|
||||
Promise.all(names.map(function(name) {
|
||||
return loader['import'](name, referer);
|
||||
})).then(function(modules) {
|
||||
callback.apply(null, modules);
|
||||
}, errback);
|
||||
|
||||
// commonjs require
|
||||
else if (typeof names == 'string')
|
||||
return loader.getModule(names);
|
||||
|
||||
else
|
||||
throw 'Invalid require';
|
||||
};
|
||||
function makeRequire(parentName, deps, depsNormalized) {
|
||||
return function(names, callback, errback) {
|
||||
if (typeof names == 'string' && indexOf.call(deps, names) != -1)
|
||||
return loader.getModule(depsNormalized[indexOf.call(deps, names)]);
|
||||
return require(names, callback, errback, { name: parentName });
|
||||
}
|
||||
}
|
||||
|
||||
function prepareDeps(deps, meta) {
|
||||
for (var i = 0; i < deps.length; i++)
|
||||
if (lastIndexOf.call(deps, deps[i]) != i)
|
||||
deps.splice(i--, 1);
|
||||
|
||||
// remove system dependencies
|
||||
var index;
|
||||
if ((index = indexOf.call(deps, 'require')) != -1) {
|
||||
meta.requireIndex = index;
|
||||
deps.splice(index, 1);
|
||||
}
|
||||
if ((index = indexOf.call(deps, 'exports')) != -1) {
|
||||
meta.exportsIndex = index;
|
||||
deps.splice(index, 1);
|
||||
}
|
||||
if ((index = indexOf.call(deps, 'module')) != -1) {
|
||||
meta.moduleIndex = index;
|
||||
deps.splice(index, 1);
|
||||
}
|
||||
|
||||
return deps;
|
||||
}
|
||||
|
||||
function prepareExecute(depNames, load) {
|
||||
var meta = load.metadata;
|
||||
var deps = [];
|
||||
for (var i = 0; i < depNames.length; i++) {
|
||||
var module = loader.get(depNames[i]);
|
||||
if (module.__useDefault) {
|
||||
module = module['default'];
|
||||
}
|
||||
else if (!module.__esModule) {
|
||||
// compatibility -> ES6 modules must have a __esModule flag
|
||||
// we clone the module object to handle this
|
||||
var moduleClone = { __esModule: true };
|
||||
for (var p in module)
|
||||
moduleClone[p] = module[p];
|
||||
module = moduleClone;
|
||||
}
|
||||
deps[i] = module;
|
||||
}
|
||||
|
||||
var module, exports;
|
||||
|
||||
// add back in system dependencies
|
||||
if (meta.moduleIndex !== undefined)
|
||||
deps.splice(meta.moduleIndex, 0, exports = {}, module = { id: load.name, uri: load.address, config: function() { return {}; }, exports: exports });
|
||||
if (meta.exportsIndex !== undefined)
|
||||
deps.splice(meta.exportsIndex, 0, exports = exports || {});
|
||||
if (meta.requireIndex !== undefined)
|
||||
deps.splice(meta.requireIndex, 0, makeRequire(load.name, meta.deps, depNames));
|
||||
|
||||
return {
|
||||
deps: deps,
|
||||
module: module || exports && { exports: exports }
|
||||
};
|
||||
}
|
||||
|
||||
loader.format.amd = {
|
||||
detect: function(load) {
|
||||
return !!load.source.match(amdRegEx);
|
||||
},
|
||||
deps: function(load) {
|
||||
|
||||
var global = loader.global;
|
||||
|
||||
var deps;
|
||||
var meta = load.metadata;
|
||||
var defined = false;
|
||||
global.define = function(name, _deps, factory) {
|
||||
|
||||
if (typeof name != 'string') {
|
||||
factory = _deps;
|
||||
_deps = name;
|
||||
name = null;
|
||||
}
|
||||
|
||||
// anonymous modules must only call define once
|
||||
if (!name && defined) {
|
||||
throw "Multiple anonymous defines for module " + load.name;
|
||||
}
|
||||
if (!name) {
|
||||
defined = true;
|
||||
}
|
||||
|
||||
if (!(_deps instanceof Array)) {
|
||||
factory = _deps;
|
||||
// CommonJS AMD form
|
||||
var src = load.source;
|
||||
load.source = factory.toString();
|
||||
_deps = ['require', 'exports', 'module'].concat(loader.format.cjs.deps(load, global));
|
||||
load.source = src;
|
||||
}
|
||||
|
||||
if (typeof factory != 'function')
|
||||
factory = (function(factory) {
|
||||
return function() { return factory; }
|
||||
})(factory);
|
||||
|
||||
if (name && name != load.name) {
|
||||
// named define for a bundle describing another module
|
||||
var _load = {
|
||||
name: name,
|
||||
address: name,
|
||||
metadata: {}
|
||||
};
|
||||
_deps = prepareDeps(_deps, _load.metadata);
|
||||
loader.defined[name] = {
|
||||
deps: _deps,
|
||||
execute: function() {
|
||||
var execs = prepareExecute(Array.prototype.splice.call(arguments, 0, arguments.length), _load);
|
||||
var output = factory.apply(global, execs.deps) || execs.module && execs.module.exports;
|
||||
|
||||
if (output instanceof global.Module)
|
||||
return output;
|
||||
else
|
||||
return new global.Module(output && output.__esModule ? output : { __useDefault: true, 'default': output });
|
||||
}
|
||||
};
|
||||
}
|
||||
else {
|
||||
// we are defining this module
|
||||
deps = _deps;
|
||||
meta.factory = factory;
|
||||
}
|
||||
};
|
||||
global.define.amd = {};
|
||||
|
||||
// ensure no NodeJS environment detection
|
||||
global.module = undefined;
|
||||
global.exports = undefined;
|
||||
|
||||
loader.__exec(load);
|
||||
|
||||
// deps not defined for an AMD module that defines a different name
|
||||
deps = deps || [];
|
||||
|
||||
deps = prepareDeps(deps, meta);
|
||||
|
||||
global.define = undefined;
|
||||
|
||||
meta.deps = deps;
|
||||
|
||||
return deps;
|
||||
|
||||
},
|
||||
execute: function(depNames, load) {
|
||||
if (!load.metadata.factory)
|
||||
return;
|
||||
var execs = prepareExecute(depNames, load);
|
||||
return load.metadata.factory.apply(loader.global, execs.deps) || execs.module && execs.module.exports;
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -1,88 +0,0 @@
|
||||
/*
|
||||
SystemJS CommonJS Format
|
||||
Provides the CommonJS module format definition at System.format.cjs
|
||||
*/
|
||||
function formatCJS(loader) {
|
||||
loader.formats.push('cjs');
|
||||
|
||||
// CJS Module Format
|
||||
// require('...') || exports[''] = ... || exports.asd = ... || module.exports = ...
|
||||
var cjsExportsRegEx = /(?:^\s*|[}{\(\);,\n=:\?\&]\s*|module\.)(exports\s*\[\s*('[^']+'|"[^"]+")\s*\]|\exports\s*\.\s*[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*|exports\s*\=)/;
|
||||
var cjsRequireRegEx = /(?:^\s*|[}{\(\);,\n=:\?\&]\s*)require\s*\(\s*("([^"]+)"|'([^']+)')\s*\)/g;
|
||||
var commentRegEx = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg;
|
||||
|
||||
var noop = function() {}
|
||||
var nodeProcess = {
|
||||
nextTick: function(f) {
|
||||
setTimeout(f, 7);
|
||||
},
|
||||
browser: true,
|
||||
env: {},
|
||||
argv: [],
|
||||
on: noop,
|
||||
once: noop,
|
||||
off: noop,
|
||||
emit: noop,
|
||||
cwd: function() { return '/' }
|
||||
};
|
||||
loader.set('@@nodeProcess', Module(nodeProcess));
|
||||
|
||||
loader.format.cjs = {
|
||||
detect: function(load) {
|
||||
cjsExportsRegEx.lastIndex = 0;
|
||||
cjsRequireRegEx.lastIndex = 0;
|
||||
return !!(cjsRequireRegEx.exec(load.source) || cjsExportsRegEx.exec(load.source));
|
||||
},
|
||||
deps: function(load) {
|
||||
cjsExportsRegEx.lastIndex = 0;
|
||||
cjsRequireRegEx.lastIndex = 0;
|
||||
|
||||
var deps = [];
|
||||
|
||||
// remove comments from the source first
|
||||
var source = load.source.replace(commentRegEx, '');
|
||||
|
||||
var match;
|
||||
|
||||
while (match = cjsRequireRegEx.exec(source))
|
||||
deps.push(match[2] || match[3]);
|
||||
|
||||
load.metadata.deps = deps;
|
||||
|
||||
return deps;
|
||||
},
|
||||
execute: function(depNames, load) {
|
||||
var dirname = load.address.split('/');
|
||||
dirname.pop();
|
||||
dirname = dirname.join('/');
|
||||
|
||||
var deps = load.metadata.deps;
|
||||
|
||||
var globals = loader.global._g = {
|
||||
global: loader.global,
|
||||
exports: {},
|
||||
process: nodeProcess,
|
||||
require: function(d) {
|
||||
var index = indexOf.call(deps, d);
|
||||
if (index != -1)
|
||||
return loader.getModule(depNames[index]);
|
||||
},
|
||||
__filename: load.address,
|
||||
__dirname: dirname,
|
||||
};
|
||||
globals.module = { exports: globals.exports };
|
||||
|
||||
var glString = '';
|
||||
for (var _g in globals)
|
||||
glString += 'var ' + _g + ' = _g.' + _g + ';';
|
||||
|
||||
load.source = glString + load.source;
|
||||
|
||||
loader.__exec(load);
|
||||
|
||||
loader.global._g = undefined;
|
||||
|
||||
return globals.module.exports;
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -1,102 +0,0 @@
|
||||
/*
|
||||
SystemJS Global Format
|
||||
Provides the global support at System.format.global
|
||||
Supports inline shim syntax with:
|
||||
"global";
|
||||
"import jquery";
|
||||
"export my.Global";
|
||||
|
||||
Also detects writes to the global object avoiding global collisions.
|
||||
See the SystemJS readme global support section for further information.
|
||||
*/
|
||||
function formatGlobal(loader) {
|
||||
loader.formats.push('global');
|
||||
|
||||
// Global
|
||||
var globalShimRegEx = /(["']global["'];\s*)((['"]import [^'"]+['"];\s*)*)(['"]export ([^'"]+)["'])?/;
|
||||
var globalImportRegEx = /(["']import [^'"]+)+/g;
|
||||
|
||||
// given a module's global dependencies, prepare the global object
|
||||
// to contain the union of the defined properties of its dependent modules
|
||||
var moduleGlobals = {};
|
||||
|
||||
// also support a loader.shim system
|
||||
loader.shim = {};
|
||||
|
||||
loader.format.global = {
|
||||
detect: function() {
|
||||
return true;
|
||||
},
|
||||
deps: function(load) {
|
||||
var match, deps;
|
||||
if (match = load.source.match(globalShimRegEx)) {
|
||||
deps = match[2].match(globalImportRegEx);
|
||||
if (deps)
|
||||
for (var i = 0; i < deps.length; i++)
|
||||
deps[i] = deps[i].substr(8);
|
||||
load.metadata.exports = match[5];
|
||||
}
|
||||
deps = deps || [];
|
||||
if (load.metadata.deps)
|
||||
deps = deps.concat(load.metadata.deps);
|
||||
return deps;
|
||||
},
|
||||
execute: function(depNames, load) {
|
||||
var hasOwnProperty = loader.global.hasOwnProperty;
|
||||
var globalExport = load.metadata.exports;
|
||||
|
||||
// first, we add all the dependency module properties to the global
|
||||
for (var i = 0; i < depNames.length; i++) {
|
||||
var moduleGlobal = moduleGlobals[depNames[i]];
|
||||
if (moduleGlobal)
|
||||
for (var m in moduleGlobal)
|
||||
loader.global[m] = moduleGlobal[m];
|
||||
}
|
||||
|
||||
// now store a complete copy of the global object
|
||||
// in order to detect changes
|
||||
var globalObj = {};
|
||||
for (var g in loader.global)
|
||||
if (!hasOwnProperty || loader.global.hasOwnProperty(g))
|
||||
globalObj[g] = loader.global[g];
|
||||
|
||||
if (globalExport)
|
||||
load.source += '\nthis["' + globalExport + '"] = ' + globalExport;
|
||||
|
||||
loader.__exec(load);
|
||||
|
||||
// check for global changes, creating the globalObject for the module
|
||||
// if many globals, then a module object for those is created
|
||||
// if one global, then that is the module directly
|
||||
var singleGlobal, moduleGlobal;
|
||||
if (globalExport) {
|
||||
var firstPart = globalExport.split('.')[0];
|
||||
singleGlobal = eval.call(loader.global, globalExport);
|
||||
moduleGlobal = {};
|
||||
moduleGlobal[firstPart] = loader.global[firstPart];
|
||||
}
|
||||
else {
|
||||
moduleGlobal = {};
|
||||
for (var g in loader.global) {
|
||||
if (!hasOwnProperty && (g == 'sessionStorage' || g == 'localStorage' || g == 'clipboardData' || g == 'frames'))
|
||||
continue;
|
||||
if ((!hasOwnProperty || loader.global.hasOwnProperty(g)) && g != loader.global && globalObj[g] != loader.global[g]) {
|
||||
moduleGlobal[g] = loader.global[g];
|
||||
if (singleGlobal) {
|
||||
if (singleGlobal !== loader.global[g])
|
||||
singleGlobal = false;
|
||||
}
|
||||
else if (singleGlobal !== false)
|
||||
singleGlobal = loader.global[g];
|
||||
}
|
||||
}
|
||||
}
|
||||
moduleGlobals[load.name] = moduleGlobal;
|
||||
|
||||
if (singleGlobal)
|
||||
return singleGlobal;
|
||||
else
|
||||
return new Module(moduleGlobal);
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -1,126 +0,0 @@
|
||||
/*
|
||||
SystemJS Formats
|
||||
|
||||
Provides modular support for format detections.
|
||||
|
||||
Also dynamically loads Traceur if ES6 syntax is found.
|
||||
|
||||
Add a format with:
|
||||
System.formats.push('myformatname');
|
||||
System.format.myformat = {
|
||||
detect: function(source, load) {
|
||||
return false / depArray;
|
||||
},
|
||||
execute: function(load, deps) {
|
||||
return moduleObj; // (doesnt have to be a Module instance)
|
||||
}
|
||||
}
|
||||
|
||||
The System.formats array sets the format detection order.
|
||||
|
||||
See the AMD, global and CommonJS format extensions for examples.
|
||||
*/
|
||||
function formats(loader) {
|
||||
|
||||
loader.format = {};
|
||||
loader.formats = [];
|
||||
|
||||
if (typeof window != 'undefined') {
|
||||
var curScript = document.getElementsByTagName('script');
|
||||
curScript = curScript[curScript.length - 1];
|
||||
// set the path to traceur
|
||||
loader.paths['@traceur'] = curScript.getAttribute('data-traceur-src') || curScript.src.substr(0, curScript.src.lastIndexOf('/') + 1) + 'traceur.js';
|
||||
}
|
||||
|
||||
// also in ESML, build.js
|
||||
var es6RegEx = /(?:^\s*|[}{\(\);,\n]\s*)(import\s+['"]|(import|module)\s+[^"'\(\)\n;]+\s+from\s+['"]|export\s+(\*|\{|default|function|var|const|let|[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*))/;
|
||||
|
||||
// es6 module forwarding - allow detecting without Traceur
|
||||
var aliasRegEx = /^\s*export\s*\*\s*from\s*(?:'([^']+)'|"([^"]+)")/;
|
||||
|
||||
// module format hint regex
|
||||
var formatHintRegEx = /^(\s*(\/\*.*\*\/)|(\/\/[^\n]*))*(["']use strict["'];?)?["']([^'"]+)["'][;\n]/;
|
||||
|
||||
var loaderInstantiate = loader.instantiate;
|
||||
loader.instantiate = function(load) {
|
||||
var name = load.name || '';
|
||||
|
||||
load.source = load.source || '';
|
||||
|
||||
// set load.metadata.format from metadata or format hints in the source
|
||||
var format = load.metadata.format;
|
||||
if (!format) {
|
||||
var formatMatch = load.source.match(formatHintRegEx);
|
||||
if (formatMatch)
|
||||
format = load.metadata.format = formatMatch[5];
|
||||
}
|
||||
|
||||
if (name == '@traceur')
|
||||
format = 'global';
|
||||
|
||||
// es6 handled by core
|
||||
|
||||
// support alias modules without needing Traceur
|
||||
var match;
|
||||
if (!loader.global.traceur && (format == 'es6' || !format) && (match = load.source.match(aliasRegEx))) {
|
||||
return {
|
||||
deps: [match[1] || match[2]],
|
||||
execute: function(depName) {
|
||||
return loader.get(depName);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if (format == 'es6' || !format && load.source.match(es6RegEx)) {
|
||||
// dynamically load Traceur if necessary
|
||||
if (!loader.global.traceur)
|
||||
return loader['import']('@traceur').then(function() {
|
||||
return loaderInstantiate.call(loader, load);
|
||||
});
|
||||
else
|
||||
return loaderInstantiate.call(loader, load);
|
||||
}
|
||||
|
||||
// if it is shimmed, assume it is a global script
|
||||
if (load.metadata.exports || load.metadata.deps)
|
||||
format = 'global';
|
||||
|
||||
// if we don't know the format, run detection first
|
||||
if (!format || !this.format[format])
|
||||
for (var i = 0; i < this.formats.length; i++) {
|
||||
var f = this.formats[i];
|
||||
var curFormat = this.format[f];
|
||||
if (curFormat.detect(load)) {
|
||||
format = f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var curFormat = this.format[format];
|
||||
|
||||
// if we don't have a format or format rule, throw
|
||||
if (!format || !curFormat)
|
||||
throw new TypeError('No format found for ' + (format ? format : load.address));
|
||||
|
||||
// now invoke format instantiation
|
||||
var deps = curFormat.deps(load);
|
||||
|
||||
// remove duplicates from deps first
|
||||
for (var i = 0; i < deps.length; i++)
|
||||
if (lastIndexOf.call(deps, deps[i]) != i)
|
||||
deps.splice(i--, 1);
|
||||
|
||||
return {
|
||||
deps: deps,
|
||||
execute: function() {
|
||||
var output = curFormat.execute.call(this, Array.prototype.splice.call(arguments, 0, arguments.length), load);
|
||||
|
||||
if (output instanceof loader.global.Module)
|
||||
return output;
|
||||
else
|
||||
return new loader.global.Module(output && output.__esModule ? output : { __useDefault: true, 'default': output });
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
82
lib/extension-global.js
Normal file
82
lib/extension-global.js
Normal file
@ -0,0 +1,82 @@
|
||||
/*
|
||||
SystemJS Global Format
|
||||
|
||||
Supports
|
||||
metadata.deps
|
||||
metadata.init
|
||||
metadata.exports
|
||||
|
||||
Also detects writes to the global object avoiding global collisions.
|
||||
See the SystemJS readme global support section for further information.
|
||||
*/
|
||||
function global(loader) {
|
||||
var loaderInstantiate = loader.instantiate;
|
||||
loader.instantiate = function(load) {
|
||||
var loader = this;
|
||||
|
||||
// global is a fallback module format
|
||||
if (load.metadata.format == 'global' || !load.metadata.format) {
|
||||
load.metadata.deps = load.metadata.deps || [];
|
||||
var deps = load.metadata.deps;
|
||||
|
||||
var moduleGlobals = loader.moduleGlobals = loader.moduleGlobals || {};
|
||||
var globalExport = load.metadata.exports;
|
||||
var init = load.metadata.init;
|
||||
|
||||
load.metadata.execute = function(require, exports, moduleName) {
|
||||
var hasOwnProperty = loader.global.hasOwnProperty;
|
||||
|
||||
// first, we add all the dependency modules to the global
|
||||
for (var i = 0; i < deps.length; i++) {
|
||||
var moduleGlobal = moduleGlobals[deps[i]];
|
||||
if (moduleGlobal)
|
||||
for (var m in moduleGlobal)
|
||||
loader.global[m] = moduleGlobal[m];
|
||||
}
|
||||
|
||||
// now store a complete copy of the global object
|
||||
// in order to detect changes
|
||||
var globalObj = {};
|
||||
for (var g in loader.global)
|
||||
if (!hasOwnProperty || loader.global.hasOwnProperty(g))
|
||||
globalObj[g] = loader.global[g];
|
||||
|
||||
if (globalExport)
|
||||
load.source += '\nthis["' + globalExport + '"] = ' + globalExport;
|
||||
|
||||
loader.__exec(load);
|
||||
|
||||
// check for global changes, creating the globalObject for the module
|
||||
// if many globals, then a module object for those is created
|
||||
// if one global, then that is the module directly
|
||||
var singleGlobal;
|
||||
if (globalExport) {
|
||||
var firstPart = globalExport.split('.')[0];
|
||||
singleGlobal = eval.call(loader.global, globalExport);
|
||||
exports[firstPart] = loader.global[firstPart];
|
||||
}
|
||||
else {
|
||||
for (var g in loader.global) {
|
||||
if (!hasOwnProperty && (g == 'sessionStorage' || g == 'localStorage' || g == 'clipboardData' || g == 'frames'))
|
||||
continue;
|
||||
if ((!hasOwnProperty || loader.global.hasOwnProperty(g)) && g != loader.global && globalObj[g] != loader.global[g]) {
|
||||
exports[g] = loader.global[g];
|
||||
if (singleGlobal) {
|
||||
if (singleGlobal !== loader.global[g])
|
||||
singleGlobal = false;
|
||||
}
|
||||
else if (singleGlobal !== false)
|
||||
singleGlobal = loader.global[g];
|
||||
}
|
||||
}
|
||||
}
|
||||
moduleGlobals[load.name] = exports;
|
||||
|
||||
var module = singleGlobal ? singleGlobal : exports;
|
||||
|
||||
return { __useDefault: true, 'default': module };
|
||||
}
|
||||
}
|
||||
return loaderInstantiate.call(loader, load);
|
||||
}
|
||||
}
|
||||
@ -22,10 +22,8 @@
|
||||
Maps are carefully applied from most specific contextual map, to least specific global map
|
||||
*/
|
||||
function map(loader) {
|
||||
|
||||
loader.map = loader.map || {};
|
||||
|
||||
|
||||
// return the number of prefix parts (separated by '/') matching the name
|
||||
// eg prefixMatchLength('jquery/some/thing', 'jquery') -> 1
|
||||
function prefixMatchLength(name, prefix) {
|
||||
@ -42,7 +40,7 @@ function map(loader) {
|
||||
|
||||
// given a relative-resolved module name and normalized parent name,
|
||||
// apply the map configuration
|
||||
function applyMap(name, parentName) {
|
||||
function applyMap(name, parentName, loader) {
|
||||
|
||||
var curMatch, curMatchLength = 0;
|
||||
var curParent, curParentMatchLength = 0;
|
||||
@ -104,11 +102,13 @@ function map(loader) {
|
||||
}
|
||||
|
||||
var loaderNormalize = loader.normalize;
|
||||
var mapped = {};
|
||||
loader.normalize = function(name, parentName, parentAddress) {
|
||||
var loader = this;
|
||||
if (!loader.map)
|
||||
loader.map = {};
|
||||
return Promise.resolve(loaderNormalize.call(loader, name, parentName, parentAddress))
|
||||
.then(function(name) {
|
||||
return applyMap(name, parentName);
|
||||
return applyMap(name, parentName, loader);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
93
lib/extension-meta.js
Normal file
93
lib/extension-meta.js
Normal file
@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Meta Extension
|
||||
*
|
||||
* Sets default metadata on a load record (load.metadata) from
|
||||
* loader.meta[moduleName].
|
||||
* Also provides an inline meta syntax for module meta in source.
|
||||
*
|
||||
* Eg:
|
||||
*
|
||||
* loader.meta['my/module'] = { some: 'meta' };
|
||||
*
|
||||
* load.metadata.some = 'meta' will now be set on the load record.
|
||||
*
|
||||
* The same meta could be set with a my/module.js file containing:
|
||||
*
|
||||
* my/module.js
|
||||
* "some meta";
|
||||
* "another meta";
|
||||
* console.log('this is my/module');
|
||||
*
|
||||
* The benefit of inline meta is that coniguration doesn't need
|
||||
* to be known in advanced, which is useful for modularising
|
||||
* configuration and avoiding the need for configuration injection.
|
||||
*
|
||||
*
|
||||
* Example
|
||||
* -------
|
||||
*
|
||||
* The simplest meta example is setting the module format:
|
||||
*
|
||||
* System.meta['my/module'] = { format: 'amd' };
|
||||
*
|
||||
* or inside 'my/module.js':
|
||||
*
|
||||
* "format amd";
|
||||
* define(...);
|
||||
*
|
||||
*/
|
||||
|
||||
function meta(loader) {
|
||||
var metaRegEx = /^(\s*\/\*.*\*\/|\s*\/\/[^\n]*|\s*"[^"]+"\s*;?|\s*'[^']+'\s*;?)+/;
|
||||
var metaPartRegEx = /\/\*.*\*\/|\/\/[^\n]*|"[^"]+"\s*;?|'[^']+'\s*;?/g;
|
||||
|
||||
loader.meta = {};
|
||||
|
||||
function setConfigMeta(loader, load) {
|
||||
var meta = loader.meta && loader.meta[load.name];
|
||||
if (meta) {
|
||||
for (var p in meta)
|
||||
load.metadata[p] = load.metadata[p] || meta[p];
|
||||
}
|
||||
}
|
||||
|
||||
var loaderLocate = loader.locate;
|
||||
loader.locate = function(load) {
|
||||
setConfigMeta(this, load);
|
||||
return loaderLocate.call(this, load);
|
||||
}
|
||||
|
||||
var loaderTranslate = loader.translate;
|
||||
loader.translate = function(load) {
|
||||
setConfigMeta(this, load);
|
||||
|
||||
// detect any meta header syntax
|
||||
var meta = load.source.match(metaRegEx);
|
||||
if (meta) {
|
||||
var metaParts = meta[0].match(metaPartRegEx);
|
||||
for (var i = 0; i < metaParts.length; i++) {
|
||||
var len = metaParts[i].length;
|
||||
|
||||
var firstChar = metaParts[i].substr(0, 1);
|
||||
if (metaParts[i].substr(len - 1, 1) == ';')
|
||||
len--;
|
||||
|
||||
if (firstChar != '"' && firstChar != "'")
|
||||
continue;
|
||||
|
||||
var metaString = metaParts[i].substr(1, metaParts[i].length - 3);
|
||||
|
||||
var metaName = metaString.substr(0, metaString.indexOf(' '));
|
||||
if (metaName) {
|
||||
var metaValue = metaString.substr(metaName.length + 1, metaString.length - metaName.length - 1);
|
||||
|
||||
if (load.metadata[metaName] instanceof Array)
|
||||
load.metadata[metaName].push(metaValue);
|
||||
else
|
||||
load.metadata[metaName] = load.metadata[metaName] || metaValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
return loaderTranslate.call(this, load);
|
||||
}
|
||||
}
|
||||
@ -7,14 +7,18 @@
|
||||
for the plugin resource. See the plugin section of the systemjs readme.
|
||||
*/
|
||||
function plugins(loader) {
|
||||
if (typeof indexOf == 'undefined')
|
||||
indexOf = Array.prototype.indexOf;
|
||||
|
||||
var loaderNormalize = loader.normalize;
|
||||
loader.normalize = function(name, parentName, parentAddress) {
|
||||
var loader = this;
|
||||
// if parent is a plugin, normalize against the parent plugin argument only
|
||||
var parentPluginIndex;
|
||||
if (parentName && (parentPluginIndex = parentName.indexOf('!')) != -1)
|
||||
parentName = parentName.substr(0, parentPluginIndex);
|
||||
|
||||
return Promise.resolve(loaderNormalize(name, parentName, parentAddress))
|
||||
return Promise.resolve(loaderNormalize.call(loader, name, parentName, parentAddress))
|
||||
.then(function(name) {
|
||||
// if this is a plugin, normalize the plugin name and the argument
|
||||
var pluginIndex = name.lastIndexOf('!');
|
||||
@ -45,6 +49,8 @@ function plugins(loader) {
|
||||
|
||||
var loaderLocate = loader.locate;
|
||||
loader.locate = function(load) {
|
||||
var loader = this;
|
||||
|
||||
var name = load.name;
|
||||
|
||||
// plugin
|
||||
@ -55,10 +61,12 @@ function plugins(loader) {
|
||||
// the name to locate is the plugin argument only
|
||||
load.name = name.substr(0, pluginIndex);
|
||||
|
||||
var pluginLoader = loader.pluginLoader || loader;
|
||||
|
||||
// load the plugin module
|
||||
return loader.load(pluginName)
|
||||
return pluginLoader.load(pluginName)
|
||||
.then(function() {
|
||||
var plugin = loader.get(pluginName);
|
||||
var plugin = pluginLoader.get(pluginName);
|
||||
plugin = plugin['default'] || plugin;
|
||||
|
||||
// store the plugin module itself on the metadata
|
||||
@ -86,25 +94,32 @@ function plugins(loader) {
|
||||
|
||||
var loaderFetch = loader.fetch;
|
||||
loader.fetch = function(load) {
|
||||
// support legacy plugins
|
||||
var self = this;
|
||||
if (typeof load.metadata.plugin == 'function') {
|
||||
return new Promise(function(fulfill, reject) {
|
||||
load.metadata.plugin(load.metadata.pluginArgument, load.address, function(url, callback, errback) {
|
||||
loaderFetch.call(self, { name: load.name, address: url, metadata: {} }).then(callback, errback);
|
||||
}, fulfill, reject);
|
||||
if (load.metadata.plugin && load.metadata.plugin.fetch)
|
||||
return load.metadata.plugin.fetch.call(this, load, function(load) {
|
||||
return loaderFetch.call(this, load);
|
||||
});
|
||||
}
|
||||
return (load.metadata.plugin && load.metadata.plugin.fetch || loaderFetch).call(this, load);
|
||||
else
|
||||
return loaderFetch.call(this, load);
|
||||
}
|
||||
|
||||
var loaderTranslate = loader.translate;
|
||||
loader.translate = function(load) {
|
||||
var plugin = load.metadata.plugin;
|
||||
if (plugin && plugin.translate)
|
||||
return plugin.translate.call(this, load);
|
||||
if (load.metadata.plugin && load.metadata.plugin.translate)
|
||||
return load.metadata.plugin.translate.call(this, load, function(load) {
|
||||
return loaderTranslate.call(this, load);
|
||||
});
|
||||
else
|
||||
return loaderTranslate.call(this, load);
|
||||
}
|
||||
|
||||
return loaderTranslate.call(this, load);
|
||||
var loaderInstantiate = loader.instantiate;
|
||||
loader.instantiate = function(load) {
|
||||
if (load.metadata.plugin && load.metadata.plugin.instantiate)
|
||||
return load.metadata.plugin.instantiate.call(this, load, function(load) {
|
||||
return loaderInstantiate.call(this, load);
|
||||
});
|
||||
else
|
||||
return loaderInstantiate.call(this, load);
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,109 +0,0 @@
|
||||
function amdScriptLoader(loader) {
|
||||
|
||||
var head = document.getElementsByTagName('head')[0];
|
||||
|
||||
// override fetch to use script injection
|
||||
loader.fetch = function(load) {
|
||||
// if already defined, skip
|
||||
if (loader.defined[load.name])
|
||||
return '';
|
||||
|
||||
// script injection fetch system
|
||||
return new Promise(function(resolve, reject) {
|
||||
var s = document.createElement('script');
|
||||
s.async = true;
|
||||
s.addEventListener('load', function(evt) {
|
||||
if (lastAnonymous)
|
||||
loader.defined[load.name] = lastAnonymous;
|
||||
lastAnonymous = null;
|
||||
resolve('');
|
||||
}, false);
|
||||
s.addEventListener('error', function(err) {
|
||||
reject(err);
|
||||
}, false);
|
||||
s.src = load.address;
|
||||
head.appendChild(s);
|
||||
});
|
||||
}
|
||||
var lastAnonymous = null;
|
||||
loader.global.define = function(name, deps, factory) {
|
||||
// anonymous define
|
||||
if (typeof name != 'string') {
|
||||
factory = deps;
|
||||
deps = name;
|
||||
name = null;
|
||||
}
|
||||
|
||||
if (!(deps instanceof Array)) {
|
||||
factory = deps;
|
||||
deps = [];
|
||||
}
|
||||
|
||||
if (typeof factory != 'function')
|
||||
factory = (function(factory) {
|
||||
return function() { return factory; }
|
||||
})(factory);
|
||||
|
||||
for (var i = 0; i < deps.length; i++)
|
||||
if (lastIndexOf.call(deps, deps[i]) != i)
|
||||
deps.splice(i--, 1);
|
||||
|
||||
var instantiate = {
|
||||
deps: deps,
|
||||
execute: function() {
|
||||
var args = [];
|
||||
for (var i = 0; i < arguments.length; i++)
|
||||
args.push(loader.getModule(arguments[i]));
|
||||
|
||||
var output = factory.apply(this, args);
|
||||
return new loader.global.Module(output && output.__esModule ? output : { __useDefault: true, 'default': output });
|
||||
}
|
||||
};
|
||||
|
||||
if (name)
|
||||
loader.defined[name] = instantiate;
|
||||
else
|
||||
lastAnonymous = instantiate;
|
||||
}
|
||||
loader.global.define.amd = {};
|
||||
|
||||
// no translate at all
|
||||
loader.translate = function() {}
|
||||
|
||||
// instantiate defaults to null
|
||||
loader.instantiate = function() {
|
||||
return {
|
||||
deps: [],
|
||||
execute: function() {
|
||||
return new Module({});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
AMD-compatible require
|
||||
To copy RequireJS, set window.require = window.requirejs = loader.requirejs
|
||||
*/
|
||||
var require = loader.requirejs = function(names, callback, errback, referer) {
|
||||
// in amd, first arg can be a config object... we just ignore
|
||||
if (typeof names == 'object' && !(names instanceof Array))
|
||||
return require.apply(null, Array.prototype.splice.call(arguments, 1, arguments.length - 1));
|
||||
|
||||
// amd require
|
||||
if (names instanceof Array)
|
||||
Promise.all(names.map(function(name) {
|
||||
return loader['import'](name, referer);
|
||||
})).then(function(mods) {
|
||||
return callback.apply(this, mods);
|
||||
}, errback);
|
||||
|
||||
// commonjs require
|
||||
else if (typeof names == 'string')
|
||||
return loader.getModule(names);
|
||||
|
||||
else
|
||||
throw 'Invalid require';
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,50 +1,355 @@
|
||||
/*
|
||||
Implementation of the loader.register bundling method
|
||||
|
||||
This allows the output of Traceur to populate the
|
||||
module registry of the loader loader
|
||||
*/
|
||||
* Instantiate registry extension
|
||||
*
|
||||
* Supports Traceur System.register 'instantiate' output for loading ES6 as ES5.
|
||||
*
|
||||
* - Creates the loader.register function
|
||||
* - Also supports metadata.format = 'register' in instantiate for anonymous register modules
|
||||
* - Also supports metadata.deps, metadata.execute and metadata.executingRequire
|
||||
* for handling dynamic modules alongside register-transformed ES6 modules
|
||||
*
|
||||
* Works as a standalone extension provided there is a
|
||||
* loader.__exec(load) like the one set in SystemJS core
|
||||
*
|
||||
*/
|
||||
|
||||
function register(loader) {
|
||||
if (typeof indexOf == 'undefined')
|
||||
indexOf = Array.prototype.indexOf;
|
||||
if (!loader.__exec)
|
||||
throw "loader.__exec(load) needs to be provided for loader.register. See SystemJS core for an implementation example.";
|
||||
|
||||
// instantiation cache for loader.register
|
||||
loader.defined = {};
|
||||
function dedupe(deps) {
|
||||
var newDeps = [];
|
||||
for (var i = 0; i < deps.length; i++)
|
||||
if (indexOf.call(newDeps, deps[i]) == -1)
|
||||
newDeps.push(deps[i])
|
||||
return newDeps;
|
||||
}
|
||||
|
||||
// register a new module for instantiation
|
||||
loader.register = function(name, deps, execute) {
|
||||
loader.defined[name] = {
|
||||
// Registry side table
|
||||
// Registry Entry Contains:
|
||||
// - deps
|
||||
// - declare for register modules
|
||||
// - execute for dynamic modules, also after declare for register modules
|
||||
// - declarative boolean indicating which of the above
|
||||
// - normalizedDeps derived from deps, created in instantiate
|
||||
// - depMap array derived from deps, populated gradually in link
|
||||
// - groupIndex used by group linking algorithm
|
||||
// - module a raw module exports object with no wrapper
|
||||
// - evaluated indiciating whether evaluation has happend for declarative modules
|
||||
// After linked and evaluated, entries are removed
|
||||
var lastRegister;
|
||||
function register(name, deps, declare) {
|
||||
if (declare.length == 0)
|
||||
throw 'Invalid System.register form. Ensure setting --modules=instantiate if using Traceur.';
|
||||
|
||||
if (!loader.defined)
|
||||
loader.defined = {};
|
||||
|
||||
if (typeof name != 'string') {
|
||||
declare = deps;
|
||||
deps = name;
|
||||
name = null;
|
||||
}
|
||||
|
||||
lastRegister = {
|
||||
deps: deps,
|
||||
execute: function() {
|
||||
return Module(execute.apply(this, arguments));
|
||||
}
|
||||
declare: declare,
|
||||
declarative: true
|
||||
};
|
||||
|
||||
if (name)
|
||||
loader.defined[name] = lastRegister;
|
||||
}
|
||||
|
||||
var loaderLocate = loader.locate;
|
||||
loader.locate = function(load) {
|
||||
if (loader.defined[load.name])
|
||||
return '';
|
||||
return loaderLocate.apply(this, arguments);
|
||||
loader.defined = loader.defined || {};
|
||||
loader.register = register;
|
||||
|
||||
function buildGroups(entry, loader, groups) {
|
||||
|
||||
groups[entry.groupIndex] = groups[entry.groupIndex] || [];
|
||||
|
||||
if (indexOf.call(groups[entry.groupIndex], entry) != -1)
|
||||
return;
|
||||
|
||||
groups[entry.groupIndex].push(entry);
|
||||
|
||||
for (var i = 0; i < entry.normalizedDeps.length; i++) {
|
||||
var depName = entry.normalizedDeps[i];
|
||||
var depEntry = loader.defined[depName];
|
||||
|
||||
// not in the registry means already linked / ES6
|
||||
if (!depEntry)
|
||||
continue;
|
||||
|
||||
// now we know the entry is in our unlinked linkage group
|
||||
var depGroupIndex = entry.groupIndex + (depEntry.declarative != entry.declarative);
|
||||
|
||||
if (depEntry.groupIndex === undefined) {
|
||||
depEntry.groupIndex = depGroupIndex;
|
||||
}
|
||||
else if (depEntry.groupIndex != depGroupIndex) {
|
||||
throw new TypeError('System.register mixed dependency cycle');
|
||||
}
|
||||
|
||||
buildGroups(entry, loader, groups);
|
||||
}
|
||||
}
|
||||
|
||||
var loaderFetch = loader.fetch;
|
||||
loader.fetch = function(load) {
|
||||
// if the module is already defined, skip fetch
|
||||
if (loader.defined[load.name])
|
||||
return '';
|
||||
return loaderFetch.apply(this, arguments);
|
||||
|
||||
function link(name, loader) {
|
||||
var startEntry = loader.defined[name];
|
||||
|
||||
startEntry.groupIndex = 0;
|
||||
|
||||
var groups = [];
|
||||
|
||||
buildGroups(startEntry, loader, groups);
|
||||
|
||||
var curGroupDeclarative = startEntry.declarative == groups.length % 2;
|
||||
for (var i = groups.length - 1; i >= 0; i--) {
|
||||
var group = groups[i];
|
||||
for (var j = 0; j < group.length; j++) {
|
||||
var entry = group[j];
|
||||
|
||||
// link each group
|
||||
if (curGroupDeclarative)
|
||||
linkDeclarativeModule(entry, loader);
|
||||
else
|
||||
linkDynamicModule(entry, loader);
|
||||
}
|
||||
curGroupDeclarative = !curGroupDeclarative;
|
||||
}
|
||||
}
|
||||
|
||||
function linkDeclarativeModule(entry, loader) {
|
||||
// only link if already not already started linking (stops at circular)
|
||||
if (entry.module)
|
||||
return;
|
||||
|
||||
// declare the module with an empty depMap
|
||||
var depMap = [];
|
||||
|
||||
var declaration = load.declare.call(loader.global, depMap);
|
||||
|
||||
entry.module = declaration.exports;
|
||||
entry.exportStar = declaration.exportStar;
|
||||
entry.execute = declaration.execute;
|
||||
|
||||
var module = entry.module;
|
||||
|
||||
// now link all the module dependencies
|
||||
// amending the depMap as we go
|
||||
for (var i = 0; i < entry.normalizedDeps.length; i++) {
|
||||
var depName = entry.normalizedDeps[i];
|
||||
var depEntry = loader.defined[depName];
|
||||
|
||||
// part of another linking group - use loader.get
|
||||
if (!depEntry) {
|
||||
depModule = loader.get(depName);
|
||||
}
|
||||
// if dependency already linked, use that
|
||||
else if (depEntry.module) {
|
||||
depModule = depEntry.module;
|
||||
}
|
||||
// otherwise we need to link the dependency
|
||||
else {
|
||||
linkDeclarativeModule(depEntry, loader);
|
||||
depModule = depEntry.module;
|
||||
}
|
||||
|
||||
if (entry.exportStar && indexOf.call(entry.exportStar, entry.normalizedDeps[i]) != -1) {
|
||||
// we are exporting * from this dependency
|
||||
(function(depModule) {
|
||||
for (var p in depModule) (function(p) {
|
||||
// if the property is already defined throw?
|
||||
Object.defineProperty(module, p, {
|
||||
enumerable: true,
|
||||
get: function() {
|
||||
return depModule[p];
|
||||
},
|
||||
set: function(value) {
|
||||
depModule[p] = value;
|
||||
}
|
||||
});
|
||||
})(p);
|
||||
})(depModule);
|
||||
}
|
||||
|
||||
depMap[i] = depModule;
|
||||
}
|
||||
}
|
||||
|
||||
// An analog to loader.get covering execution of all three layers (real declarative, simulated declarative, simulated dynamic)
|
||||
function getModule(name, loader) {
|
||||
var entry = loader.defined[name];
|
||||
|
||||
if (!entry)
|
||||
return loader.get(name);
|
||||
|
||||
if (entry.declarative)
|
||||
ensureEvaluated(name, [], loader);
|
||||
|
||||
else if (!entry.evaluated)
|
||||
linkDynamicModule(entry, loader);
|
||||
|
||||
return entry.module;
|
||||
}
|
||||
|
||||
function linkDynamicModule(entry, loader) {
|
||||
if (entry.module)
|
||||
return;
|
||||
|
||||
entry.module = {};
|
||||
|
||||
// AMD requires execute the tree first
|
||||
if (!entry.executingRequire) {
|
||||
for (var i = 0; i < entry.normalizedDeps.length; i++) {
|
||||
var depName = entry.normalizedDeps[i];
|
||||
var depEntry = loader.defined[depName];
|
||||
linkDynamicModule(depEntry, loader);
|
||||
}
|
||||
}
|
||||
|
||||
// now execute
|
||||
try {
|
||||
entry.evaluated = true;
|
||||
var output = entry.execute(function(name) {
|
||||
for (var i = 0; i < entry.deps.length; i++) {
|
||||
if (entry.deps[i] != name)
|
||||
continue;
|
||||
return getModule(entry.normalizedDeps[i], loader);
|
||||
}
|
||||
}, entry.module, name);
|
||||
}
|
||||
catch(e) {
|
||||
throw e;
|
||||
}
|
||||
|
||||
if (output)
|
||||
entry.module = output;
|
||||
}
|
||||
|
||||
// given a module, and the list of modules for this current branch,
|
||||
// ensure that each of the dependencies of this module is evaluated
|
||||
// (unless one is a circular dependency already in the list of seen
|
||||
// modules, in which case we execute it)
|
||||
// then evaluate the module itself
|
||||
// depth-first left to right execution to match ES6 modules
|
||||
function ensureEvaluated(moduleName, seen, loader) {
|
||||
var entry = loader.defined[moduleName];
|
||||
|
||||
// if already seen, that means it's an already-evaluated non circular dependency
|
||||
if (!entry.declarative || entry.evaluated || indexOf.call(seen, moduleName) != -1)
|
||||
return;
|
||||
|
||||
seen.push(moduleName);
|
||||
|
||||
for (var i = 0; i < entry.normalizedDeps.length; i++) {
|
||||
var depName = entry.normalizedDeps[i];
|
||||
|
||||
// circular -> execute now if not already executed
|
||||
if (indexOf.call(seen, depName) != -1) {
|
||||
var depEntry = loader.defined[depName];
|
||||
if (depEntry && !depEntry.evaluated) {
|
||||
depEntry.execute.call(loader.global);
|
||||
delete depEntry.execute;
|
||||
}
|
||||
}
|
||||
// in turn ensure dependencies are evaluated
|
||||
else
|
||||
ensureEvaluated(depName, seen);
|
||||
}
|
||||
|
||||
// we've evaluated all dependencies so evaluate this module now
|
||||
entry.execute.call(loader.global);
|
||||
entry.evaluated = true;
|
||||
}
|
||||
|
||||
var registerRegEx = /System\.register/;
|
||||
|
||||
var loaderTranslate = loader.translate;
|
||||
loader.translate = function(load) {
|
||||
loader.register = register;
|
||||
|
||||
load.metadata.deps = load.metadata.deps || [];
|
||||
|
||||
// run detection for register format here
|
||||
if (load.metadata.format == 'register' || !load.metadata.format && load.source.match(registerRegEx))
|
||||
load.metadata.format = 'register';
|
||||
|
||||
return loaderTranslate.call(this, load);
|
||||
}
|
||||
|
||||
|
||||
var loaderInstantiate = loader.instantiate;
|
||||
loader.instantiate = function(load) {
|
||||
// if the module has been defined by a bundle, use that
|
||||
if (loader.defined[load.name]) {
|
||||
var instantiateResult = loader.defined[load.name];
|
||||
delete loader.defined[load.name];
|
||||
return instantiateResult;
|
||||
var loader = this;
|
||||
|
||||
var entry;
|
||||
|
||||
if (loader.defined[load.name])
|
||||
loader.defined[load.name] = entry = loader.defined[load.name];
|
||||
|
||||
else if (load.metadata.execute) {
|
||||
loader.defined[load.name] = entry = {
|
||||
deps: load.metadata.deps || [],
|
||||
execute: load.metadata.execute,
|
||||
executingRequire: load.metadata.executingRequire // NodeJS-style requires or not
|
||||
};
|
||||
}
|
||||
else if (load.metadata.format == 'register') {
|
||||
lastRegister = null;
|
||||
loader.__exec(load);
|
||||
|
||||
// for a bundle, take the last defined module
|
||||
// in the bundle to be the bundle itself
|
||||
if (lastRegister)
|
||||
loader.defined[load.name] = entry = lastRegister;
|
||||
}
|
||||
|
||||
return loaderInstantiate.apply(this, arguments);
|
||||
}
|
||||
if (!entry)
|
||||
return loaderInstantiate.call(this, load);
|
||||
|
||||
entry.deps = dedupe(entry.deps);
|
||||
|
||||
// first, normalize all dependencies
|
||||
var normalizePromises = [];
|
||||
for (var i = 0; i < entry.deps.length; i++)
|
||||
normalizePromises.push(Promise.resolve(loader.normalize(entry.deps[i], load.name)));
|
||||
|
||||
return Promise.all(normalizePromises).then(function(normalizedDeps) {
|
||||
|
||||
entry.normalizedDeps = normalizedDeps;
|
||||
|
||||
// create the empty dep map - this is our key deferred dependency binding object passed into declare
|
||||
entry.depMap = [];
|
||||
|
||||
return {
|
||||
deps: entry.deps,
|
||||
execute: function() {
|
||||
// recursively ensure that the module and all its
|
||||
// dependencies are linked (with dependency group handling)
|
||||
link(load.name, loader);
|
||||
|
||||
// now handle dependency execution in correct order
|
||||
ensureEvaluated(load.name, [], loader);
|
||||
|
||||
// remove from the registry
|
||||
delete loader.defined[load.name];
|
||||
|
||||
var module = Module(entry.module);
|
||||
|
||||
// if the entry is an alias, set the alias too
|
||||
for (var name in loader.defined) {
|
||||
if (loader.defined[name].execute != entry.execute)
|
||||
continue;
|
||||
if (!loader.has(name))
|
||||
loader.set(name, module);
|
||||
}
|
||||
// return the defined module object
|
||||
return module;
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
26
lib/extension-scriptLoader.js
Normal file
26
lib/extension-scriptLoader.js
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Script tag fetch
|
||||
*/
|
||||
|
||||
function scriptLoader(loader) {
|
||||
if (typeof indexOf == 'undefined')
|
||||
indexOf = Array.prototype.indexOf;
|
||||
|
||||
var head = document.getElementsByTagName('head')[0];
|
||||
|
||||
// override fetch to use script injection
|
||||
loader.fetch = function(load) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var s = document.createElement('script');
|
||||
s.async = true;
|
||||
s.addEventListener('load', function(evt) {
|
||||
resolve('');
|
||||
}, false);
|
||||
s.addEventListener('error', function(err) {
|
||||
reject(err);
|
||||
}, false);
|
||||
s.src = load.address;
|
||||
head.appendChild(s);
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -56,6 +56,9 @@
|
||||
*/
|
||||
|
||||
function versions(loader) {
|
||||
if (typeof indexOf == 'undefined')
|
||||
indexOf = Array.prototype.indexOf;
|
||||
|
||||
// match x, x.y, x.y.z, x.y.z-prerelease.1
|
||||
var semverRegEx = /^(\d+)(?:\.(\d+)(?:\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?)?)?$/;
|
||||
|
||||
@ -76,15 +79,16 @@ function versions(loader) {
|
||||
return parseInt(v1Parts[i]) > parseInt(v2Parts[i]) ? 1 : -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
var loaderNormalize = loader.normalize;
|
||||
|
||||
loader.versions = loader.versions || {};
|
||||
|
||||
// hook normalize and store a record of all versioned packages
|
||||
var loaderNormalize = loader.normalize;
|
||||
loader.normalize = function(name, parentName, parentAddress) {
|
||||
var packageVersions = loader.versions;
|
||||
if (!loader.versions)
|
||||
loader.versions = {};
|
||||
var packageVersions = this.versions;
|
||||
// run all other normalizers first
|
||||
return Promise.resolve(loaderNormalize.call(this, name, parentName, parentAddress)).then(function(normalized) {
|
||||
|
||||
|
||||
@ -1,39 +1,54 @@
|
||||
System.baseURL = __$curScript.getAttribute('data-baseurl') || System.baseURL;
|
||||
|
||||
var configPath = __$curScript.getAttribute('data-config');
|
||||
if (configPath === '')
|
||||
configPath = System.baseURL + 'config.json';
|
||||
|
||||
var main = __$curScript.getAttribute('data-main');
|
||||
|
||||
(!configPath ? Promise.resolve() :
|
||||
Promise.resolve(System.fetch.call(System, { address: configPath, metadata: {} }))
|
||||
.then(JSON.parse)
|
||||
.then(System.config)
|
||||
).then(function() {
|
||||
if (main)
|
||||
return System['import'](main);
|
||||
})
|
||||
['catch'](function(e) {
|
||||
setTimeout(function() {
|
||||
throw e;
|
||||
})
|
||||
});
|
||||
|
||||
if (__$global.systemMainEntryPoint)
|
||||
System['import'](__$global.systemMainEntryPoint);
|
||||
};
|
||||
|
||||
(function() {
|
||||
var __$curScript;
|
||||
|
||||
(function(global) {
|
||||
if (typeof window != 'undefined') {
|
||||
var scripts = document.getElementsByTagName('script');
|
||||
var curScript = scripts[scripts.length - 1];
|
||||
__$global.systemMainEntryPoint = curScript.getAttribute('data-main');
|
||||
__$curScript = scripts[scripts.length - 1];
|
||||
|
||||
if (!__$global.System || __$global.System.registerModule) {
|
||||
if (!global.System || global.System.registerModule) {
|
||||
// determine the current script path as the base path
|
||||
var curPath = curScript.src;
|
||||
var curPath = __$curScript.src;
|
||||
var basePath = curPath.substr(0, curPath.lastIndexOf('/') + 1);
|
||||
document.write(
|
||||
'<' + 'script type="text/javascript" src="' + basePath + 'es6-module-loader.js" data-init="upgradeSystemLoader">' + '<' + '/script>'
|
||||
);
|
||||
}
|
||||
else {
|
||||
__$global.upgradeSystemLoader();
|
||||
global.upgradeSystemLoader();
|
||||
}
|
||||
|
||||
var configPath = curScript.getAttribute('data-config');
|
||||
if (configPath)
|
||||
document.write('<' + 'script type="text/javascript src="' + configPath + '">' + '<' + '/script>');
|
||||
}
|
||||
else {
|
||||
var es6ModuleLoader = require('es6-module-loader');
|
||||
__$global.System = es6ModuleLoader.System;
|
||||
__$global.Loader = es6ModuleLoader.Loader;
|
||||
__$global.Module = es6ModuleLoader.Module;
|
||||
module.exports = __$global.System;
|
||||
__$global.upgradeSystemLoader();
|
||||
global.System = es6ModuleLoader.System;
|
||||
global.Loader = es6ModuleLoader.Loader;
|
||||
global.Module = es6ModuleLoader.Module;
|
||||
module.exports = global.System;
|
||||
global.upgradeSystemLoader();
|
||||
}
|
||||
})();
|
||||
|
||||
})(__$global);
|
||||
|
||||
})(typeof window != 'undefined' ? window : global);
|
||||
@ -1,4 +1,12 @@
|
||||
(function(__$global) {
|
||||
|
||||
// indexOf polyfill for IE
|
||||
var indexOf = Array.prototype.indexOf || function(item) {
|
||||
for (var i = 0, l = this.length; i < l; i++)
|
||||
if (this[i] === item)
|
||||
return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
__$global.upgradeSystemLoader = function() {
|
||||
__$global.upgradeSystemLoader = undefined;
|
||||
@ -1,17 +0,0 @@
|
||||
// Define an IE-friendly shim good-enough for purposes
|
||||
var indexOf = Array.prototype.indexOf || function(item) {
|
||||
for (var i = 0, thisLen = this.length; i < thisLen; i++) {
|
||||
if (this[i] === item)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
var lastIndexOf = Array.prototype.lastIndexOf || function(c) {
|
||||
for (var i = this.length - 1; i >= 0; i--) {
|
||||
if (this[i] === c) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -i;
|
||||
}
|
||||
@ -14,7 +14,7 @@
|
||||
<div id="qunit-test-area"></div>
|
||||
|
||||
<script src="../bower_components/es6-module-loader/dist/es6-module-loader.js"></script>
|
||||
<script src="../dist/system.js" data-traceur-src="../bower_components/traceur/traceur.js" data-main=test type="text/javascript"></script>
|
||||
<script src="../dist/system.js" data-traceur-src="../bower_components/traceur/traceur.js" data-main="test" type="text/javascript"></script>
|
||||
|
||||
<script src="../bower_components/qunit/qunit/qunit.js"></script>
|
||||
</body>
|
||||
|
||||
12
test/test.js
12
test/test.js
@ -1,4 +1,4 @@
|
||||
"global";
|
||||
"format global";
|
||||
|
||||
QUnit.config.testTimeout = 2000;
|
||||
|
||||
@ -17,7 +17,7 @@ function err(e) {
|
||||
}
|
||||
|
||||
asyncTest('Error handling', function() {
|
||||
System['import']('tests/error').then(err, function() {
|
||||
System['import']('tests/error').then(err, function(e) {
|
||||
ok(true);
|
||||
start();
|
||||
});
|
||||
@ -139,7 +139,7 @@ asyncTest('Loading an AMD module', function() {
|
||||
}, err);
|
||||
});
|
||||
|
||||
asyncTest('Loading an AMD named define', function() {
|
||||
/*asyncTest('Loading an AMD named define', function() {
|
||||
System['import']('tests/nameddefine').then(function(m1){
|
||||
ok(m1.converter, 'Showdown not loaded');
|
||||
System['import']('another-define').then(function(m2) {
|
||||
@ -236,13 +236,13 @@ asyncTest('Advanced compiler plugin', function() {
|
||||
}, err);
|
||||
});
|
||||
|
||||
/* asyncTest('Loading from jspm', function() {
|
||||
asyncTest('Loading from jspm', function() {
|
||||
System.paths['npm:*'] = 'https://npm.jspm.io/*.js';
|
||||
System['import']('npm:underscore').then(function(m) {
|
||||
ok(m && typeof m.chain == 'function', 'Not loaded');
|
||||
start();
|
||||
}, err);
|
||||
}); */
|
||||
});
|
||||
|
||||
asyncTest('Wrapper module support', function() {
|
||||
System['import']('tests/wrapper').then(function(m) {
|
||||
@ -326,4 +326,4 @@ asyncTest('Relative dyanamic loading', function() {
|
||||
start();
|
||||
}, err);
|
||||
}, err);
|
||||
});
|
||||
}); */
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
'global';
|
||||
'import ./global-dep';
|
||||
'format global';
|
||||
'deps ./global-dep';
|
||||
|
||||
|
||||
(function(window) {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
"global";
|
||||
"export p.r";
|
||||
"format global";
|
||||
"exports p.r";
|
||||
|
||||
(function(window) {
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user