@riktajs/core 0.1.0

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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +205 -0
  3. package/dist/core/application.d.ts +28 -0
  4. package/dist/core/application.d.ts.map +1 -0
  5. package/dist/core/application.js +321 -0
  6. package/dist/core/application.js.map +1 -0
  7. package/dist/core/constants.d.ts +70 -0
  8. package/dist/core/constants.d.ts.map +1 -0
  9. package/dist/core/constants.js +77 -0
  10. package/dist/core/constants.js.map +1 -0
  11. package/dist/core/container/container.d.ts +101 -0
  12. package/dist/core/container/container.d.ts.map +1 -0
  13. package/dist/core/container/container.js +327 -0
  14. package/dist/core/container/container.js.map +1 -0
  15. package/dist/core/container/index.d.ts +3 -0
  16. package/dist/core/container/index.d.ts.map +1 -0
  17. package/dist/core/container/index.js +19 -0
  18. package/dist/core/container/index.js.map +1 -0
  19. package/dist/core/container/injection-token.d.ts +58 -0
  20. package/dist/core/container/injection-token.d.ts.map +1 -0
  21. package/dist/core/container/injection-token.js +37 -0
  22. package/dist/core/container/injection-token.js.map +1 -0
  23. package/dist/core/decorators/autowired.decorator.d.ts +72 -0
  24. package/dist/core/decorators/autowired.decorator.d.ts.map +1 -0
  25. package/dist/core/decorators/autowired.decorator.js +143 -0
  26. package/dist/core/decorators/autowired.decorator.js.map +1 -0
  27. package/dist/core/decorators/controller.decorator.d.ts +33 -0
  28. package/dist/core/decorators/controller.decorator.d.ts.map +1 -0
  29. package/dist/core/decorators/controller.decorator.js +50 -0
  30. package/dist/core/decorators/controller.decorator.js.map +1 -0
  31. package/dist/core/decorators/index.d.ts +7 -0
  32. package/dist/core/decorators/index.d.ts.map +1 -0
  33. package/dist/core/decorators/index.js +24 -0
  34. package/dist/core/decorators/index.js.map +1 -0
  35. package/dist/core/decorators/injectable.decorator.d.ts +26 -0
  36. package/dist/core/decorators/injectable.decorator.d.ts.map +1 -0
  37. package/dist/core/decorators/injectable.decorator.js +40 -0
  38. package/dist/core/decorators/injectable.decorator.js.map +1 -0
  39. package/dist/core/decorators/param.decorator.d.ts +72 -0
  40. package/dist/core/decorators/param.decorator.d.ts.map +1 -0
  41. package/dist/core/decorators/param.decorator.js +88 -0
  42. package/dist/core/decorators/param.decorator.js.map +1 -0
  43. package/dist/core/decorators/provider.decorator.d.ts +64 -0
  44. package/dist/core/decorators/provider.decorator.d.ts.map +1 -0
  45. package/dist/core/decorators/provider.decorator.js +69 -0
  46. package/dist/core/decorators/provider.decorator.js.map +1 -0
  47. package/dist/core/decorators/route.decorator.d.ts +53 -0
  48. package/dist/core/decorators/route.decorator.d.ts.map +1 -0
  49. package/dist/core/decorators/route.decorator.js +85 -0
  50. package/dist/core/decorators/route.decorator.js.map +1 -0
  51. package/dist/core/discovery.d.ts +24 -0
  52. package/dist/core/discovery.d.ts.map +1 -0
  53. package/dist/core/discovery.js +168 -0
  54. package/dist/core/discovery.js.map +1 -0
  55. package/dist/core/exceptions/catch.decorator.d.ts +71 -0
  56. package/dist/core/exceptions/catch.decorator.d.ts.map +1 -0
  57. package/dist/core/exceptions/catch.decorator.js +77 -0
  58. package/dist/core/exceptions/catch.decorator.js.map +1 -0
  59. package/dist/core/exceptions/exception-filter.d.ts +134 -0
  60. package/dist/core/exceptions/exception-filter.d.ts.map +1 -0
  61. package/dist/core/exceptions/exception-filter.js +161 -0
  62. package/dist/core/exceptions/exception-filter.js.map +1 -0
  63. package/dist/core/exceptions/exceptions.d.ts +212 -0
  64. package/dist/core/exceptions/exceptions.d.ts.map +1 -0
  65. package/dist/core/exceptions/exceptions.js +275 -0
  66. package/dist/core/exceptions/exceptions.js.map +1 -0
  67. package/dist/core/exceptions/http-exception.d.ts +79 -0
  68. package/dist/core/exceptions/http-exception.d.ts.map +1 -0
  69. package/dist/core/exceptions/http-exception.js +106 -0
  70. package/dist/core/exceptions/http-exception.js.map +1 -0
  71. package/dist/core/exceptions/index.d.ts +5 -0
  72. package/dist/core/exceptions/index.d.ts.map +1 -0
  73. package/dist/core/exceptions/index.js +38 -0
  74. package/dist/core/exceptions/index.js.map +1 -0
  75. package/dist/core/index.d.ts +11 -0
  76. package/dist/core/index.d.ts.map +1 -0
  77. package/dist/core/index.js +28 -0
  78. package/dist/core/index.js.map +1 -0
  79. package/dist/core/lifecycle/event-bus.d.ts +96 -0
  80. package/dist/core/lifecycle/event-bus.d.ts.map +1 -0
  81. package/dist/core/lifecycle/event-bus.js +91 -0
  82. package/dist/core/lifecycle/event-bus.js.map +1 -0
  83. package/dist/core/lifecycle/index.d.ts +4 -0
  84. package/dist/core/lifecycle/index.d.ts.map +1 -0
  85. package/dist/core/lifecycle/index.js +21 -0
  86. package/dist/core/lifecycle/index.js.map +1 -0
  87. package/dist/core/lifecycle/interfaces.d.ts +106 -0
  88. package/dist/core/lifecycle/interfaces.d.ts.map +1 -0
  89. package/dist/core/lifecycle/interfaces.js +10 -0
  90. package/dist/core/lifecycle/interfaces.js.map +1 -0
  91. package/dist/core/lifecycle/on.decorator.d.ts +62 -0
  92. package/dist/core/lifecycle/on.decorator.d.ts.map +1 -0
  93. package/dist/core/lifecycle/on.decorator.js +65 -0
  94. package/dist/core/lifecycle/on.decorator.js.map +1 -0
  95. package/dist/core/registry.d.ts +64 -0
  96. package/dist/core/registry.d.ts.map +1 -0
  97. package/dist/core/registry.js +91 -0
  98. package/dist/core/registry.js.map +1 -0
  99. package/dist/core/router/router.d.ts +39 -0
  100. package/dist/core/router/router.d.ts.map +1 -0
  101. package/dist/core/router/router.js +150 -0
  102. package/dist/core/router/router.js.map +1 -0
  103. package/dist/core/types.d.ts +161 -0
  104. package/dist/core/types.d.ts.map +1 -0
  105. package/dist/core/types.js +3 -0
  106. package/dist/core/types.js.map +1 -0
  107. package/dist/index.d.ts +44 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +64 -0
  110. package/dist/index.js.map +1 -0
  111. package/package.json +47 -0
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ // ============================================================================
3
+ // Metadata Keys for Reflect API
4
+ // ============================================================================
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_CONFIG = exports.ParamType = exports.PROVIDER_METADATA = exports.AUTOWIRED_METADATA = exports.INJECT_METADATA = exports.HEADERS_METADATA = exports.HTTP_CODE_METADATA = exports.MIDDLEWARE_METADATA = exports.INTERCEPTORS_METADATA = exports.GUARDS_METADATA = exports.PARAM_METADATA = exports.INJECTABLE_METADATA = exports.ROUTES_METADATA = exports.CONTROLLER_METADATA = void 0;
7
+ /**
8
+ * Key for storing controller metadata (prefix, routes)
9
+ */
10
+ exports.CONTROLLER_METADATA = Symbol('controller:metadata');
11
+ /**
12
+ * Key for storing route definitions on a controller
13
+ */
14
+ exports.ROUTES_METADATA = Symbol('routes:metadata');
15
+ /**
16
+ * Key for storing injectable options
17
+ */
18
+ exports.INJECTABLE_METADATA = Symbol('injectable:metadata');
19
+ /**
20
+ * Key for storing parameter injection metadata
21
+ */
22
+ exports.PARAM_METADATA = Symbol('param:metadata');
23
+ /**
24
+ * Key for storing guards
25
+ */
26
+ exports.GUARDS_METADATA = Symbol('guards:metadata');
27
+ /**
28
+ * Key for storing interceptors
29
+ */
30
+ exports.INTERCEPTORS_METADATA = Symbol('interceptors:metadata');
31
+ /**
32
+ * Key for storing middleware
33
+ */
34
+ exports.MIDDLEWARE_METADATA = Symbol('middleware:metadata');
35
+ /**
36
+ * Key for storing response status code
37
+ */
38
+ exports.HTTP_CODE_METADATA = Symbol('http:code:metadata');
39
+ /**
40
+ * Key for storing response headers
41
+ */
42
+ exports.HEADERS_METADATA = Symbol('headers:metadata');
43
+ /**
44
+ * Key for storing @Inject() metadata on constructor parameters
45
+ */
46
+ exports.INJECT_METADATA = Symbol('inject:metadata');
47
+ /**
48
+ * Key for storing @Autowired() property injection metadata
49
+ */
50
+ exports.AUTOWIRED_METADATA = Symbol('autowired:metadata');
51
+ /**
52
+ * Key for storing @Provider() metadata
53
+ */
54
+ exports.PROVIDER_METADATA = Symbol('provider:metadata');
55
+ /**
56
+ * Parameter types for injection
57
+ */
58
+ var ParamType;
59
+ (function (ParamType) {
60
+ ParamType["BODY"] = "body";
61
+ ParamType["QUERY"] = "query";
62
+ ParamType["PARAM"] = "param";
63
+ ParamType["HEADERS"] = "headers";
64
+ ParamType["REQUEST"] = "request";
65
+ ParamType["REPLY"] = "reply";
66
+ ParamType["CONTEXT"] = "context";
67
+ })(ParamType || (exports.ParamType = ParamType = {}));
68
+ /**
69
+ * Default application configuration
70
+ */
71
+ exports.DEFAULT_CONFIG = {
72
+ port: 3000,
73
+ host: '0.0.0.0',
74
+ logger: true,
75
+ prefix: '',
76
+ };
77
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;;;AAE/E;;GAEG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEjE;;GAEG;AACU,QAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEzD;;GAEG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEjE;;GAEG;AACU,QAAA,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAEvD;;GAEG;AACU,QAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEzD;;GAEG;AACU,QAAA,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAErE;;GAEG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEjE;;GAEG;AACU,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAE/D;;GAEG;AACU,QAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE3D;;GAEG;AACU,QAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEzD;;GAEG;AACU,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAE/D;;GAEG;AACU,QAAA,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE7D;;GAEG;AACH,IAAY,SAQX;AARD,WAAY,SAAS;IACnB,0BAAa,CAAA;IACb,4BAAe,CAAA;IACf,4BAAe,CAAA;IACf,gCAAmB,CAAA;IACnB,gCAAmB,CAAA;IACnB,4BAAe,CAAA;IACf,gCAAmB,CAAA;AACrB,CAAC,EARW,SAAS,yBAAT,SAAS,QAQpB;AAED;;GAEG;AACU,QAAA,cAAc,GAAG;IAC5B,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,EAAE;CACF,CAAC"}
@@ -0,0 +1,101 @@
1
+ import 'reflect-metadata';
2
+ import { Constructor, InjectableOptions } from '../types';
3
+ import { Token, ProviderDefinition } from './injection-token';
4
+ /**
5
+ * Dependency Injection Container
6
+ *
7
+ * Manages the lifecycle of injectable services with support for:
8
+ * - Singleton scope (default): One instance shared across the app
9
+ * - Transient scope: New instance on each injection
10
+ * - Request scope: New instance per request (TODO: implement with AsyncLocalStorage)
11
+ * - Property injection (autowire)
12
+ * - Token-based injection
13
+ * - Value and factory providers
14
+ */
15
+ export declare class Container {
16
+ private static instance;
17
+ /** Stores singleton instances by token */
18
+ private singletons;
19
+ /** Stores provider registrations */
20
+ private providers;
21
+ /** Resolution stack for circular dependency detection */
22
+ private resolutionStack;
23
+ private constructor();
24
+ /**
25
+ * Get the global container instance
26
+ */
27
+ static getInstance(): Container;
28
+ /**
29
+ * Reset the container (useful for testing)
30
+ */
31
+ static reset(): void;
32
+ /**
33
+ * Register a class provider in the container
34
+ */
35
+ register<T>(target: Constructor<T>, options?: InjectableOptions): void;
36
+ /**
37
+ * Register a custom provider (value, factory, class, or existing)
38
+ */
39
+ registerProvider<T>(provider: ProviderDefinition<T>): void;
40
+ /**
41
+ * Register a value directly
42
+ */
43
+ registerValue<T>(token: Token<T>, value: T): void;
44
+ /**
45
+ * Register a factory function
46
+ */
47
+ registerFactory<T>(token: Token<T>, factory: () => T, inject?: Token[]): void;
48
+ /**
49
+ * Check if a provider is registered
50
+ */
51
+ has(token: Token): boolean;
52
+ /**
53
+ * Resolve a dependency by token
54
+ */
55
+ resolve<T>(token: Token<T>): T;
56
+ /**
57
+ * Resolve a dependency, returning undefined if not found (for optional deps)
58
+ */
59
+ resolveOptional<T>(token: Token<T>): T | undefined;
60
+ /**
61
+ * Internal resolution logic
62
+ */
63
+ private resolveToken;
64
+ /**
65
+ * Resolve a custom provider
66
+ */
67
+ private resolveProvider;
68
+ /**
69
+ * Resolve a class and all its dependencies
70
+ */
71
+ private resolveClass;
72
+ /**
73
+ * Inject properties marked with @Autowired()
74
+ */
75
+ private injectProperties;
76
+ /**
77
+ * Register an existing instance as a singleton
78
+ */
79
+ registerInstance<T>(target: Constructor<T>, instance: T): void;
80
+ /**
81
+ * Get all registered providers
82
+ */
83
+ getProviders(): Token[];
84
+ /**
85
+ * Clear all singletons (useful for testing)
86
+ */
87
+ clearSingletons(): void;
88
+ /**
89
+ * Check if a type is a primitive (not injectable)
90
+ */
91
+ private isPrimitive;
92
+ /**
93
+ * Get a human-readable name for a token
94
+ */
95
+ private getTokenName;
96
+ }
97
+ /**
98
+ * Global container instance export for convenience
99
+ */
100
+ export declare const container: Container;
101
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../src/core/container/container.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAiB,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEzE,OAAO,EAAE,KAAK,EAAkB,kBAAkB,EAAmE,MAAM,mBAAmB,CAAC;AAG/I;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAY;IAEnC,0CAA0C;IAC1C,OAAO,CAAC,UAAU,CAA6B;IAE/C,oCAAoC;IACpC,OAAO,CAAC,SAAS,CAGZ;IAEL,yDAAyD;IACzD,OAAO,CAAC,eAAe,CAAoB;IAE3C,OAAO;IAEP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,SAAS;IAO/B;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI;IAK1E;;OAEG;IACH,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;IAyB1D;;OAEG;IACH,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAIjD;;OAEG;IACH,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI;IAI7E;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAI1B;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IAI9B;;OAEG;IACH,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS;IAIlD;;OAEG;IACH,OAAO,CAAC,YAAY;IA4CpB;;OAEG;IACH,OAAO,CAAC,eAAe;IA6CvB;;OAEG;IACH,OAAO,CAAC,YAAY;IA8FpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;IAK9D;;OAEG;IACH,YAAY,IAAI,KAAK,EAAE;IAIvB;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,OAAO,CAAC,YAAY;CAYrB;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,WAA0B,CAAC"}
@@ -0,0 +1,327 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.container = exports.Container = void 0;
4
+ require("reflect-metadata");
5
+ const constants_1 = require("../constants");
6
+ const injection_token_1 = require("./injection-token");
7
+ /**
8
+ * Dependency Injection Container
9
+ *
10
+ * Manages the lifecycle of injectable services with support for:
11
+ * - Singleton scope (default): One instance shared across the app
12
+ * - Transient scope: New instance on each injection
13
+ * - Request scope: New instance per request (TODO: implement with AsyncLocalStorage)
14
+ * - Property injection (autowire)
15
+ * - Token-based injection
16
+ * - Value and factory providers
17
+ */
18
+ class Container {
19
+ static instance;
20
+ /** Stores singleton instances by token */
21
+ singletons = new Map();
22
+ /** Stores provider registrations */
23
+ providers = new Map();
24
+ /** Resolution stack for circular dependency detection */
25
+ resolutionStack = new Set();
26
+ constructor() { }
27
+ /**
28
+ * Get the global container instance
29
+ */
30
+ static getInstance() {
31
+ if (!Container.instance) {
32
+ Container.instance = new Container();
33
+ }
34
+ return Container.instance;
35
+ }
36
+ /**
37
+ * Reset the container (useful for testing)
38
+ */
39
+ static reset() {
40
+ Container.instance = new Container();
41
+ }
42
+ /**
43
+ * Register a class provider in the container
44
+ */
45
+ register(target, options = {}) {
46
+ const scope = options.scope ?? 'singleton';
47
+ this.providers.set(target, { scope });
48
+ }
49
+ /**
50
+ * Register a custom provider (value, factory, class, or existing)
51
+ */
52
+ registerProvider(provider) {
53
+ if (typeof provider === 'function') {
54
+ // Simple class provider
55
+ this.register(provider);
56
+ return;
57
+ }
58
+ const token = provider.provide;
59
+ if ('useValue' in provider) {
60
+ // Value provider - always singleton
61
+ this.providers.set(token, { scope: 'singleton', provider });
62
+ this.singletons.set(token, provider.useValue);
63
+ }
64
+ else if ('useFactory' in provider) {
65
+ // Factory provider
66
+ this.providers.set(token, { scope: 'singleton', provider });
67
+ }
68
+ else if ('useClass' in provider) {
69
+ // Class provider
70
+ this.providers.set(token, { scope: 'singleton', provider });
71
+ }
72
+ else if ('useExisting' in provider) {
73
+ // Alias provider
74
+ this.providers.set(token, { scope: 'singleton', provider });
75
+ }
76
+ }
77
+ /**
78
+ * Register a value directly
79
+ */
80
+ registerValue(token, value) {
81
+ this.registerProvider({ provide: token, useValue: value });
82
+ }
83
+ /**
84
+ * Register a factory function
85
+ */
86
+ registerFactory(token, factory, inject) {
87
+ this.registerProvider({ provide: token, useFactory: factory, inject });
88
+ }
89
+ /**
90
+ * Check if a provider is registered
91
+ */
92
+ has(token) {
93
+ return this.providers.has(token);
94
+ }
95
+ /**
96
+ * Resolve a dependency by token
97
+ */
98
+ resolve(token) {
99
+ return this.resolveToken(token, false);
100
+ }
101
+ /**
102
+ * Resolve a dependency, returning undefined if not found (for optional deps)
103
+ */
104
+ resolveOptional(token) {
105
+ return this.resolveToken(token, true);
106
+ }
107
+ /**
108
+ * Internal resolution logic
109
+ */
110
+ resolveToken(token, optional) {
111
+ // Check for circular dependencies
112
+ if (this.resolutionStack.has(token)) {
113
+ const chain = [...this.resolutionStack]
114
+ .map(t => this.getTokenName(t))
115
+ .join(' -> ');
116
+ throw new Error(`Circular dependency detected: ${chain} -> ${this.getTokenName(token)}`);
117
+ }
118
+ // Check if we have a singleton cached
119
+ if (this.singletons.has(token)) {
120
+ return this.singletons.get(token);
121
+ }
122
+ // Get provider configuration
123
+ const config = this.providers.get(token);
124
+ if (!config) {
125
+ // Token not registered
126
+ if (optional) {
127
+ return undefined;
128
+ }
129
+ // If it's a constructor, try to resolve it anyway (auto-registration)
130
+ if (typeof token === 'function') {
131
+ return this.resolveClass(token);
132
+ }
133
+ throw new Error(`No provider found for token: ${this.getTokenName(token)}`);
134
+ }
135
+ // If there's a custom provider, use it
136
+ if (config.provider && typeof config.provider !== 'function') {
137
+ return this.resolveProvider(config.provider, config.scope);
138
+ }
139
+ // Otherwise resolve as a class
140
+ if (typeof token === 'function') {
141
+ return this.resolveClass(token);
142
+ }
143
+ throw new Error(`Cannot resolve token: ${this.getTokenName(token)}`);
144
+ }
145
+ /**
146
+ * Resolve a custom provider
147
+ */
148
+ resolveProvider(provider, scope) {
149
+ if (typeof provider === 'function') {
150
+ return this.resolveClass(provider);
151
+ }
152
+ const token = provider.provide;
153
+ if ('useValue' in provider) {
154
+ return provider.useValue;
155
+ }
156
+ if ('useFactory' in provider) {
157
+ const factoryProvider = provider;
158
+ // Resolve factory dependencies
159
+ const deps = (factoryProvider.inject ?? []).map(dep => this.resolve(dep));
160
+ const result = factoryProvider.useFactory(...deps);
161
+ // Cache singleton
162
+ if (scope === 'singleton') {
163
+ this.singletons.set(token, result);
164
+ }
165
+ return result;
166
+ }
167
+ if ('useClass' in provider) {
168
+ const classProvider = provider;
169
+ const instance = this.resolveClass(classProvider.useClass);
170
+ // Cache under the token (not the class)
171
+ if (scope === 'singleton') {
172
+ this.singletons.set(token, instance);
173
+ }
174
+ return instance;
175
+ }
176
+ if ('useExisting' in provider) {
177
+ return this.resolve(provider.useExisting);
178
+ }
179
+ throw new Error('Invalid provider configuration');
180
+ }
181
+ /**
182
+ * Resolve a class and all its dependencies
183
+ */
184
+ resolveClass(target) {
185
+ // Check for circular dependencies
186
+ if (this.resolutionStack.has(target)) {
187
+ const chain = [...this.resolutionStack, target]
188
+ .map(t => this.getTokenName(t))
189
+ .join(' -> ');
190
+ throw new Error(`Circular dependency detected: ${chain}`);
191
+ }
192
+ // Get provider configuration
193
+ const providerConfig = this.providers.get(target);
194
+ const scope = providerConfig?.scope ?? 'singleton';
195
+ // Return singleton if exists
196
+ if (scope === 'singleton' && this.singletons.has(target)) {
197
+ return this.singletons.get(target);
198
+ }
199
+ // Add to resolution stack
200
+ this.resolutionStack.add(target);
201
+ try {
202
+ // Get @Autowired() metadata for constructor parameters
203
+ const injectMeta = Reflect.getMetadata(constants_1.INJECT_METADATA, target) ?? [];
204
+ // Get constructor parameter types via reflect-metadata
205
+ const paramTypes = Reflect.getMetadata('design:paramtypes', target) ?? [];
206
+ // Determine the number of parameters to resolve
207
+ // Use the maximum of paramTypes length and highest index in injectMeta
208
+ const maxIndex = injectMeta.length > 0
209
+ ? Math.max(...injectMeta.map(m => m.index ?? -1))
210
+ : -1;
211
+ const paramCount = Math.max(paramTypes.length, maxIndex + 1);
212
+ // Resolve all constructor dependencies
213
+ const dependencies = [];
214
+ for (let index = 0; index < paramCount; index++) {
215
+ const paramType = paramTypes[index];
216
+ const injectOverride = injectMeta.find(m => m.index === index);
217
+ const token = injectOverride?.token ?? paramType;
218
+ const isOptional = injectOverride?.optional ?? false;
219
+ // If we have no token and no paramType, skip or error
220
+ if (!token) {
221
+ if (isOptional) {
222
+ dependencies.push(undefined);
223
+ continue;
224
+ }
225
+ throw new Error(`Cannot resolve constructor parameter ${index} of ${target.name}. ` +
226
+ `Use @Autowired(token) decorator.`);
227
+ }
228
+ // Handle primitive types without override
229
+ if (!injectOverride && this.isPrimitive(paramType)) {
230
+ if (isOptional) {
231
+ dependencies.push(undefined);
232
+ continue;
233
+ }
234
+ throw new Error(`Cannot inject primitive type '${paramType?.name ?? 'unknown'}' into ${target.name}. ` +
235
+ `Use @Autowired(token) decorator.`);
236
+ }
237
+ dependencies.push(isOptional
238
+ ? this.resolveOptional(token)
239
+ : this.resolve(token));
240
+ }
241
+ // Create instance with resolved dependencies
242
+ const instance = new target(...dependencies);
243
+ // Handle property injection (autowire)
244
+ this.injectProperties(target, instance);
245
+ // Store singleton
246
+ if (scope === 'singleton') {
247
+ this.singletons.set(target, instance);
248
+ }
249
+ return instance;
250
+ }
251
+ finally {
252
+ // Remove from resolution stack
253
+ this.resolutionStack.delete(target);
254
+ }
255
+ }
256
+ /**
257
+ * Inject properties marked with @Autowired()
258
+ */
259
+ injectProperties(target, instance) {
260
+ const autowireMeta = Reflect.getMetadata(constants_1.AUTOWIRED_METADATA, target) ?? [];
261
+ for (const meta of autowireMeta) {
262
+ if (!meta.propertyKey)
263
+ continue;
264
+ const isOptional = meta.optional ?? false;
265
+ try {
266
+ const value = isOptional
267
+ ? this.resolveOptional(meta.token)
268
+ : this.resolve(meta.token);
269
+ instance[meta.propertyKey] = value;
270
+ }
271
+ catch (error) {
272
+ if (!isOptional) {
273
+ throw error;
274
+ }
275
+ }
276
+ }
277
+ }
278
+ /**
279
+ * Register an existing instance as a singleton
280
+ */
281
+ registerInstance(target, instance) {
282
+ this.providers.set(target, { scope: 'singleton' });
283
+ this.singletons.set(target, instance);
284
+ }
285
+ /**
286
+ * Get all registered providers
287
+ */
288
+ getProviders() {
289
+ return [...this.providers.keys()];
290
+ }
291
+ /**
292
+ * Clear all singletons (useful for testing)
293
+ */
294
+ clearSingletons() {
295
+ this.singletons.clear();
296
+ }
297
+ /**
298
+ * Check if a type is a primitive (not injectable)
299
+ */
300
+ isPrimitive(type) {
301
+ if (!type)
302
+ return true;
303
+ const primitives = [String, Number, Boolean, Object, Array, Function];
304
+ return primitives.includes(type);
305
+ }
306
+ /**
307
+ * Get a human-readable name for a token
308
+ */
309
+ getTokenName(token) {
310
+ if (typeof token === 'function') {
311
+ return token.name;
312
+ }
313
+ if (token instanceof injection_token_1.InjectionToken) {
314
+ return token.toString();
315
+ }
316
+ if (typeof token === 'symbol') {
317
+ return token.toString();
318
+ }
319
+ return String(token);
320
+ }
321
+ }
322
+ exports.Container = Container;
323
+ /**
324
+ * Global container instance export for convenience
325
+ */
326
+ exports.container = Container.getInstance();
327
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../../src/core/container/container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './container';
2
+ export * from './injection-token';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/container/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./container"), exports);
18
+ __exportStar(require("./injection-token"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/container/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,oDAAkC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Injection Token
3
+ *
4
+ * Used to identify dependencies that are not classes (interfaces, values, etc.)
5
+ * Similar to NestJS InjectionToken and Angular's InjectionToken.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // Define a token for a configuration object
10
+ * const CONFIG_TOKEN = new InjectionToken<AppConfig>('app.config');
11
+ *
12
+ * // Register with the container
13
+ * container.registerValue(CONFIG_TOKEN, { apiUrl: 'https://api.example.com' });
14
+ *
15
+ * // Inject using the token
16
+ * @Injectable()
17
+ * class ApiService {
18
+ * constructor(@Autowired(CONFIG_TOKEN) private config: AppConfig) {}
19
+ * }
20
+ * ```
21
+ */
22
+ export declare class InjectionToken<T = unknown> {
23
+ readonly description: string;
24
+ readonly options?: {
25
+ factory?: () => T;
26
+ } | undefined;
27
+ constructor(description: string, options?: {
28
+ factory?: () => T;
29
+ } | undefined);
30
+ toString(): string;
31
+ }
32
+ /**
33
+ * Type for any valid injection token
34
+ * Can be a class constructor, InjectionToken, string, or symbol
35
+ */
36
+ export type Token<T = unknown> = (new (...args: unknown[]) => T) | InjectionToken<T> | string | symbol;
37
+ /**
38
+ * Provider definition for custom providers
39
+ */
40
+ export interface ClassProvider<T = unknown> {
41
+ provide: Token<T>;
42
+ useClass: new (...args: unknown[]) => T;
43
+ }
44
+ export interface ValueProvider<T = unknown> {
45
+ provide: Token<T>;
46
+ useValue: T;
47
+ }
48
+ export interface FactoryProvider<T = unknown> {
49
+ provide: Token<T>;
50
+ useFactory: (...args: unknown[]) => T | Promise<T>;
51
+ inject?: Token[];
52
+ }
53
+ export interface ExistingProvider<T = unknown> {
54
+ provide: Token<T>;
55
+ useExisting: Token<T>;
56
+ }
57
+ export type ProviderDefinition<T = unknown> = ClassProvider<T> | ValueProvider<T> | FactoryProvider<T> | ExistingProvider<T> | (new (...args: unknown[]) => T);
58
+ //# sourceMappingURL=injection-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection-token.d.ts","sourceRoot":"","sources":["../../../src/core/container/injection-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,cAAc,CAAC,CAAC,GAAG,OAAO;aAEnB,WAAW,EAAE,MAAM;aACnB,OAAO,CAAC,EAAE;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;KACnB;gBAHe,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;KACnB,YAAA;IAGH,QAAQ,IAAI,MAAM;CAGnB;AAED;;;GAGG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG,OAAO,IACzB,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,GAC/B,cAAc,CAAC,CAAC,CAAC,GACjB,MAAM,GACN,MAAM,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,QAAQ,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,QAAQ,EAAE,CAAC,CAAC;CACb;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAC3C,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;CACvB;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,IACtC,aAAa,CAAC,CAAC,CAAC,GAChB,aAAa,CAAC,CAAC,CAAC,GAChB,eAAe,CAAC,CAAC,CAAC,GAClB,gBAAgB,CAAC,CAAC,CAAC,GACnB,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InjectionToken = void 0;
4
+ /**
5
+ * Injection Token
6
+ *
7
+ * Used to identify dependencies that are not classes (interfaces, values, etc.)
8
+ * Similar to NestJS InjectionToken and Angular's InjectionToken.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * // Define a token for a configuration object
13
+ * const CONFIG_TOKEN = new InjectionToken<AppConfig>('app.config');
14
+ *
15
+ * // Register with the container
16
+ * container.registerValue(CONFIG_TOKEN, { apiUrl: 'https://api.example.com' });
17
+ *
18
+ * // Inject using the token
19
+ * @Injectable()
20
+ * class ApiService {
21
+ * constructor(@Autowired(CONFIG_TOKEN) private config: AppConfig) {}
22
+ * }
23
+ * ```
24
+ */
25
+ class InjectionToken {
26
+ description;
27
+ options;
28
+ constructor(description, options) {
29
+ this.description = description;
30
+ this.options = options;
31
+ }
32
+ toString() {
33
+ return `InjectionToken(${this.description})`;
34
+ }
35
+ }
36
+ exports.InjectionToken = InjectionToken;
37
+ //# sourceMappingURL=injection-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection-token.js","sourceRoot":"","sources":["../../../src/core/container/injection-token.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAa,cAAc;IAEP;IACA;IAFlB,YACkB,WAAmB,EACnB,OAEf;QAHe,gBAAW,GAAX,WAAW,CAAQ;QACnB,YAAO,GAAP,OAAO,CAEtB;IACA,CAAC;IAEJ,QAAQ;QACN,OAAO,kBAAkB,IAAI,CAAC,WAAW,GAAG,CAAC;IAC/C,CAAC;CACF;AAXD,wCAWC"}