Skip to content

Commit

Permalink
fix a few edge cases with interop
Browse files Browse the repository at this point in the history
add more test cases
  • Loading branch information
sokra committed Nov 3, 2020
1 parent 7f691aa commit 77aed60
Show file tree
Hide file tree
Showing 14 changed files with 454 additions and 26 deletions.
5 changes: 0 additions & 5 deletions lib/dependencies/HarmonyExportImportedSpecifierDependency.js
Expand Up @@ -244,11 +244,6 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
mode.fakeType = 2;
break;
case "dynamic":
mode = new ExportMode("reexport-fake-namespace-object");
mode.name = name;
mode.partialNamespaceExportInfo = exportInfo;
mode.fakeType = 6;
break;
default:
mode = new ExportMode("reexport-namespace-object");
mode.name = name;
Expand Down
60 changes: 39 additions & 21 deletions lib/optimize/ConcatenatedModule.js
Expand Up @@ -104,6 +104,8 @@ const {
* @property {string} namespaceObjectName
* @property {boolean} interopNamespaceObjectUsed
* @property {string} interopNamespaceObjectName
* @property {boolean} interopNamespaceObject2Used
* @property {string} interopNamespaceObject2Name
* @property {boolean} interopDefaultAccessUsed
* @property {string} interopDefaultAccessName
*/
Expand All @@ -117,6 +119,8 @@ const {
* @property {string} name
* @property {boolean} interopNamespaceObjectUsed
* @property {string} interopNamespaceObjectName
* @property {boolean} interopNamespaceObject2Used
* @property {string} interopNamespaceObject2Name
* @property {boolean} interopDefaultAccessUsed
* @property {string} interopDefaultAccessName
*/
Expand Down Expand Up @@ -241,6 +245,13 @@ const getFinalBinding = (
if (exportName.length === 0) {
switch (exportsType) {
case "default-only":
info.interopNamespaceObject2Used = true;
return {
info,
rawName: info.interopNamespaceObject2Name,
ids: exportName,
exportName
};
case "default-with-named":
info.interopNamespaceObjectUsed = true;
return {
Expand Down Expand Up @@ -1215,12 +1226,7 @@ class ConcatenatedModule extends Module {
break;
}
}
if (
info.module.buildMeta.exportsType === "default" ||
info.module.buildMeta.exportsType === "flagged" ||
info.module.buildMeta.exportsType === "dynamic" ||
!info.module.buildMeta.exportsType
) {
if (info.module.buildMeta.exportsType !== "namespace") {
const externalNameInterop = this.findNewName(
"namespaceObject",
allUsedNames,
Expand All @@ -1230,6 +1236,19 @@ class ConcatenatedModule extends Module {
allUsedNames.add(externalNameInterop);
info.interopNamespaceObjectName = externalNameInterop;
}
if (
info.module.buildMeta.exportsType === "default" &&
info.module.buildMeta.defaultObject !== "redirect"
) {
const externalNameInterop = this.findNewName(
"namespaceObject2",
allUsedNames,
namespaceObjectUsedNames,
info.module.readableIdentifier(requestShortener)
);
allUsedNames.add(externalNameInterop);
info.interopNamespaceObject2Name = externalNameInterop;
}
if (
info.module.buildMeta.exportsType === "dynamic" ||
!info.module.buildMeta.exportsType
Expand Down Expand Up @@ -1477,21 +1496,16 @@ ${defineGetters}`
throw new Error(`Unsupported concatenation entry type ${info.type}`);
}
if (info.interopNamespaceObjectUsed) {
if (info.module.buildMeta.exportsType === "default") {
runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
result.add(
`\nvar ${info.interopNamespaceObjectName} = /*#__PURE__*/${RuntimeGlobals.createFakeNamespaceObject}(${name}, 2);`
);
} else if (
info.module.buildMeta.exportsType === "flagged" ||
info.module.buildMeta.exportsType === "dynamic" ||
!info.module.buildMeta.exportsType
) {
runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
result.add(
`\nvar ${info.interopNamespaceObjectName} = /*#__PURE__*/${RuntimeGlobals.createFakeNamespaceObject}(${name});`
);
}
runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
result.add(
`\nvar ${info.interopNamespaceObjectName} = /*#__PURE__*/${RuntimeGlobals.createFakeNamespaceObject}(${name}, 2);`
);
}
if (info.interopNamespaceObject2Used) {
runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
result.add(
`\nvar ${info.interopNamespaceObject2Name} = /*#__PURE__*/${RuntimeGlobals.createFakeNamespaceObject}(${name});`
);
}
if (info.interopDefaultAccessUsed) {
runtimeRequirements.add(RuntimeGlobals.compatGetDefaultExport);
Expand Down Expand Up @@ -1640,6 +1654,8 @@ ${defineGetters}`
namespaceObjectName: undefined,
interopNamespaceObjectUsed: false,
interopNamespaceObjectName: undefined,
interopNamespaceObject2Used: false,
interopNamespaceObject2Name: undefined,
interopDefaultAccessUsed: false,
interopDefaultAccessName: undefined
};
Expand All @@ -1653,6 +1669,8 @@ ${defineGetters}`
name: undefined,
interopNamespaceObjectUsed: false,
interopNamespaceObjectName: undefined,
interopNamespaceObject2Used: false,
interopNamespaceObject2Name: undefined,
interopDefaultAccessUsed: false,
interopDefaultAccessName: undefined
};
Expand Down
5 changes: 5 additions & 0 deletions test/cases/mjs/cjs-import-default/data.json
@@ -0,0 +1,5 @@
{
"__esModule": true,
"data": "ok",
"default": "default"
}
3 changes: 3 additions & 0 deletions test/cases/mjs/cjs-import-default/dynamic.js
@@ -0,0 +1,3 @@
exports.__esModule = Math.random() < -1;
exports.data = "ok";
exports.default = "default";
3 changes: 3 additions & 0 deletions test/cases/mjs/cjs-import-default/dynamicFlagged.js
@@ -0,0 +1,3 @@
exports.__esModule = Math.random() > -1;
exports.data = "ok";
exports.default = "default";
3 changes: 3 additions & 0 deletions test/cases/mjs/cjs-import-default/flagged.js
@@ -0,0 +1,3 @@
exports.__esModule = true;
exports.data = "ok";
exports.default = "default";
180 changes: 180 additions & 0 deletions test/cases/mjs/cjs-import-default/index.mjs
Expand Up @@ -9,6 +9,21 @@ import {
} from "./reexport.mjs";
import * as reexport from "./reexport.mjs";

import { data as dynamicData } from "./dynamic.js";
import * as dynamicStar from "./dynamic.js";
import dynamicDef from "./dynamic.js";

import { data as flaggedData } from "./flagged.js";
import * as flaggedStar from "./flagged.js";
import flaggedDef from "./flagged.js";

import { data as dynamicFlaggedData } from "./dynamicFlagged.js";
import * as dynamicFlaggedStar from "./dynamicFlagged.js";
import dynamicFlaggedDef from "./dynamicFlagged.js";

import * as jsonStar from "./data.json";
import jsonDef from "./data.json";

it("should get correct values when importing named exports from a CommonJs module from mjs", function () {
expect(typeof data).toBe("string");
expect({ data }).toEqual({ data: "ok" });
Expand Down Expand Up @@ -62,6 +77,7 @@ it("should get correct values when importing named exports from a CommonJs modul
default: "default"
});
expect(typeof data2).toBe("string");
expect({ data2 }).toEqual({ data2: "ok" });
expect(reexport).toEqual(
nsObj({
ns: nsObj({
Expand All @@ -83,3 +99,167 @@ it("should get correct values when importing named exports from a CommonJs modul
})
);
});

it("should get correct values when importing named exports from a flagged module from mjs", function () {
expect(typeof flaggedData).toBe("string");
expect({ flaggedData }).toEqual({ flaggedData: "ok" });
expect(flaggedDef).toEqual({
__esModule: true,
data: "ok",
default: "default"
});
expect({ flaggedDef }).toEqual({
flaggedDef: {
__esModule: true,
data: "ok",
default: "default"
}
});
expect(flaggedStar).toEqual(
nsObj({
default: {
__esModule: true,
data: "ok",
default: "default"
},
data: "ok"
})
);
expect({ flaggedStar }).toEqual({
flaggedStar: nsObj({
default: {
__esModule: true,
data: "ok",
default: "default"
},
data: "ok"
})
});
expect(flaggedStar.default).toEqual({
__esModule: true,
data: "ok",
default: "default"
});
});

it("should get correct values when importing named exports from a dynamic (non-flagged) module from mjs", function () {
expect(typeof dynamicData).toBe("string");
expect({ dynamicData }).toEqual({ dynamicData: "ok" });
expect(dynamicDef).toEqual({
__esModule: false,
data: "ok",
default: "default"
});
expect({ dynamicDef }).toEqual({
dynamicDef: {
__esModule: false,
data: "ok",
default: "default"
}
});
expect(dynamicStar).toEqual(
nsObj({
default: {
__esModule: false,
data: "ok",
default: "default"
},
data: "ok"
})
);
expect({ dynamicStar }).toEqual({
dynamicStar: nsObj({
default: {
__esModule: false,
data: "ok",
default: "default"
},
data: "ok"
})
});
expect(dynamicStar.default).toEqual({
__esModule: false,
data: "ok",
default: "default"
});
});

it("should get correct values when importing named exports from a dynamic (flagged) module from mjs", function () {
expect(typeof dynamicFlaggedData).toBe("string");
expect({ dynamicFlaggedData }).toEqual({ dynamicFlaggedData: "ok" });
expect(dynamicFlaggedDef).toEqual({
__esModule: true,
data: "ok",
default: "default"
});
expect({ dynamicFlaggedDef }).toEqual({
dynamicFlaggedDef: {
__esModule: true,
data: "ok",
default: "default"
}
});
expect(dynamicFlaggedStar).toEqual(
nsObj({
default: {
__esModule: true,
data: "ok",
default: "default"
},
data: "ok"
})
);
expect({ dynamicFlaggedStar }).toEqual({
dynamicFlaggedStar: nsObj({
default: {
__esModule: true,
data: "ok",
default: "default"
},
data: "ok"
})
});
expect(dynamicFlaggedStar.default).toEqual({
__esModule: true,
data: "ok",
default: "default"
});
});

it("should get correct values when importing named exports from a default-only module from mjs", function () {
expect(jsonDef).toEqual({
__esModule: true,
data: "ok",
default: "default"
});
expect({ jsonDef }).toEqual({
jsonDef: {
__esModule: true,
data: "ok",
default: "default"
}
});
expect(jsonStar).toEqual(
nsObj({
default: {
__esModule: true,
data: "ok",
default: "default"
}
})
);
expect({ jsonStar }).toEqual({
jsonStar: nsObj({
default: {
__esModule: true,
data: "ok",
default: "default"
}
})
});
expect(jsonStar.default).toEqual({
__esModule: true,
data: "ok",
default: "default"
});
});
4 changes: 4 additions & 0 deletions test/cases/mjs/non-mjs-cjs-import-default/cjs.js
@@ -0,0 +1,4 @@
module.exports = {
data: "ok",
default: "default"
};
5 changes: 5 additions & 0 deletions test/cases/mjs/non-mjs-cjs-import-default/data.json
@@ -0,0 +1,5 @@
{
"__esModule": true,
"data": "ok",
"default": "default"
}
3 changes: 3 additions & 0 deletions test/cases/mjs/non-mjs-cjs-import-default/dynamic.js
@@ -0,0 +1,3 @@
exports.__esModule = Math.random() < -1;
exports.data = "ok";
exports.default = "default";
3 changes: 3 additions & 0 deletions test/cases/mjs/non-mjs-cjs-import-default/dynamicFlagged.js
@@ -0,0 +1,3 @@
exports.__esModule = Math.random() > -1;
exports.data = "ok";
exports.default = "default";
3 changes: 3 additions & 0 deletions test/cases/mjs/non-mjs-cjs-import-default/flagged.js
@@ -0,0 +1,3 @@
exports.__esModule = true;
exports.data = "ok";
exports.default = "default";

0 comments on commit 77aed60

Please sign in to comment.