{"version":3,"sources":["../../src/schema/typedef-registry.ts"],"sourcesContent":["import InternetObjectError  from '../errors/io-error';\r\nimport ErrorCodes           from '../errors/io-error-codes';\r\nimport TypeDef              from './typedef';\r\n\r\ninterface TypeDefConstructor {\r\n  new(type: string): TypeDef;\r\n  types: string[];\r\n}\r\n\r\nexport default class TypedefRegistry {\r\n  private static readonly typeDefMap = new Map<string, TypeDef>();\r\n  private static readonly typeNames = new Set<string>();\r\n  private static warnDuplicates = false;\r\n  private static warnedDuplicateTypes = new Set<string>();\r\n\r\n  /**\r\n   * Enable/disable console warnings on duplicate type registrations.\r\n   * Default is disabled to avoid noise and performance overhead in hot paths/tests.\r\n   */\r\n  public static setWarnOnDuplicates(enable: boolean): void {\r\n    this.warnDuplicates = enable;\r\n  }\r\n\r\n  /**\r\n   * Registers TypeDef constructors for the specified types.\r\n   * @param typeDefConstructors The TypeDef constructor classes\r\n   */\r\n  public static register(...typeDefConstructors: TypeDefConstructor[]): void {\r\n    for (const Constructor of typeDefConstructors) {\r\n      for (const type of Constructor.types) {\r\n        if (this.typeDefMap.has(type)) {\r\n          if (this.warnDuplicates && !this.warnedDuplicateTypes.has(type)) {\r\n            console.warn(`TypeDef for '${type}' is already registered. Skipping.`);\r\n            this.warnedDuplicateTypes.add(type);\r\n          }\r\n          continue;\r\n        }\r\n\r\n        this.typeDefMap.set(type, new Constructor(type));\r\n        this.typeNames.add(type);\r\n      }\r\n    }\r\n  }  /**\r\n   * Unregisters the specified type from the registry.\r\n   * @param type The type name to unregister\r\n   */\r\n  public static unregister(type: string): void {\r\n    if (this.typeDefMap.has(type)) {\r\n      this.typeDefMap.delete(type);\r\n      this.typeNames.delete(type);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Gets the array of registered type names.\r\n   */\r\n  public static get types(): readonly string[] {\r\n    return Object.freeze(Array.from(this.typeNames));\r\n  }\r\n\r\n  /**\r\n   * Returns the associated TypeDef object for the specified type.\r\n   * @param type The registered type name\r\n   * @throws {InternetObjectError} When the type is not registered\r\n   */\r\n  public static get(type: string): TypeDef {\r\n    const typeDef = this.typeDefMap.get(type);\r\n    if (!typeDef) {\r\n      throw new InternetObjectError(ErrorCodes.invalidType, `Type '${type}' is not registered`);\r\n    }\r\n    return typeDef;\r\n  }\r\n\r\n  /**\r\n   * Checks if the specified type is registered.\r\n   * @param typeName The type name to check\r\n   */\r\n  public static isRegisteredType(typeName: string): boolean {\r\n    return this.typeDefMap.has(typeName);\r\n  }\r\n\r\n  /**\r\n   * Clears all registered types. Primarily for testing.\r\n   */\r\n  public static clear(): void {\r\n    this.typeDefMap.clear();\r\n    this.typeNames.clear();\r\n  this.warnedDuplicateTypes.clear();\r\n  }\r\n\r\n  /**\r\n   * Gets the count of registered types.\r\n   */\r\n  public static get count(): number {\r\n    return this.typeDefMap.size;\r\n  }\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAiC;AACjC,4BAAiC;AAQjC,MAAO,gBAA8B;AAAA,EACnC,OAAwB,aAAa,oBAAI,IAAqB;AAAA,EAC9D,OAAwB,YAAY,oBAAI,IAAY;AAAA,EACpD,OAAe,iBAAiB;AAAA,EAChC,OAAe,uBAAuB,oBAAI,IAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtD,OAAc,oBAAoB,QAAuB;AACvD,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAc,YAAY,qBAAiD;AACzE,eAAW,eAAe,qBAAqB;AAC7C,iBAAW,QAAQ,YAAY,OAAO;AACpC,YAAI,KAAK,WAAW,IAAI,IAAI,GAAG;AAC7B,cAAI,KAAK,kBAAkB,CAAC,KAAK,qBAAqB,IAAI,IAAI,GAAG;AAC/D,oBAAQ,KAAK,gBAAgB,IAAI,oCAAoC;AACrE,iBAAK,qBAAqB,IAAI,IAAI;AAAA,UACpC;AACA;AAAA,QACF;AAEA,aAAK,WAAW,IAAI,MAAM,IAAI,YAAY,IAAI,CAAC;AAC/C,aAAK,UAAU,IAAI,IAAI;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAIA,OAAc,WAAW,MAAoB;AAC3C,QAAI,KAAK,WAAW,IAAI,IAAI,GAAG;AAC7B,WAAK,WAAW,OAAO,IAAI;AAC3B,WAAK,UAAU,OAAO,IAAI;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAkB,QAA2B;AAC3C,WAAO,OAAO,OAAO,MAAM,KAAK,KAAK,SAAS,CAAC;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,IAAI,MAAuB;AACvC,UAAM,UAAU,KAAK,WAAW,IAAI,IAAI;AACxC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,gBAAAA,QAAoB,sBAAAC,QAAW,aAAa,SAAS,IAAI,qBAAqB;AAAA,IAC1F;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAc,iBAAiB,UAA2B;AACxD,WAAO,KAAK,WAAW,IAAI,QAAQ;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,QAAc;AAC1B,SAAK,WAAW,MAAM;AACtB,SAAK,UAAU,MAAM;AACvB,SAAK,qBAAqB,MAAM;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAkB,QAAgB;AAChC,WAAO,KAAK,WAAW;AAAA,EACzB;AACF;","names":["InternetObjectError","ErrorCodes"]}