Skip to content
This repository was archived by the owner on Jul 13, 2020. It is now read-only.

Commit c309e11

Browse files
committed
complete transition to running loader as a module
1 parent 79d8d35 commit c309e11

13 files changed

+160
-137
lines changed

karma.conf.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ module.exports = function(config) {
4848
[!options.ie8 ? 'test/*.spec.js' : 'test/*.normalize.spec.js'],
4949

5050
{pattern: 'test/{loader,loads,syntax,worker}/**/*', included: false},
51+
{pattern: 'node_modules/traceur/bin/traceur.js', included: false},
52+
{pattern: 'node_modules/babel-core/browser.js', included: false},
5153
{pattern: 'node_modules/when/es6-shim/Promise.js', included: false},
5254
{pattern: 'dist/es6-module-loader*.js', included: false}
5355
];
@@ -63,6 +65,9 @@ module.exports = function(config) {
6365
mocha: {
6466
reporter: 'html',
6567
timeout: 8000
68+
},
69+
system: {
70+
transpiler: options.babel ? 'babel' : 'traceur'
6671
}
6772
}
6873
});

lib/index-babel.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var System = require('../dist/es6-module-loader.src');
22

33
System.transpiler = 'babel';
4+
System.paths['babel'] = require.resolve('babel-core/browser.js');
45

