From 17aa134cca2a4058c24fe0702a4eddf682a0776c Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 29 Aug 2024 05:58:34 +0800 Subject: [PATCH 1/4] refactor: create real files for global types --- package.json | 16 +- packages/component-meta/lib/base.ts | 29 +-- packages/language-core/index.ts | 7 +- .../language-core/lib/codegen/globalTypes.ts | 125 +++++++++++ .../language-core/lib/codegen/localTypes.ts | 148 +++++++++++++ .../lib/codegen/script/component.ts | 8 +- .../lib/codegen/script/context.ts | 120 +--------- .../lib/codegen/script/globalTypes.ts | 146 ------------- .../language-core/lib/codegen/script/index.ts | 16 +- .../lib/codegen/script/scriptSetup.ts | 12 +- .../lib/codegen/script/template.ts | 15 +- .../lib/codegen/template/objectProperty.ts | 4 +- packages/language-core/lib/languagePlugin.ts | 91 +------- packages/language-core/lib/plugins/vue-tsx.ts | 1 - packages/language-core/lib/types.ts | 1 - .../schemas/vue-tsconfig.schema.json | 2 +- packages/language-server/lib/initialize.ts | 48 +++- packages/language-server/node.ts | 17 +- .../language-service/tests/utils/format.ts | 9 +- packages/tsc/index.ts | 32 ++- .../tsc/tests/__snapshots__/dts.spec.ts.snap | 53 +++-- packages/tsc/tests/dts.spec.ts | 13 +- packages/typescript-plugin/index.ts | 42 +++- pnpm-lock.yaml | 206 +++++++++--------- 24 files changed, 579 insertions(+), 582 deletions(-) create mode 100644 packages/language-core/lib/codegen/globalTypes.ts create mode 100644 packages/language-core/lib/codegen/localTypes.ts delete mode 100644 packages/language-core/lib/codegen/script/globalTypes.ts diff --git a/package.json b/package.json index 2e95edd2db..8ca48ee9a7 100644 --- a/package.json +++ b/package.json @@ -32,14 +32,14 @@ }, "pnpm": { "overrides": { - "@volar/kit": "https://pkg.pr.new/volarjs/volar.js/@volar/kit@28cbdee", - "@volar/language-core": "https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee", - "@volar/language-server": "https://pkg.pr.new/volarjs/volar.js/@volar/language-server@28cbdee", - "@volar/language-service": "https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee", - "@volar/source-map": "https://pkg.pr.new/volarjs/volar.js/@volar/source-map@28cbdee", - "@volar/test-utils": "https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@28cbdee", - "@volar/typescript": "https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee", - "@volar/vscode": "https://pkg.pr.new/volarjs/volar.js/@volar/vscode@28cbdee", + "@volar/kit": "https://pkg.pr.new/volarjs/volar.js/@volar/kit@0e1be44", + "@volar/language-core": "https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44", + "@volar/language-server": "https://pkg.pr.new/volarjs/volar.js/@volar/language-server@0e1be44", + "@volar/language-service": "https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44", + "@volar/source-map": "https://pkg.pr.new/volarjs/volar.js/@volar/source-map@0e1be44", + "@volar/test-utils": "https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@0e1be44", + "@volar/typescript": "https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44", + "@volar/vscode": "https://pkg.pr.new/volarjs/volar.js/@volar/vscode@0e1be44", "volar-service-typescript": "https://pkg.pr.new/volarjs/services/volar-service-typescript@177b9ed", "inquirer": "9.2.23" } diff --git a/packages/component-meta/lib/base.ts b/packages/component-meta/lib/base.ts index e71738e5e4..64a8f46b90 100644 --- a/packages/component-meta/lib/base.ts +++ b/packages/component-meta/lib/base.ts @@ -1,19 +1,19 @@ +import { TypeScriptProjectHost, createLanguageServiceHost, resolveFileLanguageId } from '@volar/typescript'; import * as vue from '@vue/language-core'; -import type * as ts from 'typescript'; import * as path from 'path-browserify'; +import type * as ts from 'typescript'; import { code as typeHelpersCode } from 'vue-component-type-helpers'; import { code as vue2TypeHelpersCode } from 'vue-component-type-helpers/vue2'; -import { TypeScriptProjectHost, createLanguageServiceHost, resolveFileLanguageId } from '@volar/typescript'; import type { - MetaCheckerOptions, ComponentMeta, + Declaration, EventMeta, ExposeMeta, + MetaCheckerOptions, PropertyMeta, PropertyMetaSchema, - SlotMeta, - Declaration + SlotMeta } from './types'; export * from './types'; @@ -83,16 +83,19 @@ export function baseCreate( ]; }; - const vueLanguagePlugin = vue.createVueLanguagePlugin2( + try { + const libDir = require.resolve(`${commandLine.vueOptions.lib}/package.json`, { paths: [rootPath] }) + .slice(0, -'package.json'.length); + const globalTypesPath = `${libDir}__globalTypes_${commandLine.vueOptions.target}_${commandLine.vueOptions.strictTemplates}.d.ts`; + const globalTypesContents = vue.generateGlobalTypes(commandLine.vueOptions.lib, commandLine.vueOptions.target, commandLine.vueOptions.strictTemplates); + ts.sys.writeFile(globalTypesPath, globalTypesContents); + } catch { } + + const vueLanguagePlugin = vue.createVueLanguagePlugin( ts, - id => id, - vue.createRootFileChecker( - projectHost.getProjectVersion ? () => projectHost.getProjectVersion!() : undefined, - () => projectHost.getScriptFileNames(), - ts.sys.useCaseSensitiveFileNames - ), projectHost.getCompilationSettings(), - commandLine.vueOptions + commandLine.vueOptions, + id => id ); const language = vue.createLanguage( [ diff --git a/packages/language-core/index.ts b/packages/language-core/index.ts index d539d6591c..2ca1dc11cc 100644 --- a/packages/language-core/index.ts +++ b/packages/language-core/index.ts @@ -1,15 +1,16 @@ +export * from './lib/codegen/globalTypes'; export * from './lib/codegen/template'; export * from './lib/languagePlugin'; export * from './lib/parsers/scriptSetupRanges'; export * from './lib/plugins'; -export * from './lib/virtualFile/vueFile'; export * from './lib/types'; -export * from './lib/utils/ts'; export * from './lib/utils/parseSfc'; +export * from './lib/utils/ts'; +export * from './lib/virtualFile/vueFile'; export * as scriptRanges from './lib/parsers/scriptRanges'; -export * from './lib/utils/shared'; export { tsCodegen } from './lib/plugins/vue-tsx'; +export * from './lib/utils/shared'; export * from '@volar/language-core'; export type * as CompilerDOM from '@vue/compiler-dom'; diff --git a/packages/language-core/lib/codegen/globalTypes.ts b/packages/language-core/lib/codegen/globalTypes.ts new file mode 100644 index 0000000000..19689701d5 --- /dev/null +++ b/packages/language-core/lib/codegen/globalTypes.ts @@ -0,0 +1,125 @@ +import { getSlotsPropertyName } from '../utils/shared'; + +export function generateGlobalTypes(lib: string, target: number, strictTemplates: boolean) { + const fnPropsType = `(K extends { $props: infer Props } ? Props : any)${strictTemplates ? '' : ' & Record'}`; + return ` +const __VLS_globalComponents = { ...{} as import('${lib}').GlobalComponents }; + +declare const __VLS_intrinsicElements: __VLS_IntrinsicElements; +declare const __VLS_directiveBindingRestFields = { instance: null, oldValue: null, modifiers: null as any, dir: null as any }; + +type __VLS_IntrinsicElements = ${( + target >= 3.3 + ? `import('${lib}/jsx-runtime').JSX.IntrinsicElements;` + : `globalThis.JSX.IntrinsicElements;` + )} +type __VLS_Element = ${( + target >= 3.3 + ? `import('${lib}/jsx-runtime').JSX.Element;` + : `globalThis.JSX.Element;` + )} +type __VLS_GlobalComponents = ${( + target >= 3.5 + ? `void extends typeof __VLS_globalComponents ? {} : typeof __VLS_globalComponents;` + : `(void extends typeof __VLS_globalComponents ? {} : typeof __VLS_globalComponents) & Pick;` + )} +type __VLS_IsAny = 0 extends 1 & T ? true : false; +type __VLS_PickNotAny = __VLS_IsAny extends true ? B : A; +type __VLS_unknownDirective = (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown) => void; +type __VLS_WithComponent = + N1 extends keyof LocalComponents ? N1 extends N0 ? Pick : { [K in N0]: LocalComponents[N1] } : + N2 extends keyof LocalComponents ? N2 extends N0 ? Pick : { [K in N0]: LocalComponents[N2] } : + N3 extends keyof LocalComponents ? N3 extends N0 ? Pick : { [K in N0]: LocalComponents[N3] } : + N1 extends keyof __VLS_GlobalComponents ? N1 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N1] } : + N2 extends keyof __VLS_GlobalComponents ? N2 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N2] } : + N3 extends keyof __VLS_GlobalComponents ? N3 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N3] } : + ${strictTemplates ? '{}' : '{ [K in N0]: unknown }'} +type __VLS_FunctionalComponentProps = + '__ctx' extends keyof __VLS_PickNotAny ? K extends { __ctx?: { props?: infer P } } ? NonNullable

: never + : T extends (props: infer P, ...args: any) => any ? P : + {}; +type __VLS_IsFunction = K extends keyof T + ? __VLS_IsAny extends false + ? unknown extends T[K] + ? false + : true + : false + : false; +// fix https://github.com/vuejs/language-tools/issues/926 +type __VLS_UnionToIntersection = (U extends unknown ? (arg: U) => unknown : never) extends ((arg: infer P) => unknown) ? P : never; +type __VLS_OverloadUnionInner = U & T extends (...args: infer A) => infer R + ? U extends T + ? never + : __VLS_OverloadUnionInner & U & ((...args: A) => R)> | ((...args: A) => R) + : never; +type __VLS_OverloadUnion = Exclude< + __VLS_OverloadUnionInner<(() => never) & T>, + T extends () => never ? never : () => never +>; +type __VLS_ConstructorOverloads = __VLS_OverloadUnion extends infer F + ? F extends (event: infer E, ...args: infer A) => any + ? { [K in E & string]: (...args: A) => void; } + : never + : never; +type __VLS_NormalizeEmits = __VLS_PrettifyGlobal< + __VLS_UnionToIntersection< + __VLS_ConstructorOverloads & { + [K in keyof T]: T[K] extends any[] ? { (...args: T[K]): void } : never + } + > +>; +type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; + +declare function __VLS_getVForSourceType(source: number): [number, number, number][]; +declare function __VLS_getVForSourceType(source: string): [string, number, number][]; +declare function __VLS_getVForSourceType(source: T): [ + item: T[number], + key: number, + index: number, +][]; +declare function __VLS_getVForSourceType }>(source: T): [ + item: T extends { [Symbol.iterator](): Iterator } ? T1 : never, + key: number, + index: undefined, +][]; +// #3845 +declare function __VLS_getVForSourceType }>(source: T): [ + item: number | (Exclude extends { [Symbol.iterator](): Iterator } ? T1 : never), + key: number, + index: undefined, +][]; +declare function __VLS_getVForSourceType(source: T): [ + item: T[keyof T], + key: keyof T, + index: number, +][]; +// @ts-ignore +declare function __VLS_getSlotParams(slot: T): Parameters<__VLS_PickNotAny, (...args: any[]) => any>>; +// @ts-ignore +declare function __VLS_getSlotParam(slot: T): Parameters<__VLS_PickNotAny, (...args: any[]) => any>>[0]; +declare function __VLS_directiveAsFunction(dir: T): T extends (...args: any) => any + ? T | __VLS_unknownDirective + : NonNullable<(T & Record)['created' | 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeUnmount' | 'unmounted']>; +declare function __VLS_withScope(ctx: T, scope: K): ctx is T & K; +declare function __VLS_makeOptional(t: T): { [K in keyof T]?: T[K] }; +declare function __VLS_nonNullable(t: T): T extends null | undefined ? never : T; +declare function __VLS_asFunctionalComponent any ? InstanceType : unknown>(t: T, instance?: K): + T extends new (...args: any) => any + ? (props: ${fnPropsType}, ctx?: any) => __VLS_Element & { __ctx?: { + attrs?: any, + slots?: K extends { ${getSlotsPropertyName(target)}: infer Slots } ? Slots : any, + emit?: K extends { $emit: infer Emit } ? Emit : any + } & { props?: ${fnPropsType}; expose?(exposed: K): void; } } + : T extends () => any ? (props: {}, ctx?: any) => ReturnType + : T extends (...args: any) => any ? T + : (_: {}${strictTemplates ? '' : ' & Record'}, ctx?: any) => { __ctx?: { attrs?: any, expose?: any, slots?: any, emit?: any, props?: {}${strictTemplates ? '' : ' & Record'} } }; +declare function __VLS_elementAsFunction(tag: T, endTag?: T): (_: T${strictTemplates ? '' : ' & Record'}) => void; +declare function __VLS_functionalComponentArgsRest any>(t: T): Parameters['length'] extends 2 ? [any] : []; +declare function __VLS_pickFunctionalComponentCtx(comp: T, compInstance: K): NonNullable<__VLS_PickNotAny< + '__ctx' extends keyof __VLS_PickNotAny ? K extends { __ctx?: infer Ctx } ? Ctx : never : any + , T extends (props: any, ctx: infer Ctx) => any ? Ctx : any +>>; +declare function __VLS_normalizeSlot(s: S): S extends () => infer R ? (props: {}) => R : S; +declare function __VLS_tryAsConstant(t: T): T; +`; +}; diff --git a/packages/language-core/lib/codegen/localTypes.ts b/packages/language-core/lib/codegen/localTypes.ts new file mode 100644 index 0000000000..e244f16f0f --- /dev/null +++ b/packages/language-core/lib/codegen/localTypes.ts @@ -0,0 +1,148 @@ +import type * as ts from 'typescript'; +import { VueCompilerOptions } from '../types'; +import { getSlotsPropertyName } from '../utils/shared'; +import { endOfLine } from './common'; + +export function getLocalTypesGenerator(compilerOptions: ts.CompilerOptions, vueCompilerOptions: VueCompilerOptions) { + const used = new Set(); + + const OmitKeepDiscriminatedUnion = defineHelper( + `__VLS_OmitKeepDiscriminatedUnion`, + () => ` +type __VLS_OmitKeepDiscriminatedUnion = T extends any + ? Pick> + : never; +`.trimStart() + ); + const WithDefaults = defineHelper( + `__VLS_WithDefaults`, + () => ` +type __VLS_WithDefaults = { + [K in keyof Pick]: K extends keyof D + ? ${PrettifyLocal.name} + : P[K] +}; +`.trimStart() + ); + const PrettifyLocal = defineHelper( + `__VLS_PrettifyLocal`, + () => `type __VLS_PrettifyLocal = { [K in keyof T]: T[K]; } & {}${endOfLine}` + ); + const WithTemplateSlots = defineHelper( + `__VLS_WithTemplateSlots`, + () => ` +type __VLS_WithTemplateSlots = T & { + new(): { + ${getSlotsPropertyName(vueCompilerOptions.target)}: S; + ${vueCompilerOptions.jsxSlots ? `$props: ${PropsChildren.name};` : ''} + } +}; +`.trimStart() + ); + const PropsChildren = defineHelper( + `__VLS_PropsChildren`, + () => ` +type __VLS_PropsChildren = { + [K in keyof ( + boolean extends ( + // @ts-ignore + JSX.ElementChildrenAttribute extends never + ? true + : false + ) + ? never + // @ts-ignore + : JSX.ElementChildrenAttribute + )]?: S; +}; +`.trimStart() + ); + const TypePropsToOption = defineHelper( + `__VLS_TypePropsToOption`, + () => compilerOptions.exactOptionalPropertyTypes ? + ` +type __VLS_TypePropsToOption = { + [K in keyof T]-?: {} extends Pick + ? { type: import('${vueCompilerOptions.lib}').PropType } + : { type: import('${vueCompilerOptions.lib}').PropType, required: true } +}; +`.trimStart() : + ` +type __VLS_NonUndefinedable = T extends undefined ? never : T; +type __VLS_TypePropsToOption = { + [K in keyof T]-?: {} extends Pick + ? { type: import('${vueCompilerOptions.lib}').PropType<__VLS_NonUndefinedable> } + : { type: import('${vueCompilerOptions.lib}').PropType, required: true } +}; +`.trimStart() + ); + const OmitIndexSignature = defineHelper( + `__VLS_OmitIndexSignature`, + () => `type __VLS_OmitIndexSignature = { [K in keyof T as {} extends Record ? never : K]: T[K]; }${endOfLine}` + ); + const PickRefsExpose = defineHelper( + `__VLS_PickRefsExpose`, + () => ` +type __VLS_PickRefsExpose = T extends object + ? { [K in keyof T]: (T[K] extends any[] + ? Parameters[0][] + : T[K] extends { expose?: (exposed: infer E) => void } + ? E + : T[K]) | null } + : never; +`.trimStart() + ); + + const helpers = { + [PrettifyLocal.name]: PrettifyLocal, + [OmitKeepDiscriminatedUnion.name]: OmitKeepDiscriminatedUnion, + [WithDefaults.name]: WithDefaults, + [WithTemplateSlots.name]: WithTemplateSlots, + [PropsChildren.name]: PropsChildren, + [TypePropsToOption.name]: TypePropsToOption, + [OmitIndexSignature.name]: OmitIndexSignature, + [PickRefsExpose.name]: PickRefsExpose, + }; + used.clear(); + + return { + generate, + getUsedNames() { + return used; + }, + get PrettifyLocal() { return PrettifyLocal.name; }, + get OmitKeepDiscriminatedUnion() { return OmitKeepDiscriminatedUnion.name; }, + get WithDefaults() { return WithDefaults.name; }, + get WithTemplateSlots() { return WithTemplateSlots.name; }, + get PropsChildren() { return PropsChildren.name; }, + get TypePropsToOption() { return TypePropsToOption.name; }, + get OmitIndexSignature() { return OmitIndexSignature.name; }, + get PickRefsExpose() { return PickRefsExpose.name; }, + }; + + function* generate(names: string[]) { + const generated = new Set(); + while (names.length) { + used.clear(); + for (const name of names) { + if (generated.has(name)) { + continue; + } + const helper = helpers[name as keyof typeof helpers]; + yield helper.generate(); + generated.add(name); + } + names = [...used].filter(name => !generated.has(name)); + } + } + + function defineHelper(name: string, generate: () => string) { + return { + get name() { + used.add(name); + return name; + }, + generate, + }; + } +} diff --git a/packages/language-core/lib/codegen/script/component.ts b/packages/language-core/lib/codegen/script/component.ts index 457ba0c133..929d1f370d 100644 --- a/packages/language-core/lib/codegen/script/component.ts +++ b/packages/language-core/lib/codegen/script/component.ts @@ -131,8 +131,8 @@ export function* generatePropsOption( if (ctx.generatedPropsType) { optionExpCodes.push([ `{} as `, - scriptSetupRanges.props.withDefaults?.arg ? `${ctx.helperTypes.WithDefaults.name}<` : '', - `${ctx.helperTypes.TypePropsToOption.name}<__VLS_PublicProps>`, + scriptSetupRanges.props.withDefaults?.arg ? `${ctx.localTypes.WithDefaults}<` : '', + `${ctx.localTypes.TypePropsToOption}<__VLS_PublicProps>`, scriptSetupRanges.props.withDefaults?.arg ? `, typeof __VLS_withDefaultsArg>` : '', ].join('')); typeOptionExpCodes.push(`{} as __VLS_PublicProps`); @@ -146,8 +146,8 @@ export function* generatePropsOption( if (hasEmitsOption) { attrsType = `Omit<${attrsType}, \`on\${string}\`>`; } - const propsType = `__VLS_PickNotAny<${ctx.helperTypes.OmitIndexSignature.name}<${attrsType}>, {}>`; - const optionType = `${ctx.helperTypes.TypePropsToOption.name}<${propsType}>`; + const propsType = `__VLS_PickNotAny<${ctx.localTypes.OmitIndexSignature}<${attrsType}>, {}>`; + const optionType = `${ctx.localTypes.TypePropsToOption}<${propsType}>`; if (optionExpCodes.length) { optionExpCodes.unshift(`{} as ${optionType}`); } diff --git a/packages/language-core/lib/codegen/script/context.ts b/packages/language-core/lib/codegen/script/context.ts index 8bb0ad2176..60d30f82ce 100644 --- a/packages/language-core/lib/codegen/script/context.ts +++ b/packages/language-core/lib/codegen/script/context.ts @@ -1,6 +1,5 @@ -import { getSlotsPropertyName } from '../../utils/shared'; -import { newLine } from '../common'; import { InlayHintInfo } from '../types'; +import { getLocalTypesGenerator } from '../localTypes'; import type { ScriptCodegenOptions } from './index'; export interface HelperType { @@ -13,105 +12,7 @@ export interface HelperType { export type ScriptCodegenContext = ReturnType; export function createScriptCodegenContext(options: ScriptCodegenOptions) { - const helperTypes = { - OmitKeepDiscriminatedUnion: { - get name() { - this.used = true; - return `__VLS_OmitKeepDiscriminatedUnion`; - }, - get code() { - return `type __VLS_OmitKeepDiscriminatedUnion = T extends any - ? Pick> - : never;`; - }, - } satisfies HelperType as HelperType, - WithDefaults: { - get name() { - this.used = true; - return `__VLS_WithDefaults`; - }, - get code(): string { - return `type __VLS_WithDefaults = { - [K in keyof Pick]: K extends keyof D - ? ${helperTypes.Prettify.name} - : P[K] - };`; - }, - } satisfies HelperType as HelperType, - Prettify: { - get name() { - this.used = true; - return `__VLS_Prettify`; - }, - get code() { - return `type __VLS_Prettify = { [K in keyof T]: T[K]; } & {};`; - }, - } satisfies HelperType as HelperType, - WithTemplateSlots: { - get name() { - this.used = true; - return `__VLS_WithTemplateSlots`; - }, - get code(): string { - return `type __VLS_WithTemplateSlots = T & { - new(): { - ${getSlotsPropertyName(options.vueCompilerOptions.target)}: S; - ${options.vueCompilerOptions.jsxSlots ? `$props: ${helperTypes.PropsChildren.name};` : ''} - } - };`; - }, - } satisfies HelperType as HelperType, - PropsChildren: { - get name() { - this.used = true; - return `__VLS_PropsChildren`; - }, - get code() { - return `type __VLS_PropsChildren = { - [K in keyof ( - boolean extends ( - // @ts-ignore - JSX.ElementChildrenAttribute extends never - ? true - : false - ) - ? never - // @ts-ignore - : JSX.ElementChildrenAttribute - )]?: S; - };`; - }, - } satisfies HelperType as HelperType, - TypePropsToOption: { - get name() { - this.used = true; - return `__VLS_TypePropsToOption`; - }, - get code() { - return options.compilerOptions.exactOptionalPropertyTypes ? - `type __VLS_TypePropsToOption = { - [K in keyof T]-?: {} extends Pick - ? { type: import('${options.vueCompilerOptions.lib}').PropType } - : { type: import('${options.vueCompilerOptions.lib}').PropType, required: true } - };` : - `type __VLS_NonUndefinedable = T extends undefined ? never : T; - type __VLS_TypePropsToOption = { - [K in keyof T]-?: {} extends Pick - ? { type: import('${options.vueCompilerOptions.lib}').PropType<__VLS_NonUndefinedable> } - : { type: import('${options.vueCompilerOptions.lib}').PropType, required: true } - };`; - }, - } satisfies HelperType as HelperType, - OmitIndexSignature: { - get name() { - this.used = true; - return `__VLS_OmitIndexSignature`; - }, - get code() { - return `type __VLS_OmitIndexSignature = { [K in keyof T as {} extends Record ? never : K]: T[K]; };`; - } - } satisfies HelperType as HelperType, - }; + const localTypes = getLocalTypesGenerator(options.compilerOptions, options.vueCompilerOptions); const inlayHints: InlayHintInfo[] = []; return { @@ -123,22 +24,7 @@ export function createScriptCodegenContext(options: ScriptCodegenOptions) { ...options.scriptRanges?.bindings.map(range => options.sfc.script!.content.substring(range.start, range.end)) ?? [], ...options.scriptSetupRanges?.bindings.map(range => options.sfc.scriptSetup!.content.substring(range.start, range.end)) ?? [], ]), - helperTypes, + localTypes, inlayHints, - generateHelperTypes, }; - - function* generateHelperTypes() { - let shouldCheck = true; - while (shouldCheck) { - shouldCheck = false; - for (const helperType of Object.values(helperTypes)) { - if (helperType.used && !helperType.generated) { - shouldCheck = true; - helperType.generated = true; - yield newLine + helperType.code + newLine; - } - } - } - } } diff --git a/packages/language-core/lib/codegen/script/globalTypes.ts b/packages/language-core/lib/codegen/script/globalTypes.ts deleted file mode 100644 index 541a1512d3..0000000000 --- a/packages/language-core/lib/codegen/script/globalTypes.ts +++ /dev/null @@ -1,146 +0,0 @@ -import type { VueCompilerOptions } from '../../types'; -import { getSlotsPropertyName } from '../../utils/shared'; - -export function generateGlobalTypes(vueCompilerOptions: VueCompilerOptions) { - const fnPropsType = `(K extends { $props: infer Props } ? Props : any)${vueCompilerOptions.strictTemplates ? '' : ' & Record'}`; - return `export const __VLS_globalTypesStart = {}; -declare module '${vueCompilerOptions.lib}' { - interface GlobalComponents {} -} -declare global { - type __VLS_IntrinsicElements = ${vueCompilerOptions.target >= 3.3 - ? `import('${vueCompilerOptions.lib}/jsx-runtime').JSX.IntrinsicElements;` - : `globalThis.JSX.IntrinsicElements;` - } - type __VLS_Element = ${vueCompilerOptions.target >= 3.3 - ? `import('${vueCompilerOptions.lib}/jsx-runtime').JSX.Element;` - : `globalThis.JSX.Element;` - } - type __VLS_GlobalComponents = ${vueCompilerOptions.target >= 3.5 - ? `import('${vueCompilerOptions.lib}').GlobalComponents;` - : `import('${vueCompilerOptions.lib}').GlobalComponents & Pick;` - } - type __VLS_IsAny = 0 extends 1 & T ? true : false; - type __VLS_PickNotAny = __VLS_IsAny extends true ? B : A; - - const __VLS_intrinsicElements: __VLS_IntrinsicElements; - - // v-for - function __VLS_getVForSourceType(source: number): [number, number, number][]; - function __VLS_getVForSourceType(source: string): [string, number, number][]; - function __VLS_getVForSourceType(source: T): [ - item: T[number], - key: number, - index: number, - ][]; - function __VLS_getVForSourceType }>(source: T): [ - item: T extends { [Symbol.iterator](): Iterator } ? T1 : never, - key: number, - index: undefined, - ][]; - // #3845 - function __VLS_getVForSourceType }>(source: T): [ - item: number | (Exclude extends { [Symbol.iterator](): Iterator } ? T1 : never), - key: number, - index: undefined, - ][]; - function __VLS_getVForSourceType(source: T): [ - item: T[keyof T], - key: keyof T, - index: number, - ][]; - - // @ts-ignore - function __VLS_getSlotParams(slot: T): Parameters<__VLS_PickNotAny, (...args: any[]) => any>>; - // @ts-ignore - function __VLS_getSlotParam(slot: T): Parameters<__VLS_PickNotAny, (...args: any[]) => any>>[0]; - - // Custom Directives - type __VLS_unknownDirective = (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown) => void; - function __VLS_directiveAsFunction(dir: T): T extends (...args: any) => any - ? T | __VLS_unknownDirective - : NonNullable<(T & Record)['created' | 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeUnmount' | 'unmounted']>; - const __VLS_directiveBindingRestFields = { instance: null, oldValue: null, modifiers: null as any, dir: null as any }; - - function __VLS_withScope(ctx: T, scope: K): ctx is T & K; - function __VLS_makeOptional(t: T): { [K in keyof T]?: T[K] }; - function __VLS_nonNullable(t: T): T extends null | undefined ? never : T; - - type __VLS_WithComponent = - N1 extends keyof LocalComponents ? N1 extends N0 ? Pick : { [K in N0]: LocalComponents[N1] } : - N2 extends keyof LocalComponents ? N2 extends N0 ? Pick : { [K in N0]: LocalComponents[N2] } : - N3 extends keyof LocalComponents ? N3 extends N0 ? Pick : { [K in N0]: LocalComponents[N3] } : - N1 extends keyof __VLS_GlobalComponents ? N1 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N1] } : - N2 extends keyof __VLS_GlobalComponents ? N2 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N2] } : - N3 extends keyof __VLS_GlobalComponents ? N3 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N3] } : - ${vueCompilerOptions.strictTemplates ? '{}' : '{ [K in N0]: unknown }'} - - function __VLS_asFunctionalComponent any ? InstanceType : unknown>(t: T, instance?: K): - T extends new (...args: any) => any - ? (props: ${fnPropsType}, ctx?: any) => __VLS_Element & { __ctx?: { - attrs?: any, - slots?: K extends { ${getSlotsPropertyName(vueCompilerOptions.target)}: infer Slots } ? Slots : any, - emit?: K extends { $emit: infer Emit } ? Emit : any - } & { props?: ${fnPropsType}; expose?(exposed: K): void; } } - : T extends () => any ? (props: {}, ctx?: any) => ReturnType - : T extends (...args: any) => any ? T - : (_: {}${vueCompilerOptions.strictTemplates ? '' : ' & Record'}, ctx?: any) => { __ctx?: { attrs?: any, expose?: any, slots?: any, emit?: any, props?: {}${vueCompilerOptions.strictTemplates ? '' : ' & Record'} } }; - function __VLS_elementAsFunction(tag: T, endTag?: T): (_: T${vueCompilerOptions.strictTemplates ? '' : ' & Record'}) => void; - function __VLS_functionalComponentArgsRest any>(t: T): Parameters['length'] extends 2 ? [any] : []; - function __VLS_pickFunctionalComponentCtx(comp: T, compInstance: K): NonNullable<__VLS_PickNotAny< - '__ctx' extends keyof __VLS_PickNotAny ? K extends { __ctx?: infer Ctx } ? Ctx : never : any - , T extends (props: any, ctx: infer Ctx) => any ? Ctx : any - >>; - type __VLS_FunctionalComponentProps = - '__ctx' extends keyof __VLS_PickNotAny ? K extends { __ctx?: { props?: infer P } } ? NonNullable

: never - : T extends (props: infer P, ...args: any) => any ? P : - {}; - type __VLS_IsFunction = K extends keyof T - ? __VLS_IsAny extends false - ? unknown extends T[K] - ? false - : true - : false - : false; - - function __VLS_normalizeSlot(s: S): S extends () => infer R ? (props: {}) => R : S; - function __VLS_tryAsConstant(t: T): T; - - /** - * emit - */ - // fix https://github.com/vuejs/language-tools/issues/926 - type __VLS_UnionToIntersection = (U extends unknown ? (arg: U) => unknown : never) extends ((arg: infer P) => unknown) ? P : never; - type __VLS_OverloadUnionInner = U & T extends (...args: infer A) => infer R - ? U extends T - ? never - : __VLS_OverloadUnionInner & U & ((...args: A) => R)> | ((...args: A) => R) - : never; - type __VLS_OverloadUnion = Exclude< - __VLS_OverloadUnionInner<(() => never) & T>, - T extends () => never ? never : () => never - >; - type __VLS_ConstructorOverloads = __VLS_OverloadUnion extends infer F - ? F extends (event: infer E, ...args: infer A) => any - ? { [K in E & string]: (...args: A) => void; } - : never - : never; - type __VLS_NormalizeEmits = __VLS_PrettifyGlobal< - __VLS_UnionToIntersection< - __VLS_ConstructorOverloads & { - [K in keyof T]: T[K] extends any[] ? { (...args: T[K]): void } : never - } - > - >; - type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; - type __VLS_PickRefsExpose = T extends object - ? { [K in keyof T]: (T[K] extends any[] - ? Parameters[0][] - : T[K] extends { expose?: (exposed: infer E) => void } - ? E - : T[K]) | null } - : never; -} -export const __VLS_globalTypesEnd = {}; -`; -}; diff --git a/packages/language-core/lib/codegen/script/index.ts b/packages/language-core/lib/codegen/script/index.ts index 322eaebd01..3ae28f41a5 100644 --- a/packages/language-core/lib/codegen/script/index.ts +++ b/packages/language-core/lib/codegen/script/index.ts @@ -6,7 +6,6 @@ import type { Code, Sfc, VueCodeInformation, VueCompilerOptions } from '../../ty import { endOfLine, generateSfcBlockSection, newLine } from '../common'; import type { TemplateCodegenContext } from '../template/context'; import { createScriptCodegenContext, ScriptCodegenContext } from './context'; -import { generateGlobalTypes } from './globalTypes'; import { generateScriptSetup, generateScriptSetupImports } from './scriptSetup'; import { generateSrc } from './src'; import { generateTemplate } from './template'; @@ -44,7 +43,6 @@ export interface ScriptCodegenOptions { scriptRanges: ScriptRanges | undefined; scriptSetupRanges: ScriptSetupRanges | undefined; templateCodegen: TemplateCodegenContext & { codes: Code[]; } | undefined; - globalTypes: boolean; edited: boolean; getGeneratedLength: () => number; linkedCodeMappings: Mapping[]; @@ -53,7 +51,8 @@ export interface ScriptCodegenOptions { export function* generateScript(options: ScriptCodegenOptions): Generator { const ctx = createScriptCodegenContext(options); - yield `/* __placeholder__ */${newLine}`; + yield `/// ${newLine}`; + if (options.sfc.script?.src) { yield* generateSrc(options.sfc.script, options.sfc.script.src); } @@ -129,16 +128,15 @@ export function* generateScript(options: ScriptCodegenOptions): Generator(${newLine}` + ` __VLS_props: NonNullable>['props'],${newLine}` - + ` __VLS_ctx?: ${ctx.helperTypes.Prettify.name}>, 'attrs' | 'emit' | 'slots'>>,${newLine}` // use __VLS_Prettify for less dts code + + ` __VLS_ctx?: ${ctx.localTypes.PrettifyLocal}>, 'attrs' | 'emit' | 'slots'>>,${newLine}` // use __VLS_Prettify for less dts code + ` __VLS_expose?: NonNullable>['expose'],${newLine}` + ` __VLS_setup = (async () => {${newLine}`; yield* generateSetupFunction(options, ctx, scriptSetup, scriptSetupRanges, undefined, definePropMirrors); @@ -67,7 +67,7 @@ export function* generateScriptSetup( } yield ` return {} as {${newLine}` - + ` props: ${ctx.helperTypes.Prettify.name} & __VLS_BuiltInPublicProps,${newLine}` + + ` props: ${ctx.localTypes.PrettifyLocal} & __VLS_BuiltInPublicProps,${newLine}` + ` expose(exposed: import('${options.vueCompilerOptions.lib}').ShallowUnwrapRef<${scriptSetupRanges.expose.define ? 'typeof __VLS_exposed' : '{}'}>): void,${newLine}` + ` attrs: any,${newLine}` + ` slots: __VLS_Slots,${newLine}` @@ -289,7 +289,7 @@ function* generateSetupFunction( yield* generateComponent(options, ctx, scriptSetup, scriptSetupRanges); yield endOfLine; yield `${syntax} `; - yield `{} as ${ctx.helperTypes.WithTemplateSlots.name}${endOfLine}`; + yield `{} as ${ctx.localTypes.WithTemplateSlots}${endOfLine}`; } else { yield `${syntax} `; @@ -329,7 +329,7 @@ function* generateComponentProps( yield endOfLine; yield `let __VLS_functionalComponentProps!: `; - yield `${ctx.helperTypes.OmitKeepDiscriminatedUnion.name}['$props'], keyof __VLS_BuiltInPublicProps>`; + yield `${ctx.localTypes.OmitKeepDiscriminatedUnion}['$props'], keyof __VLS_BuiltInPublicProps>`; yield endOfLine; if (scriptSetupRanges.defineProp.length) { @@ -361,7 +361,7 @@ function* generateComponentProps( yield ` & `; } ctx.generatedPropsType = true; - yield `${ctx.helperTypes.PropsChildren.name}`; + yield `${ctx.localTypes.PropsChildren}`; } if (scriptSetupRanges.defineProp.length) { if (ctx.generatedPropsType) { @@ -470,7 +470,7 @@ function* generateStyleModules( else { yield name; } - yield `: Record & ${ctx.helperTypes.Prettify.name}<{}`; + yield `: Record & ${ctx.localTypes.PrettifyLocal}<{}`; for (const className of style.classNames) { yield* generateCssClassProperty( i, diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index 7507e2dffd..695d0ace06 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -9,7 +9,10 @@ import type { ScriptCodegenContext } from './context'; import { codeFeatures, type ScriptCodegenOptions } from './index'; import { generateInternalComponent } from './internalComponent'; -export function* generateTemplateCtx(options: ScriptCodegenOptions, isClassComponent: boolean): Generator { +export function* generateTemplateCtx( + options: ScriptCodegenOptions, + isClassComponent: boolean +): Generator { const types = []; if (isClassComponent) { types.push(`typeof this`); @@ -78,10 +81,13 @@ export function* generateTemplate( ctx.generatedTemplate = true; if (!options.vueCompilerOptions.skipTemplateCodegen) { - const templateCodegenCtx = createTemplateCodegenContext({ scriptSetupBindingNames: new Set(), edited: options.edited }); + const templateCodegenCtx = createTemplateCodegenContext({ + scriptSetupBindingNames: new Set(), + edited: options.edited, + }); yield* generateTemplateCtx(options, isClassComponent); yield* generateTemplateComponents(options); - yield* generateTemplateBody(options, templateCodegenCtx); + yield* generateTemplateBody(options, ctx, templateCodegenCtx); yield* generateInternalComponent(options, ctx, templateCodegenCtx); } else { @@ -94,6 +100,7 @@ export function* generateTemplate( function* generateTemplateBody( options: ScriptCodegenOptions, + ctx: ScriptCodegenContext, templateCodegenCtx: TemplateCodegenContext ): Generator { const firstClasses = new Set(); @@ -142,7 +149,7 @@ function* generateTemplateBody( yield `const __VLS_templateResult = {`; yield `slots: ${options.scriptSetupRanges?.slots.name ?? '__VLS_slots'},${newLine}`; - yield `refs: __VLS_refs as __VLS_PickRefsExpose,${newLine}`; + yield `refs: __VLS_refs as ${ctx.localTypes.PickRefsExpose},${newLine}`; yield `attrs: {} as Partial,${newLine}`; yield `}${endOfLine}`; } diff --git a/packages/language-core/lib/codegen/template/objectProperty.ts b/packages/language-core/lib/codegen/template/objectProperty.ts index 5d01f92fe9..812943c8da 100644 --- a/packages/language-core/lib/codegen/template/objectProperty.ts +++ b/packages/language-core/lib/codegen/template/objectProperty.ts @@ -26,8 +26,8 @@ export function* generateObjectProperty( astHolder, offset + 1, features, - '[__VLS_tryAsConstant(', - ')]' + `[__VLS_tryAsConstant(`, + `)]` ); } else { diff --git a/packages/language-core/lib/languagePlugin.ts b/packages/language-core/lib/languagePlugin.ts index d6bb0ff457..8d6055f169 100644 --- a/packages/language-core/lib/languagePlugin.ts +++ b/packages/language-core/lib/languagePlugin.ts @@ -1,6 +1,6 @@ /// -import { FileMap, forEachEmbeddedCode, type LanguagePlugin } from '@volar/language-core'; +import { forEachEmbeddedCode, LanguagePlugin } from '@volar/language-core'; import * as CompilerDOM from '@vue/compiler-dom'; import type * as ts from 'typescript'; import { createPlugins } from './plugins'; @@ -8,15 +8,13 @@ import type { VueCompilerOptions, VueLanguagePlugin, VueLanguagePluginReturn } f import * as CompilerVue2 from './utils/vue2TemplateCompiler'; import { VueVirtualCode } from './virtualFile/vueFile'; -const normalFileRegistries: { +const fileRegistries: { key: string; plugins: VueLanguagePlugin[]; files: Map; }[] = []; -const holderFileRegistries: typeof normalFileRegistries = []; -function getVueFileRegistry(isGlobalTypesHolder: boolean, key: string, plugins: VueLanguagePlugin[]) { - const fileRegistries = isGlobalTypesHolder ? holderFileRegistries : normalFileRegistries; +function getVueFileRegistry(key: string, plugins: VueLanguagePlugin[]) { let fileRegistry = fileRegistries.find(r => r.key === key && r.plugins.length === plugins.length @@ -50,49 +48,11 @@ function getFileRegistryKey( return JSON.stringify(values); } -export function createRootFileChecker( - getProjectVersion: (() => string) | undefined, - getRootFileNames: () => string[], - caseSensitive: boolean -) { - const fileNames = new FileMap(caseSensitive); - let projectVersion: string | undefined; - return (fileName: string) => { - if (!getProjectVersion || projectVersion !== getProjectVersion()) { - projectVersion = getProjectVersion?.(); - fileNames.clear(); - for (const rootFileName of getRootFileNames()) { - fileNames.set(rootFileName, undefined); - } - } - return fileNames.has(fileName); - }; -} - -// TODO: replace `createVueLanguagePlugin` with `createVueLanguagePlugin2` in 2.1 export function createVueLanguagePlugin( ts: typeof import('typescript'), - asFileName: (scriptId: T) => string, - _getProjectVersion: (() => string) | undefined, - isRootFile: (fileName: string) => boolean, - compilerOptions: ts.CompilerOptions, - vueCompilerOptions: VueCompilerOptions -): LanguagePlugin { - return createVueLanguagePlugin2( - ts, - asFileName, - isRootFile, - compilerOptions, - vueCompilerOptions - ); -} - -export function createVueLanguagePlugin2( - ts: typeof import('typescript'), - asFileName: (scriptId: T) => string, - isRootFile: (fileName: string) => boolean, compilerOptions: ts.CompilerOptions, - vueCompilerOptions: VueCompilerOptions + vueCompilerOptions: VueCompilerOptions, + asFileName: (scriptId: T) => string ): LanguagePlugin { const pluginContext: Parameters[0] = { modules: { @@ -106,9 +66,12 @@ export function createVueLanguagePlugin2( }, compilerOptions, vueCompilerOptions, - globalTypesHolder: undefined, }; const plugins = createPlugins(pluginContext); + const fileRegistry = getVueFileRegistry( + getFileRegistryKey(compilerOptions, vueCompilerOptions, plugins), + vueCompilerOptions.plugins + ); return { getLanguageId(scriptId) { @@ -123,10 +86,6 @@ export function createVueLanguagePlugin2( createVirtualCode(scriptId, languageId, snapshot) { const fileName = asFileName(scriptId); if (plugins.some(plugin => plugin.isValidFile?.(fileName, languageId))) { - if (!pluginContext.globalTypesHolder && isRootFile(fileName)) { - pluginContext.globalTypesHolder = fileName; - } - const fileRegistry = getFileRegistry(pluginContext.globalTypesHolder === fileName); const code = fileRegistry.get(fileName); if (code) { code.update(snapshot); @@ -150,30 +109,6 @@ export function createVueLanguagePlugin2( code.update(snapshot); return code; }, - // TODO: when global types holder deleted, move global types to another file - // disposeVirtualCode(fileId, code) { - // const isGlobalTypesHolder = code.fileName === pluginContext.globalTypesHolder; - // const fileRegistry = getFileRegistry(isGlobalTypesHolder); - // fileRegistry.delete(fileId); - // if (isGlobalTypesHolder) { - // pluginContext.globalTypesHolder = undefined; - // const fileRegistry2 = getFileRegistry(false); - // for (const [fileId, code] of fileRegistry2) { - // if (isValidGlobalTypesHolder(code.fileName)) { - // pluginContext.globalTypesHolder = code.fileName; - // fileRegistry2.delete(fileId); - // // force dirty - // files?.delete(fileId); - // files?.set( - // fileId, - // code.languageId, - // code.snapshot, - // ); - // break; - // } - // } - // } - // }, typescript: { extraFileExtensions: getAllExtensions(vueCompilerOptions) .map(ext => ({ @@ -198,14 +133,6 @@ export function createVueLanguagePlugin2( }, }, }; - - function getFileRegistry(isGlobalTypesHolder: boolean) { - return getVueFileRegistry( - isGlobalTypesHolder, - getFileRegistryKey(compilerOptions, vueCompilerOptions, plugins), - vueCompilerOptions.plugins - ); - } } export function getAllExtensions(options: VueCompilerOptions) { diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index c5e1308e9c..d2c1b93310 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -152,7 +152,6 @@ function createTsx( const codegen = generateScript({ ts, fileBaseName: path.basename(fileName), - globalTypes: ctx.globalTypesHolder === fileName, sfc: _sfc, lang: lang(), scriptRanges: scriptRanges(), diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index 57dfd05898..b5c3b557ad 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -85,7 +85,6 @@ export type VueLanguagePlugin = (ctx: { }; compilerOptions: ts.CompilerOptions; vueCompilerOptions: VueCompilerOptions; - globalTypesHolder: string | undefined; }) => VueLanguagePluginReturn | VueLanguagePluginReturn[]; export interface SfcBlock { diff --git a/packages/language-core/schemas/vue-tsconfig.schema.json b/packages/language-core/schemas/vue-tsconfig.schema.json index ce927dbd6d..f3e756a766 100644 --- a/packages/language-core/schemas/vue-tsconfig.schema.json +++ b/packages/language-core/schemas/vue-tsconfig.schema.json @@ -32,7 +32,7 @@ "markdownDescription": "Valid file extensions that should be considered as regular PetiteVue SFC." }, "lib": { - "default": "", + "default": "vue", "markdownDescription": "Specify module name for import regular types. (If empty, will use `@vue/runtime-dom` for target < 2.7, `vue` for target >= 2.7)" }, "jsxSlots": { diff --git a/packages/language-server/lib/initialize.ts b/packages/language-server/lib/initialize.ts index bfb91fb916..cb2db4cccd 100644 --- a/packages/language-server/lib/initialize.ts +++ b/packages/language-server/lib/initialize.ts @@ -1,6 +1,6 @@ import type { LanguageServer } from '@volar/language-server'; import { createTypeScriptProject } from '@volar/language-server/node'; -import { createParsedCommandLine, createRootFileChecker, createVueLanguagePlugin2, getAllExtensions, resolveVueCompilerOptions, VueCompilerOptions } from '@vue/language-core'; +import { createParsedCommandLine, createVueLanguagePlugin, generateGlobalTypes, getAllExtensions, resolveVueCompilerOptions, VueCompilerOptions } from '@vue/language-core'; import { Disposable, getFullLanguageServicePlugins, InitializeParams } from '@vue/language-service'; import type * as ts from 'typescript'; @@ -18,7 +18,7 @@ export function initialize( createTypeScriptProject( ts, tsLocalized, - async ({ configFileName, sys, projectHost, uriConverter }) => { + async ({ configFileName, sys, uriConverter }) => { let compilerOptions: ts.CompilerOptions; let vueCompilerOptions: VueCompilerOptions; if (configFileName) { @@ -40,19 +40,43 @@ export function initialize( vueCompilerOptions.__test = params.initializationOptions.typescript.disableAutoImportCache; updateFileWatcher(vueCompilerOptions); return { - languagePlugins: [createVueLanguagePlugin2( - ts, - s => uriConverter.asFileName(s), - createRootFileChecker( - projectHost.getProjectVersion ? () => projectHost.getProjectVersion!() : undefined, - () => projectHost.getScriptFileNames(), - sys.useCaseSensitiveFileNames + languagePlugins: [ + createVueLanguagePlugin( + ts, + compilerOptions, + vueCompilerOptions, + s => uriConverter.asFileName(s) ), - compilerOptions, - vueCompilerOptions - )], + ], setup({ project }) { project.vue = { compilerOptions: vueCompilerOptions }; + + if (project.typescript) { + const globalTypesName = `__globalTypes_${vueCompilerOptions.target}_${vueCompilerOptions.strictTemplates}.d.ts`; + const fileExists = project.typescript.languageServiceHost.fileExists.bind(project.typescript.languageServiceHost); + const getScriptSnapshot = project.typescript.languageServiceHost.getScriptSnapshot.bind(project.typescript.languageServiceHost); + const snapshots = new Map(); + project.typescript.languageServiceHost.fileExists = path => { + if (path.endsWith(globalTypesName)) { + return true; + } + return fileExists(path); + }; + project.typescript.languageServiceHost.getScriptSnapshot = path => { + if (path.endsWith(globalTypesName)) { + if (!snapshots.has(path)) { + const contents = generateGlobalTypes(vueCompilerOptions.lib, vueCompilerOptions.target, vueCompilerOptions.strictTemplates); + snapshots.set(path, { + getText: (start, end) => contents.substring(start, end), + getLength: () => contents.length, + getChangeRange: () => undefined, + }); + } + return snapshots.get(path)!; + } + return getScriptSnapshot(path); + }; + } }, }; } diff --git a/packages/language-server/node.ts b/packages/language-server/node.ts index 65b4c4d787..24c37db0ec 100644 --- a/packages/language-server/node.ts +++ b/packages/language-server/node.ts @@ -1,5 +1,5 @@ import { createConnection, createServer, loadTsdkByPath } from '@volar/language-server/node'; -import { createParsedCommandLine, createVueLanguagePlugin2, resolveVueCompilerOptions } from '@vue/language-core'; +import { createParsedCommandLine, createVueLanguagePlugin, resolveVueCompilerOptions } from '@vue/language-core'; import { getHybridModeLanguageServicePlugins } from '@vue/language-service'; import * as namedPipeClient from '@vue/typescript-plugin/lib/client'; import { createHybridModeProject } from './lib/hybridModeProject'; @@ -28,13 +28,14 @@ connection.onInitialize(params => { }; commandLine.vueOptions.__test = params.initializationOptions.typescript.disableAutoImportCache; return { - languagePlugins: [createVueLanguagePlugin2( - ts, - asFileName, - () => false, - commandLine.options, - commandLine.vueOptions - )], + languagePlugins: [ + createVueLanguagePlugin( + ts, + commandLine.options, + commandLine.vueOptions, + asFileName + ), + ], setup({ project }) { project.vue = { compilerOptions: commandLine.vueOptions }; }, diff --git a/packages/language-service/tests/utils/format.ts b/packages/language-service/tests/utils/format.ts index 05dfb55c58..5f6eb36a72 100644 --- a/packages/language-service/tests/utils/format.ts +++ b/packages/language-service/tests/utils/format.ts @@ -2,15 +2,14 @@ import * as kit from '@volar/kit'; import * as ts from 'typescript'; import { describe, expect, it } from 'vitest'; import type { URI } from 'vscode-uri'; -import { createVueLanguagePlugin2, getFullLanguageServicePlugins, resolveVueCompilerOptions } from '../..'; +import { createVueLanguagePlugin, getFullLanguageServicePlugins, resolveVueCompilerOptions } from '../..'; const resolvedVueOptions = resolveVueCompilerOptions({}); -const vueLanguagePlugin = createVueLanguagePlugin2( +const vueLanguagePlugin = createVueLanguagePlugin( ts, - () => '', - () => false, {}, - resolvedVueOptions + resolvedVueOptions, + () => '' ); const vueServicePLugins = getFullLanguageServicePlugins(ts); const formatter = kit.createFormatter([vueLanguagePlugin], vueServicePLugins); diff --git a/packages/tsc/index.ts b/packages/tsc/index.ts index 36f0600e43..cf6e4bf8b7 100644 --- a/packages/tsc/index.ts +++ b/packages/tsc/index.ts @@ -21,20 +21,22 @@ export function run(tscPath = require.resolve('typescript/lib/tsc')) { runExtensions.length === allExtensions.length && runExtensions.every(ext => allExtensions.includes(ext)) ) { - const writeFile = options.host!.writeFile.bind(options.host); - options.host!.writeFile = (fileName, contents, ...args) => { - return writeFile(fileName, removeEmitGlobalTypes(contents), ...args); - }; - const vueLanguagePlugin = vue.createVueLanguagePlugin2( + try { + const rootDir = typeof configFilePath === 'string' + ? configFilePath + : options.host?.getCurrentDirectory() ?? ts.sys.getCurrentDirectory(); + const libDir = require.resolve(`${vueOptions.lib}/package.json`, { paths: [rootDir] }) + .slice(0, -'package.json'.length); + const globalTypesPath = `${libDir}__globalTypes_${vueOptions.target}_${vueOptions.strictTemplates}.d.ts`; + const globalTypesContents = vue.generateGlobalTypes(vueOptions.lib, vueOptions.target, vueOptions.strictTemplates); + ts.sys.writeFile(globalTypesPath, globalTypesContents); + } catch { } + + const vueLanguagePlugin = vue.createVueLanguagePlugin( ts, - id => id, - vue.createRootFileChecker( - undefined, - () => options.rootNames.map(rootName => rootName.replace(windowsPathReg, '/')), - options.host?.useCaseSensitiveFileNames?.() ?? false - ), options.options, - vueOptions + vueOptions, + id => id ); return { languagePlugins: [vueLanguagePlugin] }; } @@ -55,9 +57,3 @@ export function run(tscPath = require.resolve('typescript/lib/tsc')) { } } } - -const removeEmitGlobalTypesRegexp = /^[^\n]*__VLS_globalTypesStart[\w\W]*__VLS_globalTypesEnd[^\n]*\n?$/mg; - -export function removeEmitGlobalTypes(dts: string) { - return dts.replace(removeEmitGlobalTypesRegexp, ''); -} diff --git a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap index 878dcd52ac..a134e8d034 100644 --- a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap +++ b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap @@ -4,8 +4,8 @@ exports[`vue-tsc-dts > Input: #4577/main.vue, Output: #4577/main.vue.d.ts 1`] = "export type BaseRow = { value: string; }; -declare const _default: (__VLS_props: NonNullable>["props"], __VLS_ctx?: __VLS_Prettify>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable>["expose"], __VLS_setup?: Promise<{ - props: __VLS_Prettify & Omit<{} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & Readonly>, never>, never> & { +declare const _default: (__VLS_props: NonNullable>["props"], __VLS_ctx?: __VLS_PrettifyLocal>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable>["expose"], __VLS_setup?: Promise<{ + props: __VLS_PrettifyLocal & Omit<{} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & Readonly>, never>, never> & { nonGeneric: string; rows: Row[]; }> & (import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps); @@ -23,8 +23,7 @@ declare const _default: (__VLS_props: NonNullable; }; export default _default; - -type __VLS_Prettify = { +type __VLS_PrettifyLocal = { [K in keyof T]: T[K]; } & {}; " @@ -69,8 +68,8 @@ export default _default; `; exports[`vue-tsc-dts > Input: events/component-generic.vue, Output: events/component-generic.vue.d.ts 1`] = ` -"declare const _default: (__VLS_props: NonNullable>["props"], __VLS_ctx?: __VLS_Prettify>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable>["expose"], __VLS_setup?: Promise<{ - props: __VLS_Prettify & Omit<{ +"declare const _default: (__VLS_props: NonNullable>["props"], __VLS_ctx?: __VLS_PrettifyLocal>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable>["expose"], __VLS_setup?: Promise<{ + props: __VLS_PrettifyLocal & Omit<{ onFoo?: (value: string) => any; } & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & Readonly> & { onFoo?: (value: string) => any; @@ -85,15 +84,15 @@ exports[`vue-tsc-dts > Input: events/component-generic.vue, Output: events/compo __ctx?: Awaited; }; export default _default; -type __VLS_Prettify = { +type __VLS_PrettifyLocal = { [K in keyof T]: T[K]; } & {}; " `; exports[`vue-tsc-dts > Input: generic/component.vue, Output: generic/component.vue.d.ts 1`] = ` -"declare const _default: (__VLS_props: NonNullable>["props"], __VLS_ctx?: __VLS_Prettify>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable>["expose"], __VLS_setup?: Promise<{ - props: __VLS_Prettify & Omit<{ +"declare const _default: (__VLS_props: NonNullable>["props"], __VLS_ctx?: __VLS_PrettifyLocal>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable>["expose"], __VLS_setup?: Promise<{ + props: __VLS_PrettifyLocal & Omit<{ "onUpdate:title"?: (title: string) => any; onBar?: (data: number) => any; } & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & Readonly> & { @@ -124,15 +123,15 @@ exports[`vue-tsc-dts > Input: generic/component.vue, Output: generic/component.v __ctx?: Awaited; }; export default _default; -type __VLS_Prettify = { +type __VLS_PrettifyLocal = { [K in keyof T]: T[K]; } & {}; " `; exports[`vue-tsc-dts > Input: generic/custom-extension-component.cext, Output: generic/custom-extension-component.cext.d.ts 1`] = ` -"declare const _default: (__VLS_props: NonNullable>["props"], __VLS_ctx?: __VLS_Prettify>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable>["expose"], __VLS_setup?: Promise<{ - props: __VLS_Prettify & Omit<{ +"declare const _default: (__VLS_props: NonNullable>["props"], __VLS_ctx?: __VLS_PrettifyLocal>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable>["expose"], __VLS_setup?: Promise<{ + props: __VLS_PrettifyLocal & Omit<{ "onUpdate:title"?: (title: string) => any; onBar?: (data: number) => any; } & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & Readonly> & { @@ -163,7 +162,7 @@ exports[`vue-tsc-dts > Input: generic/custom-extension-component.cext, Output: g __ctx?: Awaited; }; export default _default; -type __VLS_Prettify = { +type __VLS_PrettifyLocal = { [K in keyof T]: T[K]; } & {}; " @@ -365,13 +364,10 @@ declare const _default: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_T }, {}>; export default _default; type __VLS_WithDefaults = { - [K in keyof Pick]: K extends keyof D ? __VLS_Prettify]: K extends keyof D ? __VLS_PrettifyLocal : P[K]; }; -type __VLS_Prettify = { - [K in keyof T]: T[K]; -} & {}; type __VLS_NonUndefinedable = T extends undefined ? never : T; type __VLS_TypePropsToOption = { [K in keyof T]-?: {} extends Pick ? { @@ -381,6 +377,9 @@ type __VLS_TypePropsToOption = { required: true; }; }; +type __VLS_PrettifyLocal = { + [K in keyof T]: T[K]; +} & {}; " `; @@ -661,6 +660,11 @@ type __VLS_Slots = typeof __VLS_templateResult['slots']; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; declare const _default: __VLS_WithTemplateSlots; export default _default; +type __VLS_PickRefsExpose = T extends object ? { + [K in keyof T]: (T[K] extends any[] ? Parameters[0][] : T[K] extends { + expose?: (exposed: infer E) => void; + } ? E : T[K]) | null; +} : never; type __VLS_WithTemplateSlots = T & { new (): { $slots: S; @@ -706,6 +710,11 @@ type __VLS_Slots = typeof __VLS_templateResult['slots']; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; declare const _default: __VLS_WithTemplateSlots; export default _default; +type __VLS_PickRefsExpose = T extends object ? { + [K in keyof T]: (T[K] extends any[] ? Parameters[0][] : T[K] extends { + expose?: (exposed: infer E) => void; + } ? E : T[K]) | null; +} : never; type __VLS_WithTemplateSlots = T & { new (): { $slots: S; @@ -734,6 +743,11 @@ type __VLS_Slots = typeof __VLS_templateResult['slots']; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; declare const _default: __VLS_WithTemplateSlots; export default _default; +type __VLS_PickRefsExpose = T extends object ? { + [K in keyof T]: (T[K] extends any[] ? Parameters[0][] : T[K] extends { + expose?: (exposed: infer E) => void; + } ? E : T[K]) | null; +} : never; type __VLS_WithTemplateSlots = T & { new (): { $slots: S; @@ -770,6 +784,11 @@ type __VLS_Slots = typeof __VLS_templateResult['slots']; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; declare const _default: __VLS_WithTemplateSlots; export default _default; +type __VLS_PickRefsExpose = T extends object ? { + [K in keyof T]: (T[K] extends any[] ? Parameters[0][] : T[K] extends { + expose?: (exposed: infer E) => void; + } ? E : T[K]) | null; +} : never; type __VLS_WithTemplateSlots = T & { new (): { $slots: S; diff --git a/packages/tsc/tests/dts.spec.ts b/packages/tsc/tests/dts.spec.ts index c3a2bc21e1..226873d975 100644 --- a/packages/tsc/tests/dts.spec.ts +++ b/packages/tsc/tests/dts.spec.ts @@ -4,7 +4,6 @@ import * as ts from 'typescript'; import { describe, expect, it } from 'vitest'; import { proxyCreateProgram } from '@volar/typescript'; import * as vue from '@vue/language-core'; -import { removeEmitGlobalTypes } from '..'; const workspace = path.resolve(__dirname, '../../../test-workspace/component-meta'); const normalizePath = (filename: string) => filename.replace(/\\/g, '/'); @@ -31,16 +30,11 @@ describe('vue-tsc-dts', () => { vueOptions = typeof configFilePath === 'string' ? vue.createParsedCommandLine(ts, ts.sys, configFilePath.replace(windowsPathReg, '/')).vueOptions : vue.resolveVueCompilerOptions({ extensions: ['.vue', '.cext'] }); - const vueLanguagePlugin = vue.createVueLanguagePlugin2( + const vueLanguagePlugin = vue.createVueLanguagePlugin( ts, - id => id, - vue.createRootFileChecker( - undefined, - () => options.rootNames.map(rootName => rootName.replace(windowsPathReg, '/')), - options.host?.useCaseSensitiveFileNames?.() ?? false - ), options.options, - vueOptions + vueOptions, + id => id ); return [vueLanguagePlugin]; }); @@ -60,7 +54,6 @@ describe('vue-tsc-dts', () => { sourceFile, (outputFile, text) => { expect(outputFile.replace(windowsPathReg, '/')).toBe(expectedOutputFile.replace(windowsPathReg, '/')); - text = removeEmitGlobalTypes(text); outputText = text; }, undefined, diff --git a/packages/typescript-plugin/index.ts b/packages/typescript-plugin/index.ts index baa5b8a4db..2f321ddd9b 100644 --- a/packages/typescript-plugin/index.ts +++ b/packages/typescript-plugin/index.ts @@ -1,27 +1,25 @@ -import { createLanguageServicePlugin, externalFiles } from '@volar/typescript/lib/quickstart/createLanguageServicePlugin'; +import { createLanguageServicePlugin } from '@volar/typescript/lib/quickstart/createLanguageServicePlugin'; import * as vue from '@vue/language-core'; import { proxyLanguageServiceForVue } from './lib/common'; import { startNamedPipeServer } from './lib/server'; +import type * as ts from 'typescript'; const windowsPathReg = /\\/g; -const plugin = createLanguageServicePlugin( +const vueCompilerOptions = new WeakMap(); + +const basePlugin = createLanguageServicePlugin( (ts, info) => { const vueOptions = getVueCompilerOptions(); - const languagePlugin = vue.createVueLanguagePlugin2( + const languagePlugin = vue.createVueLanguagePlugin( ts, - id => id, - info.project.projectKind === ts.server.ProjectKind.Inferred - ? () => true - : vue.createRootFileChecker( - info.languageServiceHost.getProjectVersion ? () => info.languageServiceHost.getProjectVersion!() : undefined, - () => externalFiles.get(info.project) ?? [], - info.languageServiceHost.useCaseSensitiveFileNames?.() ?? false - ), info.languageServiceHost.getCompilationSettings(), - vueOptions + vueOptions, + id => id ); + vueCompilerOptions.set(info.project, vueOptions); + return { languagePlugins: [languagePlugin], setup: language => { @@ -54,5 +52,25 @@ const plugin = createLanguageServicePlugin( } } ); +const plugin: ts.server.PluginModuleFactory = mods => { + const pluginModule = basePlugin(mods); + + return { + ...pluginModule, + getExternalFiles(proj, updateLevel = 0) { + const options = vueCompilerOptions.get(proj); + if (updateLevel >= 1 && options) { + try { + const libDir = require.resolve(`${options.lib}/package.json`, { paths: [proj.getCurrentDirectory()] }) + .slice(0, -'package.json'.length); + const globalTypesPath = `${libDir}__globalTypes_${options.target}_${options.strictTemplates}.d.ts`; + const globalTypesContents = vue.generateGlobalTypes(options.lib, options.target, options.strictTemplates); + proj.writeFile(globalTypesPath, globalTypesContents); + } catch { } + } + return pluginModule.getExternalFiles?.(proj, updateLevel) ?? []; + }, + }; +}; export = plugin; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 94adcfbf0c..3024ac270a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,14 +5,14 @@ settings: excludeLinksFromLockfile: false overrides: - '@volar/kit': https://pkg.pr.new/volarjs/volar.js/@volar/kit@28cbdee - '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee - '@volar/language-server': https://pkg.pr.new/volarjs/volar.js/@volar/language-server@28cbdee - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee - '@volar/source-map': https://pkg.pr.new/volarjs/volar.js/@volar/source-map@28cbdee - '@volar/test-utils': https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@28cbdee - '@volar/typescript': https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee - '@volar/vscode': https://pkg.pr.new/volarjs/volar.js/@volar/vscode@28cbdee + '@volar/kit': https://pkg.pr.new/volarjs/volar.js/@volar/kit@0e1be44 + '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44 + '@volar/language-server': https://pkg.pr.new/volarjs/volar.js/@volar/language-server@0e1be44 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 + '@volar/source-map': https://pkg.pr.new/volarjs/volar.js/@volar/source-map@0e1be44 + '@volar/test-utils': https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@0e1be44 + '@volar/typescript': https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 + '@volar/vscode': https://pkg.pr.new/volarjs/volar.js/@volar/vscode@0e1be44 volar-service-typescript: https://pkg.pr.new/volarjs/services/volar-service-typescript@177b9ed inquirer: 9.2.23 @@ -33,8 +33,8 @@ importers: specifier: latest version: 1.0.17 '@volar/language-service': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 typescript: specifier: latest version: 5.5.4 @@ -54,8 +54,8 @@ importers: specifier: ^1.82.0 version: 1.92.0 '@volar/vscode': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/vscode@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/vscode@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/vscode@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/vscode@0e1be44 '@vscode/vsce': specifier: latest version: 3.0.0 @@ -87,8 +87,8 @@ importers: packages/component-meta: dependencies: '@volar/typescript': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 '@vue/language-core': specifier: 2.0.28 version: link:../language-core @@ -114,8 +114,8 @@ importers: packages/language-core: dependencies: '@volar/language-core': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44 '@vue/compiler-dom': specifier: ^3.4.0 version: 3.4.38 @@ -151,8 +151,8 @@ importers: specifier: ^1.0.1 version: 1.0.3 '@volar/typescript': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 '@vue/compiler-sfc': specifier: ^3.4.0 version: 3.4.38 @@ -160,8 +160,8 @@ importers: packages/language-plugin-pug: dependencies: '@volar/source-map': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/source-map@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/source-map@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/source-map@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/source-map@0e1be44 volar-service-pug: specifier: 0.0.61 version: 0.0.61 @@ -176,14 +176,14 @@ importers: packages/language-server: dependencies: '@volar/language-core': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44 '@volar/language-server': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-server@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/language-server@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-server@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-server@0e1be44 '@volar/test-utils': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@0e1be44 '@vue/language-core': specifier: 2.0.28 version: link:../language-core @@ -203,14 +203,14 @@ importers: packages/language-service: dependencies: '@volar/language-core': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44 '@volar/language-service': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 '@volar/typescript': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 '@vue/compiler-dom': specifier: ^3.4.0 version: 3.4.38 @@ -231,28 +231,28 @@ importers: version: 1.0.1 volar-service-css: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44) volar-service-emmet: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44) volar-service-html: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44) volar-service-json: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44) volar-service-pug: specifier: 0.0.61 version: 0.0.61 volar-service-pug-beautify: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44) volar-service-typescript: specifier: https://pkg.pr.new/volarjs/services/volar-service-typescript@177b9ed - version: https://pkg.pr.new/volarjs/services/volar-service-typescript@177b9ed(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee) + version: https://pkg.pr.new/volarjs/services/volar-service-typescript@177b9ed(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44) volar-service-typescript-twoslash-queries: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44) vscode-html-languageservice: specifier: ^5.2.0 version: 5.3.0 @@ -270,8 +270,8 @@ importers: specifier: latest version: 1.0.3 '@volar/kit': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/kit@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/kit@28cbdee(typescript@5.7.0-dev.20240825) + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/kit@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/kit@0e1be44(typescript@5.7.0-dev.20240825) vscode-languageserver-protocol: specifier: ^3.17.5 version: 3.17.5 @@ -279,8 +279,8 @@ importers: packages/tsc: dependencies: '@volar/typescript': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 '@vue/language-core': specifier: 2.0.28 version: link:../language-core @@ -298,8 +298,8 @@ importers: packages/typescript-plugin: dependencies: '@volar/typescript': - specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee - version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 + version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 '@vue/language-core': specifier: 2.0.28 version: link:../language-core @@ -1134,38 +1134,38 @@ packages: '@vitest/utils@2.0.5': resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} - '@volar/kit@https://pkg.pr.new/volarjs/volar.js/@volar/kit@28cbdee': - resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/kit@28cbdee} + '@volar/kit@https://pkg.pr.new/volarjs/volar.js/@volar/kit@0e1be44': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/kit@0e1be44} version: 2.4.0 peerDependencies: typescript: '*' - '@volar/language-core@https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee': - resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee} + '@volar/language-core@https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44} version: 2.4.0 - '@volar/language-server@https://pkg.pr.new/volarjs/volar.js/@volar/language-server@28cbdee': - resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/language-server@28cbdee} + '@volar/language-server@https://pkg.pr.new/volarjs/volar.js/@volar/language-server@0e1be44': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/language-server@0e1be44} version: 2.4.0 - '@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee': - resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee} + '@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44} version: 2.4.0 - '@volar/source-map@https://pkg.pr.new/volarjs/volar.js/@volar/source-map@28cbdee': - resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/source-map@28cbdee} + '@volar/source-map@https://pkg.pr.new/volarjs/volar.js/@volar/source-map@0e1be44': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/source-map@0e1be44} version: 2.4.0 - '@volar/test-utils@https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@28cbdee': - resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@28cbdee} + '@volar/test-utils@https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@0e1be44': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@0e1be44} version: 2.4.0 - '@volar/typescript@https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee': - resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee} + '@volar/typescript@https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44} version: 2.4.0 - '@volar/vscode@https://pkg.pr.new/volarjs/volar.js/@volar/vscode@28cbdee': - resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/vscode@28cbdee} + '@volar/vscode@https://pkg.pr.new/volarjs/volar.js/@volar/vscode@0e1be44': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/vscode@0e1be44} version: 2.4.0 '@vscode/emmet-helper@2.9.3': @@ -3275,7 +3275,7 @@ packages: resolution: {integrity: sha512-Ct9L/w+IB1JU8F4jofcNCGoHy6TF83aiapfZq9A0qYYpq+Kk5dH+ONS+rVZSsuhsunq8UvAuF8Gk6B8IFLfniw==} version: 0.0.61 peerDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 peerDependenciesMeta: '@volar/language-service': optional: true @@ -3284,7 +3284,7 @@ packages: resolution: {integrity: sha512-iiYqBxjjcekqrRruw4COQHZME6EZYWVbkHjHDbULpml3g8HGJHzpAMkj9tXNCPxf36A+f1oUYjsvZt36qPg4cg==} version: 0.0.61 peerDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 peerDependenciesMeta: '@volar/language-service': optional: true @@ -3293,7 +3293,7 @@ packages: resolution: {integrity: sha512-yFE+YmmgqIL5HI4ORqP++IYb1QaGcv+xBboI0WkCxJJ/M35HZj7f5rbT3eQ24ECLXFbFCFanckwyWJVz5KmN3Q==} version: 0.0.61 peerDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 peerDependenciesMeta: '@volar/language-service': optional: true @@ -3302,7 +3302,7 @@ packages: resolution: {integrity: sha512-9PpEib6XE99gFjjjl8IkITktSvfPW39jFAGsHggT6SdlIb8zC7J0+rMjkyVUAUOpWvY5jPqkByX43LcxZvkrdQ==} version: 0.0.61 peerDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 peerDependenciesMeta: '@volar/language-service': optional: true @@ -3311,7 +3311,7 @@ packages: resolution: {integrity: sha512-FvZEZJdZ64pa3a0u1Urz08g4gHjuPcdMsEsJGiDLYqJnIZEGZRyhHUjSxfmAxihZCzp738W90tOMQDbgeQMGhA==} version: 0.0.61 peerDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 peerDependenciesMeta: '@volar/language-service': optional: true @@ -3323,7 +3323,7 @@ packages: resolution: {integrity: sha512-99FICGrEF0r1E2tV+SvprHPw9Knyg7BdW2fUch0tf59kG+KG+Tj4tL6tUg+cy8f23O/VXlmsWFMIE+bx1dXPnQ==} version: 0.0.61 peerDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 peerDependenciesMeta: '@volar/language-service': optional: true @@ -3332,7 +3332,7 @@ packages: resolution: {tarball: https://pkg.pr.new/volarjs/services/volar-service-typescript@177b9ed} version: 0.0.61 peerDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 peerDependenciesMeta: '@volar/language-service': optional: true @@ -4418,24 +4418,24 @@ snapshots: loupe: 3.1.1 tinyrainbow: 1.2.0 - '@volar/kit@https://pkg.pr.new/volarjs/volar.js/@volar/kit@28cbdee(typescript@5.7.0-dev.20240825)': + '@volar/kit@https://pkg.pr.new/volarjs/volar.js/@volar/kit@0e1be44(typescript@5.7.0-dev.20240825)': dependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee - '@volar/typescript': https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 + '@volar/typescript': https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 typesafe-path: 0.2.2 typescript: 5.7.0-dev.20240825 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - '@volar/language-core@https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee': + '@volar/language-core@https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44': dependencies: - '@volar/source-map': https://pkg.pr.new/volarjs/volar.js/@volar/source-map@28cbdee + '@volar/source-map': https://pkg.pr.new/volarjs/volar.js/@volar/source-map@0e1be44 - '@volar/language-server@https://pkg.pr.new/volarjs/volar.js/@volar/language-server@28cbdee': + '@volar/language-server@https://pkg.pr.new/volarjs/volar.js/@volar/language-server@0e1be44': dependencies: - '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee - '@volar/typescript': https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee + '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 + '@volar/typescript': https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44 path-browserify: 1.0.1 request-light: 0.7.0 vscode-languageserver: 9.0.1 @@ -4443,31 +4443,31 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - '@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee': + '@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44': dependencies: - '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee + '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - '@volar/source-map@https://pkg.pr.new/volarjs/volar.js/@volar/source-map@28cbdee': {} + '@volar/source-map@https://pkg.pr.new/volarjs/volar.js/@volar/source-map@0e1be44': {} - '@volar/test-utils@https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@28cbdee': + '@volar/test-utils@https://pkg.pr.new/volarjs/volar.js/@volar/test-utils@0e1be44': dependencies: - '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee - '@volar/language-server': https://pkg.pr.new/volarjs/volar.js/@volar/language-server@28cbdee + '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44 + '@volar/language-server': https://pkg.pr.new/volarjs/volar.js/@volar/language-server@0e1be44 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - '@volar/typescript@https://pkg.pr.new/volarjs/volar.js/@volar/typescript@28cbdee': + '@volar/typescript@https://pkg.pr.new/volarjs/volar.js/@volar/typescript@0e1be44': dependencies: - '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@28cbdee + '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@0e1be44 path-browserify: 1.0.1 vscode-uri: 3.0.8 - '@volar/vscode@https://pkg.pr.new/volarjs/volar.js/@volar/vscode@28cbdee': + '@volar/vscode@https://pkg.pr.new/volarjs/volar.js/@volar/vscode@0e1be44': dependencies: - '@volar/language-server': https://pkg.pr.new/volarjs/volar.js/@volar/language-server@28cbdee + '@volar/language-server': https://pkg.pr.new/volarjs/volar.js/@volar/language-server@0e1be44 path-browserify: 1.0.1 vscode-languageclient: 9.0.1 vscode-nls: 5.2.0 @@ -6761,61 +6761,61 @@ snapshots: - supports-color - terser - volar-service-css@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee): + volar-service-css@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44): dependencies: vscode-css-languageservice: 6.3.0 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 - volar-service-emmet@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee): + volar-service-emmet@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44): dependencies: '@emmetio/css-parser': 0.4.0 '@emmetio/html-matcher': 1.3.0 '@vscode/emmet-helper': 2.9.3 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 - volar-service-html@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee): + volar-service-html@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44): dependencies: vscode-html-languageservice: 5.3.0 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 - volar-service-json@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee): + volar-service-json@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44): dependencies: vscode-json-languageservice: 5.4.0 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 - volar-service-pug-beautify@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee): + volar-service-pug-beautify@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44): dependencies: '@johnsoncodehk/pug-beautify': 0.2.2 optionalDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 volar-service-pug@0.0.61: dependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 muggle-string: 0.4.1 pug-lexer: 5.0.1 pug-parser: 6.0.0 - volar-service-html: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee) + volar-service-html: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44) vscode-html-languageservice: 5.3.0 vscode-languageserver-textdocument: 1.0.12 - volar-service-typescript-twoslash-queries@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee): + volar-service-typescript-twoslash-queries@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44): dependencies: vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 - volar-service-typescript@https://pkg.pr.new/volarjs/services/volar-service-typescript@177b9ed(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee): + volar-service-typescript@https://pkg.pr.new/volarjs/services/volar-service-typescript@177b9ed(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44): dependencies: path-browserify: 1.0.1 semver: 7.6.3 @@ -6824,7 +6824,7 @@ snapshots: vscode-nls: 5.2.0 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@28cbdee + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@0e1be44 vscode-css-languageservice@6.3.0: dependencies: From 5b5132222b460afc73e9cd96f1b21c3c5fd073c8 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 29 Aug 2024 06:16:57 +0800 Subject: [PATCH 2/4] Update base.ts --- packages/component-meta/lib/base.ts | 33 ++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/packages/component-meta/lib/base.ts b/packages/component-meta/lib/base.ts index 64a8f46b90..cda971c749 100644 --- a/packages/component-meta/lib/base.ts +++ b/packages/component-meta/lib/base.ts @@ -83,14 +83,6 @@ export function baseCreate( ]; }; - try { - const libDir = require.resolve(`${commandLine.vueOptions.lib}/package.json`, { paths: [rootPath] }) - .slice(0, -'package.json'.length); - const globalTypesPath = `${libDir}__globalTypes_${commandLine.vueOptions.target}_${commandLine.vueOptions.strictTemplates}.d.ts`; - const globalTypesContents = vue.generateGlobalTypes(commandLine.vueOptions.lib, commandLine.vueOptions.target, commandLine.vueOptions.strictTemplates); - ts.sys.writeFile(globalTypesPath, globalTypesContents); - } catch { } - const vueLanguagePlugin = vue.createVueLanguagePlugin( ts, projectHost.getCompilationSettings(), @@ -143,6 +135,31 @@ export function baseCreate( const { languageServiceHost } = createLanguageServiceHost(ts, ts.sys, language, s => s, projectHost); const tsLs = ts.createLanguageService(languageServiceHost); + const fileExists = languageServiceHost.fileExists.bind(languageServiceHost); + const getScriptSnapshot = languageServiceHost.getScriptSnapshot.bind(languageServiceHost); + const globalTypesName = `__globalTypes_${commandLine.vueOptions.target}_${commandLine.vueOptions.strictTemplates}.d.ts`; + const snapshots = new Map(); + languageServiceHost.fileExists = path => { + if (path.endsWith(globalTypesName)) { + return true; + } + return fileExists(path); + }; + languageServiceHost.getScriptSnapshot = path => { + if (path.endsWith(globalTypesName)) { + if (!snapshots.has(path)) { + const contents = vue.generateGlobalTypes(commandLine.vueOptions.lib, commandLine.vueOptions.target, commandLine.vueOptions.strictTemplates); + snapshots.set(path, { + getText: (start, end) => contents.substring(start, end), + getLength: () => contents.length, + getChangeRange: () => undefined, + }); + } + return snapshots.get(path)!; + } + return getScriptSnapshot(path); + }; + if (checkerOptions.forceUseTs) { const getScriptKind = languageServiceHost.getScriptKind?.bind(languageServiceHost); languageServiceHost.getScriptKind = fileName => { From da800b6f5ebf729356d06ec950c293d234cdafb8 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 29 Aug 2024 06:52:32 +0800 Subject: [PATCH 3/4] Remove ensureGlobalTypesHolder --- .../language-server/tests/completions.spec.ts | 14 -------------- .../language-server/tests/definitions.spec.ts | 12 ------------ packages/language-server/tests/inlayHints.spec.ts | 13 ------------- packages/language-server/tests/references.spec.ts | 12 ------------ packages/language-server/tests/renaming.spec.ts | 15 --------------- 5 files changed, 66 deletions(-) diff --git a/packages/language-server/tests/completions.spec.ts b/packages/language-server/tests/completions.spec.ts index 044f28966f..3460d95c1e 100644 --- a/packages/language-server/tests/completions.spec.ts +++ b/packages/language-server/tests/completions.spec.ts @@ -244,7 +244,6 @@ describe('Completions', async () => { }); it('#2511', async () => { - await ensureGlobalTypesHolder('tsconfigProject'); await prepareDocument('tsconfigProject/component-for-auto-import.vue', 'vue', ``); expect( (await requestCompletionItem('tsconfigProject/fixture.vue', 'vue', ` @@ -290,7 +289,6 @@ describe('Completions', async () => { }); it('Alias path', async () => { - await ensureGlobalTypesHolder('tsconfigProject'); await requestCompletionItem('tsconfigProject/fixture.vue', 'vue', ` `); expect( (await requestCompletionItem('tsconfigProject/fixture.vue', 'vue', ` @@ -375,7 +371,6 @@ describe('Completions', async () => { }); it('core#8811', async () => { - await ensureGlobalTypesHolder('tsconfigProject'); await requestCompletionItem('tsconfigProject/fixture.vue', 'vue', `