From 68edc1d30535f053f515d4c9f1ed2a9eaf9cdda6 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Sat, 27 Apr 2024 09:57:10 +0800 Subject: [PATCH] feat(language-core): use internal options for directly exposing user prop types Refs https://github.com/vuejs/core/pull/10801 --- .../lib/codegen/script/component.ts | 5 ++ .../lib/codegen/script/scriptSetup.ts | 50 ++++++++++++++----- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/packages/language-core/lib/codegen/script/component.ts b/packages/language-core/lib/codegen/script/component.ts index 08b48d1be2..5f73d41e8c 100644 --- a/packages/language-core/lib/codegen/script/component.ts +++ b/packages/language-core/lib/codegen/script/component.ts @@ -112,4 +112,9 @@ export function* generateScriptSetupOptions( } yield `>),${newLine}`; } + + // https://github.com/vuejs/core/pull/10801 + if (scriptSetupRanges.props.define?.typeArg) { + yield `__typeProps: typeof __VLS_typeProps,${newLine}`; + } } diff --git a/packages/language-core/lib/codegen/script/scriptSetup.ts b/packages/language-core/lib/codegen/script/scriptSetup.ts index 7495fc08f9..8be76b06ca 100644 --- a/packages/language-core/lib/codegen/script/scriptSetup.ts +++ b/packages/language-core/lib/codegen/script/scriptSetup.ts @@ -122,20 +122,44 @@ function* generateSetupFunction( ctx.scriptSetupGeneratedOffset = options.getGeneratedLength() - scriptSetupRanges.importSectionEndOffset; let setupCodeModifies: [Code[], number, number][] = []; - if (scriptSetupRanges.props.define && !scriptSetupRanges.props.name) { - const range = scriptSetupRanges.props.withDefaults ?? scriptSetupRanges.props.define; + const propsRange = scriptSetupRanges.props.withDefaults ?? scriptSetupRanges.props.define; + if (propsRange && scriptSetupRanges.props.define) { const statement = scriptSetupRanges.props.define.statement; - if (statement.start === range.start && statement.end === range.end) { - setupCodeModifies.push([[`const __VLS_props = `], range.start, range.start]); - } - else { + if (scriptSetupRanges.props.define.typeArg) { setupCodeModifies.push([[ - `const __VLS_props = `, - generateSfcBlockSection(scriptSetup, range.start, range.end, codeFeatures.all), - `${endOfLine}`, - generateSfcBlockSection(scriptSetup, statement.start, range.start, codeFeatures.all), - `__VLS_props`, - ], statement.start, range.end]); + `let __VLS_typeProps!: `, + generateSfcBlockSection(scriptSetup, scriptSetupRanges.props.define.typeArg.start, scriptSetupRanges.props.define.typeArg.end, codeFeatures.all), + endOfLine, + ], statement.start, statement.start]); + setupCodeModifies.push([[`typeof __VLS_typeProps`], scriptSetupRanges.props.define.typeArg.start, scriptSetupRanges.props.define.typeArg.end]); + } + if (!scriptSetupRanges.props.name) { + if (statement.start === propsRange.start && statement.end === propsRange.end) { + setupCodeModifies.push([[`const __VLS_props = `], propsRange.start, propsRange.start]); + } + else { + if (scriptSetupRanges.props.define.typeArg) { + setupCodeModifies.push([[ + `const __VLS_props = `, + generateSfcBlockSection(scriptSetup, propsRange.start, scriptSetupRanges.props.define.typeArg.start, codeFeatures.all), + ], statement.start, scriptSetupRanges.props.define.typeArg.start]); + setupCodeModifies.push([[ + generateSfcBlockSection(scriptSetup, scriptSetupRanges.props.define.typeArg.end, propsRange.end, codeFeatures.all), + `${endOfLine}`, + generateSfcBlockSection(scriptSetup, statement.start, propsRange.start, codeFeatures.all), + `__VLS_props`, + ], scriptSetupRanges.props.define.typeArg.end, propsRange.end]); + } + else { + setupCodeModifies.push([[ + `const __VLS_props = `, + generateSfcBlockSection(scriptSetup, propsRange.start, propsRange.end, codeFeatures.all), + `${endOfLine}`, + generateSfcBlockSection(scriptSetup, statement.start, propsRange.start, codeFeatures.all), + `__VLS_props`, + ], statement.start, propsRange.end]); + } + } } } if (scriptSetupRanges.slots.define && !scriptSetupRanges.slots.name) { @@ -338,7 +362,7 @@ function* generateComponentProps( yield ` & `; } ctx.generatedPropsType = true; - yield generateSfcBlockSection(scriptSetup, scriptSetupRanges.props.define.typeArg.start, scriptSetupRanges.props.define.typeArg.end, codeFeatures.all); + yield `typeof __VLS_typeProps`; } if (!ctx.generatedPropsType) { yield `{}`;