
git-subtree-dir: thirdparty/systemjs git-subtree-split: 5ed69b6344e8fc1cd43bf758350b2236f57e1499
2198 lines
66 KiB
JavaScript
2198 lines
66 KiB
JavaScript
/*
|
|
* SystemJS v0.19.39
|
|
*/
|
|
// from https://gist.github.com/Yaffle/1088850
|
|
(function(global) {
|
|
function URLPolyfill(url, baseURL) {
|
|
if (typeof url != 'string')
|
|
throw new TypeError('URL must be a string');
|
|
var m = String(url).replace(/^\s+|\s+$/g, "").match(/^([^:\/?#]+:)?(?:\/\/(?:([^:@\/?#]*)(?::([^:@\/?#]*))?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/);
|
|
if (!m)
|
|
throw new RangeError('Invalid URL format');
|
|
var protocol = m[1] || "";
|
|
var username = m[2] || "";
|
|
var password = m[3] || "";
|
|
var host = m[4] || "";
|
|
var hostname = m[5] || "";
|
|
var port = m[6] || "";
|
|
var pathname = m[7] || "";
|
|
var search = m[8] || "";
|
|
var hash = m[9] || "";
|
|
if (baseURL !== undefined) {
|
|
var base = baseURL instanceof URLPolyfill ? baseURL : new URLPolyfill(baseURL);
|
|
var flag = !protocol && !host && !username;
|
|
if (flag && !pathname && !search)
|
|
search = base.search;
|
|
if (flag && pathname[0] !== "/")
|
|
pathname = (pathname ? (((base.host || base.username) && !base.pathname ? "/" : "") + base.pathname.slice(0, base.pathname.lastIndexOf("/") + 1) + pathname) : base.pathname);
|
|
// dot segments removal
|
|
var output = [];
|
|
pathname.replace(/^(\.\.?(\/|$))+/, "")
|
|
.replace(/\/(\.(\/|$))+/g, "/")
|
|
.replace(/\/\.\.$/, "/../")
|
|
.replace(/\/?[^\/]*/g, function (p) {
|
|
if (p === "/..")
|
|
output.pop();
|
|
else
|
|
output.push(p);
|
|
});
|
|
pathname = output.join("").replace(/^\//, pathname[0] === "/" ? "/" : "");
|
|
if (flag) {
|
|
port = base.port;
|
|
hostname = base.hostname;
|
|
host = base.host;
|
|
password = base.password;
|
|
username = base.username;
|
|
}
|
|
if (!protocol)
|
|
protocol = base.protocol;
|
|
}
|
|
|
|
// convert URLs to use / always
|
|
pathname = pathname.replace(/\\/g, '/');
|
|
|
|
this.origin = host ? protocol + (protocol !== "" || host !== "" ? "//" : "") + host : "";
|
|
this.href = protocol + (protocol && host || protocol == "file:" ? "//" : "") + (username !== "" ? username + (password !== "" ? ":" + password : "") + "@" : "") + host + pathname + search + hash;
|
|
this.protocol = protocol;
|
|
this.username = username;
|
|
this.password = password;
|
|
this.host = host;
|
|
this.hostname = hostname;
|
|
this.port = port;
|
|
this.pathname = pathname;
|
|
this.search = search;
|
|
this.hash = hash;
|
|
}
|
|
global.URLPolyfill = URLPolyfill;
|
|
})(typeof self != 'undefined' ? self : global);(function(__global) {
|
|
|
|
var isWorker = typeof window == 'undefined' && typeof self != 'undefined' && typeof importScripts != 'undefined';
|
|
var isBrowser = typeof window != 'undefined' && typeof document != 'undefined';
|
|
var isWindows = typeof process != 'undefined' && typeof process.platform != 'undefined' && !!process.platform.match(/^win/);
|
|
|
|
if (!__global.console)
|
|
__global.console = { assert: function() {} };
|
|
|
|
// IE8 support
|
|
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 defineProperty;
|
|
(function () {
|
|
try {
|
|
if (!!Object.defineProperty({}, 'a', {}))
|
|
defineProperty = Object.defineProperty;
|
|
}
|
|
catch (e) {
|
|
defineProperty = function(obj, prop, opt) {
|
|
try {
|
|
obj[prop] = opt.value || opt.get.call(obj);
|
|
}
|
|
catch(e) {}
|
|
}
|
|
}
|
|
})();
|
|
|
|
var errArgs = new Error(0, '_').fileName == '_';
|
|
|
|
function addToError(err, msg) {
|
|
// parse the stack removing loader code lines for simplification
|
|
if (!err.originalErr) {
|
|
var stack = ((err.message || err) + (err.stack ? '\n' + err.stack : '')).toString().split('\n');
|
|
var newStack = [];
|
|
for (var i = 0; i < stack.length; i++) {
|
|
if (typeof $__curScript == 'undefined' || stack[i].indexOf($__curScript.src) == -1)
|
|
newStack.push(stack[i]);
|
|
}
|
|
}
|
|
|
|
var newMsg = '(SystemJS) ' + (newStack ? newStack.join('\n\t') : err.message.substr(11)) + '\n\t' + msg;
|
|
|
|
// Convert file:/// URLs to paths in Node
|
|
if (!isBrowser)
|
|
newMsg = newMsg.replace(isWindows ? /file:\/\/\//g : /file:\/\//g, '');
|
|
|
|
var newErr = errArgs ? new Error(newMsg, err.fileName, err.lineNumber) : new Error(newMsg);
|
|
|
|
newErr.stack = newMsg;
|
|
|
|
// track the original error
|
|
newErr.originalErr = err.originalErr || err;
|
|
|
|
return newErr;
|
|
}
|
|
|
|
function __eval(source, debugName, context) {
|
|
try {
|
|
new Function(source).call(context);
|
|
}
|
|
catch(e) {
|
|
throw addToError(e, 'Evaluating ' + debugName);
|
|
}
|
|
}
|
|
|
|
var baseURI;
|
|
|
|
// environent baseURI detection
|
|
if (typeof document != 'undefined' && document.getElementsByTagName) {
|
|
baseURI = document.baseURI;
|
|
|
|
if (!baseURI) {
|
|
var bases = document.getElementsByTagName('base');
|
|
baseURI = bases[0] && bases[0].href || window.location.href;
|
|
}
|
|
}
|
|
else if (typeof location != 'undefined') {
|
|
baseURI = __global.location.href;
|
|
}
|
|
|
|
// sanitize out the hash and querystring
|
|
if (baseURI) {
|
|
baseURI = baseURI.split('#')[0].split('?')[0];
|
|
baseURI = baseURI.substr(0, baseURI.lastIndexOf('/') + 1);
|
|
}
|
|
else if (typeof process != 'undefined' && process.cwd) {
|
|
baseURI = 'file://' + (isWindows ? '/' : '') + process.cwd() + '/';
|
|
if (isWindows)
|
|
baseURI = baseURI.replace(/\\/g, '/');
|
|
}
|
|
else {
|
|
throw new TypeError('No environment baseURI');
|
|
}
|
|
|
|
try {
|
|
var nativeURL = new __global.URL('test:///').protocol == 'test:';
|
|
}
|
|
catch(e) {}
|
|
|
|
var URL = nativeURL ? __global.URL : __global.URLPolyfill;
|
|
|
|
/*
|
|
*********************************************************************************************
|
|
|
|
Dynamic Module Loader Polyfill
|
|
|
|
- Implemented exactly to the former 2014-08-24 ES6 Specification Draft Rev 27, Section 15
|
|
http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts#august_24_2014_draft_rev_27
|
|
|
|
- Functions are commented with their spec numbers, with spec differences commented.
|
|
|
|
- Spec bugs are commented in this code with links.
|
|
|
|
- Abstract functions have been combined where possible, and their associated functions
|
|
commented.
|
|
|
|
- Realm implementation is entirely omitted.
|
|
|
|
*********************************************************************************************
|
|
*/
|
|
|
|
function Module() {}
|
|
// http://www.ecma-international.org/ecma-262/6.0/#sec-@@tostringtag
|
|
defineProperty(Module.prototype, 'toString', {
|
|
value: function() {
|
|
return 'Module';
|
|
}
|
|
});
|
|
function Loader(options) {
|
|
this._loader = {
|
|
loaderObj: this,
|
|
loads: [],
|
|
modules: {},
|
|
importPromises: {},
|
|
moduleRecords: {}
|
|
};
|
|
|
|
// 26.3.3.6
|
|
defineProperty(this, 'global', {
|
|
get: function() {
|
|
return __global;
|
|
}
|
|
});
|
|
|
|
// 26.3.3.13 realm not implemented
|
|
}
|
|
|
|
(function() {
|
|
|
|
// Some Helpers
|
|
|
|
// logs a linkset snapshot for debugging
|
|
/* function snapshot(loader) {
|
|
console.log('---Snapshot---');
|
|
for (var i = 0; i < loader.loads.length; i++) {
|
|
var load = loader.loads[i];
|
|
var linkSetLog = ' ' + load.name + ' (' + load.status + '): ';
|
|
|
|
for (var j = 0; j < load.linkSets.length; j++) {
|
|
linkSetLog += '{' + logloads(load.linkSets[j].loads) + '} ';
|
|
}
|
|
console.log(linkSetLog);
|
|
}
|
|
console.log('');
|
|
}
|
|
function logloads(loads) {
|
|
var log = '';
|
|
for (var k = 0; k < loads.length; k++)
|
|
log += loads[k].name + (k != loads.length - 1 ? ' ' : '');
|
|
return log;
|
|
} */
|
|
|
|
|
|
/* function checkInvariants() {
|
|
// see https://bugs.ecmascript.org/show_bug.cgi?id=2603#c1
|
|
|
|
var loads = System._loader.loads;
|
|
var linkSets = [];
|
|
|
|
for (var i = 0; i < loads.length; i++) {
|
|
var load = loads[i];
|
|
console.assert(load.status == 'loading' || load.status == 'loaded', 'Each load is loading or loaded');
|
|
|
|
for (var j = 0; j < load.linkSets.length; j++) {
|
|
var linkSet = load.linkSets[j];
|
|
|
|
for (var k = 0; k < linkSet.loads.length; k++)
|
|
console.assert(loads.indexOf(linkSet.loads[k]) != -1, 'linkSet loads are a subset of loader loads');
|
|
|
|
if (linkSets.indexOf(linkSet) == -1)
|
|
linkSets.push(linkSet);
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < loads.length; i++) {
|
|
var load = loads[i];
|
|
for (var j = 0; j < linkSets.length; j++) {
|
|
var linkSet = linkSets[j];
|
|
|
|
if (linkSet.loads.indexOf(load) != -1)
|
|
console.assert(load.linkSets.indexOf(linkSet) != -1, 'linkSet contains load -> load contains linkSet');
|
|
|
|
if (load.linkSets.indexOf(linkSet) != -1)
|
|
console.assert(linkSet.loads.indexOf(load) != -1, 'load contains linkSet -> linkSet contains load');
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < linkSets.length; i++) {
|
|
var linkSet = linkSets[i];
|
|
for (var j = 0; j < linkSet.loads.length; j++) {
|
|
var load = linkSet.loads[j];
|
|
|
|
for (var k = 0; k < load.dependencies.length; k++) {
|
|
var depName = load.dependencies[k].value;
|
|
var depLoad;
|
|
for (var l = 0; l < loads.length; l++) {
|
|
if (loads[l].name != depName)
|
|
continue;
|
|
depLoad = loads[l];
|
|
break;
|
|
}
|
|
|
|
// loading records are allowed not to have their dependencies yet
|
|
// if (load.status != 'loading')
|
|
// console.assert(depLoad, 'depLoad found');
|
|
|
|
// console.assert(linkSet.loads.indexOf(depLoad) != -1, 'linkset contains all dependencies');
|
|
}
|
|
}
|
|
}
|
|
} */
|
|
|
|
// 15.2.3 - Runtime Semantics: Loader State
|
|
|
|
// 15.2.3.11
|
|
function createLoaderLoad(object) {
|
|
return {
|
|
// modules is an object for ES5 implementation
|
|
modules: {},
|
|
loads: [],
|
|
loaderObj: object
|
|
};
|
|
}
|
|
|
|
// 15.2.3.2 Load Records and LoadRequest Objects
|
|
|
|
var anonCnt = 0;
|
|
|
|
// 15.2.3.2.1
|
|
function createLoad(name) {
|
|
return {
|
|
status: 'loading',
|
|
name: name || '<Anonymous' + ++anonCnt + '>',
|
|
linkSets: [],
|
|
dependencies: [],
|
|
metadata: {}
|
|
};
|
|
}
|
|
|
|
// 15.2.3.2.2 createLoadRequestObject, absorbed into calling functions
|
|
|
|
// 15.2.4
|
|
|
|
// 15.2.4.1
|
|
function loadModule(loader, name, options) {
|
|
return new Promise(asyncStartLoadPartwayThrough({
|
|
step: options.address ? 'fetch' : 'locate',
|
|
loader: loader,
|
|
moduleName: name,
|
|
// allow metadata for import https://bugs.ecmascript.org/show_bug.cgi?id=3091
|
|
moduleMetadata: options && options.metadata || {},
|
|
moduleSource: options.source,
|
|
moduleAddress: options.address
|
|
}));
|
|
}
|
|
|
|
// 15.2.4.2
|
|
function requestLoad(loader, request, refererName, refererAddress) {
|
|
// 15.2.4.2.1 CallNormalize
|
|
return new Promise(function(resolve, reject) {
|
|
resolve(loader.loaderObj.normalize(request, refererName, refererAddress));
|
|
})
|
|
// 15.2.4.2.2 GetOrCreateLoad
|
|
.then(function(name) {
|
|
var load;
|
|
if (loader.modules[name]) {
|
|
load = createLoad(name);
|
|
load.status = 'linked';
|
|
// https://bugs.ecmascript.org/show_bug.cgi?id=2795
|
|
load.module = loader.modules[name];
|
|
return load;
|
|
}
|
|
|
|
for (var i = 0, l = loader.loads.length; i < l; i++) {
|
|
load = loader.loads[i];
|
|
if (load.name != name)
|
|
continue;
|
|
return load;
|
|
}
|
|
|
|
load = createLoad(name);
|
|
loader.loads.push(load);
|
|
|
|
proceedToLocate(loader, load);
|
|
|
|
return load;
|
|
});
|
|
}
|
|
|
|
// 15.2.4.3
|
|
function proceedToLocate(loader, load) {
|
|
proceedToFetch(loader, load,
|
|
Promise.resolve()
|
|
// 15.2.4.3.1 CallLocate
|
|
.then(function() {
|
|
return loader.loaderObj.locate({ name: load.name, metadata: load.metadata });
|
|
})
|
|
);
|
|
}
|
|
|
|
// 15.2.4.4
|
|
function proceedToFetch(loader, load, p) {
|
|
proceedToTranslate(loader, load,
|
|
p
|
|
// 15.2.4.4.1 CallFetch
|
|
.then(function(address) {
|
|
// adjusted, see https://bugs.ecmascript.org/show_bug.cgi?id=2602
|
|
if (load.status != 'loading')
|
|
return;
|
|
load.address = address;
|
|
|
|
return loader.loaderObj.fetch({ name: load.name, metadata: load.metadata, address: address });
|
|
})
|
|
);
|
|
}
|
|
|
|
// 15.2.4.5
|
|
function proceedToTranslate(loader, load, p) {
|
|
p
|
|
// 15.2.4.5.1 CallTranslate
|
|
.then(function(source) {
|
|
if (load.status != 'loading')
|
|
return;
|
|
|
|
load.address = load.address || load.name;
|
|
|
|
return Promise.resolve(loader.loaderObj.translate({ name: load.name, metadata: load.metadata, address: load.address, source: source }))
|
|
|
|
// 15.2.4.5.2 CallInstantiate
|
|
.then(function(source) {
|
|
load.source = source;
|
|
return loader.loaderObj.instantiate({ name: load.name, metadata: load.metadata, address: load.address, source: source });
|
|
})
|
|
|
|
// 15.2.4.5.3 InstantiateSucceeded
|
|
.then(function(instantiateResult) {
|
|
if (instantiateResult === undefined)
|
|
throw new TypeError('Declarative modules unsupported in the polyfill.');
|
|
|
|
if (typeof instantiateResult != 'object')
|
|
throw new TypeError('Invalid instantiate return value');
|
|
|
|
load.depsList = instantiateResult.deps || [];
|
|
load.execute = instantiateResult.execute;
|
|
})
|
|
// 15.2.4.6 ProcessLoadDependencies
|
|
.then(function() {
|
|
load.dependencies = [];
|
|
var depsList = load.depsList;
|
|
|
|
var loadPromises = [];
|
|
for (var i = 0, l = depsList.length; i < l; i++) (function(request, index) {
|
|
loadPromises.push(
|
|
requestLoad(loader, request, load.name, load.address)
|
|
|
|
// 15.2.4.6.1 AddDependencyLoad (load is parentLoad)
|
|
.then(function(depLoad) {
|
|
|
|
// adjusted from spec to maintain dependency order
|
|
// this is due to the System.register internal implementation needs
|
|
load.dependencies[index] = {
|
|
key: request,
|
|
value: depLoad.name
|
|
};
|
|
|
|
if (depLoad.status != 'linked') {
|
|
var linkSets = load.linkSets.concat([]);
|
|
for (var i = 0, l = linkSets.length; i < l; i++)
|
|
addLoadToLinkSet(linkSets[i], depLoad);
|
|
}
|
|
|
|
// console.log('AddDependencyLoad ' + depLoad.name + ' for ' + load.name);
|
|
// snapshot(loader);
|
|
})
|
|
);
|
|
})(depsList[i], i);
|
|
|
|
return Promise.all(loadPromises);
|
|
})
|
|
|
|
// 15.2.4.6.2 LoadSucceeded
|
|
.then(function() {
|
|
// console.log('LoadSucceeded ' + load.name);
|
|
// snapshot(loader);
|
|
|
|
load.status = 'loaded';
|
|
|
|
var linkSets = load.linkSets.concat([]);
|
|
for (var i = 0, l = linkSets.length; i < l; i++)
|
|
updateLinkSetOnLoad(linkSets[i], load);
|
|
});
|
|
})
|
|
// 15.2.4.5.4 LoadFailed
|
|
['catch'](function(exc) {
|
|
load.status = 'failed';
|
|
load.exception = exc;
|
|
|
|
var linkSets = load.linkSets.concat([]);
|
|
for (var i = 0, l = linkSets.length; i < l; i++) {
|
|
linkSetFailed(linkSets[i], load, exc);
|
|
}
|
|
|
|
console.assert(load.linkSets.length == 0, 'linkSets not removed');
|
|
});
|
|
}
|
|
|
|
// 15.2.4.7 PromiseOfStartLoadPartwayThrough absorbed into calling functions
|
|
|
|
// 15.2.4.7.1
|
|
function asyncStartLoadPartwayThrough(stepState) {
|
|
return function(resolve, reject) {
|
|
var loader = stepState.loader;
|
|
var name = stepState.moduleName;
|
|
var step = stepState.step;
|
|
|
|
if (loader.modules[name])
|
|
throw new TypeError('"' + name + '" already exists in the module table');
|
|
|
|
// adjusted to pick up existing loads
|
|
var existingLoad;
|
|
for (var i = 0, l = loader.loads.length; i < l; i++) {
|
|
if (loader.loads[i].name == name) {
|
|
existingLoad = loader.loads[i];
|
|
|
|
if (step == 'translate' && !existingLoad.source) {
|
|
existingLoad.address = stepState.moduleAddress;
|
|
proceedToTranslate(loader, existingLoad, Promise.resolve(stepState.moduleSource));
|
|
}
|
|
|
|
// a primary load -> use that existing linkset if it is for the direct load here
|
|
// otherwise create a new linkset unit
|
|
if (existingLoad.linkSets.length && existingLoad.linkSets[0].loads[0].name == existingLoad.name)
|
|
return existingLoad.linkSets[0].done.then(function() {
|
|
resolve(existingLoad);
|
|
});
|
|
}
|
|
}
|
|
|
|
var load = existingLoad || createLoad(name);
|
|
|
|
load.metadata = stepState.moduleMetadata;
|
|
|
|
var linkSet = createLinkSet(loader, load);
|
|
|
|
loader.loads.push(load);
|
|
|
|
resolve(linkSet.done);
|
|
|
|
if (step == 'locate')
|
|
proceedToLocate(loader, load);
|
|
|
|
else if (step == 'fetch')
|
|
proceedToFetch(loader, load, Promise.resolve(stepState.moduleAddress));
|
|
|
|
else {
|
|
console.assert(step == 'translate', 'translate step');
|
|
load.address = stepState.moduleAddress;
|
|
proceedToTranslate(loader, load, Promise.resolve(stepState.moduleSource));
|
|
}
|
|
}
|
|
}
|
|
|
|
// Declarative linking functions run through alternative implementation:
|
|
// 15.2.5.1.1 CreateModuleLinkageRecord not implemented
|
|
// 15.2.5.1.2 LookupExport not implemented
|
|
// 15.2.5.1.3 LookupModuleDependency not implemented
|
|
|
|
// 15.2.5.2.1
|
|
function createLinkSet(loader, startingLoad) {
|
|
var linkSet = {
|
|
loader: loader,
|
|
loads: [],
|
|
startingLoad: startingLoad, // added see spec bug https://bugs.ecmascript.org/show_bug.cgi?id=2995
|
|
loadingCount: 0
|
|
};
|
|
linkSet.done = new Promise(function(resolve, reject) {
|
|
linkSet.resolve = resolve;
|
|
linkSet.reject = reject;
|
|
});
|
|
addLoadToLinkSet(linkSet, startingLoad);
|
|
return linkSet;
|
|
}
|
|
// 15.2.5.2.2
|
|
function addLoadToLinkSet(linkSet, load) {
|
|
if (load.status == 'failed')
|
|
return;
|
|
|
|
for (var i = 0, l = linkSet.loads.length; i < l; i++)
|
|
if (linkSet.loads[i] == load)
|
|
return;
|
|
|
|
linkSet.loads.push(load);
|
|
load.linkSets.push(linkSet);
|
|
|
|
// adjustment, see https://bugs.ecmascript.org/show_bug.cgi?id=2603
|
|
if (load.status != 'loaded') {
|
|
linkSet.loadingCount++;
|
|
}
|
|
|
|
var loader = linkSet.loader;
|
|
|
|
for (var i = 0, l = load.dependencies.length; i < l; i++) {
|
|
if (!load.dependencies[i])
|
|
continue;
|
|
|
|
var name = load.dependencies[i].value;
|
|
|
|
if (loader.modules[name])
|
|
continue;
|
|
|
|
for (var j = 0, d = loader.loads.length; j < d; j++) {
|
|
if (loader.loads[j].name != name)
|
|
continue;
|
|
|
|
addLoadToLinkSet(linkSet, loader.loads[j]);
|
|
break;
|
|
}
|
|
}
|
|
// console.log('add to linkset ' + load.name);
|
|
// snapshot(linkSet.loader);
|
|
}
|
|
|
|
// linking errors can be generic or load-specific
|
|
// this is necessary for debugging info
|
|
function doLink(linkSet) {
|
|
var error = false;
|
|
try {
|
|
link(linkSet, function(load, exc) {
|
|
linkSetFailed(linkSet, load, exc);
|
|
error = true;
|
|
});
|
|
}
|
|
catch(e) {
|
|
linkSetFailed(linkSet, null, e);
|
|
error = true;
|
|
}
|
|
return error;
|
|
}
|
|
|
|
// 15.2.5.2.3
|
|
function updateLinkSetOnLoad(linkSet, load) {
|
|
// console.log('update linkset on load ' + load.name);
|
|
// snapshot(linkSet.loader);
|
|
|
|
console.assert(load.status == 'loaded' || load.status == 'linked', 'loaded or linked');
|
|
|
|
linkSet.loadingCount--;
|
|
|
|
if (linkSet.loadingCount > 0)
|
|
return;
|
|
|
|
// adjusted for spec bug https://bugs.ecmascript.org/show_bug.cgi?id=2995
|
|
var startingLoad = linkSet.startingLoad;
|
|
|
|
// non-executing link variation for loader tracing
|
|
// on the server. Not in spec.
|
|
/***/
|
|
if (linkSet.loader.loaderObj.execute === false) {
|
|
var loads = [].concat(linkSet.loads);
|
|
for (var i = 0, l = loads.length; i < l; i++) {
|
|
var load = loads[i];
|
|
load.module = {
|
|
name: load.name,
|
|
module: _newModule({}),
|
|
evaluated: true
|
|
};
|
|
load.status = 'linked';
|
|
finishLoad(linkSet.loader, load);
|
|
}
|
|
return linkSet.resolve(startingLoad);
|
|
}
|
|
/***/
|
|
|
|
var abrupt = doLink(linkSet);
|
|
|
|
if (abrupt)
|
|
return;
|
|
|
|
console.assert(linkSet.loads.length == 0, 'loads cleared');
|
|
|
|
linkSet.resolve(startingLoad);
|
|
}
|
|
|
|
// 15.2.5.2.4
|
|
function linkSetFailed(linkSet, load, exc) {
|
|
var loader = linkSet.loader;
|
|
var requests;
|
|
|
|
checkError:
|
|
if (load) {
|
|
if (linkSet.loads[0].name == load.name) {
|
|
exc = addToError(exc, 'Error loading ' + load.name);
|
|
}
|
|
else {
|
|
for (var i = 0; i < linkSet.loads.length; i++) {
|
|
var pLoad = linkSet.loads[i];
|
|
for (var j = 0; j < pLoad.dependencies.length; j++) {
|
|
var dep = pLoad.dependencies[j];
|
|
if (dep.value == load.name) {
|
|
exc = addToError(exc, 'Error loading ' + load.name + ' as "' + dep.key + '" from ' + pLoad.name);
|
|
break checkError;
|
|
}
|
|
}
|
|
}
|
|
exc = addToError(exc, 'Error loading ' + load.name + ' from ' + linkSet.loads[0].name);
|
|
}
|
|
}
|
|
else {
|
|
exc = addToError(exc, 'Error linking ' + linkSet.loads[0].name);
|
|
}
|
|
|
|
|
|
var loads = linkSet.loads.concat([]);
|
|
for (var i = 0, l = loads.length; i < l; i++) {
|
|
var load = loads[i];
|
|
|
|
// store all failed load records
|
|
loader.loaderObj.failed = loader.loaderObj.failed || [];
|
|
if (indexOf.call(loader.loaderObj.failed, load) == -1)
|
|
loader.loaderObj.failed.push(load);
|
|
|
|
var linkIndex = indexOf.call(load.linkSets, linkSet);
|
|
console.assert(linkIndex != -1, 'link not present');
|
|
load.linkSets.splice(linkIndex, 1);
|
|
if (load.linkSets.length == 0) {
|
|
var globalLoadsIndex = indexOf.call(linkSet.loader.loads, load);
|
|
if (globalLoadsIndex != -1)
|
|
linkSet.loader.loads.splice(globalLoadsIndex, 1);
|
|
}
|
|
}
|
|
linkSet.reject(exc);
|
|
}
|
|
|
|
// 15.2.5.2.5
|
|
function finishLoad(loader, load) {
|
|
// add to global trace if tracing
|
|
if (loader.loaderObj.trace) {
|
|
if (!loader.loaderObj.loads)
|
|
loader.loaderObj.loads = {};
|
|
var depMap = {};
|
|
load.dependencies.forEach(function(dep) {
|
|
depMap[dep.key] = dep.value;
|
|
});
|
|
loader.loaderObj.loads[load.name] = {
|
|
name: load.name,
|
|
deps: load.dependencies.map(function(dep){ return dep.key }),
|
|
depMap: depMap,
|
|
address: load.address,
|
|
metadata: load.metadata,
|
|
source: load.source
|
|
};
|
|
}
|
|
// if not anonymous, add to the module table
|
|
if (load.name) {
|
|
console.assert(!loader.modules[load.name] || loader.modules[load.name].module === load.module.module, 'load not in module table');
|
|
loader.modules[load.name] = load.module;
|
|
}
|
|
var loadIndex = indexOf.call(loader.loads, load);
|
|
if (loadIndex != -1)
|
|
loader.loads.splice(loadIndex, 1);
|
|
for (var i = 0, l = load.linkSets.length; i < l; i++) {
|
|
loadIndex = indexOf.call(load.linkSets[i].loads, load);
|
|
if (loadIndex != -1)
|
|
load.linkSets[i].loads.splice(loadIndex, 1);
|
|
}
|
|
load.linkSets.splice(0, load.linkSets.length);
|
|
}
|
|
|
|
function doDynamicExecute(linkSet, load, linkError) {
|
|
try {
|
|
var module = load.execute();
|
|
}
|
|
catch(e) {
|
|
linkError(load, e);
|
|
return;
|
|
}
|
|
if (!module || !(module instanceof Module))
|
|
linkError(load, new TypeError('Execution must define a Module instance'));
|
|
else
|
|
return module;
|
|
}
|
|
|
|
// 26.3 Loader
|
|
|
|
// 26.3.1.1
|
|
// defined at top
|
|
|
|
// importPromises adds ability to import a module twice without error - https://bugs.ecmascript.org/show_bug.cgi?id=2601
|
|
function createImportPromise(loader, name, promise) {
|
|
var importPromises = loader._loader.importPromises;
|
|
return importPromises[name] = promise.then(function(m) {
|
|
importPromises[name] = undefined;
|
|
return m;
|
|
}, function(e) {
|
|
importPromises[name] = undefined;
|
|
throw e;
|
|
});
|
|
}
|
|
|
|
Loader.prototype = {
|
|
// 26.3.3.1
|
|
constructor: Loader,
|
|
// 26.3.3.2
|
|
define: function(name, source, options) {
|
|
// check if already defined
|
|
if (this._loader.importPromises[name])
|
|
throw new TypeError('Module is already loading.');
|
|
return createImportPromise(this, name, new Promise(asyncStartLoadPartwayThrough({
|
|
step: 'translate',
|
|
loader: this._loader,
|
|
moduleName: name,
|
|
moduleMetadata: options && options.metadata || {},
|
|
moduleSource: source,
|
|
moduleAddress: options && options.address
|
|
})));
|
|
},
|
|
// 26.3.3.3
|
|
'delete': function(name) {
|
|
var loader = this._loader;
|
|
delete loader.importPromises[name];
|
|
delete loader.moduleRecords[name];
|
|
return loader.modules[name] ? delete loader.modules[name] : false;
|
|
},
|
|
// 26.3.3.4 entries not implemented
|
|
// 26.3.3.5
|
|
get: function(key) {
|
|
if (!this._loader.modules[key])
|
|
return;
|
|
return this._loader.modules[key].module;
|
|
},
|
|
// 26.3.3.7
|
|
has: function(name) {
|
|
return !!this._loader.modules[name];
|
|
},
|
|
// 26.3.3.8
|
|
'import': function(name, parentName, parentAddress) {
|
|
if (typeof parentName == 'object')
|
|
parentName = parentName.name;
|
|
|
|
// run normalize first
|
|
var loaderObj = this;
|
|
|
|
// added, see https://bugs.ecmascript.org/show_bug.cgi?id=2659
|
|
return Promise.resolve(loaderObj.normalize(name, parentName))
|
|
.then(function(name) {
|
|
var loader = loaderObj._loader;
|
|
|
|
if (loader.modules[name])
|
|
return loader.modules[name].module;
|
|
|
|
return loader.importPromises[name] || createImportPromise(loaderObj, name,
|
|
loadModule(loader, name, {})
|
|
.then(function(load) {
|
|
delete loader.importPromises[name];
|
|
return load.module.module;
|
|
}));
|
|
});
|
|
},
|
|
// 26.3.3.9 keys not implemented
|
|
// 26.3.3.10
|
|
load: function(name) {
|
|
var loader = this._loader;
|
|
if (loader.modules[name])
|
|
return Promise.resolve();
|
|
return loader.importPromises[name] || createImportPromise(this, name, new Promise(asyncStartLoadPartwayThrough({
|
|
step: 'locate',
|
|
loader: loader,
|
|
moduleName: name,
|
|
moduleMetadata: {},
|
|
moduleSource: undefined,
|
|
moduleAddress: undefined
|
|
}))
|
|
.then(function() {
|
|
delete loader.importPromises[name];
|
|
}));
|
|
},
|
|
// 26.3.3.11
|
|
module: function(source, options) {
|
|
var load = createLoad();
|
|
load.address = options && options.address;
|
|
var linkSet = createLinkSet(this._loader, load);
|
|
var sourcePromise = Promise.resolve(source);
|
|
var loader = this._loader;
|
|
var p = linkSet.done.then(function() {
|
|
return load.module.module;
|
|
});
|
|
proceedToTranslate(loader, load, sourcePromise);
|
|
return p;
|
|
},
|
|
// 26.3.3.12
|
|
newModule: function (obj) {
|
|
if (typeof obj != 'object')
|
|
throw new TypeError('Expected object');
|
|
|
|
var m = new Module();
|
|
|
|
var pNames = [];
|
|
if (Object.getOwnPropertyNames && obj != null)
|
|
pNames = Object.getOwnPropertyNames(obj);
|
|
else
|
|
for (var key in obj)
|
|
pNames.push(key);
|
|
|
|
for (var i = 0; i < pNames.length; i++) (function(key) {
|
|
defineProperty(m, key, {
|
|
configurable: false,
|
|
enumerable: true,
|
|
get: function () {
|
|
return obj[key];
|
|
},
|
|
set: function() {
|
|
throw new Error('Module exports cannot be changed externally.');
|
|
}
|
|
});
|
|
})(pNames[i]);
|
|
|
|
if (Object.freeze)
|
|
Object.freeze(m);
|
|
|
|
return m;
|
|
},
|
|
// 26.3.3.14
|
|
set: function(name, module) {
|
|
if (!(module instanceof Module))
|
|
throw new TypeError('Loader.set(' + name + ', module) must be a module');
|
|
this._loader.modules[name] = {
|
|
module: module
|
|
};
|
|
},
|
|
// 26.3.3.15 values not implemented
|
|
// 26.3.3.16 @@iterator not implemented
|
|
// 26.3.3.17 @@toStringTag not implemented
|
|
|
|
// 26.3.3.18.1
|
|
normalize: function(name, referrerName, referrerAddress) {},
|
|
// 26.3.3.18.2
|
|
locate: function(load) {
|
|
return load.name;
|
|
},
|
|
// 26.3.3.18.3
|
|
fetch: function(load) {
|
|
},
|
|
// 26.3.3.18.4
|
|
translate: function(load) {
|
|
return load.source;
|
|
},
|
|
// 26.3.3.18.5
|
|
instantiate: function(load) {
|
|
}
|
|
};
|
|
|
|
var _newModule = Loader.prototype.newModule;
|
|
|
|
/*
|
|
* ES6 Module Declarative Linking Code
|
|
*/
|
|
function link(linkSet, linkError) {
|
|
|
|
var loader = linkSet.loader;
|
|
|
|
if (!linkSet.loads.length)
|
|
return;
|
|
|
|
var loads = linkSet.loads.concat([]);
|
|
|
|
for (var i = 0; i < loads.length; i++) {
|
|
var load = loads[i];
|
|
|
|
var module = doDynamicExecute(linkSet, load, linkError);
|
|
if (!module)
|
|
return;
|
|
load.module = {
|
|
name: load.name,
|
|
module: module
|
|
};
|
|
load.status = 'linked';
|
|
|
|
finishLoad(loader, load);
|
|
}
|
|
}
|
|
|
|
})();
|
|
|
|
var System;
|
|
|
|
// SystemJS Loader Class and Extension helpers
|
|
function SystemJSLoader() {
|
|
Loader.call(this);
|
|
|
|
this.paths = {};
|
|
this._loader.paths = {};
|
|
|
|
systemJSConstructor.call(this);
|
|
}
|
|
|
|
// inline Object.create-style class extension
|
|
function SystemProto() {};
|
|
SystemProto.prototype = Loader.prototype;
|
|
SystemJSLoader.prototype = new SystemProto();
|
|
SystemJSLoader.prototype.constructor = SystemJSLoader;
|
|
|
|
var systemJSConstructor;
|
|
|
|
function hook(name, hook) {
|
|
SystemJSLoader.prototype[name] = hook(SystemJSLoader.prototype[name] || function() {});
|
|
}
|
|
function hookConstructor(hook) {
|
|
systemJSConstructor = hook(systemJSConstructor || function() {});
|
|
}
|
|
|
|
|
|
var absURLRegEx = /^[^\/]+:\/\//;
|
|
function isAbsolute(name) {
|
|
return name.match(absURLRegEx);
|
|
}
|
|
function isRel(name) {
|
|
return (name[0] == '.' && (!name[1] || name[1] == '/' || name[1] == '.')) || name[0] == '/';
|
|
}
|
|
function isPlain(name) {
|
|
return !isRel(name) && !isAbsolute(name);
|
|
}
|
|
|
|
var baseURIObj = new URL(baseURI);
|
|
|
|
function urlResolve(name, parent) {
|
|
// url resolution shortpaths
|
|
if (name[0] == '.') {
|
|
// dot-relative url normalization
|
|
if (name[1] == '/' && name[2] != '.')
|
|
return (parent && parent.substr(0, parent.lastIndexOf('/') + 1) || baseURI) + name.substr(2);
|
|
}
|
|
else if (name[0] != '/' && name.indexOf(':') == -1) {
|
|
// plain parent normalization
|
|
return (parent && parent.substr(0, parent.lastIndexOf('/') + 1) || baseURI) + name;
|
|
}
|
|
|
|
return new URL(name, parent && parent.replace(/#/g, '%05') || baseURIObj).href.replace(/%05/g, '#');
|
|
}
|
|
|
|
// NB no specification provided for System.paths, used ideas discussed in https://github.com/jorendorff/js-loaders/issues/25
|
|
function applyPaths(loader, name) {
|
|
// most specific (most number of slashes in path) match wins
|
|
var pathMatch = '', wildcard, maxWildcardPrefixLen = 0;
|
|
|
|
var paths = loader.paths;
|
|
var pathsCache = loader._loader.paths;
|
|
|
|
// check to see if we have a paths entry
|
|
for (var p in paths) {
|
|
if (paths.hasOwnProperty && !paths.hasOwnProperty(p))
|
|
continue;
|
|
|
|
// paths sanitization
|
|
var path = paths[p];
|
|
if (path !== pathsCache[p])
|
|
path = paths[p] = pathsCache[p] = urlResolve(paths[p], isRel(paths[p]) ? baseURI : loader.baseURL);
|
|
|
|
// exact path match
|
|
if (p.indexOf('*') === -1) {
|
|
if (name == p)
|
|
return paths[p];
|
|
|
|
// support trailing / in paths rules
|
|
else if (name.substr(0, p.length - 1) == p.substr(0, p.length - 1) && (name.length < p.length || name[p.length - 1] == p[p.length - 1]) && (paths[p][paths[p].length - 1] == '/' || paths[p] == '')) {
|
|
return paths[p].substr(0, paths[p].length - 1) + (name.length > p.length ? (paths[p] && '/' || '') + name.substr(p.length) : '');
|
|
}
|
|
}
|
|
// wildcard path match
|
|
else {
|
|
var pathParts = p.split('*');
|
|
if (pathParts.length > 2)
|
|
throw new TypeError('Only one wildcard in a path is permitted');
|
|
|
|
var wildcardPrefixLen = pathParts[0].length;
|
|
if (wildcardPrefixLen >= maxWildcardPrefixLen &&
|
|
name.substr(0, pathParts[0].length) == pathParts[0] &&
|
|
name.substr(name.length - pathParts[1].length) == pathParts[1]) {
|
|
maxWildcardPrefixLen = wildcardPrefixLen;
|
|
pathMatch = p;
|
|
wildcard = name.substr(pathParts[0].length, name.length - pathParts[1].length - pathParts[0].length);
|
|
}
|
|
}
|
|
}
|
|
|
|
var outPath = paths[pathMatch];
|
|
if (typeof wildcard == 'string')
|
|
outPath = outPath.replace('*', wildcard);
|
|
|
|
return outPath;
|
|
}
|
|
|
|
function dedupe(deps) {
|
|
var newDeps = [];
|
|
for (var i = 0, l = deps.length; i < l; i++)
|
|
if (indexOf.call(newDeps, deps[i]) == -1)
|
|
newDeps.push(deps[i])
|
|
return newDeps;
|
|
}
|
|
|
|
function group(deps) {
|
|
var names = [];
|
|
var indices = [];
|
|
for (var i = 0, l = deps.length; i < l; i++) {
|
|
var index = indexOf.call(names, deps[i]);
|
|
if (index === -1) {
|
|
names.push(deps[i]);
|
|
indices.push([i]);
|
|
}
|
|
else {
|
|
indices[index].push(i);
|
|
}
|
|
}
|
|
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 SystemJS.newModule
|
|
function getESModule(exports) {
|
|
var esModule = {};
|
|
// don't trigger getters/setters in environments that support them
|
|
if ((typeof exports == 'object' || typeof exports == 'function') && exports !== __global) {
|
|
if (getOwnPropertyDescriptor) {
|
|
for (var p in exports) {
|
|
// The default property is copied to esModule later on
|
|
if (p === 'default')
|
|
continue;
|
|
defineOrCopyProperty(esModule, exports, p);
|
|
}
|
|
}
|
|
else {
|
|
extend(esModule, exports);
|
|
}
|
|
}
|
|
esModule['default'] = exports;
|
|
defineProperty(esModule, '__useDefault', {
|
|
value: true
|
|
});
|
|
return esModule;
|
|
}
|
|
|
|
function defineOrCopyProperty(targetObj, sourceObj, propName) {
|
|
try {
|
|
var d;
|
|
if (d = Object.getOwnPropertyDescriptor(sourceObj, propName))
|
|
defineProperty(targetObj, propName, d);
|
|
}
|
|
catch (ex) {
|
|
// Object.getOwnPropertyDescriptor threw an exception, fall back to normal set property
|
|
// we dont need hasOwnProperty here because getOwnPropertyDescriptor would have returned undefined above
|
|
targetObj[propName] = sourceObj[propName];
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function extend(a, b, prepend) {
|
|
var hasOwnProperty = b && b.hasOwnProperty;
|
|
for (var p in b) {
|
|
if (hasOwnProperty && !b.hasOwnProperty(p))
|
|
continue;
|
|
if (!prepend || !(p in a))
|
|
a[p] = b[p];
|
|
}
|
|
return a;
|
|
}
|
|
|
|
// meta first-level extends where:
|
|
// array + array appends
|
|
// object + object extends
|
|
// other properties replace
|
|
function extendMeta(a, b, prepend) {
|
|
var hasOwnProperty = b && b.hasOwnProperty;
|
|
for (var p in b) {
|
|
if (hasOwnProperty && !b.hasOwnProperty(p))
|
|
continue;
|
|
var val = b[p];
|
|
if (!(p in a))
|
|
a[p] = val;
|
|
else if (val instanceof Array && a[p] instanceof Array)
|
|
a[p] = [].concat(prepend ? val : a[p]).concat(prepend ? a[p] : val);
|
|
else if (typeof val == 'object' && val !== null && typeof a[p] == 'object')
|
|
a[p] = extend(extend({}, a[p]), val, prepend);
|
|
else if (!prepend)
|
|
a[p] = val;
|
|
}
|
|
}
|
|
|
|
function extendPkgConfig(pkgCfgA, pkgCfgB, pkgName, loader, warnInvalidProperties) {
|
|
for (var prop in pkgCfgB) {
|
|
if (indexOf.call(['main', 'format', 'defaultExtension', 'basePath'], prop) != -1) {
|
|
pkgCfgA[prop] = pkgCfgB[prop];
|
|
}
|
|
else if (prop == 'map') {
|
|
extend(pkgCfgA.map = pkgCfgA.map || {}, pkgCfgB.map);
|
|
}
|
|
else if (prop == 'meta') {
|
|
extend(pkgCfgA.meta = pkgCfgA.meta || {}, pkgCfgB.meta);
|
|
}
|
|
else if (prop == 'depCache') {
|
|
for (var d in pkgCfgB.depCache) {
|
|
var dNormalized;
|
|
|
|
if (d.substr(0, 2) == './')
|
|
dNormalized = pkgName + '/' + d.substr(2);
|
|
else
|
|
dNormalized = coreResolve.call(loader, d);
|
|
loader.depCache[dNormalized] = (loader.depCache[dNormalized] || []).concat(pkgCfgB.depCache[d]);
|
|
}
|
|
}
|
|
else if (warnInvalidProperties && indexOf.call(['browserConfig', 'nodeConfig', 'devConfig', 'productionConfig'], prop) == -1 &&
|
|
(!pkgCfgB.hasOwnProperty || pkgCfgB.hasOwnProperty(prop))) {
|
|
warn.call(loader, '"' + prop + '" is not a valid package configuration option in package ' + pkgName);
|
|
}
|
|
}
|
|
}
|
|
|
|
// deeply-merge (to first level) config with any existing package config
|
|
function setPkgConfig(loader, pkgName, cfg, prependConfig) {
|
|
var pkg;
|
|
|
|
// first package is config by reference for fast path, cloned after that
|
|
if (!loader.packages[pkgName]) {
|
|
pkg = loader.packages[pkgName] = cfg;
|
|
}
|
|
else {
|
|
var basePkg = loader.packages[pkgName];
|
|
pkg = loader.packages[pkgName] = {};
|
|
|
|
extendPkgConfig(pkg, prependConfig ? cfg : basePkg, pkgName, loader, prependConfig);
|
|
extendPkgConfig(pkg, prependConfig ? basePkg : cfg, pkgName, loader, !prependConfig);
|
|
}
|
|
|
|
// main object becomes main map
|
|
if (typeof pkg.main == 'object') {
|
|
pkg.map = pkg.map || {};
|
|
pkg.map['./@main'] = pkg.main;
|
|
pkg.main['default'] = pkg.main['default'] || './';
|
|
pkg.main = '@main';
|
|
}
|
|
|
|
return pkg;
|
|
}
|
|
|
|
function warn(msg) {
|
|
if (this.warnings && typeof console != 'undefined' && console.warn)
|
|
console.warn(msg);
|
|
}
|
|
var absURLRegEx = /^([^\/]+:\/\/|\/)/;
|
|
|
|
// Normalization with module names as absolute URLs
|
|
SystemJSLoader.prototype.normalize = function(name, parentName, parentAddress) {
|
|
// NB does `import 'file.js'` import relative to the parent name or baseURL?
|
|
// have assumed that it is baseURL-relative here, but spec may well align with URLs to be the latter
|
|
// safe option for users is to always use "./file.js" for relative
|
|
|
|
// not absolute or relative -> apply paths (what will be sites)
|
|
if (!name.match(absURLRegEx) && name[0] != '.')
|
|
name = new URL(applyPaths(this, name) || name, baseURI).href;
|
|
// apply parent-relative normalization, parentAddress is already normalized
|
|
else
|
|
name = new URL(name, parentName || baseURI).href;
|
|
|
|
return name;
|
|
};
|
|
|
|
// default locate is this
|
|
/*
|
|
SystemJSLoader.prototype.locate = function(load) {
|
|
return load.name;
|
|
};
|
|
*//*
|
|
* Script tag fetch
|
|
*
|
|
* When load.metadata.scriptLoad is true, we load via script tag injection.
|
|
*/
|
|
(function() {
|
|
|
|
if (typeof document != 'undefined')
|
|
var head = document.getElementsByTagName('head')[0];
|
|
|
|
var curSystem;
|
|
var curRequire;
|
|
|
|
// if doing worker executing, this is set to the load record being executed
|
|
var workerLoad = null;
|
|
|
|
// interactive mode handling method courtesy RequireJS
|
|
var ieEvents = head && (function() {
|
|
var s = document.createElement('script');
|
|
var isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]';
|
|
return s.attachEvent && !(s.attachEvent.toString && s.attachEvent.toString().indexOf('[native code') < 0) && !isOpera;
|
|
})();
|
|
|
|
// IE interactive-only part
|
|
// we store loading scripts array as { script: <script>, load: {...} }
|
|
var interactiveLoadingScripts = [];
|
|
var interactiveScript;
|
|
function getInteractiveScriptLoad() {
|
|
if (interactiveScript && interactiveScript.script.readyState === 'interactive')
|
|
return interactiveScript.load;
|
|
|
|
for (var i = 0; i < interactiveLoadingScripts.length; i++)
|
|
if (interactiveLoadingScripts[i].script.readyState == 'interactive') {
|
|
interactiveScript = interactiveLoadingScripts[i];
|
|
return interactiveScript.load;
|
|
}
|
|
}
|
|
|
|
// System.register, System.registerDynamic, AMD define pipeline
|
|
// this is called by the above methods when they execute
|
|
// we then run the reduceRegister_ collection function either immediately
|
|
// if we are in IE and know the currently executing script (interactive)
|
|
// or later if we need to wait for the synchronous load callback to know the script
|
|
var loadingCnt = 0;
|
|
var registerQueue = [];
|
|
hook('pushRegister_', function(pushRegister) {
|
|
return function(register) {
|
|
// if using eval-execution then skip
|
|
if (pushRegister.call(this, register))
|
|
return false;
|
|
|
|
// if using worker execution, then we're done
|
|
if (workerLoad)
|
|
this.reduceRegister_(workerLoad, register);
|
|
|
|
// detect if we know the currently executing load (IE)
|
|
// if so, immediately call reduceRegister
|
|
else if (ieEvents)
|
|
this.reduceRegister_(getInteractiveScriptLoad(), register);
|
|
|
|
// otherwise, add to our execution queue
|
|
// to call reduceRegister on sync script load event
|
|
else if (loadingCnt)
|
|
registerQueue.push(register);
|
|
|
|
// if we're not currently loading anything though
|
|
// then do the reduction against a null load
|
|
// (out of band named define or named register)
|
|
// note even in non-script environments, this catch is used
|
|
else
|
|
this.reduceRegister_(null, register);
|
|
|
|
return true;
|
|
};
|
|
});
|
|
|
|
function webWorkerImport(loader, load) {
|
|
return new Promise(function(resolve, reject) {
|
|
if (load.metadata.integrity)
|
|
reject(new Error('Subresource integrity checking is not supported in web workers.'));
|
|
|
|
workerLoad = load;
|
|
try {
|
|
importScripts(load.address);
|
|
}
|
|
catch(e) {
|
|
workerLoad = null;
|
|
reject(e);
|
|
}
|
|
workerLoad = null;
|
|
|
|
// if nothing registered, then something went wrong
|
|
if (!load.metadata.entry)
|
|
reject(new Error(load.address + ' did not call System.register or AMD define. If loading a global, ensure the meta format is set to global.'));
|
|
|
|
resolve('');
|
|
});
|
|
}
|
|
|
|
// override fetch to use script injection
|
|
hook('fetch', function(fetch) {
|
|
return function(load) {
|
|
var loader = this;
|
|
|
|
if (load.metadata.format == 'json' || !load.metadata.scriptLoad || (!isBrowser && !isWorker))
|
|
return fetch.call(this, load);
|
|
|
|
if (isWorker)
|
|
return webWorkerImport(loader, load);
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
var s = document.createElement('script');
|
|
|
|
s.async = true;
|
|
|
|
if (load.metadata.crossOrigin)
|
|
s.crossOrigin = load.metadata.crossOrigin;
|
|
|
|
if (load.metadata.integrity)
|
|
s.setAttribute('integrity', load.metadata.integrity);
|
|
|
|
if (ieEvents) {
|
|
s.attachEvent('onreadystatechange', complete);
|
|
interactiveLoadingScripts.push({
|
|
script: s,
|
|
load: load
|
|
});
|
|
}
|
|
else {
|
|
s.addEventListener('load', complete, false);
|
|
s.addEventListener('error', error, false);
|
|
}
|
|
|
|
loadingCnt++;
|
|
|
|
curSystem = __global.System;
|
|
curRequire = __global.require;
|
|
|
|
s.src = load.address;
|
|
head.appendChild(s);
|
|
|
|
function complete(evt) {
|
|
if (s.readyState && s.readyState != 'loaded' && s.readyState != 'complete')
|
|
return;
|
|
|
|
loadingCnt--;
|
|
|
|
// complete call is sync on execution finish
|
|
// (in ie already done reductions)
|
|
if (!load.metadata.entry && !registerQueue.length) {
|
|
loader.reduceRegister_(load);
|
|
}
|
|
else if (!ieEvents) {
|
|
for (var i = 0; i < registerQueue.length; i++)
|
|
loader.reduceRegister_(load, registerQueue[i]);
|
|
registerQueue = [];
|
|
}
|
|
|
|
cleanup();
|
|
|
|
// if nothing registered, then something went wrong
|
|
if (!load.metadata.entry && !load.metadata.bundle)
|
|
reject(new Error(load.name + ' did not call System.register or AMD define. If loading a global module configure the global name via the meta exports property for script injection support.'));
|
|
|
|
resolve('');
|
|
}
|
|
|
|
function error(evt) {
|
|
cleanup();
|
|
reject(new Error('Unable to load script ' + load.address));
|
|
}
|
|
|
|
function cleanup() {
|
|
__global.System = curSystem;
|
|
__global.require = curRequire;
|
|
|
|
if (s.detachEvent) {
|
|
s.detachEvent('onreadystatechange', complete);
|
|
for (var i = 0; i < interactiveLoadingScripts.length; i++)
|
|
if (interactiveLoadingScripts[i].script == s) {
|
|
if (interactiveScript && interactiveScript.script == s)
|
|
interactiveScript = null;
|
|
interactiveLoadingScripts.splice(i, 1);
|
|
}
|
|
}
|
|
else {
|
|
s.removeEventListener('load', complete, false);
|
|
s.removeEventListener('error', error, false);
|
|
}
|
|
|
|
head.removeChild(s);
|
|
}
|
|
});
|
|
};
|
|
});
|
|
})();
|
|
/*
|
|
* 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
|
|
*
|
|
*
|
|
* The code here replicates the ES6 linking groups algorithm to ensure that
|
|
* circular ES6 compiled into System.register can work alongside circular AMD
|
|
* and CommonJS, identically to the actual ES6 loader.
|
|
*
|
|
*/
|
|
|
|
|
|
/*
|
|
* Registry side table entries in loader.defined
|
|
* Registry Entry Contains:
|
|
* - name
|
|
* - deps
|
|
* - declare for declarative modules
|
|
* - execute for dynamic modules, different to declarative execute on module
|
|
* - executingRequire indicates require drives execution for circularity of dynamic modules
|
|
* - declarative optional boolean indicating which of the above
|
|
*
|
|
* Can preload modules directly on SystemJS.defined['my/module'] = { deps, execute, executingRequire }
|
|
*
|
|
* Then the entry gets populated with derived information during processing:
|
|
* - normalizedDeps derived from deps, created in instantiate
|
|
* - groupIndex used by group linking algorithm
|
|
* - evaluated indicating whether evaluation has happend
|
|
* - module the module record object, containing:
|
|
* - exports actual module exports
|
|
*
|
|
* For dynamic we track the es module with:
|
|
* - esModule actual es module value
|
|
* - esmExports whether to extend the esModule with named exports
|
|
*
|
|
* Then for declarative only we track dynamic bindings with the 'module' records:
|
|
* - name
|
|
* - exports
|
|
* - setters declarative setter functions
|
|
* - dependencies, module records of dependencies
|
|
* - importers, module records of dependents
|
|
*
|
|
* After linked and evaluated, entries are removed, declarative module records remain in separate
|
|
* module binding table
|
|
*
|
|
*/
|
|
|
|
var leadingCommentAndMetaRegEx = /^(\s*\/\*[^\*]*(\*(?!\/)[^\*]*)*\*\/|\s*\/\/[^\n]*|\s*"[^"]+"\s*;?|\s*'[^']+'\s*;?)*\s*/;
|
|
function detectRegisterFormat(source) {
|
|
var leadingCommentAndMeta = source.match(leadingCommentAndMetaRegEx);
|
|
return leadingCommentAndMeta && source.substr(leadingCommentAndMeta[0].length, 15) == 'System.register';
|
|
}
|
|
|
|
function createEntry() {
|
|
return {
|
|
name: null,
|
|
deps: null,
|
|
originalIndices: null,
|
|
declare: null,
|
|
execute: null,
|
|
executingRequire: false,
|
|
declarative: false,
|
|
normalizedDeps: null,
|
|
groupIndex: null,
|
|
evaluated: false,
|
|
module: null,
|
|
esModule: null,
|
|
esmExports: false
|
|
};
|
|
}
|
|
|
|
(function() {
|
|
|
|
/*
|
|
* There are two variations of System.register:
|
|
* 1. System.register for ES6 conversion (2-3 params) - System.register([name, ]deps, declare)
|
|
* see https://github.com/ModuleLoader/es6-module-loader/wiki/System.register-Explained
|
|
*
|
|
* 2. System.registerDynamic for dynamic modules (3-4 params) - System.registerDynamic([name, ]deps, executingRequire, execute)
|
|
* the true or false statement
|
|
*
|
|
* this extension implements the linking algorithm for the two variations identical to the spec
|
|
* allowing compiled ES6 circular references to work alongside AMD and CJS circular references.
|
|
*
|
|
*/
|
|
SystemJSLoader.prototype.register = function(name, deps, declare) {
|
|
if (typeof name != 'string') {
|
|
declare = deps;
|
|
deps = name;
|
|
name = null;
|
|
}
|
|
|
|
// dynamic backwards-compatibility
|
|
// can be deprecated eventually
|
|
if (typeof declare == 'boolean')
|
|
return this.registerDynamic.apply(this, arguments);
|
|
|
|
var entry = createEntry();
|
|
// ideally wouldn't apply map config to bundle names but
|
|
// dependencies go through map regardless so we can't restrict
|
|
// could reconsider in shift to new spec
|
|
entry.name = name && (this.decanonicalize || this.normalize).call(this, name);
|
|
entry.declarative = true;
|
|
entry.deps = deps;
|
|
entry.declare = declare;
|
|
|
|
this.pushRegister_({
|
|
amd: false,
|
|
entry: entry
|
|
});
|
|
};
|
|
SystemJSLoader.prototype.registerDynamic = function(name, deps, declare, execute) {
|
|
if (typeof name != 'string') {
|
|
execute = declare;
|
|
declare = deps;
|
|
deps = name;
|
|
name = null;
|
|
}
|
|
|
|
// dynamic
|
|
var entry = createEntry();
|
|
entry.name = name && (this.decanonicalize || this.normalize).call(this, name);
|
|
entry.deps = deps;
|
|
entry.execute = execute;
|
|
entry.executingRequire = declare;
|
|
|
|
this.pushRegister_({
|
|
amd: false,
|
|
entry: entry
|
|
});
|
|
};
|
|
hook('reduceRegister_', function() {
|
|
return function(load, register) {
|
|
if (!register)
|
|
return;
|
|
|
|
var entry = register.entry;
|
|
var curMeta = load && load.metadata;
|
|
|
|
// named register
|
|
if (entry.name) {
|
|
if (!(entry.name in this.defined))
|
|
this.defined[entry.name] = entry;
|
|
|
|
if (curMeta)
|
|
curMeta.bundle = true;
|
|
}
|
|
// anonymous register
|
|
if (!entry.name || load && !curMeta.entry && entry.name == load.name) {
|
|
if (!curMeta)
|
|
throw new TypeError('Invalid System.register call. Anonymous System.register calls can only be made by modules loaded by SystemJS.import and not via script tags.');
|
|
if (curMeta.entry) {
|
|
if (curMeta.format == 'register')
|
|
throw new Error('Multiple anonymous System.register calls in module ' + load.name + '. If loading a bundle, ensure all the System.register calls are named.');
|
|
else
|
|
throw new Error('Module ' + load.name + ' interpreted as ' + curMeta.format + ' module format, but called System.register.');
|
|
}
|
|
if (!curMeta.format)
|
|
curMeta.format = 'register';
|
|
curMeta.entry = entry;
|
|
}
|
|
};
|
|
});
|
|
|
|
hookConstructor(function(constructor) {
|
|
return function() {
|
|
constructor.call(this);
|
|
|
|
this.defined = {};
|
|
this._loader.moduleRecords = {};
|
|
};
|
|
});
|
|
|
|
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, l = entry.normalizedDeps.length; i < l; i++) {
|
|
var depName = entry.normalizedDeps[i];
|
|
var depEntry = loader.defined[depName];
|
|
|
|
// not in the registry means already linked / ES6
|
|
if (!depEntry || depEntry.evaluated)
|
|
continue;
|
|
|
|
// now we know the entry is in our unlinked linkage group
|
|
var depGroupIndex = entry.groupIndex + (depEntry.declarative != entry.declarative);
|
|
|
|
// the group index of an entry is always the maximum
|
|
if (depEntry.groupIndex === null || depEntry.groupIndex < depGroupIndex) {
|
|
|
|
// if already in a group, remove from the old group
|
|
if (depEntry.groupIndex !== null) {
|
|
groups[depEntry.groupIndex].splice(indexOf.call(groups[depEntry.groupIndex], depEntry), 1);
|
|
|
|
// if the old group is empty, then we have a mixed depndency cycle
|
|
if (groups[depEntry.groupIndex].length == 0)
|
|
throw new Error("Mixed dependency cycle detected");
|
|
}
|
|
|
|
depEntry.groupIndex = depGroupIndex;
|
|
}
|
|
|
|
buildGroups(depEntry, loader, groups);
|
|
}
|
|
}
|
|
|
|
function link(name, startEntry, loader) {
|
|
// skip if already linked
|
|
if (startEntry.module)
|
|
return;
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
// module binding records
|
|
function ModuleRecord() {}
|
|
defineProperty(ModuleRecord, 'toString', {
|
|
value: function() {
|
|
return 'Module';
|
|
}
|
|
});
|
|
|
|
function getOrCreateModuleRecord(name, moduleRecords) {
|
|
return moduleRecords[name] || (moduleRecords[name] = {
|
|
name: name,
|
|
dependencies: [],
|
|
exports: new ModuleRecord(), // start from an empty module and extend
|
|
importers: []
|
|
});
|
|
}
|
|
|
|
function linkDeclarativeModule(entry, loader) {
|
|
// only link if already not already started linking (stops at circular)
|
|
if (entry.module)
|
|
return;
|
|
|
|
var moduleRecords = loader._loader.moduleRecords;
|
|
var module = entry.module = getOrCreateModuleRecord(entry.name, moduleRecords);
|
|
var exports = entry.module.exports;
|
|
|
|
var declaration = entry.declare.call(__global, function(name, value) {
|
|
module.locked = true;
|
|
|
|
if (typeof name == 'object') {
|
|
for (var p in name)
|
|
exports[p] = name[p];
|
|
}
|
|
else {
|
|
exports[name] = value;
|
|
}
|
|
|
|
for (var i = 0, l = module.importers.length; i < l; i++) {
|
|
var importerModule = module.importers[i];
|
|
if (!importerModule.locked) {
|
|
var importerIndex = indexOf.call(importerModule.dependencies, module);
|
|
var setter = importerModule.setters[importerIndex];
|
|
if (setter)
|
|
setter(exports);
|
|
}
|
|
}
|
|
|
|
module.locked = false;
|
|
return value;
|
|
}, { id: entry.name });
|
|
|
|
if (typeof declaration == 'function')
|
|
declaration = { setters: [], execute: declaration };
|
|
|
|
// allowing undefined declaration was a mistake! To be deprecated.
|
|
declaration = declaration || { setters: [], execute: function() {} };
|
|
|
|
module.setters = declaration.setters;
|
|
module.execute = declaration.execute;
|
|
|
|
if (!module.setters || !module.execute) {
|
|
throw new TypeError('Invalid System.register form for ' + entry.name);
|
|
}
|
|
|
|
// now link all the module dependencies
|
|
for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) {
|
|
var depName = entry.normalizedDeps[i];
|
|
var depEntry = loader.defined[depName];
|
|
var depModule = moduleRecords[depName];
|
|
|
|
// work out how to set depExports based on scenarios...
|
|
var depExports;
|
|
|
|
if (depModule) {
|
|
depExports = depModule.exports;
|
|
}
|
|
// dynamic, already linked in our registry
|
|
else if (depEntry && !depEntry.declarative) {
|
|
depExports = depEntry.esModule;
|
|
}
|
|
// in the loader registry
|
|
else if (!depEntry) {
|
|
depExports = loader.get(depName);
|
|
}
|
|
// we have an entry -> link
|
|
else {
|
|
linkDeclarativeModule(depEntry, loader);
|
|
depModule = depEntry.module;
|
|
depExports = depModule.exports;
|
|
}
|
|
|
|
// only declarative modules have dynamic bindings
|
|
if (depModule && depModule.importers) {
|
|
depModule.importers.push(module);
|
|
module.dependencies.push(depModule);
|
|
}
|
|
else {
|
|
module.dependencies.push(null);
|
|
}
|
|
|
|
// run setters for all entries with the matching dependency name
|
|
var originalIndices = entry.originalIndices[i];
|
|
for (var j = 0, len = originalIndices.length; j < len; ++j) {
|
|
var index = originalIndices[j];
|
|
if (module.setters[index]) {
|
|
module.setters[index](depExports);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// An analog to loader.get covering execution of all three layers (real declarative, simulated declarative, simulated dynamic)
|
|
function getModule(name, loader) {
|
|
var exports;
|
|
var entry = loader.defined[name];
|
|
|
|
if (!entry) {
|
|
exports = loader.get(name);
|
|
if (!exports)
|
|
throw new Error('Unable to load dependency ' + name + '.');
|
|
}
|
|
|
|
else {
|
|
if (entry.declarative)
|
|
ensureEvaluated(name, entry, [], loader);
|
|
|
|
else if (!entry.evaluated)
|
|
linkDynamicModule(entry, loader);
|
|
|
|
exports = entry.module.exports;
|
|
}
|
|
|
|
if ((!entry || entry.declarative) && exports && exports.__useDefault)
|
|
return exports['default'];
|
|
|
|
return exports;
|
|
}
|
|
|
|
function linkDynamicModule(entry, loader) {
|
|
if (entry.module)
|
|
return;
|
|
|
|
var exports = {};
|
|
|
|
var module = entry.module = { exports: exports, id: entry.name };
|
|
|
|
// AMD requires execute the tree first
|
|
if (!entry.executingRequire) {
|
|
for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) {
|
|
var depName = entry.normalizedDeps[i];
|
|
// we know we only need to link dynamic due to linking algorithm
|
|
var depEntry = loader.defined[depName];
|
|
if (depEntry)
|
|
linkDynamicModule(depEntry, loader);
|
|
}
|
|
}
|
|
|
|
// now execute
|
|
entry.evaluated = true;
|
|
var output = entry.execute.call(__global, function(name) {
|
|
for (var i = 0, l = entry.deps.length; i < l; i++) {
|
|
if (entry.deps[i] != name)
|
|
continue;
|
|
return getModule(entry.normalizedDeps[i], loader);
|
|
}
|
|
// try and normalize the dependency to see if we have another form
|
|
var nameNormalized = loader.normalizeSync(name, entry.name);
|
|
if (indexOf.call(entry.normalizedDeps, nameNormalized) != -1)
|
|
return getModule(nameNormalized, loader);
|
|
|
|
throw new Error('Module ' + name + ' not declared as a dependency of ' + entry.name);
|
|
}, exports, module);
|
|
|
|
if (output !== undefined)
|
|
module.exports = output;
|
|
|
|
// create the esModule object, which allows ES6 named imports of dynamics
|
|
exports = module.exports;
|
|
|
|
// __esModule flag treats as already-named
|
|
if (exports && (exports.__esModule || exports instanceof Module))
|
|
entry.esModule = loader.newModule(exports);
|
|
// set module as 'default' export, then fake named exports by iterating properties
|
|
else if (entry.esmExports && exports !== __global)
|
|
entry.esModule = loader.newModule(getESModule(exports));
|
|
// just use the 'default' export
|
|
else
|
|
entry.esModule = loader.newModule({ 'default': exports, __useDefault: true });
|
|
}
|
|
|
|
/*
|
|
* 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 we evaluate the module itself depth-first left to right
|
|
* execution to match ES6 modules
|
|
*/
|
|
function ensureEvaluated(moduleName, entry, seen, loader) {
|
|
// if already seen, that means it's an already-evaluated non circular dependency
|
|
if (!entry || entry.evaluated || !entry.declarative)
|
|
return;
|
|
|
|
// this only applies to declarative modules which late-execute
|
|
|
|
seen.push(moduleName);
|
|
|
|
for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) {
|
|
var depName = entry.normalizedDeps[i];
|
|
if (indexOf.call(seen, depName) == -1) {
|
|
if (!loader.defined[depName])
|
|
loader.get(depName);
|
|
else
|
|
ensureEvaluated(depName, loader.defined[depName], seen, loader);
|
|
}
|
|
}
|
|
|
|
if (entry.evaluated)
|
|
return;
|
|
|
|
entry.evaluated = true;
|
|
entry.module.execute.call(__global);
|
|
}
|
|
|
|
// override the delete method to also clear the register caches
|
|
hook('delete', function(del) {
|
|
return function(name) {
|
|
delete this._loader.moduleRecords[name];
|
|
delete this.defined[name];
|
|
return del.call(this, name);
|
|
};
|
|
});
|
|
|
|
hook('fetch', function(fetch) {
|
|
return function(load) {
|
|
if (this.defined[load.name]) {
|
|
load.metadata.format = 'defined';
|
|
return '';
|
|
}
|
|
|
|
load.metadata.deps = load.metadata.deps || [];
|
|
|
|
return fetch.call(this, load);
|
|
};
|
|
});
|
|
|
|
hook('translate', function(translate) {
|
|
// we run the meta detection here (register is after meta)
|
|
return function(load) {
|
|
load.metadata.deps = load.metadata.deps || [];
|
|
return Promise.resolve(translate.apply(this, arguments)).then(function(source) {
|
|
// run detection for register format
|
|
if (load.metadata.format == 'register' || !load.metadata.format && detectRegisterFormat(load.source))
|
|
load.metadata.format = 'register';
|
|
return source;
|
|
});
|
|
};
|
|
});
|
|
|
|
// implement a perforance shortpath for System.load with no deps
|
|
hook('load', function(doLoad) {
|
|
return function(normalized) {
|
|
var loader = this;
|
|
var entry = loader.defined[normalized];
|
|
|
|
if (!entry || entry.deps.length)
|
|
return doLoad.apply(this, arguments);
|
|
|
|
entry.originalIndices = entry.normalizedDeps = [];
|
|
|
|
// recursively ensure that the module and all its
|
|
// dependencies are linked (with dependency group handling)
|
|
link(normalized, entry, loader);
|
|
|
|
// now handle dependency execution in correct order
|
|
ensureEvaluated(normalized, entry, [], loader);
|
|
if (!entry.esModule)
|
|
entry.esModule = loader.newModule(entry.module.exports);
|
|
|
|
// remove from the registry
|
|
if (!loader.trace)
|
|
loader.defined[normalized] = undefined;
|
|
|
|
// return the defined module object
|
|
loader.set(normalized, entry.esModule);
|
|
|
|
return Promise.resolve();
|
|
};
|
|
});
|
|
|
|
hook('instantiate', function(instantiate) {
|
|
return function(load) {
|
|
if (load.metadata.format == 'detect')
|
|
load.metadata.format = undefined;
|
|
|
|
// assumes previous instantiate is sync
|
|
// (core json support)
|
|
instantiate.call(this, load);
|
|
|
|
var loader = this;
|
|
|
|
var entry;
|
|
|
|
// first we check if this module has already been defined in the registry
|
|
if (loader.defined[load.name]) {
|
|
entry = loader.defined[load.name];
|
|
// don't support deps for ES modules
|
|
if (!entry.declarative)
|
|
entry.deps = entry.deps.concat(load.metadata.deps);
|
|
entry.deps = entry.deps.concat(load.metadata.deps);
|
|
}
|
|
|
|
// picked up already by an anonymous System.register script injection
|
|
// or via the dynamic formats
|
|
else if (load.metadata.entry) {
|
|
entry = load.metadata.entry;
|
|
entry.deps = entry.deps.concat(load.metadata.deps);
|
|
}
|
|
|
|
// Contains System.register calls
|
|
// (dont run bundles in the builder)
|
|
else if (!(loader.builder && load.metadata.bundle)
|
|
&& (load.metadata.format == 'register' || load.metadata.format == 'esm' || load.metadata.format == 'es6')) {
|
|
|
|
if (typeof __exec != 'undefined')
|
|
__exec.call(loader, load);
|
|
|
|
if (!load.metadata.entry && !load.metadata.bundle)
|
|
throw new Error(load.name + ' detected as ' + load.metadata.format + ' but didn\'t execute.');
|
|
|
|
entry = load.metadata.entry;
|
|
|
|
// support metadata deps for System.register
|
|
if (entry && load.metadata.deps)
|
|
entry.deps = entry.deps.concat(load.metadata.deps);
|
|
}
|
|
|
|
// named bundles are just an empty module
|
|
if (!entry) {
|
|
entry = createEntry();
|
|
entry.deps = load.metadata.deps;
|
|
entry.execute = function() {};
|
|
}
|
|
|
|
// place this module onto defined for circular references
|
|
loader.defined[load.name] = entry;
|
|
|
|
var grouped = group(entry.deps);
|
|
|
|
entry.deps = grouped.names;
|
|
entry.originalIndices = grouped.indices;
|
|
entry.name = load.name;
|
|
entry.esmExports = load.metadata.esmExports !== false;
|
|
|
|
// first, normalize all dependencies
|
|
var normalizePromises = [];
|
|
for (var i = 0, l = entry.deps.length; i < l; i++)
|
|
normalizePromises.push(Promise.resolve(loader.normalize(entry.deps[i], load.name)));
|
|
|
|
return Promise.all(normalizePromises).then(function(normalizedDeps) {
|
|
|
|
entry.normalizedDeps = normalizedDeps;
|
|
|
|
return {
|
|
deps: entry.deps,
|
|
execute: function() {
|
|
// recursively ensure that the module and all its
|
|
// dependencies are linked (with dependency group handling)
|
|
link(load.name, entry, loader);
|
|
|
|
// now handle dependency execution in correct order
|
|
ensureEvaluated(load.name, entry, [], loader);
|
|
|
|
if (!entry.esModule)
|
|
entry.esModule = loader.newModule(entry.module.exports);
|
|
|
|
// remove from the registry
|
|
if (!loader.trace)
|
|
loader.defined[load.name] = undefined;
|
|
|
|
// return the defined module object
|
|
return entry.esModule;
|
|
}
|
|
};
|
|
});
|
|
};
|
|
});
|
|
})();
|
|
/*
|
|
System bundles
|
|
|
|
Allows a bundle module to be specified which will be dynamically
|
|
loaded before trying to load a given module.
|
|
|
|
For example:
|
|
SystemJS.bundles['mybundle'] = ['jquery', 'bootstrap/js/bootstrap']
|
|
|
|
Will result in a load to "mybundle" whenever a load to "jquery"
|
|
or "bootstrap/js/bootstrap" is made.
|
|
|
|
In this way, the bundle becomes the request that provides the module
|
|
*/
|
|
|
|
(function() {
|
|
// bundles support (just like RequireJS)
|
|
// bundle name is module name of bundle itself
|
|
// bundle is array of modules defined by the bundle
|
|
// when a module in the bundle is requested, the bundle is loaded instead
|
|
// of the form SystemJS.bundles['mybundle'] = ['jquery', 'bootstrap/js/bootstrap']
|
|
hookConstructor(function(constructor) {
|
|
return function() {
|
|
constructor.call(this);
|
|
this.bundles = {};
|
|
this._loader.loadedBundles = {};
|
|
};
|
|
});
|
|
|
|
// assign bundle metadata for bundle loads
|
|
hook('locate', function(locate) {
|
|
return function(load) {
|
|
var loader = this;
|
|
var matched = false;
|
|
|
|
if (!(load.name in loader.defined))
|
|
for (var b in loader.bundles) {
|
|
for (var i = 0; i < loader.bundles[b].length; i++) {
|
|
var curModule = loader.bundles[b][i];
|
|
|
|
if (curModule == load.name) {
|
|
matched = true;
|
|
break;
|
|
}
|
|
|
|
// wildcard in bundles does not include / boundaries
|
|
if (curModule.indexOf('*') != -1) {
|
|
var parts = curModule.split('*');
|
|
if (parts.length != 2) {
|
|
loader.bundles[b].splice(i--, 1);
|
|
continue;
|
|
}
|
|
|
|
if (load.name.substring(0, parts[0].length) == parts[0] &&
|
|
load.name.substr(load.name.length - parts[1].length, parts[1].length) == parts[1] &&
|
|
load.name.substr(parts[0].length, load.name.length - parts[1].length - parts[0].length).indexOf('/') == -1) {
|
|
matched = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (matched)
|
|
return loader['import'](b)
|
|
.then(function() {
|
|
return locate.call(loader, load);
|
|
});
|
|
}
|
|
|
|
return locate.call(loader, load);
|
|
};
|
|
});
|
|
})();
|
|
/*
|
|
* Script-only addition used for production loader
|
|
*
|
|
*/
|
|
hookConstructor(function(constructor) {
|
|
return function() {
|
|
constructor.apply(this, arguments);
|
|
__global.define = this.amdDefine;
|
|
};
|
|
});
|
|
|
|
hook('fetch', function(fetch) {
|
|
return function(load) {
|
|
load.metadata.scriptLoad = true;
|
|
return fetch.call(this, load);
|
|
};
|
|
});System = new SystemJSLoader();
|
|
|
|
__global.SystemJS = System;
|
|
System.version = '0.19.39 Register Only';
|
|
if (typeof module == 'object' && module.exports && typeof exports == 'object')
|
|
module.exports = System;
|
|
|
|
__global.System = System;
|
|
|
|
})(typeof self != 'undefined' ? self : global); |