diff --git a/dist/es6-module-loader-sans-promises.js b/dist/es6-module-loader-sans-promises.js index 87037ae..64a6303 100644 --- a/dist/es6-module-loader-sans-promises.js +++ b/dist/es6-module-loader-sans-promises.js @@ -6,7 +6,7 @@ - Implemented exactly to the 2014-04-27 Specification Draft. Loader implemented to the modules draft from https://github.com/jorendorff/js-loaders/blob/e60d3651/specs/es6-modules-2013-12-02.pdf - + - All functions are commented with their spec numbers, with spec differences commented. - All spec bugs are commented in this code with links to the spec bugs. @@ -17,7 +17,7 @@ - When the traceur global is detected, declarative modules are transformed by Traceur into the `instantiate` System.register output. - - Realm implementation is entirely omitted. As such, the Loader.realm accessor will + - Realm implementation is entirely omitted. As such, the Loader.realm accessor will throw an error, as well as Loader.eval. Realm arguments are not passed. - Loader module table iteration currently not yet implemented @@ -54,7 +54,7 @@ function logloads(loads) { var loads = System._loader.loads; var linkSets = []; - + for (var i = 0; i < loads.length; i++) { var load = loads[i]; console.assert(load.status == 'loading' || load.status == 'loaded', 'Each load is loading or loaded'); @@ -167,7 +167,7 @@ function logloads(loads) { } // 15.2.3.2.2 createLoadRequestObject, absorbed into calling functions - + // 15.2.4 // 15.2.4.1 @@ -216,7 +216,7 @@ function logloads(loads) { return load; }); } - + // 15.2.4.3 function proceedToLocate(loader, load) { proceedToFetch(loader, load, @@ -244,6 +244,106 @@ function logloads(loads) { ); } + // Returns an array of ModuleSpecifiers + function parse(load) { + if (!__global.traceur) + throw new TypeError('Include Traceur for module syntax support'); + + // 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; + } + + traceur = traceur || __global.traceur; + + console.assert(load.source, 'Non-empty source'); + + var depsList; + 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; + return depsList; + } + // 15.2.4.5 function proceedToTranslate(loader, load, p) { p @@ -269,75 +369,8 @@ function logloads(loads) { 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; + depsList = parse(load); } else if (typeof instantiateResult == 'object') { depsList = instantiateResult.deps || []; @@ -423,7 +456,7 @@ function logloads(loads) { var name = stepState.moduleName; var step = stepState.step; - if (loader.modules[name]) + 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 @@ -433,7 +466,7 @@ function logloads(loads) { throw new TypeError('"' + name + '" already loading'); var load = createLoad(name); - + load.metadata = stepState.moduleMetadata; var linkSet = createLinkSet(loader, load); @@ -502,7 +535,7 @@ function logloads(loads) { for (var j = 0, d = loader.loads.length; j < d; j++) { if (loader.loads[j].name != name) continue; - + addLoadToLinkSet(linkSet, loader.loads[j]); break; } @@ -651,7 +684,7 @@ function logloads(loads) { // 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); @@ -757,11 +790,11 @@ function logloads(loads) { 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; } } @@ -794,7 +827,7 @@ function logloads(loads) { load.status = 'linked'; } - + // 15.2.5.5.1 LinkImports not implemented @@ -816,7 +849,7 @@ function logloads(loads) { * 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 @@ -880,6 +913,7 @@ function logloads(loads) { // importPromises adds ability to import a module twice without error - https://bugs.ecmascript.org/show_bug.cgi?id=2601 var importPromises = {}; Loader.prototype = { + constructor: Loader, define: function(name, source, options) { if (importPromises[name]) throw new TypeError('Module is already loading.'); @@ -923,12 +957,12 @@ function logloads(loads) { 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]; @@ -948,6 +982,9 @@ function logloads(loads) { has: function(name) { return !!this._loader.modules[name]; }, + newModule: function (obj) { + return new Module(obj); + }, set: function(name, module) { if (!(module.__esModule)) throw new TypeError('Set must be a module'); @@ -1000,31 +1037,6 @@ function logloads(loads) { } } - // 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 diff --git a/dist/es6-module-loader-sans-promises.min.js b/dist/es6-module-loader-sans-promises.min.js index d4e7d25..c083b67 100644 --- a/dist/es6-module-loader-sans-promises.min.js +++ b/dist/es6-module-loader-sans-promises.min.js @@ -3,4 +3,4 @@ * https://github.com/ModuleLoader/es6-module-loader * Copyright (c) 2014 Guy Bedford, Luke Hoban, Addy Osmani; Licensed MIT */ -!function(__global){function __eval(__source,__global,__moduleName){eval('var __moduleName = "'+(__moduleName||"").replace('"','"')+'"; (function() { '+__source+" \n }).call(__global);")}!function(){function a(a){return{status:"loading",name:a,linkSets:[],dependencies:[],metadata:{}}}function b(a,b,c){return new x(g({step:c.address?"fetch":"locate",loader:a,moduleName:b,moduleMetadata:{},moduleSource:c.source,moduleAddress:c.address}))}function c(b,c,e,f){return new x(function(a){a(b.loaderObj.normalize(c,e,f))}).then(function(c){var e;if(b.modules[c])return{name:c};for(var f=0,g=b.loads.length;g>f;f++)if(e=b.loads[f],e.name==c)return e;return e=a(c),b.loads.push(e),d(b,e),e})}function d(a,b){e(a,b,x.resolve().then(function(){return a.loaderObj.locate({name:b.name,metadata:b.metadata})}))}function e(a,b,c){f(a,b,c.then(function(c){return"loading"==b.status?(b.address=c,a.loaderObj.fetch({name:b.name,metadata:b.metadata,address:c})):void 0}))}function f(a,b,d){d.then(function(c){return"loading"==b.status?a.loaderObj.translate({name:b.name,metadata:b.metadata,address:b.address,source:c}):void 0}).then(function(c){return"loading"==b.status?(b.source=c,a.loaderObj.instantiate({name:b.name,metadata:b.metadata,address:b.address,source:c})):void 0}).then(function(d){if("loading"==b.status){var e;if(void 0===d){if(!__global.traceur)throw new TypeError("Include Traceur for module syntax support");v=v||__global.traceur,b.address=b.address||"anon"+ ++B;try{var f=new v.syntax.Parser(new v.syntax.SourceFile(b.address,b.source)),g=f.parseModule();b.kind="declarative",e=t(g);var h=v.options.sourceMaps,j=v.options.modules;v.options.sourceMaps=!0,v.options.modules="instantiate";var k=new v.util.ErrorReporter;k.reportMessageInternal=function(a,b){throw new SyntaxError(b,a.start&&a.start.line_,a.start&&a.start.column_)};var l=__global.System;__global.System=__global.traceurSystem;var m=new v.codegeneration.module.AttachModuleNameTransformer(b.name).transformAny(g);m=new v.codegeneration.FromOptionsTransformer(k).transform(m);var n=new v.outputgeneration.SourceMapGenerator({file:b.address}),o={sourceMapGenerator:n},p=v.outputgeneration.TreeWriter.write(m,o);__global.btoa&&(p+="\n//# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(o.sourceMap)))+"\n");var q=System.register;System.register=function(a,c,d){b.declare="string"==typeof a?d:c},__eval(p,__global,b.name)}catch(r){throw("SyntaxError"==r.name||"TypeError"==r.name)&&(r.message="Evaluating "+(b.name||b.address)+"\n "+r.message),q&&(System.register=q),l&&(__global.System=l),h&&(v.options.sourceMaps=h),j&&(v.options.modules=j),r}System.register=q,__global.System=l,v.options.sourceMaps=h,v.options.modules=j}else{if("object"!=typeof d)throw TypeError("Invalid instantiate return value");e=d.deps||[],b.execute=d.execute,b.kind="dynamic"}b.dependencies=[],b.depsList=e;for(var s=[],u=0,w=e.length;w>u;u++)(function(d){s.push(c(a,d,b.name,b.address).then(function(a){if(b.dependencies.push({key:d,value:a.name}),a.status&&"linked"!=a.status)for(var c=b.linkSets.concat([]),e=0,f=c.length;f>e;e++)i(c[e],a)}))})(e[u]);return x.all(s)}}).then(function(){b.status="loaded";for(var a=b.linkSets.concat([]),c=0,d=a.length;d>c;c++)j(a[c],b)})["catch"](function(a){b.status="failed",b.exception=a;for(var c=b.linkSets.concat([]),d=0,e=c.length;e>d;d++)k(c[d],a)})}function g(b){return function(c){var g=b.loader,i=b.moduleName,j=b.step;if(g.modules[i])throw new TypeError('"'+i+'" already exists in the module table');for(var k=0,l=g.loads.length;l>k;k++)if(g.loads[k].name==i)throw new TypeError('"'+i+'" already loading');var m=a(i);m.metadata=b.moduleMetadata;var n=h(g,m);g.loads.push(m),c(n.done),"locate"==j?d(g,m):"fetch"==j?e(g,m,x.resolve(b.moduleAddress)):(m.address=b.moduleAddress,f(g,m,x.resolve(b.moduleSource)))}}function h(a,b){var c={loader:a,loads:[],loadingCount:0};return c.done=new x(function(a,b){c.resolve=a,c.reject=b}),i(c,b),c}function i(a,b){for(var c=0,d=a.loads.length;d>c;c++)if(a.loads[c]==b)return;a.loads.push(b),b.linkSets.push(a),"loaded"!=b.status&&a.loadingCount++;for(var e=a.loader,c=0,d=b.dependencies.length;d>c;c++){var f=b.dependencies[c].value;if(!e.modules[f])for(var g=0,h=e.loads.length;h>g;g++)if(e.loads[g].name==f){i(a,e.loads[g]);break}}}function j(a,b){if(a.loadingCount--,!(a.loadingCount>0)){var c=a.loads[0];if(a.loader.loaderObj.execute===!1){for(var d=[].concat(a.loads),e=0;ee;e++){var g=d[e];c.loaderObj.failed=c.loaderObj.failed||[],-1==c.loaderObj.failed.indexOf(g)&&c.loaderObj.failed.push(g);var h=z.call(g.linkSets,a);if(g.linkSets.splice(h,1),0==g.linkSets.length){var i=z.call(a.loader.loads,g);-1!=i&&a.loader.loads.splice(i,1)}}a.reject(b)}function l(a,b){if(a.loaderObj.trace){a.loaderObj.loads||(a.loaderObj.loads={});var c={};b.dependencies.forEach(function(a){c[a.key]=a.value}),a.loaderObj.loads[b.name]={name:b.name,deps:b.dependencies.map(function(a){return a.key}),depMap:c,address:b.address,metadata:b.metadata,source:b.source,kind:b.kind}}b.name&&(a.modules[b.name]=b.module);var d=z.call(a.loads,b);-1!=d&&a.loads.splice(d,1);for(var e=0,f=b.linkSets.length;f>e;e++)d=z.call(b.linkSets[e].loads,b),-1!=d&&b.linkSets[e].loads.splice(d,1);b.linkSets.splice(0,b.linkSets.length)}function m(a,b,c,d){if(c[a.groupIndex]=c[a.groupIndex]||[],-1==z.call(c[a.groupIndex],a)){c[a.groupIndex].push(a);for(var e=0;e=0;f--){for(var g=c[f],h=0;hb;b++)if(this[b]===a)return b;return-1},A={};r.prototype={define:function(a,b,c){if(A[a])throw new TypeError("Module is already loading.");return A[a]=new x(g({step:c&&c.address?"fetch":"translate",loader:this._loader,moduleName:a,moduleMetadata:c&&c.metadata||{},moduleSource:b,moduleAddress:c&&c.address})),A[a].then(function(){delete A[a]})},load:function(a){return this._loader.modules[a]?(q(this._loader.modules[a],[],this._loader),x.resolve(this._loader.modules[a].module)):A[a]?A[a]:(A[a]=b(this._loader,a,{}),A[a].then(function(){delete A[a]}))},module:function(b,c){var d=a();d.address=c&&c.address;var e=h(this._loader,d),g=x.resolve(b),i=this._loader,j=e.done.then(function(){return p(i,d)});return f(i,d,g),j},"import":function(a,c){var d=this;return x.resolve(d.normalize(a,c&&c.name,c&&c.address)).then(function(a){var e=d._loader;return e.modules[a]?(q(e.modules[a],[],e._loader),x.resolve(e.modules[a].module)):(A[a]||(A[a]=b(e,a,c||{}))).then(function(b){return delete A[a],p(e,b)})})},eval:function(){throw new TypeError("Eval not implemented in polyfill")},get:function(a){return this._loader.modules[a]?(q(this._loader.modules[a],[],this),this._loader.modules[a].module):void 0},has:function(a){return!!this._loader.modules[a]},set:function(a,b){if(!b.__esModule)throw new TypeError("Set must be a module");this._loader.modules[a]={module:b}},"delete":function(a){return this._loader.modules[a]?delete this._loader.modules[a]:!1},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(a){return a},locate:function(a){return a.name},fetch:function(){throw new TypeError("Fetch not implemented")},translate:function(a){return a.source},instantiate:function(){}};var B=0;"object"==typeof exports&&(module.exports=r),__global.Reflect=__global.Reflect||{},__global.Reflect.Loader=__global.Reflect.Loader||r,__global.LoaderPolyfill=r,__global.Module=u}()}("undefined"!=typeof global?global:this),function(a){function b(a){var b=String(a).replace(/^\s+|\s+$/g,"").match(/^([^:\/?#]+:)?(\/\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/);return b?{href:b[0]||"",protocol:b[1]||"",authority:b[2]||"",host:b[3]||"",hostname:b[4]||"",port:b[5]||"",pathname:b[6]||"",search:b[7]||"",hash:b[8]||""}:null}function c(a,c){function d(a){var b=[];return a.replace(/^(\.\.?(\/|$))+/,"").replace(/\/(\.(\/|$))+/g,"/").replace(/\/\.\.$/,"/../").replace(/\/?[^\/]*/g,function(a){"/.."===a?b.pop():b.push(a)}),b.join("").replace(/^\//,"/"===a.charAt(0)?"/":"")}return c=b(c||""),a=b(a||""),c&&a?(c.protocol||a.protocol)+(c.protocol||c.authority?c.authority:a.authority)+d(c.protocol||c.authority||"/"===c.pathname.charAt(0)?c.pathname:c.pathname?(a.authority&&!a.pathname?"/":"")+a.pathname.slice(0,a.pathname.lastIndexOf("/")+1)+c.pathname:a.pathname)+(c.protocol||c.authority||c.pathname?c.search:c.search||a.search)+c.hash:null}function d(){document.removeEventListener("DOMContentLoaded",d,!1),window.removeEventListener("load",d,!1),e()}function e(){for(var a=document.getElementsByTagName("script"),b=0;b2)throw new TypeError("Only one wildcard in a path is permitted");1==g.length?d==f&&f.length>e.length&&(e=f):d.substr(0,g[0].length)==g[0]&&d.substr(d.length-g[1].length)==g[1]&&(e=f,b=d.substr(g[0].length,d.length-g[1].length-g[0].length))}var h=this.paths[e];return b&&(h=h.replace("*",b)),c(this.baseURL,h)},fetch:function(a){return new i(function(b,d){f(c(this.baseURL,a.address),function(a){b(a)},d)})}});if(g){var l=window.location.href.split("#")[0].split("?")[0];k.baseURL=l.substring(0,l.lastIndexOf("/")+1)}else k.baseURL="./";if(k.paths={"*":"*.js"},a.System&&a.traceur&&(a.traceurSystem=a.System),g&&(a.System=k),g){var m=document.getElementsByTagName("script");m=m[m.length-1],"complete"===document.readyState?setTimeout(e):document.addEventListener&&(document.addEventListener("DOMContentLoaded",d,!1),window.addEventListener("load",d,!1)),m.getAttribute("data-init")&&window[m.getAttribute("data-init")]()}"object"==typeof exports&&(module.exports=k)}("undefined"!=typeof global?global:this); \ No newline at end of file +!function(__global){function __eval(__source,__global,__moduleName){eval('var __moduleName = "'+(__moduleName||"").replace('"','"')+'"; (function() { '+__source+" \n }).call(__global);")}!function(){function a(a){return{status:"loading",name:a,linkSets:[],dependencies:[],metadata:{}}}function b(a,b,c){return new x(h({step:c.address?"fetch":"locate",loader:a,moduleName:b,moduleMetadata:{},moduleSource:c.source,moduleAddress:c.address}))}function c(b,c,e,f){return new x(function(a){a(b.loaderObj.normalize(c,e,f))}).then(function(c){var e;if(b.modules[c])return{name:c};for(var f=0,g=b.loads.length;g>f;f++)if(e=b.loads[f],e.name==c)return e;return e=a(c),b.loads.push(e),d(b,e),e})}function d(a,b){e(a,b,x.resolve().then(function(){return a.loaderObj.locate({name:b.name,metadata:b.metadata})}))}function e(a,b,c){g(a,b,c.then(function(c){return"loading"==b.status?(b.address=c,a.loaderObj.fetch({name:b.name,metadata:b.metadata,address:c})):void 0}))}function f(a){function b(a){function b(a){-1==z.call(c,a)&&c.push(a)}var c=[];return t(a,function(a){"EXPORT_DECLARATION"==a.type?a.declaration.moduleSpecifier&&b(a.declaration.moduleSpecifier.token.processedValue):"IMPORT_DECLARATION"==a.type?b(a.moduleSpecifier.token.processedValue):"MODULE_DECLARATION"==a.type&&b(a.expression.token.processedValue)}),c}if(!__global.traceur)throw new TypeError("Include Traceur for module syntax support");v=v||__global.traceur;var c;try{var d=new v.syntax.Parser(new v.syntax.SourceFile(a.address,a.source)),e=d.parseModule();a.kind="declarative",c=b(e);var f=v.options.sourceMaps,g=v.options.modules;v.options.sourceMaps=!0,v.options.modules="instantiate";var h=new v.util.ErrorReporter;h.reportMessageInternal=function(a,b){throw new SyntaxError(b,a.start&&a.start.line_,a.start&&a.start.column_)};var i=__global.System;__global.System=__global.traceurSystem;var j=new v.codegeneration.module.AttachModuleNameTransformer(a.name).transformAny(e);j=new v.codegeneration.FromOptionsTransformer(h).transform(j);var k=new v.outputgeneration.SourceMapGenerator({file:a.address}),l={sourceMapGenerator:k},m=v.outputgeneration.TreeWriter.write(j,l);__global.btoa&&(m+="\n//# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(l.sourceMap)))+"\n");var n=System.register;System.register=function(b,c,d){a.declare="string"==typeof b?d:c},__eval(m,__global,a.name)}catch(o){throw("SyntaxError"==o.name||"TypeError"==o.name)&&(o.message="Evaluating "+(a.name||a.address)+"\n "+o.message),n&&(System.register=n),i&&(__global.System=i),f&&(v.options.sourceMaps=f),g&&(v.options.modules=g),o}return System.register=n,__global.System=i,v.options.sourceMaps=f,v.options.modules=g,c}function g(a,b,d){d.then(function(c){return"loading"==b.status?a.loaderObj.translate({name:b.name,metadata:b.metadata,address:b.address,source:c}):void 0}).then(function(c){return"loading"==b.status?(b.source=c,a.loaderObj.instantiate({name:b.name,metadata:b.metadata,address:b.address,source:c})):void 0}).then(function(d){if("loading"==b.status){var e;if(void 0===d)b.address=b.address||"anon"+ ++B,e=f(b);else{if("object"!=typeof d)throw TypeError("Invalid instantiate return value");e=d.deps||[],b.execute=d.execute,b.kind="dynamic"}b.dependencies=[],b.depsList=e;for(var g=[],h=0,i=e.length;i>h;h++)(function(d){g.push(c(a,d,b.name,b.address).then(function(a){if(b.dependencies.push({key:d,value:a.name}),a.status&&"linked"!=a.status)for(var c=b.linkSets.concat([]),e=0,f=c.length;f>e;e++)j(c[e],a)}))})(e[h]);return x.all(g)}}).then(function(){b.status="loaded";for(var a=b.linkSets.concat([]),c=0,d=a.length;d>c;c++)k(a[c],b)})["catch"](function(a){b.status="failed",b.exception=a;for(var c=b.linkSets.concat([]),d=0,e=c.length;e>d;d++)l(c[d],a)})}function h(b){return function(c){var f=b.loader,h=b.moduleName,j=b.step;if(f.modules[h])throw new TypeError('"'+h+'" already exists in the module table');for(var k=0,l=f.loads.length;l>k;k++)if(f.loads[k].name==h)throw new TypeError('"'+h+'" already loading');var m=a(h);m.metadata=b.moduleMetadata;var n=i(f,m);f.loads.push(m),c(n.done),"locate"==j?d(f,m):"fetch"==j?e(f,m,x.resolve(b.moduleAddress)):(m.address=b.moduleAddress,g(f,m,x.resolve(b.moduleSource)))}}function i(a,b){var c={loader:a,loads:[],loadingCount:0};return c.done=new x(function(a,b){c.resolve=a,c.reject=b}),j(c,b),c}function j(a,b){for(var c=0,d=a.loads.length;d>c;c++)if(a.loads[c]==b)return;a.loads.push(b),b.linkSets.push(a),"loaded"!=b.status&&a.loadingCount++;for(var e=a.loader,c=0,d=b.dependencies.length;d>c;c++){var f=b.dependencies[c].value;if(!e.modules[f])for(var g=0,h=e.loads.length;h>g;g++)if(e.loads[g].name==f){j(a,e.loads[g]);break}}}function k(a,b){if(a.loadingCount--,!(a.loadingCount>0)){var c=a.loads[0];if(a.loader.loaderObj.execute===!1){for(var d=[].concat(a.loads),e=0;ee;e++){var g=d[e];c.loaderObj.failed=c.loaderObj.failed||[],-1==c.loaderObj.failed.indexOf(g)&&c.loaderObj.failed.push(g);var h=z.call(g.linkSets,a);if(g.linkSets.splice(h,1),0==g.linkSets.length){var i=z.call(a.loader.loads,g);-1!=i&&a.loader.loads.splice(i,1)}}a.reject(b)}function m(a,b){if(a.loaderObj.trace){a.loaderObj.loads||(a.loaderObj.loads={});var c={};b.dependencies.forEach(function(a){c[a.key]=a.value}),a.loaderObj.loads[b.name]={name:b.name,deps:b.dependencies.map(function(a){return a.key}),depMap:c,address:b.address,metadata:b.metadata,source:b.source,kind:b.kind}}b.name&&(a.modules[b.name]=b.module);var d=z.call(a.loads,b);-1!=d&&a.loads.splice(d,1);for(var e=0,f=b.linkSets.length;f>e;e++)d=z.call(b.linkSets[e].loads,b),-1!=d&&b.linkSets[e].loads.splice(d,1);b.linkSets.splice(0,b.linkSets.length)}function n(a,b,c,d){if(c[a.groupIndex]=c[a.groupIndex]||[],-1==z.call(c[a.groupIndex],a)){c[a.groupIndex].push(a);for(var e=0;e=0;f--){for(var g=c[f],h=0;hb;b++)if(this[b]===a)return b;return-1},A={};s.prototype={constructor:s,define:function(a,b,c){if(A[a])throw new TypeError("Module is already loading.");return A[a]=new x(h({step:c&&c.address?"fetch":"translate",loader:this._loader,moduleName:a,moduleMetadata:c&&c.metadata||{},moduleSource:b,moduleAddress:c&&c.address})),A[a].then(function(){delete A[a]})},load:function(a){return this._loader.modules[a]?(r(this._loader.modules[a],[],this._loader),x.resolve(this._loader.modules[a].module)):A[a]?A[a]:(A[a]=b(this._loader,a,{}),A[a].then(function(){delete A[a]}))},module:function(b,c){var d=a();d.address=c&&c.address;var e=i(this._loader,d),f=x.resolve(b),h=this._loader,j=e.done.then(function(){return q(h,d)});return g(h,d,f),j},"import":function(a,c){var d=this;return x.resolve(d.normalize(a,c&&c.name,c&&c.address)).then(function(a){var e=d._loader;return e.modules[a]?(r(e.modules[a],[],e._loader),x.resolve(e.modules[a].module)):(A[a]||(A[a]=b(e,a,c||{}))).then(function(b){return delete A[a],q(e,b)})})},eval:function(){throw new TypeError("Eval not implemented in polyfill")},get:function(a){return this._loader.modules[a]?(r(this._loader.modules[a],[],this),this._loader.modules[a].module):void 0},has:function(a){return!!this._loader.modules[a]},newModule:function(a){return new u(a)},set:function(a,b){if(!b.__esModule)throw new TypeError("Set must be a module");this._loader.modules[a]={module:b}},"delete":function(a){return this._loader.modules[a]?delete this._loader.modules[a]:!1},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(a){return a},locate:function(a){return a.name},fetch:function(){throw new TypeError("Fetch not implemented")},translate:function(a){return a.source},instantiate:function(){}};var B=0;"object"==typeof exports&&(module.exports=s),__global.Reflect=__global.Reflect||{},__global.Reflect.Loader=__global.Reflect.Loader||s,__global.LoaderPolyfill=s,__global.Module=u}()}("undefined"!=typeof global?global:this),function(a){function b(a){var b=String(a).replace(/^\s+|\s+$/g,"").match(/^([^:\/?#]+:)?(\/\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/);return b?{href:b[0]||"",protocol:b[1]||"",authority:b[2]||"",host:b[3]||"",hostname:b[4]||"",port:b[5]||"",pathname:b[6]||"",search:b[7]||"",hash:b[8]||""}:null}function c(a,c){function d(a){var b=[];return a.replace(/^(\.\.?(\/|$))+/,"").replace(/\/(\.(\/|$))+/g,"/").replace(/\/\.\.$/,"/../").replace(/\/?[^\/]*/g,function(a){"/.."===a?b.pop():b.push(a)}),b.join("").replace(/^\//,"/"===a.charAt(0)?"/":"")}return c=b(c||""),a=b(a||""),c&&a?(c.protocol||a.protocol)+(c.protocol||c.authority?c.authority:a.authority)+d(c.protocol||c.authority||"/"===c.pathname.charAt(0)?c.pathname:c.pathname?(a.authority&&!a.pathname?"/":"")+a.pathname.slice(0,a.pathname.lastIndexOf("/")+1)+c.pathname:a.pathname)+(c.protocol||c.authority||c.pathname?c.search:c.search||a.search)+c.hash:null}function d(){document.removeEventListener("DOMContentLoaded",d,!1),window.removeEventListener("load",d,!1),e()}function e(){for(var a=document.getElementsByTagName("script"),b=0;b2)throw new TypeError("Only one wildcard in a path is permitted");1==g.length?d==f&&f.length>e.length&&(e=f):d.substr(0,g[0].length)==g[0]&&d.substr(d.length-g[1].length)==g[1]&&(e=f,b=d.substr(g[0].length,d.length-g[1].length-g[0].length))}var h=this.paths[e];return b&&(h=h.replace("*",b)),c(this.baseURL,h)},fetch:function(a){return new i(function(b,d){f(c(this.baseURL,a.address),function(a){b(a)},d)})}});if(g){var l=window.location.href.split("#")[0].split("?")[0];k.baseURL=l.substring(0,l.lastIndexOf("/")+1)}else k.baseURL="./";if(k.paths={"*":"*.js"},a.System&&a.traceur&&(a.traceurSystem=a.System),g&&(a.System=k),g){var m=document.getElementsByTagName("script");m=m[m.length-1],"complete"===document.readyState?setTimeout(e):document.addEventListener&&(document.addEventListener("DOMContentLoaded",d,!1),window.addEventListener("load",d,!1)),m.getAttribute("data-init")&&window[m.getAttribute("data-init")]()}"object"==typeof exports&&(module.exports=k)}("undefined"!=typeof global?global:this); \ No newline at end of file diff --git a/dist/es6-module-loader.js b/dist/es6-module-loader.js index b6a2526..b26900d 100644 --- a/dist/es6-module-loader.js +++ b/dist/es6-module-loader.js @@ -690,7 +690,7 @@ requireModule('promise/polyfill').polyfill(); - Implemented exactly to the 2014-04-27 Specification Draft. Loader implemented to the modules draft from https://github.com/jorendorff/js-loaders/blob/e60d3651/specs/es6-modules-2013-12-02.pdf - + - All functions are commented with their spec numbers, with spec differences commented. - All spec bugs are commented in this code with links to the spec bugs. @@ -701,7 +701,7 @@ requireModule('promise/polyfill').polyfill(); - When the traceur global is detected, declarative modules are transformed by Traceur into the `instantiate` System.register output. - - Realm implementation is entirely omitted. As such, the Loader.realm accessor will + - Realm implementation is entirely omitted. As such, the Loader.realm accessor will throw an error, as well as Loader.eval. Realm arguments are not passed. - Loader module table iteration currently not yet implemented @@ -738,7 +738,7 @@ function logloads(loads) { var loads = System._loader.loads; var linkSets = []; - + for (var i = 0; i < loads.length; i++) { var load = loads[i]; console.assert(load.status == 'loading' || load.status == 'loaded', 'Each load is loading or loaded'); @@ -851,7 +851,7 @@ function logloads(loads) { } // 15.2.3.2.2 createLoadRequestObject, absorbed into calling functions - + // 15.2.4 // 15.2.4.1 @@ -900,7 +900,7 @@ function logloads(loads) { return load; }); } - + // 15.2.4.3 function proceedToLocate(loader, load) { proceedToFetch(loader, load, @@ -928,6 +928,106 @@ function logloads(loads) { ); } + // Returns an array of ModuleSpecifiers + function parse(load) { + if (!__global.traceur) + throw new TypeError('Include Traceur for module syntax support'); + + // 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; + } + + traceur = traceur || __global.traceur; + + console.assert(load.source, 'Non-empty source'); + + var depsList; + 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; + return depsList; + } + // 15.2.4.5 function proceedToTranslate(loader, load, p) { p @@ -953,75 +1053,8 @@ function logloads(loads) { 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; + depsList = parse(load); } else if (typeof instantiateResult == 'object') { depsList = instantiateResult.deps || []; @@ -1107,7 +1140,7 @@ function logloads(loads) { var name = stepState.moduleName; var step = stepState.step; - if (loader.modules[name]) + 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 @@ -1117,7 +1150,7 @@ function logloads(loads) { throw new TypeError('"' + name + '" already loading'); var load = createLoad(name); - + load.metadata = stepState.moduleMetadata; var linkSet = createLinkSet(loader, load); @@ -1186,7 +1219,7 @@ function logloads(loads) { for (var j = 0, d = loader.loads.length; j < d; j++) { if (loader.loads[j].name != name) continue; - + addLoadToLinkSet(linkSet, loader.loads[j]); break; } @@ -1335,7 +1368,7 @@ function logloads(loads) { // 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); @@ -1441,11 +1474,11 @@ function logloads(loads) { 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; } } @@ -1478,7 +1511,7 @@ function logloads(loads) { load.status = 'linked'; } - + // 15.2.5.5.1 LinkImports not implemented @@ -1500,7 +1533,7 @@ function logloads(loads) { * 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 @@ -1564,6 +1597,7 @@ function logloads(loads) { // importPromises adds ability to import a module twice without error - https://bugs.ecmascript.org/show_bug.cgi?id=2601 var importPromises = {}; Loader.prototype = { + constructor: Loader, define: function(name, source, options) { if (importPromises[name]) throw new TypeError('Module is already loading.'); @@ -1607,12 +1641,12 @@ function logloads(loads) { 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]; @@ -1632,6 +1666,9 @@ function logloads(loads) { has: function(name) { return !!this._loader.modules[name]; }, + newModule: function (obj) { + return new Module(obj); + }, set: function(name, module) { if (!(module.__esModule)) throw new TypeError('Set must be a module'); @@ -1684,31 +1721,6 @@ function logloads(loads) { } } - // 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 diff --git a/dist/es6-module-loader.min.js b/dist/es6-module-loader.min.js index ce5fc21..6e3693a 100644 --- a/dist/es6-module-loader.min.js +++ b/dist/es6-module-loader.min.js @@ -3,4 +3,4 @@ * https://github.com/ModuleLoader/es6-module-loader * Copyright (c) 2014 Guy Bedford, Luke Hoban, Addy Osmani; Licensed MIT */ -!function(){var a,b,c,d;!function(){var e={},f={};a=function(a,b,c){e[a]={deps:b,callback:c}},d=c=b=function(a){function c(b){if("."!==b.charAt(0))return b;for(var c=b.split("/"),d=a.split("/").slice(0,-1),e=0,f=c.length;f>e;e++){var g=c[e];if(".."===g)d.pop();else{if("."===g)continue;d.push(g)}}return d.join("/")}if(d._eak_seen=e,f[a])return f[a];if(f[a]={},!e[a])throw new Error("Could not find module "+a);for(var g,h=e[a],i=h.deps,j=h.callback,k=[],l=0,m=i.length;m>l;l++)"exports"===i[l]?k.push(g={}):k.push(b(c(i[l])));var n=j.apply(this,k);return f[a]=g||n}}(),a("promise/all",["./utils","exports"],function(a,b){"use strict";function c(a){var b=this;if(!d(a))throw new TypeError("You must pass an array to all.");return new b(function(b,c){function d(a){return function(b){f(a,b)}}function f(a,c){h[a]=c,0===--i&&b(h)}var g,h=[],i=a.length;0===i&&b([]);for(var j=0;jf;f++)if(e=b.loads[f],e.name==c)return e;return e=a(c),b.loads.push(e),d(b,e),e})}function d(a,b){e(a,b,x.resolve().then(function(){return a.loaderObj.locate({name:b.name,metadata:b.metadata})}))}function e(a,b,c){f(a,b,c.then(function(c){return"loading"==b.status?(b.address=c,a.loaderObj.fetch({name:b.name,metadata:b.metadata,address:c})):void 0}))}function f(a,b,d){d.then(function(c){return"loading"==b.status?a.loaderObj.translate({name:b.name,metadata:b.metadata,address:b.address,source:c}):void 0}).then(function(c){return"loading"==b.status?(b.source=c,a.loaderObj.instantiate({name:b.name,metadata:b.metadata,address:b.address,source:c})):void 0}).then(function(d){if("loading"==b.status){var e;if(void 0===d){if(!__global.traceur)throw new TypeError("Include Traceur for module syntax support");v=v||__global.traceur,b.address=b.address||"anon"+ ++B;try{var f=new v.syntax.Parser(new v.syntax.SourceFile(b.address,b.source)),g=f.parseModule();b.kind="declarative",e=t(g);var h=v.options.sourceMaps,j=v.options.modules;v.options.sourceMaps=!0,v.options.modules="instantiate";var k=new v.util.ErrorReporter;k.reportMessageInternal=function(a,b){throw new SyntaxError(b,a.start&&a.start.line_,a.start&&a.start.column_)};var l=__global.System;__global.System=__global.traceurSystem;var m=new v.codegeneration.module.AttachModuleNameTransformer(b.name).transformAny(g);m=new v.codegeneration.FromOptionsTransformer(k).transform(m);var n=new v.outputgeneration.SourceMapGenerator({file:b.address}),o={sourceMapGenerator:n},p=v.outputgeneration.TreeWriter.write(m,o);__global.btoa&&(p+="\n//# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(o.sourceMap)))+"\n");var q=System.register;System.register=function(a,c,d){b.declare="string"==typeof a?d:c},__eval(p,__global,b.name)}catch(r){throw("SyntaxError"==r.name||"TypeError"==r.name)&&(r.message="Evaluating "+(b.name||b.address)+"\n "+r.message),q&&(System.register=q),l&&(__global.System=l),h&&(v.options.sourceMaps=h),j&&(v.options.modules=j),r}System.register=q,__global.System=l,v.options.sourceMaps=h,v.options.modules=j}else{if("object"!=typeof d)throw TypeError("Invalid instantiate return value");e=d.deps||[],b.execute=d.execute,b.kind="dynamic"}b.dependencies=[],b.depsList=e;for(var s=[],u=0,w=e.length;w>u;u++)(function(d){s.push(c(a,d,b.name,b.address).then(function(a){if(b.dependencies.push({key:d,value:a.name}),a.status&&"linked"!=a.status)for(var c=b.linkSets.concat([]),e=0,f=c.length;f>e;e++)i(c[e],a)}))})(e[u]);return x.all(s)}}).then(function(){b.status="loaded";for(var a=b.linkSets.concat([]),c=0,d=a.length;d>c;c++)j(a[c],b)})["catch"](function(a){b.status="failed",b.exception=a;for(var c=b.linkSets.concat([]),d=0,e=c.length;e>d;d++)k(c[d],a)})}function g(b){return function(c){var g=b.loader,i=b.moduleName,j=b.step;if(g.modules[i])throw new TypeError('"'+i+'" already exists in the module table');for(var k=0,l=g.loads.length;l>k;k++)if(g.loads[k].name==i)throw new TypeError('"'+i+'" already loading');var m=a(i);m.metadata=b.moduleMetadata;var n=h(g,m);g.loads.push(m),c(n.done),"locate"==j?d(g,m):"fetch"==j?e(g,m,x.resolve(b.moduleAddress)):(m.address=b.moduleAddress,f(g,m,x.resolve(b.moduleSource)))}}function h(a,b){var c={loader:a,loads:[],loadingCount:0};return c.done=new x(function(a,b){c.resolve=a,c.reject=b}),i(c,b),c}function i(a,b){for(var c=0,d=a.loads.length;d>c;c++)if(a.loads[c]==b)return;a.loads.push(b),b.linkSets.push(a),"loaded"!=b.status&&a.loadingCount++;for(var e=a.loader,c=0,d=b.dependencies.length;d>c;c++){var f=b.dependencies[c].value;if(!e.modules[f])for(var g=0,h=e.loads.length;h>g;g++)if(e.loads[g].name==f){i(a,e.loads[g]);break}}}function j(a,b){if(a.loadingCount--,!(a.loadingCount>0)){var c=a.loads[0];if(a.loader.loaderObj.execute===!1){for(var d=[].concat(a.loads),e=0;ee;e++){var g=d[e];c.loaderObj.failed=c.loaderObj.failed||[],-1==c.loaderObj.failed.indexOf(g)&&c.loaderObj.failed.push(g);var h=z.call(g.linkSets,a);if(g.linkSets.splice(h,1),0==g.linkSets.length){var i=z.call(a.loader.loads,g);-1!=i&&a.loader.loads.splice(i,1)}}a.reject(b)}function l(a,b){if(a.loaderObj.trace){a.loaderObj.loads||(a.loaderObj.loads={});var c={};b.dependencies.forEach(function(a){c[a.key]=a.value}),a.loaderObj.loads[b.name]={name:b.name,deps:b.dependencies.map(function(a){return a.key}),depMap:c,address:b.address,metadata:b.metadata,source:b.source,kind:b.kind}}b.name&&(a.modules[b.name]=b.module);var d=z.call(a.loads,b);-1!=d&&a.loads.splice(d,1);for(var e=0,f=b.linkSets.length;f>e;e++)d=z.call(b.linkSets[e].loads,b),-1!=d&&b.linkSets[e].loads.splice(d,1);b.linkSets.splice(0,b.linkSets.length)}function m(a,b,c,d){if(c[a.groupIndex]=c[a.groupIndex]||[],-1==z.call(c[a.groupIndex],a)){c[a.groupIndex].push(a);for(var e=0;e=0;f--){for(var g=c[f],h=0;hb;b++)if(this[b]===a)return b;return-1},A={};r.prototype={define:function(a,b,c){if(A[a])throw new TypeError("Module is already loading.");return A[a]=new x(g({step:c&&c.address?"fetch":"translate",loader:this._loader,moduleName:a,moduleMetadata:c&&c.metadata||{},moduleSource:b,moduleAddress:c&&c.address})),A[a].then(function(){delete A[a]})},load:function(a){return this._loader.modules[a]?(q(this._loader.modules[a],[],this._loader),x.resolve(this._loader.modules[a].module)):A[a]?A[a]:(A[a]=b(this._loader,a,{}),A[a].then(function(){delete A[a]}))},module:function(b,c){var d=a();d.address=c&&c.address;var e=h(this._loader,d),g=x.resolve(b),i=this._loader,j=e.done.then(function(){return p(i,d)});return f(i,d,g),j},"import":function(a,c){var d=this;return x.resolve(d.normalize(a,c&&c.name,c&&c.address)).then(function(a){var e=d._loader;return e.modules[a]?(q(e.modules[a],[],e._loader),x.resolve(e.modules[a].module)):(A[a]||(A[a]=b(e,a,c||{}))).then(function(b){return delete A[a],p(e,b)})})},eval:function(){throw new TypeError("Eval not implemented in polyfill")},get:function(a){return this._loader.modules[a]?(q(this._loader.modules[a],[],this),this._loader.modules[a].module):void 0},has:function(a){return!!this._loader.modules[a]},set:function(a,b){if(!b.__esModule)throw new TypeError("Set must be a module");this._loader.modules[a]={module:b}},"delete":function(a){return this._loader.modules[a]?delete this._loader.modules[a]:!1},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(a){return a},locate:function(a){return a.name},fetch:function(){throw new TypeError("Fetch not implemented")},translate:function(a){return a.source},instantiate:function(){}};var B=0;"object"==typeof exports&&(module.exports=r),__global.Reflect=__global.Reflect||{},__global.Reflect.Loader=__global.Reflect.Loader||r,__global.LoaderPolyfill=r,__global.Module=u}()}("undefined"!=typeof global?global:this),function(a){function b(a){var b=String(a).replace(/^\s+|\s+$/g,"").match(/^([^:\/?#]+:)?(\/\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/);return b?{href:b[0]||"",protocol:b[1]||"",authority:b[2]||"",host:b[3]||"",hostname:b[4]||"",port:b[5]||"",pathname:b[6]||"",search:b[7]||"",hash:b[8]||""}:null}function c(a,c){function d(a){var b=[];return a.replace(/^(\.\.?(\/|$))+/,"").replace(/\/(\.(\/|$))+/g,"/").replace(/\/\.\.$/,"/../").replace(/\/?[^\/]*/g,function(a){"/.."===a?b.pop():b.push(a)}),b.join("").replace(/^\//,"/"===a.charAt(0)?"/":"")}return c=b(c||""),a=b(a||""),c&&a?(c.protocol||a.protocol)+(c.protocol||c.authority?c.authority:a.authority)+d(c.protocol||c.authority||"/"===c.pathname.charAt(0)?c.pathname:c.pathname?(a.authority&&!a.pathname?"/":"")+a.pathname.slice(0,a.pathname.lastIndexOf("/")+1)+c.pathname:a.pathname)+(c.protocol||c.authority||c.pathname?c.search:c.search||a.search)+c.hash:null}function d(){document.removeEventListener("DOMContentLoaded",d,!1),window.removeEventListener("load",d,!1),e()}function e(){for(var a=document.getElementsByTagName("script"),b=0;b2)throw new TypeError("Only one wildcard in a path is permitted");1==g.length?d==f&&f.length>e.length&&(e=f):d.substr(0,g[0].length)==g[0]&&d.substr(d.length-g[1].length)==g[1]&&(e=f,b=d.substr(g[0].length,d.length-g[1].length-g[0].length))}var h=this.paths[e];return b&&(h=h.replace("*",b)),c(this.baseURL,h)},fetch:function(a){return new i(function(b,d){f(c(this.baseURL,a.address),function(a){b(a)},d)})}});if(g){var l=window.location.href.split("#")[0].split("?")[0];k.baseURL=l.substring(0,l.lastIndexOf("/")+1)}else k.baseURL="./";if(k.paths={"*":"*.js"},a.System&&a.traceur&&(a.traceurSystem=a.System),g&&(a.System=k),g){var m=document.getElementsByTagName("script");m=m[m.length-1],"complete"===document.readyState?setTimeout(e):document.addEventListener&&(document.addEventListener("DOMContentLoaded",d,!1),window.addEventListener("load",d,!1)),m.getAttribute("data-init")&&window[m.getAttribute("data-init")]()}"object"==typeof exports&&(module.exports=k)}("undefined"!=typeof global?global:this); \ No newline at end of file +!function(){var a,b,c,d;!function(){var e={},f={};a=function(a,b,c){e[a]={deps:b,callback:c}},d=c=b=function(a){function c(b){if("."!==b.charAt(0))return b;for(var c=b.split("/"),d=a.split("/").slice(0,-1),e=0,f=c.length;f>e;e++){var g=c[e];if(".."===g)d.pop();else{if("."===g)continue;d.push(g)}}return d.join("/")}if(d._eak_seen=e,f[a])return f[a];if(f[a]={},!e[a])throw new Error("Could not find module "+a);for(var g,h=e[a],i=h.deps,j=h.callback,k=[],l=0,m=i.length;m>l;l++)k.push("exports"===i[l]?g={}:b(c(i[l])));var n=j.apply(this,k);return f[a]=g||n}}(),a("promise/all",["./utils","exports"],function(a,b){"use strict";function c(a){var b=this;if(!d(a))throw new TypeError("You must pass an array to all.");return new b(function(b,c){function d(a){return function(b){f(a,b)}}function f(a,c){h[a]=c,0===--i&&b(h)}var g,h=[],i=a.length;0===i&&b([]);for(var j=0;jf;f++)if(e=b.loads[f],e.name==c)return e;return e=a(c),b.loads.push(e),d(b,e),e})}function d(a,b){e(a,b,x.resolve().then(function(){return a.loaderObj.locate({name:b.name,metadata:b.metadata})}))}function e(a,b,c){g(a,b,c.then(function(c){return"loading"==b.status?(b.address=c,a.loaderObj.fetch({name:b.name,metadata:b.metadata,address:c})):void 0}))}function f(a){function b(a){function b(a){-1==z.call(c,a)&&c.push(a)}var c=[];return t(a,function(a){"EXPORT_DECLARATION"==a.type?a.declaration.moduleSpecifier&&b(a.declaration.moduleSpecifier.token.processedValue):"IMPORT_DECLARATION"==a.type?b(a.moduleSpecifier.token.processedValue):"MODULE_DECLARATION"==a.type&&b(a.expression.token.processedValue)}),c}if(!__global.traceur)throw new TypeError("Include Traceur for module syntax support");v=v||__global.traceur;var c;try{var d=new v.syntax.Parser(new v.syntax.SourceFile(a.address,a.source)),e=d.parseModule();a.kind="declarative",c=b(e);var f=v.options.sourceMaps,g=v.options.modules;v.options.sourceMaps=!0,v.options.modules="instantiate";var h=new v.util.ErrorReporter;h.reportMessageInternal=function(a,b){throw new SyntaxError(b,a.start&&a.start.line_,a.start&&a.start.column_)};var i=__global.System;__global.System=__global.traceurSystem;var j=new v.codegeneration.module.AttachModuleNameTransformer(a.name).transformAny(e);j=new v.codegeneration.FromOptionsTransformer(h).transform(j);var k=new v.outputgeneration.SourceMapGenerator({file:a.address}),l={sourceMapGenerator:k},m=v.outputgeneration.TreeWriter.write(j,l);__global.btoa&&(m+="\n//# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(l.sourceMap)))+"\n");var n=System.register;System.register=function(b,c,d){a.declare="string"==typeof b?d:c},__eval(m,__global,a.name)}catch(o){throw("SyntaxError"==o.name||"TypeError"==o.name)&&(o.message="Evaluating "+(a.name||a.address)+"\n "+o.message),n&&(System.register=n),i&&(__global.System=i),f&&(v.options.sourceMaps=f),g&&(v.options.modules=g),o}return System.register=n,__global.System=i,v.options.sourceMaps=f,v.options.modules=g,c}function g(a,b,d){d.then(function(c){return"loading"==b.status?a.loaderObj.translate({name:b.name,metadata:b.metadata,address:b.address,source:c}):void 0}).then(function(c){return"loading"==b.status?(b.source=c,a.loaderObj.instantiate({name:b.name,metadata:b.metadata,address:b.address,source:c})):void 0}).then(function(d){if("loading"==b.status){var e;if(void 0===d)b.address=b.address||"anon"+ ++B,e=f(b);else{if("object"!=typeof d)throw TypeError("Invalid instantiate return value");e=d.deps||[],b.execute=d.execute,b.kind="dynamic"}b.dependencies=[],b.depsList=e;for(var g=[],h=0,i=e.length;i>h;h++)(function(d){g.push(c(a,d,b.name,b.address).then(function(a){if(b.dependencies.push({key:d,value:a.name}),a.status&&"linked"!=a.status)for(var c=b.linkSets.concat([]),e=0,f=c.length;f>e;e++)j(c[e],a)}))})(e[h]);return x.all(g)}}).then(function(){b.status="loaded";for(var a=b.linkSets.concat([]),c=0,d=a.length;d>c;c++)k(a[c],b)})["catch"](function(a){b.status="failed",b.exception=a;for(var c=b.linkSets.concat([]),d=0,e=c.length;e>d;d++)l(c[d],a)})}function h(b){return function(c){var f=b.loader,h=b.moduleName,j=b.step;if(f.modules[h])throw new TypeError('"'+h+'" already exists in the module table');for(var k=0,l=f.loads.length;l>k;k++)if(f.loads[k].name==h)throw new TypeError('"'+h+'" already loading');var m=a(h);m.metadata=b.moduleMetadata;var n=i(f,m);f.loads.push(m),c(n.done),"locate"==j?d(f,m):"fetch"==j?e(f,m,x.resolve(b.moduleAddress)):(m.address=b.moduleAddress,g(f,m,x.resolve(b.moduleSource)))}}function i(a,b){var c={loader:a,loads:[],loadingCount:0};return c.done=new x(function(a,b){c.resolve=a,c.reject=b}),j(c,b),c}function j(a,b){for(var c=0,d=a.loads.length;d>c;c++)if(a.loads[c]==b)return;a.loads.push(b),b.linkSets.push(a),"loaded"!=b.status&&a.loadingCount++;for(var e=a.loader,c=0,d=b.dependencies.length;d>c;c++){var f=b.dependencies[c].value;if(!e.modules[f])for(var g=0,h=e.loads.length;h>g;g++)if(e.loads[g].name==f){j(a,e.loads[g]);break}}}function k(a,b){if(a.loadingCount--,!(a.loadingCount>0)){var c=a.loads[0];if(a.loader.loaderObj.execute===!1){for(var d=[].concat(a.loads),e=0;ee;e++){var g=d[e];c.loaderObj.failed=c.loaderObj.failed||[],-1==c.loaderObj.failed.indexOf(g)&&c.loaderObj.failed.push(g);var h=z.call(g.linkSets,a);if(g.linkSets.splice(h,1),0==g.linkSets.length){var i=z.call(a.loader.loads,g);-1!=i&&a.loader.loads.splice(i,1)}}a.reject(b)}function m(a,b){if(a.loaderObj.trace){a.loaderObj.loads||(a.loaderObj.loads={});var c={};b.dependencies.forEach(function(a){c[a.key]=a.value}),a.loaderObj.loads[b.name]={name:b.name,deps:b.dependencies.map(function(a){return a.key}),depMap:c,address:b.address,metadata:b.metadata,source:b.source,kind:b.kind}}b.name&&(a.modules[b.name]=b.module);var d=z.call(a.loads,b);-1!=d&&a.loads.splice(d,1);for(var e=0,f=b.linkSets.length;f>e;e++)d=z.call(b.linkSets[e].loads,b),-1!=d&&b.linkSets[e].loads.splice(d,1);b.linkSets.splice(0,b.linkSets.length)}function n(a,b,c,d){if(c[a.groupIndex]=c[a.groupIndex]||[],-1==z.call(c[a.groupIndex],a)){c[a.groupIndex].push(a);for(var e=0;e=0;f--){for(var g=c[f],h=0;hb;b++)if(this[b]===a)return b;return-1},A={};s.prototype={constructor:s,define:function(a,b,c){if(A[a])throw new TypeError("Module is already loading.");return A[a]=new x(h({step:c&&c.address?"fetch":"translate",loader:this._loader,moduleName:a,moduleMetadata:c&&c.metadata||{},moduleSource:b,moduleAddress:c&&c.address})),A[a].then(function(){delete A[a]})},load:function(a){return this._loader.modules[a]?(r(this._loader.modules[a],[],this._loader),x.resolve(this._loader.modules[a].module)):A[a]?A[a]:(A[a]=b(this._loader,a,{}),A[a].then(function(){delete A[a]}))},module:function(b,c){var d=a();d.address=c&&c.address;var e=i(this._loader,d),f=x.resolve(b),h=this._loader,j=e.done.then(function(){return q(h,d)});return g(h,d,f),j},"import":function(a,c){var d=this;return x.resolve(d.normalize(a,c&&c.name,c&&c.address)).then(function(a){var e=d._loader;return e.modules[a]?(r(e.modules[a],[],e._loader),x.resolve(e.modules[a].module)):(A[a]||(A[a]=b(e,a,c||{}))).then(function(b){return delete A[a],q(e,b)})})},eval:function(){throw new TypeError("Eval not implemented in polyfill")},get:function(a){return this._loader.modules[a]?(r(this._loader.modules[a],[],this),this._loader.modules[a].module):void 0},has:function(a){return!!this._loader.modules[a]},newModule:function(a){return new u(a)},set:function(a,b){if(!b.__esModule)throw new TypeError("Set must be a module");this._loader.modules[a]={module:b}},"delete":function(a){return this._loader.modules[a]?delete this._loader.modules[a]:!1},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(a){return a},locate:function(a){return a.name},fetch:function(){throw new TypeError("Fetch not implemented")},translate:function(a){return a.source},instantiate:function(){}};var B=0;"object"==typeof exports&&(module.exports=s),__global.Reflect=__global.Reflect||{},__global.Reflect.Loader=__global.Reflect.Loader||s,__global.LoaderPolyfill=s,__global.Module=u}()}("undefined"!=typeof global?global:this),function(a){function b(a){var b=String(a).replace(/^\s+|\s+$/g,"").match(/^([^:\/?#]+:)?(\/\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/);return b?{href:b[0]||"",protocol:b[1]||"",authority:b[2]||"",host:b[3]||"",hostname:b[4]||"",port:b[5]||"",pathname:b[6]||"",search:b[7]||"",hash:b[8]||""}:null}function c(a,c){function d(a){var b=[];return a.replace(/^(\.\.?(\/|$))+/,"").replace(/\/(\.(\/|$))+/g,"/").replace(/\/\.\.$/,"/../").replace(/\/?[^\/]*/g,function(a){"/.."===a?b.pop():b.push(a)}),b.join("").replace(/^\//,"/"===a.charAt(0)?"/":"")}return c=b(c||""),a=b(a||""),c&&a?(c.protocol||a.protocol)+(c.protocol||c.authority?c.authority:a.authority)+d(c.protocol||c.authority||"/"===c.pathname.charAt(0)?c.pathname:c.pathname?(a.authority&&!a.pathname?"/":"")+a.pathname.slice(0,a.pathname.lastIndexOf("/")+1)+c.pathname:a.pathname)+(c.protocol||c.authority||c.pathname?c.search:c.search||a.search)+c.hash:null}function d(){document.removeEventListener("DOMContentLoaded",d,!1),window.removeEventListener("load",d,!1),e()}function e(){for(var a=document.getElementsByTagName("script"),b=0;b2)throw new TypeError("Only one wildcard in a path is permitted");1==g.length?d==f&&f.length>e.length&&(e=f):d.substr(0,g[0].length)==g[0]&&d.substr(d.length-g[1].length)==g[1]&&(e=f,b=d.substr(g[0].length,d.length-g[1].length-g[0].length))}var h=this.paths[e];return b&&(h=h.replace("*",b)),c(this.baseURL,h)},fetch:function(a){return new i(function(b,d){f(c(this.baseURL,a.address),function(a){b(a)},d)})}});if(g){var l=window.location.href.split("#")[0].split("?")[0];k.baseURL=l.substring(0,l.lastIndexOf("/")+1)}else k.baseURL="./";if(k.paths={"*":"*.js"},a.System&&a.traceur&&(a.traceurSystem=a.System),g&&(a.System=k),g){var m=document.getElementsByTagName("script");m=m[m.length-1],"complete"===document.readyState?setTimeout(e):document.addEventListener&&(document.addEventListener("DOMContentLoaded",d,!1),window.addEventListener("load",d,!1)),m.getAttribute("data-init")&&window[m.getAttribute("data-init")]()}"object"==typeof exports&&(module.exports=k)}("undefined"!=typeof global?global:this); \ No newline at end of file diff --git a/lib/loader.js b/lib/loader.js index 85602c0..a463126 100644 --- a/lib/loader.js +++ b/lib/loader.js @@ -6,7 +6,7 @@ - Implemented exactly to the 2014-04-27 Specification Draft. Loader implemented to the modules draft from https://github.com/jorendorff/js-loaders/blob/e60d3651/specs/es6-modules-2013-12-02.pdf - + - All functions are commented with their spec numbers, with spec differences commented. - All spec bugs are commented in this code with links to the spec bugs. @@ -17,7 +17,7 @@ - When the traceur global is detected, declarative modules are transformed by Traceur into the `instantiate` System.register output. - - Realm implementation is entirely omitted. As such, the Loader.realm accessor will + - Realm implementation is entirely omitted. As such, the Loader.realm accessor will throw an error, as well as Loader.eval. Realm arguments are not passed. - Loader module table iteration currently not yet implemented @@ -54,7 +54,7 @@ function logloads(loads) { var loads = System._loader.loads; var linkSets = []; - + for (var i = 0; i < loads.length; i++) { var load = loads[i]; console.assert(load.status == 'loading' || load.status == 'loaded', 'Each load is loading or loaded'); @@ -167,7 +167,7 @@ function logloads(loads) { } // 15.2.3.2.2 createLoadRequestObject, absorbed into calling functions - + // 15.2.4 // 15.2.4.1 @@ -216,7 +216,7 @@ function logloads(loads) { return load; }); } - + // 15.2.4.3 function proceedToLocate(loader, load) { proceedToFetch(loader, load, @@ -244,6 +244,106 @@ function logloads(loads) { ); } + // Returns an array of ModuleSpecifiers + function parse(load) { + if (!__global.traceur) + throw new TypeError('Include Traceur for module syntax support'); + + // 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; + } + + traceur = traceur || __global.traceur; + + console.assert(load.source, 'Non-empty source'); + + var depsList; + 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; + return depsList; + } + // 15.2.4.5 function proceedToTranslate(loader, load, p) { p @@ -269,75 +369,8 @@ function logloads(loads) { 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; + depsList = parse(load); } else if (typeof instantiateResult == 'object') { depsList = instantiateResult.deps || []; @@ -423,7 +456,7 @@ function logloads(loads) { var name = stepState.moduleName; var step = stepState.step; - if (loader.modules[name]) + 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 @@ -433,7 +466,7 @@ function logloads(loads) { throw new TypeError('"' + name + '" already loading'); var load = createLoad(name); - + load.metadata = stepState.moduleMetadata; var linkSet = createLinkSet(loader, load); @@ -502,7 +535,7 @@ function logloads(loads) { for (var j = 0, d = loader.loads.length; j < d; j++) { if (loader.loads[j].name != name) continue; - + addLoadToLinkSet(linkSet, loader.loads[j]); break; } @@ -651,7 +684,7 @@ function logloads(loads) { // 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); @@ -757,11 +790,11 @@ function logloads(loads) { 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; } } @@ -794,7 +827,7 @@ function logloads(loads) { load.status = 'linked'; } - + // 15.2.5.5.1 LinkImports not implemented @@ -816,7 +849,7 @@ function logloads(loads) { * 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 @@ -924,12 +957,12 @@ function logloads(loads) { 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]; @@ -1004,31 +1037,6 @@ function logloads(loads) { } } - // 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