(function() { var define, requireModule, require, requirejs; (function() { var registry = {}, seen = {}; define = function(name, deps, callback) { registry[name] = { deps: deps, callback: callback }; }; requirejs = require = requireModule = function(name) { requirejs._eak_seen = registry; if (seen[name]) { return seen[name]; } seen[name] = {}; if (!registry[name]) { throw new Error("Could not find module " + name); } var mod = registry[name], deps = mod.deps, callback = mod.callback, reified = [], exports; for (var i=0, l=deps.length; i load contains linkSet'); if (load.linkSets.indexOf(linkSet) != -1) console.assert(linkSet.loads.indexOf(load) != -1, 'load contains linkSet -> linkSet contains load'); } } for (var i = 0; i < linkSets.length; i++) { var linkSet = linkSets[i]; for (var j = 0; j < linkSet.loads.length; j++) { var load = linkSet.loads[j]; for (var k = 0; k < load.dependencies.length; k++) { var depName = load.dependencies[k].value; var depLoad; for (var l = 0; l < loads.length; l++) { if (loads[l].name != depName) continue; depLoad = loads[l]; break; } // loading records are allowed not to have their dependencies yet // if (load.status != 'loading') // console.assert(depLoad, 'depLoad found'); // console.assert(linkSet.loads.indexOf(depLoad) != -1, 'linkset contains all dependencies'); } } } } */ (function (__global) { (function() { var Promise = __global.Promise || require('es6-promise').Promise; var traceur; var defineProperty; try { if (!!Object.defineProperty({}, 'a', {})) { defineProperty = Object.defineProperty; } } catch (e) { defineProperty = function (obj, prop, opt) { try { obj[prop] = opt.value || opt.get.call(obj); } catch(e) {} } } console.assert = console.assert || function() {}; // Define an IE-friendly shim good-enough for purposes var indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, thisLen = this.length; i < thisLen; i++) { if (this[i] === item) { return i; } } return -1; }; // 15.2.3 - Runtime Semantics: Loader State // 15.2.3.11 function createLoaderLoad(object) { return { // modules is an object for ES5 implementation modules: {}, loads: [], loaderObj: object }; } // 15.2.3.2 Load Records and LoadRequest Objects // 15.2.3.2.1 function createLoad(name) { return { status: 'loading', name: name, linkSets: [], dependencies: [], metadata: {} }; } // 15.2.3.2.2 createLoadRequestObject, absorbed into calling functions // 15.2.4 // 15.2.4.1 function loadModule(loader, name, options) { return new Promise(asyncStartLoadPartwayThrough({ step: options.address ? 'fetch' : 'locate', loader: loader, moduleName: name, moduleMetadata: {}, moduleSource: options.source, moduleAddress: options.address })); } // 15.2.4.2 function requestLoad(loader, request, refererName, refererAddress) { // 15.2.4.2.1 CallNormalize return new Promise(function(resolve, reject) { resolve(loader.loaderObj.normalize(request, refererName, refererAddress)); }) // 15.2.4.2.2 GetOrCreateLoad .then(function(name) { var load; if (loader.modules[name]) { return { name: name }; // See https://bugs.ecmascript.org/show_bug.cgi?id=2795 /* load = createLoad(name); load.status = 'linked'; load.module = loader.modules[name]; return load; */ } for (var i = 0, l = loader.loads.length; i < l; i++) { load = loader.loads[i]; if (load.name != name) continue; console.assert(load.status == 'loading' || load.status == 'loaded', 'loading or loaded'); return load; } load = createLoad(name); loader.loads.push(load); proceedToLocate(loader, load); return load; }); } // 15.2.4.3 function proceedToLocate(loader, load) { proceedToFetch(loader, load, Promise.resolve() // 15.2.4.3.1 CallLocate .then(function() { return loader.loaderObj.locate({ name: load.name, metadata: load.metadata }); }) ); } // 15.2.4.4 function proceedToFetch(loader, load, p) { proceedToTranslate(loader, load, p // 15.2.4.4.1 CallFetch .then(function(address) { // adjusted, see https://bugs.ecmascript.org/show_bug.cgi?id=2602 if (load.status != 'loading') return; load.address = address; return loader.loaderObj.fetch({ name: load.name, metadata: load.metadata, address: address }); }) ); } // 15.2.4.5 function proceedToTranslate(loader, load, p) { p // 15.2.4.5.1 CallTranslate .then(function(source) { if (load.status != 'loading') return; return loader.loaderObj.translate({ name: load.name, metadata: load.metadata, address: load.address, source: source }); }) // 15.2.4.5.2 CallInstantiate .then(function(source) { if (load.status != 'loading') return; load.source = source; return loader.loaderObj.instantiate({ name: load.name, metadata: load.metadata, address: load.address, source: source }); }) // 15.2.4.5.3 InstantiateSucceeded .then(function(instantiateResult) { if (load.status != 'loading') return; var depsList; if (instantiateResult === undefined) { if (!__global.traceur) throw new TypeError('Include Traceur for module syntax support'); traceur = traceur || __global.traceur; load.address = load.address || 'anon' + ++anonCnt; console.assert(load.source, 'Non-empty source'); try { var parser = new traceur.syntax.Parser(new traceur.syntax.SourceFile(load.address, load.source)); var body = parser.parseModule(); load.kind = 'declarative'; depsList = getImports(body); var oldSourceMaps = traceur.options.sourceMaps; var oldModules = traceur.options.modules; traceur.options.sourceMaps = true; traceur.options.modules = 'instantiate'; var reporter = new traceur.util.ErrorReporter(); reporter.reportMessageInternal = function(location, kind, format, args) { throw new SyntaxError(kind, location.start && location.start.line_, location.start && location.start.column_); } // traceur expects its version of System var curSystem = __global.System; __global.System = __global.traceurSystem; var tree = (new traceur.codegeneration.module.AttachModuleNameTransformer(load.name)).transformAny(body); tree = (new traceur.codegeneration.FromOptionsTransformer(reporter)).transform(tree); var sourceMapGenerator = new traceur.outputgeneration.SourceMapGenerator({ file: load.address }); var options = { sourceMapGenerator: sourceMapGenerator }; var source = traceur.outputgeneration.TreeWriter.write(tree, options); if (__global.btoa) source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(options.sourceMap))) + '\n'; // now run System.register var curRegister = System.register; System.register = function(name, deps, declare) { // store the registered declaration as load.declare load.declare = typeof name == 'string' ? declare : deps; } __eval(source, __global, load.name); } catch(e) { if (e.name == 'SyntaxError' || e.name == 'TypeError') e.message = 'Evaluating ' + (load.name || load.address) + '\n\t' + e.message; if (curRegister) System.register = curRegister; if (curSystem) __global.System = curSystem; if (oldSourceMaps) traceur.options.sourceMaps = oldSourceMaps; if (oldModules) traceur.options.modules = oldModules; throw e; } System.register = curRegister; __global.System = curSystem; traceur.options.sourceMaps = oldSourceMaps; traceur.options.modules = oldModules; } else if (typeof instantiateResult == 'object') { depsList = instantiateResult.deps || []; load.execute = instantiateResult.execute; load.kind = 'dynamic'; } else throw TypeError('Invalid instantiate return value'); // 15.2.4.6 ProcessLoadDependencies load.dependencies = []; load.depsList = depsList; var loadPromises = []; for (var i = 0, l = depsList.length; i < l; i++) (function(request) { loadPromises.push( requestLoad(loader, request, load.name, load.address) // 15.2.4.6.1 AddDependencyLoad (load is parentLoad) .then(function(depLoad) { console.assert(!load.dependencies.some(function(dep) { return dep.key == request; }), 'not already a dependency'); load.dependencies.push({ key: request, value: depLoad.name }); if (!depLoad.status) return; if (depLoad.status != 'linked') { var linkSets = load.linkSets.concat([]); for (var i = 0, l = linkSets.length; i < l; i++) addLoadToLinkSet(linkSets[i], depLoad); } // console.log('AddDependencyLoad ' + depLoad.name + ' for ' + load.name); // snapshot(loader); }) ); })(depsList[i]); return Promise.all(loadPromises); }) // 15.2.4.6.2 LoadSucceeded .then(function() { // console.log('LoadSucceeded ' + load.name); // snapshot(loader); console.assert(load.status == 'loading', 'is loading'); load.status = 'loaded'; var linkSets = load.linkSets.concat([]); for (var i = 0, l = linkSets.length; i < l; i++) updateLinkSetOnLoad(linkSets[i], load); }) // 15.2.4.5.4 LoadFailed ['catch'](function(exc) { console.assert(load.status == 'loading', 'is loading on fail'); load.status = 'failed'; load.exception = exc; loader.loaderObj.failed = loader.loaderObj.failed || []; loader.loaderObj.failed.push(load); var linkSets = load.linkSets.concat([]); for (var i = 0, l = linkSets.length; i < l; i++) linkSetFailed(linkSets[i], exc); console.assert(load.linkSets.length == 0, 'linkSets not removed'); }); } // 15.2.4.7 PromiseOfStartLoadPartwayThrough absorbed into calling functions // 15.2.4.7.1 function asyncStartLoadPartwayThrough(stepState) { return function(resolve, reject) { var loader = stepState.loader; var name = stepState.moduleName; var step = stepState.step; if (loader.modules[name]) throw new TypeError('"' + name + '" already exists in the module table'); // NB this still seems wrong for LoadModule as we may load a dependency // of another module directly before it has finished loading. for (var i = 0, l = loader.loads.length; i < l; i++) if (loader.loads[i].name == name) throw new TypeError('"' + name + '" already loading'); var load = createLoad(name); load.metadata = stepState.moduleMetadata; var linkSet = createLinkSet(loader, load); loader.loads.push(load); resolve(linkSet.done); if (step == 'locate') proceedToLocate(loader, load); else if (step == 'fetch') proceedToFetch(loader, load, Promise.resolve(stepState.moduleAddress)); else { console.assert(step == 'translate', 'translate step'); load.address = stepState.moduleAddress; proceedToTranslate(loader, load, Promise.resolve(stepState.moduleSource)); } } } // Declarative linking functions run through alternative implementation: // 15.2.5.1.1 CreateModuleLinkageRecord not implemented // 15.2.5.1.2 LookupExport not implemented // 15.2.5.1.3 LookupModuleDependency not implemented // 15.2.5.2.1 function createLinkSet(loader, startingLoad) { var linkSet = { loader: loader, loads: [], loadingCount: 0 }; linkSet.done = new Promise(function(resolve, reject) { linkSet.resolve = resolve; linkSet.reject = reject; }); addLoadToLinkSet(linkSet, startingLoad); return linkSet; } // 15.2.5.2.2 function addLoadToLinkSet(linkSet, load) { console.assert(load.status == 'loading' || load.status == 'loaded', 'loading or loaded on link set'); for (var i = 0, l = linkSet.loads.length; i < l; i++) if (linkSet.loads[i] == load) return; linkSet.loads.push(load); load.linkSets.push(linkSet); // adjustment, see https://bugs.ecmascript.org/show_bug.cgi?id=2603 if (load.status != 'loaded') { linkSet.loadingCount++; } var loader = linkSet.loader; for (var i = 0, l = load.dependencies.length; i < l; i++) { var name = load.dependencies[i].value; if (loader.modules[name]) continue; for (var j = 0, d = loader.loads.length; j < d; j++) { if (loader.loads[j].name != name) continue; addLoadToLinkSet(linkSet, loader.loads[j]); break; } } // console.log('add to linkset ' + load.name); // snapshot(linkSet.loader); } // 15.2.5.2.3 function updateLinkSetOnLoad(linkSet, load) { console.assert(load.status == 'loaded' || load.status == 'linked', 'loaded or linked'); // console.log('update linkset on load ' + load.name); // snapshot(linkSet.loader); linkSet.loadingCount--; if (linkSet.loadingCount > 0) return; var startingLoad = linkSet.loads[0]; try { link(linkSet); } catch(exc) { return linkSetFailed(linkSet, exc); } console.assert(linkSet.loads.length == 0, 'loads cleared'); linkSet.resolve(startingLoad); } // 15.2.5.2.4 function linkSetFailed(linkSet, exc) { var loads = linkSet.loads.concat([]); for (var i = 0, l = loads.length; i < l; i++) { var load = loads[i]; var linkIndex = indexOf.call(load.linkSets, linkSet); console.assert(linkIndex != -1, 'link not present'); load.linkSets.splice(linkIndex, 1); if (load.linkSets.length == 0) { var globalLoadsIndex = indexOf.call(linkSet.loader.loads, load); if (globalLoadsIndex != -1) linkSet.loader.loads.splice(globalLoadsIndex, 1); } } linkSet.reject(exc); } // 15.2.5.2.5 function finishLoad(loader, load) { // if not anonymous, add to the module table if (load.name) { console.assert(!loader.modules[load.name], 'load not in module table'); loader.modules[load.name] = load.module; } var loadIndex = indexOf.call(loader.loads, load); if (loadIndex != -1) loader.loads.splice(loadIndex, 1); for (var i = 0, l = load.linkSets.length; i < l; i++) { loadIndex = indexOf.call(load.linkSets[i].loads, load); if (loadIndex != -1) load.linkSets[i].loads.splice(loadIndex, 1); } load.linkSets.splice(0, load.linkSets.length); } // 15.2.5.3 Module Linking Groups // 15.2.5.3.2 BuildLinkageGroups alternative implementation // Adjustments (also see https://bugs.ecmascript.org/show_bug.cgi?id=2755) // 1. groups is an already-interleaved array of group kinds // 2. load.groupIndex is set when this function runs // 3. load.groupIndex is the interleaved index ie 0 declarative, 1 dynamic, 2 declarative, ... (or starting with dynamic) function buildLinkageGroups(load, loads, groups, loader) { groups[load.groupIndex] = groups[load.groupIndex] || []; // if the load already has a group index and its in its group, its already been done // this logic naturally handles cycles if (indexOf.call(groups[load.groupIndex], load) != -1) return; // now add it to the group to indicate its been seen groups[load.groupIndex].push(load); for (var i = 0; i < loads.length; i++) { var loadDep = loads[i]; // dependencies not found are already linked for (var j = 0; j < load.dependencies.length; j++) { if (loadDep.name == load.dependencies[j].value) { // by definition all loads in linkset are loaded, not linked console.assert(loadDep.status == 'loaded', 'Load in linkSet not loaded!'); // if it is a group transition, the index of the dependency has gone up // otherwise it is the same as the parent var loadDepGroupIndex = load.groupIndex + (loadDep.kind != load.kind); // the group index of an entry is always the maximum if (loadDep.groupIndex === undefined || loadDep.groupIndex < loadDepGroupIndex) { // if already in a group, remove from the old group if (loadDep.groupIndex) { groups[loadDep.groupIndex].splice(groups[loadDep.groupIndex].indexOf(loadDep), 1); // if the old group is empty, then we have a mixed depndency cycle if (groups[loadDep.groupIndex].length == 0) throw new TypeError("Mixed dependency cycle detected"); } loadDep.groupIndex = loadDepGroupIndex; } buildLinkageGroups(loadDep, loads, groups, loader); } } } } // 15.2.5.4 function link(linkSet) { var loader = linkSet.loader; // console.log('linking {' + logloads(loads) + '}'); // snapshot(loader); // 15.2.5.3.1 LinkageGroups alternative implementation // build all the groups // because the first load represents the top of the tree // for a given linkset, we can work down from there var groups = []; var startingLoad = linkSet.loads[0]; startingLoad.groupIndex = 0; buildLinkageGroups(startingLoad, linkSet.loads, groups, loader); // determine the kind of the bottom group var curGroupDeclarative = (startingLoad.kind == 'declarative') == groups.length % 2; // run through the groups from bottom to top for (var i = groups.length - 1; i >= 0; i--) { var group = groups[i]; for (var j = 0; j < group.length; j++) { var load = group[j]; // 15.2.5.5 LinkDeclarativeModules adjusted if (curGroupDeclarative) { linkDeclarativeModule(load, linkSet.loads, loader); } // 15.2.5.6 LinkDynamicModules adjusted else { var module = load.execute(); if (!module || !module.__esModule) throw new TypeError('Execution must define a Module instance'); load.module = { module: module }; load.status = 'linked'; } finishLoad(loader, load); } // alternative current kind for next loop curGroupDeclarative = !curGroupDeclarative; } } // custom declarative linking function function linkDeclarativeModule(load, loads, loader) { if (load.module) return; // declare the module with an empty depMap var depMap = []; var registryEntry = load.declare.call(__global, depMap); var moduleDependencies = []; // module is just a plain object, until we evaluate it var module = registryEntry.exports; console.assert(!load.module, 'Load module already declared!'); load.module = { name: load.name, dependencies: moduleDependencies, execute: registryEntry.execute, exports: module, evaluated: false }; // now link all the module dependencies // amending the depMap as we go for (var i = 0; i < load.dependencies.length; i++) { var depName = load.dependencies[i].value; var depModule; // if dependency already a module, use that if (loader.modules[depName]) { depModule = loader.modules[depName]; } else { for (var j = 0; j < loads.length; j++) { if (loads[j].name != depName) continue; // only link if already not already started linking (stops at circular / dynamic) if (!loads[j].module) linkDeclarativeModule(loads[j], loads, loader); depModule = loads[j].module; } } var depModuleModule = depModule.exports || depModule.module; console.assert(depModule, 'Dependency module not found!'); if (registryEntry.exportStar && indexOf.call(registryEntry.exportStar, load.dependencies[i].key) != -1) { // we are exporting * from this dependency (function(depModuleModule) { for (var p in depModuleModule) (function(p) { // if the property is already defined throw? defineProperty(module, p, { enumerable: true, get: function() { return depModuleModule[p]; }, set: function(value) { depModuleModule[p] = value; } }); })(p); })(depModuleModule); } moduleDependencies.push(depModule); depMap[i] = depModuleModule; } load.status = 'linked'; } // 15.2.5.5.1 LinkImports not implemented // 15.2.5.7 ResolveExportEntries not implemented // 15.2.5.8 ResolveExports not implemented // 15.2.5.9 ResolveExport not implemented // 15.2.5.10 ResolveImportEntries not implemented // 15.2.6.1 function evaluateLoadedModule(loader, load) { console.assert(load.status == 'linked', 'is linked ' + load.name); ensureEvaluated(load.module, [], loader); return load.module.module; } /* * Module Object non-exotic for ES5: * * module.module bound module object * module.execute execution function for module * module.dependencies list of module objects for dependencies * */ // 15.2.6.2 EnsureEvaluated adjusted function ensureEvaluated(module, seen, loader) { if (module.evaluated || !module.dependencies) return; seen.push(module); var deps = module.dependencies; for (var i = 0; i < deps.length; i++) { var dep = deps[i]; if (indexOf.call(seen, dep) == -1) ensureEvaluated(dep, seen, loader); } if (module.evaluated) return; module.evaluated = true; module.execute.call(__global); module.module = Module(module.exports); delete module.execute; } // Loader function Loader(options) { if (typeof options != 'object') throw new TypeError('Options must be an object'); if (options.normalize) this.normalize = options.normalize; if (options.locate) this.locate = options.locate; if (options.fetch) this.fetch = options.fetch; if (options.translate) this.translate = options.translate; if (options.instantiate) this.instantiate = options.instantiate; this._loader = { loaderObj: this, loads: [], modules: {} }; defineProperty(this, 'global', { get: function() { return __global; } }); defineProperty(this, 'realm', { get: function() { throw new TypeError('Realms not implemented in polyfill'); } }); } // importPromises adds ability to import a module twice without error - https://bugs.ecmascript.org/show_bug.cgi?id=2601 var importPromises = {}; Loader.prototype = { define: function(name, source, options) { if (importPromises[name]) throw new TypeError('Module is already loading.'); importPromises[name] = new Promise(asyncStartLoadPartwayThrough({ step: options && options.address ? 'fetch' : 'translate', loader: this._loader, moduleName: name, moduleMetadata: options && options.metadata || {}, moduleSource: source, moduleAddress: options && options.address })); return importPromises[name].then(function() { delete importPromises[name]; }); }, load: function(request, options) { if (this._loader.modules[request]) { ensureEvaluated(this._loader.modules[request], [], this._loader); return Promise.resolve(this._loader.modules[request].module); } if (importPromises[request]) return importPromises[request]; importPromises[request] = loadModule(this._loader, request, {}); return importPromises[request].then(function() { delete importPromises[request]; }) }, module: function(source, options) { var load = createLoad(); load.address = options && options.address; var linkSet = createLinkSet(this._loader, load); var sourcePromise = Promise.resolve(source); var loader = this._loader; var p = linkSet.done.then(function() { return evaluateLoadedModule(loader, load); }); proceedToTranslate(loader, load, sourcePromise); return p; }, 'import': function(name, options) { // run normalize first var loaderObj = this; // added, see https://bugs.ecmascript.org/show_bug.cgi?id=2659 return Promise.resolve(loaderObj.normalize(name, options && options.name, options && options.address)) .then(function(name) { var loader = loaderObj._loader; if (loader.modules[name]) { ensureEvaluated(loader.modules[name], [], loader._loader); return Promise.resolve(loader.modules[name].module); } return (importPromises[name] || (importPromises[name] = loadModule(loader, name, options || {}))) .then(function(load) { delete importPromises[name]; return evaluateLoadedModule(loader, load); }); }); }, eval: function(source) { throw new TypeError('Eval not implemented in polyfill') }, get: function(key) { if (!this._loader.modules[key]) return; ensureEvaluated(this._loader.modules[key], [], this); return this._loader.modules[key].module; }, has: function(name) { return !!this._loader.modules[name]; }, set: function(name, module) { if (!(module.__esModule)) throw new TypeError('Set must be a module'); this._loader.modules[name] = { module: module }; }, 'delete': function(name) { return this._loader.modules[name] ? delete this._loader.modules[name] : false; }, // NB implement iterations entries: function() { throw new TypeError('Iteration not yet implemented in the polyfill'); }, keys: function() { throw new TypeError('Iteration not yet implemented in the polyfill'); }, values: function() { throw new TypeError('Iteration not yet implemented in the polyfill'); }, normalize: function(name, referrerName, referrerAddress) { return name; }, locate: function(load) { return load.name; }, fetch: function(load) { throw new TypeError('Fetch not implemented'); }, translate: function(load) { return load.source; }, instantiate: function(load) { } }; // tree traversal, NB should use visitor pattern here function traverse(object, iterator, parent, parentProperty) { var key, child; if (iterator(object, parent, parentProperty) === false) return; for (key in object) { if (!object.hasOwnProperty(key)) continue; if (key == 'location' || key == 'type') continue; child = object[key]; if (typeof child == 'object' && child !== null) traverse(child, iterator, object, key); } } // given a syntax tree, return the import list function getImports(moduleTree) { var imports = []; function addImport(name) { if (indexOf.call(imports, name) == -1) imports.push(name); } traverse(moduleTree, function(node) { // import {} from 'foo'; // export * from 'foo'; // export { ... } from 'foo'; // module x from 'foo'; if (node.type == 'EXPORT_DECLARATION') { if (node.declaration.moduleSpecifier) addImport(node.declaration.moduleSpecifier.token.processedValue); } else if (node.type == 'IMPORT_DECLARATION') addImport(node.moduleSpecifier.token.processedValue); else if (node.type == 'MODULE_DECLARATION') addImport(node.expression.token.processedValue); }); return imports; } var anonCnt = 0; // Module Object function Module(obj) { if (typeof obj != 'object') throw new TypeError('Expected object'); var self = { __esModule: true }; for (var key in obj) { (function (key) { defineProperty(self, key, { configurable: false, enumerable: true, get: function () { return obj[key]; } }); })(key); } if (Object.preventExtensions) Object.preventExtensions(self); return self; } if (typeof exports === 'object') module.exports = Loader; __global.Reflect = __global.Reflect || {}; __global.Reflect.Loader = __global.Reflect.Loader || Loader; __global.LoaderPolyfill = Loader; __global.Module = Module; })(); function __eval(__source, __global, __moduleName) { eval('var __moduleName = "' + (__moduleName || '').replace('"', '\"') + '"; with(__global) { (function() { ' + __source + ' \n }).call(__global); }'); } })(typeof global !== 'undefined' ? global : this); /* ********************************************************************************************* System Loader Implementation - Implemented to https://github.com/jorendorff/js-loaders/blob/master/browser-loader.js -