UNPKG

awayjs-display

Version:
1,696 lines (1,442 loc) 142 kB
/* * SystemJS v0.19.25 */ (function() { function bootstrap() {// 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 windows file URLs to use / if (protocol == 'file:') 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) {} } } })(); function addToError(err, msg) { // parse the stack removing loader code lines for simplification if (!err.originalErr) { var stack = (err.stack || err.message || err).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 = (newStack ? newStack.join('\n\t') : err.message) + '\n\t' + msg; // Convert file:/// URLs to paths in Node if (!isBrowser) newMsg = newMsg.replace(isWindows ? /file:\/\/\//g : /file:\/\//g, ''); var newErr = new Error(newMsg, err.fileName, err.lineNumber); // Node needs stack adjustment for throw to show message if (!isBrowser) newErr.stack = newMsg; // Clearing the stack stops unnecessary loader lines showing else newErr.stack = null; // 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; } // sanitize out the hash and querystring 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 if (typeof location != 'undefined') { baseURI = __global.location.href; } 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 // 15.2.3.2.1 function createLoad(name) { return { status: 'loading', name: name, 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; console.assert(load.status == 'loading' || load.status == 'loaded', 'loading or loaded'); 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 }); }) ); } var anonCnt = 0; // 15.2.4.5 function proceedToTranslate(loader, load, p) { p // 15.2.4.5.1 CallTranslate .then(function(source) { if (load.status != 'loading') return; 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) { load.address = load.address || '<Anonymous Module ' + ++anonCnt + '>'; // instead of load.kind, use load.isDeclarative load.isDeclarative = true; return transpile.call(loader.loaderObj, load) .then(function(transpiled) { // Hijack System.register to set declare function var curSystem = __global.System; var curRegister = curSystem.register; curSystem.register = function(name, deps, declare) { if (typeof name != 'string') { declare = deps; deps = name; } // store the registered declaration as load.declare // store the deps as load.deps load.declare = declare; load.depsList = deps; } // empty {} context is closest to undefined 'this' we can get __eval(transpiled, load.address, {}); curSystem.register = curRegister; }); } else if (typeof instantiateResult == 'object') { load.depsList = instantiateResult.deps || []; load.execute = instantiateResult.execute; load.isDeclarative = false; } else throw TypeError('Invalid instantiate return value'); }) // 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); console.assert(load.status == 'loading', 'is loading'); 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; console.assert(load.status == 'loading' || load.status == 'loaded', 'loading or loaded on link set'); 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 = !load.isDeclarative ? { module: _newModule({}) } : { 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, kind: load.isDeclarative ? 'declarative' : 'dynamic' }; } // if not anonymous, add to the module table if (load.name) { console.assert(!loader.modules[load.name], '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; doEnsureEvaluated(this._loader.modules[key], [], this); 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]) { doEnsureEvaluated(loader.modules[name], [], loader._loader); return loader.modules[name].module; } return loader.importPromises[name] || createImportPromise(loaderObj, name, loadModule(loader, name, {}) .then(function(load) { delete loader.importPromises[name]; return evaluateLoadedModule(loader, load); })); }); }, // 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 evaluateLoadedModule(loader, load); }); 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) { return name; }, // 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 - Dev Build Only */ 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); } } function evaluateLoadedModule(loader, load) { console.assert(load.status == 'linked', 'is linked ' + load.name); return load.module.module; } function doEnsureEvaluated() {} function transpile() { throw new TypeError('ES6 transpilation is only provided in the dev module loader build.'); } })();/* ********************************************************************************************* System Loader Implementation - Implemented to https://github.com/jorendorff/js-loaders/blob/master/browser-loader.js - <script type="module"> supported ********************************************************************************************* */ var System; function SystemLoader() { Loader.call(this); this.paths = {}; } // NB no specification provided for System.paths, used ideas discussed in https://github.com/jorendorff/js-loaders/issues/25 function applyPaths(paths, name) { // most specific (most number of slashes in path) match wins var pathMatch = '', wildcard, maxWildcardPrefixLen = 0; // check to see if we have a paths entry for (var p in paths) { var pathParts = p.split('*'); if (pathParts.length > 2) throw new TypeError('Only one wildcard in a path is permitted'); // exact path match if (pathParts.length == 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] == '/') return paths[p].substr(0, paths[p].length - 1) + (name.length > p.length ? '/' + name.substr(p.length) : ''); } // wildcard path match else { 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; } // inline Object.create-style class extension function LoaderProto() {} LoaderProto.prototype = Loader.prototype; SystemLoader.prototype = new LoaderProto(); var fetchTextFromURL; if (typeof XMLHttpRequest != 'undefined') { fetchTextFromURL = function(url, authorization, fulfill, reject) { var xhr = new XMLHttpRequest(); var sameDomain = true; var doTimeout = false; if (!('withCredentials' in xhr)) { // check if same domain var domainCheck = /^(\w+:)?\/\/([^\/]+)/.exec(url); if (domainCheck) { sameDomain = domainCheck[2] === window.location.host; if (domainCheck[1]) sameDomain &= domainCheck[1] === window.location.protocol; } } if (!sameDomain && typeof XDomainRequest != 'undefined') { xhr = new XDomainRequest(); xhr.onload = load; xhr.onerror = error; xhr.ontimeout = error; xhr.onprogress = function() {}; xhr.timeout = 0; doTimeout = true; } function load() { fulfill(xhr.responseText); } function error() { reject(new Error('XHR error' + (xhr.status ? ' (' + xhr.status + (xhr.statusText ? ' ' + xhr.statusText : '') + ')' : '') + ' loading ' + url)); } xhr.onreadystatechange = function () { if (xhr.readyState === 4) { // in Chrome on file:/// URLs, status is 0 if (xhr.status == 0) { if (xhr.responseText) { load(); } else { // when responseText is empty, wait for load or error event // to inform if it is a 404 or empty file xhr.addEventListener('error', error); xhr.addEventListener('load', load); } } else if (xhr.status === 200) { load(); } else { error(); } } }; xhr.open("GET", url, true); if (xhr.setRequestHeader) { xhr.setRequestHeader('Accept', 'application/x-es-module, */*'); // can set "authorization: true" to enable withCredentials only if (authorization) { if (typeof authorization == 'string') xhr.setRequestHeader('Authorization', authorization); xhr.withCredentials = true; } } if (doTimeout) { setTimeout(function() { xhr.send(); }, 0); } else { xhr.send(null); } }; } else if (typeof require != 'undefined' && typeof process != 'undefined') { var fs; fetchTextFromURL = function(url, authorization, fulfill, reject) { if (url.substr(0, 8) != 'file:///') throw new Error('Unable to fetch "' + url + '". Only file URLs of the form file:/// allowed running in Node.'); fs = fs || require('fs'); if (isWindows) url = url.replace(/\//g, '\\').substr(8); else url = url.substr(7); return fs.readFile(url, function(err, data) { if (err) { return reject(err); } else { // Strip Byte Order Mark out if it's the leading char var dataString = data + ''; if (dataString[0] === '\ufeff') dataString = dataString.substr(1); fulfill(dataString); } }); }; } else if (typeof self != 'undefined' && typeof self.fetch != 'undefined') { fetchTextFromURL = function(url, authorization, fulfill, reject) { var opts = { headers: {'Accept': 'application/x-es-module, */*'} }; if (authorization) { if (typeof authorization == 'string') opts.headers['Authorization'] = authorization; opts.credentials = 'include'; } fetch(url, opts) .then(function (r) { if (r.ok) { return r.text(); } else { throw new Error('Fetch error: ' + r.status + ' ' + r.statusText); } }) .then(fulfill, reject); } } else { throw new TypeError('No environment fetch API available.'); } SystemLoader.prototype.fetch = function(load) { return new Promise(function(resolve, reject) { fetchTextFromURL(load.address, undefined, resolve, reject); }); }; // SystemJS Loader Class and Extension helpers function SystemJSLoader() { SystemLoader.call(this); systemJSConstructor.call(this); } // inline Object.create-style class extension function SystemProto() {}; SystemProto.prototype = SystemLoader.prototype; SystemJSLoader.prototype = new SystemProto(); SystemJSLoader.prototype.constructor = SystemJSLoader; // remove ESML instantiate SystemJSLoader.prototype.instantiate = function() {}; var systemJSConstructor; function hook(name, hook) { SystemJSLoader.prototype[name] = hook(SystemJSLoader.prototype[name] || function() {}); } function hookConstructor(hook) { systemJSConstructor = hook(systemJSConstructor || function() {}); } 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') { if (getOwnPropertyDescriptor) { var d; for (var p in exports) if (d = Object.getOwnPropertyDescriptor(exports, p)) defineProperty(esModule, p, d); } else { var hasOwnProperty = exports && exports.hasOwnProperty; for (var p in exports) { if (!hasOwnProperty || exports.hasOwnProperty(p)) esModule[p] = exports[p]; } } } esModule['default'] = exports; defineProperty(esModule, '__useDefault', { value: true }); return esModule; } function extend(a, b, prepend) { for (var p in b) { if (!prepend || !(p in a)) a[p] = b[p]; } return a; } // package configuration options var packageProperties = ['main', 'format', 'defaultExtension', 'meta', 'map', 'basePath', 'depCache']; // meta first-level extends where: // array + array appends // object + object extends // other properties replace function extendMeta(a, b, prepend) { for (var p in b) { 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 warn(msg) { if (this.warnings && typeof console != 'undefined' && console.warn) console.warn(msg); }var absURLRegEx = /^[^\/]+:\/\//; function readMemberExpression(p, value) { var pParts = p.split('.'); while (pParts.length) value = value[pParts.shift()]; return value; } var baseURLCache = {}; function getBaseURLObj() { if (baseURLCache[this.baseURL]) return baseURLCache[this.baseURL]; // normalize baseURL if not already if (this.baseURL[this.baseURL.length - 1] != '/') this.baseURL += '/'; var baseURL = new URL(this.baseURL, baseURI); this.baseURL = baseURL.href; return (baseURLCache[this.baseURL] = baseURL); } function getMapMatch(map, name) { var bestMatch, bestMatchLength = 0; for (var p in map) { if (name.substr(0, p.length) == p && (name.length == p.length || name[p.length] == '/')) { var curMatchLength = p.split('/').length; if (curMatchLength <= bestMatchLength) continue; bestMatch = p; bestMatchLength = curMatchLength; } } return bestMatch; } function setProduction(isProduction) { this.set('@system-env', this.newModule({ browser: isBrowser, node: !!this._nodeRequire, production: isProduction, 'default': true })); } var baseURIObj = new URL(baseURI); hookConstructor(function(constructor) { return function() { constructor.call(this); // support baseURL this.baseURL = baseURI.substr(0, baseURI.lastIndexOf('/') + 1); // support map and paths this.map = {}; this.paths = {}; // global behaviour flags this.warnings = false; this.defaultJSExtensions = false; this.pluginFirst = false; this.loaderErrorStack = false; // by default load ".json" files as json // leading * meta doesn't need normalization // NB add this in next breaking release // this.meta['*.json'] = { format: 'json' }; // support the empty module, as a concept this.set('@empty', this.newModule({})); setProduction.call(this, false); }; }); // include the node require since we're overriding it if (typeof require != 'undefined' && typeof process != 'undefined' && !process.browser) SystemJSLoader.prototype._nodeRequire = require; var nodeCoreModules = ['assert', 'buffer', 'child_process', 'cluster', 'console', 'constants', 'crypto', 'dgram', 'dns', 'domain', 'events', 'fs', 'http', 'https', 'module', 'net', 'os', 'path', 'process', 'punycode', 'querystring', 'readline', 'repl', 'stream', 'string_decoder', 'sys', 'timers', 'tls', 'tty', 'url', 'util', 'vm', 'zlib']; /* Core SystemJS Normalization If a name is relative, we apply URL normalization to the page If a name is an absolute URL, we leave it as-is Plain names (neither of the above) run through the map and paths normalization phases. The paths normalization phase applies last (paths extension), which defines the `decanonicalize` function and normalizes everything into a URL. */ function isPlain(name) { return (name[0] != '.' || (!!name[1] && name[1] != '/' && name[1] != '.')) && name[0] != '/' && !name.match(absURLRegEx); } function urlResolve(name, parent) { if (parent) parent = parent.replace(/#/g, '%05'); return new URL(name, parent || baseURIObj).href.replace(/%05/g, '#'); } // only applies to plain names function baseURLResolve(loader, name) { return new URL(name, getBaseURLObj.call(loader)).href; } function coreResolve(name, parentName) { // standard URL resolution if (!isPlain(name)) return urlResolve(name, parentName); // plain names not starting with './', '://' and '/' go through custom resolution var mapMatch = getMapMatch(this.map, name); if (mapMatch) { name = this.map[mapMatch] + name.substr(mapMatch.length); if (!isPlain(name)) return urlResolve(name); } if (this.has(name)) return name; // dynamically load node-core modules when requiring `@node/fs` for example if (name.substr(0, 6) == '@node/' && nodeCoreModules.indexOf(name.substr(6)) != -1) { if (!this._nodeRequire) throw new TypeError('Error loading ' + name + '. Can only load node core modules in Node.'); this.set(name, this.newModule(getESModule(this._nodeRequire(name.substr(6))))); return name; } var pathed = applyPaths(this.paths, name); if (pathed && !isPlain(pathed)) return urlResolve(pathed); return baseURLResolve(this, pathed || name); } hook('normalize', function(normalize) { return function(name, parentName, skipExt) { var resolved = coreResolve.call(this, name, parentName); if (!skipExt && this.defaultJSExtensions && resolved.substr(resolved.length - 3, 3) != '.js' && !isPlain(resolved)) resolved += '.js'; return resolved; }; }); // percent encode just '#' in urls if using HTTP requests var httpRequest = typeof XMLHttpRequest != 'undefined'; hook('locate', function(locate) { return function(load) { return Promise.resolve(locate.call(this, load)) .then(function(address) { if (httpRequest) return address.replace(/#/g, '%23'); return address; }); }; }); /* * Fetch with authorization */ hook('fetch', function() { return function(load) { return new Promise(function(resolve, reject) { fetchTextFromURL(load.address, load.metadata.authorization, resolve, reject); }); }; }); /* __useDefault When a module object looks like: newModule( __useDefault: true, default: 'some-module' }) Then importing that module provides the 'some-module' result directly instead of the full module. Useful for eg module.exports = function() {} */ hook('import', function(systemImport) { return function(name, parentName, parentAddress) { if (parentName && parentName.name) warn.call(this, 'SystemJS.import(name, { name: parentName }) is deprecated for SystemJS.import(name, parentName), while importing ' + name + ' from ' + parentName.name); return systemImport.call(this, name, parentName, parentAddress).then(function(module) { return module.__useDefault ? module['default'] : module; }); }; }); /* * Allow format: 'detect' meta to enable format detection */ hook('translate', function(systemTranslate) { return function(load) { if (load.metadata.format == 'detect') load.metadata.format = undefined; return systemTranslate.call(this, load); }; }); /* * JSON format support * * Supports loading JSON files as a module format itself * * Usage: * * SystemJS.config({ * meta: { * '*.json': { format: 'json' } * } * }); * * Module is returned as if written: * * export default {JSON} * * No named exports are provided * * Files ending in ".json" are treated as json automatically by SystemJS */ hook('instantiate', function(instantiate) { return function(load) { if (load.metadata.format == 'json' && !this.builder) { var entry = load.metadata.entry = createEntry(); entry.deps = []; entry.execute = function() { try { return JSON.parse(load.source); } catch(e) { throw new Error("Invalid JSON file " + load.name); } }; } }; }) /* Extend 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' }; Normalizes meta and package configs allowing for: SystemJS.config({ meta: { './index.js': {} } }); To become SystemJS.meta['https://thissite.com/index.js'] = {}; For easy normalization canonicalization with latest URL support. */ SystemJSLoader.prototype.env = 'development'; var curCurScript; SystemJSLoader.prototype.config = function(cfg) { var loader = this; if ('loaderErrorStack' in cfg) { curCurScript = $__curScript; if (cfg.loaderErrorStack) $__curScript = undefined; else $__curScript = curCurScript; } if ('warnings' in cfg) loader.warnings = cfg.warnings; // transpiler deprecation path if (cfg.transpilerRuntime === false) loader._loader.loadedTranspilerRuntime = true; // always configure baseURL first if (cfg.baseURL) { var hasConfig = false; function checkHasConfig(obj) { for (var p in obj) if (hasOwnProperty.call(obj, p)) return true; } if (checkHasConfig(loader.packages) || checkHasConfig(loader.meta) || checkHasConfig(loader.depCache) || checkHasConfig(loader.bundles) || checkHasConfig(loader.packageConfigPaths)) throw new TypeError('Incorrect configuration order. The baseURL must be configured with the first SystemJS.config call.'); loader.baseURL = cfg.baseURL; // sanitize baseURL getBaseURLObj.call(loader); } if (cfg.defaultJSExtensions) { loader.defaultJSExtensions = cfg.defaultJSExtensions; warn.call(loader, 'The defaultJSExtensions configuration option is deprecated, use packages configuration instead.'); } if (cfg.pluginFirst) loader.pluginFirst = cfg.pluginFirst; if (cfg.production) setProduction.call(loader, true); if (cfg.paths) { for (var p in cfg.paths) loader.paths[p] = cfg.paths[p]; } if (cfg.map) { var objMaps = ''; for (var p in cfg.map) { var v = cfg.map[p]; // object map backwards-compat into packages configuration if (typeof v !== 'string') { objMaps += (objMaps.length ? ', ' : '') + '"' + p + '"'; var defaultJSExtension = loader.defaultJSExtensions && p.substr(p.length - 3, 3) != '.js'; var prop = loader.decanonicalize(p); if (defaultJSExtension && prop.substr(prop.length - 3, 3) == '.js') prop = prop.substr(0, prop.length - 3); // if a package main, revert it var pkgMatch = ''; for (var pkg in loader.packages) { if (prop.substr(0, pkg.length) == pkg && (!prop[pkg.length] || prop[pkg.length] == '