2016-01-10 20:07:42 +01:00
/ *
2016-09-26 18:00:21 +02:00
* SystemJS v0 . 19.39
2016-01-10 20:07:42 +01:00
* /
( function ( ) {
2016-09-26 18:00:21 +02:00
function bootstrap ( ) { // from https://gist.github.com/Yaffle/1088850
( function ( global ) {
function URLPolyfill ( url , baseURL ) {
if ( typeof url != 'string' )
throw new TypeError ( 'URL must be a string' ) ;
var m = String ( url ) . replace ( /^\s+|\s+$/g , "" ) . match ( /^([^:\/?#]+:)?(?:\/\/(?:([^:@\/?#]*)(?::([^:@\/?#]*))?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/ ) ;
if ( ! m )
throw new RangeError ( 'Invalid URL format' ) ;
var protocol = m [ 1 ] || "" ;
var username = m [ 2 ] || "" ;
var password = m [ 3 ] || "" ;
var host = m [ 4 ] || "" ;
var hostname = m [ 5 ] || "" ;
var port = m [ 6 ] || "" ;
var pathname = m [ 7 ] || "" ;
var search = m [ 8 ] || "" ;
var hash = m [ 9 ] || "" ;
if ( baseURL !== undefined ) {
var base = baseURL instanceof URLPolyfill ? baseURL : new URLPolyfill ( baseURL ) ;
var flag = ! protocol && ! host && ! username ;
if ( flag && ! pathname && ! search )
search = base . search ;
if ( flag && pathname [ 0 ] !== "/" )
pathname = ( pathname ? ( ( ( base . host || base . username ) && ! base . pathname ? "/" : "" ) + base . pathname . slice ( 0 , base . pathname . lastIndexOf ( "/" ) + 1 ) + pathname ) : base . pathname ) ;
// dot segments removal
var output = [ ] ;
pathname . replace ( /^(\.\.?(\/|$))+/ , "" )
. replace ( /\/(\.(\/|$))+/g , "/" )
. replace ( /\/\.\.$/ , "/../" )
. replace ( /\/?[^\/]*/g , function ( p ) {
if ( p === "/.." )
output . pop ( ) ;
else
output . push ( p ) ;
} ) ;
pathname = output . join ( "" ) . replace ( /^\// , pathname [ 0 ] === "/" ? "/" : "" ) ;
if ( flag ) {
port = base . port ;
hostname = base . hostname ;
host = base . host ;
password = base . password ;
username = base . username ;
}
if ( ! protocol )
protocol = base . protocol ;
}
// convert URLs to use / always
pathname = pathname . replace ( /\\/g , '/' ) ;
this . origin = host ? protocol + ( protocol !== "" || host !== "" ? "//" : "" ) + host : "" ;
this . href = protocol + ( protocol && host || protocol == "file:" ? "//" : "" ) + ( username !== "" ? username + ( password !== "" ? ":" + password : "" ) + "@" : "" ) + host + pathname + search + hash ;
this . protocol = protocol ;
this . username = username ;
this . password = password ;
this . host = host ;
this . hostname = hostname ;
this . port = port ;
this . pathname = pathname ;
this . search = search ;
this . hash = hash ;
}
global . URLPolyfill = URLPolyfill ;
} ) ( typeof self != 'undefined' ? self : global ) ; ( function ( _ _global ) {
2016-01-10 20:07:42 +01:00
var isWorker = typeof window == 'undefined' && typeof self != 'undefined' && typeof importScripts != 'undefined' ;
var isBrowser = typeof window != 'undefined' && typeof document != 'undefined' ;
var isWindows = typeof process != 'undefined' && typeof process . platform != 'undefined' && ! ! process . platform . match ( /^win/ ) ;
if ( ! _ _global . console )
_ _global . console = { assert : function ( ) { } } ;
// IE8 support
var indexOf = Array . prototype . indexOf || function ( item ) {
for ( var i = 0 , thisLen = this . length ; i < thisLen ; i ++ ) {
if ( this [ i ] === item ) {
return i ;
}
}
return - 1 ;
} ;
var defineProperty ;
( function ( ) {
try {
if ( ! ! Object . defineProperty ( { } , 'a' , { } ) )
defineProperty = Object . defineProperty ;
}
catch ( e ) {
defineProperty = function ( obj , prop , opt ) {
try {
obj [ prop ] = opt . value || opt . get . call ( obj ) ;
}
catch ( e ) { }
}
}
} ) ( ) ;
2016-09-26 18:00:21 +02:00
var errArgs = new Error ( 0 , '_' ) . fileName == '_' ;
2016-01-10 20:07:42 +01:00
function addToError ( err , msg ) {
2016-09-26 18:00:21 +02:00
// parse the stack removing loader code lines for simplification
if ( ! err . originalErr ) {
var stack = ( ( err . message || err ) + ( err . stack ? '\n' + err . stack : '' ) ) . toString ( ) . split ( '\n' ) ;
var newStack = [ ] ;
for ( var i = 0 ; i < stack . length ; i ++ ) {
if ( typeof $ _ _curScript == 'undefined' || stack [ i ] . indexOf ( $ _ _curScript . src ) == - 1 )
newStack . push ( stack [ i ] ) ;
2016-01-10 20:07:42 +01:00
}
}
2016-09-26 18:00:21 +02:00
var newMsg = '(SystemJS) ' + ( newStack ? newStack . join ( '\n\t' ) : err . message . substr ( 11 ) ) + '\n\t' + msg ;
// Convert file:/// URLs to paths in Node
if ( ! isBrowser )
newMsg = newMsg . replace ( isWindows ? /file:\/\/\//g : /file:\/\//g , '' ) ;
var newErr = errArgs ? new Error ( newMsg , err . fileName , err . lineNumber ) : new Error ( newMsg ) ;
newErr . stack = newMsg ;
// track the original error
newErr . originalErr = err . originalErr || err ;
2016-01-10 20:07:42 +01:00
return newErr ;
}
function _ _eval ( source , debugName , context ) {
try {
new Function ( source ) . call ( context ) ;
}
catch ( e ) {
throw addToError ( e , 'Evaluating ' + debugName ) ;
}
}
var baseURI ;
2016-09-26 18:00:21 +02:00
2016-01-10 20:07:42 +01:00
// 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 ;
}
2016-09-26 18:00:21 +02:00
}
else if ( typeof location != 'undefined' ) {
baseURI = _ _global . location . href ;
}
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
// sanitize out the hash and querystring
if ( baseURI ) {
2016-01-10 20:07:42 +01:00
baseURI = baseURI . split ( '#' ) [ 0 ] . split ( '?' ) [ 0 ] ;
baseURI = baseURI . substr ( 0 , baseURI . lastIndexOf ( '/' ) + 1 ) ;
}
else if ( typeof process != 'undefined' && process . cwd ) {
baseURI = 'file://' + ( isWindows ? '/' : '' ) + process . cwd ( ) + '/' ;
if ( isWindows )
baseURI = baseURI . replace ( /\\/g , '/' ) ;
}
else {
throw new TypeError ( 'No environment baseURI' ) ;
}
2016-09-26 18:00:21 +02:00
try {
var nativeURL = new _ _global . URL ( 'test:///' ) . protocol == 'test:' ;
}
catch ( e ) { }
var URL = nativeURL ? _ _global . URL : _ _global . URLPolyfill ;
2016-01-10 20:07:42 +01:00
/ *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Dynamic Module Loader Polyfill
- Implemented exactly to the former 2014 - 08 - 24 ES6 Specification Draft Rev 27 , Section 15
http : //wiki.ecmascript.org/doku.php?id=harmony:specification_drafts#august_24_2014_draft_rev_27
- Functions are commented with their spec numbers , with spec differences commented .
- Spec bugs are commented in this code with links .
- Abstract functions have been combined where possible , and their associated functions
commented .
- Realm implementation is entirely omitted .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* /
function Module ( ) { }
// http://www.ecma-international.org/ecma-262/6.0/#sec-@@tostringtag
defineProperty ( Module . prototype , 'toString' , {
value : function ( ) {
return 'Module' ;
}
} ) ;
function Loader ( options ) {
this . _loader = {
loaderObj : this ,
loads : [ ] ,
modules : { } ,
importPromises : { } ,
moduleRecords : { }
} ;
// 26.3.3.6
defineProperty ( this , 'global' , {
get : function ( ) {
return _ _global ;
}
} ) ;
// 26.3.3.13 realm not implemented
}
( function ( ) {
// Some Helpers
// logs a linkset snapshot for debugging
/ * f u n c t i o n s n a p s h o t ( l o a d e r ) {
console . log ( '---Snapshot---' ) ;
for ( var i = 0 ; i < loader . loads . length ; i ++ ) {
var load = loader . loads [ i ] ;
var linkSetLog = ' ' + load . name + ' (' + load . status + '): ' ;
for ( var j = 0 ; j < load . linkSets . length ; j ++ ) {
linkSetLog += '{' + logloads ( load . linkSets [ j ] . loads ) + '} ' ;
}
console . log ( linkSetLog ) ;
}
console . log ( '' ) ;
}
function logloads ( loads ) {
var log = '' ;
for ( var k = 0 ; k < loads . length ; k ++ )
log += loads [ k ] . name + ( k != loads . length - 1 ? ' ' : '' ) ;
return log ;
} * /
/ * f u n c t i o n c h e c k I n v a r i a n t s ( ) {
// see https://bugs.ecmascript.org/show_bug.cgi?id=2603#c1
var loads = System . _loader . loads ;
var linkSets = [ ] ;
for ( var i = 0 ; i < loads . length ; i ++ ) {
var load = loads [ i ] ;
console . assert ( load . status == 'loading' || load . status == 'loaded' , 'Each load is loading or loaded' ) ;
for ( var j = 0 ; j < load . linkSets . length ; j ++ ) {
var linkSet = load . linkSets [ j ] ;
for ( var k = 0 ; k < linkSet . loads . length ; k ++ )
console . assert ( loads . indexOf ( linkSet . loads [ k ] ) != - 1 , 'linkSet loads are a subset of loader loads' ) ;
if ( linkSets . indexOf ( linkSet ) == - 1 )
linkSets . push ( linkSet ) ;
}
}
for ( var i = 0 ; i < loads . length ; i ++ ) {
var load = loads [ i ] ;
for ( var j = 0 ; j < linkSets . length ; j ++ ) {
var linkSet = linkSets [ j ] ;
if ( linkSet . loads . indexOf ( load ) != - 1 )
console . assert ( load . linkSets . indexOf ( linkSet ) != - 1 , 'linkSet contains load -> load contains linkSet' ) ;
if ( load . linkSets . indexOf ( linkSet ) != - 1 )
console . assert ( linkSet . loads . indexOf ( load ) != - 1 , 'load contains linkSet -> linkSet contains load' ) ;
}
}
for ( var i = 0 ; i < linkSets . length ; i ++ ) {
var linkSet = linkSets [ i ] ;
for ( var j = 0 ; j < linkSet . loads . length ; j ++ ) {
var load = linkSet . loads [ j ] ;
for ( var k = 0 ; k < load . dependencies . length ; k ++ ) {
var depName = load . dependencies [ k ] . value ;
var depLoad ;
for ( var l = 0 ; l < loads . length ; l ++ ) {
if ( loads [ l ] . name != depName )
continue ;
depLoad = loads [ l ] ;
break ;
}
// loading records are allowed not to have their dependencies yet
// if (load.status != 'loading')
// console.assert(depLoad, 'depLoad found');
// console.assert(linkSet.loads.indexOf(depLoad) != -1, 'linkset contains all dependencies');
}
}
}
} * /
// 15.2.3 - Runtime Semantics: Loader State
// 15.2.3.11
function createLoaderLoad ( object ) {
return {
// modules is an object for ES5 implementation
modules : { } ,
loads : [ ] ,
loaderObj : object
} ;
}
// 15.2.3.2 Load Records and LoadRequest Objects
2016-09-26 18:00:21 +02:00
var anonCnt = 0 ;
2016-01-10 20:07:42 +01:00
// 15.2.3.2.1
function createLoad ( name ) {
return {
status : 'loading' ,
2016-09-26 18:00:21 +02:00
name : name || '<Anonymous' + ++ anonCnt + '>' ,
2016-01-10 20:07:42 +01:00
linkSets : [ ] ,
dependencies : [ ] ,
metadata : { }
} ;
}
// 15.2.3.2.2 createLoadRequestObject, absorbed into calling functions
// 15.2.4
// 15.2.4.1
function loadModule ( loader , name , options ) {
return new Promise ( asyncStartLoadPartwayThrough ( {
step : options . address ? 'fetch' : 'locate' ,
loader : loader ,
moduleName : name ,
// allow metadata for import https://bugs.ecmascript.org/show_bug.cgi?id=3091
moduleMetadata : options && options . metadata || { } ,
moduleSource : options . source ,
moduleAddress : options . address
} ) ) ;
}
// 15.2.4.2
function requestLoad ( loader , request , refererName , refererAddress ) {
// 15.2.4.2.1 CallNormalize
return new Promise ( function ( resolve , reject ) {
resolve ( loader . loaderObj . normalize ( request , refererName , refererAddress ) ) ;
} )
// 15.2.4.2.2 GetOrCreateLoad
. then ( function ( name ) {
var load ;
if ( loader . modules [ name ] ) {
load = createLoad ( name ) ;
load . status = 'linked' ;
// https://bugs.ecmascript.org/show_bug.cgi?id=2795
load . module = loader . modules [ name ] ;
return load ;
}
for ( var i = 0 , l = loader . loads . length ; i < l ; i ++ ) {
load = loader . loads [ i ] ;
if ( load . name != name )
continue ;
return load ;
}
load = createLoad ( name ) ;
loader . loads . push ( load ) ;
proceedToLocate ( loader , load ) ;
return load ;
} ) ;
}
// 15.2.4.3
function proceedToLocate ( loader , load ) {
proceedToFetch ( loader , load ,
Promise . resolve ( )
// 15.2.4.3.1 CallLocate
. then ( function ( ) {
return loader . loaderObj . locate ( { name : load . name , metadata : load . metadata } ) ;
} )
) ;
}
// 15.2.4.4
function proceedToFetch ( loader , load , p ) {
proceedToTranslate ( loader , load ,
p
// 15.2.4.4.1 CallFetch
. then ( function ( address ) {
// adjusted, see https://bugs.ecmascript.org/show_bug.cgi?id=2602
if ( load . status != 'loading' )
return ;
load . address = address ;
return loader . loaderObj . fetch ( { name : load . name , metadata : load . metadata , address : address } ) ;
} )
) ;
}
// 15.2.4.5
function proceedToTranslate ( loader , load , p ) {
p
// 15.2.4.5.1 CallTranslate
. then ( function ( source ) {
if ( load . status != 'loading' )
return ;
2016-09-26 18:00:21 +02:00
load . address = load . address || load . name ;
2016-01-10 20:07:42 +01:00
return Promise . resolve ( loader . loaderObj . translate ( { name : load . name , metadata : load . metadata , address : load . address , source : source } ) )
// 15.2.4.5.2 CallInstantiate
. then ( function ( source ) {
load . source = source ;
return loader . loaderObj . instantiate ( { name : load . name , metadata : load . metadata , address : load . address , source : source } ) ;
} )
// 15.2.4.5.3 InstantiateSucceeded
. then ( function ( instantiateResult ) {
2016-09-26 18:00:21 +02:00
if ( instantiateResult === undefined )
throw new TypeError ( 'Declarative modules unsupported in the polyfill.' ) ;
if ( typeof instantiateResult != 'object' )
throw new TypeError ( 'Invalid instantiate return value' ) ;
load . depsList = instantiateResult . deps || [ ] ;
load . execute = instantiateResult . execute ;
2016-01-10 20:07:42 +01:00
} )
// 15.2.4.6 ProcessLoadDependencies
. then ( function ( ) {
load . dependencies = [ ] ;
var depsList = load . depsList ;
var loadPromises = [ ] ;
for ( var i = 0 , l = depsList . length ; i < l ; i ++ ) ( function ( request , index ) {
loadPromises . push (
requestLoad ( loader , request , load . name , load . address )
// 15.2.4.6.1 AddDependencyLoad (load is parentLoad)
. then ( function ( depLoad ) {
// adjusted from spec to maintain dependency order
// this is due to the System.register internal implementation needs
load . dependencies [ index ] = {
key : request ,
value : depLoad . name
} ;
if ( depLoad . status != 'linked' ) {
var linkSets = load . linkSets . concat ( [ ] ) ;
for ( var i = 0 , l = linkSets . length ; i < l ; i ++ )
addLoadToLinkSet ( linkSets [ i ] , depLoad ) ;
}
// console.log('AddDependencyLoad ' + depLoad.name + ' for ' + load.name);
// snapshot(loader);
} )
) ;
} ) ( depsList [ i ] , i ) ;
return Promise . all ( loadPromises ) ;
} )
// 15.2.4.6.2 LoadSucceeded
. then ( function ( ) {
// console.log('LoadSucceeded ' + load.name);
// snapshot(loader);
load . status = 'loaded' ;
var linkSets = load . linkSets . concat ( [ ] ) ;
for ( var i = 0 , l = linkSets . length ; i < l ; i ++ )
updateLinkSetOnLoad ( linkSets [ i ] , load ) ;
} ) ;
} )
// 15.2.4.5.4 LoadFailed
[ 'catch' ] ( function ( exc ) {
load . status = 'failed' ;
load . exception = exc ;
var linkSets = load . linkSets . concat ( [ ] ) ;
for ( var i = 0 , l = linkSets . length ; i < l ; i ++ ) {
linkSetFailed ( linkSets [ i ] , load , exc ) ;
}
console . assert ( load . linkSets . length == 0 , 'linkSets not removed' ) ;
} ) ;
}
// 15.2.4.7 PromiseOfStartLoadPartwayThrough absorbed into calling functions
// 15.2.4.7.1
function asyncStartLoadPartwayThrough ( stepState ) {
return function ( resolve , reject ) {
var loader = stepState . loader ;
var name = stepState . moduleName ;
var step = stepState . step ;
if ( loader . modules [ name ] )
throw new TypeError ( '"' + name + '" already exists in the module table' ) ;
// adjusted to pick up existing loads
var existingLoad ;
for ( var i = 0 , l = loader . loads . length ; i < l ; i ++ ) {
if ( loader . loads [ i ] . name == name ) {
existingLoad = loader . loads [ i ] ;
if ( step == 'translate' && ! existingLoad . source ) {
existingLoad . address = stepState . moduleAddress ;
proceedToTranslate ( loader , existingLoad , Promise . resolve ( stepState . moduleSource ) ) ;
}
// a primary load -> use that existing linkset if it is for the direct load here
// otherwise create a new linkset unit
if ( existingLoad . linkSets . length && existingLoad . linkSets [ 0 ] . loads [ 0 ] . name == existingLoad . name )
return existingLoad . linkSets [ 0 ] . done . then ( function ( ) {
resolve ( existingLoad ) ;
} ) ;
}
}
var load = existingLoad || createLoad ( name ) ;
load . metadata = stepState . moduleMetadata ;
var linkSet = createLinkSet ( loader , load ) ;
loader . loads . push ( load ) ;
resolve ( linkSet . done ) ;
if ( step == 'locate' )
proceedToLocate ( loader , load ) ;
else if ( step == 'fetch' )
proceedToFetch ( loader , load , Promise . resolve ( stepState . moduleAddress ) ) ;
else {
console . assert ( step == 'translate' , 'translate step' ) ;
load . address = stepState . moduleAddress ;
proceedToTranslate ( loader , load , Promise . resolve ( stepState . moduleSource ) ) ;
}
}
}
// Declarative linking functions run through alternative implementation:
// 15.2.5.1.1 CreateModuleLinkageRecord not implemented
// 15.2.5.1.2 LookupExport not implemented
// 15.2.5.1.3 LookupModuleDependency not implemented
// 15.2.5.2.1
function createLinkSet ( loader , startingLoad ) {
var linkSet = {
loader : loader ,
loads : [ ] ,
startingLoad : startingLoad , // added see spec bug https://bugs.ecmascript.org/show_bug.cgi?id=2995
loadingCount : 0
} ;
linkSet . done = new Promise ( function ( resolve , reject ) {
linkSet . resolve = resolve ;
linkSet . reject = reject ;
} ) ;
addLoadToLinkSet ( linkSet , startingLoad ) ;
return linkSet ;
}
// 15.2.5.2.2
function addLoadToLinkSet ( linkSet , load ) {
if ( load . status == 'failed' )
return ;
for ( var i = 0 , l = linkSet . loads . length ; i < l ; i ++ )
if ( linkSet . loads [ i ] == load )
return ;
linkSet . loads . push ( load ) ;
load . linkSets . push ( linkSet ) ;
// adjustment, see https://bugs.ecmascript.org/show_bug.cgi?id=2603
if ( load . status != 'loaded' ) {
linkSet . loadingCount ++ ;
}
var loader = linkSet . loader ;
for ( var i = 0 , l = load . dependencies . length ; i < l ; i ++ ) {
if ( ! load . dependencies [ i ] )
continue ;
var name = load . dependencies [ i ] . value ;
if ( loader . modules [ name ] )
continue ;
for ( var j = 0 , d = loader . loads . length ; j < d ; j ++ ) {
if ( loader . loads [ j ] . name != name )
continue ;
addLoadToLinkSet ( linkSet , loader . loads [ j ] ) ;
break ;
}
}
// console.log('add to linkset ' + load.name);
// snapshot(linkSet.loader);
}
// linking errors can be generic or load-specific
// this is necessary for debugging info
function doLink ( linkSet ) {
var error = false ;
try {
link ( linkSet , function ( load , exc ) {
linkSetFailed ( linkSet , load , exc ) ;
error = true ;
} ) ;
}
catch ( e ) {
linkSetFailed ( linkSet , null , e ) ;
error = true ;
}
return error ;
}
// 15.2.5.2.3
function updateLinkSetOnLoad ( linkSet , load ) {
// console.log('update linkset on load ' + load.name);
// snapshot(linkSet.loader);
console . assert ( load . status == 'loaded' || load . status == 'linked' , 'loaded or linked' ) ;
linkSet . loadingCount -- ;
if ( linkSet . loadingCount > 0 )
return ;
// adjusted for spec bug https://bugs.ecmascript.org/show_bug.cgi?id=2995
var startingLoad = linkSet . startingLoad ;
// non-executing link variation for loader tracing
// on the server. Not in spec.
/***/
if ( linkSet . loader . loaderObj . execute === false ) {
var loads = [ ] . concat ( linkSet . loads ) ;
for ( var i = 0 , l = loads . length ; i < l ; i ++ ) {
var load = loads [ i ] ;
2016-09-26 18:00:21 +02:00
load . module = {
2016-01-10 20:07:42 +01:00
name : load . name ,
module : _newModule ( { } ) ,
evaluated : true
} ;
load . status = 'linked' ;
finishLoad ( linkSet . loader , load ) ;
}
return linkSet . resolve ( startingLoad ) ;
}
/***/
var abrupt = doLink ( linkSet ) ;
if ( abrupt )
return ;
console . assert ( linkSet . loads . length == 0 , 'loads cleared' ) ;
linkSet . resolve ( startingLoad ) ;
}
// 15.2.5.2.4
function linkSetFailed ( linkSet , load , exc ) {
var loader = linkSet . loader ;
var requests ;
checkError :
if ( load ) {
if ( linkSet . loads [ 0 ] . name == load . name ) {
exc = addToError ( exc , 'Error loading ' + load . name ) ;
}
else {
for ( var i = 0 ; i < linkSet . loads . length ; i ++ ) {
var pLoad = linkSet . loads [ i ] ;
for ( var j = 0 ; j < pLoad . dependencies . length ; j ++ ) {
var dep = pLoad . dependencies [ j ] ;
if ( dep . value == load . name ) {
exc = addToError ( exc , 'Error loading ' + load . name + ' as "' + dep . key + '" from ' + pLoad . name ) ;
break checkError ;
}
}
}
exc = addToError ( exc , 'Error loading ' + load . name + ' from ' + linkSet . loads [ 0 ] . name ) ;
}
}
else {
exc = addToError ( exc , 'Error linking ' + linkSet . loads [ 0 ] . name ) ;
}
var loads = linkSet . loads . concat ( [ ] ) ;
for ( var i = 0 , l = loads . length ; i < l ; i ++ ) {
var load = loads [ i ] ;
// store all failed load records
loader . loaderObj . failed = loader . loaderObj . failed || [ ] ;
if ( indexOf . call ( loader . loaderObj . failed , load ) == - 1 )
loader . loaderObj . failed . push ( load ) ;
var linkIndex = indexOf . call ( load . linkSets , linkSet ) ;
console . assert ( linkIndex != - 1 , 'link not present' ) ;
load . linkSets . splice ( linkIndex , 1 ) ;
if ( load . linkSets . length == 0 ) {
var globalLoadsIndex = indexOf . call ( linkSet . loader . loads , load ) ;
if ( globalLoadsIndex != - 1 )
linkSet . loader . loads . splice ( globalLoadsIndex , 1 ) ;
}
}
linkSet . reject ( exc ) ;
}
// 15.2.5.2.5
function finishLoad ( loader , load ) {
// add to global trace if tracing
if ( loader . loaderObj . trace ) {
if ( ! loader . loaderObj . loads )
loader . loaderObj . loads = { } ;
var depMap = { } ;
load . dependencies . forEach ( function ( dep ) {
depMap [ dep . key ] = dep . value ;
} ) ;
loader . loaderObj . loads [ load . name ] = {
name : load . name ,
deps : load . dependencies . map ( function ( dep ) { return dep . key } ) ,
depMap : depMap ,
address : load . address ,
metadata : load . metadata ,
2016-09-26 18:00:21 +02:00
source : load . source
2016-01-10 20:07:42 +01:00
} ;
}
// if not anonymous, add to the module table
if ( load . name ) {
2016-09-26 18:00:21 +02:00
console . assert ( ! loader . modules [ load . name ] || loader . modules [ load . name ] . module === load . module . module , 'load not in module table' ) ;
2016-01-10 20:07:42 +01:00
loader . modules [ load . name ] = load . module ;
}
var loadIndex = indexOf . call ( loader . loads , load ) ;
if ( loadIndex != - 1 )
loader . loads . splice ( loadIndex , 1 ) ;
for ( var i = 0 , l = load . linkSets . length ; i < l ; i ++ ) {
loadIndex = indexOf . call ( load . linkSets [ i ] . loads , load ) ;
if ( loadIndex != - 1 )
load . linkSets [ i ] . loads . splice ( loadIndex , 1 ) ;
}
load . linkSets . splice ( 0 , load . linkSets . length ) ;
}
function doDynamicExecute ( linkSet , load , linkError ) {
try {
var module = load . execute ( ) ;
}
catch ( e ) {
linkError ( load , e ) ;
return ;
}
if ( ! module || ! ( module instanceof Module ) )
linkError ( load , new TypeError ( 'Execution must define a Module instance' ) ) ;
else
return module ;
}
// 26.3 Loader
// 26.3.1.1
// defined at top
// importPromises adds ability to import a module twice without error - https://bugs.ecmascript.org/show_bug.cgi?id=2601
function createImportPromise ( loader , name , promise ) {
var importPromises = loader . _loader . importPromises ;
return importPromises [ name ] = promise . then ( function ( m ) {
importPromises [ name ] = undefined ;
return m ;
} , function ( e ) {
importPromises [ name ] = undefined ;
throw e ;
} ) ;
}
Loader . prototype = {
// 26.3.3.1
constructor : Loader ,
// 26.3.3.2
define : function ( name , source , options ) {
// check if already defined
if ( this . _loader . importPromises [ name ] )
throw new TypeError ( 'Module is already loading.' ) ;
return createImportPromise ( this , name , new Promise ( asyncStartLoadPartwayThrough ( {
step : 'translate' ,
loader : this . _loader ,
moduleName : name ,
moduleMetadata : options && options . metadata || { } ,
moduleSource : source ,
moduleAddress : options && options . address
} ) ) ) ;
} ,
// 26.3.3.3
'delete' : function ( name ) {
var loader = this . _loader ;
delete loader . importPromises [ name ] ;
delete loader . moduleRecords [ name ] ;
return loader . modules [ name ] ? delete loader . modules [ name ] : false ;
} ,
// 26.3.3.4 entries not implemented
// 26.3.3.5
get : function ( key ) {
if ( ! this . _loader . modules [ key ] )
return ;
return this . _loader . modules [ key ] . module ;
} ,
// 26.3.3.7
has : function ( name ) {
return ! ! this . _loader . modules [ name ] ;
} ,
// 26.3.3.8
'import' : function ( name , parentName , parentAddress ) {
if ( typeof parentName == 'object' )
parentName = parentName . name ;
// run normalize first
var loaderObj = this ;
// added, see https://bugs.ecmascript.org/show_bug.cgi?id=2659
return Promise . resolve ( loaderObj . normalize ( name , parentName ) )
. then ( function ( name ) {
var loader = loaderObj . _loader ;
2016-09-26 18:00:21 +02:00
if ( loader . modules [ name ] )
2016-01-10 20:07:42 +01:00
return loader . modules [ name ] . module ;
return loader . importPromises [ name ] || createImportPromise ( loaderObj , name ,
loadModule ( loader , name , { } )
. then ( function ( load ) {
delete loader . importPromises [ name ] ;
2016-09-26 18:00:21 +02:00
return load . module . module ;
2016-01-10 20:07:42 +01:00
} ) ) ;
} ) ;
} ,
// 26.3.3.9 keys not implemented
// 26.3.3.10
load : function ( name ) {
var loader = this . _loader ;
if ( loader . modules [ name ] )
return Promise . resolve ( ) ;
return loader . importPromises [ name ] || createImportPromise ( this , name , new Promise ( asyncStartLoadPartwayThrough ( {
step : 'locate' ,
loader : loader ,
moduleName : name ,
moduleMetadata : { } ,
moduleSource : undefined ,
moduleAddress : undefined
} ) )
. then ( function ( ) {
delete loader . importPromises [ name ] ;
} ) ) ;
} ,
// 26.3.3.11
module : function ( source , options ) {
var load = createLoad ( ) ;
load . address = options && options . address ;
var linkSet = createLinkSet ( this . _loader , load ) ;
var sourcePromise = Promise . resolve ( source ) ;
var loader = this . _loader ;
var p = linkSet . done . then ( function ( ) {
2016-09-26 18:00:21 +02:00
return load . module . module ;
2016-01-10 20:07:42 +01:00
} ) ;
proceedToTranslate ( loader , load , sourcePromise ) ;
return p ;
} ,
// 26.3.3.12
newModule : function ( obj ) {
if ( typeof obj != 'object' )
throw new TypeError ( 'Expected object' ) ;
var m = new Module ( ) ;
var pNames = [ ] ;
if ( Object . getOwnPropertyNames && obj != null )
pNames = Object . getOwnPropertyNames ( obj ) ;
else
for ( var key in obj )
pNames . push ( key ) ;
for ( var i = 0 ; i < pNames . length ; i ++ ) ( function ( key ) {
defineProperty ( m , key , {
configurable : false ,
enumerable : true ,
get : function ( ) {
return obj [ key ] ;
2016-09-26 18:00:21 +02:00
} ,
set : function ( ) {
throw new Error ( 'Module exports cannot be changed externally.' ) ;
2016-01-10 20:07:42 +01:00
}
} ) ;
} ) ( pNames [ i ] ) ;
2016-09-26 18:00:21 +02:00
if ( Object . freeze )
Object . freeze ( m ) ;
2016-01-10 20:07:42 +01:00
return m ;
} ,
// 26.3.3.14
set : function ( name , module ) {
if ( ! ( module instanceof Module ) )
throw new TypeError ( 'Loader.set(' + name + ', module) must be a module' ) ;
this . _loader . modules [ name ] = {
module : module
} ;
} ,
// 26.3.3.15 values not implemented
// 26.3.3.16 @@iterator not implemented
// 26.3.3.17 @@toStringTag not implemented
// 26.3.3.18.1
2016-09-26 18:00:21 +02:00
normalize : function ( name , referrerName , referrerAddress ) { } ,
2016-01-10 20:07:42 +01:00
// 26.3.3.18.2
locate : function ( load ) {
return load . name ;
} ,
// 26.3.3.18.3
fetch : function ( load ) {
} ,
// 26.3.3.18.4
translate : function ( load ) {
return load . source ;
} ,
// 26.3.3.18.5
instantiate : function ( load ) {
}
} ;
var _newModule = Loader . prototype . newModule ;
2016-09-26 18:00:21 +02:00
2016-01-10 20:07:42 +01:00
/ *
2016-09-26 18:00:21 +02:00
* ES6 Module Declarative Linking Code
2016-01-10 20:07:42 +01:00
* /
function link ( linkSet , linkError ) {
var loader = linkSet . loader ;
if ( ! linkSet . loads . length )
return ;
var loads = linkSet . loads . concat ( [ ] ) ;
for ( var i = 0 ; i < loads . length ; i ++ ) {
var load = loads [ i ] ;
var module = doDynamicExecute ( linkSet , load , linkError ) ;
if ( ! module )
return ;
load . module = {
name : load . name ,
module : module
} ;
load . status = 'linked' ;
finishLoad ( loader , load ) ;
}
}
2016-09-26 18:00:21 +02:00
} ) ( ) ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
var System ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
// SystemJS Loader Class and Extension helpers
function SystemJSLoader ( ) {
Loader . call ( this ) ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
this . paths = { } ;
this . _loader . paths = { } ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
systemJSConstructor . call ( this ) ;
}
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
// inline Object.create-style class extension
function SystemProto ( ) { } ;
SystemProto . prototype = Loader . prototype ;
SystemJSLoader . prototype = new SystemProto ( ) ;
SystemJSLoader . prototype . constructor = SystemJSLoader ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
var systemJSConstructor ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
function hook ( name , hook ) {
SystemJSLoader . prototype [ name ] = hook ( SystemJSLoader . prototype [ name ] || function ( ) { } ) ;
}
function hookConstructor ( hook ) {
systemJSConstructor = hook ( systemJSConstructor || function ( ) { } ) ;
}
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
var absURLRegEx = /^[^\/]+:\/\// ;
function isAbsolute ( name ) {
return name . match ( absURLRegEx ) ;
}
function isRel ( name ) {
return ( name [ 0 ] == '.' && ( ! name [ 1 ] || name [ 1 ] == '/' || name [ 1 ] == '.' ) ) || name [ 0 ] == '/' ;
}
function isPlain ( name ) {
return ! isRel ( name ) && ! isAbsolute ( name ) ;
}
var baseURIObj = new URL ( baseURI ) ;
function urlResolve ( name , parent ) {
// url resolution shortpaths
if ( name [ 0 ] == '.' ) {
// dot-relative url normalization
if ( name [ 1 ] == '/' && name [ 2 ] != '.' )
return ( parent && parent . substr ( 0 , parent . lastIndexOf ( '/' ) + 1 ) || baseURI ) + name . substr ( 2 ) ;
}
else if ( name [ 0 ] != '/' && name . indexOf ( ':' ) == - 1 ) {
// plain parent normalization
return ( parent && parent . substr ( 0 , parent . lastIndexOf ( '/' ) + 1 ) || baseURI ) + name ;
}
return new URL ( name , parent && parent . replace ( /#/g , '%05' ) || baseURIObj ) . href . replace ( /%05/g , '#' ) ;
2016-01-10 20:07:42 +01:00
}
// NB no specification provided for System.paths, used ideas discussed in https://github.com/jorendorff/js-loaders/issues/25
2016-09-26 18:00:21 +02:00
function applyPaths ( loader , name ) {
2016-01-10 20:07:42 +01:00
// most specific (most number of slashes in path) match wins
var pathMatch = '' , wildcard , maxWildcardPrefixLen = 0 ;
2016-09-26 18:00:21 +02:00
var paths = loader . paths ;
var pathsCache = loader . _loader . paths ;
2016-01-10 20:07:42 +01:00
// check to see if we have a paths entry
for ( var p in paths ) {
2016-09-26 18:00:21 +02:00
if ( paths . hasOwnProperty && ! paths . hasOwnProperty ( p ) )
continue ;
// paths sanitization
var path = paths [ p ] ;
if ( path !== pathsCache [ p ] )
path = paths [ p ] = pathsCache [ p ] = urlResolve ( paths [ p ] , isRel ( paths [ p ] ) ? baseURI : loader . baseURL ) ;
2016-01-10 20:07:42 +01:00
// exact path match
2016-09-26 18:00:21 +02:00
if ( p . indexOf ( '*' ) === - 1 ) {
2016-01-26 17:21:17 +01:00
if ( name == p )
return paths [ p ] ;
// support trailing / in paths rules
2016-09-26 18:00:21 +02:00
else if ( name . substr ( 0 , p . length - 1 ) == p . substr ( 0 , p . length - 1 ) && ( name . length < p . length || name [ p . length - 1 ] == p [ p . length - 1 ] ) && ( paths [ p ] [ paths [ p ] . length - 1 ] == '/' || paths [ p ] == '' ) ) {
return paths [ p ] . substr ( 0 , paths [ p ] . length - 1 ) + ( name . length > p . length ? ( paths [ p ] && '/' || '' ) + name . substr ( p . length ) : '' ) ;
}
2016-01-10 20:07:42 +01:00
}
// wildcard path match
else {
2016-09-26 18:00:21 +02:00
var pathParts = p . split ( '*' ) ;
if ( pathParts . length > 2 )
throw new TypeError ( 'Only one wildcard in a path is permitted' ) ;
2016-01-10 20:07:42 +01:00
var wildcardPrefixLen = pathParts [ 0 ] . length ;
if ( wildcardPrefixLen >= maxWildcardPrefixLen &&
name . substr ( 0 , pathParts [ 0 ] . length ) == pathParts [ 0 ] &&
name . substr ( name . length - pathParts [ 1 ] . length ) == pathParts [ 1 ] ) {
maxWildcardPrefixLen = wildcardPrefixLen ;
pathMatch = p ;
wildcard = name . substr ( pathParts [ 0 ] . length , name . length - pathParts [ 1 ] . length - pathParts [ 0 ] . length ) ;
}
}
}
var outPath = paths [ pathMatch ] ;
if ( typeof wildcard == 'string' )
outPath = outPath . replace ( '*' , wildcard ) ;
return outPath ;
}
function dedupe ( deps ) {
var newDeps = [ ] ;
for ( var i = 0 , l = deps . length ; i < l ; i ++ )
if ( indexOf . call ( newDeps , deps [ i ] ) == - 1 )
newDeps . push ( deps [ i ] )
return newDeps ;
}
function group ( deps ) {
var names = [ ] ;
var indices = [ ] ;
for ( var i = 0 , l = deps . length ; i < l ; i ++ ) {
var index = indexOf . call ( names , deps [ i ] ) ;
if ( index === - 1 ) {
names . push ( deps [ i ] ) ;
indices . push ( [ i ] ) ;
}
else {
indices [ index ] . push ( i ) ;
}
}
return { names : names , indices : indices } ;
}
var getOwnPropertyDescriptor = true ;
try {
Object . getOwnPropertyDescriptor ( { a : 0 } , 'a' ) ;
}
catch ( e ) {
getOwnPropertyDescriptor = false ;
}
// converts any module.exports object into an object ready for SystemJS.newModule
function getESModule ( exports ) {
var esModule = { } ;
// don't trigger getters/setters in environments that support them
2016-09-26 18:00:21 +02:00
if ( ( typeof exports == 'object' || typeof exports == 'function' ) && exports !== _ _global ) {
if ( getOwnPropertyDescriptor ) {
for ( var p in exports ) {
// The default property is copied to esModule later on
if ( p === 'default' )
continue ;
defineOrCopyProperty ( esModule , exports , p ) ;
}
}
else {
extend ( esModule , exports ) ;
2016-01-10 20:07:42 +01:00
}
}
esModule [ 'default' ] = exports ;
defineProperty ( esModule , '__useDefault' , {
value : true
} ) ;
return esModule ;
}
2016-09-26 18:00:21 +02:00
function defineOrCopyProperty ( targetObj , sourceObj , propName ) {
try {
var d ;
if ( d = Object . getOwnPropertyDescriptor ( sourceObj , propName ) )
defineProperty ( targetObj , propName , d ) ;
}
catch ( ex ) {
// Object.getOwnPropertyDescriptor threw an exception, fall back to normal set property
// we dont need hasOwnProperty here because getOwnPropertyDescriptor would have returned undefined above
targetObj [ propName ] = sourceObj [ propName ] ;
return false ;
}
}
2016-01-10 20:07:42 +01:00
function extend ( a , b , prepend ) {
2016-09-26 18:00:21 +02:00
var hasOwnProperty = b && b . hasOwnProperty ;
2016-01-10 20:07:42 +01:00
for ( var p in b ) {
2016-09-26 18:00:21 +02:00
if ( hasOwnProperty && ! b . hasOwnProperty ( p ) )
continue ;
2016-01-10 20:07:42 +01:00
if ( ! prepend || ! ( p in a ) )
a [ p ] = b [ p ] ;
}
return a ;
}
// meta first-level extends where:
// array + array appends
// object + object extends
// other properties replace
function extendMeta ( a , b , prepend ) {
2016-09-26 18:00:21 +02:00
var hasOwnProperty = b && b . hasOwnProperty ;
2016-01-10 20:07:42 +01:00
for ( var p in b ) {
2016-09-26 18:00:21 +02:00
if ( hasOwnProperty && ! b . hasOwnProperty ( p ) )
continue ;
2016-01-10 20:07:42 +01:00
var val = b [ p ] ;
if ( ! ( p in a ) )
a [ p ] = val ;
else if ( val instanceof Array && a [ p ] instanceof Array )
a [ p ] = [ ] . concat ( prepend ? val : a [ p ] ) . concat ( prepend ? a [ p ] : val ) ;
else if ( typeof val == 'object' && val !== null && typeof a [ p ] == 'object' )
a [ p ] = extend ( extend ( { } , a [ p ] ) , val , prepend ) ;
else if ( ! prepend )
a [ p ] = val ;
}
}
2016-09-26 18:00:21 +02:00
function extendPkgConfig ( pkgCfgA , pkgCfgB , pkgName , loader , warnInvalidProperties ) {
for ( var prop in pkgCfgB ) {
if ( indexOf . call ( [ 'main' , 'format' , 'defaultExtension' , 'basePath' ] , prop ) != - 1 ) {
pkgCfgA [ prop ] = pkgCfgB [ prop ] ;
}
else if ( prop == 'map' ) {
extend ( pkgCfgA . map = pkgCfgA . map || { } , pkgCfgB . map ) ;
}
else if ( prop == 'meta' ) {
extend ( pkgCfgA . meta = pkgCfgA . meta || { } , pkgCfgB . meta ) ;
}
else if ( prop == 'depCache' ) {
for ( var d in pkgCfgB . depCache ) {
var dNormalized ;
if ( d . substr ( 0 , 2 ) == './' )
dNormalized = pkgName + '/' + d . substr ( 2 ) ;
else
dNormalized = coreResolve . call ( loader , d ) ;
loader . depCache [ dNormalized ] = ( loader . depCache [ dNormalized ] || [ ] ) . concat ( pkgCfgB . depCache [ d ] ) ;
}
}
else if ( warnInvalidProperties && indexOf . call ( [ 'browserConfig' , 'nodeConfig' , 'devConfig' , 'productionConfig' ] , prop ) == - 1 &&
( ! pkgCfgB . hasOwnProperty || pkgCfgB . hasOwnProperty ( prop ) ) ) {
warn . call ( loader , '"' + prop + '" is not a valid package configuration option in package ' + pkgName ) ;
}
}
}
// deeply-merge (to first level) config with any existing package config
function setPkgConfig ( loader , pkgName , cfg , prependConfig ) {
var pkg ;
// first package is config by reference for fast path, cloned after that
if ( ! loader . packages [ pkgName ] ) {
pkg = loader . packages [ pkgName ] = cfg ;
}
else {
var basePkg = loader . packages [ pkgName ] ;
pkg = loader . packages [ pkgName ] = { } ;
extendPkgConfig ( pkg , prependConfig ? cfg : basePkg , pkgName , loader , prependConfig ) ;
extendPkgConfig ( pkg , prependConfig ? basePkg : cfg , pkgName , loader , ! prependConfig ) ;
}
// main object becomes main map
if ( typeof pkg . main == 'object' ) {
pkg . map = pkg . map || { } ;
pkg . map [ './@main' ] = pkg . main ;
pkg . main [ 'default' ] = pkg . main [ 'default' ] || './' ;
pkg . main = '@main' ;
}
return pkg ;
}
2016-01-10 20:07:42 +01:00
function warn ( msg ) {
if ( this . warnings && typeof console != 'undefined' && console . warn )
console . warn ( msg ) ;
}
2016-09-26 18:00:21 +02:00
var fetchTextFromURL ;
if ( typeof XMLHttpRequest != 'undefined' ) {
fetchTextFromURL = function ( url , authorization , fulfill , reject ) {
var xhr = new XMLHttpRequest ( ) ;
var sameDomain = true ;
var doTimeout = false ;
if ( ! ( 'withCredentials' in xhr ) ) {
// check if same domain
var domainCheck = /^(\w+:)?\/\/([^\/]+)/ . exec ( url ) ;
if ( domainCheck ) {
sameDomain = domainCheck [ 2 ] === window . location . host ;
if ( domainCheck [ 1 ] )
sameDomain &= domainCheck [ 1 ] === window . location . protocol ;
}
}
if ( ! sameDomain && typeof XDomainRequest != 'undefined' ) {
xhr = new XDomainRequest ( ) ;
xhr . onload = load ;
xhr . onerror = error ;
xhr . ontimeout = error ;
xhr . onprogress = function ( ) { } ;
xhr . timeout = 0 ;
doTimeout = true ;
}
function load ( ) {
fulfill ( xhr . responseText ) ;
}
function error ( ) {
reject ( new Error ( 'XHR error' + ( xhr . status ? ' (' + xhr . status + ( xhr . statusText ? ' ' + xhr . statusText : '' ) + ')' : '' ) + ' loading ' + url ) ) ;
}
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
xhr . onreadystatechange = function ( ) {
if ( xhr . readyState === 4 ) {
// in Chrome on file:/// URLs, status is 0
if ( xhr . status == 0 ) {
if ( xhr . responseText ) {
load ( ) ;
}
else {
// when responseText is empty, wait for load or error event
// to inform if it is a 404 or empty file
xhr . addEventListener ( 'error' , error ) ;
xhr . addEventListener ( 'load' , load ) ;
}
}
else if ( xhr . status === 200 ) {
load ( ) ;
}
else {
error ( ) ;
}
}
} ;
xhr . open ( "GET" , url , true ) ;
if ( xhr . setRequestHeader ) {
xhr . setRequestHeader ( 'Accept' , 'application/x-es-module, */*' ) ;
// can set "authorization: true" to enable withCredentials only
if ( authorization ) {
if ( typeof authorization == 'string' )
xhr . setRequestHeader ( 'Authorization' , authorization ) ;
xhr . withCredentials = true ;
}
}
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
if ( doTimeout ) {
setTimeout ( function ( ) {
xhr . send ( ) ;
} , 0 ) ;
} else {
xhr . send ( null ) ;
}
} ;
}
else if ( typeof require != 'undefined' && typeof process != 'undefined' ) {
var fs ;
fetchTextFromURL = function ( url , authorization , fulfill , reject ) {
if ( url . substr ( 0 , 8 ) != 'file:///' )
throw new Error ( 'Unable to fetch "' + url + '". Only file URLs of the form file:/// allowed running in Node.' ) ;
fs = fs || require ( 'fs' ) ;
if ( isWindows )
url = url . replace ( /\//g , '\\' ) . substr ( 8 ) ;
else
url = url . substr ( 7 ) ;
return fs . readFile ( url , function ( err , data ) {
if ( err ) {
return reject ( err ) ;
}
else {
// Strip Byte Order Mark out if it's the leading char
var dataString = data + '' ;
if ( dataString [ 0 ] === '\ufeff' )
dataString = dataString . substr ( 1 ) ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
fulfill ( dataString ) ;
}
} ) ;
} ;
}
else if ( typeof self != 'undefined' && typeof self . fetch != 'undefined' ) {
fetchTextFromURL = function ( url , authorization , fulfill , reject ) {
var opts = {
headers : { 'Accept' : 'application/x-es-module, */*' }
} ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
if ( authorization ) {
if ( typeof authorization == 'string' )
opts . headers [ 'Authorization' ] = authorization ;
opts . credentials = 'include' ;
}
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
fetch ( url , opts )
. then ( function ( r ) {
if ( r . ok ) {
return r . text ( ) ;
} else {
throw new Error ( 'Fetch error: ' + r . status + ' ' + r . statusText ) ;
}
} )
. then ( fulfill , reject ) ;
}
}
else {
throw new TypeError ( 'No environment fetch API available.' ) ;
}
function readMemberExpression ( p , value ) {
var pParts = p . split ( '.' ) ;
while ( pParts . length )
value = value [ pParts . shift ( ) ] ;
return value ;
2016-01-10 20:07:42 +01:00
}
function getMapMatch ( map , name ) {
var bestMatch , bestMatchLength = 0 ;
for ( var p in map ) {
if ( name . substr ( 0 , p . length ) == p && ( name . length == p . length || name [ p . length ] == '/' ) ) {
var curMatchLength = p . split ( '/' ) . length ;
if ( curMatchLength <= bestMatchLength )
continue ;
bestMatch = p ;
bestMatchLength = curMatchLength ;
}
}
return bestMatch ;
}
2016-09-26 18:00:21 +02:00
function prepareBaseURL ( loader ) {
// ensure baseURl is fully normalized
if ( this . _loader . baseURL !== this . baseURL ) {
if ( this . baseURL [ this . baseURL . length - 1 ] != '/' )
this . baseURL += '/' ;
this . _loader . baseURL = this . baseURL = new URL ( this . baseURL , baseURIObj ) . href ;
}
}
var envModule ;
function setProduction ( isProduction , isBuilder ) {
this . set ( '@system-env' , envModule = this . newModule ( {
2016-01-10 20:07:42 +01:00
browser : isBrowser ,
node : ! ! this . _nodeRequire ,
2016-09-26 18:00:21 +02:00
production : ! isBuilder && isProduction ,
dev : isBuilder || ! isProduction ,
build : isBuilder ,
'default' : true
2016-01-10 20:07:42 +01:00
} ) ) ;
}
hookConstructor ( function ( constructor ) {
return function ( ) {
constructor . call ( this ) ;
// support baseURL
2016-09-26 18:00:21 +02:00
this . baseURL = baseURI ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
// support map and paths
2016-01-10 20:07:42 +01:00
this . map = { } ;
2016-09-26 18:00:21 +02:00
// make the location of the system.js script accessible
if ( typeof $ _ _curScript != 'undefined' )
this . scriptSrc = $ _ _curScript . src ;
2016-01-10 20:07:42 +01:00
// global behaviour flags
this . warnings = false ;
this . defaultJSExtensions = false ;
this . pluginFirst = false ;
2016-09-26 18:00:21 +02:00
this . loaderErrorStack = false ;
2016-01-10 20:07:42 +01:00
// by default load ".json" files as json
// leading * meta doesn't need normalization
// NB add this in next breaking release
// this.meta['*.json'] = { format: 'json' };
// support the empty module, as a concept
this . set ( '@empty' , this . newModule ( { } ) ) ;
2016-09-26 18:00:21 +02:00
setProduction . call ( this , false , false ) ;
2016-01-10 20:07:42 +01:00
} ;
} ) ;
// include the node require since we're overriding it
if ( typeof require != 'undefined' && typeof process != 'undefined' && ! process . browser )
SystemJSLoader . prototype . _nodeRequire = require ;
/ *
Core SystemJS Normalization
If a name is relative , we apply URL normalization to the page
If a name is an absolute URL , we leave it as - is
Plain names ( neither of the above ) run through the map and paths
normalization phases .
The paths normalization phase applies last ( paths extension ) , which
defines the ` decanonicalize ` function and normalizes everything into
a URL .
* /
2016-09-26 18:00:21 +02:00
var parentModuleContext ;
function getNodeModule ( name , baseURL ) {
if ( ! isPlain ( name ) )
throw new Error ( 'Node module ' + name + ' can\'t be loaded as it is not a package require.' ) ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
if ( ! parentModuleContext ) {
var Module = this . _nodeRequire ( 'module' ) ;
var base = baseURL . substr ( isWindows ? 8 : 7 ) ;
parentModuleContext = new Module ( base ) ;
parentModuleContext . paths = Module . _nodeModulePaths ( base ) ;
}
return parentModuleContext . require ( name ) ;
}
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
function coreResolve ( name , parentName ) {
// standard URL resolution
if ( isRel ( name ) )
return urlResolve ( name , parentName ) ;
else if ( isAbsolute ( name ) )
return name ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
// plain names not starting with './', '://' and '/' go through custom resolution
var mapMatch = getMapMatch ( this . map , name ) ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
if ( mapMatch ) {
name = this . map [ mapMatch ] + name . substr ( mapMatch . length ) ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
if ( isRel ( name ) )
return urlResolve ( name ) ;
else if ( isAbsolute ( name ) )
return name ;
}
if ( this . has ( name ) )
return name ;
// dynamically load node-core modules when requiring `@node/fs` for example
if ( name . substr ( 0 , 6 ) == '@node/' ) {
if ( ! this . _nodeRequire )
throw new TypeError ( 'Error loading ' + name + '. Can only load node core modules in Node.' ) ;
if ( this . builder )
this . set ( name , this . newModule ( { } ) ) ;
2016-01-10 20:07:42 +01:00
else
2016-09-26 18:00:21 +02:00
this . set ( name , this . newModule ( getESModule ( getNodeModule . call ( this , name . substr ( 6 ) , this . baseURL ) ) ) ) ;
return name ;
}
// prepare the baseURL to ensure it is normalized
prepareBaseURL . call ( this ) ;
return applyPaths ( this , name ) || this . baseURL + name ;
}
hook ( 'normalize' , function ( normalize ) {
return function ( name , parentName , skipExt ) {
var resolved = coreResolve . call ( this , name , parentName ) ;
if ( this . defaultJSExtensions && ! skipExt && resolved . substr ( resolved . length - 3 , 3 ) != '.js' && ! isPlain ( resolved ) )
resolved += '.js' ;
return resolved ;
2016-01-10 20:07:42 +01:00
} ;
} ) ;
// percent encode just '#' in urls if using HTTP requests
var httpRequest = typeof XMLHttpRequest != 'undefined' ;
hook ( 'locate' , function ( locate ) {
return function ( load ) {
return Promise . resolve ( locate . call ( this , load ) )
. then ( function ( address ) {
if ( httpRequest )
return address . replace ( /#/g , '%23' ) ;
return address ;
} ) ;
} ;
} ) ;
/ *
* Fetch with authorization
* /
hook ( 'fetch' , function ( ) {
return function ( load ) {
return new Promise ( function ( resolve , reject ) {
fetchTextFromURL ( load . address , load . metadata . authorization , resolve , reject ) ;
} ) ;
} ;
} ) ;
/ *
_ _useDefault
When a module object looks like :
newModule (
_ _useDefault : true ,
default : 'some-module'
} )
Then importing that module provides the 'some-module'
result directly instead of the full module .
Useful for eg module . exports = function ( ) { }
* /
hook ( 'import' , function ( systemImport ) {
return function ( name , parentName , parentAddress ) {
if ( parentName && parentName . name )
warn . call ( this , 'SystemJS.import(name, { name: parentName }) is deprecated for SystemJS.import(name, parentName), while importing ' + name + ' from ' + parentName . name ) ;
return systemImport . call ( this , name , parentName , parentAddress ) . then ( function ( module ) {
return module . _ _useDefault ? module [ 'default' ] : module ;
} ) ;
} ;
} ) ;
/ *
* Allow format : 'detect' meta to enable format detection
* /
hook ( 'translate' , function ( systemTranslate ) {
return function ( load ) {
if ( load . metadata . format == 'detect' )
load . metadata . format = undefined ;
2016-09-26 18:00:21 +02:00
return systemTranslate . apply ( this , arguments ) ;
2016-01-10 20:07:42 +01:00
} ;
} ) ;
/ *
* JSON format support
*
* Supports loading JSON files as a module format itself
*
* Usage :
*
* SystemJS . config ( {
* meta : {
* '*.json' : { format : 'json' }
* }
* } ) ;
*
* Module is returned as if written :
*
* export default { JSON }
*
* No named exports are provided
*
* Files ending in ".json" are treated as json automatically by SystemJS
* /
hook ( 'instantiate' , function ( instantiate ) {
return function ( load ) {
if ( load . metadata . format == 'json' && ! this . builder ) {
var entry = load . metadata . entry = createEntry ( ) ;
entry . deps = [ ] ;
entry . execute = function ( ) {
try {
return JSON . parse ( load . source ) ;
}
catch ( e ) {
throw new Error ( "Invalid JSON file " + load . name ) ;
}
} ;
}
} ;
} )
/ *
Extend config merging one deep only
loader . config ( {
some : 'random' ,
config : 'here' ,
deep : {
config : { too : 'too' }
}
} ) ;
<= >
loader . some = 'random' ;
loader . config = 'here'
loader . deep = loader . deep || { } ;
loader . deep . config = { too : 'too' } ;
Normalizes meta and package configs allowing for :
SystemJS . config ( {
meta : {
'./index.js' : { }
}
} ) ;
To become
SystemJS . meta [ 'https://thissite.com/index.js' ] = { } ;
For easy normalization canonicalization with latest URL support .
* /
2016-09-26 18:00:21 +02:00
function envSet ( loader , cfg , envCallback ) {
if ( envModule . browser && cfg . browserConfig )
envCallback ( cfg . browserConfig ) ;
if ( envModule . node && cfg . nodeConfig )
envCallback ( cfg . nodeConfig ) ;
if ( envModule . dev && cfg . devConfig )
envCallback ( cfg . devConfig ) ;
if ( envModule . build && cfg . buildConfig )
envCallback ( cfg . buildConfig ) ;
if ( envModule . production && cfg . productionConfig )
envCallback ( cfg . productionConfig ) ;
}
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
SystemJSLoader . prototype . getConfig = function ( name ) {
var cfg = { } ;
2016-01-10 20:07:42 +01:00
var loader = this ;
2016-09-26 18:00:21 +02:00
for ( var p in loader ) {
if ( loader . hasOwnProperty && ! loader . hasOwnProperty ( p ) || p in SystemJSLoader . prototype && p != 'transpiler' )
continue ;
if ( indexOf . call ( [ '_loader' , 'amdDefine' , 'amdRequire' , 'defined' , 'failed' , 'version' , 'loads' ] , p ) == - 1 )
cfg [ p ] = loader [ p ] ;
}
cfg . production = envModule . production ;
return cfg ;
} ;
var curCurScript ;
SystemJSLoader . prototype . config = function ( cfg , isEnvConfig ) {
var loader = this ;
if ( 'loaderErrorStack' in cfg ) {
curCurScript = $ _ _curScript ;
if ( cfg . loaderErrorStack )
$ _ _curScript = undefined ;
else
$ _ _curScript = curCurScript ;
}
2016-01-10 20:07:42 +01:00
if ( 'warnings' in cfg )
loader . warnings = cfg . warnings ;
2016-01-26 17:21:17 +01:00
// transpiler deprecation path
if ( cfg . transpilerRuntime === false )
loader . _loader . loadedTranspilerRuntime = true ;
2016-09-26 18:00:21 +02:00
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 ) {
var hasConfig = false ;
function checkHasConfig ( obj ) {
for ( var p in obj )
if ( obj . hasOwnProperty ( p ) )
return true ;
}
if ( checkHasConfig ( loader . packages ) || checkHasConfig ( loader . meta ) || checkHasConfig ( loader . depCache ) || checkHasConfig ( loader . bundles ) || checkHasConfig ( loader . packageConfigPaths ) )
throw new TypeError ( 'Incorrect configuration order. The baseURL must be configured with the first SystemJS.config call.' ) ;
this . baseURL = baseURL ;
prepareBaseURL . call ( this ) ;
2016-01-10 20:07:42 +01:00
}
2016-09-26 18:00:21 +02:00
if ( cfg . paths )
extend ( loader . paths , cfg . paths ) ;
envSet ( loader , cfg , function ( cfg ) {
if ( cfg . paths )
extend ( loader . paths , cfg . paths ) ;
} ) ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
// warn on wildcard path deprecations
if ( this . warnings ) {
for ( var p in loader . paths )
if ( p . indexOf ( '*' ) != - 1 )
warn . call ( loader , 'Paths configuration "' + p + '" -> "' + loader . paths [ p ] + '" uses wildcards which are being deprecated for simpler trailing "/" folder paths.' ) ;
}
2016-01-10 20:07:42 +01:00
}
if ( cfg . defaultJSExtensions ) {
loader . defaultJSExtensions = cfg . defaultJSExtensions ;
warn . call ( loader , 'The defaultJSExtensions configuration option is deprecated, use packages configuration instead.' ) ;
}
if ( cfg . pluginFirst )
loader . pluginFirst = cfg . pluginFirst ;
if ( cfg . map ) {
var objMaps = '' ;
for ( var p in cfg . map ) {
var v = cfg . map [ p ] ;
// object map backwards-compat into packages configuration
if ( typeof v !== 'string' ) {
objMaps += ( objMaps . length ? ', ' : '' ) + '"' + p + '"' ;
2016-09-26 18:00:21 +02:00
var defaultJSExtension = loader . defaultJSExtensions && p . substr ( p . length - 3 , 3 ) != '.js' ;
var prop = loader . decanonicalize ( p ) ;
if ( defaultJSExtension && prop . substr ( prop . length - 3 , 3 ) == '.js' )
prop = prop . substr ( 0 , prop . length - 3 ) ;
2016-01-10 20:07:42 +01:00
// if a package main, revert it
var pkgMatch = '' ;
for ( var pkg in loader . packages ) {
2016-01-26 17:21:17 +01:00
if ( prop . substr ( 0 , pkg . length ) == pkg
&& ( ! prop [ pkg . length ] || prop [ pkg . length ] == '/' )
2016-01-10 20:07:42 +01:00
&& pkgMatch . split ( '/' ) . length < pkg . split ( '/' ) . length )
pkgMatch = pkg ;
}
if ( pkgMatch && loader . packages [ pkgMatch ] . main )
2016-01-26 17:21:17 +01:00
prop = prop . substr ( 0 , prop . length - loader . packages [ pkgMatch ] . main . length - 1 ) ;
2016-01-10 20:07:42 +01:00
2016-01-26 17:21:17 +01:00
var pkg = loader . packages [ prop ] = loader . packages [ prop ] || { } ;
2016-01-10 20:07:42 +01:00
pkg . map = v ;
}
else {
loader . map [ p ] = v ;
}
}
if ( objMaps )
warn . call ( loader , 'The map configuration for ' + objMaps + ' uses object submaps, which is deprecated in global map.\nUpdate this to use package contextual map with configs like SystemJS.config({ packages: { "' + p + '": { map: {...} } } }).' ) ;
}
if ( cfg . packageConfigPaths ) {
var packageConfigPaths = [ ] ;
for ( var i = 0 ; i < cfg . packageConfigPaths . length ; i ++ ) {
var path = cfg . packageConfigPaths [ i ] ;
var packageLength = Math . max ( path . lastIndexOf ( '*' ) + 1 , path . lastIndexOf ( '/' ) ) ;
2016-09-26 18:00:21 +02:00
var normalized = coreResolve . call ( loader , path . substr ( 0 , packageLength ) ) ;
packageConfigPaths [ i ] = normalized + path . substr ( packageLength ) ;
2016-01-10 20:07:42 +01:00
}
loader . packageConfigPaths = packageConfigPaths ;
}
if ( cfg . bundles ) {
for ( var p in cfg . bundles ) {
var bundle = [ ] ;
2016-09-26 18:00:21 +02:00
for ( var i = 0 ; i < cfg . bundles [ p ] . length ; i ++ ) {
var defaultJSExtension = loader . defaultJSExtensions && cfg . bundles [ p ] [ i ] . substr ( cfg . bundles [ p ] [ i ] . length - 3 , 3 ) != '.js' ;
var normalizedBundleDep = loader . decanonicalize ( cfg . bundles [ p ] [ i ] ) ;
if ( defaultJSExtension && normalizedBundleDep . substr ( normalizedBundleDep . length - 3 , 3 ) == '.js' )
normalizedBundleDep = normalizedBundleDep . substr ( 0 , normalizedBundleDep . length - 3 ) ;
bundle . push ( normalizedBundleDep ) ;
}
2016-01-10 20:07:42 +01:00
loader . 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.' ) ;
2016-09-26 18:00:21 +02:00
var prop = coreResolve . call ( loader , p ) ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
// allow trailing slash in packages
2016-01-10 20:07:42 +01:00
if ( prop [ prop . length - 1 ] == '/' )
prop = prop . substr ( 0 , prop . length - 1 ) ;
2016-09-26 18:00:21 +02:00
setPkgConfig ( loader , prop , cfg . packages [ p ] , false ) ;
2016-01-10 20:07:42 +01:00
}
}
for ( var c in cfg ) {
var v = cfg [ c ] ;
2016-09-26 18:00:21 +02:00
if ( indexOf . call ( [ 'baseURL' , 'map' , 'packages' , 'bundles' , 'paths' , 'warnings' , 'packageConfigPaths' ,
'loaderErrorStack' , 'browserConfig' , 'nodeConfig' , 'devConfig' , 'buildConfig' , 'productionConfig' ] , c ) != - 1 )
2016-01-10 20:07:42 +01:00
continue ;
if ( typeof v != 'object' || v instanceof Array ) {
loader [ c ] = v ;
}
else {
loader [ c ] = loader [ c ] || { } ;
for ( var p in v ) {
// base-level wildcard meta does not normalize to retain catch-all quality
2016-09-26 18:00:21 +02:00
if ( c == 'meta' && p [ 0 ] == '*' ) {
extend ( loader [ c ] [ p ] = loader [ c ] [ p ] || { } , v [ p ] ) ;
}
else if ( c == 'meta' ) {
// meta can go through global map, with defaultJSExtensions adding
var resolved = coreResolve . call ( loader , p ) ;
if ( loader . defaultJSExtensions && resolved . substr ( resolved . length - 3 , 3 ) != '.js' && ! isPlain ( resolved ) )
resolved += '.js' ;
extend ( loader [ c ] [ resolved ] = loader [ c ] [ resolved ] || { } , v [ p ] ) ;
}
else if ( c == 'depCache' ) {
var defaultJSExtension = loader . defaultJSExtensions && p . substr ( p . length - 3 , 3 ) != '.js' ;
var prop = loader . decanonicalize ( p ) ;
if ( defaultJSExtension && prop . substr ( prop . length - 3 , 3 ) == '.js' )
prop = prop . substr ( 0 , prop . length - 3 ) ;
loader [ c ] [ prop ] = [ ] . concat ( v [ p ] ) ;
}
else {
2016-01-10 20:07:42 +01:00
loader [ c ] [ p ] = v [ p ] ;
2016-09-26 18:00:21 +02:00
}
2016-01-10 20:07:42 +01:00
}
}
}
2016-09-26 18:00:21 +02:00
envSet ( loader , cfg , function ( cfg ) {
loader . config ( cfg , true ) ;
} ) ;
2016-01-10 20:07:42 +01:00
} ; / *
* Package Configuration Extension
*
* Example :
*
* SystemJS . packages = {
* jquery : {
* main : 'index.js' , // when not set, package name 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' : {
2016-09-26 18:00:21 +02:00
* '~browser' : './index-node.js' ,
* './custom-condition.js|~export' : './index-custom.js'
2016-01-10 20:07:42 +01:00
* }
* } ,
* // allows for setting package-prefixed depCache
* // keys are normalized module names 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
* - defaultJSExtensions applies after map when defaultExtension is not set
* - 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 name 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 name 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 ( ) {
hookConstructor ( function ( constructor ) {
return function ( ) {
constructor . call ( this ) ;
this . packages = { } ;
2016-09-26 18:00:21 +02:00
this . packageConfigPaths = [ ] ;
2016-01-10 20:07:42 +01:00
} ;
} ) ;
function getPackage ( loader , normalized ) {
// use most specific package
var curPkg , curPkgLen = 0 , pkgLen ;
for ( var p in loader . packages ) {
if ( normalized . substr ( 0 , p . length ) === p && ( normalized . length === p . length || normalized [ p . length ] === '/' ) ) {
pkgLen = p . split ( '/' ) . length ;
if ( pkgLen > curPkgLen ) {
curPkg = p ;
curPkgLen = pkgLen ;
}
}
}
return curPkg ;
}
2016-09-26 18:00:21 +02:00
function addDefaultExtension ( loader , pkg , pkgName , subPath , skipExtensions ) {
2016-01-10 20:07:42 +01:00
// don't apply extensions to folders or if defaultExtension = false
if ( ! subPath || subPath [ subPath . length - 1 ] == '/' || skipExtensions || pkg . defaultExtension === false )
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 && loader . meta )
2016-09-26 18:00:21 +02:00
getMetaMatches ( loader . meta , pkgName + '/' + subPath , function ( metaPattern , matchMeta , matchDepth ) {
2016-01-10 20:07:42 +01:00
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
// NB reconsider if default should really be ".js"?
var defaultExtension = '.' + ( pkg . defaultExtension || 'js' ) ;
if ( subPath . substr ( subPath . length - defaultExtension . length ) != defaultExtension )
return subPath + defaultExtension ;
else
return subPath ;
}
function applyPackageConfigSync ( loader , pkg , pkgName , subPath , skipExtensions ) {
// main
if ( ! subPath ) {
if ( pkg . main )
subPath = pkg . main . substr ( 0 , 2 ) == './' ? pkg . main . substr ( 2 ) : pkg . main ;
// also no submap if name is package itself (import 'pkg' -> 'path/to/pkg.js')
else
// NB can add a default package main convention here when defaultJSExtensions is deprecated
// if it becomes internal to the package then it would no longer be an exit path
return pkgName + ( loader . defaultJSExtensions ? '.js' : '' ) ;
}
// 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 ) {
2016-09-26 18:00:21 +02:00
mapPath = './' + addDefaultExtension ( loader , pkg , pkgName , subPath , skipExtensions ) ;
2016-01-10 20:07:42 +01:00
if ( mapPath != './' + subPath )
mapMatch = getMapMatch ( pkg . map , mapPath ) ;
}
2016-09-26 18:00:21 +02:00
if ( mapMatch ) {
var mapped = doMapSync ( loader , pkg , pkgName , mapMatch , mapPath , skipExtensions ) ;
if ( mapped )
return mapped ;
}
2016-01-10 20:07:42 +01:00
}
// normal package resolution
2016-09-26 18:00:21 +02:00
return pkgName + '/' + addDefaultExtension ( loader , pkg , pkgName , subPath , skipExtensions ) ;
}
function validMapping ( mapMatch , mapped , pkgName , path ) {
// disallow internal to subpath maps
if ( mapMatch == '.' )
throw new Error ( 'Package ' + pkgName + ' has a map entry for "." which is not permitted.' ) ;
// 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 ;
2016-01-10 20:07:42 +01:00
}
2016-09-26 18:00:21 +02:00
function doMapSync ( loader , pkg , pkgName , mapMatch , path , skipExtensions ) {
if ( path [ path . length - 1 ] == '/' )
path = path . substr ( 0 , path . length - 1 ) ;
2016-01-10 20:07:42 +01:00
var mapped = pkg . map [ mapMatch ] ;
2016-09-26 18:00:21 +02:00
if ( typeof mapped == 'object' )
throw new Error ( 'Synchronous conditional normalization not supported sync normalizing ' + mapMatch + ' in ' + pkgName ) ;
if ( ! validMapping ( mapMatch , mapped , pkgName , path ) || typeof mapped != 'string' )
return ;
2016-01-10 20:07:42 +01:00
// package map to main / base-level
if ( mapped == '.' )
mapped = pkgName ;
// internal package map
else if ( mapped . substr ( 0 , 2 ) == './' )
2016-09-26 18:00:21 +02:00
return pkgName + '/' + addDefaultExtension ( loader , pkg , pkgName , mapped . substr ( 2 ) + path . substr ( mapMatch . length ) , skipExtensions ) ;
2016-01-10 20:07:42 +01:00
// external map reference
return loader . normalizeSync ( mapped + path . substr ( mapMatch . length ) , pkgName + '/' ) ;
}
function applyPackageConfig ( loader , pkg , pkgName , subPath , skipExtensions ) {
// main
if ( ! subPath ) {
if ( pkg . main )
subPath = pkg . main . substr ( 0 , 2 ) == './' ? pkg . main . substr ( 2 ) : pkg . main ;
// also no submap if name is package itself (import 'pkg' -> 'path/to/pkg.js')
else
// NB can add a default package main convention here when defaultJSExtensions is deprecated
// if it becomes internal to the package then it would no longer be an exit path
return Promise . resolve ( pkgName + ( loader . defaultJSExtensions ? '.js' : '' ) ) ;
}
// 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 ) {
2016-09-26 18:00:21 +02:00
mapPath = './' + addDefaultExtension ( loader , pkg , pkgName , subPath , skipExtensions ) ;
2016-01-10 20:07:42 +01:00
if ( mapPath != './' + subPath )
mapMatch = getMapMatch ( pkg . map , mapPath ) ;
}
}
2016-09-26 18:00:21 +02:00
return ( mapMatch ? doMap ( loader , pkg , pkgName , mapMatch , mapPath , skipExtensions ) : Promise . resolve ( ) )
2016-01-10 20:07:42 +01:00
. then ( function ( mapped ) {
if ( mapped )
return Promise . resolve ( mapped ) ;
// normal package resolution / fallback resolution for no conditional match
2016-09-26 18:00:21 +02:00
return Promise . resolve ( pkgName + '/' + addDefaultExtension ( loader , pkg , pkgName , subPath , skipExtensions ) ) ;
2016-01-10 20:07:42 +01:00
} ) ;
}
2016-09-26 18:00:21 +02:00
function doStringMap ( loader , pkg , pkgName , mapMatch , mapped , path , skipExtensions ) {
2016-01-10 20:07:42 +01:00
// NB the interpolation cases should strictly skip subsequent interpolation
// package map to main / base-level
if ( mapped == '.' )
mapped = pkgName ;
// internal package map
else if ( mapped . substr ( 0 , 2 ) == './' )
2016-09-26 18:00:21 +02:00
return Promise . resolve ( pkgName + '/' + addDefaultExtension ( loader , pkg , pkgName , mapped . substr ( 2 ) + path . substr ( mapMatch . length ) , skipExtensions ) )
2016-01-10 20:07:42 +01:00
. then ( function ( name ) {
return interpolateConditional . call ( loader , name , pkgName + '/' ) ;
} ) ;
// external map reference
return loader . normalize ( mapped + path . substr ( mapMatch . length ) , pkgName + '/' ) ;
}
2016-09-26 18:00:21 +02:00
function doMap ( loader , pkg , pkgName , mapMatch , path , skipExtensions ) {
if ( path [ path . length - 1 ] == '/' )
path = path . substr ( 0 , path . length - 1 ) ;
2016-01-10 20:07:42 +01:00
var mapped = pkg . map [ mapMatch ] ;
2016-09-26 18:00:21 +02:00
if ( typeof mapped == 'string' ) {
if ( ! validMapping ( mapMatch , mapped , pkgName , path ) )
return Promise . resolve ( ) ;
return doStringMap ( loader , pkg , pkgName , mapMatch , mapped , path , skipExtensions ) ;
}
2016-01-10 20:07:42 +01:00
// we use a special conditional syntax to allow the builder to handle conditional branch points further
if ( loader . builder )
return Promise . resolve ( pkgName + '/#:' + path ) ;
2016-09-26 18:00:21 +02:00
// 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 ( loader [ 'import' ] ( c . module , pkgName ) ) ;
}
2016-01-10 20:07:42 +01:00
// map object -> conditional map
2016-09-26 18:00:21 +02:00
return Promise . all ( conditionPromises )
. then ( function ( conditionValues ) {
2016-01-10 20:07:42 +01:00
// first map condition to match is used
2016-09-26 18:00:21 +02:00
for ( var i = 0 ; i < conditions . length ; i ++ ) {
var c = conditions [ i ] . condition ;
var value = readMemberExpression ( c . prop , conditionValues [ i ] ) ;
if ( ! c . negate && value || c . negate && ! value )
return conditions [ i ] . map ;
2016-01-10 20:07:42 +01:00
}
} )
. then ( function ( mapped ) {
2016-09-26 18:00:21 +02:00
if ( mapped ) {
if ( ! validMapping ( mapMatch , mapped , pkgName , path ) )
return ;
return doStringMap ( loader , pkg , pkgName , mapMatch , mapped , path , skipExtensions ) ;
}
2016-01-10 20:07:42 +01:00
// no environment match -> fallback to original subPath by returning undefined
} ) ;
}
// normalizeSync = decanonicalize + package resolution
SystemJSLoader . prototype . normalizeSync = SystemJSLoader . prototype . decanonicalize = SystemJSLoader . prototype . normalize ;
// decanonicalize must JUST handle package defaultExtension: false case when defaultJSExtensions is set
// to be deprecated!
hook ( 'decanonicalize' , function ( decanonicalize ) {
return function ( name , parentName ) {
2016-09-26 18:00:21 +02:00
if ( this . builder )
return decanonicalize . call ( this , name , parentName , true ) ;
var decanonicalized = decanonicalize . call ( this , name , parentName , false ) ;
2016-01-10 20:07:42 +01:00
if ( ! this . defaultJSExtensions )
return decanonicalized ;
var pkgName = getPackage ( this , decanonicalized ) ;
2016-09-26 18:00:21 +02:00
var pkg = this . packages [ pkgName ] ;
var defaultExtension = pkg && pkg . defaultExtension ;
if ( defaultExtension == undefined && pkg && pkg . meta )
getMetaMatches ( pkg . meta , decanonicalized . substr ( pkgName ) , function ( metaPattern , matchMeta , matchDepth ) {
if ( matchDepth == 0 || metaPattern . lastIndexOf ( '*' ) != metaPattern . length - 1 ) {
defaultExtension = false ;
return true ;
}
} ) ;
2016-01-10 20:07:42 +01:00
2016-01-26 17:21:17 +01:00
if ( ( defaultExtension === false || defaultExtension && defaultExtension != '.js' ) && name . substr ( name . length - 3 , 3 ) != '.js' && decanonicalized . substr ( decanonicalized . length - 3 , 3 ) == '.js' )
2016-01-10 20:07:42 +01:00
decanonicalized = decanonicalized . substr ( 0 , decanonicalized . length - 3 ) ;
return decanonicalized ;
} ;
} ) ;
hook ( 'normalizeSync' , function ( normalizeSync ) {
return function ( name , parentName , isPlugin ) {
var loader = this ;
isPlugin = isPlugin === true ;
// apply contextual package map first
// (we assume the parent package config has already been loaded)
if ( parentName )
var parentPackageName = getPackage ( loader , parentName ) ||
loader . defaultJSExtensions && parentName . substr ( parentName . length - 3 , 3 ) == '.js' &&
getPackage ( loader , parentName . substr ( 0 , parentName . length - 3 ) ) ;
var parentPackage = parentPackageName && loader . packages [ parentPackageName ] ;
// ignore . since internal maps handled by standard package resolution
if ( parentPackage && name [ 0 ] != '.' ) {
var parentMap = parentPackage . map ;
var parentMapMatch = parentMap && getMapMatch ( parentMap , name ) ;
2016-09-26 18:00:21 +02:00
if ( parentMapMatch && typeof parentMap [ parentMapMatch ] == 'string' ) {
var mapped = doMapSync ( loader , parentPackage , parentPackageName , parentMapMatch , name , isPlugin ) ;
if ( mapped )
return mapped ;
}
2016-01-10 20:07:42 +01:00
}
var defaultJSExtension = loader . defaultJSExtensions && name . substr ( name . length - 3 , 3 ) != '.js' ;
// apply map, core, paths, contextual package map
2016-09-26 18:00:21 +02:00
var normalized = normalizeSync . call ( loader , name , parentName , false ) ;
2016-01-10 20:07:42 +01:00
// undo defaultJSExtension
if ( defaultJSExtension && normalized . substr ( normalized . length - 3 , 3 ) != '.js' )
defaultJSExtension = false ;
if ( defaultJSExtension )
normalized = normalized . substr ( 0 , normalized . length - 3 ) ;
var pkgConfigMatch = getPackageConfigMatch ( loader , normalized ) ;
var pkgName = pkgConfigMatch && pkgConfigMatch . packageName || getPackage ( loader , normalized ) ;
if ( ! pkgName )
return normalized + ( defaultJSExtension ? '.js' : '' ) ;
var subPath = normalized . substr ( pkgName . length + 1 ) ;
return applyPackageConfigSync ( loader , loader . packages [ pkgName ] || { } , pkgName , subPath , isPlugin ) ;
} ;
} ) ;
hook ( 'normalize' , function ( normalize ) {
return function ( name , parentName , isPlugin ) {
var loader = this ;
isPlugin = isPlugin === true ;
return Promise . resolve ( )
. then ( function ( ) {
// apply contextual package map first
// (we assume the parent package config has already been loaded)
if ( parentName )
var parentPackageName = getPackage ( loader , parentName ) ||
loader . defaultJSExtensions && parentName . substr ( parentName . length - 3 , 3 ) == '.js' &&
getPackage ( loader , parentName . substr ( 0 , parentName . length - 3 ) ) ;
var parentPackage = parentPackageName && loader . packages [ parentPackageName ] ;
// ignore . since internal maps handled by standard package resolution
if ( parentPackage && name . substr ( 0 , 2 ) != './' ) {
var parentMap = parentPackage . map ;
var parentMapMatch = parentMap && getMapMatch ( parentMap , name ) ;
if ( parentMapMatch )
2016-09-26 18:00:21 +02:00
return doMap ( loader , parentPackage , parentPackageName , parentMapMatch , name , isPlugin ) ;
2016-01-10 20:07:42 +01:00
}
return Promise . resolve ( ) ;
} )
. then ( function ( mapped ) {
if ( mapped )
return mapped ;
var defaultJSExtension = loader . defaultJSExtensions && name . substr ( name . length - 3 , 3 ) != '.js' ;
// apply map, core, paths, contextual package map
2016-09-26 18:00:21 +02:00
var normalized = normalize . call ( loader , name , parentName , false ) ;
2016-01-10 20:07:42 +01:00
// undo defaultJSExtension
if ( defaultJSExtension && normalized . substr ( normalized . length - 3 , 3 ) != '.js' )
defaultJSExtension = false ;
if ( defaultJSExtension )
normalized = normalized . substr ( 0 , normalized . length - 3 ) ;
var pkgConfigMatch = getPackageConfigMatch ( loader , normalized ) ;
var pkgName = pkgConfigMatch && pkgConfigMatch . packageName || getPackage ( loader , normalized ) ;
if ( ! pkgName )
return Promise . resolve ( normalized + ( defaultJSExtension ? '.js' : '' ) ) ;
var pkg = loader . packages [ pkgName ] ;
// if package is already configured or not a dynamic config package, use existing package config
var isConfigured = pkg && ( pkg . configured || ! pkgConfigMatch ) ;
return ( isConfigured ? Promise . resolve ( pkg ) : loadPackageConfigPath ( loader , pkgName , pkgConfigMatch . configPath ) )
. then ( function ( pkg ) {
var subPath = normalized . substr ( pkgName . length + 1 ) ;
return applyPackageConfig ( loader , pkg , pkgName , subPath , isPlugin ) ;
} ) ;
} ) ;
} ;
} ) ;
// check if the given normalized name 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 ,
2016-09-26 18:00:21 +02:00
regEx : new RegExp ( '^(' + path . substr ( 0 , length ) . replace ( /[.+?^${}()|[\]\\]/g , '\\$&' ) . replace ( /\*/g , '[^\\/]+' ) + ')(\\/|$)' ) ,
2016-01-10 20:07:42 +01:00
wildcard : lastWildcard != - 1
} ;
}
// most specific match wins
function getPackageConfigMatch ( loader , normalized ) {
var pkgName , exactMatch = false , configPath ;
for ( var i = 0 ; i < loader . packageConfigPaths . length ; i ++ ) {
var packageConfigPath = loader . packageConfigPaths [ i ] ;
var p = packageConfigPaths [ packageConfigPath ] || ( packageConfigPaths [ packageConfigPath ] = createPkgConfigPathObj ( packageConfigPath ) ) ;
if ( normalized . length < p . length )
continue ;
var match = normalized . match ( p . regEx ) ;
if ( match && ( ! pkgName || ( ! ( exactMatch && p . wildcard ) && pkgName . length < match [ 1 ] . length ) ) ) {
pkgName = match [ 1 ] ;
exactMatch = ! p . wildcard ;
configPath = pkgName + packageConfigPath . substr ( p . length ) ;
}
}
if ( ! pkgName )
return ;
return {
packageName : pkgName ,
configPath : configPath
} ;
}
function loadPackageConfigPath ( loader , pkgName , pkgConfigPath ) {
var configLoader = loader . pluginLoader || loader ;
// NB remove this when json is default
( configLoader . meta [ pkgConfigPath ] = configLoader . meta [ pkgConfigPath ] || { } ) . format = 'json' ;
2016-09-26 18:00:21 +02:00
configLoader . meta [ pkgConfigPath ] . loader = null ;
2016-01-10 20:07:42 +01:00
return configLoader . load ( pkgConfigPath )
. then ( function ( ) {
2016-09-26 18:00:21 +02:00
var cfg = configLoader . get ( pkgConfigPath ) [ 'default' ] ;
2016-01-10 20:07:42 +01:00
// support "systemjs" prefixing
if ( cfg . systemjs )
cfg = cfg . systemjs ;
// modules backwards compatibility
if ( cfg . modules ) {
cfg . meta = cfg . modules ;
warn . call ( loader , 'Package config file ' + pkgConfigPath + ' is configured with "modules", which is deprecated as it has been renamed to "meta".' ) ;
}
2016-09-26 18:00:21 +02:00
return setPkgConfig ( loader , pkgName , cfg , true ) ;
2016-01-10 20:07:42 +01:00
} ) ;
}
function getMetaMatches ( pkgMeta , subPath , matchFn ) {
// wildcard meta
var 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
2016-09-26 18:00:21 +02:00
var exactMeta = pkgMeta [ subPath ] && pkgMeta . hasOwnProperty && pkgMeta . hasOwnProperty ( subPath ) ? pkgMeta [ subPath ] : pkgMeta [ './' + subPath ] ;
2016-01-10 20:07:42 +01:00
if ( exactMeta )
matchFn ( exactMeta , exactMeta , 0 ) ;
}
hook ( 'locate' , function ( locate ) {
return function ( load ) {
var loader = this ;
return Promise . resolve ( locate . call ( this , load ) )
. then ( function ( address ) {
var pkgName = getPackage ( loader , load . name ) ;
if ( pkgName ) {
var pkg = loader . packages [ pkgName ] ;
2016-09-26 18:00:21 +02:00
var subPath = load . name . substr ( pkgName . length + 1 ) ;
2016-01-10 20:07:42 +01:00
var meta = { } ;
if ( pkg . meta ) {
var bestDepth = 0 ;
// NB support a main shorthand in meta here?
getMetaMatches ( pkg . meta , subPath , function ( metaPattern , matchMeta , matchDepth ) {
if ( matchDepth > bestDepth )
bestDepth = matchDepth ;
extendMeta ( meta , matchMeta , matchDepth && bestDepth > matchDepth ) ;
} ) ;
extendMeta ( load . metadata , meta ) ;
}
2016-09-26 18:00:21 +02:00
// format
if ( pkg . format && ! load . metadata . loader )
load . metadata . format = load . metadata . format || pkg . format ;
2016-01-10 20:07:42 +01:00
}
return address ;
} ) ;
} ;
} ) ;
} ) ( ) ;
/ *
* Script tag fetch
*
* When load . metadata . scriptLoad is true , we load via script tag injection .
* /
( function ( ) {
if ( typeof document != 'undefined' )
var head = document . getElementsByTagName ( 'head' ) [ 0 ] ;
var curSystem ;
2016-09-26 18:00:21 +02:00
var curRequire ;
2016-01-10 20:07:42 +01:00
// if doing worker executing, this is set to the load record being executed
var workerLoad = null ;
// interactive mode handling method courtesy RequireJS
var ieEvents = head && ( function ( ) {
var s = document . createElement ( 'script' ) ;
var isOpera = typeof opera !== 'undefined' && opera . toString ( ) === '[object Opera]' ;
return s . attachEvent && ! ( s . attachEvent . toString && s . attachEvent . toString ( ) . indexOf ( '[native code' ) < 0 ) && ! isOpera ;
} ) ( ) ;
// IE interactive-only part
// we store loading scripts array as { script: <script>, load: {...} }
var interactiveLoadingScripts = [ ] ;
var interactiveScript ;
function getInteractiveScriptLoad ( ) {
if ( interactiveScript && interactiveScript . script . readyState === 'interactive' )
return interactiveScript . load ;
for ( var i = 0 ; i < interactiveLoadingScripts . length ; i ++ )
if ( interactiveLoadingScripts [ i ] . script . readyState == 'interactive' ) {
interactiveScript = interactiveLoadingScripts [ i ] ;
return interactiveScript . load ;
}
}
// System.register, System.registerDynamic, AMD define pipeline
// this is called by the above methods when they execute
// we then run the reduceRegister_ collection function either immediately
// if we are in IE and know the currently executing script (interactive)
// or later if we need to wait for the synchronous load callback to know the script
var loadingCnt = 0 ;
var registerQueue = [ ] ;
hook ( 'pushRegister_' , function ( pushRegister ) {
return function ( register ) {
// if using eval-execution then skip
if ( pushRegister . call ( this , register ) )
return false ;
// if using worker execution, then we're done
if ( workerLoad )
this . reduceRegister _ ( workerLoad , register ) ;
// detect if we know the currently executing load (IE)
// if so, immediately call reduceRegister
else if ( ieEvents )
this . reduceRegister _ ( getInteractiveScriptLoad ( ) , register ) ;
// otherwise, add to our execution queue
// to call reduceRegister on sync script load event
else if ( loadingCnt )
registerQueue . push ( register ) ;
// if we're not currently loading anything though
// then do the reduction against a null load
// (out of band named define or named register)
// note even in non-script environments, this catch is used
else
this . reduceRegister _ ( null , register ) ;
return true ;
} ;
} ) ;
function webWorkerImport ( loader , load ) {
return new Promise ( function ( resolve , reject ) {
if ( load . metadata . integrity )
reject ( new Error ( 'Subresource integrity checking is not supported in web workers.' ) ) ;
workerLoad = load ;
try {
importScripts ( load . address ) ;
}
catch ( e ) {
workerLoad = null ;
reject ( e ) ;
}
workerLoad = null ;
// if nothing registered, then something went wrong
if ( ! load . metadata . entry )
2016-09-26 18:00:21 +02:00
reject ( new Error ( load . address + ' did not call System.register or AMD define. If loading a global, ensure the meta format is set to global.' ) ) ;
2016-01-10 20:07:42 +01:00
resolve ( '' ) ;
} ) ;
}
// override fetch to use script injection
hook ( 'fetch' , function ( fetch ) {
return function ( load ) {
var loader = this ;
2016-09-26 18:00:21 +02:00
if ( load . metadata . format == 'json' || ! load . metadata . scriptLoad || ( ! isBrowser && ! isWorker ) )
2016-01-10 20:07:42 +01:00
return fetch . call ( this , load ) ;
if ( isWorker )
return webWorkerImport ( loader , load ) ;
return new Promise ( function ( resolve , reject ) {
var s = document . createElement ( 'script' ) ;
s . async = true ;
2016-09-26 18:00:21 +02:00
if ( load . metadata . crossOrigin )
s . crossOrigin = load . metadata . crossOrigin ;
2016-01-10 20:07:42 +01:00
if ( load . metadata . integrity )
s . setAttribute ( 'integrity' , load . metadata . integrity ) ;
if ( ieEvents ) {
s . attachEvent ( 'onreadystatechange' , complete ) ;
interactiveLoadingScripts . push ( {
script : s ,
load : load
} ) ;
}
else {
s . addEventListener ( 'load' , complete , false ) ;
s . addEventListener ( 'error' , error , false ) ;
}
loadingCnt ++ ;
curSystem = _ _global . System ;
2016-09-26 18:00:21 +02:00
curRequire = _ _global . require ;
2016-01-10 20:07:42 +01:00
s . src = load . address ;
head . appendChild ( s ) ;
function complete ( evt ) {
if ( s . readyState && s . readyState != 'loaded' && s . readyState != 'complete' )
return ;
loadingCnt -- ;
// complete call is sync on execution finish
// (in ie already done reductions)
if ( ! load . metadata . entry && ! registerQueue . length ) {
loader . reduceRegister _ ( load ) ;
}
else if ( ! ieEvents ) {
for ( var i = 0 ; i < registerQueue . length ; i ++ )
loader . reduceRegister _ ( load , registerQueue [ i ] ) ;
registerQueue = [ ] ;
}
cleanup ( ) ;
// if nothing registered, then something went wrong
if ( ! load . metadata . entry && ! load . metadata . bundle )
reject ( new Error ( load . name + ' did not call System.register or AMD define. If loading a global module configure the global name via the meta exports property for script injection support.' ) ) ;
resolve ( '' ) ;
}
function error ( evt ) {
cleanup ( ) ;
reject ( new Error ( 'Unable to load script ' + load . address ) ) ;
}
function cleanup ( ) {
_ _global . System = curSystem ;
2016-09-26 18:00:21 +02:00
_ _global . require = curRequire ;
2016-01-10 20:07:42 +01:00
if ( s . detachEvent ) {
s . detachEvent ( 'onreadystatechange' , complete ) ;
for ( var i = 0 ; i < interactiveLoadingScripts . length ; i ++ )
if ( interactiveLoadingScripts [ i ] . script == s ) {
if ( interactiveScript && interactiveScript . script == s )
interactiveScript = null ;
interactiveLoadingScripts . splice ( i , 1 ) ;
}
}
else {
s . removeEventListener ( 'load' , complete , false ) ;
s . removeEventListener ( 'error' , error , false ) ;
}
head . removeChild ( s ) ;
}
} ) ;
} ;
} ) ;
} ) ( ) ;
/ *
* Instantiate registry extension
*
* Supports Traceur System . register 'instantiate' output for loading ES6 as ES5 .
*
* - Creates the loader . register function
* - Also supports metadata . format = 'register' in instantiate for anonymous register modules
* - Also supports metadata . deps , metadata . execute and metadata . executingRequire
* for handling dynamic modules alongside register - transformed ES6 modules
*
*
* The code here replicates the ES6 linking groups algorithm to ensure that
* circular ES6 compiled into System . register can work alongside circular AMD
* and CommonJS , identically to the actual ES6 loader .
*
* /
/ *
* Registry side table entries in loader . defined
* Registry Entry Contains :
* - name
* - deps
* - declare for declarative modules
* - execute for dynamic modules , different to declarative execute on module
* - executingRequire indicates require drives execution for circularity of dynamic modules
* - declarative optional boolean indicating which of the above
*
* Can preload modules directly on SystemJS . defined [ 'my/module' ] = { deps , execute , executingRequire }
*
* Then the entry gets populated with derived information during processing :
* - normalizedDeps derived from deps , created in instantiate
* - groupIndex used by group linking algorithm
* - evaluated indicating whether evaluation has happend
* - module the module record object , containing :
* - exports actual module exports
*
* For dynamic we track the es module with :
* - esModule actual es module value
* - esmExports whether to extend the esModule with named exports
*
* Then for declarative only we track dynamic bindings with the 'module' records :
* - name
* - exports
* - setters declarative setter functions
* - dependencies , module records of dependencies
* - importers , module records of dependents
*
* After linked and evaluated , entries are removed , declarative module records remain in separate
* module binding table
*
* /
2016-09-26 18:00:21 +02:00
var leadingCommentAndMetaRegEx = /^(\s*\/\*[^\*]*(\*(?!\/)[^\*]*)*\*\/|\s*\/\/[^\n]*|\s*"[^"]+"\s*;?|\s*'[^']+'\s*;?)*\s*/ ;
2016-01-10 20:07:42 +01:00
function detectRegisterFormat ( source ) {
var leadingCommentAndMeta = source . match ( leadingCommentAndMetaRegEx ) ;
return leadingCommentAndMeta && source . substr ( leadingCommentAndMeta [ 0 ] . length , 15 ) == 'System.register' ;
}
function createEntry ( ) {
return {
name : null ,
deps : null ,
originalIndices : null ,
declare : null ,
execute : null ,
executingRequire : false ,
declarative : false ,
normalizedDeps : null ,
groupIndex : null ,
evaluated : false ,
module : null ,
esModule : null ,
esmExports : false
} ;
}
( function ( ) {
/ *
* There are two variations of System . register :
* 1. System . register for ES6 conversion ( 2 - 3 params ) - System . register ( [ name , ] deps , declare )
* see https : //github.com/ModuleLoader/es6-module-loader/wiki/System.register-Explained
*
* 2. System . registerDynamic for dynamic modules ( 3 - 4 params ) - System . registerDynamic ( [ name , ] deps , executingRequire , execute )
* the true or false statement
*
* this extension implements the linking algorithm for the two variations identical to the spec
* allowing compiled ES6 circular references to work alongside AMD and CJS circular references .
*
* /
SystemJSLoader . prototype . register = function ( name , deps , declare ) {
if ( typeof name != 'string' ) {
declare = deps ;
deps = name ;
name = null ;
}
// dynamic backwards-compatibility
// can be deprecated eventually
if ( typeof declare == 'boolean' )
return this . registerDynamic . apply ( this , arguments ) ;
var entry = createEntry ( ) ;
// ideally wouldn't apply map config to bundle names but
// dependencies go through map regardless so we can't restrict
// could reconsider in shift to new spec
entry . name = name && ( this . decanonicalize || this . normalize ) . call ( this , name ) ;
entry . declarative = true ;
entry . deps = deps ;
entry . declare = declare ;
this . pushRegister _ ( {
amd : false ,
entry : entry
} ) ;
} ;
SystemJSLoader . prototype . registerDynamic = function ( name , deps , declare , execute ) {
if ( typeof name != 'string' ) {
execute = declare ;
declare = deps ;
deps = name ;
name = null ;
}
// dynamic
var entry = createEntry ( ) ;
entry . name = name && ( this . decanonicalize || this . normalize ) . call ( this , name ) ;
entry . deps = deps ;
entry . execute = execute ;
entry . executingRequire = declare ;
this . pushRegister _ ( {
amd : false ,
entry : entry
} ) ;
} ;
hook ( 'reduceRegister_' , function ( ) {
return function ( load , register ) {
if ( ! register )
return ;
var entry = register . entry ;
var curMeta = load && load . metadata ;
// named register
if ( entry . name ) {
if ( ! ( entry . name in this . defined ) )
this . defined [ entry . name ] = entry ;
if ( curMeta )
curMeta . bundle = true ;
}
// anonymous register
2016-09-26 18:00:21 +02:00
if ( ! entry . name || load && ! curMeta . entry && entry . name == load . name ) {
2016-01-10 20:07:42 +01:00
if ( ! curMeta )
2016-09-26 18:00:21 +02:00
throw new TypeError ( 'Invalid System.register call. Anonymous System.register calls can only be made by modules loaded by SystemJS.import and not via script tags.' ) ;
2016-01-10 20:07:42 +01:00
if ( curMeta . entry ) {
if ( curMeta . format == 'register' )
throw new Error ( 'Multiple anonymous System.register calls in module ' + load . name + '. If loading a bundle, ensure all the System.register calls are named.' ) ;
else
throw new Error ( 'Module ' + load . name + ' interpreted as ' + curMeta . format + ' module format, but called System.register.' ) ;
}
if ( ! curMeta . format )
curMeta . format = 'register' ;
curMeta . entry = entry ;
}
} ;
} ) ;
hookConstructor ( function ( constructor ) {
return function ( ) {
constructor . call ( this ) ;
this . defined = { } ;
this . _loader . moduleRecords = { } ;
} ;
} ) ;
function buildGroups ( entry , loader , groups ) {
groups [ entry . groupIndex ] = groups [ entry . groupIndex ] || [ ] ;
if ( indexOf . call ( groups [ entry . groupIndex ] , entry ) != - 1 )
return ;
groups [ entry . groupIndex ] . push ( entry ) ;
for ( var i = 0 , l = entry . normalizedDeps . length ; i < l ; i ++ ) {
var depName = entry . normalizedDeps [ i ] ;
var depEntry = loader . defined [ depName ] ;
// not in the registry means already linked / ES6
if ( ! depEntry || depEntry . evaluated )
continue ;
// now we know the entry is in our unlinked linkage group
var depGroupIndex = entry . groupIndex + ( depEntry . declarative != entry . declarative ) ;
// the group index of an entry is always the maximum
if ( depEntry . groupIndex === null || depEntry . groupIndex < depGroupIndex ) {
// if already in a group, remove from the old group
if ( depEntry . groupIndex !== null ) {
groups [ depEntry . groupIndex ] . splice ( indexOf . call ( groups [ depEntry . groupIndex ] , depEntry ) , 1 ) ;
// if the old group is empty, then we have a mixed depndency cycle
if ( groups [ depEntry . groupIndex ] . length == 0 )
throw new Error ( "Mixed dependency cycle detected" ) ;
}
depEntry . groupIndex = depGroupIndex ;
}
buildGroups ( depEntry , loader , groups ) ;
}
}
2016-09-26 18:00:21 +02:00
function link ( name , startEntry , loader ) {
2016-01-10 20:07:42 +01:00
// skip if already linked
if ( startEntry . module )
return ;
startEntry . groupIndex = 0 ;
var groups = [ ] ;
buildGroups ( startEntry , loader , groups ) ;
var curGroupDeclarative = ! ! startEntry . declarative == groups . length % 2 ;
for ( var i = groups . length - 1 ; i >= 0 ; i -- ) {
var group = groups [ i ] ;
for ( var j = 0 ; j < group . length ; j ++ ) {
var entry = group [ j ] ;
// link each group
if ( curGroupDeclarative )
linkDeclarativeModule ( entry , loader ) ;
else
linkDynamicModule ( entry , loader ) ;
}
curGroupDeclarative = ! curGroupDeclarative ;
}
}
// module binding records
2016-09-26 18:00:21 +02:00
function ModuleRecord ( ) { }
defineProperty ( ModuleRecord , 'toString' , {
2016-01-10 20:07:42 +01:00
value : function ( ) {
return 'Module' ;
}
} ) ;
function getOrCreateModuleRecord ( name , moduleRecords ) {
return moduleRecords [ name ] || ( moduleRecords [ name ] = {
name : name ,
dependencies : [ ] ,
2016-09-26 18:00:21 +02:00
exports : new ModuleRecord ( ) , // start from an empty module and extend
2016-01-10 20:07:42 +01:00
importers : [ ]
} ) ;
}
function linkDeclarativeModule ( entry , loader ) {
// only link if already not already started linking (stops at circular)
if ( entry . module )
return ;
var moduleRecords = loader . _loader . moduleRecords ;
var module = entry . module = getOrCreateModuleRecord ( entry . name , moduleRecords ) ;
var exports = entry . module . exports ;
var declaration = entry . declare . call ( _ _global , function ( name , value ) {
module . locked = true ;
if ( typeof name == 'object' ) {
for ( var p in name )
exports [ p ] = name [ p ] ;
}
else {
exports [ name ] = value ;
}
for ( var i = 0 , l = module . importers . length ; i < l ; i ++ ) {
var importerModule = module . importers [ i ] ;
if ( ! importerModule . locked ) {
var importerIndex = indexOf . call ( importerModule . dependencies , module ) ;
2016-09-26 18:00:21 +02:00
var setter = importerModule . setters [ importerIndex ] ;
if ( setter )
setter ( exports ) ;
2016-01-10 20:07:42 +01:00
}
}
module . locked = false ;
return value ;
2016-09-26 18:00:21 +02:00
} , { id : entry . name } ) ;
if ( typeof declaration == 'function' )
declaration = { setters : [ ] , execute : declaration } ;
// allowing undefined declaration was a mistake! To be deprecated.
declaration = declaration || { setters : [ ] , execute : function ( ) { } } ;
2016-01-10 20:07:42 +01:00
module . setters = declaration . setters ;
module . execute = declaration . execute ;
if ( ! module . setters || ! module . execute ) {
throw new TypeError ( 'Invalid System.register form for ' + entry . name ) ;
}
// now link all the module dependencies
for ( var i = 0 , l = entry . normalizedDeps . length ; i < l ; i ++ ) {
var depName = entry . normalizedDeps [ i ] ;
var depEntry = loader . defined [ depName ] ;
var depModule = moduleRecords [ depName ] ;
// work out how to set depExports based on scenarios...
var depExports ;
if ( depModule ) {
depExports = depModule . exports ;
}
// dynamic, already linked in our registry
else if ( depEntry && ! depEntry . declarative ) {
depExports = depEntry . esModule ;
}
// in the loader registry
else if ( ! depEntry ) {
depExports = loader . get ( depName ) ;
}
// we have an entry -> link
else {
linkDeclarativeModule ( depEntry , loader ) ;
depModule = depEntry . module ;
depExports = depModule . exports ;
}
// only declarative modules have dynamic bindings
if ( depModule && depModule . importers ) {
depModule . importers . push ( module ) ;
module . dependencies . push ( depModule ) ;
}
else {
module . dependencies . push ( null ) ;
}
// run setters for all entries with the matching dependency name
var originalIndices = entry . originalIndices [ i ] ;
for ( var j = 0 , len = originalIndices . length ; j < len ; ++ j ) {
var index = originalIndices [ j ] ;
if ( module . setters [ index ] ) {
module . setters [ index ] ( depExports ) ;
}
}
}
}
// An analog to loader.get covering execution of all three layers (real declarative, simulated declarative, simulated dynamic)
function getModule ( name , loader ) {
var exports ;
var entry = loader . defined [ name ] ;
if ( ! entry ) {
exports = loader . get ( name ) ;
if ( ! exports )
throw new Error ( 'Unable to load dependency ' + name + '.' ) ;
}
else {
if ( entry . declarative )
2016-09-26 18:00:21 +02:00
ensureEvaluated ( name , entry , [ ] , loader ) ;
2016-01-10 20:07:42 +01:00
else if ( ! entry . evaluated )
linkDynamicModule ( entry , loader ) ;
exports = entry . module . exports ;
}
if ( ( ! entry || entry . declarative ) && exports && exports . _ _useDefault )
return exports [ 'default' ] ;
return exports ;
}
function linkDynamicModule ( entry , loader ) {
if ( entry . module )
return ;
var exports = { } ;
var module = entry . module = { exports : exports , id : entry . name } ;
// AMD requires execute the tree first
if ( ! entry . executingRequire ) {
for ( var i = 0 , l = entry . normalizedDeps . length ; i < l ; i ++ ) {
var depName = entry . normalizedDeps [ i ] ;
// we know we only need to link dynamic due to linking algorithm
var depEntry = loader . defined [ depName ] ;
if ( depEntry )
linkDynamicModule ( depEntry , loader ) ;
}
}
// now execute
entry . evaluated = true ;
var output = entry . execute . call ( _ _global , function ( name ) {
for ( var i = 0 , l = entry . deps . length ; i < l ; i ++ ) {
if ( entry . deps [ i ] != name )
continue ;
return getModule ( entry . normalizedDeps [ i ] , loader ) ;
}
2016-09-26 18:00:21 +02:00
// try and normalize the dependency to see if we have another form
var nameNormalized = loader . normalizeSync ( name , entry . name ) ;
if ( indexOf . call ( entry . normalizedDeps , nameNormalized ) != - 1 )
return getModule ( nameNormalized , loader ) ;
throw new Error ( 'Module ' + name + ' not declared as a dependency of ' + entry . name ) ;
2016-01-10 20:07:42 +01:00
} , exports , module ) ;
2016-09-26 18:00:21 +02:00
if ( output !== undefined )
2016-01-10 20:07:42 +01:00
module . exports = output ;
// create the esModule object, which allows ES6 named imports of dynamics
exports = module . exports ;
// __esModule flag treats as already-named
2016-09-26 18:00:21 +02:00
if ( exports && ( exports . _ _esModule || exports instanceof Module ) )
entry . esModule = loader . newModule ( exports ) ;
2016-01-10 20:07:42 +01:00
// set module as 'default' export, then fake named exports by iterating properties
else if ( entry . esmExports && exports !== _ _global )
2016-09-26 18:00:21 +02:00
entry . esModule = loader . newModule ( getESModule ( exports ) ) ;
2016-01-10 20:07:42 +01:00
// just use the 'default' export
else
2016-09-26 18:00:21 +02:00
entry . esModule = loader . newModule ( { 'default' : exports , _ _useDefault : true } ) ;
2016-01-10 20:07:42 +01:00
}
/ *
* Given a module , and the list of modules for this current branch ,
* ensure that each of the dependencies of this module is evaluated
* ( unless one is a circular dependency already in the list of seen
* modules , in which case we execute it )
*
* Then we evaluate the module itself depth - first left to right
* execution to match ES6 modules
* /
2016-09-26 18:00:21 +02:00
function ensureEvaluated ( moduleName , entry , seen , loader ) {
2016-01-10 20:07:42 +01:00
// if already seen, that means it's an already-evaluated non circular dependency
if ( ! entry || entry . evaluated || ! entry . declarative )
return ;
// this only applies to declarative modules which late-execute
seen . push ( moduleName ) ;
for ( var i = 0 , l = entry . normalizedDeps . length ; i < l ; i ++ ) {
var depName = entry . normalizedDeps [ i ] ;
if ( indexOf . call ( seen , depName ) == - 1 ) {
if ( ! loader . defined [ depName ] )
loader . get ( depName ) ;
else
2016-09-26 18:00:21 +02:00
ensureEvaluated ( depName , loader . defined [ depName ] , seen , loader ) ;
2016-01-10 20:07:42 +01:00
}
}
if ( entry . evaluated )
return ;
entry . evaluated = true ;
entry . module . execute . call ( _ _global ) ;
}
// override the delete method to also clear the register caches
hook ( 'delete' , function ( del ) {
return function ( name ) {
delete this . _loader . moduleRecords [ name ] ;
delete this . defined [ name ] ;
return del . call ( this , name ) ;
} ;
} ) ;
hook ( 'fetch' , function ( fetch ) {
return function ( load ) {
if ( this . defined [ load . name ] ) {
load . metadata . format = 'defined' ;
return '' ;
}
load . metadata . deps = load . metadata . deps || [ ] ;
return fetch . call ( this , load ) ;
} ;
} ) ;
hook ( 'translate' , function ( translate ) {
// we run the meta detection here (register is after meta)
return function ( load ) {
load . metadata . deps = load . metadata . deps || [ ] ;
2016-09-26 18:00:21 +02:00
return Promise . resolve ( translate . apply ( this , arguments ) ) . then ( function ( source ) {
2016-01-10 20:07:42 +01:00
// run detection for register format
if ( load . metadata . format == 'register' || ! load . metadata . format && detectRegisterFormat ( load . source ) )
load . metadata . format = 'register' ;
return source ;
} ) ;
} ;
} ) ;
2016-09-26 18:00:21 +02:00
// implement a perforance shortpath for System.load with no deps
hook ( 'load' , function ( doLoad ) {
return function ( normalized ) {
var loader = this ;
var entry = loader . defined [ normalized ] ;
if ( ! entry || entry . deps . length )
return doLoad . apply ( this , arguments ) ;
entry . originalIndices = entry . normalizedDeps = [ ] ;
// recursively ensure that the module and all its
// dependencies are linked (with dependency group handling)
link ( normalized , entry , loader ) ;
// now handle dependency execution in correct order
ensureEvaluated ( normalized , entry , [ ] , loader ) ;
if ( ! entry . esModule )
entry . esModule = loader . newModule ( entry . module . exports ) ;
// remove from the registry
if ( ! loader . trace )
loader . defined [ normalized ] = undefined ;
// return the defined module object
loader . set ( normalized , entry . esModule ) ;
return Promise . resolve ( ) ;
} ;
} ) ;
2016-01-10 20:07:42 +01:00
hook ( 'instantiate' , function ( instantiate ) {
return function ( load ) {
if ( load . metadata . format == 'detect' )
load . metadata . format = undefined ;
// assumes previous instantiate is sync
// (core json support)
instantiate . call ( this , load ) ;
var loader = this ;
var entry ;
// first we check if this module has already been defined in the registry
if ( loader . defined [ load . name ] ) {
entry = loader . defined [ load . name ] ;
// don't support deps for ES modules
if ( ! entry . declarative )
entry . deps = entry . deps . concat ( load . metadata . deps ) ;
2016-09-26 18:00:21 +02:00
entry . deps = entry . deps . concat ( load . metadata . deps ) ;
2016-01-10 20:07:42 +01:00
}
// picked up already by an anonymous System.register script injection
// or via the dynamic formats
else if ( load . metadata . entry ) {
entry = load . metadata . entry ;
entry . deps = entry . deps . concat ( load . metadata . deps ) ;
}
// Contains System.register calls
// (dont run bundles in the builder)
else if ( ! ( loader . builder && load . metadata . bundle )
&& ( load . metadata . format == 'register' || load . metadata . format == 'esm' || load . metadata . format == 'es6' ) ) {
if ( typeof _ _exec != 'undefined' )
_ _exec . call ( loader , load ) ;
if ( ! load . metadata . entry && ! load . metadata . bundle )
throw new Error ( load . name + ' detected as ' + load . metadata . format + ' but didn\'t execute.' ) ;
entry = load . metadata . entry ;
// support metadata deps for System.register
if ( entry && load . metadata . deps )
entry . deps = entry . deps . concat ( load . metadata . deps ) ;
}
// named bundles are just an empty module
if ( ! entry ) {
entry = createEntry ( ) ;
entry . deps = load . metadata . deps ;
entry . execute = function ( ) { } ;
}
// place this module onto defined for circular references
loader . defined [ load . name ] = entry ;
var grouped = group ( entry . deps ) ;
entry . deps = grouped . names ;
entry . originalIndices = grouped . indices ;
entry . name = load . name ;
entry . esmExports = load . metadata . esmExports !== false ;
// first, normalize all dependencies
var normalizePromises = [ ] ;
for ( var i = 0 , l = entry . deps . length ; i < l ; i ++ )
normalizePromises . push ( Promise . resolve ( loader . normalize ( entry . deps [ i ] , load . name ) ) ) ;
return Promise . all ( normalizePromises ) . then ( function ( normalizedDeps ) {
entry . normalizedDeps = normalizedDeps ;
return {
deps : entry . deps ,
execute : function ( ) {
// recursively ensure that the module and all its
// dependencies are linked (with dependency group handling)
2016-09-26 18:00:21 +02:00
link ( load . name , entry , loader ) ;
2016-01-10 20:07:42 +01:00
// now handle dependency execution in correct order
2016-09-26 18:00:21 +02:00
ensureEvaluated ( load . name , entry , [ ] , loader ) ;
if ( ! entry . esModule )
entry . esModule = loader . newModule ( entry . module . exports ) ;
2016-01-10 20:07:42 +01:00
// remove from the registry
2016-09-26 18:00:21 +02:00
if ( ! loader . trace )
loader . defined [ load . name ] = undefined ;
2016-01-10 20:07:42 +01:00
// return the defined module object
2016-09-26 18:00:21 +02:00
return entry . esModule ;
2016-01-10 20:07:42 +01:00
}
} ;
} ) ;
} ;
} ) ;
} ) ( ) ;
2016-09-26 18:00:21 +02:00
function getGlobalValue ( exports ) {
if ( typeof exports == 'string' )
return readMemberExpression ( exports , _ _global ) ;
if ( ! ( exports instanceof Array ) )
throw new Error ( 'Global exports must be a string or array.' ) ;
var globalValue = { } ;
var first = true ;
for ( var i = 0 ; i < exports . length ; i ++ ) {
var val = readMemberExpression ( exports [ i ] , _ _global ) ;
if ( first ) {
globalValue [ 'default' ] = val ;
first = false ;
}
globalValue [ exports [ i ] . split ( '.' ) . pop ( ) ] = val ;
}
return globalValue ;
}
2016-01-10 20:07:42 +01:00
hook ( 'reduceRegister_' , function ( reduceRegister ) {
return function ( load , register ) {
2016-09-26 18:00:21 +02:00
if ( register || ( ! load . metadata . exports && ! ( isWorker && load . metadata . format == 'global' ) ) )
2016-01-10 20:07:42 +01:00
return reduceRegister . call ( this , load , register ) ;
load . metadata . format = 'global' ;
var entry = load . metadata . entry = createEntry ( ) ;
entry . deps = load . metadata . deps ;
2016-09-26 18:00:21 +02:00
var globalValue = getGlobalValue ( load . metadata . exports ) ;
2016-01-10 20:07:42 +01:00
entry . execute = function ( ) {
return globalValue ;
} ;
} ;
} ) ;
hookConstructor ( function ( constructor ) {
return function ( ) {
var loader = this ;
constructor . call ( loader ) ;
var hasOwnProperty = Object . prototype . hasOwnProperty ;
2016-09-26 18:00:21 +02:00
// bare minimum ignores
2016-01-26 17:21:17 +01:00
var ignoredGlobalProps = [ '_g' , 'sessionStorage' , 'localStorage' , 'clipboardData' , 'frames' , 'frameElement' , 'external' ,
'mozAnimationStartTime' , 'webkitStorageInfo' , 'webkitIndexedDB' , 'mozInnerScreenY' , 'mozInnerScreenX' ] ;
2016-01-10 20:07:42 +01:00
var globalSnapshot ;
function forEachGlobal ( callback ) {
if ( Object . keys )
Object . keys ( _ _global ) . forEach ( callback ) ;
else
for ( var g in _ _global ) {
if ( ! hasOwnProperty . call ( _ _global , g ) )
continue ;
callback ( g ) ;
}
}
function forEachGlobalValue ( callback ) {
forEachGlobal ( function ( globalName ) {
if ( indexOf . call ( ignoredGlobalProps , globalName ) != - 1 )
return ;
try {
var value = _ _global [ globalName ] ;
}
catch ( e ) {
ignoredGlobalProps . push ( globalName ) ;
}
callback ( globalName , value ) ;
} ) ;
}
loader . set ( '@@global-helpers' , loader . newModule ( {
2016-09-26 18:00:21 +02:00
prepareGlobal : function ( moduleName , exports , globals , encapsulate ) {
2016-01-10 20:07:42 +01:00
// disable module detection
var curDefine = _ _global . define ;
_ _global . define = undefined ;
// set globals
var oldGlobals ;
if ( globals ) {
oldGlobals = { } ;
for ( var g in globals ) {
oldGlobals [ g ] = _ _global [ g ] ;
_ _global [ g ] = globals [ g ] ;
}
}
// store a complete copy of the global object in order to detect changes
2016-09-26 18:00:21 +02:00
if ( ! exports ) {
2016-01-10 20:07:42 +01:00
globalSnapshot = { } ;
forEachGlobalValue ( function ( name , value ) {
globalSnapshot [ name ] = value ;
} ) ;
}
// return function to retrieve global
return function ( ) {
2016-09-26 18:00:21 +02:00
var globalValue = exports ? getGlobalValue ( exports ) : { } ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
var singleGlobal ;
var multipleExports = ! ! exports ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
if ( ! exports || encapsulate )
2016-01-10 20:07:42 +01:00
forEachGlobalValue ( function ( name , value ) {
if ( globalSnapshot [ name ] === value )
return ;
if ( typeof value == 'undefined' )
return ;
2016-09-26 18:00:21 +02:00
// allow global encapsulation where globals are removed
if ( encapsulate )
_ _global [ name ] = undefined ;
if ( ! exports ) {
globalValue [ name ] = value ;
if ( typeof singleGlobal != 'undefined' ) {
if ( ! multipleExports && singleGlobal !== value )
multipleExports = true ;
}
else {
singleGlobal = value ;
}
2016-01-10 20:07:42 +01:00
}
} ) ;
2016-09-26 18:00:21 +02:00
globalValue = multipleExports ? globalValue : singleGlobal ;
2016-01-10 20:07:42 +01:00
// revert globals
if ( oldGlobals ) {
for ( var g in oldGlobals )
_ _global [ g ] = oldGlobals [ g ] ;
}
_ _global . define = curDefine ;
return globalValue ;
} ;
}
} ) ) ;
} ;
} ) ;
hookConstructor ( function ( constructor ) {
return function ( ) {
var loader = this ;
constructor . call ( loader ) ;
if ( typeof window != 'undefined' && typeof document != 'undefined' && window . location )
var windowOrigin = location . protocol + '//' + location . hostname + ( location . port ? ':' + location . port : '' ) ;
2016-09-26 18:00:21 +02:00
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 ;
}
2016-01-10 20:07:42 +01:00
loader . set ( '@@cjs-helpers' , loader . newModule ( {
2016-09-26 18:00:21 +02:00
requireResolve : function ( request , parentId ) {
return stripOrigin ( loader . normalizeSync ( request , parentId ) ) ;
} ,
2016-01-10 20:07:42 +01:00
getPathVars : function ( 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 {
2016-09-26 18:00:21 +02:00
filename : stripOrigin ( filename ) ,
dirname : stripOrigin ( dirname )
2016-01-10 20:07:42 +01:00
} ;
}
} ) )
} ;
} ) ; / *
* AMD Helper function module
* Separated into its own file as this is the part needed for full AMD support in SFX builds
* NB since implementations have now diverged this can be merged back with amd . js
* /
2016-09-26 18:00:21 +02:00
hook ( 'fetch' , function ( fetch ) {
return function ( load ) {
// script load implies define global leak
if ( load . metadata . scriptLoad && isBrowser )
_ _global . define = this . amdDefine ;
return fetch . call ( this , load ) ;
} ;
} ) ;
2016-01-10 20:07:42 +01:00
hookConstructor ( function ( constructor ) {
return function ( ) {
var loader = this ;
constructor . call ( this ) ;
var commentRegEx = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg ;
var cjsRequirePre = "(?:^|[^$_a-zA-Z\\xA0-\\uFFFF.])" ;
var cjsRequirePost = "\\s*\\(\\s*(\"([^\"]+)\"|'([^']+)')\\s*\\)" ;
var fnBracketRegEx = /\(([^\)]*)\)/ ;
var wsRegEx = /^\s+|\s+$/g ;
var requireRegExs = { } ;
function getCJSDeps ( 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 ;
}
/ *
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' ) {
2016-09-26 18:00:21 +02:00
var defaultJSExtension = loader . defaultJSExtensions && names . substr ( names . length - 3 , 3 ) != '.js' ;
var normalized = loader . decanonicalize ( names , referer ) ;
if ( defaultJSExtension && normalized . substr ( normalized . length - 3 , 3 ) == '.js' )
normalized = normalized . substr ( 0 , normalized . length - 3 ) ;
var module = loader . get ( normalized ) ;
2016-01-10 20:07:42 +01:00
if ( ! module )
2016-09-26 18:00:21 +02:00
throw new Error ( 'Module not already loaded loading "' + names + '" as ' + normalized + ( referer ? ' from "' + referer + '".' : '.' ) ) ;
2016-01-10 20:07:42 +01:00
return module . _ _useDefault ? module [ 'default' ] : 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 ) ;
// in IE8, a trailing comma becomes a trailing undefined entry
if ( deps [ deps . length - 1 ] === undefined )
deps . pop ( ) ;
// remove system dependencies
var requireIndex , exportsIndex , moduleIndex ;
if ( ( requireIndex = indexOf . call ( deps , '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 ( getCJSDeps ( factory . toString ( ) , requireIndex ) ) ;
}
if ( ( exportsIndex = indexOf . call ( deps , 'exports' ) ) != - 1 )
deps . splice ( exportsIndex , 1 ) ;
if ( ( moduleIndex = indexOf . call ( deps , '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 = function ( ) { } ;
// add back in system dependencies
if ( moduleIndex != - 1 )
depValues . splice ( moduleIndex , 0 , module ) ;
if ( exportsIndex != - 1 )
depValues . splice ( exportsIndex , 0 , exports ) ;
if ( requireIndex != - 1 ) {
function contextualRequire ( 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 ) {
// normalize without defaultJSExtensions
var defaultJSExtension = loader . defaultJSExtensions && name . substr ( name . length - 3 , 3 ) != '.js' ;
var url = loader . decanonicalize ( name , module . id ) ;
if ( defaultJSExtension && url . substr ( url . length - 3 , 3 ) == '.js' )
url = url . substr ( 0 , url . length - 3 ) ;
return url ;
} ;
depValues . splice ( requireIndex , 0 , contextualRequire ) ;
}
// set global require to AMD require
var curRequire = _ _global . require ;
_ _global . require = require ;
var output = factory . apply ( exportsIndex == - 1 ? _ _global : exports , depValues ) ;
_ _global . require = curRequire ;
if ( typeof output == 'undefined' && module )
output = module . exports ;
if ( typeof output != 'undefined' )
return output ;
}
var entry = createEntry ( ) ;
entry . name = name && ( loader . decanonicalize || loader . normalize ) . call ( loader , name ) ;
entry . deps = deps ;
entry . execute = execute ;
loader . pushRegister _ ( {
amd : true ,
entry : entry
} ) ;
}
define . amd = { } ;
// reduction function to attach defines to a load record
hook ( 'reduceRegister_' , function ( reduceRegister ) {
return function ( load , register ) {
// only handle AMD registers here
if ( ! register || ! register . amd )
return reduceRegister . call ( this , load , register ) ;
var curMeta = load && load . metadata ;
var entry = register . entry ;
2016-09-26 18:00:21 +02:00
if ( curMeta ) {
if ( ! curMeta . format || curMeta . format == 'detect' )
curMeta . format = 'amd' ;
else if ( ! entry . name && curMeta . format != 'amd' )
throw new Error ( 'AMD define called while executing ' + curMeta . format + ' module ' + load . name ) ;
}
2016-01-10 20:07:42 +01:00
// anonymous define
if ( ! entry . name ) {
if ( ! curMeta )
throw new TypeError ( 'Unexpected anonymous AMD define.' ) ;
2016-09-26 18:00:21 +02:00
if ( curMeta . entry && ! curMeta . entry . name )
throw new Error ( 'Multiple anonymous defines in module ' + load . name ) ;
2016-01-10 20:07:42 +01:00
curMeta . entry = entry ;
}
// named define
else {
// 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 ( curMeta ) {
if ( ! curMeta . entry && ! curMeta . bundle )
curMeta . entry = entry ;
2016-09-26 18:00:21 +02:00
else if ( curMeta . entry && curMeta . entry . name && curMeta . entry . name != load . name )
2016-01-10 20:07:42 +01:00
curMeta . entry = undefined ;
// note this is now a bundle
curMeta . bundle = true ;
}
// define the module through the register registry
if ( ! ( entry . name in this . defined ) )
this . defined [ entry . name ] = entry ;
}
} ;
} ) ;
loader . amdDefine = define ;
loader . amdRequire = require ;
} ;
} ) ; / *
SystemJS Loader Plugin Support
Supports plugin loader syntax with "!" , or via metadata . loader
The plugin name is loaded as a module itself , and can override standard loader hooks
for the plugin resource . See the plugin section of the systemjs readme .
* /
( function ( ) {
function getParentName ( loader , parentName ) {
// if parent is a plugin, normalize against the parent plugin argument only
if ( parentName ) {
var parentPluginIndex ;
if ( loader . pluginFirst ) {
if ( ( parentPluginIndex = parentName . lastIndexOf ( '!' ) ) != - 1 )
return parentName . substr ( parentPluginIndex + 1 ) ;
}
else {
if ( ( parentPluginIndex = parentName . indexOf ( '!' ) ) != - 1 )
return parentName . substr ( 0 , parentPluginIndex ) ;
}
return parentName ;
}
}
function parsePlugin ( loader , name ) {
var argumentName ;
var pluginName ;
var pluginIndex = name . lastIndexOf ( '!' ) ;
if ( pluginIndex == - 1 )
return ;
if ( loader . pluginFirst ) {
argumentName = name . substr ( pluginIndex + 1 ) ;
pluginName = name . substr ( 0 , pluginIndex ) ;
}
else {
argumentName = name . substr ( 0 , pluginIndex ) ;
pluginName = name . substr ( pluginIndex + 1 ) || argumentName . substr ( argumentName . lastIndexOf ( '.' ) + 1 ) ;
}
return {
argument : argumentName ,
plugin : pluginName
} ;
}
// put name back together after parts have been normalized
function combinePluginParts ( loader , argumentName , pluginName , defaultExtension ) {
if ( defaultExtension && argumentName . substr ( argumentName . length - 3 , 3 ) == '.js' )
argumentName = argumentName . substr ( 0 , argumentName . length - 3 ) ;
if ( loader . pluginFirst ) {
return pluginName + '!' + argumentName ;
}
else {
return argumentName + '!' + pluginName ;
}
}
// note if normalize will add a default js extension
// if so, remove for backwards compat
// this is strange and sucks, but will be deprecated
function checkDefaultExtension ( loader , arg ) {
return loader . defaultJSExtensions && arg . substr ( arg . length - 3 , 3 ) != '.js' ;
}
function createNormalizeSync ( normalizeSync ) {
return function ( name , parentName , isPlugin ) {
var loader = this ;
var parsed = parsePlugin ( loader , name ) ;
2016-09-26 18:00:21 +02:00
parentName = getParentName ( this , parentName ) ;
2016-01-10 20:07:42 +01:00
if ( ! parsed )
return normalizeSync . call ( this , name , parentName , isPlugin ) ;
// if this is a plugin, normalize the plugin name and the argument
var argumentName = loader . normalizeSync ( parsed . argument , parentName , true ) ;
var pluginName = loader . normalizeSync ( parsed . plugin , parentName , true ) ;
return combinePluginParts ( loader , argumentName , pluginName , checkDefaultExtension ( loader , parsed . argument ) ) ;
} ;
}
hook ( 'decanonicalize' , createNormalizeSync ) ;
hook ( 'normalizeSync' , createNormalizeSync ) ;
hook ( 'normalize' , function ( normalize ) {
return function ( name , parentName , isPlugin ) {
var loader = this ;
parentName = getParentName ( this , parentName ) ;
var parsed = parsePlugin ( loader , name ) ;
if ( ! parsed )
return normalize . call ( loader , name , parentName , isPlugin ) ;
return Promise . all ( [
loader . normalize ( parsed . argument , parentName , true ) ,
2016-09-26 18:00:21 +02:00
loader . normalize ( parsed . plugin , parentName , false )
2016-01-10 20:07:42 +01:00
] )
. then ( function ( normalized ) {
return combinePluginParts ( loader , normalized [ 0 ] , normalized [ 1 ] , checkDefaultExtension ( loader , parsed . argument ) ) ;
} ) ;
}
} ) ;
hook ( 'locate' , function ( locate ) {
return function ( load ) {
var loader = this ;
var name = load . name ;
// plugin syntax
var pluginSyntaxIndex ;
if ( loader . pluginFirst ) {
if ( ( pluginSyntaxIndex = name . indexOf ( '!' ) ) != - 1 ) {
load . metadata . loader = name . substr ( 0 , pluginSyntaxIndex ) ;
load . name = name . substr ( pluginSyntaxIndex + 1 ) ;
}
}
else {
if ( ( pluginSyntaxIndex = name . lastIndexOf ( '!' ) ) != - 1 ) {
load . metadata . loader = name . substr ( pluginSyntaxIndex + 1 ) ;
load . name = name . substr ( 0 , pluginSyntaxIndex ) ;
}
}
return locate . call ( loader , load )
2016-09-26 18:00:21 +02:00
. then ( function ( address ) {
if ( pluginSyntaxIndex != - 1 || ! load . metadata . loader )
return address ;
// normalize plugin relative to parent in locate here when
// using plugin via loader metadata
return ( loader . pluginLoader || loader ) . normalize ( load . metadata . loader , load . name )
. then ( function ( loaderNormalized ) {
load . metadata . loader = loaderNormalized ;
return address ;
} ) ;
} )
2016-01-10 20:07:42 +01:00
. then ( function ( address ) {
var plugin = load . metadata . loader ;
if ( ! plugin )
return address ;
2016-09-26 18:00:21 +02:00
// don't allow a plugin to load itself
if ( load . name == plugin )
throw new Error ( 'Plugin ' + plugin + ' cannot load itself, make sure it is excluded from any wildcard meta configuration via a custom loader: false rule.' ) ;
2016-01-10 20:07:42 +01:00
// only fetch the plugin itself if this name isn't defined
if ( loader . defined && loader . defined [ name ] )
return address ;
var pluginLoader = loader . pluginLoader || loader ;
// load the plugin module and run standard locate
return pluginLoader [ 'import' ] ( plugin )
. then ( function ( loaderModule ) {
// store the plugin module itself on the metadata
load . metadata . loaderModule = loaderModule ;
load . address = address ;
if ( loaderModule . locate )
return loaderModule . locate . call ( loader , load ) ;
return address ;
} ) ;
} ) ;
} ;
} ) ;
hook ( 'fetch' , function ( fetch ) {
return function ( load ) {
var loader = this ;
if ( load . metadata . loaderModule && load . metadata . loaderModule . fetch && load . metadata . format != 'defined' ) {
load . metadata . scriptLoad = false ;
return load . metadata . loaderModule . fetch . call ( loader , load , function ( load ) {
return fetch . call ( loader , load ) ;
} ) ;
}
else {
return fetch . call ( loader , load ) ;
}
} ;
} ) ;
hook ( 'translate' , function ( translate ) {
return function ( load ) {
var loader = this ;
2016-09-26 18:00:21 +02:00
var args = arguments ;
2016-01-10 20:07:42 +01:00
if ( load . metadata . loaderModule && load . metadata . loaderModule . translate && load . metadata . format != 'defined' ) {
2016-09-26 18:00:21 +02:00
return Promise . resolve ( load . metadata . loaderModule . translate . apply ( loader , args ) ) . then ( function ( result ) {
var sourceMap = load . metadata . sourceMap ;
// sanitize sourceMap if an object not a JSON string
if ( sourceMap ) {
if ( typeof sourceMap != 'object' )
throw new Error ( 'load.metadata.sourceMap must be set to an object.' ) ;
var originalName = load . address . split ( '!' ) [ 0 ] ;
// force set the filename of the original file
if ( ! sourceMap . file || sourceMap . file == load . 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 ] == load . address ) )
sourceMap . sources = [ originalName ] ;
}
// if running on file:/// URLs, sourcesContent is necessary
// load.metadata.sourceMap.sourcesContent = [load.source];
2016-01-10 20:07:42 +01:00
if ( typeof result == 'string' )
load . source = result ;
2016-09-26 18:00:21 +02:00
else
warn . call ( this , 'Plugin ' + load . metadata . loader + ' should return the source in translate, instead of setting load.source directly. This support will be deprecated.' ) ;
return translate . apply ( loader , args ) ;
2016-01-10 20:07:42 +01:00
} ) ;
}
else {
2016-09-26 18:00:21 +02:00
return translate . apply ( loader , args ) ;
2016-01-10 20:07:42 +01:00
}
} ;
} ) ;
hook ( 'instantiate' , function ( instantiate ) {
return function ( load ) {
var loader = this ;
2016-09-26 18:00:21 +02:00
var calledInstantiate = false ;
2016-01-10 20:07:42 +01:00
if ( load . metadata . loaderModule && load . metadata . loaderModule . instantiate && ! loader . builder && load . metadata . format != 'defined' )
2016-09-26 18:00:21 +02:00
return Promise . resolve ( load . metadata . loaderModule . instantiate . call ( loader , load , function ( load ) {
if ( calledInstantiate )
throw new Error ( 'Instantiate must only be called once.' ) ;
calledInstantiate = true ;
return instantiate . call ( loader , load ) ;
} ) ) . then ( function ( result ) {
if ( calledInstantiate )
return result ;
2016-01-10 20:07:42 +01:00
load . metadata . entry = createEntry ( ) ;
load . metadata . entry . execute = function ( ) {
return result ;
}
load . metadata . entry . deps = load . metadata . deps ;
load . metadata . format = 'defined' ;
return instantiate . call ( loader , load ) ;
} ) ;
else
return instantiate . call ( loader , load ) ;
} ;
} ) ;
} ) ( ) ; / *
* 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 :
*
2016-09-26 18:00:21 +02:00
* import 'es5-shim#?./conditions.js|~es6'
2016-01-10 20:07:42 +01:00
*
* /
2016-09-26 18:00:21 +02:00
var sysConditions = [ 'browser' , 'node' , 'dev' , 'build' , 'production' , 'default' ] ;
2016-01-10 20:07:42 +01:00
function parseCondition ( condition ) {
var conditionExport , conditionModule , negation ;
var negation = condition [ 0 ] == '~' ;
var conditionExportIndex = condition . lastIndexOf ( '|' ) ;
if ( conditionExportIndex != - 1 ) {
conditionExport = condition . substr ( conditionExportIndex + 1 ) ;
2016-09-26 18:00:21 +02:00
conditionModule = condition . substr ( negation , conditionExportIndex - negation ) ;
if ( negation )
warn . call ( this , 'Condition negation form "' + condition + '" is deprecated for "' + conditionModule + '|~' + conditionExport + '"' ) ;
if ( conditionExport [ 0 ] == '~' ) {
negation = true ;
conditionExport = conditionExport . substr ( 1 ) ;
}
2016-01-10 20:07:42 +01:00
}
else {
2016-09-26 18:00:21 +02:00
conditionExport = 'default' ;
2016-01-10 20:07:42 +01:00
conditionModule = condition . substr ( negation ) ;
2016-09-26 18:00:21 +02:00
if ( sysConditions . indexOf ( conditionModule ) != - 1 ) {
conditionExport = conditionModule ;
conditionModule = null ;
}
2016-01-10 20:07:42 +01:00
}
return {
2016-09-26 18:00:21 +02:00
module : conditionModule || '@system-env' ,
2016-01-10 20:07:42 +01:00
prop : conditionExport ,
negate : negation
} ;
}
function serializeCondition ( conditionObj ) {
2016-09-26 18:00:21 +02:00
return conditionObj . module + '|' + ( conditionObj . negate ? '~' : '' ) + conditionObj . prop ;
2016-01-10 20:07:42 +01:00
}
function resolveCondition ( conditionObj , parentName , bool ) {
2016-09-26 18:00:21 +02:00
var self = this ;
return this . normalize ( conditionObj . module , parentName )
. then ( function ( normalizedCondition ) {
return self . load ( normalizedCondition )
. then ( function ( q ) {
var m = readMemberExpression ( conditionObj . prop , self . get ( normalizedCondition ) ) ;
if ( bool && typeof m != 'boolean' )
throw new TypeError ( 'Condition ' + serializeCondition ( conditionObj ) + ' did not resolve to a boolean.' ) ;
return conditionObj . negate ? ! m : m ;
} ) ;
2016-01-10 20:07:42 +01:00
} ) ;
}
var interpolationRegEx = /#\{[^\}]+\}/ ;
function interpolateConditional ( name , parentName ) {
// first we normalize the conditional
var conditionalMatch = name . match ( interpolationRegEx ) ;
if ( ! conditionalMatch )
return Promise . resolve ( name ) ;
2016-09-26 18:00:21 +02:00
var conditionObj = parseCondition . call ( this , conditionalMatch [ 0 ] . substr ( 2 , conditionalMatch [ 0 ] . length - 3 ) ) ;
2016-01-10 20:07:42 +01:00
// in builds, return normalized conditional
if ( this . builder )
return this [ 'normalize' ] ( conditionObj . module , parentName )
. then ( function ( conditionModule ) {
conditionObj . module = conditionModule ;
return name . replace ( interpolationRegEx , '#{' + serializeCondition ( conditionObj ) + '}' ) ;
} ) ;
return resolveCondition . call ( this , conditionObj , parentName , false )
. then ( function ( conditionValue ) {
if ( typeof conditionValue !== 'string' )
throw new TypeError ( 'The condition value for ' + name + ' doesn\'t resolve to a string.' ) ;
if ( conditionValue . indexOf ( '/' ) != - 1 )
throw new TypeError ( 'Unabled to interpolate conditional ' + name + ( parentName ? ' in ' + parentName : '' ) + '\n\tThe condition value ' + conditionValue + ' cannot contain a "/" separator.' ) ;
return name . replace ( interpolationRegEx , conditionValue ) ;
} ) ;
}
function booleanConditional ( name , parentName ) {
// first we normalize the conditional
var booleanIndex = name . lastIndexOf ( '#?' ) ;
if ( booleanIndex == - 1 )
return Promise . resolve ( name ) ;
2016-09-26 18:00:21 +02:00
var conditionObj = parseCondition . call ( this , name . substr ( booleanIndex + 2 ) ) ;
2016-01-10 20:07:42 +01:00
// in builds, return normalized conditional
if ( this . builder )
return this [ 'normalize' ] ( conditionObj . module , parentName )
. then ( function ( conditionModule ) {
conditionObj . module = conditionModule ;
return name . substr ( 0 , booleanIndex ) + '#?' + serializeCondition ( conditionObj ) ;
} ) ;
return resolveCondition . call ( this , conditionObj , parentName , true )
. then ( function ( conditionValue ) {
return conditionValue ? name . substr ( 0 , booleanIndex ) : '@empty' ;
} ) ;
}
// normalizeSync does not parse conditionals at all although it could
hook ( 'normalize' , function ( normalize ) {
2016-09-26 18:00:21 +02:00
return function ( name , parentName , skipExt ) {
2016-01-10 20:07:42 +01:00
var loader = this ;
return booleanConditional . call ( loader , name , parentName )
. then ( function ( name ) {
2016-09-26 18:00:21 +02:00
return normalize . call ( loader , name , parentName , skipExt ) ;
2016-01-10 20:07:42 +01:00
} )
. then ( function ( normalized ) {
return interpolateConditional . call ( loader , normalized , parentName ) ;
} ) ;
} ;
} ) ;
/ *
* Alias Extension
*
* Allows a module to be a plain copy of another module by module name
*
* SystemJS . meta [ 'mybootstrapalias' ] = { alias : 'bootstrap' } ;
*
* /
( function ( ) {
// aliases
hook ( 'fetch' , function ( fetch ) {
return function ( load ) {
var alias = load . metadata . alias ;
var aliasDeps = load . metadata . deps || [ ] ;
if ( alias ) {
load . metadata . format = 'defined' ;
var entry = createEntry ( ) ;
this . defined [ load . name ] = entry ;
entry . declarative = true ;
entry . deps = aliasDeps . concat ( [ alias ] ) ;
entry . declare = function ( _export ) {
return {
setters : [ function ( module ) {
for ( var p in module )
_export ( p , module [ p ] ) ;
if ( module . _ _useDefault )
entry . module . exports . _ _useDefault = true ;
} ] ,
execute : function ( ) { }
} ;
} ;
return '' ;
}
return fetch . call ( this , load ) ;
} ;
} ) ;
} ) ( ) ; / *
* Meta Extension
*
* Sets default metadata on a load record ( load . metadata ) from
* loader . metadata via SystemJS . meta function .
*
*
* Also provides an inline meta syntax for module meta in source .
*
* Eg :
*
* loader . meta ( {
* 'my/module' : { deps : [ 'jquery' ] }
* 'my/*' : { format : 'amd' }
* } ) ;
*
* Which in turn populates loader . metadata .
*
* load . metadata . deps and load . metadata . format will then be set
* for 'my/module'
*
* The same meta could be set with a my / module . js file containing :
*
* my / module . js
* "format amd" ;
* "deps[] jquery" ;
* "globals.some value"
* console . log ( 'this is my/module' ) ;
*
* Configuration meta always takes preference to inline meta .
*
* Multiple matches in wildcards are supported and ammend the meta .
*
*
* The benefits of the function form is that paths are URL - normalized
* supporting say
*
* loader . meta ( { './app' : { format : 'cjs' } } ) ;
*
* Instead of needing to set against the absolute URL ( https : //site.com/app.js)
*
* /
( function ( ) {
hookConstructor ( function ( constructor ) {
return function ( ) {
this . meta = { } ;
constructor . call ( this ) ;
} ;
} ) ;
hook ( 'locate' , function ( locate ) {
return function ( load ) {
var meta = this . meta ;
var name = load . name ;
// NB for perf, maybe introduce a fast-path wildcard lookup cache here
// which is checked first
// apply wildcard metas
var bestDepth = 0 ;
var wildcardIndex ;
for ( var module in meta ) {
wildcardIndex = module . indexOf ( '*' ) ;
if ( wildcardIndex === - 1 )
continue ;
if ( module . substr ( 0 , wildcardIndex ) === name . substr ( 0 , wildcardIndex )
&& module . substr ( wildcardIndex + 1 ) === name . substr ( name . length - module . length + wildcardIndex + 1 ) ) {
var depth = module . split ( '/' ) . length ;
if ( depth > bestDepth )
bestDepth = depth ;
extendMeta ( load . metadata , meta [ module ] , bestDepth != depth ) ;
}
}
// apply exact meta
if ( meta [ name ] )
extendMeta ( load . metadata , meta [ name ] ) ;
return locate . call ( this , load ) ;
} ;
} ) ;
// 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 ( ! ( curPart in target ) )
target [ curPart ] = value ;
}
hook ( 'translate' , function ( translate ) {
return function ( load ) {
2016-09-26 18:00:21 +02:00
// shortpath for bundled
if ( load . metadata . format == 'defined' ) {
load . metadata . deps = load . metadata . deps || [ ] ;
return Promise . resolve ( load . source ) ;
}
2016-01-10 20:07:42 +01:00
// NB meta will be post-translate pending transpiler conversion to plugins
var meta = load . source . match ( metaRegEx ) ;
if ( meta ) {
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 . substr ( metaName . length - 2 , 2 ) == '[]' ) {
metaName = metaName . substr ( 0 , metaName . length - 2 ) ;
load . metadata [ metaName ] = load . metadata [ metaName ] || [ ] ;
load . metadata [ metaName ] . push ( metaValue ) ;
}
else if ( load . metadata [ metaName ] instanceof Array ) {
// temporary backwards compat for previous "deps" syntax
warn . call ( this , 'Module ' + load . name + ' contains deprecated "deps ' + metaValue + '" meta syntax.\nThis should be updated to "deps[] ' + metaValue + '" for pushing to array meta.' ) ;
load . metadata [ metaName ] . push ( metaValue ) ;
}
else {
setMetaProperty ( load . metadata , metaName , metaValue ) ;
}
}
else {
load . metadata [ metaString ] = true ;
}
}
}
2016-09-26 18:00:21 +02:00
return translate . apply ( this , arguments ) ;
2016-01-10 20:07:42 +01:00
} ;
} ) ;
} ) ( ) ;
/ *
System bundles
Allows a bundle module to be specified which will be dynamically
loaded before trying to load a given module .
For example :
SystemJS . bundles [ 'mybundle' ] = [ 'jquery' , 'bootstrap/js/bootstrap' ]
Will result in a load to "mybundle" whenever a load to "jquery"
or "bootstrap/js/bootstrap" is made .
In this way , the bundle becomes the request that provides the module
* /
( function ( ) {
// bundles support (just like RequireJS)
// bundle name is module name of bundle itself
// bundle is array of modules defined by the bundle
// when a module in the bundle is requested, the bundle is loaded instead
// of the form SystemJS.bundles['mybundle'] = ['jquery', 'bootstrap/js/bootstrap']
hookConstructor ( function ( constructor ) {
return function ( ) {
constructor . call ( this ) ;
this . bundles = { } ;
this . _loader . loadedBundles = { } ;
} ;
} ) ;
// assign bundle metadata for bundle loads
hook ( 'locate' , function ( locate ) {
return function ( load ) {
var loader = this ;
2016-01-26 17:21:17 +01:00
var matched = false ;
2016-01-10 20:07:42 +01:00
if ( ! ( load . name in loader . defined ) )
for ( var b in loader . bundles ) {
2016-01-26 17:21:17 +01:00
for ( var i = 0 ; i < loader . bundles [ b ] . length ; i ++ ) {
var curModule = loader . bundles [ b ] [ i ] ;
if ( curModule == load . name ) {
matched = true ;
break ;
}
// wildcard in bundles does not include / boundaries
if ( curModule . indexOf ( '*' ) != - 1 ) {
var parts = curModule . split ( '*' ) ;
if ( parts . length != 2 ) {
loader . bundles [ b ] . splice ( i -- , 1 ) ;
continue ;
}
if ( load . name . substring ( 0 , parts [ 0 ] . length ) == parts [ 0 ] &&
load . name . substr ( load . name . length - parts [ 1 ] . length , parts [ 1 ] . length ) == parts [ 1 ] &&
load . name . substr ( parts [ 0 ] . length , load . name . length - parts [ 1 ] . length - parts [ 0 ] . length ) . indexOf ( '/' ) == - 1 ) {
matched = true ;
break ;
}
}
}
if ( matched )
2016-01-10 20:07:42 +01:00
return loader [ 'import' ] ( b )
. then ( function ( ) {
return locate . call ( loader , load ) ;
} ) ;
}
return locate . call ( loader , load ) ;
} ;
} ) ;
} ) ( ) ;
/ *
* Dependency Tree Cache
*
* Allows a build to pre - populate a dependency trace tree on the loader of
* the expected dependency tree , to be loaded upfront when requesting the
* module , avoinding the n round trips latency of module loading , where
* n is the dependency tree depth .
*
* eg :
* SystemJS . depCache = {
* 'app' : [ 'normalized' , 'deps' ] ,
* 'normalized' : [ 'another' ] ,
* 'deps' : [ 'tree' ]
* } ;
*
* SystemJS . import ( 'app' )
* // simultaneously starts loading all of:
* // 'normalized', 'deps', 'another', 'tree'
* // before "app" source is even loaded
*
* /
( function ( ) {
hookConstructor ( function ( constructor ) {
return function ( ) {
constructor . call ( this ) ;
this . depCache = { } ;
}
} ) ;
hook ( 'locate' , function ( locate ) {
return function ( load ) {
var loader = this ;
// load direct deps, in turn will pick up their trace trees
var deps = loader . depCache [ load . name ] ;
if ( deps )
for ( var i = 0 ; i < deps . length ; i ++ )
loader [ 'import' ] ( deps [ i ] , load . name ) ;
return locate . call ( loader , load ) ;
} ;
} ) ;
} ) ( ) ;
2016-01-26 17:21:17 +01:00
/ *
* Script - only addition used for production loader
*
* /
hookConstructor ( function ( constructor ) {
return function ( ) {
constructor . apply ( this , arguments ) ;
2016-09-26 18:00:21 +02:00
_ _global . define = this . amdDefine ;
2016-01-26 17:21:17 +01:00
} ;
} ) ;
hook ( 'fetch' , function ( fetch ) {
return function ( load ) {
load . metadata . scriptLoad = true ;
return fetch . call ( this , load ) ;
} ;
} ) ; System = new SystemJSLoader ( ) ;
2016-01-10 20:07:42 +01:00
_ _global . SystemJS = System ;
2016-09-26 18:00:21 +02:00
System . version = '0.19.39 CSP' ;
if ( typeof module == 'object' && module . exports && typeof exports == 'object' )
2016-01-10 20:07:42 +01:00
module . exports = System ;
_ _global . System = System ;
} ) ( typeof self != 'undefined' ? self : global ) ; }
2016-09-26 18:00:21 +02:00
// auto-load Promise polyfill if needed in the browser
var doPolyfill = typeof Promise === 'undefined' ;
2016-01-10 20:07:42 +01:00
2016-09-26 18:00:21 +02:00
// document.write
if ( typeof document !== 'undefined' ) {
var scripts = document . getElementsByTagName ( 'script' ) ;
$ _ _curScript = scripts [ scripts . length - 1 ] ;
if ( document . currentScript && ( $ _ _curScript . defer || $ _ _curScript . async ) )
$ _ _curScript = document . currentScript ;
if ( doPolyfill ) {
2016-01-10 20:07:42 +01:00
var curPath = $ _ _curScript . src ;
var basePath = curPath . substr ( 0 , curPath . lastIndexOf ( '/' ) + 1 ) ;
window . systemJSBootstrap = bootstrap ;
document . write (
'<' + 'script type="text/javascript" src="' + basePath + 'system-polyfills.js">' + '<' + '/script>'
) ;
}
else {
bootstrap ( ) ;
}
}
2016-09-26 18:00:21 +02:00
// importScripts
else if ( typeof importScripts !== 'undefined' ) {
var basePath = '' ;
try {
throw new Error ( '_' ) ;
} catch ( e ) {
e . stack . replace ( /(?:at|@).*(http.+):[\d]+:[\d]+/ , function ( m , url ) {
$ _ _curScript = { src : url } ;
basePath = url . replace ( /\/[^\/]*$/ , '/' ) ;
} ) ;
}
if ( doPolyfill )
importScripts ( basePath + 'system-polyfills.js' ) ;
bootstrap ( ) ;
}
2016-01-10 20:07:42 +01:00
else {
2016-09-26 18:00:21 +02:00
$ _ _curScript = typeof _ _filename != 'undefined' ? { src : _ _filename } : null ;
2016-01-10 20:07:42 +01:00
bootstrap ( ) ;
}
} ) ( ) ;