import type { DefaultSharedCoreModuleContext, LangiumCoreServices, LangiumSharedCoreServices, Module, PartialLangiumCoreServices, } from 'langium'; import { EmptyFileSystem, createDefaultCoreModule, createDefaultSharedCoreModule, inject, } from 'langium'; import { MermaidGeneratedSharedModule, MindmapGeneratedModule } from '../generated/module.js'; import { MindmapTokenBuilder } from './tokenBuilder.js'; import { MindmapValueConverter } from './valueConverter.js'; import { MindmapValidator, registerValidationChecks } from './mindmap-validator.js'; /** * Declaration of `Mindmap` services. */ interface MindmapAddedServices { parser: { TokenBuilder: MindmapTokenBuilder; ValueConverter: MindmapValueConverter; }; validation: { MindmapValidator: MindmapValidator; }; } /** * Union of Langium default services and `Mindmap` services. */ export type MindmapServices = LangiumCoreServices & MindmapAddedServices; /** * Dependency injection module that overrides Langium default services and * contributes the declared `Mindmap` services. */ export const MindmapModule: Module< MindmapServices, PartialLangiumCoreServices & MindmapAddedServices > = { parser: { TokenBuilder: () => new MindmapTokenBuilder(), ValueConverter: () => new MindmapValueConverter(), }, validation: { MindmapValidator: () => new MindmapValidator(), }, }; /** * Create the full set of services required by Langium. * * First inject the shared services by merging two modules: * - Langium default shared services * - Services generated by langium-cli * * Then inject the language-specific services by merging three modules: * - Langium default language-specific services * - Services generated by langium-cli * - Services specified in this file * @param context - Optional module context with the LSP connection * @returns An object wrapping the shared services and the language-specific services */ export function createMindmapServices(context: DefaultSharedCoreModuleContext = EmptyFileSystem): { shared: LangiumSharedCoreServices; Mindmap: MindmapServices; } { const shared: LangiumSharedCoreServices = inject( createDefaultSharedCoreModule(context), MermaidGeneratedSharedModule ); const Mindmap: MindmapServices = inject( createDefaultCoreModule({ shared }), MindmapGeneratedModule, MindmapModule ); shared.ServiceRegistry.register(Mindmap); // Register validation checks registerValidationChecks(Mindmap); return { shared, Mindmap }; }