From db8cf718f8362fe396c382ce59b4606d81f3633e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 16 Aug 2022 15:08:31 +0200 Subject: [PATCH] [parser] Make `decoratorsBeforeExport` default to `false` (#14695) --- packages/babel-parser/src/plugin-utils.ts | 35 ++++++++++--------- packages/babel-parser/src/typings.ts | 3 ++ .../options.json | 2 +- .../decorators/class-property/options.json | 2 +- .../decorators/compued-property/options.json | 2 +- .../decoratorsBeforeExport-required/input.js | 0 .../options.json | 4 --- .../decorators/no-object-methods/options.json | 9 +---- .../decorators/no-semi/options.json | 11 ++---- .../experimental/decorators/options.json | 2 +- .../options.json | 2 +- .../decorators/private-property/options.json | 2 +- .../decorators/restricted-1/options.json | 11 ++---- .../decorators/restricted-2/options.json | 11 ++---- .../options.json | 2 +- .../options.json | 2 +- .../options.json | 2 +- .../options.json | 2 +- .../options.json | 2 +- .../options.json | 2 +- .../declare-after-decorators/options.json | 2 +- .../declare-before-decorators/options.json | 2 +- 22 files changed, 43 insertions(+), 69 deletions(-) delete mode 100644 packages/babel-parser/test/fixtures/experimental/decorators/decoratorsBeforeExport-required/input.js delete mode 100644 packages/babel-parser/test/fixtures/experimental/decorators/decoratorsBeforeExport-required/options.json diff --git a/packages/babel-parser/src/plugin-utils.ts b/packages/babel-parser/src/plugin-utils.ts index 4421b24bba55..1ad7bd66b693 100644 --- a/packages/babel-parser/src/plugin-utils.ts +++ b/packages/babel-parser/src/plugin-utils.ts @@ -1,5 +1,9 @@ import type Parser from "./parser"; -import type { PluginConfig } from "./typings"; +import type { + PluginConfig, + ParserPluginWithOptions, + PluginOptions, +} from "./typings"; export type Plugin = PluginConfig; @@ -47,11 +51,14 @@ export function hasPlugin( }); } -export function getPluginOption( +export function getPluginOption< + PluginName extends ParserPluginWithOptions[0], + OptionName extends keyof PluginOptions, +>( plugins: PluginList, - name: string, - option: string, -) { + name: PluginName, + option: OptionName, +): PluginOptions[OptionName] | null { const plugin = plugins.find(plugin => { if (Array.isArray(plugin)) { return plugin[0] === name; @@ -60,9 +67,8 @@ export function getPluginOption( } }); - if (plugin && Array.isArray(plugin)) { - // @ts-expect-error Fixme: should check whether option is defined - return plugin[1][option]; + if (plugin && Array.isArray(plugin) && plugin.length >= 2) { + return (plugin[1] as PluginOptions)[option]; } return null; @@ -85,14 +91,10 @@ export function validatePlugins(plugins: PluginList) { "decorators", "decoratorsBeforeExport", ); - if (decoratorsBeforeExport == null) { - throw new Error( - "The 'decorators' plugin requires a 'decoratorsBeforeExport' option," + - " whose value must be a boolean. If you are migrating from" + - " Babylon/Babel 6 or want to use the old decorators proposal, you" + - " should use the 'decorators-legacy' plugin instead of 'decorators'.", - ); - } else if (typeof decoratorsBeforeExport !== "boolean") { + if ( + decoratorsBeforeExport != null && + typeof decoratorsBeforeExport !== "boolean" + ) { throw new Error("'decoratorsBeforeExport' must be a boolean."); } } @@ -172,6 +174,7 @@ export function validatePlugins(plugins: PluginList) { } const moduleAttributesVersionPluginOption = getPluginOption( plugins, + // @ts-expect-error TODO: moduleAttributes's type definitions don't have options "moduleAttributes", "version", ); diff --git a/packages/babel-parser/src/typings.ts b/packages/babel-parser/src/typings.ts index 95a649b54cb0..8ba470ee917e 100644 --- a/packages/babel-parser/src/typings.ts +++ b/packages/babel-parser/src/typings.ts @@ -53,6 +53,9 @@ export type ParserPluginWithOptions = | ["flow", FlowPluginOptions] | ["typescript", TypeScriptPluginOptions]; +export type PluginOptions = + Extract[1]; + export interface DecoratorsPluginOptions { decoratorsBeforeExport?: boolean; } diff --git a/packages/babel-parser/test/fixtures/es2022/class-properties/arguments-in-nested-class-decorator-call-expression/options.json b/packages/babel-parser/test/fixtures/es2022/class-properties/arguments-in-nested-class-decorator-call-expression/options.json index 6c9cc72327dc..d760b0afda2a 100644 --- a/packages/babel-parser/test/fixtures/es2022/class-properties/arguments-in-nested-class-decorator-call-expression/options.json +++ b/packages/babel-parser/test/fixtures/es2022/class-properties/arguments-in-nested-class-decorator-call-expression/options.json @@ -1,3 +1,3 @@ { - "plugins": [["decorators", { "decoratorsBeforeExport": false }]] + "plugins": ["decorators"] } diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/class-property/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/class-property/options.json index 6c9cc72327dc..d760b0afda2a 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators/class-property/options.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators/class-property/options.json @@ -1,3 +1,3 @@ { - "plugins": [["decorators", { "decoratorsBeforeExport": false }]] + "plugins": ["decorators"] } diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/compued-property/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/compued-property/options.json index 6c9cc72327dc..d760b0afda2a 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators/compued-property/options.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators/compued-property/options.json @@ -1,3 +1,3 @@ { - "plugins": [["decorators", { "decoratorsBeforeExport": false }]] + "plugins": ["decorators"] } diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/decoratorsBeforeExport-required/input.js b/packages/babel-parser/test/fixtures/experimental/decorators/decoratorsBeforeExport-required/input.js deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/decoratorsBeforeExport-required/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/decoratorsBeforeExport-required/options.json deleted file mode 100644 index 3a1e80661a8f..000000000000 --- a/packages/babel-parser/test/fixtures/experimental/decorators/decoratorsBeforeExport-required/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "plugins": ["decorators"], - "throws": "The 'decorators' plugin requires a 'decoratorsBeforeExport' option, whose value must be a boolean. If you are migrating from Babylon/Babel 6 or want to use the old decorators proposal, you should use the 'decorators-legacy' plugin instead of 'decorators'." -} diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/no-object-methods/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/no-object-methods/options.json index cab2cc563643..d760b0afda2a 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators/no-object-methods/options.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators/no-object-methods/options.json @@ -1,10 +1,3 @@ { - "plugins": [ - [ - "decorators", - { - "decoratorsBeforeExport": false - } - ] - ] + "plugins": ["decorators"] } diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/no-semi/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/no-semi/options.json index 82f0c2e573ff..398f99f885f4 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators/no-semi/options.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators/no-semi/options.json @@ -1,11 +1,4 @@ { - "plugins": [ - [ - "decorators", - { - "decoratorsBeforeExport": false - } - ] - ], + "plugins": ["decorators"], "throws": "Decorators must not be followed by a semicolon. (2:5)" -} \ No newline at end of file +} diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/options.json index 6c9cc72327dc..d760b0afda2a 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators/options.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators/options.json @@ -1,3 +1,3 @@ { - "plugins": [["decorators", { "decoratorsBeforeExport": false }]] + "plugins": ["decorators"] } diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/parenthesized-createParenthesizedExpressions/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/parenthesized-createParenthesizedExpressions/options.json index 50270cedd0d4..fe35ff98fac8 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators/parenthesized-createParenthesizedExpressions/options.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators/parenthesized-createParenthesizedExpressions/options.json @@ -1,4 +1,4 @@ { - "plugins": [["decorators", { "decoratorsBeforeExport": false }]], + "plugins": ["decorators"], "createParenthesizedExpressions": true } diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/private-property/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/private-property/options.json index 6c9cc72327dc..d760b0afda2a 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators/private-property/options.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators/private-property/options.json @@ -1,3 +1,3 @@ { - "plugins": [["decorators", { "decoratorsBeforeExport": false }]] + "plugins": ["decorators"] } diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/restricted-1/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/restricted-1/options.json index adcec8cd5066..3b61df5a8e53 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators/restricted-1/options.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators/restricted-1/options.json @@ -1,11 +1,4 @@ { - "plugins": [ - [ - "decorators", - { - "decoratorsBeforeExport": false - } - ] - ], + "plugins": ["decorators"], "throws": "Leading decorators must be attached to a class declaration. (1:6)" -} \ No newline at end of file +} diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/restricted-2/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/restricted-2/options.json index adcec8cd5066..3b61df5a8e53 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators/restricted-2/options.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators/restricted-2/options.json @@ -1,11 +1,4 @@ { - "plugins": [ - [ - "decorators", - { - "decoratorsBeforeExport": false - } - ] - ], + "plugins": ["decorators"], "throws": "Leading decorators must be attached to a class declaration. (1:6)" -} \ No newline at end of file +} diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-bare-identifier/options.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-bare-identifier/options.json index d892ab069acf..ea4d11453e94 100644 --- a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-bare-identifier/options.json +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-bare-identifier/options.json @@ -1,6 +1,6 @@ { "plugins": [ ["pipelineOperator", { "proposal": "hack", "topicToken": "@@" }], - ["decorators", { "decoratorsBeforeExport": false }] + "decorators" ] } diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-parenthesized-identifier/options.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-parenthesized-identifier/options.json index d892ab069acf..ea4d11453e94 100644 --- a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-parenthesized-identifier/options.json +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-parenthesized-identifier/options.json @@ -1,6 +1,6 @@ { "plugins": [ ["pipelineOperator", { "proposal": "hack", "topicToken": "@@" }], - ["decorators", { "decoratorsBeforeExport": false }] + "decorators" ] } diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-parenthesized-topic/options.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-parenthesized-topic/options.json index d892ab069acf..ea4d11453e94 100644 --- a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-parenthesized-topic/options.json +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-at-proposal-class-decorator-with-parenthesized-topic/options.json @@ -1,6 +1,6 @@ { "plugins": [ ["pipelineOperator", { "proposal": "hack", "topicToken": "@@" }], - ["decorators", { "decoratorsBeforeExport": false }] + "decorators" ] } diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-bare-identifier/options.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-bare-identifier/options.json index 5ba6fd121df6..75710d4eb8ea 100644 --- a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-bare-identifier/options.json +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-bare-identifier/options.json @@ -1,6 +1,6 @@ { "plugins": [ ["pipelineOperator", { "proposal": "hack", "topicToken": "^^" }], - ["decorators", { "decoratorsBeforeExport": false }] + "decorators" ] } diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-parenthesized-identifier/options.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-parenthesized-identifier/options.json index 5ba6fd121df6..75710d4eb8ea 100644 --- a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-parenthesized-identifier/options.json +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-parenthesized-identifier/options.json @@ -1,6 +1,6 @@ { "plugins": [ ["pipelineOperator", { "proposal": "hack", "topicToken": "^^" }], - ["decorators", { "decoratorsBeforeExport": false }] + "decorators" ] } diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-parenthesized-topic/options.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-parenthesized-topic/options.json index 5ba6fd121df6..75710d4eb8ea 100644 --- a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-parenthesized-topic/options.json +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-double-caret-proposal-class-decorator-with-parenthesized-topic/options.json @@ -1,6 +1,6 @@ { "plugins": [ ["pipelineOperator", { "proposal": "hack", "topicToken": "^^" }], - ["decorators", { "decoratorsBeforeExport": false }] + "decorators" ] } diff --git a/packages/babel-parser/test/fixtures/flow/class-properties/declare-after-decorators/options.json b/packages/babel-parser/test/fixtures/flow/class-properties/declare-after-decorators/options.json index 4a1483574f95..35e8e1c8e684 100644 --- a/packages/babel-parser/test/fixtures/flow/class-properties/declare-after-decorators/options.json +++ b/packages/babel-parser/test/fixtures/flow/class-properties/declare-after-decorators/options.json @@ -1,4 +1,4 @@ { "sourceType": "module", - "plugins": ["flow", ["decorators", { "decoratorsBeforeExport": false }]] + "plugins": ["flow", "decorators"] } diff --git a/packages/babel-parser/test/fixtures/flow/class-properties/declare-before-decorators/options.json b/packages/babel-parser/test/fixtures/flow/class-properties/declare-before-decorators/options.json index 1d76e2c51d33..ad171938d789 100644 --- a/packages/babel-parser/test/fixtures/flow/class-properties/declare-before-decorators/options.json +++ b/packages/babel-parser/test/fixtures/flow/class-properties/declare-before-decorators/options.json @@ -1,5 +1,5 @@ { "sourceType": "module", - "plugins": ["flow", ["decorators", { "decoratorsBeforeExport": false }]], + "plugins": ["flow", "decorators"], "throws": "Unexpected token (2:10)" }