From f5ceceddf28d5abe04fb351e43bc138001d21394 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Sun, 1 Oct 2023 13:11:58 +0800 Subject: [PATCH 1/4] fix: handle `__proto__` exports name in CJS/AMD/UMD --- .../src/index.ts | 12 ++++++-- .../fixtures/amd/export-named-6/input.mjs | 7 +++++ .../fixtures/amd/export-named-6/output.js | 16 +++++++++++ .../fixtures/interop/export-named-6/input.mjs | 7 +++++ .../fixtures/interop/export-named-6/output.js | 15 ++++++++++ .../fixtures/umd/export-named-6/input.mjs | 7 +++++ .../fixtures/umd/export-named-6/output.js | 28 +++++++++++++++++++ 7 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/input.mjs create mode 100644 packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/output.js create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/output.js create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/input.mjs create mode 100644 packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/output.js diff --git a/packages/babel-helper-module-transforms/src/index.ts b/packages/babel-helper-module-transforms/src/index.ts index 5afadb10322b..f7671e3197e7 100644 --- a/packages/babel-helper-module-transforms/src/index.ts +++ b/packages/babel-helper-module-transforms/src/index.ts @@ -557,8 +557,11 @@ function buildExportInitializationStatements( const InitTemplate = { computed: template.expression`EXPORTS["NAME"] = VALUE`, default: template.expression`EXPORTS.NAME = VALUE`, + define: template.expression`Object.defineProperty(EXPORTS, "NAME", { enumerable:true, writable: true, value: void 0 })["NAME"] = VALUE`, }; +const shouldUseDefineProperty = new Set(["__proto__"]); + function buildInitStatement( metadata: ModuleMetadata, exportNames: string[], @@ -572,11 +575,16 @@ function buildInitStatement( NAME: exportName, VALUE: acc, }; + + if (shouldUseDefineProperty.has(exportName)) { + return InitTemplate.define(params); + } + if (stringSpecifiers.has(exportName)) { return InitTemplate.computed(params); - } else { - return InitTemplate.default(params); } + + return InitTemplate.default(params); }, initExpr), ); } diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/input.mjs b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/input.mjs new file mode 100644 index 000000000000..ad32511b6dff --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/input.mjs @@ -0,0 +1,7 @@ +export const __proto__ = null; +export const a = 1; +export const _ = 2; + +import { __proto__ as p } from "./input.js"; + +console.log(p); diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/output.js new file mode 100644 index 000000000000..25c641f61eea --- /dev/null +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/output.js @@ -0,0 +1,16 @@ +define(["exports", "./input.js"], function (_exports, _input) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + _exports.a = Object.defineProperty(_exports, "__proto__", { + enumerable: true, + writable: true, + value: void 0 + })["__proto__"] = _exports._ = void 0; + const __proto__ = _exports.__proto__ = null; + const a = _exports.a = 1; + const _ = _exports._ = 2; + console.log(_input.__proto__); +}); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/input.mjs new file mode 100644 index 000000000000..ad32511b6dff --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/input.mjs @@ -0,0 +1,7 @@ +export const __proto__ = null; +export const a = 1; +export const _ = 2; + +import { __proto__ as p } from "./input.js"; + +console.log(p); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/output.js new file mode 100644 index 000000000000..92bffb6a22a7 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/output.js @@ -0,0 +1,15 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.a = Object.defineProperty(exports, "__proto__", { + enumerable: true, + writable: true, + value: void 0 +})["__proto__"] = exports._ = void 0; +var _input = require("./input.js"); +const __proto__ = exports.__proto__ = null; +const a = exports.a = 1; +const _ = exports._ = 2; +console.log(_input.__proto__); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/input.mjs b/packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/input.mjs new file mode 100644 index 000000000000..ad32511b6dff --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/input.mjs @@ -0,0 +1,7 @@ +export const __proto__ = null; +export const a = 1; +export const _ = 2; + +import { __proto__ as p } from "./input.js"; + +console.log(p); diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/output.js new file mode 100644 index 000000000000..04461c730a6f --- /dev/null +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/output.js @@ -0,0 +1,28 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(["exports", "./input.js"], factory); + } else if (typeof exports !== "undefined") { + factory(exports, require("./input.js")); + } else { + var mod = { + exports: {} + }; + factory(mod.exports, global.input); + global.input = mod.exports; + } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _input) { + "use strict"; + + Object.defineProperty(_exports, "__esModule", { + value: true + }); + _exports.a = Object.defineProperty(_exports, "__proto__", { + enumerable: true, + writable: true, + value: void 0 + })["__proto__"] = _exports._ = void 0; + const __proto__ = _exports.__proto__ = null; + const a = _exports.a = 1; + const _ = _exports._ = 2; + console.log(_input.__proto__); +}); From 880d48ac2a9ad99efeccb44e39709a03501d12ac Mon Sep 17 00:00:00 2001 From: magic-akari Date: Mon, 2 Oct 2023 10:36:03 +0800 Subject: [PATCH 2/4] chore: only compare with `__proto__` --- packages/babel-helper-module-transforms/src/index.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/babel-helper-module-transforms/src/index.ts b/packages/babel-helper-module-transforms/src/index.ts index f7671e3197e7..f03d6d831131 100644 --- a/packages/babel-helper-module-transforms/src/index.ts +++ b/packages/babel-helper-module-transforms/src/index.ts @@ -560,8 +560,6 @@ const InitTemplate = { define: template.expression`Object.defineProperty(EXPORTS, "NAME", { enumerable:true, writable: true, value: void 0 })["NAME"] = VALUE`, }; -const shouldUseDefineProperty = new Set(["__proto__"]); - function buildInitStatement( metadata: ModuleMetadata, exportNames: string[], @@ -576,7 +574,7 @@ function buildInitStatement( VALUE: acc, }; - if (shouldUseDefineProperty.has(exportName)) { + if (exportName === "__proto__") { return InitTemplate.define(params); } From 384c8617995d7a801618f577b57e836d478db0ec Mon Sep 17 00:00:00 2001 From: magic-akari Date: Mon, 2 Oct 2023 14:35:57 +0800 Subject: [PATCH 3/4] chore: use `cjs-module-lexer` friendly syntax --- packages/babel-helper-module-transforms/src/index.ts | 2 +- .../test/fixtures/amd/export-named-6/output.js | 4 ++-- .../test/fixtures/interop/export-named-6/output.js | 4 ++-- .../test/fixtures/umd/export-named-6/output.js | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/babel-helper-module-transforms/src/index.ts b/packages/babel-helper-module-transforms/src/index.ts index f03d6d831131..c97478489409 100644 --- a/packages/babel-helper-module-transforms/src/index.ts +++ b/packages/babel-helper-module-transforms/src/index.ts @@ -557,7 +557,7 @@ function buildExportInitializationStatements( const InitTemplate = { computed: template.expression`EXPORTS["NAME"] = VALUE`, default: template.expression`EXPORTS.NAME = VALUE`, - define: template.expression`Object.defineProperty(EXPORTS, "NAME", { enumerable:true, writable: true, value: void 0 })["NAME"] = VALUE`, + define: template.expression`Object.defineProperty(EXPORTS, "NAME", { enumerable:true, value: void 0, writable: true })["NAME"] = VALUE`, }; function buildInitStatement( diff --git a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/output.js b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/output.js index 25c641f61eea..c949667b6689 100644 --- a/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/output.js +++ b/packages/babel-plugin-transform-modules-amd/test/fixtures/amd/export-named-6/output.js @@ -6,8 +6,8 @@ define(["exports", "./input.js"], function (_exports, _input) { }); _exports.a = Object.defineProperty(_exports, "__proto__", { enumerable: true, - writable: true, - value: void 0 + value: void 0, + writable: true })["__proto__"] = _exports._ = void 0; const __proto__ = _exports.__proto__ = null; const a = _exports.a = 1; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/output.js index 92bffb6a22a7..4cd7cd9b1237 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-named-6/output.js @@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", { }); exports.a = Object.defineProperty(exports, "__proto__", { enumerable: true, - writable: true, - value: void 0 + value: void 0, + writable: true })["__proto__"] = exports._ = void 0; var _input = require("./input.js"); const __proto__ = exports.__proto__ = null; diff --git a/packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/output.js b/packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/output.js index 04461c730a6f..a55e0f9a6e79 100644 --- a/packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/output.js +++ b/packages/babel-plugin-transform-modules-umd/test/fixtures/umd/export-named-6/output.js @@ -18,8 +18,8 @@ }); _exports.a = Object.defineProperty(_exports, "__proto__", { enumerable: true, - writable: true, - value: void 0 + value: void 0, + writable: true })["__proto__"] = _exports._ = void 0; const __proto__ = _exports.__proto__ = null; const a = _exports.a = 1; From 7dee9517ac18fd6886b988310bb17969049a2fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Fri, 13 Oct 2023 15:26:41 +0900 Subject: [PATCH 4/4] Add test for `export ... from` --- .../test/fixtures/interop/export-from-9/input.mjs | 1 + .../test/fixtures/interop/export-from-9/output.js | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-from-9/input.mjs create mode 100644 packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-from-9/output.js diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-from-9/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-from-9/input.mjs new file mode 100644 index 000000000000..40d9d349b170 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-from-9/input.mjs @@ -0,0 +1 @@ +export { __proto__ } from "xyz"; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-from-9/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-from-9/output.js new file mode 100644 index 000000000000..e60cb7be5f2c --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/export-from-9/output.js @@ -0,0 +1,12 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "__proto__", { + enumerable: true, + get: function () { + return _xyz.__proto__; + } +}); +var _xyz = require("xyz");