browser-es-module-loader.js 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486
  1. (function (global, factory) {
  2. typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  3. typeof define === 'function' && define.amd ? define(factory) :
  4. (global.BrowserESModuleLoader = factory());
  5. }(this, (function () { 'use strict';
  6. /*
  7. * Environment
  8. */
  9. var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
  10. var isNode = typeof process !== 'undefined' && process.versions && process.versions.node;
  11. var isWindows = typeof process !== 'undefined' && typeof process.platform === 'string' && process.platform.match(/^win/);
  12. var envGlobal = typeof self !== 'undefined' ? self : global;
  13. /*
  14. * Simple Symbol() shim
  15. */
  16. var hasSymbol = typeof Symbol !== 'undefined';
  17. function createSymbol (name) {
  18. return hasSymbol ? Symbol() : '@@' + name;
  19. }
  20. var toStringTag = hasSymbol && Symbol.toStringTag;
  21. /*
  22. * Environment baseURI
  23. */
  24. var baseURI;
  25. // environent baseURI detection
  26. if (typeof document != 'undefined' && document.getElementsByTagName) {
  27. baseURI = document.baseURI;
  28. if (!baseURI) {
  29. var bases = document.getElementsByTagName('base');
  30. baseURI = bases[0] && bases[0].href || window.location.href;
  31. }
  32. }
  33. else if (typeof location != 'undefined') {
  34. baseURI = location.href;
  35. }
  36. // sanitize out the hash and querystring
  37. if (baseURI) {
  38. baseURI = baseURI.split('#')[0].split('?')[0];
  39. var slashIndex = baseURI.lastIndexOf('/');
  40. if (slashIndex !== -1)
  41. baseURI = baseURI.substr(0, slashIndex + 1);
  42. }
  43. else if (typeof process !== 'undefined' && process.cwd) {
  44. baseURI = 'file://' + (isWindows ? '/' : '') + process.cwd();
  45. if (isWindows)
  46. baseURI = baseURI.replace(/\\/g, '/');
  47. }
  48. else {
  49. throw new TypeError('No environment baseURI');
  50. }
  51. // ensure baseURI has trailing "/"
  52. if (baseURI[baseURI.length - 1] !== '/')
  53. baseURI += '/';
  54. /*
  55. * LoaderError with chaining for loader stacks
  56. */
  57. var errArgs = new Error(0, '_').fileName == '_';
  58. function LoaderError__Check_error_message_for_loader_stack (childErr, newMessage) {
  59. // Convert file:/// URLs to paths in Node
  60. if (!isBrowser)
  61. newMessage = newMessage.replace(isWindows ? /file:\/\/\//g : /file:\/\//g, '');
  62. var message = (childErr.message || childErr) + '\n ' + newMessage;
  63. var err;
  64. if (errArgs && childErr.fileName)
  65. err = new Error(message, childErr.fileName, childErr.lineNumber);
  66. else
  67. err = new Error(message);
  68. var stack = childErr.originalErr ? childErr.originalErr.stack : childErr.stack;
  69. if (isNode)
  70. // node doesn't show the message otherwise
  71. err.stack = message + '\n ' + stack;
  72. else
  73. err.stack = stack;
  74. err.originalErr = childErr.originalErr || childErr;
  75. return err;
  76. }
  77. var resolvedPromise$1 = Promise.resolve();
  78. /*
  79. * Simple Array values shim
  80. */
  81. function arrayValues (arr) {
  82. if (arr.values)
  83. return arr.values();
  84. if (typeof Symbol === 'undefined' || !Symbol.iterator)
  85. throw new Error('Symbol.iterator not supported in this browser');
  86. var iterable = {};
  87. iterable[Symbol.iterator] = function () {
  88. var keys = Object.keys(arr);
  89. var keyIndex = 0;
  90. return {
  91. next: function () {
  92. if (keyIndex < keys.length)
  93. return {
  94. value: arr[keys[keyIndex++]],
  95. done: false
  96. };
  97. else
  98. return {
  99. value: undefined,
  100. done: true
  101. };
  102. }
  103. };
  104. };
  105. return iterable;
  106. }
  107. /*
  108. * 3. Reflect.Loader
  109. *
  110. * We skip the entire native internal pipeline, just providing the bare API
  111. */
  112. // 3.1.1
  113. function Loader () {
  114. this.registry = new Registry();
  115. }
  116. // 3.3.1
  117. Loader.prototype.constructor = Loader;
  118. function ensureInstantiated (module) {
  119. if (module === undefined)
  120. return;
  121. if (module instanceof ModuleNamespace === false && module[toStringTag] !== 'module')
  122. throw new TypeError('Module instantiation did not return a valid namespace object.');
  123. return module;
  124. }
  125. // 3.3.2
  126. Loader.prototype.import = function (key, parent) {
  127. if (typeof key !== 'string')
  128. throw new TypeError('Loader import method must be passed a module key string');
  129. // custom resolveInstantiate combined hook for better perf
  130. var loader = this;
  131. return resolvedPromise$1
  132. .then(function () {
  133. return loader[RESOLVE_INSTANTIATE](key, parent);
  134. })
  135. .then(ensureInstantiated)
  136. //.then(Module.evaluate)
  137. .catch(function (err) {
  138. throw LoaderError__Check_error_message_for_loader_stack(err, 'Loading ' + key + (parent ? ' from ' + parent : ''));
  139. });
  140. };
  141. // 3.3.3
  142. var RESOLVE = Loader.resolve = createSymbol('resolve');
  143. /*
  144. * Combined resolve / instantiate hook
  145. *
  146. * Not in current reduced spec, but necessary to separate RESOLVE from RESOLVE + INSTANTIATE as described
  147. * in the spec notes of this repo to ensure that loader.resolve doesn't instantiate when not wanted.
  148. *
  149. * We implement RESOLVE_INSTANTIATE as a single hook instead of a separate INSTANTIATE in order to avoid
  150. * the need for double registry lookups as a performance optimization.
  151. */
  152. var RESOLVE_INSTANTIATE = Loader.resolveInstantiate = createSymbol('resolveInstantiate');
  153. // default resolveInstantiate is just to call resolve and then get from the registry
  154. // this provides compatibility for the resolveInstantiate optimization
  155. Loader.prototype[RESOLVE_INSTANTIATE] = function (key, parent) {
  156. var loader = this;
  157. return loader.resolve(key, parent)
  158. .then(function (resolved) {
  159. return loader.registry.get(resolved);
  160. });
  161. };
  162. function ensureResolution (resolvedKey) {
  163. if (resolvedKey === undefined)
  164. throw new RangeError('No resolution found.');
  165. return resolvedKey;
  166. }
  167. Loader.prototype.resolve = function (key, parent) {
  168. var loader = this;
  169. return resolvedPromise$1
  170. .then(function() {
  171. return loader[RESOLVE](key, parent);
  172. })
  173. .then(ensureResolution)
  174. .catch(function (err) {
  175. throw LoaderError__Check_error_message_for_loader_stack(err, 'Resolving ' + key + (parent ? ' to ' + parent : ''));
  176. });
  177. };
  178. // 3.3.4 (import without evaluate)
  179. // this is not documented because the use of deferred evaluation as in Module.evaluate is not
  180. // documented, as it is not considered a stable feature to be encouraged
  181. // Loader.prototype.load may well be deprecated if this stays disabled
  182. /* Loader.prototype.load = function (key, parent) {
  183. return Promise.resolve(this[RESOLVE_INSTANTIATE](key, parent || this.key))
  184. .catch(function (err) {
  185. throw addToError(err, 'Loading ' + key + (parent ? ' from ' + parent : ''));
  186. });
  187. }; */
  188. /*
  189. * 4. Registry
  190. *
  191. * Instead of structuring through a Map, just use a dictionary object
  192. * We throw for construction attempts so this doesn't affect the public API
  193. *
  194. * Registry has been adjusted to use Namespace objects over ModuleStatus objects
  195. * as part of simplifying loader API implementation
  196. */
  197. var iteratorSupport = typeof Symbol !== 'undefined' && Symbol.iterator;
  198. var REGISTRY = createSymbol('registry');
  199. function Registry() {
  200. this[REGISTRY] = {};
  201. }
  202. // 4.4.1
  203. if (iteratorSupport) {
  204. // 4.4.2
  205. Registry.prototype[Symbol.iterator] = function () {
  206. return this.entries()[Symbol.iterator]();
  207. };
  208. // 4.4.3
  209. Registry.prototype.entries = function () {
  210. var registry = this[REGISTRY];
  211. return arrayValues(Object.keys(registry).map(function (key) {
  212. return [key, registry[key]];
  213. }));
  214. };
  215. }
  216. // 4.4.4
  217. Registry.prototype.keys = function () {
  218. return arrayValues(Object.keys(this[REGISTRY]));
  219. };
  220. // 4.4.5
  221. Registry.prototype.values = function () {
  222. var registry = this[REGISTRY];
  223. return arrayValues(Object.keys(registry).map(function (key) {
  224. return registry[key];
  225. }));
  226. };
  227. // 4.4.6
  228. Registry.prototype.get = function (key) {
  229. return this[REGISTRY][key];
  230. };
  231. // 4.4.7
  232. Registry.prototype.set = function (key, namespace) {
  233. if (!(namespace instanceof ModuleNamespace || namespace[toStringTag] === 'module'))
  234. throw new Error('Registry must be set with an instance of Module Namespace');
  235. this[REGISTRY][key] = namespace;
  236. return this;
  237. };
  238. // 4.4.8
  239. Registry.prototype.has = function (key) {
  240. return Object.hasOwnProperty.call(this[REGISTRY], key);
  241. };
  242. // 4.4.9
  243. Registry.prototype.delete = function (key) {
  244. if (Object.hasOwnProperty.call(this[REGISTRY], key)) {
  245. delete this[REGISTRY][key];
  246. return true;
  247. }
  248. return false;
  249. };
  250. /*
  251. * Simple ModuleNamespace Exotic object based on a baseObject
  252. * We export this for allowing a fast-path for module namespace creation over Module descriptors
  253. */
  254. // var EVALUATE = createSymbol('evaluate');
  255. var BASE_OBJECT = createSymbol('baseObject');
  256. // 8.3.1 Reflect.Module
  257. /*
  258. * Best-effort simplified non-spec implementation based on
  259. * a baseObject referenced via getters.
  260. *
  261. * Allows:
  262. *
  263. * loader.registry.set('x', new Module({ default: 'x' }));
  264. *
  265. * Optional evaluation function provides experimental Module.evaluate
  266. * support for non-executed modules in registry.
  267. */
  268. function ModuleNamespace (baseObject/*, evaluate*/) {
  269. Object.defineProperty(this, BASE_OBJECT, {
  270. value: baseObject
  271. });
  272. // evaluate defers namespace population
  273. /* if (evaluate) {
  274. Object.defineProperty(this, EVALUATE, {
  275. value: evaluate,
  276. configurable: true,
  277. writable: true
  278. });
  279. }
  280. else { */
  281. Object.keys(baseObject).forEach(extendNamespace, this);
  282. //}
  283. }
  284. // 8.4.2
  285. ModuleNamespace.prototype = Object.create(null);
  286. if (toStringTag)
  287. Object.defineProperty(ModuleNamespace.prototype, toStringTag, {
  288. value: 'Module'
  289. });
  290. function extendNamespace (key) {
  291. Object.defineProperty(this, key, {
  292. enumerable: true,
  293. get: function () {
  294. return this[BASE_OBJECT][key];
  295. }
  296. });
  297. }
  298. /* function doEvaluate (evaluate, context) {
  299. try {
  300. evaluate.call(context);
  301. }
  302. catch (e) {
  303. return e;
  304. }
  305. }
  306. // 8.4.1 Module.evaluate... not documented or used because this is potentially unstable
  307. Module.evaluate = function (ns) {
  308. var evaluate = ns[EVALUATE];
  309. if (evaluate) {
  310. ns[EVALUATE] = undefined;
  311. var err = doEvaluate(evaluate);
  312. if (err) {
  313. // cache the error
  314. ns[EVALUATE] = function () {
  315. throw err;
  316. };
  317. throw err;
  318. }
  319. Object.keys(ns[BASE_OBJECT]).forEach(extendNamespace, ns);
  320. }
  321. // make chainable
  322. return ns;
  323. }; */
  324. /*
  325. * Optimized URL normalization assuming a syntax-valid URL parent
  326. */
  327. function throwResolveError (relUrl, parentUrl) {
  328. throw new RangeError('Unable to resolve "' + relUrl + '" to ' + parentUrl);
  329. }
  330. var backslashRegEx = /\\/g;
  331. function resolveIfNotPlain (relUrl, parentUrl) {
  332. if (relUrl[0] === ' ' || relUrl[relUrl.length - 1] === ' ')
  333. relUrl = relUrl.trim();
  334. var parentProtocol = parentUrl && parentUrl.substr(0, parentUrl.indexOf(':') + 1);
  335. var firstChar = relUrl[0];
  336. var secondChar = relUrl[1];
  337. // protocol-relative
  338. if (firstChar === '/' && secondChar === '/') {
  339. if (!parentProtocol)
  340. throwResolveError(relUrl, parentUrl);
  341. if (relUrl.indexOf('\\') !== -1)
  342. relUrl = relUrl.replace(backslashRegEx, '/');
  343. return parentProtocol + relUrl;
  344. }
  345. // relative-url
  346. else if (firstChar === '.' && (secondChar === '/' || secondChar === '.' && (relUrl[2] === '/' || relUrl.length === 2 && (relUrl += '/')) ||
  347. relUrl.length === 1 && (relUrl += '/')) ||
  348. firstChar === '/') {
  349. if (relUrl.indexOf('\\') !== -1)
  350. relUrl = relUrl.replace(backslashRegEx, '/');
  351. var parentIsPlain = !parentProtocol || parentUrl[parentProtocol.length] !== '/';
  352. // read pathname from parent if a URL
  353. // pathname taken to be part after leading "/"
  354. var pathname;
  355. if (parentIsPlain) {
  356. // resolving to a plain parent -> skip standard URL prefix, and treat entire parent as pathname
  357. if (parentUrl === undefined)
  358. throwResolveError(relUrl, parentUrl);
  359. pathname = parentUrl;
  360. }
  361. else if (parentUrl[parentProtocol.length + 1] === '/') {
  362. // resolving to a :// so we need to read out the auth and host
  363. if (parentProtocol !== 'file:') {
  364. pathname = parentUrl.substr(parentProtocol.length + 2);
  365. pathname = pathname.substr(pathname.indexOf('/') + 1);
  366. }
  367. else {
  368. pathname = parentUrl.substr(8);
  369. }
  370. }
  371. else {
  372. // resolving to :/ so pathname is the /... part
  373. pathname = parentUrl.substr(parentProtocol.length + 1);
  374. }
  375. if (firstChar === '/') {
  376. if (parentIsPlain)
  377. throwResolveError(relUrl, parentUrl);
  378. else
  379. return parentUrl.substr(0, parentUrl.length - pathname.length - 1) + relUrl;
  380. }
  381. // join together and split for removal of .. and . segments
  382. // looping the string instead of anything fancy for perf reasons
  383. // '../../../../../z' resolved to 'x/y' is just 'z' regardless of parentIsPlain
  384. var segmented = pathname.substr(0, pathname.lastIndexOf('/') + 1) + relUrl;
  385. var output = [];
  386. var segmentIndex = -1;
  387. for (var i = 0; i < segmented.length; i++) {
  388. // busy reading a segment - only terminate on '/'
  389. if (segmentIndex !== -1) {
  390. if (segmented[i] === '/') {
  391. output.push(segmented.substring(segmentIndex, i + 1));
  392. segmentIndex = -1;
  393. }
  394. continue;
  395. }
  396. // new segment - check if it is relative
  397. if (segmented[i] === '.') {
  398. // ../ segment
  399. if (segmented[i + 1] === '.' && (segmented[i + 2] === '/' || i + 2 === segmented.length)) {
  400. output.pop();
  401. i += 2;
  402. }
  403. // ./ segment
  404. else if (segmented[i + 1] === '/' || i + 1 === segmented.length) {
  405. i += 1;
  406. }
  407. else {
  408. // the start of a new segment as below
  409. segmentIndex = i;
  410. continue;
  411. }
  412. // this is the plain URI backtracking error (../, package:x -> error)
  413. if (parentIsPlain && output.length === 0)
  414. throwResolveError(relUrl, parentUrl);
  415. continue;
  416. }
  417. // it is the start of a new segment
  418. segmentIndex = i;
  419. }
  420. // finish reading out the last segment
  421. if (segmentIndex !== -1)
  422. output.push(segmented.substr(segmentIndex));
  423. return parentUrl.substr(0, parentUrl.length - pathname.length) + output.join('');
  424. }
  425. // sanitizes and verifies (by returning undefined if not a valid URL-like form)
  426. // Windows filepath compatibility is an added convenience here
  427. var protocolIndex = relUrl.indexOf(':');
  428. if (protocolIndex !== -1) {
  429. if (isNode) {
  430. // C:\x becomes file:///c:/x (we don't support C|\x)
  431. if (relUrl[1] === ':' && relUrl[2] === '\\' && relUrl[0].match(/[a-z]/i))
  432. return 'file:///' + relUrl.replace(backslashRegEx, '/');
  433. }
  434. return relUrl;
  435. }
  436. }
  437. var resolvedPromise = Promise.resolve();
  438. /*
  439. * Register Loader
  440. *
  441. * Builds directly on top of loader polyfill to provide:
  442. * - loader.register support
  443. * - hookable higher-level resolve
  444. * - instantiate hook returning a ModuleNamespace or undefined for es module loading
  445. * - loader error behaviour as in HTML and loader specs, caching load and eval errors separately
  446. * - build tracing support by providing a .trace=true and .loads object format
  447. */
  448. var REGISTER_INTERNAL = createSymbol('register-internal');
  449. function RegisterLoader$1 () {
  450. Loader.call(this);
  451. var registryDelete = this.registry.delete;
  452. this.registry.delete = function (key) {
  453. var deleted = registryDelete.call(this, key);
  454. // also delete from register registry if linked
  455. if (records.hasOwnProperty(key) && !records[key].linkRecord) {
  456. delete records[key];
  457. deleted = true;
  458. }
  459. return deleted;
  460. };
  461. var records = {};
  462. this[REGISTER_INTERNAL] = {
  463. // last anonymous System.register call
  464. lastRegister: undefined,
  465. // in-flight es module load records
  466. records: records
  467. };
  468. // tracing
  469. this.trace = false;
  470. }
  471. RegisterLoader$1.prototype = Object.create(Loader.prototype);
  472. RegisterLoader$1.prototype.constructor = RegisterLoader$1;
  473. var INSTANTIATE = RegisterLoader$1.instantiate = createSymbol('instantiate');
  474. // default normalize is the WhatWG style normalizer
  475. RegisterLoader$1.prototype[RegisterLoader$1.resolve = Loader.resolve] = function (key, parentKey) {
  476. return resolveIfNotPlain(key, parentKey || baseURI);
  477. };
  478. RegisterLoader$1.prototype[INSTANTIATE] = function (key, processAnonRegister) {};
  479. // once evaluated, the linkRecord is set to undefined leaving just the other load record properties
  480. // this allows tracking new binding listeners for es modules through importerSetters
  481. // for dynamic modules, the load record is removed entirely.
  482. function createLoadRecord (state, key, registration) {
  483. return state.records[key] = {
  484. key: key,
  485. // defined System.register cache
  486. registration: registration,
  487. // module namespace object
  488. module: undefined,
  489. // es-only
  490. // this sticks around so new module loads can listen to binding changes
  491. // for already-loaded modules by adding themselves to their importerSetters
  492. importerSetters: undefined,
  493. loadError: undefined,
  494. evalError: undefined,
  495. // in-flight linking record
  496. linkRecord: {
  497. // promise for instantiated
  498. instantiatePromise: undefined,
  499. dependencies: undefined,
  500. execute: undefined,
  501. executingRequire: false,
  502. // underlying module object bindings
  503. moduleObj: undefined,
  504. // es only, also indicates if es or not
  505. setters: undefined,
  506. // promise for instantiated dependencies (dependencyInstantiations populated)
  507. depsInstantiatePromise: undefined,
  508. // will be the array of dependency load record or a module namespace
  509. dependencyInstantiations: undefined,
  510. // top-level await!
  511. evaluatePromise: undefined,
  512. // NB optimization and way of ensuring module objects in setters
  513. // indicates setters which should run pre-execution of that dependency
  514. // setters is then just for completely executed module objects
  515. // alternatively we just pass the partially filled module objects as
  516. // arguments into the execute function
  517. // hoisted: undefined
  518. }
  519. };
  520. }
  521. RegisterLoader$1.prototype[Loader.resolveInstantiate] = function (key, parentKey) {
  522. var loader = this;
  523. var state = this[REGISTER_INTERNAL];
  524. var registry = this.registry[REGISTRY];
  525. return resolveInstantiate(loader, key, parentKey, registry, state)
  526. .then(function (instantiated) {
  527. if (instantiated instanceof ModuleNamespace || instantiated[toStringTag] === 'module')
  528. return instantiated;
  529. // resolveInstantiate always returns a load record with a link record and no module value
  530. var link = instantiated.linkRecord;
  531. // if already beaten to done, return
  532. if (!link) {
  533. if (instantiated.module)
  534. return instantiated.module;
  535. throw instantiated.evalError;
  536. }
  537. return deepInstantiateDeps(loader, instantiated, link, registry, state)
  538. .then(function () {
  539. return ensureEvaluate(loader, instantiated, link, registry, state);
  540. });
  541. });
  542. };
  543. function resolveInstantiate (loader, key, parentKey, registry, state) {
  544. // normalization shortpath for already-normalized key
  545. // could add a plain name filter, but doesn't yet seem necessary for perf
  546. var module = registry[key];
  547. if (module)
  548. return Promise.resolve(module);
  549. var load = state.records[key];
  550. // already linked but not in main registry is ignored
  551. if (load && !load.module) {
  552. if (load.loadError)
  553. return Promise.reject(load.loadError);
  554. return instantiate(loader, load, load.linkRecord, registry, state);
  555. }
  556. return loader.resolve(key, parentKey)
  557. .then(function (resolvedKey) {
  558. // main loader registry always takes preference
  559. module = registry[resolvedKey];
  560. if (module)
  561. return module;
  562. load = state.records[resolvedKey];
  563. // already has a module value but not already in the registry (load.module)
  564. // means it was removed by registry.delete, so we should
  565. // disgard the current load record creating a new one over it
  566. // but keep any existing registration
  567. if (!load || load.module)
  568. load = createLoadRecord(state, resolvedKey, load && load.registration);
  569. if (load.loadError)
  570. return Promise.reject(load.loadError);
  571. var link = load.linkRecord;
  572. if (!link)
  573. return load;
  574. return instantiate(loader, load, link, registry, state);
  575. });
  576. }
  577. function createProcessAnonRegister (loader, load, state) {
  578. return function () {
  579. var lastRegister = state.lastRegister;
  580. if (!lastRegister)
  581. return !!load.registration;
  582. state.lastRegister = undefined;
  583. load.registration = lastRegister;
  584. return true;
  585. };
  586. }
  587. function instantiate (loader, load, link, registry, state) {
  588. return link.instantiatePromise || (link.instantiatePromise =
  589. // if there is already an existing registration, skip running instantiate
  590. (load.registration ? resolvedPromise : resolvedPromise.then(function () {
  591. state.lastRegister = undefined;
  592. return loader[INSTANTIATE](load.key, loader[INSTANTIATE].length > 1 && createProcessAnonRegister(loader, load, state));
  593. }))
  594. .then(function (instantiation) {
  595. // direct module return from instantiate -> we're done
  596. if (instantiation !== undefined) {
  597. if (!(instantiation instanceof ModuleNamespace || instantiation[toStringTag] === 'module'))
  598. throw new TypeError('Instantiate did not return a valid Module object.');
  599. delete state.records[load.key];
  600. if (loader.trace)
  601. traceLoad(loader, load, link);
  602. return registry[load.key] = instantiation;
  603. }
  604. // run the cached loader.register declaration if there is one
  605. var registration = load.registration;
  606. // clear to allow new registrations for future loads (combined with registry delete)
  607. load.registration = undefined;
  608. if (!registration)
  609. throw new TypeError('Module instantiation did not call an anonymous or correctly named System.register.');
  610. link.dependencies = registration[0];
  611. load.importerSetters = [];
  612. link.moduleObj = {};
  613. // process System.registerDynamic declaration
  614. if (registration[2]) {
  615. link.moduleObj.default = link.moduleObj.__useDefault = {};
  616. link.executingRequire = registration[1];
  617. link.execute = registration[2];
  618. }
  619. // process System.register declaration
  620. else {
  621. registerDeclarative(loader, load, link, registration[1]);
  622. }
  623. return load;
  624. })
  625. .catch(function (err) {
  626. load.linkRecord = undefined;
  627. throw load.loadError = load.loadError || LoaderError__Check_error_message_for_loader_stack(err, 'Instantiating ' + load.key);
  628. }));
  629. }
  630. // like resolveInstantiate, but returning load records for linking
  631. function resolveInstantiateDep (loader, key, parentKey, registry, state, traceDepMap) {
  632. // normalization shortpaths for already-normalized key
  633. // DISABLED to prioritise consistent resolver calls
  634. // could add a plain name filter, but doesn't yet seem necessary for perf
  635. /* var load = state.records[key];
  636. var module = registry[key];
  637. if (module) {
  638. if (traceDepMap)
  639. traceDepMap[key] = key;
  640. // registry authority check in case module was deleted or replaced in main registry
  641. if (load && load.module && load.module === module)
  642. return load;
  643. else
  644. return module;
  645. }
  646. // already linked but not in main registry is ignored
  647. if (load && !load.module) {
  648. if (traceDepMap)
  649. traceDepMap[key] = key;
  650. return instantiate(loader, load, load.linkRecord, registry, state);
  651. } */
  652. return loader.resolve(key, parentKey)
  653. .then(function (resolvedKey) {
  654. if (traceDepMap)
  655. traceDepMap[key] = resolvedKey;
  656. // normalization shortpaths for already-normalized key
  657. var load = state.records[resolvedKey];
  658. var module = registry[resolvedKey];
  659. // main loader registry always takes preference
  660. if (module && (!load || load.module && module !== load.module))
  661. return module;
  662. if (load && load.loadError)
  663. throw load.loadError;
  664. // already has a module value but not already in the registry (load.module)
  665. // means it was removed by registry.delete, so we should
  666. // disgard the current load record creating a new one over it
  667. // but keep any existing registration
  668. if (!load || !module && load.module)
  669. load = createLoadRecord(state, resolvedKey, load && load.registration);
  670. var link = load.linkRecord;
  671. if (!link)
  672. return load;
  673. return instantiate(loader, load, link, registry, state);
  674. });
  675. }
  676. function traceLoad (loader, load, link) {
  677. loader.loads = loader.loads || {};
  678. loader.loads[load.key] = {
  679. key: load.key,
  680. deps: link.dependencies,
  681. dynamicDeps: [],
  682. depMap: link.depMap || {}
  683. };
  684. }
  685. /*
  686. * Convert a CJS module.exports into a valid object for new Module:
  687. *
  688. * new Module(getEsModule(module.exports))
  689. *
  690. * Sets the default value to the module, while also reading off named exports carefully.
  691. */
  692. function registerDeclarative (loader, load, link, declare) {
  693. var moduleObj = link.moduleObj;
  694. var importerSetters = load.importerSetters;
  695. var definedExports = false;
  696. // closure especially not based on link to allow link record disposal
  697. var declared = declare.call(envGlobal, function (name, value) {
  698. if (typeof name === 'object') {
  699. var changed = false;
  700. for (var p in name) {
  701. value = name[p];
  702. if (p !== '__useDefault' && (!(p in moduleObj) || moduleObj[p] !== value)) {
  703. changed = true;
  704. moduleObj[p] = value;
  705. }
  706. }
  707. if (changed === false)
  708. return value;
  709. }
  710. else {
  711. if ((definedExports || name in moduleObj) && moduleObj[name] === value)
  712. return value;
  713. moduleObj[name] = value;
  714. }
  715. for (var i = 0; i < importerSetters.length; i++)
  716. importerSetters[i](moduleObj);
  717. return value;
  718. }, new ContextualLoader(loader, load.key));
  719. link.setters = declared.setters || [];
  720. link.execute = declared.execute;
  721. if (declared.exports) {
  722. link.moduleObj = moduleObj = declared.exports;
  723. definedExports = true;
  724. }
  725. }
  726. function instantiateDeps (loader, load, link, registry, state) {
  727. if (link.depsInstantiatePromise)
  728. return link.depsInstantiatePromise;
  729. var depsInstantiatePromises = Array(link.dependencies.length);
  730. for (var i = 0; i < link.dependencies.length; i++)
  731. depsInstantiatePromises[i] = resolveInstantiateDep(loader, link.dependencies[i], load.key, registry, state, loader.trace && link.depMap || (link.depMap = {}));
  732. var depsInstantiatePromise = Promise.all(depsInstantiatePromises)
  733. .then(function (dependencyInstantiations) {
  734. link.dependencyInstantiations = dependencyInstantiations;
  735. // run setters to set up bindings to instantiated dependencies
  736. if (link.setters) {
  737. for (var i = 0; i < dependencyInstantiations.length; i++) {
  738. var setter = link.setters[i];
  739. if (setter) {
  740. var instantiation = dependencyInstantiations[i];
  741. if (instantiation instanceof ModuleNamespace || instantiation[toStringTag] === 'module') {
  742. setter(instantiation);
  743. }
  744. else {
  745. if (instantiation.loadError)
  746. throw instantiation.loadError;
  747. setter(instantiation.module || instantiation.linkRecord.moduleObj);
  748. // this applies to both es and dynamic registrations
  749. if (instantiation.importerSetters)
  750. instantiation.importerSetters.push(setter);
  751. }
  752. }
  753. }
  754. }
  755. return load;
  756. });
  757. if (loader.trace)
  758. depsInstantiatePromise = depsInstantiatePromise.then(function () {
  759. traceLoad(loader, load, link);
  760. return load;
  761. });
  762. depsInstantiatePromise = depsInstantiatePromise.catch(function (err) {
  763. // throw up the instantiateDeps stack
  764. link.depsInstantiatePromise = undefined;
  765. throw LoaderError__Check_error_message_for_loader_stack(err, 'Loading ' + load.key);
  766. });
  767. depsInstantiatePromise.catch(function () {});
  768. return link.depsInstantiatePromise = depsInstantiatePromise;
  769. }
  770. function deepInstantiateDeps (loader, load, link, registry, state) {
  771. var seen = [];
  772. function addDeps (load, link) {
  773. if (!link)
  774. return resolvedPromise;
  775. if (seen.indexOf(load) !== -1)
  776. return resolvedPromise;
  777. seen.push(load);
  778. return instantiateDeps(loader, load, link, registry, state)
  779. .then(function () {
  780. var depPromises;
  781. for (var i = 0; i < link.dependencies.length; i++) {
  782. var depLoad = link.dependencyInstantiations[i];
  783. if (!(depLoad instanceof ModuleNamespace || depLoad[toStringTag] === 'module')) {
  784. depPromises = depPromises || [];
  785. depPromises.push(addDeps(depLoad, depLoad.linkRecord));
  786. }
  787. }
  788. if (depPromises)
  789. return Promise.all(depPromises);
  790. });
  791. }
  792. return addDeps(load, link);
  793. }
  794. /*
  795. * System.register
  796. */
  797. RegisterLoader$1.prototype.register = function (key, deps, declare) {
  798. var state = this[REGISTER_INTERNAL];
  799. // anonymous modules get stored as lastAnon
  800. if (declare === undefined) {
  801. state.lastRegister = [key, deps, undefined];
  802. }
  803. // everything else registers into the register cache
  804. else {
  805. var load = state.records[key] || createLoadRecord(state, key, undefined);
  806. load.registration = [deps, declare, undefined];
  807. }
  808. };
  809. /*
  810. * System.registerDyanmic
  811. */
  812. RegisterLoader$1.prototype.registerDynamic = function (key, deps, executingRequire, execute) {
  813. var state = this[REGISTER_INTERNAL];
  814. // anonymous modules get stored as lastAnon
  815. if (typeof key !== 'string') {
  816. state.lastRegister = [key, deps, executingRequire];
  817. }
  818. // everything else registers into the register cache
  819. else {
  820. var load = state.records[key] || createLoadRecord(state, key, undefined);
  821. load.registration = [deps, executingRequire, execute];
  822. }
  823. };
  824. // ContextualLoader class
  825. // backwards-compatible with previous System.register context argument by exposing .id, .key
  826. function ContextualLoader (loader, key) {
  827. this.loader = loader;
  828. this.key = this.id = key;
  829. this.meta = {
  830. url: key
  831. // scriptElement: null
  832. };
  833. }
  834. /*ContextualLoader.prototype.constructor = function () {
  835. throw new TypeError('Cannot subclass the contextual loader only Reflect.Loader.');
  836. };*/
  837. ContextualLoader.prototype.import = function (key) {
  838. if (this.loader.trace)
  839. this.loader.loads[this.key].dynamicDeps.push(key);
  840. return this.loader.import(key, this.key);
  841. };
  842. /*ContextualLoader.prototype.resolve = function (key) {
  843. return this.loader.resolve(key, this.key);
  844. };*/
  845. function ensureEvaluate (loader, load, link, registry, state) {
  846. if (load.module)
  847. return load.module;
  848. if (load.evalError)
  849. throw load.evalError;
  850. if (link.evaluatePromise)
  851. return link.evaluatePromise;
  852. if (link.setters) {
  853. var evaluatePromise = doEvaluateDeclarative(loader, load, link, registry, state, [load]);
  854. if (evaluatePromise)
  855. return evaluatePromise;
  856. }
  857. else {
  858. doEvaluateDynamic(loader, load, link, registry, state, [load]);
  859. }
  860. return load.module;
  861. }
  862. function makeDynamicRequire (loader, key, dependencies, dependencyInstantiations, registry, state, seen) {
  863. // we can only require from already-known dependencies
  864. return function (name) {
  865. for (var i = 0; i < dependencies.length; i++) {
  866. if (dependencies[i] === name) {
  867. var depLoad = dependencyInstantiations[i];
  868. var module;
  869. if (depLoad instanceof ModuleNamespace || depLoad[toStringTag] === 'module') {
  870. module = depLoad;
  871. }
  872. else {
  873. if (depLoad.evalError)
  874. throw depLoad.evalError;
  875. if (depLoad.module === undefined && seen.indexOf(depLoad) === -1 && !depLoad.linkRecord.evaluatePromise) {
  876. if (depLoad.linkRecord.setters) {
  877. doEvaluateDeclarative(loader, depLoad, depLoad.linkRecord, registry, state, [depLoad]);
  878. }
  879. else {
  880. seen.push(depLoad);
  881. doEvaluateDynamic(loader, depLoad, depLoad.linkRecord, registry, state, seen);
  882. }
  883. }
  884. module = depLoad.module || depLoad.linkRecord.moduleObj;
  885. }
  886. return '__useDefault' in module ? module.__useDefault : module;
  887. }
  888. }
  889. throw new Error('Module ' + name + ' not declared as a System.registerDynamic dependency of ' + key);
  890. };
  891. }
  892. function evalError (load, err) {
  893. load.linkRecord = undefined;
  894. var evalError = LoaderError__Check_error_message_for_loader_stack(err, 'Evaluating ' + load.key);
  895. if (load.evalError === undefined)
  896. load.evalError = evalError;
  897. throw evalError;
  898. }
  899. // es modules evaluate dependencies first
  900. // returns the error if any
  901. function doEvaluateDeclarative (loader, load, link, registry, state, seen) {
  902. var depLoad, depLink;
  903. var depLoadPromises;
  904. for (var i = 0; i < link.dependencies.length; i++) {
  905. var depLoad = link.dependencyInstantiations[i];
  906. if (depLoad instanceof ModuleNamespace || depLoad[toStringTag] === 'module')
  907. continue;
  908. // custom Module returned from instantiate
  909. depLink = depLoad.linkRecord;
  910. if (depLink) {
  911. if (depLoad.evalError) {
  912. evalError(load, depLoad.evalError);
  913. }
  914. else if (depLink.setters) {
  915. if (seen.indexOf(depLoad) === -1) {
  916. seen.push(depLoad);
  917. try {
  918. var depLoadPromise = doEvaluateDeclarative(loader, depLoad, depLink, registry, state, seen);
  919. }
  920. catch (e) {
  921. evalError(load, e);
  922. }
  923. if (depLoadPromise) {
  924. depLoadPromises = depLoadPromises || [];
  925. depLoadPromises.push(depLoadPromise.catch(function (err) {
  926. evalError(load, err);
  927. }));
  928. }
  929. }
  930. }
  931. else {
  932. try {
  933. doEvaluateDynamic(loader, depLoad, depLink, registry, state, [depLoad]);
  934. }
  935. catch (e) {
  936. evalError(load, e);
  937. }
  938. }
  939. }
  940. }
  941. if (depLoadPromises)
  942. return link.evaluatePromise = Promise.all(depLoadPromises)
  943. .then(function () {
  944. if (link.execute) {
  945. // ES System.register execute
  946. // "this" is null in ES
  947. try {
  948. var execPromise = link.execute.call(nullContext);
  949. }
  950. catch (e) {
  951. evalError(load, e);
  952. }
  953. if (execPromise)
  954. return execPromise.catch(function (e) {
  955. evalError(load, e);
  956. })
  957. .then(function () {
  958. load.linkRecord = undefined;
  959. return registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);
  960. });
  961. }
  962. // dispose link record
  963. load.linkRecord = undefined;
  964. registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);
  965. });
  966. if (link.execute) {
  967. // ES System.register execute
  968. // "this" is null in ES
  969. try {
  970. var execPromise = link.execute.call(nullContext);
  971. }
  972. catch (e) {
  973. evalError(load, e);
  974. }
  975. if (execPromise)
  976. return link.evaluatePromise = execPromise.catch(function (e) {
  977. evalError(load, e);
  978. })
  979. .then(function () {
  980. load.linkRecord = undefined;
  981. return registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);
  982. });
  983. }
  984. // dispose link record
  985. load.linkRecord = undefined;
  986. registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);
  987. }
  988. // non es modules explicitly call moduleEvaluate through require
  989. function doEvaluateDynamic (loader, load, link, registry, state, seen) {
  990. // System.registerDynamic execute
  991. // "this" is "exports" in CJS
  992. var module = { id: load.key };
  993. var moduleObj = link.moduleObj;
  994. Object.defineProperty(module, 'exports', {
  995. configurable: true,
  996. set: function (exports) {
  997. moduleObj.default = moduleObj.__useDefault = exports;
  998. },
  999. get: function () {
  1000. return moduleObj.__useDefault;
  1001. }
  1002. });
  1003. var require = makeDynamicRequire(loader, load.key, link.dependencies, link.dependencyInstantiations, registry, state, seen);
  1004. // evaluate deps first
  1005. if (!link.executingRequire)
  1006. for (var i = 0; i < link.dependencies.length; i++)
  1007. require(link.dependencies[i]);
  1008. try {
  1009. var output = link.execute.call(envGlobal, require, moduleObj.default, module);
  1010. if (output !== undefined)
  1011. module.exports = output;
  1012. }
  1013. catch (e) {
  1014. evalError(load, e);
  1015. }
  1016. load.linkRecord = undefined;
  1017. // pick up defineProperty calls to module.exports when we can
  1018. if (module.exports !== moduleObj.__useDefault)
  1019. moduleObj.default = moduleObj.__useDefault = module.exports;
  1020. var moduleDefault = moduleObj.default;
  1021. // __esModule flag extension support via lifting
  1022. if (moduleDefault && moduleDefault.__esModule) {
  1023. for (var p in moduleDefault) {
  1024. if (Object.hasOwnProperty.call(moduleDefault, p))
  1025. moduleObj[p] = moduleDefault[p];
  1026. }
  1027. }
  1028. registry[load.key] = load.module = new ModuleNamespace(link.moduleObj);
  1029. // run importer setters and clear them
  1030. // this allows dynamic modules to update themselves into es modules
  1031. // as soon as execution has completed
  1032. if (load.importerSetters)
  1033. for (var i = 0; i < load.importerSetters.length; i++)
  1034. load.importerSetters[i](load.module);
  1035. load.importerSetters = undefined;
  1036. }
  1037. // the closest we can get to call(undefined)
  1038. var nullContext = Object.create(null);
  1039. if (Object.freeze)
  1040. Object.freeze(nullContext);
  1041. var loader;
  1042. // <script type="module"> support
  1043. var anonSources = {};
  1044. if (typeof document != 'undefined' && document.getElementsByTagName) {
  1045. var handleError = function(err) {
  1046. // dispatch an error event so that we can display in errors in browsers
  1047. // that don't yet support unhandledrejection
  1048. if (window.onunhandledrejection === undefined) {
  1049. try {
  1050. var evt = new Event('error');
  1051. } catch (_eventError) {
  1052. var evt = document.createEvent('Event');
  1053. evt.initEvent('error', true, true);
  1054. }
  1055. evt.message = err.message;
  1056. if (err.fileName) {
  1057. evt.filename = err.fileName;
  1058. evt.lineno = err.lineNumber;
  1059. evt.colno = err.columnNumber;
  1060. } else if (err.sourceURL) {
  1061. evt.filename = err.sourceURL;
  1062. evt.lineno = err.line;
  1063. evt.colno = err.column;
  1064. }
  1065. evt.error = err;
  1066. window.dispatchEvent(evt);
  1067. }
  1068. // throw so it still shows up in the console
  1069. throw err;
  1070. };
  1071. var ready = function() {
  1072. document.removeEventListener('DOMContentLoaded', ready, false );
  1073. var anonCnt = 0;
  1074. var scripts = document.getElementsByTagName('script');
  1075. for (var i = 0; i < scripts.length; i++) {
  1076. var script = scripts[i];
  1077. if (script.type == 'module' && !script.loaded) {
  1078. script.loaded = true;
  1079. if (script.src) {
  1080. loader.import(script.src).catch(handleError);
  1081. }
  1082. // anonymous modules supported via a custom naming scheme and registry
  1083. else {
  1084. var uri = './<anon' + ++anonCnt + '>.js';
  1085. if (script.id !== ""){
  1086. uri = "./" + script.id;
  1087. }
  1088. var anonName = resolveIfNotPlain(uri, baseURI);
  1089. anonSources[anonName] = script.innerHTML;
  1090. loader.import(anonName).catch(handleError);
  1091. }
  1092. }
  1093. }
  1094. };
  1095. // simple DOM ready
  1096. if (document.readyState !== 'loading')
  1097. setTimeout(ready);
  1098. else
  1099. document.addEventListener('DOMContentLoaded', ready, false);
  1100. }
  1101. function BrowserESModuleLoader(baseKey) {
  1102. if (baseKey)
  1103. this.baseKey = resolveIfNotPlain(baseKey, baseURI) || resolveIfNotPlain('./' + baseKey, baseURI);
  1104. RegisterLoader$1.call(this);
  1105. var loader = this;
  1106. // ensure System.register is available
  1107. envGlobal.System = envGlobal.System || {};
  1108. if (typeof envGlobal.System.register == 'function')
  1109. var prevRegister = envGlobal.System.register;
  1110. envGlobal.System.register = function() {
  1111. loader.register.apply(loader, arguments);
  1112. if (prevRegister)
  1113. prevRegister.apply(this, arguments);
  1114. };
  1115. }
  1116. BrowserESModuleLoader.prototype = Object.create(RegisterLoader$1.prototype);
  1117. // normalize is never given a relative name like "./x", that part is already handled
  1118. BrowserESModuleLoader.prototype[RegisterLoader$1.resolve] = function(key, parent) {
  1119. var resolved = RegisterLoader$1.prototype[RegisterLoader$1.resolve].call(this, key, parent || this.baseKey) || key;
  1120. if (!resolved)
  1121. throw new RangeError('ES module loader does not resolve plain module names, resolving "' + key + '" to ' + parent);
  1122. return resolved;
  1123. };
  1124. function xhrFetch(url, resolve, reject) {
  1125. var xhr = new XMLHttpRequest();
  1126. var load = function(source) {
  1127. resolve(xhr.responseText);
  1128. };
  1129. var error = function() {
  1130. reject(new Error('XHR error' + (xhr.status ? ' (' + xhr.status + (xhr.statusText ? ' ' + xhr.statusText : '') + ')' : '') + ' loading ' + url));
  1131. };
  1132. xhr.onreadystatechange = function () {
  1133. if (xhr.readyState === 4) {
  1134. // in Chrome on file:/// URLs, status is 0
  1135. if (xhr.status == 0) {
  1136. if (xhr.responseText) {
  1137. load();
  1138. }
  1139. else {
  1140. // when responseText is empty, wait for load or error event
  1141. // to inform if it is a 404 or empty file
  1142. xhr.addEventListener('error', error);
  1143. xhr.addEventListener('load', load);
  1144. }
  1145. }
  1146. else if (xhr.status === 200) {
  1147. load();
  1148. }
  1149. else {
  1150. error();
  1151. }
  1152. }
  1153. };
  1154. xhr.open("GET", url, true);
  1155. xhr.send(null);
  1156. }
  1157. var WorkerPool = function (script, size) {
  1158. var current = document.currentScript;
  1159. // IE doesn't support currentScript
  1160. if (!current) {
  1161. // Find an entry with out basename
  1162. var scripts = document.getElementsByTagName('script');
  1163. for (var i = 0; i < scripts.length; i++) {
  1164. if (scripts[i].src.indexOf("browser-es-module-loader.js") !== -1) {
  1165. current = scripts[i];
  1166. break;
  1167. }
  1168. }
  1169. if (!current)
  1170. throw Error("Could not find own <script> element");
  1171. }
  1172. script = current.src.substr(0, current.src.lastIndexOf("/")) + "/" + script;
  1173. this._workers = new Array(size);
  1174. this._ind = 0;
  1175. this._size = size;
  1176. this._jobs = 0;
  1177. this.onmessage = undefined;
  1178. this._stopTimeout = undefined;
  1179. for (var i = 0; i < size; i++) {
  1180. var wrkr = new Worker(script);
  1181. wrkr._count = 0;
  1182. wrkr._ind = i;
  1183. wrkr.onmessage = this._onmessage.bind(this, wrkr);
  1184. wrkr.onerror = this._onerror.bind(this);
  1185. this._workers[i] = wrkr;
  1186. }
  1187. this._checkJobs();
  1188. };
  1189. WorkerPool.prototype = {
  1190. postMessage: function (msg) {
  1191. if (this._stopTimeout !== undefined) {
  1192. clearTimeout(this._stopTimeout);
  1193. this._stopTimeout = undefined;
  1194. }
  1195. var wrkr = this._workers[this._ind % this._size];
  1196. wrkr._count++;
  1197. this._jobs++;
  1198. wrkr.postMessage(msg);
  1199. this._ind++;
  1200. },
  1201. _onmessage: function (wrkr, evt) {
  1202. wrkr._count--;
  1203. this._jobs--;
  1204. this.onmessage(evt, wrkr);
  1205. this._checkJobs();
  1206. },
  1207. _onerror: function(err) {
  1208. try {
  1209. var evt = new Event('error');
  1210. } catch (_eventError) {
  1211. var evt = document.createEvent('Event');
  1212. evt.initEvent('error', true, true);
  1213. }
  1214. evt.message = err.message;
  1215. evt.filename = err.filename;
  1216. evt.lineno = err.lineno;
  1217. evt.colno = err.colno;
  1218. evt.error = err.error;
  1219. window.dispatchEvent(evt);
  1220. },
  1221. _checkJobs: function () {
  1222. if (this._jobs === 0 && this._stopTimeout === undefined) {
  1223. // wait for 2s of inactivity before stopping (that should be enough for local loading)
  1224. this._stopTimeout = setTimeout(this._stop.bind(this), 2000);
  1225. }
  1226. },
  1227. _stop: function () {
  1228. this._workers.forEach(function(wrkr) {
  1229. wrkr.terminate();
  1230. });
  1231. }
  1232. };
  1233. var promiseMap = new Map();
  1234. var babelWorker = new WorkerPool('babel-worker.js', 3);
  1235. babelWorker.onmessage = function (evt) {
  1236. var promFuncs = promiseMap.get(evt.data.key);
  1237. promFuncs.resolve(evt.data);
  1238. promiseMap.delete(evt.data.key);
  1239. };
  1240. // instantiate just needs to run System.register
  1241. // so we fetch the source, convert into the Babel System module format, then evaluate it
  1242. BrowserESModuleLoader.prototype[RegisterLoader$1.instantiate] = function(key, processAnonRegister) {
  1243. var loader = this;
  1244. // load as ES with Babel converting into System.register
  1245. return new Promise(function(resolve, reject) {
  1246. // anonymous module
  1247. if (anonSources[key]) {
  1248. resolve(anonSources[key]);
  1249. anonSources[key] = undefined;
  1250. }
  1251. // otherwise we fetch
  1252. else {
  1253. xhrFetch(key, resolve, reject);
  1254. }
  1255. })
  1256. .then(function(source) {
  1257. // check our cache first
  1258. var cacheEntry = localStorage.getItem(key);
  1259. if (cacheEntry) {
  1260. cacheEntry = JSON.parse(cacheEntry);
  1261. // TODO: store a hash instead
  1262. if (cacheEntry.source === source) {
  1263. return Promise.resolve({key: key, code: cacheEntry.code, source: cacheEntry.source});
  1264. }
  1265. }
  1266. return new Promise(function (resolve, reject) {
  1267. promiseMap.set(key, {resolve: resolve, reject: reject});
  1268. babelWorker.postMessage({key: key, source: source});
  1269. });
  1270. }).then(function (data) {
  1271. // evaluate without require, exports and module variables
  1272. // we leave module in for now to allow module.require access
  1273. try {
  1274. var cacheEntry = JSON.stringify({source: data.source, code: data.code});
  1275. localStorage.setItem(key, cacheEntry);
  1276. } catch (e) {
  1277. if (window.console) {
  1278. window.console.warn('Unable to cache transpiled version of ' + key + ': ' + e);
  1279. }
  1280. }
  1281. (0, eval)(data.code + '\n//# sourceURL=' + data.key + '!transpiled');
  1282. processAnonRegister();
  1283. });
  1284. };
  1285. // create a default loader instance in the browser
  1286. if (isBrowser)
  1287. loader = new BrowserESModuleLoader();
  1288. return BrowserESModuleLoader;
  1289. })));
  1290. //# sourceMappingURL=browser-es-module-loader.js.map