From 208e9a63d0bc88cd6716bff92842d661d7177420 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 29 May 2023 08:58:06 +0300 Subject: [PATCH 1/7] fix: mark global completions should work in any context except dot access --- typescript/src/completionsAtPosition.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/src/completionsAtPosition.ts b/typescript/src/completionsAtPosition.ts index 6e67ee35..dd692702 100644 --- a/typescript/src/completionsAtPosition.ts +++ b/typescript/src/completionsAtPosition.ts @@ -351,7 +351,7 @@ export const getCompletionsAtPosition = ( }) } - if (prior.isGlobalCompletion) { + if (!prior.isMemberCompletion) { prior.entries = markOrRemoveGlobalCompletions(prior.entries, position, languageService, c) ?? prior.entries } if (exactNode) { From 00a0e3f9692fa1875623cc4c90f6e80f6b99821a Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 30 May 2023 01:51:07 +0300 Subject: [PATCH 2/7] fix: fix extract to jsx component with zero props empty braces --- typescript/src/codeActions/functionExtractors.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/typescript/src/codeActions/functionExtractors.ts b/typescript/src/codeActions/functionExtractors.ts index a4c26550..853ef841 100644 --- a/typescript/src/codeActions/functionExtractors.ts +++ b/typescript/src/codeActions/functionExtractors.ts @@ -1,3 +1,4 @@ +import { equals } from 'rambda' import { GetConfig } from '../types' import { createDummySourceFile, @@ -113,10 +114,13 @@ export const handleFunctionRefactorEdits = ( ...textChanges.slice(0, -2), { ...insertChange, - newText: `<${componentName} ${args - .split(', ') - .map(identifierText => `${identifierText}={${identifierText}}`) - .join(' ')} />`, + newText: `<${componentName}${ + args && + ` ${args + .split(', ') + .map(identifierText => `${identifierText}={${identifierText}}`) + .join(' ')}` + } />`, }, { span: functionChange.span, From 706ec5952390212edb4d27b4aa6b9637f3c5b4ac Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 30 May 2023 03:48:24 +0300 Subject: [PATCH 3/7] feat: cleanupVueComponentCompletions --- src/configurationType.ts | 7 +++++++ typescript/src/completionsAtPosition.ts | 14 +++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/configurationType.ts b/src/configurationType.ts index 33fbe8b6..d9b20790 100644 --- a/src/configurationType.ts +++ b/src/configurationType.ts @@ -334,12 +334,19 @@ export type Configuration = { * @default true */ miscDefinitionImprovement: boolean + // todo change setting format to: vue.* /** * Removes definiion suggestion from vue `components` options. * Might be useful with [Vetur-extended goToDefinition](https://github.com/zardoy/vetur-extended/blob/main/src/gotoDefinition.ts) for components as a replacement for (https://github.com/vuejs/language-tools/issues/1245) * @default false */ removeVueComponentsOptionDefinition: boolean + /** + * Use `filter-all` to also exclude auto-import completions (useful for Nuxt projects) + * @recommended filter-non-vue + * @default disable + */ + cleanupVueComponentCompletions: 'disable' | 'filter-non-vue' | 'filter-all' /** * Experimental, feedback welcome * If default, namespace import or import path click resolves to .d.ts file, try to resolve .js file instead with the same name diff --git a/typescript/src/completionsAtPosition.ts b/typescript/src/completionsAtPosition.ts index dd692702..0b453771 100644 --- a/typescript/src/completionsAtPosition.ts +++ b/typescript/src/completionsAtPosition.ts @@ -254,8 +254,9 @@ export const getCompletionsAtPosition = ( prior.entries = arrayMethods(prior.entries, position, sourceFile, c) ?? prior.entries prior.entries = jsdocDefault(prior.entries, position, sourceFile, languageService) ?? prior.entries + const isVueFileName = (fileName: string | undefined) => fileName && (fileName.endsWith('.vue.ts') || fileName.endsWith('.vue.js')) // #region Vue (Volar) specific - const isVueFile = fileName.endsWith('.vue.ts') || fileName.endsWith('.vue.js') + const isVueFile = isVueFileName(fileName) if (isVueFile && exactNode) { let node = ts.isIdentifier(exactNode) ? exactNode.parent : exactNode if (ts.isPropertyAssignment(node)) node = node.parent @@ -267,6 +268,17 @@ export const getCompletionsAtPosition = ( ) { prior.entries = prior.entries.filter(({ name, kind }) => kind === ts.ScriptElementKind.warning || !name.startsWith('__')) } + // const afterComponentsMarker = sourceFile.getFullText().lastIndexOf('/* Components */') < position + const { line: curLine } = ts.getLineAndCharacterOfPosition(sourceFile, position) + const lines = sourceFile.getFullText().split('\n') + if (ts.isArrayLiteralExpression(node) && lines[curLine - 1] === '// @ts-ignore' && lines[curLine - 2]?.startsWith('__VLS_components')) { + if (c('cleanupVueComponentCompletions') === 'filter-all') { + prior.entries = [] + } + if (c('cleanupVueComponentCompletions') === 'filter-non-vue') { + prior.entries = prior.entries.filter(entry => isVueFileName(entry.symbol?.declarations?.[0]?.getSourceFile().fileName)) + } + } } // #endregion From 5ac89fd77f0b8f5b1268bdcbca79363b22b4f3c2 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 30 May 2023 03:57:52 +0300 Subject: [PATCH 4/7] fix: fix ctrl+clicking (definition) for some module file paths (with ambient def) e.g. fixes go-to-definition on import("./Test.vue") --- typescript/src/definitions.ts | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/typescript/src/definitions.ts b/typescript/src/definitions.ts index 5b330498..8b83a0c4 100644 --- a/typescript/src/definitions.ts +++ b/typescript/src/definitions.ts @@ -5,7 +5,23 @@ import { findChildContainingExactPosition } from './utils' export default (proxy: ts.LanguageService, languageService: ts.LanguageService, languageServiceHost: ts.LanguageServiceHost, c: GetConfig) => { proxy.getDefinitionAndBoundSpan = (fileName, position) => { const prior = languageService.getDefinitionAndBoundSpan(fileName, position) - if (!prior) { + + if (c('removeModuleFileDefinitions')) { + prior.definitions = prior.definitions?.filter(def => { + if ( + def.kind === ts.ScriptElementKind.moduleElement && + def.name.slice(1, -1).startsWith('*.') && + def.containerKind === undefined && + (def as import('typescript-full').DefinitionInfo).isAmbient + ) { + return false + } + return true + }) + } + + // Definition fallbacks + if (!prior || prior.definitions.length === 0) { const program = languageService.getProgram()! const sourceFile = program.getSourceFile(fileName)! const node = findChildContainingExactPosition(sourceFile, position) @@ -144,20 +160,6 @@ export default (proxy: ts.LanguageService, languageService: ts.LanguageService, prior.definitions = prior.definitions.filter(definition => definition.containerName !== '__VLS_componentsOption') } - if (c('removeModuleFileDefinitions')) { - prior.definitions = prior.definitions?.filter(def => { - if ( - def.kind === ts.ScriptElementKind.moduleElement && - def.name.slice(1, -1).startsWith('*.') && - def.containerKind === undefined && - def['isAmbient'] - ) { - return false - } - return true - }) - } - return prior } } From 6fcb8add2c808a9e63cc0554eaf50ca83ed8b87e Mon Sep 17 00:00:00 2001 From: Ilya Golovin <74474615+maIIady@users.noreply.github.com> Date: Wed, 31 May 2023 04:50:10 +0300 Subject: [PATCH 5/7] fix(volar): update definitions filtering (#129) --- typescript/src/definitions.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/typescript/src/definitions.ts b/typescript/src/definitions.ts index 8b83a0c4..d9378713 100644 --- a/typescript/src/definitions.ts +++ b/typescript/src/definitions.ts @@ -6,7 +6,7 @@ export default (proxy: ts.LanguageService, languageService: ts.LanguageService, proxy.getDefinitionAndBoundSpan = (fileName, position) => { const prior = languageService.getDefinitionAndBoundSpan(fileName, position) - if (c('removeModuleFileDefinitions')) { + if (c('removeModuleFileDefinitions') && prior) { prior.definitions = prior.definitions?.filter(def => { if ( def.kind === ts.ScriptElementKind.moduleElement && @@ -21,7 +21,7 @@ export default (proxy: ts.LanguageService, languageService: ts.LanguageService, } // Definition fallbacks - if (!prior || prior.definitions.length === 0) { + if (!prior || prior.definitions?.length === 0) { const program = languageService.getProgram()! const sourceFile = program.getSourceFile(fileName)! const node = findChildContainingExactPosition(sourceFile, position) @@ -156,8 +156,22 @@ export default (proxy: ts.LanguageService, languageService: ts.LanguageService, return true }) } + if (c('removeVueComponentsOptionDefinition') && prior.definitions) { - prior.definitions = prior.definitions.filter(definition => definition.containerName !== '__VLS_componentsOption') + const program = languageService.getProgram()! + const sourceFile = program.getSourceFile(fileName)! + + const lines = sourceFile.getFullText().split('\n') + const { line: curLine } = ts.getLineAndCharacterOfPosition(sourceFile, position) + + const VLS_COMPONENT_STRING = `__VLS_templateComponents` + const isTemplateComponent = lines[curLine]?.startsWith(VLS_COMPONENT_STRING) + if (!isTemplateComponent) return + + const componentName = lines[curLine]?.match(/\.(\w+);?/)?.[1] + if (!componentName) return + + prior.definitions = prior.definitions.filter(({ name }) => !(componentName === name && lines[curLine - 2] === '// @ts-ignore')) } return prior From c6571223ed39127fb4df3869a35d71a7082ebeef Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 31 May 2023 04:50:26 +0300 Subject: [PATCH 6/7] test only on windows --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6e66774d..0cb9aff0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ jobs: test: strategy: matrix: - os: [ubuntu-latest, windows-latest] + os: [ubuntu-latest] fail-fast: true runs-on: ${{ matrix.os }} timeout-minutes: 30 From 3c40998673e222e708ad0b5dd47ab845251cb3e7 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 31 May 2023 04:56:14 +0300 Subject: [PATCH 7/7] up lockfile ver --- pnpm-lock.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8103f2c9..f9fba9cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,8 @@ -lockfileVersion: '6.0' +lockfileVersion: '6.1' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false overrides: esbuild: ^0.15.15