"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.plugin = void 0; const node_1 = require("@volar/language-server/node"); const core_1 = require("./core"); const svelte_js_1 = require("./core/svelte.js"); const vue_js_1 = require("./core/vue.js"); const importPackage_js_1 = require("./importPackage.js"); const utils_js_1 = require("./utils.js"); // Services const volar_service_css_1 = require("volar-service-css"); const volar_service_emmet_1 = require("volar-service-emmet"); const volar_service_prettier_1 = require("volar-service-prettier"); const volar_service_typescript_twoslash_queries_1 = require("volar-service-typescript-twoslash-queries"); const astro_js_1 = require("./plugins/astro.js"); const html_js_1 = require("./plugins/html.js"); const index_js_1 = require("./plugins/typescript-addons/index.js"); const index_js_2 = require("./plugins/typescript/index.js"); const plugin = (initOptions, modules) => ({ extraFileExtensions: [ { extension: 'astro', isMixedContent: true, scriptKind: 7 }, { extension: 'vue', isMixedContent: true, scriptKind: 7 }, { extension: 'svelte', isMixedContent: true, scriptKind: 7 }, ], watchFileExtensions: [ 'js', 'cjs', 'mjs', 'ts', 'cts', 'mts', 'jsx', 'tsx', 'json', 'astro', 'vue', 'svelte', ], resolveConfig(config, ctx) { config.languages ??= {}; if (ctx) { const nearestPackageJson = modules.typescript?.findConfigFile(ctx.project.rootUri.fsPath, modules.typescript.sys.fileExists, 'package.json'); const astroInstall = (0, utils_js_1.getAstroInstall)([ctx.project.rootUri.fsPath], { nearestPackageJson: nearestPackageJson, readDirectory: modules.typescript.sys.readDirectory, }); if (astroInstall === 'not-found') { ctx.server.connection.sendNotification(node_1.ShowMessageNotification.type, { message: `Couldn't find Astro in workspace "${ctx.project.rootUri.fsPath}". Experience might be degraded. For the best experience, please make sure Astro is installed into your project and restart the language server.`, type: node_1.MessageType.Warning, }); } config.languages.astro = (0, core_1.getLanguageModule)(typeof astroInstall === 'string' ? undefined : astroInstall, modules.typescript); config.languages.vue = (0, vue_js_1.getVueLanguageModule)(); config.languages.svelte = (0, svelte_js_1.getSvelteLanguageModule)(); } config.services ??= {}; config.services.html ??= (0, html_js_1.create)(); config.services.css ??= (0, volar_service_css_1.create)(); config.services.emmet ??= (0, volar_service_emmet_1.create)(); config.services.typescript ??= (0, index_js_2.create)(); config.services.typescripttwoslash ??= (0, volar_service_typescript_twoslash_queries_1.create)(); config.services.typescriptaddons ??= (0, index_js_1.create)(); config.services.astro ??= (0, astro_js_1.create)(); if (ctx) { const rootDir = ctx.env.uriToFileName(ctx.project.rootUri.toString()); const prettier = (0, importPackage_js_1.importPrettier)(rootDir); const prettierPluginPath = (0, importPackage_js_1.getPrettierPluginPath)(rootDir); if (prettier && prettierPluginPath) { config.services.prettier ??= (0, volar_service_prettier_1.create)({ prettier: prettier, languages: ['astro'], ignoreIdeOptions: true, useIdeOptionsFallback: true, resolveConfigOptions: { // This seems to be broken since Prettier 3, and it'll always use its cumbersome cache. Hopefully it works one day. useCache: false, }, additionalOptions: async (resolvedConfig) => { async function getAstroPrettierPlugin() { if (!prettier || !prettierPluginPath) { return []; } const hasPluginLoadedAlready = (await prettier.getSupportInfo()).languages.some((l) => l.name === 'astro') || resolvedConfig.plugins?.includes('prettier-plugin-astro'); // getSupportInfo doesn't seems to work very well in Prettier 3 for plugins return hasPluginLoadedAlready ? [] : [prettierPluginPath]; } const plugins = [ ...(await getAstroPrettierPlugin()), ...(resolvedConfig.plugins ?? []), ]; return { ...resolvedConfig, plugins: plugins, parser: 'astro', }; }, }); } else { ctx.server.connection.sendNotification(node_1.ShowMessageNotification.type, { message: "Couldn't load `prettier` or `prettier-plugin-astro`. Formatting will not work. Please make sure those two packages are installed into your project.", type: node_1.MessageType.Warning, }); } } return config; }, }); exports.plugin = plugin; //# sourceMappingURL=languageServerPlugin.js.map