Fix system transformer to ensure consistent modules iteration (#4832)

* include test for number specifiers

* use ordered modules array over object properties
This commit is contained in:
Henry Zhu 2016-11-14 13:17:54 -05:00 committed by GitHub
commit 62ae3c7ee8
3 changed files with 25 additions and 9 deletions

View File

@ -84,7 +84,7 @@ export default function ({ types: t }) {
let contextIdent = state.contextIdent;
let exportNames = Object.create(null);
let modules = Object.create(null);
let modules = [];
let beforeBody = [];
let setters = [];
@ -98,8 +98,16 @@ export default function ({ types: t }) {
}
function pushModule(source, key, specifiers) {
let _modules = modules[source] = modules[source] || { imports: [], exports: [] };
_modules[key] = _modules[key].concat(specifiers);
let module;
modules.forEach(function (m) {
if (m.key === source) {
module = m;
}
});
if (!module) {
modules.push(module = { key: source, imports: [], exports: [] });
}
module[key] = module[key].concat(specifiers);
}
function buildExportCall(name, val) {
@ -205,11 +213,9 @@ export default function ({ types: t }) {
}
}
for (let source in modules) {
let specifiers = modules[source];
modules.forEach(function (specifiers) {
let setterBody = [];
let target = path.scope.generateUidIdentifier(source);
let target = path.scope.generateUidIdentifier(specifiers.key);
for (let specifier of specifiers.imports) {
if (t.isImportNamespaceSpecifier(specifier)) {
@ -249,9 +255,9 @@ export default function ({ types: t }) {
setterBody.push(t.expressionStatement(t.callExpression(exportIdent, [exportObjRef])));
}
sources.push(t.stringLiteral(source));
sources.push(t.stringLiteral(specifiers.key));
setters.push(t.functionExpression(null, [target], t.blockStatement(setterBody)));
}
});
let moduleName = this.getModuleName();

View File

@ -0,0 +1,2 @@
import "2";
import "1";

View File

@ -0,0 +1,8 @@
System.register(["2", "1"], function (_export, _context) {
"use strict";
return {
setters: [function (_) {}, function (_2) {}],
execute: function () {}
};
});