diff --git a/extensions/vscode/index.ts b/extensions/vscode/index.ts index ad946fafbf..40259fecde 100644 --- a/extensions/vscode/index.ts +++ b/extensions/vscode/index.ts @@ -26,7 +26,7 @@ export const { activate, deactivate } = defineExtension(async () => { const { stop } = watch(activeTextEditor, () => { if (!visibleTextEditors.value.some( - editor => config.server.includeLanguages.includes(editor.document.languageId) + editor => config.server.includeLanguages.includes(editor.document.languageId), )) { return; } @@ -36,7 +36,7 @@ export const { activate, deactivate } = defineExtension(async () => { watch(() => config.server.includeLanguages, async () => { const reload = await vscode.window.showInformationMessage( 'Please restart extension host to apply the new language settings.', - 'Restart Extension Host' + 'Restart Extension Host', ); if (reload) { executeCommand('workbench.action.restartExtensionHost'); @@ -87,7 +87,7 @@ function launch(context: vscode.ExtensionContext) { module: serverModule.fsPath, transport: lsp.TransportKind.ipc, options: { execArgv: ['--nolazy', '--inspect=' + 6009] }, - } + }, }, { middleware: { @@ -106,10 +106,10 @@ function launch(context: vscode.ExtensionContext) { documentSelector: config.server.includeLanguages, markdown: { isTrusted: true, - supportHtml: true + supportHtml: true, }, outputChannel: useOutputChannel('Vue Language Server'), - } + }, ); client.onNotification('tsserver/request', async ([id, command, args]) => { @@ -155,14 +155,14 @@ try { `e.name==='vue-typescript-plugin-pack'?[${config.server.includeLanguages .map(lang => `'${lang}'`) .join(',')}]`, - ':Array.isArray(e.languages)' - ].join('') + ':Array.isArray(e.languages)', + ].join(''), ); // Expose tsserver process in SingleTsServer constructor text = text.replace( ',this._callbacks.destroy("server errored")}))', - s => s + ',globalThis.__TSSERVER__||={},globalThis.__TSSERVER__[arguments[1]]=this' + s => s + ',globalThis.__TSSERVER__||={},globalThis.__TSSERVER__[arguments[1]]=this', ); /** @@ -172,12 +172,12 @@ try { // patch jsTsLanguageModes text = text.replace( 't.jsTsLanguageModes=[t.javascript,t.javascriptreact,t.typescript,t.typescriptreact]', - s => s + '.concat("vue")' + s => s + '.concat("vue")', ); // patch isSupportedLanguageMode text = text.replace( '.languages.match([t.typescript,t.typescriptreact,t.javascript,t.javascriptreact]', - s => s + '.concat("vue")' + s => s + '.concat("vue")', ); return text; diff --git a/extensions/vscode/lib/config.ts b/extensions/vscode/lib/config.ts index b83ee0dcde..4447e6b910 100644 --- a/extensions/vscode/lib/config.ts +++ b/extensions/vscode/lib/config.ts @@ -3,5 +3,5 @@ import { type NestedScopedConfigs, scopedConfigs } from './generated-meta'; export const config = defineConfigObject( scopedConfigs.scope, - scopedConfigs.defaults + scopedConfigs.defaults, ); diff --git a/packages/component-meta/index.ts b/packages/component-meta/index.ts index e9970a2e25..50cdd16448 100644 --- a/packages/component-meta/index.ts +++ b/packages/component-meta/index.ts @@ -7,23 +7,23 @@ export * from './lib/types'; export function createCheckerByJson( rootPath: string, json: any, - checkerOptions: MetaCheckerOptions = {} + checkerOptions: MetaCheckerOptions = {}, ) { return createCheckerByJsonConfigBase( ts, rootPath, json, - checkerOptions + checkerOptions, ); } export function createChecker( tsconfig: string, - checkerOptions: MetaCheckerOptions = {} + checkerOptions: MetaCheckerOptions = {}, ) { return createCheckerBase( ts, tsconfig, - checkerOptions + checkerOptions, ); } diff --git a/packages/component-meta/lib/base.ts b/packages/component-meta/lib/base.ts index 39f4a6c9b5..6c5a01911e 100644 --- a/packages/component-meta/lib/base.ts +++ b/packages/component-meta/lib/base.ts @@ -11,7 +11,7 @@ import type { MetaCheckerOptions, PropertyMeta, PropertyMetaSchema, - SlotMeta + SlotMeta, } from './types'; export * from './types'; @@ -22,7 +22,7 @@ export function createCheckerByJsonConfigBase( ts: typeof import('typescript'), rootDir: string, json: any, - checkerOptions: MetaCheckerOptions = {} + checkerOptions: MetaCheckerOptions = {}, ) { rootDir = rootDir.replace(windowsPathReg, '/'); return baseCreate( @@ -30,14 +30,14 @@ export function createCheckerByJsonConfigBase( () => vue.createParsedCommandLineByJson(ts, ts.sys, rootDir, json, undefined, true), checkerOptions, rootDir, - path.join(rootDir, 'jsconfig.json.global.vue') + path.join(rootDir, 'jsconfig.json.global.vue'), ); } export function createCheckerBase( ts: typeof import('typescript'), tsconfig: string, - checkerOptions: MetaCheckerOptions = {} + checkerOptions: MetaCheckerOptions = {}, ) { tsconfig = tsconfig.replace(windowsPathReg, '/'); return baseCreate( @@ -45,7 +45,7 @@ export function createCheckerBase( () => vue.createParsedCommandLine(ts, ts.sys, tsconfig, true), checkerOptions, path.dirname(tsconfig), - tsconfig + '.global.vue' + tsconfig + '.global.vue', ); } @@ -54,7 +54,7 @@ export function baseCreate( getCommandLine: () => vue.ParsedCommandLine, checkerOptions: MetaCheckerOptions, rootPath: string, - globalComponentName: string + globalComponentName: string, ) { let commandLine = getCommandLine(); let fileNames = commandLine.fileNames.map(path => path.replace(windowsPathReg, '/')); @@ -85,7 +85,7 @@ export function baseCreate( ts, projectHost.getCompilationSettings(), commandLine.vueOptions, - id => id + id => id, ); const language = vue.createLanguage( [ @@ -128,7 +128,7 @@ export function baseCreate( else { language.scripts.delete(fileName); } - } + }, ); const { languageServiceHost } = createLanguageServiceHost(ts, ts.sys, language, s => s, projectHost); const tsLs = ts.createLanguageService(languageServiceHost); @@ -337,11 +337,11 @@ interface ComponentMeta { ts.createSourceFile( '/tmp.' + componentPath.slice(componentPath.lastIndexOf('.') + 1), // ts | js | tsx | jsx snapshot.getText(0, snapshot.getLength()), - ts.ScriptTarget.Latest + ts.ScriptTarget.Latest, ), exportName, printer, - ts + ts, ) : {}; for (const [propName, defaultExp] of Object.entries({ @@ -414,7 +414,7 @@ interface ComponentMeta { const type = typeChecker.getTypeOfSymbolAtLocation($exposed, symbolNode); const properties = type.getProperties().filter(prop => // only exposed props will not have a valueDeclaration - !prop.valueDeclaration + !prop.valueDeclaration, ); return properties.map(prop => { @@ -433,7 +433,7 @@ interface ComponentMeta { function _getExports( program: ts.Program, typeChecker: ts.TypeChecker, - componentPath: string + componentPath: string, ) { const sourceFile = program?.getSourceFile(getMetaFileName(componentPath)); @@ -479,7 +479,7 @@ function createSchemaResolvers( symbolNode: ts.Expression, { rawType, schema: options, noDeclarations }: MetaCheckerOptions, ts: typeof import('typescript'), - language: vue.Language + language: vue.Language, ) { const visited = new Set(); @@ -741,7 +741,7 @@ function createSchemaResolvers( function readVueComponentDefaultProps( root: vue.VueVirtualCode, printer: ts.Printer | undefined, - ts: typeof import('typescript') + ts: typeof import('typescript'), ) { let result: Record = {}; @@ -953,7 +953,7 @@ function resolveModelOption( ast: ts.SourceFile, options: ts.ObjectLiteralExpression, printer: ts.Printer | undefined, - ts: typeof import('typescript') + ts: typeof import('typescript'), ) { const result: { default?: string; } = {}; @@ -973,7 +973,7 @@ function resolveModelOption( function resolveDefaultOptionExpression( _default: ts.Expression, - ts: typeof import('typescript') + ts: typeof import('typescript'), ) { if (ts.isArrowFunction(_default)) { if (ts.isBlock(_default.body)) { diff --git a/packages/component-meta/tests/index.spec.ts b/packages/component-meta/tests/index.spec.ts index 828589d8cb..700777ce4b 100644 --- a/packages/component-meta/tests/index.spec.ts +++ b/packages/component-meta/tests/index.spec.ts @@ -1063,18 +1063,18 @@ const worker = (checker: ComponentMetaChecker, withTsconfig: boolean) => describ const a = meta.slots.find(slot => slot.name === 'default' - && slot.type === '{ num: number; }' + && slot.type === '{ num: number; }', ); const b = meta.slots.find(slot => slot.name === 'named-slot' - && slot.type === '{ str: string; }' + && slot.type === '{ str: string; }', ); const c = meta.slots.find(slot => slot.name === 'vbind' - && slot.type === '{ num: number; str: string; }' + && slot.type === '{ num: number; str: string; }', ); const d = meta.slots.find(slot => - slot.name === 'no-bind' + slot.name === 'no-bind', ); expect(a).toBeDefined(); @@ -1091,18 +1091,18 @@ const worker = (checker: ComponentMetaChecker, withTsconfig: boolean) => describ const a = meta.slots.find(slot => slot.name === 'default' - && slot.type === '{ num: number; }' + && slot.type === '{ num: number; }', ); const b = meta.slots.find(slot => slot.name === 'named-slot' - && slot.type === '{ str: string; }' + && slot.type === '{ str: string; }', ); const c = meta.slots.find(slot => slot.name === 'vbind' - && slot.type === '{ num: number; str: string; }' + && slot.type === '{ num: number; str: string; }', ); const d = meta.slots.find(slot => - slot.name === 'no-bind' + slot.name === 'no-bind', ); expect(a).toBeDefined(); @@ -1119,7 +1119,7 @@ const worker = (checker: ComponentMetaChecker, withTsconfig: boolean) => describ expect(meta.slots.find(slot => slot.name === 'default' - && slot.type === '{ foo: number; }' + && slot.type === '{ foo: number; }', )).toBeDefined(); }); @@ -1158,12 +1158,12 @@ const worker = (checker: ComponentMetaChecker, withTsconfig: boolean) => describ const a = meta.props.find(prop => prop.name === 'foo' && prop.required === true - && prop.type === 'string' + && prop.type === 'string', ); const b = meta.props.find(prop => prop.name === 'bar' && prop.required === false - && prop.type === 'number | undefined' + && prop.type === 'number | undefined', ); expect(a).toBeDefined(); @@ -1179,12 +1179,12 @@ const worker = (checker: ComponentMetaChecker, withTsconfig: boolean) => describ const a = meta.props.find(prop => prop.name === 'foo' && prop.required === true - && prop.type === 'string' + && prop.type === 'string', ); const b = meta.props.find(prop => prop.name === 'bar' && prop.required === false - && prop.type === 'number | undefined' + && prop.type === 'number | undefined', ); expect(a).toBeDefined(); @@ -1206,12 +1206,12 @@ const worker = (checker: ComponentMetaChecker, withTsconfig: boolean) => describ const a = Foo.props.find(prop => prop.name === 'foo' && prop.required === true - && prop.type === 'string' + && prop.type === 'string', ); const b = Bar.props.find(prop => prop.name === 'bar' && prop.required === false - && prop.type === 'number | undefined' + && prop.type === 'number | undefined', ); expect(a).toBeDefined(); @@ -1354,7 +1354,7 @@ const checkerOptions: MetaCheckerOptions = { }; const tsconfigChecker = createChecker( path.resolve(__dirname, '../../../test-workspace/component-meta/tsconfig.json'), - checkerOptions + checkerOptions, ); const noTsConfigChecker = createCheckerByJson( path.resolve(__dirname, '../../../test-workspace/component-meta'), @@ -1364,7 +1364,7 @@ const noTsConfigChecker = createCheckerByJson( "**/*", ], }, - checkerOptions + checkerOptions, ); worker(tsconfigChecker, true); diff --git a/packages/language-core/lib/codegen/localTypes.ts b/packages/language-core/lib/codegen/localTypes.ts index 509f707898..8a6dde6f5b 100644 --- a/packages/language-core/lib/codegen/localTypes.ts +++ b/packages/language-core/lib/codegen/localTypes.ts @@ -10,7 +10,7 @@ export function getLocalTypesGenerator(vueCompilerOptions: VueCompilerOptions) { type __VLS_OmitKeepDiscriminatedUnion = T extends any ? Pick> : never; -`.trimStart() +`.trimStart(), ); const WithDefaults = defineHelper( `__VLS_WithDefaults`, @@ -20,11 +20,11 @@ type __VLS_WithDefaults = { ? ${PrettifyLocal.name} : P[K] }; -`.trimStart() +`.trimStart(), ); const PrettifyLocal = defineHelper( `__VLS_PrettifyLocal`, - () => `type __VLS_PrettifyLocal = { [K in keyof T]: T[K]; } & {}${endOfLine}` + () => `type __VLS_PrettifyLocal = { [K in keyof T]: T[K]; } & {}${endOfLine}`, ); const WithSlots = defineHelper( `__VLS_WithSlots`, @@ -35,7 +35,7 @@ type __VLS_WithSlots = T & { ${vueCompilerOptions.jsxSlots ? `$props: ${PropsChildren.name};` : ''} } }; -`.trimStart() +`.trimStart(), ); const PropsChildren = defineHelper( `__VLS_PropsChildren`, @@ -53,7 +53,7 @@ type __VLS_PropsChildren = { : JSX.ElementChildrenAttribute )]?: S; }; -`.trimStart() +`.trimStart(), ); const TypePropsToOption = defineHelper( `__VLS_TypePropsToOption`, @@ -63,11 +63,11 @@ type __VLS_TypePropsToOption = { ? { type: import('${vueCompilerOptions.lib}').PropType[K]> } : { type: import('${vueCompilerOptions.lib}').PropType, required: true } }; -`.trimStart() +`.trimStart(), ); const OmitIndexSignature = defineHelper( `__VLS_OmitIndexSignature`, - () => `type __VLS_OmitIndexSignature = { [K in keyof T as {} extends Record ? never : K]: T[K]; }${endOfLine}` + () => `type __VLS_OmitIndexSignature = { [K in keyof T as {} extends Record ? never : K]: T[K]; }${endOfLine}`, ); const helpers = { [PrettifyLocal.name]: PrettifyLocal, diff --git a/packages/language-core/lib/codegen/script/component.ts b/packages/language-core/lib/codegen/script/component.ts index 685628d7cd..95580bf7b4 100644 --- a/packages/language-core/lib/codegen/script/component.ts +++ b/packages/language-core/lib/codegen/script/component.ts @@ -9,7 +9,7 @@ export function* generateComponent( options: ScriptCodegenOptions, ctx: ScriptCodegenContext, scriptSetup: NonNullable, - scriptSetupRanges: ScriptSetupRanges + scriptSetupRanges: ScriptSetupRanges, ): Generator { if (options.sfc.script && options.scriptRanges?.exportDefault && options.scriptRanges.exportDefault.expression.start !== options.scriptRanges.exportDefault.args.start) { // use defineComponent() from user space code if it exist @@ -71,7 +71,7 @@ export function* generateComponentSetupReturns(scriptSetupRanges: ScriptSetupRan export function* generateEmitsOption( options: ScriptCodegenOptions, - scriptSetupRanges: ScriptSetupRanges + scriptSetupRanges: ScriptSetupRanges, ): Generator { const codes: { // undefined means the emit source cannot be explained by expression @@ -134,7 +134,7 @@ export function* generatePropsOption( scriptSetup: NonNullable, scriptSetupRanges: ScriptSetupRanges, hasEmitsOption: boolean, - inheritAttrs: boolean + inheritAttrs: boolean, ): Generator { const codes: { optionExp: Code, diff --git a/packages/language-core/lib/codegen/script/componentSelf.ts b/packages/language-core/lib/codegen/script/componentSelf.ts index d778ceee46..0e31bc6c46 100644 --- a/packages/language-core/lib/codegen/script/componentSelf.ts +++ b/packages/language-core/lib/codegen/script/componentSelf.ts @@ -11,7 +11,7 @@ import { getTemplateUsageVars } from './template'; export function* generateComponentSelf( options: ScriptCodegenOptions, ctx: ScriptCodegenContext, - templateCodegenCtx: TemplateCodegenContext + templateCodegenCtx: TemplateCodegenContext, ): Generator { if (options.sfc.scriptSetup && options.scriptSetupRanges) { yield `const __VLS_self = (await import('${options.vueCompilerOptions.lib}')).defineComponent({${newLine}`; diff --git a/packages/language-core/lib/codegen/script/context.ts b/packages/language-core/lib/codegen/script/context.ts index 0f7980ccbc..51a1375e6d 100644 --- a/packages/language-core/lib/codegen/script/context.ts +++ b/packages/language-core/lib/codegen/script/context.ts @@ -21,10 +21,10 @@ export function createScriptCodegenContext(options: ScriptCodegenOptions) { bypassDefineComponent: options.lang === 'js' || options.lang === 'jsx', bindingNames: new Set([ ...options.scriptRanges?.bindings.map( - ({ range }) => options.sfc.script!.content.slice(range.start, range.end) + ({ range }) => options.sfc.script!.content.slice(range.start, range.end), ) ?? [], ...options.scriptSetupRanges?.bindings.map( - ({ range }) => options.sfc.scriptSetup!.content.slice(range.start, range.end) + ({ range }) => options.sfc.scriptSetup!.content.slice(range.start, range.end), ) ?? [], ]), localTypes, diff --git a/packages/language-core/lib/codegen/script/index.ts b/packages/language-core/lib/codegen/script/index.ts index b19bac8f2d..d7ce277599 100644 --- a/packages/language-core/lib/codegen/script/index.ts +++ b/packages/language-core/lib/codegen/script/index.ts @@ -130,7 +130,7 @@ export function* generateScriptSectionPartiallyEnding( source: string, end: number, mark: string, - delimiter = 'debugger' + delimiter = 'debugger', ): Generator { yield delimiter; yield ['', source, end, codeFeatures.verification]; diff --git a/packages/language-core/lib/codegen/script/scriptSetup.ts b/packages/language-core/lib/codegen/script/scriptSetup.ts index dca883daf6..6392d9b045 100644 --- a/packages/language-core/lib/codegen/script/scriptSetup.ts +++ b/packages/language-core/lib/codegen/script/scriptSetup.ts @@ -13,7 +13,7 @@ import { generateTemplate } from './template'; export function* generateScriptSetupImports( scriptSetup: NonNullable, - scriptSetupRanges: ScriptSetupRanges + scriptSetupRanges: ScriptSetupRanges, ): Generator { yield [ scriptSetup.content.slice(0, Math.max(scriptSetupRanges.importSectionEndOffset, scriptSetupRanges.leadingCommentEndOffset)), @@ -27,7 +27,7 @@ export function* generateScriptSetup( options: ScriptCodegenOptions, ctx: ScriptCodegenContext, scriptSetup: NonNullable, - scriptSetupRanges: ScriptSetupRanges + scriptSetupRanges: ScriptSetupRanges, ): Generator { if (scriptSetup.generic) { if (!options.scriptRanges?.exportDefault) { @@ -94,7 +94,7 @@ function* generateSetupFunction( ctx: ScriptCodegenContext, scriptSetup: NonNullable, scriptSetupRanges: ScriptSetupRanges, - syntax: 'return' | 'export default' | undefined + syntax: 'return' | 'export default' | undefined, ): Generator { let setupCodeModifies: [Code[], number, number][] = []; if (scriptSetupRanges.defineProps) { @@ -106,7 +106,7 @@ function* generateSetupFunction( typeArg, name, `__VLS_props`, - `__VLS_Props` + `__VLS_Props`, )); } if (scriptSetupRanges.defineEmits) { @@ -118,7 +118,7 @@ function* generateSetupFunction( typeArg, name, `__VLS_emit`, - `__VLS_Emit` + `__VLS_Emit`, )); } if (scriptSetupRanges.defineSlots) { @@ -130,7 +130,7 @@ function* generateSetupFunction( typeArg, name, `__VLS_slots`, - `__VLS_Slots` + `__VLS_Slots`, )); } if (scriptSetupRanges.defineExpose) { @@ -178,11 +178,11 @@ function* generateSetupFunction( setupCodeModifies.push([ [`(`], callExp.start, - callExp.start + callExp.start, ], [ [` as typeof __VLS_dollars.$attrs)`], callExp.end, - callExp.end + callExp.end, ]); } } @@ -190,12 +190,12 @@ function* generateSetupFunction( setupCodeModifies.push([ [`(`], callExp.start, - callExp.start + callExp.start, ], [ arg ? [ ` as Omit<__VLS_StyleModules, '$style'>[`, generateSfcBlockSection(scriptSetup, arg.start, arg.end, codeFeatures.all), - `])` + `])`, ] : [ ` as __VLS_StyleModules[`, ...wrapWith( @@ -203,18 +203,18 @@ function* generateSetupFunction( exp.end, scriptSetup.name, codeFeatures.verification, - `'$style'` + `'$style'`, ), - `])` + `])`, ], callExp.end, - callExp.end + callExp.end, ]); if (arg) { setupCodeModifies.push([ [`__VLS_placeholder`], arg.start, - arg.end + arg.end, ]); } } @@ -223,11 +223,11 @@ function* generateSetupFunction( setupCodeModifies.push([ [`(`], callExp.start, - callExp.start + callExp.start, ], [ [` as typeof __VLS_dollars.$slots)`], callExp.end, - callExp.end + callExp.end, ]); } } @@ -237,7 +237,7 @@ function* generateSetupFunction( ? [ `__VLS_TemplateRefs[`, generateSfcBlockSection(scriptSetup, arg.start, arg.end, codeFeatures.withoutSemantic), - `]` + `]`, ] : [`unknown`]; if (isTs) { @@ -245,32 +245,32 @@ function* generateSetupFunction( [ `<`, ...templateRefType, - `>` + `>`, ], exp.end, - exp.end + exp.end, ]); } else { setupCodeModifies.push([ [`(`], callExp.start, - callExp.start + callExp.start, ], [ [ ` as __VLS_UseTemplateRef<`, ...templateRefType, - `>)` + `>)`, ], callExp.end, - callExp.end + callExp.end, ]); } if (arg) { setupCodeModifies.push([ [`__VLS_placeholder`], arg.start, - arg.end + arg.end, ]); } } @@ -294,7 +294,7 @@ function* generateSetupFunction( scriptSetup, scriptSetupRanges.withDefaults.arg.start, scriptSetupRanges.withDefaults.arg.end, - codeFeatures.navigation + codeFeatures.navigation, ); yield `)${endOfLine}`; } @@ -329,7 +329,7 @@ function* generateSetupFunction( function* generateMacros( options: ScriptCodegenOptions, - ctx: ScriptCodegenContext + ctx: ScriptCodegenContext, ): Generator { if (options.vueCompilerOptions.target >= 3.3) { yield `// @ts-ignore${newLine}`; @@ -350,7 +350,7 @@ function* generateDefineWithType( typeArg: TextRange | undefined, name: string | undefined, defaultName: string, - typeName: string + typeName: string, ): Generator<[Code[], number, number]> { if (typeArg) { yield [[ @@ -367,13 +367,13 @@ function* generateDefineWithType( else if (typeArg) { yield [[ `const ${defaultName} = `, - generateSfcBlockSection(scriptSetup, callExp.start, typeArg.start, codeFeatures.all) + generateSfcBlockSection(scriptSetup, callExp.start, typeArg.start, codeFeatures.all), ], statement.start, typeArg.start]; yield [[ generateSfcBlockSection(scriptSetup, typeArg.end, callExp.end, codeFeatures.all), endOfLine, generateSfcBlockSection(scriptSetup, statement.start, callExp.start, codeFeatures.all), - defaultName + defaultName, ], typeArg.end, callExp.end]; } else { @@ -382,7 +382,7 @@ function* generateDefineWithType( generateSfcBlockSection(scriptSetup, callExp.start, callExp.end, codeFeatures.all), endOfLine, generateSfcBlockSection(scriptSetup, statement.start, callExp.start, codeFeatures.all), - defaultName + defaultName, ], statement.start, callExp.end]; } } @@ -392,7 +392,7 @@ function* generateComponentProps( options: ScriptCodegenOptions, ctx: ScriptCodegenContext, scriptSetup: NonNullable, - scriptSetupRanges: ScriptSetupRanges + scriptSetupRanges: ScriptSetupRanges, ): Generator { if (scriptSetup.generic) { yield `const __VLS_fnComponent = (await import('${options.vueCompilerOptions.lib}')).defineComponent({${newLine}`; @@ -403,7 +403,7 @@ function* generateComponentProps( scriptSetup, scriptSetupRanges.defineProps.arg.start, scriptSetupRanges.defineProps.arg.end, - codeFeatures.navigation + codeFeatures.navigation, ); yield `,${newLine}`; } @@ -474,7 +474,7 @@ function* generateComponentProps( getRangeText(scriptSetup, defineModel.name), scriptSetup.name, defineModel.name.start, - codeFeatures.navigation + codeFeatures.navigation, ); } else { @@ -501,7 +501,7 @@ function* generateComponentProps( function* generateModelEmit( scriptSetup: NonNullable, - scriptSetupRanges: ScriptSetupRanges + scriptSetupRanges: ScriptSetupRanges, ): Generator { if (scriptSetupRanges.defineModel.length) { yield `type __VLS_ModelEmit = {${newLine}`; @@ -523,7 +523,7 @@ function* generateDefineModelType( scriptSetup: NonNullable, propName: string | undefined, localName: string | undefined, - defineModel: ScriptSetupRanges['defineModel'][number] + defineModel: ScriptSetupRanges['defineModel'][number], ) { if (defineModel.type) { // Infer from defineModel @@ -544,7 +544,7 @@ function* generateDefineModelType( function getPropAndLocalName( scriptSetup: NonNullable, - defineModel: ScriptSetupRanges['defineModel'][number] + defineModel: ScriptSetupRanges['defineModel'][number], ) { const localName = defineModel.localName ? getRangeText(scriptSetup, defineModel.localName) @@ -557,7 +557,7 @@ function getPropAndLocalName( function getRangeText( scriptSetup: NonNullable, - range: TextRange + range: TextRange, ) { return scriptSetup.content.slice(range.start, range.end); } diff --git a/packages/language-core/lib/codegen/script/src.ts b/packages/language-core/lib/codegen/script/src.ts index bdf345b97b..1e174eddcd 100644 --- a/packages/language-core/lib/codegen/script/src.ts +++ b/packages/language-core/lib/codegen/script/src.ts @@ -35,7 +35,7 @@ export function* generateSrc(src: SfcBlockAttr): Generator { `'`, [text.slice(0, src.text.length), 'main', src.offset, combineLastMapping], text.slice(src.text.length), - `'` + `'`, ); yield endOfLine; yield `export { default } from '${text}'${endOfLine}`; diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index 58d00e7096..3d48d28d11 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -12,7 +12,7 @@ import type { ScriptCodegenOptions } from './index'; export function* generateTemplate( options: ScriptCodegenOptions, - ctx: ScriptCodegenContext + ctx: ScriptCodegenContext, ): Generator { ctx.generatedTemplate = true; @@ -113,7 +113,7 @@ export function* generateTemplateDirectives(options: ScriptCodegenOptions): Gene function* generateTemplateBody( options: ScriptCodegenOptions, - templateCodegenCtx: TemplateCodegenContext + templateCodegenCtx: TemplateCodegenContext, ): Generator { yield* generateStyleScopedClasses(options, templateCodegenCtx); yield* generateStyleScopedClassReferences(templateCodegenCtx, true); @@ -147,7 +147,7 @@ function* generateCssVars(options: ScriptCodegenOptions, ctx: TemplateCodegenCon style.name, codeFeatures.all, cssBind.text, - cssBind.offset + cssBind.offset, ); yield endOfLine; } diff --git a/packages/language-core/lib/codegen/style/classProperty.ts b/packages/language-core/lib/codegen/style/classProperty.ts index 892fa9752c..3ed4ce571a 100644 --- a/packages/language-core/lib/codegen/style/classProperty.ts +++ b/packages/language-core/lib/codegen/style/classProperty.ts @@ -7,7 +7,7 @@ export function* generateClassProperty( styleIndex: number, classNameWithDot: string, offset: number, - propertyType: string + propertyType: string, ): Generator { yield `${newLine} & { `; yield* wrapWith( @@ -20,9 +20,9 @@ export function* generateClassProperty( classNameWithDot.slice(1), 'style_' + styleIndex, offset + 1, - combineLastMapping + combineLastMapping, ], - `'` + `'`, ); yield `: ${propertyType}`; yield ` }`; diff --git a/packages/language-core/lib/codegen/style/imports.ts b/packages/language-core/lib/codegen/style/imports.ts index de83df7509..55d41e9fb0 100644 --- a/packages/language-core/lib/codegen/style/imports.ts +++ b/packages/language-core/lib/codegen/style/imports.ts @@ -3,11 +3,11 @@ import { combineLastMapping, newLine } from '../utils'; import { wrapWith } from '../utils/wrapWith'; export function* generateStyleImports( - style: Sfc['styles'][number] + style: Sfc['styles'][number], ): Generator { const features: VueCodeInformation = { navigation: true, - verification: true + verification: true, }; if (typeof style.src === 'object') { yield `${newLine} & typeof import(`; @@ -18,7 +18,7 @@ export function* generateStyleImports( features, `'`, [style.src.text, 'main', style.src.offset, combineLastMapping], - `'` + `'`, ); yield `).default`; } @@ -28,7 +28,7 @@ export function* generateStyleImports( text, style.name, offset, - features + features, ]; yield `').default`; } diff --git a/packages/language-core/lib/codegen/style/modules.ts b/packages/language-core/lib/codegen/style/modules.ts index 0225931707..7229e9280a 100644 --- a/packages/language-core/lib/codegen/style/modules.ts +++ b/packages/language-core/lib/codegen/style/modules.ts @@ -6,7 +6,7 @@ import { generateClassProperty } from './classProperty'; import { generateStyleImports } from './imports'; export function* generateStyleModules( - options: ScriptCodegenOptions + options: ScriptCodegenOptions, ): Generator { const styles = options.sfc.styles.map((style, i) => [style, i] as const).filter(([style]) => style.module); if (!styles.length && !options.scriptSetupRanges?.useCssModule.length) { @@ -39,7 +39,7 @@ export function* generateStyleModules( i, className.text, className.offset, - 'string' + 'string', ); } yield `>${endOfLine}`; diff --git a/packages/language-core/lib/codegen/style/scopedClasses.ts b/packages/language-core/lib/codegen/style/scopedClasses.ts index 3311414b1b..a525a53fcf 100644 --- a/packages/language-core/lib/codegen/style/scopedClasses.ts +++ b/packages/language-core/lib/codegen/style/scopedClasses.ts @@ -7,7 +7,7 @@ import { generateStyleImports } from './imports'; export function* generateStyleScopedClasses( options: ScriptCodegenOptions, - ctx: TemplateCodegenContext + ctx: TemplateCodegenContext, ): Generator { const option = options.vueCompilerOptions.resolveStyleClassNames; const styles = options.sfc.styles @@ -28,7 +28,7 @@ export function* generateStyleScopedClasses( ctx.scopedClasses.push({ source: 'style_' + i, className: className.text.slice(1), - offset: className.offset + 1 + offset: className.offset + 1, }); continue; } @@ -37,7 +37,7 @@ export function* generateStyleScopedClasses( i, className.text, className.offset, - 'boolean' + 'boolean', ); } } diff --git a/packages/language-core/lib/codegen/template/context.ts b/packages/language-core/lib/codegen/template/context.ts index 0862649f7a..d2a089ee10 100644 --- a/packages/language-core/lib/codegen/template/context.ts +++ b/packages/language-core/lib/codegen/template/context.ts @@ -359,7 +359,7 @@ export function createTemplateCodegenContext(options: Pick data.expectError!.token === 0, }, }, - `// @ts-expect-error` + `// @ts-expect-error`, ); yield `${newLine}${endOfLine}`; } diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index fe4d7670ab..ae485fcdf3 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -23,7 +23,7 @@ const colonReg = /:/g; export function* generateComponent( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - node: CompilerDOM.ElementNode + node: CompilerDOM.ElementNode, ): Generator { const tagOffsets = [node.loc.start.offset + options.template.content.slice(node.loc.start.offset).indexOf(node.tag)]; if (!node.isSelfClosing && options.template.lang === 'html') { @@ -104,7 +104,7 @@ export function* generateComponent( shouldCapitalize ? capitalize(node.tag) : node.tag, 'template', tagOffset, - ctx.codeFeatures.withoutHighlightAndCompletion + ctx.codeFeatures.withoutHighlightAndCompletion, ); } yield `, `; @@ -122,7 +122,7 @@ export function* generateComponent( dynamicTagInfo.offsets[0], dynamicTagInfo.astHolder, `(`, - `)` + `)`, ); if (dynamicTagInfo.offsets[1] !== undefined) { yield `,`; @@ -135,7 +135,7 @@ export function* generateComponent( dynamicTagInfo.offsets[1], dynamicTagInfo.astHolder, `(`, - `)` + `)`, ); } yield `)${endOfLine}`; @@ -155,7 +155,7 @@ export function* generateComponent( yield* generateCanonicalComponentName( node.tag, tagOffsets[0], - ctx.codeFeatures.withoutHighlightAndCompletionAndNavigation + ctx.codeFeatures.withoutHighlightAndCompletionAndNavigation, ); yield `${endOfLine}`; @@ -170,7 +170,7 @@ export function* generateComponent( shouldCapitalize ? capitalize(node.tag) : node.tag, 'template', tagOffset, - codeFeatures.navigation + codeFeatures.navigation, ); yield `, `; } @@ -188,7 +188,7 @@ export function* generateComponent( isAdditional: true, onlyImport: true, }, - } + }, ); yield `${endOfLine}`; } @@ -205,7 +205,7 @@ export function* generateComponent( node, props, options.vueCompilerOptions.checkUnknownProps, - false + false, ); yield `}))${endOfLine}`; @@ -219,9 +219,9 @@ export function* generateComponent( // https://typescript.tv/errors/#ts6133 return String(code) !== '6133'; }, - } + }, }), - componentVNodeVar + componentVNodeVar, ); yield ` = ${componentFunctionalVar}`; yield* generateComponentGeneric(ctx); @@ -238,9 +238,9 @@ export function* generateComponent( props, options.vueCompilerOptions.checkUnknownProps, true, - failedPropExps + failedPropExps, ), - `}` + `}`, ); yield `, ...__VLS_functionalComponentArgsRest(${componentFunctionalVar}))${endOfLine}`; @@ -289,7 +289,7 @@ export function* generateComponent( export function* generateElement( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - node: CompilerDOM.ElementNode + node: CompilerDOM.ElementNode, ): Generator { const startTagOffset = node.loc.start.offset + options.template.content.slice(node.loc.start.offset).indexOf(node.tag); const endTagOffset = !node.isSelfClosing && options.template.lang === 'html' @@ -305,7 +305,7 @@ export function* generateElement( ctx, node.tag, startTagOffset, - ctx.codeFeatures.withoutHighlightAndCompletion + ctx.codeFeatures.withoutHighlightAndCompletion, ); if (endTagOffset !== undefined) { yield `, __VLS_elements`; @@ -314,7 +314,7 @@ export function* generateElement( ctx, node.tag, endTagOffset, - ctx.codeFeatures.withoutHighlightAndCompletion + ctx.codeFeatures.withoutHighlightAndCompletion, ); } yield `)(`; @@ -330,9 +330,9 @@ export function* generateElement( node.props, options.vueCompilerOptions.checkUnknownProps, true, - failedPropExps + failedPropExps, ), - `}` + `}`, ); yield `)${endOfLine}`; @@ -366,7 +366,7 @@ export function* generateElement( function* generateFailedPropExps( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - failedPropExps: FailedPropExpression[] + failedPropExps: FailedPropExpression[], ): Generator { for (const failedExp of failedPropExps) { yield* generateInterpolation( @@ -378,7 +378,7 @@ function* generateFailedPropExps( failedExp.node.loc.start.offset, failedExp.node.loc, failedExp.prefix, - failedExp.suffix + failedExp.suffix, ); yield endOfLine; } @@ -413,13 +413,13 @@ function* generateCanonicalComponentName(tagText: string, offset: number, featur capitalize(tagText.replace(colonReg, '-')), 'template', offset, - features + features, ); } } function* generateComponentGeneric( - ctx: TemplateCodegenContext + ctx: TemplateCodegenContext, ): Generator { if (ctx.currentInfo.generic) { const { content, offset } = ctx.currentInfo.generic; @@ -432,9 +432,9 @@ function* generateComponentGeneric( content, 'template', offset, - ctx.codeFeatures.all + ctx.codeFeatures.all, ], - `>` + `>`, ); } } @@ -442,7 +442,7 @@ function* generateComponentGeneric( function* generateElementReference( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - node: CompilerDOM.ElementNode + node: CompilerDOM.ElementNode, ): Generator { for (const prop of node.props) { if ( @@ -460,7 +460,7 @@ function* generateElementReference( content, startOffset, ctx.codeFeatures.navigation, - prop.value.loc + prop.value.loc, ); yield `} */${endOfLine}`; @@ -477,14 +477,14 @@ function* generateElementReference( function hasVBindAttrs( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - node: CompilerDOM.ElementNode + node: CompilerDOM.ElementNode, ) { return options.vueCompilerOptions.fallthroughAttributes && ( (options.inheritAttrs && ctx.singleRootNodes.has(node)) || node.props.some(prop => prop.type === CompilerDOM.NodeTypes.DIRECTIVE && prop.name === 'bind' - && prop.exp?.loc.source === '$attrs' + && prop.exp?.loc.source === '$attrs', ) ); } diff --git a/packages/language-core/lib/codegen/template/elementChildren.ts b/packages/language-core/lib/codegen/template/elementChildren.ts index 6bd3821a55..125dc2dc32 100644 --- a/packages/language-core/lib/codegen/template/elementChildren.ts +++ b/packages/language-core/lib/codegen/template/elementChildren.ts @@ -8,7 +8,7 @@ export function* generateElementChildren( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, children: (CompilerDOM.TemplateChildNode | CompilerDOM.SimpleExpressionNode)[], - enterNode = true + enterNode = true, ): Generator { yield* ctx.generateAutoImportCompletion(); for (const childNode of children) { diff --git a/packages/language-core/lib/codegen/template/elementDirectives.ts b/packages/language-core/lib/codegen/template/elementDirectives.ts index f7d7f0974c..e6a001131a 100644 --- a/packages/language-core/lib/codegen/template/elementDirectives.ts +++ b/packages/language-core/lib/codegen/template/elementDirectives.ts @@ -24,7 +24,7 @@ const builtInDirectives = new Set([ export function* generateElementDirectives( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - node: CompilerDOM.ElementNode + node: CompilerDOM.ElementNode, ): Generator { for (const prop of node.props) { if ( @@ -48,7 +48,7 @@ export function* generateElementDirectives( ...generateArg(options, ctx, prop), ...generateModifiers(options, ctx, prop), ...generateValue(options, ctx, prop), - ` }, null!, null!)` + ` }, null!, null!)`, ); yield endOfLine; } @@ -57,7 +57,7 @@ export function* generateElementDirectives( function* generateIdentifier( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - prop: CompilerDOM.DirectiveNode + prop: CompilerDOM.DirectiveNode, ): Generator { const rawName = 'v-' + prop.name; yield* wrapWith( @@ -72,15 +72,15 @@ function* generateIdentifier( ctx.resolveCodeFeatures({ ...codeFeatures.withoutHighlightAndCompletion, verification: options.vueCompilerOptions.checkUnknownDirectives && !builtInDirectives.has(prop.name), - }) - ) + }), + ), ); } function* generateArg( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - prop: CompilerDOM.DirectiveNode + prop: CompilerDOM.DirectiveNode, ): Generator { const { arg } = prop; if (arg?.type !== CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) { @@ -93,14 +93,14 @@ function* generateArg( startOffset, startOffset + arg.content.length, ctx.codeFeatures.verification, - `arg` + `arg`, ); yield `: `; if (arg.isStatic) { yield* generateStringLiteralKey( arg.content, startOffset, - ctx.codeFeatures.all + ctx.codeFeatures.all, ); } else { @@ -113,7 +113,7 @@ function* generateArg( startOffset, arg.loc, `(`, - `)` + `)`, ); } yield `, `; @@ -123,7 +123,7 @@ export function* generateModifiers( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, prop: CompilerDOM.DirectiveNode, - propertyName: string = 'modifiers' + propertyName: string = 'modifiers', ): Generator { const { modifiers } = prop; if (!modifiers.length) { @@ -137,7 +137,7 @@ export function* generateModifiers( startOffset, endOffset, ctx.codeFeatures.verification, - propertyName + propertyName, ); yield `: { `; for (const mod of modifiers) { @@ -146,7 +146,7 @@ export function* generateModifiers( ctx, mod.content, mod.loc.start.offset, - ctx.codeFeatures.withoutHighlightAndNavigation + ctx.codeFeatures.withoutHighlightAndNavigation, ); yield `: true, `; } @@ -156,7 +156,7 @@ export function* generateModifiers( function* generateValue( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - prop: CompilerDOM.DirectiveNode + prop: CompilerDOM.DirectiveNode, ): Generator { const { exp } = prop; if (exp?.type !== CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) { @@ -167,13 +167,13 @@ function* generateValue( exp.loc.start.offset, exp.loc.end.offset, ctx.codeFeatures.verification, - `value` + `value`, ); yield `: `; yield* generatePropExp( options, ctx, prop, - exp + exp, ); } diff --git a/packages/language-core/lib/codegen/template/elementEvents.ts b/packages/language-core/lib/codegen/template/elementEvents.ts index bce255d1f2..d951569049 100644 --- a/packages/language-core/lib/codegen/template/elementEvents.ts +++ b/packages/language-core/lib/codegen/template/elementEvents.ts @@ -16,7 +16,7 @@ export function* generateElementEvents( componentOriginalVar: string, componentFunctionalVar: string, componentVNodeVar: string, - componentCtxVar: string + componentCtxVar: string, ): Generator { let emitsVar: string | undefined; let propsVar: string | undefined; @@ -87,7 +87,7 @@ export function* generateEventArg( features: VueCodeInformation = { ...ctx.codeFeatures.withoutHighlightAndCompletion, ...ctx.codeFeatures.navigationWithoutRename, - } + }, ): Generator { if (directive.length) { name = capitalize(name); @@ -105,7 +105,7 @@ export function* generateEventArg( `'`, directive, ...generateCamelized(name, 'template', start, combineLastMapping), - `'` + `'`, ); } } @@ -113,7 +113,7 @@ export function* generateEventArg( export function* generateEventExpression( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - prop: CompilerDOM.DirectiveNode + prop: CompilerDOM.DirectiveNode, ): Generator { if (prop.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) { let prefix = `(`; @@ -156,7 +156,7 @@ export function* generateEventExpression( prop.exp.loc.start.offset, prop.exp.loc, prefix, - suffix + suffix, ); if (_isCompoundExpression) { @@ -175,7 +175,7 @@ export function* generateEventExpression( export function* generateModelEventExpression( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - prop: CompilerDOM.DirectiveNode + prop: CompilerDOM.DirectiveNode, ): Generator { if (prop.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) { yield `(...[$event]) => {${newLine}`; @@ -187,7 +187,7 @@ export function* generateModelEventExpression( ctx.codeFeatures.verification, prop.exp.content, prop.exp.loc.start.offset, - prop.exp.loc + prop.exp.loc, ); yield ` = $event${endOfLine}`; yield `}`; diff --git a/packages/language-core/lib/codegen/template/elementProps.ts b/packages/language-core/lib/codegen/template/elementProps.ts index b3cd448973..f448791f20 100644 --- a/packages/language-core/lib/codegen/template/elementProps.ts +++ b/packages/language-core/lib/codegen/template/elementProps.ts @@ -30,7 +30,7 @@ export function* generateElementProps( props: CompilerDOM.ElementNode['props'], strictPropsCheck: boolean, enableCodeFeatures: boolean, - failedPropExps?: FailedPropExpression[] + failedPropExps?: FailedPropExpression[], ): Generator { const isComponent = node.tagType === CompilerDOM.ElementTypes.COMPONENT; @@ -131,13 +131,13 @@ export function* generateElementProps( prop.arg.loc.start.offset, codeInfo, (prop.loc as any).name_2 ??= {}, - shouldCamelize + shouldCamelize, ) : wrapWith( prop.loc.start.offset, prop.loc.start.offset + 'v-model'.length, ctx.codeFeatures.withoutHighlightAndCompletion, - propName + propName, ) ), `: `, @@ -150,9 +150,9 @@ export function* generateElementProps( ctx, prop, prop.exp, - enableCodeFeatures - ) - ) + enableCodeFeatures, + ), + ), )]; if (enableCodeFeatures) { yield* codes; @@ -175,7 +175,7 @@ export function* generateElementProps( options, ctx, prop, - propertyName + propertyName, )]; if (enableCodeFeatures) { yield* codes; @@ -209,14 +209,14 @@ export function* generateElementProps( prop.loc.start.offset, codeInfo, (prop.loc as any).name_1 ??= {}, - shouldCamelize + shouldCamelize, ), `: `, ...( prop.value ? generateAttrValue(prop.value, ctx.codeFeatures.withoutNavigation) : [`true`] - ) + ), )]; if (enableCodeFeatures) { yield* codes; @@ -251,8 +251,8 @@ export function* generateElementProps( ctx, prop, prop.exp, - enableCodeFeatures - ) + enableCodeFeatures, + ), )]; if (enableCodeFeatures) { yield* codes; @@ -271,7 +271,7 @@ export function* generatePropExp( ctx: TemplateCodegenContext, prop: CompilerDOM.DirectiveNode, exp: CompilerDOM.SimpleExpressionNode | undefined, - enableCodeFeatures: boolean = true + enableCodeFeatures: boolean = true, ): Generator { const isShorthand = prop.arg?.loc.start.offset === prop.exp?.loc.start.offset; const features = isShorthand @@ -289,7 +289,7 @@ export function* generatePropExp( exp.loc.start.offset, exp.loc, `(`, - `)` + `)`, ); } else { @@ -303,7 +303,7 @@ export function* generatePropExp( exp.loc.source, 'template', exp.loc.start.offset, - features + features, ); if (ctx.hasLocalVariable(propVariableName) || isDestructuredProp) { @@ -336,7 +336,7 @@ export function* generatePropExp( function* generateAttrValue( attrNode: CompilerDOM.TextNode, - features: VueCodeInformation + features: VueCodeInformation, ): Generator { const quote = attrNode.loc.source.startsWith("'") ? "'" : '"'; yield quote; @@ -356,7 +356,7 @@ function* generateAttrValue( function getShouldCamelize( options: TemplateCodegenOptions, prop: CompilerDOM.AttributeNode | CompilerDOM.DirectiveNode, - propName: string + propName: string, ) { return ( prop.type !== CompilerDOM.NodeTypes.DIRECTIVE @@ -369,7 +369,7 @@ function getShouldCamelize( function getPropsCodeInfo( ctx: TemplateCodegenContext, - strictPropsCheck: boolean + strictPropsCheck: boolean, ): VueCodeInformation { return ctx.resolveCodeFeatures({ ...codeFeatures.withoutHighlightAndCompletion, @@ -399,7 +399,7 @@ function getModelPropName(node: CompilerDOM.ElementNode, vueCompilerOptions: Vue let failed = false; for (const attr in attrs) { const attrNode = node.props.find( - prop => prop.type === CompilerDOM.NodeTypes.ATTRIBUTE && prop.name === attr + prop => prop.type === CompilerDOM.NodeTypes.ATTRIBUTE && prop.name === attr, ) as CompilerDOM.AttributeNode | undefined; if (!attrNode || attrNode.value?.content !== attrs[attr]) { failed = true; diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index 138d2e6cc1..49c4f8b832 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -58,7 +58,7 @@ export function* generateTemplate(options: TemplateCodegenOptions): Generator { if (!options.hasDefineSlots) { yield `type __VLS_Slots = {}`; @@ -88,7 +88,7 @@ function* generateSlots( slot.name, slot.offset, ctx.codeFeatures.withoutHighlightAndCompletion, - slot.nodeLoc + slot.nodeLoc, ); } else { @@ -96,7 +96,7 @@ function* generateSlots( slot.tagRange[0], slot.tagRange[1], ctx.codeFeatures.withoutHighlightAndCompletion, - `default` + `default`, ); } yield `?: (props: typeof ${slot.propsVar}) => any }`; @@ -108,7 +108,7 @@ function* generateSlots( function* generateInheritedAttrs( options: TemplateCodegenOptions, - ctx: TemplateCodegenContext + ctx: TemplateCodegenContext, ): Generator { yield `type __VLS_InheritedAttrs = {}`; for (const varName of ctx.inheritedAttrVars) { @@ -124,7 +124,7 @@ function* generateInheritedAttrs( loc.source, 'template', loc.start.offset, - ctx.codeFeatures.all + ctx.codeFeatures.all, ]; yield `,`; } @@ -135,7 +135,7 @@ function* generateInheritedAttrs( function* generateTemplateRefs( options: TemplateCodegenOptions, - ctx: TemplateCodegenContext + ctx: TemplateCodegenContext, ): Generator { yield `type __VLS_TemplateRefs = {}`; for (const [name, refs] of ctx.templateRefs) { @@ -154,7 +154,7 @@ function* generateTemplateRefs( ctx, name, offset, - ctx.codeFeatures.navigation + ctx.codeFeatures.navigation, ); yield `: ${typeExp} }`; } @@ -167,7 +167,7 @@ function* generateTemplateRefs( } function* generateRootEl( - ctx: TemplateCodegenContext + ctx: TemplateCodegenContext, ): Generator { yield `type __VLS_RootEl = `; if (ctx.singleRootElTypes.length && !ctx.singleRootNodes.has(null)) { diff --git a/packages/language-core/lib/codegen/template/interpolation.ts b/packages/language-core/lib/codegen/template/interpolation.ts index aa942ddb54..d21ac6f5d1 100644 --- a/packages/language-core/lib/codegen/template/interpolation.ts +++ b/packages/language-core/lib/codegen/template/interpolation.ts @@ -21,7 +21,7 @@ export function* generateInterpolation( start: number | undefined, astHolder: any = {}, prefix: string = '', - suffix: string = '' + suffix: string = '', ): Generator { for (let [section, offset, type] of forEachInterpolationSegment( options.ts, @@ -32,7 +32,7 @@ export function* generateInterpolation( start, astHolder, prefix, - suffix + suffix, )) { if (offset === undefined) { yield section; @@ -95,7 +95,7 @@ function* forEachInterpolationSegment( start: number | undefined, astHolder: any, prefix: string, - suffix: string + suffix: string, ): Generator { const code = prefix + originalCode + suffix; const offset = start !== undefined ? start - prefix.length : undefined; @@ -155,7 +155,7 @@ function* generateVar( ctx: TemplateCodegenContext, code: string, offset: number | undefined, - curVar: CtxVar + curVar: CtxVar, ): Generator { // fix https://github.com/vuejs/language-tools/issues/1205 // fix https://github.com/vuejs/language-tools/issues/1264 @@ -192,7 +192,7 @@ function walkIdentifiers( cb: (varNode: ts.Identifier, isShorthand: boolean) => void, ctx: TemplateCodegenContext, blockVars: string[] = [], - isRoot: boolean = true + isRoot: boolean = true, ) { if (ts.isIdentifier(node)) { @@ -273,7 +273,7 @@ function processFunction( node: ts.ArrowFunction | ts.FunctionExpression | ts.AccessorDeclaration | ts.MethodDeclaration, ast: ts.SourceFile, cb: (varNode: ts.Identifier, isShorthand: boolean) => void, - ctx: TemplateCodegenContext + ctx: TemplateCodegenContext, ) { const functionArgs: string[] = []; for (const param of node.parameters) { @@ -296,7 +296,7 @@ function processFunction( function walkIdentifiersInTypeReference( ts: typeof import('typescript'), node: ts.Node, - cb: (varNode: ts.Identifier, isShorthand: boolean) => void + cb: (varNode: ts.Identifier, isShorthand: boolean) => void, ) { if (ts.isTypeQueryNode(node) && ts.isIdentifier(node.exprName)) { cb(node.exprName, false); @@ -309,7 +309,7 @@ function walkIdentifiersInTypeReference( function shouldIdentifierSkipped( ctx: TemplateCodegenContext, text: string, - destructuredPropNames: Set | undefined + destructuredPropNames: Set | undefined, ) { return ctx.hasLocalVariable(text) // https://github.com/vuejs/core/blob/245230e135152900189f13a4281302de45fdcfaa/packages/compiler-core/src/transforms/transformExpression.ts#L342-L352 diff --git a/packages/language-core/lib/codegen/template/objectProperty.ts b/packages/language-core/lib/codegen/template/objectProperty.ts index 261e645062..5c9edfec52 100644 --- a/packages/language-core/lib/codegen/template/objectProperty.ts +++ b/packages/language-core/lib/codegen/template/objectProperty.ts @@ -16,7 +16,7 @@ export function* generateObjectProperty( features: VueCodeInformation, astHolder?: any, shouldCamelize = false, - shouldBeConstant = false + shouldBeConstant = false, ): Generator { if (code.startsWith('[') && code.endsWith(']') && astHolder) { if (shouldBeConstant) { @@ -29,7 +29,7 @@ export function* generateObjectProperty( offset + 1, astHolder, `[__VLS_tryAsConstant(`, - `)]` + `)]`, ); } else { @@ -40,7 +40,7 @@ export function* generateObjectProperty( features, code, offset, - astHolder + astHolder, ); } } @@ -55,7 +55,7 @@ export function* generateObjectProperty( features, `'`, ...generateCamelized(code, 'template', offset, combineLastMapping), - `'` + `'`, ); } } diff --git a/packages/language-core/lib/codegen/template/propertyAccess.ts b/packages/language-core/lib/codegen/template/propertyAccess.ts index 3c9a5fedd1..ff120fb7cc 100644 --- a/packages/language-core/lib/codegen/template/propertyAccess.ts +++ b/packages/language-core/lib/codegen/template/propertyAccess.ts @@ -11,7 +11,7 @@ export function* generatePropertyAccess( code: string, offset?: number, features?: VueCodeInformation, - astHolder?: any + astHolder?: any, ): Generator { if (!options.compilerOptions.noPropertyAccessFromIndexSignature && identifierRegex.test(code)) { yield `.`; @@ -27,7 +27,7 @@ export function* generatePropertyAccess( features, code, offset, - astHolder + astHolder, ); } else { diff --git a/packages/language-core/lib/codegen/template/slotOutlet.ts b/packages/language-core/lib/codegen/template/slotOutlet.ts index fcfb531a00..63e45b6539 100644 --- a/packages/language-core/lib/codegen/template/slotOutlet.ts +++ b/packages/language-core/lib/codegen/template/slotOutlet.ts @@ -13,7 +13,7 @@ import { generatePropertyAccess } from './propertyAccess'; export function* generateSlotOutlet( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - node: CompilerDOM.SlotOutletNode + node: CompilerDOM.SlotOutletNode, ): Generator { const startTagOffset = node.loc.start.offset + options.template.content.slice(node.loc.start.offset).indexOf(node.tag); const startTagEndOffset = startTagOffset + node.tag.length; @@ -46,7 +46,7 @@ export function* generateSlotOutlet( ctx, source, offset, - ctx.codeFeatures.navigationAndVerification + ctx.codeFeatures.navigationAndVerification, ); } else if ( @@ -59,9 +59,9 @@ export function* generateSlotOutlet( options, ctx, nameProp, - nameProp.exp + nameProp.exp, ), - `]` + `]`, ]; } else { @@ -73,7 +73,7 @@ export function* generateSlotOutlet( nameProp.loc.end.offset, ctx.codeFeatures.verification, `${options.slotsAssignName ?? '__VLS_slots'}`, - ...codes + ...codes, ); } else { @@ -86,9 +86,9 @@ export function* generateSlotOutlet( startTagOffset, startTagEndOffset, ctx.codeFeatures.verification, - `'default'` + `'default'`, ), - `]` + `]`, ); } yield `)(`; @@ -103,9 +103,9 @@ export function* generateSlotOutlet( node, node.props.filter(prop => prop !== nameProp), true, - true + true, ), - `}` + `}`, ); yield `)${endOfLine}`; } @@ -117,7 +117,7 @@ export function* generateSlotOutlet( node, node.props.filter(prop => prop !== nameProp), options.vueCompilerOptions.checkUnknownProps, - true + true, ); yield `}${endOfLine}`; @@ -150,7 +150,7 @@ export function* generateSlotOutlet( ctx.codeFeatures.all, nameProp.exp.content, nameProp.exp.loc.start.offset, - nameProp.exp + nameProp.exp, ); yield `)${endOfLine}`; ctx.dynamicSlots.push({ diff --git a/packages/language-core/lib/codegen/template/styleScopedClasses.ts b/packages/language-core/lib/codegen/template/styleScopedClasses.ts index 6ef2a2104b..9687150d0c 100644 --- a/packages/language-core/lib/codegen/template/styleScopedClasses.ts +++ b/packages/language-core/lib/codegen/template/styleScopedClasses.ts @@ -12,7 +12,7 @@ const classNameEscapeRegex = /([\\'])/; export function* generateStyleScopedClassReferences( ctx: TemplateCodegenContext, - withDot = false + withDot = false, ): Generator { for (const offset of ctx.emptyClassOffsets) { yield `/** @type {__VLS_StyleScopedClasses['`; @@ -37,9 +37,9 @@ export function* generateStyleScopedClassReferences( source, offset, ctx.codeFeatures.navigationAndAdditionalCompletion, - classNameEscapeRegex + classNameEscapeRegex, ), - `'` + `'`, ); yield `]} */${endOfLine}`; } @@ -48,7 +48,7 @@ export function* generateStyleScopedClassReferences( export function collectStyleScopedClassReferences( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - node: CompilerDOM.ElementNode + node: CompilerDOM.ElementNode, ) { for (const prop of node.props) { if ( @@ -124,7 +124,7 @@ export function collectStyleScopedClassReferences( if (literal.text) { const classes = collectClasses( literal.text, - literal.end - literal.text.length - 1 + startOffset + literal.end - literal.text.length - 1 + startOffset, ); ctx.scopedClasses.push(...classes); } @@ -174,7 +174,7 @@ export function collectStyleScopedClassReferences( ctx.scopedClasses.push({ source: 'template', className: text, - offset: node.end - text.length + startOffset + offset: node.end - text.length + startOffset, }); } } @@ -196,7 +196,7 @@ function collectClasses(content: string, startOffset = 0) { classes.push({ source: 'template', className: currentClassName, - offset: offset + startOffset + offset: offset + startOffset, }); offset += currentClassName.length; currentClassName = ''; diff --git a/packages/language-core/lib/codegen/template/templateChild.ts b/packages/language-core/lib/codegen/template/templateChild.ts index dc872460df..bb7922d90d 100644 --- a/packages/language-core/lib/codegen/template/templateChild.ts +++ b/packages/language-core/lib/codegen/template/templateChild.ts @@ -32,7 +32,7 @@ export function* generateTemplateChild( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.RootNode | CompilerDOM.TemplateChildNode | CompilerDOM.SimpleExpressionNode, - enterNode: boolean = true + enterNode: boolean = true, ): Generator { if (enterNode && !ctx.enter(node)) { return; @@ -103,7 +103,7 @@ export function* generateTemplateChild( start, node.content.loc, `(`, - `)${endOfLine}` + `)${endOfLine}`, ); } else if (node.type === CompilerDOM.NodeTypes.IF) { @@ -125,7 +125,7 @@ export function* generateTemplateChild( function* collectSingleRootNodes( options: TemplateCodegenOptions, - children: CompilerDOM.TemplateChildNode[] + children: CompilerDOM.TemplateChildNode[], ): Generator { if (children.length !== 1) { // "null" is used to determine whether the component is not always has a single root @@ -158,7 +158,7 @@ export function getVForNode(node: CompilerDOM.ElementNode) { const forDirective = node.props.find( (prop): prop is CompilerDOM.DirectiveNode => prop.type === CompilerDOM.NodeTypes.DIRECTIVE - && prop.name === 'for' + && prop.name === 'for', ); if (forDirective) { let forNode: CompilerDOM.ForNode | undefined; @@ -180,7 +180,7 @@ function getVIfNode(node: CompilerDOM.ElementNode) { const ifDirective = node.props.find( (prop): prop is CompilerDOM.DirectiveNode => prop.type === CompilerDOM.NodeTypes.DIRECTIVE - && prop.name === 'if' + && prop.name === 'if', ); if (ifDirective) { let ifNode: CompilerDOM.IfNode | undefined; diff --git a/packages/language-core/lib/codegen/template/vFor.ts b/packages/language-core/lib/codegen/template/vFor.ts index a3a71b6760..396200cb16 100644 --- a/packages/language-core/lib/codegen/template/vFor.ts +++ b/packages/language-core/lib/codegen/template/vFor.ts @@ -9,7 +9,7 @@ import { generateInterpolation } from './interpolation'; export function* generateVFor( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - node: CompilerDOM.ForNode + node: CompilerDOM.ForNode, ): Generator { const { source } = node.parseResult; const { leftExpressionRange, leftExpressionText } = parseVForNode(node); @@ -38,7 +38,7 @@ export function* generateVFor( source.loc.start.offset, source.loc, `(`, - `)` + `)`, ); yield `!)`; // #3102 } @@ -76,7 +76,7 @@ export function* generateVFor( prop.value.loc.start.offset, prop.value.loc, `(`, - `)` + `)`, ); yield endOfLine; } @@ -106,7 +106,7 @@ export function parseVForNode(node: CompilerDOM.ForNode) { const leftExpressionText = leftExpressionRange ? node.loc.source.slice( leftExpressionRange.start - node.loc.start.offset, - leftExpressionRange.end - node.loc.start.offset + leftExpressionRange.end - node.loc.start.offset, ) : undefined; return { diff --git a/packages/language-core/lib/codegen/template/vIf.ts b/packages/language-core/lib/codegen/template/vIf.ts index edf01a24dc..daf8fc06a5 100644 --- a/packages/language-core/lib/codegen/template/vIf.ts +++ b/packages/language-core/lib/codegen/template/vIf.ts @@ -10,7 +10,7 @@ import { generateInterpolation } from './interpolation'; export function* generateVIf( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, - node: CompilerDOM.IfNode + node: CompilerDOM.IfNode, ): Generator { const originalBlockConditionsLength = ctx.blockConditions.length; @@ -41,7 +41,7 @@ export function* generateVIf( branch.condition.loc.start.offset, branch.condition.loc, `(`, - `)` + `)`, )]; yield* codes; ctx.blockConditions.push(toString(codes)); diff --git a/packages/language-core/lib/codegen/template/vSlot.ts b/packages/language-core/lib/codegen/template/vSlot.ts index 5451d1d792..1c96b85850 100644 --- a/packages/language-core/lib/codegen/template/vSlot.ts +++ b/packages/language-core/lib/codegen/template/vSlot.ts @@ -13,7 +13,7 @@ export function* generateVSlot( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, - slotDir: CompilerDOM.DirectiveNode | undefined + slotDir: CompilerDOM.DirectiveNode | undefined, ): Generator { if (!ctx.currentComponent) { return; @@ -39,7 +39,7 @@ export function* generateVSlot( slotDir.arg.isStatic ? ctx.codeFeatures.withoutHighlight : ctx.codeFeatures.all, slotDir.arg.loc, false, - true + true, ); } else { @@ -47,7 +47,7 @@ export function* generateVSlot( slotDir.loc.start.offset, slotDir.loc.start.offset + (slotDir.rawName?.length ?? 0), ctx.codeFeatures.withoutHighlightAndCompletion, - `default` + `default`, ); } } @@ -58,7 +58,7 @@ export function* generateVSlot( start, end, ctx.codeFeatures.navigation, - `default` + `default`, ); } yield `: ${slotVar} } = ${ctx.currentComponent.ctxVar}.slots!${endOfLine}`; @@ -89,7 +89,7 @@ export function* generateVSlot( ctx.codeFeatures.verification, `{} as [`, ...ctx.currentComponent.childTypes.map(name => `${name}, `), - `]` + `]`, ); yield `)${endOfLine}`; } @@ -124,7 +124,7 @@ function* generateSlotParameters( ctx: TemplateCodegenContext, ast: ts.SourceFile, exp: CompilerDOM.SimpleExpressionNode, - slotVar: string + slotVar: string, ): Generator { const { ts } = options; @@ -170,7 +170,7 @@ function* generateSlotParameters( ctx.codeFeatures.verification, `(`, ...types.flatMap(type => type ? [`_: `, type, `, `] : `_, `), - `) => [] as any` + `) => [] as any`, ); } yield `)${endOfLine}`; @@ -187,7 +187,7 @@ function* generateSlotParameters( function getElementInnerLoc( options: TemplateCodegenOptions, - node: CompilerDOM.ElementNode + node: CompilerDOM.ElementNode, ) { if (node.children.length) { let start = node.children[0].loc.start.offset; diff --git a/packages/language-core/lib/codegen/utils/camelized.ts b/packages/language-core/lib/codegen/utils/camelized.ts index 21c063e114..c0913951d4 100644 --- a/packages/language-core/lib/codegen/utils/camelized.ts +++ b/packages/language-core/lib/codegen/utils/camelized.ts @@ -5,7 +5,7 @@ export function* generateCamelized( code: string, source: string, offset: number, - features: VueCodeInformation + features: VueCodeInformation, ): Generator { const parts = code.split('-'); const startCombineOffset = features.__combineOffset ?? 0; diff --git a/packages/language-core/lib/codegen/utils/escaped.ts b/packages/language-core/lib/codegen/utils/escaped.ts index 0c77beec0d..1b9b0c9028 100644 --- a/packages/language-core/lib/codegen/utils/escaped.ts +++ b/packages/language-core/lib/codegen/utils/escaped.ts @@ -5,7 +5,7 @@ export function* generateEscaped( source: string, offset: number, features: VueCodeInformation, - escapeTarget: RegExp + escapeTarget: RegExp, ): Generator { const parts = text.split(escapeTarget); const startCombineOffset = features.__combineOffset ?? 0; diff --git a/packages/language-core/lib/codegen/utils/index.ts b/packages/language-core/lib/codegen/utils/index.ts index 28dbb050d8..f07c96bc7a 100644 --- a/packages/language-core/lib/codegen/utils/index.ts +++ b/packages/language-core/lib/codegen/utils/index.ts @@ -12,7 +12,7 @@ export function collectVars( ts: typeof import('typescript'), node: ts.Node, ast: ts.SourceFile, - results: string[] = [] + results: string[] = [], ) { const identifiers = collectIdentifiers(ts, node, []); for (const { id } of identifiers) { @@ -30,7 +30,7 @@ export function collectIdentifiers( initializer: ts.Expression | undefined; }[] = [], isRest = false, - initializer: ts.Expression | undefined = undefined + initializer: ts.Expression | undefined = undefined, ) { if (ts.isIdentifier(node)) { results.push({ id: node, isRest, initializer }); diff --git a/packages/language-core/lib/codegen/utils/stringLiteralKey.ts b/packages/language-core/lib/codegen/utils/stringLiteralKey.ts index 63b14fd593..73d8c013dc 100644 --- a/packages/language-core/lib/codegen/utils/stringLiteralKey.ts +++ b/packages/language-core/lib/codegen/utils/stringLiteralKey.ts @@ -13,7 +13,7 @@ export function* generateStringLiteralKey(code: string, offset?: number, info?: info, `'`, [code, 'template', offset, combineLastMapping], - `'` + `'`, ); } } diff --git a/packages/language-core/lib/codegen/utils/unicode.ts b/packages/language-core/lib/codegen/utils/unicode.ts index bd44cfdf7d..5227569949 100644 --- a/packages/language-core/lib/codegen/utils/unicode.ts +++ b/packages/language-core/lib/codegen/utils/unicode.ts @@ -7,7 +7,7 @@ export function* generateUnicode(code: string, offset: number, info: VueCodeInfo offset, offset + code.length, info, - toUnicode(code) + toUnicode(code), ); } else { diff --git a/packages/language-core/lib/languagePlugin.ts b/packages/language-core/lib/languagePlugin.ts index 1027b6ef0b..3c853ae72d 100644 --- a/packages/language-core/lib/languagePlugin.ts +++ b/packages/language-core/lib/languagePlugin.ts @@ -17,7 +17,7 @@ function getVueFileRegistry(key: string, plugins: VueLanguagePlugin[]) { let fileRegistry = fileRegistries.find(r => r.key === key && r.plugins.length === plugins.length - && r.plugins.every(plugin => plugins.includes(plugin)) + && r.plugins.every(plugin => plugins.includes(plugin)), )?.files; if (!fileRegistry) { fileRegistry = new Map(); @@ -33,7 +33,7 @@ function getVueFileRegistry(key: string, plugins: VueLanguagePlugin[]) { function getFileRegistryKey( compilerOptions: ts.CompilerOptions, vueCompilerOptions: VueCompilerOptions, - plugins: VueLanguagePluginReturn[] + plugins: VueLanguagePluginReturn[], ) { const values = [ ...Object.keys(vueCompilerOptions) @@ -51,7 +51,7 @@ export function createVueLanguagePlugin( ts: typeof import('typescript'), compilerOptions: ts.CompilerOptions, vueCompilerOptions: VueCompilerOptions, - asFileName: (scriptId: T) => string + asFileName: (scriptId: T) => string, ): LanguagePlugin { const pluginContext: Parameters[0] = { modules: { @@ -64,7 +64,7 @@ export function createVueLanguagePlugin( const plugins = createPlugins(pluginContext); const fileRegistry = getVueFileRegistry( getFileRegistryKey(compilerOptions, vueCompilerOptions, plugins), - vueCompilerOptions.plugins + vueCompilerOptions.plugins, ); return { diff --git a/packages/language-core/lib/parsers/scriptSetupRanges.ts b/packages/language-core/lib/parsers/scriptSetupRanges.ts index 2b522e4401..733e496396 100644 --- a/packages/language-core/lib/parsers/scriptSetupRanges.ts +++ b/packages/language-core/lib/parsers/scriptSetupRanges.ts @@ -72,7 +72,7 @@ export interface ScriptSetupRanges extends ReturnType tsCheckReg.test(text.slice(range.pos, range.end)) + range => tsCheckReg.test(text.slice(range.pos, range.end)), )?.end ?? 0; let bindings = parseBindingRanges(ts, ast); @@ -232,7 +232,7 @@ export function parseScriptSetupRanges( defineProps = { ...parseCallExpressionAssignment(node, parent), statement: getStatementRange(ts, parents, node, ast), - argNode: node.arguments[0] + argNode: node.arguments[0], }; if (ts.isVariableDeclaration(parent) && ts.isObjectBindingPattern(parent.name)) { defineProps.destructured = new Map(); @@ -263,13 +263,13 @@ export function parseScriptSetupRanges( callExp: _getStartEnd(node), exp: _getStartEnd(node.expression), arg: arg ? _getStartEnd(arg) : undefined, - argNode: arg + argNode: arg, }; } else if (vueCompilerOptions.macros.defineEmits.includes(callText)) { defineEmits = { ...parseCallExpressionAssignment(node, parent), - statement: getStatementRange(ts, parents, node, ast) + statement: getStatementRange(ts, parents, node, ast), }; if (node.typeArguments?.length && ts.isTypeLiteralNode(node.typeArguments[0])) { for (const member of node.typeArguments[0].members) { @@ -286,7 +286,7 @@ export function parseScriptSetupRanges( else if (vueCompilerOptions.macros.defineSlots.includes(callText)) { defineSlots = { ...parseCallExpressionAssignment(node, parent), - statement: getStatementRange(ts, parents, node, ast) + statement: getStatementRange(ts, parents, node, ast), }; } else if (vueCompilerOptions.macros.defineExpose.includes(callText)) { @@ -381,20 +381,20 @@ export function parseBindingRanges(ts: typeof import('typescript'), ast: ts.Sour else if (ts.isFunctionDeclaration(node)) { if (node.name && ts.isIdentifier(node.name)) { bindings.push({ - range: _getStartEnd(node.name) + range: _getStartEnd(node.name), }); } } else if (ts.isClassDeclaration(node)) { if (node.name) { bindings.push({ - range: _getStartEnd(node.name) + range: _getStartEnd(node.name), }); } } else if (ts.isEnumDeclaration(node)) { bindings.push({ - range: _getStartEnd(node.name) + range: _getStartEnd(node.name), }); } @@ -408,7 +408,7 @@ export function parseBindingRanges(ts: typeof import('typescript'), ast: ts.Sour bindings.push({ range: _getStartEnd(name), moduleName, - isDefaultImport: true + isDefaultImport: true, }); } if (namedBindings) { @@ -420,7 +420,7 @@ export function parseBindingRanges(ts: typeof import('typescript'), ast: ts.Sour bindings.push({ range: _getStartEnd(element.name), moduleName, - isDefaultImport: element.propertyName?.text === 'default' + isDefaultImport: element.propertyName?.text === 'default', }); } } @@ -428,7 +428,7 @@ export function parseBindingRanges(ts: typeof import('typescript'), ast: ts.Sour bindings.push({ range: _getStartEnd(namedBindings.name), moduleName, - isNamespace: true + isNamespace: true, }); } } @@ -454,7 +454,7 @@ export function parseBindingRanges(ts: typeof import('typescript'), ast: ts.Sour export function findBindingVars( ts: typeof import('typescript'), left: ts.BindingName, - ast: ts.SourceFile + ast: ts.SourceFile, ) { const vars: TextRange[] = []; worker(left); @@ -492,7 +492,7 @@ function getStatementRange( ts: typeof import('typescript'), parents: ts.Node[], node: ts.Node, - ast: ts.SourceFile + ast: ts.SourceFile, ) { let statementRange: TextRange | undefined; for (let i = parents.length - 1; i >= 0; i--) { @@ -516,7 +516,7 @@ function getClosestMultiLineCommentRange( ts: typeof import('typescript'), node: ts.Node, parents: ts.Node[], - ast: ts.SourceFile + ast: ts.SourceFile, ) { for (let i = parents.length - 1; i >= 0; i--) { if (ts.isStatement(node)) { diff --git a/packages/language-core/lib/plugins/file-html.ts b/packages/language-core/lib/plugins/file-html.ts index bfefebccb6..6e6dcd8382 100644 --- a/packages/language-core/lib/plugins/file-html.ts +++ b/packages/language-core/lib/plugins/file-html.ts @@ -98,7 +98,7 @@ const plugin: VueLanguagePlugin = ({ vueCompilerOptions }) => { }; return sfc; - } + }, }; }; diff --git a/packages/language-core/lib/plugins/file-md.ts b/packages/language-core/lib/plugins/file-md.ts index 80703efede..32a83d0eeb 100644 --- a/packages/language-core/lib/plugins/file-md.ts +++ b/packages/language-core/lib/plugins/file-md.ts @@ -108,7 +108,7 @@ const plugin: VueLanguagePlugin = ({ vueCompilerOptions }) => { break; } } - } + }, }; }; diff --git a/packages/language-core/lib/plugins/vue-root-tags.ts b/packages/language-core/lib/plugins/vue-root-tags.ts index d535bb93e4..1095893a4a 100644 --- a/packages/language-core/lib/plugins/vue-root-tags.ts +++ b/packages/language-core/lib/plugins/vue-root-tags.ts @@ -44,7 +44,7 @@ const plugin: VueLanguagePlugin = () => { block.endTagStart, sfc.content.slice( block.startTagEnd, - block.startTagEnd + offset + block.startTagEnd + offset, ), [ '', @@ -54,8 +54,8 @@ const plugin: VueLanguagePlugin = () => { ], sfc.content.slice( block.startTagEnd + offset, - block.endTagStart - ) + block.endTagStart, + ), ); } } diff --git a/packages/language-core/lib/plugins/vue-sfc-styles.ts b/packages/language-core/lib/plugins/vue-sfc-styles.ts index c1f8323e1d..83d4c6edd9 100644 --- a/packages/language-core/lib/plugins/vue-sfc-styles.ts +++ b/packages/language-core/lib/plugins/vue-sfc-styles.ts @@ -45,7 +45,7 @@ const plugin: VueLanguagePlugin = () => { cssVar.offset, allCodeFeatures, ], - ');\n' + ');\n', ); } } diff --git a/packages/language-core/lib/plugins/vue-template-inline-ts.ts b/packages/language-core/lib/plugins/vue-template-inline-ts.ts index fcdc085a66..a06479c08c 100644 --- a/packages/language-core/lib/plugins/vue-template-inline-ts.ts +++ b/packages/language-core/lib/plugins/vue-template-inline-ts.ts @@ -82,7 +82,7 @@ const plugin: VueLanguagePlugin = ctx => { addFormatCodes( content, node.loc.start.offset + node.loc.source.indexOf('{') + 1, - formatBrackets.generic + formatBrackets.generic, ); } } @@ -99,7 +99,7 @@ const plugin: VueLanguagePlugin = ctx => { addFormatCodes( prop.arg.loc.source, prop.arg.loc.start.offset, - formatBrackets.normal + formatBrackets.normal, ); } if ( @@ -112,7 +112,7 @@ const plugin: VueLanguagePlugin = ctx => { addFormatCodes( prop.exp.loc.source, prop.exp.loc.start.offset, - formatBrackets.event + formatBrackets.event, ); } else { @@ -123,14 +123,14 @@ const plugin: VueLanguagePlugin = ctx => { addFormatCodes( prop.exp.loc.source, prop.exp.loc.start.offset, - formatBrackets.normal + formatBrackets.normal, ); } else { addFormatCodes( prop.exp.loc.source, prop.exp.loc.start.offset, - ['(', ');'] + ['(', ');'], ); } } @@ -139,7 +139,7 @@ const plugin: VueLanguagePlugin = ctx => { addFormatCodes( prop.exp.loc.source, prop.exp.loc.start.offset, - formatBrackets.params + formatBrackets.params, ); } else if (prop.rawName === 'v-for') { @@ -147,14 +147,14 @@ const plugin: VueLanguagePlugin = ctx => { addFormatCodes( prop.exp.loc.source, prop.exp.loc.start.offset, - formatBrackets.for + formatBrackets.for, ); } else { addFormatCodes( prop.exp.loc.source, prop.exp.loc.start.offset, - formatBrackets.normal + formatBrackets.normal, ); } } @@ -170,7 +170,7 @@ const plugin: VueLanguagePlugin = ctx => { addFormatCodes( branch.condition.loc.source, branch.condition.loc.start.offset, - formatBrackets.if + formatBrackets.if, ); } @@ -194,7 +194,7 @@ const plugin: VueLanguagePlugin = ctx => { addFormatCodes( templateContent.slice(start, end), start, - formatBrackets.for + formatBrackets.for, ); } for (const child of node.children) { @@ -225,14 +225,14 @@ const plugin: VueLanguagePlugin = ctx => { addFormatCodes( content, start, - formatBrackets.normal + formatBrackets.normal, ); } else { addFormatCodes( content, start, - ['(', ');'] + ['(', ');'], ); } } @@ -241,7 +241,7 @@ const plugin: VueLanguagePlugin = ctx => { addFormatCodes( content, start, - formatBrackets.curly + formatBrackets.curly, ); } else { @@ -250,8 +250,8 @@ const plugin: VueLanguagePlugin = ctx => { start, [ firstLineEmpty ? '(' : '(0 +', - lastLineEmpty ? ');' : '+ 0);' - ] + lastLineEmpty ? ');' : '+ 0);', + ], ); } } diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index 8f80b016f7..75ecaa39ba 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -65,7 +65,7 @@ function createTsx( fileName: string, sfc: Sfc, ctx: Parameters[0], - appendGlobalTypes: boolean + appendGlobalTypes: boolean, ) { const ts = ctx.modules.typescript; @@ -102,13 +102,13 @@ function createTsx( const getScriptRanges = computed(() => sfc.script && validLangs.has(sfc.script.lang) ? parseScriptRanges(ts, sfc.script.ast, !!sfc.scriptSetup) - : undefined + : undefined, ); const getScriptSetupRanges = computed(() => sfc.scriptSetup && validLangs.has(sfc.scriptSetup.lang) ? parseScriptSetupRanges(ts, sfc.scriptSetup.ast, getResolvedOptions()) - : undefined + : undefined, ); const getSetupBindingNames = computedSet(() => { @@ -153,7 +153,7 @@ function createTsx( const newNames = new Set( getScriptSetupRanges()?.useTemplateRef .map(({ name }) => name) - .filter(name => name !== undefined) + .filter(name => name !== undefined), ); return newNames; }); diff --git a/packages/language-core/lib/utils/parseSfc.ts b/packages/language-core/lib/utils/parseSfc.ts index e4e99df55c..3faba75930 100644 --- a/packages/language-core/lib/utils/parseSfc.ts +++ b/packages/language-core/lib/utils/parseSfc.ts @@ -90,7 +90,7 @@ function createBlock(node: ElementNode, source: string) { start = { line: start.line, column: start.column + offset, - offset: start.offset + offset + offset: start.offset + offset, }; } end = Object.assign({}, start); @@ -98,14 +98,14 @@ function createBlock(node: ElementNode, source: string) { const loc: SourceLocation = { source: content, start, - end + end, }; const attrs: Record = {}; const block: SFCBlock = { type, content, loc, - attrs + attrs, }; node.props.forEach(p => { if (p.type === CompilerDOM.NodeTypes.ATTRIBUTE) { diff --git a/packages/language-core/lib/utils/shared.ts b/packages/language-core/lib/utils/shared.ts index 0450c77126..f8a888b699 100644 --- a/packages/language-core/lib/utils/shared.ts +++ b/packages/language-core/lib/utils/shared.ts @@ -16,7 +16,7 @@ export function hyphenateAttr(str: string) { export function getStartEnd( ts: typeof import('typescript'), node: ts.Node, - ast: ts.SourceFile + ast: ts.SourceFile, ): TextRange { return { start: (ts as any).getTokenPosOfNode(node, ast) as number, @@ -27,7 +27,7 @@ export function getStartEnd( export function getNodeText( ts: typeof import('typescript'), node: ts.Node, - ast: ts.SourceFile + ast: ts.SourceFile, ) { const { start, end } = getStartEnd(ts, node, ast); return ast.text.slice(start, end); diff --git a/packages/language-core/lib/utils/signals.ts b/packages/language-core/lib/utils/signals.ts index e4e9b95f23..bb91e916dc 100644 --- a/packages/language-core/lib/utils/signals.ts +++ b/packages/language-core/lib/utils/signals.ts @@ -2,7 +2,7 @@ import { computed } from 'alien-signals'; export function computedArray( arr: () => I[], - getGetter: (item: () => I, index: number) => () => O + getGetter: (item: () => I, index: number) => () => O, ) { const length = computed(() => arr().length); const keys = computed( @@ -12,7 +12,7 @@ export function computedArray( keys.push(String(i)); } return keys; - } + }, ); const items = computed<(() => O)[]>( array => { @@ -26,7 +26,7 @@ export function computedArray( array.length = length(); } return array; - } + }, ); return new Proxy({}, { @@ -56,13 +56,13 @@ export function computedSet(source: () => Set): () => Set { return oldValue; } return newValue; - } + }, ); } export function computedItems( source: () => T[], - compareFn: (oldItem: T, newItem: T) => boolean + compareFn: (oldItem: T, newItem: T) => boolean, ) { return computed( oldArr => { @@ -72,6 +72,6 @@ export function computedItems( return oldArr; } return newArr; - } + }, ); } diff --git a/packages/language-core/lib/utils/ts.ts b/packages/language-core/lib/utils/ts.ts index ef8f969688..3f750472fb 100644 --- a/packages/language-core/lib/utils/ts.ts +++ b/packages/language-core/lib/utils/ts.ts @@ -18,7 +18,7 @@ export function createParsedCommandLineByJson( rootDir: string, json: any, configFileName = rootDir + '/jsconfig.json', - skipGlobalTypesSetup = false + skipGlobalTypesSetup = false, ): ParsedCommandLine { const proxyHost = proxyParseConfigHostForExtendConfigPaths(parseConfigHost); @@ -55,7 +55,7 @@ export function createParsedCommandLineByJson( extension: extension.slice(1), isMixedContent: true, scriptKind: ts.ScriptKind.Deferred, - })) + })), ); // fix https://github.com/vuejs/language-tools/issues/1786 @@ -73,7 +73,7 @@ export function createParsedCommandLine( ts: typeof import('typescript'), parseConfigHost: ts.ParseConfigHost, tsConfigPath: string, - skipGlobalTypesSetup = false + skipGlobalTypesSetup = false, ): ParsedCommandLine { try { const proxyHost = proxyParseConfigHostForExtendConfigPaths(parseConfigHost); @@ -111,7 +111,7 @@ export function createParsedCommandLine( extension: extension.slice(1), isMixedContent: true, scriptKind: ts.ScriptKind.Deferred, - })) + })), ); // fix https://github.com/vuejs/language-tools/issues/1786 @@ -148,7 +148,7 @@ function proxyParseConfigHostForExtendConfigPaths(parseConfigHost: ts.ParseConfi }; } return target[key as keyof typeof target]; - } + }, }); return { host, @@ -222,12 +222,12 @@ export class CompilerOptionsResolver { }, fallthroughComponentNames: [ ...defaults.fallthroughComponentNames, - ...this.options.fallthroughComponentNames ?? [] + ...this.options.fallthroughComponentNames ?? [], ].map(hyphenateTag), // https://github.com/vuejs/vue-next/blob/master/packages/compiler-dom/src/transforms/vModel.ts#L49-L51 // https://vuejs.org/guide/essentials/forms.html#form-input-bindings experimentalModelPropName: Object.fromEntries(Object.entries( - this.options.experimentalModelPropName ?? defaults.experimentalModelPropName + this.options.experimentalModelPropName ?? defaults.experimentalModelPropName, ).map(([k, v]) => [camelize(k), v])), }; } @@ -311,13 +311,13 @@ export function getDefaultCompilerOptions(target = 99, lib = 'vue', strictTempla plugins: [], experimentalModelPropName: { '': { - input: true + input: true, }, value: { input: { type: 'text' }, textarea: true, - select: true - } + select: true, + }, }, }; } diff --git a/packages/language-core/lib/virtualFile/computedEmbeddedCodes.ts b/packages/language-core/lib/virtualFile/computedEmbeddedCodes.ts index 98bc105530..b6b91c30b0 100644 --- a/packages/language-core/lib/virtualFile/computedEmbeddedCodes.ts +++ b/packages/language-core/lib/virtualFile/computedEmbeddedCodes.ts @@ -9,7 +9,7 @@ import { VueEmbeddedCode } from './embeddedFile'; export function computedEmbeddedCodes( plugins: VueLanguagePluginReturn[], fileName: string, - sfc: Sfc + sfc: Sfc, ) { const getNameToBlockMap = computed(() => { const blocks: Record = {}; @@ -36,8 +36,8 @@ export function computedEmbeddedCodes( plugin, fileName, sfc, - name => getNameToBlockMap()[name] - ) + name => getNameToBlockMap()[name], + ), ); const getFlatResult = computed(() => getPluginsResult.map(r => r()).flat()); const getStructuredResult = computed(() => { @@ -112,7 +112,7 @@ function computedPluginEmbeddedCodes( plugin: VueLanguagePluginReturn, fileName: string, sfc: Sfc, - getBlockByName: (name: string) => SfcBlock | undefined + getBlockByName: (name: string) => SfcBlock | undefined, ) { const computeds = new Map { code: VueEmbeddedCode; snapshot: ts.IScriptSnapshot; }>(); const getComputedKey = (code: { diff --git a/packages/language-core/lib/virtualFile/computedSfc.ts b/packages/language-core/lib/virtualFile/computedSfc.ts index 2c078214ce..87e18d80f3 100644 --- a/packages/language-core/lib/virtualFile/computedSfc.ts +++ b/packages/language-core/lib/virtualFile/computedSfc.ts @@ -13,7 +13,7 @@ export function computedSfc( plugins: VueLanguagePluginReturn[], fileName: string, getSnapshot: () => ts.IScriptSnapshot, - getParseResult: () => SFCParseResult | undefined + getParseResult: () => SFCParseResult | undefined, ): Sfc { const getUntrackedSnapshot = () => { @@ -46,7 +46,7 @@ export function computedSfc( get errors() { return compiledAst()?.errors; }, get warnings() { return compiledAst()?.warnings; }, }); - } + }, ); const getScript = computedNullableSfcBlock( 'script', @@ -67,7 +67,7 @@ export function computedSfc( get src() { return getSrc(); }, get ast() { return getAst(); }, }); - } + }, ); const getOriginalScriptSetup = computedNullableSfcBlock( 'scriptSetup', @@ -88,7 +88,7 @@ export function computedSfc( get generic() { return getGeneric(); }, get ast() { return getAst(); }, }); - } + }, ); const hasScript = computed(() => !!getParseResult()?.descriptor.script); const hasScriptSetup = computed(() => !!getParseResult()?.descriptor.scriptSetup); @@ -120,15 +120,15 @@ export function computedSfc( const getScoped = computed(() => !!getBlock().scoped); const getImports = computedItems( () => [...parseCssImports(base.content)], - (oldItem, newItem) => oldItem.text === newItem.text && oldItem.offset === newItem.offset + (oldItem, newItem) => oldItem.text === newItem.text && oldItem.offset === newItem.offset, ); const getCssVars = computedItems( () => [...parseCssVars(base.content)], - (oldItem, newItem) => oldItem.text === newItem.text && oldItem.offset === newItem.offset + (oldItem, newItem) => oldItem.text === newItem.text && oldItem.offset === newItem.offset, ); const getClassNames = computedItems( () => [...parseCssClassNames(base.content)], - (oldItem, newItem) => oldItem.text === newItem.text && oldItem.offset === newItem.offset + (oldItem, newItem) => oldItem.text === newItem.text && oldItem.offset === newItem.offset, ); return () => mergeObject(base, { get src() { return getSrc(); }, @@ -138,7 +138,7 @@ export function computedSfc( get cssVars() { return getCssVars(); }, get classNames() { return getClassNames(); }, }) satisfies Sfc['styles'][number]; - } + }, ); const customBlocks = computedArray( computed(() => getParseResult()?.descriptor.customBlocks ?? []), @@ -148,7 +148,7 @@ export function computedSfc( return () => mergeObject(base, { get type() { return getType(); }, }) satisfies Sfc['customBlocks'][number]; - } + }, ); return { @@ -269,7 +269,7 @@ export function computedSfc( name: string, defaultLang: string, getBlock: () => T | undefined, - resolve: (block: () => T, base: SfcBlock) => K + resolve: (block: () => T, base: SfcBlock) => K, ) { const hasBlock = computed(() => !!getBlock()); return computed(() => { @@ -284,7 +284,7 @@ export function computedSfc( function computedSfcBlock( name: string, defaultLang: string, - getBlock: () => T + getBlock: () => T, ) { const getLang = computed(() => getBlock().lang ?? defaultLang); const getAttrs = computed(() => getBlock().attrs); // TODO: computed it @@ -308,7 +308,7 @@ export function computedSfc( function computedAttrValue( key: keyof T & string, base: ReturnType, - getBlock: () => T + getBlock: () => T, ) { return computed(() => { const val = getBlock()[key] as SfcBlockAttr | undefined; diff --git a/packages/language-core/lib/virtualFile/computedVueSfc.ts b/packages/language-core/lib/virtualFile/computedVueSfc.ts index 97bbd3b4a0..efc90003d3 100644 --- a/packages/language-core/lib/virtualFile/computedVueSfc.ts +++ b/packages/language-core/lib/virtualFile/computedVueSfc.ts @@ -7,7 +7,7 @@ export function computedVueSfc( plugins: VueLanguagePluginReturn[], fileName: string, languageId: string, - getSnapshot: () => ts.IScriptSnapshot + getSnapshot: () => ts.IScriptSnapshot, ) { let cache: { snapshot: ts.IScriptSnapshot, diff --git a/packages/language-plugin-pug/index.ts b/packages/language-plugin-pug/index.ts index c1dce3209c..4d18e2d3c2 100644 --- a/packages/language-plugin-pug/index.ts +++ b/packages/language-plugin-pug/index.ts @@ -115,7 +115,7 @@ const plugin: VueLanguagePlugin = ({ modules }) => { return proxyed; } return value; - } + }, }); } diff --git a/packages/language-server/index.ts b/packages/language-server/index.ts index 5cd7b6462e..d5f8f4b258 100644 --- a/packages/language-server/index.ts +++ b/packages/language-server/index.ts @@ -53,7 +53,7 @@ connection.onInitialize(params => { { file: fileName, needFileNameList: false, - } satisfies ts.server.protocol.ProjectInfoRequestArgs + } satisfies ts.server.protocol.ProjectInfoRequestArgs, ); file2ProjectInfo.set(fileName, projectInfoPromise); } @@ -122,7 +122,7 @@ connection.onInitialize(params => { file: fileName, ...{ position } as unknown as { line: number; offset: number; }, filesToSearch: [fileName], - } satisfies ts.server.protocol.DocumentHighlightsRequestArgs + } satisfies ts.server.protocol.DocumentHighlightsRequestArgs, ); }, async getQuickInfoAtPosition(fileName, { line, character }) { @@ -132,11 +132,11 @@ connection.onInitialize(params => { file: fileName, line: line + 1, offset: character + 1, - } satisfies ts.server.protocol.FileLocationRequestArgs + } satisfies ts.server.protocol.FileLocationRequestArgs, ); return ts.displayPartsToString(result?.displayParts ?? []); }, - }) + }), ); async function sendTsRequest(command: string, args: any): Promise { @@ -163,7 +163,7 @@ connection.onInitialize(params => { ts, commonLine.options, commonLine.vueOptions, - uri => uri.fsPath.replace(/\\/g, '/') + uri => uri.fsPath.replace(/\\/g, '/'), ), ], createUriMap(), @@ -175,13 +175,13 @@ connection.onInitialize(params => { else { language.scripts.delete(uri); } - } + }, ); return createLanguageService( language, server.languageServicePlugins, createLanguageServiceEnvironment(server, [...server.workspaceFolders.all]), - { vue: { compilerOptions: commonLine.vueOptions } } + { vue: { compilerOptions: commonLine.vueOptions } }, ); } }); diff --git a/packages/language-server/lib/reactionsAnalyze.ts b/packages/language-server/lib/reactionsAnalyze.ts index 49cc1b58fe..79239e56b4 100644 --- a/packages/language-server/lib/reactionsAnalyze.ts +++ b/packages/language-server/lib/reactionsAnalyze.ts @@ -27,7 +27,7 @@ export function analyze( ts: typeof import('typescript'), languageService: ts.LanguageService, fileName: string, - position: number + position: number, ) { const sourceFile = languageService.getProgram()!.getSourceFile(fileName)!; const { signals, dotValueAccesses, dotAnyAccesses, functionCalls } = collect(ts, sourceFile); @@ -364,7 +364,7 @@ function collect(ts: typeof import('typescript'), sourceFile: ts.SourceFile) { sideEffectInfo: { isEffect: true, handler: effectCallback.body, - } + }, }); } } diff --git a/packages/language-server/tests/completions.spec.ts b/packages/language-server/tests/completions.spec.ts index c1c2eb659b..d798e1701c 100644 --- a/packages/language-server/tests/completions.spec.ts +++ b/packages/language-server/tests/completions.spec.ts @@ -5,7 +5,7 @@ import { getLanguageServer, testWorkspacePath } from './server.js'; test('Vue tags', async () => { expect( - (await requestCompletionListToVueServer('fixture.vue', 'vue', `<|`)).items.map(item => item.label) + (await requestCompletionListToVueServer('fixture.vue', 'vue', `<|`)).items.map(item => item.label), ).toMatchInlineSnapshot(` [ "template", @@ -45,7 +45,7 @@ test('Vue tags', async () => { test('#4670', async () => { expect( - (await requestCompletionListToVueServer('fixture.vue', 'vue', ``)).items.map(item => item.label).filter(label => label.includes('click')) + (await requestCompletionListToVueServer('fixture.vue', 'vue', ``)).items.map(item => item.label).filter(label => label.includes('click')), ).toMatchInlineSnapshot(` [ "onclick", @@ -62,7 +62,7 @@ test('#4670', async () => { test('HTML tags and built-in components', async () => { expect( - (await requestCompletionListToVueServer('fixture.vue', 'vue', ``)).items.map(item => item.label) + (await requestCompletionListToVueServer('fixture.vue', 'vue', ``)).items.map(item => item.label), ).toMatchInlineSnapshot(` [ "!DOCTYPE", @@ -214,7 +214,7 @@ test.skip('Directive Modifiers', async () => { let vFoo!: FunctionDirective; - `)).items.map(item => item.label) + `)).items.map(item => item.label), ).toMatchInlineSnapshot(` [ "attr", @@ -274,7 +274,7 @@ test.skip('#2511', async () => { - `, 'ComponentForAutoImport')) + `, 'ComponentForAutoImport')), ).toMatchInlineSnapshot(` { "newText": "import componentForAutoImport$1 from './component-for-auto-import.vue';", @@ -334,7 +334,7 @@ test.skip('Component auto import', async () => { - `, 'Empty')) + `, 'Empty')), ).toMatchInlineSnapshot(` { "additionalTextEdits": [ @@ -425,7 +425,7 @@ test('#4796', async () => { } }) - `, ':msg')) + `, ':msg')), ).toMatchInlineSnapshot(` { "documentation": { @@ -462,7 +462,7 @@ test('Auto insert defines', async () => { }>(); props| - `, 'props')) + `, 'props')), ).toMatchInlineSnapshot(` { "additionalTextEdits": [ diff --git a/packages/language-server/tests/definitions.spec.ts b/packages/language-server/tests/definitions.spec.ts index f3db377047..c1e8cbd6c9 100644 --- a/packages/language-server/tests/definitions.spec.ts +++ b/packages/language-server/tests/definitions.spec.ts @@ -5,7 +5,7 @@ import { getLanguageServer, testWorkspacePath } from './server.js'; test('TS to vue', async () => { expect( - await requestDefinition('tsconfigProject/fixture1.ts', 'typescript', `import C|omponent from './empty.vue';`) + await requestDefinition('tsconfigProject/fixture1.ts', 'typescript', `import C|omponent from './empty.vue';`), ).toMatchInlineSnapshot(` [ { @@ -22,7 +22,7 @@ test('TS to vue', async () => { ] `); expect( - await requestDefinition('tsconfigProject/fixture2.ts', 'typescript', `import Component from '|./empty.vue';`) + await requestDefinition('tsconfigProject/fixture2.ts', 'typescript', `import Component from '|./empty.vue';`), ).toMatchInlineSnapshot(` [ { @@ -47,7 +47,7 @@ test('Alias path', async () => { - `) + `), ).toMatchInlineSnapshot(` [ { @@ -88,7 +88,7 @@ test('#2600', async () => { - `) + `), ).toMatchInlineSnapshot(` [ { diff --git a/packages/language-server/tests/documentLinks.spec.ts b/packages/language-server/tests/documentLinks.spec.ts index 929eb86622..32c3802d42 100644 --- a/packages/language-server/tests/documentLinks.spec.ts +++ b/packages/language-server/tests/documentLinks.spec.ts @@ -27,7 +27,7 @@ test('Document links', async () => { color: red; } - `) + `), ).toMatchInlineSnapshot(` [ { diff --git a/packages/language-server/tests/inlayHints.spec.ts b/packages/language-server/tests/inlayHints.spec.ts index 882a106741..eaffb67ca5 100644 --- a/packages/language-server/tests/inlayHints.spec.ts +++ b/packages/language-server/tests/inlayHints.spec.ts @@ -13,7 +13,7 @@ test('Inline handler leading', async () => { - `) + `), ).toMatchInlineSnapshot(` " - `) + `), ).toMatchInlineSnapshot(` " - `) + `), ).toMatchInlineSnapshot(` " - `) + `), ).toMatchInlineSnapshot(` " - `) + `), ).toMatchInlineSnapshot(` { "info": { @@ -462,7 +462,7 @@ test('Component type props', async () => { - `) + `), ).toMatchInlineSnapshot(` { "info": { @@ -556,7 +556,7 @@ test('Component dynamic props', async () => { - `) + `), ).toMatchInlineSnapshot(` { "info": { @@ -633,7 +633,7 @@ test('Component returns', async () => { }, }); - `) + `), ).toMatchInlineSnapshot(` { "info": { @@ -702,7 +702,7 @@ test(' - `) + `), ).toMatchInlineSnapshot(` { "info": { @@ -772,7 +772,7 @@ test('Component tags', async () => { - `) + `), ).toMatchInlineSnapshot(` { "info": { @@ -881,7 +881,7 @@ test('#4673', async () => { - `) + `), ).toMatchInlineSnapshot(` { "info": { @@ -953,7 +953,7 @@ test('Scoped Classes', async () => { - `) + `), ).toMatchInlineSnapshot(` { "info": { @@ -1045,7 +1045,7 @@ test('Ref', async () => { import { ref } from 'vue'; const foo| = ref(); - `) + `), ).toMatchInlineSnapshot(` { "info": { @@ -1115,7 +1115,7 @@ test('Template Ref', async () => { import { useTemplateRef } from 'vue'; const el = useTemplateRef('foo|'); - `) + `), ).toMatchInlineSnapshot(` { "info": { diff --git a/packages/language-server/tests/server.ts b/packages/language-server/tests/server.ts index 455191c748..a2918fb609 100644 --- a/packages/language-server/tests/server.ts +++ b/packages/language-server/tests/server.ts @@ -27,7 +27,7 @@ export async function getLanguageServer(): Promise<{ '--suppressDiagnosticEvents', // '--logVerbosity', 'verbose', // '--logFile', path.join(__dirname, 'tsserver.log'), - ] + ], ); tsserver.on('exit', code => console.log(code ? `Exited with code ${code}` : `Terminated`)); @@ -59,7 +59,7 @@ export async function getLanguageServer(): Promise<{ workspace: { configuration: true, }, - } + }, ); } return { @@ -78,9 +78,9 @@ export async function getLanguageServer(): Promise<{ { file: URI.parse(uri).fsPath, fileContent: content, - } - ] - } + }, + ], + }, }); if (!res.success) { throw new Error(res.body); @@ -95,8 +95,8 @@ export async function getLanguageServer(): Promise<{ arguments: { changedFiles: [], closedFiles: [URI.parse(uri).fsPath], - openFiles: [] - } + openFiles: [], + }, }); if (!res.success) { throw new Error(res.body); diff --git a/packages/language-service/index.ts b/packages/language-service/index.ts index b67af80cba..65dfd6316c 100644 --- a/packages/language-service/index.ts +++ b/packages/language-service/index.ts @@ -42,12 +42,12 @@ export function createVueLanguageServicePlugins( ts: typeof import('typescript'), tsPluginClient: import('@vue/typescript-plugin/lib/requests').Requests & { getDocumentHighlights: (fileName: string, position: number) => Promise; - } | undefined + } | undefined, ) { const plugins = [ createTypeScriptSyntacticPlugin(ts), createTypeScriptDocCommentTemplatePlugin(ts), - ...getCommonLanguageServicePlugins(ts, () => tsPluginClient) + ...getCommonLanguageServicePlugins(ts, () => tsPluginClient), ]; if (tsPluginClient) { plugins.push(createVueDocumentHighlightsPlugin(tsPluginClient.getDocumentHighlights)); @@ -61,7 +61,7 @@ export function createVueLanguageServicePlugins( function getCommonLanguageServicePlugins( ts: typeof import('typescript'), - getTsPluginClient: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined + getTsPluginClient: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined, ): LanguageServicePlugin[] { return [ createTypeScriptTwoslashQueriesPlugin(ts), diff --git a/packages/language-service/lib/nameCasing.ts b/packages/language-service/lib/nameCasing.ts index 27b9fc8bf7..4ab97e49d2 100644 --- a/packages/language-service/lib/nameCasing.ts +++ b/packages/language-service/lib/nameCasing.ts @@ -41,7 +41,7 @@ const cache = new WeakMap(); function detect( context: LanguageServiceContext, - uri: URI + uri: URI, ): { tag: TagNameCasing[], attr: AttrNameCasing[], diff --git a/packages/language-service/lib/plugins/css.ts b/packages/language-service/lib/plugins/css.ts index 625d8d9e6f..a9ae2246be 100644 --- a/packages/language-service/lib/plugins/css.ts +++ b/packages/language-service/lib/plugins/css.ts @@ -45,12 +45,12 @@ export function create(): LanguageServicePlugin { return worker(document, (stylesheet, cssLs) => { return cssLs.prepareRename(document, position, stylesheet); }); - } + }, }; function isWithinNavigationVirtualCode( document: TextDocument, - position: css.Position + position: css.Position, ) { const uri = URI.parse(document.uri); const decoded = context.decodeEmbeddedDocumentUri(uri); @@ -103,7 +103,7 @@ export function create(): LanguageServicePlugin { function worker( document: TextDocument, - callback: (stylesheet: css.Stylesheet, cssLs: css.LanguageService) => T + callback: (stylesheet: css.Stylesheet, cssLs: css.LanguageService) => T, ) { const cssLs = getCssLs(document); if (!cssLs) { diff --git a/packages/language-service/lib/plugins/data.ts b/packages/language-service/lib/plugins/data.ts index 2e9852a522..4ad4fe9281 100644 --- a/packages/language-service/lib/plugins/data.ts +++ b/packages/language-service/lib/plugins/data.ts @@ -46,7 +46,7 @@ export function loadTemplateData(lang: string) { if (!attr.name.startsWith('v-')) { data.globalAttributes?.push( { ...attr, name: `:${attr.name}` }, - { ...attr, name: `v-bind:${attr.name}` } + { ...attr, name: `v-bind:${attr.name}` }, ); } } @@ -163,7 +163,7 @@ function resolveReferences(data: html.HTMLDataV1) { const relativeUrl = item.references as string; item.references = locale.map(({ name, url }) => ({ name, - url: url + relativeUrl + url: url + relativeUrl, })); } } diff --git a/packages/language-service/lib/plugins/vue-autoinsert-dotvalue.ts b/packages/language-service/lib/plugins/vue-autoinsert-dotvalue.ts index 7a83686da9..40de325d24 100644 --- a/packages/language-service/lib/plugins/vue-autoinsert-dotvalue.ts +++ b/packages/language-service/lib/plugins/vue-autoinsert-dotvalue.ts @@ -6,7 +6,7 @@ import { isTsDocument, sleep } from './utils'; export function create( ts: typeof import('typescript'), - getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined + getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined, ): LanguageServicePlugin { return { name: 'vue-autoinsert-dotvalue', @@ -106,7 +106,7 @@ function isCharacterTyping(document: TextDocument, change: { text: string; range const lastCharacter = change.text[change.text.length - 1]; const nextCharacter = document.getText().slice( change.rangeOffset + change.text.length, - change.rangeOffset + change.text.length + 1 + change.rangeOffset + change.text.length + 1, ); if (lastCharacter === undefined) { // delete text return false; diff --git a/packages/language-service/lib/plugins/vue-complete-define-assignment.ts b/packages/language-service/lib/plugins/vue-complete-define-assignment.ts index 4e27e1f7ad..a5d6b4280a 100644 --- a/packages/language-service/lib/plugins/vue-complete-define-assignment.ts +++ b/packages/language-service/lib/plugins/vue-complete-define-assignment.ts @@ -49,28 +49,28 @@ export function create(): LanguageServicePlugin { addDefineCompletionItem( scriptSetupRanges.defineProps?.statement, scriptSetupRanges.withDefaults?.exp ?? scriptSetupRanges.defineProps?.exp, - 'props' + 'props', ); addDefineCompletionItem( scriptSetupRanges.defineEmits?.statement, scriptSetupRanges.defineEmits?.exp, - 'emit' + 'emit', ); addDefineCompletionItem( scriptSetupRanges.defineSlots?.statement, scriptSetupRanges.defineSlots?.exp, - 'slots' + 'slots', ); return { isIncomplete: false, - items: result + items: result, }; function addDefineCompletionItem( statement: TextRange | undefined, exp: TextRange | undefined, - name: string + name: string, ) { if (!exp || exp.start !== statement?.start) { return; @@ -96,9 +96,9 @@ export function create(): LanguageServicePlugin { newText: `const ${name} = `, range: { start: pos, - end: pos - } - }] + end: pos, + }, + }], }); } }, diff --git a/packages/language-service/lib/plugins/vue-directive-comments.ts b/packages/language-service/lib/plugins/vue-directive-comments.ts index 1acb308f1a..a35cc0f137 100644 --- a/packages/language-service/lib/plugins/vue-directive-comments.ts +++ b/packages/language-service/lib/plugins/vue-directive-comments.ts @@ -60,7 +60,7 @@ export function create(): LanguageServicePlugin { }, newText: '@' + text, }, - insertTextFormat: 2 satisfies typeof InsertTextFormat.Snippet + insertTextFormat: 2 satisfies typeof InsertTextFormat.Snippet, }); } } diff --git a/packages/language-service/lib/plugins/vue-document-drop.ts b/packages/language-service/lib/plugins/vue-document-drop.ts index 7720e12255..0b7d1ba491 100644 --- a/packages/language-service/lib/plugins/vue-document-drop.ts +++ b/packages/language-service/lib/plugins/vue-document-drop.ts @@ -9,7 +9,7 @@ import { createAddComponentToOptionEdit, getLastImportNode } from '../plugins/vu export function create( ts: typeof import('typescript'), - getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined + getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined, ): LanguageServicePlugin { return { name: 'vue-document-drop', diff --git a/packages/language-service/lib/plugins/vue-document-highlights.ts b/packages/language-service/lib/plugins/vue-document-highlights.ts index 991b7476cf..0699afacad 100644 --- a/packages/language-service/lib/plugins/vue-document-highlights.ts +++ b/packages/language-service/lib/plugins/vue-document-highlights.ts @@ -4,7 +4,7 @@ import type * as ts from 'typescript'; import { URI } from 'vscode-uri'; export function create( - getDocumentHighlights: (fileName: string, position: number) => Promise + getDocumentHighlights: (fileName: string, position: number) => Promise, ): LanguageServicePlugin { return { name: 'vue-document-highlights', diff --git a/packages/language-service/lib/plugins/vue-extract-file.ts b/packages/language-service/lib/plugins/vue-extract-file.ts index ff7377835e..484fce3e8b 100644 --- a/packages/language-service/lib/plugins/vue-extract-file.ts +++ b/packages/language-service/lib/plugins/vue-extract-file.ts @@ -14,7 +14,7 @@ const unicodeReg = /\\u/g; export function create( ts: typeof import('typescript'), - getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined + getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined, ): LanguageServicePlugin { return { name: 'vue-extract-file', @@ -121,12 +121,12 @@ export function create( let newFileTags = []; newFileTags.push( - constructTag('template', [], templateInitialIndent, sfc.template.content.slice(templateCodeRange[0], templateCodeRange[1])) + constructTag('template', [], templateInitialIndent, sfc.template.content.slice(templateCodeRange[0], templateCodeRange[1])), ); if (toExtract.length) { newFileTags.push( - constructTag('script', ['setup', 'lang="ts"'], scriptInitialIndent, generateNewScriptContents()) + constructTag('script', ['setup', 'lang="ts"'], scriptInitialIndent, generateNewScriptContents()), ); } if (sfc.template.startTagEnd > script.startTagEnd) { diff --git a/packages/language-service/lib/plugins/vue-inlayhints.ts b/packages/language-service/lib/plugins/vue-inlayhints.ts index 445199f59e..72b2a9817e 100644 --- a/packages/language-service/lib/plugins/vue-inlayhints.ts +++ b/packages/language-service/lib/plugins/vue-inlayhints.ts @@ -43,7 +43,7 @@ export function create(ts: typeof import('typescript')): LanguageServicePlugin { for (const [prop, isShorthand] of findDestructuredProps( ts, virtualCode.sfc.scriptSetup.ast, - scriptSetupRanges.defineProps.destructured.keys() + scriptSetupRanges.defineProps.destructured.keys(), )) { const name = prop.text; const end = prop.getEnd(); @@ -115,7 +115,7 @@ type Scope = Record; export function findDestructuredProps( ts: typeof import('typescript'), ast: ts.SourceFile, - props: MapIterator + props: MapIterator, ) { const rootScope: Scope = Object.create(null); const scopeStack: Scope[] = [rootScope]; @@ -296,7 +296,7 @@ export function findDestructuredProps( // TODO: more conditions function isReferencedIdentifier( id: ts.Identifier, - parent: ts.Node | null + parent: ts.Node | null, ) { if (!parent) { return false; diff --git a/packages/language-service/lib/plugins/vue-missing-props-hints.ts b/packages/language-service/lib/plugins/vue-missing-props-hints.ts index 7fe869d175..f48c1141be 100644 --- a/packages/language-service/lib/plugins/vue-missing-props-hints.ts +++ b/packages/language-service/lib/plugins/vue-missing-props-hints.ts @@ -5,7 +5,7 @@ import { URI } from 'vscode-uri'; import { AttrNameCasing, checkCasing } from '../nameCasing'; export function create( - getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined + getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined, ): LanguageServicePlugin { return { name: 'vue-missing-props-hints', @@ -57,7 +57,7 @@ export function create( const componentProps: Record = {}; intrinsicElementNames ??= new Set( - await tsPluginClient?.getElementNames(root.fileName) ?? [] + await tsPluginClient?.getElementNames(root.fileName) ?? [], ); let token: html.TokenType; diff --git a/packages/language-service/lib/plugins/vue-sfc.ts b/packages/language-service/lib/plugins/vue-sfc.ts index 182add899e..5db932dd36 100644 --- a/packages/language-service/lib/plugins/vue-sfc.ts +++ b/packages/language-service/lib/plugins/vue-sfc.ts @@ -46,7 +46,7 @@ export function create(): LanguageServicePlugin { diagnosticProvider: { interFileDependencies: false, workspaceDiagnostics: false, - } + }, }, create(context) { const htmlServiceInstance = htmlService.create(context); @@ -91,7 +91,7 @@ export function create(): LanguageServicePlugin { const { startTagEnd = Infinity, - endTagStart = -Infinity + endTagStart = -Infinity, } = template ?? {}; for (const error of vueSfc.errors) { @@ -115,7 +115,7 @@ export function create(): LanguageServicePlugin { return [ ...originalResult ?? [], - ...sfcErrors + ...sfcErrors, ]; }); }, @@ -216,7 +216,7 @@ export function create(): LanguageServicePlugin { result.items = result.items.filter(item => item.label !== '!DOCTYPE' && item.label !== 'Custom Blocks' && - item.label !== 'data-' + item.label !== 'data-', ); const tags = sfcDataProvider?.provideTags(); @@ -249,7 +249,7 @@ export function create(): LanguageServicePlugin { result.items.push( getStyleCompletionItem(styleItem, lang), getStyleCompletionItem(styleItem, lang, 'scoped'), - getStyleCompletionItem(styleItem, lang, 'module') + getStyleCompletionItem(styleItem, lang, 'module'), ); } } @@ -305,7 +305,7 @@ export function create(): LanguageServicePlugin { function getStyleCompletionItem( styleItem: CompletionItem, lang: string, - attr?: string + attr?: string, ): CompletionItem { return { ...styleItem, @@ -315,6 +315,6 @@ function getStyleCompletionItem( textEdit: styleItem.textEdit ? { ...styleItem.textEdit, newText: styleItem.textEdit.newText + ' lang="' + lang + '"' + (attr ? ` ${attr}` : ''), - } : undefined + } : undefined, }; } diff --git a/packages/language-service/lib/plugins/vue-template.ts b/packages/language-service/lib/plugins/vue-template.ts index 8285d2e5a0..744001b34a 100644 --- a/packages/language-service/lib/plugins/vue-template.ts +++ b/packages/language-service/lib/plugins/vue-template.ts @@ -34,7 +34,7 @@ let modelData: html.HTMLDataV1; export function create( mode: 'html' | 'pug', - getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined + getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined, ): LanguageServicePlugin { let customData: html.IHTMLDataProvider[] = []; let extraCustomData: html.IHTMLDataProvider[] = []; @@ -183,7 +183,7 @@ export function create( const embeddedDocumentUri = context.encodeEmbeddedDocumentUri(sourceScript.id, virtualCode.id); afterHtmlCompletion( htmlComplete, - context.documents.get(embeddedDocumentUri, virtualCode.languageId, virtualCode.snapshot) + context.documents.get(embeddedDocumentUri, virtualCode.languageId, virtualCode.snapshot), ); } } @@ -256,7 +256,7 @@ export function create( && name !== 'TransitionGroup' && name !== 'KeepAlive' && name !== 'Suspense' - && name !== 'Teleport' + && name !== 'Teleport', ); lastCompletionComponentNames = new Set(components); version++; @@ -307,7 +307,7 @@ export function create( tagInfos.set(tag, { attrs, propInfos: propInfos.filter(prop => - !prop.name.startsWith('ref_') + !prop.name.startsWith('ref_'), ), events, directives, @@ -352,7 +352,7 @@ export function create( { name: '@' + propNameBase, description: propKey, - } + }, ); } else { @@ -381,7 +381,7 @@ export function create( { name: 'v-bind:' + propName, description: propKey, - } + }, ); } } @@ -399,14 +399,14 @@ export function create( { name: '@' + name, description: propKey, - } + }, ); } for (const directive of directives) { const name = hyphenateAttr(directive); attributes.push({ - name + name, }); } @@ -455,7 +455,7 @@ export function create( async sync() { await Promise.all(promises); return version; - } + }, }; } @@ -586,7 +586,7 @@ export function create( tag: '^', prop: propName, deprecated: false, - leadingSlash: false + leadingSlash: false, }; } @@ -733,7 +733,7 @@ function parseLabel(label: string) { const name = label.slice(leadingSlash ? 1 : 0); return { name, - leadingSlash + leadingSlash, }; } @@ -754,7 +754,7 @@ function parseItemKey(key: string) { tag: strs[1], prop: strs[2], deprecated: strs[3] === '1', - leadingSlash + leadingSlash, }; } } @@ -765,14 +765,14 @@ function getReplacement(list: html.CompletionList, doc: TextDocument) { return { item: item, textEdit: item.textEdit, - text: doc.getText(item.textEdit.range) + text: doc.getText(item.textEdit.range), }; } } } function getPropName( - parsedItem: ReturnType & {} + parsedItem: ReturnType & {}, ) { const name = hyphenateAttr(parsedItem.prop); if (name.startsWith('on-')) { diff --git a/packages/language-service/lib/plugins/vue-twoslash-queries.ts b/packages/language-service/lib/plugins/vue-twoslash-queries.ts index 99fa45abae..89122dabbe 100644 --- a/packages/language-service/lib/plugins/vue-twoslash-queries.ts +++ b/packages/language-service/lib/plugins/vue-twoslash-queries.ts @@ -5,7 +5,7 @@ import { URI } from 'vscode-uri'; const twoslashReg = //g; export function create( - getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined + getTsPluginClient?: (context: LanguageServiceContext) => import('@vue/typescript-plugin/lib/requests').Requests | undefined, ): LanguageServicePlugin { return { name: 'vue-twoslash-queries', diff --git a/packages/language-service/tests/format/1210.spec.ts b/packages/language-service/tests/format/1210.spec.ts index d79e577ec5..83fb36a51a 100644 --- a/packages/language-service/tests/format/1210.spec.ts +++ b/packages/language-service/tests/format/1210.spec.ts @@ -15,6 +15,6 @@ const count = ref(0); `.trim(), settings: { - 'typescript.format.semicolons': 'insert' + 'typescript.format.semicolons': 'insert', }, }); diff --git a/packages/language-service/tests/format/1398.spec.ts b/packages/language-service/tests/format/1398.spec.ts index ad73ce6264..b05b2470c4 100644 --- a/packages/language-service/tests/format/1398.spec.ts +++ b/packages/language-service/tests/format/1398.spec.ts @@ -9,6 +9,6 @@ defineFormatTest({ `.trim(), settings: { - 'javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis': true + 'javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis': true, }, }); diff --git a/packages/language-service/tests/format/2507.spec.ts b/packages/language-service/tests/format/2507.spec.ts index ef43b04e00..50a7865253 100644 --- a/packages/language-service/tests/format/2507.spec.ts +++ b/packages/language-service/tests/format/2507.spec.ts @@ -10,6 +10,6 @@ defineFormatTest({ `.trim(), settings: { 'typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis': true, - 'javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis': true + 'javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis': true, }, }); diff --git a/packages/language-service/tests/format/2571.spec.ts b/packages/language-service/tests/format/2571.spec.ts index ffbc7c5f5b..34db99f79b 100644 --- a/packages/language-service/tests/format/2571.spec.ts +++ b/packages/language-service/tests/format/2571.spec.ts @@ -10,6 +10,6 @@ defineFormatTest({ `.trim(), settings: { 'javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets': true, - 'typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets': true + 'typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets': true, }, }); diff --git a/packages/language-service/tests/format/4333.spec.ts b/packages/language-service/tests/format/4333.spec.ts index 03b8a21eb1..ebafa29c2e 100644 --- a/packages/language-service/tests/format/4333.spec.ts +++ b/packages/language-service/tests/format/4333.spec.ts @@ -10,5 +10,5 @@ defineFormatTest({ `.trim(), settings: { 'typescript.format.semicolons': 'insert', - } + }, }); diff --git a/packages/language-service/tests/utils/format.ts b/packages/language-service/tests/utils/format.ts index 7a84f8f2fa..5ffbb4faf7 100644 --- a/packages/language-service/tests/utils/format.ts +++ b/packages/language-service/tests/utils/format.ts @@ -10,7 +10,7 @@ const vueLanguagePlugin = createVueLanguagePlugin( ts, {}, resolvedVueOptions, - () => '' + () => '', ); const vueServicePLugins = createVueLanguageServicePlugins(ts, undefined); const formatter = kit.createFormatter([vueLanguagePlugin], vueServicePLugins); @@ -31,7 +31,7 @@ export function defineFormatTest(options: { const formatted = await formatter.format( options.input, options.languageId, - { insertSpaces: false, tabSize: 4 } + { insertSpaces: false, tabSize: 4 }, ); expect(formatted.replace(/\r\n/g, '\n')).toBe((options.output ?? options.input).replace(/\r\n/g, '\n')); diff --git a/packages/tsc/index.ts b/packages/tsc/index.ts index 8b2c39f3b5..f7e177d136 100644 --- a/packages/tsc/index.ts +++ b/packages/tsc/index.ts @@ -25,7 +25,7 @@ export function run(tscPath = require.resolve('typescript/lib/tsc')) { ts, options.options, vueOptions, - id => id + id => id, ); return { languagePlugins: [vueLanguagePlugin] }; } @@ -33,7 +33,7 @@ export function run(tscPath = require.resolve('typescript/lib/tsc')) { runExtensions = allExtensions; throw extensionsChangedException = new Error('extensions changed'); } - } + }, ); try { diff --git a/packages/tsc/tests/dts.spec.ts b/packages/tsc/tests/dts.spec.ts index 8d1d400bfd..4837a7c150 100644 --- a/packages/tsc/tests/dts.spec.ts +++ b/packages/tsc/tests/dts.spec.ts @@ -21,7 +21,7 @@ describe('vue-tsc-dts', () => { const options: ts.CreateProgramOptions = { host, rootNames: readFilesRecursive(workspace), - options: compilerOptions + options: compilerOptions, }; let vueOptions: vue.VueCompilerOptions; @@ -40,7 +40,7 @@ describe('vue-tsc-dts', () => { ts, options.options, vueOptions, - id => id + id => id, ); return [vueLanguagePlugin]; }); @@ -63,7 +63,7 @@ describe('vue-tsc-dts', () => { outputText = text; }, undefined, - true + true, ); expect(outputText ? normalizeNewline(outputText) : undefined).toMatchSnapshot(); }); diff --git a/packages/tsc/tests/typecheck.spec.ts b/packages/tsc/tests/typecheck.spec.ts index 24259b2423..b2ee1a9ecd 100644 --- a/packages/tsc/tests/typecheck.spec.ts +++ b/packages/tsc/tests/typecheck.spec.ts @@ -6,7 +6,7 @@ describe(`vue-tsc`, () => { test(`TypeScript - Stable`, () => { expect( - getTscOutput().sort() + getTscOutput().sort(), ).toMatchInlineSnapshot(` [ "test-workspace/tsc/failureFixtures/#3632/both.vue(3,1): error TS1109: Expression expected.", @@ -41,7 +41,7 @@ function getTscOutput() { try { const tscPath = require.resolve( `typescript/lib/tsc`, - { paths: [path.resolve(__dirname, '../../../test-workspace')] } + { paths: [path.resolve(__dirname, '../../../test-workspace')] }, ); run(tscPath); } catch { } diff --git a/packages/typescript-plugin/index.ts b/packages/typescript-plugin/index.ts index a9b13c79fd..c4b798ff8b 100644 --- a/packages/typescript-plugin/index.ts +++ b/packages/typescript-plugin/index.ts @@ -23,7 +23,7 @@ export = createLanguageServicePlugin( ts, info.languageServiceHost.getCompilationSettings(), vueOptions, - id => id + id => id, ); addVueCommands(); @@ -42,7 +42,7 @@ export = createLanguageServicePlugin( info.project['program'].__vue__ = { language }; } }, 50); - } + }, }; function getVueCompilerOptions() { @@ -146,5 +146,5 @@ export = createLanguageServicePlugin( asScriptId: (fileName: string) => fileName, }; } - } + }, ); diff --git a/packages/typescript-plugin/lib/common.ts b/packages/typescript-plugin/lib/common.ts index 45b98aabf4..0bb7bc034d 100644 --- a/packages/typescript-plugin/lib/common.ts +++ b/packages/typescript-plugin/lib/common.ts @@ -12,7 +12,7 @@ export function createVueLanguageServiceProxy( language: Language, languageService: ts.LanguageService, vueOptions: VueCompilerOptions, - asScriptId: (fileName: string) => T + asScriptId: (fileName: string) => T, ) { const proxyCache = new Map(); const getProxyMethod = (target: ts.LanguageService, p: string | symbol): Function | undefined => { @@ -51,7 +51,7 @@ function getCompletionsAtPosition( language: Language, vueOptions: VueCompilerOptions, asScriptId: (fileName: string) => T, - getCompletionsAtPosition: ts.LanguageService['getCompletionsAtPosition'] + getCompletionsAtPosition: ts.LanguageService['getCompletionsAtPosition'], ): ts.LanguageService['getCompletionsAtPosition'] { return (filePath, position, options, formattingSettings) => { const fileName = filePath.replace(windowsPathReg, '/'); @@ -60,7 +60,7 @@ function getCompletionsAtPosition( // filter __VLS_ result.entries = result.entries.filter( entry => !entry.name.includes('__VLS_') - && !entry.labelDetails?.description?.includes('__VLS_') + && !entry.labelDetails?.description?.includes('__VLS_'), ); // filter global variables in template and styles @@ -89,7 +89,7 @@ function getCompletionsAtPosition( entry.kind !== 'var' && entry.kind !== 'function' || !sortTexts.has(entry.sortText) || isGloballyAllowed(entry.name) - ) + ), ); } } @@ -134,7 +134,7 @@ function getCompletionsAtPosition( function getCompletionEntryDetails( language: Language, asScriptId: (fileName: string) => T, - getCompletionEntryDetails: ts.LanguageService['getCompletionEntryDetails'] + getCompletionEntryDetails: ts.LanguageService['getCompletionEntryDetails'], ): ts.LanguageService['getCompletionEntryDetails'] { return (...args) => { const details = getCompletionEntryDetails(...args); @@ -177,7 +177,7 @@ function getCompletionEntryDetails( } function getCodeFixesAtPosition( - getCodeFixesAtPosition: ts.LanguageService['getCodeFixesAtPosition'] + getCodeFixesAtPosition: ts.LanguageService['getCodeFixesAtPosition'], ): ts.LanguageService['getCodeFixesAtPosition'] { return (...args) => { let result = getCodeFixesAtPosition(...args); @@ -193,7 +193,7 @@ function getDefinitionAndBoundSpan( languageService: ts.LanguageService, vueOptions: VueCompilerOptions, asScriptId: (fileName: string) => T, - getDefinitionAndBoundSpan: ts.LanguageService['getDefinitionAndBoundSpan'] + getDefinitionAndBoundSpan: ts.LanguageService['getDefinitionAndBoundSpan'], ): ts.LanguageService['getDefinitionAndBoundSpan'] { return (fileName, position) => { const result = getDefinitionAndBoundSpan(fileName, position); @@ -260,7 +260,7 @@ function getDefinitionAndBoundSpan( function visit( node: ts.Node, definition: ts.DefinitionInfo, - sourceFile: ts.SourceFile + sourceFile: ts.SourceFile, ) { if (ts.isPropertySignature(node) && node.type) { proxy(node.name, node.type, definition, sourceFile); @@ -277,7 +277,7 @@ function getDefinitionAndBoundSpan( name: ts.PropertyName, type: ts.TypeNode, definition: ts.DefinitionInfo, - sourceFile: ts.SourceFile + sourceFile: ts.SourceFile, ) { const { textSpan, fileName } = definition; const start = name.getStart(sourceFile); @@ -306,7 +306,7 @@ function getDefinitionAndBoundSpan( function getQuickInfoAtPosition( ts: typeof import('typescript'), languageService: ts.LanguageService, - getQuickInfoAtPosition: ts.LanguageService['getQuickInfoAtPosition'] + getQuickInfoAtPosition: ts.LanguageService['getQuickInfoAtPosition'], ): ts.LanguageService['getQuickInfoAtPosition'] { return (...args) => { const result = getQuickInfoAtPosition(...args); @@ -355,7 +355,7 @@ function getEncodedSemanticClassifications( language: Language, languageService: ts.LanguageService, asScriptId: (fileName: string) => T, - getEncodedSemanticClassifications: ts.LanguageService['getEncodedSemanticClassifications'] + getEncodedSemanticClassifications: ts.LanguageService['getEncodedSemanticClassifications'], ): ts.LanguageService['getEncodedSemanticClassifications'] { return (filePath, span, format) => { const fileName = filePath.replace(windowsPathReg, '/'); @@ -372,12 +372,12 @@ function getEncodedSemanticClassifications( { start: span.start - template.startTagEnd, length: span.length, - } + }, )) { result.spans.push( componentSpan.start + template.startTagEnd, componentSpan.length, - 256 // class + 256, // class ); } } @@ -390,7 +390,7 @@ function getComponentSpans( this: Pick, vueCode: VueVirtualCode, template: NonNullable, - spanTemplateRange: ts.TextSpan + spanTemplateRange: ts.TextSpan, ) { const { typescript: ts, languageService } = this; const result: ts.TextSpan[] = []; diff --git a/packages/typescript-plugin/lib/requests/collectExtractProps.ts b/packages/typescript-plugin/lib/requests/collectExtractProps.ts index 4ace31d729..3e31b8bc2c 100644 --- a/packages/typescript-plugin/lib/requests/collectExtractProps.ts +++ b/packages/typescript-plugin/lib/requests/collectExtractProps.ts @@ -4,7 +4,7 @@ import type { RequestContext } from './types'; export function collectExtractProps( this: RequestContext, fileName: string, - templateCodeRange: [number, number] + templateCodeRange: [number, number], ) { const { typescript: ts, languageService, language, isTsPlugin, asScriptId } = this; diff --git a/packages/typescript-plugin/lib/requests/getComponentDirectives.ts b/packages/typescript-plugin/lib/requests/getComponentDirectives.ts index ffa2e8db60..c554da1209 100644 --- a/packages/typescript-plugin/lib/requests/getComponentDirectives.ts +++ b/packages/typescript-plugin/lib/requests/getComponentDirectives.ts @@ -13,7 +13,7 @@ const builtInDirectives = new Set([ export function getComponentDirectives( this: RequestContext, - fileName: string + fileName: string, ) { const { typescript: ts, language, languageService, asScriptId } = this; const volarFile = language.scripts.get(asScriptId(fileName)); diff --git a/packages/typescript-plugin/lib/requests/getComponentEvents.ts b/packages/typescript-plugin/lib/requests/getComponentEvents.ts index 94de89f81f..ce602429f0 100644 --- a/packages/typescript-plugin/lib/requests/getComponentEvents.ts +++ b/packages/typescript-plugin/lib/requests/getComponentEvents.ts @@ -5,7 +5,7 @@ import { getComponentType, getVariableType } from './utils'; export function getComponentEvents( this: RequestContext, fileName: string, - tag: string + tag: string, ) { const { typescript: ts, language, languageService, asScriptId } = this; const volarFile = language.scripts.get(asScriptId(fileName)); diff --git a/packages/typescript-plugin/lib/requests/getComponentNames.ts b/packages/typescript-plugin/lib/requests/getComponentNames.ts index c5b9580da4..37e80b2de3 100644 --- a/packages/typescript-plugin/lib/requests/getComponentNames.ts +++ b/packages/typescript-plugin/lib/requests/getComponentNames.ts @@ -5,7 +5,7 @@ import { getSelfComponentName, getVariableType } from './utils'; export function getComponentNames( this: RequestContext, - fileName: string + fileName: string, ) { const { typescript: ts, language, languageService, asScriptId } = this; const volarFile = language.scripts.get(asScriptId(fileName)); @@ -19,7 +19,7 @@ export function getComponentNames( export function _getComponentNames( ts: typeof import('typescript'), tsLs: ts.LanguageService, - vueCode: VueVirtualCode + vueCode: VueVirtualCode, ) { const names = getVariableType(ts, tsLs, vueCode, '__VLS_components') ?.type diff --git a/packages/typescript-plugin/lib/requests/getComponentProps.ts b/packages/typescript-plugin/lib/requests/getComponentProps.ts index 9dc28c34b4..1fe7ad20b1 100644 --- a/packages/typescript-plugin/lib/requests/getComponentProps.ts +++ b/packages/typescript-plugin/lib/requests/getComponentProps.ts @@ -15,7 +15,7 @@ export interface ComponentPropInfo { export function getComponentProps( this: RequestContext, fileName: string, - tag: string + tag: string, ) { const { typescript: ts, language, languageService, asScriptId } = this; const volarFile = language.scripts.get(asScriptId(fileName)); @@ -119,7 +119,7 @@ function generateCommentMarkdown(parts: ts.SymbolDisplayPart[], jsDocTags: ts.JS const deprecated = jsDocTags.some(tag => tag.name === 'deprecated'); return { content, - deprecated + deprecated, }; } diff --git a/packages/typescript-plugin/lib/requests/getElementAttrs.ts b/packages/typescript-plugin/lib/requests/getElementAttrs.ts index a4e07bc39f..6c06fb785d 100644 --- a/packages/typescript-plugin/lib/requests/getElementAttrs.ts +++ b/packages/typescript-plugin/lib/requests/getElementAttrs.ts @@ -5,7 +5,7 @@ import { getVariableType } from './utils'; export function getElementAttrs( this: RequestContext, fileName: string, - tagName: string + tagName: string, ) { const { typescript: ts, language, languageService, asScriptId } = this; const volarFile = language.scripts.get(asScriptId(fileName)); diff --git a/packages/typescript-plugin/lib/requests/getElementNames.ts b/packages/typescript-plugin/lib/requests/getElementNames.ts index b96bca8bc7..f10906b2d7 100644 --- a/packages/typescript-plugin/lib/requests/getElementNames.ts +++ b/packages/typescript-plugin/lib/requests/getElementNames.ts @@ -5,7 +5,7 @@ import { getVariableType } from './utils'; export function getElementNames( this: RequestContext, - fileName: string + fileName: string, ) { const { typescript: ts, language, languageService, asScriptId } = this; const volarFile = language.scripts.get(asScriptId(fileName)); @@ -19,7 +19,7 @@ export function getElementNames( export function _getElementNames( ts: typeof import('typescript'), tsLs: ts.LanguageService, - vueCode: VueVirtualCode + vueCode: VueVirtualCode, ) { return getVariableType(ts, tsLs, vueCode, '__VLS_elements') ?.type diff --git a/packages/typescript-plugin/lib/requests/getImportPathForFile.ts b/packages/typescript-plugin/lib/requests/getImportPathForFile.ts index 94f55ac141..00c7afa428 100644 --- a/packages/typescript-plugin/lib/requests/getImportPathForFile.ts +++ b/packages/typescript-plugin/lib/requests/getImportPathForFile.ts @@ -5,7 +5,7 @@ export function getImportPathForFile( this: RequestContext, fileName: string, incomingFileName: string, - preferences: ts.UserPreferences + preferences: ts.UserPreferences, ) { const { typescript: ts, languageService, languageServiceHost } = this; const program = languageService.getProgram(); @@ -34,7 +34,7 @@ export function getImportPathForFile( languageServiceHost.getCompilationSettings(), sourceFile, resolutionHost, - preferences + preferences, ); for (const moduleSpecifier of moduleSpecifiers.moduleSpecifiers) { diff --git a/packages/typescript-plugin/lib/requests/getPropertiesAtLocation.ts b/packages/typescript-plugin/lib/requests/getPropertiesAtLocation.ts index 77433991af..fb10258f10 100644 --- a/packages/typescript-plugin/lib/requests/getPropertiesAtLocation.ts +++ b/packages/typescript-plugin/lib/requests/getPropertiesAtLocation.ts @@ -7,7 +7,7 @@ import type { RequestContext } from './types'; export function getPropertiesAtLocation( this: RequestContext, fileName: string, - position: number + position: number, ) { const { languageService, language, typescript: ts, isTsPlugin, asScriptId } = this; diff --git a/packages/typescript-plugin/lib/requests/utils.ts b/packages/typescript-plugin/lib/requests/utils.ts index 2551ca2b99..bdabe5a0c4 100644 --- a/packages/typescript-plugin/lib/requests/utils.ts +++ b/packages/typescript-plugin/lib/requests/utils.ts @@ -9,7 +9,7 @@ export function getComponentType( vueCode: VueVirtualCode, components: NonNullable>, fileName: string, - tag: string + tag: string, ) { const program = languageService.getProgram()!; const checker = program.getTypeChecker(); @@ -48,7 +48,7 @@ export function getVariableType( ts: typeof import('typescript'), languageService: ts.LanguageService, vueCode: VueVirtualCode, - name: string + name: string, ) { const program = languageService.getProgram()!; @@ -68,7 +68,7 @@ export function getVariableType( function searchVariableDeclarationNode( ts: typeof import('typescript'), sourceFile: ts.SourceFile, - name: string + name: string, ) { let result: ts.Node | undefined; walk(sourceFile); diff --git a/tsslint.config.ts b/tsslint.config.ts index e584faede2..4ee1dd8034 100644 --- a/tsslint.config.ts +++ b/tsslint.config.ts @@ -1,6 +1,7 @@ import { defineConfig } from '@tsslint/config'; import { convertRules } from '@tsslint/eslint'; import * as path from 'node:path'; +import type * as ts from 'typescript'; export default defineConfig({ rules: { @@ -56,7 +57,7 @@ export default defineConfig({ reportError( `Module '${moduleName}' should be in the dependencies.`, node.getStart(sourceFile), - node.getEnd() + node.getEnd(), ); } } @@ -66,6 +67,65 @@ export default defineConfig({ }, }, formatting: [ + function trailingComma({ typescript: ts, sourceFile, insert, remove }) { + const { text } = sourceFile; + ts.forEachChild(sourceFile, function visit(node) { + let lastNode: ts.Node | undefined; + let end: number | undefined; + let allow = true; + + if (ts.isObjectLiteralExpression(node)) { + lastNode = node.properties[node.properties.length - 1]; + end = node.end; + } + else if ( + ts.isArrayLiteralExpression(node) + || ts.isObjectBindingPattern(node) + || ts.isArrayBindingPattern(node) + || ts.isNamedImports(node) + || ts.isNamedExports(node) + || ts.isImportAttributes(node) + || ts.isTupleTypeNode(node) + ) { + lastNode = node.elements[node.elements.length - 1]; + end = node.end; + } + else if (ts.isEnumDeclaration(node)) { + lastNode = node.members[node.members.length - 1]; + end = node.end; + } + else if (ts.isCallExpression(node) || ts.isNewExpression(node)) { + lastNode = node.arguments?.[node.arguments.length - 1]; + end = node.end; + } + else if (ts.isFunctionLike(node)) { + const last = node.parameters[node.parameters.length - 1]; + if (last && !last.dotDotDotToken) { + lastNode = last; + const right = 'body' in node && node.body?.getStart(sourceFile) || Infinity; + const parenIndex = text.indexOf(')', lastNode.end); + if (parenIndex !== -1 && parenIndex < right) { + end = parenIndex + 1; + } + } + } + + if (lastNode && end) { + const trailings = text.slice(lastNode.end, end - 1); + const commaIndex = trailings.indexOf(','); + if (allow && trailings.includes('\n')) { + if (commaIndex === -1) { + insert(lastNode.end, ','); + } + } + else if (commaIndex !== -1) { + const start = lastNode.end + commaIndex; + remove(start, start + 1); + } + } + ts.forEachChild(node, visit); + }); + }, /** * @example * ```diff @@ -121,37 +181,6 @@ export default defineConfig({ ts.forEachChild(node, visit); }); }, - function noTrailingCommaInFunction({ typescript: ts, sourceFile, remove }) { - const { text } = sourceFile; - ts.forEachChild(sourceFile, function visit(node) { - if (ts.isFunctionDeclaration(node) || ts.isArrowFunction(node) || ts.isMethodDeclaration(node)) { - const parameters = node.parameters; - if (parameters.length > 0) { - const lastParameter = parameters[parameters.length - 1]; - const nextCharIndex = lastParameter.end; - if (text[nextCharIndex] === ',') { - remove(nextCharIndex, nextCharIndex + 1); - } - } - } - ts.forEachChild(node, visit); - }); - }, - function noTrailingCommaInFunctionCall({ typescript: ts, sourceFile, remove }) { - const { text } = sourceFile; - ts.forEachChild(sourceFile, function visit(node) { - if (ts.isCallExpression(node)) { - if (node.arguments.length > 0) { - const lastArgument = node.arguments[node.arguments.length - 1]; - const nextCharIndex = lastArgument.end; - if (text[nextCharIndex] === ',') { - remove(nextCharIndex, nextCharIndex + 1); - } - } - } - ts.forEachChild(node, visit); - }); - }, function noUnnecessaryParentheses({ typescript: ts, sourceFile, remove }) { ts.forEachChild(sourceFile, function visit(node) { if (ts.isParenthesizedExpression(node)) {