UNPKG

ionic-framework

Version:

The ionic-framework package comes with both Javascript and Sass frontend dependencies, located in the root of the package, and a Node API, located in `tooling/`.

1,697 lines (1,440 loc) 147 kB
/* * SystemJS v0.19.6 */ (function() { function bootstrap() {(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' && !!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) { var newErr; if (err instanceof Error) { var newErr = new Error(err.message, err.fileName, err.lineNumber); if (isBrowser) { newErr.message = err.message + '\n\t' + msg; newErr.stack = err.stack; } else { // node errors only look correct with the stack modified newErr.message = err.message; newErr.stack = err.stack + '\n\t' + msg; } } else { newErr = err + '\n\t' + msg; } 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'); } var URL = __global.URLPolyfill || __global.URL; /* ********************************************************************************************* 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 (existingLoad.linkSets.length) 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, options) { var loader = this._loader; if (loader.modules[name]) { doEnsureEvaluated(loader.modules[name], [], loader); return Promise.resolve(loader.modules[name].module); } return loader.importPromises[name] || createImportPromise(this, name, loadModule(loader, name, {}) .then(function(load) { delete loader.importPromises[name]; return evaluateLoadedModule(loader, load); })); }, // 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]; } }); })(pNames[i]); 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) { pathMatch = p; break; } } // 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] || name; 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) { if (xhr.status === 200 || (xhr.status == 0 && xhr.responseText)) { 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') { 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 { 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); }); }; /* * Traceur, Babel and TypeScript transpile hook for Loader */ var transpile = (function() { // use Traceur by default Loader.prototype.transpiler = 'traceur'; function transpile(load) { var self = this; return Promise.resolve(__global[self.transpiler == 'typescript' ? 'ts' : self.transpiler] || (self.pluginLoader || self)['import'](self.transpiler)) .then(function(transpiler) { if (transpiler.__useDefault) transpiler = transpiler['default']; var transpileFunction; if (transpiler.Compiler) transpileFunction = traceurTranspile; else if (transpiler.createLanguageService) transpileFunction = typescriptTranspile; else transpileFunction = babelTranspile; // note __moduleName will be part of the transformer meta in future when we have the spec for this return '(function(__moduleName){' + transpileFunction.call(self, load, transpiler) + '\n})("' + load.name + '");\n//# sourceURL=' + load.address + '!transpiled'; }); }; function traceurTranspile(load, traceur) { var options = this.traceurOptions || {}; options.modules = 'instantiate'; options.script = false; if (options.sourceMaps === undefined) options.sourceMaps = 'inline'; options.filename = load.address; options.inputSourceMap = load.metadata.sourceMap; options.moduleName = false; var compiler = new traceur.Compiler(options); return doTraceurCompile(load.source, compiler, options.filename); } function doTraceurCompile(source, compiler, filename) { try { return compiler.compile(source, filename); } catch(e) { // traceur throws an error array throw e[0]; } } function babelTranspile(load, babel) { var options = this.babelOptions || {}; options.modules = 'system'; if (options.sourceMap === undefined) options.sourceMap = 'inline'; options.inputSourceMap = load.metadata.sourceMap; options.filename = load.address; options.code = true; options.ast = false; return babel.transform(load.source, options).code; } function typescriptTranspile(load, ts) { var options = this.typescriptOptions || {}; options.target = options.target || ts.ScriptTarget.ES5; if (options.sourceMap === undefined) options.sourceMap = true; if (options.sourceMap) options.inlineSourceMap = true; options.module = ts.ModuleKind.System; return ts.transpile(load.source, options, load.address); } return transpile; })(); // 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; 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 System.newModule function getESModule(exports) { var esModule = {}; // don't trigger getters/setters in environments that support them if (typeof exports == 'object' || typeof exports == 'function') { if (getOwnPropertyDescriptor) { var d; for (var p in exports) if (d = Object.getOwnPropertyDescriptor(exports, p)) defineProperty(esModule, p, d); } else { var hasOwnProperty = exports && exports.hasOwnProperty; for (var p in exports) { if (!hasOwnProperty || exports.hasOwnProperty(p)) esModule[p] = exports[p]; } } } esModule['default'] = exports; defineProperty(esModule, '__useDefault', { value: true }); return esModule; } function extend(a, b, prepend) { for (var p in b) { if (!prepend || !(p in a)) a[p] = b[p]; } return a; } // package configuration options var packageProperties = ['main', 'format', 'defaultExtension', 'modules', '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' && 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); }// we define a __exec for globally-scoped execution // used by module format implementations var __exec; (function() { // System clobbering protection (mostly for Traceur) var curSystem; var callCounter = 0; var curLoad; function preExec(loader, load) { if (callCounter++ == 0) curSystem = __global.System; __global.System = loader; curLoad = load; } function postExec() { if (--callCounter == 0) __global.System = curSystem; curLoad = undefined; } // System.register, System.registerDynamic, AMD define pipeline // if currently evalling code here, immediately reduce the registered entry against the load record hook('pushRegister_', function() { return function(register) { if (!curLoad) return false; this.reduceRegister_(curLoad, register); return true; }; }); var hasBtoa = typeof btoa != 'undefined'; function getSource(load) { var lastLineIndex = load.source.lastIndexOf('\n'); // wrap ES formats with a System closure for System global encapsulation var wrap = load.metadata.format == 'esm' || load.metadata.format == 'register' || load.metadata.bundle; return (wrap ? '(function(System) {' : '') + load.source + (wrap ? '\n})(System);' : '') // adds the sourceURL comment if not already present + (load.source.substr(lastLineIndex, 15) != '\n//# sourceURL=' ? '\n//# sourceURL=' + load.address + (load.metadata.sourceMap ? '!transpiled' : '') : '') // add sourceMappingURL if load.metadata.sourceMap is set + (load.metadata.sourceMap && hasBtoa && '\n//# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(load.metadata.sourceMap))) || '') } function evalExec(load) { if (load.metadata.integrity) throw new TypeError('Subresource integrity checking is not supported in Web Workers or Chrome Extensions.'); try { preExec(this, load); new Function(getSource(load)).call(__global); postExec(); } catch(e) { postExec(); throw addToError(e, 'Evaluating ' + load.address); } } // use script injection eval to get identical global script behaviour if (typeof document != 'undefined' && document.getElementsByTagName) { var head; var scripts = document.getElementsByTagName('script'); $__curScript = scripts[scripts.length - 1]; __exec = function(load) { if (!this.globalEvaluationScope) return evalExec.call(this, load); if (!head) head = document.head || document.body || document.documentElement; var script = document.createElement('script'); script.text = getSource(load); var onerror = window.onerror; var e; window.onerror = function(_e) { e = addToError(_e, 'Evaluating ' + load.address); } preExec(this, load); if (load.metadata.integrity) script.setAttribute('integrity', load.metadata.integrity); if (load.metadata.nonce) script.setAttribute('nonce', load.metadata.nonce); head.appendChild(script); head.removeChild(script); postExec(); window.onerror = onerror; if (e) throw e; }; } // global scoped eval for node else if (typeof require != 'undefined') { var vmModule = 'vm'; var vm = require(vmModule); __exec = function vmExec(load) { if (!this.globalEvaluationScope) return evalExec.call(this, load); if (load.metadata.integrity) throw new TypeError('Subresource integrity checking is unavailable in Node.'); try { preExec(this, load); vm.runInThisContext(getSource(load)); postExec(); } catch(e) { postExec(); throw addToError(e.toString(), 'Evaluating ' + load.address); } }; } else { __exec = evalExec; } })();/* SystemJS map support Provides map configuration through System.map['jquery'] = 'some/module/map' Note that this applies for subpaths, just like RequireJS: jquery -> 'some/module/map' jquery/path -> 'some/module/map/path' bootstrap -> 'bootstrap' The most specific map is always taken, as longest path length */ hookConstructor(function(constructor) { return function() { constructor.call(this); this.map = {}; }; }); hook('normalize', function() { return function(name, parentName) { if (name.substr(0, 1) != '.' && name.substr(0, 1) != '/' && !name.match(absURLRegEx)) { var bestMatch, bestMatchLength = 0; // now do the global map for (var p in this.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; } } if (bestMatch) name = this.map[bestMatch] + name.substr(bestMatch.length); } // map is the first normalizer return name; }; }); 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); } var baseURIObj = new URL(baseURI); hookConstructor(function(constructor) { return function() { constructor.call(this); // support baseURL this.baseURL = baseURI.substr(0, baseURI.lastIndexOf('/') + 1); // global behaviour flags this.warnings = false; this.defaultJSExtensions = false; this.globalEvaluationScope = true; this.pluginFirst = false; // Default settings for globalEvaluationScope: // Disabled for WebWorker, Chrome Extensions and jsdom if (isWorker || isBrowser && window.chrome && window.chrome.extension || isBrowser && navigator.userAgent.match(/^Node\.js/)) this.globalEvaluationScope = false; // support the empty module, as a concept this.set('@empty', this.newModule({})); }; }); /* 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 package normalization phases (applying before and after this one). The paths normalization phase applies last (paths extension), which defines the `normalizeSync` function and normalizes everything into a URL. The final normalization */ hook('normalize', function(normalize) { return function(name, parentName) { // first run map config name = normalize.apply(this, arguments); // relative URL-normalization if (name[0] == '.' || name[0] == '/') { if (parentName) return new URL(name, parentName.replace(/#/g, '%05')).href.replace(/%05/g, '#'); else return new URL(name, baseURIObj).href; } return name; }; }); // 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, 'System.import(name, { name: parentName }) is deprecated for System.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; }); }; }); /* 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: System.config({ meta: { './index.js': {} } }); To become System.meta['https://thissite.com/index.js'] = {}; For easy normalization canonicalization with latest URL support. */ SystemJSLoader.prototype.config = function(cfg) { if ('warnings' in cfg) this.warnings = cfg.warnings; // always configure baseURL first if (cfg.baseURL) { var hasConfig = false; function checkHasConfig(obj) { for (var p in obj) return true; } if (checkHasConfig(this.packages) || checkHasConfig(this.meta) || checkHasConfig(this.depCache) || checkHasConfig(this.bundles) || checkHasConfig(this.packageConfigPaths)) throw new TypeError('baseURL should only be configured once and must be configured first.'); this.baseURL = cfg.baseURL; // sanitize baseURL getBaseURLObj.call(this); } if (cfg.defaultJSExtensions) { this.defaultJSExtensions = cfg.defaultJSExtensions; warn.call(this, 'The defaultJSExtensions configuration option is deprecated, use packages configuration instead.'); } if (cfg.pluginFirst) this.pluginFirst = cfg.pluginFirst; if (cfg.paths) { for (var p in cfg.paths) this.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 normalized = this.normalizeSync(p); // if doing default js extensions, undo to get package name if (this.defaultJSExtensions && p.substr(p.length - 3, 3) != '.js') normalized = normalized.substr(0, normalized.length - 3); // if a package main, revert it var pkgMatch = ''; for (var pkg in this.packages) { if (normalized.substr(0, pkg.length) == pkg && (!normalized[pkg.length] || normalized[pkg.length] == '/') && pkgMatch.split('/').length < pkg.split('/').length) pkgMatch = pkg; } if (pkgMatch && this.packages[pkgMatch].main) normalized = normalized.substr(0, normalized.length - this.packages[pkgMatch].main.length - 1); var pkg = this.packages[normalized] = this.packages[normalized] || {}; pkg.map = v; } else { this.map[p] = v; } } if (objMaps) warn.call(this, 'The map configuration for ' + objMaps + ' uses object submaps, which is deprecated in global map.\nUpdate this to use package contextual map with configs like System.config({ packages: { "' + p + '": { map: {...} } } }).'); } if (cfg.packageConfigPaths) { var packageConfigPaths = []; for (var i = 0; i < cfg.packageConfigPaths.length; i++) { var path = cfg.packageConfigPaths[i]; var packageLength = Math.max(path.lastIndexOf('*') + 1, path.lastIndexOf('/')); var normalized = this.normalizeSync(path.substr(0, packageLength) + '/'); if (this.defaultJSExtensions && path.substr(path.length - 3, 3) != '.js') normalized = normalized.substr(0, normalized.length - 3); packageConfigPaths[i] = normalized.substr(0, normalized.length - 1) + path.substr(packageLength); } this.packageConfigPaths = packageConf