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

Commit 98563d7

Browse files
committed
new System.register tests passing
1 parent 728d1cb commit 98563d7

5 files changed

Lines changed: 116 additions & 75 deletions

File tree

lib/loader.js

Lines changed: 83 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -218,47 +218,58 @@ function logloads(loads) {
218218

219219
console.assert(load.source, 'Non-empty source');
220220

221-
var parser = new traceur.syntax.Parser(new traceur.syntax.SourceFile(load.address, load.source));
222-
var body = parser.parseModule();
221+
try {
222+
var parser = new traceur.syntax.Parser(new traceur.syntax.SourceFile(load.address, load.source));
223+
var body = parser.parseModule();
223224

224-
load.kind = 'declarative';
225-
depsList = getImports(body);
225+
load.kind = 'declarative';
226+
depsList = getImports(body);
226227

227-
traceur.options.sourceMaps = true;
228-
traceur.options.modules = 'instantiate';
228+
traceur.options.sourceMaps = true;
229+
traceur.options.modules = 'instantiate';
229230

230-
var reporter = new traceur.util.ErrorReporter();
231+
var reporter = new traceur.util.ErrorReporter();
231232

232-
reporter.reportMessageInternal = function(location, kind, format, args) {
233-
throw kind + '\n' + location;
234-
}
233+
reporter.reportMessageInternal = function(location, kind, format, args) {
234+
throw new SyntaxError(kind, location.start && location.start.line_, location.start && location.start.column_);
235+
}
235236

236-
// traceur expects its version of System
237-
var sys = global.System;
238-
global.System = global.traceurSystem;
237+
// traceur expects its version of System
238+
var curSystem = global.System;
239+
global.System = global.traceurSystem;
239240

240-
var tree = (new traceur.codegeneration.module.AttachModuleNameTransformer(load.name)).transformAny(body);
241-
tree = (new traceur.codegeneration.FromOptionsTransformer(reporter)).transform(tree);
241+
var tree = (new traceur.codegeneration.module.AttachModuleNameTransformer(load.name)).transformAny(body);
242+
tree = (new traceur.codegeneration.FromOptionsTransformer(reporter)).transform(tree);
242243

243-
var sourceMapGenerator = new traceur.outputgeneration.SourceMapGenerator({ file: load.address });
244-
var options = { sourceMapGenerator: sourceMapGenerator };
244+
var sourceMapGenerator = new traceur.outputgeneration.SourceMapGenerator({ file: load.address });
245+
var options = { sourceMapGenerator: sourceMapGenerator };
245246

246-
var source = traceur.outputgeneration.TreeWriter.write(tree, options);
247+
var source = traceur.outputgeneration.TreeWriter.write(tree, options);
247248

248-
if (global.btoa)
249-
source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(options.sourceMap))) + '\n';
249+
if (global.btoa)
250+
source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(options.sourceMap))) + '\n';
250251

251-
// now run System.register
252-
var sysRegister = System.register;
253-
254-
System.register = function(name, deps, declare) {
255-
// store the registered declaration as load.declare
256-
load.declare = declare;
257-
}
258-
__eval(source, global, load.name);
252+
// now run System.register
253+
var curRegister = System.register;
254+
255+
System.register = function(name, deps, declare) {
256+
// store the registered declaration as load.declare
257+
load.declare = declare;
258+
}
259259

