diff --git a/dist/es6-module-loader-dev.js b/dist/es6-module-loader-dev.js new file mode 100644 index 0000000..7236043 --- /dev/null +++ b/dist/es6-module-loader-dev.js @@ -0,0 +1,8 @@ +/* + * es6-module-loader v0.16.6 + * https://github.com/ModuleLoader/es6-module-loader + * Copyright (c) 2015 Guy Bedford, Luke Hoban, Addy Osmani; Licensed MIT + */ + +!function(a){function b(a,b){var c;if(a instanceof Error){var c=new Error(a.message,a.fileName,a.lineNumber);c.message=a.message+"\n "+b,c.stack=a.stack}else c=a+"\n "+b;return c}function c(a,c,d){try{new Function(a).call(d)}catch(e){throw b(e,"Evaluating "+c)}}function d(){}function e(){this._loader={loaderObj:this,loads:[],modules:{},importPromises:{},moduleRecords:{}},l(this,"global",{get:function(){return a}})}function f(a,b){if("string"!=typeof a)throw new TypeError("URL must be a string");var c=String(a).replace(/^\s+|\s+$/g,"").match(/^([^:\/?#]+:)?(?:\/\/(?:([^:@\/?#]*)(?::([^:@\/?#]*))?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/);if(!c)throw new RangeError;var d=c[1]||"",e=c[2]||"",g=c[3]||"",h=c[4]||"",i=c[5]||"",j=c[6]||"",k=c[7]||"",l=c[8]||"",m=c[9]||"";if(void 0!==b){var n=b instanceof f?b:new f(b),o=""===d&&""===h&&""===e;o&&""===k&&""===l&&(l=n.search),o&&"/"!==k.charAt(0)&&(k=""!==k?(""===n.host&&""===n.username||""!==n.pathname?"":"/")+n.pathname.slice(0,n.pathname.lastIndexOf("/")+1)+k:n.pathname);var p=[];k.replace(/^(\.\.?(\/|$))+/,"").replace(/\/(\.(\/|$))+/g,"/").replace(/\/\.\.$/,"/../").replace(/\/?[^\/]*/g,function(a){"/.."===a?p.pop():p.push(a)}),k=p.join("").replace(/^\//,"/"===k.charAt(0)?"/":""),o&&(j=n.port,i=n.hostname,h=n.host,g=n.password,e=n.username),""===d&&(d=n.protocol)}"file:"==d&&(k=k.replace(/\\/g,"/")),this.origin=d+(""!==d||""!==h?"//":"")+h,this.href=d+(""!==d||""!==h?"//":"")+(""!==e?e+(""!==g?":"+g:"")+"@":"")+h+k+l+m,this.protocol=d,this.username=e,this.password=g,this.host=h,this.hostname=i,this.port=j,this.pathname=k,this.search=l,this.hash=m}function g(){e.call(this),this.paths={}}function h(a,b){var c,d="",e=0;for(var f in a.paths){var g=f.split("*");if(g.length>2)throw new TypeError("Only one wildcard in a path is permitted");if(1==g.length){if(b==f){d=f;break}}else{var h=f.split("/").length;h>=e&&b.substr(0,g[0].length)==g[0]&&b.substr(b.length-g[1].length)==g[1]&&(e=h,d=f,c=b.substr(g[0].length,b.length-g[1].length-g[0].length))}}var i=a.paths[d]||b;return c&&(i=i.replace("*",c)),i}function i(){}var j=("undefined"==typeof window&&"undefined"!=typeof self&&"undefined"!=typeof importScripts,"undefined"!=typeof window&&"undefined"!=typeof document),k="undefined"!=typeof process&&!!process.platform.match(/^win/);a.console||(a.console={assert:function(){}});var l,m=Array.prototype.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1};!function(){try{Object.defineProperty({},"a",{})&&(l=Object.defineProperty)}catch(a){l=function(a,b,c){try{a[b]=c.value||c.get.call(a)}catch(d){}}}}();var n;if("undefined"!=typeof document&&document.getElementsByTagName){if(n=document.baseURI,!n){var o=document.getElementsByTagName("base");n=o[0]&&o[0].href||window.location.href}n=n.split("#")[0].split("?")[0],n=n.substr(0,n.lastIndexOf("/")+1)}else if("undefined"!=typeof process&&process.cwd)n="file://"+(k?"/":"")+process.cwd()+"/",k&&(n=n.replace(/\\/g,"/"));else{if("undefined"==typeof location)throw new TypeError("No environment baseURI");n=a.location.href}var p="function"==typeof a.URL&&a.URL||f;!function(){function f(a){return{status:"loading",name:a,linkSets:[],dependencies:[],metadata:{}}}function g(a,b,c){return new Promise(n({step:c.address?"fetch":"locate",loader:a,moduleName:b,moduleMetadata:c&&c.metadata||{},moduleSource:c.source,moduleAddress:c.address}))}function h(a,b,c,d){return new Promise(function(e){e(a.loaderObj.normalize(b,c,d))}).then(function(b){var c;if(a.modules[b])return c=f(b),c.status="linked",c.module=a.modules[b],c;for(var d=0,e=a.loads.length;e>d;d++)if(c=a.loads[d],c.name==b)return c;return c=f(b),a.loads.push(c),i(a,c),c})}function i(a,b){j(a,b,Promise.resolve().then(function(){return a.loaderObj.locate({name:b.name,metadata:b.metadata})}))}function j(a,b,c){k(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 k(b,d,e){e.then(function(e){return"loading"==d.status?Promise.resolve(b.loaderObj.translate({name:d.name,metadata:d.metadata,address:d.address,source:e})).then(function(a){return d.source=a,b.loaderObj.instantiate({name:d.name,metadata:d.metadata,address:d.address,source:a})}).then(function(e){if(void 0===e)return d.address=d.address||"",d.isDeclarative=!0,q.call(b.loaderObj,d).then(function(b){var e=a.System,f=e.register;e.register=function(a,b,c){"string"!=typeof a&&(c=b,b=a),d.declare=c,d.depsList=b},c(b,d.address,{}),e.register=f});if("object"!=typeof e)throw TypeError("Invalid instantiate return value");d.depsList=e.deps||[],d.execute=e.execute,d.isDeclarative=!1}).then(function(){d.dependencies=[];for(var a=d.depsList,c=[],e=0,f=a.length;f>e;e++)(function(a,e){c.push(h(b,a,d.name,d.address).then(function(b){if(d.dependencies[e]={key:a,value:b.name},"linked"!=b.status)for(var c=d.linkSets.concat([]),f=0,g=c.length;g>f;f++)p(c[f],b)}))})(a[e],e);return Promise.all(c)}).then(function(){d.status="loaded";for(var a=d.linkSets.concat([]),b=0,c=a.length;c>b;b++)s(a[b],d)}):void 0})["catch"](function(a){d.status="failed",d.exception=a;for(var b=d.linkSets.concat([]),c=0,e=b.length;e>c;c++)t(b[c],d,a)})}function n(a){return function(b){var c=a.loader,d=a.moduleName,e=a.step;if(c.modules[d])throw new TypeError('"'+d+'" already exists in the module table');for(var g,h=0,l=c.loads.length;l>h;h++)if(c.loads[h].name==d)return g=c.loads[h],"translate"!=e||g.source||(g.address=a.moduleAddress,k(c,g,Promise.resolve(a.moduleSource))),g.linkSets[0].done.then(function(){b(g)});var m=f(d);m.metadata=a.moduleMetadata;var n=o(c,m);c.loads.push(m),b(n.done),"locate"==e?i(c,m):"fetch"==e?j(c,m,Promise.resolve(a.moduleAddress)):(m.address=a.moduleAddress,k(c,m,Promise.resolve(a.moduleSource)))}}function o(a,b){var c={loader:a,loads:[],startingLoad:b,loadingCount:0};return c.done=new Promise(function(a,b){c.resolve=a,c.reject=b}),p(c,b),c}function p(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){p(a,e.loads[g]);break}}}function r(a){var b=!1;try{y(a,function(c,d){t(a,c,d),b=!0})}catch(c){t(a,null,c),b=!0}return b}function s(a,b){if(a.loadingCount--,!(a.loadingCount>0)){var c=a.startingLoad;if(a.loader.loaderObj.execute===!1){for(var d=[].concat(a.loads),e=0,f=d.length;f>e;e++){var b=d[e];b.module=b.isDeclarative?{name:b.name,module:G({}),evaluated:!0}:{module:G({})},b.status="linked",u(a.loader,b)}return a.resolve(c)}var g=r(a);g||a.resolve(c)}}function t(a,c,d){var e=a.loader;c?(c&&a.loads[0].name!=c.name&&(d=b(d,"Error loading "+c.name+" from "+a.loads[0].name)),c&&(d=b(d,"Error loading "+c.name))):d=b(d,"Error linking "+a.loads[0].name);for(var f=a.loads.concat([]),g=0,h=f.length;h>g;g++){var c=f[g];e.loaderObj.failed=e.loaderObj.failed||[],-1==m.call(e.loaderObj.failed,c)&&e.loaderObj.failed.push(c);var i=m.call(c.linkSets,a);if(c.linkSets.splice(i,1),0==c.linkSets.length){var j=m.call(a.loader.loads,c);-1!=j&&a.loader.loads.splice(j,1)}}a.reject(d)}function u(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.isDeclarative?"declarative":"dynamic"}}b.name&&(a.modules[b.name]=b.module);var d=m.call(a.loads,b);-1!=d&&a.loads.splice(d,1);for(var e=0,f=b.linkSets.length;f>e;e++)d=m.call(b.linkSets[e].loads,b),-1!=d&&b.linkSets[e].loads.splice(d,1);b.linkSets.splice(0,b.linkSets.length)}function v(a,b,c){try{var e=b.execute()}catch(f){return void c(b,f)}return e&&e instanceof d?e:void c(b,new TypeError("Execution must define a Module instance"))}function w(a,b,c){var d=a._loader.importPromises;return d[b]=c.then(function(a){return d[b]=void 0,a},function(a){throw d[b]=void 0,a})}function x(a,b,c){if(c[a.groupIndex]=c[a.groupIndex]||[],-1==m.call(c[a.groupIndex],a)){c[a.groupIndex].push(a);for(var d=0,e=b.length;e>d;d++)for(var f=b[d],g=0;g=0;g--){for(var h=d[g],i=0;ic;c++){var g=e.importers[c];if(!g.locked)for(var h=0;hh;h++){var j=b.dependencies[h].value,k=d.modules[j];if(!k)for(var l=0;lg;g++){var i=f[g];if(i&&-1==m.call(c,i)&&(e=E(i,c,d)))return e=b(e,"Error evaluating "+i.name)}if(a.failed)return new Error("Module failed execution.");if(!a.evaluated)return a.evaluated=!0,e=B(a),e?a.failed=!0:Object.preventExtensions&&Object.preventExtensions(a.module),a.execute=void 0,e}}var F=0;e.prototype={constructor:e,define:function(a,b,c){if(this._loader.importPromises[a])throw new TypeError("Module is already loading.");return w(this,a,new Promise(n({step:"translate",loader:this._loader,moduleName:a,moduleMetadata:c&&c.metadata||{},moduleSource:b,moduleAddress:c&&c.address})))},"delete":function(a){var b=this._loader;return delete b.importPromises[a],delete b.moduleRecords[a],b.modules[a]?delete b.modules[a]:!1},get:function(a){return this._loader.modules[a]?(D(this._loader.modules[a],[],this),this._loader.modules[a].module):void 0},has:function(a){return!!this._loader.modules[a]},"import":function(a,b){"object"==typeof b&&(b=b.name);var c=this;return Promise.resolve(c.normalize(a,b)).then(function(a){var b=c._loader;return b.modules[a]?(D(b.modules[a],[],b._loader),b.modules[a].module):b.importPromises[a]||w(c,a,g(b,a,{}).then(function(c){return delete b.importPromises[a],C(b,c)}))})},load:function(a){return this._loader.modules[a]?(D(this._loader.modules[a],[],this._loader),Promise.resolve(this._loader.modules[a].module)):this._loader.importPromises[a]||w(this,a,g(this._loader,a,{}))},module:function(a,b){var c=f();c.address=b&&b.address;var d=o(this._loader,c),e=Promise.resolve(a),g=this._loader,h=d.done.then(function(){return C(g,c)});return k(g,c,e),h},newModule:function(a){if("object"!=typeof a)throw new TypeError("Expected object");var b,c=new d;if(Object.getOwnPropertyNames&&null!=a)b=Object.getOwnPropertyNames(a);else{b=[];for(var e in a)b.push(e)}for(var f=0;f') + '\n'); + if (load) { + if (load && linkSet.loads[0].name != load.name) + exc = addToError(exc, 'Error loading ' + load.name + ' from ' + linkSet.loads[0].name); + + if (load) + exc = addToError(exc, 'Error loading ' + load.name); + } + else { + exc = addToError(exc, 'Error linking ' + linkSet.loads[0].name); + } - if (load) - exc = addToError(exc, 'Error loading "' + load.name + '" at ' + (load.address || '') + '\n'); var loads = linkSet.loads.concat([]); for (var i = 0, l = loads.length; i < l; i++) { @@ -611,6 +673,193 @@ function logloads(loads) { load.linkSets.splice(0, load.linkSets.length); } + function doDynamicExecute(linkSet, load, linkError) { + try { + var module = load.execute(); + } + catch(e) { + linkError(load, e); + return; + } + if (!module || !(module instanceof Module)) + linkError(load, new TypeError('Execution must define a Module instance')); + else + return module; + } + + // 26.3 Loader + + // 26.3.1.1 + // defined at top + + // importPromises adds ability to import a module twice without error - https://bugs.ecmascript.org/show_bug.cgi?id=2601 + function createImportPromise(loader, name, promise) { + var importPromises = loader._loader.importPromises; + return importPromises[name] = promise.then(function(m) { + importPromises[name] = undefined; + return m; + }, function(e) { + importPromises[name] = undefined; + throw e; + }); + } + + Loader.prototype = { + // 26.3.3.1 + constructor: Loader, + // 26.3.3.2 + define: function(name, source, options) { + // check if already defined + if (this._loader.importPromises[name]) + throw new TypeError('Module is already loading.'); + return createImportPromise(this, name, new Promise(asyncStartLoadPartwayThrough({ + step: 'translate', + loader: this._loader, + moduleName: name, + moduleMetadata: options && options.metadata || {}, + moduleSource: source, + moduleAddress: options && options.address + }))); + }, + // 26.3.3.3 + 'delete': function(name) { + var loader = this._loader; + delete loader.importPromises[name]; + delete loader.moduleRecords[name]; + return loader.modules[name] ? delete loader.modules[name] : false; + }, + // 26.3.3.4 entries not implemented + // 26.3.3.5 + get: function(key) { + if (!this._loader.modules[key]) + return; + doEnsureEvaluated(this._loader.modules[key], [], this); + return this._loader.modules[key].module; + }, + // 26.3.3.7 + has: function(name) { + return !!this._loader.modules[name]; + }, + // 26.3.3.8 + 'import': function(name, parentName, parentAddress) { + if (typeof parentName == 'object') + parentName = parentName.name; + + // run normalize first + var loaderObj = this; + + // added, see https://bugs.ecmascript.org/show_bug.cgi?id=2659 + return Promise.resolve(loaderObj.normalize(name, parentName)) + .then(function(name) { + var loader = loaderObj._loader; + + if (loader.modules[name]) { + doEnsureEvaluated(loader.modules[name], [], loader._loader); + return loader.modules[name].module; + } + + return loader.importPromises[name] || createImportPromise(loaderObj, name, + loadModule(loader, name, {}) + .then(function(load) { + delete loader.importPromises[name]; + return evaluateLoadedModule(loader, load); + })); + }); + }, + // 26.3.3.9 keys not implemented + // 26.3.3.10 + load: function(name, options) { + if (this._loader.modules[name]) { + doEnsureEvaluated(this._loader.modules[name], [], this._loader); + return Promise.resolve(this._loader.modules[name].module); + } + return this._loader.importPromises[name] || createImportPromise(this, name, loadModule(this._loader, name, {})); + }, + // 26.3.3.11 + 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; + }, + // 26.3.3.12 + newModule: function (obj) { + if (typeof obj != 'object') + throw new TypeError('Expected object'); + + // we do this to be able to tell if a module is a module privately in ES5 + // by doing m instanceof Module + var m = new Module(); + + var pNames; + if (Object.getOwnPropertyNames && obj != null) { + pNames = Object.getOwnPropertyNames(obj); + } + else { + pNames = []; + for (var key in obj) + pNames.push(key); + } + + for (var i = 0; i < pNames.length; i++) (function(key) { + defineProperty(m, key, { + configurable: false, + enumerable: true, + get: function () { + return obj[key]; + } + }); + })(pNames[i]); + + if (Object.preventExtensions) + Object.preventExtensions(m); + + return m; + }, + // 26.3.3.14 + set: function(name, module) { + if (!(module instanceof Module)) + throw new TypeError('Loader.set(' + name + ', module) must be a module'); + this._loader.modules[name] = { + module: module + }; + }, + // 26.3.3.15 values not implemented + // 26.3.3.16 @@iterator not implemented + // 26.3.3.17 @@toStringTag not implemented + + // 26.3.3.18.1 + normalize: function(name, referrerName, referrerAddress) { + return name; + }, + // 26.3.3.18.2 + locate: function(load) { + return load.name; + }, + // 26.3.3.18.3 + fetch: function(load) { + }, + // 26.3.3.18.4 + translate: function(load) { + return load.source; + }, + // 26.3.3.18.5 + instantiate: function(load) { + } + }; + + var _newModule = Loader.prototype.newModule; + +/* + * ES6 Module Declarative Linking Code - Dev Build Only + */ + // 15.2.5.3 Module Linking Groups // 15.2.5.3.2 BuildLinkageGroups alternative implementation @@ -663,21 +912,8 @@ function logloads(loads) { } } - function doDynamicExecute(linkSet, load, linkError) { - try { - var module = load.execute(); - } - catch(e) { - linkError(load, e); - return; - } - if (!module || !(module instanceof Module)) - linkError(load, new TypeError('Execution must define a Module instance')); - else - return module; - } - // 15.2.5.4 + // declarative linking implementation function link(linkSet, linkError) { var loader = linkSet.loader; @@ -761,8 +997,11 @@ function logloads(loads) { for (var i = 0, l = module.importers.length; i < l; i++) { var importerModule = module.importers[i]; if (!importerModule.locked) { - var importerIndex = indexOf.call(importerModule.dependencies, module); - importerModule.setters[importerIndex](moduleObj); + for (var j = 0; j < importerModule.dependencies.length; ++j) { + if (importerModule.dependencies[j] === module) { + importerModule.setters[j](moduleObj); + } + } } } @@ -818,22 +1057,6 @@ function logloads(loads) { 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); - - doEnsureEvaluated(load.module, [], loader); - return load.module.module; - } - /* * Module Object non-exotic for ES5: * @@ -852,6 +1075,20 @@ function logloads(loads) { } } + // 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); + + doEnsureEvaluated(load.module, [], loader); + return load.module.module; + } + // propogate execution errors // see https://bugs.ecmascript.org/show_bug.cgi?id=2993 function doEnsureEvaluated(module, seen, loader) { @@ -879,7 +1116,7 @@ function logloads(loads) { err = ensureEvaluated(dep, seen, loader); // stop on error, see https://bugs.ecmascript.org/show_bug.cgi?id=2996 if (err) { - err = addToError(err, 'Error evaluating ' + dep.name + '\n'); + err = addToError(err, 'Error evaluating ' + dep.name); return err; } } @@ -906,276 +1143,35 @@ function logloads(loads) { module.execute = undefined; return err; } - - function addToError(err, msg) { - if (err instanceof Error) - err.message = msg + err.message; - else - err = msg + err; - return err; - } - - // 26.3 Loader - - // 26.3.1.1 - 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: {}, - importPromises: {}, - moduleRecords: {} - }; - - // 26.3.3.6 - defineProperty(this, 'global', { - get: function() { - return __global; - } - }); - - // 26.3.3.13 realm not implemented - } - - function Module() {} - - // importPromises adds ability to import a module twice without error - https://bugs.ecmascript.org/show_bug.cgi?id=2601 - function createImportPromise(loader, name, promise) { - var importPromises = loader._loader.importPromises; - return importPromises[name] = promise.then(function(m) { - importPromises[name] = undefined; - return m; - }, function(e) { - importPromises[name] = undefined; - throw e; - }); - } - - Loader.prototype = { - // 26.3.3.1 - constructor: Loader, - // 26.3.3.2 - define: function(name, source, options) { - // check if already defined - if (this._loader.importPromises[name]) - throw new TypeError('Module is already loading.'); - return createImportPromise(this, name, new Promise(asyncStartLoadPartwayThrough({ - step: 'translate', - loader: this._loader, - moduleName: name, - moduleMetadata: options && options.metadata || {}, - moduleSource: source, - moduleAddress: options && options.address - }))); - }, - // 26.3.3.3 - 'delete': function(name) { - var loader = this._loader; - delete loader.importPromises[name]; - delete loader.moduleRecords[name]; - return loader.modules[name] ? delete loader.modules[name] : false; - }, - // 26.3.3.4 entries not implemented - // 26.3.3.5 - get: function(key) { - if (!this._loader.modules[key]) - return; - doEnsureEvaluated(this._loader.modules[key], [], this); - return this._loader.modules[key].module; - }, - // 26.3.3.7 - has: function(name) { - return !!this._loader.modules[name]; - }, - // 26.3.3.8 - '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]) { - doEnsureEvaluated(loader.modules[name], [], loader._loader); - return loader.modules[name].module; - } - - return loader.importPromises[name] || createImportPromise(loaderObj, name, - loadModule(loader, name, options || {}) - .then(function(load) { - delete loader.importPromises[name]; - return evaluateLoadedModule(loader, load); - })); - }); - }, - // 26.3.3.9 keys not implemented - // 26.3.3.10 - load: function(name, options) { - if (this._loader.modules[name]) { - doEnsureEvaluated(this._loader.modules[name], [], this._loader); - return Promise.resolve(this._loader.modules[name].module); - } - return this._loader.importPromises[name] || createImportPromise(this, name, loadModule(this._loader, name, {})); - }, - // 26.3.3.11 - 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; - }, - // 26.3.3.12 - newModule: function (obj) { - if (typeof obj != 'object') - throw new TypeError('Expected object'); - - // we do this to be able to tell if a module is a module privately in ES5 - // by doing m instanceof Module - var m = new Module(); - - var pNames; - if (Object.getOwnPropertyNames && obj != null) { - pNames = Object.getOwnPropertyNames(obj); - } - else { - pNames = []; - for (var key in obj) - pNames.push(key); - } - - for (var i = 0; i < pNames.length; i++) (function(key) { - defineProperty(m, key, { - configurable: false, - enumerable: true, - get: function () { - return obj[key]; - } - }); - })(pNames[i]); - - if (Object.preventExtensions) - Object.preventExtensions(m); - - return m; - }, - // 26.3.3.14 - set: function(name, module) { - if (!(module instanceof Module)) - throw new TypeError('Loader.set(' + name + ', module) must be a module'); - this._loader.modules[name] = { - module: module - }; - }, - // 26.3.3.15 values not implemented - // 26.3.3.16 @@iterator not implemented - // 26.3.3.17 @@toStringTag not implemented - - // 26.3.3.18.1 - normalize: function(name, referrerName, referrerAddress) { - return name; - }, - // 26.3.3.18.2 - locate: function(load) { - return load.name; - }, - // 26.3.3.18.3 - fetch: function(load) { - throw new TypeError('Fetch not implemented'); - }, - // 26.3.3.18.4 - translate: function(load) { - return load.source; - }, - // 26.3.3.18.5 - instantiate: function(load) { - } - }; - - var _newModule = Loader.prototype.newModule; - - if (typeof exports === 'object') - module.exports = Loader; - - __global.Reflect = __global.Reflect || {}; - __global.Reflect.Loader = __global.Reflect.Loader || Loader; - __global.Reflect.global = __global.Reflect.global || __global; - __global.LoaderPolyfill = Loader; - })(); /* - * Traceur and Babel transpile hook for Loader + * Traceur, Babel and TypeScript transpile hook for Loader */ -(function(Loader) { - var g = __global; - - function getTranspilerModule(loader, globalName) { - return loader.newModule({ 'default': g[globalName], __useDefault: true }); - } +var transpile = (function() { // use Traceur by default Loader.prototype.transpiler = 'traceur'; - Loader.prototype.transpile = function(load) { + function transpile(load) { var self = this; - // pick up Transpiler modules from existing globals on first run if set - if (!self.transpilerHasRun) { - if (g.traceur && !self.has('traceur')) - self.set('traceur', getTranspilerModule(self, 'traceur')); - if (g.babel && !self.has('babel')) - self.set('babel', getTranspilerModule(self, 'babel')); - self.transpilerHasRun = true; - } - - return self['import'](self.transpiler).then(function(transpiler) { + return Promise.resolve(__global[self.transpiler == 'typescript' ? 'ts' : self.transpiler] + || (self.pluginLoader || self)['import'](self.transpiler)) + .then(function(transpiler) { if (transpiler.__useDefault) transpiler = transpiler['default']; - return 'var __moduleAddress = "' + load.address + '";' + (transpiler.Compiler ? traceurTranspile : babelTranspile).call(self, load, transpiler); - }); - }; - Loader.prototype.instantiate = function(load) { - var self = this; - return Promise.resolve(self.normalize(self.transpiler)) - .then(function(transpilerNormalized) { - // load transpiler as a global (avoiding System clobbering) - if (load.name === transpilerNormalized) { - return { - deps: [], - execute: function() { - var curSystem = g.System; - var curLoader = g.Reflect.Loader; - // ensure not detected as CommonJS - __eval('(function(require,exports,module){' + load.source + '})();', g, load); - g.System = curSystem; - g.Reflect.Loader = curLoader; - return getTranspilerModule(self, load.name); - } - }; - } + var transpileFunction; + if (transpiler.Compiler) + transpileFunction = traceurTranspile; + else if (transpiler.createLanguageService) + transpileFunction = typescriptTranspile; + else + transpileFunction = babelTranspile; + + // note __moduleName will be part of the transformer meta in future when we have the spec for this + return 'var __moduleName = "' + load.name + '";' + transpileFunction.call(self, load, transpiler) + '\n//# sourceURL=' + load.address + '!transpiled'; }); }; @@ -1189,11 +1185,8 @@ function logloads(loads) { options.moduleName = false; var compiler = new traceur.Compiler(options); - var source = doTraceurCompile(load.source, compiler, options.filename); - // add "!eval" to end of Traceur sourceURL - // I believe this does something? - return source + '\n//# sourceURL=' + load.address + '!eval'; + return doTraceurCompile(load.source, compiler, options.filename); } function doTraceurCompile(source, compiler, filename) { try { @@ -1209,22 +1202,96 @@ function logloads(loads) { var options = this.babelOptions || {}; options.modules = 'system'; options.sourceMap = 'inline'; + options.inputSourceMap = load.metadata.sourceMap; options.filename = load.address; options.code = true; options.ast = false; - - if (!options.blacklist) - options.blacklist = ['react']; - var source = babel.transform(load.source, options).code; + return babel.transform(load.source, options).code; + } - // add "!eval" to end of Babel sourceURL - // I believe this does something? - return source + '\n//# sourceURL=' + load.address + '!eval'; + function typescriptTranspile(load, ts) { + var options = this.typescriptOptions || {}; + if (options.target === undefined) { + options.target = ts.ScriptTarget.ES5; + } + options.module = ts.ModuleKind.System; + options.inlineSourceMap = true; + + return ts.transpile(load.source, options, load.address); } + return transpile; +})(); + +// from https://gist.github.com/Yaffle/1088850 +function URLPolyfill(url, baseURL) { + if (typeof url != 'string') + throw new TypeError('URL must be a string'); + var m = String(url).replace(/^\s+|\s+$/g, "").match(/^([^:\/?#]+:)?(?:\/\/(?:([^:@\/?#]*)(?::([^:@\/?#]*))?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/); + if (!m) { + throw new RangeError(); + } + var protocol = m[1] || ""; + var username = m[2] || ""; + var password = m[3] || ""; + var host = m[4] || ""; + var hostname = m[5] || ""; + var port = m[6] || ""; + var pathname = m[7] || ""; + var search = m[8] || ""; + var hash = m[9] || ""; + if (baseURL !== undefined) { + var base = baseURL instanceof URLPolyfill ? baseURL : new URLPolyfill(baseURL); + var flag = protocol === "" && host === "" && username === ""; + if (flag && pathname === "" && search === "") { + search = base.search; + } + if (flag && pathname.charAt(0) !== "/") { + pathname = (pathname !== "" ? (((base.host !== "" || base.username !== "") && base.pathname === "" ? "/" : "") + base.pathname.slice(0, base.pathname.lastIndexOf("/") + 1) + pathname) : base.pathname); + } + // dot segments removal + var output = []; + pathname.replace(/^(\.\.?(\/|$))+/, "") + .replace(/\/(\.(\/|$))+/g, "/") + .replace(/\/\.\.$/, "/../") + .replace(/\/?[^\/]*/g, function (p) { + if (p === "/..") { + output.pop(); + } else { + output.push(p); + } + }); + pathname = output.join("").replace(/^\//, pathname.charAt(0) === "/" ? "/" : ""); + if (flag) { + port = base.port; + hostname = base.hostname; + host = base.host; + password = base.password; + username = base.username; + } + if (protocol === "") { + protocol = base.protocol; + } + } -})(__global.LoaderPolyfill); + // convert windows file URLs to use / + if (protocol == 'file:') + pathname = pathname.replace(/\\/g, '/'); + + this.origin = protocol + (protocol !== "" || host !== "" ? "//" : "") + host; + this.href = protocol + (protocol !== "" || host !== "" ? "//" : "") + (username !== "" ? username + (password !== "" ? ":" + password : "") + "@" : "") + host + pathname + search + hash; + this.protocol = protocol; + this.username = username; + this.password = password; + this.host = host; + this.hostname = hostname; + this.port = port; + this.pathname = pathname; + this.search = search; + this.hash = hash; +} +(typeof self != 'undefined' ? self : global).URLPolyfill = URLPolyfill; /* ********************************************************************************************* @@ -1237,64 +1304,113 @@ function logloads(loads) { ********************************************************************************************* */ +var System; +function SystemLoader() { + Loader.call(this); + this.paths = {}; +} -(function() { - var isBrowser = typeof window != 'undefined' && typeof document != 'undefined'; - var isWindows = typeof process != 'undefined' && !!process.platform.match(/^win/); - var Promise = __global.Promise || require('when/es6-shim/Promise'); - - // Helpers - // Absolute URL parsing, from https://gist.github.com/Yaffle/1088850 - function parseURI(url) { - var m = String(url).replace(/^\s+|\s+$/g, '').match(/^([^:\/?#]+:)?(\/\/(?:[^:@\/?#]*(?::[^:@\/?#]*)?@)?(([^:\/?#]*)(?::(\d*))?))?([^?#]*)(\?[^#]*)?(#[\s\S]*)?/); - // authority = '//' + user + ':' + pass '@' + hostname + ':' port - return (m ? { - href : m[0] || '', - protocol : m[1] || '', - authority: m[2] || '', - host : m[3] || '', - hostname : m[4] || '', - port : m[5] || '', - pathname : m[6] || '', - search : m[7] || '', - hash : m[8] || '' - } : null); +// NB no specification provided for System.paths, used ideas discussed in https://github.com/jorendorff/js-loaders/issues/25 +function applyPaths(loader, name) { + // most specific (most number of slashes in path) match wins + var pathMatch = '', wildcard, maxSlashCount = 0; + + // check to see if we have a paths entry + for (var p in loader.paths) { + var pathParts = p.split('*'); + if (pathParts.length > 2) + throw new TypeError('Only one wildcard in a path is permitted'); + + // exact path match + if (pathParts.length == 1) { + if (name == p) { + pathMatch = p; + break; + } + } + // wildcard path match + else { + var slashCount = p.split('/').length; + if (slashCount >= maxSlashCount && + name.substr(0, pathParts[0].length) == pathParts[0] && + name.substr(name.length - pathParts[1].length) == pathParts[1]) { + maxSlashCount = slashCount; + pathMatch = p; + wildcard = name.substr(pathParts[0].length, name.length - pathParts[1].length - pathParts[0].length); + } + } } - function removeDotSegments(input) { - var output = []; - input.replace(/^(\.\.?(\/|$))+/, '') - .replace(/\/(\.(\/|$))+/g, '/') - .replace(/\/\.\.$/, '/../') - .replace(/\/?[^\/]*/g, function (p) { - if (p === '/..') - output.pop(); - else - output.push(p); - }); - return output.join('').replace(/^\//, input.charAt(0) === '/' ? '/' : ''); - } + var outPath = loader.paths[pathMatch] || name; + if (wildcard) + outPath = outPath.replace('*', wildcard); - function toAbsoluteURL(base, href) { + return outPath; +} - if (isWindows) - href = href.replace(/\\/g, '/'); +// inline Object.create-style class extension +function LoaderProto() {} +LoaderProto.prototype = Loader.prototype; +SystemLoader.prototype = new LoaderProto(); - href = parseURI(href || ''); - base = parseURI(base || ''); +var baseURLCache = {}; - return !href || !base ? null : (href.protocol || base.protocol) + - (href.protocol || href.authority ? href.authority : base.authority) + - removeDotSegments(href.protocol || href.authority || href.pathname.charAt(0) === '/' ? href.pathname : (href.pathname ? ((base.authority && !base.pathname ? '/' : '') + base.pathname.slice(0, base.pathname.lastIndexOf('/') + 1) + href.pathname) : base.pathname)) + - (href.protocol || href.authority || href.pathname ? href.search : (href.search || base.search)) + - href.hash; - } +var absURLRegEx = /^([^\/]+:\/\/|\/)/; - var fetchTextFromURL; +// Normalization with module names as absolute URLs +SystemLoader.prototype.normalize = function(name, parentName, parentAddress) { + // NB does `import 'file.js'` import relative to the parent name or baseURL? + // have assumed that it is baseURL-relative here, but spec may well align with URLs to be the latter + // safe option for users is to always use "./file.js" for relative + + // not absolute or relative -> apply paths (what will be sites) + if (!name.match(absURLRegEx) && name[0] != '.') + name = new URL(applyPaths(this, name), baseURI).href; + // apply parent-relative normalization, parentAddress is already normalized + else + name = new URL(name, parentName || baseURI).href; + return name; +}; + +SystemLoader.prototype.locate = function(load) { + return load.name; +}; + + +// ensure the transpiler is loaded correctly +SystemLoader.prototype.instantiate = function(load) { + var self = this; + return Promise.resolve(self.normalize(self.transpiler)) + .then(function(transpilerNormalized) { + // load transpiler as a global (avoiding System clobbering) + if (load.address === transpilerNormalized) { + return { + deps: [], + execute: function() { + var curSystem = __global.System; + var curLoader = __global.Reflect.Loader; + // ensure not detected as CommonJS + __eval('(function(require,exports,module){' + load.source + '})();', load.address, __global); + __global.System = curSystem; + __global.Reflect.Loader = curLoader; + return self.newModule({ 'default': __global[self.transpiler], __useDefault: true }); + } + }; + } + }); +}; + var fetchTextFromURL; if (typeof XMLHttpRequest != 'undefined') { fetchTextFromURL = function(url, fulfill, reject) { + // percent encode just '#' in urls + // according to https://github.com/jorendorff/js-loaders/blob/master/browser-loader.js#L238 + // we should encode everything, but it breaks for servers that don't expect it + // like in (https://github.com/systemjs/systemjs/issues/168) + if (isBrowser) + url = url.replace(/#/g, '%23'); + var xhr = new XMLHttpRequest(); var sameDomain = true; var doTimeout = false; @@ -1340,204 +1456,39 @@ function logloads(loads) { }, 0); xhr.send(null); - } + }; } else if (typeof require != 'undefined') { var fs; fetchTextFromURL = function(url, fulfill, reject) { - if (url.substr(0, 5) != 'file:') - throw 'Only file URLs of the form file: allowed running in Node.'; + if (url.substr(0, 8) != 'file:///') + throw 'Only file URLs of the form file:/// allowed running in Node.'; fs = fs || require('fs'); - url = url.substr(5); if (isWindows) - url = url.replace(/\//g, '\\'); + url = url.replace(/\//g, '\\').substr(8); + else + url = url.substr(7); return fs.readFile(url, function(err, data) { if (err) return reject(err); else fulfill(data + ''); }); - } + }; } else { throw new TypeError('No environment fetch API available.'); } - var SystemLoader = function($__super) { - function SystemLoader(options) { - $__super.call(this, options || {}); - - // Set default baseURL and paths - if (typeof location != 'undefined' && location.href) { - var href = __global.location.href.split('#')[0].split('?')[0]; - this.baseURL = href.substring(0, href.lastIndexOf('/') + 1); - } - else if (typeof process != 'undefined' && process.cwd) { - this.baseURL = 'file:' + process.cwd() + '/'; - if (isWindows) - this.baseURL = this.baseURL.replace(/\\/g, '/'); - } - else { - throw new TypeError('No environment baseURL'); - } - this.paths = { '*': '*.js' }; - } - - SystemLoader.__proto__ = ($__super !== null ? $__super : Function.prototype); - SystemLoader.prototype = $__Object$create(($__super !== null ? $__super.prototype : null)); - - $__Object$defineProperty(SystemLoader.prototype, "constructor", { - value: SystemLoader - }); - - $__Object$defineProperty(SystemLoader.prototype, "global", { - get: function() { - return __global; - }, - - enumerable: false - }); - - $__Object$defineProperty(SystemLoader.prototype, "strict", { - get: function() { return true; }, - enumerable: false - }); - - $__Object$defineProperty(SystemLoader.prototype, "normalize", { - value: function(name, parentName, parentAddress) { - if (typeof name != 'string') - throw new TypeError('Module name must be a string'); - - var segments = name.split('/'); - - if (segments.length == 0) - throw new TypeError('No module name provided'); - - // current segment - var i = 0; - // is the module name relative - var rel = false; - // number of backtracking segments - var dotdots = 0; - if (segments[0] == '.') { - i++; - if (i == segments.length) - throw new TypeError('Illegal module name "' + name + '"'); - rel = true; - } - else { - while (segments[i] == '..') { - i++; - if (i == segments.length) - throw new TypeError('Illegal module name "' + name + '"'); - } - if (i) - rel = true; - dotdots = i; - } - - for (var j = i; j < segments.length; j++) { - var segment = segments[j]; - if (segment == '' || segment == '.' || segment == '..') - throw new TypeError('Illegal module name "' + name + '"'); - } - - if (!rel) - return name; - - // build the full module name - var normalizedParts = []; - var parentParts = (parentName || '').split('/'); - var normalizedLen = parentParts.length - 1 - dotdots; - - normalizedParts = normalizedParts.concat(parentParts.splice(0, parentParts.length - 1 - dotdots)); - normalizedParts = normalizedParts.concat(segments.splice(i, segments.length - i)); - - return normalizedParts.join('/'); - }, - - enumerable: false, - writable: true - }); - - $__Object$defineProperty(SystemLoader.prototype, "locate", { - value: function(load) { - var name = load.name; - - // NB no specification provided for System.paths, used ideas discussed in https://github.com/jorendorff/js-loaders/issues/25 - - // most specific (longest) match wins - var pathMatch = '', wildcard; - - // check to see if we have a paths entry - for (var p in this.paths) { - var pathParts = p.split('*'); - if (pathParts.length > 2) - throw new TypeError('Only one wildcard in a path is permitted'); - - // exact path match - if (pathParts.length == 1) { - if (name == p && p.length > pathMatch.length) { - pathMatch = p; - break; - } - } - - // wildcard path match - else { - if (name.substr(0, pathParts[0].length) == pathParts[0] && name.substr(name.length - pathParts[1].length) == pathParts[1]) { - pathMatch = p; - wildcard = name.substr(pathParts[0].length, name.length - pathParts[1].length - pathParts[0].length); - } - } - } - - var outPath = this.paths[pathMatch]; - if (wildcard) - outPath = outPath.replace('*', wildcard); - - // percent encode just '#' in module names - // according to https://github.com/jorendorff/js-loaders/blob/master/browser-loader.js#L238 - // we should encode everything, but it breaks for servers that don't expect it - // like in (https://github.com/systemjs/systemjs/issues/168) - if (isBrowser) - outPath = outPath.replace(/#/g, '%23'); - - return toAbsoluteURL(this.baseURL, outPath); - }, - - enumerable: false, - writable: true - }); - - $__Object$defineProperty(SystemLoader.prototype, "fetch", { - value: function(load) { - var self = this; - return new Promise(function(resolve, reject) { - fetchTextFromURL(toAbsoluteURL(self.baseURL, load.address), function(source) { - resolve(source); - }, reject); - }); - }, - - enumerable: false, - writable: true + SystemLoader.prototype.fetch = function(load) { + return new Promise(function(resolve, reject) { + fetchTextFromURL(load.address, resolve, reject); }); - - return SystemLoader; - }(__global.LoaderPolyfill); - - var System = new SystemLoader(); - - // note we have to export before runing "init" below - if (typeof exports === 'object') - module.exports = System; - - __global.System = System; - + }; +(function() { //