astro-ghostcms/.pnpm-store/v3/files/5a/87d3f79232984f3ce0236004ca8...

79 lines
3.8 KiB
Plaintext
Raw Normal View History

2024-02-14 14:10:47 +00:00
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.enhancedResolveCompletionItem = exports.enhancedProvideCompletionItems = void 0;
const language_server_1 = require("@volar/language-server");
const index_js_1 = require("../../core/index.js");
const utils_js_1 = require("../utils.js");
function enhancedProvideCompletionItems(completions) {
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 = language_server_1.CompletionItemKind.File;
completion.detail = completion.detail + '\n\n' + source;
completion.sortText = '\u0001' + (completion.sortText ?? completion.label);
completion.data.isComponent = true;
}
}
return completion;
});
return completions;
}
exports.enhancedProvideCompletionItems = enhancedProvideCompletionItems;
function enhancedResolveCompletionItem(resolvedCompletion, context) {
// 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 [virtualFile, source] = context.documents.getVirtualFileByUri(resolvedCompletion.data.uri);
const file = source?.root;
if (!virtualFile || !(file instanceof index_js_1.AstroFile) || !context.host)
return resolvedCompletion;
resolvedCompletion.additionalTextEdits = resolvedCompletion.additionalTextEdits.map((edit) => {
if ((0, utils_js_1.editShouldBeInFrontmatter)(edit.range, file.astroMeta).itShould) {
edit = (0, utils_js_1.ensureProperEditForFrontmatter)(edit, file.astroMeta, '\n');
}
return edit;
});
}
return resolvedCompletion;
}
exports.enhancedResolveCompletionItem = enhancedResolveCompletionItem;
function getDetailForFileCompletion(detail, source) {
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) {
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 === language_server_1.CompletionItemKind.Field &&
completion.filterText === 'children={$1}';
if (isSvelte2tsxCompletion || isChildrenCompletion)
return false;
return true;
}
//# sourceMappingURL=completions.js.map