@sentzunhat/zacatl 0.0.25 → 0.0.26

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.
@@ -1,11 +1,12 @@
1
1
  import "reflect-metadata";
2
2
  import type { DependencyContainer, InjectionToken } from "tsyringe";
3
+ import type { Constructor } from "../service/architecture/architecture";
3
4
  export declare const getContainer: () => DependencyContainer;
4
5
  export declare const registerDependency: <T>(token: InjectionToken<T>, implementation: new (...args: unknown[]) => T) => void;
5
6
  export declare const registerSingleton: <T>(token: InjectionToken<T>, implementation: new (...args: unknown[]) => T) => void;
6
7
  export declare const registerValue: <T>(token: InjectionToken<T>, value: T) => void;
7
8
  export declare const resolveDependency: <T>(token: InjectionToken<T>) => T;
8
- export declare const registerWithDependencies: <T>(serviceClass: new (...args: unknown[]) => T, dependencies?: Array<new (...args: unknown[]) => unknown>) => void;
9
- export declare const registerSingletonWithDependencies: <T>(serviceClass: new (...args: unknown[]) => T, dependencies?: Array<new (...args: unknown[]) => unknown>) => void;
9
+ export declare const registerWithDependencies: <T extends object>(serviceClass: Constructor<T>, dependencies?: Constructor[]) => void;
10
+ export declare const registerSingletonWithDependencies: <T extends object>(serviceClass: Constructor<T>, dependencies?: Constructor[]) => void;
10
11
  export declare const clearContainer: () => void;
11
12
  //# sourceMappingURL=container.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"./src/","sources":["dependency-injection/container.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAiCpE,eAAO,MAAM,YAAY,QAAO,mBAE/B,CAAC;AAQF,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAClC,OAAO,cAAc,CAAC,CAAC,CAAC,EACxB,gBAAgB,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,KAC5C,IAEF,CAAC;AAQF,eAAO,MAAM,iBAAiB,GAAI,CAAC,EACjC,OAAO,cAAc,CAAC,CAAC,CAAC,EACxB,gBAAgB,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,KAC5C,IAEF,CAAC;AAQF,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAG,IAErE,CAAC;AAQF,eAAO,MAAM,iBAAiB,GAAI,CAAC,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,KAAG,CAE/D,CAAC;AAoBF,eAAO,MAAM,wBAAwB,GAAI,CAAC,EACxC,cAAc,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAC3C,eAAc,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAM,KAC5D,IAOF,CAAC;AAiBF,eAAO,MAAM,iCAAiC,GAAI,CAAC,EACjD,cAAc,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAC3C,eAAc,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAM,KAC5D,IAOF,CAAC;AAKF,eAAO,MAAM,cAAc,QAAO,IAGjC,CAAC"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"./src/","sources":["dependency-injection/container.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AA2CxE,eAAO,MAAM,YAAY,QAAO,mBAE/B,CAAC;AAQF,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAClC,OAAO,cAAc,CAAC,CAAC,CAAC,EACxB,gBAAgB,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,KAC5C,IAEF,CAAC;AAQF,eAAO,MAAM,iBAAiB,GAAI,CAAC,EACjC,OAAO,cAAc,CAAC,CAAC,CAAC,EACxB,gBAAgB,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,KAC5C,IAEF,CAAC;AAQF,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAG,IAErE,CAAC;AAQF,eAAO,MAAM,iBAAiB,GAAI,CAAC,EAAE,OAAO,cAAc,CAAC,CAAC,CAAC,KAAG,CAE/D,CAAC;AAoBF,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,MAAM,EACvD,cAAc,WAAW,CAAC,CAAC,CAAC,EAC5B,eAAc,WAAW,EAAO,KAC/B,IAmBF,CAAC;AAiBF,eAAO,MAAM,iCAAiC,GAAI,CAAC,SAAS,MAAM,EAChE,cAAc,WAAW,CAAC,CAAC,CAAC,EAC5B,eAAc,WAAW,EAAO,KAC/B,IA8BF,CAAC;AAKF,eAAO,MAAM,cAAc,QAAO,IAKjC,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import "reflect-metadata";
2
2
  import { container as tsyringeContainer } from "tsyringe";
3
+ const registeredClasses = new Set();
4
+ const singletonInstances = new Map();
3
5
  export const getContainer = () => {
4
6
  return tsyringeContainer;
5
7
  };