56
module.exports = {
67
Loader: global.LoaderPolyfill,

lib/index-traceur.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var System = require('../dist/es6-module-loader.src');
22

33
System.transpiler = 'traceur';
4+
System.paths['traceur'] = require.resolve('traceur/bin/traceur.js');
45

56
module.exports = {
67
Loader: global.LoaderPolyfill,

src/loader.js

Lines changed: 83 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -230,88 +230,100 @@ function logloads(loads) {
230230
.then(function(source) {
231231
if (load.status != 'loading')
232232
return;
233-
return loader.loaderObj.translate({ name: load.name, metadata: load.metadata, address: load.address, source: source });
234-
})
235233

236-
// 15.2.4.5.2 CallInstantiate
237-
.then(function(source) {
238-
if (load.status != 'loading')
239-
return;
240-
load.source = source;
241-
return loader.loaderObj.instantiate({ name: load.name, metadata: load.metadata, address: load.address, source: source });
242-
})
234+
return Promise.resolve(loader.loaderObj.translate({ name: load.name, metadata: load.metadata, address: load.address, source: source }))
243235

244-
// 15.2.4.5.3 InstantiateSucceeded
245-
.then(function(instantiateResult) {
246-
if (load.status != 'loading')
247-
return;
248-
249-
if (instantiateResult === undefined) {
250-
load.address = load.address || '<Anonymous Module ' + ++anonCnt + '>';
251-
252-
// instead of load.kind, use load.isDeclarative
253-
load.isDeclarative = true;
254-
__eval(loader.loaderObj.transpile(load), __global, load);
255-
}
256-
else if (typeof instantiateResult == 'object') {
257-
load.depsList = instantiateResult.deps || [];
258-
load.execute = instantiateResult.execute;
259-
load.isDeclarative = false;
260-
}
261-
else
262-
throw TypeError('Invalid instantiate return value');
236+
// 15.2.4.5.2 CallInstantiate
237+
.then(function(source) {
238+
load.source = source;
239+
return loader.loaderObj.instantiate({ name: load.name, metadata: load.metadata, address: load.address, source: source });
240+
})
263241

242+
// 15.2.4.5.3 InstantiateSucceeded
243+
.then(function(instantiateResult) {
244+
if (instantiateResult === undefined) {
245+
load.address = load.address || '<Anonymous Module ' + ++anonCnt + '>';
246+
247+
// instead of load.kind, use load.isDeclarative
248+
load.isDeclarative = true;
249+
return loader.loaderObj.transpile(load)
250+
.then(function(transpiled) {
251+
// Hijack System.register to set declare function
252+
var curSystem = __global.System;
253+
var curRegister = curSystem.register;
254+
curSystem.register = function(name, deps, declare) {
255+
if (typeof name != 'string') {
256+
declare = deps;
257+
deps = name;
258+
}
259+
// store the registered declaration as load.declare
260+
// store the deps as load.deps
261+
load.declare = declare;
262+
load.depsList = deps;
263+
}
264+
__eval(transpiled, __global, load);
265+
curSystem.register = curRegister;
266+
});
267+
}
268+
else if (typeof instantiateResult == 'object') {
269+
load.depsList = instantiateResult.deps || [];
270+
load.execute = instantiateResult.execute;
271+
load.isDeclarative = false;
272+
}
273+
else
274+
throw TypeError('Invalid instantiate return value');
275+
})
264276
// 15.2.4.6 ProcessLoadDependencies
265-
load.dependencies = [];
266-
var depsList = load.depsList;
267-
268-
var loadPromises = [];
269-
for (var i = 0, l = depsList.length; i < l; i++) (function(request, index) {
270-
loadPromises.push(
271-
requestLoad(loader, request, load.name, load.address)
272-
273-
// 15.2.4.6.1 AddDependencyLoad (load is parentLoad)
274-
.then(function(depLoad) {
275-
276-
// adjusted from spec to maintain dependency order
277-
// this is due to the System.register internal implementation needs
278-
load.dependencies[index] = {
279-
key: request,
280-
value: depLoad.name
281-
};
282-
283-
if (depLoad.status != 'linked') {
284-
var linkSets = load.linkSets.concat([]);
285-
for (var i = 0, l = linkSets.length; i < l; i++)
286-
addLoadToLinkSet(linkSets[i], depLoad);
287-
}
288-
289-
// console.log('AddDependencyLoad ' + depLoad.name + ' for ' + load.name);
290-
// snapshot(loader);
291-
})
292-
);
293-
})(depsList[i], i);
294-
295-
return Promise.all(loadPromises);
296-
})
277+
.then(function() {
278+
load.dependencies = [];
279+
var depsList = load.depsList;
280+
281+
var loadPromises = [];
282+
for (var i = 0, l = depsList.length; i < l; i++) (function(request, index) {
283+
loadPromises.push(
284+
requestLoad(loader, request, load.name, load.address)
285+
286+
// 15.2.4.6.1 AddDependencyLoad (load is parentLoad)
287+
.then(function(depLoad) {
288+
289+
// adjusted from spec to maintain dependency order
290+
// this is due to the System.register internal implementation needs
291+
load.dependencies[index] = {
292+
key: request,
293+
value: depLoad.name
294+
};
295+
296+
if (depLoad.status != 'linked') {
297+
var linkSets = load.linkSets.concat([]);
298+
for (var i = 0, l = linkSets.length; i < l; i++)
299+
addLoadToLinkSet(linkSets[i], depLoad);
300+
}
301+
302+
// console.log('AddDependencyLoad ' + depLoad.name + ' for ' + load.name);
303+
// snapshot(loader);
304+
})
305+
);
306+
})(depsList[i], i);
307+
308+
return Promise.all(loadPromises);
309+
})
297310

298-
// 15.2.4.6.2 LoadSucceeded
299-
.then(function() {
300-
// console.log('LoadSucceeded ' + load.name);
301-
// snapshot(loader);
311+
// 15.2.4.6.2 LoadSucceeded
312+
.then(function() {
313+
// console.log('LoadSucceeded ' + load.name);
314+
// snapshot(loader);
302315

303-
console.assert(load.status == 'loading', 'is loading');
316+
console.assert(load.status == 'loading', 'is loading');
304317

305-
load.status = 'loaded';
318+
load.status = 'loaded';
306319

307-
var linkSets = load.linkSets.concat([]);
308-
for (var i = 0, l = linkSets.length; i < l; i++)
309-
updateLinkSetOnLoad(linkSets[i], load);
320+
var linkSets = load.linkSets.concat([]);
321+
for (var i = 0, l = linkSets.length; i < l; i++)
322+
updateLinkSetOnLoad(linkSets[i], load);
323+
});
310324
})
311-
312325
// 15.2.4.5.4 LoadFailed
313326
['catch'](function(exc) {
314-
console.assert(load.status == 'loading', 'is loading on fail');
315327
load.status = 'failed';
316328
load.exception = exc;
317329

src/polyfill-wrapper-end.js

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,15 @@
11

22
// Define our eval outside of the scope of any other reference defined in this
33
// file to avoid adding those references to the evaluation scope.
4-
function __eval(__source, __global, load) {
5-
// Hijack System.register to set declare function
6-
var __curRegister = System.register;
7-
System.register = function(name, deps, declare) {
8-
if (typeof name != 'string') {
9-
declare = deps;
10-
deps = name;
11-
}
12-
// store the registered declaration as load.declare
13-
// store the deps as load.deps
14-
load.declare = declare;
15-
load.depsList = deps;
16-
}
4+
function __eval(__source, __global, __load) {
175
try {
18-
eval('(function() { var __moduleName = "' + (load.name || '').replace('"', '\"') + '"; ' + __source + ' \n }).call(__global);');
6+
eval('(function() { var __moduleName = "' + (__load.name || '').replace('"', '\"') + '"; ' + __source + ' \n }).call(__global);');
197
}
208
catch(e) {
219
if (e.name == 'SyntaxError' || e.name == 'TypeError')
22-
e.message = 'Evaluating ' + (load.name || load.address) + '\n\t' + e.message;
10+
e.message = 'Evaluating ' + (__load.name || load.address) + '\n\t' + e.message;
2311
throw e;
2412
}
25-
26-
System.register = __curRegister;
2713
}
2814

2915
})(typeof window != 'undefined' ? window : (typeof WorkerGlobalScope != 'undefined' ?

src/transpiler.js

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,44 @@
22
* Traceur and Babel transpile hook for Loader
33
*/
44
(function(Loader) {
5-
// Returns an array of ModuleSpecifiers
6-
var transpiler, transpilerModule;
7-
85
// use Traceur by default
96
Loader.prototype.transpiler = 'traceur';
107

118
Loader.prototype.transpile = function(load) {
12-
if (!transpiler) {
13-
transpilerModule = this.get(this.transpiler);
14-
15-
if (transpilerModule) {
16-
transpilerModule = transpilerModule['default'];
17-
}
18-
else {
19-
transpilerModule = __global[this.transpiler];
20-
if (!transpilerModule && typeof require != 'undefined') {
21-
var curSystem = __global.System;
22-
transpilerModule = require(this.transpiler == 'babel' ? 'babel-core' : 'traceur');
23-
__global.System = curSystem;
24-
}
25-
if (!transpilerModule)
26-
throw new TypeError('Include Traceur or Babel for module syntax support.');
27-
this.set(this.transpiler, this.newModule({ 'default': transpilerModule, __useDefault: true }));
28-
}
9+
return this['import'](this.transpiler).then(function(transpiler) {
10+
if (transpiler.__useDefault)
11+
transpiler = transpiler['default'];
12+
return 'var __moduleAddress = "' + load.address + '";' + (transpiler.Compiler ? traceurTranspile : babelTranspile).call(this, load, transpiler);
13+
});
14+
}
2915

30-
if (this.transpiler == 'babel')
31-
transpiler = babelTranspile;
32-
else if (this.transpiler == 'traceur')
33-
transpiler = traceurTranspile;
34-
}
16+
var g = __global;
3517

36-
return 'var __moduleAddress = "' + load.address + '";' + transpiler.call(this, load);
18+
Loader.prototype.instantiate = function(load) {
19+
// load transpiler as a global (avoiding System clobbering)
20+
if (load.name === this.transpiler)
21+
return {
22+
deps: [],
23+
execute: function() {
24+
var curSystem = g.System;
25+
var curLoader = g.Reflect.Loader;
26+
__eval('(function(require,exports,module){' + load.source + '})();', g, load);
27+
g.System = curSystem;
28+
g.Reflect.Loader = curLoader;
29+
return System.newModule({ 'default': g[load.name], __useDefault: true });
30+
}
31+
};
3732
}
3833

39-
function traceurTranspile(load) {
34+
function traceurTranspile(load, traceur) {
4035
var options = this.traceurOptions || {};
4136
options.modules = 'instantiate';
4237
options.script = false;
4338
options.sourceMaps = 'inline';
4439
options.filename = load.address;
4540
options.inputSourceMap = load.metadata.sourceMap;
4641

47-
var compiler = new transpilerModule.Compiler(options);
42+
var compiler = new traceur.Compiler(options);
4843
var source = doTraceurCompile(load.source, compiler, options.filename);
4944

5045
// add "!eval" to end of Traceur sourceURL
@@ -63,7 +58,7 @@
6358
}
6459
}
6560

66-
function babelTranspile(load) {
61+
function babelTranspile(load, babel) {
6762
var options = this.babelOptions || {};
6863
options.modules = 'system';
6964
options.sourceMap = 'inline';
@@ -73,7 +68,7 @@
7368
options.blacklist = options.blacklist || [];
7469
options.blacklist.push('react');
7570

76-
var source = transpilerModule.transform(load.source, options).code;
71+
var source = babel.transform(load.source, options).code;
7772

7873
// add "!eval" to end of Babel sourceURL
7974
// I believe this does something?

test/_browser.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11

22
// Change base url to the karma "base"
33
System.baseURL += 'base/';
4+
5+
System.paths.traceur = 'node_modules/traceur/bin/traceur.js';
6+
System.paths.babel = 'node_modules/babel-core/browser.js';
7+
8+
System.transpiler = __karma__.config.system.transpiler;

test/custom-loader.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,18 @@
6262
return System.translate.apply(this, arguments);
6363
},
6464
instantiate: function (load) {
65+
if (load.name == this.transpiler) {
66+
var transpiler = this.transpiler;
67+
return System.import(transpiler).then(function() {
68+
return {
69+
deps: [],
70+
execute: function() {
71+
return System.get(transpiler);
72+
}
73+
};
74+
});
75+
}
76+
6577
if (load.name == 'error5') {
6678
return new Promise(function (resolve, reject) {
6779
setTimeout(function () { reject('error5'); }, 100);
@@ -111,9 +123,7 @@
111123
}
112124
});
113125

114-
customLoader.parse = function (load) {
115-
return System.parse(load);
116-
};
126+
customLoader.transpiler = System.transpiler;
117127

118128

119129
if (typeof exports === 'object')

test/test-babel.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
<script src="test.js"></script>
77

88
<!-- set this to the path to babel.js -->
9-
<script src="../node_modules/babel-core/browser.js"></script>
109
<script src="../node_modules/regenerator/runtime.js"></script>
1110

1211
<script>
@@ -19,6 +18,7 @@
1918
<script src="../dist/es6-module-loader.src.js"></script>
2019
<script>
2120
System.transpiler = 'babel';
21+
System.paths['babel'] = '../node_modules/babel-core/browser.js';
2222
</script>
2323

2424
<script>

0 commit comments

Comments
 (0)