system.src.js 72 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406
  1. /*
  2. * SystemJS v0.16.11
  3. */
  4. (function($__global, $__globalName) {
  5. $__global.upgradeSystemLoader = function() {
  6. $__global.upgradeSystemLoader = undefined;
  7. // indexOf polyfill for IE
  8. var indexOf = Array.prototype.indexOf || function(item) {
  9. for (var i = 0, l = this.length; i < l; i++)
  10. if (this[i] === item)
  11. return i;
  12. return -1;
  13. }
  14. var isWindows = typeof process != 'undefined' && !!process.platform.match(/^win/);
  15. // Absolute URL parsing, from https://gist.github.com/Yaffle/1088850
  16. function parseURI(url) {
  17. var m = String(url).replace(/^\s+|\s+$/g, '').match(/^([^:\/?#]+:)?(\/\/(?:[^:@\/?#]*(?::[^:@\/?#]*)?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/);
  18. // authority = '//' + user + ':' + pass '@' + hostname + ':' port
  19. return (m ? {
  20. href : m[0] || '',
  21. protocol : m[1] || '',
  22. authority: m[2] || '',
  23. host : m[3] || '',
  24. hostname : m[4] || '',
  25. port : m[5] || '',
  26. pathname : m[6] || '',
  27. search : m[7] || '',
  28. hash : m[8] || ''
  29. } : null);
  30. }
  31. function toAbsoluteURL(base, href) {
  32. function removeDotSegments(input) {
  33. var output = [];
  34. input.replace(/^(\.\.?(\/|$))+/, '')
  35. .replace(/\/(\.(\/|$))+/g, '/')
  36. .replace(/\/\.\.$/, '/../')
  37. .replace(/\/?[^\/]*/g, function (p) {
  38. if (p === '/..')
  39. output.pop();
  40. else
  41. output.push(p);
  42. });
  43. return output.join('').replace(/^\//, input.charAt(0) === '/' ? '/' : '');
  44. }
  45. if (isWindows)
  46. href = href.replace(/\\/g, '/');
  47. href = parseURI(href || '');
  48. base = parseURI(base || '');
  49. return !href || !base ? null : (href.protocol || base.protocol) +
  50. (href.protocol || href.authority ? href.authority : base.authority) +
  51. removeDotSegments(href.protocol || href.authority || href.pathname.charAt(0) === '/' ? href.pathname : (href.pathname ? ((base.authority && !base.pathname ? '/' : '') + base.pathname.slice(0, base.pathname.lastIndexOf('/') + 1) + href.pathname) : base.pathname)) +
  52. (href.protocol || href.authority || href.pathname ? href.search : (href.search || base.search)) +
  53. href.hash;
  54. }
  55. // clone the original System loader
  56. var System;
  57. (function() {
  58. var originalSystem = $__global.System;
  59. System = $__global.System = new LoaderPolyfill(originalSystem);
  60. System.baseURL = originalSystem.baseURL;
  61. System.paths = { '*': '*.js' };
  62. System.originalSystem = originalSystem;
  63. })();
  64. System.noConflict = function() {
  65. $__global.SystemJS = System;
  66. $__global.System = System.originalSystem;
  67. }
  68. /*
  69. * SystemJS Core
  70. * Code should be vaguely readable
  71. *
  72. */
  73. var originalSystem = $__global.System.originalSystem;
  74. function core(loader) {
  75. /*
  76. __useDefault
  77. When a module object looks like:
  78. newModule(
  79. __useDefault: true,
  80. default: 'some-module'
  81. })
  82. Then importing that module provides the 'some-module'
  83. result directly instead of the full module.
  84. Useful for eg module.exports = function() {}
  85. */
  86. var loaderImport = loader['import'];
  87. loader['import'] = function(name, options) {
  88. return loaderImport.call(this, name, options).then(function(module) {
  89. return module.__useDefault ? module['default'] : module;
  90. });
  91. }
  92. // support the empty module, as a concept
  93. loader.set('@empty', loader.newModule({}));
  94. // include the node require since we're overriding it
  95. if (typeof require != 'undefined')
  96. loader._nodeRequire = require;
  97. /*
  98. Config
  99. Extends config merging one deep only
  100. loader.config({
  101. some: 'random',
  102. config: 'here',
  103. deep: {
  104. config: { too: 'too' }
  105. }
  106. });
  107. <=>
  108. loader.some = 'random';
  109. loader.config = 'here'
  110. loader.deep = loader.deep || {};
  111. loader.deep.config = { too: 'too' };
  112. */
  113. loader.config = function(cfg) {
  114. for (var c in cfg) {
  115. var v = cfg[c];
  116. if (typeof v == 'object' && !(v instanceof Array)) {
  117. this[c] = this[c] || {};
  118. for (var p in v)
  119. this[c][p] = v[p];
  120. }
  121. else
  122. this[c] = v;
  123. }
  124. }
  125. // override locate to allow baseURL to be document-relative
  126. var baseURI;
  127. if (typeof window == 'undefined' &&
  128. typeof WorkerGlobalScope == 'undefined' && typeof process != 'undefined') {
  129. baseURI = 'file:' + process.cwd() + '/';
  130. if (isWindows)
  131. baseURI = baseURI.replace(/\\/g, '/');
  132. }
  133. // Inside of a Web Worker
  134. else if (typeof window == 'undefined') {
  135. baseURI = location.href;
  136. }
  137. else {
  138. baseURI = document.baseURI;
  139. if (!baseURI) {
  140. var bases = document.getElementsByTagName('base');
  141. baseURI = bases[0] && bases[0].href || window.location.href;
  142. }
  143. }
  144. var loaderLocate = loader.locate;
  145. var normalizedBaseURL;
  146. loader.locate = function(load) {
  147. if (this.baseURL != normalizedBaseURL) {
  148. normalizedBaseURL = toAbsoluteURL(baseURI, this.baseURL);
  149. if (normalizedBaseURL.substr(normalizedBaseURL.length - 1, 1) != '/')
  150. normalizedBaseURL += '/';
  151. this.baseURL = normalizedBaseURL;
  152. }
  153. return Promise.resolve(loaderLocate.call(this, load));
  154. }
  155. function applyExtensions(extensions, loader) {
  156. loader._extensions = [];
  157. for(var i = 0, len = extensions.length; i < len; i++) {
  158. extensions[i](loader);
  159. }
  160. }
  161. loader._extensions = loader._extensions || [];
  162. loader._extensions.push(core);
  163. loader.clone = function() {
  164. var originalLoader = this;
  165. var loader = new LoaderPolyfill(originalSystem);
  166. loader.baseURL = originalLoader.baseURL;
  167. loader.paths = { '*': '*.js' };
  168. applyExtensions(originalLoader._extensions, loader);
  169. return loader;
  170. };
  171. }
  172. /*
  173. * Meta Extension
  174. *
  175. * Sets default metadata on a load record (load.metadata) from
  176. * loader.meta[moduleName].
  177. * Also provides an inline meta syntax for module meta in source.
  178. *
  179. * Eg:
  180. *
  181. * loader.meta['my/module'] = { some: 'meta' };
  182. *
  183. * load.metadata.some = 'meta' will now be set on the load record.
  184. *
  185. * The same meta could be set with a my/module.js file containing:
  186. *
  187. * my/module.js
  188. * "some meta";
  189. * "another meta";
  190. * console.log('this is my/module');
  191. *
  192. * The benefit of inline meta is that coniguration doesn't need
  193. * to be known in advance, which is useful for modularising
  194. * configuration and avoiding the need for configuration injection.
  195. *
  196. *
  197. * Example
  198. * -------
  199. *
  200. * The simplest meta example is setting the module format:
  201. *
  202. * System.meta['my/module'] = { format: 'amd' };
  203. *
  204. * or inside 'my/module.js':
  205. *
  206. * "format amd";
  207. * define(...);
  208. *
  209. */
  210. function meta(loader) {
  211. var metaRegEx = /^(\s*\/\*.*\*\/|\s*\/\/[^\n]*|\s*"[^"]+"\s*;?|\s*'[^']+'\s*;?)+/;
  212. var metaPartRegEx = /\/\*.*\*\/|\/\/[^\n]*|"[^"]+"\s*;?|'[^']+'\s*;?/g;
  213. loader.meta = {};
  214. loader._extensions = loader._extensions || [];
  215. loader._extensions.push(meta);
  216. function setConfigMeta(loader, load) {
  217. var meta = loader.meta && loader.meta[load.name];
  218. if (meta) {
  219. for (var p in meta)
  220. load.metadata[p] = load.metadata[p] || meta[p];
  221. }
  222. }
  223. var loaderLocate = loader.locate;
  224. loader.locate = function(load) {
  225. setConfigMeta(this, load);
  226. return loaderLocate.call(this, load);
  227. }
  228. var loaderTranslate = loader.translate;
  229. loader.translate = function(load) {
  230. // detect any meta header syntax
  231. var meta = load.source.match(metaRegEx);
  232. if (meta) {
  233. var metaParts = meta[0].match(metaPartRegEx);
  234. for (var i = 0; i < metaParts.length; i++) {
  235. var len = metaParts[i].length;
  236. var firstChar = metaParts[i].substr(0, 1);
  237. if (metaParts[i].substr(len - 1, 1) == ';')
  238. len--;
  239. if (firstChar != '"' && firstChar != "'")
  240. continue;
  241. var metaString = metaParts[i].substr(1, metaParts[i].length - 3);
  242. var metaName = metaString.substr(0, metaString.indexOf(' '));
  243. if (metaName) {
  244. var metaValue = metaString.substr(metaName.length + 1, metaString.length - metaName.length - 1);
  245. if (load.metadata[metaName] instanceof Array)
  246. load.metadata[metaName].push(metaValue);
  247. else if (!load.metadata[metaName])
  248. load.metadata[metaName] = metaValue;
  249. }
  250. }
  251. }
  252. // config meta overrides
  253. setConfigMeta(this, load);
  254. return loaderTranslate.call(this, load);
  255. }
  256. }
  257. /*
  258. * Instantiate registry extension
  259. *
  260. * Supports Traceur System.register 'instantiate' output for loading ES6 as ES5.
  261. *
  262. * - Creates the loader.register function
  263. * - Also supports metadata.format = 'register' in instantiate for anonymous register modules
  264. * - Also supports metadata.deps, metadata.execute and metadata.executingRequire
  265. * for handling dynamic modules alongside register-transformed ES6 modules
  266. *
  267. * Works as a standalone extension, but benefits from having a more
  268. * advanced __eval defined like in SystemJS polyfill-wrapper-end.js
  269. *
  270. * The code here replicates the ES6 linking groups algorithm to ensure that
  271. * circular ES6 compiled into System.register can work alongside circular AMD
  272. * and CommonJS, identically to the actual ES6 loader.
  273. *
  274. */
  275. function register(loader) {
  276. if (typeof indexOf == 'undefined')
  277. indexOf = Array.prototype.indexOf;
  278. if (typeof __eval == 'undefined' || typeof document != 'undefined' && !document.addEventListener)
  279. __eval = 0 || eval; // uglify breaks without the 0 ||
  280. loader._extensions = loader._extensions || [];
  281. loader._extensions.push(register);
  282. // define exec for easy evaluation of a load record (load.name, load.source, load.address)
  283. // main feature is source maps support handling
  284. var curSystem;
  285. function exec(load) {
  286. var loader = this;
  287. // support sourceMappingURL (efficiently)
  288. var sourceMappingURL;
  289. var lastLineIndex = load.source.lastIndexOf('\n');
  290. if (lastLineIndex != -1) {
  291. if (load.source.substr(lastLineIndex + 1, 21) == '//# sourceMappingURL=') {
  292. sourceMappingURL = load.source.substr(lastLineIndex + 22, load.source.length - lastLineIndex - 22);
  293. if (typeof toAbsoluteURL != 'undefined')
  294. sourceMappingURL = toAbsoluteURL(load.address, sourceMappingURL);
  295. }
  296. }
  297. __eval(load.source, load.address, sourceMappingURL);
  298. }
  299. loader.__exec = exec;
  300. function dedupe(deps) {
  301. var newDeps = [];
  302. for (var i = 0, l = deps.length; i < l; i++)
  303. if (indexOf.call(newDeps, deps[i]) == -1)
  304. newDeps.push(deps[i])
  305. return newDeps;
  306. }
  307. /*
  308. * There are two variations of System.register:
  309. * 1. System.register for ES6 conversion (2-3 params) - System.register([name, ]deps, declare)
  310. * see https://github.com/ModuleLoader/es6-module-loader/wiki/System.register-Explained
  311. *
  312. * 2. System.register for dynamic modules (3-4 params) - System.register([name, ]deps, executingRequire, execute)
  313. * the true or false statement
  314. *
  315. * this extension implements the linking algorithm for the two variations identical to the spec
  316. * allowing compiled ES6 circular references to work alongside AMD and CJS circular references.
  317. *
  318. */
  319. // loader.register sets loader.defined for declarative modules
  320. var anonRegister;
  321. var calledRegister;
  322. function registerModule(name, deps, declare, execute) {
  323. if (typeof name != 'string') {
  324. execute = declare;
  325. declare = deps;
  326. deps = name;
  327. name = null;
  328. }
  329. calledRegister = true;
  330. var register;
  331. // dynamic
  332. if (typeof declare == 'boolean') {
  333. register = {
  334. declarative: false,
  335. deps: deps,
  336. execute: execute,
  337. executingRequire: declare
  338. };
  339. }
  340. else {
  341. // ES6 declarative
  342. register = {
  343. declarative: true,
  344. deps: deps,
  345. declare: declare
  346. };
  347. }
  348. // named register
  349. if (name) {
  350. register.name = name;
  351. // we never overwrite an existing define
  352. if (!(name in loader.defined))
  353. loader.defined[name] = register;
  354. }
  355. // anonymous register
  356. else if (register.declarative) {
  357. if (anonRegister)
  358. throw new TypeError('Multiple anonymous System.register calls in the same module file.');
  359. anonRegister = register;
  360. }
  361. }
  362. /*
  363. * Registry side table - loader.defined
  364. * Registry Entry Contains:
  365. * - name
  366. * - deps
  367. * - declare for declarative modules
  368. * - execute for dynamic modules, different to declarative execute on module
  369. * - executingRequire indicates require drives execution for circularity of dynamic modules
  370. * - declarative optional boolean indicating which of the above
  371. *
  372. * Can preload modules directly on System.defined['my/module'] = { deps, execute, executingRequire }
  373. *
  374. * Then the entry gets populated with derived information during processing:
  375. * - normalizedDeps derived from deps, created in instantiate
  376. * - groupIndex used by group linking algorithm
  377. * - evaluated indicating whether evaluation has happend
  378. * - module the module record object, containing:
  379. * - exports actual module exports
  380. *
  381. * Then for declarative only we track dynamic bindings with the records:
  382. * - name
  383. * - setters declarative setter functions
  384. * - exports actual module values
  385. * - dependencies, module records of dependencies
  386. * - importers, module records of dependents
  387. *
  388. * After linked and evaluated, entries are removed, declarative module records remain in separate
  389. * module binding table
  390. *
  391. */
  392. function defineRegister(loader) {
  393. if (loader.register)
  394. return;
  395. loader.register = registerModule;
  396. if (!loader.defined)
  397. loader.defined = {};
  398. // script injection mode calls this function synchronously on load
  399. var onScriptLoad = loader.onScriptLoad;
  400. loader.onScriptLoad = function(load) {
  401. onScriptLoad(load);
  402. // anonymous define
  403. if (anonRegister)
  404. load.metadata.entry = anonRegister;
  405. if (calledRegister) {
  406. load.metadata.format = load.metadata.format || 'register';
  407. load.metadata.registered = true;
  408. }
  409. }
  410. }
  411. defineRegister(loader);
  412. function buildGroups(entry, loader, groups) {
  413. groups[entry.groupIndex] = groups[entry.groupIndex] || [];
  414. if (indexOf.call(groups[entry.groupIndex], entry) != -1)
  415. return;
  416. groups[entry.groupIndex].push(entry);
  417. for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) {
  418. var depName = entry.normalizedDeps[i];
  419. var depEntry = loader.defined[depName];
  420. // not in the registry means already linked / ES6
  421. if (!depEntry || depEntry.evaluated)
  422. continue;
  423. // now we know the entry is in our unlinked linkage group
  424. var depGroupIndex = entry.groupIndex + (depEntry.declarative != entry.declarative);
  425. // the group index of an entry is always the maximum
  426. if (depEntry.groupIndex === undefined || depEntry.groupIndex < depGroupIndex) {
  427. // if already in a group, remove from the old group
  428. if (depEntry.groupIndex !== undefined) {
  429. groups[depEntry.groupIndex].splice(indexOf.call(groups[depEntry.groupIndex], depEntry), 1);
  430. // if the old group is empty, then we have a mixed depndency cycle
  431. if (groups[depEntry.groupIndex].length == 0)
  432. throw new TypeError("Mixed dependency cycle detected");
  433. }
  434. depEntry.groupIndex = depGroupIndex;
  435. }
  436. buildGroups(depEntry, loader, groups);
  437. }
  438. }
  439. function link(name, loader) {
  440. var startEntry = loader.defined[name];
  441. // skip if already linked
  442. if (startEntry.module)
  443. return;
  444. startEntry.groupIndex = 0;
  445. var groups = [];
  446. buildGroups(startEntry, loader, groups);
  447. var curGroupDeclarative = !!startEntry.declarative == groups.length % 2;
  448. for (var i = groups.length - 1; i >= 0; i--) {
  449. var group = groups[i];
  450. for (var j = 0; j < group.length; j++) {
  451. var entry = group[j];
  452. // link each group
  453. if (curGroupDeclarative)
  454. linkDeclarativeModule(entry, loader);
  455. else
  456. linkDynamicModule(entry, loader);
  457. }
  458. curGroupDeclarative = !curGroupDeclarative;
  459. }
  460. }
  461. // module binding records
  462. var moduleRecords = {};
  463. function getOrCreateModuleRecord(name) {
  464. return moduleRecords[name] || (moduleRecords[name] = {
  465. name: name,
  466. dependencies: [],
  467. exports: {}, // start from an empty module and extend
  468. importers: []
  469. })
  470. }
  471. function linkDeclarativeModule(entry, loader) {
  472. // only link if already not already started linking (stops at circular)
  473. if (entry.module)
  474. return;
  475. var module = entry.module = getOrCreateModuleRecord(entry.name);
  476. var exports = entry.module.exports;
  477. var declaration = entry.declare.call(loader.global, function(name, value) {
  478. module.locked = true;
  479. exports[name] = value;
  480. for (var i = 0, l = module.importers.length; i < l; i++) {
  481. var importerModule = module.importers[i];
  482. if (!importerModule.locked) {
  483. var importerIndex = indexOf.call(importerModule.dependencies, module);
  484. importerModule.setters[importerIndex](exports);
  485. }
  486. }
  487. module.locked = false;
  488. return value;
  489. });
  490. module.setters = declaration.setters;
  491. module.execute = declaration.execute;
  492. if (!module.setters || !module.execute) {
  493. throw new TypeError('Invalid System.register form for ' + entry.name);
  494. }
  495. // now link all the module dependencies
  496. for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) {
  497. var depName = entry.normalizedDeps[i];
  498. var depEntry = loader.defined[depName];
  499. var depModule = moduleRecords[depName];
  500. // work out how to set depExports based on scenarios...
  501. var depExports;
  502. if (depModule) {
  503. depExports = depModule.exports;
  504. }
  505. // dynamic, already linked in our registry
  506. else if (depEntry && !depEntry.declarative) {
  507. if (depEntry.module.exports && depEntry.module.exports.__esModule)
  508. depExports = depEntry.module.exports;
  509. else
  510. depExports = { 'default': depEntry.module.exports, '__useDefault': true };
  511. }
  512. // in the loader registry
  513. else if (!depEntry) {
  514. depExports = loader.get(depName);
  515. }
  516. // we have an entry -> link
  517. else {
  518. linkDeclarativeModule(depEntry, loader);
  519. depModule = depEntry.module;
  520. depExports = depModule.exports;
  521. }
  522. // only declarative modules have dynamic bindings
  523. if (depModule && depModule.importers) {
  524. depModule.importers.push(module);
  525. module.dependencies.push(depModule);
  526. }
  527. else {
  528. module.dependencies.push(null);
  529. }
  530. // run the setter for this dependency
  531. if (module.setters[i])
  532. module.setters[i](depExports);
  533. }
  534. }
  535. // An analog to loader.get covering execution of all three layers (real declarative, simulated declarative, simulated dynamic)
  536. function getModule(name, loader) {
  537. var exports;
  538. var entry = loader.defined[name];
  539. if (!entry) {
  540. exports = loader.get(name);
  541. if (!exports)
  542. throw new Error('Unable to load dependency ' + name + '.');
  543. }
  544. else {
  545. if (entry.declarative)
  546. ensureEvaluated(name, [], loader);
  547. else if (!entry.evaluated)
  548. linkDynamicModule(entry, loader);
  549. exports = entry.module.exports;
  550. }
  551. if ((!entry || entry.declarative) && exports && exports.__useDefault)
  552. return exports['default'];
  553. return exports;
  554. }
  555. function linkDynamicModule(entry, loader) {
  556. if (entry.module)
  557. return;
  558. var exports = {};
  559. var module = entry.module = { exports: exports, id: entry.name };
  560. // AMD requires execute the tree first
  561. if (!entry.executingRequire) {
  562. for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) {
  563. var depName = entry.normalizedDeps[i];
  564. // we know we only need to link dynamic due to linking algorithm
  565. var depEntry = loader.defined[depName];
  566. if (depEntry)
  567. linkDynamicModule(depEntry, loader);
  568. }
  569. }
  570. // now execute
  571. entry.evaluated = true;
  572. var output = entry.execute.call(loader.global, function(name) {
  573. for (var i = 0, l = entry.deps.length; i < l; i++) {
  574. if (entry.deps[i] != name)
  575. continue;
  576. return getModule(entry.normalizedDeps[i], loader);
  577. }
  578. throw new TypeError('Module ' + name + ' not declared as a dependency.');
  579. }, exports, module);
  580. if (output)
  581. module.exports = output;
  582. }
  583. /*
  584. * Given a module, and the list of modules for this current branch,
  585. * ensure that each of the dependencies of this module is evaluated
  586. * (unless one is a circular dependency already in the list of seen
  587. * modules, in which case we execute it)
  588. *
  589. * Then we evaluate the module itself depth-first left to right
  590. * execution to match ES6 modules
  591. */
  592. function ensureEvaluated(moduleName, seen, loader) {
  593. var entry = loader.defined[moduleName];
  594. // if already seen, that means it's an already-evaluated non circular dependency
  595. if (!entry || entry.evaluated || !entry.declarative)
  596. return;
  597. // this only applies to declarative modules which late-execute
  598. seen.push(moduleName);
  599. for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) {
  600. var depName = entry.normalizedDeps[i];
  601. if (indexOf.call(seen, depName) == -1) {
  602. if (!loader.defined[depName])
  603. loader.get(depName);
  604. else
  605. ensureEvaluated(depName, seen, loader);
  606. }
  607. }
  608. if (entry.evaluated)
  609. return;
  610. entry.evaluated = true;
  611. entry.module.execute.call(loader.global);
  612. }
  613. // override the delete method to also clear the register caches
  614. var loaderDelete = loader['delete'];
  615. loader['delete'] = function(name) {
  616. delete moduleRecords[name];
  617. return loaderDelete.call(this, name);
  618. };
  619. var registerRegEx = /System\.register/;
  620. var loaderFetch = loader.fetch;
  621. loader.fetch = function(load) {
  622. var loader = this;
  623. defineRegister(loader);
  624. if (loader.defined[load.name]) {
  625. load.metadata.format = 'defined';
  626. return '';
  627. }
  628. anonRegister = null;
  629. calledRegister = false;
  630. // the above get picked up by onScriptLoad
  631. return loaderFetch.call(loader, load);
  632. }
  633. var loaderTranslate = loader.translate;
  634. loader.translate = function(load) {
  635. this.register = registerModule;
  636. this.__exec = exec;
  637. load.metadata.deps = load.metadata.deps || [];
  638. // we run the meta detection here (register is after meta)
  639. return Promise.resolve(loaderTranslate.call(this, load)).then(function(source) {
  640. // dont run format detection for globals shimmed
  641. // ideally this should be in the global extension, but there is
  642. // currently no neat way to separate it
  643. if (load.metadata.init || load.metadata.exports)
  644. load.metadata.format = load.metadata.format || 'global';
  645. // run detection for register format
  646. if (load.metadata.format == 'register' || !load.metadata.format && load.source.match(registerRegEx))
  647. load.metadata.format = 'register';
  648. return source;
  649. });
  650. }
  651. var loaderInstantiate = loader.instantiate;
  652. loader.instantiate = function(load) {
  653. var loader = this;
  654. var entry;
  655. // first we check if this module has already been defined in the registry
  656. if (loader.defined[load.name]) {
  657. entry = loader.defined[load.name];
  658. entry.deps = entry.deps.concat(load.metadata.deps);
  659. }
  660. // picked up already by a script injection
  661. else if (load.metadata.entry)
  662. entry = load.metadata.entry;
  663. // otherwise check if it is dynamic
  664. else if (load.metadata.execute) {
  665. entry = {
  666. declarative: false,
  667. deps: load.metadata.deps || [],
  668. execute: load.metadata.execute,
  669. executingRequire: load.metadata.executingRequire // NodeJS-style requires or not
  670. };
  671. }
  672. // Contains System.register calls
  673. else if (load.metadata.format == 'register') {
  674. anonRegister = null;
  675. calledRegister = false;
  676. var curSystem = loader.global.System;
  677. loader.global.System = loader;
  678. loader.__exec(load);
  679. loader.global.System = curSystem;
  680. if (anonRegister)
  681. entry = anonRegister;
  682. else
  683. load.metadata.bundle = true;
  684. if (!entry && System.defined[load.name])
  685. entry = System.defined[load.name];
  686. if (!calledRegister && !load.metadata.registered)
  687. throw new TypeError(load.name + ' detected as System.register but didn\'t execute.');
  688. }
  689. // named bundles are just an empty module
  690. if (!entry && load.metadata.format != 'es6')
  691. return {
  692. deps: load.metadata.deps,
  693. execute: function() {
  694. return loader.newModule({});
  695. }
  696. };
  697. // place this module onto defined for circular references
  698. if (entry)
  699. loader.defined[load.name] = entry;
  700. // no entry -> treat as ES6
  701. else
  702. return loaderInstantiate.call(this, load);
  703. entry.deps = dedupe(entry.deps);
  704. entry.name = load.name;
  705. // first, normalize all dependencies
  706. var normalizePromises = [];
  707. for (var i = 0, l = entry.deps.length; i < l; i++)
  708. normalizePromises.push(Promise.resolve(loader.normalize(entry.deps[i], load.name)));
  709. return Promise.all(normalizePromises).then(function(normalizedDeps) {
  710. entry.normalizedDeps = normalizedDeps;
  711. return {
  712. deps: entry.deps,
  713. execute: function() {
  714. // recursively ensure that the module and all its
  715. // dependencies are linked (with dependency group handling)
  716. link(load.name, loader);
  717. // now handle dependency execution in correct order
  718. ensureEvaluated(load.name, [], loader);
  719. // remove from the registry
  720. loader.defined[load.name] = undefined;
  721. var module = entry.module.exports;
  722. if (!module || !entry.declarative && module.__esModule !== true)
  723. module = { 'default': module, __useDefault: true };
  724. // return the defined module object
  725. return loader.newModule(module);
  726. }
  727. };
  728. });
  729. }
  730. }
  731. /*
  732. * Extension to detect ES6 and auto-load Traceur or Babel for processing
  733. */
  734. function es6(loader) {
  735. loader._extensions.push(es6);
  736. // good enough ES6 detection regex - format detections not designed to be accurate, but to handle the 99% use case
  737. var es6RegEx = /(^\s*|[}\);\n]\s*)(import\s+(['"]|(\*\s+as\s+)?[^"'\(\)\n;]+\s+from\s+['"]|\{)|export\s+\*\s+from\s+["']|export\s+(\{|default|function|class|var|const|let|async\s+function))/;
  738. var traceurRuntimeRegEx = /\$traceurRuntime\s*\./;
  739. var babelHelpersRegEx = /babelHelpers\s*\./;
  740. var transpilerNormalized, transpilerRuntimeNormalized;
  741. var firstLoad = true;
  742. var nodeResolver = typeof process != 'undefined' && typeof require != 'undefined' && require.resolve;
  743. function configNodeGlobal(loader, module, nodeModule, wilcardDummy) {
  744. loader.meta = loader.meta || {};
  745. var meta = loader.meta[module] = loader.meta[module] || {};
  746. meta.format = meta.format || 'global';
  747. if (!loader.paths[module]) {
  748. var path = resolvePath(nodeModule, wilcardDummy);
  749. if (path) {
  750. loader.paths[module] = path;
  751. }
  752. }
  753. }
  754. function resolvePath(nodeModule, wildcard) {
  755. if (nodeResolver) {
  756. var ext = wildcard ? '/package.json' : '';
  757. try {
  758. var match = nodeResolver(nodeModule + ext);
  759. return 'file:' + match.substr(0, match.length - ext.length) + (wildcard ? '/*.js' : '');
  760. }
  761. catch(e) {}
  762. }
  763. }
  764. var loaderLocate = loader.locate;
  765. loader.locate = function(load) {
  766. var self = this;
  767. if (firstLoad) {
  768. if (self.transpiler == 'traceur') {
  769. configNodeGlobal(self, 'traceur', 'traceur/bin/traceur.js');
  770. self.meta['traceur'].exports = 'traceur';
  771. configNodeGlobal(self, 'traceur-runtime', 'traceur/bin/traceur-runtime.js');
  772. }
  773. else if (self.transpiler == 'babel') {
  774. configNodeGlobal(self, 'babel', 'babel-core/browser.js');
  775. configNodeGlobal(self, 'babel/external-helpers', 'babel-core/external-helpers.js');
  776. configNodeGlobal(self, 'babel-runtime/*', 'babel-runtime', true);
  777. }
  778. firstLoad = false;
  779. }
  780. return loaderLocate.call(self, load);
  781. };
  782. var loaderTranslate = loader.translate;
  783. loader.translate = function(load) {
  784. var loader = this;
  785. return loaderTranslate.call(loader, load)
  786. .then(function(source) {
  787. // detect ES6
  788. if (load.metadata.format == 'es6' || !load.metadata.format && source.match(es6RegEx)) {
  789. load.metadata.format = 'es6';
  790. return source;
  791. }
  792. if (load.metadata.format == 'register') {
  793. if (!loader.global.$traceurRuntime && load.source.match(traceurRuntimeRegEx)) {
  794. return loader['import']('traceur-runtime').then(function() {
  795. return source;
  796. });
  797. }
  798. if (!loader.global.babelHelpers && load.source.match(babelHelpersRegEx)) {
  799. return loader['import']('babel/external-helpers').then(function() {
  800. return source;
  801. });
  802. }
  803. }
  804. // ensure Traceur doesn't clobber the System global
  805. if (loader.transpiler == 'traceur')
  806. return Promise.all([
  807. transpilerNormalized || (transpilerNormalized = loader.normalize(loader.transpiler)),
  808. transpilerRuntimeNormalized || (transpilerRuntimeNormalized = loader.normalize(loader.transpiler + '-runtime'))
  809. ])
  810. .then(function(normalized) {
  811. if (load.name == normalized[0] || load.name == normalized[1])
  812. return '(function() { var curSystem = System; ' + source + '\nSystem = curSystem; })();';
  813. return source;
  814. });
  815. return source;
  816. });
  817. };
  818. }
  819. /*
  820. SystemJS Global Format
  821. Supports
  822. metadata.deps
  823. metadata.init
  824. metadata.exports
  825. Also detects writes to the global object avoiding global collisions.
  826. See the SystemJS readme global support section for further information.
  827. */
  828. function global(loader) {
  829. loader._extensions.push(global);
  830. function readGlobalProperty(p, value) {
  831. var pParts = p.split('.');
  832. while (pParts.length)
  833. value = value[pParts.shift()];
  834. return value;
  835. }
  836. // bare minimum ignores for IE8
  837. var ignoredGlobalProps = ['sessionStorage', 'localStorage', 'clipboardData', 'frames', 'external'];
  838. var hasOwnProperty = Object.prototype.hasOwnProperty;
  839. function iterateGlobals(callback) {
  840. if (Object.keys)
  841. Object.keys(loader.global).forEach(callback);
  842. else
  843. for (var g in loader.global) {
  844. if (!hasOwnProperty.call(loader.global, g))
  845. continue;
  846. callback(g);
  847. }
  848. }
  849. function forEachGlobal(callback) {
  850. iterateGlobals(function(globalName) {
  851. if (indexOf.call(ignoredGlobalProps, globalName) != -1)
  852. return;
  853. try {
  854. var value = loader.global[globalName];
  855. }
  856. catch(e) {
  857. ignoredGlobalProps.push(globalName);
  858. }
  859. callback(globalName, value);
  860. });
  861. }
  862. function createHelpers(loader) {
  863. if (loader.has('@@global-helpers'))
  864. return;
  865. var moduleGlobals = {};
  866. var globalSnapshot;
  867. loader.set('@@global-helpers', loader.newModule({
  868. prepareGlobal: function(moduleName, deps) {
  869. // first, we add all the dependency modules to the global
  870. for (var i = 0; i < deps.length; i++) {
  871. var moduleGlobal = moduleGlobals[deps[i]];
  872. if (moduleGlobal)
  873. for (var m in moduleGlobal)
  874. loader.global[m] = moduleGlobal[m];
  875. }
  876. // now store a complete copy of the global object
  877. // in order to detect changes
  878. globalSnapshot = {};
  879. forEachGlobal(function(name, value) {
  880. globalSnapshot[name] = value;
  881. });
  882. },
  883. retrieveGlobal: function(moduleName, exportName, init) {
  884. var singleGlobal;
  885. var multipleExports;
  886. var exports = {};
  887. // run init
  888. if (init)
  889. singleGlobal = init.call(loader.global);
  890. // check for global changes, creating the globalObject for the module
  891. // if many globals, then a module object for those is created
  892. // if one global, then that is the module directly
  893. else if (exportName) {
  894. var firstPart = exportName.split('.')[0];
  895. singleGlobal = readGlobalProperty(exportName, loader.global);
  896. exports[firstPart] = loader.global[firstPart];
  897. }
  898. else {
  899. forEachGlobal(function(name, value) {
  900. if (globalSnapshot[name] === value)
  901. return;
  902. if (typeof value === 'undefined')
  903. return;
  904. exports[name] = value;
  905. if (typeof singleGlobal !== 'undefined') {
  906. if (!multipleExports && singleGlobal !== value)
  907. multipleExports = true;
  908. }
  909. else {
  910. singleGlobal = value;
  911. }
  912. });
  913. }
  914. moduleGlobals[moduleName] = exports;
  915. return multipleExports ? exports : singleGlobal;
  916. }
  917. }));
  918. }
  919. createHelpers(loader);
  920. var loaderInstantiate = loader.instantiate;
  921. loader.instantiate = function(load) {
  922. var loader = this;
  923. createHelpers(loader);
  924. var exportName = load.metadata.exports;
  925. if (!load.metadata.format)
  926. load.metadata.format = 'global';
  927. // global is a fallback module format
  928. if (load.metadata.format == 'global') {
  929. load.metadata.execute = function(require, exports, module) {
  930. loader.get('@@global-helpers').prepareGlobal(module.id, load.metadata.deps);
  931. if (exportName)
  932. load.source += $__globalName + '["' + exportName + '"] = ' + exportName + ';';
  933. // disable module detection
  934. var define = loader.global.define;
  935. var require = loader.global.require;
  936. loader.global.define = undefined;
  937. loader.global.module = undefined;
  938. loader.global.exports = undefined;
  939. loader.__exec(load);
  940. loader.global.require = require;
  941. loader.global.define = define;
  942. return loader.get('@@global-helpers').retrieveGlobal(module.id, exportName, load.metadata.init);
  943. }
  944. }
  945. return loaderInstantiate.call(loader, load);
  946. }
  947. }
  948. /*
  949. SystemJS CommonJS Format
  950. */
  951. function cjs(loader) {
  952. loader._extensions.push(cjs);
  953. // CJS Module Format
  954. // require('...') || exports[''] = ... || exports.asd = ... || module.exports = ...
  955. var cjsExportsRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.]|module\.)exports\s*(\[['"]|\.)|(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.])module\.exports\s*[=,]/;
  956. // RegEx adjusted from https://github.com/jbrantly/yabble/blob/master/lib/yabble.js#L339
  957. var cjsRequireRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF."'])require\s*\(\s*("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\s*\)/g;
  958. var commentRegEx = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg;
  959. function getCJSDeps(source) {
  960. cjsRequireRegEx.lastIndex = 0;
  961. var deps = [];
  962. // remove comments from the source first, if not minified
  963. if (source.length / source.split('\n').length < 200)
  964. source = source.replace(commentRegEx, '');
  965. var match;
  966. while (match = cjsRequireRegEx.exec(source))
  967. deps.push(match[1].substr(1, match[1].length - 2));
  968. return deps;
  969. }
  970. if (typeof location != 'undefined' && location.origin)
  971. var curOrigin = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '');
  972. var loaderInstantiate = loader.instantiate;
  973. loader.instantiate = function(load) {
  974. if (!load.metadata.format) {
  975. cjsExportsRegEx.lastIndex = 0;
  976. cjsRequireRegEx.lastIndex = 0;
  977. if (cjsRequireRegEx.exec(load.source) || cjsExportsRegEx.exec(load.source))
  978. load.metadata.format = 'cjs';
  979. }
  980. if (load.metadata.format == 'cjs') {
  981. load.metadata.deps = load.metadata.deps ? load.metadata.deps.concat(getCJSDeps(load.source)) : getCJSDeps(load.source);
  982. load.metadata.executingRequire = true;
  983. load.metadata.execute = function(require, exports, module) {
  984. var dirname = (load.address || '').split('/');
  985. dirname.pop();
  986. dirname = dirname.join('/');
  987. var address = load.address;
  988. if (curOrigin && address.substr(0, curOrigin.length) === curOrigin) {
  989. address = address.substr(curOrigin.length);
  990. dirname = dirname.substr(curOrigin.length);
  991. }
  992. else if (address.substr(0, 5) == 'file:') {
  993. address = address.substr(5);
  994. dirname = dirname.substr(5);
  995. }
  996. // if on the server, remove the "file:" part from the dirname
  997. if (System._nodeRequire)
  998. dirname = dirname.substr(5);
  999. var globals = loader.global._g = {
  1000. global: loader.global,
  1001. exports: exports,
  1002. module: module,
  1003. require: require,
  1004. __filename: address,
  1005. __dirname: dirname
  1006. };
  1007. var source = '(function(global, exports, module, require, __filename, __dirname) { ' + load.source
  1008. + '\n}).call(_g.exports, _g.global, _g.exports, _g.module, _g.require, _g.__filename, _g.__dirname);';
  1009. // disable AMD detection
  1010. var define = loader.global.define;
  1011. loader.global.define = undefined;
  1012. loader.__exec({
  1013. name: load.name,
  1014. address: load.address,
  1015. source: source
  1016. });
  1017. loader.global.define = define;
  1018. loader.global._g = undefined;
  1019. }
  1020. }
  1021. return loaderInstantiate.call(this, load);
  1022. };
  1023. }
  1024. /*
  1025. SystemJS AMD Format
  1026. Provides the AMD module format definition at System.format.amd
  1027. as well as a RequireJS-style require on System.require
  1028. */
  1029. function amd(loader) {
  1030. // by default we only enforce AMD noConflict mode in Node
  1031. var isNode = typeof module != 'undefined' && module.exports;
  1032. loader._extensions.push(amd);
  1033. // AMD Module Format Detection RegEx
  1034. // define([.., .., ..], ...)
  1035. // define(varName); || define(function(require, exports) {}); || define({})
  1036. var amdRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.])define\s*\(\s*("[^"]+"\s*,\s*|'[^']+'\s*,\s*)?\s*(\[(\s*(("[^"]+"|'[^']+')\s*,|\/\/.*\r?\n|\/\*(.|\s)*?\*\/))*(\s*("[^"]+"|'[^']+')\s*,?)?(\s*(\/\/.*\r?\n|\/\*(.|\s)*?\*\/))*\s*\]|function\s*|{|[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*\))/;
  1037. var commentRegEx = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg;
  1038. var cjsRequirePre = "(?:^|[^$_a-zA-Z\\xA0-\\uFFFF.])";
  1039. var cjsRequirePost = "\\s*\\(\\s*(\"([^\"]+)\"|'([^']+)')\\s*\\)";
  1040. var fnBracketRegEx = /\(([^\)]*)\)/;
  1041. var wsRegEx = /^\s+|\s+$/g;
  1042. var requireRegExs = {};
  1043. function getCJSDeps(source, requireIndex) {
  1044. // remove comments
  1045. source = source.replace(commentRegEx, '');
  1046. // determine the require alias
  1047. var params = source.match(fnBracketRegEx);
  1048. var requireAlias = (params[1].split(',')[requireIndex] || 'require').replace(wsRegEx, '');
  1049. // find or generate the regex for this requireAlias
  1050. var requireRegEx = requireRegExs[requireAlias] || (requireRegExs[requireAlias] = new RegExp(cjsRequirePre + requireAlias + cjsRequirePost, 'g'));
  1051. requireRegEx.lastIndex = 0;
  1052. var deps = [];
  1053. var match;
  1054. while (match = requireRegEx.exec(source))
  1055. deps.push(match[2] || match[3]);
  1056. return deps;
  1057. }
  1058. /*
  1059. AMD-compatible require
  1060. To copy RequireJS, set window.require = window.requirejs = loader.amdRequire
  1061. */
  1062. function require(names, callback, errback, referer) {
  1063. // 'this' is bound to the loader
  1064. var loader = this;
  1065. // in amd, first arg can be a config object... we just ignore
  1066. if (typeof names == 'object' && !(names instanceof Array))
  1067. return require.apply(null, Array.prototype.splice.call(arguments, 1, arguments.length - 1));
  1068. // amd require
  1069. if (names instanceof Array) {
  1070. var dynamicRequires = [];
  1071. for (var i = 0; i < names.length; i++)
  1072. dynamicRequires.push(loader['import'](names[i], referer));
  1073. Promise.all(dynamicRequires).then(function(modules) {
  1074. if(callback) {
  1075. callback.apply(null, modules);
  1076. }
  1077. }, errback);
  1078. }
  1079. // commonjs require
  1080. else if (typeof names == 'string') {
  1081. var module = loader.get(names);
  1082. return module.__useDefault ? module['default'] : module;
  1083. }
  1084. else
  1085. throw new TypeError('Invalid require');
  1086. };
  1087. loader.amdRequire = function() {
  1088. return require.apply(this, arguments);
  1089. };
  1090. function makeRequire(parentName, staticRequire, loader) {
  1091. return function(names, callback, errback) {
  1092. if (typeof names == 'string') {
  1093. if (typeof callback === 'function')
  1094. names = [names];
  1095. else
  1096. return staticRequire(names);
  1097. }
  1098. return require.call(loader, names, callback, errback, { name: parentName });
  1099. }
  1100. }
  1101. // run once per loader
  1102. function generateDefine(loader) {
  1103. // script injection mode calls this function synchronously on load
  1104. var onScriptLoad = loader.onScriptLoad;
  1105. loader.onScriptLoad = function(load) {
  1106. onScriptLoad(load);
  1107. if (anonDefine || defineBundle) {
  1108. load.metadata.format = 'defined';
  1109. load.metadata.registered = true;
  1110. }
  1111. if (anonDefine) {
  1112. load.metadata.deps = load.metadata.deps ? load.metadata.deps.concat(anonDefine.deps) : anonDefine.deps;
  1113. load.metadata.execute = anonDefine.execute;
  1114. }
  1115. }
  1116. function define(name, deps, factory) {
  1117. if (typeof name != 'string') {
  1118. factory = deps;
  1119. deps = name;
  1120. name = null;
  1121. }
  1122. if (!(deps instanceof Array)) {
  1123. factory = deps;
  1124. deps = ['require', 'exports', 'module'];
  1125. }
  1126. if (typeof factory != 'function')
  1127. factory = (function(factory) {
  1128. return function() { return factory; }
  1129. })(factory);
  1130. // in IE8, a trailing comma becomes a trailing undefined entry
  1131. if (deps[deps.length - 1] === undefined)
  1132. deps.pop();
  1133. // remove system dependencies
  1134. var requireIndex, exportsIndex, moduleIndex;
  1135. if ((requireIndex = indexOf.call(deps, 'require')) != -1) {
  1136. deps.splice(requireIndex, 1);
  1137. var factoryText = factory.toString();
  1138. deps = deps.concat(getCJSDeps(factoryText, requireIndex));
  1139. }
  1140. if ((exportsIndex = indexOf.call(deps, 'exports')) != -1)
  1141. deps.splice(exportsIndex, 1);
  1142. if ((moduleIndex = indexOf.call(deps, 'module')) != -1)
  1143. deps.splice(moduleIndex, 1);
  1144. var define = {
  1145. deps: deps,
  1146. execute: function(require, exports, module) {
  1147. var depValues = [];
  1148. for (var i = 0; i < deps.length; i++)
  1149. depValues.push(require(deps[i]));
  1150. module.uri = loader.baseURL + module.id;
  1151. module.config = function() {};
  1152. // add back in system dependencies
  1153. if (moduleIndex != -1)
  1154. depValues.splice(moduleIndex, 0, module);
  1155. if (exportsIndex != -1)
  1156. depValues.splice(exportsIndex, 0, exports);
  1157. if (requireIndex != -1)
  1158. depValues.splice(requireIndex, 0, makeRequire(module.id, require, loader));
  1159. // set global require to AMD require
  1160. var curRequire = global.require;
  1161. global.require = System.amdRequire;
  1162. var output = factory.apply(global, depValues);
  1163. global.require = curRequire;
  1164. if (typeof output == 'undefined' && module)
  1165. output = module.exports;
  1166. if (typeof output != 'undefined')
  1167. return output;
  1168. }
  1169. };
  1170. // anonymous define
  1171. if (!name) {
  1172. // already defined anonymously -> throw
  1173. if (anonDefine)
  1174. throw new TypeError('Multiple defines for anonymous module');
  1175. anonDefine = define;
  1176. }
  1177. // named define
  1178. else {
  1179. // if it has no dependencies and we don't have any other
  1180. // defines, then let this be an anonymous define
  1181. if (deps.length == 0 && !anonDefine && !defineBundle)
  1182. anonDefine = define;
  1183. // otherwise its a bundle only
  1184. else
  1185. anonDefine = null;
  1186. // the above is just to support single modules of the form:
  1187. // define('jquery')
  1188. // still loading anonymously
  1189. // because it is done widely enough to be useful
  1190. // note this is now a bundle
  1191. defineBundle = true;
  1192. // define the module through the register registry
  1193. loader.register(name, define.deps, false, define.execute);
  1194. }
  1195. };
  1196. define.amd = {};
  1197. loader.amdDefine = define;
  1198. }
  1199. var anonDefine;
  1200. // set to true if the current module turns out to be a named define bundle
  1201. var defineBundle;
  1202. var oldModule, oldExports, oldDefine;
  1203. // adds define as a global (potentially just temporarily)
  1204. function createDefine(loader) {
  1205. if (!loader.amdDefine)
  1206. generateDefine(loader);
  1207. anonDefine = null;
  1208. defineBundle = null;
  1209. // ensure no NodeJS environment detection
  1210. var global = loader.global;
  1211. oldModule = global.module;
  1212. oldExports = global.exports;
  1213. oldDefine = global.define;
  1214. global.module = undefined;
  1215. global.exports = undefined;
  1216. if (global.define && global.define === loader.amdDefine)
  1217. return;
  1218. global.define = loader.amdDefine;
  1219. }
  1220. function removeDefine(loader) {
  1221. var global = loader.global;
  1222. global.define = oldDefine;
  1223. global.module = oldModule;
  1224. global.exports = oldExports;
  1225. }
  1226. generateDefine(loader);
  1227. if (loader.scriptLoader) {
  1228. var loaderFetch = loader.fetch;
  1229. loader.fetch = function(load) {
  1230. createDefine(this);
  1231. return loaderFetch.call(this, load);
  1232. }
  1233. }
  1234. var loaderInstantiate = loader.instantiate;
  1235. loader.instantiate = function(load) {
  1236. var loader = this;
  1237. if (load.metadata.format == 'amd' || !load.metadata.format && load.source.match(amdRegEx)) {
  1238. load.metadata.format = 'amd';
  1239. if (loader.execute !== false) {
  1240. createDefine(loader);
  1241. loader.__exec(load);
  1242. removeDefine(loader);
  1243. if (!anonDefine && !defineBundle && !isNode)
  1244. throw new TypeError('AMD module ' + load.name + ' did not define');
  1245. }
  1246. if (anonDefine) {
  1247. load.metadata.deps = load.metadata.deps ? load.metadata.deps.concat(anonDefine.deps) : anonDefine.deps;
  1248. load.metadata.execute = anonDefine.execute;
  1249. }
  1250. }
  1251. return loaderInstantiate.call(loader, load);
  1252. }
  1253. }
  1254. /*
  1255. SystemJS map support
  1256. Provides map configuration through
  1257. System.map['jquery'] = 'some/module/map'
  1258. As well as contextual map config through
  1259. System.map['bootstrap'] = {
  1260. jquery: 'some/module/map2'
  1261. }
  1262. Note that this applies for subpaths, just like RequireJS
  1263. jquery -> 'some/module/map'
  1264. jquery/path -> 'some/module/map/path'
  1265. bootstrap -> 'bootstrap'
  1266. Inside any module name of the form 'bootstrap' or 'bootstrap/*'
  1267. jquery -> 'some/module/map2'
  1268. jquery/p -> 'some/module/map2/p'
  1269. Maps are carefully applied from most specific contextual map, to least specific global map
  1270. */
  1271. function map(loader) {
  1272. loader.map = loader.map || {};
  1273. loader._extensions.push(map);
  1274. // return if prefix parts (separated by '/') match the name
  1275. // eg prefixMatch('jquery/some/thing', 'jquery') -> true
  1276. // prefixMatch('jqueryhere/', 'jquery') -> false
  1277. function prefixMatch(name, prefix) {
  1278. if (name.length < prefix.length)
  1279. return false;
  1280. if (name.substr(0, prefix.length) != prefix)
  1281. return false;
  1282. if (name[prefix.length] && name[prefix.length] != '/')
  1283. return false;
  1284. return true;
  1285. }
  1286. // get the depth of a given path
  1287. // eg pathLen('some/name') -> 2
  1288. function pathLen(name) {
  1289. var len = 1;
  1290. for (var i = 0, l = name.length; i < l; i++)
  1291. if (name[i] === '/')
  1292. len++;
  1293. return len;
  1294. }
  1295. function doMap(name, matchLen, map) {
  1296. return map + name.substr(matchLen);
  1297. }
  1298. // given a relative-resolved module name and normalized parent name,
  1299. // apply the map configuration
  1300. function applyMap(name, parentName, loader) {
  1301. var curMatch, curMatchLength = 0;
  1302. var curParent, curParentMatchLength = 0;
  1303. var tmpParentLength, tmpPrefixLength;
  1304. var subPath;
  1305. var nameParts;
  1306. // first find most specific contextual match
  1307. if (parentName) {
  1308. for (var p in loader.map) {
  1309. var curMap = loader.map[p];
  1310. if (typeof curMap != 'object')
  1311. continue;
  1312. // most specific parent match wins first
  1313. if (!prefixMatch(parentName, p))
  1314. continue;
  1315. tmpParentLength = pathLen(p);
  1316. if (tmpParentLength <= curParentMatchLength)
  1317. continue;
  1318. for (var q in curMap) {
  1319. // most specific name match wins
  1320. if (!prefixMatch(name, q))
  1321. continue;
  1322. tmpPrefixLength = pathLen(q);
  1323. if (tmpPrefixLength <= curMatchLength)
  1324. continue;
  1325. curMatch = q;
  1326. curMatchLength = tmpPrefixLength;
  1327. curParent = p;
  1328. curParentMatchLength = tmpParentLength;
  1329. }
  1330. }
  1331. }
  1332. // if we found a contextual match, apply it now
  1333. if (curMatch)
  1334. return doMap(name, curMatch.length, loader.map[curParent][curMatch]);
  1335. // now do the global map
  1336. for (var p in loader.map) {
  1337. var curMap = loader.map[p];
  1338. if (typeof curMap != 'string')
  1339. continue;
  1340. if (!prefixMatch(name, p))
  1341. continue;
  1342. var tmpPrefixLength = pathLen(p);
  1343. if (tmpPrefixLength <= curMatchLength)
  1344. continue;
  1345. curMatch = p;
  1346. curMatchLength = tmpPrefixLength;
  1347. }
  1348. if (curMatch)
  1349. return doMap(name, curMatch.length, loader.map[curMatch]);
  1350. return name;
  1351. }
  1352. var loaderNormalize = loader.normalize;
  1353. loader.normalize = function(name, parentName, parentAddress) {
  1354. var loader = this;
  1355. if (!loader.map)
  1356. loader.map = {};
  1357. var isPackage = false;
  1358. if (name.substr(name.length - 1, 1) == '/') {
  1359. isPackage = true;
  1360. name += '#';
  1361. }
  1362. return Promise.resolve(loaderNormalize.call(loader, name, parentName, parentAddress))
  1363. .then(function(name) {
  1364. name = applyMap(name, parentName, loader);
  1365. // Normalize "module/" into "module/module"
  1366. // Convenient for packages
  1367. if (isPackage) {
  1368. var nameParts = name.split('/');
  1369. nameParts.pop();
  1370. var pkgName = nameParts.pop();
  1371. nameParts.push(pkgName);
  1372. nameParts.push(pkgName);
  1373. name = nameParts.join('/');
  1374. }
  1375. return name;
  1376. });
  1377. }
  1378. }
  1379. /*
  1380. SystemJS Plugin Support
  1381. Supports plugin syntax with "!"
  1382. The plugin name is loaded as a module itself, and can override standard loader hooks
  1383. for the plugin resource. See the plugin section of the systemjs readme.
  1384. */
  1385. function plugins(loader) {
  1386. if (typeof indexOf == 'undefined')
  1387. indexOf = Array.prototype.indexOf;
  1388. loader._extensions.push(plugins);
  1389. var loaderNormalize = loader.normalize;
  1390. loader.normalize = function(name, parentName, parentAddress) {
  1391. var loader = this;
  1392. // if parent is a plugin, normalize against the parent plugin argument only
  1393. var parentPluginIndex;
  1394. if (parentName && (parentPluginIndex = parentName.indexOf('!')) != -1)
  1395. parentName = parentName.substr(0, parentPluginIndex);
  1396. return Promise.resolve(loaderNormalize.call(loader, name, parentName, parentAddress))
  1397. .then(function(name) {
  1398. // if this is a plugin, normalize the plugin name and the argument
  1399. var pluginIndex = name.lastIndexOf('!');
  1400. if (pluginIndex != -1) {
  1401. var argumentName = name.substr(0, pluginIndex);
  1402. // plugin name is part after "!" or the extension itself
  1403. var pluginName = name.substr(pluginIndex + 1) || argumentName.substr(argumentName.lastIndexOf('.') + 1);
  1404. // normalize the plugin name relative to the same parent
  1405. return new Promise(function(resolve) {
  1406. resolve(loader.normalize(pluginName, parentName, parentAddress));
  1407. })
  1408. // normalize the plugin argument
  1409. .then(function(_pluginName) {
  1410. pluginName = _pluginName;
  1411. return loader.normalize(argumentName, parentName, parentAddress);
  1412. })
  1413. .then(function(argumentName) {
  1414. return argumentName + '!' + pluginName;
  1415. });
  1416. }
  1417. // standard normalization
  1418. return name;
  1419. });
  1420. };
  1421. var loaderLocate = loader.locate;
  1422. loader.locate = function(load) {
  1423. var loader = this;
  1424. var name = load.name;
  1425. // only fetch the plugin itself if this name isn't defined
  1426. if (this.defined && this.defined[name])
  1427. return loaderLocate.call(this, load);
  1428. // plugin
  1429. var pluginIndex = name.lastIndexOf('!');
  1430. if (pluginIndex != -1) {
  1431. var pluginName = name.substr(pluginIndex + 1);
  1432. // the name to locate is the plugin argument only
  1433. load.name = name.substr(0, pluginIndex);
  1434. var pluginLoader = loader.pluginLoader || loader;
  1435. // load the plugin module
  1436. // NB ideally should use pluginLoader.load for normalized,
  1437. // but not currently working for some reason
  1438. return pluginLoader['import'](pluginName)
  1439. .then(function() {
  1440. var plugin = pluginLoader.get(pluginName);
  1441. plugin = plugin['default'] || plugin;
  1442. // allow plugins to opt-out of build
  1443. if (plugin.build === false && loader.pluginLoader)
  1444. load.metadata.build = false;
  1445. // store the plugin module itself on the metadata
  1446. load.metadata.plugin = plugin;
  1447. load.metadata.pluginName = pluginName;
  1448. load.metadata.pluginArgument = load.name;
  1449. // run plugin locate if given
  1450. if (plugin.locate)
  1451. return plugin.locate.call(loader, load);
  1452. // otherwise use standard locate without '.js' extension adding
  1453. else
  1454. return Promise.resolve(loader.locate(load))
  1455. .then(function(address) {
  1456. return address.replace(/\.js$/, '');
  1457. });
  1458. });
  1459. }
  1460. return loaderLocate.call(this, load);
  1461. };
  1462. var loaderFetch = loader.fetch;
  1463. loader.fetch = function(load) {
  1464. var loader = this;
  1465. // ignore fetching build = false unless in a plugin loader
  1466. if (load.metadata.build === false && loader.pluginLoader)
  1467. return '';
  1468. else if (load.metadata.plugin && load.metadata.plugin.fetch && !load.metadata.pluginFetchCalled) {
  1469. load.metadata.pluginFetchCalled = true;
  1470. return load.metadata.plugin.fetch.call(loader, load, loaderFetch);
  1471. }
  1472. else
  1473. return loaderFetch.call(loader, load);
  1474. }
  1475. var loaderTranslate = loader.translate;
  1476. loader.translate = function(load) {
  1477. var loader = this;
  1478. if (load.metadata.plugin && load.metadata.plugin.translate)
  1479. return Promise.resolve(load.metadata.plugin.translate.call(loader, load)).then(function(result) {
  1480. if (typeof result == 'string')
  1481. load.source = result;
  1482. return loaderTranslate.call(loader, load);
  1483. });
  1484. else
  1485. return loaderTranslate.call(loader, load);
  1486. }
  1487. var loaderInstantiate = loader.instantiate;
  1488. loader.instantiate = function(load) {
  1489. var loader = this;
  1490. if (load.metadata.plugin && load.metadata.plugin.instantiate)
  1491. return Promise.resolve(load.metadata.plugin.instantiate.call(loader, load)).then(function(result) {
  1492. load.metadata.format = 'defined';
  1493. load.metadata.execute = function() {
  1494. return result;
  1495. };
  1496. return loaderInstantiate.call(loader, load);
  1497. });
  1498. else if (load.metadata.plugin && load.metadata.plugin.build === false) {
  1499. load.metadata.format = 'defined';
  1500. load.metadata.deps.push(load.metadata.pluginName);
  1501. load.metadata.execute = function() {
  1502. return loader.newModule({});
  1503. };
  1504. return loaderInstantiate.call(loader, load);
  1505. }
  1506. else
  1507. return loaderInstantiate.call(loader, load);
  1508. }
  1509. }
  1510. /*
  1511. System bundles
  1512. Allows a bundle module to be specified which will be dynamically
  1513. loaded before trying to load a given module.
  1514. For example:
  1515. System.bundles['mybundle'] = ['jquery', 'bootstrap/js/bootstrap']
  1516. Will result in a load to "mybundle" whenever a load to "jquery"
  1517. or "bootstrap/js/bootstrap" is made.
  1518. In this way, the bundle becomes the request that provides the module
  1519. */
  1520. function bundles(loader) {
  1521. if (typeof indexOf == 'undefined')
  1522. indexOf = Array.prototype.indexOf;
  1523. loader._extensions.push(bundles);
  1524. // bundles support (just like RequireJS)
  1525. // bundle name is module name of bundle itself
  1526. // bundle is array of modules defined by the bundle
  1527. // when a module in the bundle is requested, the bundle is loaded instead
  1528. // of the form System.bundles['mybundle'] = ['jquery', 'bootstrap/js/bootstrap']
  1529. loader.bundles = loader.bundles || {};
  1530. var loadedBundles = [];
  1531. function loadFromBundle(loader, bundle) {
  1532. // we do manual normalization in case the bundle is mapped
  1533. // this is so we can still know the normalized name is a bundle
  1534. return Promise.resolve(loader.normalize(bundle))
  1535. .then(function(normalized) {
  1536. if (indexOf.call(loadedBundles, normalized) == -1) {
  1537. loadedBundles.push(normalized);
  1538. loader.bundles[normalized] = loader.bundles[normalized] || loader.bundles[bundle];
  1539. // note this module is a bundle in the meta
  1540. loader.meta = loader.meta || {};
  1541. loader.meta[normalized] = loader.meta[normalized] || {};
  1542. loader.meta[normalized].bundle = true;
  1543. }
  1544. return loader.load(normalized);
  1545. })
  1546. .then(function() {
  1547. return '';
  1548. });
  1549. }
  1550. var loaderFetch = loader.fetch;
  1551. loader.fetch = function(load) {
  1552. var loader = this;
  1553. if (loader.trace)
  1554. return loaderFetch.call(this, load);
  1555. if (!loader.bundles)
  1556. loader.bundles = {};
  1557. // check what bundles we've already loaded
  1558. for (var i = 0; i < loadedBundles.length; i++) {
  1559. if (indexOf.call(loader.bundles[loadedBundles[i]], load.name) == -1)
  1560. continue;
  1561. return loadFromBundle(loader, loadedBundles[i]);
  1562. }
  1563. // if this module is in a bundle, load the bundle first then
  1564. for (var b in loader.bundles) {
  1565. if (indexOf.call(loader.bundles[b], load.name) == -1)
  1566. continue;
  1567. return loadFromBundle(loader, b);
  1568. }
  1569. return loaderFetch.call(this, load);
  1570. }
  1571. }
  1572. /*
  1573. SystemJS Semver Version Addon
  1574. 1. Uses Semver convention for major and minor forms
  1575. Supports requesting a module from a package that contains a version suffix
  1576. with the following semver ranges:
  1577. module - any version
  1578. module@1 - major version 1, any minor (not prerelease)
  1579. module@1.2 - minor version 1.2, any patch (not prerelease)
  1580. module@1.2.3 - exact version
  1581. It is assumed that these modules are provided by the server / file system.
  1582. First checks the already-requested packages to see if there are any packages
  1583. that would match the same package and version range.
  1584. This provides a greedy algorithm as a simple fix for sharing version-managed
  1585. dependencies as much as possible, which can later be optimized through version
  1586. hint configuration created out of deeper version tree analysis.
  1587. 2. Semver-compatibility syntax (caret operator - ^)
  1588. Compatible version request support is then also provided for:
  1589. module@^1.2.3 - module@1, >=1.2.3
  1590. module@^1.2 - module@1, >=1.2.0
  1591. module@^1 - module@1
  1592. module@^0.5.3 - module@0.5, >= 0.5.3
  1593. module@^0.0.1 - module@0.0.1
  1594. The ^ symbol is always normalized out to a normal version request.
  1595. This provides comprehensive semver compatibility.
  1596. 3. System.versions version hints and version report
  1597. Note this addon should be provided after all other normalize overrides.
  1598. The full list of versions can be found at System.versions providing an insight
  1599. into any possible version forks.
  1600. It is also possible to create version solution hints on the System global:
  1601. System.versions = {
  1602. jquery: ['1.9.2', '2.0.3'],
  1603. bootstrap: '3.0.1'
  1604. };
  1605. Versions can be an array or string for a single version.
  1606. When a matching semver request is made (jquery@1.9, jquery@1, bootstrap@3)
  1607. they will be converted to the latest version match contained here, if present.
  1608. Prereleases in this versions list are also allowed to satisfy ranges when present.
  1609. */
  1610. function versions(loader) {
  1611. if (typeof indexOf == 'undefined')
  1612. indexOf = Array.prototype.indexOf;
  1613. loader._extensions.push(versions);
  1614. var semverRegEx = /^(\d+)(?:\.(\d+)(?:\.(\d+)(?:-([\da-z-]+(?:\.[\da-z-]+)*)(?:\+([\da-z-]+(?:\.[\da-z-]+)*))?)?)?)?$/i;
  1615. var numRegEx = /^\d+$/;
  1616. function toInt(num) {
  1617. return parseInt(num, 10);
  1618. }
  1619. function parseSemver(v) {
  1620. var semver = v.match(semverRegEx);
  1621. if (!semver)
  1622. return {
  1623. tag: v
  1624. };
  1625. else
  1626. return {
  1627. major: toInt(semver[1]),
  1628. minor: toInt(semver[2]),
  1629. patch: toInt(semver[3]),
  1630. pre: semver[4] && semver[4].split('.')
  1631. };
  1632. }
  1633. var parts = ['major', 'minor', 'patch'];
  1634. function semverCompareParsed(v1, v2) {
  1635. // not semvers - tags have equal precedence
  1636. if (v1.tag && v2.tag)
  1637. return 0;
  1638. // semver beats non-semver
  1639. if (v1.tag)
  1640. return -1;
  1641. if (v2.tag)
  1642. return 1;
  1643. // compare version numbers
  1644. for (var i = 0; i < parts.length; i++) {
  1645. var part = parts[i];
  1646. var part1 = v1[part];
  1647. var part2 = v2[part];
  1648. if (part1 == part2)
  1649. continue;
  1650. if (isNaN(part1))
  1651. return -1;
  1652. if (isNaN(part2))
  1653. return 1;
  1654. return part1 > part2 ? 1 : -1;
  1655. }
  1656. if (!v1.pre && !v2.pre)
  1657. return 0;
  1658. if (!v1.pre)
  1659. return 1;
  1660. if (!v2.pre)
  1661. return -1;
  1662. // prerelease comparison
  1663. for (var i = 0, l = Math.min(v1.pre.length, v2.pre.length); i < l; i++) {
  1664. if (v1.pre[i] == v2.pre[i])
  1665. continue;
  1666. var isNum1 = v1.pre[i].match(numRegEx);
  1667. var isNum2 = v2.pre[i].match(numRegEx);
  1668. // numeric has lower precedence
  1669. if (isNum1 && !isNum2)
  1670. return -1;
  1671. if (isNum2 && !isNum1)
  1672. return 1;
  1673. // compare parts
  1674. if (isNum1 && isNum2)
  1675. return toInt(v1.pre[i]) > toInt(v2.pre[i]) ? 1 : -1;
  1676. else
  1677. return v1.pre[i] > v2.pre[i] ? 1 : -1;
  1678. }
  1679. if (v1.pre.length == v2.pre.length)
  1680. return 0;
  1681. // more pre-release fields win if equal
  1682. return v1.pre.length > v2.pre.length ? 1 : -1;
  1683. }
  1684. // match against a parsed range object
  1685. // saves operation repetition
  1686. // doesn't support tags
  1687. // if not semver or fuzzy, assume exact
  1688. function matchParsed(range, version) {
  1689. var rangeVersion = range.version;
  1690. if (rangeVersion.tag)
  1691. return rangeVersion.tag == version.tag;
  1692. // if the version is less than the range, it's not a match
  1693. if (semverCompareParsed(rangeVersion, version) == 1)
  1694. return false;
  1695. // now we just have to check that the version isn't too high for the range
  1696. if (isNaN(version.minor) || isNaN(version.patch))
  1697. return false;
  1698. // if the version has a prerelease, ensure the range version has a prerelease in it
  1699. // and that we match the range version up to the prerelease exactly
  1700. if (version.pre) {
  1701. if (!(rangeVersion.major == version.major && rangeVersion.minor == version.minor && rangeVersion.patch == version.patch))
  1702. return false;
  1703. return range.semver || range.fuzzy || rangeVersion.pre.join('.') == version.pre.join('.');
  1704. }
  1705. // check semver range
  1706. if (range.semver) {
  1707. // ^0
  1708. if (rangeVersion.major == 0 && isNaN(rangeVersion.minor))
  1709. return version.major < 1;
  1710. // ^1..
  1711. else if (rangeVersion.major >= 1)
  1712. return rangeVersion.major == version.major;
  1713. // ^0.1, ^0.2
  1714. else if (rangeVersion.minor >= 1)
  1715. return rangeVersion.minor == version.minor;
  1716. // ^0.0.0
  1717. else
  1718. return (rangeVersion.patch || 0) == version.patch;
  1719. }
  1720. // check fuzzy range
  1721. if (range.fuzzy)
  1722. return version.major == rangeVersion.major && version.minor < (rangeVersion.minor || 0) + 1;
  1723. // exact match
  1724. // eg 001.002.003 matches 1.2.3
  1725. return !rangeVersion.pre && rangeVersion.major == version.major && rangeVersion.minor == version.minor && rangeVersion.patch == version.patch;
  1726. }
  1727. /*
  1728. * semver - is this a semver range
  1729. * fuzzy - is this a fuzzy range
  1730. * version - the parsed version object
  1731. */
  1732. function parseRange(range) {
  1733. var rangeObj = {};
  1734. ((rangeObj.semver = range.substr(0, 1) == '^')
  1735. || (rangeObj.fuzzy = range.substr(0, 1) == '~')
  1736. ) && (range = range.substr(1));
  1737. var rangeVersion = rangeObj.version = parseSemver(range);
  1738. if (rangeVersion.tag)
  1739. return rangeObj;
  1740. // 0, 0.1 behave like ~0, ~0.1
  1741. if (!rangeObj.fuzzy && !rangeObj.semver && (isNaN(rangeVersion.minor) || isNaN(rangeVersion.patch)))
  1742. rangeObj.fuzzy = true;
  1743. // ~1, ~0 behave like ^1, ^0
  1744. if (rangeObj.fuzzy && isNaN(rangeVersion.minor)) {
  1745. rangeObj.semver = true;
  1746. rangeObj.fuzzy = false;
  1747. }
  1748. // ^0.0 behaves like ~0.0
  1749. if (rangeObj.semver && !isNaN(rangeVersion.minor) && isNaN(rangeVersion.patch)) {
  1750. rangeObj.semver = false;
  1751. rangeObj.fuzzy = true;
  1752. }
  1753. return rangeObj;
  1754. }
  1755. function semverCompare(v1, v2) {
  1756. return semverCompareParsed(parseSemver(v1), parseSemver(v2));
  1757. }
  1758. loader.versions = loader.versions || {};
  1759. var loaderNormalize = loader.normalize;
  1760. // NOW use modified match algorithm if possible
  1761. loader.normalize = function(name, parentName, parentAddress) {
  1762. if (!this.versions)
  1763. this.versions = {};
  1764. var packageVersions = this.versions;
  1765. // strip the version before applying map config
  1766. var stripVersion, stripSubPathLength;
  1767. var versionIndex = name.indexOf('!') != -1 ? 0 : name.lastIndexOf('@');
  1768. if (versionIndex > 0) {
  1769. var parts = name.substr(versionIndex + 1, name.length - versionIndex - 1).split('/');
  1770. stripVersion = parts[0];
  1771. stripSubPathLength = parts.length;
  1772. name = name.substr(0, versionIndex) + name.substr(versionIndex + stripVersion.length + 1, name.length - versionIndex - stripVersion.length - 1);
  1773. }
  1774. // run all other normalizers first
  1775. return Promise.resolve(loaderNormalize.call(this, name, parentName, parentAddress)).then(function(normalized) {
  1776. var index = normalized.indexOf('!') != -1 ? 0 : normalized.indexOf('@');
  1777. // if we stripped a version, and it still has no version, add it back
  1778. if (stripVersion && (index == -1 || index == 0)) {
  1779. var parts = normalized.split('/');
  1780. parts[parts.length - stripSubPathLength] += '@' + stripVersion;
  1781. normalized = parts.join('/');
  1782. index = normalized.indexOf('@');
  1783. }
  1784. // see if this module corresponds to a package already in our versioned packages list
  1785. // no version specified - check against the list (given we don't know the package name)
  1786. var nextChar, versions;
  1787. if (index == -1 || index == 0) {
  1788. for (var p in packageVersions) {
  1789. versions = packageVersions[p];
  1790. if (normalized.substr(0, p.length) != p)
  1791. continue;
  1792. nextChar = normalized.substr(p.length, 1);
  1793. if (nextChar && nextChar != '/')
  1794. continue;
  1795. // match -> take latest version
  1796. return p + '@' + (typeof versions == 'string' ? versions : versions[versions.length - 1]) + normalized.substr(p.length);
  1797. }
  1798. return normalized;
  1799. }
  1800. // get the version info
  1801. var packageName = normalized.substr(0, index);
  1802. var range = normalized.substr(index + 1).split('/')[0];
  1803. var rangeLength = range.length;
  1804. var parsedRange = parseRange(normalized.substr(index + 1).split('/')[0]);
  1805. versions = packageVersions[normalized.substr(0, index)] || [];
  1806. if (typeof versions == 'string')
  1807. versions = [versions];
  1808. // find a match in our version list
  1809. for (var i = versions.length - 1; i >= 0; i--) {
  1810. if (matchParsed(parsedRange, parseSemver(versions[i])))
  1811. return packageName + '@' + versions[i] + normalized.substr(index + rangeLength + 1);
  1812. }
  1813. // no match found -> send a request to the server
  1814. var versionRequest;
  1815. if (parsedRange.semver) {
  1816. versionRequest = parsedRange.version.major == 0 && !isNaN(parsedRange.version.minor) ? '0.' + parsedRange.version.minor : parsedRange.version.major;
  1817. }
  1818. else if (parsedRange.fuzzy) {
  1819. versionRequest = parsedRange.version.major + '.' + parsedRange.version.minor;
  1820. }
  1821. else {
  1822. versionRequest = range;
  1823. versions.push(range);
  1824. versions.sort(semverCompare);
  1825. packageVersions[packageName] = versions.length == 1 ? versions[0] : versions;
  1826. }
  1827. return packageName + '@' + versionRequest + normalized.substr(index + rangeLength + 1);
  1828. });
  1829. }
  1830. }
  1831. /*
  1832. * Dependency Tree Cache
  1833. *
  1834. * Allows a build to pre-populate a dependency trace tree on the loader of
  1835. * the expected dependency tree, to be loaded upfront when requesting the
  1836. * module, avoinding the n round trips latency of module loading, where
  1837. * n is the dependency tree depth.
  1838. *
  1839. * eg:
  1840. * System.depCache = {
  1841. * 'app': ['normalized', 'deps'],
  1842. * 'normalized': ['another'],
  1843. * 'deps': ['tree']
  1844. * };
  1845. *
  1846. * System.import('app')
  1847. * // simultaneously starts loading all of:
  1848. * // 'normalized', 'deps', 'another', 'tree'
  1849. * // before "app" source is even loaded
  1850. */
  1851. function depCache(loader) {
  1852. loader.depCache = loader.depCache || {};
  1853. loader._extensions.push(depCache);
  1854. var loaderLocate = loader.locate;
  1855. loader.locate = function(load) {
  1856. var loader = this;
  1857. if (!loader.depCache)
  1858. loader.depCache = {};
  1859. // load direct deps, in turn will pick up their trace trees
  1860. var deps = loader.depCache[load.name];
  1861. if (deps)
  1862. for (var i = 0; i < deps.length; i++)
  1863. loader.load(deps[i]);
  1864. return loaderLocate.call(loader, load);
  1865. }
  1866. }
  1867. core(System);
  1868. meta(System);
  1869. register(System);
  1870. es6(System);
  1871. global(System);
  1872. cjs(System);
  1873. amd(System);
  1874. map(System);
  1875. plugins(System);
  1876. bundles(System);
  1877. versions(System);
  1878. depCache(System);
  1879. };
  1880. var $__curScript, __eval;
  1881. (function() {
  1882. var doEval;
  1883. __eval = function(source, address, sourceMap) {
  1884. source += '\n//# sourceURL=' + address + (sourceMap ? '\n//# sourceMappingURL=' + sourceMap : '');
  1885. try {
  1886. doEval(source);
  1887. }
  1888. catch(e) {
  1889. var msg = 'Error evaluating ' + address + '\n';
  1890. if (e instanceof Error)
  1891. e.message = msg + e.message;
  1892. else
  1893. e = msg + e;
  1894. throw e;
  1895. }
  1896. };
  1897. if (typeof document != 'undefined') {
  1898. var head;
  1899. var scripts = document.getElementsByTagName('script');
  1900. $__curScript = scripts[scripts.length - 1];
  1901. // globally scoped eval for the browser
  1902. doEval = function(source) {
  1903. if (!head)
  1904. head = document.head || document.body || document.documentElement;
  1905. var script = document.createElement('script');
  1906. script.text = source;
  1907. var onerror = window.onerror;
  1908. var e;
  1909. window.onerror = function(_e) {
  1910. e = _e;
  1911. }
  1912. head.appendChild(script);
  1913. head.removeChild(script);
  1914. window.onerror = onerror;
  1915. if (e)
  1916. throw e;
  1917. }
  1918. if (!$__global.System || !$__global.LoaderPolyfill) {
  1919. // determine the current script path as the base path
  1920. var curPath = $__curScript.src;
  1921. var basePath = curPath.substr(0, curPath.lastIndexOf('/') + 1);
  1922. document.write(
  1923. '<' + 'script type="text/javascript" src="' + basePath + 'es6-module-loader.js" data-init="upgradeSystemLoader">' + '<' + '/script>'
  1924. );
  1925. }
  1926. else {
  1927. $__global.upgradeSystemLoader();
  1928. }
  1929. }
  1930. else if (typeof importScripts != 'undefined') {
  1931. doEval = function(source) {
  1932. try {
  1933. eval(source);
  1934. } catch(e) {
  1935. throw e;
  1936. }
  1937. };
  1938. if (!$__global.System || !$__global.LoaderPolyfill) {
  1939. var basePath = '';
  1940. try {
  1941. throw new Error('Get worker base path via error stack');
  1942. } catch (e) {
  1943. e.stack.replace(/(?:at|@).*(http.+):[\d]+:[\d]+/, function (m, url) {
  1944. basePath = url.replace(/\/[^\/]*$/, '/');
  1945. });
  1946. }
  1947. importScripts(basePath + 'es6-module-loader.js');
  1948. $__global.upgradeSystemLoader();
  1949. } else {
  1950. $__global.upgradeSystemLoader();
  1951. }
  1952. }
  1953. else {
  1954. var es6ModuleLoader = require('es6-module-loader');
  1955. $__global.System = es6ModuleLoader.System;
  1956. $__global.Loader = es6ModuleLoader.Loader;
  1957. $__global.upgradeSystemLoader();
  1958. module.exports = $__global.System;
  1959. // global scoped eval for node
  1960. var vm = require('vm');
  1961. doEval = function(source, address, sourceMap) {
  1962. vm.runInThisContext(source);
  1963. }
  1964. }
  1965. })();
  1966. })(typeof window != 'undefined' ? window : (typeof global != 'undefined' ? global : self),
  1967. typeof window != 'undefined' ? 'window' : (typeof global != 'undefined' ? 'global' : 'self'));