@@ -16,23 +18,42 @@ export const resolveDependency = (token) => {
16
18
  return tsyringeContainer.resolve(token);
17
19
  };
18
20
  export const registerWithDependencies = (serviceClass, dependencies = []) => {
21
+ registeredClasses.add(serviceClass);
19
22
  tsyringeContainer.register(serviceClass, {
20
- useFactory: (c) => {
21
- const resolvedDeps = dependencies.map((dep) => c.resolve(dep));
23
+ useFactory: () => {
24
+ const resolvedDeps = dependencies.map((dep) => {
25
+ if (!registeredClasses.has(dep)) {
26
+ throw new Error(`Dependency ${dep.name} not registered. Register it before ${serviceClass.name}.`);
27
+ }
28
+ return tsyringeContainer.resolve(dep);
29
+ });
22
30
  return new serviceClass(...resolvedDeps);
23
31
  },
24
32
  });
25
33
  };
26
34
  export const registerSingletonWithDependencies = (serviceClass, dependencies = []) => {
27
- tsyringeContainer.registerSingleton(serviceClass, {
28
- useFactory: (c) => {
29
- const resolvedDeps = dependencies.map((dep) => c.resolve(dep));
30
- return new serviceClass(...resolvedDeps);
35
+ registeredClasses.add(serviceClass);
36
+ tsyringeContainer.register(serviceClass, {
37
+ useFactory: () => {
38
+ if (singletonInstances.has(serviceClass)) {
39
+ return singletonInstances.get(serviceClass);
40
+ }
41
+ const resolvedDeps = dependencies.map((dep) => {
42
+ if (!registeredClasses.has(dep)) {
43
+ throw new Error(`Dependency ${dep.name} not registered. Register it before ${serviceClass.name}.`);
44
+ }
45
+ return tsyringeContainer.resolve(dep);
46
+ });
47
+ const instance = new serviceClass(...resolvedDeps);
48
+ singletonInstances.set(serviceClass, instance);
49
+ return instance;
31
50
  },
32
51
  });
33
52
  };
34
53
  export const clearContainer = () => {
35
54
  tsyringeContainer.clearInstances();
36
55
  tsyringeContainer.reset();
56
+ singletonInstances.clear();
57
+ registeredClasses.clear();
37
58
  };
38
59
  //# sourceMappingURL=container.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","sourceRoot":"./src/","sources":["dependency-injection/container.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAkC1D,MAAM,CAAC,MAAM,YAAY,GAAG,GAAwB,EAAE;IACpD,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAwB,EACxB,cAA6C,EACvC,EAAE;IACR,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;AAClE,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,KAAwB,EACxB,cAA6C,EACvC,EAAE;IACR,iBAAiB,CAAC,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AAC7D,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAI,KAAwB,EAAE,KAAQ,EAAQ,EAAE;IAC3E,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACzD,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAI,KAAwB,EAAK,EAAE;IAClE,OAAO,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC,CAAC;AAoBF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,YAA2C,EAC3C,eAA2D,EAAE,EACvD,EAAE;IACR,iBAAiB,CAAC,QAAQ,CAAC,YAAY,EAAE;QACvC,UAAU,EAAE,CAAC,CAAsB,EAAE,EAAE;YACrC,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,OAAO,IAAI,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC;QAC3C,CAAC;KACO,CAAC,CAAC;AACd,CAAC,CAAC;AAiBF,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,YAA2C,EAC3C,eAA2D,EAAE,EACvD,EAAE;IACR,iBAAiB,CAAC,iBAAiB,CAAC,YAAY,EAAE;QAChD,UAAU,EAAE,CAAC,CAAsB,EAAE,EAAE;YACrC,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,OAAO,IAAI,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC;QAC3C,CAAC;KACO,CAAC,CAAC;AACd,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAS,EAAE;IACvC,iBAAiB,CAAC,cAAc,EAAE,CAAC;IACnC,iBAAiB,CAAC,KAAK,EAAE,CAAC;AAC5B,CAAC,CAAC","sourcesContent":["import \"reflect-metadata\";\nimport { container as tsyringeContainer } from \"tsyringe\";\nimport type { DependencyContainer, InjectionToken } from \"tsyringe\";\n\n/**\n * Standalone DI container decoupled from microservice architecture.\n * Automatically used by Service architecture - typically no manual registration needed.\n *\n * For advanced use cases, you can register dependencies manually:\n *\n * @example\n * ```typescript\n * import { registerDependency, resolveDependency } from '@sentzunhat/zacatl';\n *\n * // Manual registration (advanced use case)\n * class CustomService { ... }\n * registerDependency('CustomService', CustomService);\n *\n * // Resolve manually\n * const service = resolveDependency<CustomService>('CustomService');\n * ```\n *\n * Preferred approach (automatic registration through Service):\n * ```typescript\n * const service = new Service({\n * architecture: {\n * domain: { providers: [CustomService] }\n * }\n * });\n * ```\n */\n\n/**\n * Get the global DI container instance\n */\nexport const getContainer = (): DependencyContainer => {\n return tsyringeContainer;\n};\n\n/**\n * Register a dependency in the container\n *\n * @param token - Unique identifier for the dependency\n * @param implementation - Class or value to register\n */\nexport const registerDependency = <T>(\n token: InjectionToken<T>,\n implementation: new (...args: unknown[]) => T,\n): void => {\n tsyringeContainer.register(token, { useClass: implementation });\n};\n\n/**\n * Register a singleton dependency (shared instance)\n *\n * @param token - Unique identifier for the dependency\n * @param implementation - Class to register as singleton\n */\nexport const registerSingleton = <T>(\n token: InjectionToken<T>,\n implementation: new (...args: unknown[]) => T,\n): void => {\n tsyringeContainer.registerSingleton(token, implementation);\n};\n\n/**\n * Register a value (instance) in the container\n *\n * @param token - Unique identifier for the dependency\n * @param value - Instance to register\n */\nexport const registerValue = <T>(token: InjectionToken<T>, value: T): void => {\n tsyringeContainer.register(token, { useValue: value });\n};\n\n/**\n * Resolve a dependency from the container\n *\n * @param token - Unique identifier for the dependency\n * @returns Resolved instance\n */\nexport const resolveDependency = <T>(token: InjectionToken<T>): T => {\n return tsyringeContainer.resolve(token);\n};\n\n/**\n * Register a dependency with explicit dependencies (no decorator metadata required)\n * Useful for tsx/ts-node/ESM environments where decorator metadata is not available\n *\n * @param serviceClass - Class to register\n * @param dependencies - Array of dependency classes to inject (in constructor order)\n *\n * @example\n * ```typescript\n * import { registerWithDependencies } from '@sentzunhat/zacatl';\n *\n * // Register with no deps\n * registerWithDependencies(MachineRepository, []);\n *\n * // Register with explicit deps\n * registerWithDependencies(MachineService, [MachineRepository]);\n * ```\n */\nexport const registerWithDependencies = <T>(\n serviceClass: new (...args: unknown[]) => T,\n dependencies: Array<new (...args: unknown[]) => unknown> = [],\n): void => {\n tsyringeContainer.register(serviceClass, {\n useFactory: (c: DependencyContainer) => {\n const resolvedDeps = dependencies.map((dep) => c.resolve(dep));\n return new serviceClass(...resolvedDeps);\n },\n } as never);\n};\n\n/**\n * Register a singleton with explicit dependencies (no decorator metadata required)\n * Useful for tsx/ts-node/ESM environments where decorator metadata is not available\n *\n * @param serviceClass - Class to register as singleton\n * @param dependencies - Array of dependency classes to inject (in constructor order)\n *\n * @example\n * ```typescript\n * import { registerSingletonWithDependencies } from '@sentzunhat/zacatl';\n *\n * // Register singleton with deps\n * registerSingletonWithDependencies(MachineService, [MachineRepository]);\n * ```\n */\nexport const registerSingletonWithDependencies = <T>(\n serviceClass: new (...args: unknown[]) => T,\n dependencies: Array<new (...args: unknown[]) => unknown> = [],\n): void => {\n tsyringeContainer.registerSingleton(serviceClass, {\n useFactory: (c: DependencyContainer) => {\n const resolvedDeps = dependencies.map((dep) => c.resolve(dep));\n return new serviceClass(...resolvedDeps);\n },\n } as never);\n};\n\n/**\n * Clear all registrations (useful for testing)\n */\nexport const clearContainer = (): void => {\n tsyringeContainer.clearInstances();\n tsyringeContainer.reset();\n};\n"]}
1
+ {"version":3,"file":"container.js","sourceRoot":"./src/","sources":["dependency-injection/container.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAO1D,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAe,CAAC;AAKjD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAC;AAiC1D,MAAM,CAAC,MAAM,YAAY,GAAG,GAAwB,EAAE;IACpD,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAwB,EACxB,cAA6C,EACvC,EAAE;IACR,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;AAClE,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,KAAwB,EACxB,cAA6C,EACvC,EAAE;IACR,iBAAiB,CAAC,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AAC7D,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAI,KAAwB,EAAE,KAAQ,EAAQ,EAAE;IAC3E,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACzD,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAI,KAAwB,EAAK,EAAE;IAClE,OAAO,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC,CAAC;AAoBF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,YAA4B,EAC5B,eAA8B,EAAE,EAC1B,EAAE;IAER,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEpC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,EAAE;QACvC,UAAU,EAAE,GAAG,EAAE;YACf,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBAE5C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChC,MAAM,IAAI,KAAK,CACb,cAAc,GAAG,CAAC,IAAI,uCAAuC,YAAY,CAAC,IAAI,GAAG,CAClF,CAAC;gBACJ,CAAC;gBAED,OAAO,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC;QAC3C,CAAC;KACO,CAAC,CAAC;AACd,CAAC,CAAC;AAiBF,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,YAA4B,EAC5B,eAA8B,EAAE,EAC1B,EAAE;IAER,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAGpC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,EAAE;QACvC,UAAU,EAAE,GAAG,EAAE;YAEf,IAAI,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBACzC,OAAO,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAM,CAAC;YACnD,CAAC;YAGD,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBAE5C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChC,MAAM,IAAI,KAAK,CACb,cAAc,GAAG,CAAC,IAAI,uCAAuC,YAAY,CAAC,IAAI,GAAG,CAClF,CAAC;gBACJ,CAAC;gBAED,OAAO,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC;YAGnD,kBAAkB,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YAC/C,OAAO,QAAQ,CAAC;QAClB,CAAC;KACO,CAAC,CAAC;AACd,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAS,EAAE;IACvC,iBAAiB,CAAC,cAAc,EAAE,CAAC;IACnC,iBAAiB,CAAC,KAAK,EAAE,CAAC;IAC1B,kBAAkB,CAAC,KAAK,EAAE,CAAC;IAC3B,iBAAiB,CAAC,KAAK,EAAE,CAAC;AAC5B,CAAC,CAAC","sourcesContent":["import \"reflect-metadata\";\nimport { container as tsyringeContainer } from \"tsyringe\";\nimport type { DependencyContainer, InjectionToken } from \"tsyringe\";\nimport type { Constructor } from \"../service/architecture/architecture\";\n\n/**\n * Track registered classes to avoid requiring decorator metadata\n */\nconst registeredClasses = new Set<Constructor>();\n\n/**\n * Cache for singleton instances\n */\nconst singletonInstances = new Map<Constructor, object>();\n\n/**\n * Standalone DI container decoupled from microservice architecture.\n * Automatically used by Service architecture - typically no manual registration needed.\n *\n * For advanced use cases, you can register dependencies manually:\n *\n * @example\n * ```typescript\n * import { registerDependency, resolveDependency } from '@sentzunhat/zacatl';\n *\n * // Manual registration (advanced use case)\n * class CustomService { ... }\n * registerDependency('CustomService', CustomService);\n *\n * // Resolve manually\n * const service = resolveDependency<CustomService>('CustomService');\n * ```\n *\n * Preferred approach (automatic registration through Service):\n * ```typescript\n * const service = new Service({\n * architecture: {\n * domain: { providers: [CustomService] }\n * }\n * });\n * ```\n */\n\n/**\n * Get the global DI container instance\n */\nexport const getContainer = (): DependencyContainer => {\n return tsyringeContainer;\n};\n\n/**\n * Register a dependency in the container\n *\n * @param token - Unique identifier for the dependency\n * @param implementation - Class or value to register\n */\nexport const registerDependency = <T>(\n token: InjectionToken<T>,\n implementation: new (...args: unknown[]) => T,\n): void => {\n tsyringeContainer.register(token, { useClass: implementation });\n};\n\n/**\n * Register a singleton dependency (shared instance)\n *\n * @param token - Unique identifier for the dependency\n * @param implementation - Class to register as singleton\n */\nexport const registerSingleton = <T>(\n token: InjectionToken<T>,\n implementation: new (...args: unknown[]) => T,\n): void => {\n tsyringeContainer.registerSingleton(token, implementation);\n};\n\n/**\n * Register a value (instance) in the container\n *\n * @param token - Unique identifier for the dependency\n * @param value - Instance to register\n */\nexport const registerValue = <T>(token: InjectionToken<T>, value: T): void => {\n tsyringeContainer.register(token, { useValue: value });\n};\n\n/**\n * Resolve a dependency from the container\n *\n * @param token - Unique identifier for the dependency\n * @returns Resolved instance\n */\nexport const resolveDependency = <T>(token: InjectionToken<T>): T => {\n return tsyringeContainer.resolve(token);\n};\n\n/**\n * Register a dependency with explicit dependencies (no decorator metadata required)\n * Useful for tsx/ts-node/ESM environments where decorator metadata is not available\n *\n * @param serviceClass - Class to register\n * @param dependencies - Array of dependency classes to inject (in constructor order)\n *\n * @example\n * ```typescript\n * import { registerWithDependencies } from '@sentzunhat/zacatl';\n *\n * // Register with no deps\n * registerWithDependencies(MachineRepository, []);\n *\n * // Register with explicit deps\n * registerWithDependencies(MachineService, [MachineRepository]);\n * ```\n */\nexport const registerWithDependencies = <T extends object>(\n serviceClass: Constructor<T>,\n dependencies: Constructor[] = [],\n): void => {\n // Track this class as registered\n registeredClasses.add(serviceClass);\n\n tsyringeContainer.register(serviceClass, {\n useFactory: () => {\n const resolvedDeps = dependencies.map((dep) => {\n // Check if dependency was registered\n if (!registeredClasses.has(dep)) {\n throw new Error(\n `Dependency ${dep.name} not registered. Register it before ${serviceClass.name}.`,\n );\n }\n // Resolve from container (works because we registered it)\n return tsyringeContainer.resolve(dep);\n });\n return new serviceClass(...resolvedDeps);\n },\n } as never);\n};\n\n/**\n * Register a singleton with explicit dependencies (no decorator metadata required)\n * Useful for tsx/ts-node/ESM environments where decorator metadata is not available\n *\n * @param serviceClass - Class to register as singleton\n * @param dependencies - Array of dependency classes to inject (in constructor order)\n *\n * @example\n * ```typescript\n * import { registerSingletonWithDependencies } from '@sentzunhat/zacatl';\n *\n * // Register singleton with deps\n * registerSingletonWithDependencies(MachineService, [MachineRepository]);\n * ```\n */\nexport const registerSingletonWithDependencies = <T extends object>(\n serviceClass: Constructor<T>,\n dependencies: Constructor[] = [],\n): void => {\n // Track this class as registered\n registeredClasses.add(serviceClass);\n\n // Use register() with manual singleton pattern (lifecycle can't be used with factories)\n tsyringeContainer.register(serviceClass, {\n useFactory: () => {\n // Check if we already have a singleton instance\n if (singletonInstances.has(serviceClass)) {\n return singletonInstances.get(serviceClass) as T;\n }\n\n // Create new instance\n const resolvedDeps = dependencies.map((dep) => {\n // Check if dependency was registered\n if (!registeredClasses.has(dep)) {\n throw new Error(\n `Dependency ${dep.name} not registered. Register it before ${serviceClass.name}.`,\n );\n }\n // Resolve from container (works because we registered it)\n return tsyringeContainer.resolve(dep);\n });\n const instance = new serviceClass(...resolvedDeps);\n\n // Cache the singleton instance\n singletonInstances.set(serviceClass, instance);\n return instance;\n },\n } as never);\n};\n\n/**\n * Clear all registrations (useful for testing)\n */\nexport const clearContainer = (): void => {\n tsyringeContainer.clearInstances();\n tsyringeContainer.reset();\n singletonInstances.clear();\n registeredClasses.clear();\n};\n"]}
@@ -1,4 +1,4 @@
1
- export type Constructor<T = unknown> = new (...args: unknown[]) => T;
1
+ export type Constructor<T = object> = new (...args: any[]) => T;
2
2
  type Architecture = {
3
3
  start: () => void;
4
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"architecture.d.ts","sourceRoot":"./src/","sources":["service/architecture/architecture.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAErE,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,8BAAsB,oBAAqB,YAAW,YAAY;IAKhE,SAAS,CAAC,oBAAoB,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAc5E,SAAS,CAAC,4BAA4B,CAAC,CAAC,EACtC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,EAChC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,GAChB,IAAI;aAaS,KAAK,IAAI,IAAI;CAC9B"}
1
+ {"version":3,"file":"architecture.d.ts","sourceRoot":"./src/","sources":["service/architecture/architecture.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEhE,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,8BAAsB,oBAAqB,YAAW,YAAY;IAKhE,SAAS,CAAC,oBAAoB,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAc5E,SAAS,CAAC,4BAA4B,CAAC,CAAC,EACtC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,EAChC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,GAChB,IAAI;aAaS,KAAK,IAAI,IAAI;CAC9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"architecture.js","sourceRoot":"./src/","sources":["service/architecture/architecture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAQrC,MAAM,OAAgB,oBAAoB;IAK9B,oBAAoB,CAAI,YAAmC;QACnE,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;YAEtC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE;gBAClC,QAAQ,EAAE,UAAU;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAOS,4BAA4B,CACpC,YAAgC,EAChC,OAAiB;QAEjB,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;YACtC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;YAE9D,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,CAAC;YAElC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAkB,UAAU,CAAC,IAAI,CAAC,CAAC;YAEzE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;CAIF","sourcesContent":["import { container } from \"tsyringe\";\n\nexport type Constructor<T = unknown> = new (...args: unknown[]) => T;\n\ntype Architecture = {\n start: () => void;\n};\n\nexport abstract class AbstractArchitecture implements Architecture {\n /**\n * A generic helper method to register an array of handler classes.\n * @param handlers - An array of class constructors that implement the handler functionality.\n */\n protected registerDependencies<T>(dependencies: Array<Constructor<T>>): void {\n for (const dependency of dependencies) {\n // Register class directly - tsyringe handles instantiation with DI\n container.register(dependency.name, {\n useClass: dependency,\n });\n }\n }\n\n /**\n * A generic helper method to register an array of handler classes.\n * @param handlers - An array of class constructors that implement the handler functionality.\n * @param storage - An array where the resolved instances of handlers will be stored.\n */\n protected registerAndStoreDependencies<T>(\n dependencies: Array<new () => T>,\n storage: Array<T>,\n ): void {\n for (const dependency of dependencies) {\n container.register(dependency.name, { useClass: dependency });\n\n const instance = new dependency();\n\n const routeHandler = container.resolve<typeof instance>(dependency.name);\n\n storage.push(routeHandler);\n }\n }\n\n // Abstract start method, to be implemented by subclasses.\n public abstract start(): void;\n}\n"]}
1
+ {"version":3,"file":"architecture.js","sourceRoot":"./src/","sources":["service/architecture/architecture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAarC,MAAM,OAAgB,oBAAoB;IAK9B,oBAAoB,CAAI,YAAmC;QACnE,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;YAEtC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE;gBAClC,QAAQ,EAAE,UAAU;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAOS,4BAA4B,CACpC,YAAgC,EAChC,OAAiB;QAEjB,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;YACtC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;YAE9D,MAAM,QAAQ,GAAG,IAAI,UAAU,EAAE,CAAC;YAElC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAkB,UAAU,CAAC,IAAI,CAAC,CAAC;YAEzE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;CAIF","sourcesContent":["import { container } from \"tsyringe\";\n\n/**\n * Constructor type that accepts classes with any parameter signature\n * Uses contravariant any[] to allow flexibility in DI container\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Constructor<T = object> = new (...args: any[]) => T;\n\ntype Architecture = {\n start: () => void;\n};\n\nexport abstract class AbstractArchitecture implements Architecture {\n /**\n * A generic helper method to register an array of handler classes.\n * @param handlers - An array of class constructors that implement the handler functionality.\n */\n protected registerDependencies<T>(dependencies: Array<Constructor<T>>): void {\n for (const dependency of dependencies) {\n // Register class directly - tsyringe handles instantiation with DI\n container.register(dependency.name, {\n useClass: dependency,\n });\n }\n }\n\n /**\n * A generic helper method to register an array of handler classes.\n * @param handlers - An array of class constructors that implement the handler functionality.\n * @param storage - An array where the resolved instances of handlers will be stored.\n */\n protected registerAndStoreDependencies<T>(\n dependencies: Array<new () => T>,\n storage: Array<T>,\n ): void {\n for (const dependency of dependencies) {\n container.register(dependency.name, { useClass: dependency });\n\n const instance = new dependency();\n\n const routeHandler = container.resolve<typeof instance>(dependency.name);\n\n storage.push(routeHandler);\n }\n }\n\n // Abstract start method, to be implemented by subclasses.\n public abstract start(): void;\n}\n"]}