From cf31ac3ae4d4b2f7fbee943062df21cff51062d7 Mon Sep 17 00:00:00 2001 From: IU Date: Sun, 31 Jul 2022 18:36:13 +0800 Subject: [PATCH] Draft: Support ESM project (#1543) Co-authored-by: johnsoncodehk --- packages/vue-code-gen/src/generators/script.ts | 12 +++++++----- packages/vue-code-gen/src/parsers/refSugarRanges.ts | 2 +- packages/vue-language-core/src/lsContext.ts | 13 +++++++++++++ .../src/plugins/vue-typescript-template.ts | 8 ++++---- .../src/plugins/vue-template.ts | 9 ++++++--- tsconfig.base.json | 2 ++ 6 files changed, 33 insertions(+), 13 deletions(-) diff --git a/packages/vue-code-gen/src/generators/script.ts b/packages/vue-code-gen/src/generators/script.ts index 2562fb392..b2bc56126 100644 --- a/packages/vue-code-gen/src/generators/script.ts +++ b/packages/vue-code-gen/src/generators/script.ts @@ -170,7 +170,9 @@ export function generate( if (src.endsWith('.d.ts')) src = src.substring(0, src.length - '.d.ts'.length); else if (src.endsWith('.ts')) src = src.substring(0, src.length - '.ts'.length); - else if (src.endsWith('.tsx')) src = src.substring(0, src.length - '.tsx'.length); + else if (src.endsWith('.tsx')) src = src.substring(0, src.length - '.tsx'.length) + '.jsx'; + + if (!src.endsWith('.js') && !src.endsWith('.jsx')) src = src + '.js' codeGen.addText(`export * from `); codeGen.addCode( @@ -426,13 +428,13 @@ export function generate( // fill $props if (scriptSetupRanges.propsTypeArg) { // NOTE: defineProps is inaccurate for $props - codeGen.addText(`$props: (await import('./__VLS_types')).makeOptional(defineProps<`); + codeGen.addText(`$props: (await import('./__VLS_types.js')).makeOptional(defineProps<`); addExtraReferenceVirtualCode('scriptSetup', scriptSetupRanges.propsTypeArg.start, scriptSetupRanges.propsTypeArg.end); codeGen.addText(`>()),\n`); } else if (scriptSetupRanges.propsRuntimeArg) { // NOTE: defineProps is inaccurate for $props - codeGen.addText(`$props: (await import('./__VLS_types')).makeOptional(defineProps(`); + codeGen.addText(`$props: (await import('./__VLS_types.js')).makeOptional(defineProps(`); addExtraReferenceVirtualCode('scriptSetup', scriptSetupRanges.propsRuntimeArg.start, scriptSetupRanges.propsRuntimeArg.end); codeGen.addText(`)),\n`); } @@ -530,7 +532,7 @@ export function generate( codeGen.addText(`return __VLS_Component;\n`); } else { - codeGen.addText(`const __VLS_slots = (await import('./${path.basename(fileName)}.__VLS_template')).default;\n`) + codeGen.addText(`const __VLS_slots = (await import('./${path.basename(fileName)}.__VLS_template.jsx')).default;\n`) codeGen.addText(`return {} as typeof __VLS_Component & (new () => { ${getSlotsPropertyName(vueVersion)}: typeof __VLS_slots });\n`); } codeGen.addText(`})();`); @@ -657,7 +659,7 @@ export function generate( codeGen.addText(`\n`); if (script && scriptRanges?.exportDefault?.args) { const args = scriptRanges.exportDefault.args; - codeGen.addText(`export const __VLS_name = (await import('./__VLS_types')).getNameOption(`); + codeGen.addText(`export const __VLS_name = (await import('./__VLS_types.js')).getNameOption(`); codeGen.addText(`${script.content.substring(args.start, args.end)} as const`); codeGen.addText(`);\n`); } diff --git a/packages/vue-code-gen/src/parsers/refSugarRanges.ts b/packages/vue-code-gen/src/parsers/refSugarRanges.ts index bbd636c2a..daaaf66cc 100644 --- a/packages/vue-code-gen/src/parsers/refSugarRanges.ts +++ b/packages/vue-code-gen/src/parsers/refSugarRanges.ts @@ -2,7 +2,7 @@ import type * as ts from 'typescript/lib/tsserverlibrary'; import { getStartEnd, findBindingVars } from './scriptSetupRanges'; import type { TextRange } from '../types'; -export interface ScriptSetupRanges extends ReturnType { } +export interface RefSugarDeclarationRanges extends ReturnType { } export function parseRefSugarDeclarationRanges(ts: typeof import('typescript/lib/tsserverlibrary'), ast: ts.SourceFile, collectKeys: string[]) { diff --git a/packages/vue-language-core/src/lsContext.ts b/packages/vue-language-core/src/lsContext.ts index bc048f881..be18a5d86 100644 --- a/packages/vue-language-core/src/lsContext.ts +++ b/packages/vue-language-core/src/lsContext.ts @@ -17,6 +17,19 @@ export function createLanguageContext( let tsProjectVersion = 0; const ts = host.getTypeScriptModule(); + + // from https://github.com/johnsoncodehk/volar/pull/1543 + if (!((ts as any).__VLS_pitched_resolveModuleNames)) { + (ts as any).__VLS_pitched_resolveModuleNames = true; + const resolveModuleNames = ts.resolveModuleName; + ts.resolveModuleName = (...args) => { + if (args[0].endsWith('.vue') && args[6] === ts.ModuleKind.ESNext) { + args[6] = ts.ModuleKind.CommonJS; + } + return resolveModuleNames(...args); + }; + } + const documentRegistry = createDocumentRegistry(); const compilerOptions = host.getCompilationSettings(); const vueCompilerOptions = host.getVueCompilationSettings(); diff --git a/packages/vue-language-core/src/plugins/vue-typescript-template.ts b/packages/vue-language-core/src/plugins/vue-typescript-template.ts index d458533a2..42bbd392f 100644 --- a/packages/vue-language-core/src/plugins/vue-typescript-template.ts +++ b/packages/vue-language-core/src/plugins/vue-typescript-template.ts @@ -51,11 +51,11 @@ export default function ( const tsxCodeGen = new CodeGen(); tsxCodeGen.addText(scriptLeadingComment + '\n'); - tsxCodeGen.addText(`import * as __VLS_types from './__VLS_types';\n`); + tsxCodeGen.addText(`import * as __VLS_types from './__VLS_types.js';\n`); if (sfc.script || sfc.scriptSetup) { - tsxCodeGen.addText(`import { __VLS_options, __VLS_name } from './${baseFileName}.__VLS_script';\n`); - tsxCodeGen.addText(`import __VLS_component from './${baseFileName}.__VLS_script';\n`); + tsxCodeGen.addText(`import { __VLS_options, __VLS_name } from './${baseFileName}.__VLS_script.js';\n`); + tsxCodeGen.addText(`import __VLS_component from './${baseFileName}.__VLS_script.js';\n`); } else { tsxCodeGen.addText(`var __VLS_name = undefined;\n`); @@ -165,7 +165,7 @@ export default function ( tsxCodeGen.addText(`__VLS_types_${text} as ${text},\n`); } } - tsxCodeGen.addText(`} from './${baseFileName}.__VLS_script';\n`); + tsxCodeGen.addText(`} from './${baseFileName}.__VLS_script.js';\n`); } function writeCssClassProperty(styleIndex: number, className: string, classRange: TextRange, propertyType: string, optional: boolean) { tsxCodeGen.addText(`\n & { `); diff --git a/packages/vue-language-service/src/plugins/vue-template.ts b/packages/vue-language-service/src/plugins/vue-template.ts index faadb5f79..90885b81a 100644 --- a/packages/vue-language-service/src/plugins/vue-template.ts +++ b/packages/vue-language-service/src/plugins/vue-template.ts @@ -404,10 +404,13 @@ export default function useVueTemplateLanguagePlugin