/** * InjectorRegistry - Manages per-file-type injector instances * * Maps file extensions (jsx, tsx, vue) to their corresponding parser/injector * pairs. Singleton per workspace to share ID caches across transforms. * * Parsers are created lazily on first access via `getInjector()` to avoid * importing unnecessary parser dependencies (e.g. `vue/compiler-sfc` in * React-only projects). * * @module @domscribe/transform/core/injector-registry */ import { DomscribeInjector } from './injector.js'; import { InjectorOptions } from './types.js'; import { Node as AcornNode } from 'acorn'; import { AcornJSXOpeningElement } from '../parsers/acorn/types.js'; import { Node as BabelNode, JSXOpeningElement as BabelJSXOpeningElement } from '@babel/types'; import { VueSFCParseResult, VueElementNode } from '../parsers/vue/types.js'; export type JSXInjector = DomscribeInjector; export type TSXInjector = DomscribeInjector; export type VueInjector = DomscribeInjector; export interface InjectorRegistryMap { jsx: JSXInjector; tsx: TSXInjector; vue: VueInjector; } export type InjectorFileExtension = keyof InjectorRegistryMap; /** * Registry of file-type-specific injectors. * Manages lifecycle (initialize, saveCache, close) for all injectors as a unit. * * Parsers are instantiated lazily — only when `getInjector()` is first called * for a given file type. This avoids importing `vue/compiler-sfc` (or other * framework-specific parsers) in projects that don't use them. */ export declare class InjectorRegistry { private static instances; private readonly registry; private isClosed; private readonly workspaceRoot; private readonly options; constructor(workspaceRoot: string, options?: InjectorOptions); /** * Get or create a singleton InjectorRegistry for the given workspace. * A closed instance is replaced with a fresh one automatically. */ static getInstance(workspaceRoot: string, options?: InjectorOptions): InjectorRegistry; /** * No-op — kept for API compatibility. * * @remarks * Parsers are now initialized lazily in `getInjector()`. Existing call * sites that await `initialize()` continue to work without changes. */ initialize(): Promise; /** * Persist all injector ID caches to disk without closing the registry. * Safe to call after every transform — only writes when dirty. * Only operates on parsers that were actually created. */ saveCache(): void; close(): void; /** * Get the injector for a specific file extension. * Creates and initializes the parser on first access for each type. */ getInjector(type: InjectorFileExtension): Promise; /** Create an injector for the given file type using stored workspace config. */ private createInjector; } /** Type guard for supported file extensions (jsx, tsx, vue). */ export declare const isInjectorFileExtension: (extension: string) => extension is InjectorFileExtension; //# sourceMappingURL=injector.registry.d.ts.map