From af7fc39e7b57f1238fe2d1e25e62e9377fe18954 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Sat, 31 Aug 2024 19:29:25 +0800 Subject: [PATCH] fix(typescript-plugin): compatible with Yarn PnP close #4751 --- packages/component-meta/lib/base.ts | 5 ++++- packages/language-core/lib/codegen/script/index.ts | 11 ++++++++++- packages/language-core/lib/types.ts | 1 + packages/language-server/lib/initialize.ts | 5 ++++- packages/tsc/index.ts | 7 ++++++- packages/tsc/tests/dts.spec.ts | 8 +++++++- packages/typescript-plugin/index.ts | 8 ++++++-- 7 files changed, 38 insertions(+), 7 deletions(-) diff --git a/packages/component-meta/lib/base.ts b/packages/component-meta/lib/base.ts index aeaa19ed5c..1d67ac1bdb 100644 --- a/packages/component-meta/lib/base.ts +++ b/packages/component-meta/lib/base.ts @@ -86,7 +86,10 @@ export function baseCreate( const vueLanguagePlugin = vue.createVueLanguagePlugin( ts, projectHost.getCompilationSettings(), - commandLine.vueOptions, + { + ...commandLine.vueOptions, + __setupedGlobalTypes: () => true, + }, id => id ); const language = vue.createLanguage( diff --git a/packages/language-core/lib/codegen/script/index.ts b/packages/language-core/lib/codegen/script/index.ts index 48d6fffef7..4cc22f9626 100644 --- a/packages/language-core/lib/codegen/script/index.ts +++ b/packages/language-core/lib/codegen/script/index.ts @@ -9,6 +9,7 @@ import { createScriptCodegenContext, ScriptCodegenContext } from './context'; import { generateScriptSetup, generateScriptSetupImports } from './scriptSetup'; import { generateSrc } from './src'; import { generateTemplate } from './template'; +import { generateGlobalTypes } from '../globalTypes'; export const codeFeatures = { all: { @@ -51,7 +52,12 @@ export interface ScriptCodegenOptions { export function* generateScript(options: ScriptCodegenOptions): Generator { const ctx = createScriptCodegenContext(options); - yield `/// ${newLine}`; + if (options.vueCompilerOptions.__setupedGlobalTypes?.()) { + yield `/// ${newLine}`; + } + else { + yield `/* placeholder */`; + } if (options.sfc.script?.src) { yield* generateSrc(options.sfc.script, options.sfc.script.src); @@ -136,6 +142,9 @@ export function* generateScript(options: ScriptCodegenOptions): Generator | Record[]>>; // internal + __setupedGlobalTypes?: () => boolean; __test?: boolean; } diff --git a/packages/language-server/lib/initialize.ts b/packages/language-server/lib/initialize.ts index fe033942cd..71cb45510b 100644 --- a/packages/language-server/lib/initialize.ts +++ b/packages/language-server/lib/initialize.ts @@ -44,7 +44,10 @@ export function initialize( createVueLanguagePlugin( ts, compilerOptions, - vueCompilerOptions, + { + ...vueCompilerOptions, + __setupedGlobalTypes: () => true, + }, s => uriConverter.asFileName(s) ), ], diff --git a/packages/tsc/index.ts b/packages/tsc/index.ts index 4297813131..449dd62a99 100644 --- a/packages/tsc/index.ts +++ b/packages/tsc/index.ts @@ -22,6 +22,7 @@ export function run(tscPath = require.resolve('typescript/lib/tsc')) { runExtensions.length === allExtensions.length && runExtensions.every(ext => allExtensions.includes(ext)) ) { + let setupedGlobalTypes = false; try { let dir = typeof configFilePath === 'string' ? configFilePath @@ -36,12 +37,16 @@ export function run(tscPath = require.resolve('typescript/lib/tsc')) { const globalTypesPath = path.resolve(dir, `node_modules/.vue-global-types/${vueOptions.lib}_${vueOptions.target}_${vueOptions.strictTemplates}.d.ts`); const globalTypesContents = vue.generateGlobalTypes(vueOptions.lib, vueOptions.target, vueOptions.strictTemplates); ts.sys.writeFile(globalTypesPath, globalTypesContents); + setupedGlobalTypes = true; } catch { } const vueLanguagePlugin = vue.createVueLanguagePlugin( ts, options.options, - vueOptions, + { + ...vueOptions, + __setupedGlobalTypes: () => setupedGlobalTypes, + }, id => id ); return { languagePlugins: [vueLanguagePlugin] }; diff --git a/packages/tsc/tests/dts.spec.ts b/packages/tsc/tests/dts.spec.ts index 01680e221d..c1e4d1c63c 100644 --- a/packages/tsc/tests/dts.spec.ts +++ b/packages/tsc/tests/dts.spec.ts @@ -31,6 +31,8 @@ describe('vue-tsc-dts', () => { ? vue.createParsedCommandLine(ts, ts.sys, configFilePath.replace(windowsPathReg, '/')).vueOptions : vue.resolveVueCompilerOptions({ extensions: ['.vue', '.cext'] }); + let setupedGlobalTypes = false; + try { let dir = typeof configFilePath === 'string' ? configFilePath @@ -45,12 +47,16 @@ describe('vue-tsc-dts', () => { const globalTypesPath = path.resolve(dir, `node_modules/.vue-global-types/${vueOptions.lib}_${vueOptions.target}_${vueOptions.strictTemplates}.d.ts`); const globalTypesContents = vue.generateGlobalTypes(vueOptions.lib, vueOptions.target, vueOptions.strictTemplates); ts.sys.writeFile(globalTypesPath, globalTypesContents); + setupedGlobalTypes = true; } catch { } const vueLanguagePlugin = vue.createVueLanguagePlugin( ts, options.options, - vueOptions, + { + ...vueOptions, + __setupedGlobalTypes: () => setupedGlobalTypes, + }, id => id ); return [vueLanguagePlugin]; diff --git a/packages/typescript-plugin/index.ts b/packages/typescript-plugin/index.ts index dd4d2ff1ca..90f10f4854 100644 --- a/packages/typescript-plugin/index.ts +++ b/packages/typescript-plugin/index.ts @@ -6,8 +6,8 @@ import { startNamedPipeServer } from './lib/server'; import type * as ts from 'typescript'; const windowsPathReg = /\\/g; - const vueCompilerOptions = new WeakMap(); +const setupedProjects = new WeakSet(); const basePlugin = createLanguageServicePlugin( (ts, info) => { @@ -15,7 +15,10 @@ const basePlugin = createLanguageServicePlugin( const languagePlugin = vue.createVueLanguagePlugin( ts, info.languageServiceHost.getCompilationSettings(), - vueOptions, + { + ...vueOptions, + __setupedGlobalTypes: () => setupedProjects.has(info.project), + }, id => id ); @@ -73,6 +76,7 @@ const plugin: ts.server.PluginModuleFactory = mods => { const globalTypesPath = path.resolve(dir, `node_modules/.vue-global-types/${options.lib}_${options.target}_${options.strictTemplates}.d.ts`); const globalTypesContents = vue.generateGlobalTypes(options.lib, options.target, options.strictTemplates); proj.writeFile(globalTypesPath, globalTypesContents); + setupedProjects.add(proj); } catch { } } return pluginModule.getExternalFiles?.(proj, updateLevel) ?? [];