{"version":3,"file":"index.mjs","names":[],"sources":["../src/core/annotation/deps.ts","../src/core/annotation/metadata.ts","../src/core/annotation/annotation.ts","../src/core/token/token.ts"],"sourcesContent":["import type { Dependency, DepsMap } from \"../provider\";\n\nexport const tupleDepsToMap = (\n\tdeps: readonly Dependency<unknown>[],\n): DepsMap | undefined => {\n\tif (deps.length === 0) {\n\t\treturn undefined;\n\t}\n\n\treturn Object.fromEntries(deps.entries());\n};\n","import type { InjectableClass, InjectableOptions } from \"./types\";\n\ntype InjectableMetadata = InjectableOptions<unknown>;\n\nconst injectableMetadata = new WeakMap<InjectableClass, InjectableMetadata>();\n\nexport const getInjectableMetadata = (\n\ttarget: InjectableClass,\n): InjectableMetadata | undefined => injectableMetadata.get(target);\n\nexport const setInjectableMetadata = <T>(options: {\n\treadonly target: InjectableClass<T>;\n\treadonly metadata: InjectableOptions<T>;\n}): void => {\n\tinjectableMetadata.set(\n\t\toptions.target,\n\t\toptions.metadata as InjectableOptions<unknown>,\n\t);\n};\n","import {\n\ttype Dependency,\n\ttype DepsMap,\n\ttype DisposeHook,\n\ttype FactoryProvider,\n\tInvalidProviderError,\n\tprovideFactory,\n\ttype ResolveDeps,\n} from \"../provider\";\nimport type { Token } from \"../token\";\nimport { tupleDepsToMap } from \"./deps\";\nimport { getInjectableMetadata, setInjectableMetadata } from \"./metadata\";\nimport type {\n\tInjectableClass,\n\tInjectableConstructor,\n\tInjectableOptions,\n} from \"./types\";\n\ntype Constructable<T> = new (...args: unknown[]) => T;\ntype InjectableDecorator<TTarget> = (\n\ttarget: TTarget,\n\tcontext: ClassDecoratorContext,\n) => void;\n\ntype InjectableOptionsWithoutDeps<T> = Omit<\n\tInjectableOptions<T, readonly []>,\n\t\"deps\"\n>;\n\nconst ANONYMOUS_CLASS_NAME = \"<anonymous>\";\n\nconst assertClassDecorator = (options: {\n\treadonly target: InjectableClass;\n\treadonly context: ClassDecoratorContext;\n}): void => {\n\tconst { context, target } = options;\n\tconst isClassDecorator =\n\t\tcontext.kind === \"class\" && typeof target === \"function\";\n\n\tif (!isClassDecorator) {\n\t\tthrow new InvalidProviderError(\"@Injectable can only decorate classes\");\n\t}\n};\n\n// Overloads keep constructor parameters aligned with explicit deps. The single\n// runtime implementation is below.\nexport function Injectable<\n\tT,\n\tconst TDeps extends readonly Dependency<unknown>[],\n>(\n\toptions: InjectableOptions<T, TDeps> & { readonly deps: TDeps },\n): InjectableDecorator<InjectableConstructor<T, TDeps>>;\n\nexport function Injectable<T>(\n\toptions: InjectableOptionsWithoutDeps<T>,\n): InjectableDecorator<InjectableConstructor<T, readonly []>>;\n/**\n * Marks a class as an injectable provider for a token.\n *\n * Dependencies are explicit and ordered by constructor parameter position. No\n * `reflect-metadata`, parameter decorators, or global container are used.\n *\n * @example\n * ```ts\n * @Injectable({ token: USER_SERVICE, deps: [LOGGER] })\n * class UserService {\n *   private readonly logger: Logger;\n *\n *   constructor(logger: Logger) {\n *     this.logger = logger;\n *   }\n * }\n * ```\n */\nexport function Injectable<T>(\n\toptions: InjectableOptions<T>,\n): InjectableDecorator<InjectableClass<T>> {\n\treturn (target: InjectableClass<T>, context: ClassDecoratorContext): void => {\n\t\tassertClassDecorator({ target, context });\n\t\tsetInjectableMetadata({ target, metadata: options });\n\t};\n}\n\n/**\n * Creates a factory provider from a class marked with `@Injectable`.\n *\n * The returned provider is a normal di-craft factory provider, so scopes,\n * optional dependencies, disposal hooks, overrides, and cycle detection behave\n * the same as with `provideFactory`.\n */\nexport function provideInjectable<T>(\n\ttarget: InjectableClass<T>,\n): FactoryProvider<T, DepsMap> {\n\tconst metadata = getInjectableMetadata(target);\n\n\tif (!metadata) {\n\t\tconst className = target.name || ANONYMOUS_CLASS_NAME;\n\n\t\tthrow new InvalidProviderError(\n\t\t\t`Class \"${className}\" is not marked as injectable. Add @Injectable({ token: TOKEN }) before calling provideInjectable().`,\n\t\t);\n\t}\n\n\tconst { deps = [], onDispose, scope, token } = metadata;\n\tconst depsMap = tupleDepsToMap(deps);\n\tconst Constructor = target as unknown as Constructable<T>;\n\n\tconst useFactory = (resolvedDeps: ResolveDeps<DepsMap>): T => {\n\t\tconst args = deps.map((_, index): unknown => resolvedDeps[String(index)]);\n\n\t\treturn new Constructor(...args);\n\t};\n\n\treturn provideFactory(token as Token<T>, {\n\t\tuseFactory,\n\t\t...(depsMap ? { deps: depsMap } : {}),\n\t\t...(scope ? { scope } : {}),\n\t\t...(onDispose ? { onDispose: onDispose as DisposeHook<T> } : {}),\n\t});\n}\n","import type { Token } from \"./types\";\n\nclass TokenClass<T> implements Token<T> {\n\treadonly name: string;\n\treadonly id: symbol;\n\n\tdeclare readonly __type?: T;\n\n\tconstructor(name: string) {\n\t\tthis.name = name;\n\t\tthis.id = Symbol(name);\n\t}\n}\n\n/**\n * Creates a unique typed token.\n *\n * The `name` is used only for diagnostics. Token identity is unique per call,\n * so two tokens with the same name do not collide.\n *\n * @example\n * ```ts\n * const CONFIG = createToken<Config>(\"config\");\n * ```\n */\nexport const createToken = <T>(name: string): Token<T> =>\n\tnew TokenClass<T>(name);\n"],"mappings":";;;AAEA,MAAa,kBACZ,SACyB;CACzB,IAAI,KAAK,WAAW,GACnB;CAGD,OAAO,OAAO,YAAY,KAAK,QAAQ,CAAC;AACzC;;;;ACNA,MAAM,qCAAqB,IAAI,QAA6C;AAE5E,MAAa,yBACZ,WACoC,mBAAmB,IAAI,MAAM;AAElE,MAAa,yBAA4B,YAG7B;CACX,mBAAmB,IAClB,QAAQ,QACR,QAAQ,QACT;AACD;;;;ACWA,MAAM,uBAAuB;AAE7B,MAAM,wBAAwB,YAGlB;CACX,MAAM,EAAE,SAAS,WAAW;CAI5B,IAAI,EAFH,QAAQ,SAAS,WAAW,OAAO,WAAW,aAG9C,MAAM,IAAI,qBAAqB,uCAAuC;AAExE;;;;;;;;;;;;;;;;;;;AAgCA,SAAgB,WACf,SAC0C;CAC1C,QAAQ,QAA4B,YAAyC;EAC5E,qBAAqB;GAAE;GAAQ;EAAQ,CAAC;EACxC,sBAAsB;GAAE;GAAQ,UAAU;EAAQ,CAAC;CACpD;AACD;;;;;;;;AASA,SAAgB,kBACf,QAC8B;CAC9B,MAAM,WAAW,sBAAsB,MAAM;CAE7C,IAAI,CAAC,UAGJ,MAAM,IAAI,qBACT,UAHiB,OAAO,QAAQ,qBAGZ,qGACrB;CAGD,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,OAAO,UAAU;CAC/C,MAAM,UAAU,eAAe,IAAI;CACnC,MAAM,cAAc;CAEpB,MAAM,cAAc,iBAA0C;EAC7D,MAAM,OAAO,KAAK,KAAK,GAAG,UAAmB,aAAa,OAAO,KAAK,EAAE;EAExE,OAAO,IAAI,YAAY,GAAG,IAAI;CAC/B;CAEA,OAAO,eAAe,OAAmB;EACxC;EACA,GAAI,UAAU,EAAE,MAAM,QAAQ,IAAI,CAAC;EACnC,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;EACzB,GAAI,YAAY,EAAa,UAA4B,IAAI,CAAC;CAC/D,CAAC;AACF;;;;ACrHA,IAAM,aAAN,MAAwC;CACvC,AAAS;CACT,AAAS;CAIT,YAAY,MAAc;EACzB,KAAK,OAAO;EACZ,KAAK,KAAK,OAAO,IAAI;CACtB;AACD;;;;;;;;;;;;AAaA,MAAa,eAAkB,SAC9B,IAAI,WAAc,IAAI"}