From cc48e83b99c2eccdb94677cd68384237937ccc0b Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 14 Mar 2024 02:46:33 +0800 Subject: [PATCH 01/16] feat(language-server): generate template virtual code --- packages/compiler/package.json | 2 +- packages/language-server/src/index.ts | 28 ++- .../src/language-service/globalTypes.ts | 124 +++++++++++++ .../src/language-service/index.ts | 166 ++++++++++++++---- pnpm-lock.yaml | 12 +- 5 files changed, 278 insertions(+), 54 deletions(-) create mode 100644 packages/language-server/src/language-service/globalTypes.ts diff --git a/packages/compiler/package.json b/packages/compiler/package.json index b190bf2..f9d535c 100644 --- a/packages/compiler/package.json +++ b/packages/compiler/package.json @@ -31,7 +31,7 @@ "dependencies": { "@babel/parser": "^7.22.14", "@babel/types": "^7.22.11", - "@vue/compiler-dom": "^3.3.4", + "@vue/compiler-dom": "^3.4.21", "estree-walker": "^2.0.2", "hash-sum": "^2.0.0", "line-column": "^1.0.2", diff --git a/packages/language-server/src/index.ts b/packages/language-server/src/index.ts index 7a6aba4..84d70ad 100644 --- a/packages/language-server/src/index.ts +++ b/packages/language-server/src/index.ts @@ -3,13 +3,15 @@ import { createServer, createTypeScriptProjectProviderFactory, loadTsdkByPath, -} from '@volar/language-server/node' -import { create as createCssService } from 'volar-service-css' -import { create as createEmmetService } from 'volar-service-emmet' -import { create as createHtmlService } from 'volar-service-html' -import { create as createTypeScriptService } from 'volar-service-typescript' +} from '@volar/language-server/node'; +import type * as ts from 'typescript'; +import { create as createCssService } from 'volar-service-css'; +import { create as createEmmetService } from 'volar-service-emmet'; +import { create as createHtmlService } from 'volar-service-html'; +import { create as createTypeScriptService } from 'volar-service-typescript'; -import { createVueVineLanguagePlugin } from './language-service' +import { VueCompilerOptions, createParsedCommandLine, resolveVueCompilerOptions } from '@vue/language-core'; +import { createVueVineLanguagePlugin } from './language-service'; const connection = createConnection() const server = createServer(connection) @@ -29,8 +31,18 @@ connection.onInitialize((params) => { tsdk.diagnosticMessages, ), { - getLanguagePlugins() { - return [createVueVineLanguagePlugin(tsdk.typescript)] + getLanguagePlugins(env, projectContext) { + let compilerOptions: ts.CompilerOptions = {}; + let vueCompilerOptions: VueCompilerOptions; + if (projectContext.typescript?.configFileName) { + const { vueOptions, options } = createParsedCommandLine(tsdk.typescript, tsdk.typescript.sys, projectContext.typescript.configFileName); + vueCompilerOptions = resolveVueCompilerOptions(vueOptions); + compilerOptions = options; + } + else { + vueCompilerOptions = resolveVueCompilerOptions({}); + } + return [createVueVineLanguagePlugin(tsdk.typescript, compilerOptions, vueCompilerOptions)] }, getServicePlugins() { return [ diff --git a/packages/language-server/src/language-service/globalTypes.ts b/packages/language-server/src/language-service/globalTypes.ts new file mode 100644 index 0000000..1a1c808 --- /dev/null +++ b/packages/language-server/src/language-service/globalTypes.ts @@ -0,0 +1,124 @@ +import { getSlotsPropertyName, type VueCompilerOptions } from "@vue/language-core"; + +// copy from https://github.com/vuejs/language-tools/blob/28b1dd6e6bf374d17887e47d1625f080da832925/packages/language-core/lib/generators/script.ts#L190 +export function generateGlobalHelperTypes(vueCompilerOptions: VueCompilerOptions) { + const fnPropsType = `(K extends { $props: infer Props } ? Props : any)${vueCompilerOptions.strictTemplates ? '' : ' & Record'}`; + return ` +; declare global { +// @ts-ignore +type __VLS_IntrinsicElements = __VLS_PickNotAny>>; +// @ts-ignore +type __VLS_Element = __VLS_PickNotAny; +// @ts-ignore +type __VLS_GlobalComponents = ${[ + `__VLS_PickNotAny`, + `__VLS_PickNotAny`, + `__VLS_PickNotAny`, + `Pick` + ].join(' & ')}; +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): [ + T[number], // item + number, // key + number, // index +][]; +function __VLS_getVForSourceType }>(source: T): [ + T extends { [Symbol.iterator](): Iterator } ? T1 : never, // item + number, // key + undefined, // index +][]; +function __VLS_getVForSourceType(source: T): [ + T[keyof T], // item + keyof T, // key + number, // index +][]; + +// @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]; +function __VLS_directiveFunction(dir: T): + T extends import('${vueCompilerOptions.lib}').ObjectDirective | import('${vueCompilerOptions.lib}').FunctionDirective ? (value: V) => void + : T; +function __VLS_withScope(ctx: T, scope: K): ctx is T & K; +function __VLS_makeOptional(t: T): { [K in keyof T]?: T[K] }; + +type __VLS_SelfComponent = string extends N ? {} : N extends string ? { [P in N]: C } : {}; +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 }'} + +type __VLS_FillingEventArg_ParametersLength any> = __VLS_IsAny> extends true ? -1 : Parameters['length']; +type __VLS_FillingEventArg = E extends (...args: any) => any ? __VLS_FillingEventArg_ParametersLength extends 0 ? ($event?: undefined) => ReturnType : E : E; +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_elementAsFunctionalComponent(t: T): (_: T${vueCompilerOptions.strictTemplates ? '' : ' & Record'}, ctx?: any) => { __ctx?: { attrs?: any, expose?: any, slots?: any, emit?: any, props?: T${vueCompilerOptions.strictTemplates ? '' : ' & Record'} } }; +function __VLS_functionalComponentArgsRest any>(t: T): Parameters['length'] extends 2 ? [any] : []; +function __VLS_pickEvent(emitEvent: E1, propEvent: E2): __VLS_FillingEventArg< + __VLS_PickNotAny< + __VLS_AsFunctionOrAny, + __VLS_AsFunctionOrAny + > +> | undefined; +function __VLS_pickFunctionalComponentCtx(comp: T, compInstance: K): __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_AsFunctionOrAny = unknown extends F ? any : ((...args: any) => any) extends F ? F : any; + +function __VLS_normalizeSlot(s: S): S extends () => infer R ? (props: {}) => R : S; + +/** + * 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]; } & {}; +} +`; +} diff --git a/packages/language-server/src/language-service/index.ts b/packages/language-server/src/language-service/index.ts index eb9cc12..54d27ab 100644 --- a/packages/language-server/src/language-service/index.ts +++ b/packages/language-server/src/language-service/index.ts @@ -1,16 +1,21 @@ -import type { - CodeInformation, - LanguagePlugin, - VirtualCode, -} from '@volar/language-core' import { + buildMappings, forEachEmbeddedCode, -} from '@volar/language-core' -import type * as ts from 'typescript' + replaceAll, + toString, + type CodeInformation, + type LanguagePlugin, + type Segment, + type VirtualCode, + type VueCompilerOptions +} from '@vue/language-core' +import { generate as generateTemplate } from '@vue/language-core/lib/generators/template' import { turnBackToCRLF } from 'src/utils' +import type * as ts from 'typescript' +import { generateGlobalHelperTypes } from './globalTypes' import { createVineFileCtx } from './vine-ctx' -export interface VueVineCode extends VirtualCode {} +export interface VueVineCode extends VirtualCode { } const FULL_FEATURES = { completion: true, @@ -21,21 +26,27 @@ const FULL_FEATURES = { verification: true, } satisfies CodeInformation -export function createVueVineLanguagePlugin(ts: typeof import('typescript')): LanguagePlugin { +export function createVueVineLanguagePlugin( + ts: typeof import('typescript'), + compilerOptions: ts.CompilerOptions, + vueCompilerOptions: VueCompilerOptions, +): LanguagePlugin { + let globalTypesHolder: string | undefined; return { createVirtualCode(id, langaugeId, snapshot) { if (id.endsWith('.vine.ts') && langaugeId === 'typescript') { - return createVueVineCode(ts, id, snapshot) + globalTypesHolder ??= id; + return createVueVineCode(ts, id, snapshot, compilerOptions, vueCompilerOptions, globalTypesHolder === id) } }, updateVirtualCode(id, _oldVirtualCode, newSnapshot) { - return createVueVineCode(ts, id, newSnapshot) + return createVueVineCode(ts, id, newSnapshot, compilerOptions, vueCompilerOptions, globalTypesHolder === id) }, typescript: { extraFileExtensions: [], getScript(rootVirtualCode) { for (const code of forEachEmbeddedCode(rootVirtualCode)) { - if (code.id === 'script') { + if (code.id === 'root') { return { code, extension: '.ts', @@ -52,10 +63,116 @@ function createVueVineCode( ts: typeof import('typescript'), sourceFileName: string, snapshot: ts.IScriptSnapshot, + compilerOptions: ts.CompilerOptions, + vueCompilerOptions: VueCompilerOptions, + withGlobalTypes: boolean, ): VueVineCode { const content = snapshot.getText(0, snapshot.getLength()) const vineFileCtx = createVineFileCtx(sourceFileName, content) + const tsCodeSegments: Segment[] = []; + + let currentOffset = 0; + + for (const vineCompFn of vineFileCtx.vineCompFns) { + if (!vineCompFn.templateStringNode || !vineCompFn.templateReturn) { + continue + } + generateScriptUntil(vineCompFn.templateReturn.start!); + for (const quasi of vineCompFn.templateStringNode.quasi.quasis) { + tsCodeSegments.push('\n{\n'); + for (const [type, segment] of generateTemplate( + ts, + compilerOptions, + vueCompilerOptions, + { + ast: vineCompFn.templateAst, + errors: [], + warnings: [], + name: 'template', + start: vineCompFn.templateStringNode.start!, + end: vineCompFn.templateStringNode.end!, + startTagEnd: quasi.start!, + endTagStart: quasi.end!, + lang: 'html', + content: vineCompFn.templateSource, + attrs: {}, + }, + false, + new Set(), + false, + undefined, + undefined, + false + )) { + if (type !== 'ts') { + continue; + } + if (typeof segment === 'string') { + tsCodeSegments.push(segment); + } + else if (segment[1] === 'template') { + tsCodeSegments.push([ + segment[0], + undefined, + segment[2] + quasi.start!, + segment[3], + ]); + } + else { + tsCodeSegments.push(segment[0]) + } + } + tsCodeSegments.push('\n}\n'); + } + generateScriptUntil(vineCompFn.templateStringNode.quasi.start!); + + // clear the template string + tsCodeSegments.push('``'); + currentOffset = vineCompFn.templateStringNode.quasi.end!; + } + generateScriptUntil(snapshot.getLength()); + + replaceAll(tsCodeSegments, /__VLS_ctx\./g, ''); // TODO: replace __VLS_ctx.xxx with _unref(xxx) + replaceAll(tsCodeSegments, /__VLS_components\./g, ''); + + if (withGlobalTypes) { + tsCodeSegments.push(generateGlobalHelperTypes(vueCompilerOptions)) + } + + const tsCode = toString(tsCodeSegments); + const tsCodeMappings = buildMappings(tsCodeSegments); + + return { + id: 'root', + languageId: 'typescript', + snapshot: { + getLength() { + return tsCode.length + }, + getText(start, end) { + return tsCode.substring(start, end) + }, + getChangeRange() { + return undefined; + }, + }, + mappings: tsCodeMappings, + embeddedCodes: [ + ...createTemplateHTMLEmbeddedCodes(), + ...createStyleEmbeddedCodes(), + ], + } + + function generateScriptUntil(targetOffset: number) { + tsCodeSegments.push([ + snapshot.getText(currentOffset, targetOffset), + undefined, + currentOffset, + FULL_FEATURES, + ]); + currentOffset = targetOffset; + } function* createStyleEmbeddedCodes(): Generator { for (const { lang, source: bableParsedSource, range, compCtx } of Object.values( @@ -122,29 +239,4 @@ function createVueVineCode( } } } - - return { - id: 'root', - languageId: 'typescript', - snapshot, - mappings: [ - { - sourceOffsets: [0], - generatedOffsets: [0], - lengths: [snapshot.getLength()], - data: { - completion: true, - format: true, - navigation: true, - semantic: true, - structure: true, - verification: true, - }, - }, - ], - embeddedCodes: [ - ...createTemplateHTMLEmbeddedCodes(), - ...createStyleEmbeddedCodes(), - ], - } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d2b2ed0..804b24f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,8 +78,8 @@ importers: specifier: ^7.22.11 version: 7.22.15 '@vue/compiler-dom': - specifier: ^3.3.4 - version: 3.3.4 + specifier: ^3.4.21 + version: 3.4.21 estree-walker: specifier: ^2.0.2 version: 2.0.2 @@ -747,7 +747,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.22.15 - dev: false /@babel/runtime@7.22.6: resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} @@ -3162,7 +3161,6 @@ packages: entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.0.2 - dev: false /@vue/compiler-dom@3.3.4: resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} @@ -3175,7 +3173,6 @@ packages: dependencies: '@vue/compiler-core': 3.4.21 '@vue/shared': 3.4.21 - dev: false /@vue/compiler-sfc@3.3.4: resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} @@ -3210,9 +3207,9 @@ packages: dependencies: '@volar/language-core': 1.10.4 '@volar/source-map': 1.10.4 - '@vue/compiler-dom': 3.3.4 + '@vue/compiler-dom': 3.4.21 '@vue/reactivity': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/shared': 3.4.21 minimatch: 9.0.3 muggle-string: 0.3.1 typescript: 5.2.2 @@ -3303,7 +3300,6 @@ packages: /@vue/shared@3.4.21: resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} - dev: false /@vue/test-utils@2.4.1(vue@3.3.4): resolution: {integrity: sha512-VO8nragneNzUZUah6kOjiFmD/gwRjUauG9DROh6oaOeFwX1cZRUNHhdeogE8635cISigXFTtGLUQWx5KCb0xeg==} From 1a5ee52010c07dc28363f01a3bc431e181f9ba57 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 14 Mar 2024 02:52:38 +0800 Subject: [PATCH 02/16] chore: lint fix --- packages/language-server/src/index.ts | 29 ++--- .../src/language-service/globalTypes.ts | 110 +++++++++--------- .../src/language-service/index.ts | 54 ++++----- 3 files changed, 97 insertions(+), 96 deletions(-) diff --git a/packages/language-server/src/index.ts b/packages/language-server/src/index.ts index 84d70ad..8d728a5 100644 --- a/packages/language-server/src/index.ts +++ b/packages/language-server/src/index.ts @@ -3,15 +3,16 @@ import { createServer, createTypeScriptProjectProviderFactory, loadTsdkByPath, -} from '@volar/language-server/node'; -import type * as ts from 'typescript'; -import { create as createCssService } from 'volar-service-css'; -import { create as createEmmetService } from 'volar-service-emmet'; -import { create as createHtmlService } from 'volar-service-html'; -import { create as createTypeScriptService } from 'volar-service-typescript'; +} from '@volar/language-server/node' +import type * as ts from 'typescript' +import { create as createCssService } from 'volar-service-css' +import { create as createEmmetService } from 'volar-service-emmet' +import { create as createHtmlService } from 'volar-service-html' +import { create as createTypeScriptService } from 'volar-service-typescript' -import { VueCompilerOptions, createParsedCommandLine, resolveVueCompilerOptions } from '@vue/language-core'; -import { createVueVineLanguagePlugin } from './language-service'; +import type { VueCompilerOptions } from '@vue/language-core' +import { createParsedCommandLine, resolveVueCompilerOptions } from '@vue/language-core' +import { createVueVineLanguagePlugin } from './language-service' const connection = createConnection() const server = createServer(connection) @@ -32,15 +33,15 @@ connection.onInitialize((params) => { ), { getLanguagePlugins(env, projectContext) { - let compilerOptions: ts.CompilerOptions = {}; - let vueCompilerOptions: VueCompilerOptions; + let compilerOptions: ts.CompilerOptions = {} + let vueCompilerOptions: VueCompilerOptions if (projectContext.typescript?.configFileName) { - const { vueOptions, options } = createParsedCommandLine(tsdk.typescript, tsdk.typescript.sys, projectContext.typescript.configFileName); - vueCompilerOptions = resolveVueCompilerOptions(vueOptions); - compilerOptions = options; + const { vueOptions, options } = createParsedCommandLine(tsdk.typescript, tsdk.typescript.sys, projectContext.typescript.configFileName) + vueCompilerOptions = resolveVueCompilerOptions(vueOptions) + compilerOptions = options } else { - vueCompilerOptions = resolveVueCompilerOptions({}); + vueCompilerOptions = resolveVueCompilerOptions({}) } return [createVueVineLanguagePlugin(tsdk.typescript, compilerOptions, vueCompilerOptions)] }, diff --git a/packages/language-server/src/language-service/globalTypes.ts b/packages/language-server/src/language-service/globalTypes.ts index 1a1c808..a710b99 100644 --- a/packages/language-server/src/language-service/globalTypes.ts +++ b/packages/language-server/src/language-service/globalTypes.ts @@ -1,8 +1,8 @@ -import { getSlotsPropertyName, type VueCompilerOptions } from "@vue/language-core"; +import { type VueCompilerOptions, getSlotsPropertyName } from '@vue/language-core' // copy from https://github.com/vuejs/language-tools/blob/28b1dd6e6bf374d17887e47d1625f080da832925/packages/language-core/lib/generators/script.ts#L190 export function generateGlobalHelperTypes(vueCompilerOptions: VueCompilerOptions) { - const fnPropsType = `(K extends { $props: infer Props } ? Props : any)${vueCompilerOptions.strictTemplates ? '' : ' & Record'}`; + const fnPropsType = `(K extends { $props: infer Props } ? Props : any)${vueCompilerOptions.strictTemplates ? '' : ' & Record'}` return ` ; declare global { // @ts-ignore @@ -14,7 +14,7 @@ type __VLS_GlobalComponents = ${[ `__VLS_PickNotAny`, `__VLS_PickNotAny`, `__VLS_PickNotAny`, - `Pick` + `Pick`, ].join(' & ')}; type __VLS_IsAny = 0 extends 1 & T ? true : false; type __VLS_PickNotAny = __VLS_IsAny extends true ? B : A; @@ -25,19 +25,19 @@ const __VLS_intrinsicElements: __VLS_IntrinsicElements; function __VLS_getVForSourceType(source: number): [number, number, number][]; function __VLS_getVForSourceType(source: string): [string, number, number][]; function __VLS_getVForSourceType(source: T): [ - T[number], // item - number, // key - number, // index + T[number], // item + number, // key + number, // index ][]; function __VLS_getVForSourceType }>(source: T): [ - T extends { [Symbol.iterator](): Iterator } ? T1 : never, // item - number, // key - undefined, // index + T extends { [Symbol.iterator](): Iterator } ? T1 : never, // item + number, // key + undefined, // index ][]; function __VLS_getVForSourceType(source: T): [ - T[keyof T], // item - keyof T, // key - number, // index + T[keyof T], // item + keyof T, // key + number, // index ][]; // @ts-ignore @@ -45,49 +45,49 @@ function __VLS_getSlotParams(slot: T): Parameters<__VLS_PickNotAny(slot: T): Parameters<__VLS_PickNotAny, (...args: any[]) => any>>[0]; function __VLS_directiveFunction(dir: T): - T extends import('${vueCompilerOptions.lib}').ObjectDirective | import('${vueCompilerOptions.lib}').FunctionDirective ? (value: V) => void - : T; + T extends import('${vueCompilerOptions.lib}').ObjectDirective | import('${vueCompilerOptions.lib}').FunctionDirective ? (value: V) => void + : T; function __VLS_withScope(ctx: T, scope: K): ctx is T & K; function __VLS_makeOptional(t: T): { [K in keyof T]?: T[K] }; type __VLS_SelfComponent = string extends N ? {} : N extends string ? { [P in N]: C } : {}; 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 }'} + 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 }'} type __VLS_FillingEventArg_ParametersLength any> = __VLS_IsAny> extends true ? -1 : Parameters['length']; type __VLS_FillingEventArg = E extends (...args: any) => any ? __VLS_FillingEventArg_ParametersLength extends 0 ? ($event?: undefined) => ReturnType : E : E; 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'} } }; + 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_elementAsFunctionalComponent(t: T): (_: T${vueCompilerOptions.strictTemplates ? '' : ' & Record'}, ctx?: any) => { __ctx?: { attrs?: any, expose?: any, slots?: any, emit?: any, props?: T${vueCompilerOptions.strictTemplates ? '' : ' & Record'} } }; function __VLS_functionalComponentArgsRest any>(t: T): Parameters['length'] extends 2 ? [any] : []; function __VLS_pickEvent(emitEvent: E1, propEvent: E2): __VLS_FillingEventArg< - __VLS_PickNotAny< - __VLS_AsFunctionOrAny, - __VLS_AsFunctionOrAny - > + __VLS_PickNotAny< + __VLS_AsFunctionOrAny, + __VLS_AsFunctionOrAny + > > | undefined; function __VLS_pickFunctionalComponentCtx(comp: T, compInstance: K): __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 + '__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 : - {}; + '__ctx' extends keyof __VLS_PickNotAny ? K extends { __ctx?: { props?: infer P } } ? NonNullable

: never + : T extends (props: infer P, ...args: any) => any ? P : + {}; type __VLS_AsFunctionOrAny = unknown extends F ? any : ((...args: any) => any) extends F ? F : any; function __VLS_normalizeSlot(s: S): S extends () => infer R ? (props: {}) => R : S; @@ -98,27 +98,27 @@ function __VLS_normalizeSlot(s: S): S extends () => infer R ? (props: {}) => // 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; + ? 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 + __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; + ? 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 - } - > + __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]; } & {}; } -`; +` } diff --git a/packages/language-server/src/language-service/index.ts b/packages/language-server/src/language-service/index.ts index 54d27ab..4aa4bf4 100644 --- a/packages/language-server/src/language-service/index.ts +++ b/packages/language-server/src/language-service/index.ts @@ -1,13 +1,13 @@ import { - buildMappings, - forEachEmbeddedCode, - replaceAll, - toString, type CodeInformation, type LanguagePlugin, type Segment, type VirtualCode, - type VueCompilerOptions + type VueCompilerOptions, + buildMappings, + forEachEmbeddedCode, + replaceAll, + toString, } from '@vue/language-core' import { generate as generateTemplate } from '@vue/language-core/lib/generators/template' import { turnBackToCRLF } from 'src/utils' @@ -31,11 +31,11 @@ export function createVueVineLanguagePlugin( compilerOptions: ts.CompilerOptions, vueCompilerOptions: VueCompilerOptions, ): LanguagePlugin { - let globalTypesHolder: string | undefined; + let globalTypesHolder: string | undefined return { createVirtualCode(id, langaugeId, snapshot) { if (id.endsWith('.vine.ts') && langaugeId === 'typescript') { - globalTypesHolder ??= id; + globalTypesHolder ??= id return createVueVineCode(ts, id, snapshot, compilerOptions, vueCompilerOptions, globalTypesHolder === id) } }, @@ -70,17 +70,17 @@ function createVueVineCode( const content = snapshot.getText(0, snapshot.getLength()) const vineFileCtx = createVineFileCtx(sourceFileName, content) - const tsCodeSegments: Segment[] = []; + const tsCodeSegments: Segment[] = [] - let currentOffset = 0; + let currentOffset = 0 for (const vineCompFn of vineFileCtx.vineCompFns) { if (!vineCompFn.templateStringNode || !vineCompFn.templateReturn) { continue } - generateScriptUntil(vineCompFn.templateReturn.start!); + generateScriptUntil(vineCompFn.templateReturn.start!) for (const quasi of vineCompFn.templateStringNode.quasi.quasis) { - tsCodeSegments.push('\n{\n'); + tsCodeSegments.push('\n{\n') for (const [type, segment] of generateTemplate( ts, compilerOptions, @@ -103,13 +103,13 @@ function createVueVineCode( false, undefined, undefined, - false + false, )) { if (type !== 'ts') { - continue; + continue } if (typeof segment === 'string') { - tsCodeSegments.push(segment); + tsCodeSegments.push(segment) } else if (segment[1] === 'template') { tsCodeSegments.push([ @@ -117,31 +117,31 @@ function createVueVineCode( undefined, segment[2] + quasi.start!, segment[3], - ]); + ]) } else { tsCodeSegments.push(segment[0]) } } - tsCodeSegments.push('\n}\n'); + tsCodeSegments.push('\n}\n') } - generateScriptUntil(vineCompFn.templateStringNode.quasi.start!); + generateScriptUntil(vineCompFn.templateStringNode.quasi.start!) // clear the template string - tsCodeSegments.push('``'); - currentOffset = vineCompFn.templateStringNode.quasi.end!; + tsCodeSegments.push('``') + currentOffset = vineCompFn.templateStringNode.quasi.end! } - generateScriptUntil(snapshot.getLength()); + generateScriptUntil(snapshot.getLength()) - replaceAll(tsCodeSegments, /__VLS_ctx\./g, ''); // TODO: replace __VLS_ctx.xxx with _unref(xxx) - replaceAll(tsCodeSegments, /__VLS_components\./g, ''); + replaceAll(tsCodeSegments, /__VLS_ctx\./g, '') // TODO: replace __VLS_ctx.xxx with _unref(xxx) + replaceAll(tsCodeSegments, /__VLS_components\./g, '') if (withGlobalTypes) { tsCodeSegments.push(generateGlobalHelperTypes(vueCompilerOptions)) } - const tsCode = toString(tsCodeSegments); - const tsCodeMappings = buildMappings(tsCodeSegments); + const tsCode = toString(tsCodeSegments) + const tsCodeMappings = buildMappings(tsCodeSegments) return { id: 'root', @@ -154,7 +154,7 @@ function createVueVineCode( return tsCode.substring(start, end) }, getChangeRange() { - return undefined; + return undefined }, }, mappings: tsCodeMappings, @@ -170,8 +170,8 @@ function createVueVineCode( undefined, currentOffset, FULL_FEATURES, - ]); - currentOffset = targetOffset; + ]) + currentOffset = targetOffset } function* createStyleEmbeddedCodes(): Generator { From 84133d1deb7556229a62708321603c88f02a5965 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Fri, 15 Mar 2024 23:33:08 +0800 Subject: [PATCH 03/16] fix mapping --- packages/compiler/src/template/compose.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/compiler/src/template/compose.ts b/packages/compiler/src/template/compose.ts index 46f0de6..2d45fb9 100644 --- a/packages/compiler/src/template/compose.ts +++ b/packages/compiler/src/template/compose.ts @@ -14,7 +14,8 @@ export function compileVineTemplate( params: Partial, ) { return compile(source, { - mode: 'module', + // TODO: this option break virtual code mapping + // mode: 'module', hoistStatic: true, cacheHandlers: true, inline: true, From 421ec369e54c3d2a8f1018110ed5a6e9c1d7b1aa Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Sat, 16 Mar 2024 00:07:54 +0800 Subject: [PATCH 04/16] implement todo --- packages/language-server/src/language-service/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/language-server/src/language-service/index.ts b/packages/language-server/src/language-service/index.ts index 4aa4bf4..871acec 100644 --- a/packages/language-server/src/language-service/index.ts +++ b/packages/language-server/src/language-service/index.ts @@ -133,7 +133,11 @@ function createVueVineCode( } generateScriptUntil(snapshot.getLength()) - replaceAll(tsCodeSegments, /__VLS_ctx\./g, '') // TODO: replace __VLS_ctx.xxx with _unref(xxx) + // replace __VLS_ctx.foo with (await import('vue').unref(foo)) + replaceAll(tsCodeSegments, /(?<=__VLS_ctx\.\w+\b)/g, ')') + replaceAll(tsCodeSegments, /(__VLS_ctx\.)/g, `(await import('vue')).unref(`) + + // replace __VLS_components.foo with foo replaceAll(tsCodeSegments, /__VLS_components\./g, '') if (withGlobalTypes) { From c7b5119459bd43f6c8f96a00ac9a8ec5b43a2195 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Sat, 16 Mar 2024 00:20:25 +0800 Subject: [PATCH 05/16] fix component types --- packages/language-server/src/language-service/index.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/language-server/src/language-service/index.ts b/packages/language-server/src/language-service/index.ts index 871acec..1249a5e 100644 --- a/packages/language-server/src/language-service/index.ts +++ b/packages/language-server/src/language-service/index.ts @@ -133,6 +133,10 @@ function createVueVineCode( } generateScriptUntil(snapshot.getLength()) + // replace typeof __VLS_ctx.foo with import('vue').UnwrapRef(typeof foo) + replaceAll(tsCodeSegments, /(?<=typeof __VLS_ctx\.\w+\b)/g, '>') + replaceAll(tsCodeSegments, /(typeof __VLS_ctx\.)/g, `import('vue').UnwrapRef Date: Sat, 16 Mar 2024 00:49:29 +0800 Subject: [PATCH 06/16] fix auto closing tags not working --- packages/vscode-ext/src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vscode-ext/src/extension.ts b/packages/vscode-ext/src/extension.ts index 1a67fe0..d559c17 100644 --- a/packages/vscode-ext/src/extension.ts +++ b/packages/vscode-ext/src/extension.ts @@ -43,7 +43,7 @@ export async function activate(context: vscode.ExtensionContext) { console.log('Vine language server started') // support for auto close tag - activateAutoInsertion('vue-vine', client) + activateAutoInsertion(['typescript'], client) const labsInfo = createLabsInfo(serverProtocol) labsInfo.addLanguageClient(client) From e126df40c4e6cb213523ef6ba43c416517746fbf Mon Sep 17 00:00:00 2001 From: ShenQingchuan Date: Thu, 21 Mar 2024 23:05:26 +0800 Subject: [PATCH 07/16] wip: try migrating to ts plugin --- package.json | 7 +- packages/language-server/package.json | 3 +- packages/language-server/src/index.ts | 2 +- packages/language-service/package.json | 43 ++++ .../src}/globalTypes.ts | 0 .../src}/index.ts | 2 +- .../src/utils.ts | 0 .../src}/vine-ctx.ts | 0 packages/language-service/tsconfig.json | 4 + packages/language-service/tsup.config.ts | 1 + packages/vscode-ext/package.json | 12 +- packages/vscode-ext/src/typescript-plugin.ts | 15 ++ packages/vscode-ext/tsconfig.json | 5 - packages/vscode-ext/tsup.config.ts | 69 +++--- pnpm-lock.yaml | 204 +++++++++++------- scripts/ext-dev.js | 9 +- 16 files changed, 251 insertions(+), 125 deletions(-) create mode 100644 packages/language-service/package.json rename packages/{language-server/src/language-service => language-service/src}/globalTypes.ts (100%) rename packages/{language-server/src/language-service => language-service/src}/index.ts (99%) rename packages/{language-server => language-service}/src/utils.ts (100%) rename packages/{language-server/src/language-service => language-service/src}/vine-ctx.ts (100%) create mode 100644 packages/language-service/tsconfig.json create mode 100644 packages/language-service/tsup.config.ts create mode 100644 packages/vscode-ext/src/typescript-plugin.ts diff --git a/package.json b/package.json index bd6d394..3f26b63 100644 --- a/package.json +++ b/package.json @@ -12,11 +12,14 @@ "dev:compiler": "cross-env NODE_ENV=development pnpm --filter @vue-vine/compiler run dev", "dev:vite": "cross-env NODE_ENV=development pnpm --filter @vue-vine/vite-plugin run dev", "dev:main": "cross-env NODE_ENV=development pnpm --filter vue-vine run dev", - "dev:ls": "cross-env NODE_ENV=production pnpm --filter @vue-vine/language-server run dev", + "dev:lang-service": "cross-env NODE_ENV=development pnpm --filter @vue-vine/language-service run dev", + "dev:lang-server": "cross-env NODE_ENV=development pnpm --filter @vue-vine/language-server run dev", "dev:ext": "cross-env NODE_ENV=development esno scripts/ext-dev.js", "build:compiler": "cross-env NODE_ENV=production pnpm --filter @vue-vine/compiler run build", "build:vite": "cross-env NODE_ENV=production pnpm --filter @vue-vine/vite-plugin run build", - "build:ls": "cross-env NODE_ENV=production pnpm --filter @vue-vine/language-server run build", + "build:ls": "cross-env NODE_ENV=production pnpm build:lang-service && pnpm build:lang-server", + "build:lang-service": "cross-env NODE_ENV=production pnpm --filter @vue-vine/language-service run build", + "build:lang-server": "cross-env NODE_ENV=production pnpm --filter @vue-vine/language-server run build", "build:eslint-parser": "cross-env NODE_ENV=production pnpm --filter @vue-vine/eslint-parser run build", "build:main": "cross-env NODE_ENV=production pnpm --filter vue-vine run build", "build:ext": "cross-env NODE_ENV=production pnpm --filter vue-vine-extension run build", diff --git a/packages/language-server/package.json b/packages/language-server/package.json index 61124cd..a28836a 100644 --- a/packages/language-server/package.json +++ b/packages/language-server/package.json @@ -39,7 +39,8 @@ "@volar/language-core": "~2.1.2", "@volar/language-server": "~2.1.2", "@volar/language-service": "~2.1.2", - "@vue-vine/compiler": "^0.0.1", + "@vue-vine/compiler": "workspace:*", + "@vue-vine/language-service": "workspace:*", "@vue/language-core": "^2.0.6", "@vue/language-service": "^2.0.6", "volar-service-css": "0.0.31", diff --git a/packages/language-server/src/index.ts b/packages/language-server/src/index.ts index 8d728a5..9a0f949 100644 --- a/packages/language-server/src/index.ts +++ b/packages/language-server/src/index.ts @@ -12,7 +12,7 @@ import { create as createTypeScriptService } from 'volar-service-typescript' import type { VueCompilerOptions } from '@vue/language-core' import { createParsedCommandLine, resolveVueCompilerOptions } from '@vue/language-core' -import { createVueVineLanguagePlugin } from './language-service' +import { createVueVineLanguagePlugin } from '@vue-vine/language-service' const connection = createConnection() const server = createServer(connection) diff --git a/packages/language-service/package.json b/packages/language-service/package.json new file mode 100644 index 0000000..1122470 --- /dev/null +++ b/packages/language-service/package.json @@ -0,0 +1,43 @@ +{ + "name": "@vue-vine/language-service", + "version": "0.0.0", + "author": "ShenQingchuan", + "license": "MIT", + "homepage": "https://github.com/vue-vine/vue-vine#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/vue-vine/vue-vine.git" + }, + "bugs": { + "url": "https://github.com/vue-vine/vue-vine/issues" + }, + "sideEffects": false, + "main": "./dist/index.js", + "typesVersions": { + "*": { + "*": [ + "./dist/*", + "./dist/index.d.ts" + ] + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "dev": "tsup -w", + "build": "tsup", + "prepublishOnly": "pnpm run build" + }, + "dependencies": { + "@volar/language-server": "~2.1.2", + "@vue-vine/compiler": "workspace:*", + "@vue/language-core": "^2.0.6" + }, + "devDependencies": { + "@types/node": "^20.11.25" + } +} diff --git a/packages/language-server/src/language-service/globalTypes.ts b/packages/language-service/src/globalTypes.ts similarity index 100% rename from packages/language-server/src/language-service/globalTypes.ts rename to packages/language-service/src/globalTypes.ts diff --git a/packages/language-server/src/language-service/index.ts b/packages/language-service/src/index.ts similarity index 99% rename from packages/language-server/src/language-service/index.ts rename to packages/language-service/src/index.ts index 2305309..16fd52c 100644 --- a/packages/language-server/src/language-service/index.ts +++ b/packages/language-service/src/index.ts @@ -11,7 +11,7 @@ import { } from '@vue/language-core' import { generate as generateTemplate } from '@vue/language-core/lib/generators/template' import type * as ts from 'typescript' -import { turnBackToCRLF } from '../utils' +import { turnBackToCRLF } from './utils' import { generateGlobalHelperTypes } from './globalTypes' import { createVineFileCtx } from './vine-ctx' diff --git a/packages/language-server/src/utils.ts b/packages/language-service/src/utils.ts similarity index 100% rename from packages/language-server/src/utils.ts rename to packages/language-service/src/utils.ts diff --git a/packages/language-server/src/language-service/vine-ctx.ts b/packages/language-service/src/vine-ctx.ts similarity index 100% rename from packages/language-server/src/language-service/vine-ctx.ts rename to packages/language-service/src/vine-ctx.ts diff --git a/packages/language-service/tsconfig.json b/packages/language-service/tsconfig.json new file mode 100644 index 0000000..596e2cf --- /dev/null +++ b/packages/language-service/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src"] +} diff --git a/packages/language-service/tsup.config.ts b/packages/language-service/tsup.config.ts new file mode 100644 index 0000000..010d372 --- /dev/null +++ b/packages/language-service/tsup.config.ts @@ -0,0 +1 @@ +export { default } from '../../tsup.config' diff --git a/packages/vscode-ext/package.json b/packages/vscode-ext/package.json index 7fba384..d336597 100644 --- a/packages/vscode-ext/package.json +++ b/packages/vscode-ext/package.json @@ -63,6 +63,13 @@ "scopeName": "source.vine-vue-template", "path": "./syntaxes/vine-vue-template.json" } + ], + "typescriptServerPlugins": [ + { + "name": "@vue-vine/typescript-plugin", + "enableForWorkspaceTypeScriptVersions": true, + "configNamespace": "typescript" + } ] }, "scripts": { @@ -73,15 +80,18 @@ "lint": "eslint src --ext ts" }, "dependencies": { - "@vue-vine/language-server": "workspace:*" + "@vue-vine/language-server": "workspace:*", + "@vue-vine/language-service": "workspace:*" }, "devDependencies": { "@changesets/changelog-github": "^0.4.8", "@changesets/cli": "^2.26.2", "@types/vscode": "1.85.0", "@volar/language-server": "~2.1.2", + "@volar/typescript": "~2.1.2", "@volar/vscode": "~2.1.2", "@vscode/vsce": "latest", + "@vue/language-core": "^2.0.6", "vscode-languageclient": "^9.0.1" } } diff --git a/packages/vscode-ext/src/typescript-plugin.ts b/packages/vscode-ext/src/typescript-plugin.ts new file mode 100644 index 0000000..b806816 --- /dev/null +++ b/packages/vscode-ext/src/typescript-plugin.ts @@ -0,0 +1,15 @@ +import { createLanguageServicePlugin } from '@volar/typescript/lib/quickstart/createLanguageServicePlugin' +import { createVueVineLanguagePlugin } from '@vue-vine/language-service' +import { resolveVueCompilerOptions } from '@vue/language-core' + +const plugin = createLanguageServicePlugin((ts) => { + return [ + createVueVineLanguagePlugin( + ts, + { /* ts.CompilerOptions */ }, + resolveVueCompilerOptions({}), + ), + ] +}) + +export default plugin diff --git a/packages/vscode-ext/tsconfig.json b/packages/vscode-ext/tsconfig.json index c5aee00..596e2cf 100644 --- a/packages/vscode-ext/tsconfig.json +++ b/packages/vscode-ext/tsconfig.json @@ -1,9 +1,4 @@ { "extends": "../../tsconfig.json", - "references": [ - { - "path": "../language-server/tsconfig.json" - } - ], "include": ["src"] } diff --git a/packages/vscode-ext/tsup.config.ts b/packages/vscode-ext/tsup.config.ts index 7a5bc9b..dbfccea 100644 --- a/packages/vscode-ext/tsup.config.ts +++ b/packages/vscode-ext/tsup.config.ts @@ -4,38 +4,47 @@ import base from '../../tsup.config' const require = createRequire(import.meta.url) -export default defineConfig({ - ...base, - entry: { - client: './src/index.ts', - server: './node_modules/@vue-vine/language-server/bin/vue-vine-language-server.js', - }, - format: 'cjs', - external: [ - 'vscode', - ], - splitting: false, - define: { 'process.env.NODE_ENV': '"production"' }, - esbuildPlugins: [ +export default defineConfig( + [ { - name: 'umd2esm', - setup(build) { - build.onResolve({ filter: /^(vscode-.*|estree-walker|jsonc-parser)/ }, (args) => { - const pathUmdMay = require.resolve(args.path, { paths: [args.resolveDir] }) - // Call twice the replace is to solve the problem of the path in Windows - let pathEsm = pathUmdMay - .replace('/umd/', '/esm/') - .replace('\\umd\\', '\\esm\\') + ...base, + entry: { + client: './src/index.ts', + server: './node_modules/@vue-vine/language-server/bin/vue-vine-language-server.js', + }, + format: 'cjs', + external: [ + 'vscode', + ], + splitting: false, + define: { 'process.env.NODE_ENV': '"production"' }, + esbuildPlugins: [ + { + name: 'umd2esm', + setup(build) { + build.onResolve({ filter: /^(vscode-.*|estree-walker|jsonc-parser)/ }, (args) => { + const pathUmdMay = require.resolve(args.path, { paths: [args.resolveDir] }) + // Call twice the replace is to solve the problem of the path in Windows + let pathEsm = pathUmdMay + .replace('/umd/', '/esm/') + .replace('\\umd\\', '\\esm\\') - if (pathEsm.includes('vscode-uri')) { - pathEsm = pathEsm - .replace('/esm/index.js', '/esm/index.mjs') - .replace('\\esm\\index.js', '\\esm\\index.mjs') - } + if (pathEsm.includes('vscode-uri')) { + pathEsm = pathEsm + .replace('/esm/index.js', '/esm/index.mjs') + .replace('\\esm\\index.js', '\\esm\\index.mjs') + } - return { path: pathEsm } - }) - }, + return { path: pathEsm } + }) + }, + }, + ], + }, + { + ...base, + entry: ['src/typescript-plugin.ts'], + outDir: './node_modules/@vue-vine/typescript-plugin', }, ], -}) +) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e20d1b7..52ff5ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -238,16 +238,19 @@ importers: dependencies: '@volar/language-core': specifier: ~2.1.2 - version: 2.1.2 + version: 2.1.3 '@volar/language-server': specifier: ~2.1.2 - version: 2.1.2 + version: 2.1.3 '@volar/language-service': specifier: ~2.1.2 - version: 2.1.2 + version: 2.1.3 '@vue-vine/compiler': - specifier: ^0.0.1 + specifier: workspace:* version: link:../compiler + '@vue-vine/language-service': + specifier: workspace:* + version: link:../language-service '@vue/language-core': specifier: ^2.0.6 version: 2.0.6(typescript@5.2.2) @@ -256,21 +259,37 @@ importers: version: 2.0.6(typescript@5.2.2) volar-service-css: specifier: 0.0.31 - version: 0.0.31(@volar/language-service@2.1.2) + version: 0.0.31(@volar/language-service@2.1.3) volar-service-emmet: specifier: 0.0.31 - version: 0.0.31(@volar/language-service@2.1.2) + version: 0.0.31(@volar/language-service@2.1.3) volar-service-html: specifier: 0.0.31 - version: 0.0.31(@volar/language-service@2.1.2) + version: 0.0.31(@volar/language-service@2.1.3) volar-service-typescript: specifier: 0.0.31-patch.1 - version: 0.0.31-patch.1(@volar/language-service@2.1.2)(@volar/typescript@2.1.2) + version: 0.0.31-patch.1(@volar/language-service@2.1.3)(@volar/typescript@2.1.3) devDependencies: '@types/node': specifier: ^20.11.25 version: 20.11.25 + packages/language-service: + dependencies: + '@volar/language-server': + specifier: ~2.1.2 + version: 2.1.3 + '@vue-vine/compiler': + specifier: workspace:* + version: link:../compiler + '@vue/language-core': + specifier: ^2.0.6 + version: 2.0.6(typescript@5.2.2) + devDependencies: + '@types/node': + specifier: ^20.11.25 + version: 20.11.27 + packages/playground: dependencies: '@vueuse/core': @@ -332,6 +351,9 @@ importers: '@vue-vine/language-server': specifier: workspace:* version: link:../language-server + '@vue-vine/language-service': + specifier: workspace:* + version: link:../language-service devDependencies: '@changesets/changelog-github': specifier: ^0.4.8 @@ -345,12 +367,18 @@ importers: '@volar/language-server': specifier: ~2.1.2 version: 2.1.2 + '@volar/typescript': + specifier: ~2.1.2 + version: 2.1.3 '@volar/vscode': specifier: ~2.1.2 version: 2.1.2 '@vscode/vsce': specifier: latest version: 2.24.0 + '@vue/language-core': + specifier: ^2.0.6 + version: 2.0.6(typescript@5.2.2) vscode-languageclient: specifier: ^9.0.1 version: 9.0.1 @@ -2076,7 +2104,7 @@ packages: /@types/jsdom@21.1.2: resolution: {integrity: sha512-bGj+7TaCkOwkJfx7HtS9p22Ij0A2aKMuz8a1+owpkxa1wU/HUBy/WAXhdv90uDdVI9rSjGvUrXmLSeA9VP3JeA==} dependencies: - '@types/node': 20.11.25 + '@types/node': 20.11.27 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true @@ -2700,6 +2728,12 @@ packages: resolution: {integrity: sha512-5qsDp0Gf6fE09UWCeK7bkVn6NxMwC9OqFWQkMMkeej8h8XjyABPdRygC2RCrqDrfVdGijqlMQeXs6yRS+vfZYA==} dependencies: '@volar/source-map': 2.1.2 + dev: true + + /@volar/language-core@2.1.3: + resolution: {integrity: sha512-F93KYZYqcYltG7NihfnLt/omMZOtrQtsh2+wj+cgx3xolopU+TZvmwlZWOjw3ObZGFj3SKBb4jJn6VSfSch6RA==} + dependencies: + '@volar/source-map': 2.1.3 /@volar/language-server@2.1.2: resolution: {integrity: sha512-5NR5Ztg+OxvDI4oRrjS0/4ZVPumWwhVq5acuK2BJbakG1kJXViYI9NOWiWITMjnliPvf12TEcSrVDBmIq54DOg==} @@ -2715,6 +2749,23 @@ packages: vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 + dev: true + + /@volar/language-server@2.1.3: + resolution: {integrity: sha512-dUet7VeDWhsHWSd8wRcE19kkIDT3rq/FC6CzTDH+y0sjnGrKwRH9ANX6KbR1HzEh71ajRL1XemK2X6N7x5VEWQ==} + dependencies: + '@volar/language-core': 2.1.3 + '@volar/language-service': 2.1.3 + '@volar/snapshot-document': 2.1.3 + '@volar/typescript': 2.1.3 + '@vscode/l10n': 0.0.16 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + dev: false /@volar/language-service@2.1.2: resolution: {integrity: sha512-CmVbbKdqzVq+0FT67hfELdHpboqXhKXh6EjypypuFX5ptIRftHZdkaq3/lCCa46EHxS5tvE44jn+s7faN4iRDA==} @@ -2723,12 +2774,30 @@ packages: vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 + dev: true + + /@volar/language-service@2.1.3: + resolution: {integrity: sha512-0wsPSvfIP1IAP0Bskp5aCjYvLge9PTzIAiHDFK9PYmMOJqO+vgPih9IIBSded1SCxaRauSvqwGoXKdeFieoYbg==} + dependencies: + '@volar/language-core': 2.1.3 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + dev: false /@volar/snapshot-document@2.1.2: resolution: {integrity: sha512-ZpJIBZrdm/Gx4jC/zn8H+O6H5vZZwY7B5CMTxl9y8HvcqlePOyDi+VkX8pjQz1VFG9Z5Z+Bau/RL6exqkoVDDA==} dependencies: vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 + dev: true + + /@volar/snapshot-document@2.1.3: + resolution: {integrity: sha512-sXcat0I1YmmohMuq1q/tcbcYIeI9vkZwx14LEpsX/wk9DcxrEILx+d1gjRxg9EgRjQRacDZIVevnKZf6p3Fi8A==} + dependencies: + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + dev: false /@volar/source-map@1.10.4: resolution: {integrity: sha512-RxZdUEL+pV8p+SMqnhVjzy5zpb1QRZTlcwSk4bdcBO7yOu4rtEWqDGahVCEj4CcXour+0yJUMrMczfSCpP9Uxg==} @@ -2740,6 +2809,12 @@ packages: resolution: {integrity: sha512-yFJqsuLm1OaWrsz9E3yd3bJcYIlHqdZ8MbmIoZLrAzMYQDcoF26/INIhgziEXSdyHc8xd7rd/tJdSnUyh0gH4Q==} dependencies: muggle-string: 0.4.1 + dev: true + + /@volar/source-map@2.1.3: + resolution: {integrity: sha512-j+R+NG/OlDgdNMttADxNuSM9Z26StT/Bjw0NgSydI05Vihngn9zvaP/xXwfWs5qQrRzbKVFxJebS2ks5m/URuA==} + dependencies: + muggle-string: 0.4.1 /@volar/typescript@1.10.4: resolution: {integrity: sha512-BCCUEBASBEMCrz7qmNSi2hBEWYsXD0doaktRKpmmhvb6XntM2sAWYu6gbyK/MluLDgluGLFiFRpWgobgzUqolg==} @@ -2752,6 +2827,13 @@ packages: dependencies: '@volar/language-core': 2.1.2 path-browserify: 1.0.1 + dev: true + + /@volar/typescript@2.1.3: + resolution: {integrity: sha512-ZZqLMih4mvu2eJAW3UCFm84OM/ojYMoA/BU/W1TctT5F2nVzNJmW4jxMWmP3wQzxCbATfTa5gLb1+BSI9NBMBg==} + dependencies: + '@volar/language-core': 2.1.3 + path-browserify: 1.0.1 /@volar/vscode@2.1.2: resolution: {integrity: sha512-gRer7Tw4dKU8glqEhm9Tg9TksBVmeRvolbjn4F3tfDLi/HbfOFGMHfcIH3/NIM0bNRhDhZvVZa1npif2U8QWXQ==} @@ -2887,7 +2969,7 @@ packages: typescript: optional: true dependencies: - '@volar/language-core': 2.1.2 + '@volar/language-core': 2.1.3 '@vue/compiler-dom': 3.4.21 '@vue/shared': 3.4.21 computeds: 0.0.1 @@ -2895,27 +2977,26 @@ packages: path-browserify: 1.0.1 typescript: 5.2.2 vue-template-compiler: 2.7.14 - dev: false /@vue/language-service@2.0.6(typescript@5.2.2): resolution: {integrity: sha512-lMKLtkt88RyJryS50blkRuaMnL0Vcjo7Lt6rtFEmw9WVv9NShqWnSpMNXyBr9gns8OJaJmQd6kl9VBAYQ6uaWA==} dependencies: - '@volar/language-core': 2.1.2 - '@volar/language-service': 2.1.2 - '@volar/typescript': 2.1.2 + '@volar/language-core': 2.1.3 + '@volar/language-service': 2.1.3 + '@volar/typescript': 2.1.3 '@vue/compiler-dom': 3.4.21 '@vue/language-core': 2.0.6(typescript@5.2.2) '@vue/shared': 3.4.21 computeds: 0.0.1 path-browserify: 1.0.1 - volar-service-css: 0.0.31(@volar/language-service@2.1.2) - volar-service-emmet: 0.0.31(@volar/language-service@2.1.2) - volar-service-html: 0.0.31(@volar/language-service@2.1.2) - volar-service-json: 0.0.31(@volar/language-service@2.1.2) + volar-service-css: 0.0.31(@volar/language-service@2.1.3) + volar-service-emmet: 0.0.31(@volar/language-service@2.1.3) + volar-service-html: 0.0.31(@volar/language-service@2.1.3) + volar-service-json: 0.0.31(@volar/language-service@2.1.3) volar-service-pug: 0.0.31 - volar-service-pug-beautify: 0.0.31(@volar/language-service@2.1.2) - volar-service-typescript: 0.0.31-patch.1(@volar/language-service@2.1.2)(@volar/typescript@2.1.2) - volar-service-typescript-twoslash-queries: 0.0.31(@volar/language-service@2.1.2) + volar-service-pug-beautify: 0.0.31(@volar/language-service@2.1.3) + volar-service-typescript: 0.0.31-patch.1(@volar/language-service@2.1.3)(@volar/typescript@2.1.3) + volar-service-typescript-twoslash-queries: 0.0.31(@volar/language-service@2.1.3) vscode-html-languageservice: 5.1.1 vscode-languageserver-textdocument: 1.0.11 transitivePeerDependencies: @@ -3709,7 +3790,6 @@ packages: /computeds@0.0.1: resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - dev: false /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -8387,7 +8467,7 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-node@0.31.4(@types/node@20.11.25): + /vite-node@0.31.4(@types/node@20.11.27): resolution: {integrity: sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ==} engines: {node: '>=v14.18.0'} hasBin: true @@ -8397,7 +8477,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.11.25) + vite: 4.4.9(@types/node@20.11.27) transitivePeerDependencies: - '@types/node' - less @@ -8490,42 +8570,6 @@ packages: fsevents: 2.3.3 dev: true - /vite@4.4.9(@types/node@20.11.25): - resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 20.11.25 - esbuild: 0.18.17 - postcss: 8.4.35 - rollup: 3.29.4 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vite@4.4.9(@types/node@20.11.27): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -8710,7 +8754,7 @@ packages: dependencies: '@types/chai': 4.3.5 '@types/chai-subset': 1.3.3 - '@types/node': 20.11.25 + '@types/node': 20.11.27 '@vitest/expect': 0.31.4 '@vitest/runner': 0.31.4 '@vitest/snapshot': 0.31.4 @@ -8731,8 +8775,8 @@ packages: strip-literal: 1.0.1 tinybench: 2.5.0 tinypool: 0.5.0 - vite: 4.4.9(@types/node@20.11.25) - vite-node: 0.31.4(@types/node@20.11.25) + vite: 4.4.9(@types/node@20.11.27) + vite-node: 0.31.4(@types/node@20.11.27) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -8800,7 +8844,7 @@ packages: - terser dev: true - /volar-service-css@0.0.31(@volar/language-service@2.1.2): + /volar-service-css@0.0.31(@volar/language-service@2.1.3): resolution: {integrity: sha512-YDY+qwqYipkXVwh63f9Lk7x/48j9lsxVeXj9lsj5Fp1VAwpPoVpWQhAq3oNp3my9gyS8lEbdIPl0rJzBcJCuUA==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8808,13 +8852,13 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.2 + '@volar/language-service': 2.1.3 vscode-css-languageservice: 6.2.10 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false - /volar-service-emmet@0.0.31(@volar/language-service@2.1.2): + /volar-service-emmet@0.0.31(@volar/language-service@2.1.3): resolution: {integrity: sha512-d+KfC0axTB6Ku4v70So3GEqsEzrE9zifDvwnqHUrg+Bts05kCFlRgDCLziXmddKhtaaJJ6oSizHr7WcFUyesww==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8822,12 +8866,12 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.2 + '@volar/language-service': 2.1.3 '@vscode/emmet-helper': 2.9.2 vscode-html-languageservice: 5.1.1 dev: false - /volar-service-html@0.0.31(@volar/language-service@2.1.2): + /volar-service-html@0.0.31(@volar/language-service@2.1.3): resolution: {integrity: sha512-duMjl/VLvPWtmYsIAUtwYw/esFY3FWnVmH7537UpnfY9ncYTX/G43xmoVd+oQJPWh7xi8zwFeUQgZAA6T45Bhg==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8835,13 +8879,13 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.2 + '@volar/language-service': 2.1.3 vscode-html-languageservice: 5.1.1 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false - /volar-service-json@0.0.31(@volar/language-service@2.1.2): + /volar-service-json@0.0.31(@volar/language-service@2.1.3): resolution: {integrity: sha512-LdADOPbO1+toDP/0oG6plOnzE34tA8oB/aJqdOJFv8OIyMtxn0kCprtyhzVWLMCpz3TgpkBSiAI3BuMMYXcDlQ==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8849,12 +8893,12 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.2 + '@volar/language-service': 2.1.3 vscode-json-languageservice: 5.3.9 vscode-uri: 3.0.8 dev: false - /volar-service-pug-beautify@0.0.31(@volar/language-service@2.1.2): + /volar-service-pug-beautify@0.0.31(@volar/language-service@2.1.3): resolution: {integrity: sha512-Y1Dhiipn/+2GNYFxgToSS4DGxDE7rAU5S9rkbleASCksAKFFWknxLF0aBmcvhnDqcVHyvIjoeIqGtQw2xx3wrw==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8863,21 +8907,21 @@ packages: optional: true dependencies: '@johnsoncodehk/pug-beautify': 0.2.2 - '@volar/language-service': 2.1.2 + '@volar/language-service': 2.1.3 dev: false /volar-service-pug@0.0.31: resolution: {integrity: sha512-hnzdMb9lq74FgKy3LI3nNW4SARWbPy+FwMr6VLaII0R8F3IOvx5w+2nJSzboivPDJ0F5xHASPTWO53G5mXK+vQ==} dependencies: - '@volar/language-service': 2.1.2 + '@volar/language-service': 2.1.3 pug-lexer: 5.0.1 pug-parser: 6.0.0 - volar-service-html: 0.0.31(@volar/language-service@2.1.2) + volar-service-html: 0.0.31(@volar/language-service@2.1.3) vscode-html-languageservice: 5.1.1 vscode-languageserver-textdocument: 1.0.11 dev: false - /volar-service-typescript-twoslash-queries@0.0.31(@volar/language-service@2.1.2): + /volar-service-typescript-twoslash-queries@0.0.31(@volar/language-service@2.1.3): resolution: {integrity: sha512-NsI1izFST7H6GN7WQow/GEPykPLGt0zlIJl+05bX9W6pXY8kD6PUSz7U+v5TSbUMMmjFFn8IkAAHopbH11OWrA==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8885,10 +8929,10 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.2 + '@volar/language-service': 2.1.3 dev: false - /volar-service-typescript@0.0.31-patch.1(@volar/language-service@2.1.2)(@volar/typescript@2.1.2): + /volar-service-typescript@0.0.31-patch.1(@volar/language-service@2.1.3)(@volar/typescript@2.1.3): resolution: {integrity: sha512-q9Dv9lg3fyLopMgXll4Xal862YLVHw4PShFcllHqIQXUMiPzQndZ7dA7B/3OldVFYeJLWP44w/M+90tjdxtl7w==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8897,8 +8941,8 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.2 - '@volar/typescript': 2.1.2 + '@volar/language-service': 2.1.3 + '@volar/typescript': 2.1.3 path-browserify: 1.0.1 semver: 7.5.4 typescript-auto-import-cache: 0.3.2 diff --git a/scripts/ext-dev.js b/scripts/ext-dev.js index f86e137..28f9d18 100644 --- a/scripts/ext-dev.js +++ b/scripts/ext-dev.js @@ -1,14 +1,15 @@ import { setGlobalPrefix } from '@baiwusanyu/utils-log' import { cliExec } from './utils' -async function runExtScript() { +async function runExtDevScript() { const command = 'cross-env NODE_ENV=development pnpm concurrently ' + '-p " {name} " ' - + '-n "COMPILER,BUILD:EXT,LSP" ' + + '-n "COMPILER,BUILD:EXT,LANG_SERVICE,LANG_SERVER" ' + '-c "bgGreen.bold,bgBlue.bold,bgMagenta.bold" ' + '"pnpm run build:compiler" ' + '"sleep 6 && pnpm run dev:ext" ' - + '"sleep 12 && pnpm run dev:ls" ' + + '"sleep 12 && pnpm run dev:lang-service" ' + + '"sleep 16 && pnpm run dev:lang-server" ' // set log prefix setGlobalPrefix('[vue-vine]: ') @@ -16,4 +17,4 @@ async function runExtScript() { cliExec(command) } -runExtScript() +runExtDevScript() From 3a81608d76f972b28b630c1255d56fcbea1cfc1a Mon Sep 17 00:00:00 2001 From: ShenQingchuan Date: Thu, 21 Mar 2024 23:24:08 +0800 Subject: [PATCH 08/16] fix: refactor vine compiler options --- packages/compiler/src/template/compose.ts | 5 ++- packages/compiler/src/transform.ts | 2 +- packages/compiler/src/types.ts | 4 +- .../tests/__snapshots__/analyze.spec.ts.snap | 40 +++++++++++++++---- packages/compiler/tests/transform.spec.ts | 2 +- packages/language-service/package.json | 7 ++++ packages/language-service/src/vine-ctx.ts | 7 +++- packages/vite-plugin/src/index.ts | 2 +- 8 files changed, 54 insertions(+), 15 deletions(-) diff --git a/packages/compiler/src/template/compose.ts b/packages/compiler/src/template/compose.ts index 2d45fb9..520ec75 100644 --- a/packages/compiler/src/template/compose.ts +++ b/packages/compiler/src/template/compose.ts @@ -14,8 +14,7 @@ export function compileVineTemplate( params: Partial, ) { return compile(source, { - // TODO: this option break virtual code mapping - // mode: 'module', + mode: 'module', hoistStatic: true, cacheHandlers: true, inline: true, @@ -182,6 +181,7 @@ export function createSeparatedTemplateComposer( const compileResult = compileVineTemplate( templateSource, { + ...compilerHooks.getCompilerCtx()?.options?.vueCompilerOptions ?? {}, scopeId: `data-v-${vineFnCompCtx.scopeId}`, bindingMetadata, inline: false, @@ -332,6 +332,7 @@ export function createInlineTemplateComposer( const compileResult = compileVineTemplate( templateSource, { + ...compilerHooks.getCompilerCtx()?.options?.vueCompilerOptions ?? {}, scopeId: `data-v-${vineCompFnCtx.scopeId}`, bindingMetadata, onError: (e) => { diff --git a/packages/compiler/src/transform.ts b/packages/compiler/src/transform.ts index 549d3eb..8cefd13 100644 --- a/packages/compiler/src/transform.ts +++ b/packages/compiler/src/transform.ts @@ -104,7 +104,7 @@ export function transformFile( compilerHooks: VineCompilerHooks, inline = true, ) { - const isDev = compilerHooks.getCompilerCtx().options.mode !== 'production' + const isDev = compilerHooks.getCompilerCtx().options.envMode !== 'production' const ms = vineFileCtx.fileMagicCode // Traverse file context's `styleDefine`, and generate import statements. // Ordered by their import releationship. diff --git a/packages/compiler/src/types.ts b/packages/compiler/src/types.ts index 14963fe..bb12ca6 100644 --- a/packages/compiler/src/types.ts +++ b/packages/compiler/src/types.ts @@ -1,4 +1,5 @@ import type { + CompilerOptions, RootNode, BindingTypes as VueBindingTypes, } from '@vue/compiler-dom' @@ -55,7 +56,8 @@ export interface VineCompilerHooks { } export interface VineCompilerOptions { - mode?: string // 'development' | 'production' + envMode?: string // 'development' | 'production' + vueCompilerOptions?: CompilerOptions inlineTemplate?: boolean preprocessOptions?: Record postcssOptions?: any diff --git a/packages/compiler/tests/__snapshots__/analyze.spec.ts.snap b/packages/compiler/tests/__snapshots__/analyze.spec.ts.snap index cdb5b70..2acac8d 100644 --- a/packages/compiler/tests/__snapshots__/analyze.spec.ts.snap +++ b/packages/compiler/tests/__snapshots__/analyze.spec.ts.snap @@ -862,6 +862,7 @@ exports[`test Vine compiler analyze > analyze vine template 1`] = ` "children": [ { "content": { + "ast": null, "constType": 0, "content": "__props.title", "isStatic": false, @@ -899,6 +900,7 @@ exports[`test Vine compiler analyze > analyze vine template 1`] = ` "codegenNode": { "children": { "content": { + "ast": null, "constType": 0, "content": "__props.title", "isStatic": false, @@ -955,7 +957,6 @@ exports[`test Vine compiler analyze > analyze vine template 1`] = ` "tag": ""h1"", "type": 13, }, - "isSelfClosing": false, "loc": { "end": { "column": 27, @@ -1025,6 +1026,7 @@ exports[`test Vine compiler analyze > analyze vine template 1`] = ` "children": [ { "content": { + "ast": null, "constType": 0, "content": "__props.title", "isStatic": false, @@ -1062,6 +1064,7 @@ exports[`test Vine compiler analyze > analyze vine template 1`] = ` "codegenNode": { "children": { "content": { + "ast": null, "constType": 0, "content": "__props.title", "isStatic": false, @@ -1118,7 +1121,6 @@ exports[`test Vine compiler analyze > analyze vine template 1`] = ` "tag": ""h1"", "type": 13, }, - "isSelfClosing": false, "loc": { "end": { "column": 27, @@ -1208,7 +1210,6 @@ exports[`test Vine compiler analyze > analyze vine template 1`] = ` "tag": ""div"", "type": 13, }, - "isSelfClosing": false, "loc": { "end": { "column": 11, @@ -1238,6 +1239,7 @@ exports[`test Vine compiler analyze > analyze vine template 1`] = ` "children": [ { "content": { + "ast": null, "constType": 0, "content": "__props.title", "isStatic": false, @@ -1275,6 +1277,7 @@ exports[`test Vine compiler analyze > analyze vine template 1`] = ` "codegenNode": { "children": { "content": { + "ast": null, "constType": 0, "content": "__props.title", "isStatic": false, @@ -1331,7 +1334,6 @@ exports[`test Vine compiler analyze > analyze vine template 1`] = ` "tag": ""h1"", "type": 13, }, - "isSelfClosing": false, "loc": { "end": { "column": 27, @@ -1451,7 +1453,14 @@ exports[`test Vine compiler analyze > analyze vine template 1`] = ` "offset": 0, }, }, + "source": " +

+ ", "temps": 0, + "transformed": true, "type": 0, } `; @@ -1542,7 +1551,6 @@ exports[`test Vine compiler analyze > analyze vine template 2`] = ` }, "type": 4, }, - "isSelfClosing": false, "loc": { "end": { "column": 36, @@ -1713,7 +1721,6 @@ exports[`test Vine compiler analyze > analyze vine template 2`] = ` }, "type": 4, }, - "isSelfClosing": false, "loc": { "end": { "column": 36, @@ -1892,7 +1899,6 @@ exports[`test Vine compiler analyze > analyze vine template 2`] = ` "tag": "MyBox", "type": 13, }, - "isSelfClosing": false, "loc": { "end": { "column": 13, @@ -1925,6 +1931,19 @@ exports[`test Vine compiler analyze > analyze vine template 2`] = ` }, }, "name": "title", + "nameLoc": { + "end": { + "column": 17, + "line": 2, + "offset": 17, + }, + "source": "title", + "start": { + "column": 12, + "line": 2, + "offset": 12, + }, + }, "type": 6, "value": { "content": "Test template", @@ -2100,7 +2119,6 @@ exports[`test Vine compiler analyze > analyze vine template 2`] = ` }, "type": 4, }, - "isSelfClosing": false, "loc": { "end": { "column": 36, @@ -2351,7 +2369,13 @@ exports[`test Vine compiler analyze > analyze vine template 2`] = ` "offset": 0, }, }, + "source": " + +
Test inner content
+
+ ", "temps": 0, + "transformed": true, "type": 0, } `; diff --git a/packages/compiler/tests/transform.spec.ts b/packages/compiler/tests/transform.spec.ts index ca2c766..b15df45 100644 --- a/packages/compiler/tests/transform.spec.ts +++ b/packages/compiler/tests/transform.spec.ts @@ -79,7 +79,7 @@ describe('test transform', () => { it('not output HMR content in non-dev mode', async () => { const { mockCompilerCtx, mockCompilerHooks } = createMockTransformCtx({ - mode: 'production', + envMode: 'production', }) compileVineTypeScriptFile(testContent, 'testNoHMRContentOnProduction', mockCompilerHooks) expect(mockCompilerCtx.vineCompileErrors.length).toBe(0) diff --git a/packages/language-service/package.json b/packages/language-service/package.json index 1122470..678039c 100644 --- a/packages/language-service/package.json +++ b/packages/language-service/package.json @@ -12,6 +12,13 @@ "url": "https://github.com/vue-vine/vue-vine/issues" }, "sideEffects": false, + "exports": { + ".": { + "dev": "./src/index.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + } + }, "main": "./dist/index.js", "typesVersions": { "*": { diff --git a/packages/language-service/src/vine-ctx.ts b/packages/language-service/src/vine-ctx.ts index e973725..1dc1a64 100644 --- a/packages/language-service/src/vine-ctx.ts +++ b/packages/language-service/src/vine-ctx.ts @@ -5,7 +5,12 @@ import { } from '@vue-vine/compiler' export function createVineFileCtx(sourceFileName: string, source: string) { - const compilerCtx = createCompilerCtx({}) + const compilerCtx = createCompilerCtx({ + envMode: 'module', + vueCompilerOptions: { + mode: 'function', // 'module' will break Volar virtual code's mapping + }, + }) const vineCompileErrs: VineDiagnostic[] = [] const vineCompileWarns: VineDiagnostic[] = [] const compilerHooks: VineCompilerHooks = { diff --git a/packages/vite-plugin/src/index.ts b/packages/vite-plugin/src/index.ts index c6fa9b6..6d8da9e 100644 --- a/packages/vite-plugin/src/index.ts +++ b/packages/vite-plugin/src/index.ts @@ -20,7 +20,7 @@ import { QUERY_TYPE_STYLE } from './constants' function createVinePlugin(options: VineCompilerOptions = {}): Plugin { const compilerCtx = createCompilerCtx({ ...options, - mode: options.mode ?? (process.env.NODE_ENV || 'development'), + envMode: options.envMode ?? (process.env.NODE_ENV || 'development'), inlineTemplate: options.inlineTemplate ?? process.env.NODE_ENV === 'production', }) const panicOnCompilerError = () => { From db626845882aa6dacc4348fa95c32e923fe96800 Mon Sep 17 00:00:00 2001 From: ShenQingchuan Date: Fri, 22 Mar 2024 03:45:28 +0800 Subject: [PATCH 09/16] wip: adjust ts plugin output dir --- packages/vscode-ext/.vscodeignore | 2 ++ packages/vscode-ext/src/index.ts | 2 ++ packages/vscode-ext/tsup.config.ts | 4 +++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/vscode-ext/.vscodeignore b/packages/vscode-ext/.vscodeignore index 3899967..b45dd24 100644 --- a/packages/vscode-ext/.vscodeignore +++ b/packages/vscode-ext/.vscodeignore @@ -8,3 +8,5 @@ vsc-extension-quickstart.md **/.eslintrc.json **/*.map **/*.ts + +!node_modules/@vue-vine/typescript-plugin/** diff --git a/packages/vscode-ext/src/index.ts b/packages/vscode-ext/src/index.ts index d559c17..0c1b7df 100644 --- a/packages/vscode-ext/src/index.ts +++ b/packages/vscode-ext/src/index.ts @@ -7,6 +7,8 @@ import * as lsp from 'vscode-languageclient/node' let client: lsp.BaseLanguageClient export async function activate(context: vscode.ExtensionContext) { + vscode.extensions.getExtension('vscode.typescript-language-features')?.activate() + const serverModule = vscode.Uri.joinPath(context.extensionUri, 'dist', 'server.js') const runOptions = { execArgv: [] } const debugOptions = { execArgv: ['--nolazy', `--inspect=${6009}`] } diff --git a/packages/vscode-ext/tsup.config.ts b/packages/vscode-ext/tsup.config.ts index dbfccea..9a5df33 100644 --- a/packages/vscode-ext/tsup.config.ts +++ b/packages/vscode-ext/tsup.config.ts @@ -43,7 +43,9 @@ export default defineConfig( }, { ...base, - entry: ['src/typescript-plugin.ts'], + entry: { + index: 'src/typescript-plugin.ts', + }, outDir: './node_modules/@vue-vine/typescript-plugin', }, ], From 06a074ef9b6c0aeaba0921d65e1e8f41817eeb21 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 26 Mar 2024 19:45:32 +0800 Subject: [PATCH 10/16] make ts plugin working --- packages/language-server/package.json | 6 +- packages/language-service/package.json | 2 +- packages/vscode-ext/package.json | 9 +- packages/vscode-ext/src/typescript-plugin.ts | 3 +- packages/vscode-ext/tsup.config.ts | 3 +- pnpm-lock.yaml | 208 +++++++++---------- 6 files changed, 111 insertions(+), 120 deletions(-) diff --git a/packages/language-server/package.json b/packages/language-server/package.json index a28836a..dbb04fb 100644 --- a/packages/language-server/package.json +++ b/packages/language-server/package.json @@ -36,9 +36,9 @@ "prepublishOnly": "pnpm run build" }, "dependencies": { - "@volar/language-core": "~2.1.2", - "@volar/language-server": "~2.1.2", - "@volar/language-service": "~2.1.2", + "@volar/language-core": "~2.1.5", + "@volar/language-server": "~2.1.5", + "@volar/language-service": "~2.1.5", "@vue-vine/compiler": "workspace:*", "@vue-vine/language-service": "workspace:*", "@vue/language-core": "^2.0.6", diff --git a/packages/language-service/package.json b/packages/language-service/package.json index 678039c..7a0ea6a 100644 --- a/packages/language-service/package.json +++ b/packages/language-service/package.json @@ -40,7 +40,7 @@ "prepublishOnly": "pnpm run build" }, "dependencies": { - "@volar/language-server": "~2.1.2", + "@volar/language-server": "~2.1.5", "@vue-vine/compiler": "workspace:*", "@vue/language-core": "^2.0.6" }, diff --git a/packages/vscode-ext/package.json b/packages/vscode-ext/package.json index d336597..935bd4c 100644 --- a/packages/vscode-ext/package.json +++ b/packages/vscode-ext/package.json @@ -67,8 +67,7 @@ "typescriptServerPlugins": [ { "name": "@vue-vine/typescript-plugin", - "enableForWorkspaceTypeScriptVersions": true, - "configNamespace": "typescript" + "enableForWorkspaceTypeScriptVersions": true } ] }, @@ -87,9 +86,9 @@ "@changesets/changelog-github": "^0.4.8", "@changesets/cli": "^2.26.2", "@types/vscode": "1.85.0", - "@volar/language-server": "~2.1.2", - "@volar/typescript": "~2.1.2", - "@volar/vscode": "~2.1.2", + "@volar/language-server": "~2.1.5", + "@volar/typescript": "~2.1.5-patch.1", + "@volar/vscode": "~2.1.5", "@vscode/vsce": "latest", "@vue/language-core": "^2.0.6", "vscode-languageclient": "^9.0.1" diff --git a/packages/vscode-ext/src/typescript-plugin.ts b/packages/vscode-ext/src/typescript-plugin.ts index b806816..021c984 100644 --- a/packages/vscode-ext/src/typescript-plugin.ts +++ b/packages/vscode-ext/src/typescript-plugin.ts @@ -12,4 +12,5 @@ const plugin = createLanguageServicePlugin((ts) => { ] }) -export default plugin +// @ts-expect-error +export = plugin; diff --git a/packages/vscode-ext/tsup.config.ts b/packages/vscode-ext/tsup.config.ts index 9a5df33..38a9a58 100644 --- a/packages/vscode-ext/tsup.config.ts +++ b/packages/vscode-ext/tsup.config.ts @@ -42,7 +42,8 @@ export default defineConfig( ], }, { - ...base, + // TODO: base options breaks the plugin + // ...base, entry: { index: 'src/typescript-plugin.ts', }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 52ff5ed..0a3b1a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -237,14 +237,14 @@ importers: packages/language-server: dependencies: '@volar/language-core': - specifier: ~2.1.2 - version: 2.1.3 + specifier: ~2.1.5 + version: 2.1.5 '@volar/language-server': - specifier: ~2.1.2 - version: 2.1.3 + specifier: ~2.1.5 + version: 2.1.5 '@volar/language-service': - specifier: ~2.1.2 - version: 2.1.3 + specifier: ~2.1.5 + version: 2.1.5 '@vue-vine/compiler': specifier: workspace:* version: link:../compiler @@ -259,16 +259,16 @@ importers: version: 2.0.6(typescript@5.2.2) volar-service-css: specifier: 0.0.31 - version: 0.0.31(@volar/language-service@2.1.3) + version: 0.0.31(@volar/language-service@2.1.5) volar-service-emmet: specifier: 0.0.31 - version: 0.0.31(@volar/language-service@2.1.3) + version: 0.0.31(@volar/language-service@2.1.5) volar-service-html: specifier: 0.0.31 - version: 0.0.31(@volar/language-service@2.1.3) + version: 0.0.31(@volar/language-service@2.1.5) volar-service-typescript: specifier: 0.0.31-patch.1 - version: 0.0.31-patch.1(@volar/language-service@2.1.3)(@volar/typescript@2.1.3) + version: 0.0.31-patch.1(@volar/language-service@2.1.5)(@volar/typescript@2.1.5) devDependencies: '@types/node': specifier: ^20.11.25 @@ -277,8 +277,8 @@ importers: packages/language-service: dependencies: '@volar/language-server': - specifier: ~2.1.2 - version: 2.1.3 + specifier: ~2.1.5 + version: 2.1.5 '@vue-vine/compiler': specifier: workspace:* version: link:../compiler @@ -365,14 +365,14 @@ importers: specifier: 1.85.0 version: 1.85.0 '@volar/language-server': - specifier: ~2.1.2 - version: 2.1.2 + specifier: ~2.1.5 + version: 2.1.5 '@volar/typescript': - specifier: ~2.1.2 - version: 2.1.3 + specifier: ~2.1.5-patch.1 + version: 2.1.5-patch.1 '@volar/vscode': - specifier: ~2.1.2 - version: 2.1.2 + specifier: ~2.1.5 + version: 2.1.5 '@vscode/vsce': specifier: latest version: 2.24.0 @@ -2724,40 +2724,24 @@ packages: '@volar/source-map': 1.10.4 dev: true - /@volar/language-core@2.1.2: - resolution: {integrity: sha512-5qsDp0Gf6fE09UWCeK7bkVn6NxMwC9OqFWQkMMkeej8h8XjyABPdRygC2RCrqDrfVdGijqlMQeXs6yRS+vfZYA==} - dependencies: - '@volar/source-map': 2.1.2 - dev: true - /@volar/language-core@2.1.3: resolution: {integrity: sha512-F93KYZYqcYltG7NihfnLt/omMZOtrQtsh2+wj+cgx3xolopU+TZvmwlZWOjw3ObZGFj3SKBb4jJn6VSfSch6RA==} dependencies: '@volar/source-map': 2.1.3 + dev: false - /@volar/language-server@2.1.2: - resolution: {integrity: sha512-5NR5Ztg+OxvDI4oRrjS0/4ZVPumWwhVq5acuK2BJbakG1kJXViYI9NOWiWITMjnliPvf12TEcSrVDBmIq54DOg==} + /@volar/language-core@2.1.5: + resolution: {integrity: sha512-u1OHmVkCFsJqNdaM2GKuMhE67TxcEnOqJNF+VtYv2Ji8DnrUaF4FAFSNxY+MRGICl+873CsSJVKas9TQtW14LA==} dependencies: - '@volar/language-core': 2.1.2 - '@volar/language-service': 2.1.2 - '@volar/snapshot-document': 2.1.2 - '@volar/typescript': 2.1.2 - '@vscode/l10n': 0.0.16 - path-browserify: 1.0.1 - request-light: 0.7.0 - vscode-languageserver: 9.0.1 - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.11 - vscode-uri: 3.0.8 - dev: true + '@volar/source-map': 2.1.5 - /@volar/language-server@2.1.3: - resolution: {integrity: sha512-dUet7VeDWhsHWSd8wRcE19kkIDT3rq/FC6CzTDH+y0sjnGrKwRH9ANX6KbR1HzEh71ajRL1XemK2X6N7x5VEWQ==} + /@volar/language-server@2.1.5: + resolution: {integrity: sha512-uHNVf9J4IX4g10gAMJmPoIV9RteYlM+d9yOXcPfRn5JEM+RyNue3GJT1JkoK9JPU5yAdYBEAhDjA54Sl5tC3fA==} dependencies: - '@volar/language-core': 2.1.3 - '@volar/language-service': 2.1.3 - '@volar/snapshot-document': 2.1.3 - '@volar/typescript': 2.1.3 + '@volar/language-core': 2.1.5 + '@volar/language-service': 2.1.5 + '@volar/snapshot-document': 2.1.5 + '@volar/typescript': 2.1.5 '@vscode/l10n': 0.0.16 path-browserify: 1.0.1 request-light: 0.7.0 @@ -2765,39 +2749,20 @@ packages: vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - dev: false - - /@volar/language-service@2.1.2: - resolution: {integrity: sha512-CmVbbKdqzVq+0FT67hfELdHpboqXhKXh6EjypypuFX5ptIRftHZdkaq3/lCCa46EHxS5tvE44jn+s7faN4iRDA==} - dependencies: - '@volar/language-core': 2.1.2 - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.11 - vscode-uri: 3.0.8 - dev: true - /@volar/language-service@2.1.3: - resolution: {integrity: sha512-0wsPSvfIP1IAP0Bskp5aCjYvLge9PTzIAiHDFK9PYmMOJqO+vgPih9IIBSded1SCxaRauSvqwGoXKdeFieoYbg==} + /@volar/language-service@2.1.5: + resolution: {integrity: sha512-WuvEv6x/fBe3e4akhblK1E2GgpnAZNnm7sKsRPrQPTE3ED5PIfiMrWgzKB5gNZToD+d6LPxfKAaGWQCpxmSJiw==} dependencies: - '@volar/language-core': 2.1.3 + '@volar/language-core': 2.1.5 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - dev: false - - /@volar/snapshot-document@2.1.2: - resolution: {integrity: sha512-ZpJIBZrdm/Gx4jC/zn8H+O6H5vZZwY7B5CMTxl9y8HvcqlePOyDi+VkX8pjQz1VFG9Z5Z+Bau/RL6exqkoVDDA==} - dependencies: - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.11 - dev: true - /@volar/snapshot-document@2.1.3: - resolution: {integrity: sha512-sXcat0I1YmmohMuq1q/tcbcYIeI9vkZwx14LEpsX/wk9DcxrEILx+d1gjRxg9EgRjQRacDZIVevnKZf6p3Fi8A==} + /@volar/snapshot-document@2.1.5: + resolution: {integrity: sha512-UbHM95HxlLNAQ4hTSzIiMj2m19zmwrympviItbx6iPRhbd0FSPGsHdrfL8nsBa9q2cIvwSEtrmA5Sg3tHy4mrg==} dependencies: vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 - dev: false /@volar/source-map@1.10.4: resolution: {integrity: sha512-RxZdUEL+pV8p+SMqnhVjzy5zpb1QRZTlcwSk4bdcBO7yOu4rtEWqDGahVCEj4CcXour+0yJUMrMczfSCpP9Uxg==} @@ -2805,14 +2770,14 @@ packages: muggle-string: 0.3.1 dev: true - /@volar/source-map@2.1.2: - resolution: {integrity: sha512-yFJqsuLm1OaWrsz9E3yd3bJcYIlHqdZ8MbmIoZLrAzMYQDcoF26/INIhgziEXSdyHc8xd7rd/tJdSnUyh0gH4Q==} + /@volar/source-map@2.1.3: + resolution: {integrity: sha512-j+R+NG/OlDgdNMttADxNuSM9Z26StT/Bjw0NgSydI05Vihngn9zvaP/xXwfWs5qQrRzbKVFxJebS2ks5m/URuA==} dependencies: muggle-string: 0.4.1 - dev: true + dev: false - /@volar/source-map@2.1.3: - resolution: {integrity: sha512-j+R+NG/OlDgdNMttADxNuSM9Z26StT/Bjw0NgSydI05Vihngn9zvaP/xXwfWs5qQrRzbKVFxJebS2ks5m/URuA==} + /@volar/source-map@2.1.5: + resolution: {integrity: sha512-GIkAM6fHgDcTXcdH4i10fAiAZzO0HLIer8/pt3oZ9A0n7n4R5d1b2F8Xxzh/pgmgNoL+SrHX3MFxs35CKgfmtA==} dependencies: muggle-string: 0.4.1 @@ -2822,23 +2787,30 @@ packages: '@volar/language-core': 1.10.4 dev: true - /@volar/typescript@2.1.2: - resolution: {integrity: sha512-lhTancZqamvaLvoz0u/uth8dpudENNt2LFZOWCw9JZiX14xRFhdhfzmphiCRb7am9E6qAJSbdS/gMt1utXAoHQ==} - dependencies: - '@volar/language-core': 2.1.2 - path-browserify: 1.0.1 - dev: true - /@volar/typescript@2.1.3: resolution: {integrity: sha512-ZZqLMih4mvu2eJAW3UCFm84OM/ojYMoA/BU/W1TctT5F2nVzNJmW4jxMWmP3wQzxCbATfTa5gLb1+BSI9NBMBg==} dependencies: '@volar/language-core': 2.1.3 path-browserify: 1.0.1 + dev: false + + /@volar/typescript@2.1.5: + resolution: {integrity: sha512-zo9a3NrNMSkufIvHuExDGTfYv+zO7C5p2wg8fyP7vcqF/Qo0ztjb0ZfOgq/A85EO/MBc1Kj2Iu7PaOBtP++NMw==} + dependencies: + '@volar/language-core': 2.1.5 + path-browserify: 1.0.1 + + /@volar/typescript@2.1.5-patch.1: + resolution: {integrity: sha512-FgbOcx+J3faVMiBM4XI/4LokIGI3k3k//rstmlS5445excVsCdbIfswvQ6XngNSmnRQNK586BfuZgW+eaGx3Nw==} + dependencies: + '@volar/language-core': 2.1.5 + path-browserify: 1.0.1 + dev: true - /@volar/vscode@2.1.2: - resolution: {integrity: sha512-gRer7Tw4dKU8glqEhm9Tg9TksBVmeRvolbjn4F3tfDLi/HbfOFGMHfcIH3/NIM0bNRhDhZvVZa1npif2U8QWXQ==} + /@volar/vscode@2.1.5: + resolution: {integrity: sha512-NjiJr4Fd7Vm0d1LwOdpPJYoTpXjzZCB1xKNZmilCJG2e+MpzYiYlsnz/fiYBEa8brcSLmfMpw8vJD2DaBLE/Jw==} dependencies: - '@volar/language-server': 2.1.2 + '@volar/language-server': 2.1.5 path-browserify: 1.0.1 vscode-languageclient: 9.0.1 vscode-nls: 5.2.0 @@ -2969,7 +2941,7 @@ packages: typescript: optional: true dependencies: - '@volar/language-core': 2.1.3 + '@volar/language-core': 2.1.5 '@vue/compiler-dom': 3.4.21 '@vue/shared': 3.4.21 computeds: 0.0.1 @@ -2981,22 +2953,22 @@ packages: /@vue/language-service@2.0.6(typescript@5.2.2): resolution: {integrity: sha512-lMKLtkt88RyJryS50blkRuaMnL0Vcjo7Lt6rtFEmw9WVv9NShqWnSpMNXyBr9gns8OJaJmQd6kl9VBAYQ6uaWA==} dependencies: - '@volar/language-core': 2.1.3 - '@volar/language-service': 2.1.3 + '@volar/language-core': 2.1.5 + '@volar/language-service': 2.1.5 '@volar/typescript': 2.1.3 '@vue/compiler-dom': 3.4.21 '@vue/language-core': 2.0.6(typescript@5.2.2) '@vue/shared': 3.4.21 computeds: 0.0.1 path-browserify: 1.0.1 - volar-service-css: 0.0.31(@volar/language-service@2.1.3) - volar-service-emmet: 0.0.31(@volar/language-service@2.1.3) - volar-service-html: 0.0.31(@volar/language-service@2.1.3) - volar-service-json: 0.0.31(@volar/language-service@2.1.3) + volar-service-css: 0.0.31(@volar/language-service@2.1.5) + volar-service-emmet: 0.0.31(@volar/language-service@2.1.5) + volar-service-html: 0.0.31(@volar/language-service@2.1.5) + volar-service-json: 0.0.31(@volar/language-service@2.1.5) volar-service-pug: 0.0.31 - volar-service-pug-beautify: 0.0.31(@volar/language-service@2.1.3) - volar-service-typescript: 0.0.31-patch.1(@volar/language-service@2.1.3)(@volar/typescript@2.1.3) - volar-service-typescript-twoslash-queries: 0.0.31(@volar/language-service@2.1.3) + volar-service-pug-beautify: 0.0.31(@volar/language-service@2.1.5) + volar-service-typescript: 0.0.31-patch.1(@volar/language-service@2.1.5)(@volar/typescript@2.1.3) + volar-service-typescript-twoslash-queries: 0.0.31(@volar/language-service@2.1.5) vscode-html-languageservice: 5.1.1 vscode-languageserver-textdocument: 1.0.11 transitivePeerDependencies: @@ -8844,7 +8816,7 @@ packages: - terser dev: true - /volar-service-css@0.0.31(@volar/language-service@2.1.3): + /volar-service-css@0.0.31(@volar/language-service@2.1.5): resolution: {integrity: sha512-YDY+qwqYipkXVwh63f9Lk7x/48j9lsxVeXj9lsj5Fp1VAwpPoVpWQhAq3oNp3my9gyS8lEbdIPl0rJzBcJCuUA==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8852,13 +8824,13 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.3 + '@volar/language-service': 2.1.5 vscode-css-languageservice: 6.2.10 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false - /volar-service-emmet@0.0.31(@volar/language-service@2.1.3): + /volar-service-emmet@0.0.31(@volar/language-service@2.1.5): resolution: {integrity: sha512-d+KfC0axTB6Ku4v70So3GEqsEzrE9zifDvwnqHUrg+Bts05kCFlRgDCLziXmddKhtaaJJ6oSizHr7WcFUyesww==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8866,12 +8838,12 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.3 + '@volar/language-service': 2.1.5 '@vscode/emmet-helper': 2.9.2 vscode-html-languageservice: 5.1.1 dev: false - /volar-service-html@0.0.31(@volar/language-service@2.1.3): + /volar-service-html@0.0.31(@volar/language-service@2.1.5): resolution: {integrity: sha512-duMjl/VLvPWtmYsIAUtwYw/esFY3FWnVmH7537UpnfY9ncYTX/G43xmoVd+oQJPWh7xi8zwFeUQgZAA6T45Bhg==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8879,13 +8851,13 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.3 + '@volar/language-service': 2.1.5 vscode-html-languageservice: 5.1.1 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 dev: false - /volar-service-json@0.0.31(@volar/language-service@2.1.3): + /volar-service-json@0.0.31(@volar/language-service@2.1.5): resolution: {integrity: sha512-LdADOPbO1+toDP/0oG6plOnzE34tA8oB/aJqdOJFv8OIyMtxn0kCprtyhzVWLMCpz3TgpkBSiAI3BuMMYXcDlQ==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8893,12 +8865,12 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.3 + '@volar/language-service': 2.1.5 vscode-json-languageservice: 5.3.9 vscode-uri: 3.0.8 dev: false - /volar-service-pug-beautify@0.0.31(@volar/language-service@2.1.3): + /volar-service-pug-beautify@0.0.31(@volar/language-service@2.1.5): resolution: {integrity: sha512-Y1Dhiipn/+2GNYFxgToSS4DGxDE7rAU5S9rkbleASCksAKFFWknxLF0aBmcvhnDqcVHyvIjoeIqGtQw2xx3wrw==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8907,21 +8879,21 @@ packages: optional: true dependencies: '@johnsoncodehk/pug-beautify': 0.2.2 - '@volar/language-service': 2.1.3 + '@volar/language-service': 2.1.5 dev: false /volar-service-pug@0.0.31: resolution: {integrity: sha512-hnzdMb9lq74FgKy3LI3nNW4SARWbPy+FwMr6VLaII0R8F3IOvx5w+2nJSzboivPDJ0F5xHASPTWO53G5mXK+vQ==} dependencies: - '@volar/language-service': 2.1.3 + '@volar/language-service': 2.1.5 pug-lexer: 5.0.1 pug-parser: 6.0.0 - volar-service-html: 0.0.31(@volar/language-service@2.1.3) + volar-service-html: 0.0.31(@volar/language-service@2.1.5) vscode-html-languageservice: 5.1.1 vscode-languageserver-textdocument: 1.0.11 dev: false - /volar-service-typescript-twoslash-queries@0.0.31(@volar/language-service@2.1.3): + /volar-service-typescript-twoslash-queries@0.0.31(@volar/language-service@2.1.5): resolution: {integrity: sha512-NsI1izFST7H6GN7WQow/GEPykPLGt0zlIJl+05bX9W6pXY8kD6PUSz7U+v5TSbUMMmjFFn8IkAAHopbH11OWrA==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8929,10 +8901,10 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.3 + '@volar/language-service': 2.1.5 dev: false - /volar-service-typescript@0.0.31-patch.1(@volar/language-service@2.1.3)(@volar/typescript@2.1.3): + /volar-service-typescript@0.0.31-patch.1(@volar/language-service@2.1.5)(@volar/typescript@2.1.3): resolution: {integrity: sha512-q9Dv9lg3fyLopMgXll4Xal862YLVHw4PShFcllHqIQXUMiPzQndZ7dA7B/3OldVFYeJLWP44w/M+90tjdxtl7w==} peerDependencies: '@volar/language-service': ~2.1.0 @@ -8941,7 +8913,7 @@ packages: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 2.1.3 + '@volar/language-service': 2.1.5 '@volar/typescript': 2.1.3 path-browserify: 1.0.1 semver: 7.5.4 @@ -8950,6 +8922,24 @@ packages: vscode-nls: 5.2.0 dev: false + /volar-service-typescript@0.0.31-patch.1(@volar/language-service@2.1.5)(@volar/typescript@2.1.5): + resolution: {integrity: sha512-q9Dv9lg3fyLopMgXll4Xal862YLVHw4PShFcllHqIQXUMiPzQndZ7dA7B/3OldVFYeJLWP44w/M+90tjdxtl7w==} + peerDependencies: + '@volar/language-service': ~2.1.0 + '@volar/typescript': ~2.1.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + dependencies: + '@volar/language-service': 2.1.5 + '@volar/typescript': 2.1.5 + path-browserify: 1.0.1 + semver: 7.5.4 + typescript-auto-import-cache: 0.3.2 + vscode-languageserver-textdocument: 1.0.11 + vscode-nls: 5.2.0 + dev: false + /vscode-css-languageservice@6.2.10: resolution: {integrity: sha512-sYUZPku4mQ06AWGCbMyjv2tdR6juBW6hTbVPFwbJvNVzdtEfBioQOgkdXg7yMJNWnXkvWSU1FL2kb4Vxu5Cdyw==} dependencies: From 28ccc0af0e3a78e2ca6f1ccc5232a1491536d259 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 26 Mar 2024 20:00:22 +0800 Subject: [PATCH 11/16] avoid duplicate intellisense --- packages/language-server/package.json | 8 ++-- packages/language-server/src/index.ts | 22 ++++++--- pnpm-lock.yaml | 65 +++++++++++++++++++++------ 3 files changed, 71 insertions(+), 24 deletions(-) diff --git a/packages/language-server/package.json b/packages/language-server/package.json index dbb04fb..9d05a04 100644 --- a/packages/language-server/package.json +++ b/packages/language-server/package.json @@ -43,10 +43,10 @@ "@vue-vine/language-service": "workspace:*", "@vue/language-core": "^2.0.6", "@vue/language-service": "^2.0.6", - "volar-service-css": "0.0.31", - "volar-service-emmet": "0.0.31", - "volar-service-html": "0.0.31", - "volar-service-typescript": "0.0.31-patch.1" + "volar-service-css": "0.0.34", + "volar-service-emmet": "0.0.34", + "volar-service-html": "0.0.34", + "volar-service-typescript": "0.0.34" }, "devDependencies": { "@types/node": "^20.11.25" diff --git a/packages/language-server/src/index.ts b/packages/language-server/src/index.ts index 9a0f949..bd6551e 100644 --- a/packages/language-server/src/index.ts +++ b/packages/language-server/src/index.ts @@ -1,6 +1,7 @@ import { createConnection, createServer, + createSimpleProjectProviderFactory, createTypeScriptProjectProviderFactory, loadTsdkByPath, } from '@volar/language-server/node' @@ -8,12 +9,14 @@ import type * as ts from 'typescript' import { create as createCssService } from 'volar-service-css' import { create as createEmmetService } from 'volar-service-emmet' import { create as createHtmlService } from 'volar-service-html' -import { create as createTypeScriptService } from 'volar-service-typescript' +import { create as createTypeScriptServices } from 'volar-service-typescript' import type { VueCompilerOptions } from '@vue/language-core' import { createParsedCommandLine, resolveVueCompilerOptions } from '@vue/language-core' import { createVueVineLanguagePlugin } from '@vue-vine/language-service' +const debug = false + const connection = createConnection() const server = createServer(connection) @@ -27,10 +30,12 @@ connection.onInitialize((params) => { return server.initialize( params, - createTypeScriptProjectProviderFactory( - tsdk.typescript, - tsdk.diagnosticMessages, - ), + debug + ? createTypeScriptProjectProviderFactory( + tsdk.typescript, + tsdk.diagnosticMessages, + ) + : createSimpleProjectProviderFactory(), { getLanguagePlugins(env, projectContext) { let compilerOptions: ts.CompilerOptions = {} @@ -46,12 +51,15 @@ connection.onInitialize((params) => { return [createVueVineLanguagePlugin(tsdk.typescript, compilerOptions, vueCompilerOptions)] }, getServicePlugins() { - return [ + const plugins = [ createHtmlService(), createCssService(), createEmmetService(), - createTypeScriptService(tsdk.typescript), ] + if (debug) { + plugins.push(...createTypeScriptServices(tsdk.typescript)) + } + return plugins; }, }, ) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a3b1a5..d1f05bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -258,17 +258,17 @@ importers: specifier: ^2.0.6 version: 2.0.6(typescript@5.2.2) volar-service-css: - specifier: 0.0.31 - version: 0.0.31(@volar/language-service@2.1.5) + specifier: 0.0.34 + version: 0.0.34(@volar/language-service@2.1.5) volar-service-emmet: - specifier: 0.0.31 - version: 0.0.31(@volar/language-service@2.1.5) + specifier: 0.0.34 + version: 0.0.34(@volar/language-service@2.1.5) volar-service-html: - specifier: 0.0.31 - version: 0.0.31(@volar/language-service@2.1.5) + specifier: 0.0.34 + version: 0.0.34(@volar/language-service@2.1.5) volar-service-typescript: - specifier: 0.0.31-patch.1 - version: 0.0.31-patch.1(@volar/language-service@2.1.5)(@volar/typescript@2.1.5) + specifier: 0.0.34 + version: 0.0.34(@volar/language-service@2.1.5) devDependencies: '@types/node': specifier: ^20.11.25 @@ -8830,6 +8830,20 @@ packages: vscode-uri: 3.0.8 dev: false + /volar-service-css@0.0.34(@volar/language-service@2.1.5): + resolution: {integrity: sha512-C7ua0j80ZD7bsgALAz/cA1bykPehoIa5n+3+Ccr+YLpj0fypqw9iLUmGLX11CqzqNCO2XFGe/1eXB/c+SWrF/g==} + peerDependencies: + '@volar/language-service': ~2.1.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + dependencies: + '@volar/language-service': 2.1.5 + vscode-css-languageservice: 6.2.10 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + dev: false + /volar-service-emmet@0.0.31(@volar/language-service@2.1.5): resolution: {integrity: sha512-d+KfC0axTB6Ku4v70So3GEqsEzrE9zifDvwnqHUrg+Bts05kCFlRgDCLziXmddKhtaaJJ6oSizHr7WcFUyesww==} peerDependencies: @@ -8843,6 +8857,19 @@ packages: vscode-html-languageservice: 5.1.1 dev: false + /volar-service-emmet@0.0.34(@volar/language-service@2.1.5): + resolution: {integrity: sha512-ubQvMCmHPp8Ic82LMPkgrp9ot+u2p/RDd0RyT0EykRkZpWsagHUF5HWkVheLfiMyx2rFuWx/+7qZPOgypx6h6g==} + peerDependencies: + '@volar/language-service': ~2.1.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + dependencies: + '@volar/language-service': 2.1.5 + '@vscode/emmet-helper': 2.9.2 + vscode-html-languageservice: 5.1.1 + dev: false + /volar-service-html@0.0.31(@volar/language-service@2.1.5): resolution: {integrity: sha512-duMjl/VLvPWtmYsIAUtwYw/esFY3FWnVmH7537UpnfY9ncYTX/G43xmoVd+oQJPWh7xi8zwFeUQgZAA6T45Bhg==} peerDependencies: @@ -8857,6 +8884,20 @@ packages: vscode-uri: 3.0.8 dev: false + /volar-service-html@0.0.34(@volar/language-service@2.1.5): + resolution: {integrity: sha512-kMEneea1tQbiRcyKavqdrSVt8zV06t+0/3pGkjO3gV6sikXTNShIDkdtB4Tq9vE2cQdM50TuS7utVV7iysUxHw==} + peerDependencies: + '@volar/language-service': ~2.1.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + dependencies: + '@volar/language-service': 2.1.5 + vscode-html-languageservice: 5.1.1 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + dev: false + /volar-service-json@0.0.31(@volar/language-service@2.1.5): resolution: {integrity: sha512-LdADOPbO1+toDP/0oG6plOnzE34tA8oB/aJqdOJFv8OIyMtxn0kCprtyhzVWLMCpz3TgpkBSiAI3BuMMYXcDlQ==} peerDependencies: @@ -8922,19 +8963,17 @@ packages: vscode-nls: 5.2.0 dev: false - /volar-service-typescript@0.0.31-patch.1(@volar/language-service@2.1.5)(@volar/typescript@2.1.5): - resolution: {integrity: sha512-q9Dv9lg3fyLopMgXll4Xal862YLVHw4PShFcllHqIQXUMiPzQndZ7dA7B/3OldVFYeJLWP44w/M+90tjdxtl7w==} + /volar-service-typescript@0.0.34(@volar/language-service@2.1.5): + resolution: {integrity: sha512-NbAry0w8ZXFgGsflvMwmPDCzgJGx3C+eYxFEbldaumkpTAJiywECWiUbPIOfmEHgpOllUKSnhwtLlWFK4YnfQg==} peerDependencies: '@volar/language-service': ~2.1.0 - '@volar/typescript': ~2.1.0 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: '@volar/language-service': 2.1.5 - '@volar/typescript': 2.1.5 path-browserify: 1.0.1 - semver: 7.5.4 + semver: 7.6.0 typescript-auto-import-cache: 0.3.2 vscode-languageserver-textdocument: 1.0.11 vscode-nls: 5.2.0 From c0233e5e008e305100a78b7ec5f0af9c73f84c45 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 26 Mar 2024 23:32:40 +0800 Subject: [PATCH 12/16] fix formatting --- packages/language-service/src/index.ts | 4 ++++ packages/vscode-ext/package.json | 2 +- pnpm-lock.yaml | 11 ++--------- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/language-service/src/index.ts b/packages/language-service/src/index.ts index 16fd52c..ae1600b 100644 --- a/packages/language-service/src/index.ts +++ b/packages/language-service/src/index.ts @@ -112,6 +112,10 @@ function createVueVineCode( tsCodeSegments.push(segment) } else if (segment[1] === 'template') { + // TODO: fix in upstream + segment[3].structure = false; + segment[3].format = false; + tsCodeSegments.push([ segment[0], undefined, diff --git a/packages/vscode-ext/package.json b/packages/vscode-ext/package.json index 935bd4c..3a2d076 100644 --- a/packages/vscode-ext/package.json +++ b/packages/vscode-ext/package.json @@ -87,7 +87,7 @@ "@changesets/cli": "^2.26.2", "@types/vscode": "1.85.0", "@volar/language-server": "~2.1.5", - "@volar/typescript": "~2.1.5-patch.1", + "@volar/typescript": "~2.1.5-patch.2", "@volar/vscode": "~2.1.5", "@vscode/vsce": "latest", "@vue/language-core": "^2.0.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1f05bd..fb4ead7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -368,8 +368,8 @@ importers: specifier: ~2.1.5 version: 2.1.5 '@volar/typescript': - specifier: ~2.1.5-patch.1 - version: 2.1.5-patch.1 + specifier: ~2.1.5-patch.2 + version: 2.1.5 '@volar/vscode': specifier: ~2.1.5 version: 2.1.5 @@ -2800,13 +2800,6 @@ packages: '@volar/language-core': 2.1.5 path-browserify: 1.0.1 - /@volar/typescript@2.1.5-patch.1: - resolution: {integrity: sha512-FgbOcx+J3faVMiBM4XI/4LokIGI3k3k//rstmlS5445excVsCdbIfswvQ6XngNSmnRQNK586BfuZgW+eaGx3Nw==} - dependencies: - '@volar/language-core': 2.1.5 - path-browserify: 1.0.1 - dev: true - /@volar/vscode@2.1.5: resolution: {integrity: sha512-NjiJr4Fd7Vm0d1LwOdpPJYoTpXjzZCB1xKNZmilCJG2e+MpzYiYlsnz/fiYBEa8brcSLmfMpw8vJD2DaBLE/Jw==} dependencies: From 49e7f33e3b462fcb3870fee83104ea96cde2ad0b Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Tue, 26 Mar 2024 23:41:48 +0800 Subject: [PATCH 13/16] pin volar typescript --- package.json | 1 + packages/vscode-ext/package.json | 2 +- pnpm-lock.yaml | 48 ++++++++------------------------ 3 files changed, 14 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 3b3688a..b145d47 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,7 @@ }, "pnpm": { "overrides": { + "@volar/typescript": "2.1.5-patch.2", "vscode-uri": "^3.0.8" } }, diff --git a/packages/vscode-ext/package.json b/packages/vscode-ext/package.json index 3a2d076..e7e7fb1 100644 --- a/packages/vscode-ext/package.json +++ b/packages/vscode-ext/package.json @@ -87,7 +87,7 @@ "@changesets/cli": "^2.26.2", "@types/vscode": "1.85.0", "@volar/language-server": "~2.1.5", - "@volar/typescript": "~2.1.5-patch.2", + "@volar/typescript": "~2.1.5", "@volar/vscode": "~2.1.5", "@vscode/vsce": "latest", "@vue/language-core": "^2.0.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb4ead7..847ae67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: + '@volar/typescript': 2.1.5-patch.2 vscode-uri: ^3.0.8 importers: @@ -368,8 +369,8 @@ importers: specifier: ~2.1.5 version: 2.1.5 '@volar/typescript': - specifier: ~2.1.5-patch.2 - version: 2.1.5 + specifier: 2.1.5-patch.2 + version: 2.1.5-patch.2 '@volar/vscode': specifier: ~2.1.5 version: 2.1.5 @@ -2724,12 +2725,6 @@ packages: '@volar/source-map': 1.10.4 dev: true - /@volar/language-core@2.1.3: - resolution: {integrity: sha512-F93KYZYqcYltG7NihfnLt/omMZOtrQtsh2+wj+cgx3xolopU+TZvmwlZWOjw3ObZGFj3SKBb4jJn6VSfSch6RA==} - dependencies: - '@volar/source-map': 2.1.3 - dev: false - /@volar/language-core@2.1.5: resolution: {integrity: sha512-u1OHmVkCFsJqNdaM2GKuMhE67TxcEnOqJNF+VtYv2Ji8DnrUaF4FAFSNxY+MRGICl+873CsSJVKas9TQtW14LA==} dependencies: @@ -2741,7 +2736,7 @@ packages: '@volar/language-core': 2.1.5 '@volar/language-service': 2.1.5 '@volar/snapshot-document': 2.1.5 - '@volar/typescript': 2.1.5 + '@volar/typescript': 2.1.5-patch.2 '@vscode/l10n': 0.0.16 path-browserify: 1.0.1 request-light: 0.7.0 @@ -2770,32 +2765,13 @@ packages: muggle-string: 0.3.1 dev: true - /@volar/source-map@2.1.3: - resolution: {integrity: sha512-j+R+NG/OlDgdNMttADxNuSM9Z26StT/Bjw0NgSydI05Vihngn9zvaP/xXwfWs5qQrRzbKVFxJebS2ks5m/URuA==} - dependencies: - muggle-string: 0.4.1 - dev: false - /@volar/source-map@2.1.5: resolution: {integrity: sha512-GIkAM6fHgDcTXcdH4i10fAiAZzO0HLIer8/pt3oZ9A0n7n4R5d1b2F8Xxzh/pgmgNoL+SrHX3MFxs35CKgfmtA==} dependencies: muggle-string: 0.4.1 - /@volar/typescript@1.10.4: - resolution: {integrity: sha512-BCCUEBASBEMCrz7qmNSi2hBEWYsXD0doaktRKpmmhvb6XntM2sAWYu6gbyK/MluLDgluGLFiFRpWgobgzUqolg==} - dependencies: - '@volar/language-core': 1.10.4 - dev: true - - /@volar/typescript@2.1.3: - resolution: {integrity: sha512-ZZqLMih4mvu2eJAW3UCFm84OM/ojYMoA/BU/W1TctT5F2nVzNJmW4jxMWmP3wQzxCbATfTa5gLb1+BSI9NBMBg==} - dependencies: - '@volar/language-core': 2.1.3 - path-browserify: 1.0.1 - dev: false - - /@volar/typescript@2.1.5: - resolution: {integrity: sha512-zo9a3NrNMSkufIvHuExDGTfYv+zO7C5p2wg8fyP7vcqF/Qo0ztjb0ZfOgq/A85EO/MBc1Kj2Iu7PaOBtP++NMw==} + /@volar/typescript@2.1.5-patch.2: + resolution: {integrity: sha512-35o7e9DCZNZwirGkXQiRC17k1ZuePp3s9u/r+mGs+K7uRSq12wNzsI91SVOW8eB7kgA9oR8u6OJskp55ipi4cA==} dependencies: '@volar/language-core': 2.1.5 path-browserify: 1.0.1 @@ -2948,7 +2924,7 @@ packages: dependencies: '@volar/language-core': 2.1.5 '@volar/language-service': 2.1.5 - '@volar/typescript': 2.1.3 + '@volar/typescript': 2.1.5-patch.2 '@vue/compiler-dom': 3.4.21 '@vue/language-core': 2.0.6(typescript@5.2.2) '@vue/shared': 3.4.21 @@ -2960,7 +2936,7 @@ packages: volar-service-json: 0.0.31(@volar/language-service@2.1.5) volar-service-pug: 0.0.31 volar-service-pug-beautify: 0.0.31(@volar/language-service@2.1.5) - volar-service-typescript: 0.0.31-patch.1(@volar/language-service@2.1.5)(@volar/typescript@2.1.3) + volar-service-typescript: 0.0.31-patch.1(@volar/language-service@2.1.5)(@volar/typescript@2.1.5-patch.2) volar-service-typescript-twoslash-queries: 0.0.31(@volar/language-service@2.1.5) vscode-html-languageservice: 5.1.1 vscode-languageserver-textdocument: 1.0.11 @@ -3031,7 +3007,7 @@ packages: /@vue/typescript@1.8.8(typescript@5.2.2): resolution: {integrity: sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==} dependencies: - '@volar/typescript': 1.10.4 + '@volar/typescript': 2.1.5-patch.2 '@vue/language-core': 1.8.8(typescript@5.2.2) transitivePeerDependencies: - typescript @@ -8938,17 +8914,17 @@ packages: '@volar/language-service': 2.1.5 dev: false - /volar-service-typescript@0.0.31-patch.1(@volar/language-service@2.1.5)(@volar/typescript@2.1.3): + /volar-service-typescript@0.0.31-patch.1(@volar/language-service@2.1.5)(@volar/typescript@2.1.5-patch.2): resolution: {integrity: sha512-q9Dv9lg3fyLopMgXll4Xal862YLVHw4PShFcllHqIQXUMiPzQndZ7dA7B/3OldVFYeJLWP44w/M+90tjdxtl7w==} peerDependencies: '@volar/language-service': ~2.1.0 - '@volar/typescript': ~2.1.0 + '@volar/typescript': 2.1.5-patch.2 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: '@volar/language-service': 2.1.5 - '@volar/typescript': 2.1.3 + '@volar/typescript': 2.1.5-patch.2 path-browserify: 1.0.1 semver: 7.5.4 typescript-auto-import-cache: 0.3.2 From 34b624af5eb0b6f5ae5be5feaf9bbe0905721173 Mon Sep 17 00:00:00 2001 From: ShenQingchuan Date: Wed, 27 Mar 2024 01:02:49 +0800 Subject: [PATCH 14/16] chore: fix lint --- packages/language-server/src/index.ts | 2 +- packages/language-service/src/index.ts | 4 ++-- packages/vscode-ext/src/typescript-plugin.ts | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/language-server/src/index.ts b/packages/language-server/src/index.ts index bd6551e..b34b1dc 100644 --- a/packages/language-server/src/index.ts +++ b/packages/language-server/src/index.ts @@ -59,7 +59,7 @@ connection.onInitialize((params) => { if (debug) { plugins.push(...createTypeScriptServices(tsdk.typescript)) } - return plugins; + return plugins }, }, ) diff --git a/packages/language-service/src/index.ts b/packages/language-service/src/index.ts index ae1600b..8e22b5e 100644 --- a/packages/language-service/src/index.ts +++ b/packages/language-service/src/index.ts @@ -113,8 +113,8 @@ function createVueVineCode( } else if (segment[1] === 'template') { // TODO: fix in upstream - segment[3].structure = false; - segment[3].format = false; + segment[3].structure = false + segment[3].format = false tsCodeSegments.push([ segment[0], diff --git a/packages/vscode-ext/src/typescript-plugin.ts b/packages/vscode-ext/src/typescript-plugin.ts index 021c984..22e3e01 100644 --- a/packages/vscode-ext/src/typescript-plugin.ts +++ b/packages/vscode-ext/src/typescript-plugin.ts @@ -12,5 +12,6 @@ const plugin = createLanguageServicePlugin((ts) => { ] }) -// @ts-expect-error -export = plugin; +// @ts-expect-error TypeScript Plugin needs to be exported with `export =` +// eslint-disable-next-line no-restricted-syntax +export = plugin From 8f0b85bb2ac52b6d6b3e86af9fff9733ad4391b4 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Wed, 27 Mar 2024 06:39:59 +0800 Subject: [PATCH 15/16] fix semantic tokens not working --- packages/language-server/src/index.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/language-server/src/index.ts b/packages/language-server/src/index.ts index b34b1dc..f259fa2 100644 --- a/packages/language-server/src/index.ts +++ b/packages/language-server/src/index.ts @@ -22,13 +22,13 @@ const server = createServer(connection) connection.listen() -connection.onInitialize((params) => { +connection.onInitialize(async (params) => { const tsdk = loadTsdkByPath( params.initializationOptions.typescript.tsdk, params.locale, ) - return server.initialize( + const result = await server.initialize( params, debug ? createTypeScriptProjectProviderFactory( @@ -63,6 +63,12 @@ connection.onInitialize((params) => { }, }, ) + + // tsserver already provides semantic tokens + // TODO: handle in upstream instead of here + result.capabilities.semanticTokensProvider = undefined; + + return result; }) connection.onInitialized(server.initialized) From 506a4ab4e06547ca1e8005af2abb259429faeee4 Mon Sep 17 00:00:00 2001 From: ShenQingchuan Date: Wed, 27 Mar 2024 11:49:41 +0800 Subject: [PATCH 16/16] chore: fix lint issues --- packages/language-server/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/language-server/src/index.ts b/packages/language-server/src/index.ts index f259fa2..ccd97fb 100644 --- a/packages/language-server/src/index.ts +++ b/packages/language-server/src/index.ts @@ -66,9 +66,9 @@ connection.onInitialize(async (params) => { // tsserver already provides semantic tokens // TODO: handle in upstream instead of here - result.capabilities.semanticTokensProvider = undefined; + result.capabilities.semanticTokensProvider = undefined - return result; + return result }) connection.onInitialized(server.initialized)