UNPKG

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