blob: f2932c5193a3d6638827b86d290c1a302e3bd4dd [file] [log] [blame]
/*
* SystemJS v0.21.3 Dev
*/
(function () {
'use strict';
/*
* Environment
*/
var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
var isNode = typeof process !== 'undefined' && process.versions && process.versions.node;
var isWindows = typeof process !== 'undefined' && typeof process.platform === 'string' && process.platform.match(/^win/);
var envGlobal = typeof self !== 'undefined' ? self : global;
/*
* Simple Symbol() shim
*/
var hasSymbol = typeof Symbol !== 'undefined';
function createSymbol (name) {
return hasSymbol ? Symbol() : '@@' + name;
}
/*
* Environment baseURI
*/
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 = location.href;
}
// sanitize out the hash and querystring
if (baseURI) {
baseURI = baseURI.split('#')[0].split('?')[0];
var slashIndex = baseURI.lastIndexOf('/');
if (slashIndex !== -1)
baseURI = baseURI.substr(0, slashIndex + 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');
}
// ensure baseURI has trailing "/"
if (baseURI[baseURI.length - 1] !== '/')
baseURI += '/';
/*
* LoaderError with chaining for loader stacks
*/
var errArgs = new Error(0, '_').fileName == '_';
function LoaderError__Check_error_message_for_loader_stack (childErr, newMessage) {
// Convert file:/// URLs to paths in Node
if (!isBrowser)
newMessage = newMessage.replace(isWindows ? /file:\/\/\//g : /file:\/\//g, '');
var message = (childErr.message || childErr) + '\n ' + newMessage;
var err;
if (errArgs && childErr.fileName)
err = new Error(message, childErr.fileName, childErr.lineNumber);
else
err = new Error(message);
var stack = childErr.originalErr ? childErr.originalErr.stack : childErr.stack;
if (isNode)
// node doesn't show the message otherwise
err.stack = message + '\n ' + stack;
else
err.stack = stack;
err.originalErr = childErr.originalErr || childErr;
return err;
}
/*
* Optimized URL normalization assuming a syntax-valid URL parent
*/
function throwResolveError (relUrl, parentUrl) {
throw new RangeError('Unable to resolve "' + relUrl + '" to ' + parentUrl);
}
function resolveIfNotPlain (relUrl, parentUrl) {
relUrl = relUrl.trim();
var parentProtocol = parentUrl && parentUrl.substr(0, parentUrl.indexOf(':') + 1);
var firstChar = relUrl[0];
var secondChar = relUrl[1];
// protocol-relative
if (firstChar === '/' && secondChar === '/') {
if (!parentProtocol)
throwResolveError(relUrl, parentUrl);
return parentProtocol + relUrl;
}
// relative-url
else if (firstChar === '.' && (secondChar === '/' || secondChar === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) ||
relUrl.length === 1 && (relUrl += '/')) ||
firstChar === '/') {
var parentIsPlain = !parentProtocol || parentUrl[parentProtocol.length] !== '/';
// read pathname from parent if a URL
// pathname taken to be part after leading "/"
var pathname;
if (parentIsPlain) {
// resolving to a plain parent -> skip standard URL prefix, and treat entire parent as pathname
if (parentUrl === undefined)
throwResolveError(relUrl, parentUrl);
pathname = parentUrl;
}
else if (parentUrl[parentProtocol.length + 1] === '/') {
// resolving to a :// so we need to read out the auth and host
if (parentProtocol !== 'file:') {
pathname = parentUrl.substr(parentProtocol.length + 2);
pathname = pathname.substr(pathname.indexOf('/') + 1);
}
else {
pathname = parentUrl.substr(8);
}
}
else {
// resolving to :/ so pathname is the /... part
pathname = parentUrl.substr(parentProtocol.length + 1);
}
if (firstChar === '/') {
if (parentIsPlain)
throwResolveError(relUrl, parentUrl);
else
return parentUrl.substr(0, parentUrl.length - pathname.length - 1) + relUrl;
}
// join together and split for removal of .. and . segments
// looping the string instead of anything fancy for perf reasons
// '../../../../../z' resolved to 'x/y' is just 'z' regardless of parentIsPlain
var segmented = pathname.substr(0, pathname.lastIndexOf('/') + 1) + relUrl;
var output = [];
var segmentIndex = -1;
for (var i = 0; i < segmented.length; i++) {
// busy reading a segment - only terminate on '/'
if (segmentIndex !== -1) {
if (segmented[i] === '/') {
output.push(segmented.substring(segmentIndex, i + 1));
segmentIndex = -1;
}
continue;
}
// new segment - check if it is relative
if (segmented[i] === '.') {
// ../ segment
if (segmented[i + 1] === '.' && (segmented[i + 2] === '/' || i + 2 === segmented.length)) {
output.pop();
i += 2;
}
// ./ segment
else if (segmented[i + 1] === '/' || i + 1 === segmented.length) {
i += 1;
}
else {
// the start of a new segment as below
segmentIndex = i;
continue;
}
// this is the plain URI backtracking error (../, package:x -> error)
if (parentIsPlain && output.length === 0)
throwResolveError(relUrl, parentUrl);
continue;
}
// it is the start of a new segment
segmentIndex = i;
}
// finish reading out the last segment
if (segmentIndex !== -1)
output.push(segmented.substr(segmentIndex));
return parentUrl.substr(0, parentUrl.length - pathname.length) + output.join('');
}
// sanitizes and verifies (by returning undefined if not a valid URL-like form)
// Windows filepath compatibility is an added convenience here
var protocolIndex = relUrl.indexOf(':');
if (protocolIndex !== -1) {
if (isNode) {
// C:\x becomes file:///c:/x (we don't support C|\x)
if (relUrl[1] === ':' && relUrl[2] === '\\' && relUrl[0].match(/[a-z]/i))
return 'file:///' + relUrl.replace(/\\/g, '/');
}
return relUrl;
}
}
var resolvedPromise = Promise.resolve();
/*
* Simple Array values shim
*/
function arrayValues (arr) {
if (arr.values)
return arr.values();
if (typeof Symbol === 'undefined' || !Symbol.iterator)
throw new Error('Symbol.iterator not supported in this browser');
var iterable = {};
iterable[Symbol.iterator] = function () {
var keys = Object.keys(arr);
var keyIndex = 0;
return {
next: function () {
if (keyIndex < keys.length)
return {
value: arr[keys[keyIndex++]],
done: false
};
else
return {
value: undefined,
done: true
};
}
};
};
return iterable;
}
/*
* 3. Reflect.Loader
*
* We skip the entire native internal pipeline, just providing the bare API
*/
// 3.1.1
function Loader () {
this.registry = new Registry();
}
// 3.3.1
Loader.prototype.constructor = Loader;
function ensureInstantiated (module) {
if (!(module instanceof ModuleNamespace))
throw new TypeError('Module instantiation did not return a valid namespace object.');
return module;
}
// 3.3.2
Loader.prototype.import = function (key, parent) {
if (typeof key !== 'string')
throw new TypeError('Loader import method must be passed a module key string');
// custom resolveInstantiate combined hook for better perf
var loader = this;
return resolvedPromise
.then(function () {
return loader[RESOLVE_INSTANTIATE](key, parent);
})
.then(ensureInstantiated)
//.then(Module.evaluate)
.catch(function (err) {
throw LoaderError__Check_error_message_for_loader_stack(err, 'Loading ' + key + (parent ? ' from ' + parent : ''));
});
};
// 3.3.3
var RESOLVE = Loader.resolve = createSymbol('resolve');
/*
* Combined resolve / instantiate hook
*
* Not in current reduced spec, but necessary to separate RESOLVE from RESOLVE + INSTANTIATE as described
* in the spec notes of this repo to ensure that loader.resolve doesn't instantiate when not wanted.
*
* We implement RESOLVE_INSTANTIATE as a single hook instead of a separate INSTANTIATE in order to avoid
* the need for double registry lookups as a performance optimization.
*/
var RESOLVE_INSTANTIATE = Loader.resolveInstantiate = createSymbol('resolveInstantiate');
// default resolveInstantiate is just to call resolve and then get from the registry
// this provides compatibility for the resolveInstantiate optimization
Loader.prototype[RESOLVE_INSTANTIATE] = function (key, parent) {
var loader = this;
return loader.resolve(key, parent)
.then(function (resolved) {
return loader.registry.get(resolved);
});
};
function ensureResolution (resolvedKey) {
if (resolvedKey === undefined)
throw new RangeError('No resolution found.');
return resolvedKey;
}
Loader.prototype.resolve = function (key, parent) {
var loader = this;
return resolvedPromise
.then(function() {
return loader[RESOLVE](key, parent);
})
.then(ensureResolution)
.catch(function (err) {
throw LoaderError__Check_error_message_for_loader_stack(err, 'Resolving ' + key + (parent ? ' to ' + parent : ''));
});
};
// 3.3.4 (import without evaluate)
// this is not documented because the use of deferred evaluation as in Module.evaluate is not
// documented, as it is not considered a stable feature to be encouraged
// Loader.prototype.load may well be deprecated if this stays disabled
/* Loader.prototype.load = function (key, parent) {
return Promise.resolve(this[RESOLVE_INSTANTIATE](key, parent || this.key))
.catch(function (err) {
throw addToError(err, 'Loading ' + key + (parent ? ' from ' + parent : ''));
});
}; */
/*
* 4. Registry
*
* Instead of structuring through a Map, just use a dictionary object
* We throw for construction attempts so this doesn't affect the public API
*
* Registry has been adjusted to use Namespace objects over ModuleStatus objects
* as part of simplifying loader API implementation
*/
var iteratorSupport = typeof Symbol !== 'undefined' && Symbol.iterator;
var REGISTRY = createSymbol('registry');
function Registry() {
this[REGISTRY] = {};
}
// 4.4.1
if (iteratorSupport) {
// 4.4.2
Registry.prototype[Symbol.iterator] = function () {
return this.entries()[Symbol.iterator]();
};
// 4.4.3
Registry.prototype.entries = function () {
var registry = this[REGISTRY];
return arrayValues(Object.keys(registry).map(function (key) {
return [key, registry[key]];
}));
};
}
// 4.4.4
Registry.prototype.keys = function () {
return arrayValues(Object.keys(this[REGISTRY]));
};
// 4.4.5
Registry.prototype.values = function () {
var registry = this[REGISTRY];
return arrayValues(Object.keys(registry).map(function (key) {
return registry[key];
}));
};
// 4.4.6
Registry.prototype.get = function (key) {
return this[REGISTRY][key];
};
// 4.4.7
Registry.prototype.set = function (key, namespace) {
if (!(namespace instanceof ModuleNamespace))
throw new Error('Registry must be set with an instance of Module Namespace');
this[REGISTRY][key] = namespace;
return this;
};
// 4.4.8
Registry.prototype.has = function (key) {
return Object.hasOwnProperty.call(this[REGISTRY], key);
};
// 4.4.9
Registry.prototype.delete = function (key) {
if (Object.hasOwnProperty.call(this[REGISTRY], key)) {
delete this[REGISTRY][key];
return true;
}
return false;
};
/*
* Simple ModuleNamespace Exotic object based on a baseObject
* We export this for allowing a fast-path for module namespace creation over Module descriptors
*/
// var EVALUATE = createSymbol('evaluate');
var BASE_OBJECT = createSymbol('baseObject');
// 8.3.1 Reflect.Module
/*
* Best-effort simplified non-spec implementation based on
* a baseObject referenced via getters.
*
* Allows:
*
* loader.registry.set('x', new Module({ default: 'x' }));
*
* Optional evaluation function provides experimental Module.evaluate
* support for non-executed modules in registry.
*/
function ModuleNamespace (baseObject/*, evaluate*/) {
Object.defineProperty(this, BASE_OBJECT, {
value: baseObject
});
// evaluate defers namespace population
/* if (evaluate) {
Object.defineProperty(this, EVALUATE, {
value: evaluate,
configurable: true,
writable: true
});
}
else { */
Object.keys(baseObject).forEach(extendNamespace, this);
//}
}// 8.4.2
ModuleNamespace.prototype = Object.create(null);
if (typeof Symbol !== 'undefined' && Symbol.toStringTag)
Object.defineProperty(ModuleNamespace.prototype, Symbol.toStringTag, {
value: 'Module'
});
function extendNamespace (key) {
Object.defineProperty(this, key, {
enumerable: true,
get: function () {
return this[BASE_OBJECT][key];
}
});
}
/* function doEvaluate (evaluate, context) {
try {
evaluate.call(context);
}
catch (e) {
return e;
}
}
// 8.4.1 Module.evaluate... not documented or used because this is potentially unstable
Module.evaluate = function (ns) {
var evaluate = ns[EVALUATE];
if (evaluate) {
ns[EVALUATE] = undefined;
var err = doEvaluate(evaluate);
if (err) {
// cache the error
ns[EVALUATE] = function () {
throw err;
};
throw err;
}
Object.keys(ns[BASE_OBJECT]).forEach(extendNamespace, ns);
}
// make chainable
return ns;
}; */
/*
* Register Loader
*
* Builds directly on top of loader polyfill to provide:
* - loader.register support
* - hookable higher-level resolve
* - instantiate hook returning a ModuleNamespace or undefined for es module loading
* - loader error behaviour as in HTML and loader specs, caching load and eval errors separately
* - build tracing support by providing a .trace=true and .loads object format
*/
var REGISTER_INTERNAL = createSymbol('register-internal');
function RegisterLoader () {
Loader.call(this);
var registryDelete = this.registry.delete;
this.registry.delete = function (key) {
var deleted = registryDelete.call(this, key);
// also delete from register registry if linked
if (records.hasOwnProperty(key) && !records[key].linkRecord) {
delete records[key];
deleted = true;
}
return deleted;
};
var records = {};
this[REGISTER_INTERNAL] = {
// last anonymous System.register call
lastRegister: undefined,
// in-flight es module load records
records: records
};
// tracing
this.trace = false;
}
RegisterLoader.prototype = Object.create(Loader.prototype);
RegisterLoader.prototype.constructor = RegisterLoader;
var INSTANTIATE = RegisterLoader.instantiate = createSymbol('instantiate');
// default normalize is the WhatWG style normalizer
RegisterLoader.prototype[RegisterLoader.resolve = Loader.resolve] = function (key, parentKey) {
return resolveIfNotPlain(key, parentKey || baseURI);
};
RegisterLoader.prototype[INSTANTIATE] = function (key, processAnonRegister) {};
// once evaluated, the linkRecord is set to undefined leaving just the other load record properties
// this allows tracking new binding listeners for es modules through importerSetters
// for dynamic modules, the load record is removed entirely.
function createLoadRecord (state, key, registration) {
return state.records[key] = {
key: key,
// defined System.register cache
registration: registration,
// module namespace object
module: undefined,
// es-only
// this sticks around so new module loads can listen to binding changes
// for already-loaded modules by adding themselves to their importerSetters
importerSetters: undefined,
loadError: undefined,
evalError: undefined,
// in-flight linking record
linkRecord: {
// promise for instantiated
instantiatePromise: undefined,
dependencies: undefined,
execute: undefined,
executingRequire: false,
// underlying module object bindings
moduleObj: undefined,
// es only, also indicates if es or not
setters: undefined,
// promise for instantiated dependencies (dependencyInstantiations populated)
depsInstantiatePromise: undefined,
// will be the array of dependency load record or a module namespace
dependencyInstantiations: undefined,
// NB optimization and way of ensuring module objects in setters
// indicates setters which should run pre-execution of that dependency
// setters is then just for completely executed module objects
// alternatively we just pass the partially filled module objects as
// arguments into the execute function
// hoisted: undefined
}
};
}
RegisterLoader.prototype[Loader.resolveInstantiate] = function (key, parentKey) {
var loader = this;
var state = this[REGISTER_INTERNAL];
var registry = this.registry[REGISTRY];
return resolveInstantiate(loader, key, parentKey, registry, state)
.then(function (instantiated) {
if (instantiated instanceof ModuleNamespace)
return instantiated;
// resolveInstantiate always returns a load record with a link record and no module value
var link = instantiated.linkRecord;
// if already beaten to done, return
if (!link) {
if (instantiated.module)
return instantiated.module;
throw instantiated.evalError;
}
return deepInstantiateDeps(loader, instantiated, link, registry, state)
.then(function () {
return ensureEvaluate(loader, instantiated, link, registry, state, undefined);
});
});
};
function resolveInstantiate (loader, key, parentKey, registry, state) {
// normalization shortpath for already-normalized key
// could add a plain name filter, but doesn't yet seem necessary for perf
var module = registry[key];
if (module)
return Promise.resolve(module);
var load = state.records[key];
// already linked but not in main registry is ignored
if (load && !load.module) {
if (load.loadError)
return Promise.reject(load.loadError);
return instantiate(loader, load, load.linkRecord, registry, state);
}
return loader.resolve(key, parentKey)
.then(function (resolvedKey) {
// main loader registry always takes preference
module = registry[resolvedKey];
if (module)
return module;
load = state.records[resolvedKey];
// already has a module value but not already in the registry (load.module)
// means it was removed by registry.delete, so we should
// disgard the current load record creating a new one over it
// but keep any existing registration
if (!load || load.module)
load = createLoadRecord(state, resolvedKey, load && load.registration);
if (load.loadError)
return Promise.reject(load.loadError);
var link = load.linkRecord;
if (!link)
return load;
return instantiate(loader, load, link, registry, state);
});
}
function createProcessAnonRegister (loader, load, state) {
return function () {
var lastRegister = state.lastRegister;
if (!lastRegister)
return !!load.registration;
state.lastRegister = undefined;
load.registration = lastRegister;
return true;
};
}
function instantiate (loader, load, link, registry, state) {
return link.instantiatePromise || (link.instantiatePromise =
// if there is already an existing registration, skip running instantiate
(load.registration ? Promise.resolve() : Promise.resolve().then(function () {
state.lastRegister = undefined;
return loader[INSTANTIATE](load.key, loader[INSTANTIATE].length > 1 && createProcessAnonRegister(loader, load, state));
}))
.then(function (instantiation) {
// direct module return from instantiate -> we're done
if (instantiation !== undefined) {
if (!(instantiation instanceof ModuleNamespace))
throw new TypeError('Instantiate did not return a valid Module object.');
delete state.records[load.key];
if (loader.trace)
traceLoad(loader, load, link);
return registry[load.key] = instantiation;
}
// run the cached loader.register declaration if there is one
var registration = load.registration;
// clear to allow new registrations for future loads (combined with registry delete)
load.registration = undefined;
if (!registration)
throw new TypeError('Module instantiation did not call an anonymous or correctly named System.register.');
link.dependencies = registration[0];
load.importerSetters = [];
link.moduleObj = {};
// process System.registerDynamic declaration
if (registration[2]) {
link.moduleObj.default = link.moduleObj.__useDefault = {};
link.executingRequire = registration[1];
link.execute = registration[2];
}
// process System.register declaration
else {
registerDeclarative(loader, load, link, registration[1]);
}
return load;
})
.catch(function (err) {
load.linkRecord = undefined;
throw load.loadError = load.loadError || LoaderError__Check_error_message_for_loader_stack(err, 'Instantiating ' + load.key);
}));
}
// like resolveInstantiate, but returning load records for linking
function resolveInstantiateDep (loader, key, parentKey, registry, state, traceDepMap) {
// normalization shortpaths for already-normalized key
// DISABLED to prioritise consistent resolver calls
// could add a plain name filter, but doesn't yet seem necessary for perf
/* var load = state.records[key];
var module = registry[key];
if (module) {
if (traceDepMap)
traceDepMap[key] = key;
// registry authority check in case module was deleted or replaced in main registry
if (load && load.module && load.module === module)
return load;
else
return module;
}
// already linked but not in main registry is ignored
if (load && !load.module) {
if (traceDepMap)
traceDepMap[key] = key;
return instantiate(loader, load, load.linkRecord, registry, state);
} */
return loader.resolve(key, parentKey)
.then(function (resolvedKey) {
if (traceDepMap)
traceDepMap[key] = resolvedKey;
// normalization shortpaths for already-normalized key
var load = state.records[resolvedKey];
var module = registry[resolvedKey];
// main loader registry always takes preference
if (module && (!load || load.module && module !== load.module))
return module;
if (load && load.loadError)
throw load.loadError;
// already has a module value but not already in the registry (load.module)
// means it was removed by registry.delete, so we should
// disgard the current load record creating a new one over it
// but keep any existing registration
if (!load || !module && load.module)
load = createLoadRecord(state, resolvedKey, load && load.registration);
var link = load.linkRecord;
if (!link)
return load;
return instantiate(loader, load, link, registry, state);
});
}
function traceLoad (loader, load, link) {
loader.loads = loader.loads || {};
loader.loads[load.key] = {
key: load.key,
deps: link.dependencies,
dynamicDeps: [],
depMap: link.depMap || {}
};
}
/*
* Convert a CJS module.exports into a valid object for new Module:
*
* new Module(getEsModule(module.exports))
*
* Sets the default value to the module, while also reading off named exports carefully.
*/
function registerDeclarative (loader, load, link, declare) {
var moduleObj = link.moduleObj;
var importerSetters = load.importerSetters;
var definedExports = false;
// closure especially not based on link to allow link record disposal
var declared = declare.call(envGlobal, function (name, value) {
if (typeof name === 'object') {
var changed = false;
for (var p in name) {
value = name[p];
if (p !== '__useDefault' && (!(p in moduleObj) || moduleObj[p] !== value)) {
changed = true;
moduleObj[p] = value;
}
}
if (changed === false)
return value;
}
else {
if ((definedExports || name in moduleObj) && moduleObj[name] === value)
return value;
moduleObj[name] = value;
}
for (var i = 0; i < importerSetters.length; i++)
importerSetters[i](moduleObj);
return value;
}, new ContextualLoader(loader, load.key));
link.setters = declared.setters;
link.execute = declared.execute;
if (declared.exports) {
link.moduleObj = moduleObj = declared.exports;
definedExports = true;
}
}
function instantiateDeps (loader, load, link, registry, state) {
if (link.depsInstantiatePromise)
return link.depsInstantiatePromise;
var depsInstantiatePromises = Array(link.dependencies.length);
for (var i = 0; i < link.dependencies.length; i++)
depsInstantiatePromises[i] = resolveInstantiateDep(loader, link.dependencies[i], load.key, registry, state, loader.trace && link.depMap || (link.depMap = {}));
var depsInstantiatePromise = Promise.all(depsInstantiatePromises)
.then(function (dependencyInstantiations) {
link.dependencyInstantiations = dependencyInstantiations;
// run setters to set up bindings to instantiated dependencies
if (link.setters) {
for (var i = 0; i < dependencyInstantiations.length; i++) {
var setter = link.setters[i];
if (setter) {
var instantiation = dependencyInstantiations[i];
if (instantiation instanceof ModuleNamespace) {
setter(instantiation);
}
else {
if (instantiation.loadError)
throw instantiation.loadError;
setter(instantiation.module || instantiation.linkRecord.moduleObj);
// this applies to both es and dynamic registrations
if (instantiation.importerSetters)
instantiation.importerSetters.push(setter);
}
}
}
}
return load;
});
if (loader.trace)
depsInstantiatePromise = depsInstantiatePromise.then(function () {
traceLoad(loader, load, link);
return load;
});
depsInstantiatePromise = depsInstantiatePromise.catch(function (err) {
// throw up the instantiateDeps stack
link.depsInstantiatePromise = undefined;
throw LoaderError__Check_error_message_for_loader_stack(err, 'Loading ' + load.key);
});
depsInstantiatePromise.catch(function () {});
return link.depsInstantiatePromise = depsInstantiatePromise;
}
function deepInstantiateDeps (loader, load, link, registry, state) {
return new Promise(function (resolve, reject) {
var seen = [];
var loadCnt = 0;
function queueLoad (load) {
var link = load.linkRecord;
if (!link)
return;
if (seen.indexOf(load) !== -1)
return;
seen.push(load);
loadCnt++;
instantiateDeps(loader, load, link, registry, state)
.then(processLoad, reject);
}
function processLoad (load) {
loadCnt--;
var link = load.linkRecord;
if (link) {
for (var i = 0; i < link.dependencies.length; i++) {
var depLoad = link.dependencyInstantiations[i];
if (!(depLoad instanceof ModuleNamespace))
queueLoad(depLoad);
}
}
if (loadCnt === 0)
resolve();
}
queueLoad(load);
});
}
/*
* System.register
*/
RegisterLoader.prototype.register = function (key, deps, declare) {
var state = this[REGISTER_INTERNAL];
// anonymous modules get stored as lastAnon
if (declare === undefined) {
state.lastRegister = [key, deps, undefined];
}
// everything else registers into the register cache
else {
var load = state.records[key] || createLoadRecord(state, key, undefined);
load.registration = [deps, declare, undefined];
}
};
/*
* System.registerDyanmic
*/
RegisterLoader.prototype.registerDynamic = function (key, deps, executingRequire, execute) {
var state = this[REGISTER_INTERNAL];
// anonymous modules get stored as lastAnon
if (typeof key !== 'string') {
state.lastRegister = [key, deps, executingRequire];
}
// everything else registers into the register cache
else {
var load = state.records[key] || createLoadRecord(state, key, undefined);
load.registration = [deps, executingRequire, execute];
}
};
// ContextualLoader class
// backwards-compatible with previous System.register context argument by exposing .id, .key
function ContextualLoader (loader, key) {
this.loader = loader;
this.key = this.id = key;
this.meta = {
url: key
// scriptElement: null
};
}
/*ContextualLoader.prototype.constructor = function () {
throw new TypeError('Cannot subclass the contextual loader only Reflect.Loader.');
};*/
ContextualLoader.prototype.import = function (key) {
if (this.loader.trace)
this.loader.loads[this.key].dynamicDeps.push(key);
return this.loader.import(key, this.key);
};
/*ContextualLoader.prototype.resolve = function (key) {
return this.loader.resolve(key, this.key);
};*/
// this is the execution function bound to the Module namespace record
function ensureEvaluate (loader, load, link, registry, state, seen) {
if (load.module)
return load.module;
if (load.evalError)
throw load.evalError;
if (seen && seen.indexOf(load) !== -1)
return load.linkRecord.moduleObj;
// for ES loads we always run ensureEvaluate on top-level, so empty seen is passed regardless
// for dynamic loads, we pass seen if also dynamic
var err = doEvaluate(loader, load, link, registry, state, link.setters ? [] : seen || []);
if (err)
throw err;
return load.module;
}
function makeDynamicRequire (loader, key, dependencies, dependencyInstantiations, registry, state, seen) {
// we can only require from already-known dependencies
return function (name) {
for (var i = 0; i < dependencies.length; i++) {
if (dependencies[i] === name) {
var depLoad = dependencyInstantiations[i];
var module;
if (depLoad instanceof ModuleNamespace)
module = depLoad;
else
module = ensureEvaluate(loader, depLoad, depLoad.linkRecord, registry, state, seen);
return '__useDefault' in module ? module.__useDefault : module;
}
}
throw new Error('Module ' + name + ' not declared as a System.registerDynamic dependency of ' + key);
};
}
// ensures the given es load is evaluated
// returns the error if any
function doEvaluate (loader, load, link, registry, state, seen) {
seen.push(load);
var err;
// es modules evaluate dependencies first
// non es modules explicitly call moduleEvaluate through require
if (link.setters) {
var depLoad, depLink;
for (var i = 0; i < link.dependencies.length; i++) {
depLoad = link.dependencyInstantiations[i];
if (depLoad instanceof ModuleNamespace)
continue;
// custom Module returned from instantiate
depLink = depLoad.linkRecord;
if (depLink && seen.indexOf(depLoad) === -1) {
if (depLoad.evalError)
err = depLoad.evalError;
else
// dynamic / declarative boundaries clear the "seen" list
// we just let cross format circular throw as would happen in real implementations
err = doEvaluate(loader, depLoad, depLink, registry, state, depLink.setters ? seen : []);
}
if (err) {
load.linkRecord = undefined;
load.evalError = LoaderError__Check_error_message_for_loader_stack(err, 'Evaluating ' + load.key);
return load.evalError;
}
}
}
// link.execute won't exist for Module returns from instantiate on top-level load
if (link.execute) {
// ES System.register execute
// "this" is null in ES
if (link.setters) {
err = declarativeExecute(link.execute);
}
// System.registerDynamic execute
// "this" is "exports" in CJS
else {
var module = { id: load.key };
var moduleObj = link.moduleObj;
Object.defineProperty(module, 'exports', {
configurable: true,
set: function (exports) {
moduleObj.default = moduleObj.__useDefault = exports;
},
get: function () {
return moduleObj.__useDefault;
}
});
var require = makeDynamicRequire(loader, load.key, link.dependencies, link.dependencyInstantiations, registry, state, seen);
// evaluate deps first
if (!link.executingRequire)
for (var i = 0; i < link.dependencies.length; i++)
require(link.dependencies[i]);
err = dynamicExecute(link.execute, require, moduleObj.default, module);
// pick up defineProperty calls to module.exports when we can
if (module.exports !== moduleObj.__useDefault)
moduleObj.default = moduleObj.__useDefault = module.exports;
var moduleDefault = moduleObj.default;
// __esModule flag extension support via lifting
if (moduleDefault && moduleDefault.__esModule) {
for (var p in moduleDefault) {
if (Object.hasOwnProperty.call(moduleDefault, p))
moduleObj[p] = moduleDefault[p];
}
}
}
}
// dispose link record
load.linkRecord = undefined;
if (err)
return load.evalError = LoaderError__Check_error_message_for_loader_stack(err, 'Evaluating ' + load.key);
registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);
// if not an esm module, run importer setters and clear them
// this allows dynamic modules to update themselves into es modules
// as soon as execution has completed
if (!link.setters) {
if (load.importerSetters)
for (var i = 0; i < load.importerSetters.length; i++)
load.importerSetters[i](load.module);
load.importerSetters = undefined;
}
}
// {} is the closest we can get to call(undefined)
var nullContext = {};
if (Object.freeze)
Object.freeze(nullContext);
function declarativeExecute (execute) {
try {
execute.call(nullContext);
}
catch (e) {
return e;
}
}
function dynamicExecute (execute, require, exports, module) {
try {
var output = execute.call(envGlobal, require, exports, module);
if (output !== undefined)
module.exports = output;
}
catch (e) {
return e;
}
}
var resolvedPromise$1 = Promise.resolve();
function noop () {}
var emptyModule = new ModuleNamespace({});
function protectedCreateNamespace (bindings) {
if (bindings instanceof ModuleNamespace)
return bindings;
if (bindings && bindings.__esModule)
return new ModuleNamespace(bindings);
return new ModuleNamespace({ default: bindings, __useDefault: bindings });
}
var hasStringTag;
function isModule (m) {
if (hasStringTag === undefined)
hasStringTag = typeof Symbol !== 'undefined' && !!Symbol.toStringTag;
return m instanceof ModuleNamespace || hasStringTag && Object.prototype.toString.call(m) == '[object Module]';
}
var CONFIG = createSymbol('loader-config');
var METADATA = createSymbol('metadata');
var isWorker = typeof window === 'undefined' && typeof self !== 'undefined' && typeof importScripts !== 'undefined';
function warn (msg, force) {
if (force || this.warnings && typeof console !== 'undefined' && console.warn)
console.warn(msg);
}
function checkInstantiateWasm (loader, wasmBuffer, processAnonRegister) {
var bytes = new Uint8Array(wasmBuffer);
// detect by leading bytes
// Can be (new Uint32Array(fetched))[0] === 0x6D736100 when working in Node
if (bytes[0] === 0 && bytes[1] === 97 && bytes[2] === 115) {
return WebAssembly.compile(wasmBuffer).then(function (m) {
var deps = [];
var setters = [];
var importObj = {};
// we can only set imports if supported (eg Safari doesnt support)
if (WebAssembly.Module.imports)
WebAssembly.Module.imports(m).forEach(function (i) {
var key = i.module;
setters.push(function (m) {
importObj[key] = m;
});
if (deps.indexOf(key) === -1)
deps.push(key);
});
loader.register(deps, function (_export) {
return {
setters: setters,
execute: function () {
_export(new WebAssembly.Instance(m, importObj).exports);
}
};
});
processAnonRegister();
return true;
});
}
return Promise.resolve(false);
}
var parentModuleContext;
function loadNodeModule (key, baseURL) {
if (key[0] === '.')
throw new Error('Node module ' + key + ' can\'t be loaded as it is not a package require.');
if (!parentModuleContext) {
var Module = this._nodeRequire('module');
var base = decodeURI(baseURL.substr(isWindows ? 8 : 7));
parentModuleContext = new Module(base);
parentModuleContext.paths = Module._nodeModulePaths(base);
}
return parentModuleContext.require(key);
}
function extend (a, b) {
for (var p in b) {
if (!Object.hasOwnProperty.call(b, p))
continue;
a[p] = b[p];
}
return a;
}
function prepend (a, b) {
for (var p in b) {
if (!Object.hasOwnProperty.call(b, p))
continue;
if (a[p] === undefined)
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) {
for (var p in b) {
if (!Object.hasOwnProperty.call(b, p))
continue;
var val = b[p];
if (a[p] === undefined)
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] = (_prepend ? prepend : extend)(extend({}, a[p]), val);
else if (!_prepend)
a[p] = val;
}
}
var supportsPreload = false, supportsPrefetch = false;
if (isBrowser)
(function () {
var relList = document.createElement('link').relList;
if (relList && relList.supports) {
supportsPrefetch = true;
try {
supportsPreload = relList.supports('preload');
}
catch (e) {}
}
})();
function preloadScript (url) {
// fallback to old fashioned image technique which still works in safari
if (!supportsPreload && !supportsPrefetch) {
var preloadImage = new Image();
preloadImage.src = url;
return;
}
var link = document.createElement('link');
if (supportsPreload) {
link.rel = 'preload';
link.as = 'script';
}
else {
// this works for all except Safari (detected by relList.supports lacking)
link.rel = 'prefetch';
}
link.href = url;
document.head.appendChild(link);
}
function workerImport (src, resolve, reject) {
try {
importScripts(src);
}
catch (e) {
reject(e);
}
resolve();
}
if (isBrowser) {
var onerror = window.onerror;
window.onerror = function globalOnerror (msg, src) {
if (onerror)
onerror.apply(this, arguments);
};
}
function scriptLoad (src, crossOrigin, integrity, resolve, reject) {
// percent encode just "#" for HTTP requests
src = src.replace(/#/g, '%23');
// subresource integrity is not supported in web workers
if (isWorker)
return workerImport(src, resolve, reject);
var script = document.createElement('script');
script.type = 'text/javascript';
script.charset = 'utf-8';
script.async = true;
if (crossOrigin)
script.crossOrigin = crossOrigin;
if (integrity)
script.integrity = integrity;
script.addEventListener('load', load, false);
script.addEventListener('error', error, false);
script.src = src;
document.head.appendChild(script);
function load () {
resolve();
cleanup();
}
// note this does not catch execution errors
function error (err) {
cleanup();
reject(new Error('Fetching ' + src));
}
function cleanup () {
script.removeEventListener('load', load, false);
script.removeEventListener('error', error, false);
document.head.removeChild(script);
}
}
function readMemberExpression (p, value) {
var pParts = p.split('.');
while (pParts.length)
value = value[pParts.shift()];
return value;
}
// separate out paths cache as a baseURL lock process
function applyPaths (baseURL, paths, key) {
var mapMatch = getMapMatch(paths, key);
if (mapMatch) {
var target = paths[mapMatch] + key.substr(mapMatch.length);
var resolved = resolveIfNotPlain(target, baseURI);
if (resolved !== undefined)
return resolved;
return baseURL + target;
}
else if (key.indexOf(':') !== -1) {
return key;
}
else {
return baseURL + key;
}
}
function checkMap (p) {
var name = this.name;
// can add ':' here if we want paths to match the behaviour of map
if (name.substr(0, p.length) === p && (name.length === p.length || name[p.length] === '/' || p[p.length - 1] === '/' || p[p.length - 1] === ':')) {
var curLen = p.split('/').length;
if (curLen > this.len) {
this.match = p;
this.len = curLen;
}
}
}
function getMapMatch (map, name) {
if (Object.hasOwnProperty.call(map, name))
return name;
var bestMatch = {
name: name,
match: undefined,
len: 0
};
Object.keys(map).forEach(checkMap, bestMatch);
return bestMatch.match;
}
// RegEx adjusted from https://github.com/jbrantly/yabble/blob/master/lib/yabble.js#L339
var cjsRequireRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF."'])require\s*\(\s*("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\]*(?:\\.[^`\\]*)*`)\s*\)/g;
/*
* Source loading
*/
function fetchFetch (url, authorization, integrity, asBuffer) {
// fetch doesn't support file:/// urls
if (url.substr(0, 8) === 'file:///') {
if (hasXhr)
return xhrFetch(url, authorization, integrity, asBuffer);
else
throw new Error('Unable to fetch file URLs in this environment.');
}
// percent encode just "#" for HTTP requests
url = url.replace(/#/g, '%23');
var opts = {
// NB deprecate
headers: { Accept: 'application/x-es-module, */*' }
};
if (integrity)
opts.integrity = integrity;
if (authorization) {
if (typeof authorization == 'string')
opts.headers['Authorization'] = authorization;
opts.credentials = 'include';
}
return fetch(url, opts)
.then(function(res) {
if (res.ok)
return asBuffer ? res.arrayBuffer() : res.text();
else
throw new Error('Fetch error: ' + res.status + ' ' + res.statusText);
});
}
function xhrFetch (url, authorization, integrity, asBuffer) {
return new Promise(function (resolve, reject) {
// percent encode just "#" for HTTP requests
url = url.replace(/#/g, '%23');
var xhr = new XMLHttpRequest();
if (asBuffer)
xhr.responseType = 'arraybuffer';
function load() {
resolve(asBuffer ? xhr.response : 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.response) {
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;
}
}
xhr.send(null);
});
}
var fs;
function nodeFetch (url, authorization, integrity, asBuffer) {
if (url.substr(0, 8) != 'file:///') {
if (hasFetch)
return fetchFetch(url, authorization, integrity, asBuffer);
else
return Promise.reject(new Error('Unable to fetch "' + url + '". Only file URLs of the form file:/// supported running in Node without fetch.'));
}
fs = fs || require('fs');
if (isWindows)
url = url.replace(/\//g, '\\').substr(8);
else
url = url.substr(7);
return new Promise(function (resolve, reject) {
fs.readFile(url, function(err, data) {
if (err) {
return reject(err);
}
else {
if (asBuffer) {
resolve(data);
}
else {
// Strip Byte Order Mark out if it's the leading char
var dataString = data + '';
if (dataString[0] === '\ufeff')
dataString = dataString.substr(1);
resolve(dataString);
}
}
});
});
}
function noFetch () {
throw new Error('No fetch method is defined for this environment.');
}
var fetchFunction;
var hasXhr = typeof XMLHttpRequest !== 'undefined';
var hasFetch = typeof fetch !== 'undefined';
if (typeof self !== 'undefined' && typeof self.fetch !== 'undefined')
fetchFunction = fetchFetch;
else if (hasXhr)
fetchFunction = xhrFetch;
else if (typeof require !== 'undefined' && typeof process !== 'undefined')
fetchFunction = nodeFetch;
else
fetchFunction = noFetch;
var fetch$1 = fetchFunction;
function createMetadata () {
return {
pluginKey: undefined,
pluginArgument: undefined,
pluginModule: undefined,
packageKey: undefined,
packageConfig: undefined,
load: undefined
};
}
function getParentMetadata (loader, config, parentKey) {
var parentMetadata = createMetadata();
if (parentKey) {
// detect parent plugin
// we just need pluginKey to be truthy for package configurations
// so we duplicate it as pluginArgument - although not correct its not used
var parentPluginIndex;
if (config.pluginFirst) {
if ((parentPluginIndex = parentKey.lastIndexOf('!')) !== -1)
parentMetadata.pluginArgument = parentMetadata.pluginKey = parentKey.substr(0, parentPluginIndex);
}
else {
if ((parentPluginIndex = parentKey.indexOf('!')) !== -1)
parentMetadata.pluginArgument = parentMetadata.pluginKey = parentKey.substr(parentPluginIndex + 1);
}
// detect parent package
parentMetadata.packageKey = getMapMatch(config.packages, parentKey);
if (parentMetadata.packageKey)
parentMetadata.packageConfig = config.packages[parentMetadata.packageKey];
}
return parentMetadata;
}
function normalize (key, parentKey) {
var config = this[CONFIG];
var metadata = createMetadata();
var parentMetadata = getParentMetadata(this, config, parentKey);
var loader = this;
return Promise.resolve()
// boolean conditional
.then(function () {
// first we normalize the conditional
var booleanIndex = key.lastIndexOf('#?');
if (booleanIndex === -1)
return Promise.resolve(key);
var conditionObj = parseCondition.call(loader, key.substr(booleanIndex + 2));
// in builds, return normalized conditional
/*if (this.builder)
return this.resolve(conditionObj.module, parentKey)
.then(function (conditionModule) {
conditionObj.module = conditionModule;
return key.substr(0, booleanIndex) + '#?' + serializeCondition(conditionObj);
});*/
return resolveCondition.call(loader, conditionObj, parentKey, true)
.then(function (conditionValue) {
return conditionValue ? key.substr(0, booleanIndex) : '@empty';
});
})
// plugin
.then(function (key) {
var parsed = parsePlugin(config.pluginFirst, key);
if (!parsed)
return packageResolve.call(loader, config, key, parentMetadata && parentMetadata.pluginArgument || parentKey, metadata, parentMetadata, false);
metadata.pluginKey = parsed.plugin;
return Promise.all([
packageResolve.call(loader, config, parsed.argument, parentMetadata && parentMetadata.pluginArgument || parentKey, metadata, parentMetadata, true),
loader.resolve(parsed.plugin, parentKey)
])
.then(function (normalized) {
metadata.pluginArgument = normalized[0];
metadata.pluginKey = normalized[1];
// don't allow a plugin to load itself
if (metadata.pluginArgument === metadata.pluginKey)
throw new Error('Plugin ' + metadata.pluginArgument + ' cannot load itself, make sure it is excluded from any wildcard meta configuration via a custom loader: false rule.');
return combinePluginParts(config.pluginFirst, normalized[0], normalized[1]);
});
})
.then(function (normalized) {
return interpolateConditional.call(loader, normalized, parentKey, parentMetadata);
})
.then(function (normalized) {
setMeta.call(loader, config, normalized, metadata);
if (metadata.pluginKey || !metadata.load.loader)
return normalized;
// loader by configuration
// normalizes to parent to support package loaders
return loader.resolve(metadata.load.loader, normalized)
.then(function (pluginKey) {
metadata.pluginKey = pluginKey;
metadata.pluginArgument = normalized;
return normalized;
});
})
.then(function (normalized) {
loader[METADATA][normalized] = metadata;
return normalized;
});
}
// normalization function used for registry keys
// just does coreResolve without map
function decanonicalize (config, key) {
var parsed = parsePlugin(config.pluginFirst, key);
// plugin
if (parsed) {
var pluginKey = decanonicalize.call(this, config, parsed.plugin);
return combinePluginParts(config.pluginFirst, coreResolve.call(this, config, parsed.argument, undefined, false, false), pluginKey);
}
return coreResolve.call(this, config, key, undefined, false, false);
}
function normalizeSync (key, parentKey) {
var config = this[CONFIG];
// normalizeSync is metadataless, so create metadata
var metadata = createMetadata();
var parentMetadata = parentMetadata || getParentMetadata(this, config, parentKey);
var parsed = parsePlugin(config.pluginFirst, key);
// plugin
if (parsed) {
metadata.pluginKey = normalizeSync.call(this, parsed.plugin, parentKey);
return combinePluginParts(config.pluginFirst,
packageResolveSync.call(this, config, parsed.argument, parentMetadata.pluginArgument || parentKey, metadata, parentMetadata, !!metadata.pluginKey),
metadata.pluginKey);
}
return packageResolveSync.call(this, config, key, parentMetadata.pluginArgument || parentKey, metadata, parentMetadata, !!metadata.pluginKey);
}
function coreResolve (config, key, parentKey, doMap, packageName) {
var relativeResolved = resolveIfNotPlain(key, parentKey || baseURI);
// standard URL resolution
if (relativeResolved)
return applyPaths(config.baseURL, config.paths, relativeResolved);
// plain keys not starting with './', 'x://' and '/' go through custom resolution
if (doMap) {
var mapMatch = getMapMatch(config.map, key);
if (mapMatch) {
key = config.map[mapMatch] + key.substr(mapMatch.length);
relativeResolved = resolveIfNotPlain(key, baseURI);
if (relativeResolved)
return applyPaths(config.baseURL, config.paths, relativeResolved);
}
}
if (this.registry.has(key))
return key;
if (key.substr(0, 6) === '@node/')
return key;
var trailingSlash = packageName && key[key.length - 1] !== '/';
var resolved = applyPaths(config.baseURL, config.paths, trailingSlash ? key + '/' : key);
if (trailingSlash)
return resolved.substr(0, resolved.length - 1);
return resolved;
}
function packageResolveSync (config, key, parentKey, metadata, parentMetadata, skipExtensions) {
// ignore . since internal maps handled by standard package resolution
if (parentMetadata && parentMetadata.packageConfig && key[0] !== '.') {
var parentMap = parentMetadata.packageConfig.map;
var parentMapMatch = parentMap && getMapMatch(parentMap, key);
if (parentMapMatch && typeof parentMap[parentMapMatch] === 'string') {
var mapped = doMapSync(this, config, parentMetadata.packageConfig, parentMetadata.packageKey, parentMapMatch, key, metadata, skipExtensions);
if (mapped)
return mapped;
}
}
var normalized = coreResolve.call(this, config, key, parentKey, true, true);
var pkgConfigMatch = getPackageConfigMatch(config, normalized);
metadata.packageKey = pkgConfigMatch && pkgConfigMatch.packageKey || getMapMatch(config.packages, normalized);
if (!metadata.packageKey)
return normalized;
if (config.packageConfigKeys.indexOf(normalized) !== -1) {
metadata.packageKey = undefined;
return normalized;
}
metadata.packageConfig = config.packages[metadata.packageKey] || (config.packages[metadata.packageKey] = createPackage());
var subPath = normalized.substr(metadata.packageKey.length + 1);
return applyPackageConfigSync(this, config, metadata.packageConfig, metadata.packageKey, subPath, metadata, skipExtensions);
}
function packageResolve (config, key, parentKey, metadata, parentMetadata, skipExtensions) {
var loader = this;
return resolvedPromise$1
.then(function () {
// ignore . since internal maps handled by standard package resolution
if (parentMetadata && parentMetadata.packageConfig && key.substr(0, 2) !== './') {
var parentMap = parentMetadata.packageConfig.map;
var parentMapMatch = parentMap && getMapMatch(parentMap, key);
if (parentMapMatch)
return doMap(loader, config, parentMetadata.packageConfig, parentMetadata.packageKey, parentMapMatch, key, metadata, skipExtensions);
}
return resolvedPromise$1;
})
.then(function (mapped) {
if (mapped)
return mapped;
// apply map, core, paths, contextual package map
var normalized = coreResolve.call(loader, config, key, parentKey, true, true);
var pkgConfigMatch = getPackageConfigMatch(config, normalized);
metadata.packageKey = pkgConfigMatch && pkgConfigMatch.packageKey || getMapMatch(config.packages, normalized);
if (!metadata.packageKey)
return Promise.resolve(normalized);
if (config.packageConfigKeys.indexOf(normalized) !== -1) {
metadata.packageKey = undefined;
metadata.load = createMeta();
metadata.load.format = 'json';
// ensure no loader
metadata.load.loader = '';
return Promise.resolve(normalized);
}
metadata.packageConfig = config.packages[metadata.packageKey] || (config.packages[metadata.packageKey] = createPackage());
// load configuration when it matches packageConfigPaths, not already configured, and not the config itself
var loadConfig = pkgConfigMatch && !metadata.packageConfig.configured;
return (loadConfig ? loadPackageConfigPath(loader, config, pkgConfigMatch.configPath, metadata) : resolvedPromise$1)
.then(function () {
var subPath = normalized.substr(metadata.packageKey.length + 1);
return applyPackageConfig(loader, config, metadata.packageConfig, metadata.packageKey, subPath, metadata, skipExtensions);
});
});
}
function createMeta () {
return {
extension: '',
deps: undefined,
format: undefined,
loader: undefined,
scriptLoad: undefined,
globals: undefined,
nonce: undefined,
integrity: undefined,
sourceMap: undefined,
exports: undefined,
encapsulateGlobal: false,
crossOrigin: undefined,
cjsRequireDetection: true,
cjsDeferDepsExecute: false,
esModule: false
};
}
function setMeta (config, key, metadata) {
metadata.load = metadata.load || createMeta();
// apply wildcard metas
var bestDepth = 0;
var wildcardIndex;
for (var module in config.meta) {
wildcardIndex = module.indexOf('*');
if (wildcardIndex === -1)
continue;
if (module.substr(0, wildcardIndex) === key.substr(0, wildcardIndex)
&& module.substr(wildcardIndex + 1) === key.substr(key.length - module.length + wildcardIndex + 1)) {
var depth = module.split('/').length;
if (depth > bestDepth)
bestDepth = depth;
extendMeta(metadata.load, config.meta[module], bestDepth !== depth);
}
}
// apply exact meta
if (config.meta[key])
extendMeta(metadata.load, config.meta[key], false);
// apply package meta
if (metadata.packageKey) {
var subPath = key.substr(metadata.packageKey.length + 1);
var meta = {};
if (metadata.packageConfig.meta) {
var bestDepth = 0;
getMetaMatches(metadata.packageConfig.meta, subPath, function (metaPattern, matchMeta, matchDepth) {
if (matchDepth > bestDepth)
bestDepth = matchDepth;
extendMeta(meta, matchMeta, matchDepth && bestDepth > matchDepth);
});
extendMeta(metadata.load, meta, false);
}
// format
if (metadata.packageConfig.format && !metadata.pluginKey && !metadata.load.loader)
metadata.load.format = metadata.load.format || metadata.packageConfig.format;
}
}
function parsePlugin (pluginFirst, key) {
var argumentKey;
var pluginKey;
var pluginIndex = pluginFirst ? key.indexOf('!') : key.lastIndexOf('!');
if (pluginIndex === -1)
return;
if (pluginFirst) {
argumentKey = key.substr(pluginIndex + 1);
pluginKey = key.substr(0, pluginIndex);
}
else {
argumentKey = key.substr(0, pluginIndex);
pluginKey = key.substr(pluginIndex + 1) || argumentKey.substr(argumentKey.lastIndexOf('.') + 1);
}
return {
argument: argumentKey,
plugin: pluginKey
};
}
// put key back together after parts have been normalized
function combinePluginParts (pluginFirst, argumentKey, pluginKey) {
if (pluginFirst)
return pluginKey + '!' + argumentKey;
else
return argumentKey + '!' + pluginKey;
}
/*
* Package Configuration Extension
*
* Example:
*
* SystemJS.packages = {
* jquery: {
* main: 'index.js', // when not set, package key is requested directly
* format: 'amd',
* defaultExtension: 'ts', // defaults to 'js', can be set to false
* modules: {
* '*.ts': {
* loader: 'typescript'
* },
* 'vendor/sizzle.js': {
* format: 'global'
* }
* },
* map: {
* // map internal require('sizzle') to local require('./vendor/sizzle')
* sizzle: './vendor/sizzle.js',
* // map any internal or external require of 'jquery/vendor/another' to 'another/index.js'
* './vendor/another.js': './another/index.js',
* // test.js / test -> lib/test.js
* './test.js': './lib/test.js',
*
* // environment-specific map configurations
* './index.js': {
* '~browser': './index-node.js',
* './custom-condition.js|~export': './index-custom.js'
* }
* },
* // allows for setting package-prefixed depCache
* // keys are normalized module keys relative to the package itself
* depCache: {
* // import 'package/index.js' loads in parallel package/lib/test.js,package/vendor/sizzle.js
* './index.js': ['./test'],
* './test.js': ['external-dep'],
* 'external-dep/path.js': ['./another.js']
* }
* }
* };
*
* Then:
* import 'jquery' -> jquery/index.js
* import 'jquery/submodule' -> jquery/submodule.js
* import 'jquery/submodule.ts' -> jquery/submodule.ts loaded as typescript
* import 'jquery/vendor/another' -> another/index.js
*
* Detailed Behaviours
* - main can have a leading "./" can be added optionally
* - map and defaultExtension are applied to the main
* - defaultExtension adds the extension only if the exact extension is not present
* - if a meta value is available for a module, map and defaultExtension are skipped
* - like global map, package map also applies to subpaths (sizzle/x, ./vendor/another/sub)
* - condition module map is '@env' module in package or '@system-env' globally
* - map targets support conditional interpolation ('./x': './x.#{|env}.js')
* - internal package map targets cannot use boolean conditionals
*
* Package Configuration Loading
*
* Not all packages may already have their configuration present in the System config
* For these cases, a list of packageConfigPaths can be provided, which when matched against
* a request, will first request a ".json" file by the package key to derive the package
* configuration from. This allows dynamic loading of non-predetermined code, a key use
* case in SystemJS.
*
* Example:
*
* SystemJS.packageConfigPaths = ['packages/test/package.json', 'packages/*.json'];
*
* // will first request 'packages/new-package/package.json' for the package config
* // before completing the package request to 'packages/new-package/path'
* SystemJS.import('packages/new-package/path');
*
* // will first request 'packages/test/package.json' before the main
* SystemJS.import('packages/test');
*
* When a package matches packageConfigPaths, it will always send a config request for
* the package configuration.
* The package key itself is taken to be the match up to and including the last wildcard
* or trailing slash.
* The most specific package config path will be used.
* Any existing package configurations for the package will deeply merge with the
* package config, with the existing package configurations taking preference.
* To opt-out of the package configuration request for a package that matches
* packageConfigPaths, use the { configured: true } package config option.
*
*/
function addDefaultExtension (config, pkg, pkgKey, subPath, skipExtensions) {
// don't apply extensions to folders or if defaultExtension = false
if (!subPath || !pkg.defaultExtension || subPath[subPath.length - 1] === '/' || skipExtensions)
return subPath;
var metaMatch = false;
// exact meta or meta with any content after the last wildcard skips extension
if (pkg.meta)
getMetaMatches(pkg.meta, subPath, function (metaPattern, matchMeta, matchDepth) {
if (matchDepth === 0 || metaPattern.lastIndexOf('*') !== metaPattern.length - 1)
return metaMatch = true;
});
// exact global meta or meta with any content after the last wildcard skips extension
if (!metaMatch && config.meta)
getMetaMatches(config.meta, pkgKey + '/' + subPath, function (metaPattern, matchMeta, matchDepth) {
if (matchDepth === 0 || metaPattern.lastIndexOf('*') !== metaPattern.length - 1)
return metaMatch = true;
});
if (metaMatch)
return subPath;
// work out what the defaultExtension is and add if not there already
var defaultExtension = '.' + pkg.defaultExtension;
if (subPath.substr(subPath.length - defaultExtension.length) !== defaultExtension)
return subPath + defaultExtension;
else
return subPath;
}
function applyPackageConfigSync (loader, config, pkg, pkgKey, subPath, metadata, skipExtensions) {
// main
if (!subPath) {
if (pkg.main)
subPath = pkg.main.substr(0, 2) === './' ? pkg.main.substr(2) : pkg.main;
else
// also no submap if key is package itself (import 'pkg' -> 'path/to/pkg.js')
// NB can add a default package main convention here
// if it becomes internal to the package then it would no longer be an exit path
return pkgKey;
}
// map config checking without then with extensions
if (pkg.map) {
var mapPath = './' + subPath;
var mapMatch = getMapMatch(pkg.map, mapPath);
// we then check map with the default extension adding
if (!mapMatch) {
mapPath = './' + addDefaultExtension(config, pkg, pkgKey, subPath, skipExtensions);
if (mapPath !== './' + subPath)
mapMatch = getMapMatch(pkg.map, mapPath);
}
if (mapMatch) {
var mapped = doMapSync(loader, config, pkg, pkgKey, mapMatch, mapPath, metadata, skipExtensions);
if (mapped)
return mapped;
}
}
// normal package resolution
return pkgKey + '/' + addDefaultExtension(config, pkg, pkgKey, subPath, skipExtensions);
}
function validMapping (mapMatch, mapped, path) {
// allow internal ./x -> ./x/y or ./x/ -> ./x/y recursive maps
// but only if the path is exactly ./x and not ./x/z
if (mapped.substr(0, mapMatch.length) === mapMatch && path.length > mapMatch.length)
return false;
return true;
}
function doMapSync (loader, config, pkg, pkgKey, mapMatch, path, metadata, skipExtensions) {
if (path[path.length - 1] === '/')
path = path.substr(0, path.length - 1);
var mapped = pkg.map[mapMatch];
if (typeof mapped === 'object')
throw new Error('Synchronous conditional normalization not supported sync normalizing ' + mapMatch + ' in ' + pkgKey);
if (!validMapping(mapMatch, mapped, path) || typeof mapped !== 'string')
return;
return packageResolveSync.call(loader, config, mapped + path.substr(mapMatch.length), pkgKey + '/', metadata, metadata, skipExtensions);
}
function applyPackageConfig (loader, config, pkg, pkgKey, subPath, metadata, skipExtensions) {
// main
if (!subPath) {
if (pkg.main)
subPath = pkg.main.substr(0, 2) === './' ? pkg.main.substr(2) : pkg.main;
// also no submap if key is package itself (import 'pkg' -> 'path/to/pkg.js')
else
// NB can add a default package main convention here
// if it becomes internal to the package then it would no longer be an exit path
return Promise.resolve(pkgKey);
}
// map config checking without then with extensions
var mapPath, mapMatch;
if (pkg.map) {
mapPath = './' + subPath;
mapMatch = getMapMatch(pkg.map, mapPath);
// we then check map with the default extension adding
if (!mapMatch) {
mapPath = './' + addDefaultExtension(config, pkg, pkgKey, subPath, skipExtensions);
if (mapPath !== './' + subPath)
mapMatch = getMapMatch(pkg.map, mapPath);
}
}
return (mapMatch ? doMap(loader, config, pkg, pkgKey, mapMatch, mapPath, metadata, skipExtensions) : resolvedPromise$1)
.then(function (mapped) {
if (mapped)
return Promise.resolve(mapped);
// normal package resolution / fallback resolution for no conditional match
return Promise.resolve(pkgKey + '/' + addDefaultExtension(config, pkg, pkgKey, subPath, skipExtensions));
});
}
function doMap (loader, config, pkg, pkgKey, mapMatch, path, metadata, skipExtensions) {
if (path[path.length - 1] === '/')
path = path.substr(0, path.length - 1);
var mapped = pkg.map[mapMatch];
if (typeof mapped === 'string') {
if (!validMapping(mapMatch, mapped, path))
return resolvedPromise$1;
return packageResolve.call(loader, config, mapped + path.substr(mapMatch.length), pkgKey + '/', metadata, metadata, skipExtensions)
.then(function (normalized) {
return interpolateConditional.call(loader, normalized, pkgKey + '/', metadata);
});
}
// we use a special conditional syntax to allow the builder to handle conditional branch points further
/*if (loader.builder)
return Promise.resolve(pkgKey + '/#:' + path);*/
// we load all conditions upfront
var conditionPromises = [];
var conditions = [];
for (var e in mapped) {
var c = parseCondition(e);
conditions.push({
condition: c,
map: mapped[e]
});
conditionPromises.push(RegisterLoader.prototype.import.call(loader, c.module, pkgKey));
}
// map object -> conditional map
return Promise.all(conditionPromises)
.then(function (conditionValues) {
// first map condition to match is used
for (var i = 0; i < conditions.length; i++) {
var c = conditions[i].condition;
var value = readMemberExpression(c.prop, '__useDefault' in conditionValues[i] ? conditionValues[i].__useDefault : conditionValues[i]);
if (!c.negate && value || c.negate && !value)
return conditions[i].map;
}
})
.then(function (mapped) {
if (mapped) {
if (!validMapping(mapMatch, mapped, path))
return resolvedPromise$1;
return packageResolve.call(loader, config, mapped + path.substr(mapMatch.length), pkgKey + '/', metadata, metadata, skipExtensions)
.then(function (normalized) {
return interpolateConditional.call(loader, normalized, pkgKey + '/', metadata);
});
}
// no environment match -> fallback to original subPath by returning undefined
});
}
// check if the given normalized key matches a packageConfigPath
// if so, loads the config
var packageConfigPaths = {};
// data object for quick checks against package paths
function createPkgConfigPathObj (path) {
var lastWildcard = path.lastIndexOf('*');
var length = Math.max(lastWildcard + 1, path.lastIndexOf('/'));
return {
length: length,
regEx: new RegExp('^(' + path.substr(0, length).replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '[^\\/]+') + ')(\\/|$)'),
wildcard: lastWildcard !== -1
};
}
// most specific match wins
function getPackageConfigMatch (config, normalized) {
var pkgKey, exactMatch = false, configPath;
for (var i = 0; i < config.packageConfigPaths.length; i++) {
var packageConfigPath = config.packageConfigPaths[i];
var p = packageConfigPaths[packageConfigPath] || (packageConfigPaths[packageConfigPath] = createPkgConfigPathObj(packageConfigPath));
if (normalized.length < p.length)
continue;
var match = normalized.match(p.regEx);
if (match && (!pkgKey || (!(exactMatch && p.wildcard) && pkgKey.length < match[1].length))) {
pkgKey = match[1];
exactMatch = !p.wildcard;
configPath = pkgKey + packageConfigPath.substr(p.length);
}
}
if (!pkgKey)
return;
return {
packageKey: pkgKey,
configPath: configPath
};
}
function loadPackageConfigPath (loader, config, pkgConfigPath, metadata, normalized) {
var configLoader = loader.pluginLoader || loader;
// ensure we note this is a package config file path
// it will then be skipped from getting other normalizations itself to ensure idempotency
if (config.packageConfigKeys.indexOf(pkgConfigPath) === -1)
config.packageConfigKeys.push(pkgConfigPath);
return configLoader.import(pkgConfigPath)
.then(function (pkgConfig) {
setPkgConfig(metadata.packageConfig, pkgConfig, metadata.packageKey, true, config);
metadata.packageConfig.configured = true;
})
.catch(function (err) {
throw LoaderError__Check_error_message_for_loader_stack(err, 'Unable to fetch package configuration file ' + pkgConfigPath);
});
}
function getMetaMatches (pkgMeta, subPath, matchFn) {
// wildcard meta
var wildcardIndex;
for (var module in pkgMeta) {
// allow meta to start with ./ for flexibility
var dotRel = module.substr(0, 2) === './' ? './' : '';
if (dotRel)
module = module.substr(2);
wildcardIndex = module.indexOf('*');
if (wildcardIndex === -1)
continue;
if (module.substr(0, wildcardIndex) === subPath.substr(0, wildcardIndex)
&& module.substr(wildcardIndex + 1) === subPath.substr(subPath.length - module.length + wildcardIndex + 1)) {
// alow match function to return true for an exit path
if (matchFn(module, pkgMeta[dotRel + module], module.split('/').length))
return;
}
}
// exact meta
var exactMeta = pkgMeta[subPath] && Object.hasOwnProperty.call(pkgMeta, subPath) ? pkgMeta[subPath] : pkgMeta['./' + subPath];
if (exactMeta)
matchFn(exactMeta, exactMeta, 0);
}
/*
* Conditions Extension
*
* Allows a condition module to alter the resolution of an import via syntax:
*
* import $ from 'jquery/#{browser}';
*
* Will first load the module 'browser' via `SystemJS.import('browser')` and
* take the default export of that module.
* If the default export is not a string, an error is thrown.
*
* We then substitute the string into the require to get the conditional resolution
* enabling environment-specific variations like:
*
* import $ from 'jquery/ie'
* import $ from 'jquery/firefox'
* import $ from 'jquery/chrome'
* import $ from 'jquery/safari'
*
* It can be useful for a condition module to define multiple conditions.
* This can be done via the `|` modifier to specify an export member expression:
*
* import 'jquery/#{./browser.js|grade.version}'
*
* Where the `grade` export `version` member in the `browser.js` module is substituted.
*
*
* Boolean Conditionals
*
* For polyfill modules, that are used as imports but have no module value,
* a binary conditional allows a module not to be loaded at all if not needed:
*
* import 'es5-shim#?./conditions.js|needs-es5shim'
*
* These conditions can also be negated via:
*
* import 'es5-shim#?./conditions.js|~es6'
*
*/
var sysConditions = ['browser', 'node', 'dev', 'build', 'production', 'default'];
function parseCondition (condition) {
var conditionExport, conditionModule, negation;
var negation;
var conditionExportIndex = condition.lastIndexOf('|');
if (conditionExportIndex !== -1) {
conditionExport = condition.substr(conditionExportIndex + 1);
conditionModule = condition.substr(0, conditionExportIndex);
if (conditionExport[0] === '~') {
negation = true;
conditionExport = conditionExport.substr(1);
}
}
else {
negation = condition[0] === '~';
conditionExport = 'default';
conditionModule = condition.substr(negation);
if (sysConditions.indexOf(conditionModule) !== -1) {
conditionExport = conditionModule;
conditionModule = null;
}
}
return {
module: conditionModule || '@system-env',
prop: conditionExport,
negate: negation
};
}
function resolveCondition (conditionObj, parentKey, bool) {
// import without __useDefault handling here
return RegisterLoader.prototype.import.call(this, conditionObj.module, parentKey)
.then(function (condition) {
var m = readMemberExpression(conditionObj.prop, condition);
if (bool && typeof m !== 'boolean')
throw new TypeError('Condition did not resolve to a boolean.');
return conditionObj.negate ? !m : m;
});
}
var interpolationRegEx = /#\{[^\}]+\}/;
function interpolateConditional (key, parentKey, parentMetadata) {
// first we normalize the conditional
var conditionalMatch = key.match(interpolationRegEx);
if (!conditionalMatch)
return Promise.resolve(key);
var conditionObj = parseCondition.call(this, conditionalMatch[0].substr(2, conditionalMatch[0].length - 3));
// in builds, return normalized conditional
/*if (this.builder)
return this.normalize(conditionObj.module, parentKey, createMetadata(), parentMetadata)
.then(function (conditionModule) {
conditionObj.module = conditionModule;
return key.replace(interpolationRegEx, '#{' + serializeCondition(conditionObj) + '}');
});*/
return resolveCondition.call(this, conditionObj, parentKey, false)
.then(function (conditionValue) {
if (typeof conditionValue !== 'string')
throw new TypeError('The condition value for ' + key + ' doesn\'t resolve to a string.');
if (conditionValue.indexOf('/') !== -1)
throw new TypeError('Unabled to interpolate conditional ' + key + (parentKey ? ' in ' + parentKey : '') + '\n\tThe condition value ' + conditionValue + ' cannot contain a "/" separator.');
return key.replace(interpolationRegEx, conditionValue);
});
}
/*
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.
*/
var envConfigNames = ['browserConfig', 'nodeConfig', 'devConfig', 'buildConfig', 'productionConfig'];
function envSet(loader, cfg, envCallback) {
for (var i = 0; i < envConfigNames.length; i++) {
var envConfig = envConfigNames[i];
if (cfg[envConfig] && envModule[envConfig.substr(0, envConfig.length - 6)])
envCallback(cfg[envConfig]);
}
}
function cloneObj (obj, maxDepth) {
var clone = {};
for (var p in obj) {
var prop = obj[p];
if (maxDepth > 1) {
if (prop instanceof Array)
clone[p] = [].concat(prop);
else if (typeof prop === 'object')
clone[p] = cloneObj(prop, maxDepth - 1);
else if (p !== 'packageConfig')
clone[p] = prop;
}
else {
clone[p] = prop;
}
}
return clone;
}
function getConfigItem (config, p) {
var cfgItem = config[p];
// getConfig must return an unmodifiable clone of the configuration
if (cfgItem instanceof Array)
return config[p].concat([]);
else if (typeof cfgItem === 'object')
return cloneObj(cfgItem, 3)
else
return config[p];
}
function getConfig (configName) {
if (configName) {
if (configNames.indexOf(configName) !== -1)
return getConfigItem(this[CONFIG], configName);
throw new Error('"' + configName + '" is not a valid configuration name. Must be one of ' + configNames.join(', ') + '.');
}
var cfg = {};
for (var i = 0; i < configNames.length; i++) {
var p = configNames[i];
var configItem = getConfigItem(this[CONFIG], p);
if (configItem !== undefined)
cfg[p] = configItem;
}
return cfg;
}
function setConfig (cfg, isEnvConfig) {
var loader = this;
var config = this[CONFIG];
if ('warnings' in cfg)
config.warnings = cfg.warnings;
if ('wasm' in cfg)
config.wasm = typeof WebAssembly !== 'undefined' && cfg.wasm;
if ('production' in cfg || 'build' in cfg)
setProduction.call(loader, !!cfg.production, !!(cfg.build || envModule && envModule.build));
if (!isEnvConfig) {
// if using nodeConfig / browserConfig / productionConfig, take baseURL from there
// these exceptions will be unnecessary when we can properly implement config queuings
var baseURL;
envSet(loader, cfg, function(cfg) {
baseURL = baseURL || cfg.baseURL;
});
baseURL = baseURL || cfg.baseURL;
// always configure baseURL first
if (baseURL) {
config.baseURL = resolveIfNotPlain(baseURL, baseURI) || resolveIfNotPlain('./' + baseURL, baseURI);
if (config.baseURL[config.baseURL.length - 1] !== '/')
config.baseURL += '/';
}
if (cfg.paths)
extend(config.paths, cfg.paths);
envSet(loader, cfg, function(cfg) {
if (cfg.paths)
extend(config.paths, cfg.paths);
});
for (var p in config.paths) {
if (config.paths[p].indexOf('*') === -1)
continue;
warn.call(config, 'Path config ' + p + ' -> ' + config.paths[p] + ' is no longer supported as wildcards are deprecated.');
delete config.paths[p];
}
}
if (cfg.defaultJSExtensions)
warn.call(config, 'The defaultJSExtensions configuration option is deprecated.\n Use packages defaultExtension instead.', true);
if (typeof cfg.pluginFirst === 'boolean')
config.pluginFirst = cfg.pluginFirst;
if (cfg.map) {
for (var p in cfg.map) {
var v = cfg.map[p];
if (typeof v === 'string') {
var mapped = coreResolve.call(loader, config, v, undefined, false, false);
if (mapped[mapped.length -1] === '/' && p[p.length - 1] !== ':' && p[p.length - 1] !== '/')
mapped = mapped.substr(0, mapped.length - 1);
config.map[p] = mapped;
}
// object map
else {
var pkgName = coreResolve.call(loader, config, p[p.length - 1] !== '/' ? p + '/' : p, undefined, true, true);
pkgName = pkgName.substr(0, pkgName.length - 1);
var pkg = config.packages[pkgName];
if (!pkg) {
pkg = config.packages[pkgName] = createPackage();
// use '' instead of false to keep type consistent
pkg.defaultExtension = '';
}
setPkgConfig(pkg, { map: v }, pkgName, false, config);
}
}
}
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 = coreResolve.call(loader, config, path.substr(0, packageLength), undefined, false, false);
packageConfigPaths[i] = normalized + path.substr(packageLength);
}
config.packageConfigPaths = packageConfigPaths;
}
if (cfg.bundles) {
for (var p in cfg.bundles) {
var bundle = [];
for (var i = 0; i < cfg.bundles[p].length; i++)
bundle.push(loader.normalizeSync(cfg.bundles[p][i]));
config.bundles[p] = bundle;
}
}
if (cfg.packages) {
for (var p in cfg.packages) {
if (p.match(/^([^\/]+:)?\/\/$/))
throw new TypeError('"' + p + '" is not a valid package name.');
var pkgName = coreResolve.call(loader, config, p[p.length - 1] !== '/' ? p + '/' : p, undefined, true, true);
pkgName = pkgName.substr(0, pkgName.length - 1);
setPkgConfig(config.packages[pkgName] = config.packages[pkgName] || createPackage(), cfg.packages[p], pkgName, false, config);
}
}
if (cfg.depCache) {
for (var p in cfg.depCache)
config.depCache[loader.normalizeSync(p)] = [].concat(cfg.depCache[p]);
}
if (cfg.meta) {
for (var p in cfg.meta) {
// base wildcard stays base
if (p[0] === '*') {
extend(config.meta[p] = config.meta[p] || {}, cfg.meta[p]);
}
else {
var resolved = coreResolve.call(loader, config, p, undefined, true, true);
extend(config.meta[resolved] = config.meta[resolved] || {}, cfg.meta[p]);
}
}
}
if ('transpiler' in cfg)
config.transpiler = cfg.transpiler;
// copy any remaining non-standard configuration properties
for (var c in cfg) {
if (configNames.indexOf(c) !== -1)
continue;
if (envConfigNames.indexOf(c) !== -1)
continue;
// warn.call(config, 'Setting custom config option `System.config({ ' + c + ': ... })` is deprecated. Avoid custom config options or set SystemJS.' + c + ' = ... directly.');
loader[c] = cfg[c];
}
envSet(loader, cfg, function(cfg) {
loader.config(cfg, true);
});
}
function createPackage () {
return {
defaultExtension: undefined,
main: undefined,
format: undefined,
meta: undefined,
map: undefined,
packageConfig: undefined,
configured: false
};
}
// deeply-merge (to first level) config with any existing package config
function setPkgConfig (pkg, cfg, pkgName, prependConfig, config) {
for (var prop in cfg) {
if (prop === 'main' || prop === 'format' || prop === 'defaultExtension' || prop === 'configured') {
if (!prependConfig || pkg[prop] === undefined)
pkg[prop] = cfg[prop];
}
else if (prop === 'map') {
(prependConfig ? prepend : extend)(pkg.map = pkg.map || {}, cfg.map);
}
else if (prop === 'meta') {
(prependConfig ? prepend : extend)(pkg.meta = pkg.meta || {}, cfg.meta);
}
else if (Object.hasOwnProperty.call(cfg, prop)) {
warn.call(config, '"' + prop + '" is not a valid package configuration option in package ' + pkgName);
}
}
// default defaultExtension for packages only
if (pkg.defaultExtension === undefined)
pkg.defaultExtension = 'js';
if (pkg.main === undefined && pkg.map && pkg.map['.']) {
pkg.main = pkg.map['.'];
delete pkg.map['.'];
}
// main object becomes main map
else 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;
}
var hasBuffer = typeof Buffer !== 'undefined';
try {
if (hasBuffer && new Buffer('a').toString('base64') !== 'YQ==')
hasBuffer = false;
}
catch (e) {
hasBuffer = false;
}
var sourceMapPrefix = '\n//# sourceMapping' + 'URL=data:application/json;base64,';
function inlineSourceMap (sourceMapString) {
if (hasBuffer)
return sourceMapPrefix + new Buffer(sourceMapString).toString('base64');
else if (typeof btoa !== 'undefined')
return sourceMapPrefix + btoa(unescape(encodeURIComponent(sourceMapString)));
else
return '';
}
function getSource(source, sourceMap, address, wrap) {
var lastLineIndex = source.lastIndexOf('\n');
if (sourceMap) {
if (typeof sourceMap != 'object')
throw new TypeError('load.metadata.sourceMap must be set to an object.');
sourceMap = JSON.stringify(sourceMap);
}
return (wrap ? '(function(System, SystemJS) {' : '') + source + (wrap ? '\n})(System, System);' : '')
// adds the sourceURL comment if not already present
+ (source.substr(lastLineIndex, 15) != '\n//# sourceURL='
? '\n//# sourceURL=' + address + (sourceMap ? '!transpiled' : '') : '')
// add sourceMappingURL if load.metadata.sourceMap is set
+ (sourceMap && inlineSourceMap(sourceMap) || '');
}
// script execution via injecting a script tag into the page
// this allows CSP nonce to be set for CSP environments
var head;
function scriptExec(loader, source, sourceMap, address, nonce) {
if (!head)
head = document.head || document.body || document.documentElement;
var script = document.createElement('script');
script.text = getSource(source, sourceMap, address, false);
var onerror = window.onerror;
var e;
window.onerror = function(_e) {
e = addToError(_e, 'Evaluating ' + address);
if (onerror)
onerror.apply(this, arguments);
};
preExec(loader);
if (nonce)
script.setAttribute('nonce', nonce);
head.appendChild(script);
head.removeChild(script);
postExec();
window.onerror = onerror;
if (e)
return e;
}
var vm;
var useVm;
var curSystem;
var callCounter = 0;
function preExec (loader) {
if (callCounter++ == 0)
curSystem = envGlobal.System;
envGlobal.System = envGlobal.SystemJS = loader;
}
function postExec () {
if (--callCounter == 0)
envGlobal.System = envGlobal.SystemJS = curSystem;
}
var supportsScriptExec = false;
if (isBrowser && typeof document != 'undefined' && document.getElementsByTagName) {
if (!(window.chrome && window.chrome.extension || navigator.userAgent.match(/^Node\.js/)))
supportsScriptExec = true;
}
function evaluate (loader, source, sourceMap, address, integrity, nonce, noWrap) {
if (!source)
return;
if (nonce && supportsScriptExec)
return scriptExec(loader, source, sourceMap, address, nonce);
try {
preExec(loader);
// global scoped eval for node (avoids require scope leak)
if (!vm && loader._nodeRequire) {
vm = loader._nodeRequire('vm');
useVm = vm.runInThisContext("typeof System !== 'undefined' && System") === loader;
}
if (useVm)
vm.runInThisContext(getSource(source, sourceMap, address, !noWrap), { filename: address + (sourceMap ? '!transpiled' : '') });
else
(0, eval)(getSource(source, sourceMap, address, !noWrap));
postExec();
}
catch (e) {
postExec();
return e;
}
}
function setHelpers (loader) {
loader.set('@@cjs-helpers', loader.newModule({
requireResolve: requireResolve.bind(loader),
getPathVars: getPathVars
}));
loader.set('@@global-helpers', loader.newModule({
prepareGlobal: prepareGlobal
}));
}
function setAmdHelper (loader) {
/*
AMD-compatible require
To copy RequireJS, set window.require = window.requirejs = loader.amdRequire
*/
function require (names, callback, errback, referer) {
// in amd, first arg can be a config object... we just ignore
if (typeof names === 'object' && !(names instanceof Array))
return require.apply(null, Array.prototype.splice.call(arguments, 1, arguments.length - 1));
// amd require
if (typeof names === 'string' && typeof callback === 'function')
names = [names];
if (names instanceof Array) {
var dynamicRequires = [];
for (var i = 0; i < names.length; i++)
dynamicRequires.push(loader.import(names[i], referer));
Promise.all(dynamicRequires).then(function (modules) {
if (callback)
callback.apply(null, modules);
}, errback);
}
// commonjs require
else if (typeof names === 'string') {
var normalized = loader.decanonicalize(names, referer);
var module = loader.get(normalized);
if (!module)
throw new Error('Module not already loaded loading "' + names + '" as ' + normalized + (referer ? ' from "' + referer + '".' : '.'));
return '__useDefault' in module ? module.__useDefault : module;
}
else
throw new TypeError('Invalid require');
}
function define (name, deps, factory) {
if (typeof name !== 'string') {
factory = deps;
deps = name;
name = null;
}
if (!(deps instanceof Array)) {
factory = deps;
deps = ['require', 'exports', 'module'].splice(0, factory.length);
}
if (typeof factory !== 'function')
factory = (function (factory) {
return function() { return factory; }
})(factory);
if (!name) {
if (curMetaDeps) {
deps = deps.concat(curMetaDeps);
curMetaDeps = undefined;
}
}
// remove system dependencies
var requireIndex, exportsIndex, moduleIndex;
if ((requireIndex = deps.indexOf('require')) !== -1) {
deps.splice(requireIndex, 1);
// only trace cjs requires for non-named
// named defines assume the trace has already been done
if (!name)
deps = deps.concat(amdGetCJSDeps(factory.toString(), requireIndex));
}
if ((exportsIndex = deps.indexOf('exports')) !== -1)
deps.splice(exportsIndex, 1);
if ((moduleIndex = deps.indexOf('module')) !== -1)
deps.splice(moduleIndex, 1);
function execute (req, exports, module) {
var depValues = [];
for (var i = 0; i < deps.length; i++)
depValues.push(req(deps[i]));
module.uri = module.id;
module.config = noop;
// add back in system dependencies
if (moduleIndex !== -1)
depValues.splice(moduleIndex, 0, module);
if (exportsIndex !== -1)
depValues.splice(exportsIndex, 0, exports);
if (requireIndex !== -1) {
var contextualRequire = function (names, callback, errback) {
if (typeof names === 'string' && typeof callback !== 'function')
return req(names);
return require.call(loader, names, callback, errback, module.id);
};
contextualRequire.toUrl = function (name) {
return loader.normalizeSync(name, module.id);
};
depValues.splice(requireIndex, 0, contextualRequire);
}
// set global require to AMD require
var curRequire = envGlobal.require;
envGlobal.require = require;
var output = factory.apply(exportsIndex === -1 ? envGlobal : exports, depValues);
envGlobal.require = curRequire;
if (typeof output !== 'undefined')
module.exports = output;
}
// anonymous define
if (!name) {
loader.registerDynamic(deps, false, curEsModule ? wrapEsModuleExecute(execute) : execute);
}
else {
loader.registerDynamic(name, deps, false, execute);
// if we don't have any other defines,
// then let this be an anonymous define
// this is just to support single modules of the form:
// define('jquery')
// still loading anonymously
// because it is done widely enough to be useful
// as soon as there is more than one define, this gets removed though
if (lastNamedDefine) {
lastNamedDefine = undefined;
multipleNamedDefines = true;
}
else if (!multipleNamedDefines) {
lastNamedDefine = [deps, execute];
}
}
}
define.amd = {};
loader.amdDefine = define;
loader.amdRequire = require;
}
// CJS
var windowOrigin;
if (typeof window !== 'undefined' && typeof document !== 'undefined' && window.location)
windowOrigin = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '');
function stripOrigin(path) {
if (path.substr(0, 8) === 'file:///')
return path.substr(7 + !!isWindows);
if (windowOrigin && path.substr(0, windowOrigin.length) === windowOrigin)
return path.substr(windowOrigin.length);
return path;
}
function requireResolve (request, parentId) {
return stripOrigin(this.normalizeSync(request, parentId));
}
function getPathVars (moduleId) {
// remove any plugin syntax
var pluginIndex = moduleId.lastIndexOf('!');
var filename;
if (pluginIndex !== -1)
filename = moduleId.substr(0, pluginIndex);
else
filename = moduleId;
var dirname = filename.split('/');
dirname.pop();
dirname = dirname.join('/');
return {
filename: stripOrigin(filename),
dirname: stripOrigin(dirname)
};
}
var commentRegEx = /(^|[^\\])(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg;
var stringRegEx = /("[^"\\\n\r]*(\\.[^"\\\n\r]*)*"|'[^'\\\n\r]*(\\.[^'\\\n\r]*)*')/g;
// extract CJS dependencies from source text via regex static analysis
// read require('x') statements not in comments or strings
function getCJSDeps (source) {
cjsRequireRegEx.lastIndex = commentRegEx.lastIndex = stringRegEx.lastIndex = 0;
var deps = [];
var match;
// track string and comment locations for unminified source
var stringLocations = [], commentLocations = [];
function inLocation (locations, match) {
for (var i = 0; i < locations.length; i++)
if (locations[i][0] < match.index && locations[i][1] > match.index)
return true;
return false;
}
if (source.length / source.split('\n').length < 200) {
while (match = stringRegEx.exec(source))
stringLocations.push([match.index, match.index + match[0].length]);
// TODO: track template literals here before comments
while (match = commentRegEx.exec(source)) {
// only track comments not starting in strings
if (!inLocation(stringLocations, match))
commentLocations.push([match.index + match[1].length, match.index + match[0].length - 1]);
}
}
while (match = cjsRequireRegEx.exec(source)) {
// ensure we're not within a string or comment location
if (!inLocation(stringLocations, match) && !inLocation(commentLocations, match)) {
var dep = match[1].substr(1, match[1].length - 2);
// skip cases like require('" + file + "')
if (dep.match(/"|'/))
continue;
deps.push(dep);
}
}
return deps;
}
// Global
// bare minimum ignores
var ignoredGlobalProps = ['_g', 'sessionStorage', 'localStorage', 'clipboardData', 'frames', 'frameElement', 'external',
'mozAnimationStartTime', 'mozPaintCount', 'webkitStorageInfo', 'webkitIndexedDB', 'mozInnerScreenY', 'mozInnerScreenX'];
var globalSnapshot;
function globalIterator (globalName) {
if (ignoredGlobalProps.indexOf(globalName) !== -1)
return;
try {
var value = envGlobal[globalName];
}
catch (e) {
ignoredGlobalProps.push(globalName);
}
this(globalName, value);
}
function getGlobalValue (exports) {
if (typeof exports === 'string')
return readMemberExpression(exports, envGlobal);
if (!(exports instanceof Array))
throw new Error('Global exports must be a string or array.');
var globalValue = {};
for (var i = 0; i < exports.length; i++)
globalValue[exports[i].split('.').pop()] = readMemberExpression(exports[i], envGlobal);
return globalValue;
}
function prepareGlobal (moduleName, exports, globals, encapsulate) {
// disable module detection
var curDefine = envGlobal.define;
envGlobal.define = undefined;
// set globals
var oldGlobals;
if (globals) {
oldGlobals = {};
for (var g in globals) {
oldGlobals[g] = envGlobal[g];
envGlobal[g] = globals[g];
}
}
// store a complete copy of the global object in order to detect changes
if (!exports) {
globalSnapshot = {};
Object.keys(envGlobal).forEach(globalIterator, function (name, value) {
globalSnapshot[name] = value;
});
}
// return function to retrieve global
return function () {
var globalValue = exports ? getGlobalValue(exports) : {};
var singleGlobal;
var multipleExports = !!exports;
if (!exports || encapsulate)
Object.keys(envGlobal).forEach(globalIterator, function (name, value) {
if (globalSnapshot[name] === value)
return;
if (value === undefined)
return;
// allow global encapsulation where globals are removed
if (encapsulate)
envGlobal[name] = undefined;
if (!exports) {
globalValue[name] = value;
if (singleGlobal !== undefined) {
if (!multipleExports && singleGlobal !== value)
multipleExports = true;
}
else {
singleGlobal = value;
}
}
});
globalValue = multipleExports ? globalValue : singleGlobal;
// revert globals
if (oldGlobals) {
for (var g in oldGlobals)
envGlobal[g] = oldGlobals[g];
}
envGlobal.define = curDefine;
return globalValue;
};
}
// AMD
var cjsRequirePre = "(?:^|[^$_a-zA-Z\\xA0-\\uFFFF.])";
var cjsRequirePost = "\\s*\\(\\s*(\"([^\"]+)\"|'([^']+)')\\s*\\)";
var fnBracketRegEx = /\(([^\)]*)\)/;
var wsRegEx = /^\s+|\s+$/g;
var requireRegExs = {};
function amdGetCJSDeps(source, requireIndex) {
// remove comments
source = source.replace(commentRegEx, '');
// determine the require alias
var params = source.match(fnBracketRegEx);
var requireAlias = (params[1].split(',')[requireIndex] || 'require').replace(wsRegEx, '');
// find or generate the regex for this requireAlias
var requireRegEx = requireRegExs[requireAlias] || (requireRegExs[requireAlias] = new RegExp(cjsRequirePre + requireAlias + cjsRequirePost, 'g'));
requireRegEx.lastIndex = 0;
var deps = [];
var match;
while (match = requireRegEx.exec(source))
deps.push(match[2] || match[3]);
return deps;
}
function wrapEsModuleExecute (execute) {
return function (require, exports, module) {
execute(require, exports, module);
exports = module.exports;
if ((typeof exports === 'object' || typeof exports === 'function') && !('__esModule' in exports))
Object.defineProperty(module.exports, '__esModule', {
value: true
});
};
}
// generate anonymous define from singular named define
var multipleNamedDefines = false;
var lastNamedDefine;
var curMetaDeps;
var curEsModule = false;
function clearLastDefine (metaDeps, esModule) {
curMetaDeps = metaDeps;
curEsModule = esModule;
lastNamedDefine = undefined;
multipleNamedDefines = false;
}
function registerLastDefine (loader) {
if (lastNamedDefine)
loader.registerDynamic(curMetaDeps ? lastNamedDefine[0].concat(curMetaDeps) : lastNamedDefine[0],
false, curEsModule ? wrapEsModuleExecute(lastNamedDefine[1]) : lastNamedDefine[1]);
// bundles are an empty module
else if (multipleNamedDefines)
loader.registerDynamic([], false, noop);
}
var supportsScriptLoad = (isBrowser || isWorker) && typeof navigator !== 'undefined' && navigator.userAgent && !navigator.userAgent.match(/MSIE (9|10).0/);
// include the node require since we're overriding it
var nodeRequire;
if (typeof require !== 'undefined' && typeof process !== 'undefined' && !process.browser)
nodeRequire = require;
function setMetaEsModule (metadata, moduleValue) {
if (metadata.load.esModule && (typeof moduleValue === 'object' || typeof moduleValue === 'function') &&
!('__esModule' in moduleValue))
Object.defineProperty(moduleValue, '__esModule', {
value: true
});
}
function instantiate$1 (key, processAnonRegister) {
var loader = this;
var config = this[CONFIG];
// first do bundles and depCache
return (loadBundlesAndDepCache(config, this, key) || resolvedPromise$1)
.then(function () {
if (processAnonRegister())
return;
var metadata = loader[METADATA][key];
// node module loading
if (key.substr(0, 6) === '@node/') {
if (!loader._nodeRequire)
throw new TypeError('Error loading ' + key + '. Can only load node core modules in Node.');
loader.registerDynamic([], false, function () {
return loadNodeModule.call(loader, key.substr(6), loader.baseURL);
});
processAnonRegister();
return;
}
if (metadata.load.scriptLoad ) {
if (metadata.load.pluginKey || !supportsScriptLoad) {
metadata.load.scriptLoad = false;
warn.call(config, 'scriptLoad not supported for "' + key + '"');
}
}
else if (metadata.load.scriptLoad !== false && !metadata.load.pluginKey && supportsScriptLoad) {
// auto script load AMD, global without deps
if (!metadata.load.deps && !metadata.load.globals &&
(metadata.load.format === 'system' || metadata.load.format === 'register' || metadata.load.format === 'global' && metadata.load.exports))
metadata.load.scriptLoad = true;
}
// fetch / translate / instantiate pipeline
if (!metadata.load.scriptLoad)
return initializePlugin(loader, key, metadata)
.then(function () {
return runFetchPipeline(loader, key, metadata, processAnonRegister, config.wasm);
})
// just script loading
return new Promise(function (resolve, reject) {
if (metadata.load.format === 'amd' && envGlobal.define !== loader.amdDefine)
throw new Error('Loading AMD with scriptLoad requires setting the global `' + globalName + '.define = SystemJS.amdDefine`');
scriptLoad(key, metadata.load.crossOrigin, metadata.load.integrity, function () {
if (!processAnonRegister()) {
metadata.load.format = 'global';
var globalValue = metadata.load.exports && getGlobalValue(metadata.load.exports);
loader.registerDynamic([], false, function () {
setMetaEsModule(metadata, globalValue);
return globalValue;
});
processAnonRegister();
}
resolve();
}, reject);
});
})
.then(function (instantiated) {
delete loader[METADATA][key];
return instantiated;
});
}
function initializePlugin (loader, key, metadata) {
if (!metadata.pluginKey)
return resolvedPromise$1;
return loader.import(metadata.pluginKey).then(function (plugin) {
metadata.pluginModule = plugin;
metadata.pluginLoad = {
name: key,
address: metadata.pluginArgument,
source: undefined,
metadata: metadata.load
};
metadata.load.deps = metadata.load.deps || [];
});
}
function loadBundlesAndDepCache (config, loader, key) {
// load direct deps, in turn will pick up their trace trees
var deps;
if (isBrowser && (deps = config.depCache[key])) {
for (var i = 0; i < deps.length; i++)
loader.normalize(deps[i], key).then(preloadScript);
}
else {
var matched = false;
for (var b in config.bundles) {
for (var i = 0; i < config.bundles[b].length; i++) {
var curModule = config.bundles[b][i];
if (curModule === key) {
matched = true;
break;
}
// wildcard in bundles includes / boundaries
if (curModule.indexOf('*') !== -1) {
var parts = curModule.split('*');
if (parts.length !== 2) {
config.bundles[b].splice(i--, 1);
continue;
}
if (key.substr(0, parts[0].length) === parts[0] &&
key.substr(key.length - parts[1].length, parts[1].length) === parts[1]) {
matched = true;
break;
}
}
}
if (matched)
return loader.import(b);
}
}
}
function runFetchPipeline (loader, key, metadata, processAnonRegister, wasm) {
if (metadata.load.exports && !metadata.load.format)
metadata.load.format = 'global';
return resolvedPromise$1
// locate
.then(function () {
if (!metadata.pluginModule || !metadata.pluginModule.locate)
return;
return Promise.resolve(metadata.pluginModule.locate.call(loader, metadata.pluginLoad))
.then(function (address) {
if (address)
metadata.pluginLoad.address = address;
});
})
// fetch
.then(function () {
if (!metadata.pluginModule)
return fetch$1(key, metadata.load.authorization, metadata.load.integrity, wasm);
wasm = false;
if (!metadata.pluginModule.fetch)
return fetch$1(metadata.pluginLoad.address, metadata.load.authorization, metadata.load.integrity, false);
return metadata.pluginModule.fetch.call(loader, metadata.pluginLoad, function (load) {
return fetch$1(load.address, metadata.load.authorization, metadata.load.integrity, false);
});
})
.then(function (fetched) {
// fetch is already a utf-8 string if not doing wasm detection
if (!wasm || typeof fetched === 'string')
return translateAndInstantiate(loader, key, fetched, metadata, processAnonRegister);
return checkInstantiateWasm(loader, fetched, processAnonRegister)
.then(function (wasmInstantiated) {
if (wasmInstantiated)
return;
// not wasm -> convert buffer into utf-8 string to execute as a module
// TextDecoder compatibility matches WASM currently. Need to keep checking this.
// The TextDecoder interface is documented at http://encoding.spec.whatwg.org/#interface-textdecoder
var stringSource = isBrowser ? new TextDecoder('utf-8').decode(new Uint8Array(fetched)) : fetched.toString();
return translateAndInstantiate(loader, key, stringSource, metadata, processAnonRegister);
});
});
}
function translateAndInstantiate (loader, key, source, metadata, processAnonRegister) {
return Promise.resolve(source)
// translate
.then(function (source) {
if (metadata.load.format === 'detect')
metadata.load.format = undefined;
readMetaSyntax(source, metadata);
if (!metadata.pluginModule)
return source;
metadata.pluginLoad.source = source;
if (!metadata.pluginModule.translate)
return source;
return Promise.resolve(metadata.pluginModule.translate.call(loader, metadata.pluginLoad, metadata.traceOpts))
.then(function (translated) {
if (metadata.load.sourceMap) {
if (typeof metadata.load.sourceMap !== 'object')
throw new Error('metadata.load.sourceMap must be set to an object.');
sanitizeSourceMap(metadata.pluginLoad.address, metadata.load.sourceMap);
}
if (typeof translated === 'string')
return translated;
else
return metadata.pluginLoad.source;
});
})
.then(function (source) {
if (!metadata.load.format && source.substring(0, 8) === '"bundle"') {
metadata.load.format = 'system';
return source;
}
if (metadata.load.format === 'register' || !metadata.load.format && detectRegisterFormat(source)) {
metadata.load.format = 'register';
return source;
}
if (metadata.load.format !== 'esm' && (metadata.load.format || !source.match(esmRegEx))) {
return source;
}
metadata.load.format = 'esm';
return transpile(loader, source, key, metadata, processAnonRegister);
})
// instantiate
.then(function (translated) {
if (typeof translated !== 'string' || !metadata.pluginModule || !metadata.pluginModule.instantiate)
return translated;
var calledInstantiate = false;
metadata.pluginLoad.source = translated;
return Promise.resolve(metadata.pluginModule.instantiate.call(loader, metadata.pluginLoad, function (load) {
translated = load.source;
metadata.load = load.metadata;
if (calledInstantiate)
throw new Error('Instantiate must only be called once.');
calledInstantiate = true;
}))
.then(function (result) {
if (calledInstantiate)
return translated;
return protectedCreateNamespace(result);
});
})
.then(function (source) {
// plugin instantiate result case
if (typeof source !== 'string')
return source;
if (!metadata.load.format)
metadata.load.format = detectLegacyFormat(source);
var registered = false;
switch (metadata.load.format) {
case 'esm':
case 'register':
case 'system':
var err = evaluate(loader, source, metadata.load.sourceMap, key, metadata.load.integrity, metadata.load.nonce, false);
if (err)
throw err;
if (!processAnonRegister())
return emptyModule;
return;
break;
case 'json':
// warn.call(config, '"json" module format is deprecated.');
var parsed = JSON.parse(source);
return loader.newModule({ default: parsed, __useDefault: parsed });
case 'amd':
var curDefine = envGlobal.define;
envGlobal.define = loader.amdDefine;
clearLastDefine(metadata.load.deps, metadata.load.esModule);
var err = evaluate(loader, source, metadata.load.sourceMap, key, metadata.load.integrity, metadata.load.nonce, false);
// if didn't register anonymously, use the last named define if only one
registered = processAnonRegister();
if (!registered) {
registerLastDefine(loader);
registered = processAnonRegister();
}
envGlobal.define = curDefine;
if (err)
throw err;
break;
case 'cjs':
var metaDeps = metadata.load.deps;
var deps = (metadata.load.deps || []).concat(metadata.load.cjsRequireDetection ? getCJSDeps(source) : []);
for (var g in metadata.load.globals)
if (metadata.load.globals[g])
deps.push(metadata.load.globals[g]);
loader.registerDynamic(deps, true, function (require, exports, module) {
require.resolve = function (key) {
return requireResolve.call(loader, key, module.id);
};
// support module.paths ish
module.paths = [];
module.require = require;
// ensure meta deps execute first
if (!metadata.load.cjsDeferDepsExecute && metaDeps)
for (var i = 0; i < metaDeps.length; i++)
require(metaDeps[i]);
var pathVars = getPathVars(module.id);
var __cjsWrapper = {
exports: exports,
args: [require, exports, module, pathVars.filename, pathVars.dirname, envGlobal, envGlobal]
};
var cjsWrapper = "(function (require, exports, module, __filename, __dirname, global, GLOBAL";
// add metadata.globals to the wrapper arguments
if (metadata.load.globals)
for (var g in metadata.load.globals) {
__cjsWrapper.args.push(require(metadata.load.globals[g]));
cjsWrapper += ", " + g;
}
// disable AMD detection
var define = envGlobal.define;
envGlobal.define = undefined;
envGlobal.__cjsWrapper = __cjsWrapper;
source = cjsWrapper + ") {" + source.replace(hashBangRegEx$1, '') + "\n}).apply(__cjsWrapper.exports, __cjsWrapper.args);";
var err = evaluate(loader, source, metadata.load.sourceMap, key, metadata.load.integrity, metadata.load.nonce, false);
if (err)
throw err;
setMetaEsModule(metadata, exports);
envGlobal.__cjsWrapper = undefined;
envGlobal.define = define;
});
registered = processAnonRegister();
break;
case 'global':
var deps = metadata.load.deps || [];
for (var g in metadata.load.globals) {
var gl = metadata.load.globals[g];
if (gl)
deps.push(gl);
}
loader.registerDynamic(deps, false, function (require, exports, module) {
var globals;
if (metadata.load.globals) {
globals = {};
for (var g in metadata.load.globals)
if (metadata.load.globals[g])
globals[g] = require(metadata.load.globals[g]);
}
var exportName = metadata.load.exports;
if (exportName)
source += '\n' + globalName + '["' + exportName + '"] = ' + exportName + ';';
var retrieveGlobal = prepareGlobal(module.id, exportName, globals, metadata.load.encapsulateGlobal);
var err = evaluate(loader, source, metadata.load.sourceMap, key, metadata.load.integrity, metadata.load.nonce, true);
if (err)
throw err;
var output = retrieveGlobal();
setMetaEsModule(metadata, output);
return output;
});
registered = processAnonRegister();
break;
default:
throw new TypeError('Unknown module format "' + metadata.load.format + '" for "' + key + '".' + (metadata.load.format === 'es6' ? ' Use "esm" instead here.' : ''));
}
if (!registered)
throw new Error('Module ' + key + ' detected as ' + metadata.load.format + ' but didn\'t execute correctly.');
});
}
var globalName = typeof self != 'undefined' ? 'self' : 'global';
// good enough ES6 module detection regex - format detections not designed to be accurate, but to handle the 99% use case
var esmRegEx = /(^\s*|[}\);\n]\s*)(import\s*(['"]|(\*\s+as\s+)?(?!type)([^"'\(\)\n; ]+)\s*from\s*['"]|\{)|export\s+\*\s+from\s+["']|export\s*(\{|default|function|class|var|const|let|async\s+function))/;
var leadingCommentAndMetaRegEx = /^(\s*\/\*[^\*]*(\*(?!\/)[^\*]*)*\*\/|\s*\/\/[^\n]*|\s*"[^"]+"\s*;?|\s*'[^']+'\s*;?)*\s*/;
function detectRegisterFormat(source) {
var leadingCommentAndMeta = source.match(leadingCommentAndMetaRegEx);
if (!leadingCommentAndMeta)
return false;
var codeStart = leadingCommentAndMeta[0].length;
return source.startsWith('System.register', codeStart) || source.startsWith('SystemJS.register', codeStart);
}
// AMD Module Format Detection RegEx
// define([.., .., ..], ...)
// define(varName); || define(function(require, exports) {}); || define({})
var amdRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.])define\s*\(\s*("[^"]+"\s*,\s*|'[^']+'\s*,\s*)?\s*(\[(\s*(("[^"]+"|'[^']+')\s*,|\/\/.*\r?\n|\/\*(.|\s)*?\*\/))*(\s*("[^"]+"|'[^']+')\s*,?)?(\s*(\/\/.*\r?\n|\/\*(.|\s)*?\*\/))*\s*\]|function\s*|{|[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*\))/;
/// require('...') || exports[''] = ... || exports.asd = ... || module.exports = ...
var cjsExportsRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.])(exports\s*(\[['"]|\.)|module(\.exports|\['exports'\]|\["exports"\])\s*(\[['"]|[=,\.]))/;
// used to support leading #!/usr/bin/env in scripts as supported in Node
var hashBangRegEx$1 = /^\#\!.*/;
function detectLegacyFormat (source) {
if (source.match(amdRegEx))
return 'amd';
cjsExportsRegEx.lastIndex = 0;
cjsRequireRegEx.lastIndex = 0;
if (cjsRequireRegEx.exec(source) || cjsExportsRegEx.exec(source))
return 'cjs';
// global is the fallback format
return 'global';
}
function sanitizeSourceMap (address, sourceMap) {
var originalName = address.split('!')[0];
// force set the filename of the original file
if (!sourceMap.file || sourceMap.file == address)
sourceMap.file = originalName + '!transpiled';
// force set the sources list if only one source
if (!sourceMap.sources || sourceMap.sources.length <= 1 && (!sourceMap.sources[0] || sourceMap.sources[0] === address))
sourceMap.sources = [originalName];
}
function transpile (loader, source, key, metadata, processAnonRegister) {
if (!loader.transpiler)
throw new TypeError('Unable to dynamically transpile ES module\n A loader plugin needs to be configured via `SystemJS.config({ transpiler: \'transpiler-module\' })`.');
// deps support for es transpile
if (metadata.load.deps) {
var depsPrefix = '';
for (var i = 0; i < metadata.load.deps.length; i++)
depsPrefix += 'import "' + metadata.load.deps[i] + '"; ';
source = depsPrefix + source;
}
// do transpilation
return loader.import.call(loader, loader.transpiler)
.then(function (transpiler) {
transpiler = transpiler.__useDefault || transpiler;
// translate hooks means this is a transpiler plugin instead of a raw implementation
if (!transpiler.translate)
throw new Error(loader.transpiler + ' is not a valid transpiler plugin.');
// if transpiler is the same as the plugin loader, then don't run twice
if (transpiler === metadata.pluginModule)
return source;
// convert the source map into an object for transpilation chaining
if (typeof metadata.load.sourceMap === 'string')
metadata.load.sourceMap = JSON.parse(metadata.load.sourceMap);
metadata.pluginLoad = metadata.pluginLoad || {
name: key,
address: key,
source: source,
metadata: metadata.load
};
metadata.load.deps = metadata.load.deps || [];
return Promise.resolve(transpiler.translate.call(loader, metadata.pluginLoad, metadata.traceOpts))
.then(function (source) {
// sanitize sourceMap if an object not a JSON string
var sourceMap = metadata.load.sourceMap;
if (sourceMap && typeof sourceMap === 'object')
sanitizeSourceMap(key, sourceMap);
if (metadata.load.format === 'esm' && detectRegisterFormat(source))
metadata.load.format = 'register';
return source;
});
}, function (err) {
throw LoaderError__Check_error_message_for_loader_stack(err, 'Unable to load transpiler to transpile ' + key);
});
}
// detect any meta header syntax
// only set if not already set
var metaRegEx = /^(\s*\/\*[^\*]*(\*(?!\/)[^\*]*)*\*\/|\s*\/\/[^\n]*|\s*"[^"]+"\s*;?|\s*'[^']+'\s*;?)+/;
var metaPartRegEx = /\/\*[^\*]*(\*(?!\/)[^\*]*)*\*\/|\/\/[^\n]*|"[^"]+"\s*;?|'[^']+'\s*;?/g;
function setMetaProperty(target, p, value) {
var pParts = p.split('.');
var curPart;
while (pParts.length > 1) {
curPart = pParts.shift();
target = target[curPart] = target[curPart] || {};
}
curPart = pParts.shift();
if (target[curPart] === undefined)
target[curPart] = value;
}
function readMetaSyntax (source, metadata) {
var meta = source.match(metaRegEx);
if (!meta)
return;
var metaParts = meta[0].match(metaPartRegEx);
for (var i = 0; i < metaParts.length; i++) {
var curPart = metaParts[i];
var len = curPart.length;
var firstChar = curPart.substr(0, 1);
if (curPart.substr(len - 1, 1) == ';')
len--;
if (firstChar != '"' && firstChar != "'")
continue;
var metaString = curPart.substr(1, curPart.length - 3);
var metaName = metaString.substr(0, metaString.indexOf(' '));
if (metaName) {
var metaValue = metaString.substr(metaName.length + 1, metaString.length - metaName.length - 1);
if (metaName === 'deps')
metaName = 'deps[]';
if (metaName.substr(metaName.length - 2, 2) === '[]') {
metaName = metaName.substr(0, metaName.length - 2);
metadata.load[metaName] = metadata.load[metaName] || [];
metadata.load[metaName].push(metaValue);
}
// "use strict" is not meta
else if (metaName !== 'use') {
setMetaProperty(metadata.load, metaName, metaValue);
}
}
else {
metadata.load[metaString] = true;
}
}
}
var scriptSrc;
// Promise detection and error message
if (typeof Promise === 'undefined')
throw new Error('SystemJS needs a Promise polyfill.');
if (typeof document !== 'undefined') {
var scripts = document.getElementsByTagName('script');
var curScript = scripts[scripts.length - 1];
if (document.currentScript && (curScript.defer || curScript.async))
curScript = document.currentScript;
scriptSrc = curScript && curScript.src;
}
// worker
else if (typeof importScripts !== 'undefined') {
try {
throw new Error('_');
}
catch (e) {
e.stack.replace(/(?:at|@).*(http.+):[\d]+:[\d]+/, function(m, url) {
scriptSrc = url;
});
}
}
// node
else if (typeof __filename !== 'undefined') {
scriptSrc = __filename;
}
function SystemJSLoader () {
RegisterLoader.call(this);
// NB deprecate
this._loader = {};
// internal metadata store
this[METADATA] = {};
// internal configuration
this[CONFIG] = {
baseURL: baseURI,
paths: {},
packageConfigPaths: [],
packageConfigKeys: [],
map: {},
packages: {},
depCache: {},
meta: {},
bundles: {},
production: false,
transpiler: undefined,
loadedBundles: {},
// global behaviour flags
warnings: false,
pluginFirst: false,
// enable wasm loading and detection when supported
wasm: false
};
// make the location of the system.js script accessible (if any)
this.scriptSrc = scriptSrc;
this._nodeRequire = nodeRequire;
// support the empty module, as a concept
this.registry.set('@empty', emptyModule);
setProduction.call(this, false, false);
// add module format helpers
setHelpers(this);
setAmdHelper(this);
}
var envModule;
function setProduction (isProduction, isBuilder) {
this[CONFIG].production = isProduction;
this.registry.set('@system-env', envModule = this.newModule({
browser: isBrowser,
node: !!this._nodeRequire,
production: !isBuilder && isProduction,
dev: isBuilder || !isProduction,
build: isBuilder,
'default': true
}));
}
SystemJSLoader.prototype = Object.create(RegisterLoader.prototype);
SystemJSLoader.prototype.constructor = SystemJSLoader;
// NB deprecate normalize
SystemJSLoader.prototype[SystemJSLoader.resolve = RegisterLoader.resolve] = SystemJSLoader.prototype.normalize = normalize;
SystemJSLoader.prototype.load = function (key, parentKey) {
warn.call(this[CONFIG], 'System.load is deprecated.');
return this.import(key, parentKey);
};
// NB deprecate decanonicalize, normalizeSync
SystemJSLoader.prototype.decanonicalize = SystemJSLoader.prototype.normalizeSync = SystemJSLoader.prototype.resolveSync = normalizeSync;
SystemJSLoader.prototype[SystemJSLoader.instantiate = RegisterLoader.instantiate] = instantiate$1;
SystemJSLoader.prototype.config = setConfig;
SystemJSLoader.prototype.getConfig = getConfig;
SystemJSLoader.prototype.global = envGlobal;
SystemJSLoader.prototype.import = function () {
return RegisterLoader.prototype.import.apply(this, arguments)
.then(function (m) {
return '__useDefault' in m ? m.__useDefault : m;
});
};
var configNames = ['baseURL', 'map', 'paths', 'packages', 'packageConfigPaths', 'depCache', 'meta', 'bundles', 'transpiler', 'warnings', 'pluginFirst', 'production', 'wasm'];
var hasProxy = typeof Proxy !== 'undefined';
for (var i = 0; i < configNames.length; i++) (function (configName) {
Object.defineProperty(SystemJSLoader.prototype, configName, {
get: function () {
var cfg = getConfigItem(this[CONFIG], configName);
if (hasProxy && typeof cfg === 'object')
cfg = new Proxy(cfg, {
set: function (target, option) {
throw new Error('Cannot set SystemJS.' + configName + '["' + option + '"] directly. Use SystemJS.config({ ' + configName + ': { "' + option + '": ... } }) rather.');
}
});
//if (typeof cfg === 'object')
// warn.call(this[CONFIG], 'Referencing `SystemJS.' + configName + '` is deprecated. Use the config getter `SystemJS.getConfig(\'' + configName + '\')`');
return cfg;
},
set: function (name) {
throw new Error('Setting `SystemJS.' + configName + '` directly is no longer supported. Use `SystemJS.config({ ' + configName + ': ... })`.');
}
});
})(configNames[i]);
/*
* Backwards-compatible registry API, to be deprecated
*/
function registryWarn(loader, method) {
warn.call(loader[CONFIG], 'SystemJS.' + method + ' is deprecated for SystemJS.registry.' + method);
}
SystemJSLoader.prototype.delete = function (key) {
registryWarn(this, 'delete');
return this.registry.delete(key);
};
SystemJSLoader.prototype.get = function (key) {
registryWarn(this, 'get');
return this.registry.get(key);
};
SystemJSLoader.prototype.has = function (key) {
registryWarn(this, 'has');
return this.registry.has(key);
};
SystemJSLoader.prototype.set = function (key, module) {
registryWarn(this, 'set');
return this.registry.set(key, module);
};
SystemJSLoader.prototype.newModule = function (bindings) {
return new ModuleNamespace(bindings);
};
SystemJSLoader.prototype.isModule = isModule;
// ensure System.register and System.registerDynamic decanonicalize
SystemJSLoader.prototype.register = function (key, deps, declare) {
if (typeof key === 'string')
key = decanonicalize.call(this, this[CONFIG], key);
return RegisterLoader.prototype.register.call(this, key, deps, declare);
};
SystemJSLoader.prototype.registerDynamic = function (key, deps, executingRequire, execute) {
if (typeof key === 'string')
key = decanonicalize.call(this, this[CONFIG], key);
return RegisterLoader.prototype.registerDynamic.call(this, key, deps, executingRequire, execute);
};
SystemJSLoader.prototype.version = "0.21.3 Dev";
var System = new SystemJSLoader();
// only set the global System on the global in browsers
if (isBrowser || isWorker)
envGlobal.SystemJS = envGlobal.System = System;
if (typeof module !== 'undefined' && module.exports)
module.exports = System;
}());
//# sourceMappingURL=system.src.js.map