completions.ts — astro Source File
Architecture documentation for completions.ts, a typescript file in the astro codebase. 4 imports, 0 dependents.
Entity Profile
Dependency Diagram
graph LR 37356a62_09a0_ac45_a671_abc9e2985f77["completions.ts"] 38342bd4_11df_7a37_2e70_333185fe2db2["../../core/index.js"] 37356a62_09a0_ac45_a671_abc9e2985f77 --> 38342bd4_11df_7a37_2e70_333185fe2db2 0a26fa81_9fee_4874_879c_ce0b5dc3c998["./utils.js"] 37356a62_09a0_ac45_a671_abc9e2985f77 --> 0a26fa81_9fee_4874_879c_ce0b5dc3c998 6857b6b2_4d48_bfb0_0a0e_8e2e52fabb56["language-server"] 37356a62_09a0_ac45_a671_abc9e2985f77 --> 6857b6b2_4d48_bfb0_0a0e_8e2e52fabb56 abeb339e_cdba_0d7f_6b7f_3696c1eb86f9["vscode-uri"] 37356a62_09a0_ac45_a671_abc9e2985f77 --> abeb339e_cdba_0d7f_6b7f_3696c1eb86f9 style 37356a62_09a0_ac45_a671_abc9e2985f77 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
import type {
CompletionItem,
CompletionList,
LanguageServiceContext,
} from '@volar/language-server';
import { CompletionItemKind } from '@volar/language-server';
import { URI } from 'vscode-uri';
import { AstroVirtualCode } from '../../core/index.js';
import { mapEdit } from './utils.js';
export function enhancedProvideCompletionItems(completions: CompletionList): CompletionList {
completions.items = completions.items.filter(isValidCompletion).map((completion) => {
const source = completion?.data?.originalItem?.source;
if (source) {
// Sort completions starting with `astro:` higher than other imports
if (source.startsWith('astro:')) {
completion.sortText = '\u0000' + (completion.sortText ?? completion.label);
}
// For components import, use the file kind and sort them first, as they're often what the user want over something else
if (['.astro', '.svelte', '.vue'].some((ext) => source.endsWith(ext))) {
completion.kind = CompletionItemKind.File;
completion.detail = completion.detail + '\n\n' + source;
completion.sortText = '\u0001' + (completion.sortText ?? completion.label);
completion.data.isComponent = true;
}
}
return completion;
});
return completions;
}
export function enhancedResolveCompletionItem(
resolvedCompletion: CompletionItem,
context: LanguageServiceContext,
): CompletionItem {
// Make sure we keep our icons even when the completion is resolved
if (resolvedCompletion.data.isComponent) {
resolvedCompletion.detail = getDetailForFileCompletion(
resolvedCompletion.detail ?? '',
resolvedCompletion.data.originalItem.source,
);
}
if (resolvedCompletion.additionalTextEdits) {
const decoded = context.decodeEmbeddedDocumentUri(URI.parse(resolvedCompletion.data.uri));
const sourceScript = decoded && context.language.scripts.get(decoded[0]);
const virtualCode = decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
const root = sourceScript?.generated?.root;
if (!virtualCode || !(root instanceof AstroVirtualCode)) return resolvedCompletion;
resolvedCompletion.additionalTextEdits = resolvedCompletion.additionalTextEdits.map((edit) =>
mapEdit(edit, root, virtualCode.languageId),
);
}
return resolvedCompletion;
}
function getDetailForFileCompletion(detail: string, source: string): string {
return `${detail}\n\n${source}`;
}
// When Svelte components are imported, we have to reference the svelte2tsx's types to properly type the component
// An unfortunate downside of this is that it pollutes completions, so let's filter those internal types manually
const svelte2tsxTypes = new Set([
'Svelte2TsxComponent',
'Svelte2TsxComponentConstructorParameters',
'SvelteComponentConstructor',
'SvelteActionReturnType',
'SvelteTransitionConfig',
'SvelteTransitionReturnType',
'SvelteAnimationReturnType',
'SvelteWithOptionalProps',
'SvelteAllProps',
'SveltePropsAnyFallback',
'SvelteSlotsAnyFallback',
'SvelteRestProps',
'SvelteSlots',
'SvelteStore',
]);
function isValidCompletion(completion: CompletionItem) {
const isSvelte2tsxCompletion =
completion.label.startsWith('__sveltets_') || svelte2tsxTypes.has(completion.label);
// Filter out completions for the children prop, as it doesn't work in Astro
const isChildrenCompletion =
completion.label === 'children?' &&
completion.kind === CompletionItemKind.Field &&
completion.filterText === 'children={$1}';
if (isSvelte2tsxCompletion || isChildrenCompletion) return false;
return true;
}
Domain
Subdomains
Functions
Dependencies
- ../../core/index.js
- ./utils.js
- language-server
- vscode-uri
Source
Frequently Asked Questions
What does completions.ts do?
completions.ts is a source file in the astro codebase, written in typescript. It belongs to the CoreAstro domain, CoreMiddleware subdomain.
What functions are defined in completions.ts?
completions.ts defines 4 function(s): enhancedProvideCompletionItems, enhancedResolveCompletionItem, getDetailForFileCompletion, isValidCompletion.
What does completions.ts depend on?
completions.ts imports 4 module(s): ../../core/index.js, ./utils.js, language-server, vscode-uri.
Where is completions.ts in the architecture?
completions.ts is located at packages/language-tools/language-server/src/plugins/typescript/completions.ts (domain: CoreAstro, subdomain: CoreMiddleware, directory: packages/language-tools/language-server/src/plugins/typescript).
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free