diff --git a/.jshintrc b/.jshintrc index 1049cdec..eb40a521 100644 --- a/.jshintrc +++ b/.jshintrc @@ -8,6 +8,8 @@ "-W041": true, // Wrap the /regexp/ literal in parens to disambiguate the slash operator "-W092": true, + // Reserved words + "-W024": true, "curly": true, //"indent": 4, //"eqeqeq": true, @@ -16,6 +18,7 @@ //"maxlen" : 80, "globals": { + "System": true, "module": true, "require": true, "define": true, diff --git a/Gruntfile.js b/Gruntfile.js index 1fe1ea95..570815fb 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -44,7 +44,10 @@ module.exports = function (grunt) { 'compile-main': { options: { baseUrl: '<%= source_folder %>', - include: ['../libs/almond/almond', 'tablefilter'], + include: [ + '../libs/almond/almond', + '../libs/system' + ], // exclude: [ // 'extensions/sortabletable/sortabletable', // 'extensions/sortabletable/adapterSortabletable' @@ -63,6 +66,25 @@ module.exports = function (grunt) { optimize: 'none' } } + // , + // 'compile-colsvisibility': { + // options: { + // baseUrl: '<%= source_folder %>extensions/colsVisibility', + // include: [ + // '../../../libs/almond/almond' + // ], + // wrap: { + // startFile: "<%= frags_folder %>start.colsvisibility.frag", + // endFile: "<%= frags_folder %>end.colsvisibility.frag" + // }, + // name: 'colsVisibility', + // out: '<%= dist_folder %>extensions/colsVisibility/colsVisibility.js', + // optimize: 'none', + // findNestedDependencies: true, + // removeCombined: true, + // generateSourceMaps: false + // } + // } }, // requirejs: { @@ -207,6 +229,7 @@ module.exports = function (grunt) { tablefilter: { files: [ { src: 'libs/sortabletable.js', dest: '<%= source_folder %>extensions/sortabletable/sortabletable.js' }, + // { src: 'libs/es6-module-loader.js', dest: '<%= source_folder %>es6-module-loader.js' }, { src: 'src-es6/extensions/colsVisibility/colsVisibility.css', dest: '<%= source_folder %>extensions/colsVisibility/colsVisibility.css' }, // { src: 'libs/requirejs/require.js', dest: '<%= dist_folder %>require.js' }, // { src: ['**'], cwd: '<%= source_folder %>TF_Modules/', dest: '<%= dist_folder %>TF_Modules/', expand: true }, @@ -214,12 +237,28 @@ module.exports = function (grunt) { // TODO: remove ezEditTable and other extensions { src: ['**'], cwd: 'libs/ezEditTable/', dest: '<%= source_folder %>extensions/ezEditTable/', expand: true }, { src: ['**'], cwd: 'libs/ezEditTable/', dest: '<%= dist_folder %>extensions/ezEditTable/', expand: true }, + // { src: ['**'], cwd: '<%= source_folder %>extensions/colsVisibility/', dest: '<%= dist_folder %>extensions/colsVisibility/', expand: true }, + // + { src: 'libs/es6-module-loader.src.js', dest: '<%= dist_folder %>es6-module-loader.src.js' }, + { src: 'libs/es6-module-loader.js', dest: '<%= dist_folder %>es6-module-loader.js' }, + { src: 'libs/es6-module-loader.js.map', dest: '<%= dist_folder %>es6-module-loader.js.map' }, + { src: 'libs/system.js.map', dest: '<%= dist_folder %>system.js.map' }, { src: ['**'], cwd: '<%= source_folder %>TF_Themes/', dest: '<%= dist_folder %>TF_Themes/', expand: true } ] } }, + connect: { + server:{ + options:{ + port: 9000, + hostname: "*", + keepalive: true + } + } + }, + babel: { 'build-main': { options: { @@ -263,14 +302,16 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-requirejs'); + grunt.loadNpmTasks('grunt-contrib-connect'); grunt.loadNpmTasks('grunt-babel'); // This is the default task being executed if Grunt // is called without any further parameter. - grunt.registerTask('default', ['jshint', 'toes5', 'requirejs', 'concat', 'uglify', 'cssmin', 'copy', 'qunit']); - grunt.registerTask('build', ['jshint', 'toes5', 'requirejs', 'concat', /*'uglify',*/ 'cssmin', 'copy']); + grunt.registerTask('default', ['jshint', 'toes5', 'build-requirejs', 'concat', 'uglify', 'cssmin', 'copy', 'qunit']); + grunt.registerTask('build', ['jshint', 'toes5', 'build-requirejs', 'concat', /*'uglify',*/ 'cssmin', 'copy']); grunt.registerTask('dev', ['jshint', 'toes5', 'concat', 'cssmin', 'copy']); - grunt.registerTask('build-requirejs', ['requirejs:compile-main']); + grunt.registerTask('build-requirejs', ['requirejs:compile-main', 'requirejs:compile-colsvisibility']); grunt.registerTask('toes5', ['babel:build-main','babel:build-extensions']); grunt.registerTask('test', ['qunit']); + grunt.registerTask('server', ['connect']); }; diff --git a/bower.json b/bower.json index 3331afb8..7083b803 100644 --- a/bower.json +++ b/bower.json @@ -27,11 +27,11 @@ "node_modules", "bower_components", "test", - "tests", "libs" ], - "dependencies": { - "almond": "~0.3.0", - "requirejs": null + "dependencies": {}, + "devDependencies": { + "requirejs": "~2.1.17", + "almond": "~0.3.1" } } diff --git a/dist/es6-module-loader.js b/dist/es6-module-loader.js new file mode 100644 index 00000000..d6ec4e7e --- /dev/null +++ b/dist/es6-module-loader.js @@ -0,0 +1,8 @@ +/* + * es6-module-loader v0.16.5 + * https://github.com/ModuleLoader/es6-module-loader + * Copyright (c) 2015 Guy Bedford, Luke Hoban, Addy Osmani; Licensed MIT + */ + +!function(a){"object"==typeof exports?module.exports=a():"function"==typeof define&&define.amd?define(a):"undefined"!=typeof window?window.Promise=a():"undefined"!=typeof global?global.Promise=a():"undefined"!=typeof self&&(self.Promise=a())}(function(){var a;return function b(a,c,d){function e(g,h){if(!c[g]){if(!a[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};a[g][0].call(j.exports,function(b){var c=a[g][1][b];return e(c?c:b)},j,j.exports,b,a,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g=0&&(n.splice(b,1),l("Handled previous rejection ["+a.id+"] "+e.formatObject(a.value)))}function h(a,b){m.push(a,b),null===o&&(o=d(i,0))}function i(){for(o=null;m.length>0;)m.shift()(m.shift())}var j,k=c,l=c;"undefined"!=typeof console&&(j=console,k="undefined"!=typeof j.error?function(a){j.error(a)}:function(a){j.log(a)},l="undefined"!=typeof j.info?function(a){j.info(a)}:function(a){j.log(a)}),a.onPotentiallyUnhandledRejection=function(a){h(f,a)},a.onPotentiallyUnhandledRejectionHandled=function(a){h(g,a)},a.onFatalRejection=function(a){h(b,a.value)};var m=[],n=[],o=null;return a}})}("function"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{"../env":5,"../format":6}],5:[function(b,c,d){!function(a){"use strict";a(function(a){function b(){return"undefined"!=typeof process&&null!==process&&"function"==typeof process.nextTick}function c(){return"function"==typeof MutationObserver&&MutationObserver||"function"==typeof WebKitMutationObserver&&WebKitMutationObserver}function d(a){function b(){var a=c;c=void 0,a()}var c,d=document.createTextNode(""),e=new a(b);e.observe(d,{characterData:!0});var f=0;return function(a){c=a,d.data=f^=1}}var e,f="undefined"!=typeof setTimeout&&setTimeout,g=function(a,b){return setTimeout(a,b)},h=function(a){return clearTimeout(a)},i=function(a){return f(a,0)};if(b())i=function(a){return process.nextTick(a)};else if(e=c())i=d(e);else if(!f){var j=a,k=j("vertx");g=function(a,b){return k.setTimer(b,a)},h=k.cancelTimer,i=k.runOnLoop||k.runOnContext}return{setTimer:g,clearTimer:h,asap:i}})}("function"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{}],6:[function(b,c,d){!function(a){"use strict";a(function(){function a(a){var c="object"==typeof a&&null!==a&&a.stack?a.stack:b(a);return a instanceof Error?c:c+" (WARNING: non-Error used)"}function b(a){var b=String(a);return"[object Object]"===b&&"undefined"!=typeof JSON&&(b=c(a,b)),b}function c(a,b){try{return JSON.stringify(a)}catch(c){return b}}return{formatError:a,formatObject:b,tryStringify:c}})}("function"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],7:[function(b,c,d){!function(a){"use strict";a(function(){return function(a){function b(a,b){this._handler=a===t?b:c(a)}function c(a){function b(a){e.resolve(a)}function c(a){e.reject(a)}function d(a){e.notify(a)}var e=new v;try{a(b,c,d)}catch(f){c(f)}return e}function d(a){return I(a)?a:new b(t,new w(q(a)))}function e(a){return new b(t,new w(new z(a)))}function f(){return _}function g(){return new b(t,new v)}function h(a,b){var c=new v(a.receiver,a.join().context);return new b(t,c)}function i(a){return k(S,null,a)}function j(a,b){return k(N,a,b)}function k(a,c,d){function e(b,e,g){g.resolved||l(d,f,b,a(c,e,b),g)}function f(a,b,c){k[a]=b,0===--j&&c.become(new y(k))}for(var g,h="function"==typeof c?e:f,i=new v,j=d.length>>>0,k=new Array(j),m=0;m0?b(c,f.value,e):(e.become(f),m(a,c+1,f))}else b(c,d,e)}function m(a,b,c){for(var d=b;dc&&a._unreport()}}function o(a){return"object"!=typeof a||null===a?e(new TypeError("non-iterable passed to race()")):0===a.length?f():1===a.length?d(a[0]):p(a)}function p(a){var c,d,e,f=new v;for(c=0;c0||"function"!=typeof b&&0>e)return new this.constructor(t,d);var f=this._beget(),g=f._handler;return d.chain(g,d.receiver,a,b,c),f},b.prototype["catch"]=function(a){return this.then(void 0,a)},b.prototype._beget=function(){return h(this._handler,this.constructor)},b.all=i,b.race=o,b._traverse=j,b._visitRemaining=m,t.prototype.when=t.prototype.become=t.prototype.notify=t.prototype.fail=t.prototype._unreport=t.prototype._report=T,t.prototype._state=0,t.prototype.state=function(){return this._state},t.prototype.join=function(){for(var a=this;void 0!==a.handler;)a=a.handler;return a},t.prototype.chain=function(a,b,c,d,e){this.when({resolver:a,receiver:b,fulfilled:c,rejected:d,progress:e})},t.prototype.visit=function(a,b,c,d){this.chain(Y,a,b,c,d)},t.prototype.fold=function(a,b,c,d){this.when(new H(a,b,c,d))},R(t,u),u.prototype.become=function(a){a.fail()};var Y=new u;R(t,v),v.prototype._state=0,v.prototype.resolve=function(a){this.become(q(a))},v.prototype.reject=function(a){this.resolved||this.become(new z(a))},v.prototype.join=function(){if(!this.resolved)return this;for(var a=this;void 0!==a.handler;)if(a=a.handler,a===this)return this.handler=C();return a},v.prototype.run=function(){var a=this.consumers,b=this.handler;this.handler=this.handler.join(),this.consumers=void 0;for(var c=0;cf;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,A.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(d){return"loading"==b.status?A.resolve(a.loaderObj.translate({name:b.name,metadata:b.metadata,address:b.address,source:d})).then(function(c){return b.source=c,a.loaderObj.instantiate({name:b.name,metadata:b.metadata,address:b.address,source:c})}).then(function(c){if(void 0===c)return b.address=b.address||"",b.isDeclarative=!0,a.loaderObj.transpile(b).then(function(a){var c=__global.System,d=c.register;c.register=function(a,c,d){"string"!=typeof a&&(d=c,c=a),b.declare=d,b.depsList=c},__eval(a,__global,b),c.register=d});if("object"!=typeof c)throw TypeError("Invalid instantiate return value");b.depsList=c.deps||[],b.execute=c.execute,b.isDeclarative=!1}).then(function(){b.dependencies=[];for(var d=b.depsList,e=[],f=0,g=d.length;g>f;f++)(function(d,f){e.push(c(a,d,b.name,b.address).then(function(a){if(b.dependencies[f]={key:d,value:a.name},"linked"!=a.status)for(var c=b.linkSets.concat([]),e=0,g=c.length;g>e;e++)i(c[e],a)}))})(d[f],f);return A.all(e)}).then(function(){b.status="loaded";for(var a=b.linkSets.concat([]),c=0,d=a.length;d>c;c++)k(a[c],b)}):void 0})["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],b,a)})}function g(b){return function(c,g){var i=b.loader,j=b.moduleName,k=b.step;if(i.modules[j])throw new TypeError('"'+j+'" already exists in the module table');for(var l,m=0,n=i.loads.length;n>m;m++)if(i.loads[m].name==j)return l=i.loads[m],"translate"!=k||l.source||(l.address=b.moduleAddress,f(i,l,A.resolve(b.moduleSource))),l.linkSets[0].done.then(function(){c(l)});var o=a(j);o.metadata=b.moduleMetadata;var p=h(i,o);i.loads.push(o),c(p.done),"locate"==k?d(i,o):"fetch"==k?e(i,o,A.resolve(b.moduleAddress)):(o.address=b.moduleAddress,f(i,o,A.resolve(b.moduleSource)))}}function h(a,b){var c={loader:a,loads:[],startingLoad:b,loadingCount:0};return c.done=new A(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){var b=!1;try{p(a,function(c,d){l(a,c,d),b=!0})}catch(c){l(a,null,c),b=!0}return b}function k(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:E({}),evaluated:!0}:{module:E({})},b.status="linked",m(a.loader,b)}return a.resolve(c)}var g=j(a);g||a.resolve(c)}}function l(a,b,c){var d=a.loader;b&&a.loads[0].name!=b.name&&(c=w(c,'Error loading "'+b.name+'" from "'+a.loads[0].name+'" at '+(a.loads[0].address||"")+"\n")),b&&(c=w(c,'Error loading "'+b.name+'" at '+(b.address||"")+"\n"));for(var e=a.loads.concat([]),f=0,g=e.length;g>f;f++){var b=e[f];d.loaderObj.failed=d.loaderObj.failed||[],-1==B.call(d.loaderObj.failed,b)&&d.loaderObj.failed.push(b);var h=B.call(b.linkSets,a);if(b.linkSets.splice(h,1),0==b.linkSets.length){var i=B.call(a.loader.loads,b);-1!=i&&a.loader.loads.splice(i,1)}}a.reject(c)}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.isDeclarative?"declarative":"dynamic"}}b.name&&(a.modules[b.name]=b.module);var d=B.call(a.loads,b);-1!=d&&a.loads.splice(d,1);for(var e=0,f=b.linkSets.length;f>e;e++)d=B.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){if(c[a.groupIndex]=c[a.groupIndex]||[],-1==B.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=d.importers[c];if(!g.locked){var h=B.call(g.dependencies,d);g.setters[h](e)}}return d.locked=!1,b});d.setters=f.setters,d.execute=f.execute;for(var g=0,h=a.dependencies.length;h>g;g++){var i=a.dependencies[g].value,j=c.modules[i];if(!j)for(var k=0;kf;f++){var h=e[f];if(h&&-1==B.call(b,h)&&(d=v(h,b,c)))return d=w(d,"Error evaluating "+h.name+"\n")}if(a.failed)return new Error("Module failed execution.");if(!a.evaluated)return a.evaluated=!0,d=t(a),d?a.failed=!0:Object.preventExtensions&&Object.preventExtensions(a.module),a.execute=void 0,d}}function w(a,b){return a instanceof Error?a.message=b+a.message:a=b+a,a}function x(a){if("object"!=typeof a)throw new TypeError("Options must be an object");a.normalize&&(this.normalize=a.normalize),a.locate&&(this.locate=a.locate),a.fetch&&(this.fetch=a.fetch),a.translate&&(this.translate=a.translate),a.instantiate&&(this.instantiate=a.instantiate),this._loader={loaderObj:this,loads:[],modules:{},importPromises:{},moduleRecords:{}},C(this,"global",{get:function(){return __global}})}function y(){}function z(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})}var A=__global.Promise||require("when/es6-shim/Promise");__global.console&&(console.assert=console.assert||function(){});var B=Array.prototype.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},C=$__Object$defineProperty,D=0;x.prototype={constructor:x,define:function(a,b,c){if(this._loader.importPromises[a])throw new TypeError("Module is already loading.");return z(this,a,new A(g({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]?(u(this._loader.modules[a],[],this),this._loader.modules[a].module):void 0},has:function(a){return!!this._loader.modules[a]},"import":function(a,c){var d=this;return A.resolve(d.normalize(a,c&&c.name,c&&c.address)).then(function(a){var e=d._loader;return e.modules[a]?(u(e.modules[a],[],e._loader),e.modules[a].module):e.importPromises[a]||z(d,a,b(e,a,c||{}).then(function(b){return delete e.importPromises[a],s(e,b)}))})},load:function(a,c){return this._loader.modules[a]?(u(this._loader.modules[a],[],this._loader),A.resolve(this._loader.modules[a].module)):this._loader.importPromises[a]||z(this,a,b(this._loader,a,{}))},module:function(b,c){var d=a();d.address=c&&c.address;var e=h(this._loader,d),g=A.resolve(b),i=this._loader,j=e.done.then(function(){return s(i,d)});return f(i,d,g),j},newModule:function(a){if("object"!=typeof a)throw new TypeError("Expected object");var b=new y;for(var c in a)!function(c){C(b,c,{configurable:!1,enumerable:!0,get:function(){return a[c]}})}(c);return Object.preventExtensions&&Object.preventExtensions(b),b},set:function(a,b){if(!(b instanceof y))throw new TypeError("Loader.set("+a+", module) must be a module");this._loader.modules[a]={module:b}},normalize:function(a,b,c){return a},locate:function(a){return a.name},fetch:function(a){throw new TypeError("Fetch not implemented")},translate:function(a){return a.source},instantiate:function(a){}};var E=x.prototype.newModule;"object"==typeof exports&&(module.exports=x),__global.Reflect=__global.Reflect||{},__global.Reflect.Loader=__global.Reflect.Loader||x,__global.Reflect.global=__global.Reflect.global||__global,__global.LoaderPolyfill=x}(),function(a){function b(a,b){return a.newModule({"default":f[b],__useDefault:!0})}function c(a,b){var c=this.traceurOptions||{};c.modules="instantiate",c.script=!1,c.sourceMaps="inline",c.filename=a.address,c.inputSourceMap=a.metadata.sourceMap,c.moduleName=!1;var e=new b.Compiler(c),f=d(a.source,e,c.filename);return f+"\n//# sourceURL="+a.address+"!eval"}function d(a,b,c){try{return b.compile(a,c)}catch(d){throw d[0]}}function e(a,b){var c=this.babelOptions||{};c.modules="system",c.sourceMap="inline",c.filename=a.address,c.code=!0,c.ast=!1,c.blacklist||(c.blacklist=["react"]);var d=b.transform(a.source,c).code;return d+"\n//# sourceURL="+a.address+"!eval"}var f=__global;a.prototype.transpiler="traceur",a.prototype.transpile=function(a){var d=this;return d.transpilerHasRun||(f.traceur&&!d.has("traceur")&&d.set("traceur",b(d,"traceur")),f.babel&&!d.has("babel")&&d.set("babel",b(d,"babel")),d.transpilerHasRun=!0),d["import"](d.transpiler).then(function(b){return b.__useDefault&&(b=b["default"]),'var __moduleAddress = "'+a.address+'";'+(b.Compiler?c:e).call(d,a,b)})},a.prototype.instantiate=function(a){var c=this;return Promise.resolve(c.normalize(c.transpiler)).then(function(d){return a.name===d?{deps:[],execute:function(){var d=f.System,e=f.Reflect.Loader;return __eval("(function(require,exports,module){"+a.source+"})();",f,a),f.System=d,f.Reflect.Loader=e,b(c,a.name)}}:void 0})}}(__global.LoaderPolyfill),function(){function a(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 b(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)?"/":"")}function c(c,d){return i&&(d=d.replace(/\\/g,"/")),d=a(d||""),c=a(c||""),d&&c?(d.protocol||c.protocol)+(d.protocol||d.authority?d.authority:c.authority)+b(d.protocol||d.authority||"/"===d.pathname.charAt(0)?d.pathname:d.pathname?(c.authority&&!c.pathname?"/":"")+c.pathname.slice(0,c.pathname.lastIndexOf("/")+1)+d.pathname:c.pathname)+(d.protocol||d.authority||d.pathname?d.search:d.search||c.search)+d.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");if(1==g.length){if(d==f&&f.length>e.length){e=f;break}}else 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 i=this.paths[e];return b&&(i=i.replace("*",b)),h&&(i=i.replace(/#/g,"%23")),c(this.baseURL,i)},enumerable:!1,writable:!0}),$__Object$defineProperty(b.prototype,"fetch",{value:function(a){var b=this;return new j(function(d,e){f(c(b.baseURL,a.address),function(a){d(a)},e)})},enumerable:!1,writable:!0}),b}(__global.LoaderPolyfill),m=new l;if("object"==typeof exports&&(module.exports=m),__global.System=m,h&&"undefined"!=typeof document.getElementsByTagName){var n=document.getElementsByTagName("script");n=n[n.length-1],"complete"===document.readyState?setTimeout(e):document.addEventListener&&(document.addEventListener("DOMContentLoaded",d,!1),window.addEventListener("load",d,!1)),n.getAttribute("data-init")&&window[n.getAttribute("data-init")]()}}()}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope?self:global); +//# sourceMappingURL=es6-module-loader.js.map \ No newline at end of file diff --git a/dist/es6-module-loader.src.js b/dist/es6-module-loader.src.js new file mode 100644 index 00000000..22a167a8 --- /dev/null +++ b/dist/es6-module-loader.src.js @@ -0,0 +1,2857 @@ +!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.Promise=e():"undefined"!=typeof global?global.Promise=e():"undefined"!=typeof self&&(self.Promise=e())}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0) { + reported.splice(i, 1); + logInfo('Handled previous rejection [' + r.id + '] ' + format.formatObject(r.value)); + } + } + + function enqueue(f, x) { + tasks.push(f, x); + if(running === null) { + running = setTimer(flush, 0); + } + } + + function flush() { + running = null; + while(tasks.length > 0) { + tasks.shift()(tasks.shift()); + } + } + + return Promise; + }; + + function throwit(e) { + throw e; + } + + function noop() {} + +}); +}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); + +},{"../env":5,"../format":6}],5:[function(require,module,exports){ +/** @license MIT License (c) copyright 2010-2014 original author or authors */ +/** @author Brian Cavalier */ +/** @author John Hann */ + +/*global process,document,setTimeout,clearTimeout,MutationObserver,WebKitMutationObserver*/ +(function(define) { 'use strict'; +define(function(require) { + /*jshint maxcomplexity:6*/ + + // Sniff "best" async scheduling option + // Prefer process.nextTick or MutationObserver, then check for + // setTimeout, and finally vertx, since its the only env that doesn't + // have setTimeout + + var MutationObs; + var capturedSetTimeout = typeof setTimeout !== 'undefined' && setTimeout; + + // Default env + var setTimer = function(f, ms) { return setTimeout(f, ms); }; + var clearTimer = function(t) { return clearTimeout(t); }; + var asap = function (f) { return capturedSetTimeout(f, 0); }; + + // Detect specific env + if (isNode()) { // Node + asap = function (f) { return process.nextTick(f); }; + + } else if (MutationObs = hasMutationObserver()) { // Modern browser + asap = initMutationObserver(MutationObs); + + } else if (!capturedSetTimeout) { // vert.x + var vertxRequire = require; + var vertx = vertxRequire('vertx'); + setTimer = function (f, ms) { return vertx.setTimer(ms, f); }; + clearTimer = vertx.cancelTimer; + asap = vertx.runOnLoop || vertx.runOnContext; + } + + return { + setTimer: setTimer, + clearTimer: clearTimer, + asap: asap + }; + + function isNode () { + return typeof process !== 'undefined' && process !== null && + typeof process.nextTick === 'function'; + } + + function hasMutationObserver () { + return (typeof MutationObserver === 'function' && MutationObserver) || + (typeof WebKitMutationObserver === 'function' && WebKitMutationObserver); + } + + function initMutationObserver(MutationObserver) { + var scheduled; + var node = document.createTextNode(''); + var o = new MutationObserver(run); + o.observe(node, { characterData: true }); + + function run() { + var f = scheduled; + scheduled = void 0; + f(); + } + + var i = 0; + return function (f) { + scheduled = f; + node.data = (i ^= 1); + }; + } +}); +}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); + +},{}],6:[function(require,module,exports){ +/** @license MIT License (c) copyright 2010-2014 original author or authors */ +/** @author Brian Cavalier */ +/** @author John Hann */ + +(function(define) { 'use strict'; +define(function() { + + return { + formatError: formatError, + formatObject: formatObject, + tryStringify: tryStringify + }; + + /** + * Format an error into a string. If e is an Error and has a stack property, + * it's returned. Otherwise, e is formatted using formatObject, with a + * warning added about e not being a proper Error. + * @param {*} e + * @returns {String} formatted string, suitable for output to developers + */ + function formatError(e) { + var s = typeof e === 'object' && e !== null && e.stack ? e.stack : formatObject(e); + return e instanceof Error ? s : s + ' (WARNING: non-Error used)'; + } + + /** + * Format an object, detecting "plain" objects and running them through + * JSON.stringify if possible. + * @param {Object} o + * @returns {string} + */ + function formatObject(o) { + var s = String(o); + if(s === '[object Object]' && typeof JSON !== 'undefined') { + s = tryStringify(o, s); + } + return s; + } + + /** + * Try to return the result of JSON.stringify(x). If that fails, return + * defaultValue + * @param {*} x + * @param {*} defaultValue + * @returns {String|*} JSON.stringify(x) or defaultValue + */ + function tryStringify(x, defaultValue) { + try { + return JSON.stringify(x); + } catch(e) { + return defaultValue; + } + } + +}); +}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); + +},{}],7:[function(require,module,exports){ +/** @license MIT License (c) copyright 2010-2014 original author or authors */ +/** @author Brian Cavalier */ +/** @author John Hann */ + +(function(define) { 'use strict'; +define(function() { + + return function makePromise(environment) { + + var tasks = environment.scheduler; + var emitRejection = initEmitRejection(); + + var objectCreate = Object.create || + function(proto) { + function Child() {} + Child.prototype = proto; + return new Child(); + }; + + /** + * Create a promise whose fate is determined by resolver + * @constructor + * @returns {Promise} promise + * @name Promise + */ + function Promise(resolver, handler) { + this._handler = resolver === Handler ? handler : init(resolver); + } + + /** + * Run the supplied resolver + * @param resolver + * @returns {Pending} + */ + function init(resolver) { + var handler = new Pending(); + + try { + resolver(promiseResolve, promiseReject, promiseNotify); + } catch (e) { + promiseReject(e); + } + + return handler; + + /** + * Transition from pre-resolution state to post-resolution state, notifying + * all listeners of the ultimate fulfillment or rejection + * @param {*} x resolution value + */ + function promiseResolve (x) { + handler.resolve(x); + } + /** + * Reject this promise with reason, which will be used verbatim + * @param {Error|*} reason rejection reason, strongly suggested + * to be an Error type + */ + function promiseReject (reason) { + handler.reject(reason); + } + + /** + * @deprecated + * Issue a progress event, notifying all progress listeners + * @param {*} x progress event payload to pass to all listeners + */ + function promiseNotify (x) { + handler.notify(x); + } + } + + // Creation + + Promise.resolve = resolve; + Promise.reject = reject; + Promise.never = never; + + Promise._defer = defer; + Promise._handler = getHandler; + + /** + * Returns a trusted promise. If x is already a trusted promise, it is + * returned, otherwise returns a new trusted Promise which follows x. + * @param {*} x + * @return {Promise} promise + */ + function resolve(x) { + return isPromise(x) ? x + : new Promise(Handler, new Async(getHandler(x))); + } + + /** + * Return a reject promise with x as its reason (x is used verbatim) + * @param {*} x + * @returns {Promise} rejected promise + */ + function reject(x) { + return new Promise(Handler, new Async(new Rejected(x))); + } + + /** + * Return a promise that remains pending forever + * @returns {Promise} forever-pending promise. + */ + function never() { + return foreverPendingPromise; // Should be frozen + } + + /** + * Creates an internal {promise, resolver} pair + * @private + * @returns {Promise} + */ + function defer() { + return new Promise(Handler, new Pending()); + } + + // Transformation and flow control + + /** + * Transform this promise's fulfillment value, returning a new Promise + * for the transformed result. If the promise cannot be fulfilled, onRejected + * is called with the reason. onProgress *may* be called with updates toward + * this promise's fulfillment. + * @param {function=} onFulfilled fulfillment handler + * @param {function=} onRejected rejection handler + * @param {function=} onProgress @deprecated progress handler + * @return {Promise} new promise + */ + Promise.prototype.then = function(onFulfilled, onRejected, onProgress) { + var parent = this._handler; + var state = parent.join().state(); + + if ((typeof onFulfilled !== 'function' && state > 0) || + (typeof onRejected !== 'function' && state < 0)) { + // Short circuit: value will not change, simply share handler + return new this.constructor(Handler, parent); + } + + var p = this._beget(); + var child = p._handler; + + parent.chain(child, parent.receiver, onFulfilled, onRejected, onProgress); + + return p; + }; + + /** + * If this promise cannot be fulfilled due to an error, call onRejected to + * handle the error. Shortcut for .then(undefined, onRejected) + * @param {function?} onRejected + * @return {Promise} + */ + Promise.prototype['catch'] = function(onRejected) { + return this.then(void 0, onRejected); + }; + + /** + * Creates a new, pending promise of the same type as this promise + * @private + * @returns {Promise} + */ + Promise.prototype._beget = function() { + return begetFrom(this._handler, this.constructor); + }; + + function begetFrom(parent, Promise) { + var child = new Pending(parent.receiver, parent.join().context); + return new Promise(Handler, child); + } + + // Array combinators + + Promise.all = all; + Promise.race = race; + Promise._traverse = traverse; + + /** + * Return a promise that will fulfill when all promises in the + * input array have fulfilled, or will reject when one of the + * promises rejects. + * @param {array} promises array of promises + * @returns {Promise} promise for array of fulfillment values + */ + function all(promises) { + return traverseWith(snd, null, promises); + } + + /** + * Array> -> Promise> + * @private + * @param {function} f function to apply to each promise's value + * @param {Array} promises array of promises + * @returns {Promise} promise for transformed values + */ + function traverse(f, promises) { + return traverseWith(tryCatch2, f, promises); + } + + function traverseWith(tryMap, f, promises) { + var handler = typeof f === 'function' ? mapAt : settleAt; + + var resolver = new Pending(); + var pending = promises.length >>> 0; + var results = new Array(pending); + + for (var i = 0, x; i < promises.length && !resolver.resolved; ++i) { + x = promises[i]; + + if (x === void 0 && !(i in promises)) { + --pending; + continue; + } + + traverseAt(promises, handler, i, x, resolver); + } + + if(pending === 0) { + resolver.become(new Fulfilled(results)); + } + + return new Promise(Handler, resolver); + + function mapAt(i, x, resolver) { + if(!resolver.resolved) { + traverseAt(promises, settleAt, i, tryMap(f, x, i), resolver); + } + } + + function settleAt(i, x, resolver) { + results[i] = x; + if(--pending === 0) { + resolver.become(new Fulfilled(results)); + } + } + } + + function traverseAt(promises, handler, i, x, resolver) { + if (maybeThenable(x)) { + var h = getHandlerMaybeThenable(x); + var s = h.state(); + + if (s === 0) { + h.fold(handler, i, void 0, resolver); + } else if (s > 0) { + handler(i, h.value, resolver); + } else { + resolver.become(h); + visitRemaining(promises, i+1, h); + } + } else { + handler(i, x, resolver); + } + } + + Promise._visitRemaining = visitRemaining; + function visitRemaining(promises, start, handler) { + for(var i=start; i load contains linkSet'); + + if (load.linkSets.indexOf(linkSet) != -1) + console.assert(linkSet.loads.indexOf(load) != -1, 'load contains linkSet -> linkSet contains load'); + } + } + + for (var i = 0; i < linkSets.length; i++) { + var linkSet = linkSets[i]; + for (var j = 0; j < linkSet.loads.length; j++) { + var load = linkSet.loads[j]; + + for (var k = 0; k < load.dependencies.length; k++) { + var depName = load.dependencies[k].value; + var depLoad; + for (var l = 0; l < loads.length; l++) { + if (loads[l].name != depName) + continue; + depLoad = loads[l]; + break; + } + + // loading records are allowed not to have their dependencies yet + // if (load.status != 'loading') + // console.assert(depLoad, 'depLoad found'); + + // console.assert(linkSet.loads.indexOf(depLoad) != -1, 'linkset contains all dependencies'); + } + } + } +} */ + + +(function() { + var Promise = __global.Promise || require('when/es6-shim/Promise'); + if (__global.console) + console.assert = console.assert || function() {}; + + // IE8 support + var indexOf = Array.prototype.indexOf || function(item) { + for (var i = 0, thisLen = this.length; i < thisLen; i++) { + if (this[i] === item) { + return i; + } + } + return -1; + }; + var defineProperty = $__Object$defineProperty; + + // 15.2.3 - Runtime Semantics: Loader State + + // 15.2.3.11 + function createLoaderLoad(object) { + return { + // modules is an object for ES5 implementation + modules: {}, + loads: [], + loaderObj: object + }; + } + + // 15.2.3.2 Load Records and LoadRequest Objects + + // 15.2.3.2.1 + function createLoad(name) { + return { + status: 'loading', + name: name, + linkSets: [], + dependencies: [], + metadata: {} + }; + } + + // 15.2.3.2.2 createLoadRequestObject, absorbed into calling functions + + // 15.2.4 + + // 15.2.4.1 + function loadModule(loader, name, options) { + return new Promise(asyncStartLoadPartwayThrough({ + step: options.address ? 'fetch' : 'locate', + loader: loader, + moduleName: name, + // allow metadata for import https://bugs.ecmascript.org/show_bug.cgi?id=3091 + moduleMetadata: options && options.metadata || {}, + moduleSource: options.source, + moduleAddress: options.address + })); + } + + // 15.2.4.2 + function requestLoad(loader, request, refererName, refererAddress) { + // 15.2.4.2.1 CallNormalize + return new Promise(function(resolve, reject) { + resolve(loader.loaderObj.normalize(request, refererName, refererAddress)); + }) + // 15.2.4.2.2 GetOrCreateLoad + .then(function(name) { + var load; + if (loader.modules[name]) { + load = createLoad(name); + load.status = 'linked'; + // https://bugs.ecmascript.org/show_bug.cgi?id=2795 + load.module = loader.modules[name]; + return load; + } + + for (var i = 0, l = loader.loads.length; i < l; i++) { + load = loader.loads[i]; + if (load.name != name) + continue; + console.assert(load.status == 'loading' || load.status == 'loaded', 'loading or loaded'); + return load; + } + + load = createLoad(name); + loader.loads.push(load); + + proceedToLocate(loader, load); + + return load; + }); + } + + // 15.2.4.3 + function proceedToLocate(loader, load) { + proceedToFetch(loader, load, + Promise.resolve() + // 15.2.4.3.1 CallLocate + .then(function() { + return loader.loaderObj.locate({ name: load.name, metadata: load.metadata }); + }) + ); + } + + // 15.2.4.4 + function proceedToFetch(loader, load, p) { + proceedToTranslate(loader, load, + p + // 15.2.4.4.1 CallFetch + .then(function(address) { + // adjusted, see https://bugs.ecmascript.org/show_bug.cgi?id=2602 + if (load.status != 'loading') + return; + load.address = address; + + return loader.loaderObj.fetch({ name: load.name, metadata: load.metadata, address: address }); + }) + ); + } + + var anonCnt = 0; + + // 15.2.4.5 + function proceedToTranslate(loader, load, p) { + p + // 15.2.4.5.1 CallTranslate + .then(function(source) { + if (load.status != 'loading') + return; + + return Promise.resolve(loader.loaderObj.translate({ name: load.name, metadata: load.metadata, address: load.address, source: source })) + + // 15.2.4.5.2 CallInstantiate + .then(function(source) { + load.source = source; + return loader.loaderObj.instantiate({ name: load.name, metadata: load.metadata, address: load.address, source: source }); + }) + + // 15.2.4.5.3 InstantiateSucceeded + .then(function(instantiateResult) { + if (instantiateResult === undefined) { + load.address = load.address || ''; + + // instead of load.kind, use load.isDeclarative + load.isDeclarative = true; + return loader.loaderObj.transpile(load) + .then(function(transpiled) { + // Hijack System.register to set declare function + var curSystem = __global.System; + var curRegister = curSystem.register; + curSystem.register = function(name, deps, declare) { + if (typeof name != 'string') { + declare = deps; + deps = name; + } + // store the registered declaration as load.declare + // store the deps as load.deps + load.declare = declare; + load.depsList = deps; + } + __eval(transpiled, __global, load); + curSystem.register = curRegister; + }); + } + else if (typeof instantiateResult == 'object') { + load.depsList = instantiateResult.deps || []; + load.execute = instantiateResult.execute; + load.isDeclarative = false; + } + else + throw TypeError('Invalid instantiate return value'); + }) + // 15.2.4.6 ProcessLoadDependencies + .then(function() { + load.dependencies = []; + var depsList = load.depsList; + + var loadPromises = []; + for (var i = 0, l = depsList.length; i < l; i++) (function(request, index) { + loadPromises.push( + requestLoad(loader, request, load.name, load.address) + + // 15.2.4.6.1 AddDependencyLoad (load is parentLoad) + .then(function(depLoad) { + + // adjusted from spec to maintain dependency order + // this is due to the System.register internal implementation needs + load.dependencies[index] = { + key: request, + value: depLoad.name + }; + + if (depLoad.status != 'linked') { + var linkSets = load.linkSets.concat([]); + for (var i = 0, l = linkSets.length; i < l; i++) + addLoadToLinkSet(linkSets[i], depLoad); + } + + // console.log('AddDependencyLoad ' + depLoad.name + ' for ' + load.name); + // snapshot(loader); + }) + ); + })(depsList[i], i); + + return Promise.all(loadPromises); + }) + + // 15.2.4.6.2 LoadSucceeded + .then(function() { + // console.log('LoadSucceeded ' + load.name); + // snapshot(loader); + + console.assert(load.status == 'loading', 'is loading'); + + load.status = 'loaded'; + + var linkSets = load.linkSets.concat([]); + for (var i = 0, l = linkSets.length; i < l; i++) + updateLinkSetOnLoad(linkSets[i], load); + }); + }) + // 15.2.4.5.4 LoadFailed + ['catch'](function(exc) { + load.status = 'failed'; + load.exception = exc; + + var linkSets = load.linkSets.concat([]); + for (var i = 0, l = linkSets.length; i < l; i++) { + linkSetFailed(linkSets[i], load, exc); + } + + console.assert(load.linkSets.length == 0, 'linkSets not removed'); + }); + } + + // 15.2.4.7 PromiseOfStartLoadPartwayThrough absorbed into calling functions + + // 15.2.4.7.1 + function asyncStartLoadPartwayThrough(stepState) { + return function(resolve, reject) { + var loader = stepState.loader; + var name = stepState.moduleName; + var step = stepState.step; + + if (loader.modules[name]) + throw new TypeError('"' + name + '" already exists in the module table'); + + // adjusted to pick up existing loads + var existingLoad; + for (var i = 0, l = loader.loads.length; i < l; i++) { + if (loader.loads[i].name == name) { + existingLoad = loader.loads[i]; + + if(step == 'translate' && !existingLoad.source) { + existingLoad.address = stepState.moduleAddress; + proceedToTranslate(loader, existingLoad, Promise.resolve(stepState.moduleSource)); + } + + return existingLoad.linkSets[0].done.then(function() { + resolve(existingLoad); + }); + } + } + + var load = createLoad(name); + + load.metadata = stepState.moduleMetadata; + + var linkSet = createLinkSet(loader, load); + + loader.loads.push(load); + + resolve(linkSet.done); + + if (step == 'locate') + proceedToLocate(loader, load); + + else if (step == 'fetch') + proceedToFetch(loader, load, Promise.resolve(stepState.moduleAddress)); + + else { + console.assert(step == 'translate', 'translate step'); + load.address = stepState.moduleAddress; + proceedToTranslate(loader, load, Promise.resolve(stepState.moduleSource)); + } + } + } + + // Declarative linking functions run through alternative implementation: + // 15.2.5.1.1 CreateModuleLinkageRecord not implemented + // 15.2.5.1.2 LookupExport not implemented + // 15.2.5.1.3 LookupModuleDependency not implemented + + // 15.2.5.2.1 + function createLinkSet(loader, startingLoad) { + var linkSet = { + loader: loader, + loads: [], + startingLoad: startingLoad, // added see spec bug https://bugs.ecmascript.org/show_bug.cgi?id=2995 + loadingCount: 0 + }; + linkSet.done = new Promise(function(resolve, reject) { + linkSet.resolve = resolve; + linkSet.reject = reject; + }); + addLoadToLinkSet(linkSet, startingLoad); + return linkSet; + } + // 15.2.5.2.2 + function addLoadToLinkSet(linkSet, load) { + console.assert(load.status == 'loading' || load.status == 'loaded', 'loading or loaded on link set'); + + for (var i = 0, l = linkSet.loads.length; i < l; i++) + if (linkSet.loads[i] == load) + return; + + linkSet.loads.push(load); + load.linkSets.push(linkSet); + + // adjustment, see https://bugs.ecmascript.org/show_bug.cgi?id=2603 + if (load.status != 'loaded') { + linkSet.loadingCount++; + } + + var loader = linkSet.loader; + + for (var i = 0, l = load.dependencies.length; i < l; i++) { + var name = load.dependencies[i].value; + + if (loader.modules[name]) + continue; + + for (var j = 0, d = loader.loads.length; j < d; j++) { + if (loader.loads[j].name != name) + continue; + + addLoadToLinkSet(linkSet, loader.loads[j]); + break; + } + } + // console.log('add to linkset ' + load.name); + // snapshot(linkSet.loader); + } + + // linking errors can be generic or load-specific + // this is necessary for debugging info + function doLink(linkSet) { + var error = false; + try { + link(linkSet, function(load, exc) { + linkSetFailed(linkSet, load, exc); + error = true; + }); + } + catch(e) { + linkSetFailed(linkSet, null, e); + error = true; + } + return error; + } + + // 15.2.5.2.3 + function updateLinkSetOnLoad(linkSet, load) { + // console.log('update linkset on load ' + load.name); + // snapshot(linkSet.loader); + + console.assert(load.status == 'loaded' || load.status == 'linked', 'loaded or linked'); + + linkSet.loadingCount--; + + if (linkSet.loadingCount > 0) + return; + + // adjusted for spec bug https://bugs.ecmascript.org/show_bug.cgi?id=2995 + var startingLoad = linkSet.startingLoad; + + // non-executing link variation for loader tracing + // on the server. Not in spec. + /***/ + if (linkSet.loader.loaderObj.execute === false) { + var loads = [].concat(linkSet.loads); + for (var i = 0, l = loads.length; i < l; i++) { + var load = loads[i]; + load.module = !load.isDeclarative ? { + module: _newModule({}) + } : { + name: load.name, + module: _newModule({}), + evaluated: true + }; + load.status = 'linked'; + finishLoad(linkSet.loader, load); + } + return linkSet.resolve(startingLoad); + } + /***/ + + var abrupt = doLink(linkSet); + + if (abrupt) + return; + + console.assert(linkSet.loads.length == 0, 'loads cleared'); + + linkSet.resolve(startingLoad); + } + + // 15.2.5.2.4 + function linkSetFailed(linkSet, load, exc) { + var loader = linkSet.loader; + + if (load && linkSet.loads[0].name != load.name) + exc = addToError(exc, 'Error loading "' + load.name + '" from "' + linkSet.loads[0].name + '" at ' + (linkSet.loads[0].address || '') + '\n'); + + 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++) { + var load = loads[i]; + + // store all failed load records + loader.loaderObj.failed = loader.loaderObj.failed || []; + if (indexOf.call(loader.loaderObj.failed, load) == -1) + loader.loaderObj.failed.push(load); + + var linkIndex = indexOf.call(load.linkSets, linkSet); + console.assert(linkIndex != -1, 'link not present'); + load.linkSets.splice(linkIndex, 1); + if (load.linkSets.length == 0) { + var globalLoadsIndex = indexOf.call(linkSet.loader.loads, load); + if (globalLoadsIndex != -1) + linkSet.loader.loads.splice(globalLoadsIndex, 1); + } + } + linkSet.reject(exc); + } + + // 15.2.5.2.5 + function finishLoad(loader, load) { + // add to global trace if tracing + if (loader.loaderObj.trace) { + if (!loader.loaderObj.loads) + loader.loaderObj.loads = {}; + var depMap = {}; + load.dependencies.forEach(function(dep) { + depMap[dep.key] = dep.value; + }); + loader.loaderObj.loads[load.name] = { + name: load.name, + deps: load.dependencies.map(function(dep){ return dep.key }), + depMap: depMap, + address: load.address, + metadata: load.metadata, + source: load.source, + kind: load.isDeclarative ? 'declarative' : 'dynamic' + }; + } + // if not anonymous, add to the module table + if (load.name) { + console.assert(!loader.modules[load.name], 'load not in module table'); + loader.modules[load.name] = load.module; + } + var loadIndex = indexOf.call(loader.loads, load); + if (loadIndex != -1) + loader.loads.splice(loadIndex, 1); + for (var i = 0, l = load.linkSets.length; i < l; i++) { + loadIndex = indexOf.call(load.linkSets[i].loads, load); + if (loadIndex != -1) + load.linkSets[i].loads.splice(loadIndex, 1); + } + load.linkSets.splice(0, load.linkSets.length); + } + + // 15.2.5.3 Module Linking Groups + + // 15.2.5.3.2 BuildLinkageGroups alternative implementation + // Adjustments (also see https://bugs.ecmascript.org/show_bug.cgi?id=2755) + // 1. groups is an already-interleaved array of group kinds + // 2. load.groupIndex is set when this function runs + // 3. load.groupIndex is the interleaved index ie 0 declarative, 1 dynamic, 2 declarative, ... (or starting with dynamic) + function buildLinkageGroups(load, loads, groups) { + groups[load.groupIndex] = groups[load.groupIndex] || []; + + // if the load already has a group index and its in its group, its already been done + // this logic naturally handles cycles + if (indexOf.call(groups[load.groupIndex], load) != -1) + return; + + // now add it to the group to indicate its been seen + groups[load.groupIndex].push(load); + + for (var i = 0, l = loads.length; i < l; i++) { + var loadDep = loads[i]; + + // dependencies not found are already linked + for (var j = 0; j < load.dependencies.length; j++) { + if (loadDep.name == load.dependencies[j].value) { + // by definition all loads in linkset are loaded, not linked + console.assert(loadDep.status == 'loaded', 'Load in linkSet not loaded!'); + + // if it is a group transition, the index of the dependency has gone up + // otherwise it is the same as the parent + var loadDepGroupIndex = load.groupIndex + (loadDep.isDeclarative != load.isDeclarative); + + // 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 !== undefined) { + groups[loadDep.groupIndex].splice(indexOf.call(groups[loadDep.groupIndex], loadDep), 1); + + // if the old group is empty, then we have a mixed depndency cycle + if (groups[loadDep.groupIndex].length == 0) + throw new TypeError("Mixed dependency cycle detected"); + } + + loadDep.groupIndex = loadDepGroupIndex; + } + + buildLinkageGroups(loadDep, loads, groups); + } + } + } + } + + 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 + function link(linkSet, linkError) { + + var loader = linkSet.loader; + + if (!linkSet.loads.length) + return; + + // console.log('linking {' + logloads(linkSet.loads) + '}'); + // snapshot(loader); + + // 15.2.5.3.1 LinkageGroups alternative implementation + + // build all the groups + // because the first load represents the top of the tree + // for a given linkset, we can work down from there + var groups = []; + var startingLoad = linkSet.loads[0]; + startingLoad.groupIndex = 0; + buildLinkageGroups(startingLoad, linkSet.loads, groups); + + // determine the kind of the bottom group + var curGroupDeclarative = startingLoad.isDeclarative == groups.length % 2; + + // run through the groups from bottom to top + for (var i = groups.length - 1; i >= 0; i--) { + var group = groups[i]; + for (var j = 0; j < group.length; j++) { + var load = group[j]; + + // 15.2.5.5 LinkDeclarativeModules adjusted + if (curGroupDeclarative) { + linkDeclarativeModule(load, linkSet.loads, loader); + } + // 15.2.5.6 LinkDynamicModules adjusted + else { + var module = doDynamicExecute(linkSet, load, linkError); + if (!module) + return; + load.module = { + name: load.name, + module: module + }; + load.status = 'linked'; + } + finishLoad(loader, load); + } + + // alternative current kind for next loop + curGroupDeclarative = !curGroupDeclarative; + } + } + + + // custom module records for binding graph + // store linking module records in a separate table + function getOrCreateModuleRecord(name, loader) { + var moduleRecords = loader.moduleRecords; + return moduleRecords[name] || (moduleRecords[name] = { + name: name, + dependencies: [], + module: new Module(), // start from an empty module and extend + importers: [] + }); + } + + // custom declarative linking function + function linkDeclarativeModule(load, loads, loader) { + if (load.module) + return; + + var module = load.module = getOrCreateModuleRecord(load.name, loader); + var moduleObj = load.module.module; + + var registryEntry = load.declare.call(__global, function(name, value) { + // NB This should be an Object.defineProperty, but that is very slow. + // By disaling this module write-protection we gain performance. + // It could be useful to allow an option to enable or disable this. + module.locked = true; + moduleObj[name] = value; + + 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); + } + } + + module.locked = false; + return value; + }); + + // setup our setters and execution function + module.setters = registryEntry.setters; + module.execute = registryEntry.execute; + + // now link all the module dependencies + // amending the depMap as we go + for (var i = 0, l = load.dependencies.length; i < l; i++) { + var depName = load.dependencies[i].value; + var depModule = loader.modules[depName]; + + // if dependency not already in the module registry + // then try and link it now + if (!depModule) { + // get the dependency load record + 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; + } + // if circular, create the module record + else { + depModule = getOrCreateModuleRecord(depName, loader); + } + } + } + + // only declarative modules have dynamic bindings + if (depModule.importers) { + module.dependencies.push(depModule); + depModule.importers.push(module); + } + else { + // track dynamic records as null module records as already linked + module.dependencies.push(null); + } + + // run the setter for this dependency + if (module.setters[i]) + module.setters[i](depModule.module); + } + + 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: + * + * module.module bound module object + * module.execute execution function for module + * module.dependencies list of module objects for dependencies + * See getOrCreateModuleRecord for all properties + * + */ + function doExecute(module) { + try { + module.execute.call(__global); + } + catch(e) { + return e; + } + } + + // propogate execution errors + // see https://bugs.ecmascript.org/show_bug.cgi?id=2993 + function doEnsureEvaluated(module, seen, loader) { + var err = ensureEvaluated(module, seen, loader); + if (err) + throw err; + } + // 15.2.6.2 EnsureEvaluated adjusted + function ensureEvaluated(module, seen, loader) { + if (module.evaluated || !module.dependencies) + return; + + seen.push(module); + + var deps = module.dependencies; + var err; + + for (var i = 0, l = deps.length; i < l; i++) { + var dep = deps[i]; + // dynamic dependencies are empty in module.dependencies + // as they are already linked + if (!dep) + continue; + if (indexOf.call(seen, dep) == -1) { + 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'); + return err; + } + } + } + + if (module.failed) + return new Error('Module failed execution.'); + + if (module.evaluated) + return; + + module.evaluated = true; + err = doExecute(module); + if (err) { + module.failed = true; + } + else if (Object.preventExtensions) { + // spec variation + // we don't create a new module here because it was created and ammended + // we just disable further extensions instead + Object.preventExtensions(module.module); + } + + 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(); + + for (var key in obj) { + (function (key) { + defineProperty(m, key, { + configurable: false, + enumerable: true, + get: function () { + return obj[key]; + } + }); + })(key); + } + + 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 + */ +(function(Loader) { + var g = __global; + + function getTranspilerModule(loader, globalName) { + return loader.newModule({ 'default': g[globalName], __useDefault: true }); + } + + // use Traceur by default + Loader.prototype.transpiler = 'traceur'; + + Loader.prototype.transpile = function(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) { + 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); + } + }; + } + }); + }; + + function traceurTranspile(load, traceur) { + var options = this.traceurOptions || {}; + options.modules = 'instantiate'; + options.script = false; + options.sourceMaps = 'inline'; + options.filename = load.address; + options.inputSourceMap = load.metadata.sourceMap; + 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'; + } + function doTraceurCompile(source, compiler, filename) { + try { + return compiler.compile(source, filename); + } + catch(e) { + // traceur throws an error array + throw e[0]; + } + } + + function babelTranspile(load, babel) { + var options = this.babelOptions || {}; + options.modules = 'system'; + options.sourceMap = 'inline'; + options.filename = load.address; + options.code = true; + options.ast = false; + + if (!options.blacklist) + options.blacklist = ['react']; + + var source = 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'; + } + + +})(__global.LoaderPolyfill); +/* +********************************************************************************************* + + System Loader Implementation + + - Implemented to https://github.com/jorendorff/js-loaders/blob/master/browser-loader.js + + - ')}}else if("undefined"!=typeof importScripts)if(doEval=function(source){try{eval(source)}catch(e){throw e}},$__global.System&&$__global.LoaderPolyfill)$__global.upgradeSystemLoader();else{var basePath="";try{throw new Error("Get worker base path via error stack")}catch(e){e.stack.replace(/(?:at|@).*(http.+):[\d]+:[\d]+/,function(e,t){basePath=t.replace(/\/[^\/]*$/,"/")})}importScripts(basePath+"es6-module-loader.js"),$__global.upgradeSystemLoader()}else{var es6ModuleLoader=require("es6-module-loader");$__global.System=es6ModuleLoader.System,$__global.Loader=es6ModuleLoader.Loader,$__global.upgradeSystemLoader(),module.exports=$__global.System;var vm=require("vm");doEval=function(e){vm.runInThisContext(e)}}}()}("undefined"!=typeof window?window:"undefined"!=typeof global?global:self); +//# sourceMappingURL=system.js.map; +define("../libs/system", function(){}); + + + return require('tablefilter'); + +}); \ No newline at end of file diff --git a/example/index.html b/example/index.html index aded50e5..1bb00709 100644 --- a/example/index.html +++ b/example/index.html @@ -109,7 +109,44 @@ exclude_row: [totRowIndex], decimal_precision: [0, 2], tot_row_index: [totRowIndex, totRowIndex] - } + }, + extensions: [{ + /*** Columns Visibility Manager extension load ***/ + name: 'ColsVisibility', + src: 'extensions/colsVisibility/colsVisibility.js', + description: 'Columns visibility manager',/* + initialize: function(o){o.SetColsVisibility();}*/ + // manager: true, + tick_to_hide: true, + // headers_table: true, + // container_target_id: 'test_cont', + // headers_text: ['1','2','3','4','5','6'], + btn_target_id: 'test_cont', + // btn_text: 'Hola', + // btn_html: '', + // btn_css_class: 'test', + // btn_close_text: 'jj', + // btn_close_html: '', + // btn_close_css_class: 'test', + // stylesheet: 'hola.css', + // cont_css_class: 'test', + // checklist_item_css_class: 'test', + // at_start: [0,1,2,3,4], + // enable_hover: true, + enable_tick_all: true + // , + // tick_all_text: 'Hola', + // text: 'tutu', + // on_loaded: function(){ console.log(arguments); }, + // on_before_open: function(){ console.log('on_before_open', arguments); }, + // on_after_open: function(){ console.log('on_after_open',arguments); }, + // on_before_close: function(){ console.log('on_before_close',arguments); }, + // on_after_close: function(){ console.log('on_after_close',arguments); }, + // on_before_col_hidden: function(){ console.log('on_before_col_hidden',arguments); }, + // on_after_col_hidden: function(){ console.log('on_after_col_hidden',arguments); }, + // on_before_col_displayed: function(){ console.log('on_before_col_displayed',arguments); }, + // on_after_col_displayed: function(){ console.log('on_after_col_displayed',arguments); } + }] }); tf.init(); diff --git a/frags/end.colsvisibility.frag b/frags/end.colsvisibility.frag new file mode 100644 index 00000000..f6949618 --- /dev/null +++ b/frags/end.colsvisibility.frag @@ -0,0 +1,4 @@ + + return require('ColsVisibility'); + +}); \ No newline at end of file diff --git a/frags/start.colsvisibility.frag b/frags/start.colsvisibility.frag new file mode 100644 index 00000000..c424000f --- /dev/null +++ b/frags/start.colsvisibility.frag @@ -0,0 +1,10 @@ + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define(factory); + } else if (typeof exports === 'object') { + module.exports = factory; + } else { + root.AdapterSortableTable = factory(); + } +})(this, function() { \ No newline at end of file diff --git a/frags/start.frag b/frags/start.frag index 855c81fa..7c6aba00 100644 --- a/frags/start.frag +++ b/frags/start.frag @@ -5,6 +5,6 @@ } else if (typeof exports === 'object') { module.exports = factory; } else { - root.TableFilter = factory(); + root.ColsVisibility = factory(); } })(this, function() { \ No newline at end of file diff --git a/libs/almond/.bower.json b/libs/almond/.bower.json index ebd880b9..4f139b09 100644 --- a/libs/almond/.bower.json +++ b/libs/almond/.bower.json @@ -1,20 +1,20 @@ { "name": "almond", - "version": "0.3.0", + "version": "0.3.1", "main": "almond.js", "ignore": [ "tests", "shrinktest.sh" ], "homepage": "https://github.com/jrburke/almond", - "_release": "0.3.0", + "_release": "0.3.1", "_resolution": { "type": "version", - "tag": "0.3.0", - "commit": "5bc2e5f62569e9026159b6e6e37949e047035ca7" + "tag": "0.3.1", + "commit": "8336992b1a3fee8d10310822d4222fb82d24f097" }, "_source": "git://github.com/jrburke/almond.git", - "_target": "~0.3.0", + "_target": "~0.3.1", "_originalSource": "almond", "_direct": true } \ No newline at end of file diff --git a/libs/almond/.travis.yml b/libs/almond/.travis.yml index f3c63e50..7d38d5b1 100644 --- a/libs/almond/.travis.yml +++ b/libs/almond/.travis.yml @@ -1,5 +1,5 @@ language: node_js -node_js: 0.8 +node_js: 0.10 before_script: - node tests/server.js & diff --git a/libs/almond/README.md b/libs/almond/README.md index bbf70c1c..401aee88 100644 --- a/libs/almond/README.md +++ b/libs/almond/README.md @@ -173,13 +173,16 @@ After the build, then the built file should be structured like so: Explanations of common errors: -### deps is undefined +### incorrect module build, no module name -Where this line is mentioned: +In almond 3.0.0 and earlier, this would show up as "deps is undefined", where +this line is mentioned: if (!deps.splice) { -It usually means that there is a define()'d module, but it is missing a name, +In 3.0.1+ the error is explicitly: "incorrect module build, no module name". + +This means that there is a define()'d module, but it is missing a name, something that looks like this: define(function () {}); @@ -197,6 +200,14 @@ when it should look like: This is usually a sign that the tool you used to combine all the modules together did not properly name an anonymous AMD module. +Multiple modules built into a single file **must** have names in the define calls. +Otherwise almond has no way to assign the module to a name key for use in the code. + +The fix is to use a build tool that understand AMD modules and inserts the module +IDs in the build. The +[requirejs optimizer](http://requirejs.org/docs/optimization.html) is a build tool +that can do this correctly. + ### x missing y It means that module 'x' asked for module 'y', but module 'y' was not available. diff --git a/libs/almond/almond.js b/libs/almond/almond.js index 52508234..2a065882 100644 --- a/libs/almond/almond.js +++ b/libs/almond/almond.js @@ -1,5 +1,5 @@ /** - * @license almond 0.3.0 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved. + * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved. * Available via the MIT or new BSD license. * see: http://github.com/jrburke/almond for details */ @@ -44,12 +44,6 @@ var requirejs, require, define; //otherwise, assume it is a top-level require that will //be relative to baseUrl in the end. if (baseName) { - //Convert baseName to array, and lop off the last part, - //so that . matches that "directory" and not name of the baseName's - //module. For instance, baseName of "one/two/three", maps to - //"one/two/three.js", but we want the directory, "one/two" for - //this normalization. - baseParts = baseParts.slice(0, baseParts.length - 1); name = name.split('/'); lastIndex = name.length - 1; @@ -58,7 +52,11 @@ var requirejs, require, define; name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); } - name = baseParts.concat(name); + //Lop off the last part of baseParts, so that . matches the + //"directory" and not name of the baseName's module. For instance, + //baseName of "one/two/three", maps to "one/two/three.js", but we + //want the directory, "one/two" for this normalization. + name = baseParts.slice(0, baseParts.length - 1).concat(name); //start trimDots for (i = 0; i < name.length; i += 1) { @@ -408,6 +406,9 @@ var requirejs, require, define; requirejs._defined = defined; define = function (name, deps, callback) { + if (typeof name !== 'string') { + throw new Error('See almond README: incorrect module build, no module name'); + } //This module may not have dependencies if (!deps.splice) { diff --git a/libs/almond/bower.json b/libs/almond/bower.json index a6f052d9..248db36a 100644 --- a/libs/almond/bower.json +++ b/libs/almond/bower.json @@ -1,6 +1,6 @@ { "name": "almond", - "version": "0.3.0", + "version": "0.3.1", "main": "almond.js", "ignore": [ "tests", diff --git a/libs/almond/package.json b/libs/almond/package.json index d285adec..170d8d89 100644 --- a/libs/almond/package.json +++ b/libs/almond/package.json @@ -1,28 +1,29 @@ { - "name": "almond", - "description": "A minimal AMD API implementation for use in optimized browser builds.", - "version": "0.3.0", - "homepage": "http://github.com/jrburke/almond", - "author": "James Burke (http://github.com/jrburke)", - "repository": { - "type": "git", - "url": "git://github.com/jrburke/almond.git" + "name": "almond", + "description": "A minimal AMD API implementation for use in optimized browser builds.", + "version": "0.3.1", + "homepage": "http://github.com/jrburke/almond", + "author": "James Burke (http://github.com/jrburke)", + "repository": { + "type": "git", + "url": "git://github.com/jrburke/almond.git" + }, + "licenses": [ + { + "type": "BSD", + "url": "https://github.com/jrburke/almond/blob/master/LICENSE" }, - "licenses": [ - { - "type": "BSD", - "url": "https://github.com/jrburke/almond/blob/master/LICENSE" - }, - { - "type": "MIT", - "url": "https://github.com/jrburke/almond/blob/master/LICENSE" - } - ], - "main": "almond.js", - "engines": { - "node": ">=0.4.0" - }, - "devDependencies": { - "connect": "*" + { + "type": "MIT", + "url": "https://github.com/jrburke/almond/blob/master/LICENSE" } + ], + "main": "almond.js", + "engines": { + "node": ">=0.4.0" + }, + "devDependencies": { + "connect": "^3.3.4", + "serve-static": "^1.9.1" + } } diff --git a/libs/es6-module-loader.js b/libs/es6-module-loader.js new file mode 100644 index 00000000..d6ec4e7e --- /dev/null +++ b/libs/es6-module-loader.js @@ -0,0 +1,8 @@ +/* + * es6-module-loader v0.16.5 + * https://github.com/ModuleLoader/es6-module-loader + * Copyright (c) 2015 Guy Bedford, Luke Hoban, Addy Osmani; Licensed MIT + */ + +!function(a){"object"==typeof exports?module.exports=a():"function"==typeof define&&define.amd?define(a):"undefined"!=typeof window?window.Promise=a():"undefined"!=typeof global?global.Promise=a():"undefined"!=typeof self&&(self.Promise=a())}(function(){var a;return function b(a,c,d){function e(g,h){if(!c[g]){if(!a[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};a[g][0].call(j.exports,function(b){var c=a[g][1][b];return e(c?c:b)},j,j.exports,b,a,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g=0&&(n.splice(b,1),l("Handled previous rejection ["+a.id+"] "+e.formatObject(a.value)))}function h(a,b){m.push(a,b),null===o&&(o=d(i,0))}function i(){for(o=null;m.length>0;)m.shift()(m.shift())}var j,k=c,l=c;"undefined"!=typeof console&&(j=console,k="undefined"!=typeof j.error?function(a){j.error(a)}:function(a){j.log(a)},l="undefined"!=typeof j.info?function(a){j.info(a)}:function(a){j.log(a)}),a.onPotentiallyUnhandledRejection=function(a){h(f,a)},a.onPotentiallyUnhandledRejectionHandled=function(a){h(g,a)},a.onFatalRejection=function(a){h(b,a.value)};var m=[],n=[],o=null;return a}})}("function"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{"../env":5,"../format":6}],5:[function(b,c,d){!function(a){"use strict";a(function(a){function b(){return"undefined"!=typeof process&&null!==process&&"function"==typeof process.nextTick}function c(){return"function"==typeof MutationObserver&&MutationObserver||"function"==typeof WebKitMutationObserver&&WebKitMutationObserver}function d(a){function b(){var a=c;c=void 0,a()}var c,d=document.createTextNode(""),e=new a(b);e.observe(d,{characterData:!0});var f=0;return function(a){c=a,d.data=f^=1}}var e,f="undefined"!=typeof setTimeout&&setTimeout,g=function(a,b){return setTimeout(a,b)},h=function(a){return clearTimeout(a)},i=function(a){return f(a,0)};if(b())i=function(a){return process.nextTick(a)};else if(e=c())i=d(e);else if(!f){var j=a,k=j("vertx");g=function(a,b){return k.setTimer(b,a)},h=k.cancelTimer,i=k.runOnLoop||k.runOnContext}return{setTimer:g,clearTimer:h,asap:i}})}("function"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{}],6:[function(b,c,d){!function(a){"use strict";a(function(){function a(a){var c="object"==typeof a&&null!==a&&a.stack?a.stack:b(a);return a instanceof Error?c:c+" (WARNING: non-Error used)"}function b(a){var b=String(a);return"[object Object]"===b&&"undefined"!=typeof JSON&&(b=c(a,b)),b}function c(a,b){try{return JSON.stringify(a)}catch(c){return b}}return{formatError:a,formatObject:b,tryStringify:c}})}("function"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],7:[function(b,c,d){!function(a){"use strict";a(function(){return function(a){function b(a,b){this._handler=a===t?b:c(a)}function c(a){function b(a){e.resolve(a)}function c(a){e.reject(a)}function d(a){e.notify(a)}var e=new v;try{a(b,c,d)}catch(f){c(f)}return e}function d(a){return I(a)?a:new b(t,new w(q(a)))}function e(a){return new b(t,new w(new z(a)))}function f(){return _}function g(){return new b(t,new v)}function h(a,b){var c=new v(a.receiver,a.join().context);return new b(t,c)}function i(a){return k(S,null,a)}function j(a,b){return k(N,a,b)}function k(a,c,d){function e(b,e,g){g.resolved||l(d,f,b,a(c,e,b),g)}function f(a,b,c){k[a]=b,0===--j&&c.become(new y(k))}for(var g,h="function"==typeof c?e:f,i=new v,j=d.length>>>0,k=new Array(j),m=0;m0?b(c,f.value,e):(e.become(f),m(a,c+1,f))}else b(c,d,e)}function m(a,b,c){for(var d=b;dc&&a._unreport()}}function o(a){return"object"!=typeof a||null===a?e(new TypeError("non-iterable passed to race()")):0===a.length?f():1===a.length?d(a[0]):p(a)}function p(a){var c,d,e,f=new v;for(c=0;c0||"function"!=typeof b&&0>e)return new this.constructor(t,d);var f=this._beget(),g=f._handler;return d.chain(g,d.receiver,a,b,c),f},b.prototype["catch"]=function(a){return this.then(void 0,a)},b.prototype._beget=function(){return h(this._handler,this.constructor)},b.all=i,b.race=o,b._traverse=j,b._visitRemaining=m,t.prototype.when=t.prototype.become=t.prototype.notify=t.prototype.fail=t.prototype._unreport=t.prototype._report=T,t.prototype._state=0,t.prototype.state=function(){return this._state},t.prototype.join=function(){for(var a=this;void 0!==a.handler;)a=a.handler;return a},t.prototype.chain=function(a,b,c,d,e){this.when({resolver:a,receiver:b,fulfilled:c,rejected:d,progress:e})},t.prototype.visit=function(a,b,c,d){this.chain(Y,a,b,c,d)},t.prototype.fold=function(a,b,c,d){this.when(new H(a,b,c,d))},R(t,u),u.prototype.become=function(a){a.fail()};var Y=new u;R(t,v),v.prototype._state=0,v.prototype.resolve=function(a){this.become(q(a))},v.prototype.reject=function(a){this.resolved||this.become(new z(a))},v.prototype.join=function(){if(!this.resolved)return this;for(var a=this;void 0!==a.handler;)if(a=a.handler,a===this)return this.handler=C();return a},v.prototype.run=function(){var a=this.consumers,b=this.handler;this.handler=this.handler.join(),this.consumers=void 0;for(var c=0;cf;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,A.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(d){return"loading"==b.status?A.resolve(a.loaderObj.translate({name:b.name,metadata:b.metadata,address:b.address,source:d})).then(function(c){return b.source=c,a.loaderObj.instantiate({name:b.name,metadata:b.metadata,address:b.address,source:c})}).then(function(c){if(void 0===c)return b.address=b.address||"",b.isDeclarative=!0,a.loaderObj.transpile(b).then(function(a){var c=__global.System,d=c.register;c.register=function(a,c,d){"string"!=typeof a&&(d=c,c=a),b.declare=d,b.depsList=c},__eval(a,__global,b),c.register=d});if("object"!=typeof c)throw TypeError("Invalid instantiate return value");b.depsList=c.deps||[],b.execute=c.execute,b.isDeclarative=!1}).then(function(){b.dependencies=[];for(var d=b.depsList,e=[],f=0,g=d.length;g>f;f++)(function(d,f){e.push(c(a,d,b.name,b.address).then(function(a){if(b.dependencies[f]={key:d,value:a.name},"linked"!=a.status)for(var c=b.linkSets.concat([]),e=0,g=c.length;g>e;e++)i(c[e],a)}))})(d[f],f);return A.all(e)}).then(function(){b.status="loaded";for(var a=b.linkSets.concat([]),c=0,d=a.length;d>c;c++)k(a[c],b)}):void 0})["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],b,a)})}function g(b){return function(c,g){var i=b.loader,j=b.moduleName,k=b.step;if(i.modules[j])throw new TypeError('"'+j+'" already exists in the module table');for(var l,m=0,n=i.loads.length;n>m;m++)if(i.loads[m].name==j)return l=i.loads[m],"translate"!=k||l.source||(l.address=b.moduleAddress,f(i,l,A.resolve(b.moduleSource))),l.linkSets[0].done.then(function(){c(l)});var o=a(j);o.metadata=b.moduleMetadata;var p=h(i,o);i.loads.push(o),c(p.done),"locate"==k?d(i,o):"fetch"==k?e(i,o,A.resolve(b.moduleAddress)):(o.address=b.moduleAddress,f(i,o,A.resolve(b.moduleSource)))}}function h(a,b){var c={loader:a,loads:[],startingLoad:b,loadingCount:0};return c.done=new A(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){var b=!1;try{p(a,function(c,d){l(a,c,d),b=!0})}catch(c){l(a,null,c),b=!0}return b}function k(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:E({}),evaluated:!0}:{module:E({})},b.status="linked",m(a.loader,b)}return a.resolve(c)}var g=j(a);g||a.resolve(c)}}function l(a,b,c){var d=a.loader;b&&a.loads[0].name!=b.name&&(c=w(c,'Error loading "'+b.name+'" from "'+a.loads[0].name+'" at '+(a.loads[0].address||"")+"\n")),b&&(c=w(c,'Error loading "'+b.name+'" at '+(b.address||"")+"\n"));for(var e=a.loads.concat([]),f=0,g=e.length;g>f;f++){var b=e[f];d.loaderObj.failed=d.loaderObj.failed||[],-1==B.call(d.loaderObj.failed,b)&&d.loaderObj.failed.push(b);var h=B.call(b.linkSets,a);if(b.linkSets.splice(h,1),0==b.linkSets.length){var i=B.call(a.loader.loads,b);-1!=i&&a.loader.loads.splice(i,1)}}a.reject(c)}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.isDeclarative?"declarative":"dynamic"}}b.name&&(a.modules[b.name]=b.module);var d=B.call(a.loads,b);-1!=d&&a.loads.splice(d,1);for(var e=0,f=b.linkSets.length;f>e;e++)d=B.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){if(c[a.groupIndex]=c[a.groupIndex]||[],-1==B.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=d.importers[c];if(!g.locked){var h=B.call(g.dependencies,d);g.setters[h](e)}}return d.locked=!1,b});d.setters=f.setters,d.execute=f.execute;for(var g=0,h=a.dependencies.length;h>g;g++){var i=a.dependencies[g].value,j=c.modules[i];if(!j)for(var k=0;kf;f++){var h=e[f];if(h&&-1==B.call(b,h)&&(d=v(h,b,c)))return d=w(d,"Error evaluating "+h.name+"\n")}if(a.failed)return new Error("Module failed execution.");if(!a.evaluated)return a.evaluated=!0,d=t(a),d?a.failed=!0:Object.preventExtensions&&Object.preventExtensions(a.module),a.execute=void 0,d}}function w(a,b){return a instanceof Error?a.message=b+a.message:a=b+a,a}function x(a){if("object"!=typeof a)throw new TypeError("Options must be an object");a.normalize&&(this.normalize=a.normalize),a.locate&&(this.locate=a.locate),a.fetch&&(this.fetch=a.fetch),a.translate&&(this.translate=a.translate),a.instantiate&&(this.instantiate=a.instantiate),this._loader={loaderObj:this,loads:[],modules:{},importPromises:{},moduleRecords:{}},C(this,"global",{get:function(){return __global}})}function y(){}function z(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})}var A=__global.Promise||require("when/es6-shim/Promise");__global.console&&(console.assert=console.assert||function(){});var B=Array.prototype.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},C=$__Object$defineProperty,D=0;x.prototype={constructor:x,define:function(a,b,c){if(this._loader.importPromises[a])throw new TypeError("Module is already loading.");return z(this,a,new A(g({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]?(u(this._loader.modules[a],[],this),this._loader.modules[a].module):void 0},has:function(a){return!!this._loader.modules[a]},"import":function(a,c){var d=this;return A.resolve(d.normalize(a,c&&c.name,c&&c.address)).then(function(a){var e=d._loader;return e.modules[a]?(u(e.modules[a],[],e._loader),e.modules[a].module):e.importPromises[a]||z(d,a,b(e,a,c||{}).then(function(b){return delete e.importPromises[a],s(e,b)}))})},load:function(a,c){return this._loader.modules[a]?(u(this._loader.modules[a],[],this._loader),A.resolve(this._loader.modules[a].module)):this._loader.importPromises[a]||z(this,a,b(this._loader,a,{}))},module:function(b,c){var d=a();d.address=c&&c.address;var e=h(this._loader,d),g=A.resolve(b),i=this._loader,j=e.done.then(function(){return s(i,d)});return f(i,d,g),j},newModule:function(a){if("object"!=typeof a)throw new TypeError("Expected object");var b=new y;for(var c in a)!function(c){C(b,c,{configurable:!1,enumerable:!0,get:function(){return a[c]}})}(c);return Object.preventExtensions&&Object.preventExtensions(b),b},set:function(a,b){if(!(b instanceof y))throw new TypeError("Loader.set("+a+", module) must be a module");this._loader.modules[a]={module:b}},normalize:function(a,b,c){return a},locate:function(a){return a.name},fetch:function(a){throw new TypeError("Fetch not implemented")},translate:function(a){return a.source},instantiate:function(a){}};var E=x.prototype.newModule;"object"==typeof exports&&(module.exports=x),__global.Reflect=__global.Reflect||{},__global.Reflect.Loader=__global.Reflect.Loader||x,__global.Reflect.global=__global.Reflect.global||__global,__global.LoaderPolyfill=x}(),function(a){function b(a,b){return a.newModule({"default":f[b],__useDefault:!0})}function c(a,b){var c=this.traceurOptions||{};c.modules="instantiate",c.script=!1,c.sourceMaps="inline",c.filename=a.address,c.inputSourceMap=a.metadata.sourceMap,c.moduleName=!1;var e=new b.Compiler(c),f=d(a.source,e,c.filename);return f+"\n//# sourceURL="+a.address+"!eval"}function d(a,b,c){try{return b.compile(a,c)}catch(d){throw d[0]}}function e(a,b){var c=this.babelOptions||{};c.modules="system",c.sourceMap="inline",c.filename=a.address,c.code=!0,c.ast=!1,c.blacklist||(c.blacklist=["react"]);var d=b.transform(a.source,c).code;return d+"\n//# sourceURL="+a.address+"!eval"}var f=__global;a.prototype.transpiler="traceur",a.prototype.transpile=function(a){var d=this;return d.transpilerHasRun||(f.traceur&&!d.has("traceur")&&d.set("traceur",b(d,"traceur")),f.babel&&!d.has("babel")&&d.set("babel",b(d,"babel")),d.transpilerHasRun=!0),d["import"](d.transpiler).then(function(b){return b.__useDefault&&(b=b["default"]),'var __moduleAddress = "'+a.address+'";'+(b.Compiler?c:e).call(d,a,b)})},a.prototype.instantiate=function(a){var c=this;return Promise.resolve(c.normalize(c.transpiler)).then(function(d){return a.name===d?{deps:[],execute:function(){var d=f.System,e=f.Reflect.Loader;return __eval("(function(require,exports,module){"+a.source+"})();",f,a),f.System=d,f.Reflect.Loader=e,b(c,a.name)}}:void 0})}}(__global.LoaderPolyfill),function(){function a(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 b(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)?"/":"")}function c(c,d){return i&&(d=d.replace(/\\/g,"/")),d=a(d||""),c=a(c||""),d&&c?(d.protocol||c.protocol)+(d.protocol||d.authority?d.authority:c.authority)+b(d.protocol||d.authority||"/"===d.pathname.charAt(0)?d.pathname:d.pathname?(c.authority&&!c.pathname?"/":"")+c.pathname.slice(0,c.pathname.lastIndexOf("/")+1)+d.pathname:c.pathname)+(d.protocol||d.authority||d.pathname?d.search:d.search||c.search)+d.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");if(1==g.length){if(d==f&&f.length>e.length){e=f;break}}else 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 i=this.paths[e];return b&&(i=i.replace("*",b)),h&&(i=i.replace(/#/g,"%23")),c(this.baseURL,i)},enumerable:!1,writable:!0}),$__Object$defineProperty(b.prototype,"fetch",{value:function(a){var b=this;return new j(function(d,e){f(c(b.baseURL,a.address),function(a){d(a)},e)})},enumerable:!1,writable:!0}),b}(__global.LoaderPolyfill),m=new l;if("object"==typeof exports&&(module.exports=m),__global.System=m,h&&"undefined"!=typeof document.getElementsByTagName){var n=document.getElementsByTagName("script");n=n[n.length-1],"complete"===document.readyState?setTimeout(e):document.addEventListener&&(document.addEventListener("DOMContentLoaded",d,!1),window.addEventListener("load",d,!1)),n.getAttribute("data-init")&&window[n.getAttribute("data-init")]()}}()}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope?self:global); +//# sourceMappingURL=es6-module-loader.js.map \ No newline at end of file diff --git a/libs/es6-module-loader.src.js b/libs/es6-module-loader.src.js new file mode 100644 index 00000000..22a167a8 --- /dev/null +++ b/libs/es6-module-loader.src.js @@ -0,0 +1,2857 @@ +!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.Promise=e():"undefined"!=typeof global?global.Promise=e():"undefined"!=typeof self&&(self.Promise=e())}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0) { + reported.splice(i, 1); + logInfo('Handled previous rejection [' + r.id + '] ' + format.formatObject(r.value)); + } + } + + function enqueue(f, x) { + tasks.push(f, x); + if(running === null) { + running = setTimer(flush, 0); + } + } + + function flush() { + running = null; + while(tasks.length > 0) { + tasks.shift()(tasks.shift()); + } + } + + return Promise; + }; + + function throwit(e) { + throw e; + } + + function noop() {} + +}); +}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); + +},{"../env":5,"../format":6}],5:[function(require,module,exports){ +/** @license MIT License (c) copyright 2010-2014 original author or authors */ +/** @author Brian Cavalier */ +/** @author John Hann */ + +/*global process,document,setTimeout,clearTimeout,MutationObserver,WebKitMutationObserver*/ +(function(define) { 'use strict'; +define(function(require) { + /*jshint maxcomplexity:6*/ + + // Sniff "best" async scheduling option + // Prefer process.nextTick or MutationObserver, then check for + // setTimeout, and finally vertx, since its the only env that doesn't + // have setTimeout + + var MutationObs; + var capturedSetTimeout = typeof setTimeout !== 'undefined' && setTimeout; + + // Default env + var setTimer = function(f, ms) { return setTimeout(f, ms); }; + var clearTimer = function(t) { return clearTimeout(t); }; + var asap = function (f) { return capturedSetTimeout(f, 0); }; + + // Detect specific env + if (isNode()) { // Node + asap = function (f) { return process.nextTick(f); }; + + } else if (MutationObs = hasMutationObserver()) { // Modern browser + asap = initMutationObserver(MutationObs); + + } else if (!capturedSetTimeout) { // vert.x + var vertxRequire = require; + var vertx = vertxRequire('vertx'); + setTimer = function (f, ms) { return vertx.setTimer(ms, f); }; + clearTimer = vertx.cancelTimer; + asap = vertx.runOnLoop || vertx.runOnContext; + } + + return { + setTimer: setTimer, + clearTimer: clearTimer, + asap: asap + }; + + function isNode () { + return typeof process !== 'undefined' && process !== null && + typeof process.nextTick === 'function'; + } + + function hasMutationObserver () { + return (typeof MutationObserver === 'function' && MutationObserver) || + (typeof WebKitMutationObserver === 'function' && WebKitMutationObserver); + } + + function initMutationObserver(MutationObserver) { + var scheduled; + var node = document.createTextNode(''); + var o = new MutationObserver(run); + o.observe(node, { characterData: true }); + + function run() { + var f = scheduled; + scheduled = void 0; + f(); + } + + var i = 0; + return function (f) { + scheduled = f; + node.data = (i ^= 1); + }; + } +}); +}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); })); + +},{}],6:[function(require,module,exports){ +/** @license MIT License (c) copyright 2010-2014 original author or authors */ +/** @author Brian Cavalier */ +/** @author John Hann */ + +(function(define) { 'use strict'; +define(function() { + + return { + formatError: formatError, + formatObject: formatObject, + tryStringify: tryStringify + }; + + /** + * Format an error into a string. If e is an Error and has a stack property, + * it's returned. Otherwise, e is formatted using formatObject, with a + * warning added about e not being a proper Error. + * @param {*} e + * @returns {String} formatted string, suitable for output to developers + */ + function formatError(e) { + var s = typeof e === 'object' && e !== null && e.stack ? e.stack : formatObject(e); + return e instanceof Error ? s : s + ' (WARNING: non-Error used)'; + } + + /** + * Format an object, detecting "plain" objects and running them through + * JSON.stringify if possible. + * @param {Object} o + * @returns {string} + */ + function formatObject(o) { + var s = String(o); + if(s === '[object Object]' && typeof JSON !== 'undefined') { + s = tryStringify(o, s); + } + return s; + } + + /** + * Try to return the result of JSON.stringify(x). If that fails, return + * defaultValue + * @param {*} x + * @param {*} defaultValue + * @returns {String|*} JSON.stringify(x) or defaultValue + */ + function tryStringify(x, defaultValue) { + try { + return JSON.stringify(x); + } catch(e) { + return defaultValue; + } + } + +}); +}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); })); + +},{}],7:[function(require,module,exports){ +/** @license MIT License (c) copyright 2010-2014 original author or authors */ +/** @author Brian Cavalier */ +/** @author John Hann */ + +(function(define) { 'use strict'; +define(function() { + + return function makePromise(environment) { + + var tasks = environment.scheduler; + var emitRejection = initEmitRejection(); + + var objectCreate = Object.create || + function(proto) { + function Child() {} + Child.prototype = proto; + return new Child(); + }; + + /** + * Create a promise whose fate is determined by resolver + * @constructor + * @returns {Promise} promise + * @name Promise + */ + function Promise(resolver, handler) { + this._handler = resolver === Handler ? handler : init(resolver); + } + + /** + * Run the supplied resolver + * @param resolver + * @returns {Pending} + */ + function init(resolver) { + var handler = new Pending(); + + try { + resolver(promiseResolve, promiseReject, promiseNotify); + } catch (e) { + promiseReject(e); + } + + return handler; + + /** + * Transition from pre-resolution state to post-resolution state, notifying + * all listeners of the ultimate fulfillment or rejection + * @param {*} x resolution value + */ + function promiseResolve (x) { + handler.resolve(x); + } + /** + * Reject this promise with reason, which will be used verbatim + * @param {Error|*} reason rejection reason, strongly suggested + * to be an Error type + */ + function promiseReject (reason) { + handler.reject(reason); + } + + /** + * @deprecated + * Issue a progress event, notifying all progress listeners + * @param {*} x progress event payload to pass to all listeners + */ + function promiseNotify (x) { + handler.notify(x); + } + } + + // Creation + + Promise.resolve = resolve; + Promise.reject = reject; + Promise.never = never; + + Promise._defer = defer; + Promise._handler = getHandler; + + /** + * Returns a trusted promise. If x is already a trusted promise, it is + * returned, otherwise returns a new trusted Promise which follows x. + * @param {*} x + * @return {Promise} promise + */ + function resolve(x) { + return isPromise(x) ? x + : new Promise(Handler, new Async(getHandler(x))); + } + + /** + * Return a reject promise with x as its reason (x is used verbatim) + * @param {*} x + * @returns {Promise} rejected promise + */ + function reject(x) { + return new Promise(Handler, new Async(new Rejected(x))); + } + + /** + * Return a promise that remains pending forever + * @returns {Promise} forever-pending promise. + */ + function never() { + return foreverPendingPromise; // Should be frozen + } + + /** + * Creates an internal {promise, resolver} pair + * @private + * @returns {Promise} + */ + function defer() { + return new Promise(Handler, new Pending()); + } + + // Transformation and flow control + + /** + * Transform this promise's fulfillment value, returning a new Promise + * for the transformed result. If the promise cannot be fulfilled, onRejected + * is called with the reason. onProgress *may* be called with updates toward + * this promise's fulfillment. + * @param {function=} onFulfilled fulfillment handler + * @param {function=} onRejected rejection handler + * @param {function=} onProgress @deprecated progress handler + * @return {Promise} new promise + */ + Promise.prototype.then = function(onFulfilled, onRejected, onProgress) { + var parent = this._handler; + var state = parent.join().state(); + + if ((typeof onFulfilled !== 'function' && state > 0) || + (typeof onRejected !== 'function' && state < 0)) { + // Short circuit: value will not change, simply share handler + return new this.constructor(Handler, parent); + } + + var p = this._beget(); + var child = p._handler; + + parent.chain(child, parent.receiver, onFulfilled, onRejected, onProgress); + + return p; + }; + + /** + * If this promise cannot be fulfilled due to an error, call onRejected to + * handle the error. Shortcut for .then(undefined, onRejected) + * @param {function?} onRejected + * @return {Promise} + */ + Promise.prototype['catch'] = function(onRejected) { + return this.then(void 0, onRejected); + }; + + /** + * Creates a new, pending promise of the same type as this promise + * @private + * @returns {Promise} + */ + Promise.prototype._beget = function() { + return begetFrom(this._handler, this.constructor); + }; + + function begetFrom(parent, Promise) { + var child = new Pending(parent.receiver, parent.join().context); + return new Promise(Handler, child); + } + + // Array combinators + + Promise.all = all; + Promise.race = race; + Promise._traverse = traverse; + + /** + * Return a promise that will fulfill when all promises in the + * input array have fulfilled, or will reject when one of the + * promises rejects. + * @param {array} promises array of promises + * @returns {Promise} promise for array of fulfillment values + */ + function all(promises) { + return traverseWith(snd, null, promises); + } + + /** + * Array> -> Promise> + * @private + * @param {function} f function to apply to each promise's value + * @param {Array} promises array of promises + * @returns {Promise} promise for transformed values + */ + function traverse(f, promises) { + return traverseWith(tryCatch2, f, promises); + } + + function traverseWith(tryMap, f, promises) { + var handler = typeof f === 'function' ? mapAt : settleAt; + + var resolver = new Pending(); + var pending = promises.length >>> 0; + var results = new Array(pending); + + for (var i = 0, x; i < promises.length && !resolver.resolved; ++i) { + x = promises[i]; + + if (x === void 0 && !(i in promises)) { + --pending; + continue; + } + + traverseAt(promises, handler, i, x, resolver); + } + + if(pending === 0) { + resolver.become(new Fulfilled(results)); + } + + return new Promise(Handler, resolver); + + function mapAt(i, x, resolver) { + if(!resolver.resolved) { + traverseAt(promises, settleAt, i, tryMap(f, x, i), resolver); + } + } + + function settleAt(i, x, resolver) { + results[i] = x; + if(--pending === 0) { + resolver.become(new Fulfilled(results)); + } + } + } + + function traverseAt(promises, handler, i, x, resolver) { + if (maybeThenable(x)) { + var h = getHandlerMaybeThenable(x); + var s = h.state(); + + if (s === 0) { + h.fold(handler, i, void 0, resolver); + } else if (s > 0) { + handler(i, h.value, resolver); + } else { + resolver.become(h); + visitRemaining(promises, i+1, h); + } + } else { + handler(i, x, resolver); + } + } + + Promise._visitRemaining = visitRemaining; + function visitRemaining(promises, start, handler) { + for(var i=start; i load contains linkSet'); + + if (load.linkSets.indexOf(linkSet) != -1) + console.assert(linkSet.loads.indexOf(load) != -1, 'load contains linkSet -> linkSet contains load'); + } + } + + for (var i = 0; i < linkSets.length; i++) { + var linkSet = linkSets[i]; + for (var j = 0; j < linkSet.loads.length; j++) { + var load = linkSet.loads[j]; + + for (var k = 0; k < load.dependencies.length; k++) { + var depName = load.dependencies[k].value; + var depLoad; + for (var l = 0; l < loads.length; l++) { + if (loads[l].name != depName) + continue; + depLoad = loads[l]; + break; + } + + // loading records are allowed not to have their dependencies yet + // if (load.status != 'loading') + // console.assert(depLoad, 'depLoad found'); + + // console.assert(linkSet.loads.indexOf(depLoad) != -1, 'linkset contains all dependencies'); + } + } + } +} */ + + +(function() { + var Promise = __global.Promise || require('when/es6-shim/Promise'); + if (__global.console) + console.assert = console.assert || function() {}; + + // IE8 support + var indexOf = Array.prototype.indexOf || function(item) { + for (var i = 0, thisLen = this.length; i < thisLen; i++) { + if (this[i] === item) { + return i; + } + } + return -1; + }; + var defineProperty = $__Object$defineProperty; + + // 15.2.3 - Runtime Semantics: Loader State + + // 15.2.3.11 + function createLoaderLoad(object) { + return { + // modules is an object for ES5 implementation + modules: {}, + loads: [], + loaderObj: object + }; + } + + // 15.2.3.2 Load Records and LoadRequest Objects + + // 15.2.3.2.1 + function createLoad(name) { + return { + status: 'loading', + name: name, + linkSets: [], + dependencies: [], + metadata: {} + }; + } + + // 15.2.3.2.2 createLoadRequestObject, absorbed into calling functions + + // 15.2.4 + + // 15.2.4.1 + function loadModule(loader, name, options) { + return new Promise(asyncStartLoadPartwayThrough({ + step: options.address ? 'fetch' : 'locate', + loader: loader, + moduleName: name, + // allow metadata for import https://bugs.ecmascript.org/show_bug.cgi?id=3091 + moduleMetadata: options && options.metadata || {}, + moduleSource: options.source, + moduleAddress: options.address + })); + } + + // 15.2.4.2 + function requestLoad(loader, request, refererName, refererAddress) { + // 15.2.4.2.1 CallNormalize + return new Promise(function(resolve, reject) { + resolve(loader.loaderObj.normalize(request, refererName, refererAddress)); + }) + // 15.2.4.2.2 GetOrCreateLoad + .then(function(name) { + var load; + if (loader.modules[name]) { + load = createLoad(name); + load.status = 'linked'; + // https://bugs.ecmascript.org/show_bug.cgi?id=2795 + load.module = loader.modules[name]; + return load; + } + + for (var i = 0, l = loader.loads.length; i < l; i++) { + load = loader.loads[i]; + if (load.name != name) + continue; + console.assert(load.status == 'loading' || load.status == 'loaded', 'loading or loaded'); + return load; + } + + load = createLoad(name); + loader.loads.push(load); + + proceedToLocate(loader, load); + + return load; + }); + } + + // 15.2.4.3 + function proceedToLocate(loader, load) { + proceedToFetch(loader, load, + Promise.resolve() + // 15.2.4.3.1 CallLocate + .then(function() { + return loader.loaderObj.locate({ name: load.name, metadata: load.metadata }); + }) + ); + } + + // 15.2.4.4 + function proceedToFetch(loader, load, p) { + proceedToTranslate(loader, load, + p + // 15.2.4.4.1 CallFetch + .then(function(address) { + // adjusted, see https://bugs.ecmascript.org/show_bug.cgi?id=2602 + if (load.status != 'loading') + return; + load.address = address; + + return loader.loaderObj.fetch({ name: load.name, metadata: load.metadata, address: address }); + }) + ); + } + + var anonCnt = 0; + + // 15.2.4.5 + function proceedToTranslate(loader, load, p) { + p + // 15.2.4.5.1 CallTranslate + .then(function(source) { + if (load.status != 'loading') + return; + + return Promise.resolve(loader.loaderObj.translate({ name: load.name, metadata: load.metadata, address: load.address, source: source })) + + // 15.2.4.5.2 CallInstantiate + .then(function(source) { + load.source = source; + return loader.loaderObj.instantiate({ name: load.name, metadata: load.metadata, address: load.address, source: source }); + }) + + // 15.2.4.5.3 InstantiateSucceeded + .then(function(instantiateResult) { + if (instantiateResult === undefined) { + load.address = load.address || ''; + + // instead of load.kind, use load.isDeclarative + load.isDeclarative = true; + return loader.loaderObj.transpile(load) + .then(function(transpiled) { + // Hijack System.register to set declare function + var curSystem = __global.System; + var curRegister = curSystem.register; + curSystem.register = function(name, deps, declare) { + if (typeof name != 'string') { + declare = deps; + deps = name; + } + // store the registered declaration as load.declare + // store the deps as load.deps + load.declare = declare; + load.depsList = deps; + } + __eval(transpiled, __global, load); + curSystem.register = curRegister; + }); + } + else if (typeof instantiateResult == 'object') { + load.depsList = instantiateResult.deps || []; + load.execute = instantiateResult.execute; + load.isDeclarative = false; + } + else + throw TypeError('Invalid instantiate return value'); + }) + // 15.2.4.6 ProcessLoadDependencies + .then(function() { + load.dependencies = []; + var depsList = load.depsList; + + var loadPromises = []; + for (var i = 0, l = depsList.length; i < l; i++) (function(request, index) { + loadPromises.push( + requestLoad(loader, request, load.name, load.address) + + // 15.2.4.6.1 AddDependencyLoad (load is parentLoad) + .then(function(depLoad) { + + // adjusted from spec to maintain dependency order + // this is due to the System.register internal implementation needs + load.dependencies[index] = { + key: request, + value: depLoad.name + }; + + if (depLoad.status != 'linked') { + var linkSets = load.linkSets.concat([]); + for (var i = 0, l = linkSets.length; i < l; i++) + addLoadToLinkSet(linkSets[i], depLoad); + } + + // console.log('AddDependencyLoad ' + depLoad.name + ' for ' + load.name); + // snapshot(loader); + }) + ); + })(depsList[i], i); + + return Promise.all(loadPromises); + }) + + // 15.2.4.6.2 LoadSucceeded + .then(function() { + // console.log('LoadSucceeded ' + load.name); + // snapshot(loader); + + console.assert(load.status == 'loading', 'is loading'); + + load.status = 'loaded'; + + var linkSets = load.linkSets.concat([]); + for (var i = 0, l = linkSets.length; i < l; i++) + updateLinkSetOnLoad(linkSets[i], load); + }); + }) + // 15.2.4.5.4 LoadFailed + ['catch'](function(exc) { + load.status = 'failed'; + load.exception = exc; + + var linkSets = load.linkSets.concat([]); + for (var i = 0, l = linkSets.length; i < l; i++) { + linkSetFailed(linkSets[i], load, exc); + } + + console.assert(load.linkSets.length == 0, 'linkSets not removed'); + }); + } + + // 15.2.4.7 PromiseOfStartLoadPartwayThrough absorbed into calling functions + + // 15.2.4.7.1 + function asyncStartLoadPartwayThrough(stepState) { + return function(resolve, reject) { + var loader = stepState.loader; + var name = stepState.moduleName; + var step = stepState.step; + + if (loader.modules[name]) + throw new TypeError('"' + name + '" already exists in the module table'); + + // adjusted to pick up existing loads + var existingLoad; + for (var i = 0, l = loader.loads.length; i < l; i++) { + if (loader.loads[i].name == name) { + existingLoad = loader.loads[i]; + + if(step == 'translate' && !existingLoad.source) { + existingLoad.address = stepState.moduleAddress; + proceedToTranslate(loader, existingLoad, Promise.resolve(stepState.moduleSource)); + } + + return existingLoad.linkSets[0].done.then(function() { + resolve(existingLoad); + }); + } + } + + var load = createLoad(name); + + load.metadata = stepState.moduleMetadata; + + var linkSet = createLinkSet(loader, load); + + loader.loads.push(load); + + resolve(linkSet.done); + + if (step == 'locate') + proceedToLocate(loader, load); + + else if (step == 'fetch') + proceedToFetch(loader, load, Promise.resolve(stepState.moduleAddress)); + + else { + console.assert(step == 'translate', 'translate step'); + load.address = stepState.moduleAddress; + proceedToTranslate(loader, load, Promise.resolve(stepState.moduleSource)); + } + } + } + + // Declarative linking functions run through alternative implementation: + // 15.2.5.1.1 CreateModuleLinkageRecord not implemented + // 15.2.5.1.2 LookupExport not implemented + // 15.2.5.1.3 LookupModuleDependency not implemented + + // 15.2.5.2.1 + function createLinkSet(loader, startingLoad) { + var linkSet = { + loader: loader, + loads: [], + startingLoad: startingLoad, // added see spec bug https://bugs.ecmascript.org/show_bug.cgi?id=2995 + loadingCount: 0 + }; + linkSet.done = new Promise(function(resolve, reject) { + linkSet.resolve = resolve; + linkSet.reject = reject; + }); + addLoadToLinkSet(linkSet, startingLoad); + return linkSet; + } + // 15.2.5.2.2 + function addLoadToLinkSet(linkSet, load) { + console.assert(load.status == 'loading' || load.status == 'loaded', 'loading or loaded on link set'); + + for (var i = 0, l = linkSet.loads.length; i < l; i++) + if (linkSet.loads[i] == load) + return; + + linkSet.loads.push(load); + load.linkSets.push(linkSet); + + // adjustment, see https://bugs.ecmascript.org/show_bug.cgi?id=2603 + if (load.status != 'loaded') { + linkSet.loadingCount++; + } + + var loader = linkSet.loader; + + for (var i = 0, l = load.dependencies.length; i < l; i++) { + var name = load.dependencies[i].value; + + if (loader.modules[name]) + continue; + + for (var j = 0, d = loader.loads.length; j < d; j++) { + if (loader.loads[j].name != name) + continue; + + addLoadToLinkSet(linkSet, loader.loads[j]); + break; + } + } + // console.log('add to linkset ' + load.name); + // snapshot(linkSet.loader); + } + + // linking errors can be generic or load-specific + // this is necessary for debugging info + function doLink(linkSet) { + var error = false; + try { + link(linkSet, function(load, exc) { + linkSetFailed(linkSet, load, exc); + error = true; + }); + } + catch(e) { + linkSetFailed(linkSet, null, e); + error = true; + } + return error; + } + + // 15.2.5.2.3 + function updateLinkSetOnLoad(linkSet, load) { + // console.log('update linkset on load ' + load.name); + // snapshot(linkSet.loader); + + console.assert(load.status == 'loaded' || load.status == 'linked', 'loaded or linked'); + + linkSet.loadingCount--; + + if (linkSet.loadingCount > 0) + return; + + // adjusted for spec bug https://bugs.ecmascript.org/show_bug.cgi?id=2995 + var startingLoad = linkSet.startingLoad; + + // non-executing link variation for loader tracing + // on the server. Not in spec. + /***/ + if (linkSet.loader.loaderObj.execute === false) { + var loads = [].concat(linkSet.loads); + for (var i = 0, l = loads.length; i < l; i++) { + var load = loads[i]; + load.module = !load.isDeclarative ? { + module: _newModule({}) + } : { + name: load.name, + module: _newModule({}), + evaluated: true + }; + load.status = 'linked'; + finishLoad(linkSet.loader, load); + } + return linkSet.resolve(startingLoad); + } + /***/ + + var abrupt = doLink(linkSet); + + if (abrupt) + return; + + console.assert(linkSet.loads.length == 0, 'loads cleared'); + + linkSet.resolve(startingLoad); + } + + // 15.2.5.2.4 + function linkSetFailed(linkSet, load, exc) { + var loader = linkSet.loader; + + if (load && linkSet.loads[0].name != load.name) + exc = addToError(exc, 'Error loading "' + load.name + '" from "' + linkSet.loads[0].name + '" at ' + (linkSet.loads[0].address || '') + '\n'); + + 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++) { + var load = loads[i]; + + // store all failed load records + loader.loaderObj.failed = loader.loaderObj.failed || []; + if (indexOf.call(loader.loaderObj.failed, load) == -1) + loader.loaderObj.failed.push(load); + + var linkIndex = indexOf.call(load.linkSets, linkSet); + console.assert(linkIndex != -1, 'link not present'); + load.linkSets.splice(linkIndex, 1); + if (load.linkSets.length == 0) { + var globalLoadsIndex = indexOf.call(linkSet.loader.loads, load); + if (globalLoadsIndex != -1) + linkSet.loader.loads.splice(globalLoadsIndex, 1); + } + } + linkSet.reject(exc); + } + + // 15.2.5.2.5 + function finishLoad(loader, load) { + // add to global trace if tracing + if (loader.loaderObj.trace) { + if (!loader.loaderObj.loads) + loader.loaderObj.loads = {}; + var depMap = {}; + load.dependencies.forEach(function(dep) { + depMap[dep.key] = dep.value; + }); + loader.loaderObj.loads[load.name] = { + name: load.name, + deps: load.dependencies.map(function(dep){ return dep.key }), + depMap: depMap, + address: load.address, + metadata: load.metadata, + source: load.source, + kind: load.isDeclarative ? 'declarative' : 'dynamic' + }; + } + // if not anonymous, add to the module table + if (load.name) { + console.assert(!loader.modules[load.name], 'load not in module table'); + loader.modules[load.name] = load.module; + } + var loadIndex = indexOf.call(loader.loads, load); + if (loadIndex != -1) + loader.loads.splice(loadIndex, 1); + for (var i = 0, l = load.linkSets.length; i < l; i++) { + loadIndex = indexOf.call(load.linkSets[i].loads, load); + if (loadIndex != -1) + load.linkSets[i].loads.splice(loadIndex, 1); + } + load.linkSets.splice(0, load.linkSets.length); + } + + // 15.2.5.3 Module Linking Groups + + // 15.2.5.3.2 BuildLinkageGroups alternative implementation + // Adjustments (also see https://bugs.ecmascript.org/show_bug.cgi?id=2755) + // 1. groups is an already-interleaved array of group kinds + // 2. load.groupIndex is set when this function runs + // 3. load.groupIndex is the interleaved index ie 0 declarative, 1 dynamic, 2 declarative, ... (or starting with dynamic) + function buildLinkageGroups(load, loads, groups) { + groups[load.groupIndex] = groups[load.groupIndex] || []; + + // if the load already has a group index and its in its group, its already been done + // this logic naturally handles cycles + if (indexOf.call(groups[load.groupIndex], load) != -1) + return; + + // now add it to the group to indicate its been seen + groups[load.groupIndex].push(load); + + for (var i = 0, l = loads.length; i < l; i++) { + var loadDep = loads[i]; + + // dependencies not found are already linked + for (var j = 0; j < load.dependencies.length; j++) { + if (loadDep.name == load.dependencies[j].value) { + // by definition all loads in linkset are loaded, not linked + console.assert(loadDep.status == 'loaded', 'Load in linkSet not loaded!'); + + // if it is a group transition, the index of the dependency has gone up + // otherwise it is the same as the parent + var loadDepGroupIndex = load.groupIndex + (loadDep.isDeclarative != load.isDeclarative); + + // 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 !== undefined) { + groups[loadDep.groupIndex].splice(indexOf.call(groups[loadDep.groupIndex], loadDep), 1); + + // if the old group is empty, then we have a mixed depndency cycle + if (groups[loadDep.groupIndex].length == 0) + throw new TypeError("Mixed dependency cycle detected"); + } + + loadDep.groupIndex = loadDepGroupIndex; + } + + buildLinkageGroups(loadDep, loads, groups); + } + } + } + } + + 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 + function link(linkSet, linkError) { + + var loader = linkSet.loader; + + if (!linkSet.loads.length) + return; + + // console.log('linking {' + logloads(linkSet.loads) + '}'); + // snapshot(loader); + + // 15.2.5.3.1 LinkageGroups alternative implementation + + // build all the groups + // because the first load represents the top of the tree + // for a given linkset, we can work down from there + var groups = []; + var startingLoad = linkSet.loads[0]; + startingLoad.groupIndex = 0; + buildLinkageGroups(startingLoad, linkSet.loads, groups); + + // determine the kind of the bottom group + var curGroupDeclarative = startingLoad.isDeclarative == groups.length % 2; + + // run through the groups from bottom to top + for (var i = groups.length - 1; i >= 0; i--) { + var group = groups[i]; + for (var j = 0; j < group.length; j++) { + var load = group[j]; + + // 15.2.5.5 LinkDeclarativeModules adjusted + if (curGroupDeclarative) { + linkDeclarativeModule(load, linkSet.loads, loader); + } + // 15.2.5.6 LinkDynamicModules adjusted + else { + var module = doDynamicExecute(linkSet, load, linkError); + if (!module) + return; + load.module = { + name: load.name, + module: module + }; + load.status = 'linked'; + } + finishLoad(loader, load); + } + + // alternative current kind for next loop + curGroupDeclarative = !curGroupDeclarative; + } + } + + + // custom module records for binding graph + // store linking module records in a separate table + function getOrCreateModuleRecord(name, loader) { + var moduleRecords = loader.moduleRecords; + return moduleRecords[name] || (moduleRecords[name] = { + name: name, + dependencies: [], + module: new Module(), // start from an empty module and extend + importers: [] + }); + } + + // custom declarative linking function + function linkDeclarativeModule(load, loads, loader) { + if (load.module) + return; + + var module = load.module = getOrCreateModuleRecord(load.name, loader); + var moduleObj = load.module.module; + + var registryEntry = load.declare.call(__global, function(name, value) { + // NB This should be an Object.defineProperty, but that is very slow. + // By disaling this module write-protection we gain performance. + // It could be useful to allow an option to enable or disable this. + module.locked = true; + moduleObj[name] = value; + + 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); + } + } + + module.locked = false; + return value; + }); + + // setup our setters and execution function + module.setters = registryEntry.setters; + module.execute = registryEntry.execute; + + // now link all the module dependencies + // amending the depMap as we go + for (var i = 0, l = load.dependencies.length; i < l; i++) { + var depName = load.dependencies[i].value; + var depModule = loader.modules[depName]; + + // if dependency not already in the module registry + // then try and link it now + if (!depModule) { + // get the dependency load record + 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; + } + // if circular, create the module record + else { + depModule = getOrCreateModuleRecord(depName, loader); + } + } + } + + // only declarative modules have dynamic bindings + if (depModule.importers) { + module.dependencies.push(depModule); + depModule.importers.push(module); + } + else { + // track dynamic records as null module records as already linked + module.dependencies.push(null); + } + + // run the setter for this dependency + if (module.setters[i]) + module.setters[i](depModule.module); + } + + 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: + * + * module.module bound module object + * module.execute execution function for module + * module.dependencies list of module objects for dependencies + * See getOrCreateModuleRecord for all properties + * + */ + function doExecute(module) { + try { + module.execute.call(__global); + } + catch(e) { + return e; + } + } + + // propogate execution errors + // see https://bugs.ecmascript.org/show_bug.cgi?id=2993 + function doEnsureEvaluated(module, seen, loader) { + var err = ensureEvaluated(module, seen, loader); + if (err) + throw err; + } + // 15.2.6.2 EnsureEvaluated adjusted + function ensureEvaluated(module, seen, loader) { + if (module.evaluated || !module.dependencies) + return; + + seen.push(module); + + var deps = module.dependencies; + var err; + + for (var i = 0, l = deps.length; i < l; i++) { + var dep = deps[i]; + // dynamic dependencies are empty in module.dependencies + // as they are already linked + if (!dep) + continue; + if (indexOf.call(seen, dep) == -1) { + 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'); + return err; + } + } + } + + if (module.failed) + return new Error('Module failed execution.'); + + if (module.evaluated) + return; + + module.evaluated = true; + err = doExecute(module); + if (err) { + module.failed = true; + } + else if (Object.preventExtensions) { + // spec variation + // we don't create a new module here because it was created and ammended + // we just disable further extensions instead + Object.preventExtensions(module.module); + } + + 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(); + + for (var key in obj) { + (function (key) { + defineProperty(m, key, { + configurable: false, + enumerable: true, + get: function () { + return obj[key]; + } + }); + })(key); + } + + 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 + */ +(function(Loader) { + var g = __global; + + function getTranspilerModule(loader, globalName) { + return loader.newModule({ 'default': g[globalName], __useDefault: true }); + } + + // use Traceur by default + Loader.prototype.transpiler = 'traceur'; + + Loader.prototype.transpile = function(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) { + 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); + } + }; + } + }); + }; + + function traceurTranspile(load, traceur) { + var options = this.traceurOptions || {}; + options.modules = 'instantiate'; + options.script = false; + options.sourceMaps = 'inline'; + options.filename = load.address; + options.inputSourceMap = load.metadata.sourceMap; + 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'; + } + function doTraceurCompile(source, compiler, filename) { + try { + return compiler.compile(source, filename); + } + catch(e) { + // traceur throws an error array + throw e[0]; + } + } + + function babelTranspile(load, babel) { + var options = this.babelOptions || {}; + options.modules = 'system'; + options.sourceMap = 'inline'; + options.filename = load.address; + options.code = true; + options.ast = false; + + if (!options.blacklist) + options.blacklist = ['react']; + + var source = 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'; + } + + +})(__global.LoaderPolyfill); +/* +********************************************************************************************* + + System Loader Implementation + + - Implemented to https://github.com/jorendorff/js-loaders/blob/master/browser-loader.js + + - ')}}else if("undefined"!=typeof importScripts)if(doEval=function(source){try{eval(source)}catch(e){throw e}},$__global.System&&$__global.LoaderPolyfill)$__global.upgradeSystemLoader();else{var basePath="";try{throw new Error("Get worker base path via error stack")}catch(e){e.stack.replace(/(?:at|@).*(http.+):[\d]+:[\d]+/,function(e,t){basePath=t.replace(/\/[^\/]*$/,"/")})}importScripts(basePath+"es6-module-loader.js"),$__global.upgradeSystemLoader()}else{var es6ModuleLoader=require("es6-module-loader");$__global.System=es6ModuleLoader.System,$__global.Loader=es6ModuleLoader.Loader,$__global.upgradeSystemLoader(),module.exports=$__global.System;var vm=require("vm");doEval=function(e){vm.runInThisContext(e)}}}()}("undefined"!=typeof window?window:"undefined"!=typeof global?global:self); +//# sourceMappingURL=system.js.map \ No newline at end of file diff --git a/libs/system.src.js b/libs/system.src.js new file mode 100644 index 00000000..83796552 --- /dev/null +++ b/libs/system.src.js @@ -0,0 +1,2410 @@ +/* + * SystemJS v0.16.8 + */ + +(function($__global) { + +$__global.upgradeSystemLoader = function() { + $__global.upgradeSystemLoader = undefined; + + // indexOf polyfill for IE + var indexOf = Array.prototype.indexOf || function(item) { + for (var i = 0, l = this.length; i < l; i++) + if (this[i] === item) + return i; + return -1; + } + + var isWindows = typeof process != 'undefined' && !!process.platform.match(/^win/); + + // 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); + } + function toAbsoluteURL(base, href) { + 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) === '/' ? '/' : ''); + } + + if (isWindows) + href = href.replace(/\\/g, '/'); + + href = parseURI(href || ''); + base = parseURI(base || ''); + + 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; + } + + // clone the original System loader + var System; + (function() { + var originalSystem = $__global.System; + System = $__global.System = new LoaderPolyfill(originalSystem); + System.baseURL = originalSystem.baseURL; + System.paths = { '*': '*.js' }; + System.originalSystem = originalSystem; + })(); + + System.noConflict = function() { + $__global.SystemJS = System; + $__global.System = System.originalSystem; + } + + +/* + * SystemJS Core + * Code should be vaguely readable + * + */ +var originalSystem = $__global.System.originalSystem; +function core(loader) { + /* + __useDefault + + When a module object looks like: + newModule( + __useDefault: true, + default: 'some-module' + }) + + Then importing that module provides the 'some-module' + result directly instead of the full module. + + Useful for eg module.exports = function() {} + */ + var loaderImport = loader['import']; + loader['import'] = function(name, options) { + return loaderImport.call(this, name, options).then(function(module) { + return module.__useDefault ? module['default'] : module; + }); + } + + // support the empty module, as a concept + loader.set('@empty', loader.newModule({})); + + // include the node require since we're overriding it + if (typeof require != 'undefined') + loader._nodeRequire = require; + + /* + Config + Extends config merging one deep only + + loader.config({ + some: 'random', + config: 'here', + deep: { + config: { too: 'too' } + } + }); + + <=> + + loader.some = 'random'; + loader.config = 'here' + loader.deep = loader.deep || {}; + loader.deep.config = { too: 'too' }; + */ + loader.config = function(cfg) { + for (var c in cfg) { + var v = cfg[c]; + if (typeof v == 'object' && !(v instanceof Array)) { + this[c] = this[c] || {}; + for (var p in v) + this[c][p] = v[p]; + } + else + this[c] = v; + } + } + + // override locate to allow baseURL to be document-relative + var baseURI; + if (typeof window == 'undefined' && + typeof WorkerGlobalScope == 'undefined' && typeof process != 'undefined') { + baseURI = 'file:' + process.cwd() + '/'; + if (isWindows) + baseURI = baseURI.replace(/\\/g, '/'); + } + // Inside of a Web Worker + else if (typeof window == 'undefined') { + baseURI = location.href; + } + else { + baseURI = document.baseURI; + if (!baseURI) { + var bases = document.getElementsByTagName('base'); + baseURI = bases[0] && bases[0].href || window.location.href; + } + } + + var loaderLocate = loader.locate; + var normalizedBaseURL; + loader.locate = function(load) { + if (this.baseURL != normalizedBaseURL) { + normalizedBaseURL = toAbsoluteURL(baseURI, this.baseURL); + + if (normalizedBaseURL.substr(normalizedBaseURL.length - 1, 1) != '/') + normalizedBaseURL += '/'; + this.baseURL = normalizedBaseURL; + } + + return Promise.resolve(loaderLocate.call(this, load)); + } + + function applyExtensions(extensions, loader) { + loader._extensions = []; + for(var i = 0, len = extensions.length; i < len; i++) { + extensions[i](loader); + } + } + + loader._extensions = loader._extensions || []; + loader._extensions.push(core); + + loader.clone = function() { + var originalLoader = this; + var loader = new LoaderPolyfill(originalSystem); + loader.baseURL = originalLoader.baseURL; + loader.paths = { '*': '*.js' }; + applyExtensions(originalLoader._extensions, loader); + return loader; + }; +} +/* + * Meta Extension + * + * Sets default metadata on a load record (load.metadata) from + * loader.meta[moduleName]. + * Also provides an inline meta syntax for module meta in source. + * + * Eg: + * + * loader.meta['my/module'] = { some: 'meta' }; + * + * load.metadata.some = 'meta' will now be set on the load record. + * + * The same meta could be set with a my/module.js file containing: + * + * my/module.js + * "some meta"; + * "another meta"; + * console.log('this is my/module'); + * + * The benefit of inline meta is that coniguration doesn't need + * to be known in advance, which is useful for modularising + * configuration and avoiding the need for configuration injection. + * + * + * Example + * ------- + * + * The simplest meta example is setting the module format: + * + * System.meta['my/module'] = { format: 'amd' }; + * + * or inside 'my/module.js': + * + * "format amd"; + * define(...); + * + */ + +function meta(loader) { + var metaRegEx = /^(\s*\/\*.*\*\/|\s*\/\/[^\n]*|\s*"[^"]+"\s*;?|\s*'[^']+'\s*;?)+/; + var metaPartRegEx = /\/\*.*\*\/|\/\/[^\n]*|"[^"]+"\s*;?|'[^']+'\s*;?/g; + + loader.meta = {}; + loader._extensions = loader._extensions || []; + loader._extensions.push(meta); + + function setConfigMeta(loader, load) { + var meta = loader.meta && loader.meta[load.name]; + if (meta) { + for (var p in meta) + load.metadata[p] = load.metadata[p] || meta[p]; + } + } + + var loaderLocate = loader.locate; + loader.locate = function(load) { + setConfigMeta(this, load); + return loaderLocate.call(this, load); + } + + var loaderTranslate = loader.translate; + loader.translate = function(load) { + // detect any meta header syntax + var meta = load.source.match(metaRegEx); + if (meta) { + var metaParts = meta[0].match(metaPartRegEx); + for (var i = 0; i < metaParts.length; i++) { + var len = metaParts[i].length; + + var firstChar = metaParts[i].substr(0, 1); + if (metaParts[i].substr(len - 1, 1) == ';') + len--; + + if (firstChar != '"' && firstChar != "'") + continue; + + var metaString = metaParts[i].substr(1, metaParts[i].length - 3); + + var metaName = metaString.substr(0, metaString.indexOf(' ')); + if (metaName) { + var metaValue = metaString.substr(metaName.length + 1, metaString.length - metaName.length - 1); + + if (load.metadata[metaName] instanceof Array) + load.metadata[metaName].push(metaValue); + else if (!load.metadata[metaName]) + load.metadata[metaName] = metaValue; + } + } + } + // config meta overrides + setConfigMeta(this, load); + + return loaderTranslate.call(this, load); + } +} +/* + * Instantiate registry extension + * + * Supports Traceur System.register 'instantiate' output for loading ES6 as ES5. + * + * - Creates the loader.register function + * - Also supports metadata.format = 'register' in instantiate for anonymous register modules + * - Also supports metadata.deps, metadata.execute and metadata.executingRequire + * for handling dynamic modules alongside register-transformed ES6 modules + * + * Works as a standalone extension, but benefits from having a more + * advanced __eval defined like in SystemJS polyfill-wrapper-end.js + * + * The code here replicates the ES6 linking groups algorithm to ensure that + * circular ES6 compiled into System.register can work alongside circular AMD + * and CommonJS, identically to the actual ES6 loader. + * + */ +function register(loader) { + if (typeof indexOf == 'undefined') + indexOf = Array.prototype.indexOf; + if (typeof __eval == 'undefined' || typeof document != 'undefined' && !document.addEventListener) + __eval = 0 || eval; // uglify breaks without the 0 || + + loader._extensions = loader._extensions || []; + loader._extensions.push(register); + + // define exec for easy evaluation of a load record (load.name, load.source, load.address) + // main feature is source maps support handling + var curSystem; + function exec(load) { + var loader = this; + // support sourceMappingURL (efficiently) + var sourceMappingURL; + var lastLineIndex = load.source.lastIndexOf('\n'); + if (lastLineIndex != -1) { + if (load.source.substr(lastLineIndex + 1, 21) == '//# sourceMappingURL=') { + sourceMappingURL = load.source.substr(lastLineIndex + 22, load.source.length - lastLineIndex - 22); + if (typeof toAbsoluteURL != 'undefined') + sourceMappingURL = toAbsoluteURL(load.address, sourceMappingURL); + } + } + + __eval(load.source, load.address, sourceMappingURL); + } + loader.__exec = exec; + + function dedupe(deps) { + var newDeps = []; + for (var i = 0, l = deps.length; i < l; i++) + if (indexOf.call(newDeps, deps[i]) == -1) + newDeps.push(deps[i]) + return newDeps; + } + + /* + * There are two variations of System.register: + * 1. System.register for ES6 conversion (2-3 params) - System.register([name, ]deps, declare) + * see https://github.com/ModuleLoader/es6-module-loader/wiki/System.register-Explained + * + * 2. System.register for dynamic modules (3-4 params) - System.register([name, ]deps, executingRequire, execute) + * the true or false statement + * + * this extension implements the linking algorithm for the two variations identical to the spec + * allowing compiled ES6 circular references to work alongside AMD and CJS circular references. + * + */ + // loader.register sets loader.defined for declarative modules + var anonRegister; + var calledRegister; + function registerModule(name, deps, declare, execute) { + if (typeof name != 'string') { + execute = declare; + declare = deps; + deps = name; + name = null; + } + + calledRegister = true; + + var register; + + // dynamic + if (typeof declare == 'boolean') { + register = { + declarative: false, + deps: deps, + execute: execute, + executingRequire: declare + }; + } + else { + // ES6 declarative + register = { + declarative: true, + deps: deps, + declare: declare + }; + } + + // named register + if (name) { + register.name = name; + // we never overwrite an existing define + if (!(name in loader.defined)) + loader.defined[name] = register; + } + // anonymous register + else if (register.declarative) { + if (anonRegister) + throw new TypeError('Multiple anonymous System.register calls in the same module file.'); + anonRegister = register; + } + } + /* + * Registry side table - loader.defined + * Registry Entry Contains: + * - name + * - deps + * - declare for declarative modules + * - execute for dynamic modules, different to declarative execute on module + * - executingRequire indicates require drives execution for circularity of dynamic modules + * - declarative optional boolean indicating which of the above + * + * Can preload modules directly on System.defined['my/module'] = { deps, execute, executingRequire } + * + * Then the entry gets populated with derived information during processing: + * - normalizedDeps derived from deps, created in instantiate + * - groupIndex used by group linking algorithm + * - evaluated indicating whether evaluation has happend + * - module the module record object, containing: + * - exports actual module exports + * + * Then for declarative only we track dynamic bindings with the records: + * - name + * - setters declarative setter functions + * - exports actual module values + * - dependencies, module records of dependencies + * - importers, module records of dependents + * + * After linked and evaluated, entries are removed, declarative module records remain in separate + * module binding table + * + */ + + function defineRegister(loader) { + if (loader.register) + return; + + loader.register = registerModule; + + if (!loader.defined) + loader.defined = {}; + + // script injection mode calls this function synchronously on load + var onScriptLoad = loader.onScriptLoad; + loader.onScriptLoad = function(load) { + onScriptLoad(load); + // anonymous define + if (anonRegister) + load.metadata.entry = anonRegister; + + if (calledRegister) { + load.metadata.format = load.metadata.format || 'register'; + load.metadata.registered = true; + } + } + } + + defineRegister(loader); + + function buildGroups(entry, loader, groups) { + groups[entry.groupIndex] = groups[entry.groupIndex] || []; + + if (indexOf.call(groups[entry.groupIndex], entry) != -1) + return; + + groups[entry.groupIndex].push(entry); + + for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) { + var depName = entry.normalizedDeps[i]; + var depEntry = loader.defined[depName]; + + // not in the registry means already linked / ES6 + if (!depEntry || depEntry.evaluated) + continue; + + // now we know the entry is in our unlinked linkage group + var depGroupIndex = entry.groupIndex + (depEntry.declarative != entry.declarative); + + // the group index of an entry is always the maximum + if (depEntry.groupIndex === undefined || depEntry.groupIndex < depGroupIndex) { + + // if already in a group, remove from the old group + if (depEntry.groupIndex !== undefined) { + groups[depEntry.groupIndex].splice(indexOf.call(groups[depEntry.groupIndex], depEntry), 1); + + // if the old group is empty, then we have a mixed depndency cycle + if (groups[depEntry.groupIndex].length == 0) + throw new TypeError("Mixed dependency cycle detected"); + } + + depEntry.groupIndex = depGroupIndex; + } + + buildGroups(depEntry, loader, groups); + } + } + + function link(name, loader) { + var startEntry = loader.defined[name]; + + // skip if already linked + if (startEntry.module) + return; + + startEntry.groupIndex = 0; + + var groups = []; + + buildGroups(startEntry, loader, groups); + + var curGroupDeclarative = !!startEntry.declarative == groups.length % 2; + for (var i = groups.length - 1; i >= 0; i--) { + var group = groups[i]; + for (var j = 0; j < group.length; j++) { + var entry = group[j]; + + // link each group + if (curGroupDeclarative) + linkDeclarativeModule(entry, loader); + else + linkDynamicModule(entry, loader); + } + curGroupDeclarative = !curGroupDeclarative; + } + } + + // module binding records + var moduleRecords = {}; + function getOrCreateModuleRecord(name) { + return moduleRecords[name] || (moduleRecords[name] = { + name: name, + dependencies: [], + exports: {}, // start from an empty module and extend + importers: [] + }) + } + + function linkDeclarativeModule(entry, loader) { + // only link if already not already started linking (stops at circular) + if (entry.module) + return; + + var module = entry.module = getOrCreateModuleRecord(entry.name); + var exports = entry.module.exports; + + var declaration = entry.declare.call(loader.global, function(name, value) { + module.locked = true; + exports[name] = value; + + 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](exports); + } + } + + module.locked = false; + return value; + }); + + module.setters = declaration.setters; + module.execute = declaration.execute; + + if (!module.setters || !module.execute) { + throw new TypeError('Invalid System.register form for ' + entry.name); + } + + // now link all the module dependencies + for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) { + var depName = entry.normalizedDeps[i]; + var depEntry = loader.defined[depName]; + var depModule = moduleRecords[depName]; + + // work out how to set depExports based on scenarios... + var depExports; + + if (depModule) { + depExports = depModule.exports; + } + // dynamic, already linked in our registry + else if (depEntry && !depEntry.declarative) { + if (depEntry.module.exports && depEntry.module.exports.__esModule) + depExports = depEntry.module.exports; + else + depExports = { 'default': depEntry.module.exports, '__useDefault': true }; + } + // in the loader registry + else if (!depEntry) { + depExports = loader.get(depName); + } + // we have an entry -> link + else { + linkDeclarativeModule(depEntry, loader); + depModule = depEntry.module; + depExports = depModule.exports; + } + + // only declarative modules have dynamic bindings + if (depModule && depModule.importers) { + depModule.importers.push(module); + module.dependencies.push(depModule); + } + else { + module.dependencies.push(null); + } + + // run the setter for this dependency + if (module.setters[i]) + module.setters[i](depExports); + } + } + + // An analog to loader.get covering execution of all three layers (real declarative, simulated declarative, simulated dynamic) + function getModule(name, loader) { + var exports; + var entry = loader.defined[name]; + + if (!entry) { + exports = loader.get(name); + if (!exports) + throw new Error('Unable to load dependency ' + name + '.'); + } + + else { + if (entry.declarative) + ensureEvaluated(name, [], loader); + + else if (!entry.evaluated) + linkDynamicModule(entry, loader); + + exports = entry.module.exports; + } + + if ((!entry || entry.declarative) && exports && exports.__useDefault) + return exports['default']; + + return exports; + } + + function linkDynamicModule(entry, loader) { + if (entry.module) + return; + + var exports = {}; + + var module = entry.module = { exports: exports, id: entry.name }; + + function linkDeps() { + for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) { + var depName = entry.normalizedDeps[i]; + // we know we only need to link dynamic due to linking algorithm + var depEntry = loader.defined[depName]; + if (depEntry) + linkDynamicModule(depEntry, loader); + } + } + + // AMD requires execute the tree first + if (!entry.executingRequire) + linkDeps(); + + // now execute + entry.evaluated = true; + var output = entry.execute.call(loader.global, function(name) { + for (var i = 0, l = entry.deps.length; i < l; i++) { + if (entry.deps[i] != name) + continue; + return getModule(entry.normalizedDeps[i], loader); + } + throw new TypeError('Module ' + name + ' not declared as a dependency.'); + }, exports, module); + + // in case we missed anything, link it now + // this does mean that deferred execution isn't supported + if (entry.executingRequire) + linkDeps(); + + if (output) + module.exports = output; + } + + /* + * Given a module, and the list of modules for this current branch, + * ensure that each of the dependencies of this module is evaluated + * (unless one is a circular dependency already in the list of seen + * modules, in which case we execute it) + * + * Then we evaluate the module itself depth-first left to right + * execution to match ES6 modules + */ + function ensureEvaluated(moduleName, seen, loader) { + var entry = loader.defined[moduleName]; + + // if already seen, that means it's an already-evaluated non circular dependency + if (!entry || entry.evaluated || !entry.declarative) + return; + + // this only applies to declarative modules which late-execute + + seen.push(moduleName); + + for (var i = 0, l = entry.normalizedDeps.length; i < l; i++) { + var depName = entry.normalizedDeps[i]; + if (indexOf.call(seen, depName) == -1) { + if (!loader.defined[depName]) + loader.get(depName); + else + ensureEvaluated(depName, seen, loader); + } + } + + if (entry.evaluated) + return; + + entry.evaluated = true; + entry.module.execute.call(loader.global); + } + + // override the delete method to also clear the register caches + var loaderDelete = loader['delete']; + loader['delete'] = function(name) { + delete moduleRecords[name]; + return loaderDelete.call(this, name); + }; + + var registerRegEx = /System\.register/; + + var loaderFetch = loader.fetch; + loader.fetch = function(load) { + var loader = this; + defineRegister(loader); + if (loader.defined[load.name]) { + load.metadata.format = 'defined'; + return ''; + } + anonRegister = null; + calledRegister = false; + // the above get picked up by onScriptLoad + return loaderFetch.call(loader, load); + } + + var loaderTranslate = loader.translate; + loader.translate = function(load) { + this.register = registerModule; + + this.__exec = exec; + + load.metadata.deps = load.metadata.deps || []; + + // we run the meta detection here (register is after meta) + return Promise.resolve(loaderTranslate.call(this, load)).then(function(source) { + + // dont run format detection for globals shimmed + // ideally this should be in the global extension, but there is + // currently no neat way to separate it + if (load.metadata.init || load.metadata.exports) + load.metadata.format = load.metadata.format || 'global'; + + // run detection for register format + if (load.metadata.format == 'register' || !load.metadata.format && load.source.match(registerRegEx)) + load.metadata.format = 'register'; + return source; + }); + } + + + var loaderInstantiate = loader.instantiate; + loader.instantiate = function(load) { + var loader = this; + + var entry; + + // first we check if this module has already been defined in the registry + if (loader.defined[load.name]) { + entry = loader.defined[load.name]; + entry.deps = entry.deps.concat(load.metadata.deps); + } + + // picked up already by a script injection + else if (load.metadata.entry) + entry = load.metadata.entry; + + // otherwise check if it is dynamic + else if (load.metadata.execute) { + entry = { + declarative: false, + deps: load.metadata.deps || [], + execute: load.metadata.execute, + executingRequire: load.metadata.executingRequire // NodeJS-style requires or not + }; + } + + // Contains System.register calls + else if (load.metadata.format == 'register') { + anonRegister = null; + calledRegister = false; + + var curSystem = loader.global.System; + + loader.global.System = loader; + + loader.__exec(load); + + loader.global.System = curSystem; + + if (anonRegister) + entry = anonRegister; + else + load.metadata.bundle = true; + + if (!entry && System.defined[load.name]) + entry = System.defined[load.name]; + + if (!calledRegister && !load.metadata.registered) + throw new TypeError(load.name + ' detected as System.register but didn\'t execute.'); + } + + // named bundles are just an empty module + if (!entry && load.metadata.format != 'es6') + return { + deps: load.metadata.deps, + execute: function() { + return loader.newModule({}); + } + }; + + // place this module onto defined for circular references + if (entry) + loader.defined[load.name] = entry; + + // no entry -> treat as ES6 + else + return loaderInstantiate.call(this, load); + + entry.deps = dedupe(entry.deps); + entry.name = load.name; + + // first, normalize all dependencies + var normalizePromises = []; + for (var i = 0, l = entry.deps.length; i < l; i++) + normalizePromises.push(Promise.resolve(loader.normalize(entry.deps[i], load.name))); + + return Promise.all(normalizePromises).then(function(normalizedDeps) { + + entry.normalizedDeps = normalizedDeps; + + return { + deps: entry.deps, + execute: function() { + // recursively ensure that the module and all its + // dependencies are linked (with dependency group handling) + link(load.name, loader); + + // now handle dependency execution in correct order + ensureEvaluated(load.name, [], loader); + + // remove from the registry + loader.defined[load.name] = undefined; + + var module = entry.module.exports; + + if (!module || !entry.declarative && module.__esModule !== true) + module = { 'default': module, __useDefault: true }; + + // return the defined module object + return loader.newModule(module); + } + }; + }); + } +} +/* + * Extension to detect ES6 and auto-load Traceur or Babel for processing + */ +function es6(loader) { + loader._extensions.push(es6); + + // good enough ES6 detection regex - format detections not designed to be accurate, but to handle the 99% use case + var es6RegEx = /(^\s*|[}\);\n]\s*)(import\s+(['"]|(\*\s+as\s+)?[^"'\(\)\n;]+\s+from\s+['"]|\{)|export\s+\*\s+from\s+["']|export\s+(\{|default|function|class|var|const|let|async\s+function))/; + + var traceurRuntimeRegEx = /\$traceurRuntime\s*\./; + var babelHelpersRegEx = /babelHelpers\s*\./; + + var transpilerNormalized, transpilerRuntimeNormalized; + + var firstLoad = true; + + var nodeResolver = typeof process != 'undefined' && typeof require != 'undefined' && require.resolve; + + function configNodeGlobal(loader, module, nodeModule, wilcardDummy) { + loader.meta = loader.meta || {}; + var meta = loader.meta[module] = loader.meta[module] || {}; + meta.format = meta.format || 'global'; + if (!loader.paths[module]) { + var path = resolvePath(nodeModule, wilcardDummy); + if (path) { + loader.paths[module] = path; + } + } + } + + function resolvePath(nodeModule, wildcard) { + if (nodeResolver) { + var ext = wildcard ? '/package.json' : ''; + try { + var match = nodeResolver(nodeModule + ext); + return 'file:' + match.substr(0, match.length - ext.length) + (wildcard ? '/*.js' : ''); + } + catch(e) {} + } + } + + var loaderLocate = loader.locate; + loader.locate = function(load) { + var self = this; + if (firstLoad) { + if (self.transpiler == 'traceur') { + configNodeGlobal(self, 'traceur', 'traceur/bin/traceur.js'); + self.meta['traceur'].exports = 'traceur'; + configNodeGlobal(self, 'traceur-runtime', 'traceur/bin/traceur-runtime.js'); + } + else if (self.transpiler == 'babel') { + configNodeGlobal(self, 'babel', 'babel-core/browser.js'); + configNodeGlobal(self, 'babel/external-helpers', 'babel-core/external-helpers.js'); + configNodeGlobal(self, 'babel-runtime/*', 'babel-runtime', true); + } + firstLoad = false; + } + return loaderLocate.call(self, load); + }; + + var loaderTranslate = loader.translate; + loader.translate = function(load) { + var loader = this; + + return loaderTranslate.call(loader, load) + .then(function(source) { + + // detect ES6 + if (load.metadata.format == 'es6' || !load.metadata.format && source.match(es6RegEx)) { + load.metadata.format = 'es6'; + return source; + } + + if (load.metadata.format == 'register') { + if (!loader.global.$traceurRuntime && load.source.match(traceurRuntimeRegEx)) { + return loader['import']('traceur-runtime').then(function() { + return source; + }); + } + if (!loader.global.babelHelpers && load.source.match(babelHelpersRegEx)) { + return loader['import']('babel/external-helpers').then(function() { + return source; + }); + } + } + + // ensure Traceur doesn't clobber the System global + if (loader.transpiler == 'traceur') + return Promise.all([ + transpilerNormalized || (transpilerNormalized = loader.normalize(loader.transpiler)), + transpilerRuntimeNormalized || (transpilerRuntimeNormalized = loader.normalize(loader.transpiler + '-runtime')) + ]) + .then(function(normalized) { + if (load.name == normalized[0] || load.name == normalized[1]) + return '(function() { var curSystem = System; ' + source + '\nSystem = curSystem; })();'; + + return source; + }); + + return source; + }); + + }; + +} +/* + SystemJS Global Format + + Supports + metadata.deps + metadata.init + metadata.exports + + Also detects writes to the global object avoiding global collisions. + See the SystemJS readme global support section for further information. +*/ +function global(loader) { + + loader._extensions.push(global); + + function readGlobalProperty(p, value) { + var pParts = p.split('.'); + while (pParts.length) + value = value[pParts.shift()]; + return value; + } + + var ignoredGlobalProps = ['indexedDB', 'sessionStorage', 'localStorage', + 'clipboardData', 'frames', 'webkitStorageInfo', 'toolbar', 'statusbar', + 'scrollbars', 'personalbar', 'menubar', 'locationbar', 'webkitIndexedDB', + 'screenTop', 'screenLeft', 'external']; + + var globalName = typeof window != 'undefined' ? 'window' : (typeof global != 'undefined' ? 'global' : 'self'); + + try { + var hasOwnProperty = loader.global.hasOwnProperty; + // throws in Safari web-worker + loader.global.hasOwnProperty('window'); + } + catch(e) { + hasOwnProperty = false; + } + + function forEachGlobal(callback) { + for (var g in loader.global) { + var curGlobal; + if (indexOf.call(ignoredGlobalProps, g) != -1) + continue; + if (hasOwnProperty && !loader.global.hasOwnProperty(g)) + continue; + try { + curGlobal = loader.global[g]; + } catch (e) { + ignoredGlobalProps.push(g); + } + if (curGlobal !== loader.global) + callback(g, curGlobal); + } + } + + function createHelpers(loader) { + if (loader.has('@@global-helpers')) + return; + + var moduleGlobals = {}; + + var curGlobalObj; + + loader.set('@@global-helpers', loader.newModule({ + prepareGlobal: function(moduleName, deps) { + // first, we add all the dependency modules to the global + for (var i = 0; i < deps.length; i++) { + var moduleGlobal = moduleGlobals[deps[i]]; + if (moduleGlobal) + for (var m in moduleGlobal) + loader.global[m] = moduleGlobal[m]; + } + + // now store a complete copy of the global object + // in order to detect changes + curGlobalObj = {}; + + forEachGlobal(function(name, value) { + curGlobalObj[name] = value; + }); + }, + retrieveGlobal: function(moduleName, exportName, init) { + var singleGlobal; + var multipleExports; + var exports = {}; + + // run init + if (init) + singleGlobal = init.call(loader.global); + + // check for global changes, creating the globalObject for the module + // if many globals, then a module object for those is created + // if one global, then that is the module directly + else if (exportName) { + var firstPart = exportName.split('.')[0]; + singleGlobal = readGlobalProperty(exportName, loader.global); + exports[firstPart] = loader.global[firstPart]; + } + + else { + forEachGlobal(function(name, value) { + if (curGlobalObj[name] === value) + return; + if (typeof value === 'undefined') + return; + exports[name] = value; + if (typeof singleGlobal !== 'undefined') { + if (!multipleExports && singleGlobal !== value) + multipleExports = true; + } + else { + singleGlobal = value; + } + }); + } + + moduleGlobals[moduleName] = exports; + + return multipleExports ? exports : singleGlobal; + } + })); + } + + createHelpers(loader); + + var loaderInstantiate = loader.instantiate; + loader.instantiate = function(load) { + var loader = this; + + createHelpers(loader); + + var exportName = load.metadata.exports; + + if (!load.metadata.format) + load.metadata.format = 'global'; + + // global is a fallback module format + if (load.metadata.format == 'global') { + load.metadata.execute = function(require, exports, module) { + + loader.get('@@global-helpers').prepareGlobal(module.id, load.metadata.deps); + + if (exportName) + load.source += globalName + '["' + exportName + '"] = ' + exportName + ';'; + + // disable module detection + var define = loader.global.define; + var require = loader.global.require; + + loader.global.define = undefined; + loader.global.module = undefined; + loader.global.exports = undefined; + + loader.__exec(load); + + loader.global.require = require; + loader.global.define = define; + + return loader.get('@@global-helpers').retrieveGlobal(module.id, exportName, load.metadata.init); + } + } + return loaderInstantiate.call(loader, load); + } +} +/* + SystemJS CommonJS Format +*/ +function cjs(loader) { + loader._extensions.push(cjs); + + // CJS Module Format + // require('...') || exports[''] = ... || exports.asd = ... || module.exports = ... + var cjsExportsRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.]|module\.)(exports\s*\[['"]|\exports\s*\.)|(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.])module\.exports\s*\=/; + // RegEx adjusted from https://github.com/jbrantly/yabble/blob/master/lib/yabble.js#L339 + var cjsRequireRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF."'])require\s*\(\s*("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\s*\)/g; + var commentRegEx = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg; + + function getCJSDeps(source) { + cjsRequireRegEx.lastIndex = 0; + + var deps = []; + + // remove comments from the source first, if not minified + if (source.length / source.split('\n').length < 200) + source = source.replace(commentRegEx, ''); + + var match; + + while (match = cjsRequireRegEx.exec(source)) + deps.push(match[1].substr(1, match[1].length - 2)); + + return deps; + } + + if (typeof location != 'undefined' && location.origin) + var curOrigin = location.origin; + + var loaderInstantiate = loader.instantiate; + loader.instantiate = function(load) { + + if (!load.metadata.format) { + cjsExportsRegEx.lastIndex = 0; + cjsRequireRegEx.lastIndex = 0; + if (cjsRequireRegEx.exec(load.source) || cjsExportsRegEx.exec(load.source)) + load.metadata.format = 'cjs'; + } + + if (load.metadata.format == 'cjs') { + load.metadata.deps = load.metadata.deps ? load.metadata.deps.concat(getCJSDeps(load.source)) : getCJSDeps(load.source); + + load.metadata.executingRequire = true; + + load.metadata.execute = function(require, exports, module) { + var dirname = (load.address || '').split('/'); + dirname.pop(); + dirname = dirname.join('/'); + + var address = load.address; + + if (curOrigin && address.substr(0, curOrigin.length) === curOrigin) { + address = address.substr(curOrigin.length); + dirname = dirname.substr(curOrigin.length); + } + else if (address.substr(0, 5) == 'file:') { + address = address.substr(5); + dirname = dirname.substr(5); + } + + // if on the server, remove the "file:" part from the dirname + if (System._nodeRequire) + dirname = dirname.substr(5); + + var globals = loader.global._g = { + global: loader.global, + exports: exports, + module: module, + require: require, + __filename: address, + __dirname: dirname + }; + + var source = '(function(global, exports, module, require, __filename, __dirname) { ' + load.source + + '\n}).call(_g.exports, _g.global, _g.exports, _g.module, _g.require, _g.__filename, _g.__dirname);'; + + // disable AMD detection + var define = loader.global.define; + loader.global.define = undefined; + + loader.__exec({ + name: load.name, + address: load.address, + source: source + }); + + loader.global.define = define; + + loader.global._g = undefined; + } + } + + return loaderInstantiate.call(this, load); + }; +} +/* + SystemJS AMD Format + Provides the AMD module format definition at System.format.amd + as well as a RequireJS-style require on System.require +*/ +function amd(loader) { + // by default we only enforce AMD noConflict mode in Node + var isNode = typeof module != 'undefined' && module.exports; + + loader._extensions.push(amd); + + // AMD Module Format Detection RegEx + // define([.., .., ..], ...) + // define(varName); || define(function(require, exports) {}); || define({}) + var amdRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.])define\s*\(\s*("[^"]+"\s*,\s*|'[^']+'\s*,\s*)?\s*(\[(\s*(("[^"]+"|'[^']+')\s*,|\/\/.*\r?\n|\/\*(.|\s)*?\*\/))*(\s*("[^"]+"|'[^']+')\s*,?)?(\s*(\/\/.*\r?\n|\/\*(.|\s)*?\*\/))*\s*\]|function\s*|{|[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*\))/; + var commentRegEx = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg; + + var cjsRequirePre = "(?:^|[^$_a-zA-Z\\xA0-\\uFFFF.])"; + var cjsRequirePost = "\\s*\\(\\s*(\"([^\"]+)\"|'([^']+)')\\s*\\)"; + + var fnBracketRegEx = /\(([^\)]*)\)/; + + var wsRegEx = /^\s+|\s+$/g; + + var requireRegExs = {}; + + function getCJSDeps(source, requireIndex) { + + // remove comments + source = source.replace(commentRegEx, ''); + + // determine the require alias + var params = source.match(fnBracketRegEx); + var requireAlias = (params[1].split(',')[requireIndex] || 'require').replace(wsRegEx, ''); + + // find or generate the regex for this requireAlias + var requireRegEx = requireRegExs[requireAlias] || (requireRegExs[requireAlias] = new RegExp(cjsRequirePre + requireAlias + cjsRequirePost, 'g')); + + requireRegEx.lastIndex = 0; + + var deps = []; + + var match; + while (match = requireRegEx.exec(source)) + deps.push(match[2] || match[3]); + + return deps; + } + + /* + AMD-compatible require + To copy RequireJS, set window.require = window.requirejs = loader.amdRequire + */ + function require(names, callback, errback, referer) { + // 'this' is bound to the loader + var loader = this; + + // in amd, first arg can be a config object... we just ignore + if (typeof names == 'object' && !(names instanceof Array)) + return require.apply(null, Array.prototype.splice.call(arguments, 1, arguments.length - 1)); + + // amd require + if (names instanceof Array) { + var dynamicRequires = []; + for (var i = 0; i < names.length; i++) + dynamicRequires.push(loader['import'](names[i], referer)); + Promise.all(dynamicRequires).then(function(modules) { + if(callback) { + callback.apply(null, modules); + } + }, errback); + } + + // commonjs require + else if (typeof names == 'string') { + var module = loader.get(names); + return module.__useDefault ? module['default'] : module; + } + + else + throw new TypeError('Invalid require'); + }; + loader.amdRequire = function() { + return require.apply(this, arguments); + }; + + function makeRequire(parentName, staticRequire, loader) { + return function(names, callback, errback) { + if (typeof names == 'string') { + if (typeof callback === 'function') + names = [names]; + else + return staticRequire(names); + } + return require.call(loader, names, callback, errback, { name: parentName }); + } + } + + // run once per loader + function generateDefine(loader) { + // script injection mode calls this function synchronously on load + var onScriptLoad = loader.onScriptLoad; + loader.onScriptLoad = function(load) { + onScriptLoad(load); + if (anonDefine || defineBundle) { + load.metadata.format = 'defined'; + load.metadata.registered = true; + } + + if (anonDefine) { + load.metadata.deps = load.metadata.deps ? load.metadata.deps.concat(anonDefine.deps) : anonDefine.deps; + load.metadata.execute = anonDefine.execute; + } + } + + function define(name, deps, factory) { + if (typeof name != 'string') { + factory = deps; + deps = name; + name = null; + } + if (!(deps instanceof Array)) { + factory = deps; + deps = ['require', 'exports', 'module']; + } + + if (typeof factory != 'function') + factory = (function(factory) { + return function() { return factory; } + })(factory); + + // in IE8, a trailing comma becomes a trailing undefined entry + if (deps[deps.length - 1] === undefined) + deps.pop(); + + // remove system dependencies + var requireIndex, exportsIndex, moduleIndex; + + if ((requireIndex = indexOf.call(deps, 'require')) != -1) { + + deps.splice(requireIndex, 1); + + var factoryText = factory.toString(); + + deps = deps.concat(getCJSDeps(factoryText, requireIndex)); + } + + + if ((exportsIndex = indexOf.call(deps, 'exports')) != -1) + deps.splice(exportsIndex, 1); + + if ((moduleIndex = indexOf.call(deps, 'module')) != -1) + deps.splice(moduleIndex, 1); + + var define = { + deps: deps, + execute: function(require, exports, module) { + + var depValues = []; + for (var i = 0; i < deps.length; i++) + depValues.push(require(deps[i])); + + module.uri = loader.baseURL + module.id; + + module.config = function() {}; + + // add back in system dependencies + if (moduleIndex != -1) + depValues.splice(moduleIndex, 0, module); + + if (exportsIndex != -1) + depValues.splice(exportsIndex, 0, exports); + + if (requireIndex != -1) + depValues.splice(requireIndex, 0, makeRequire(module.id, require, loader)); + + var output = factory.apply(global, depValues); + + if (typeof output == 'undefined' && module) + output = module.exports; + + if (typeof output != 'undefined') + return output; + } + }; + + // anonymous define + if (!name) { + // already defined anonymously -> throw + if (anonDefine) + throw new TypeError('Multiple defines for anonymous module'); + anonDefine = define; + } + // named define + else { + // if it has no dependencies and we don't have any other + // defines, then let this be an anonymous define + if (deps.length == 0 && !anonDefine && !defineBundle) + anonDefine = define; + + // otherwise its a bundle only + else + anonDefine = null; + + // the above is just to support single modules of the form: + // define('jquery') + // still loading anonymously + // because it is done widely enough to be useful + + // note this is now a bundle + defineBundle = true; + + // define the module through the register registry + loader.register(name, define.deps, false, define.execute); + } + }; + define.amd = {}; + loader.amdDefine = define; + } + + var anonDefine; + // set to true if the current module turns out to be a named define bundle + var defineBundle; + + var oldModule, oldExports, oldDefine; + + // adds define as a global (potentially just temporarily) + function createDefine(loader) { + if (!loader.amdDefine) + generateDefine(loader); + + anonDefine = null; + defineBundle = null; + + // ensure no NodeJS environment detection + var global = loader.global; + + oldModule = global.module; + oldExports = global.exports; + oldDefine = global.define; + + global.module = undefined; + global.exports = undefined; + + if (global.define && global.define === loader.amdDefine) + return; + + global.define = loader.amdDefine; + } + + function removeDefine(loader) { + var global = loader.global; + global.define = oldDefine; + global.module = oldModule; + global.exports = oldExports; + } + + generateDefine(loader); + + if (loader.scriptLoader) { + var loaderFetch = loader.fetch; + loader.fetch = function(load) { + createDefine(this); + return loaderFetch.call(this, load); + } + } + + var loaderInstantiate = loader.instantiate; + loader.instantiate = function(load) { + var loader = this; + + if (load.metadata.format == 'amd' || !load.metadata.format && load.source.match(amdRegEx)) { + load.metadata.format = 'amd'; + + if (loader.execute !== false) { + createDefine(loader); + + loader.__exec(load); + + removeDefine(loader); + + if (!anonDefine && !defineBundle && !isNode) + throw new TypeError('AMD module ' + load.name + ' did not define'); + } + + if (anonDefine) { + load.metadata.deps = load.metadata.deps ? load.metadata.deps.concat(anonDefine.deps) : anonDefine.deps; + load.metadata.execute = anonDefine.execute; + } + } + + return loaderInstantiate.call(loader, load); + } +} +/* + SystemJS map support + + Provides map configuration through + System.map['jquery'] = 'some/module/map' + + As well as contextual map config through + System.map['bootstrap'] = { + jquery: 'some/module/map2' + } + + Note that this applies for subpaths, just like RequireJS + + jquery -> 'some/module/map' + jquery/path -> 'some/module/map/path' + bootstrap -> 'bootstrap' + + Inside any module name of the form 'bootstrap' or 'bootstrap/*' + jquery -> 'some/module/map2' + jquery/p -> 'some/module/map2/p' + + Maps are carefully applied from most specific contextual map, to least specific global map +*/ +function map(loader) { + loader.map = loader.map || {}; + + loader._extensions.push(map); + + // return if prefix parts (separated by '/') match the name + // eg prefixMatch('jquery/some/thing', 'jquery') -> true + // prefixMatch('jqueryhere/', 'jquery') -> false + function prefixMatch(name, prefix) { + if (name.length < prefix.length) + return false; + if (name.substr(0, prefix.length) != prefix) + return false; + if (name[prefix.length] && name[prefix.length] != '/') + return false; + return true; + } + + // get the depth of a given path + // eg pathLen('some/name') -> 2 + function pathLen(name) { + var len = 1; + for (var i = 0, l = name.length; i < l; i++) + if (name[i] === '/') + len++; + return len; + } + + function doMap(name, matchLen, map) { + return map + name.substr(matchLen); + } + + // given a relative-resolved module name and normalized parent name, + // apply the map configuration + function applyMap(name, parentName, loader) { + var curMatch, curMatchLength = 0; + var curParent, curParentMatchLength = 0; + var tmpParentLength, tmpPrefixLength; + var subPath; + var nameParts; + + // first find most specific contextual match + if (parentName) { + for (var p in loader.map) { + var curMap = loader.map[p]; + if (typeof curMap != 'object') + continue; + + // most specific parent match wins first + if (!prefixMatch(parentName, p)) + continue; + + tmpParentLength = pathLen(p); + if (tmpParentLength <= curParentMatchLength) + continue; + + for (var q in curMap) { + // most specific name match wins + if (!prefixMatch(name, q)) + continue; + tmpPrefixLength = pathLen(q); + if (tmpPrefixLength <= curMatchLength) + continue; + + curMatch = q; + curMatchLength = tmpPrefixLength; + curParent = p; + curParentMatchLength = tmpParentLength; + } + } + } + + // if we found a contextual match, apply it now + if (curMatch) + return doMap(name, curMatch.length, loader.map[curParent][curMatch]); + + // now do the global map + for (var p in loader.map) { + var curMap = loader.map[p]; + if (typeof curMap != 'string') + continue; + + if (!prefixMatch(name, p)) + continue; + + var tmpPrefixLength = pathLen(p); + + if (tmpPrefixLength <= curMatchLength) + continue; + + curMatch = p; + curMatchLength = tmpPrefixLength; + } + + if (curMatch) + return doMap(name, curMatch.length, loader.map[curMatch]); + + return name; + } + + var loaderNormalize = loader.normalize; + loader.normalize = function(name, parentName, parentAddress) { + var loader = this; + if (!loader.map) + loader.map = {}; + + var isPackage = false; + if (name.substr(name.length - 1, 1) == '/') { + isPackage = true; + name += '#'; + } + + return Promise.resolve(loaderNormalize.call(loader, name, parentName, parentAddress)) + .then(function(name) { + name = applyMap(name, parentName, loader); + + // Normalize "module/" into "module/module" + // Convenient for packages + if (isPackage) { + var nameParts = name.split('/'); + nameParts.pop(); + var pkgName = nameParts.pop(); + nameParts.push(pkgName); + nameParts.push(pkgName); + name = nameParts.join('/'); + } + + return name; + }); + } +} +/* + SystemJS Plugin Support + + Supports plugin syntax with "!" + + The plugin name is loaded as a module itself, and can override standard loader hooks + for the plugin resource. See the plugin section of the systemjs readme. +*/ +function plugins(loader) { + if (typeof indexOf == 'undefined') + indexOf = Array.prototype.indexOf; + + loader._extensions.push(plugins); + + var loaderNormalize = loader.normalize; + loader.normalize = function(name, parentName, parentAddress) { + var loader = this; + // if parent is a plugin, normalize against the parent plugin argument only + var parentPluginIndex; + if (parentName && (parentPluginIndex = parentName.indexOf('!')) != -1) + parentName = parentName.substr(0, parentPluginIndex); + + return Promise.resolve(loaderNormalize.call(loader, name, parentName, parentAddress)) + .then(function(name) { + // if this is a plugin, normalize the plugin name and the argument + var pluginIndex = name.lastIndexOf('!'); + if (pluginIndex != -1) { + var argumentName = name.substr(0, pluginIndex); + + // plugin name is part after "!" or the extension itself + var pluginName = name.substr(pluginIndex + 1) || argumentName.substr(argumentName.lastIndexOf('.') + 1); + + // normalize the plugin name relative to the same parent + return new Promise(function(resolve) { + resolve(loader.normalize(pluginName, parentName, parentAddress)); + }) + // normalize the plugin argument + .then(function(_pluginName) { + pluginName = _pluginName; + return loader.normalize(argumentName, parentName, parentAddress); + }) + .then(function(argumentName) { + return argumentName + '!' + pluginName; + }); + } + + // standard normalization + return name; + }); + }; + + var loaderLocate = loader.locate; + loader.locate = function(load) { + var loader = this; + + var name = load.name; + + // only fetch the plugin itself if this name isn't defined + if (this.defined && this.defined[name]) + return loaderLocate.call(this, load); + + // plugin + var pluginIndex = name.lastIndexOf('!'); + if (pluginIndex != -1) { + var pluginName = name.substr(pluginIndex + 1); + + // the name to locate is the plugin argument only + load.name = name.substr(0, pluginIndex); + + var pluginLoader = loader.pluginLoader || loader; + + // load the plugin module + // NB ideally should use pluginLoader.load for normalized, + // but not currently working for some reason + return pluginLoader['import'](pluginName) + .then(function() { + var plugin = pluginLoader.get(pluginName); + plugin = plugin['default'] || plugin; + + // allow plugins to opt-out of build + if (plugin.build === false && loader.pluginLoader) + load.metadata.build = false; + + // store the plugin module itself on the metadata + load.metadata.plugin = plugin; + load.metadata.pluginName = pluginName; + load.metadata.pluginArgument = load.name; + + // run plugin locate if given + if (plugin.locate) + return plugin.locate.call(loader, load); + + // otherwise use standard locate without '.js' extension adding + else + return Promise.resolve(loader.locate(load)) + .then(function(address) { + return address.replace(/\.js$/, ''); + }); + }); + } + + return loaderLocate.call(this, load); + }; + + var loaderFetch = loader.fetch; + loader.fetch = function(load) { + var loader = this; + // ignore fetching build = false unless in a plugin loader + if (load.metadata.build === false && loader.pluginLoader) + return ''; + else if (load.metadata.plugin && load.metadata.plugin.fetch && !load.metadata.pluginFetchCalled) { + load.metadata.pluginFetchCalled = true; + return load.metadata.plugin.fetch.call(loader, load, loaderFetch); + } + else + return loaderFetch.call(loader, load); + } + + var loaderTranslate = loader.translate; + loader.translate = function(load) { + var loader = this; + if (load.metadata.plugin && load.metadata.plugin.translate) + return Promise.resolve(load.metadata.plugin.translate.call(loader, load)).then(function(result) { + if (typeof result == 'string') + load.source = result; + return loaderTranslate.call(loader, load); + }); + else + return loaderTranslate.call(loader, load); + } + + var loaderInstantiate = loader.instantiate; + loader.instantiate = function(load) { + var loader = this; + if (load.metadata.plugin && load.metadata.plugin.instantiate) + return Promise.resolve(load.metadata.plugin.instantiate.call(loader, load)).then(function(result) { + load.metadata.format = 'defined'; + load.metadata.execute = function() { + return result; + }; + return loaderInstantiate.call(loader, load); + }); + else if (load.metadata.plugin && load.metadata.plugin.build === false) { + load.metadata.format = 'defined'; + load.metadata.deps.push(load.metadata.pluginName); + load.metadata.execute = function() { + return loader.newModule({}); + }; + return loaderInstantiate.call(loader, load); + } + else + return loaderInstantiate.call(loader, load); + } + +} +/* + System bundles + + Allows a bundle module to be specified which will be dynamically + loaded before trying to load a given module. + + For example: + System.bundles['mybundle'] = ['jquery', 'bootstrap/js/bootstrap'] + + Will result in a load to "mybundle" whenever a load to "jquery" + or "bootstrap/js/bootstrap" is made. + + In this way, the bundle becomes the request that provides the module +*/ + +function bundles(loader) { + if (typeof indexOf == 'undefined') + indexOf = Array.prototype.indexOf; + + loader._extensions.push(bundles); + + // bundles support (just like RequireJS) + // bundle name is module name of bundle itself + // bundle is array of modules defined by the bundle + // when a module in the bundle is requested, the bundle is loaded instead + // of the form System.bundles['mybundle'] = ['jquery', 'bootstrap/js/bootstrap'] + loader.bundles = loader.bundles || {}; + + var loadedBundles = []; + + function loadFromBundle(loader, bundle) { + // we do manual normalization in case the bundle is mapped + // this is so we can still know the normalized name is a bundle + return Promise.resolve(loader.normalize(bundle)) + .then(function(normalized) { + if (indexOf.call(loadedBundles, normalized) == -1) { + loadedBundles.push(normalized); + loader.bundles[normalized] = loader.bundles[normalized] || loader.bundles[bundle]; + + // note this module is a bundle in the meta + loader.meta = loader.meta || {}; + loader.meta[normalized] = loader.meta[normalized] || {}; + loader.meta[normalized].bundle = true; + } + return loader.load(normalized); + }) + .then(function() { + return ''; + }); + } + + var loaderFetch = loader.fetch; + loader.fetch = function(load) { + var loader = this; + if (loader.trace) + return loaderFetch.call(this, load); + if (!loader.bundles) + loader.bundles = {}; + + // check what bundles we've already loaded + for (var i = 0; i < loadedBundles.length; i++) { + if (indexOf.call(loader.bundles[loadedBundles[i]], load.name) == -1) + continue; + + return loadFromBundle(loader, loadedBundles[i]); + } + + // if this module is in a bundle, load the bundle first then + for (var b in loader.bundles) { + if (indexOf.call(loader.bundles[b], load.name) == -1) + continue; + + return loadFromBundle(loader, b); + } + + return loaderFetch.call(this, load); + } +} +/* + SystemJS Semver Version Addon + + 1. Uses Semver convention for major and minor forms + + Supports requesting a module from a package that contains a version suffix + with the following semver ranges: + module - any version + module@1 - major version 1, any minor (not prerelease) + module@1.2 - minor version 1.2, any patch (not prerelease) + module@1.2.3 - exact version + + It is assumed that these modules are provided by the server / file system. + + First checks the already-requested packages to see if there are any packages + that would match the same package and version range. + + This provides a greedy algorithm as a simple fix for sharing version-managed + dependencies as much as possible, which can later be optimized through version + hint configuration created out of deeper version tree analysis. + + 2. Semver-compatibility syntax (caret operator - ^) + + Compatible version request support is then also provided for: + + module@^1.2.3 - module@1, >=1.2.3 + module@^1.2 - module@1, >=1.2.0 + module@^1 - module@1 + module@^0.5.3 - module@0.5, >= 0.5.3 + module@^0.0.1 - module@0.0.1 + + The ^ symbol is always normalized out to a normal version request. + + This provides comprehensive semver compatibility. + + 3. System.versions version hints and version report + + Note this addon should be provided after all other normalize overrides. + + The full list of versions can be found at System.versions providing an insight + into any possible version forks. + + It is also possible to create version solution hints on the System global: + + System.versions = { + jquery: ['1.9.2', '2.0.3'], + bootstrap: '3.0.1' + }; + + Versions can be an array or string for a single version. + + When a matching semver request is made (jquery@1.9, jquery@1, bootstrap@3) + they will be converted to the latest version match contained here, if present. + + Prereleases in this versions list are also allowed to satisfy ranges when present. +*/ + +function versions(loader) { + if (typeof indexOf == 'undefined') + indexOf = Array.prototype.indexOf; + + loader._extensions.push(versions); + + var semverRegEx = /^(\d+)(?:\.(\d+)(?:\.(\d+)(?:-([\da-z-]+(?:\.[\da-z-]+)*)(?:\+([\da-z-]+(?:\.[\da-z-]+)*))?)?)?)?$/i; + var numRegEx = /^\d+$/; + + function toInt(num) { + return parseInt(num, 10); + } + + function parseSemver(v) { + var semver = v.match(semverRegEx); + if (!semver) + return { + tag: v + }; + else + return { + major: toInt(semver[1]), + minor: toInt(semver[2]), + patch: toInt(semver[3]), + pre: semver[4] && semver[4].split('.') + }; + } + + var parts = ['major', 'minor', 'patch']; + function semverCompareParsed(v1, v2) { + // not semvers - tags have equal precedence + if (v1.tag && v2.tag) + return 0; + + // semver beats non-semver + if (v1.tag) + return -1; + if (v2.tag) + return 1; + + // compare version numbers + for (var i = 0; i < parts.length; i++) { + var part = parts[i]; + var part1 = v1[part]; + var part2 = v2[part]; + if (part1 == part2) + continue; + if (isNaN(part1)) + return -1; + if (isNaN(part2)) + return 1; + return part1 > part2 ? 1 : -1; + } + + if (!v1.pre && !v2.pre) + return 0; + + if (!v1.pre) + return 1; + if (!v2.pre) + return -1; + + // prerelease comparison + for (var i = 0, l = Math.min(v1.pre.length, v2.pre.length); i < l; i++) { + if (v1.pre[i] == v2.pre[i]) + continue; + + var isNum1 = v1.pre[i].match(numRegEx); + var isNum2 = v2.pre[i].match(numRegEx); + + // numeric has lower precedence + if (isNum1 && !isNum2) + return -1; + if (isNum2 && !isNum1) + return 1; + + // compare parts + if (isNum1 && isNum2) + return toInt(v1.pre[i]) > toInt(v2.pre[i]) ? 1 : -1; + else + return v1.pre[i] > v2.pre[i] ? 1 : -1; + } + + if (v1.pre.length == v2.pre.length) + return 0; + + // more pre-release fields win if equal + return v1.pre.length > v2.pre.length ? 1 : -1; + } + + // match against a parsed range object + // saves operation repetition + // doesn't support tags + // if not semver or fuzzy, assume exact + function matchParsed(range, version) { + var rangeVersion = range.version; + + if (rangeVersion.tag) + return rangeVersion.tag == version.tag; + + // if the version is less than the range, it's not a match + if (semverCompareParsed(rangeVersion, version) == 1) + return false; + + // now we just have to check that the version isn't too high for the range + if (isNaN(version.minor) || isNaN(version.patch)) + return false; + + // if the version has a prerelease, ensure the range version has a prerelease in it + // and that we match the range version up to the prerelease exactly + if (version.pre) { + if (!(rangeVersion.major == version.major && rangeVersion.minor == version.minor && rangeVersion.patch == version.patch)) + return false; + return range.semver || range.fuzzy || rangeVersion.pre.join('.') == version.pre.join('.'); + } + + // check semver range + if (range.semver) { + // ^0 + if (rangeVersion.major == 0 && isNaN(rangeVersion.minor)) + return version.major < 1; + // ^1.. + else if (rangeVersion.major >= 1) + return rangeVersion.major == version.major; + // ^0.1, ^0.2 + else if (rangeVersion.minor >= 1) + return rangeVersion.minor == version.minor; + // ^0.0.0 + else + return (rangeVersion.patch || 0) == version.patch; + } + + // check fuzzy range + if (range.fuzzy) + return version.major == rangeVersion.major && version.minor < (rangeVersion.minor || 0) + 1; + + // exact match + // eg 001.002.003 matches 1.2.3 + return !rangeVersion.pre && rangeVersion.major == version.major && rangeVersion.minor == version.minor && rangeVersion.patch == version.patch; + } + + /* + * semver - is this a semver range + * fuzzy - is this a fuzzy range + * version - the parsed version object + */ + function parseRange(range) { + var rangeObj = {}; + + ((rangeObj.semver = range.substr(0, 1) == '^') + || (rangeObj.fuzzy = range.substr(0, 1) == '~') + ) && (range = range.substr(1)); + + var rangeVersion = rangeObj.version = parseSemver(range); + + if (rangeVersion.tag) + return rangeObj; + + // 0, 0.1 behave like ~0, ~0.1 + if (!rangeObj.fuzzy && !rangeObj.semver && (isNaN(rangeVersion.minor) || isNaN(rangeVersion.patch))) + rangeObj.fuzzy = true; + + // ~1, ~0 behave like ^1, ^0 + if (rangeObj.fuzzy && isNaN(rangeVersion.minor)) { + rangeObj.semver = true; + rangeObj.fuzzy = false; + } + + // ^0.0 behaves like ~0.0 + if (rangeObj.semver && !isNaN(rangeVersion.minor) && isNaN(rangeVersion.patch)) { + rangeObj.semver = false; + rangeObj.fuzzy = true; + } + + return rangeObj; + } + + function semverCompare(v1, v2) { + return semverCompareParsed(parseSemver(v1), parseSemver(v2)); + } + + loader.versions = loader.versions || {}; + + var loaderNormalize = loader.normalize; + // NOW use modified match algorithm if possible + loader.normalize = function(name, parentName, parentAddress) { + if (!this.versions) + this.versions = {}; + var packageVersions = this.versions; + + // strip the version before applying map config + var stripVersion, stripSubPathLength; + var versionIndex = name.indexOf('!') != -1 ? 0 : name.lastIndexOf('@'); + if (versionIndex > 0) { + var parts = name.substr(versionIndex + 1, name.length - versionIndex - 1).split('/'); + stripVersion = parts[0]; + stripSubPathLength = parts.length; + name = name.substr(0, versionIndex) + name.substr(versionIndex + stripVersion.length + 1, name.length - versionIndex - stripVersion.length - 1); + } + + // run all other normalizers first + return Promise.resolve(loaderNormalize.call(this, name, parentName, parentAddress)).then(function(normalized) { + + var index = normalized.indexOf('!') != -1 ? 0 : normalized.indexOf('@'); + + // if we stripped a version, and it still has no version, add it back + if (stripVersion && (index == -1 || index == 0)) { + var parts = normalized.split('/'); + parts[parts.length - stripSubPathLength] += '@' + stripVersion; + normalized = parts.join('/'); + index = normalized.indexOf('@'); + } + + // see if this module corresponds to a package already in our versioned packages list + + // no version specified - check against the list (given we don't know the package name) + var nextChar, versions; + if (index == -1 || index == 0) { + for (var p in packageVersions) { + versions = packageVersions[p]; + if (normalized.substr(0, p.length) != p) + continue; + + nextChar = normalized.substr(p.length, 1); + + if (nextChar && nextChar != '/') + continue; + + // match -> take latest version + return p + '@' + (typeof versions == 'string' ? versions : versions[versions.length - 1]) + normalized.substr(p.length); + } + return normalized; + } + + // get the version info + var packageName = normalized.substr(0, index); + var range = normalized.substr(index + 1).split('/')[0]; + var rangeLength = range.length; + var parsedRange = parseRange(normalized.substr(index + 1).split('/')[0]); + versions = packageVersions[normalized.substr(0, index)] || []; + if (typeof versions == 'string') + versions = [versions]; + + // find a match in our version list + for (var i = versions.length - 1; i >= 0; i--) { + if (matchParsed(parsedRange, parseSemver(versions[i]))) + return packageName + '@' + versions[i] + normalized.substr(index + rangeLength + 1); + } + + // no match found -> send a request to the server + var versionRequest; + if (parsedRange.semver) { + versionRequest = parsedRange.version.major == 0 && !isNaN(parsedRange.version.minor) ? '0.' + parsedRange.version.minor : parsedRange.version.major; + } + else if (parsedRange.fuzzy) { + versionRequest = parsedRange.version.major + '.' + parsedRange.version.minor; + } + else { + versionRequest = range; + versions.push(range); + versions.sort(semverCompare); + packageVersions[packageName] = versions.length == 1 ? versions[0] : versions; + } + + return packageName + '@' + versionRequest + normalized.substr(index + rangeLength + 1); + }); + } +} +/* + * Dependency Tree Cache + * + * Allows a build to pre-populate a dependency trace tree on the loader of + * the expected dependency tree, to be loaded upfront when requesting the + * module, avoinding the n round trips latency of module loading, where + * n is the dependency tree depth. + * + * eg: + * System.depCache = { + * 'app': ['normalized', 'deps'], + * 'normalized': ['another'], + * 'deps': ['tree'] + * }; + * + * System.import('app') + * // simultaneously starts loading all of: + * // 'normalized', 'deps', 'another', 'tree' + * // before "app" source is even loaded + */ + +function depCache(loader) { + loader.depCache = loader.depCache || {}; + + loader._extensions.push(depCache); + + var loaderLocate = loader.locate; + loader.locate = function(load) { + var loader = this; + + if (!loader.depCache) + loader.depCache = {}; + + // load direct deps, in turn will pick up their trace trees + var deps = loader.depCache[load.name]; + if (deps) + for (var i = 0; i < deps.length; i++) + loader.load(deps[i]); + + return loaderLocate.call(loader, load); + } +} + +core(System); +meta(System); +register(System); +es6(System); +global(System); +cjs(System); +amd(System); +map(System); +plugins(System); +bundles(System); +versions(System); +depCache(System); + +}; + +var $__curScript, __eval; + +(function() { + + var doEval; + + __eval = function(source, address, sourceMap) { + source += '\n//# sourceURL=' + address + (sourceMap ? '\n//# sourceMappingURL=' + sourceMap : ''); + + try { + doEval(source); + } + catch(e) { + var msg = 'Error evaluating ' + address + '\n'; + if (e instanceof Error) + e.message = msg + e.message; + else + e = msg + e; + throw e; + } + }; + + if (typeof document != 'undefined') { + var head; + + var scripts = document.getElementsByTagName('script'); + $__curScript = scripts[scripts.length - 1]; + + // globally scoped eval for the browser + doEval = function(source) { + if (!head) + head = document.head || document.body || document.documentElement; + + var script = document.createElement('script'); + script.text = source; + var onerror = window.onerror; + var e; + window.onerror = function(_e) { + e = _e; + } + head.appendChild(script); + head.removeChild(script); + window.onerror = onerror; + if (e) + throw e; + } + + if (!$__global.System || !$__global.LoaderPolyfill) { + // determine the current script path as the base path + var curPath = $__curScript.src; + var basePath = curPath.substr(0, curPath.lastIndexOf('/') + 1); + document.write( + '<' + 'script type="text/javascript" src="' + basePath + 'es6-module-loader.js" data-init="upgradeSystemLoader">' + '<' + '/script>' + ); + } + else { + $__global.upgradeSystemLoader(); + } + } + else if (typeof importScripts != 'undefined') { + doEval = function(source) { + try { + eval(source); + } catch(e) { + throw e; + } + }; + + if (!$__global.System || !$__global.LoaderPolyfill) { + var basePath = ''; + try { + throw new Error('Get worker base path via error stack'); + } catch (e) { + e.stack.replace(/(?:at|@).*(http.+):[\d]+:[\d]+/, function (m, url) { + basePath = url.replace(/\/[^\/]*$/, '/'); + }); + } + importScripts(basePath + 'es6-module-loader.js'); + $__global.upgradeSystemLoader(); + } else { + $__global.upgradeSystemLoader(); + } + } + else { + var es6ModuleLoader = require('es6-module-loader'); + $__global.System = es6ModuleLoader.System; + $__global.Loader = es6ModuleLoader.Loader; + $__global.upgradeSystemLoader(); + module.exports = $__global.System; + + // global scoped eval for node + var vm = require('vm'); + doEval = function(source, address, sourceMap) { + vm.runInThisContext(source); + } + } +})(); + +})(typeof window != 'undefined' ? window : (typeof global != 'undefined' ? global : self)); diff --git a/package.json b/package.json index 3c5c2752..4c161d80 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "devDependencies": { "grunt": "~0.4.0", "grunt-babel": "^4.0.0", + "grunt-connect": "^0.2.0", "grunt-contrib-concat": "~0.3.0", + "grunt-contrib-connect": "^0.10.1", "grunt-contrib-copy": "~0.4.1", "grunt-contrib-cssmin": "~0.6.1", "grunt-contrib-jshint": "~0.11.0", diff --git a/src-es6/array.js b/src-es6/array.js index 085af6df..d28b78f3 100644 --- a/src-es6/array.js +++ b/src-es6/array.js @@ -2,7 +2,7 @@ * Array utilities */ -import {Str} from 'string'; +import {Str} from './string'; var Arr = { has: function(arr, val, caseSensitive){ diff --git a/src-es6/helpers.js b/src-es6/helpers.js index 1f181bd9..0dbe7ad7 100644 --- a/src-es6/helpers.js +++ b/src-es6/helpers.js @@ -2,7 +2,7 @@ * Misc helpers */ -import {Str} from 'string'; +import {Str} from './string'; var Helpers = { isIE(){ diff --git a/src-es6/tablefilter.js b/src-es6/tablefilter.js index a24a3b96..edc78bd1 100644 --- a/src-es6/tablefilter.js +++ b/src-es6/tablefilter.js @@ -40,7 +40,7 @@ import {ColOps} from 'modules/colOps'; import 'extensions/sortabletable/sortabletable'; import {AdapterSortableTable} from 'extensions/sortabletable/adapterSortabletable'; -import {ColsVisibility} from 'extensions/colsVisibility/colsVisibility'; +// import {ColsVisibility} from 'extensions/colsVisibility/colsVisibility'; var global = window, isValidDate = dateHelper.isValid, @@ -580,13 +580,11 @@ export default class TableFilter{ }; // Extensions registry - this.Extensions = { + this.ExtRegistry = { sort: null, ezEditTable: null }; - this.Exts = []; - /*** TF events ***/ var o = this; this.Evt = { @@ -602,7 +600,7 @@ export default class TableFilter{ resetpagelength: 'resetPageLength', sort: 'Sort', loadextensions: 'LoadExtensions', - loadthemes: 'LoadThemes' + loadthemes: 'loadThemes' }, /*==================================================== @@ -811,7 +809,7 @@ export default class TableFilter{ this.includeFile(this.stylesheetId, this.stylesheet, null, 'link'); //loads theme - if(this.hasThemes){ this._LoadThemes(); } + if(this.hasThemes){ this._loadThemes(); } if(this.rememberGridValues || this.rememberPageNb || this.rememberPageLen){ @@ -1152,7 +1150,7 @@ export default class TableFilter{ if(this.hasExtensions){ // this.loadExtensions(); this.registerExtensions(); - this.initExtensions(); + // this.initExtensions(); } if(this.onFiltersLoaded){ @@ -1223,7 +1221,7 @@ export default class TableFilter{ o._loadExtensions(); break; case o.Evt.name.loadthemes: - o._LoadThemes(); + o._loadThemes(); break; default: //to be used by extensions events when needed o['_'+evt].call(null,o,s); @@ -1240,7 +1238,6 @@ export default class TableFilter{ if(this.loader || this.statusBar) { try{ this.Cpt.loader.show(''); - // this.StatusMsg(o['msg'+evt]); this.Cpt.statusBar.message(this['msg'+evt]); } catch(e){} global.setTimeout(efx, this.execDelay); @@ -1257,92 +1254,37 @@ export default class TableFilter{ for(var i=0; i { + this.ExtRegistry[className] = new m[className](this, ext); + }); } - // ImportModule(module){ - // if(!module.path || !module.name){ - // return; - // } - // this.includeFile(module.name, module.path, module.init); - // } - - // loadExtensions(){ - // if(!this.Ext){ - // /*** TF extensions ***/ - // var o = this; - // this.Ext = { - // list: {}, - // add: function(extName, extDesc, extPath, extCallBack){ - // var file = extPath.split('/')[extPath.split('/').length-1], - // re = new RegExp(file), - // path = extPath.replace(re,''); - // o.Ext.list[extName] = { - // name: extName, - // description: extDesc, - // file: file, - // path: path, - // callback: extCallBack - // }; - // } - // }; - // } - // this.EvtManager(this.Evt.name.loadextensions); - // } - - /*==================================================== - - loads TF extensions - =====================================================*/ - // _LoadExtensions(){ - // if(!this.hasExtensions || !types.isArray(this.extensions.name) || - // !types.isArray(this.extensions.src)){ - // return; - // } - // var ext = this.extensions; - // for(var e=0; e + + - + \ No newline at end of file diff --git a/src/tablefilter.js b/src/tablefilter.js index 0548126f..6069eb2f 100644 --- a/src/tablefilter.js +++ b/src/tablefilter.js @@ -1,4 +1,4 @@ -define(["exports", "module", "event", "dom", "string", "cookie", "types", "array", "helpers", "date", "sort", "modules/store", "modules/gridLayout", "modules/loader", "modules/highlightKeywords", "modules/popupFilter", "modules/dropdown", "modules/checkList", "modules/rowsCounter", "modules/statusBar", "modules/paging", "modules/clearButton", "modules/help", "modules/alternateRows", "modules/colOps", "extensions/sortabletable/sortabletable", "extensions/sortabletable/adapterSortabletable", "extensions/colsVisibility/colsVisibility"], function (exports, module, _event, _dom, _string, _cookie, _types, _array, _helpers, _date, _sort, _modulesStore, _modulesGridLayout, _modulesLoader, _modulesHighlightKeywords, _modulesPopupFilter, _modulesDropdown, _modulesCheckList, _modulesRowsCounter, _modulesStatusBar, _modulesPaging, _modulesClearButton, _modulesHelp, _modulesAlternateRows, _modulesColOps, _extensionsSortabletableSortabletable, _extensionsSortabletableAdapterSortabletable, _extensionsColsVisibilityColsVisibility) { +define(["exports", "module", "event", "dom", "string", "cookie", "types", "array", "helpers", "date", "sort", "modules/store", "modules/gridLayout", "modules/loader", "modules/highlightKeywords", "modules/popupFilter", "modules/dropdown", "modules/checkList", "modules/rowsCounter", "modules/statusBar", "modules/paging", "modules/clearButton", "modules/help", "modules/alternateRows", "modules/colOps", "extensions/sortabletable/sortabletable", "extensions/sortabletable/adapterSortabletable"], function (exports, module, _event, _dom, _string, _cookie, _types, _array, _helpers, _date, _sort, _modulesStore, _modulesGridLayout, _modulesLoader, _modulesHighlightKeywords, _modulesPopupFilter, _modulesDropdown, _modulesCheckList, _modulesRowsCounter, _modulesStatusBar, _modulesPaging, _modulesClearButton, _modulesHelp, _modulesAlternateRows, _modulesColOps, _extensionsSortabletableSortabletable, _extensionsSortabletableAdapterSortabletable) { "use strict"; var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); @@ -43,7 +43,8 @@ define(["exports", "module", "event", "dom", "string", "cookie", "types", "array var AlternateRows = _modulesAlternateRows.AlternateRows; var ColOps = _modulesColOps.ColOps; var AdapterSortableTable = _extensionsSortabletableAdapterSortabletable.AdapterSortableTable; - var ColsVisibility = _extensionsColsVisibilityColsVisibility.ColsVisibility; + + // import {ColsVisibility} from 'extensions/colsVisibility/colsVisibility'; var global = window, isValidDate = dateHelper.isValid, @@ -532,13 +533,11 @@ define(["exports", "module", "event", "dom", "string", "cookie", "types", "array }; // Extensions registry - this.Extensions = { + this.ExtRegistry = { sort: null, ezEditTable: null }; - this.Exts = []; - /*** TF events ***/ var o = this; this.Evt = { @@ -554,7 +553,7 @@ define(["exports", "module", "event", "dom", "string", "cookie", "types", "array resetpagelength: "resetPageLength", sort: "Sort", loadextensions: "LoadExtensions", - loadthemes: "LoadThemes" + loadthemes: "loadThemes" }, /*==================================================== @@ -775,7 +774,7 @@ define(["exports", "module", "event", "dom", "string", "cookie", "types", "array //loads theme if (this.hasThemes) { - this._LoadThemes(); + this._loadThemes(); } if (this.rememberGridValues || this.rememberPageNb || this.rememberPageLen) { @@ -1087,7 +1086,7 @@ define(["exports", "module", "event", "dom", "string", "cookie", "types", "array if (this.hasExtensions) { // this.loadExtensions(); this.registerExtensions(); - this.initExtensions(); + // this.initExtensions(); } if (this.onFiltersLoaded) { @@ -1160,7 +1159,7 @@ define(["exports", "module", "event", "dom", "string", "cookie", "types", "array o._loadExtensions(); break; case o.Evt.name.loadthemes: - o._LoadThemes(); + o._loadThemes(); break; default: //to be used by extensions events when needed @@ -1178,7 +1177,6 @@ define(["exports", "module", "event", "dom", "string", "cookie", "types", "array if (this.loader || this.statusBar) { try { this.Cpt.loader.show(""); - // this.StatusMsg(o['msg'+evt]); this.Cpt.statusBar.message(this["msg" + evt]); } catch (e) {} global.setTimeout(efx, this.execDelay); @@ -1196,98 +1194,44 @@ define(["exports", "module", "event", "dom", "string", "cookie", "types", "array for (var i = 0; i < exts.length; i++) { var ext = exts[i]; - if (this.Exts.indexOf(ext.name) === -1) { - this.Exts.push(ext.name); + if (types.isUndef(this.ExtRegistry[ext.name])) { + this.loadExtension(ext); } } } }, - initExtensions: { - value: function initExtensions() { - var exts = this.extensions; - if (exts.length === 0) { + loadExtension: { + value: function loadExtension(ext) { + var _this = this; + + if (!ext || !ext.name || !ext.src) { return; } + var sys = global.System, + className = ext.name, + tf = this; - for (var i = 0; i < exts.length; i++) { - var tf = this; - var ext = exts[i]; - var name = ext.name; - var inst = eval("new " + name + "(tf, ext);"); - tf.Extensions[name] = inst; - } + sys.config({ + baseURL: tf.basePath + }); + + sys["import"](ext.src.replace(".js", "")).then(function (m) { + _this.ExtRegistry[className] = new m[className](_this, ext); + }); } }, - LoadThemes: { - - // ImportModule(module){ - // if(!module.path || !module.name){ - // return; - // } - // this.includeFile(module.name, module.path, module.init); - // } - - // loadExtensions(){ - // if(!this.Ext){ - // /*** TF extensions ***/ - // var o = this; - // this.Ext = { - // list: {}, - // add: function(extName, extDesc, extPath, extCallBack){ - // var file = extPath.split('/')[extPath.split('/').length-1], - // re = new RegExp(file), - // path = extPath.replace(re,''); - // o.Ext.list[extName] = { - // name: extName, - // description: extDesc, - // file: file, - // path: path, - // callback: extCallBack - // }; - // } - // }; - // } - // this.EvtManager(this.Evt.name.loadextensions); - // } - - /*==================================================== - - loads TF extensions - =====================================================*/ - // _LoadExtensions(){ - // if(!this.hasExtensions || !types.isArray(this.extensions.name) || - // !types.isArray(this.extensions.src)){ - // return; - // } - // var ext = this.extensions; - // for(var e=0; e