/
extension-es6.js
85 lines (70 loc) · 3.32 KB
/
extension-es6.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
* Extension to detect ES6 and auto-load Traceur or 6to5 for processing
*/
function es6(loader) {
loader._extensions.push(es6);
var transpiler, transpilerName, transpilerModule, transpilerRuntimeModule, transpilerRuntimeGlobal;
var isBrowser = typeof window != 'undefined';
function setTranspiler(name) {
transpiler = name;
transpilerName = this.transpiler == '6to5' ? 'to5' : transpiler;
transpilerModule = '@' + transpiler;
transpilerRuntimeModule = '@' + transpiler + '-runtime';
transpilerRuntimeGlobal = (transpilerName == 'to5' ? transpilerName : '$' + transpilerName) + 'Runtime';
// auto-detection of paths to loader transpiler files
if (typeof $__curScript != 'undefined') {
if (!loader.paths[transpilerModule])
loader.paths[transpilerModule] = $__curScript.getAttribute('data-' + loader.transpiler + '-src')
|| ($__curScript.src ? $__curScript.src.substr(0, $__curScript.src.lastIndexOf('/') + 1)
: loader.baseURL + (loader.baseURL.lastIndexOf('/') == loader.baseURL.length - 1 ? '' : '/')
) + loader.transpiler + '.js';
if (!loader.paths[transpilerRuntimeModule])
loader.paths[transpilerRuntimeModule] = $__curScript.getAttribute('data-' + loader.transpiler + '-runtime-src') || loader.paths[transpilerModule].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 transpiler info if necessary
if (this.transpiler !== transpiler)
setTranspiler(this.transpiler);
var loader = this;
if (load.name == transpilerModule || load.name == transpilerRuntimeModule)
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 transpiler for ES6 if necessary
if (isBrowser && !loader.global[transpilerName])
return loader['import'](transpilerModule).then(function() {
return loaderTranslate.call(loader, load);
});
}
// dynamically load transpiler runtime if necessary
if (isBrowser && !loader.global[transpilerRuntimeGlobal] && load.source.indexOf(transpilerRuntimeGlobal) != -1) {
var System = $__global.System;
return loader['import'](transpilerRuntimeModule).then(function() {
// traceur runtme annihilates System global
$__global.System = System;
return loaderTranslate.call(loader, load);
});
}
return loaderTranslate.call(loader, load);
}
// always load transpiler as a global
var loaderInstantiate = loader.instantiate;
loader.instantiate = function(load) {
var loader = this;
if (isBrowser && (load.name == transpilerModule || load.name == transpilerRuntimeModule)) {
loader.__exec(load);
return {
deps: [],
execute: function() {
return loader.newModule({});
}
};
}
return loaderInstantiate.call(loader, load);
}
}