@nextrush/di 3.0.6 → 4.0.0-beta.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/container.ts","../src/types.ts","../src/decorators.ts"],"names":["V8Error","Error","DIError","message","name","captureStackTrace","DependencyResolutionError","chain","missingDependency","missing","chainStr","length","join","CircularDependencyError","cycle","cycleStr","TypeInferenceError","className","parameterIndex","InvalidProviderError","token","ContainerDisposedError","MissingDependencyError","getTokenName","toString","String","isClassProvider","provider","useClass","isValueProvider","isFactoryProvider","useFactory","createContainerWrapper","tsyInstance","resolutionStack","Set","factoryTokens","bootstrappedValues","Map","wrapper","register","options","tokenName","tsyToken","delete","scope","registerSingleton","useValue","inject","injectTokens","add","deps","map","depToken","resolve","hasAsyncDep","some","d","Promise","all","then","resolved","has","get","instance","error","RangeError","includes","toLowerCase","resolveAsync","result","bootstrap","value","set","clear","resolveAll","isRegistered","clearInstances","reset","createChild","childTsy","createChildContainer","container","tsyContainer","createContainer","METADATA_KEYS","SERVICE_TYPE","SERVICE_SCOPE","INJECT_TOKEN","PARAM_TYPES","CONFIG_PREFIX","OPTIONAL_PARAMS","Service","target","Reflect","defineMetadata","tsySingleton","tsyInjectable","Repository","tsyInject","Injectable","AutoInjectable","markInjectable","delay","tokenFactory","tsyDelay","hasServiceMetadata","hasMetadata","getServiceType","getMetadata","getServiceScope","Config","prefix","getConfigPrefix","Optional","_propertyKey","existing","getOwnMetadata","TSYRINGE_INJECTION_KEY","descriptors","descriptor","isOptional","isParameterOptional","optional","getOptionalParams"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @nextrush/di - Errors\n *\n * Production-grade error classes with actionable messages.\n */\n\nconst V8Error = Error as ErrorConstructor & {\n captureStackTrace?: (targetObject: object, constructorOpt?: Function) => void;\n};\n\n/**\n * Base error class for all DI-related errors.\n */\nexport class DIError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'DIError';\n V8Error.captureStackTrace?.(this, this.constructor);\n }\n}\n\n/**\n * Error thrown when a dependency cannot be resolved.\n *\n * Provides clear guidance on how to fix the issue.\n */\nexport class DependencyResolutionError extends DIError {\n public readonly chain: string[];\n public readonly missingDependency: string;\n\n constructor(chain: string[], missing: string) {\n const chainStr = chain.length > 0 ? chain.join(' → ') + ' → ' : '';\n\n super(`\n❌ Dependency Resolution Failed\n\n${chainStr}${missing}\n\n\"${missing}\" is not registered in the container.\n\nPossible fixes:\n • Add @Service(), @Repository(), or @Config() decorator to ${missing}\n • Ensure ${missing} is imported before container.resolve() is called\n • Register manually: container.register(${missing}, { useClass: ${missing} })\n • Check for typos in the class name or import path\n`);\n\n this.name = 'DependencyResolutionError';\n this.chain = chain;\n this.missingDependency = missing;\n }\n}\n\n/**\n * Error thrown when a circular dependency is detected.\n *\n * Provides strategies to break the cycle.\n */\nexport class CircularDependencyError extends DIError {\n public readonly cycle: string[];\n\n constructor(cycle: string[]) {\n const cycleStr = cycle.join(' → ') + ' → ' + cycle[0];\n\n super(`\n❌ Circular Dependency Detected\n\n${cycleStr}\n\nThis creates an infinite loop during resolution.\n\nStrategies to break the cycle:\n 1. Extract shared logic into a third service\n 2. Use @inject(delay(() => ServiceClass)) for lazy resolution\n 3. Refactor to use event-driven communication\n 4. Consider if the circular dependency indicates a design issue\n`);\n\n this.name = 'CircularDependencyError';\n this.cycle = cycle;\n }\n}\n\n/**\n * Error thrown when TypeScript cannot infer constructor parameter types.\n *\n * Usually caused by missing type annotations or incorrect tsconfig.\n */\nexport class TypeInferenceError extends DIError {\n public readonly className: string;\n public readonly parameterIndex: number;\n\n constructor(className: string, parameterIndex: number) {\n super(`\n❌ Cannot Resolve Constructor Parameter\n\n${className} constructor parameter at index ${parameterIndex} has no type information.\n\nThis usually means:\n 1. Missing type annotation on the parameter\n 2. emitDecoratorMetadata is not enabled in tsconfig.json\n\nFix option 1 - Add explicit type annotation:\n constructor(private service: ServiceClass) {}\n ^^^^^^^^^^^^\n\nFix option 2 - Update tsconfig.json:\n {\n \"compilerOptions\": {\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n }\n }\n\nFix option 3 - Use explicit @inject():\n constructor(@inject(ServiceClass) private service: ServiceClass) {}\n`);\n\n this.name = 'TypeInferenceError';\n this.className = className;\n this.parameterIndex = parameterIndex;\n }\n}\n\n/**\n * Error thrown when an invalid provider configuration is given.\n */\nexport class InvalidProviderError extends DIError {\n public readonly token: string;\n\n constructor(token: string) {\n super(`\n❌ Invalid Provider Configuration\n\nToken: \"${token}\"\n\nA provider must have one of:\n • useClass: Constructor function\n • useValue: Any value\n • useFactory: Factory function\n\nExample:\n container.register(MyService, { useClass: MyService });\n container.register('CONFIG', { useValue: { port: 3000 } });\n container.register(Logger, { useFactory: () => new Logger() });\n`);\n\n this.name = 'InvalidProviderError';\n this.token = token;\n }\n}\n\n/**\n * Error thrown when trying to resolve from a disposed container.\n */\nexport class ContainerDisposedError extends DIError {\n constructor() {\n super(`\n❌ Container Has Been Disposed\n\nThe container has been reset or disposed and cannot resolve dependencies.\n\nIf you're in a test environment, ensure you're creating a fresh container\nfor each test or using container.clearInstances() between tests.\n`);\n\n this.name = 'ContainerDisposedError';\n }\n}\n\n/**\n * Error thrown when a required dependency is not found.\n *\n * @deprecated Use {@link DependencyResolutionError} instead — it provides\n * the same information plus the resolution chain context.\n */\nexport class MissingDependencyError extends DIError {\n public readonly token: string;\n\n constructor(token: string) {\n super(`\n❌ Missing Required Dependency\n\nToken: \"${token}\"\n\nThe requested dependency is not registered in the container.\n\nMake sure to:\n 1. Register the dependency before resolving\n 2. Check spelling of the token\n 3. Verify the service has @Service() or @Repository() decorator\n`);\n\n this.name = 'MissingDependencyError';\n this.token = token;\n }\n}\n","/**\n * @nextrush/di - Container\n *\n * Lightweight wrapper around tsyringe with enhanced error handling.\n */\n\nimport 'reflect-metadata';\nimport type { DependencyContainer, InjectionToken } from 'tsyringe';\nimport { container as tsyContainer } from 'tsyringe';\n\nimport type {\n Constructor,\n ContainerInterface,\n FactoryProvider,\n Provider,\n RegisterOptions,\n Token,\n} from './types.js';\n\nimport {\n CircularDependencyError,\n DependencyResolutionError,\n InvalidProviderError,\n} from './errors.js';\n\n/**\n * Get a human-readable name for a token.\n */\nfunction getTokenName(token: Token): string {\n if (typeof token === 'string') return token;\n if (typeof token === 'symbol') return token.toString();\n if (typeof token === 'function') return token.name || 'Anonymous';\n return String(token);\n}\n\n/**\n * Check if a provider uses a class constructor.\n */\nfunction isClassProvider<T>(provider: Provider<T>): provider is { useClass: Constructor<T> } {\n return 'useClass' in provider && typeof provider.useClass === 'function';\n}\n\n/**\n * Check if a provider uses a value.\n */\nfunction isValueProvider<T>(provider: Provider<T>): provider is { useValue: T } {\n return 'useValue' in provider;\n}\n\n/**\n * Check if a provider uses a factory.\n */\nfunction isFactoryProvider<T>(provider: Provider<T>): provider is FactoryProvider<T> {\n return 'useFactory' in provider && typeof provider.useFactory === 'function';\n}\n\n/**\n * Create a container wrapper with enhanced error handling.\n */\nfunction createContainerWrapper(tsyInstance: DependencyContainer): ContainerInterface {\n const resolutionStack = new Set<string>();\n const factoryTokens = new Set<Token>();\n const bootstrappedValues = new Map<Token, unknown>();\n\n const wrapper: ContainerInterface = {\n register<T>(token: Token<T>, provider: Provider<T>, options?: RegisterOptions): void {\n const tokenName = getTokenName(token);\n const tsyToken = token as InjectionToken<T>;\n\n // Invalidate bootstrap cache if re-registering\n bootstrappedValues.delete(token);\n\n if (isClassProvider(provider)) {\n if (options?.scope === 'singleton') {\n tsyInstance.registerSingleton(tsyToken, provider.useClass);\n } else {\n tsyInstance.register(tsyToken, { useClass: provider.useClass });\n }\n } else if (isValueProvider(provider)) {\n tsyInstance.register(tsyToken, { useValue: provider.useValue });\n } else if (isFactoryProvider(provider)) {\n const { inject: injectTokens } = provider;\n factoryTokens.add(token);\n\n if (injectTokens && injectTokens.length > 0) {\n tsyInstance.register(tsyToken, {\n useFactory: () => {\n const deps = injectTokens.map((depToken) => wrapper.resolve(depToken));\n const hasAsyncDep = deps.some((d) => d instanceof Promise);\n if (hasAsyncDep) {\n return Promise.all(deps).then((resolved) => provider.useFactory(...resolved));\n }\n return provider.useFactory(...deps);\n },\n });\n } else {\n tsyInstance.register(tsyToken, {\n useFactory: () => provider.useFactory(wrapper),\n });\n }\n } else {\n throw new InvalidProviderError(tokenName);\n }\n },\n\n resolve<T>(token: Token<T>): T {\n // Return bootstrapped value if available (async factory already resolved)\n if (bootstrappedValues.has(token)) {\n return bootstrappedValues.get(token) as T;\n }\n\n const tokenName = getTokenName(token);\n const tsyToken = token as InjectionToken<T>;\n\n // Detect circular dependencies (O(1) lookup with Set)\n if (resolutionStack.has(tokenName)) {\n const cycle = [...resolutionStack, tokenName];\n throw new CircularDependencyError(cycle);\n }\n\n resolutionStack.add(tokenName);\n\n try {\n const instance = tsyInstance.resolve<T>(tsyToken);\n resolutionStack.delete(tokenName);\n return instance;\n } catch (error) {\n resolutionStack.delete(tokenName);\n\n // Re-throw our own errors as-is\n if (error instanceof CircularDependencyError) {\n throw error;\n }\n\n // Detect tsyringe-internal circular dependencies (stack overflow)\n if (error instanceof RangeError && error.message.includes('Maximum call stack')) {\n const cycle = [...resolutionStack, tokenName];\n throw new CircularDependencyError(cycle);\n }\n\n // Detect tsyringe \"Cannot inject\" errors (typically circular deps)\n if (error instanceof Error && error.message.includes('Cannot inject the dependency')) {\n const cycle = [...resolutionStack, tokenName];\n throw new CircularDependencyError(cycle);\n }\n\n // Enhance error message for missing registrations\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n\n if (\n message.includes('not registered') ||\n message.includes('cannot resolve') ||\n message.includes('unregistered dependency')\n ) {\n throw new DependencyResolutionError([...resolutionStack], tokenName);\n }\n }\n\n throw error;\n }\n },\n\n async resolveAsync<T>(token: Token<T>): Promise<T> {\n if (bootstrappedValues.has(token)) {\n return bootstrappedValues.get(token) as T;\n }\n const result = wrapper.resolve<T | Promise<T>>(token);\n return result instanceof Promise ? result : result;\n },\n\n async bootstrap(): Promise<void> {\n for (const token of factoryTokens) {\n if (bootstrappedValues.has(token)) continue;\n const result = wrapper.resolve<unknown>(token);\n const value = result instanceof Promise ? await result : result;\n bootstrappedValues.set(token, value);\n }\n factoryTokens.clear();\n },\n\n resolveAll<T>(token: Token<T>): T[] {\n const tsyToken = token as InjectionToken<T>;\n try {\n return tsyInstance.resolveAll<T>(tsyToken);\n } catch (error: unknown) {\n // Only swallow \"unregistered\" errors — token genuinely has no registrations\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('unregistered')) {\n return [];\n }\n throw error;\n }\n },\n\n isRegistered<T>(token: Token<T>): boolean {\n const tsyToken = token as InjectionToken<T>;\n return tsyInstance.isRegistered(tsyToken);\n },\n\n clearInstances(): void {\n tsyInstance.clearInstances();\n bootstrappedValues.clear();\n },\n\n reset(): void {\n tsyInstance.reset();\n bootstrappedValues.clear();\n factoryTokens.clear();\n resolutionStack.clear();\n },\n\n createChild(): ContainerInterface {\n const childTsy = tsyInstance.createChildContainer();\n return createContainerWrapper(childTsy);\n },\n };\n\n return wrapper;\n}\n\n/**\n * The global DI container instance.\n *\n * Use this for registering and resolving dependencies throughout your application.\n *\n * @example\n * ```typescript\n * // Register a service\n * container.register(UserService, { useClass: UserService });\n *\n * // Resolve a service\n * const userService = container.resolve(UserService);\n *\n * // Register with value\n * container.register('CONFIG', { useValue: { port: 3000 } });\n * ```\n */\nexport const container: ContainerInterface = createContainerWrapper(tsyContainer);\n\n/**\n * Create a new isolated container.\n *\n * Useful for testing or creating scoped containers.\n * Note: Creates a child container from the global tsyringe container.\n * For truly isolated containers, reset the child before use.\n *\n * @example\n * ```typescript\n * const testContainer = createContainer();\n * testContainer.register(UserService, { useClass: MockUserService });\n * ```\n */\nexport function createContainer(): ContainerInterface {\n const childTsy = tsyContainer.createChildContainer();\n childTsy.reset();\n return createContainerWrapper(childTsy);\n}\n","/**\n * @nextrush/di - Types\n *\n * Type definitions for the dependency injection container.\n */\n\n/**\n * Token used to identify a dependency in the container.\n * Can be a class constructor, string, or symbol.\n */\nexport type Token<T = unknown> = Constructor<T> | string | symbol;\n\n/**\n * Constructor type for class-based tokens.\n */\nexport type Constructor<T = unknown> = new (...args: unknown[]) => T;\n\n/**\n * Provider that uses a class constructor.\n */\nexport interface ClassProvider<T> {\n useClass: Constructor<T>;\n}\n\n/**\n * Provider that uses a factory function.\n *\n * Without `inject`: factory receives the container.\n * With `inject`: factory receives resolved dependencies in order.\n *\n * @example Without inject\n * ```typescript\n * container.register('DB', {\n * useFactory: (c) => new Database(c.resolve(ConfigService).dbUrl),\n * });\n * ```\n *\n * @example With inject\n * ```typescript\n * container.register('DB', {\n * useFactory: (config: ConfigService) => new Database(config.dbUrl),\n * inject: [ConfigService],\n * });\n * ```\n *\n * @example Async factory (auto-resolved by bootstrap)\n * ```typescript\n * container.register('DB', {\n * useFactory: async (config: ConfigService) => {\n * const db = new Database(config.dbUrl);\n * await db.connect();\n * return db;\n * },\n * inject: [ConfigService],\n * });\n * // Controllers plugin calls bootstrap() automatically.\n * // For functional mode: await container.bootstrap()\n * ```\n */\nexport interface FactoryProvider<T> {\n useFactory: (...args: unknown[]) => T | Promise<T>;\n inject?: Token[];\n}\n\n/**\n * Provider that uses a constant value.\n */\nexport interface ValueProvider<T> {\n useValue: T;\n}\n\n/**\n * Union of all provider types.\n */\nexport type Provider<T> = ClassProvider<T> | FactoryProvider<T> | ValueProvider<T>;\n\n/**\n * Lifecycle scope for registered services.\n */\nexport type Scope = 'singleton' | 'transient';\n\n/**\n * Options for service registration.\n */\nexport interface ServiceOptions {\n scope?: Scope;\n}\n\n/**\n * Container interface for dependency injection operations.\n */\nexport interface ContainerInterface {\n /**\n * Register a dependency with the container.\n *\n * @param token - The token to register\n * @param provider - The provider (class, value, or factory)\n * @param options - Optional registration options\n */\n register<T>(token: Token<T>, provider: Provider<T>, options?: RegisterOptions): void;\n\n /**\n * Resolve a dependency from the container (synchronous).\n */\n resolve<T>(token: Token<T>): T;\n\n /**\n * Resolve a dependency that may have been registered with an async factory.\n * Awaits the result if the factory returns a Promise.\n *\n * Prefer `bootstrap()` over calling this for each async provider.\n */\n resolveAsync<T>(token: Token<T>): Promise<T>;\n\n /**\n * Bootstrap all factory providers.\n *\n * Resolves every factory-registered provider, awaiting any Promises,\n * and caches results for synchronous access via `resolve()`.\n *\n * Called automatically by the controllers plugin during `install()`.\n * For functional mode, call once before handling requests.\n *\n * @example\n * ```typescript\n * container.register('DB', {\n * useFactory: async () => { const db = new Database(); await db.connect(); return db; },\n * });\n * await container.bootstrap(); // All async providers resolved\n * container.resolve('DB'); // Works synchronously now\n * ```\n */\n bootstrap(): Promise<void>;\n\n /**\n * Resolve all dependencies registered under a token.\n */\n resolveAll<T>(token: Token<T>): T[];\n\n /**\n * Check if a token is registered.\n */\n isRegistered<T>(token: Token<T>): boolean;\n\n /**\n * Clear all registered instances (useful for testing).\n */\n clearInstances(): void;\n\n /**\n * Reset the container completely (useful for testing).\n */\n reset(): void;\n\n /**\n * Create a child container with isolated scope.\n */\n createChild(): ContainerInterface;\n}\n\n/**\n * Metadata key constants.\n */\nexport const METADATA_KEYS = {\n SERVICE_TYPE: 'di:type',\n SERVICE_SCOPE: 'di:scope',\n INJECT_TOKEN: 'di:inject',\n PARAM_TYPES: 'design:paramtypes',\n CONFIG_PREFIX: 'di:config:prefix',\n OPTIONAL_PARAMS: 'di:optional',\n} as const;\n\n/**\n * Options for @Config decorator.\n */\nexport interface ConfigOptions {\n /**\n * Environment variable prefix.\n *\n * When set, the configuration class can be used with prefix-based env loading.\n *\n * @example\n * ```typescript\n * @Config({ prefix: 'DB' })\n * class DatabaseConfig {\n * readonly host = 'localhost'; // reads DB_HOST\n * readonly port = 5432; // reads DB_PORT\n * }\n * ```\n */\n prefix?: string;\n}\n\n/**\n * Service types for metadata.\n */\nexport type ServiceType = 'service' | 'repository' | 'controller' | 'config';\n\n/**\n * Registration options for container.register().\n */\nexport interface RegisterOptions {\n /** Lifecycle scope — defaults to 'transient' if not specified */\n scope?: Scope;\n}\n","/**\n * @nextrush/di - Decorators\n *\n * Injectable decorators for marking classes as DI-managed services.\n * Uses legacy TypeScript decorators for maximum compatibility with tsyringe.\n */\n\nimport 'reflect-metadata';\nimport {\n delay as tsyDelay,\n inject as tsyInject,\n injectable as tsyInjectable,\n singleton as tsySingleton,\n} from 'tsyringe';\n\nimport { METADATA_KEYS, type Constructor, type Scope, type ServiceOptions } from './types.js';\n\n/** Decorator-compatible constructor type. Uses `never[]` so any class is structurally assignable. */\ntype DecoratorTarget = new (...args: never[]) => unknown;\n\n/**\n * Mark a class as injectable service.\n *\n * Services are singletons by default - one instance shared across the application.\n *\n * @param options - Optional configuration for the service\n *\n * @example\n * ```typescript\n * @Service()\n * export class UserService {\n * async findAll() {\n * return [{ id: 1, name: 'Alice' }];\n * }\n * }\n *\n * // With transient scope (new instance each time)\n * @Service({ scope: 'transient' })\n * export class RequestLogger {\n * constructor() {\n * this.timestamp = Date.now();\n * }\n * }\n * ```\n */\nexport function Service(options: ServiceOptions = {}) {\n const scope: Scope = options.scope ?? 'singleton';\n\n return (target: DecoratorTarget): void => {\n // Store metadata for smart discovery\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_TYPE, 'service', target);\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_SCOPE, scope, target);\n\n // Apply tsyringe decorator based on scope\n if (scope === 'singleton') {\n tsySingleton()(target as unknown as Constructor);\n } else {\n tsyInjectable()(target as unknown as Constructor);\n }\n };\n}\n\n/**\n * Mark a class as a repository (data access layer).\n *\n * Semantically identical to @Service(), but indicates the class is for data access.\n * Repositories are singletons by default.\n *\n * @param options - Optional configuration for the repository\n *\n * @example\n * ```typescript\n * @Repository()\n * export class UserRepository {\n * async findById(id: string) {\n * return db.users.findUnique({ where: { id } });\n * }\n * }\n * ```\n */\nexport function Repository(options: ServiceOptions = {}) {\n const scope: Scope = options.scope ?? 'singleton';\n\n return (target: DecoratorTarget): void => {\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_TYPE, 'repository', target);\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_SCOPE, scope, target);\n\n if (scope === 'singleton') {\n tsySingleton()(target as unknown as Constructor);\n } else {\n tsyInjectable()(target as unknown as Constructor);\n }\n };\n}\n\n/**\n * Explicitly inject a dependency by token.\n *\n * Use this when:\n * - Injecting an interface (TypeScript can't infer interface types at runtime)\n * - Using string or symbol tokens\n * - The automatic type inference doesn't work\n *\n * @param token - The token to inject (class, string, or symbol)\n *\n * @example\n * ```typescript\n * @Service()\n * export class UserService {\n * constructor(\n * // Inject by interface token\n * @inject('IUserRepository') private repo: IUserRepository,\n *\n * // Inject by string token\n * @inject('DATABASE_URL') private dbUrl: string\n * ) {}\n * }\n * ```\n */\nexport function inject(token: unknown): ParameterDecorator {\n return tsyInject(token as never);\n}\n\n/**\n * Make a class injectable without singleton scope.\n *\n * Unlike @Service() which defaults to singleton, @Injectable() creates\n * a transient registration that can be resolved from the container.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class FeatureService {\n * constructor(private logger: Logger) {}\n * }\n *\n * // Resolve from container\n * const service = container.resolve(FeatureService);\n * ```\n */\nexport function Injectable() {\n return (target: DecoratorTarget): void => {\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_TYPE, 'service', target);\n tsyInjectable()(target as unknown as Constructor);\n };\n}\n\n/**\n * @deprecated Use `@Injectable()` instead. Will be removed in v4.\n */\nexport const AutoInjectable = Injectable;\n\n/**\n * Make a class resolvable by the DI container without adding service metadata.\n *\n * Used internally by `@Controller()` to enable constructor injection\n * without marking the class as a service. This is the abstraction boundary\n * that prevents `@nextrush/decorators` from depending directly on tsyringe.\n *\n * @param target - The class constructor to make injectable\n *\n * @internal\n */\nexport function markInjectable(target: Constructor): void {\n tsyInjectable()(target);\n}\n\n/**\n * Delay resolution of a dependency.\n *\n * Use this to break circular dependencies by lazily resolving the dependency.\n *\n * @param token - Factory function returning the class to inject\n *\n * @example\n * ```typescript\n * @Service()\n * class UserService {\n * constructor(\n * @inject(delay(() => OrderService)) private orderService: OrderService\n * ) {}\n * }\n *\n * @Service()\n * class OrderService {\n * constructor(\n * @inject(delay(() => UserService)) private userService: UserService\n * ) {}\n * }\n * ```\n */\nexport function delay(tokenFactory: () => Constructor): unknown {\n return tsyDelay(tokenFactory);\n}\n\n/**\n * Check if a class has DI metadata (is decorated with @Service or @Repository).\n *\n * @param target - The class to check\n * @returns True if the class has DI metadata\n */\nexport function hasServiceMetadata(target: object): boolean {\n return Reflect.hasMetadata(METADATA_KEYS.SERVICE_TYPE, target);\n}\n\n/**\n * Get the service type from a decorated class.\n *\n * @param target - The class to check\n * @returns The service type ('service' | 'repository') or undefined\n */\nexport function getServiceType(target: object): string | undefined {\n return Reflect.getMetadata(METADATA_KEYS.SERVICE_TYPE, target) as string | undefined;\n}\n\n/**\n * Get the scope from a decorated class.\n *\n * @param target - The class to check\n * @returns The scope ('singleton' | 'transient') or undefined\n */\nexport function getServiceScope(target: object): Scope | undefined {\n return Reflect.getMetadata(METADATA_KEYS.SERVICE_SCOPE, target) as Scope | undefined;\n}\n\n/**\n * Mark a class as a configuration holder.\n *\n * Configuration classes are always singletons and serve as centralized\n * configuration containers for your application. Similar to Spring Boot's\n * `@Configuration` / `@ConfigurationProperties`.\n *\n * @param options - Optional configuration (e.g., env prefix)\n *\n * @example\n * ```typescript\n * // Simple configuration class\n * @Config()\n * export class AppConfig {\n * readonly port = Number(process.env.PORT ?? 3000);\n * readonly host = process.env.HOST ?? 'localhost';\n * }\n *\n * // With env prefix — documents that this config reads DB_* vars\n * @Config({ prefix: 'DB' })\n * export class DatabaseConfig {\n * readonly host = process.env.DB_HOST ?? 'localhost';\n * readonly port = Number(process.env.DB_PORT ?? 5432);\n * readonly name = process.env.DB_NAME ?? 'mydb';\n * }\n *\n * // Inject into services\n * @Service()\n * export class UserService {\n * constructor(private config: DatabaseConfig) {}\n *\n * getConnectionString() {\n * return `postgres://${this.config.host}:${this.config.port}/${this.config.name}`;\n * }\n * }\n * ```\n */\nexport function Config(options: import('./types.js').ConfigOptions = {}) {\n return (target: DecoratorTarget): void => {\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_TYPE, 'config', target);\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_SCOPE, 'singleton', target);\n\n if (options.prefix) {\n Reflect.defineMetadata(METADATA_KEYS.CONFIG_PREFIX, options.prefix, target);\n }\n\n // Configuration classes are always singletons\n tsySingleton()(target as unknown as Constructor);\n };\n}\n\n/**\n * Get the config prefix from a @Config-decorated class.\n *\n * @param target - The class to check\n * @returns The prefix string or undefined\n */\nexport function getConfigPrefix(target: object): string | undefined {\n return Reflect.getMetadata(METADATA_KEYS.CONFIG_PREFIX, target) as string | undefined;\n}\n\n/**\n * Mark a constructor parameter as optional.\n *\n * When a dependency marked `@Optional()` cannot be resolved, the container\n * injects `undefined` instead of throwing a `DependencyResolutionError`.\n *\n * @example\n * ```typescript\n * // Optional dependency - if 'MAILER' is not registered, `mailer` will be undefined\n * @Service()\n * class NotificationService {\n * constructor(\n * @Optional() @inject('MAILER') private mailer?: MailerService,\n * ) {}\n *\n * send(message: string) {\n * if (this.mailer) {\n * this.mailer.send(message);\n * } else {\n * console.log('No mailer configured, skipping:', message);\n * }\n * }\n * }\n * ```\n */\nexport function Optional(): ParameterDecorator {\n return (target: object, _propertyKey: string | symbol | undefined, parameterIndex: number) => {\n // Store in our own metadata for introspection via getOptionalParams / isParameterOptional\n const existing =\n (Reflect.getOwnMetadata(METADATA_KEYS.OPTIONAL_PARAMS, target) as Set<number> | undefined) ??\n new Set<number>();\n existing.add(parameterIndex);\n Reflect.defineMetadata(METADATA_KEYS.OPTIONAL_PARAMS, existing, target);\n\n // Set isOptional on tsyringe's injection token descriptor so that tsyringe\n // natively returns undefined for unregistered optional deps instead of throwing.\n // This works because @inject() runs before @Optional() (right-to-left param decorator order)\n // and @Service()/@injectable() runs after both (class decorator order).\n const TSYRINGE_INJECTION_KEY = 'injectionTokens';\n const descriptors =\n (Reflect.getOwnMetadata(TSYRINGE_INJECTION_KEY, target) as\n | Record<number, unknown>\n | undefined) ?? {};\n const descriptor = descriptors[parameterIndex];\n\n if (descriptor && typeof descriptor === 'object' && 'token' in descriptor) {\n // @inject() already created the descriptor — set isOptional flag\n (descriptor as Record<string, unknown>).isOptional = true;\n }\n\n Reflect.defineMetadata(TSYRINGE_INJECTION_KEY, descriptors, target);\n };\n}\n\n/**\n * Check whether a specific constructor parameter is marked `@Optional()`.\n */\nexport function isParameterOptional(target: object, parameterIndex: number): boolean {\n const optional = Reflect.getOwnMetadata(METADATA_KEYS.OPTIONAL_PARAMS, target) as\n | Set<number>\n | undefined;\n return optional?.has(parameterIndex) ?? false;\n}\n\n/**\n * Get the set of optional parameter indices for a class constructor.\n */\nexport function getOptionalParams(target: object): ReadonlySet<number> {\n return (\n (Reflect.getOwnMetadata(METADATA_KEYS.OPTIONAL_PARAMS, target) as Set<number> | undefined) ??\n new Set<number>()\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/types.ts","../src/service-decorators.ts","../src/injection.ts","../src/service-metadata.ts","../src/container.ts"],"names":["V8Error","Error","DIError","message","name","captureStackTrace","DependencyResolutionError","chain","missingDependency","missing","chainStr","length","join","CircularDependencyError","cycle","cycleStr","InvalidProviderError","token","METADATA_KEYS","SERVICE_TYPE","SERVICE_SCOPE","INJECT_TOKEN","PARAM_TYPES","CONFIG_PREFIX","OPTIONAL_PARAMS","Service","options","scope","target","Reflect","defineMetadata","tsySingleton","tsyInjectable","Repository","Config","prefix","inject","tsyInject","delay","tokenFactory","tsyDelay","Injectable","markInjectable","markTsyringeParamOptional","parameterIndex","TSYRINGE_INJECTION_KEY","descriptors","getOwnMetadata","descriptor","isOptional","Optional","_propertyKey","existing","Set","add","isParameterOptional","optional","has","getOptionalParams","hasServiceMetadata","hasMetadata","getServiceType","getMetadata","getServiceScope","getConfigPrefix","getTokenName","toString","String","isClassProvider","provider","useClass","isValueProvider","isFactoryProvider","useFactory","createContainerWrapper","tsyInstance","sharedState","resolutionStack","factoryTokens","bootstrappedValues","Map","guardedTokens","registerCycleGuard","tsyToken","tokenName","beforeResolution","frequency","afterResolution","delete","wrapper","register","registerSingleton","lifecycle","Lifecycle","ContainerScoped","useValue","injectTokens","deps","map","depToken","resolve","hasAsyncDep","some","d","Promise","all","then","resolved","get","guardedByInterceptor","stackSnapshot","error","toLowerCase","includes","isStackOverflow","RangeError","clear","resolveAsync","result","bootstrap","value","set","resolveAll","isRegistered","clearInstances","reset","createChild","childTsy","createChildContainer","container","tsyContainer","createContainer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @nextrush/di - Errors\n *\n * Production-grade error classes with actionable messages.\n */\n\nconst V8Error = Error as ErrorConstructor & {\n captureStackTrace?: (targetObject: object, constructorOpt?: Function) => void;\n};\n\n/**\n * Base error class for all DI-related errors.\n */\nexport class DIError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'DIError';\n V8Error.captureStackTrace?.(this, this.constructor);\n }\n}\n\n/**\n * Error thrown when a dependency cannot be resolved.\n *\n * Provides clear guidance on how to fix the issue.\n */\nexport class DependencyResolutionError extends DIError {\n public readonly chain: string[];\n public readonly missingDependency: string;\n\n constructor(chain: string[], missing: string) {\n const chainStr = chain.length > 0 ? chain.join(' → ') + ' → ' : '';\n\n super(`\n❌ Dependency Resolution Failed\n\n${chainStr}${missing}\n\n\"${missing}\" is not registered in the container.\n\nPossible fixes:\n • Add @Service(), @Repository(), or @Config() decorator to ${missing}\n • Ensure ${missing} is imported before container.resolve() is called\n • Register manually: container.register(${missing}, { useClass: ${missing} })\n • Check for typos in the class name or import path\n`);\n\n this.name = 'DependencyResolutionError';\n this.chain = chain;\n this.missingDependency = missing;\n }\n}\n\n/**\n * Error thrown when a circular dependency is detected.\n *\n * Provides strategies to break the cycle.\n */\nexport class CircularDependencyError extends DIError {\n public readonly cycle: string[];\n\n constructor(cycle: string[]) {\n const cycleStr = cycle.join(' → ') + ' → ' + cycle[0];\n\n super(`\n❌ Circular Dependency Detected\n\n${cycleStr}\n\nThis creates an infinite loop during resolution.\n\nStrategies to break the cycle:\n 1. Extract shared logic into a third service\n 2. Use @inject(delay(() => ServiceClass)) for lazy resolution\n 3. Refactor to use event-driven communication\n 4. Consider if the circular dependency indicates a design issue\n`);\n\n this.name = 'CircularDependencyError';\n this.cycle = cycle;\n }\n}\n\n/**\n * Error thrown when an invalid provider configuration is given.\n */\nexport class InvalidProviderError extends DIError {\n public readonly token: string;\n\n constructor(token: string) {\n super(`\n❌ Invalid Provider Configuration\n\nToken: \"${token}\"\n\nA provider must have one of:\n • useClass: Constructor function\n • useValue: Any value\n • useFactory: Factory function\n\nExample:\n container.register(MyService, { useClass: MyService });\n container.register('CONFIG', { useValue: { port: 8080 } });\n container.register(Logger, { useFactory: () => new Logger() });\n`);\n\n this.name = 'InvalidProviderError';\n this.token = token;\n }\n}\n","/**\n * @nextrush/di - Types\n *\n * The container contract now lives in `@nextrush/types` (shared, lowest\n * package). This module re-exports it and adds the DI-specific metadata types.\n */\n\nexport type {\n ClassProvider,\n Constructor,\n Container,\n FactoryProvider,\n Provider,\n RegisterOptions,\n Scope,\n ServiceOptions,\n Token,\n ValueProvider,\n} from '@nextrush/types';\n\n/**\n * Metadata key constants.\n */\nexport const METADATA_KEYS = {\n SERVICE_TYPE: 'di:type',\n SERVICE_SCOPE: 'di:scope',\n INJECT_TOKEN: 'di:inject',\n PARAM_TYPES: 'design:paramtypes',\n CONFIG_PREFIX: 'di:config:prefix',\n OPTIONAL_PARAMS: 'di:optional',\n} as const;\n\n/**\n * Options for @Config decorator.\n */\nexport interface ConfigOptions {\n /**\n * Environment variable prefix.\n *\n * @example\n * ```typescript\n * @Config({ prefix: 'DB' })\n * class DatabaseConfig {\n * readonly host = 'localhost'; // reads DB_HOST\n * readonly port = 5432; // reads DB_PORT\n * }\n * ```\n */\n prefix?: string;\n}\n\n/**\n * Service types for metadata.\n */\nexport type ServiceType = 'service' | 'repository' | 'controller' | 'config';\n","/**\n * @nextrush/di - Service Decorators\n *\n * Decorators that mark classes as DI-managed services and write their metadata.\n */\n\nimport { singleton as tsySingleton, injectable as tsyInjectable } from 'tsyringe';\nimport { METADATA_KEYS, type Constructor, type Scope, type ServiceOptions } from './types.js';\n\n/** Decorator-compatible constructor type. Uses `never[]` so any class is structurally assignable. */\ntype DecoratorTarget = new (...args: never[]) => unknown;\n\n/**\n * Mark a class as injectable service.\n *\n * Services are singletons by default - one instance shared across the application.\n *\n * @param options - Optional configuration for the service\n *\n * @example\n * ```typescript\n * @Service()\n * export class UserService {\n * async findAll() {\n * return [{ id: 1, name: 'Alice' }];\n * }\n * }\n *\n * // With transient scope (new instance each time)\n * @Service({ scope: 'transient' })\n * export class RequestLogger {\n * constructor() {\n * this.timestamp = Date.now();\n * }\n * }\n * ```\n */\nexport function Service(options: ServiceOptions = {}) {\n const scope: Scope = options.scope ?? 'singleton';\n\n return (target: DecoratorTarget): void => {\n // Store metadata for smart discovery\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_TYPE, 'service', target);\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_SCOPE, scope, target);\n\n // Apply tsyringe decorator based on scope\n if (scope === 'singleton') {\n tsySingleton()(target as unknown as Constructor);\n } else {\n tsyInjectable()(target as unknown as Constructor);\n }\n };\n}\n\n/**\n * Mark a class as a repository (data access layer).\n *\n * Semantically identical to @Service(), but indicates the class is for data access.\n * Repositories are singletons by default.\n *\n * @param options - Optional configuration for the repository\n *\n * @example\n * ```typescript\n * @Repository()\n * export class UserRepository {\n * async findById(id: string) {\n * return db.users.findUnique({ where: { id } });\n * }\n * }\n * ```\n */\nexport function Repository(options: ServiceOptions = {}) {\n const scope: Scope = options.scope ?? 'singleton';\n\n return (target: DecoratorTarget): void => {\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_TYPE, 'repository', target);\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_SCOPE, scope, target);\n\n if (scope === 'singleton') {\n tsySingleton()(target as unknown as Constructor);\n } else {\n tsyInjectable()(target as unknown as Constructor);\n }\n };\n}\n\n/**\n * Mark a class as a configuration holder.\n *\n * Configuration classes are always singletons and serve as centralized\n * configuration containers for your application. Similar to Spring Boot's\n * `@Configuration` / `@ConfigurationProperties`.\n *\n * @param options - Optional configuration (e.g., env prefix)\n *\n * @example\n * ```typescript\n * // Simple configuration class\n * @Config()\n * export class AppConfig {\n * readonly port = Number(process.env.PORT ?? 8080);\n * readonly host = process.env.HOST ?? 'localhost';\n * }\n *\n * // With env prefix — documents that this config reads DB_* vars\n * @Config({ prefix: 'DB' })\n * export class DatabaseConfig {\n * readonly host = process.env.DB_HOST ?? 'localhost';\n * readonly port = Number(process.env.DB_PORT ?? 5432);\n * readonly name = process.env.DB_NAME ?? 'mydb';\n * }\n *\n * // Inject into services\n * @Service()\n * export class UserService {\n * constructor(private config: DatabaseConfig) {}\n *\n * getConnectionString() {\n * return `postgres://${this.config.host}:${this.config.port}/${this.config.name}`;\n * }\n * }\n * ```\n */\nexport function Config(options: import('./types.js').ConfigOptions = {}) {\n return (target: DecoratorTarget): void => {\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_TYPE, 'config', target);\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_SCOPE, 'singleton', target);\n\n if (options.prefix) {\n Reflect.defineMetadata(METADATA_KEYS.CONFIG_PREFIX, options.prefix, target);\n }\n\n // Configuration classes are always singletons\n tsySingleton()(target as unknown as Constructor);\n };\n}\n","/**\n * @nextrush/di - Injection Decorators & Adapters\n *\n * Parameter decorators for injection, and adapters to tsyringe's internals.\n */\n\nimport {\n delay as tsyDelay,\n inject as tsyInject,\n injectable as tsyInjectable,\n} from 'tsyringe';\n\nimport { METADATA_KEYS, type Constructor } from './types.js';\n\n/** Decorator-compatible constructor type. Uses `never[]` so any class is structurally assignable. */\ntype DecoratorTarget = new (...args: never[]) => unknown;\n\n/**\n * Explicitly inject a dependency by token.\n *\n * Use this when:\n * - Injecting an interface (TypeScript can't infer interface types at runtime)\n * - Using string or symbol tokens\n * - The automatic type inference doesn't work\n *\n * @param token - The token to inject (class, string, or symbol)\n *\n * @example\n * ```typescript\n * @Service()\n * export class UserService {\n * constructor(\n * // Inject by interface token\n * @inject('IUserRepository') private repo: IUserRepository,\n *\n * // Inject by string token\n * @inject('DATABASE_URL') private dbUrl: string\n * ) {}\n * }\n * ```\n */\nexport function inject(token: unknown): ParameterDecorator {\n return tsyInject(token as never);\n}\n\n/**\n * Delay resolution of a dependency.\n *\n * Use this to break circular dependencies by lazily resolving the dependency.\n *\n * @param token - Factory function returning the class to inject\n *\n * @example\n * ```typescript\n * @Service()\n * class UserService {\n * constructor(\n * @inject(delay(() => OrderService)) private orderService: OrderService\n * ) {}\n * }\n *\n * @Service()\n * class OrderService {\n * constructor(\n * @inject(delay(() => UserService)) private userService: UserService\n * ) {}\n * }\n * ```\n */\nexport function delay(tokenFactory: () => Constructor): unknown {\n return tsyDelay(tokenFactory);\n}\n\n/**\n * Make a class injectable without singleton scope.\n *\n * Unlike @Service() which defaults to singleton, @Injectable() creates\n * a transient registration that can be resolved from the container.\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class FeatureService {\n * constructor(private logger: Logger) {}\n * }\n *\n * // Resolve from container\n * const service = container.resolve(FeatureService);\n * ```\n */\nexport function Injectable() {\n return (target: DecoratorTarget): void => {\n Reflect.defineMetadata(METADATA_KEYS.SERVICE_TYPE, 'service', target);\n tsyInjectable()(target as unknown as Constructor);\n };\n}\n\n/**\n * Make a class resolvable by the DI container without adding service metadata.\n *\n * Used internally by `@Controller()` to enable constructor injection\n * without marking the class as a service. This is the abstraction boundary\n * that prevents `@nextrush/decorators` from depending directly on tsyringe.\n *\n * @param target - The class constructor to make injectable\n *\n * @internal\n */\nexport function markInjectable(target: Constructor): void {\n tsyInjectable()(target);\n}\n\n/**\n * Deliberate, isolated coupling to tsyringe internals.\n *\n * tsyringe stores per-parameter `@inject()` descriptors under the private\n * `'injectionTokens'` metadata key and honours an `isOptional` flag on each descriptor\n * to return `undefined` (instead of throwing) for an unregistered optional dependency.\n * There is no public tsyringe API for \"optional inject\", so {@link Optional} sets that\n * flag directly. This adapter is the ONE place that touches tsyringe's descriptor shape.\n *\n * It is defensive by design: if a future tsyringe upgrade changes the descriptor shape,\n * this is a no-op rather than a throw, and the end-to-end `@Optional()` resolution test\n * (`decorators.test.ts`) fails loudly so the breakage is caught at CI time.\n *\n * @param target - The class constructor the parameter belongs to\n * @param parameterIndex - Zero-based index of the constructor parameter\n * @internal\n */\nfunction markTsyringeParamOptional(target: object, parameterIndex: number): void {\n const TSYRINGE_INJECTION_KEY = 'injectionTokens';\n try {\n const descriptors =\n (Reflect.getOwnMetadata(TSYRINGE_INJECTION_KEY, target) as\n | Record<number, unknown>\n | undefined) ?? {};\n const descriptor = descriptors[parameterIndex];\n\n // @inject() (which runs before @Optional() in right-to-left param-decorator order)\n // must already have created the descriptor with a `token` field.\n if (descriptor && typeof descriptor === 'object' && 'token' in descriptor) {\n (descriptor as Record<string, unknown>).isOptional = true;\n Reflect.defineMetadata(TSYRINGE_INJECTION_KEY, descriptors, target);\n }\n } catch {\n // Descriptor shape changed across a tsyringe version — degrade gracefully. Our own\n // OPTIONAL_PARAMS metadata is still recorded; the e2e resolution test guards the flag.\n }\n}\n\n/**\n * Mark a constructor parameter as optional.\n *\n * When a dependency marked `@Optional()` cannot be resolved, the container\n * injects `undefined` instead of throwing a `DependencyResolutionError`.\n *\n * @example\n * ```typescript\n * // Optional dependency - if 'MAILER' is not registered, `mailer` will be undefined\n * @Service()\n * class NotificationService {\n * constructor(\n * @Optional() @inject('MAILER') private mailer?: MailerService,\n * ) {}\n *\n * send(message: string) {\n * if (this.mailer) {\n * this.mailer.send(message);\n * } else {\n * console.log('No mailer configured, skipping:', message);\n * }\n * }\n * }\n * ```\n */\nexport function Optional(): ParameterDecorator {\n return (target: object, _propertyKey: string | symbol | undefined, parameterIndex: number) => {\n // Store in our own metadata for introspection via getOptionalParams / isParameterOptional\n const existing =\n (Reflect.getOwnMetadata(METADATA_KEYS.OPTIONAL_PARAMS, target) as Set<number> | undefined) ??\n new Set<number>();\n existing.add(parameterIndex);\n Reflect.defineMetadata(METADATA_KEYS.OPTIONAL_PARAMS, existing, target);\n\n // Flip tsyringe's native `isOptional` flag so unregistered optional deps resolve to\n // undefined instead of throwing. Isolated behind a single guarded adapter.\n markTsyringeParamOptional(target, parameterIndex);\n };\n}\n\n/**\n * Check whether a specific constructor parameter is marked `@Optional()`.\n */\nexport function isParameterOptional(target: object, parameterIndex: number): boolean {\n const optional = Reflect.getOwnMetadata(METADATA_KEYS.OPTIONAL_PARAMS, target) as\n | Set<number>\n | undefined;\n return optional?.has(parameterIndex) ?? false;\n}\n\n/**\n * Get the set of optional parameter indices for a class constructor.\n */\nexport function getOptionalParams(target: object): ReadonlySet<number> {\n return (\n (Reflect.getOwnMetadata(METADATA_KEYS.OPTIONAL_PARAMS, target) as Set<number> | undefined) ??\n new Set<number>()\n );\n}\n","/**\n * @nextrush/di - Service Metadata Readers\n *\n * Functions to read service metadata written by decorators.\n */\n\nimport { METADATA_KEYS, type Scope } from './types.js';\n\n/**\n * Check if a class has DI metadata (is decorated with @Service or @Repository).\n *\n * @param target - The class to check\n * @returns True if the class has DI metadata\n */\nexport function hasServiceMetadata(target: object): boolean {\n return Reflect.hasMetadata(METADATA_KEYS.SERVICE_TYPE, target);\n}\n\n/**\n * Get the service type from a decorated class.\n *\n * @param target - The class to check\n * @returns The service type ('service' | 'repository') or undefined\n */\nexport function getServiceType(target: object): string | undefined {\n return Reflect.getMetadata(METADATA_KEYS.SERVICE_TYPE, target) as string | undefined;\n}\n\n/**\n * Get the declared scope of a class — the single source of truth for service scope.\n *\n * Scope defaults are unified on `'singleton'`: `@Service()`, `@Repository()`, and\n * `@Config()` all declare `singleton` unless `{ scope: 'transient' }` is passed, and an\n * undecorated class (no `di:scope` metadata) is treated as `singleton` too. The\n * low-level {@link Container.register} reads this value so a class's declared scope —\n * not the call site — decides singleton vs transient.\n *\n * @param target - The class to check\n * @returns The declared scope (`'singleton'` | `'transient'`); `'singleton'` when undeclared\n */\nexport function getServiceScope(target: object): Scope {\n return (Reflect.getMetadata(METADATA_KEYS.SERVICE_SCOPE, target) as Scope | undefined) ??\n 'singleton';\n}\n\n/**\n * Get the config prefix from a @Config-decorated class.\n *\n * @param target - The class to check\n * @returns The prefix string or undefined\n */\nexport function getConfigPrefix(target: object): string | undefined {\n return Reflect.getMetadata(METADATA_KEYS.CONFIG_PREFIX, target) as string | undefined;\n}\n","/**\n * @nextrush/di - Container\n *\n * Lightweight wrapper around tsyringe with enhanced error handling.\n */\n\nimport type { DependencyContainer, InjectionToken } from 'tsyringe';\nimport { container as tsyContainer, Lifecycle } from 'tsyringe';\n\nimport type {\n Constructor,\n Container,\n FactoryProvider,\n Provider,\n RegisterOptions,\n Token,\n} from './types.js';\n\nimport {\n CircularDependencyError,\n DependencyResolutionError,\n InvalidProviderError,\n} from './errors.js';\n\nimport { getServiceScope } from './decorators.js';\n\n/**\n * Get a human-readable name for a token.\n */\nfunction getTokenName(token: Token): string {\n if (typeof token === 'string') return token;\n if (typeof token === 'symbol') return token.toString();\n if (typeof token === 'function') return token.name || 'Anonymous';\n return String(token);\n}\n\n/**\n * Check if a provider uses a class constructor.\n */\nfunction isClassProvider<T>(provider: Provider<T>): provider is { useClass: Constructor<T> } {\n return 'useClass' in provider && typeof provider.useClass === 'function';\n}\n\n/**\n * Check if a provider uses a value.\n */\nfunction isValueProvider<T>(provider: Provider<T>): provider is { useValue: T } {\n return 'useValue' in provider;\n}\n\n/**\n * Check if a provider uses a factory.\n */\nfunction isFactoryProvider<T>(provider: Provider<T>): provider is FactoryProvider<T> {\n return 'useFactory' in provider && typeof provider.useFactory === 'function';\n}\n\n/**\n * Create a container wrapper with enhanced error handling.\n *\n * @param sharedState - Cycle-detection state to reuse instead of starting fresh.\n * Passed by `createChild()` so a child container's resolutions are checked\n * against the SAME resolutionStack/guardedTokens as its parent — cycle\n * detection is a property of the underlying tsyringe registration graph\n * (which a child inherits/delegates to via createChildContainer), not of\n * which wrapper object happens to be calling resolve(). Without sharing this,\n * a token registered on the parent but resolved through a child would guard\n * against the wrong (child's, empty) Set while the interceptor — registered\n * on the parent's tsyInstance at register() time — pushes onto the parent's\n * Set, leaking state the child's own snapshot/restore never touches.\n */\nfunction createContainerWrapper(\n tsyInstance: DependencyContainer,\n sharedState?: {\n resolutionStack: Set<string>;\n factoryTokens: Set<Token>;\n bootstrappedValues: Map<Token, unknown>;\n guardedTokens: Set<Token>;\n }\n): Container {\n const resolutionStack = sharedState?.resolutionStack ?? new Set<string>();\n const factoryTokens = sharedState?.factoryTokens ?? new Set<Token>();\n const bootstrappedValues = sharedState?.bootstrappedValues ?? new Map<Token, unknown>();\n // Tokens with a beforeResolution/afterResolution guard already wired (see\n // registerCycleGuard below) — prevents double-registering the interceptor pair\n // on repeated register() calls for the same token, which would double-push/pop\n // resolutionStack and desync the count.\n const guardedTokens = sharedState?.guardedTokens ?? new Set<Token>();\n\n /**\n * Makes the fast Set-based cycle guard apply to tsyringe's OWN internal\n * constructor-injection recursion, not just the wrapper.resolve() re-entry path\n * factory providers already use.\n *\n * useClass providers never call back into wrapper.resolve() — tsyringe resolves\n * the whole constructor graph itself (construct() -> resolveParams() ->\n * resolve(), recursively), so resolutionStack's checks at the top of\n * wrapper.resolve() never fire for this path. tsyringe's beforeResolution/\n * afterResolution interceptors DO fire on every one of those internal recursive\n * resolve() calls (dependency-container.js executePreResolutionInterceptor is\n * called from inside resolve() itself), so wiring the same resolutionStack Set\n * through them closes the gap: a cycle is now caught on the next recursive call,\n * not after tens of thousands of stack frames.\n */\n function registerCycleGuard(token: Token, tsyToken: InjectionToken): void {\n if (guardedTokens.has(token)) return;\n guardedTokens.add(token);\n\n const tokenName = getTokenName(token);\n tsyInstance.beforeResolution(\n tsyToken,\n () => {\n if (resolutionStack.has(tokenName)) {\n const cycle = [...resolutionStack, tokenName];\n throw new CircularDependencyError(cycle);\n }\n resolutionStack.add(tokenName);\n },\n { frequency: 'Always' }\n );\n tsyInstance.afterResolution(\n tsyToken,\n () => {\n resolutionStack.delete(tokenName);\n },\n { frequency: 'Always' }\n );\n }\n\n const wrapper: Container = {\n register<T>(token: Token<T>, provider: Provider<T>, options?: RegisterOptions): void {\n const tokenName = getTokenName(token);\n const tsyToken = token as InjectionToken<T>;\n\n // Invalidate bootstrap cache if re-registering\n bootstrappedValues.delete(token);\n\n if (isClassProvider(provider)) {\n // Scope defaults are unified on 'singleton'. An explicit `options.scope` wins;\n // otherwise the class's declared `di:scope` metadata is the single source of\n // truth (getServiceScope defaults undecorated classes to 'singleton').\n const scope = options?.scope ?? getServiceScope(provider.useClass);\n if (scope === 'singleton') {\n tsyInstance.registerSingleton(tsyToken, provider.useClass);\n } else if (scope === 'request') {\n // Request scope → tsyringe ContainerScoped: one instance per container.\n // A per-request child (`createChild()`) constructs its own instance and\n // shares it within that request; singletons stay on the parent. See\n // RFC-NEXTRUSH-REQUEST-SCOPE.\n tsyInstance.register(\n tsyToken,\n { useClass: provider.useClass },\n { lifecycle: Lifecycle.ContainerScoped }\n );\n } else {\n tsyInstance.register(tsyToken, { useClass: provider.useClass });\n }\n registerCycleGuard(token, tsyToken);\n } else if (isValueProvider(provider)) {\n tsyInstance.register(tsyToken, { useValue: provider.useValue });\n } else if (isFactoryProvider(provider)) {\n const { inject: injectTokens } = provider;\n factoryTokens.add(token);\n\n if (injectTokens && injectTokens.length > 0) {\n tsyInstance.register(tsyToken, {\n useFactory: () => {\n const deps = injectTokens.map((depToken) => wrapper.resolve(depToken));\n const hasAsyncDep = deps.some((d) => d instanceof Promise);\n if (hasAsyncDep) {\n return Promise.all(deps).then((resolved) => provider.useFactory(...resolved));\n }\n return provider.useFactory(...deps);\n },\n });\n } else {\n tsyInstance.register(tsyToken, {\n useFactory: () => provider.useFactory(wrapper),\n });\n }\n } else {\n throw new InvalidProviderError(tokenName);\n }\n },\n\n resolve<T>(token: Token<T>): T {\n // Return bootstrapped value if available (async factory already resolved)\n if (bootstrappedValues.has(token)) {\n return bootstrappedValues.get(token) as T;\n }\n\n const tokenName = getTokenName(token);\n const tsyToken = token as InjectionToken<T>;\n // useClass tokens are guarded by the beforeResolution/afterResolution pair\n // (registerCycleGuard) instead — that pair fires on every one of tsyringe's\n // internal recursive resolve() calls too, not just this outer one, so it owns\n // the push/pop for those tokens. Pushing here AS WELL would double-count the\n // outermost call (this resolve() entry) against the interceptor's own push,\n // producing a false-positive cycle on the very first, non-recursive resolution.\n //\n // Note: a class decorated with tsyringe's own @singleton()/@injectable()\n // (which is what @Service()/@Repository()/@Config() call directly — see\n // service-decorators.ts) is registered with tsyringe WITHOUT ever going\n // through wrapper.register(), so guardedTokens never gets it added and this\n // is correctly false for that case; it falls through to the manual push/pop\n // guard below instead, same as it did before the interceptor guard existed.\n const guardedByInterceptor = guardedTokens.has(token);\n\n // Snapshot BEFORE either guard path pushes anything, so finally's restore\n // below undoes exactly what THIS call added — regardless of which of the two\n // paths (interceptor-owned or manual) did the pushing.\n const stackSnapshot = [...resolutionStack];\n\n // Detect circular dependencies (O(1) lookup with Set) — only for tokens the\n // interceptor pair does not already own (value providers, tokens with no\n // registered class, resolveAll-only tokens, and any token registered via\n // tsyringe's own decorators rather than wrapper.register()).\n if (!guardedByInterceptor) {\n if (resolutionStack.has(tokenName)) {\n const cycle = [...resolutionStack, tokenName];\n throw new CircularDependencyError(cycle);\n }\n resolutionStack.add(tokenName);\n }\n\n // On any exit (success OR failure, at any nesting depth) restore\n // resolutionStack to exactly its pre-call contents — afterResolution only\n // fires on a SUCCESSFUL resolve(), so a cycle/failure several constructor-\n // injection frames deep would otherwise leave every frame between the failure\n // and this call's entry stuck in resolutionStack forever, misreporting every\n // later resolve() of those tokens as a false-positive cycle. Restoring the\n // snapshot on the way out — rather than trusting each frame's own pop to have\n // run — is correct regardless of how many guarded frames recursed underneath,\n // since only one top-level call is ever in flight at a time (single JS thread).\n\n try {\n return tsyInstance.resolve<T>(tsyToken);\n } catch (error) {\n // Re-throw our own errors as-is\n if (error instanceof CircularDependencyError) {\n throw error;\n }\n\n const message = error instanceof Error ? error.message.toLowerCase() : '';\n\n // Missing / unregistered dependency → resolution error. This MUST be checked\n // before any \"Cannot inject\" heuristic below: tsyringe wraps a missing\n // *constructor* dependency in a message containing BOTH \"Cannot inject the\n // dependency\" AND \"unregistered dependency token\", so checking \"Cannot inject\"\n // first would misreport a genuine missing dep as a circular dependency.\n if (\n error instanceof Error &&\n (message.includes('not registered') ||\n message.includes('cannot resolve') ||\n message.includes('unregistered'))\n ) {\n throw new DependencyResolutionError([...resolutionStack], tokenName);\n }\n\n // True cycle signals, in order of confidence:\n // (a) tsyringe recursion blew the JS stack (RangeError / \"maximum call stack\");\n // (b) the message explicitly names a circular/cyclic dependency;\n // (c) a nested \"Cannot inject the dependency\" chain with NO missing-token signal\n // (the missing-token case was already handled above) — tsyringe's shape for a\n // cycle where every participant IS registered.\n const isStackOverflow =\n (error instanceof RangeError && error.message.includes('Maximum call stack')) ||\n message.includes('maximum call stack');\n if (\n isStackOverflow ||\n message.includes('circular') ||\n message.includes('cyclic') ||\n message.includes('cannot inject the dependency')\n ) {\n const cycle = [...resolutionStack, tokenName];\n throw new CircularDependencyError(cycle);\n }\n\n throw error;\n } finally {\n resolutionStack.clear();\n for (const name of stackSnapshot) resolutionStack.add(name);\n }\n },\n\n async resolveAsync<T>(token: Token<T>): Promise<T> {\n if (bootstrappedValues.has(token)) {\n return bootstrappedValues.get(token) as T;\n }\n const result = wrapper.resolve<T | Promise<T>>(token);\n return await result;\n },\n\n async bootstrap(): Promise<void> {\n // Re-runnable by design: the global container can be shared across multiple apps\n // / registration cycles in one process (createApp + registerControllers reuse), so\n // bootstrap() must stay idempotent AND keep processing factories registered after\n // an earlier bootstrap(). We therefore DO NOT clear factoryTokens — already\n // bootstrapped factories are skipped via the bootstrappedValues cache, and any\n // factory whose cache was dropped (clearInstances) or registered later is\n // (re-)resolved on the next call. Iterate a snapshot so a factory that registers\n // another factory during resolution cannot mutate the set mid-iteration.\n for (const token of [...factoryTokens]) {\n if (bootstrappedValues.has(token)) continue;\n const result = wrapper.resolve<unknown>(token);\n const value = result instanceof Promise ? await result : result;\n bootstrappedValues.set(token, value);\n }\n },\n\n resolveAll<T>(token: Token<T>): T[] {\n const tsyToken = token as InjectionToken<T>;\n try {\n return tsyInstance.resolveAll<T>(tsyToken);\n } catch (error: unknown) {\n // Only swallow \"unregistered\" errors — token genuinely has no registrations\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('unregistered')) {\n return [];\n }\n throw error;\n }\n },\n\n isRegistered<T>(token: Token<T>): boolean {\n const tsyToken = token as InjectionToken<T>;\n return tsyInstance.isRegistered(tsyToken);\n },\n\n clearInstances(): void {\n tsyInstance.clearInstances();\n bootstrappedValues.clear();\n },\n\n reset(): void {\n tsyInstance.reset();\n bootstrappedValues.clear();\n factoryTokens.clear();\n resolutionStack.clear();\n guardedTokens.clear();\n },\n\n createChild(): Container {\n const childTsy = tsyInstance.createChildContainer();\n return createContainerWrapper(childTsy, {\n resolutionStack,\n factoryTokens,\n bootstrappedValues,\n guardedTokens,\n });\n },\n };\n\n return wrapper;\n}\n\n/**\n * The global DI container instance.\n *\n * Use this for registering and resolving dependencies throughout your application.\n *\n * @example\n * ```typescript\n * // Register a service\n * container.register(UserService, { useClass: UserService });\n *\n * // Resolve a service\n * const userService = container.resolve(UserService);\n *\n * // Register with value\n * container.register('CONFIG', { useValue: { port: 8080 } });\n * ```\n */\nexport const container: Container = createContainerWrapper(tsyContainer);\n\n/**\n * Create a new isolated container.\n *\n * Useful for testing or creating scoped containers.\n * Note: Creates a child container from the global tsyringe container.\n * For truly isolated containers, reset the child before use.\n *\n * @example\n * ```typescript\n * const testContainer = createContainer();\n * testContainer.register(UserService, { useClass: MockUserService });\n * ```\n */\nexport function createContainer(): Container {\n const childTsy = tsyContainer.createChildContainer();\n childTsy.reset();\n return createContainerWrapper(childTsy);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextrush/di",
3
- "version": "3.0.6",
3
+ "version": "4.0.0-beta.0",
4
4
  "description": "Lightweight dependency injection container for NextRush",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,14 +18,14 @@
18
18
  ],
19
19
  "dependencies": {
20
20
  "reflect-metadata": "^0.2.2",
21
- "tsyringe": "^4.10.0"
21
+ "tsyringe": "^4.10.0",
22
+ "@nextrush/types": "4.0.0-beta.0"
22
23
  },
23
24
  "devDependencies": {
24
25
  "rimraf": "^6.1.3",
25
26
  "tsup": "^8.5.1",
26
- "typescript": "^6.0.2",
27
- "vitest": "^4.1.4",
28
- "@nextrush/types": "3.0.6"
27
+ "typescript": "^6.0.3",
28
+ "vitest": "^4.1.10"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "typescript": ">=5.0.0"