From d7083237273ab099f04dc231795171d2e2681fee Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Mon, 13 Jun 2022 21:16:49 +0800 Subject: [PATCH] fix: createApp() initialData type missing in template close #1444 --- .../typeChecks/petite-vue.html | 6 +- .../vue-typescript/src/plugins/file-html.ts | 6 +- .../src/plugins/petite-vue-script.ts | 71 +++++++++++++++++++ .../src/plugins/vue-sfc-customblocks.ts | 2 +- .../src/plugins/vue-sfc-scripts.ts | 2 +- .../src/plugins/vue-sfc-styles.ts | 4 +- .../src/plugins/vue-sfc-template.ts | 2 +- .../src/plugins/vue-typescript-scripts.ts | 4 +- .../src/plugins/vue-typescript-template.ts | 2 +- packages/vue-typescript/src/sourceFile.ts | 8 ++- 10 files changed, 88 insertions(+), 19 deletions(-) create mode 100644 packages/vue-typescript/src/plugins/petite-vue-script.ts diff --git a/packages/vue-test-workspace/typeChecks/petite-vue.html b/packages/vue-test-workspace/typeChecks/petite-vue.html index 24c43e7a8..f8de39fbe 100644 --- a/packages/vue-test-workspace/typeChecks/petite-vue.html +++ b/packages/vue-test-workspace/typeChecks/petite-vue.html @@ -3,6 +3,7 @@ createApp({ foo: 1, exactType }) +// @ts-expect-error const bar = 123; function createApp(_ = {}) { } @@ -15,9 +16,8 @@ }}
- {{ exactType(open, {} as boolean) }} + + {{ exactType(elseOpen, {} as boolean) }}
- - diff --git a/packages/vue-typescript/src/plugins/file-html.ts b/packages/vue-typescript/src/plugins/file-html.ts index c2037f7bd..caac11ba7 100644 --- a/packages/vue-typescript/src/plugins/file-html.ts +++ b/packages/vue-typescript/src/plugins/file-html.ts @@ -20,11 +20,7 @@ export default function (): VueLanguagePlugin { // style block intellisense support by vscode-html-language-features if (matchText.startsWith('(); + + codeGen.addCode2(sfc.script.content, 0, { + vueTag: 'script', + capabilities: { + basic: true, + references: true, + definitions: true, + diagnostic: true, + rename: true, + completion: true, + semanticTokens: true, + }, + }); + + codeGen.addText('\n\n'); + codeGen.addText(`const __VLS_scope = `); + if (createVueArg && createVueArg.index !== undefined) { + codeGen.addCode2(createVueArg[1], createVueArg.index + createVueArg[0].indexOf(createVueArg[1]), { + vueTag: 'script', + capabilities: { + references: true, + definitions: true, + rename: true, + }, + }); + } + else { + codeGen.addText('{}'); + } + codeGen.addText(';\n'); + codeGen.addText('declare const __VLS_export: new () => typeof __VLS_scope;\n'); + codeGen.addText('export default __VLS_export;\n'); + + const file: EmbeddedFile = { + fileName: fileName + '.__VLS_script.' + sfc.script.lang, + content: codeGen.getText(), + capabilities: { + diagnostics: true, + foldingRanges: false, + formatting: false, + documentSymbol: false, + codeActions: true, + inlayHints: true, + }, + isTsHostFile: true, + mappings: codeGen.getMappings(), + }; + + return file; + } + }, + }; +} diff --git a/packages/vue-typescript/src/plugins/vue-sfc-customblocks.ts b/packages/vue-typescript/src/plugins/vue-sfc-customblocks.ts index 653d92f45..737b655b9 100644 --- a/packages/vue-typescript/src/plugins/vue-sfc-customblocks.ts +++ b/packages/vue-typescript/src/plugins/vue-sfc-customblocks.ts @@ -5,7 +5,7 @@ export default function (): VueLanguagePlugin { return { - getEmbeddedFilesCount(sfc) { + getEmbeddedFilesCount(fileName, sfc) { return sfc.customBlocks.length; }, diff --git a/packages/vue-typescript/src/plugins/vue-sfc-scripts.ts b/packages/vue-typescript/src/plugins/vue-sfc-scripts.ts index 3283bbe81..513e97021 100644 --- a/packages/vue-typescript/src/plugins/vue-sfc-scripts.ts +++ b/packages/vue-typescript/src/plugins/vue-sfc-scripts.ts @@ -5,7 +5,7 @@ export default function (): VueLanguagePlugin { return { - getEmbeddedFilesCount(sfc) { + getEmbeddedFilesCount(fileName, sfc) { return 2; }, diff --git a/packages/vue-typescript/src/plugins/vue-sfc-styles.ts b/packages/vue-typescript/src/plugins/vue-sfc-styles.ts index 53d21d4e1..76c22759b 100644 --- a/packages/vue-typescript/src/plugins/vue-sfc-styles.ts +++ b/packages/vue-typescript/src/plugins/vue-sfc-styles.ts @@ -5,8 +5,8 @@ export default function (): VueLanguagePlugin { return { - getEmbeddedFilesCount(sfc) { - return sfc.styles.length; + getEmbeddedFilesCount(fileName, sfc) { + return fileName.endsWith('.html') ? 0 : sfc.styles.length; }, getEmbeddedFile(fileName, sfc, i) { diff --git a/packages/vue-typescript/src/plugins/vue-sfc-template.ts b/packages/vue-typescript/src/plugins/vue-sfc-template.ts index 099032c0c..de6ca0d7a 100644 --- a/packages/vue-typescript/src/plugins/vue-sfc-template.ts +++ b/packages/vue-typescript/src/plugins/vue-sfc-template.ts @@ -5,7 +5,7 @@ export default function (): VueLanguagePlugin { return { - getEmbeddedFilesCount(sfc) { + getEmbeddedFilesCount(fileName, sfc) { return sfc.template ? 1 : 0; }, diff --git a/packages/vue-typescript/src/plugins/vue-typescript-scripts.ts b/packages/vue-typescript/src/plugins/vue-typescript-scripts.ts index 490d94f55..33a6f8850 100644 --- a/packages/vue-typescript/src/plugins/vue-typescript-scripts.ts +++ b/packages/vue-typescript/src/plugins/vue-typescript-scripts.ts @@ -17,8 +17,8 @@ export default function ( return { - getEmbeddedFilesCount(sfc) { - return 2; + getEmbeddedFilesCount(fileName, sfc) { + return fileName.endsWith('.html') ? 0 : 2; }, getEmbeddedFile(fileName, sfc, i) { diff --git a/packages/vue-typescript/src/plugins/vue-typescript-template.ts b/packages/vue-typescript/src/plugins/vue-typescript-template.ts index d15d85c19..60a7af0c1 100644 --- a/packages/vue-typescript/src/plugins/vue-typescript-template.ts +++ b/packages/vue-typescript/src/plugins/vue-typescript-template.ts @@ -25,7 +25,7 @@ export default function ( return { - getEmbeddedFilesCount(sfc) { + getEmbeddedFilesCount(fileName, sfc) { return 3; }, diff --git a/packages/vue-typescript/src/sourceFile.ts b/packages/vue-typescript/src/sourceFile.ts index 7c4344ac6..30148dd17 100644 --- a/packages/vue-typescript/src/sourceFile.ts +++ b/packages/vue-typescript/src/sourceFile.ts @@ -15,6 +15,7 @@ import { parseCssVars } from './utils/parseCssVars'; import useVueFilePlugin from './plugins/file-vue'; import useMdFilePlugin from './plugins/file-md'; import useHtmlFilePlugin from './plugins/file-html'; +import usePetiteVueScriptPlugin from './plugins/petite-vue-script'; import useHtmlPlugin from './plugins/vue-template-html'; import usePugPlugin from './plugins/vue-template-pug'; import useVueSfcStyles from './plugins/vue-sfc-styles'; @@ -45,7 +46,7 @@ export interface VueLanguagePlugin { // TODO: compileHtmlTemplateToAst - getEmbeddedFilesCount?(sfc: Sfc): number; + getEmbeddedFilesCount?(fileName: string, sfc: Sfc): number; getEmbeddedFile?(fileName: string, sfc: Sfc, i: number): EmbeddedFile | undefined; } @@ -231,6 +232,7 @@ export function createSourceFile( useVueFilePlugin(), useMdFilePlugin(), useHtmlFilePlugin(), + usePetiteVueScriptPlugin(), useHtmlPlugin(), usePugPlugin(), useVueSfcStyles(), @@ -276,7 +278,7 @@ export function createSourceFile( }); const pluginEmbeddeds = plugins.map(plugin => { if (plugin.getEmbeddedFilesCount && plugin.getEmbeddedFile) { - const embeddedsCount = computed(() => plugin.getEmbeddedFilesCount!(sfc)); + const embeddedsCount = computed(() => plugin.getEmbeddedFilesCount!(fileName, sfc)); const embeddeds = computed(() => { const computeds: ComputedRef[] = []; for (let i = 0; i < embeddedsCount.value; i++) { @@ -518,7 +520,7 @@ export function createSourceFile( getCompiledVue: untrack(() => file2VueSourceMap.value), getSfcTemplateLanguageCompiled: untrack(() => computedHtmlTemplate.value), getSfcVueTemplateCompiled: untrack(() => templateAstCompiled.value), - getScriptFileName: untrack(() => fileName + '.' + scriptLang.value), + getScriptFileName: untrack(() => fileName.endsWith('.html') ? fileName + '.__VLS_script.' + scriptLang.value : fileName + '.' + scriptLang.value), getDescriptor: untrack(() => unref(sfc)), getScriptAst: untrack(() => scriptAst.value), getScriptSetupAst: untrack(() => scriptSetupAst.value),