@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.
- package/LICENSE +21 -0
- package/README.md +205 -0
- package/dist/core/application.d.ts +28 -0
- package/dist/core/application.d.ts.map +1 -0
- package/dist/core/application.js +321 -0
- package/dist/core/application.js.map +1 -0
- package/dist/core/constants.d.ts +70 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +77 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/container/container.d.ts +101 -0
- package/dist/core/container/container.d.ts.map +1 -0
- package/dist/core/container/container.js +327 -0
- package/dist/core/container/container.js.map +1 -0
- package/dist/core/container/index.d.ts +3 -0
- package/dist/core/container/index.d.ts.map +1 -0
- package/dist/core/container/index.js +19 -0
- package/dist/core/container/index.js.map +1 -0
- package/dist/core/container/injection-token.d.ts +58 -0
- package/dist/core/container/injection-token.d.ts.map +1 -0
- package/dist/core/container/injection-token.js +37 -0
- package/dist/core/container/injection-token.js.map +1 -0
- package/dist/core/decorators/autowired.decorator.d.ts +72 -0
- package/dist/core/decorators/autowired.decorator.d.ts.map +1 -0
- package/dist/core/decorators/autowired.decorator.js +143 -0
- package/dist/core/decorators/autowired.decorator.js.map +1 -0
- package/dist/core/decorators/controller.decorator.d.ts +33 -0
- package/dist/core/decorators/controller.decorator.d.ts.map +1 -0
- package/dist/core/decorators/controller.decorator.js +50 -0
- package/dist/core/decorators/controller.decorator.js.map +1 -0
- package/dist/core/decorators/index.d.ts +7 -0
- package/dist/core/decorators/index.d.ts.map +1 -0
- package/dist/core/decorators/index.js +24 -0
- package/dist/core/decorators/index.js.map +1 -0
- package/dist/core/decorators/injectable.decorator.d.ts +26 -0
- package/dist/core/decorators/injectable.decorator.d.ts.map +1 -0
- package/dist/core/decorators/injectable.decorator.js +40 -0
- package/dist/core/decorators/injectable.decorator.js.map +1 -0
- package/dist/core/decorators/param.decorator.d.ts +72 -0
- package/dist/core/decorators/param.decorator.d.ts.map +1 -0
- package/dist/core/decorators/param.decorator.js +88 -0
- package/dist/core/decorators/param.decorator.js.map +1 -0
- package/dist/core/decorators/provider.decorator.d.ts +64 -0
- package/dist/core/decorators/provider.decorator.d.ts.map +1 -0
- package/dist/core/decorators/provider.decorator.js +69 -0
- package/dist/core/decorators/provider.decorator.js.map +1 -0
- package/dist/core/decorators/route.decorator.d.ts +53 -0
- package/dist/core/decorators/route.decorator.d.ts.map +1 -0
- package/dist/core/decorators/route.decorator.js +85 -0
- package/dist/core/decorators/route.decorator.js.map +1 -0
- package/dist/core/discovery.d.ts +24 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +168 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/exceptions/catch.decorator.d.ts +71 -0
- package/dist/core/exceptions/catch.decorator.d.ts.map +1 -0
- package/dist/core/exceptions/catch.decorator.js +77 -0
- package/dist/core/exceptions/catch.decorator.js.map +1 -0
- package/dist/core/exceptions/exception-filter.d.ts +134 -0
- package/dist/core/exceptions/exception-filter.d.ts.map +1 -0
- package/dist/core/exceptions/exception-filter.js +161 -0
- package/dist/core/exceptions/exception-filter.js.map +1 -0
- package/dist/core/exceptions/exceptions.d.ts +212 -0
- package/dist/core/exceptions/exceptions.d.ts.map +1 -0
- package/dist/core/exceptions/exceptions.js +275 -0
- package/dist/core/exceptions/exceptions.js.map +1 -0
- package/dist/core/exceptions/http-exception.d.ts +79 -0
- package/dist/core/exceptions/http-exception.d.ts.map +1 -0
- package/dist/core/exceptions/http-exception.js +106 -0
- package/dist/core/exceptions/http-exception.js.map +1 -0
- package/dist/core/exceptions/index.d.ts +5 -0
- package/dist/core/exceptions/index.d.ts.map +1 -0
- package/dist/core/exceptions/index.js +38 -0
- package/dist/core/exceptions/index.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +28 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lifecycle/event-bus.d.ts +96 -0
- package/dist/core/lifecycle/event-bus.d.ts.map +1 -0
- package/dist/core/lifecycle/event-bus.js +91 -0
- package/dist/core/lifecycle/event-bus.js.map +1 -0
- package/dist/core/lifecycle/index.d.ts +4 -0
- package/dist/core/lifecycle/index.d.ts.map +1 -0
- package/dist/core/lifecycle/index.js +21 -0
- package/dist/core/lifecycle/index.js.map +1 -0
- package/dist/core/lifecycle/interfaces.d.ts +106 -0
- package/dist/core/lifecycle/interfaces.d.ts.map +1 -0
- package/dist/core/lifecycle/interfaces.js +10 -0
- package/dist/core/lifecycle/interfaces.js.map +1 -0
- package/dist/core/lifecycle/on.decorator.d.ts +62 -0
- package/dist/core/lifecycle/on.decorator.d.ts.map +1 -0
- package/dist/core/lifecycle/on.decorator.js +65 -0
- package/dist/core/lifecycle/on.decorator.js.map +1 -0
- package/dist/core/registry.d.ts +64 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +91 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/router/router.d.ts +39 -0
- package/dist/core/router/router.d.ts.map +1 -0
- package/dist/core/router/router.js +150 -0
- package/dist/core/router/router.js.map +1 -0
- package/dist/core/types.d.ts +161 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- 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 @@
|
|
|
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"}
|