Skip to content

Commit

Permalink
feature: babel-core: add cloneInputAst (#10241)
Browse files Browse the repository at this point in the history
Co-authored-by: coderaiser <coderaiser@cloudcmd.io>
  • Loading branch information
coderaiser and coderaiser committed Jul 29, 2020
1 parent 6373eb5 commit cf425a0
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 1 deletion.
2 changes: 2 additions & 0 deletions packages/babel-core/src/config/partial.js
Expand Up @@ -81,6 +81,7 @@ export default function* loadPrivatePartialConfig(
root: rootDir = ".",
rootMode = "root",
caller,
cloneInputAst = true,
} = args;
const absoluteCwd = path.resolve(cwd);
const absoluteRootDir = yield* resolveRootMode(
Expand Down Expand Up @@ -110,6 +111,7 @@ export default function* loadPrivatePartialConfig(
// Tack the passes onto the object itself so that, if this object is
// passed back to Babel a second time, it will be in the right structure
// to not change behavior.
options.cloneInputAst = cloneInputAst;
options.babelrc = false;
options.configFile = false;
options.passPerPreset = false;
Expand Down
5 changes: 5 additions & 0 deletions packages/babel-core/src/config/validation/options.js
Expand Up @@ -51,6 +51,10 @@ const ROOT_VALIDATORS: ValidatorSet = {
code: (assertBoolean: Validator<$PropertyType<ValidatedOptions, "code">>),
ast: (assertBoolean: Validator<$PropertyType<ValidatedOptions, "ast">>),

cloneInputAst: (assertBoolean: Validator<
$PropertyType<ValidatedOptions, "cloneInputAst">,
>),

envName: (assertString: Validator<
$PropertyType<ValidatedOptions, "envName">,
>),
Expand Down Expand Up @@ -184,6 +188,7 @@ export type ValidatedOptions = {
rootMode?: RootMode,
code?: boolean,
ast?: boolean,
cloneInputAst?: boolean,
inputSourceMap?: RootInputSourceMapOption,
envName?: string,
caller?: CallerMetadata,
Expand Down
6 changes: 5 additions & 1 deletion packages/babel-core/src/transformation/normalize-file.js
Expand Up @@ -34,7 +34,11 @@ export default function* normalizeFile(
} else if (ast.type !== "File") {
throw new Error("AST root must be a Program or File node");
}
ast = cloneDeep(ast);

const { cloneInputAst } = options;
if (cloneInputAst) {
ast = cloneDeep(ast);
}
} else {
ast = yield* parser(pluginPasses, options, code);
}
Expand Down
25 changes: 25 additions & 0 deletions packages/babel-core/test/api.js
Expand Up @@ -214,6 +214,31 @@ describe("api", function () {
);
});

it("transformFromAst should mutate the AST when cloneInputAst is false", function () {
const program = "const identifier = 1";
const node = parse(program);
const { code } = transformFromAst(node, program, {
cloneInputAst: false,
plugins: [
function () {
return {
visitor: {
Identifier: function (path) {
path.node.name = "replaced";
},
},
};
},
],
});

expect(code).toBe("const replaced = 1;");
expect(node.program.body[0].declarations[0].id.name).toBe(
"replaced",
"original ast should have been mutated",
);
});

it("options throw on falsy true", function () {
return expect(function () {
transform("", {
Expand Down
1 change: 1 addition & 0 deletions packages/babel-core/test/config-chain.js
Expand Up @@ -984,6 +984,7 @@ describe("buildConfigChain", function () {
passPerPreset: false,
plugins: [],
presets: [],
cloneInputAst: true,
});
const realEnv = process.env.NODE_ENV;
const realBabelEnv = process.env.BABEL_ENV;
Expand Down

0 comments on commit cf425a0

Please sign in to comment.