{"version":3,"file":"token-resolver.mjs","names":["DIError","BoundInjectionToken","FactoryInjectionToken","getInjectableToken","TokenResolver","logger","normalizeToken","token","getRealToken","getRegistryToken","validateAndResolveTokenArgs","args","actualToken","realArgs","value","resolved","factoryTokenNotResolved","name","schema","undefined","validatedArgs","safeParse","success","error","toString","tokenValidationError","data"],"sources":["../../../../src/internal/core/token-resolver.mts"],"sourcesContent":["import type {\n  AnyInjectableType,\n  InjectionTokenType,\n} from '../../token/injection-token.mjs'\n\nimport { DIError } from '../../errors/index.mjs'\nimport {\n  BoundInjectionToken,\n  FactoryInjectionToken,\n  InjectionToken,\n} from '../../token/injection-token.mjs'\nimport { getInjectableToken } from '../../utils/index.mjs'\n\n/**\n * Handles token validation and resolution.\n *\n * Focuses on token validation, normalization, and argument validation.\n * Name generation is handled by NameResolver.\n */\nexport class TokenResolver {\n  constructor(private readonly logger: Console | null = null) {}\n\n  // ============================================================================\n  // TOKEN NORMALIZATION\n  // ============================================================================\n\n  /**\n   * Normalizes a token to an InjectionToken.\n   * Handles class constructors by getting their injectable token.\n   *\n   * @param token A class constructor, InjectionToken, BoundInjectionToken, or FactoryInjectionToken\n   * @returns The normalized InjectionTokenType\n   */\n  normalizeToken(token: AnyInjectableType): InjectionTokenType {\n    if (typeof token === 'function') {\n      return getInjectableToken(token)\n    }\n    return token as InjectionTokenType\n  }\n\n  /**\n   * Gets the underlying \"real\" token from wrapped tokens.\n   * For BoundInjectionToken and FactoryInjectionToken, returns the wrapped token.\n   * For other tokens, returns the token itself.\n   *\n   * @param token The token to unwrap\n   * @returns The underlying InjectionToken\n   */\n  getRealToken<T = unknown>(token: InjectionTokenType): InjectionToken<T> {\n    if (\n      token instanceof BoundInjectionToken ||\n      token instanceof FactoryInjectionToken\n    ) {\n      return token.token as InjectionToken<T>\n    }\n    return token as InjectionToken<T>\n  }\n\n  /**\n   * Convenience method that normalizes a token and then gets the real token.\n   * Useful for checking registry entries where you need the actual registered token.\n   *\n   * @param token Any injectable type\n   * @returns The underlying InjectionToken\n   */\n  getRegistryToken<T = unknown>(token: AnyInjectableType): InjectionToken<T> {\n    return this.getRealToken(this.normalizeToken(token))\n  }\n\n  // ============================================================================\n  // TOKEN VALIDATION\n  // ============================================================================\n\n  /**\n   * Validates and resolves token arguments, handling factory token resolution and validation.\n   *\n   * @param token The token to validate\n   * @param args Optional arguments\n   * @returns [error, { actualToken, validatedArgs }]\n   */\n  validateAndResolveTokenArgs(\n    token: AnyInjectableType,\n    args?: any,\n  ): [\n    DIError | undefined,\n    { actualToken: InjectionTokenType; validatedArgs?: any },\n  ] {\n    let actualToken = token as InjectionToken<any, any>\n    if (typeof token === 'function') {\n      actualToken = getInjectableToken(token)\n    }\n    let realArgs = args\n    if (actualToken instanceof BoundInjectionToken) {\n      realArgs = actualToken.value\n    } else if (actualToken instanceof FactoryInjectionToken) {\n      if (actualToken.resolved) {\n        realArgs = actualToken.value\n      } else {\n        return [DIError.factoryTokenNotResolved(token.name), { actualToken }]\n      }\n    }\n    if (!actualToken.schema) {\n      return [undefined, { actualToken, validatedArgs: realArgs }]\n    }\n    const validatedArgs = actualToken.schema?.safeParse(realArgs)\n    if (validatedArgs && !validatedArgs.success) {\n      this.logger?.error(\n        `[TokenResolver]#validateAndResolveTokenArgs(): Error validating args for ${actualToken.name.toString()}`,\n        validatedArgs.error,\n      )\n      return [\n        DIError.tokenValidationError(\n          `Validation failed for ${actualToken.name.toString()}`,\n          actualToken.schema,\n          realArgs,\n        ),\n        { actualToken },\n      ]\n    }\n    return [undefined, { actualToken, validatedArgs: validatedArgs?.data }]\n  }\n}\n"],"mappings":";;;;;;;;;;GAmBA,IAAaI,gBAAb,MAAaA;;CACX,YAAY,SAA0C,MAAM;OAA/BC,SAAAA;;;;;;;;IAa7BC,eAAeC,OAA8C;AAC3D,MAAI,OAAOA,UAAU,WACnB,QAAOJ,mBAAmBI,MAAAA;AAE5B,SAAOA;;;;;;;;;IAWTC,aAA0BD,OAA8C;AACtE,MACEA,iBAAiBN,uBACjBM,iBAAiBL,sBAEjB,QAAOK,MAAMA;AAEf,SAAOA;;;;;;;;IAUTE,iBAA8BF,OAA6C;AACzE,SAAO,KAAKC,aAAa,KAAKF,eAAeC,MAAAA,CAAAA;;;;;;;;IAc/CG,4BACEH,OACAI,MAIA;EACA,IAAIC,cAAcL;AAClB,MAAI,OAAOA,UAAU,WACnBK,eAAcT,mBAAmBI,MAAAA;EAEnC,IAAIM,WAAWF;AACf,MAAIC,uBAAuBX,oBACzBY,YAAWD,YAAYE;WACdF,uBAAuBV,sBAChC,KAAIU,YAAYG,SACdF,YAAWD,YAAYE;MAEvB,QAAO,CAACd,QAAQgB,wBAAwBT,MAAMU,KAAI,EAAG,EAAEL,aAAY,CAAE;AAGzE,MAAI,CAACA,YAAYM,OACf,QAAO,CAACC,QAAW;GAAEP;GAAaQ,eAAeP;GAAS,CAAE;EAE9D,MAAMO,gBAAgBR,YAAYM,QAAQG,UAAUR,SAAAA;AACpD,MAAIO,iBAAiB,CAACA,cAAcE,SAAS;AAC3C,QAAKjB,QAAQkB,MACX,4EAA4EX,YAAYK,KAAKO,UAAQ,IACrGJ,cAAcG,MAAK;AAErB,UAAO,CACLvB,QAAQyB,qBACN,yBAAyBb,YAAYK,KAAKO,UAAQ,IAClDZ,YAAYM,QACZL,SAAAA,EAEF,EAAED,aAAY,CACf;;AAEH,SAAO,CAACO,QAAW;GAAEP;GAAaQ,eAAeA,eAAeM;GAAK,CAAE"}