diff --git a/test/cases/cjs-tree-shaking/bailouts/accessing-call-context.js b/test/cases/cjs-tree-shaking/bailouts/accessing-call-context.js new file mode 100644 index 000000000..1e925b722 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/accessing-call-context.js @@ -0,0 +1,5 @@ +module.exports.func = function f() { + "use strict"; + return this; +}; +module.exports.abc = "abc"; diff --git a/test/cases/cjs-tree-shaking/bailouts/accessing-module.js b/test/cases/cjs-tree-shaking/bailouts/accessing-module.js new file mode 100644 index 000000000..1ae2ff1eb --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/accessing-module.js @@ -0,0 +1,7 @@ +exports.abc = "abc"; + +function f(m) { + m.exports = { abc: "abc", def: "def" }; +} + +f(module); diff --git a/test/cases/cjs-tree-shaking/bailouts/assign-exports-assign.js b/test/cases/cjs-tree-shaking/bailouts/assign-exports-assign.js new file mode 100644 index 000000000..5382b0246 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/assign-exports-assign.js @@ -0,0 +1,6 @@ +exports.abc = "abc"; + +var newObj = {}; +exports = newObj; + +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/bailouts/assign-exports-define.js b/test/cases/cjs-tree-shaking/bailouts/assign-exports-define.js new file mode 100644 index 000000000..416b24a58 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/assign-exports-define.js @@ -0,0 +1,6 @@ +Object.defineProperty(exports, "abc", { value: "abc" }); + +var newObj = {}; +exports = newObj; + +Object.defineProperty(exports, "def", { value: "def" }); diff --git a/test/cases/cjs-tree-shaking/bailouts/define-module-properties.js b/test/cases/cjs-tree-shaking/bailouts/define-module-properties.js new file mode 100644 index 000000000..3e2c0dfb1 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/define-module-properties.js @@ -0,0 +1,10 @@ +exports.abc = "abc"; + +Object.defineProperties(module, { + exports: { + value: { + abc: "abc", + def: "def" + } + } +}); diff --git a/test/cases/cjs-tree-shaking/bailouts/define-module-property.js b/test/cases/cjs-tree-shaking/bailouts/define-module-property.js new file mode 100644 index 000000000..2ec922101 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/define-module-property.js @@ -0,0 +1,8 @@ +exports.abc = "abc"; + +Object.defineProperty(module, "exports", { + value: { + abc: "abc", + def: "def" + } +}); diff --git a/test/cases/cjs-tree-shaking/bailouts/index.js b/test/cases/cjs-tree-shaking/bailouts/index.js new file mode 100644 index 000000000..189c3fefc --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/index.js @@ -0,0 +1,56 @@ +it("should bailout when reading whole exports object from this", () => { + var test = require("./reading-this").test; + expect(test().abc).toBe("abc"); +}); + +it("should bailout when reading whole exports object from exports", () => { + var test = require("./reading-exports").test; + expect(test().abc).toBe("abc"); +}); + +it("should bailout when reading whole exports object from module.exports", () => { + var test = require("./reading-module-exports").test; + expect(test().abc).toBe("abc"); +}); + +it("should reassigning exports (assign values)", () => { + expect(require("./assign-exports-assign").abc).toBe("abc"); + expect(require("./assign-exports-assign").def).toBe(undefined); +}); + +it("should reassigning exports (define values)", () => { + expect(require("./assign-exports-define").abc).toBe("abc"); + expect(require("./assign-exports-define").def).toBe(undefined); +}); + +it("should not mangle or remove nested properties", () => { + expect(require("./nested-property").abc).toBe("abc"); +}); + +it("should be able to access the exports via call context", () => { + expect(require("./accessing-call-context?1").func().abc).toBe("abc"); + var cc = require("./accessing-call-context?2"); + expect(cc.func().abc).toBe("abc"); + var func = require("./accessing-call-context?3").func; + expect(func()).toBe(undefined); +}); + +it("should be able to define an exports property on module (property)", () => { + expect(require("./define-module-property?2").abc).toBe("abc"); + expect(require("./define-module-property?1").def).toBe("def"); +}); + +it("should be able to define an exports property on module (properties)", () => { + expect(require("./define-module-properties?2").abc).toBe("abc"); + expect(require("./define-module-properties?1").def).toBe("def"); +}); + +it("should be able to do stuff with the module object", () => { + expect(require("./accessing-module?2").abc).toBe("abc"); + expect(require("./accessing-module?1").def).toBe("def"); +}); + +it("should be able to use AMD to define exports", () => { + expect(require("./using-amd?2").abc).toBe("abc"); + expect(require("./using-amd?1").def).toBe("def"); +}); diff --git a/test/cases/cjs-tree-shaking/bailouts/nested-property.js b/test/cases/cjs-tree-shaking/bailouts/nested-property.js new file mode 100644 index 000000000..4777d1581 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/nested-property.js @@ -0,0 +1,8 @@ +var abc = {}; + +module.exports = abc; + +module.exports.abc = "abc"; +module.exports.def = "def"; + +expect(abc).toEqual({ abc: "abc", def: "def" }); diff --git a/test/cases/cjs-tree-shaking/bailouts/reading-exports.js b/test/cases/cjs-tree-shaking/bailouts/reading-exports.js new file mode 100644 index 000000000..7c994d85b --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/reading-exports.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = function() { + return exports; +}; diff --git a/test/cases/cjs-tree-shaking/bailouts/reading-module-exports.js b/test/cases/cjs-tree-shaking/bailouts/reading-module-exports.js new file mode 100644 index 000000000..53c6437c5 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/reading-module-exports.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = function() { + return module.exports; +}; diff --git a/test/cases/cjs-tree-shaking/bailouts/reading-this.js b/test/cases/cjs-tree-shaking/bailouts/reading-this.js new file mode 100644 index 000000000..dace36f75 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/reading-this.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = () => { + return this; +}; diff --git a/test/cases/cjs-tree-shaking/bailouts/using-amd.js b/test/cases/cjs-tree-shaking/bailouts/using-amd.js new file mode 100644 index 000000000..28366950f --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/using-amd.js @@ -0,0 +1,5 @@ +exports.abc = "not-abc"; +define({ + abc: "abc", + def: "def" +}); diff --git a/test/cases/cjs-tree-shaking/cjs-to-esm/index.js b/test/cases/cjs-tree-shaking/cjs-to-esm/index.js new file mode 100644 index 000000000..1c5838ace --- /dev/null +++ b/test/cases/cjs-tree-shaking/cjs-to-esm/index.js @@ -0,0 +1,10 @@ +it("should allow to require esm", () => { + expect(require("./module?1").abc).toBe("abc"); + expect(typeof require("./module?2").func).toBe("function"); + // check if a function called with a namespace object as context + // still yield the same optimization, compared to only accessing + // the export + expect(Object.keys(require("./module?3").func())).toEqual( + Object.keys(require.cache[require.resolve("./module?2")].exports) + ); +}); diff --git a/test/cases/cjs-tree-shaking/cjs-to-esm/module.js b/test/cases/cjs-tree-shaking/cjs-to-esm/module.js new file mode 100644 index 000000000..6532d0868 --- /dev/null +++ b/test/cases/cjs-tree-shaking/cjs-to-esm/module.js @@ -0,0 +1,6 @@ +export const abc = "abc"; +export const def = "def"; +export const func = function() { + "use strict"; + return this; +}; diff --git a/test/cases/cjs-tree-shaking/esm-to-cjs/index.js b/test/cases/cjs-tree-shaking/esm-to-cjs/index.js new file mode 100644 index 000000000..71e5362a4 --- /dev/null +++ b/test/cases/cjs-tree-shaking/esm-to-cjs/index.js @@ -0,0 +1,9 @@ +import m1 from "./module?1"; +import m2 from "./module?2"; +import { abc } from "./module?3"; + +it("should allow to import cjs with esm", () => { + expect(m1.abc).toBe("abc"); + expect(m2).toEqual({ abc: "abc", def: "def" }); + expect(abc).toBe("abc"); +}); diff --git a/test/cases/cjs-tree-shaking/esm-to-cjs/module.js b/test/cases/cjs-tree-shaking/esm-to-cjs/module.js new file mode 100644 index 000000000..0d3ae4379 --- /dev/null +++ b/test/cases/cjs-tree-shaking/esm-to-cjs/module.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/assign-exports-property.js b/test/cases/cjs-tree-shaking/exports/assign-exports-property.js new file mode 100644 index 000000000..0d3ae4379 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/assign-exports-property.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/assign-module-exports-property.js b/test/cases/cjs-tree-shaking/exports/assign-module-exports-property.js new file mode 100644 index 000000000..2136b98d7 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/assign-module-exports-property.js @@ -0,0 +1,2 @@ +module.exports.abc = "abc"; +module.exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/assign-this-property.js b/test/cases/cjs-tree-shaking/exports/assign-this-property.js new file mode 100644 index 000000000..37d1ecb94 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/assign-this-property.js @@ -0,0 +1,2 @@ +this.abc = "abc"; +this.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/attach-to-arrow-function.js b/test/cases/cjs-tree-shaking/exports/attach-to-arrow-function.js new file mode 100644 index 000000000..abc9576d2 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/attach-to-arrow-function.js @@ -0,0 +1,3 @@ +module.exports = () => "abc"; + +module.exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/attach-to-function.js b/test/cases/cjs-tree-shaking/exports/attach-to-function.js new file mode 100644 index 000000000..9341f94fd --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/attach-to-function.js @@ -0,0 +1,5 @@ +module.exports = function() { + return "abc"; +}; + +module.exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/attach-to-object.js b/test/cases/cjs-tree-shaking/exports/attach-to-object.js new file mode 100644 index 000000000..43abfd882 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/attach-to-object.js @@ -0,0 +1,5 @@ +module.exports = { + abc: "abc" +}; + +module.exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/define-exports-property.js b/test/cases/cjs-tree-shaking/exports/define-exports-property.js new file mode 100644 index 000000000..8fdaf76e9 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/define-exports-property.js @@ -0,0 +1,2 @@ +Object.defineProperty(exports, "abc", { enumerable: true, value: "abc" }); +Object.defineProperty(exports, "def", { enumerable: true, value: "def" }); diff --git a/test/cases/cjs-tree-shaking/exports/define-module-exports-property.js b/test/cases/cjs-tree-shaking/exports/define-module-exports-property.js new file mode 100644 index 000000000..4ac21240a --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/define-module-exports-property.js @@ -0,0 +1,8 @@ +Object.defineProperty(module.exports, "abc", { + enumerable: true, + value: "abc" +}); +Object.defineProperty(module.exports, "def", { + enumerable: true, + value: "def" +}); diff --git a/test/cases/cjs-tree-shaking/exports/define-this-property.js b/test/cases/cjs-tree-shaking/exports/define-this-property.js new file mode 100644 index 000000000..2cfbf578d --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/define-this-property.js @@ -0,0 +1,2 @@ +Object.defineProperty(this, "abc", { enumerable: true, value: "abc" }); +Object.defineProperty(this, "def", { enumerable: true, value: "def" }); diff --git a/test/cases/cjs-tree-shaking/exports/index.js b/test/cases/cjs-tree-shaking/exports/index.js new file mode 100644 index 000000000..2524d9c11 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/index.js @@ -0,0 +1,83 @@ +it("should allow to export via exports", () => { + expect(require("./assign-exports-property?1").abc).toBe("abc"); + expect(require("./assign-exports-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to export via module.exports", () => { + expect(require("./assign-module-exports-property?1").abc).toBe("abc"); + expect(require("./assign-module-exports-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to export via this", () => { + expect(require("./assign-this-property?1").abc).toBe("abc"); + expect(require("./assign-this-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to export via define property on exports", () => { + expect(require("./define-exports-property?1").abc).toBe("abc"); + expect(require("./define-exports-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to export via define property on module.exports", () => { + expect(require("./define-module-exports-property?1").abc).toBe("abc"); + expect(require("./define-module-exports-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to export via define property on this", () => { + expect(require("./define-this-property?1").abc).toBe("abc"); + expect(require("./define-this-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to read own exports via exports", () => { + var test = require("./reading-self-from-exports").test; + expect(test()).toBe("abc"); +}); + +it("should allow to read own exports via module.exports", () => { + var test = require("./reading-self-from-module-exports").test; + expect(test()).toBe("abc"); +}); + +it("should allow to read own exports via this", () => { + var test = require("./reading-self-from-this").test; + expect(test()).toBe("abc"); +}); + +it("should allow to attach exports to object", () => { + expect(require("./attach-to-object?1").abc).toBe("abc"); + expect(require("./attach-to-object?2").def).toBe("def"); + expect(require("./attach-to-object?3").abc).toBe("abc"); + expect(require("./attach-to-object?3").def).toBe("def"); +}); + +it("should allow to attach exports to function", () => { + expect(require("./attach-to-function?1")()).toBe("abc"); + expect(require("./attach-to-function?2").def).toBe("def"); + expect(require("./attach-to-function?3")()).toBe("abc"); + expect(require("./attach-to-function?3").def).toBe("def"); +}); + +it("should allow to attach exports to arrow function", () => { + expect(require("./attach-to-arrow-function?1")()).toBe("abc"); + expect(require("./attach-to-arrow-function?2").def).toBe("def"); + expect(require("./attach-to-arrow-function?3")()).toBe("abc"); + expect(require("./attach-to-arrow-function?3").def).toBe("def"); +}); diff --git a/test/cases/cjs-tree-shaking/exports/reading-self-from-exports.js b/test/cases/cjs-tree-shaking/exports/reading-self-from-exports.js new file mode 100644 index 000000000..bee3ff361 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/reading-self-from-exports.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = function() { + return exports.abc; +}; diff --git a/test/cases/cjs-tree-shaking/exports/reading-self-from-module-exports.js b/test/cases/cjs-tree-shaking/exports/reading-self-from-module-exports.js new file mode 100644 index 000000000..9b197bfb8 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/reading-self-from-module-exports.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = function() { + return module.exports.abc; +}; diff --git a/test/cases/cjs-tree-shaking/exports/reading-self-from-this.js b/test/cases/cjs-tree-shaking/exports/reading-self-from-this.js new file mode 100644 index 000000000..ee4452148 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/reading-self-from-this.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = () => { + return this.abc; +}; diff --git a/test/cases/cjs-tree-shaking/importing/index.js b/test/cases/cjs-tree-shaking/importing/index.js new file mode 100644 index 000000000..fb044fcad --- /dev/null +++ b/test/cases/cjs-tree-shaking/importing/index.js @@ -0,0 +1,15 @@ +it("should be able to import a module via require and property", () => { + expect(require("./module").abc).toBe("abc"); +}); + +it("should be able to import a module via require and destruct", () => { + var { abc } = require("./module"); + expect(abc).toBe("abc"); +}); + +it("should be able to import a module via require and exports object", () => { + var module1 = require("./module?1"); + expect(module1.abc).toBe("abc"); + var module2 = require("./module?2"); + expect(module2).toEqual({ abc: "abc", def: "def" }); +}); diff --git a/test/cases/cjs-tree-shaking/importing/module.js b/test/cases/cjs-tree-shaking/importing/module.js new file mode 100644 index 000000000..0d3ae4379 --- /dev/null +++ b/test/cases/cjs-tree-shaking/importing/module.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/mutate/index.js b/test/cases/cjs-tree-shaking/mutate/index.js new file mode 100644 index 000000000..cd913b48f --- /dev/null +++ b/test/cases/cjs-tree-shaking/mutate/index.js @@ -0,0 +1,33 @@ +import module1 from "./module?1"; +import module2, { a } from "./module?2"; + +it("should allow mutating imported modules (changing existing exports)", () => { + expect(module1.abc).toBe("abc"); + expect(module1.def).toBe("def"); + module1.abc = "new-abc"; + expect(module1.abc).toBe("new-abc"); + expect(module1.def).toBe("def"); +}); + +it("should allow mutating imported modules (adding new properties)", () => { + expect(module2.abc).toBe("abc"); + expect(module2.def).toBe("def"); + expect(module2.ghi).toBe(undefined); + expect(module2.Oi).toBe(undefined); + expect(module2.a).toBe(undefined); + expect(a).toBe(undefined); + expect(module2[""]).toBe(undefined); + module2.ghi = "ghi"; + module2.Oi = "Oi"; + module2.a = "a"; + module2[""] = {}; + module2[""].abc = "abc"; + expect(module2.abc).toBe("abc"); + expect(module2.def).toBe("def"); + expect(module2.ghi).toBe("ghi"); + expect(module2.Oi).toBe("Oi"); + expect(module2.a).toBe("a"); + expect(a).toBe("a"); + expect(module2[""]).toEqual({ abc: "abc" }); + expect(module2[""].abc).toBe("abc"); +}); diff --git a/test/cases/cjs-tree-shaking/mutate/module.js b/test/cases/cjs-tree-shaking/mutate/module.js new file mode 100644 index 000000000..0d3ae4379 --- /dev/null +++ b/test/cases/cjs-tree-shaking/mutate/module.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/namespace/index.js b/test/cases/cjs-tree-shaking/namespace/index.js new file mode 100644 index 000000000..e4407ae46 --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/index.js @@ -0,0 +1,25 @@ +it("should allow to create namespace exports via __esModule on exports", async () => { + expect(await import("./namespace-via-exports")).toBe( + require("./namespace-via-exports") + ); +}); +it("should allow to create namespace exports via __esModule on literal", async () => { + expect(await import("./namespace-via-literal")).toBe( + require("./namespace-via-literal") + ); +}); +it("should allow to create namespace exports via __esModule with Object.defineProperty", async () => { + expect(await import("./namespace-via-define-property")).toBe( + require("./namespace-via-define-property") + ); +}); +it("should allow to create namespace exports via __esModule with Object.defineProperty minimized true", async () => { + expect(await import("./namespace-via-define-property-minimized")).toBe( + require("./namespace-via-define-property-minimized") + ); +}); +it("should allow to create namespace exports via __esModule with Object.defineProperties", async () => { + expect(await import("./namespace-via-define-properties")).toBe( + require("./namespace-via-define-properties") + ); +}); diff --git a/test/cases/cjs-tree-shaking/namespace/namespace-via-define-properties.js b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-properties.js new file mode 100644 index 000000000..fcf031e86 --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-properties.js @@ -0,0 +1,5 @@ +Object.defineProperties(exports, { + __esModule: { value: true }, + abc: { enumerable: true, value: "abc" }, + default: { enumerable: true, value: "default" } +}); diff --git a/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property-minimized.js b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property-minimized.js new file mode 100644 index 000000000..cd10e84bf --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property-minimized.js @@ -0,0 +1,3 @@ +Object.defineProperty(exports, "__esModule", { value: !0 }); +exports.abc = "abc"; +exports.default = "default"; diff --git a/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property.js b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property.js new file mode 100644 index 000000000..50c67588d --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property.js @@ -0,0 +1,3 @@ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.abc = "abc"; +exports.default = "default"; diff --git a/test/cases/cjs-tree-shaking/namespace/namespace-via-exports.js b/test/cases/cjs-tree-shaking/namespace/namespace-via-exports.js new file mode 100644 index 000000000..92cc687c7 --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/namespace-via-exports.js @@ -0,0 +1,3 @@ +exports.__esModule = true; +exports.abc = "abc"; +exports.default = "default"; \ No newline at end of file diff --git a/test/cases/cjs-tree-shaking/namespace/namespace-via-literal.js b/test/cases/cjs-tree-shaking/namespace/namespace-via-literal.js new file mode 100644 index 000000000..21867372a --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/namespace-via-literal.js @@ -0,0 +1,5 @@ +module.exports = { + __esModule: true, + abc: "abc", + default: "default" +}; diff --git a/test/cases/cjs-tree-shaking/objects/direct-object.js b/test/cases/cjs-tree-shaking/objects/direct-object.js new file mode 100644 index 000000000..f32a5fb07 --- /dev/null +++ b/test/cases/cjs-tree-shaking/objects/direct-object.js @@ -0,0 +1,4 @@ +module.exports = { + abc: "abc", + def: "def" +}; diff --git a/test/cases/cjs-tree-shaking/objects/index.js b/test/cases/cjs-tree-shaking/objects/index.js new file mode 100644 index 000000000..cf9fa76da --- /dev/null +++ b/test/cases/cjs-tree-shaking/objects/index.js @@ -0,0 +1,9 @@ +it("should be able to export an object literal", () => { + expect(require("./direct-object?1").abc).toBe("abc"); + expect(require("./direct-object?2")).toEqual({ abc: "abc", def: "def" }); +}); + +it("should be able to export an object literal indirect", () => { + expect(require("./indirect-object?1").abc).toBe("abc"); + expect(require("./indirect-object?2")).toEqual({ abc: "abc", def: "def" }); +}); diff --git a/test/cases/cjs-tree-shaking/objects/indirect-object.js b/test/cases/cjs-tree-shaking/objects/indirect-object.js new file mode 100644 index 000000000..9df708c91 --- /dev/null +++ b/test/cases/cjs-tree-shaking/objects/indirect-object.js @@ -0,0 +1,6 @@ +var value = { + abc: "abc", + def: "def" +}; + +module.exports = value; diff --git a/test/cases/cjs-tree-shaking/reexports/index.js b/test/cases/cjs-tree-shaking/reexports/index.js new file mode 100644 index 000000000..2fb27e1d3 --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/index.js @@ -0,0 +1,41 @@ +it("should allow to reexport a exports object (this, exports)", () => { + expect(require("./reexport-whole-exports?1").m1.abc).toBe("abc"); + expect(require("./reexport-whole-exports?2").m2.abc).toBe("abc"); + expect(require("./reexport-whole-exports?3").m3.abc).toBe("abc"); + expect(require("./reexport-whole-exports?4").m4.abc).toBe("abc"); +}); + +it("should allow to reexport a exports object (module.exports, object literal)", () => { + expect(require("./reexport-whole-module-exports?1").m1.abc).toBe("abc"); + expect(require("./reexport-whole-module-exports?2").m2.abc).toBe("abc"); + expect(require("./reexport-whole-module-exports?3").m3.abc).toBe("abc"); + expect(require("./reexport-whole-module-exports?4").m4.abc).toBe("abc"); +}); + +it("should allow to reexport a imported property (this, exports)", () => { + expect(require("./reexport-property-exports?1").p1).toBe("abc"); + expect(require("./reexport-property-exports?2").p2).toBe("abc"); + expect(require("./reexport-property-exports?3").p3).toBe("abc"); + expect(require("./reexport-property-exports?4").p4).toBe("abc"); +}); + +it("should allow to reexport a imported property (module.exports, object literal)", () => { + expect(require("./reexport-property-module-exports?1").p1).toBe("abc"); + expect(require("./reexport-property-module-exports?2").p2).toBe("abc"); + expect(require("./reexport-property-module-exports?3").p3).toBe("abc"); + expect(require("./reexport-property-module-exports?4").p4).toBe("abc"); +}); + +it("should allow to reexport a reexported exports object (this, exports)", () => { + expect(require("./reexport-reexport-exports?1").x1.abc).toBe("abc"); + expect(require("./reexport-reexport-exports?2").x2.abc).toBe("abc"); + expect(require("./reexport-reexport-exports?3").x3.abc).toBe("abc"); + expect(require("./reexport-reexport-exports?4").x4.abc).toBe("abc"); +}); + +it("should allow to reexport a reexported exports object (module.exports, object literal)", () => { + expect(require("./reexport-reexport-module-exports?1").x1.abc).toBe("abc"); + expect(require("./reexport-reexport-module-exports?2").x2.abc).toBe("abc"); + expect(require("./reexport-reexport-module-exports?3").x3.abc).toBe("abc"); + expect(require("./reexport-reexport-module-exports?4").x4.abc).toBe("abc"); +}); diff --git a/test/cases/cjs-tree-shaking/reexports/module.js b/test/cases/cjs-tree-shaking/reexports/module.js new file mode 100644 index 000000000..0d3ae4379 --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/module.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-property-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-property-exports.js new file mode 100644 index 000000000..011358abf --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-property-exports.js @@ -0,0 +1,6 @@ +exports.p1 = require("./module?pe1").abc; +var m2 = require("./module?pe2"); +exports.p2 = m2.abc; +this.p3 = require("./module?pe3").abc; +var m4 = require("./module?pe4"); +this.p4 = m4.abc; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-property-module-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-property-module-exports.js new file mode 100644 index 000000000..d08197d67 --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-property-module-exports.js @@ -0,0 +1,8 @@ +var m2 = require("./module?pme2"); +module.exports = { + p1: require("./module?pme1").abc, + p2: m2.abc +}; +module.exports.p3 = require("./module?pme3").abc; +var m4 = require("./module?pme4"); +module.exports.p4 = m4.abc; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-reexport-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-reexport-exports.js new file mode 100644 index 000000000..6bfd379d6 --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-reexport-exports.js @@ -0,0 +1,6 @@ +exports.x1 = require("./reexport-whole-exports?x1").m1; +var m2 = require("./reexport-whole-exports?x2"); +exports.x2 = m2.m2; +this.x3 = require("./reexport-whole-exports?x3").m3; +var m4 = require("./reexport-whole-exports?x4"); +this.x4 = m4.m4; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-reexport-module-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-reexport-module-exports.js new file mode 100644 index 000000000..41c61110b --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-reexport-module-exports.js @@ -0,0 +1,8 @@ +var m2 = require("./reexport-whole-module-exports?x2"); +module.exports = { + x1: require("./reexport-whole-module-exports?x1").m1, + x2: m2.m2 +}; +module.exports.x3 = require("./reexport-whole-module-exports?x3").m3; +var m4 = require("./reexport-whole-module-exports?x4"); +module.exports.x4 = m4.m4; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-whole-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-whole-exports.js new file mode 100644 index 000000000..8fb1a720e --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-whole-exports.js @@ -0,0 +1,6 @@ +exports.m1 = require("./module?we1"); +var m2 = require("./module?we2"); +exports.m2 = m2; +this.m3 = require("./module?we3"); +var m4 = require("./module?we4"); +this.m4 = m4; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-whole-module-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-whole-module-exports.js new file mode 100644 index 000000000..e17157394 --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-whole-module-exports.js @@ -0,0 +1,8 @@ +var m2 = require("./module?wme2"); +module.exports = { + m1: require("./module?wme1"), + m2 +}; +module.exports.m3 = require("./module?wme3"); +var m4 = require("./module?wme4"); +module.exports.m4 = m4; diff --git a/test/cases/cjs-tree-shaking/transpiled/babel-default-interop.js b/test/cases/cjs-tree-shaking/transpiled/babel-default-interop.js new file mode 100644 index 000000000..8accb6fef --- /dev/null +++ b/test/cases/cjs-tree-shaking/transpiled/babel-default-interop.js @@ -0,0 +1,5 @@ +var xxx = _interopRequireDefault(require("./module?2")); +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; +} +module.exports = xxx.default.abc; diff --git a/test/cases/cjs-tree-shaking/transpiled/index.js b/test/cases/cjs-tree-shaking/transpiled/index.js new file mode 100644 index 000000000..d7a8a7e2e --- /dev/null +++ b/test/cases/cjs-tree-shaking/transpiled/index.js @@ -0,0 +1,14 @@ +it("should support typescript export *", () => { + expect(require("./typescript-reexport").abc).toBe("abc"); +}); + +it("should support babel default interop", () => { + var xxx2 = _interopRequireDefault(require("./module?2")); + var xxx3 = _interopRequireDefault(require("./module?3")); + expect(xxx2.default.abc).toBe("abc"); + expect(xxx3.default).toEqual({ abc: "abc", def: "def" }); +}); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; +} diff --git a/test/cases/cjs-tree-shaking/transpiled/module.js b/test/cases/cjs-tree-shaking/transpiled/module.js new file mode 100644 index 000000000..0d3ae4379 --- /dev/null +++ b/test/cases/cjs-tree-shaking/transpiled/module.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/transpiled/typescript-reexport.js b/test/cases/cjs-tree-shaking/transpiled/typescript-reexport.js new file mode 100644 index 000000000..1d623783a --- /dev/null +++ b/test/cases/cjs-tree-shaking/transpiled/typescript-reexport.js @@ -0,0 +1,4 @@ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +__export(require("./module?1")); diff --git a/test/cases/cjs-tree-shaking/weird-names/index.js b/test/cases/cjs-tree-shaking/weird-names/index.js new file mode 100644 index 000000000..453a0120c --- /dev/null +++ b/test/cases/cjs-tree-shaking/weird-names/index.js @@ -0,0 +1,16 @@ +import m from "./module"; + +it("should allow any name as exports in CommonJs", () => { + expect(m.abc).toBe("abc"); + expect(m[""]).toBe(""); + expect(m["default"]).toBe("default"); + expect(m["0"]).toBe("0"); + expect(m[1]).toBe(1); + expect(m.length).toBe("length"); + expect(m["0_0"]).toBe("0_0"); + expect(m.if).toBe("if"); + expect(m["\0"]).toBe("\0"); + expect(m["\n"]).toBe("\n"); + expect(m["*/"]).toBe("*/"); + expect(m["a.b.c"]).toBe("a.b.c"); +}); diff --git a/test/cases/cjs-tree-shaking/weird-names/module.js b/test/cases/cjs-tree-shaking/weird-names/module.js new file mode 100644 index 000000000..af166b755 --- /dev/null +++ b/test/cases/cjs-tree-shaking/weird-names/module.js @@ -0,0 +1,12 @@ +exports.abc = "abc"; +exports[""] = ""; +exports["default"] = "default"; +exports["0"] = "0"; +exports[1] = 1; +exports.length = "length"; +exports["0_0"] = "0_0"; +exports.if = "if"; +exports["\0"] = "\0"; +exports["\n"] = "\n"; +exports["*/"] = "*/"; +exports["a.b.c"] = "a.b.c";