diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json index 88623a182b..3d6bafb157 100644 --- a/packages/babel-core/package.json +++ b/packages/babel-core/package.json @@ -43,7 +43,8 @@ "./lib/transform-file.js": "./lib/transform-file-browser.js", "./src/config/files/index.js": "./src/config/files/index-browser.js", "./src/config/resolve-targets.js": "./src/config/resolve-targets-browser.js", - "./src/transform-file.js": "./src/transform-file-browser.js" + "./src/transform-file.js": "./src/transform-file-browser.js", + "./src/transformation/util/clone-deep.js": "./src/transformation/util/clone-deep-browser.js" }, "dependencies": { "@babel/code-frame": "workspace:^7.12.13", diff --git a/packages/babel-core/src/transformation/normalize-file.js b/packages/babel-core/src/transformation/normalize-file.js index aca84e1e4e..b5fd21de25 100644 --- a/packages/babel-core/src/transformation/normalize-file.js +++ b/packages/babel-core/src/transformation/normalize-file.js @@ -3,13 +3,13 @@ import fs from "fs"; import path from "path"; import buildDebug from "debug"; -import cloneDeep from "lodash/cloneDeep"; import type { Handler } from "gensync"; import * as t from "@babel/types"; import type { PluginPasses } from "../config"; import convertSourceMap, { typeof Converter } from "convert-source-map"; import File from "./file/file"; import parser from "../parser"; +import cloneDeep from "./util/clone-deep"; const debug = buildDebug("babel:transform:file"); const LARGE_INPUT_SOURCEMAP_THRESHOLD = 1_000_000; @@ -35,8 +35,7 @@ export default function* normalizeFile( throw new Error("AST root must be a Program or File node"); } - const { cloneInputAst } = options; - if (cloneInputAst) { + if (options.cloneInputAst) { ast = cloneDeep(ast); } } else { diff --git a/packages/babel-core/src/transformation/util/clone-deep-browser.js b/packages/babel-core/src/transformation/util/clone-deep-browser.js new file mode 100644 index 0000000000..78ae53ebf0 --- /dev/null +++ b/packages/babel-core/src/transformation/util/clone-deep-browser.js @@ -0,0 +1,19 @@ +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); +} + +export default function (value) { + return JSON.parse(JSON.stringify(value, serialize), revive); +} diff --git a/packages/babel-core/src/transformation/util/clone-deep.js b/packages/babel-core/src/transformation/util/clone-deep.js new file mode 100644 index 0000000000..cc077ce937 --- /dev/null +++ b/packages/babel-core/src/transformation/util/clone-deep.js @@ -0,0 +1,9 @@ +import v8 from "v8"; +import cloneDeep from "./clone-deep-browser"; + +export default function (value) { + if (v8.deserialize && v8.serialize) { + return v8.deserialize(v8.serialize(value)); + } + return cloneDeep(value); +} diff --git a/packages/babel-helper-fixtures/package.json b/packages/babel-helper-fixtures/package.json index 278082b285..6f1ace3826 100644 --- a/packages/babel-helper-fixtures/package.json +++ b/packages/babel-helper-fixtures/package.json @@ -15,11 +15,9 @@ "homepage": "https://babel.dev/docs/en/next/babel-helper-fixtures", "main": "lib/index.js", "dependencies": { - "lodash": "^4.17.19", "semver": "condition:BABEL_8_BREAKING ? ^7.3.4 : ^6.3.0" }, "devDependencies": { - "@types/lodash": "^4.14.150", "@types/semver": "^7.3.4" } } diff --git a/packages/babel-helper-fixtures/src/index.ts b/packages/babel-helper-fixtures/src/index.ts index a9c58508fd..7463cf0bdc 100644 --- a/packages/babel-helper-fixtures/src/index.ts +++ b/packages/babel-helper-fixtures/src/index.ts @@ -1,4 +1,3 @@ -import cloneDeep from "lodash/cloneDeep"; import semver from "semver"; import path from "path"; import fs from "fs"; @@ -121,7 +120,7 @@ function pushTask(taskName, taskDir, suite, suiteName) { execLocAlias = suiteName + "/" + taskName; } - const taskOpts = cloneDeep(suite.options); + const taskOpts = JSON.parse(JSON.stringify(suite.options)); const taskOptsLoc = tryResolve(taskDir + "/options"); if (taskOptsLoc) Object.assign(taskOpts, require(taskOptsLoc)); diff --git a/packages/babel-traverse/package.json b/packages/babel-traverse/package.json index 74903d031b..789753bd73 100644 --- a/packages/babel-traverse/package.json +++ b/packages/babel-traverse/package.json @@ -23,8 +23,7 @@ "@babel/parser": "workspace:^7.13.0", "@babel/types": "workspace:^7.13.0", "debug": "^4.1.0", - "globals": "condition:BABEL_8_BREAKING ? ^13.5.0 : ^11.1.0", - "lodash": "^4.17.19" + "globals": "condition:BABEL_8_BREAKING ? ^13.5.0 : ^11.1.0" }, "devDependencies": { "@babel/helper-plugin-test-runner": "workspace:*" diff --git a/packages/babel-traverse/test/traverse.js b/packages/babel-traverse/test/traverse.js index adbe705cd2..34c5270d50 100644 --- a/packages/babel-traverse/test/traverse.js +++ b/packages/babel-traverse/test/traverse.js @@ -1,4 +1,3 @@ -import cloneDeep from "lodash/cloneDeep"; import traverse from "../lib"; import { parse } from "@babel/parser"; import * as t from "@babel/types"; @@ -17,7 +16,7 @@ describe("traverse", function () { type: "StringLiteral", value: "foo", }; - const ast2 = cloneDeep(program); + const ast2 = JSON.parse(JSON.stringify(program)); traverse(ast2, { enter: function (path) { diff --git a/yarn.lock b/yarn.lock index d6cb7c9a4c..7101fd75f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -542,9 +542,7 @@ __metadata: version: 0.0.0-use.local resolution: "@babel/helper-fixtures@workspace:packages/babel-helper-fixtures" dependencies: - "@types/lodash": ^4.14.150 "@types/semver": ^7.3.4 - lodash: ^4.17.19 semver: "condition:BABEL_8_BREAKING ? ^7.3.4 : ^6.3.0" languageName: unknown linkType: soft @@ -3470,7 +3468,6 @@ __metadata: "@babel/types": "workspace:^7.13.0" debug: ^4.1.0 globals: "condition:BABEL_8_BREAKING ? ^13.5.0 : ^11.1.0" - lodash: ^4.17.19 languageName: unknown linkType: soft