Home / File/ completions.ts — astro Source File

completions.ts — astro Source File

Architecture documentation for completions.ts, a typescript file in the astro codebase. 4 imports, 0 dependents.

File typescript CoreAstro CoreMiddleware 4 imports 4 functions

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

Dependencies

  • ../../core/index.js
  • ./utils.js
  • language-server
  • vscode-uri

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