@devcraft-ts/diadem 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/LICENSE +21 -0
- package/README.md +306 -0
- package/dist/auto-discovery-5IV22D5D.cjs +73 -0
- package/dist/auto-discovery-5IV22D5D.cjs.map +1 -0
- package/dist/auto-discovery-RPCKK3PB.js +68 -0
- package/dist/auto-discovery-RPCKK3PB.js.map +1 -0
- package/dist/chunk-72YY5X6T.cjs +683 -0
- package/dist/chunk-72YY5X6T.cjs.map +1 -0
- package/dist/chunk-FHQRDO5C.cjs +187 -0
- package/dist/chunk-FHQRDO5C.cjs.map +1 -0
- package/dist/chunk-RTX6B4YY.js +681 -0
- package/dist/chunk-RTX6B4YY.js.map +1 -0
- package/dist/chunk-W7NA3ZZF.js +169 -0
- package/dist/chunk-W7NA3ZZF.js.map +1 -0
- package/dist/cli.cjs +821 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.js +815 -0
- package/dist/cli.js.map +1 -0
- package/dist/container-C1FFn9_4.d.cts +249 -0
- package/dist/container-C1FFn9_4.d.ts +249 -0
- package/dist/index.cjs +145 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +304 -0
- package/dist/index.d.ts +304 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/setup/index.cjs +87 -0
- package/dist/setup/index.cjs.map +1 -0
- package/dist/setup/index.d.cts +81 -0
- package/dist/setup/index.d.ts +81 -0
- package/dist/setup/index.js +75 -0
- package/dist/setup/index.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/dependency-resolver.ts","../src/core/container.ts"],"names":["loadManifest","getDIMetadata","getLogger"],"mappings":"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","file":"chunk-72YY5X6T.cjs","sourcesContent":["/**\n * Build-time Dependency Resolver for Auto-Wiring DI Container\n *\n * This module provides dependency resolution using pre-analyzed build-time manifest data.\n * No runtime reflection or constructor parsing - all dependency information is extracted\n * during build time and included in the manifest.\n *\n * Features:\n * - Uses build-time dependency analysis from enhanced manifest\n * - Topological sorting based on pre-calculated registration order\n * - Constructor injection with resolved dependencies\n * - Support for optional dependencies and external services\n */\n\nimport type { DIContainer } from './container'\nimport { getDIMetadata } from './decorators'\nimport type { DIMetadata } from './decorators'\nimport { getLogger } from './logger'\nimport { loadManifest } from './manifest'\nimport type { ServiceDependency, ServiceManifestEntry } from './manifest'\nimport type { AbstractConstructor, ConcreteConstructor } from './types'\n\nexport interface DependencyResolutionResult {\n registeredServices: string[]\n registeredCount: number\n skippedCount: number\n dependencyStats: {\n totalServices: number\n servicesWithDependencies: number\n totalDependencies: number\n externalDependencies: number\n maxDependencyDepth: number\n }\n warnings: string[]\n registrationOrder: string[]\n}\n\nexport class EnhancedDependencyResolver {\n private readonly registeredServices = new Set<string>()\n private readonly serviceClassMap = new Map<string, ConcreteConstructor>()\n private readonly serviceMetadataMap = new Map<string, DIMetadata>()\n\n /**\n * Register services using build-time dependency analysis\n * Services are registered in the correct order based on their dependencies\n */\n async registerServicesWithManifest(\n container: DIContainer,\n services: ConcreteConstructor[],\n manifestEntries: ServiceManifestEntry[],\n environment?: string\n ): Promise<DependencyResolutionResult> {\n const warnings: string[] = []\n const registrationOrder: string[] = []\n let registeredCount = 0\n let skippedCount = 0\n\n // Create maps for efficient lookup\n const manifestMap = new Map<string, ServiceManifestEntry>()\n\n // Build service class map and metadata map using original class names from manifest\n this.serviceClassMap.clear()\n this.serviceMetadataMap.clear()\n let servicesWithMetadata = 0\n\n // Recover original (un-mangled) class names from the manifest's static\n // SERVICE_CLASSES mapping, when a manifest is configured. When it isn't\n // (e.g. callers passing explicit services + entries, or unminified runtimes),\n // fall back to the runtime class name.\n const reverseMapping = new Map<AbstractConstructor, string>()\n try {\n const { SERVICE_CLASSES } = await loadManifest()\n Object.entries(SERVICE_CLASSES).forEach(([originalName, serviceClass]) => {\n reverseMapping.set(serviceClass, originalName)\n })\n } catch {\n // No global manifest configured; runtime class names are used below.\n }\n\n for (const serviceClass of services) {\n const metadata = getDIMetadata(serviceClass)\n if (metadata) {\n // Use original class name from static mapping if available, otherwise fall back to mangled name\n const originalName =\n reverseMapping.get(serviceClass) || serviceClass.name\n this.serviceClassMap.set(originalName, serviceClass)\n this.serviceMetadataMap.set(originalName, metadata)\n servicesWithMetadata++\n }\n }\n getLogger().info(\n `📋 Built service map: ${servicesWithMetadata}/${services.length} services with DI metadata`\n )\n\n if (servicesWithMetadata === 0) {\n getLogger().error('❌ CRITICAL: No services have DI metadata!')\n getLogger().error(\n '🔍 Service analysis:',\n services.slice(0, 3).map((s) => ({\n name: s.name,\n hasDI: !!getDIMetadata(s)\n }))\n )\n }\n\n // Build manifest map and filter by environment\n for (const entry of manifestEntries) {\n // Skip if environment doesn't match\n if (\n environment &&\n entry.environment &&\n entry.environment !== environment\n ) {\n continue\n }\n manifestMap.set(entry.className, entry)\n }\n getLogger().info(\n `📋 Manifest map: ${manifestMap.size}/${manifestEntries.length} entries for ${environment || 'any'}`\n )\n\n // Get services sorted by registration order (calculated at build time)\n const sortedEntries = Array.from(manifestMap.values()).sort(\n (a, b) => a.registrationOrder - b.registrationOrder\n )\n\n if (sortedEntries.length === 0) {\n getLogger().error('❌ CRITICAL: No services to register after filtering!')\n getLogger().error('🔍 Debug analysis:', {\n serviceClassMapSize: this.serviceClassMap.size,\n manifestMapSize: manifestMap.size,\n serviceNames: Array.from(this.serviceClassMap.keys()).slice(0, 5),\n manifestNames: manifestEntries.slice(0, 5).map((e) => e.className),\n environment\n })\n return {\n registeredServices: [],\n registeredCount: 0,\n skippedCount: 0,\n dependencyStats: {\n totalServices: 0,\n servicesWithDependencies: 0,\n totalDependencies: 0,\n externalDependencies: 0,\n maxDependencyDepth: 0\n },\n warnings: ['No services to register'],\n registrationOrder: []\n }\n }\n\n getLogger().info(`🔗 Registering ${sortedEntries.length} services`)\n\n // Register each service in the correct order\n for (const manifestEntry of sortedEntries) {\n const serviceClass = this.serviceClassMap.get(manifestEntry.className)\n\n if (!serviceClass) {\n getLogger().error(`❌ Service class not found: ${manifestEntry.className}`)\n\n getLogger().error(\n `🔍 Available: ${Array.from(this.serviceClassMap.keys()).slice(0, 5).join(', ')}...`\n )\n warnings.push(`Service class ${manifestEntry.className} not found`)\n skippedCount++\n continue\n }\n\n try {\n await this.registerSingleService(\n container,\n serviceClass,\n manifestEntry,\n warnings\n )\n registeredCount++\n registrationOrder.push(manifestEntry.className)\n this.registeredServices.add(manifestEntry.className)\n } catch (error) {\n const err = error as Error\n skippedCount++\n getLogger().error(\n `❌ Registration failed: ${manifestEntry.className} - ${err.message}`\n )\n warnings.push(\n `Failed to register ${manifestEntry.className}: ${err.message}`\n )\n }\n }\n\n getLogger().info(\n `📊 Registration complete: ${registeredCount} registered, ${skippedCount} skipped`\n )\n\n // Calculate dependency statistics\n const dependencyStats = this.calculateDependencyStats(manifestEntries)\n\n const result: DependencyResolutionResult = {\n registeredServices: Array.from(this.registeredServices),\n registeredCount,\n skippedCount,\n dependencyStats,\n warnings,\n registrationOrder\n }\n\n if (process.env.DEBUG_DI) {\n getLogger().info(`📊 Registration Summary:`)\n getLogger().info(` ✅ Registered: ${registeredCount}`)\n getLogger().info(` ⚠️ Skipped: ${skippedCount}`)\n getLogger().info(\n ` 🔗 Dependencies resolved: ${dependencyStats.totalDependencies}`\n )\n if (warnings.length > 0) {\n getLogger().warn(` ⚠️ Warnings: ${warnings.length}`)\n }\n }\n\n return result\n }\n\n /**\n * Register a single service with proper dependency injection\n */\n private async registerSingleService(\n container: DIContainer,\n ServiceClass: ConcreteConstructor,\n manifestEntry: ServiceManifestEntry,\n warnings: string[]\n ): Promise<void> {\n // Get DI metadata from the service class\n const metadata = getDIMetadata(ServiceClass)\n if (!metadata) {\n getLogger().error(`❌ No DI metadata: ${ServiceClass.name}`)\n throw new Error(`No DI metadata found for ${ServiceClass.name}`)\n }\n\n // Validate container methods\n if (\n typeof container.registerSingleton !== 'function' ||\n typeof container.registerFactory !== 'function'\n ) {\n getLogger().error(\n `❌ Container missing registration methods for ${ServiceClass.name}`\n )\n throw new Error(`Container missing registration methods`)\n }\n\n // Create factory function that resolves dependencies using manifest information\n const createInstance = () => {\n const resolvedArgs: unknown[] = []\n\n // Resolve each dependency based on manifest information\n for (const dependency of manifestEntry.resolvedDependencies) {\n try {\n if (dependency.external) {\n // External dependency - not managed by DI container\n if (dependency.isOptional) {\n resolvedArgs[dependency.paramIndex] = undefined\n } else {\n // For external dependencies, we might need special handling\n const defaultValue =\n this.getDefaultValueForExternalDependency(dependency)\n if (defaultValue !== undefined) {\n resolvedArgs[dependency.paramIndex] = defaultValue\n } else {\n throw new Error(\n `External dependency ${dependency.typeName} is required but no default available`\n )\n }\n }\n } else if (dependency.implementingService) {\n // Internal dependency - resolve from container\n const depMetadata = this.serviceMetadataMap.get(\n dependency.implementingService\n )\n if (!depMetadata) {\n throw new Error(\n `No DI metadata found for dependency ${dependency.implementingService}`\n )\n }\n\n // Resolve dependency from container\n const resolvedDep = container.resolve(depMetadata.token)\n resolvedArgs[dependency.paramIndex] = resolvedDep\n } else {\n // Unknown dependency type\n if (dependency.isOptional) {\n resolvedArgs[dependency.paramIndex] = undefined\n } else {\n throw new Error(\n `Unknown dependency type for ${dependency.typeName}`\n )\n }\n }\n } catch (error) {\n if (dependency.isOptional) {\n resolvedArgs[dependency.paramIndex] = undefined\n warnings.push(\n `Optional dependency ${dependency.typeName} could not be resolved for ${ServiceClass.name}: ${error}`\n )\n } else {\n throw new Error(\n `Cannot resolve required dependency ${dependency.typeName} for service ${ServiceClass.name}: ${error}`,\n { cause: error }\n )\n }\n }\n }\n\n // Create instance with resolved dependencies\n return new ServiceClass(...resolvedArgs)\n }\n\n // Register based on lifecycle from manifest\n getLogger().info(\n `🔧 Registering ${ServiceClass.name} (${manifestEntry.lifecycle})`\n )\n\n try {\n switch (manifestEntry.lifecycle) {\n case 'singleton':\n container.registerSingleton(metadata.token, createInstance)\n break\n case 'factory':\n container.registerFactory(metadata.token, createInstance)\n break\n case 'lazy':\n container.registerFactory(metadata.token, createInstance)\n break\n case 'lazySingleton': {\n // For lazy singletons, we need to use a factory that maintains its own singleton state\n let lazySingletonInstance: unknown = null\n container.registerFactory(metadata.token, () => {\n if (lazySingletonInstance === null) {\n lazySingletonInstance = createInstance()\n }\n return lazySingletonInstance\n })\n break\n }\n default:\n // Default to singleton\n container.registerSingleton(metadata.token, createInstance)\n }\n getLogger().info(`✅ Registered ${ServiceClass.name}`)\n } catch (error) {\n const err = error as Error\n getLogger().error(\n `❌ Container registration failed for ${ServiceClass.name}: ${err.message}`\n )\n throw error\n }\n }\n\n /**\n * Get default value for external dependencies\n */\n private getDefaultValueForExternalDependency(\n dependency: ServiceDependency\n ): unknown {\n // Provide sane defaults for primitive external dependencies only.\n // Non-primitive externals should be supplied explicitly via container\n // registration; returning undefined makes a missing required one fail loudly.\n switch (dependency.typeName) {\n case 'string':\n return ''\n case 'number':\n return 0\n case 'boolean':\n return false\n default:\n return undefined\n }\n }\n\n /**\n * Calculate dependency statistics from manifest entries\n */\n private calculateDependencyStats(manifestEntries: ServiceManifestEntry[]): {\n totalServices: number\n servicesWithDependencies: number\n totalDependencies: number\n externalDependencies: number\n maxDependencyDepth: number\n } {\n let servicesWithDependencies = 0\n let totalDependencies = 0\n let externalDependencies = 0\n let maxDependencyDepth = 0\n\n for (const entry of manifestEntries) {\n if (entry.resolvedDependencies.length > 0) {\n servicesWithDependencies++\n totalDependencies += entry.resolvedDependencies.length\n maxDependencyDepth = Math.max(\n maxDependencyDepth,\n entry.resolvedDependencies.length\n )\n\n externalDependencies += entry.resolvedDependencies.filter(\n (dep) => dep.external\n ).length\n }\n }\n\n return {\n totalServices: manifestEntries.length,\n servicesWithDependencies,\n totalDependencies,\n externalDependencies,\n maxDependencyDepth\n }\n }\n\n /**\n * Validate that all required dependencies can be resolved\n */\n validateDependencies(manifestEntries: ServiceManifestEntry[]): {\n valid: boolean\n missingDependencies: string[]\n circularDependencies: string[]\n } {\n const missingDependencies: string[] = []\n const availableServices = new Set(\n manifestEntries.map((entry) => entry.className)\n )\n\n for (const entry of manifestEntries) {\n for (const dep of entry.resolvedDependencies) {\n if (!dep.external && !dep.isOptional && dep.implementingService) {\n if (!availableServices.has(dep.implementingService)) {\n missingDependencies.push(\n `${entry.className} requires ${dep.implementingService} (${dep.typeName})`\n )\n }\n }\n }\n }\n\n // Check for circular dependencies (should be rare due to build-time analysis)\n const circularDependencies =\n this.detectCircularDependencies(manifestEntries)\n\n return {\n valid:\n missingDependencies.length === 0 && circularDependencies.length === 0,\n missingDependencies,\n circularDependencies\n }\n }\n\n /**\n * Detect circular dependencies in manifest entries\n */\n private detectCircularDependencies(\n manifestEntries: ServiceManifestEntry[]\n ): string[] {\n const cycles: string[] = []\n const entryMap = new Map(\n manifestEntries.map((entry) => [entry.className, entry])\n )\n const visited = new Set<string>()\n const visiting = new Set<string>()\n\n const findCycles = (className: string, path: string[]) => {\n if (visiting.has(className)) {\n const cycleStart = path.indexOf(className)\n const cycle = path.slice(cycleStart).join(' -> ') + ` -> ${className}`\n cycles.push(cycle)\n return\n }\n\n if (visited.has(className)) return\n\n const entry = entryMap.get(className)\n if (!entry) return\n\n visited.add(className)\n visiting.add(className)\n\n for (const dep of entry.resolvedDependencies) {\n if (dep.implementingService && !dep.external) {\n findCycles(dep.implementingService, [...path, className])\n }\n }\n\n visiting.delete(className)\n }\n\n for (const entry of manifestEntries) {\n if (!visited.has(entry.className)) {\n findCycles(entry.className, [])\n }\n }\n\n return cycles\n }\n}\n\n/**\n * Helper function to register services with enhanced dependency resolution using manifest\n */\nexport async function registerServicesWithManifestDependencies(\n container: DIContainer,\n services: ConcreteConstructor[],\n manifestEntries: ServiceManifestEntry[],\n environment?: string\n): Promise<DependencyResolutionResult> {\n const resolver = new EnhancedDependencyResolver()\n\n // Validate dependencies before registration\n const validation = resolver.validateDependencies(manifestEntries)\n\n if (!validation.valid) {\n if (process.env.NODE_ENV === 'development' || process.env.DEBUG_DI) {\n getLogger().warn('⚠️ Dependency validation warnings:')\n validation.missingDependencies.forEach((dep) => {\n getLogger().warn(` - ${dep}`)\n })\n validation.circularDependencies.forEach((cycle) => {\n getLogger().warn(` - Circular: ${cycle}`)\n })\n }\n }\n\n // Register services in dependency order\n return resolver.registerServicesWithManifest(\n container,\n services,\n manifestEntries,\n environment\n )\n}\n","import type {\n AutoDiscoveryConfig,\n ServiceDiscoveryResult\n} from './auto-discovery'\nimport { registerServicesWithManifestDependencies } from './dependency-resolver'\nimport { getLogger } from './logger'\nimport { loadManifest } from './manifest'\n\n// Constructor type for class-based DI tokens. `...args: any[]` is the idiomatic\n// constructor signature — the only form that accepts a class with any params.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Constructor<T> = abstract new (...args: any[]) => T\nexport type Token<T> = Constructor<T>\n\n// Lifecycle types for auto-registration\nexport type LifecycleType = 'singleton' | 'factory' | 'lazy' | 'lazySingleton'\n\n/**\n * A resource that can be released when its owning container is disposed.\n * Singletons and directly-registered values implementing this are torn down\n * automatically by {@link DiademContainer.dispose}.\n */\nexport interface Disposable {\n dispose: () => void | Promise<void>\n}\n\nfunction isDisposable(value: unknown): value is Disposable {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as Disposable).dispose === 'function'\n )\n}\n\n// Base DI Container\n/**\n * DIContainer interface for dependency injection.\n *\n * - Use `register` for direct value/class registration.\n * - Use `registerSingleton` for singletons (one instance per container).\n * - Use `registerFactory` for transient factories (new instance per resolve).\n * - Use `resolve` to retrieve a dependency by token.\n * - Use `isReady` to check if the container is fully set up.\n * - Use `autoRegisterDiscovered` for automatic service discovery and registration.\n */\nexport interface DIContainer {\n register: <T>(token: Token<T>, implementation: T) => void\n resolve: <T>(token: Token<T>) => T\n resolveAsync: <T>(token: Token<T>) => Promise<T>\n registerSingleton: <T>(token: Token<T>, factory: () => T) => void\n registerFactory: <T>(token: Token<T>, factory: () => T) => void\n registerAsyncFactory: <T>(token: Token<T>, factory: () => Promise<T>) => void\n registerAsyncSingleton: <T>(token: Token<T>, factory: () => Promise<T>) => void\n autoDiscover: (\n config?: AutoDiscoveryConfig\n ) => Promise<ServiceDiscoveryResult>\n autoRegisterDiscovered: (environment?: string) => Promise<void>\n isReady: () => boolean\n getDiagnostics: () => {\n dependencies: number\n singletons: number\n factories: number\n asyncFactories: number\n isReady: boolean\n }\n has: <T>(token: Token<T>) => boolean\n getRegisteredTokens: () => Array<Token<unknown>>\n onDispose: (callback: () => void | Promise<void>) => void\n dispose: () => Promise<void>\n}\n\n/**\n * DiademContainer is a dependency injection container.\n *\n * Typically you create **one application-scoped container** and keep it for the\n * lifetime of the process. The library holds no hidden global container — you\n * own the instance — which is what makes it safe in concurrent/SSR environments\n * where a module-level global container would leak state between requests.\n *\n * When you need isolation between concurrent units of work (e.g. per HTTP\n * request, or per test), create a child scope with {@link createChild} that\n * inherits the parent's registrations and can override them locally.\n *\n * - Supports direct registration, singletons, and per-resolve factories.\n * - Supports decorator-driven auto-registration from a build-time manifest,\n * with optional environment filtering.\n * - Stores registration metadata on classes rather than in global state.\n *\n * @example\n * const container = new DiademContainer()\n * container.register(IRepository, new Repository())\n * container.registerSingleton(IService, () => new Service(container.resolve(IRepository)))\n * container.registerFactory(IApiClient, () => createApiClient())\n *\n * // Or autowire from a configured build-time manifest:\n * await container.autoRegisterDiscovered('production')\n *\n * const repo = container.resolve(IRepository)\n *\n * // Per-request isolation when you need it:\n * const scoped = container.createChild()\n */\nclass DiademContainer implements DIContainer {\n private readonly dependencies = new Map<Constructor<unknown>, unknown>()\n public readonly singletons = new Map<Constructor<unknown>, unknown>()\n public readonly factories = new Map<Constructor<unknown>, () => unknown>()\n public readonly asyncFactories = new Map<\n Constructor<unknown>,\n () => Promise<unknown>\n >()\n private readonly disposers: Array<() => void | Promise<void>> = []\n private ready = false\n private disposed = false\n\n /**\n * Register a dependency by value or class instance.\n * @param token Dependency token\n * @param implementation The value or instance to register\n */\n register<T>(token: Constructor<T>, implementation: T): void {\n this.dependencies.set(token, implementation)\n this.trackDisposable(implementation)\n }\n\n /**\n * Register a factory that returns a new instance on every resolve.\n * Use for transient dependencies.\n * @param token Dependency token\n * @param factory Factory function\n */\n registerFactory<T>(token: Constructor<T>, factory: () => T): void {\n this.factories.set(token, factory)\n }\n\n /**\n * Register a singleton (one instance per container).\n *\n * **Order matters:** the factory runs immediately, at registration time, so\n * anything it resolves must already be registered. Register dependencies\n * before their dependents — the build-time manifest is emitted in exactly this\n * (topological) order. To defer construction until first resolve instead, use\n * a `lazySingleton` lifecycle via the decorator/manifest.\n *\n * @param token Dependency token\n * @param factory Factory function, called once, immediately\n */\n registerSingleton<T>(token: Constructor<T>, factory: () => T): void {\n if (!this.singletons.has(token)) {\n const instance = factory()\n this.singletons.set(token, instance)\n this.trackDisposable(instance)\n }\n }\n\n /**\n * Register a factory that awaits its result on every {@link resolveAsync}.\n * Use for transient dependencies that require asynchronous construction.\n * @param token Dependency token\n * @param factory Async factory function\n */\n registerAsyncFactory<T>(\n token: Constructor<T>,\n factory: () => Promise<T>\n ): void {\n this.asyncFactories.set(token, factory)\n }\n\n /**\n * Register an async singleton: the factory runs at most once (on the first\n * {@link resolveAsync}) and the awaited instance is cached. If the instance\n * is {@link Disposable} it is torn down on {@link dispose}.\n * @param token Dependency token\n * @param factory Async factory function, called at most once\n */\n registerAsyncSingleton<T>(\n token: Constructor<T>,\n factory: () => Promise<T>\n ): void {\n let cached: Promise<T> | undefined\n this.asyncFactories.set(token, () => {\n cached ??= factory().then((instance) => {\n this.trackDisposable(instance)\n return instance\n })\n return cached\n })\n }\n\n /** Record a value's disposer if it implements {@link Disposable}. */\n private trackDisposable(value: unknown): void {\n if (isDisposable(value)) {\n this.disposers.push(() => value.dispose())\n }\n }\n\n /**\n * Resolve a dependency by token.\n * @param token Dependency token\n * @returns The resolved dependency\n * @throws If the dependency is not found\n */\n resolve<T>(token: Constructor<T>): T {\n // Guard against undefined/null token\n if (!token) {\n throw new Error('Dependency token is undefined or null')\n }\n\n // Check direct dependencies first\n if (this.dependencies.has(token)) {\n return this.dependencies.get(token) as T\n }\n\n // Check singletons\n if (this.singletons.has(token)) {\n return this.singletons.get(token) as T\n }\n\n // Check factories (transient)\n if (this.factories.has(token)) {\n const factory = this.factories.get(token)\n return factory?.() as T\n }\n\n // Registered, but only as an async factory.\n if (this.asyncFactories.has(token)) {\n throw new Error(\n `Dependency ${token?.name || 'Unknown'} is registered as an async ` +\n `factory; resolve it with resolveAsync() instead of resolve().`\n )\n }\n\n // Enhanced error message with more debugging info\n const tokenName = token?.name || 'Unknown'\n const registeredTokens = this.getRegisteredTokens()\n const registeredNames = registeredTokens\n .map((t) => t?.name || 'Unknown')\n .join(', ')\n\n throw new Error(\n `Dependency not found: ${tokenName}. ` +\n `Available services: [${registeredNames}]. ` +\n `Total registered: ${registeredTokens.length}`\n )\n }\n\n /**\n * Resolve a dependency that may have been registered asynchronously.\n * Synchronous registrations resolve immediately; async factories/singletons\n * are awaited.\n * @param token Dependency token\n * @returns A promise of the resolved dependency\n * @throws If the dependency is not found\n */\n async resolveAsync<T>(token: Constructor<T>): Promise<T> {\n if (!token) {\n throw new Error('Dependency token is undefined or null')\n }\n\n if (\n this.dependencies.has(token) ||\n this.singletons.has(token) ||\n this.factories.has(token)\n ) {\n return this.resolve(token)\n }\n\n const asyncFactory = this.asyncFactories.get(token)\n if (asyncFactory) {\n return asyncFactory() as Promise<T>\n }\n\n return this.resolve(token) // throws the standard \"not found\" error\n }\n\n /**\n * Returns true if the container is fully set up.\n */\n isReady(): boolean {\n return this.ready\n }\n\n /**\n * Mark the container as ready (all dependencies registered).\n */\n setReady(): void {\n this.ready = true\n }\n\n /**\n * Clear all registrations (useful for testing or container reset).\n */\n clear(): void {\n this.dependencies.clear()\n this.singletons.clear()\n this.factories.clear()\n this.asyncFactories.clear()\n this.disposers.length = 0\n this.ready = false\n }\n\n /**\n * Register an arbitrary teardown callback, run on {@link dispose} in reverse\n * order of registration.\n */\n onDispose(callback: () => void | Promise<void>): void {\n this.disposers.push(callback)\n }\n\n /**\n * Dispose the container: run all teardown callbacks (and the `dispose()` of\n * any registered {@link Disposable} singletons/values) in reverse order, then\n * clear all registrations. Idempotent.\n *\n * Note: transient (`factory`) and lazy instances are owned by the caller, not\n * the container, so they are not disposed here.\n */\n async dispose(): Promise<void> {\n if (this.disposed) {\n return\n }\n this.disposed = true\n\n for (const disposer of [...this.disposers].reverse()) {\n try {\n await disposer()\n } catch (error) {\n getLogger().error('Diadem: disposer threw during dispose()', error)\n }\n }\n\n this.clear()\n }\n\n /** Whether {@link dispose} has been called. */\n isDisposed(): boolean {\n return this.disposed\n }\n\n /**\n * Get diagnostic information about registered dependencies.\n */\n getDiagnostics(): {\n dependencies: number\n singletons: number\n factories: number\n asyncFactories: number\n isReady: boolean\n } {\n return {\n dependencies: this.dependencies.size,\n singletons: this.singletons.size,\n factories: this.factories.size,\n asyncFactories: this.asyncFactories.size,\n isReady: this.ready\n }\n }\n\n /**\n * Check if a token is registered in the container\n */\n has<T>(token: Constructor<T>): boolean {\n // Guard against undefined/null token\n if (!token) {\n return false\n }\n\n return (\n this.dependencies.has(token) ||\n this.singletons.has(token) ||\n this.factories.has(token) ||\n this.asyncFactories.has(token)\n )\n }\n\n /**\n * Get all registered tokens\n */\n getRegisteredTokens(): Array<Constructor<unknown>> {\n const tokens = new Set<Constructor<unknown>>()\n\n this.dependencies.forEach((_, token) => tokens.add(token))\n this.singletons.forEach((_, token) => tokens.add(token))\n this.factories.forEach((_, token) => tokens.add(token))\n this.asyncFactories.forEach((_, token) => tokens.add(token))\n\n return Array.from(tokens)\n }\n\n /**\n * Create a child container that inherits this container's registrations and\n * can override them locally. Useful for per-request or per-test scopes.\n *\n * The child shares the parent's already-created singleton instances by\n * reference; it deliberately does NOT inherit the parent's disposers, so\n * disposing the child never tears down shared parent-owned resources. Only\n * resources the child registers itself are disposed with it.\n */\n createChild(): DiademContainer {\n const child = new DiademContainer()\n\n // Copy parent registrations by reference. Disposers are intentionally not\n // copied — the parent owns the lifecycle of shared instances.\n this.dependencies.forEach((impl, token) => {\n child.dependencies.set(token, impl)\n })\n\n this.singletons.forEach((impl, token) => {\n child.singletons.set(token, impl)\n })\n\n this.factories.forEach((factory, token) => {\n child.factories.set(token, factory)\n })\n\n this.asyncFactories.forEach((factory, token) => {\n child.asyncFactories.set(token, factory)\n })\n\n return child\n }\n\n /**\n * Auto-discover and get information about available services.\n * Does not register them - use autoRegisterDiscovered() for that.\n */\n async autoDiscover(\n config?: AutoDiscoveryConfig\n ): Promise<ServiceDiscoveryResult> {\n const { discoverServices } = await import('./auto-discovery')\n return discoverServices(config)\n }\n\n /**\n * Auto-discover and register all DI-decorated services using build-time manifest.\n * This is true autowiring that doesn't require hardcoded paths or explicit imports.\n *\n * @param environment Optional environment filter\n * @example\n * ```typescript\n * const container = new DiademContainer()\n * await container.autoRegisterDiscovered('production')\n * container.setReady()\n * ```\n */\n async autoRegisterDiscovered(environment?: string): Promise<void> {\n try {\n const { discoverServices } = await import('./auto-discovery')\n const discoveryResult = await discoverServices({ environment })\n const services = discoveryResult.services\n\n if (!discoveryResult.manifestAvailable) {\n getLogger().warn(\n 'Diadem: no manifest configured — nothing was auto-registered.'\n )\n return\n }\n\n const { getServicesForEnvironment } = await loadManifest()\n const manifestEntries = getServicesForEnvironment(environment)\n\n const result = await registerServicesWithManifestDependencies(\n this,\n services,\n manifestEntries,\n environment\n )\n\n const log = getLogger()\n log.debug(\n `Diadem: registered ${result.registeredCount} services for \"${environment ?? 'all'}\"`,\n result.dependencyStats\n )\n if (result.warnings.length > 0) {\n log.warn('Diadem: registration warnings', result.warnings)\n }\n } catch (error) {\n getLogger().error('Diadem: auto-registration failed', error)\n throw error\n }\n }\n}\n\nexport { DiademContainer }\n"]}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/core/decorators.ts
|
|
4
|
+
var DI_TOKEN_KEY = /* @__PURE__ */ Symbol("di:token");
|
|
5
|
+
var DI_LIFECYCLE_KEY = /* @__PURE__ */ Symbol("di:lifecycle");
|
|
6
|
+
var DI_ENVIRONMENT_KEY = /* @__PURE__ */ Symbol("di:environment");
|
|
7
|
+
function setDIMetadata(target, token, lifecycle, environment) {
|
|
8
|
+
Object.defineProperty(target, DI_TOKEN_KEY, {
|
|
9
|
+
value: token,
|
|
10
|
+
enumerable: false,
|
|
11
|
+
writable: false,
|
|
12
|
+
configurable: false
|
|
13
|
+
});
|
|
14
|
+
Object.defineProperty(target, DI_LIFECYCLE_KEY, {
|
|
15
|
+
value: lifecycle,
|
|
16
|
+
enumerable: false,
|
|
17
|
+
writable: false,
|
|
18
|
+
configurable: false
|
|
19
|
+
});
|
|
20
|
+
if (environment) {
|
|
21
|
+
Object.defineProperty(target, DI_ENVIRONMENT_KEY, {
|
|
22
|
+
value: environment,
|
|
23
|
+
enumerable: false,
|
|
24
|
+
writable: false,
|
|
25
|
+
configurable: false
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function getDIMetadata(target) {
|
|
30
|
+
const store = target;
|
|
31
|
+
const token = store[DI_TOKEN_KEY];
|
|
32
|
+
const lifecycle = store[DI_LIFECYCLE_KEY];
|
|
33
|
+
const environment = store[DI_ENVIRONMENT_KEY];
|
|
34
|
+
if (!token || !lifecycle) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
token,
|
|
39
|
+
lifecycle,
|
|
40
|
+
environment
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function hasDIMetadata(target) {
|
|
44
|
+
return getDIMetadata(target) !== null;
|
|
45
|
+
}
|
|
46
|
+
function singleton(token, env) {
|
|
47
|
+
return function(target) {
|
|
48
|
+
setDIMetadata(target, token, "singleton", env);
|
|
49
|
+
return target;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function factory(token, env) {
|
|
53
|
+
return function(target) {
|
|
54
|
+
setDIMetadata(target, token, "factory", env);
|
|
55
|
+
return target;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function lazy(token, env) {
|
|
59
|
+
return function(target) {
|
|
60
|
+
setDIMetadata(target, token, "lazy", env);
|
|
61
|
+
return target;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function lazySingleton(token, env) {
|
|
65
|
+
return function(target) {
|
|
66
|
+
setDIMetadata(target, token, "lazySingleton", env);
|
|
67
|
+
return target;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function getDIRegistrationStats(classes) {
|
|
71
|
+
const stats = {
|
|
72
|
+
total: 0,
|
|
73
|
+
singletons: 0,
|
|
74
|
+
factories: 0,
|
|
75
|
+
lazy: 0,
|
|
76
|
+
lazySingletons: 0,
|
|
77
|
+
environments: /* @__PURE__ */ new Set()
|
|
78
|
+
};
|
|
79
|
+
for (const ClassConstructor of classes) {
|
|
80
|
+
const metadata = getDIMetadata(ClassConstructor);
|
|
81
|
+
if (!metadata) continue;
|
|
82
|
+
stats.total++;
|
|
83
|
+
switch (metadata.lifecycle) {
|
|
84
|
+
case "singleton":
|
|
85
|
+
stats.singletons++;
|
|
86
|
+
break;
|
|
87
|
+
case "factory":
|
|
88
|
+
stats.factories++;
|
|
89
|
+
break;
|
|
90
|
+
case "lazy":
|
|
91
|
+
stats.lazy++;
|
|
92
|
+
break;
|
|
93
|
+
case "lazySingleton":
|
|
94
|
+
stats.lazySingletons++;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
if (metadata.environment) {
|
|
98
|
+
stats.environments.add(metadata.environment);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
...stats,
|
|
103
|
+
environments: Array.from(stats.environments)
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function isClassRegisteredForEnvironment(ClassConstructor, environment) {
|
|
107
|
+
const metadata = getDIMetadata(ClassConstructor);
|
|
108
|
+
if (!metadata) return false;
|
|
109
|
+
if (!metadata.environment) return true;
|
|
110
|
+
return metadata.environment === environment;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// src/core/logger.ts
|
|
114
|
+
var noopLogger = {
|
|
115
|
+
debug() {
|
|
116
|
+
},
|
|
117
|
+
info() {
|
|
118
|
+
},
|
|
119
|
+
warn() {
|
|
120
|
+
},
|
|
121
|
+
error() {
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
var consoleLogger = {
|
|
125
|
+
debug: (...args) => {
|
|
126
|
+
console.debug(...args);
|
|
127
|
+
},
|
|
128
|
+
info: (...args) => {
|
|
129
|
+
console.info(...args);
|
|
130
|
+
},
|
|
131
|
+
warn: (...args) => {
|
|
132
|
+
console.warn(...args);
|
|
133
|
+
},
|
|
134
|
+
error: (...args) => {
|
|
135
|
+
console.error(...args);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
var currentLogger = noopLogger;
|
|
139
|
+
function setLogger(logger) {
|
|
140
|
+
currentLogger = logger ?? noopLogger;
|
|
141
|
+
}
|
|
142
|
+
function getLogger() {
|
|
143
|
+
return currentLogger;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// src/core/manifest.ts
|
|
147
|
+
var registeredManifest = null;
|
|
148
|
+
function configureManifest(manifest) {
|
|
149
|
+
registeredManifest = manifest;
|
|
150
|
+
}
|
|
151
|
+
function getManifest() {
|
|
152
|
+
return registeredManifest;
|
|
153
|
+
}
|
|
154
|
+
function hasManifest() {
|
|
155
|
+
return registeredManifest !== null;
|
|
156
|
+
}
|
|
157
|
+
function resetManifest() {
|
|
158
|
+
registeredManifest = null;
|
|
159
|
+
}
|
|
160
|
+
async function loadManifest() {
|
|
161
|
+
if (registeredManifest) {
|
|
162
|
+
return registeredManifest;
|
|
163
|
+
}
|
|
164
|
+
throw new Error(
|
|
165
|
+
"No Diadem service manifest configured. Generate a manifest for your project and register it at startup:\n\n import { configureManifest } from '@devcraft-ts/diadem'\n import * as manifest from './generated/service-manifest'\n configureManifest(manifest)\n"
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
exports.configureManifest = configureManifest;
|
|
170
|
+
exports.consoleLogger = consoleLogger;
|
|
171
|
+
exports.factory = factory;
|
|
172
|
+
exports.getDIMetadata = getDIMetadata;
|
|
173
|
+
exports.getDIRegistrationStats = getDIRegistrationStats;
|
|
174
|
+
exports.getLogger = getLogger;
|
|
175
|
+
exports.getManifest = getManifest;
|
|
176
|
+
exports.hasDIMetadata = hasDIMetadata;
|
|
177
|
+
exports.hasManifest = hasManifest;
|
|
178
|
+
exports.isClassRegisteredForEnvironment = isClassRegisteredForEnvironment;
|
|
179
|
+
exports.lazy = lazy;
|
|
180
|
+
exports.lazySingleton = lazySingleton;
|
|
181
|
+
exports.loadManifest = loadManifest;
|
|
182
|
+
exports.noopLogger = noopLogger;
|
|
183
|
+
exports.resetManifest = resetManifest;
|
|
184
|
+
exports.setLogger = setLogger;
|
|
185
|
+
exports.singleton = singleton;
|
|
186
|
+
//# sourceMappingURL=chunk-FHQRDO5C.cjs.map
|
|
187
|
+
//# sourceMappingURL=chunk-FHQRDO5C.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/decorators.ts","../src/core/logger.ts","../src/core/manifest.ts"],"names":[],"mappings":"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","file":"chunk-FHQRDO5C.cjs","sourcesContent":["/**\n * Decorator-driven DI registration using class metadata instead of global state.\n * This approach is SSR-safe and avoids global state issues.\n */\n\nimport type { AbstractConstructor, ConcreteConstructor } from './types'\n\n// Metadata keys for storing registration info on classes\nconst DI_TOKEN_KEY = Symbol('di:token')\nconst DI_LIFECYCLE_KEY = Symbol('di:lifecycle')\nconst DI_ENVIRONMENT_KEY = Symbol('di:environment')\n\n// Lifecycle types\nexport type LifecycleType = 'singleton' | 'factory' | 'lazy' | 'lazySingleton'\n\n// Metadata interface\nexport interface DIMetadata {\n token: AbstractConstructor\n lifecycle: LifecycleType\n environment?: string\n}\n\n/**\n * Set DI metadata on a class constructor\n */\nfunction setDIMetadata(\n target: ConcreteConstructor,\n token: AbstractConstructor,\n lifecycle: LifecycleType,\n environment?: string\n): void {\n // Store metadata directly on the class constructor\n Object.defineProperty(target, DI_TOKEN_KEY, {\n value: token,\n enumerable: false,\n writable: false,\n configurable: false\n })\n\n Object.defineProperty(target, DI_LIFECYCLE_KEY, {\n value: lifecycle,\n enumerable: false,\n writable: false,\n configurable: false\n })\n\n if (environment) {\n Object.defineProperty(target, DI_ENVIRONMENT_KEY, {\n value: environment,\n enumerable: false,\n writable: false,\n configurable: false\n })\n }\n}\n\n/**\n * Get DI metadata from a class constructor\n */\nexport function getDIMetadata(target: ConcreteConstructor): DIMetadata | null {\n const store = target as unknown as Record<symbol, unknown>\n const token = store[DI_TOKEN_KEY] as AbstractConstructor | undefined\n const lifecycle = store[DI_LIFECYCLE_KEY] as LifecycleType | undefined\n const environment = store[DI_ENVIRONMENT_KEY] as string | undefined\n\n if (!token || !lifecycle) {\n return null\n }\n\n return {\n token,\n lifecycle,\n environment\n }\n}\n\n/**\n * Check if a class has DI metadata\n */\nexport function hasDIMetadata(target: ConcreteConstructor): boolean {\n return getDIMetadata(target) !== null\n}\n\n/**\n * Decorator to register a class as a singleton.\n * The class will be instantiated once per container and reused.\n *\n * @param token The interface/abstract class token to register the implementation against\n * @param env Optional environment filter. If provided, the class will only be registered in that environment.\n *\n * @example\n * ```typescript\n * @singleton(IMyService)\n * class MyService implements IMyService {\n * // implementation\n * }\n *\n * @singleton(IService, 'production')\n * class ProductionOnlyService implements IService {\n * // only registered in production environment\n * }\n * ```\n */\nexport function singleton<T>(token: AbstractConstructor<T>, env?: string) {\n return function <U extends ConcreteConstructor<T>>(target: U): U {\n setDIMetadata(target, token, 'singleton', env)\n return target\n }\n}\n\n/**\n * Decorator to register a class as a factory.\n * A new instance will be created each time the dependency is resolved.\n *\n * @param token The interface/abstract class token to register the implementation against\n * @param env Optional environment filter. If provided, the class will only be registered in that environment.\n *\n * @example\n * ```typescript\n * @factory(ITransientService)\n * class TransientService implements ITransientService {\n * // new instance created on each resolve\n * }\n * ```\n */\nexport function factory<T>(token: AbstractConstructor<T>, env?: string) {\n return function <U extends ConcreteConstructor<T>>(target: U): U {\n setDIMetadata(target, token, 'factory', env)\n return target\n }\n}\n\n/**\n * Decorator to register a class as lazy.\n * The class will be instantiated only when first resolved, then a new instance on each subsequent resolve.\n *\n * @param token The interface/abstract class token to register the implementation against\n * @param env Optional environment filter. If provided, the class will only be registered in that environment.\n *\n * @example\n * ```typescript\n * @lazy(IExpensiveService)\n * class ExpensiveService implements IExpensiveService {\n * // only instantiated when first needed\n * }\n * ```\n */\nexport function lazy<T>(token: AbstractConstructor<T>, env?: string) {\n return function <U extends ConcreteConstructor<T>>(target: U): U {\n setDIMetadata(target, token, 'lazy', env)\n return target\n }\n}\n\n/**\n * Decorator to register a class as a lazy singleton.\n * The class will be instantiated only when first resolved, then reused.\n *\n * @param token The interface/abstract class token to register the implementation against\n * @param env Optional environment filter. If provided, the class will only be registered in that environment.\n *\n * @example\n * ```typescript\n * @lazySingleton(IDatabaseConnection)\n * class DatabaseConnection implements IDatabaseConnection {\n * // instantiated only when first needed, then reused\n * }\n * ```\n */\nexport function lazySingleton<T>(token: AbstractConstructor<T>, env?: string) {\n return function <U extends ConcreteConstructor<T>>(target: U): U {\n setDIMetadata(target, token, 'lazySingleton', env)\n return target\n }\n}\n\n// Manual discovery functions removed - use manifest-based auto-discovery instead\n\n// Manual registration functions removed - use manifest-based auto-discovery instead\n\n/**\n * Auto-discovery helper that scans for decorated classes in the current context.\n * This can be used to automatically find all decorated classes without manual imports.\n *\n * @param modules Array of module objects to scan\n * @returns Combined array of all decorated classes found\n // Auto-discovery from modules removed - use manifest-based auto-discovery instead\n\n/**\n * Get registration statistics for debugging\n */\nexport function getDIRegistrationStats(classes: ConcreteConstructor[]): {\n total: number\n singletons: number\n factories: number\n lazy: number\n lazySingletons: number\n environments: string[]\n} {\n const stats = {\n total: 0,\n singletons: 0,\n factories: 0,\n lazy: 0,\n lazySingletons: 0,\n environments: new Set<string>()\n }\n\n for (const ClassConstructor of classes) {\n const metadata = getDIMetadata(ClassConstructor)\n if (!metadata) continue\n\n stats.total++\n\n switch (metadata.lifecycle) {\n case 'singleton':\n stats.singletons++\n break\n case 'factory':\n stats.factories++\n break\n case 'lazy':\n stats.lazy++\n break\n case 'lazySingleton':\n stats.lazySingletons++\n break\n }\n\n if (metadata.environment) {\n stats.environments.add(metadata.environment)\n }\n }\n\n return {\n ...stats,\n environments: Array.from(stats.environments)\n }\n}\n\n/**\n * Check if a class is registered for a specific environment.\n */\nexport function isClassRegisteredForEnvironment(\n ClassConstructor: ConcreteConstructor,\n environment?: string\n): boolean {\n const metadata = getDIMetadata(ClassConstructor)\n if (!metadata) return false\n\n // If no environment specified, class is available everywhere\n if (!metadata.environment) return true\n\n // If environment specified, it must match\n return metadata.environment === environment\n}\n","/**\n * Pluggable logging for Diadem.\n *\n * A library must not write to stdout/stderr unless asked to. By default Diadem\n * uses a no-op logger and stays completely silent. Opt into diagnostics by\n * registering a logger (e.g. the built-in {@link consoleLogger}, or your own\n * pino/winston adapter):\n *\n * ```ts\n * import { setLogger, consoleLogger } from '@devcraft-ts/diadem'\n * setLogger(consoleLogger)\n * ```\n */\n\nexport interface Logger {\n debug(...args: unknown[]): void\n info(...args: unknown[]): void\n warn(...args: unknown[]): void\n error(...args: unknown[]): void\n}\n\n/** A logger that discards everything. The default. */\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {}\n}\n\n/** A logger that writes to the global `console`. Opt-in. */\nexport const consoleLogger: Logger = {\n debug: (...args) => {\n console.debug(...args)\n },\n info: (...args) => {\n console.info(...args)\n },\n warn: (...args) => {\n console.warn(...args)\n },\n error: (...args) => {\n console.error(...args)\n }\n}\n\nlet currentLogger: Logger = noopLogger\n\n/**\n * Set the active logger. Pass `null` to reset to the silent no-op logger.\n */\nexport function setLogger(logger: Logger | null): void {\n currentLogger = logger ?? noopLogger\n}\n\n/** Get the active logger. Internal call sites log through this. */\nexport function getLogger(): Logger {\n return currentLogger\n}\n","/**\n * Service manifest contract + injection seam.\n *\n * Diadem is a *build-time* DI container: a generator scans the consumer's\n * source, extracts each service's constructor dependencies, topologically\n * sorts them, and emits a manifest module. That generated module is NOT part\n * of this package — it lives in the consumer's project. This file defines the\n * shape such a module must conform to, and the seam through which it is plugged\n * in at runtime.\n *\n * Usage in a consuming app:\n * ```ts\n * import { configureManifest } from '@devcraft-ts/diadem'\n * import * as manifest from './generated/service-manifest'\n *\n * configureManifest(manifest)\n * ```\n *\n * See `examples/basic.ts` for a complete, runnable example.\n */\n\nimport type { AbstractConstructor } from './types'\n\n/** A single constructor parameter of a service, as analysed at build time. */\nexport interface ServiceDependency {\n paramName: string\n paramIndex: number\n typeName: string\n isOptional: boolean\n isReadonly?: boolean\n isPrivate?: boolean\n /** Class name of the service that implements this dependency, if internal. */\n implementingService?: string\n /** True when the dependency is not managed by the container. */\n external?: boolean\n}\n\n/** One service entry in the build-time manifest. */\nexport interface ServiceManifestEntry {\n className: string\n importPath: string\n lifecycle: 'dependency' | 'singleton' | 'factory' | 'lazy' | 'lazySingleton'\n environment?: string\n exported: boolean\n filePath: string\n registrationOrder: number\n dependencies: ServiceDependency[]\n resolvedDependencies: ServiceDependency[]\n}\n\n/** A loaded service class, paired with the manifest entry it came from. */\nexport interface ImportedService {\n entry: ServiceManifestEntry\n serviceClass: AbstractConstructor\n}\n\n/**\n * The shape of a generated manifest module. A consumer's build step emits a\n * module exporting these members; pass that module to {@link configureManifest}.\n */\nexport interface ServiceManifestModule {\n SERVICE_MANIFEST: ServiceManifestEntry[]\n SERVICE_CLASSES: Record<string, AbstractConstructor>\n SERVICES_BY_ENVIRONMENT?: Record<string, ServiceManifestEntry[]>\n MANIFEST_STATS?: unknown\n getServicesForEnvironment: (environment?: string) => ServiceManifestEntry[]\n importService: (entry: ServiceManifestEntry) => Promise<AbstractConstructor>\n importAllServices: (\n entries: ServiceManifestEntry[]\n ) => Promise<ImportedService[]>\n}\n\nlet registeredManifest: ServiceManifestModule | null = null\n\n/**\n * Register the generated manifest module so the container can discover and\n * autowire services. Call once at application startup, before constructing a\n * container that relies on auto-discovery.\n */\nexport function configureManifest(manifest: ServiceManifestModule): void {\n registeredManifest = manifest\n}\n\n/** Returns the configured manifest, or null if none has been registered. */\nexport function getManifest(): ServiceManifestModule | null {\n return registeredManifest\n}\n\n/** True when a manifest has been registered via {@link configureManifest}. */\nexport function hasManifest(): boolean {\n return registeredManifest !== null\n}\n\n/** Clear the registered manifest. Primarily useful in tests. */\nexport function resetManifest(): void {\n registeredManifest = null\n}\n\n/**\n * Resolve the configured manifest, throwing a helpful error if none is set.\n * Internal call sites use this in place of a hardcoded manifest import.\n */\nexport async function loadManifest(): Promise<ServiceManifestModule> {\n if (registeredManifest) {\n return registeredManifest\n }\n throw new Error(\n 'No Diadem service manifest configured. Generate a manifest for your ' +\n 'project and register it at startup:\\n\\n' +\n \" import { configureManifest } from '@devcraft-ts/diadem'\\n\" +\n \" import * as manifest from './generated/service-manifest'\\n\" +\n ' configureManifest(manifest)\\n'\n )\n}\n"]}
|