astro-ghostcms/.pnpm-store/v3/files/18/c882855358b04eb0bdc5e578097...

130 lines
5.6 KiB
Plaintext

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.create = void 0;
const language_server_1 = require("@volar/language-server");
const fast_glob_1 = __importDefault(require("fast-glob"));
const node_path_1 = require("node:path");
const index_js_1 = require("../core/index.js");
const utils_js_1 = require("./utils.js");
const create = () => (context, modules) => {
return {
triggerCharacters: ['-'],
provideCompletionItems(document, position, completionContext, token) {
if (token.isCancellationRequested)
return null;
let items = [];
const [file] = context.documents.getVirtualFileByUri(document.uri);
if (!(file instanceof index_js_1.AstroFile))
return;
if (completionContext.triggerCharacter === '-') {
const frontmatterCompletion = getFrontmatterCompletion(file, document, position);
if (frontmatterCompletion)
items.push(frontmatterCompletion);
}
return {
isIncomplete: false,
items: items,
};
},
provideSemanticDiagnostics(document, token) {
if (token.isCancellationRequested)
return [];
const [file] = context.documents.getVirtualFileByUri(document.uri);
if (!(file instanceof index_js_1.AstroFile))
return;
return file.compilerDiagnostics.map(compilerMessageToDiagnostic);
function compilerMessageToDiagnostic(message) {
return {
message: message.text + (message.hint ? '\n\n' + message.hint : ''),
range: language_server_1.Range.create(message.location.line - 1, message.location.column - 1, message.location.line, message.location.length),
code: message.code,
severity: message.severity,
source: 'astro',
};
}
},
provideCodeLenses(document, token) {
if (token.isCancellationRequested)
return;
if (!context || !modules?.typescript || !(0, utils_js_1.isJSDocument)(document.languageId))
return;
const languageService = context.inject('typescript/languageService');
if (!languageService)
return;
const ts = modules?.typescript;
const tsProgram = languageService.getProgram();
if (!tsProgram)
return;
const globcodeLens = [];
const sourceFile = tsProgram.getSourceFile(context.env.uriToFileName(document.uri));
function walk() {
return ts.forEachChild(sourceFile, function cb(node) {
if (ts.isCallExpression(node) && node.expression.getText() === 'Astro.glob') {
const globArgument = node.arguments.at(0);
if (globArgument) {
globcodeLens.push(getGlobResultAsCodeLens(globArgument.getText().slice(1, -1), (0, node_path_1.dirname)(context.env.uriToFileName(document.uri)), document.positionAt(node.arguments.pos)));
}
}
return ts.forEachChild(node, cb);
});
}
walk();
return globcodeLens;
},
};
};
exports.create = create;
function getGlobResultAsCodeLens(globText, dir, position) {
const globResult = fast_glob_1.default.sync(globText, {
cwd: dir,
onlyFiles: true,
});
return {
range: language_server_1.Range.create(position, position),
command: { title: `Matches ${globResult.length} files`, command: '' },
};
}
function getFrontmatterCompletion(file, document, position) {
const base = {
kind: language_server_1.CompletionItemKind.Snippet,
label: '---',
sortText: '\0',
preselect: true,
detail: 'Create component script block',
insertTextFormat: language_server_1.InsertTextFormat.Snippet,
commitCharacters: [],
};
const documentLines = document.getText().split(/\r?\n/);
const { line, character } = document.positionAt(document.offsetAt(position));
const prefix = documentLines[line].slice(0, character);
if (file.astroMeta.frontmatter.status === 'doesnt-exist') {
return {
...base,
insertText: '---\n$0\n---',
textEdit: prefix.match(/^\s*\-+/)
? language_server_1.TextEdit.replace({ start: { ...position, character: 0 }, end: position }, '---\n$0\n---')
: undefined,
};
}
if (file.astroMeta.frontmatter.status === 'open') {
let insertText = '---';
// If the current line is a full component script starter/ender, the user expects a full frontmatter
// completion and not just a completion for "---" on the same line (which result in, well, nothing)
if (prefix === '---') {
insertText = '---\n$0\n---';
}
return {
...base,
insertText,
detail: insertText === '---' ? 'Close component script block' : 'Create component script block',
textEdit: prefix.match(/^\s*\-+/)
? language_server_1.TextEdit.replace({ start: { ...position, character: 0 }, end: position }, insertText)
: undefined,
};
}
return null;
}
//# sourceMappingURL=astro.js.map