UNPKG

@uni-helper/volar-service-uni-pages

Version:

Volar plugin for uni-pages route custom block in Vue SFC

207 lines (200 loc) 6.45 kB
import * as json from 'vscode-json-languageservice'; import pagesJsonSchema from '@uni-helper/pages-json-schema/schema.json'; import { getLanguageService } from 'yaml-language-server'; pagesJsonSchema.$ref = "#/definitions/PageMetaDatum"; pagesJsonSchema.definitions.PageMetaDatum.required = []; const schema = pagesJsonSchema; function createJsonLs(_context) { const jsonLs = json.getLanguageService({}); jsonLs.configure({ allowComments: true, schemas: [ { fileMatch: ["*.customBlock_route_*.json*"], uri: "foo://route-custom-block.schema.json", schema } ] }); return jsonLs; } function isYaml(document) { return document.languageId === "yaml"; } function noop() { } function createYamlLs(context) { const ls = getLanguageService({ schemaRequestService: async (uri) => await context.env.fs?.readFile(uri) ?? "", telemetry: { send: noop, sendError: noop, sendTrack: noop }, // @ts-expect-error https://github.com/redhat-developer/yaml-language-server/pull/910 clientCapabilities: context?.env?.clientCapabilities, workspaceContext: { resolveRelativePath(relativePath, resource) { return String(new URL(relativePath, resource)); } } }); ls.configure({ completion: true, customTags: [], format: true, hover: true, isKubernetes: false, validate: true, yamlVersion: "1.2", schemas: [ { fileMatch: ["*.customBlock_route_*.yaml*"], uri: "foo://route-custom-block.schema.yaml", name: "volar-service-uni-pages", description: "Volar plugin for uni-pages route custom block in Vue SFC", schema } ] }); return ls; } const index = () => (context) => { const triggerCharacters = ['"', ":"]; if (!context) return { triggerCharacters }; const jsonDocuments = /* @__PURE__ */ new WeakMap(); const jsonLs = createJsonLs(); const yamlLs = createYamlLs(context); return { provide: { "json/jsonDocument": getJsonDocument, "json/languageService": () => jsonLs, "yaml/languageService": () => yamlLs }, triggerCharacters, provideCodeActions(document, range, context2) { if (isYaml(document)) { return yamlLs.getCodeAction(document, { context: context2, range, textDocument: document }); } }, provideCodeLenses(document) { if (isYaml(document)) return yamlLs.getCodeLens(document); }, provideCompletionItems(document, position) { if (isYaml(document)) return yamlLs.doComplete(document, position, false); return worker(document, async (jsonDocument) => { return await jsonLs.doComplete(document, position, jsonDocument); }); }, resolveCompletionItem(item) { return jsonLs.doResolve(item); }, provideDefinition(document, position) { if (isYaml(document)) return yamlLs.doDefinition(document, { position, textDocument: document }); return worker(document, async (jsonDocument) => { return await jsonLs.findDefinition(document, position, jsonDocument); }); }, provideDiagnostics(document) { if (isYaml(document)) return yamlLs.doValidation(document, false); return worker(document, async (jsonDocument) => { const documentLanguageSettings = void 0; return await jsonLs.doValidation( document, jsonDocument, documentLanguageSettings, void 0 // TODO ); }); }, provideHover(document, position) { if (isYaml(document)) return yamlLs.doHover(document, position); return worker(document, async (jsonDocument) => { return await jsonLs.doHover(document, position, jsonDocument); }); }, provideDocumentLinks(document) { if (isYaml(document)) return yamlLs.findLinks(document); return worker(document, async (jsonDocument) => { return await jsonLs.findLinks(document, jsonDocument); }); }, provideDocumentSymbols(document) { if (isYaml(document)) return yamlLs.findDocumentSymbols2(document, {}); return worker(document, async (jsonDocument) => { return await jsonLs.findDocumentSymbols2(document, jsonDocument); }); }, provideDocumentColors(document) { return worker(document, async (jsonDocument) => { return await jsonLs.findDocumentColors(document, jsonDocument); }); }, provideColorPresentations(document, color, range) { return worker(document, async (jsonDocument) => { return await jsonLs.getColorPresentations(document, jsonDocument, color, range); }); }, provideFoldingRanges(document) { if (isYaml(document)) return yamlLs.getFoldingRanges(document, {}); return worker(document, async () => { return await jsonLs.getFoldingRanges(document); }); }, provideSelectionRanges(document, positions) { if (isYaml(document)) return yamlLs.getSelectionRanges(document, positions); return worker(document, async (jsonDocument) => { return await jsonLs.getSelectionRanges(document, positions, jsonDocument); }); }, resolveCodeLens(codeLens) { return yamlLs.resolveCodeLens(codeLens); }, provideDocumentFormattingEdits(document, range, options) { return worker(document, async () => { const options_2 = await context.env.getConfiguration?.("json.format"); if (!(options_2?.enable ?? true)) return; return jsonLs.format(document, range, { ...options_2, ...options }); }); } }; function worker(document, callback) { const jsonDocument = getJsonDocument(document); if (!jsonDocument) return; return callback(jsonDocument); } function getJsonDocument(textDocument) { if (textDocument.languageId !== "json" && textDocument.languageId !== "jsonc") return; const cache = jsonDocuments.get(textDocument); if (cache) { const [cacheVersion, cacheDoc] = cache; if (cacheVersion === textDocument.version) return cacheDoc; } const doc = jsonLs.parseJSONDocument(textDocument); jsonDocuments.set(textDocument, [textDocument.version, doc]); return doc; } }; export { index as default };