Allow templates to parse v8intrinsics (#11695)

* Allow templates to parse v8intrinsics

The `v8intrinsic` and `placeholders` parser plugins conflict, so enabling `placeholders` unconditionally was causing errors for V8's internal codemods. This allows them to set `syntacticPlaceholders = false` (so they'll use the legacy identifier format) and enable `v8intrinsic` by itself.

* Fix linter

* Linter
This commit is contained in:
Justin Ridgewell 2020-06-10 14:50:09 -04:00 committed by GitHub
parent 36f9798f42
commit 3fba9710dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 3 deletions

View File

@ -27,8 +27,6 @@ export default function parseAndBuildMetadata<T>(
code: string,
opts: TemplateOpts,
): Metadata {
const ast = parseWithCodeFrame(code, opts.parser);
const {
placeholderWhitelist,
placeholderPattern,
@ -36,6 +34,8 @@ export default function parseAndBuildMetadata<T>(
syntacticPlaceholders,
} = opts;
const ast = parseWithCodeFrame(code, opts.parser, syntacticPlaceholders);
t.removePropertiesDeep(ast, {
preserveComments,
});
@ -191,13 +191,19 @@ type MetadataState = {
function parseWithCodeFrame(
code: string,
parserOpts: ParserOpts,
syntacticPlaceholders?: boolean,
): BabelNodeFile {
const plugins = (parserOpts.plugins || []).slice();
if (syntacticPlaceholders !== false) {
plugins.push("placeholders");
}
parserOpts = {
allowReturnOutsideFunction: true,
allowSuperOutsideMethod: true,
sourceType: "module",
...parserOpts,
plugins: (parserOpts.plugins || []).concat("placeholders"),
plugins,
};
try {

View File

@ -294,6 +294,17 @@ describe("@babel/template", function () {
template(`%%FOO%%`, { syntacticPlaceholders: false })({
FOO: t.numericLiteral(1),
});
}).toThrow(/Unexpected token.*/);
});
it("disallow manually enabled placeholders", () => {
expect(() => {
template(`%%FOO%%`, {
syntacticPlaceholders: false,
plugins: ["placeholders"],
})({
FOO: t.numericLiteral(1),
});
}).toThrow(/%%.*placeholders can't be used/);
});
@ -303,6 +314,16 @@ describe("@babel/template", function () {
});
expect(generator(output).code).toMatchInlineSnapshot(`"1;"`);
});
it("allows v8intrinsics", () => {
const output = template(`%DebugPrint(1)`, {
syntacticPlaceholders: false,
plugins: ["v8intrinsic"],
})();
expect(generator(output).code).toMatchInlineSnapshot(
`"%DebugPrint(1);"`,
);
});
});
describe("undefined", () => {