feature: babel-core: add cloneInputAst (#10241)
Co-authored-by: coderaiser <coderaiser@cloudcmd.io>
This commit is contained in:
@@ -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(
|
||||
@@ -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;
|
||||
|
||||
@@ -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">,
|
||||
>),
|
||||
@@ -184,6 +188,7 @@ export type ValidatedOptions = {
|
||||
rootMode?: RootMode,
|
||||
code?: boolean,
|
||||
ast?: boolean,
|
||||
cloneInputAst?: boolean,
|
||||
inputSourceMap?: RootInputSourceMapOption,
|
||||
envName?: string,
|
||||
caller?: CallerMetadata,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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("", {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user