From 1332da5713beefef20473a45055186246bb87011 Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Tue, 27 Feb 2024 23:25:13 +0800 Subject: [PATCH] Add `experimental_useHermesParser` option in `preset-flow` (#16284) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nicolò Ribaudo --- packages/babel-preset-flow/package.json | 3 ++- packages/babel-preset-flow/src/index.ts | 23 +++++++++++++--- .../src/normalize-options.ts | 14 ++++++++-- .../test/fixtures/flow-parser/hermes/input.js | 4 +++ .../fixtures/flow-parser/hermes/options.json | 4 +++ .../fixtures/flow-parser/hermes/output.js | 1 + .../{flow => flow-parser}/options.json | 0 .../strip-with-directive/input.js | 0 .../strip-with-directive/output.js | 0 .../strip-without-directive/input.js | 0 .../strip-without-directive/output.js | 0 .../test/normalize-options.skip-bundled.js | 2 ++ yarn.lock | 26 +++++++++++++++++++ 13 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 packages/babel-preset-flow/test/fixtures/flow-parser/hermes/input.js create mode 100644 packages/babel-preset-flow/test/fixtures/flow-parser/hermes/options.json create mode 100644 packages/babel-preset-flow/test/fixtures/flow-parser/hermes/output.js rename packages/babel-preset-flow/test/fixtures/{flow => flow-parser}/options.json (100%) rename packages/babel-preset-flow/test/fixtures/{flow => flow-parser}/strip-with-directive/input.js (100%) rename packages/babel-preset-flow/test/fixtures/{flow => flow-parser}/strip-with-directive/output.js (100%) rename packages/babel-preset-flow/test/fixtures/{flow => flow-parser}/strip-without-directive/input.js (100%) rename packages/babel-preset-flow/test/fixtures/{flow => flow-parser}/strip-without-directive/output.js (100%) diff --git a/packages/babel-preset-flow/package.json b/packages/babel-preset-flow/package.json index 7fd1dee3ab56..f173b48250a1 100644 --- a/packages/babel-preset-flow/package.json +++ b/packages/babel-preset-flow/package.json @@ -29,7 +29,8 @@ }, "devDependencies": { "@babel/core": "workspace:^", - "@babel/helper-plugin-test-runner": "workspace:^" + "@babel/helper-plugin-test-runner": "workspace:^", + "babel-plugin-syntax-hermes-parser": "^0.19.1" }, "homepage": "https://babel.dev/docs/en/next/babel-preset-flow", "bugs": "https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22area%3A%20flow%22+is%3Aopen", diff --git a/packages/babel-preset-flow/src/index.ts b/packages/babel-preset-flow/src/index.ts index 44a3846bf138..3f3cfc071c10 100644 --- a/packages/babel-preset-flow/src/index.ts +++ b/packages/babel-preset-flow/src/index.ts @@ -12,14 +12,31 @@ export default declarePreset((api, opts) => { all, allowDeclareFields, ignoreExtensions = false, + experimental_useHermesParser: useHermesParser = false, } = normalizeOptions(opts); - const flowPlugin = [transformFlowStripTypes, { all, allowDeclareFields }]; + const plugins: any[] = [ + [transformFlowStripTypes, { all, allowDeclareFields }], + ]; + + if (useHermesParser) { + if (Number.parseInt(process.versions.node, 10) < 12) { + throw new Error( + "The Hermes parser is only supported in Node 12 and later.", + ); + } + if (IS_STANDALONE) { + throw new Error( + "The Hermes parser is not supported in the @babel/standalone.", + ); + } + plugins.unshift("babel-plugin-syntax-hermes-parser"); + } // TODO: In Babel 7, ignoreExtensions is always true. // Allow setting it to false in the next minor. if (process.env.BABEL_8_BREAKING ? ignoreExtensions : true) { - return { plugins: [flowPlugin] }; + return { plugins }; } if (process.env.BABEL_8_BREAKING) { @@ -27,7 +44,7 @@ export default declarePreset((api, opts) => { overrides: [ { test: filename => filename == null || !/\.tsx?$/.test(filename), - plugins: [flowPlugin], + plugins, }, ], }; diff --git a/packages/babel-preset-flow/src/normalize-options.ts b/packages/babel-preset-flow/src/normalize-options.ts index f0419e9e5376..275aebee7919 100644 --- a/packages/babel-preset-flow/src/normalize-options.ts +++ b/packages/babel-preset-flow/src/normalize-options.ts @@ -2,7 +2,7 @@ import { OptionValidator } from "@babel/helper-validator-option"; const v = new OptionValidator("@babel/preset-flow"); export default function normalizeOptions(options: any = {}) { - let { all, ignoreExtensions } = options; + let { all, ignoreExtensions, experimental_useHermesParser } = options; const { allowDeclareFields } = options; if (process.env.BABEL_8_BREAKING) { @@ -13,6 +13,7 @@ export default function normalizeOptions(options: any = {}) { const TopLevelOptions = { all: "all", ignoreExtensions: "ignoreExtensions", + experimental_useHermesParser: "experimental_useHermesParser", }; v.validateTopLevelOptions(options, TopLevelOptions); all = v.validateBooleanOption(TopLevelOptions.all, all); @@ -20,12 +21,21 @@ export default function normalizeOptions(options: any = {}) { TopLevelOptions.ignoreExtensions, ignoreExtensions, ); - return { all, ignoreExtensions }; + experimental_useHermesParser = v.validateBooleanOption( + TopLevelOptions.experimental_useHermesParser, + experimental_useHermesParser, + ); + return { + all, + ignoreExtensions, + experimental_useHermesParser, + }; } else { return { all, allowDeclareFields, ignoreExtensions, + experimental_useHermesParser, }; } } diff --git a/packages/babel-preset-flow/test/fixtures/flow-parser/hermes/input.js b/packages/babel-preset-flow/test/fixtures/flow-parser/hermes/input.js new file mode 100644 index 000000000000..b4cde36e52eb --- /dev/null +++ b/packages/babel-preset-flow/test/fixtures/flow-parser/hermes/input.js @@ -0,0 +1,4 @@ +// @flow + +type TypeofAnimal = Dog extends Animal ? 'animal' : 'unknown'; +function foo(a) {} diff --git a/packages/babel-preset-flow/test/fixtures/flow-parser/hermes/options.json b/packages/babel-preset-flow/test/fixtures/flow-parser/hermes/options.json new file mode 100644 index 000000000000..c79f842aa916 --- /dev/null +++ b/packages/babel-preset-flow/test/fixtures/flow-parser/hermes/options.json @@ -0,0 +1,4 @@ +{ + "presets": [["flow", { "experimental_useHermesParser": true }]], + "minNodeVersion": "12.0.0" +} diff --git a/packages/babel-preset-flow/test/fixtures/flow-parser/hermes/output.js b/packages/babel-preset-flow/test/fixtures/flow-parser/hermes/output.js new file mode 100644 index 000000000000..ef1dd099d3f1 --- /dev/null +++ b/packages/babel-preset-flow/test/fixtures/flow-parser/hermes/output.js @@ -0,0 +1 @@ +function foo(a) {} diff --git a/packages/babel-preset-flow/test/fixtures/flow/options.json b/packages/babel-preset-flow/test/fixtures/flow-parser/options.json similarity index 100% rename from packages/babel-preset-flow/test/fixtures/flow/options.json rename to packages/babel-preset-flow/test/fixtures/flow-parser/options.json diff --git a/packages/babel-preset-flow/test/fixtures/flow/strip-with-directive/input.js b/packages/babel-preset-flow/test/fixtures/flow-parser/strip-with-directive/input.js similarity index 100% rename from packages/babel-preset-flow/test/fixtures/flow/strip-with-directive/input.js rename to packages/babel-preset-flow/test/fixtures/flow-parser/strip-with-directive/input.js diff --git a/packages/babel-preset-flow/test/fixtures/flow/strip-with-directive/output.js b/packages/babel-preset-flow/test/fixtures/flow-parser/strip-with-directive/output.js similarity index 100% rename from packages/babel-preset-flow/test/fixtures/flow/strip-with-directive/output.js rename to packages/babel-preset-flow/test/fixtures/flow-parser/strip-with-directive/output.js diff --git a/packages/babel-preset-flow/test/fixtures/flow/strip-without-directive/input.js b/packages/babel-preset-flow/test/fixtures/flow-parser/strip-without-directive/input.js similarity index 100% rename from packages/babel-preset-flow/test/fixtures/flow/strip-without-directive/input.js rename to packages/babel-preset-flow/test/fixtures/flow-parser/strip-without-directive/input.js diff --git a/packages/babel-preset-flow/test/fixtures/flow/strip-without-directive/output.js b/packages/babel-preset-flow/test/fixtures/flow-parser/strip-without-directive/output.js similarity index 100% rename from packages/babel-preset-flow/test/fixtures/flow/strip-without-directive/output.js rename to packages/babel-preset-flow/test/fixtures/flow-parser/strip-without-directive/output.js diff --git a/packages/babel-preset-flow/test/normalize-options.skip-bundled.js b/packages/babel-preset-flow/test/normalize-options.skip-bundled.js index 18323896b46f..4eb5a149bb23 100644 --- a/packages/babel-preset-flow/test/normalize-options.skip-bundled.js +++ b/packages/babel-preset-flow/test/normalize-options.skip-bundled.js @@ -30,6 +30,7 @@ describe("normalize options", () => { expect(normalizeOptions({})).toMatchInlineSnapshot(` Object { "all": undefined, + "experimental_useHermesParser": undefined, "ignoreExtensions": undefined, } `); @@ -50,6 +51,7 @@ describe("normalize options", () => { Object { "all": undefined, "allowDeclareFields": undefined, + "experimental_useHermesParser": undefined, "ignoreExtensions": undefined, } `); diff --git a/yarn.lock b/yarn.lock index 7f4a52118559..3aa4bda87cc0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4007,6 +4007,7 @@ __metadata: "@babel/helper-plugin-utils": "workspace:^" "@babel/helper-validator-option": "workspace:^" "@babel/plugin-transform-flow-strip-types": "workspace:^" + babel-plugin-syntax-hermes-parser: "npm:^0.19.1" peerDependencies: "@babel/core": ^7.0.0-0 languageName: unknown @@ -6883,6 +6884,15 @@ __metadata: languageName: node linkType: hard +"babel-plugin-syntax-hermes-parser@npm:^0.19.1": + version: 0.19.1 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.19.1" + dependencies: + hermes-parser: "npm:0.19.1" + checksum: cb99e79b2d979cd3a69be3da23748f957d9fab294464f0720602271afb1f4ec40bed71d8884549edf00fa47523c60e9ff2407f4a2a0167eb9ac1dd094c0f8b57 + languageName: node + linkType: hard + "babel-plugin-transform-charcodes@npm:^0.2.0": version: 0.2.0 resolution: "babel-plugin-transform-charcodes@npm:0.2.0" @@ -10638,6 +10648,22 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.19.1": + version: 0.19.1 + resolution: "hermes-estree@npm:0.19.1" + checksum: dadafea5cf8fcf7d2c2d3d43740898c73b03db4747d4cc83e3cdb06bfcfbf3ee97f4ee26f077aea455771703f5bd18a4cb40c1ce7af9e38ce541d6c03fc8847a + languageName: node + linkType: hard + +"hermes-parser@npm:0.19.1": + version: 0.19.1 + resolution: "hermes-parser@npm:0.19.1" + dependencies: + hermes-estree: "npm:0.19.1" + checksum: 4fd886ce3ab80c79b258fa60085f2915f587aef57bf59e17f6cfe3b0ad2e7b1a1cfff8371b736392f66cff0658a90ece279b608edcb5589f8c56957e799c56f2 + languageName: node + linkType: hard + "hmac-drbg@npm:^1.0.1": version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1"