systemjs
Version:
System loader extension for flexible AMD & CommonJS support
84 lines (70 loc) • 3.19 kB
JavaScript
/*
* Extension to detect ES6 and auto-load Traceur or 6to5 for processing
*/
function es6(loader) {
var parser, parserName, parserModule, parserRuntimeModule, parserRuntimeGlobal;
var isBrowser = typeof window != 'undefined';
function setParser(name) {
parser = name;
parserName = this.parser == '6to5' ? 'to5' : parser;
parserModule = '@' + parser;
parserRuntimeModule = '@' + parser + '-runtime';
parserRuntimeGlobal = (parserName == 'to5' ? parserName : '$' + parserName) + 'Runtime';
// auto-detection of paths to loader parser files
if (typeof $__curScript != 'undefined') {
if (!loader.paths[parserModule])
loader.paths[parserModule] = $__curScript.getAttribute('data-' + loader.parser + '-src')
|| ($__curScript.src ? $__curScript.src.substr(0, $__curScript.src.lastIndexOf('/') + 1)
: loader.baseURL + (loader.baseURL.lastIndexOf('/') == loader.baseURL.length - 1 ? '' : '/')
) + loader.parser + '.js';
if (!loader.paths[parserRuntimeModule])
loader.paths[parserRuntimeModule] = $__curScript.getAttribute('data-' + loader.parser + '-runtime-src') || loader.paths[parserModule].replace(/\.js$/, '-runtime.js');
}
}
// 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 loaderTranslate = loader.translate;
loader.translate = function(load) {
// update parser info if necessary
if (this.parser !== parser)
setParser(this.parser);
var loader = this;
if (load.name == parserModule || load.name == parserRuntimeModule)
return loaderTranslate.call(loader, load);
// detect ES6
else if (load.metadata.format == 'es6' || !load.metadata.format && load.source.match(es6RegEx)) {
load.metadata.format = 'es6';
// dynamically load parser for ES6 if necessary
if (isBrowser && !loader.global[parserName]) {
return loader['import'](parserModule).then(function() {
return loaderTranslate.call(loader, load);
});
}
}
// dynamically load parser runtime if necessary
if (isBrowser && !loader.global[parserRuntimeGlobal] && load.source.indexOf(parserRuntimeGlobal) != -1) {
var System = $__global.System;
return loader['import'](parserRuntimeModule).then(function() {
// traceur runtme annihilates System global
$__global.System = System;
return loaderTranslate.call(loader, load);
});
}
return loaderTranslate.call(loader, load);
}
// always load parser as a global
var loaderInstantiate = loader.instantiate;
loader.instantiate = function(load) {
var loader = this;
if (isBrowser && (load.name == parserModule || load.name == parserRuntimeModule)) {
loader.__exec(load);
return {
deps: [],
execute: function() {
return loader.newModule({});
}
};
}
return loaderInstantiate.call(loader, load);
}
}