{
  "version": 3,
  "sources": ["../src/symbol/classes/usecase-symbol.class.ts"],
  "sourcesContent": ["import { get, set } from '@dikolab/private-parts';\nimport { SYMBOL_LOOKUP } from '../constants/symbol-lookup.constant';\nimport type {\n   UsecaseSymbolLike,\n   UsecaseSymbolModel,\n} from '../types/usecase-symbol-model.interface';\nimport {\n   ID_KEY,\n   NAME_KEY,\n   TYPE_KEY,\n} from '../../utils/constants/symbol-keys.constant';\nimport type { UsecaseSymbolJSON } from '../types/usecase-symbol-json.interface';\nimport type { UsecaseSymbolId } from '../types/utility.type';\nimport { createSymbolId } from '../functions/create-symbol-id.function';\nimport { EVENT_EMITTER_KEY } from '../../event/constants/event-keys';\nimport EventEmitter from 'events';\nimport type {\n   AnyEventMap,\n   DefaultEventMap,\n} from '../../event/types/event-map.type';\n\n/**\n * Abstract base for all use case domain symbols\n * (actors, roles, boundaries, goals, use cases)\n */\nexport abstract class UsecaseSymbol<\n      Type extends string,\n      Name extends string,\n      EventMap extends AnyEventMap = DefaultEventMap,\n   >\n   implements\n      UsecaseSymbolModel<Type, Name, EventMap>,\n      UsecaseSymbolJSON<Type, Name>\n{\n   get [TYPE_KEY](): Type {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n      return get(this, TYPE_KEY);\n   }\n\n   get [NAME_KEY](): Name {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n      return get(this, NAME_KEY);\n   }\n\n   get [ID_KEY](): UsecaseSymbolId<Type, Name> {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n      return get(this, ID_KEY);\n   }\n\n   get [EVENT_EMITTER_KEY](): EventEmitter<EventMap> {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n      return get(this, EVENT_EMITTER_KEY);\n   }\n\n   constructor(type: Type, name: Name) {\n      const id = createSymbolId(type, name);\n\n      // symbols are unique\n      if (SYMBOL_LOOKUP.has(id)) {\n         throw new ReferenceError(`Symbol ${id} already exist.`);\n      }\n\n      set(\n         this,\n         EVENT_EMITTER_KEY,\n         new EventEmitter({\n            captureRejections: true,\n         }),\n      );\n      set(this, TYPE_KEY, type);\n      set(this, NAME_KEY, name);\n      set(this, ID_KEY, id);\n\n      // register to symbol lookup\n      SYMBOL_LOOKUP.set(id, this as UsecaseSymbolLike);\n   }\n\n   /** Returns the symbol's unique identifier */\n   toString() {\n      return this[ID_KEY] as string;\n   }\n\n   /** Returns a plain object with type and name */\n   toJSON() {\n      return {\n         type: this[TYPE_KEY],\n         name: this[NAME_KEY],\n      };\n   }\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;AAAA,SAAS,KAAK,WAAW;AAezB,OAAO,kBAAkB;AAUlB,IAAe,gBAAf,MAQP;AAAA,EACG,KAAK,QAAQ,IAAU;AAEpB,WAAO,IAAI,MAAM,QAAQ;AAAA,EAC5B;AAAA,EAEA,KAAK,QAAQ,IAAU;AAEpB,WAAO,IAAI,MAAM,QAAQ;AAAA,EAC5B;AAAA,EAEA,KAAK,MAAM,IAAiC;AAEzC,WAAO,IAAI,MAAM,MAAM;AAAA,EAC1B;AAAA,EAEA,KAAK,iBAAiB,IAA4B;AAE/C,WAAO,IAAI,MAAM,iBAAiB;AAAA,EACrC;AAAA,EAEA,YAAY,MAAY,MAAY;AACjC,UAAM,KAAK,eAAe,MAAM,IAAI;AAGpC,QAAI,cAAc,IAAI,EAAE,GAAG;AACxB,YAAM,IAAI,eAAe,UAAU,EAAE,iBAAiB;AAAA,IACzD;AAEA;AAAA,MACG;AAAA,MACA;AAAA,MACA,IAAI,aAAa;AAAA,QACd,mBAAmB;AAAA,MACtB,CAAC;AAAA,IACJ;AACA,QAAI,MAAM,UAAU,IAAI;AACxB,QAAI,MAAM,UAAU,IAAI;AACxB,QAAI,MAAM,QAAQ,EAAE;AAGpB,kBAAc,IAAI,IAAI,IAAyB;AAAA,EAClD;AAAA;AAAA,EAGA,WAAW;AACR,WAAO,KAAK,MAAM;AAAA,EACrB;AAAA;AAAA,EAGA,SAAS;AACN,WAAO;AAAA,MACJ,MAAM,KAAK,QAAQ;AAAA,MACnB,MAAM,KAAK,QAAQ;AAAA,IACtB;AAAA,EACH;AACH;",
  "names": []
}
