From 64961e057b9af1f8c038ffc8b1c36914884c4c82 Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Mon, 23 May 2022 08:59:52 +0800 Subject: [PATCH 1/7] fix --- packages/babel-core/package.json | 1 + .../transformation/util/clone-deep-browser.ts | 18 ++---------------- .../src/transformation/util/clone-deep.ts | 9 +++++++-- yarn.lock | 1 + 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json index f2bad3f46361..4675f6856719 100644 --- a/packages/babel-core/package.json +++ b/packages/babel-core/package.json @@ -62,6 +62,7 @@ "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.1", + "lodash.clonedeep": "^4.5.0", "semver": "condition:BABEL_8_BREAKING ? ^7.3.4 : ^6.3.0" }, "devDependencies": { diff --git a/packages/babel-core/src/transformation/util/clone-deep-browser.ts b/packages/babel-core/src/transformation/util/clone-deep-browser.ts index 78ae53ebf087..f790e20046ca 100644 --- a/packages/babel-core/src/transformation/util/clone-deep-browser.ts +++ b/packages/babel-core/src/transformation/util/clone-deep-browser.ts @@ -1,19 +1,5 @@ -const serialized = "$$ babel internal serialized type" + Math.random(); - -function serialize(key, value) { - if (typeof value !== "bigint") return value; - return { - [serialized]: "BigInt", - value: value.toString(), - }; -} - -function revive(key, value) { - if (!value || typeof value !== "object") return value; - if (value[serialized] !== "BigInt") return value; - return BigInt(value.value); -} +import cloneDeep from "lodash.clonedeep"; export default function (value) { - return JSON.parse(JSON.stringify(value, serialize), revive); + return cloneDeep(value); } diff --git a/packages/babel-core/src/transformation/util/clone-deep.ts b/packages/babel-core/src/transformation/util/clone-deep.ts index cc077ce937c1..c1ce7f0aa0f4 100644 --- a/packages/babel-core/src/transformation/util/clone-deep.ts +++ b/packages/babel-core/src/transformation/util/clone-deep.ts @@ -1,8 +1,13 @@ import v8 from "v8"; -import cloneDeep from "./clone-deep-browser"; +import cloneDeep from "lodash.clonedeep"; +import semver from "semver"; export default function (value) { - if (v8.deserialize && v8.serialize) { + if ( + v8.deserialize && + v8.serialize && + semver.satisfies(process.versions.node, ">=18.2.0") + ) { return v8.deserialize(v8.serialize(value)); } return cloneDeep(value); diff --git a/yarn.lock b/yarn.lock index 3c8958ee30c7..d01701960630 100644 --- a/yarn.lock +++ b/yarn.lock @@ -343,6 +343,7 @@ __metadata: debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.1 + lodash.clonedeep: ^4.5.0 semver: "condition:BABEL_8_BREAKING ? ^7.3.4 : ^6.3.0" languageName: unknown linkType: soft From 558270c55f3057d713bc82a5e3d392ba4dd37694 Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Wed, 25 May 2022 20:07:14 +0800 Subject: [PATCH 2/7] review --- packages/babel-core/src/transformation/util/clone-deep.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/babel-core/src/transformation/util/clone-deep.ts b/packages/babel-core/src/transformation/util/clone-deep.ts index c1ce7f0aa0f4..12ffaf024452 100644 --- a/packages/babel-core/src/transformation/util/clone-deep.ts +++ b/packages/babel-core/src/transformation/util/clone-deep.ts @@ -3,6 +3,8 @@ import cloneDeep from "lodash.clonedeep"; import semver from "semver"; export default function (value) { + // There was a memory leak prior to node 18.2.0 + // https://github.com/nodejs/node/issues/40828 if ( v8.deserialize && v8.serialize && From 3c536878671df364a44e1131721032a9307429f7 Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Wed, 25 May 2022 23:24:01 +0800 Subject: [PATCH 3/7] review --- packages/babel-core/package.json | 2 +- .../babel-core/src/transformation/util/clone-deep-browser.ts | 2 +- packages/babel-core/src/transformation/util/clone-deep.ts | 2 +- yarn.lock | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json index 4675f6856719..0bd096531961 100644 --- a/packages/babel-core/package.json +++ b/packages/babel-core/package.json @@ -58,11 +58,11 @@ "@babel/template": "workspace:^", "@babel/traverse": "workspace:^", "@babel/types": "workspace:^", + "clone-deep": "^4.0.1", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.1", - "lodash.clonedeep": "^4.5.0", "semver": "condition:BABEL_8_BREAKING ? ^7.3.4 : ^6.3.0" }, "devDependencies": { diff --git a/packages/babel-core/src/transformation/util/clone-deep-browser.ts b/packages/babel-core/src/transformation/util/clone-deep-browser.ts index f790e20046ca..f375bbaf3f1c 100644 --- a/packages/babel-core/src/transformation/util/clone-deep-browser.ts +++ b/packages/babel-core/src/transformation/util/clone-deep-browser.ts @@ -1,4 +1,4 @@ -import cloneDeep from "lodash.clonedeep"; +import cloneDeep from "clone-deep"; export default function (value) { return cloneDeep(value); diff --git a/packages/babel-core/src/transformation/util/clone-deep.ts b/packages/babel-core/src/transformation/util/clone-deep.ts index 12ffaf024452..d04e8cf2dc38 100644 --- a/packages/babel-core/src/transformation/util/clone-deep.ts +++ b/packages/babel-core/src/transformation/util/clone-deep.ts @@ -1,5 +1,5 @@ import v8 from "v8"; -import cloneDeep from "lodash.clonedeep"; +import cloneDeep from "clone-deep"; import semver from "semver"; export default function (value) { diff --git a/yarn.lock b/yarn.lock index d01701960630..6d876f93baf0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -339,11 +339,11 @@ __metadata: "@types/debug": ^4.1.0 "@types/resolve": ^1.3.2 "@types/semver": ^5.4.0 + clone-deep: ^4.0.1 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.1 - lodash.clonedeep: ^4.5.0 semver: "condition:BABEL_8_BREAKING ? ^7.3.4 : ^6.3.0" languageName: unknown linkType: soft From 58de55b4ac14fb64fc9fe1c3bee7e4384de44ef0 Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Fri, 27 May 2022 23:23:37 +0800 Subject: [PATCH 4/7] fix and rebase --- packages/babel-core/package.json | 5 +-- .../transformation/util/clone-deep-browser.ts | 5 --- .../src/transformation/util/clone-deep.ts | 42 +++++++++++++------ packages/babel-core/test/api.js | 40 +++++++++++++++++- yarn.lock | 1 - 5 files changed, 69 insertions(+), 24 deletions(-) delete mode 100644 packages/babel-core/src/transformation/util/clone-deep-browser.ts diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json index 0bd096531961..2460b44837e1 100644 --- a/packages/babel-core/package.json +++ b/packages/babel-core/package.json @@ -41,11 +41,9 @@ "./lib/config/files/index.js": "./lib/config/files/index-browser.js", "./lib/config/resolve-targets.js": "./lib/config/resolve-targets-browser.js", "./lib/transform-file.js": "./lib/transform-file-browser.js", - "./lib/transformation/util/clone-deep.js": "./lib/transformation/util/clone-deep-browser.js", "./src/config/files/index.ts": "./src/config/files/index-browser.ts", "./src/config/resolve-targets.ts": "./src/config/resolve-targets-browser.ts", - "./src/transform-file.ts": "./src/transform-file-browser.ts", - "./src/transformation/util/clone-deep.ts": "./src/transformation/util/clone-deep-browser.ts" + "./src/transform-file.ts": "./src/transform-file-browser.ts" }, "dependencies": { "@ampproject/remapping": "^2.1.0", @@ -58,7 +56,6 @@ "@babel/template": "workspace:^", "@babel/traverse": "workspace:^", "@babel/types": "workspace:^", - "clone-deep": "^4.0.1", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", diff --git a/packages/babel-core/src/transformation/util/clone-deep-browser.ts b/packages/babel-core/src/transformation/util/clone-deep-browser.ts deleted file mode 100644 index f375bbaf3f1c..000000000000 --- a/packages/babel-core/src/transformation/util/clone-deep-browser.ts +++ /dev/null @@ -1,5 +0,0 @@ -import cloneDeep from "clone-deep"; - -export default function (value) { - return cloneDeep(value); -} diff --git a/packages/babel-core/src/transformation/util/clone-deep.ts b/packages/babel-core/src/transformation/util/clone-deep.ts index d04e8cf2dc38..25e607dd7f65 100644 --- a/packages/babel-core/src/transformation/util/clone-deep.ts +++ b/packages/babel-core/src/transformation/util/clone-deep.ts @@ -1,16 +1,32 @@ -import v8 from "v8"; -import cloneDeep from "clone-deep"; -import semver from "semver"; +//https://github.com/babel/babel/pull/14583#discussion_r882828856 +function deepClone(value, cache) { + if (value !== null) { + if (cache.has(value)) return cache.get(value); + let cloned; + if (Array.isArray(value)) { + cloned = new Array(value.length); + for (let i = 0; i < value.length; i++) { + cloned[i] = + typeof value[i] !== "object" ? value[i] : deepClone(value[i], cache); + } + } else { + cloned = {}; + const keys = Object.keys(value); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + cloned[key] = + typeof value[key] !== "object" + ? value[key] + : deepClone(value[key], cache); + } + } + cache.set(value, cloned); + return cloned; + } + return value; +} export default function (value) { - // There was a memory leak prior to node 18.2.0 - // https://github.com/nodejs/node/issues/40828 - if ( - v8.deserialize && - v8.serialize && - semver.satisfies(process.versions.node, ">=18.2.0") - ) { - return v8.deserialize(v8.serialize(value)); - } - return cloneDeep(value); + if (typeof value !== "object") return value; + return deepClone(value, new Map()); } diff --git a/packages/babel-core/test/api.js b/packages/babel-core/test/api.js index 39ec12d2740e..3b116014ae71 100644 --- a/packages/babel-core/test/api.js +++ b/packages/babel-core/test/api.js @@ -261,7 +261,45 @@ describe("api", function () { }, ); - it("transformFromAstSync should not mutate the AST", function () { + it("transformFromAst should generate same code with different cloneInputAst", function () { + const program = `//test1 + /*test2*/var/*test3*/ a = 1/*test4*/;//test5 + //test6 + var b; + `; + const node = parse(program); + const { code } = transformFromAst(node, program, { + plugins: [ + function () { + return { + visitor: { + Identifier: function (path) { + path.node.name = "replaced"; + }, + }, + }; + }, + ], + }); + const { code: code2 } = transformFromAst(node, program, { + cloneInputAst: false, + plugins: [ + function () { + return { + visitor: { + Identifier: function (path) { + path.node.name = "replaced"; + }, + }, + }; + }, + ], + }); + + expect(code).toBe(code2); + }); + + it("transformFromAst should not mutate the AST", function () { const program = "const identifier = 1"; const node = parseSync(program); const { code } = transformFromAstSync(node, program, { diff --git a/yarn.lock b/yarn.lock index 6d876f93baf0..3c8958ee30c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -339,7 +339,6 @@ __metadata: "@types/debug": ^4.1.0 "@types/resolve": ^1.3.2 "@types/semver": ^5.4.0 - clone-deep: ^4.0.1 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 From 41c45ff05b2740f1b4b045e8459300e5e97e434e Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Wed, 1 Jun 2022 02:29:01 +0800 Subject: [PATCH 5/7] improve typing --- packages/babel-core/src/transformation/util/clone-deep.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/babel-core/src/transformation/util/clone-deep.ts b/packages/babel-core/src/transformation/util/clone-deep.ts index 25e607dd7f65..7586ede32f5d 100644 --- a/packages/babel-core/src/transformation/util/clone-deep.ts +++ b/packages/babel-core/src/transformation/util/clone-deep.ts @@ -1,8 +1,10 @@ +import type { types } from "@babel/core"; + //https://github.com/babel/babel/pull/14583#discussion_r882828856 -function deepClone(value, cache) { +function deepClone(value: any, cache: Map): any { if (value !== null) { if (cache.has(value)) return cache.get(value); - let cloned; + let cloned: any; if (Array.isArray(value)) { cloned = new Array(value.length); for (let i = 0; i < value.length; i++) { @@ -26,7 +28,7 @@ function deepClone(value, cache) { return value; } -export default function (value) { +export default function (value: T): T { if (typeof value !== "object") return value; return deepClone(value, new Map()); } From 9de45fcf86d7a751d3e4c546cefe28e2f0c32a15 Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Thu, 2 Jun 2022 01:32:18 +0800 Subject: [PATCH 6/7] review --- packages/babel-core/src/transformation/util/clone-deep.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/babel-core/src/transformation/util/clone-deep.ts b/packages/babel-core/src/transformation/util/clone-deep.ts index 7586ede32f5d..6d9fc30c302d 100644 --- a/packages/babel-core/src/transformation/util/clone-deep.ts +++ b/packages/babel-core/src/transformation/util/clone-deep.ts @@ -1,5 +1,3 @@ -import type { types } from "@babel/core"; - //https://github.com/babel/babel/pull/14583#discussion_r882828856 function deepClone(value: any, cache: Map): any { if (value !== null) { @@ -28,7 +26,7 @@ function deepClone(value: any, cache: Map): any { return value; } -export default function (value: T): T { +export default function (value: T): T { if (typeof value !== "object") return value; return deepClone(value, new Map()); } From b001812365fc4432aafdaf24eb7d0f52e2db2cca Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Sat, 11 Jun 2022 20:32:32 +0800 Subject: [PATCH 7/7] fix test --- packages/babel-core/test/api.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/babel-core/test/api.js b/packages/babel-core/test/api.js index 3b116014ae71..f7bd191f9c5a 100644 --- a/packages/babel-core/test/api.js +++ b/packages/babel-core/test/api.js @@ -267,8 +267,8 @@ describe("api", function () { //test6 var b; `; - const node = parse(program); - const { code } = transformFromAst(node, program, { + const node = parseSync(program); + const { code } = transformFromAstSync(node, program, { plugins: [ function () { return { @@ -281,7 +281,7 @@ describe("api", function () { }, ], }); - const { code: code2 } = transformFromAst(node, program, { + const { code: code2 } = transformFromAstSync(node, program, { cloneInputAst: false, plugins: [ function () {