"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