260-
System.register = sysRegister;
261-
global.System = sys;
260+
__eval(source, global, load.name);
261+
}
262+
catch(e) {
263+
if (e.name == 'SyntaxError' || e.name == 'TypeError')
264+
e.message = 'Evaluating ' + (load.name || load.address) + '\n\t' + e.message;
265+
if (curRegister)
266+
System.register = curRegister;
267+
if (curSystem)
268+
global.System = curSystem;
269+
throw e;
270+
}
271+
System.register = curRegister;
272+
global.System = curSystem;
262273
}
263274
else if (typeof instantiateResult == 'object') {
264275
depsList = instantiateResult.deps || [];
@@ -567,13 +578,13 @@ function logloads(loads) {
567578
// 15.2.5.6 LinkDynamicModules adjusted
568579
else {
569580
var module = load.execute();
570-
if (!(module instanceof Module))
581+
if (!(module.__esModule))
571582
throw new TypeError('Execution must define a Module instance');
572583
load.module = {
573584
module: module
574585
};
586+
load.status = 'linked';
575587
}
576-
load.status = 'linked';
577588
finishLoad(loader, load);
578589
}
579590

@@ -584,11 +595,12 @@ function logloads(loads) {
584595

585596
// custom declarative linking function
586597
function linkDeclarativeModule(load, loads, loader) {
598+
// only link if already not already started linking (stops at circular)
587599
if (load.module)
588600
return;
589601

590602
// declare the module with an empty depMap
591-
var depMap = {};
603+
var depMap = [];
592604
var sys = global.System;
593605
global.System = loader;
594606
var registryEntry = load.declare.call(global, depMap);
@@ -597,10 +609,15 @@ function logloads(loads) {
597609

598610
var moduleDependencies = [];
599611

612+
var module = Module(registryEntry.exports, 1);
613+
614+
console.assert(!load.module, 'Load module already declared!');
615+
600616
load.module = {
601617
name: load.name,
602618
dependencies: moduleDependencies,
603619
execute: registryEntry.execute,
620+
module: module,
604621
evaluated: false
605622
};
606623

@@ -619,41 +636,40 @@ function logloads(loads) {
619636
if (loads[j].name != depName)
620637
continue;
621638

622-
// link if already not already linked (stops at circular)
623-
if (!loads[j].module)
624-
linkDeclarativeModule(loads[j], loads, loader);
639+
linkDeclarativeModule(loads[j], loads, loader);
625640

626641
depModule = loads[j].module;
627642
}
628643
}
629644

630-
var depModuleModule = depModule.module;
645+
console.assert(depModule, 'Dependency module not found!');
646+
console.assert(depModule.module, 'Dependency module not found!');
631647

632648
if (registryEntry.exportStar && indexOf.call(registryEntry.exportStar, load.dependencies[i].key) != -1) {
633649
// we are exporting * from this dependency
634-
for (var p in depModule.module) (function(p) {
635-
// if the property is already defined throw?
636-
defineProperty(registryEntry.exports, p, {
637-
enumerable: true,
638-
get: function() {
639-
return depModuleModule[p];
640-
},
641-
set: function(value) {
642-
depModuleModule[p] = value;
643-
}
644-
});
645-
})(p);
650+
(function(depModuleModule) {
651+
for (var p in depModuleModule) (function(p) {
652+
// if the property is already defined throw?
653+
defineProperty(module, p, {
654+
enumerable: true,
655+
get: function() {
656+
return depModuleModule[p];
657+
},
658+
set: function(value) {
659+
depModuleModule[p] = value;
660+
}
661+
});
662+
})(p);
663+
})(depModule.module);
646664
}
647665

648-
console.assert(depModule, 'Dependency module not found!');
649-
console.assert(depModuleModule, 'Dependency module not found!');
650-
651666
moduleDependencies.push(depModule);
652-
depMap[load.dependencies[i].key] = depModuleModule;
667+
depMap[i] = depModule.module;
653668
}
654669

655-
// at this point we define the module object
656-
load.module.module = Module(registryEntry.exports);
670+
if (Object.preventExtensions)
671+
Object.preventExtensions(module);
672+
load.status = 'linked';
657673
}
658674

659675

@@ -682,7 +698,7 @@ function logloads(loads) {
682698

683699
// 15.2.6.2 EnsureEvaluated adjusted
684700
function ensureEvaluated(module, seen, loader) {
685-
if (module.evaluated)
701+
if (module.evaluated || !module.dependencies)
686702
return;
687703

688704
seen.push(module);
@@ -778,11 +794,13 @@ function logloads(loads) {
778794
'import': function(name, options) {
779795
// run normalize first
780796
var loaderObj = this;
797+
781798
return new Promise(function(resolve) {
782799
resolve(loaderObj.normalize.call(this, name, options && options.name, options && options.address))
783800
})
784801
.then(function(name) {
785802
var loader = loaderObj._loader;
803+
786804
if (loader.modules[name]) {
787805
ensureEvaluated(loader.modules[name], [], loader._loader);
788806
return Promise.resolve(loader.modules[name].module);
@@ -808,7 +826,7 @@ function logloads(loads) {
808826
return !!this._loader.modules[name];
809827
},
810828
set: function(name, module) {
811-
if (!(module instanceof Module))
829+
if (!(module.__esModule))
812830
throw new TypeError('Set must be a module');
813831
this._loader.modules[name] = {
814832
module: module
@@ -891,10 +909,10 @@ function logloads(loads) {
891909
if (typeof obj != 'object')
892910
throw new TypeError('Expected object');
893911

894-
if (!(this instanceof Module))
895-
return new Module(obj);
912+
var self = {
913+
__esModule: true
914+
};
896915

897-
var self = this;
898916
for (var key in obj) {
899917
(function (key) {
900918
defineProperty(self, key, {
@@ -906,10 +924,12 @@ function logloads(loads) {
906924
});
907925
})(key);
908926
}
909-
if (Object.preventExtensions)
927+
// allow extensibilty to be switched off for gradual binding process
928+
if (!arguments[1] && Object.preventExtensions)
910929
Object.preventExtensions(this);
930+
931+
return self;
911932
}
912-
// Module.prototype = null;
913933

914934

915935
if (typeof exports === 'object')
@@ -923,14 +943,7 @@ function logloads(loads) {
923943
})();
924944

925945
function __eval(__source, global, __moduleName) {
926-
try {
927-
eval('var __moduleName = "' + (__moduleName || '').replace('"', '\"') + '"; with(global) { (function() { ' + __source + ' \n }).call(global); }');
928-
}
929-
catch(e) {
930-
if (e.name == 'SyntaxError')
931-
e.message = 'Evaluating ' + (__sourceURL || __moduleName) + '\n\t' + e.message;
932-
throw e;
933-
}
946+
eval('var __moduleName = "' + (__moduleName || '').replace('"', '\"') + '"; with(global) { (function() { ' + __source + ' \n }).call(global); }');
934947
}
935948

936949
})(typeof global !== 'undefined' ? global : this);

test/syntax/circular1.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { fn } from './circular2';
2+
3+
export var hello = 'world';
4+
5+
fn();
6+
7+
hello = 'another';
8+
9+
fn();

test/syntax/circular2.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { hello } from './circular1';
2+
3+
export function fn() {
4+
if (!global.first)
5+
global.first = hello;
6+
else
7+
global.second = hello;
8+
}

test/syntax/reexport2.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
export { t as q, p as z } from './export';
1+
export { t as q, p as z } from './export';
2+
export default 4;

test/test.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ else {
8282
}
8383

8484
function runTests() {
85+
8586
// Normalize tests - identical to https://github.com/google/traceur-compiler/blob/master/test/unit/runtime/System.js
8687

8788
var oldBaseURL = System.baseURL;
@@ -207,6 +208,15 @@ function runTests() {
207208
}, err);
208209
});
209210

211+
test('Circular Dependencies', function(assert, err) {
212+
System['import']('syntax/circular1').then(function(m) {
213+
assert(
214+
[first, 'world'],
215+
[second, 'another']
216+
);
217+
}, err);
218+
});
219+
210220
test('Load order test: A', function(assert, err) {
211221
System['import']('loads/a').then(function(m) {
212222
assert(
@@ -247,6 +257,7 @@ function runTests() {
247257
);
248258
})
249259
});
260+
250261
test('Load order test: _e', function(assert) {
251262
System['import']('loads/_e').then(function(m) {
252263
assert(
@@ -321,16 +332,15 @@ function runTests() {
321332
});
322333
});
323334

324-
325-
test('ES6 Syntax', function(assert) {
335+
test('ES6 Syntax', function(assert, err) {
326336
System['import']('syntax/es6-file').then(function(m) {
327337
setTimeout(function() {
328338
(new m.q()).foo();
329339
});
330340
assert(
331341
[typeof m.q, 'function']
332342
);
333-
});
343+
}, err);
334344
});
335345

336346
test('Module Name meta', function(assert) {
@@ -442,7 +452,7 @@ function runTests() {
442452
deps: deps,
443453
execute: function() {
444454
if (customModules[load.name])
445-
return new Module(customModules[load.name]);
455+
return Module(customModules[load.name]);
446456

447457
// first ensure all dependencies have been executed
448458
for (var i = 0; i < resolvedDeps.length; i++)

0 commit comments

Comments
 (0)