diff --git a/packages/babel-parser/src/plugin-utils.ts b/packages/babel-parser/src/plugin-utils.ts index d8a5054c3a24..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; @@ -168,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; }