exisjs 0.7.9 → 0.7.11
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/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +8 -1
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/config/config.d.ts +2 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +1 -1
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +7 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/database/lifecycle.d.ts +2 -1
- package/dist/database/lifecycle.d.ts.map +1 -1
- package/dist/database/lifecycle.js +6 -2
- package/dist/database/lifecycle.js.map +1 -1
- package/dist/decorators/constants.d.ts +2 -0
- package/dist/decorators/constants.d.ts.map +1 -1
- package/dist/decorators/constants.js +3 -1
- package/dist/decorators/constants.js.map +1 -1
- package/dist/decorators/core.d.ts +14 -0
- package/dist/decorators/core.d.ts.map +1 -1
- package/dist/decorators/core.js +156 -41
- package/dist/decorators/core.js.map +1 -1
- package/dist/decorators/filters.d.ts +2 -10
- package/dist/decorators/filters.d.ts.map +1 -1
- package/dist/decorators/filters.js.map +1 -1
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +1 -0
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/lifecycle.d.ts +29 -0
- package/dist/decorators/lifecycle.d.ts.map +1 -1
- package/dist/decorators/params.d.ts +3 -7
- package/dist/decorators/params.d.ts.map +1 -1
- package/dist/decorators/params.js.map +1 -1
- package/dist/decorators/pipes.d.ts +91 -0
- package/dist/decorators/pipes.d.ts.map +1 -0
- package/dist/decorators/pipes.js +283 -0
- package/dist/decorators/pipes.js.map +1 -0
- package/dist/di/container.d.ts +8 -4
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +186 -68
- package/dist/di/container.js.map +1 -1
- package/dist/di/decorators.d.ts +23 -5
- package/dist/di/decorators.d.ts.map +1 -1
- package/dist/di/decorators.js +83 -20
- package/dist/di/decorators.js.map +1 -1
- package/dist/di/forward-ref.d.ts +23 -0
- package/dist/di/forward-ref.d.ts.map +1 -0
- package/dist/di/forward-ref.js +30 -0
- package/dist/di/forward-ref.js.map +1 -0
- package/dist/di/index.d.ts +3 -2
- package/dist/di/index.d.ts.map +1 -1
- package/dist/di/index.js +8 -1
- package/dist/di/index.js.map +1 -1
- package/dist/docs/BENCHMARKS.md +5 -5
- package/dist/docs/content/config.mdx +16 -6
- package/dist/docs/content/controllers.mdx +230 -0
- package/dist/docs/content/errors.mdx +16 -9
- package/dist/docs/content/modules.mdx +23 -4
- package/dist/docs/content/providers.mdx +42 -6
- package/dist/docs/content/requests.mdx +9 -3
- package/dist/docs/content/responses.mdx +19 -5
- package/dist/docs/content/security.mdx +48 -35
- package/dist/docs/content/structure.mdx +119 -93
- package/dist/docs/reference/config.mdx +29 -18
- package/dist/docs/reference/decorators.mdx +15 -4
- package/dist/docs/reference/di.mdx +23 -16
- package/dist/docs/reference/router.mdx +75 -0
- package/dist/docs/reference/validator.mdx +2 -2
- package/dist/error/errors.d.ts.map +1 -1
- package/dist/error/errors.js +12 -0
- package/dist/error/errors.js.map +1 -1
- package/dist/middleware/security.d.ts +18 -0
- package/dist/middleware/security.d.ts.map +1 -1
- package/dist/middleware/security.js +32 -0
- package/dist/middleware/security.js.map +1 -1
- package/dist/router/controller-registrar.d.ts.map +1 -1
- package/dist/router/controller-registrar.js +142 -87
- package/dist/router/controller-registrar.js.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js.map +1 -1
- package/dist/router/radix.d.ts +1 -0
- package/dist/router/radix.d.ts.map +1 -1
- package/dist/router/radix.js +21 -0
- package/dist/router/radix.js.map +1 -1
- package/dist/router/route-builder.d.ts +160 -29
- package/dist/router/route-builder.d.ts.map +1 -1
- package/dist/router/route-builder.js +105 -31
- package/dist/router/route-builder.js.map +1 -1
- package/dist/router/route-scanner.d.ts +3 -2
- package/dist/router/route-scanner.d.ts.map +1 -1
- package/dist/router/route-scanner.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +44 -0
- package/dist/router/router.js.map +1 -1
- package/dist/router/scanner/functional-compiler.d.ts +1 -1
- package/dist/router/scanner/functional-compiler.d.ts.map +1 -1
- package/dist/router/scanner/functional-compiler.js +403 -64
- package/dist/router/scanner/functional-compiler.js.map +1 -1
- package/dist/router/types.d.ts +4 -2
- package/dist/router/types.d.ts.map +1 -1
- package/dist/server/adapters/uws-adapter.d.ts +17 -0
- package/dist/server/adapters/uws-adapter.d.ts.map +1 -1
- package/dist/server/adapters/uws-adapter.js +101 -7
- package/dist/server/adapters/uws-adapter.js.map +1 -1
- package/dist/server/app.d.ts +2 -0
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +38 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/helpers/etag.d.ts +1 -0
- package/dist/server/helpers/etag.d.ts.map +1 -1
- package/dist/server/helpers/etag.js +168 -9
- package/dist/server/helpers/etag.js.map +1 -1
- package/dist/server/helpers/ip.d.ts.map +1 -1
- package/dist/server/helpers/ip.js +75 -17
- package/dist/server/helpers/ip.js.map +1 -1
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/server/request-handler.js +35 -19
- package/dist/server/request-handler.js.map +1 -1
- package/dist/server/request.d.ts +4 -3
- package/dist/server/request.d.ts.map +1 -1
- package/dist/server/request.js +26 -8
- package/dist/server/request.js.map +1 -1
- package/dist/server/response.d.ts +1 -0
- package/dist/server/response.d.ts.map +1 -1
- package/dist/server/response.js +48 -22
- package/dist/server/response.js.map +1 -1
- package/dist/swagger/generator.d.ts.map +1 -1
- package/dist/swagger/generator.js +66 -22
- package/dist/swagger/generator.js.map +1 -1
- package/dist/testing/client.d.ts +15 -11
- package/dist/testing/client.d.ts.map +1 -1
- package/dist/testing/client.js +32 -11
- package/dist/testing/client.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +2 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/validator/engine.d.ts.map +1 -1
- package/dist/validator/engine.js +45 -0
- package/dist/validator/engine.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAC/B,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEnE,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAC/B,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;AAErE,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,CAAA;CAC9C;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,YAAY;IACpD,QAAQ,EAAE,CAAC,CAAA;CACZ;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,CAAE,SAAQ,YAAY;IACtD,UAAU,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,YAAY;IACpD,QAAQ,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;CACpC;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;AAEjE,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAC5B,aAAa,CAAC,CAAC,CAAC,GAChB,eAAe,CAAC,CAAC,CAAC,GAClB,aAAa,CAAC,CAAC,CAAC,GAChB,gBAAgB,CAAC,CAAC,CAAC,GACnB,CAAC,CAAA;AAEL,eAAO,MAAM,eAAe,eAAqC,CAAA;AACjE,eAAO,MAAM,wBAAwB,eAEpC,CAAA;AACD,eAAO,MAAM,iBAAiB,eAAuC,CAAA;AACrE,eAAO,MAAM,cAAc,eAA6B,CAAA;AAExD,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAiB;IAEjC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;IAM1E,UAAU,IAAI,IAAI;IAKlB,gBAAgB,CAAC,CAAC,EAChB,WAAW,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EACtC,YAAY,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAC3B,CAAC;IAoJJ,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IA0IvD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB9B,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAe9D"}
|
package/dist/di/container.js
CHANGED
|
@@ -1,139 +1,257 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Container = exports.SCOPE_METADATA = exports.OPTIONAL_METADATA = exports.INJECT_METADATA = void 0;
|
|
3
|
+
exports.Container = exports.SCOPE_METADATA = exports.OPTIONAL_METADATA = exports.PROPERTY_INJECT_METADATA = exports.INJECT_METADATA = void 0;
|
|
4
|
+
const forward_ref_1 = require("./forward-ref");
|
|
4
5
|
exports.INJECT_METADATA = Symbol.for('exisjs:inject_tokens');
|
|
6
|
+
exports.PROPERTY_INJECT_METADATA = Symbol.for('exisjs:property_inject_tokens');
|
|
5
7
|
exports.OPTIONAL_METADATA = Symbol.for('exisjs:optional_tokens');
|
|
6
8
|
exports.SCOPE_METADATA = Symbol.for('exisjs:scope');
|
|
7
9
|
class Container {
|
|
8
10
|
constructor() {
|
|
9
11
|
this.providers = new Map();
|
|
10
12
|
this.singletonCache = new Map();
|
|
13
|
+
this.inFlight = new Set();
|
|
11
14
|
}
|
|
12
15
|
provide(token, provider) {
|
|
13
|
-
|
|
14
|
-
this.
|
|
16
|
+
const unwrappedToken = (0, forward_ref_1.isForwardRef)(token) ? token.forwardRef() : token;
|
|
17
|
+
this.providers.set(unwrappedToken, provider);
|
|
18
|
+
this.singletonCache.delete(unwrappedToken);
|
|
15
19
|
}
|
|
16
20
|
clearCache() {
|
|
17
21
|
this.singletonCache.clear();
|
|
22
|
+
this.inFlight.clear();
|
|
18
23
|
}
|
|
19
24
|
instantiateClass(TargetClass, requestCache) {
|
|
20
|
-
const injectTokens =
|
|
21
|
-
(TargetClass.prototype &&
|
|
25
|
+
const injectTokens = {
|
|
26
|
+
...((TargetClass.prototype &&
|
|
22
27
|
TargetClass.prototype[exports.INJECT_METADATA]) ||
|
|
23
|
-
|
|
28
|
+
{}),
|
|
29
|
+
...(TargetClass[exports.INJECT_METADATA] || {}),
|
|
30
|
+
};
|
|
24
31
|
const optionalParams = TargetClass[exports.OPTIONAL_METADATA] ||
|
|
25
32
|
(TargetClass.prototype &&
|
|
26
33
|
TargetClass.prototype[exports.OPTIONAL_METADATA]) ||
|
|
27
34
|
new Set();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
// 1. Inspect reflected parameter types emitted by TypeScript (design:paramtypes)
|
|
36
|
+
const reflectParamTypes = (typeof globalThis.Reflect?.getMetadata === 'function'
|
|
37
|
+
? globalThis.Reflect.getMetadata('design:paramtypes', TargetClass) ||
|
|
38
|
+
(TargetClass.prototype
|
|
39
|
+
? globalThis.Reflect.getMetadata('design:paramtypes', TargetClass.prototype)
|
|
40
|
+
: undefined)
|
|
41
|
+
: undefined) ||
|
|
42
|
+
TargetClass['design:paramtypes'] ||
|
|
43
|
+
TargetClass.prototype?.['design:paramtypes'] ||
|
|
44
|
+
[];
|
|
45
|
+
// Merge reflected constructor parameters if not explicitly overridden by @Inject()
|
|
46
|
+
if (Array.isArray(reflectParamTypes) && reflectParamTypes.length > 0) {
|
|
47
|
+
for (let i = 0; i < reflectParamTypes.length; i++) {
|
|
48
|
+
const paramType = reflectParamTypes[i];
|
|
49
|
+
if (injectTokens[i] === undefined &&
|
|
50
|
+
typeof paramType === 'function' &&
|
|
51
|
+
paramType !== Object &&
|
|
52
|
+
paramType !== String &&
|
|
53
|
+
paramType !== Number &&
|
|
54
|
+
paramType !== Boolean &&
|
|
55
|
+
paramType !== Symbol &&
|
|
56
|
+
paramType !== Array &&
|
|
57
|
+
paramType !== Function) {
|
|
58
|
+
injectTokens[i] = paramType;
|
|
40
59
|
}
|
|
41
|
-
|
|
42
|
-
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const tokenIndices = Object.keys(injectTokens).map(Number);
|
|
63
|
+
const maxIndex = tokenIndices.length > 0 ? Math.max(...tokenIndices) : -1;
|
|
64
|
+
let instance;
|
|
65
|
+
if (maxIndex === -1 &&
|
|
66
|
+
optionalParams.size === 0 &&
|
|
67
|
+
(!TargetClass.length || TargetClass.length === 0)) {
|
|
68
|
+
instance = new TargetClass();
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const totalParams = Math.max(maxIndex + 1, TargetClass.length || 0, ...Array.from(optionalParams).map((idx) => idx + 1));
|
|
72
|
+
if (totalParams === 0) {
|
|
73
|
+
instance = new TargetClass();
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const args = [];
|
|
77
|
+
for (let i = 0; i < totalParams; i++) {
|
|
78
|
+
const token = injectTokens[i];
|
|
79
|
+
const isOptional = optionalParams.has(i);
|
|
80
|
+
if (token !== undefined) {
|
|
81
|
+
try {
|
|
82
|
+
args.push(this.resolve(token, requestCache));
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (isOptional) {
|
|
86
|
+
args.push(undefined);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
throw err;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (isOptional) {
|
|
43
94
|
args.push(undefined);
|
|
44
95
|
}
|
|
45
96
|
else {
|
|
46
|
-
|
|
97
|
+
args.push(undefined);
|
|
47
98
|
}
|
|
48
99
|
}
|
|
100
|
+
instance = new TargetClass(...args);
|
|
49
101
|
}
|
|
50
|
-
|
|
51
|
-
|
|
102
|
+
}
|
|
103
|
+
// 2. Perform property-level dependency injections across prototype hierarchy
|
|
104
|
+
if (TargetClass.prototype) {
|
|
105
|
+
const protoChain = [];
|
|
106
|
+
let curr = TargetClass.prototype;
|
|
107
|
+
while (curr && curr !== Object.prototype) {
|
|
108
|
+
protoChain.unshift(curr);
|
|
109
|
+
curr = Object.getPrototypeOf(curr);
|
|
52
110
|
}
|
|
53
|
-
|
|
54
|
-
|
|
111
|
+
for (const p of protoChain) {
|
|
112
|
+
const propInjections = p[exports.PROPERTY_INJECT_METADATA] || [];
|
|
113
|
+
const optProps = p[exports.OPTIONAL_METADATA] || new Set();
|
|
114
|
+
for (const { propertyKey, token } of propInjections) {
|
|
115
|
+
let resolvedToken = token;
|
|
116
|
+
if (resolvedToken === undefined) {
|
|
117
|
+
const reflectedType = typeof globalThis.Reflect?.getMetadata === 'function'
|
|
118
|
+
? globalThis.Reflect.getMetadata('design:type', p, propertyKey)
|
|
119
|
+
: undefined;
|
|
120
|
+
if (reflectedType)
|
|
121
|
+
resolvedToken = reflectedType;
|
|
122
|
+
}
|
|
123
|
+
if (resolvedToken !== undefined) {
|
|
124
|
+
try {
|
|
125
|
+
;
|
|
126
|
+
instance[propertyKey] = this.resolve(resolvedToken, requestCache);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
if (optProps.has(propertyKey)) {
|
|
130
|
+
;
|
|
131
|
+
instance[propertyKey] = undefined;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
55
139
|
}
|
|
56
140
|
}
|
|
57
|
-
return
|
|
141
|
+
return instance;
|
|
58
142
|
}
|
|
59
143
|
resolve(token, requestCache) {
|
|
144
|
+
const unwrappedToken = (0, forward_ref_1.isForwardRef)(token) ? token.forwardRef() : token;
|
|
60
145
|
// 1. Check singleton cache
|
|
61
|
-
if (this.singletonCache.has(
|
|
62
|
-
return this.singletonCache.get(
|
|
146
|
+
if (this.singletonCache.has(unwrappedToken)) {
|
|
147
|
+
return this.singletonCache.get(unwrappedToken);
|
|
63
148
|
}
|
|
64
149
|
// 2. Check request cache
|
|
65
|
-
if (requestCache && requestCache.has(
|
|
66
|
-
return requestCache.get(
|
|
150
|
+
if (requestCache && requestCache.has(unwrappedToken)) {
|
|
151
|
+
return requestCache.get(unwrappedToken);
|
|
67
152
|
}
|
|
68
|
-
|
|
153
|
+
// 3. Circular Dependency Resolution: Return Lazy Proxy
|
|
154
|
+
if (this.inFlight.has(unwrappedToken)) {
|
|
155
|
+
return new Proxy({}, {
|
|
156
|
+
get: (_, prop) => {
|
|
157
|
+
const realInstance = this.singletonCache.get(unwrappedToken) ||
|
|
158
|
+
(requestCache && requestCache.get(unwrappedToken));
|
|
159
|
+
if (realInstance) {
|
|
160
|
+
const val = realInstance[prop];
|
|
161
|
+
return typeof val === 'function' ? val.bind(realInstance) : val;
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
},
|
|
165
|
+
set: (_, prop, value) => {
|
|
166
|
+
const realInstance = this.singletonCache.get(unwrappedToken) ||
|
|
167
|
+
(requestCache && requestCache.get(unwrappedToken));
|
|
168
|
+
if (realInstance) {
|
|
169
|
+
realInstance[prop] = value;
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
return false;
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
const provider = this.providers.get(unwrappedToken);
|
|
69
177
|
if (provider === undefined) {
|
|
70
|
-
if (typeof
|
|
178
|
+
if (typeof unwrappedToken === 'function') {
|
|
179
|
+
this.inFlight.add(unwrappedToken);
|
|
71
180
|
try {
|
|
72
|
-
const scope =
|
|
73
|
-
const instance = this.instantiateClass(
|
|
181
|
+
const scope = unwrappedToken.prototype?.[exports.SCOPE_METADATA] || 'singleton';
|
|
182
|
+
const instance = this.instantiateClass(unwrappedToken, requestCache);
|
|
74
183
|
if (scope === 'transient') {
|
|
75
184
|
return instance;
|
|
76
185
|
}
|
|
77
186
|
if (scope === 'request') {
|
|
78
187
|
if (!requestCache) {
|
|
79
|
-
throw new Error(`Cannot resolve request-scoped provider '${String(
|
|
188
|
+
throw new Error(`Cannot resolve request-scoped provider '${String(unwrappedToken)}' outside of a request context. This usually happens if you try to resolve a request-scoped dependency during app startup, inside a background job, or without passing the request context cache.`);
|
|
80
189
|
}
|
|
81
|
-
requestCache.set(
|
|
190
|
+
requestCache.set(unwrappedToken, instance);
|
|
82
191
|
}
|
|
83
192
|
else {
|
|
84
|
-
this.singletonCache.set(
|
|
193
|
+
this.singletonCache.set(unwrappedToken, instance);
|
|
85
194
|
}
|
|
86
195
|
return instance;
|
|
87
196
|
}
|
|
88
197
|
catch (err) {
|
|
89
198
|
const innerMsg = err instanceof Error ? err.message : String(err);
|
|
90
|
-
const error = new Error(`Cannot resolve provider for token: ${String(
|
|
199
|
+
const error = new Error(`Cannot resolve provider for token: ${String(unwrappedToken)}. Inner error: ${innerMsg}`);
|
|
91
200
|
error.cause = err;
|
|
92
201
|
throw error;
|
|
93
202
|
}
|
|
203
|
+
finally {
|
|
204
|
+
this.inFlight.delete(unwrappedToken);
|
|
205
|
+
}
|
|
94
206
|
}
|
|
95
|
-
throw new Error('Provider not found for token: ' + String(
|
|
207
|
+
throw new Error('Provider not found for token: ' + String(unwrappedToken));
|
|
96
208
|
}
|
|
97
209
|
let resolvedValue;
|
|
98
210
|
let scope = 'singleton';
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if ('scope' in provider && provider.scope) {
|
|
106
|
-
scope = provider.scope;
|
|
211
|
+
this.inFlight.add(unwrappedToken);
|
|
212
|
+
try {
|
|
213
|
+
if (typeof provider === 'function') {
|
|
214
|
+
const classScope = provider.prototype?.[exports.SCOPE_METADATA] || 'singleton';
|
|
215
|
+
scope = classScope;
|
|
216
|
+
resolvedValue = this.instantiateClass(provider, requestCache);
|
|
107
217
|
}
|
|
108
|
-
if (
|
|
109
|
-
|
|
218
|
+
else if (provider && typeof provider === 'object') {
|
|
219
|
+
if ('scope' in provider && provider.scope) {
|
|
220
|
+
scope = provider.scope;
|
|
221
|
+
}
|
|
222
|
+
if ('useValue' in provider) {
|
|
223
|
+
resolvedValue = provider.useValue;
|
|
224
|
+
}
|
|
225
|
+
else if ('useFactory' in provider) {
|
|
226
|
+
resolvedValue = provider.useFactory();
|
|
227
|
+
}
|
|
228
|
+
else if ('useClass' in provider) {
|
|
229
|
+
resolvedValue = this.instantiateClass(provider.useClass, requestCache);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
resolvedValue = provider;
|
|
233
|
+
}
|
|
110
234
|
}
|
|
111
|
-
else
|
|
112
|
-
resolvedValue = provider
|
|
235
|
+
else {
|
|
236
|
+
resolvedValue = provider;
|
|
237
|
+
}
|
|
238
|
+
if (scope === 'transient') {
|
|
239
|
+
return resolvedValue;
|
|
113
240
|
}
|
|
114
|
-
|
|
115
|
-
|
|
241
|
+
if (scope === 'request') {
|
|
242
|
+
if (!requestCache) {
|
|
243
|
+
throw new Error(`Cannot resolve request-scoped provider '${String(unwrappedToken)}' outside of a request context. This usually happens if you try to resolve a request-scoped dependency during app startup, inside a background job, or without passing the request context cache.`);
|
|
244
|
+
}
|
|
245
|
+
requestCache.set(unwrappedToken, resolvedValue);
|
|
116
246
|
}
|
|
117
247
|
else {
|
|
118
|
-
resolvedValue
|
|
248
|
+
this.singletonCache.set(unwrappedToken, resolvedValue);
|
|
119
249
|
}
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
resolvedValue = provider;
|
|
123
|
-
}
|
|
124
|
-
if (scope === 'transient') {
|
|
125
250
|
return resolvedValue;
|
|
126
251
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
throw new Error(`Cannot resolve request-scoped provider '${String(token)}' outside of a request context. This usually happens if you try to resolve a request-scoped dependency during app startup, inside a background job, or without passing the request context cache.`);
|
|
130
|
-
}
|
|
131
|
-
requestCache.set(token, resolvedValue);
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
this.singletonCache.set(token, resolvedValue);
|
|
252
|
+
finally {
|
|
253
|
+
this.inFlight.delete(unwrappedToken);
|
|
135
254
|
}
|
|
136
|
-
return resolvedValue;
|
|
137
255
|
}
|
|
138
256
|
async initLifecycle() {
|
|
139
257
|
for (const [, instance] of this.singletonCache) {
|
package/dist/di/container.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":"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"}
|
package/dist/di/decorators.d.ts
CHANGED
|
@@ -1,30 +1,48 @@
|
|
|
1
1
|
import { ProviderToken } from './container';
|
|
2
2
|
/**
|
|
3
|
-
* Parameter decorator that specifies a dependency token to inject
|
|
3
|
+
* Parameter or Property decorator that specifies a dependency token to inject.
|
|
4
|
+
* When applied to a property without an explicit token, the dependency type is automatically
|
|
5
|
+
* inferred from TypeScript's emitted metadata (`design:type`).
|
|
4
6
|
*
|
|
5
|
-
*
|
|
7
|
+
* Examples:
|
|
6
8
|
* ```ts
|
|
9
|
+
* // 1. Constructor Parameter Injection
|
|
7
10
|
* class UserService {
|
|
8
11
|
* constructor(
|
|
9
12
|
* @Inject('DATABASE_URL') private dbUrl: string,
|
|
10
13
|
* @Inject(LoggerService) private logger: LoggerService
|
|
11
14
|
* ) {}
|
|
12
15
|
* }
|
|
16
|
+
*
|
|
17
|
+
* // 2. Property Injection
|
|
18
|
+
* class OrderService {
|
|
19
|
+
* @Inject()
|
|
20
|
+
* private logger!: LoggerService
|
|
21
|
+
*
|
|
22
|
+
* @Inject('CONFIG')
|
|
23
|
+
* private config!: AppConfig
|
|
24
|
+
* }
|
|
13
25
|
* ```
|
|
14
26
|
*/
|
|
15
|
-
export declare function Inject(token
|
|
27
|
+
export declare function Inject(token?: ProviderToken): any;
|
|
16
28
|
/**
|
|
17
|
-
* Parameter decorator that marks a dependency as optional.
|
|
29
|
+
* Parameter or Property decorator that marks a dependency as optional.
|
|
18
30
|
* If the dependency cannot be resolved, `undefined` is injected instead of throwing an error.
|
|
19
31
|
*
|
|
20
32
|
* Example:
|
|
21
33
|
* ```ts
|
|
22
34
|
* class NotificationService {
|
|
35
|
+
* // Constructor
|
|
23
36
|
* constructor(
|
|
24
37
|
* @Inject('SLACK_WEBHOOK') @Optional() private webhook?: string
|
|
25
38
|
* ) {}
|
|
39
|
+
*
|
|
40
|
+
* // Property
|
|
41
|
+
* @Inject('METRICS')
|
|
42
|
+
* @Optional()
|
|
43
|
+
* private metrics?: MetricsService
|
|
26
44
|
* }
|
|
27
45
|
* ```
|
|
28
46
|
*/
|
|
29
|
-
export declare function Optional():
|
|
47
|
+
export declare function Optional(): any;
|
|
30
48
|
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/di/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/di/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,aAAa,EACd,MAAM,aAAa,CAAA;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,GAAG,CAwEjD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,QAAQ,IAAI,GAAG,CAyB9B"}
|
package/dist/di/decorators.js
CHANGED
|
@@ -4,55 +4,118 @@ exports.Inject = Inject;
|
|
|
4
4
|
exports.Optional = Optional;
|
|
5
5
|
const container_1 = require("./container");
|
|
6
6
|
/**
|
|
7
|
-
* Parameter decorator that specifies a dependency token to inject
|
|
7
|
+
* Parameter or Property decorator that specifies a dependency token to inject.
|
|
8
|
+
* When applied to a property without an explicit token, the dependency type is automatically
|
|
9
|
+
* inferred from TypeScript's emitted metadata (`design:type`).
|
|
8
10
|
*
|
|
9
|
-
*
|
|
11
|
+
* Examples:
|
|
10
12
|
* ```ts
|
|
13
|
+
* // 1. Constructor Parameter Injection
|
|
11
14
|
* class UserService {
|
|
12
15
|
* constructor(
|
|
13
16
|
* @Inject('DATABASE_URL') private dbUrl: string,
|
|
14
17
|
* @Inject(LoggerService) private logger: LoggerService
|
|
15
18
|
* ) {}
|
|
16
19
|
* }
|
|
20
|
+
*
|
|
21
|
+
* // 2. Property Injection
|
|
22
|
+
* class OrderService {
|
|
23
|
+
* @Inject()
|
|
24
|
+
* private logger!: LoggerService
|
|
25
|
+
*
|
|
26
|
+
* @Inject('CONFIG')
|
|
27
|
+
* private config!: AppConfig
|
|
28
|
+
* }
|
|
17
29
|
* ```
|
|
18
30
|
*/
|
|
19
31
|
function Inject(token) {
|
|
20
32
|
return function (target, propertyKey, parameterIndex) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
if (typeof parameterIndex === 'number') {
|
|
34
|
+
// 1. Parameter Decorator
|
|
35
|
+
let resolvedToken = token;
|
|
36
|
+
if (resolvedToken === undefined) {
|
|
37
|
+
const targetClass = typeof target === 'function' ? target : target.constructor;
|
|
38
|
+
const paramTypes = (typeof globalThis.Reflect?.getMetadata === 'function'
|
|
39
|
+
? globalThis.Reflect.getMetadata('design:paramtypes', targetClass)
|
|
40
|
+
: undefined) || [];
|
|
41
|
+
if (paramTypes[parameterIndex]) {
|
|
42
|
+
resolvedToken = paramTypes[parameterIndex];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (resolvedToken !== undefined) {
|
|
46
|
+
const targetObj = target;
|
|
47
|
+
const currentTokens = (targetObj[container_1.INJECT_METADATA] =
|
|
48
|
+
targetObj[container_1.INJECT_METADATA] || {});
|
|
49
|
+
currentTokens[parameterIndex] = resolvedToken;
|
|
50
|
+
if (targetObj.prototype) {
|
|
51
|
+
const protoTokens = (targetObj.prototype[container_1.INJECT_METADATA] =
|
|
52
|
+
targetObj.prototype[container_1.INJECT_METADATA] || {});
|
|
53
|
+
protoTokens[parameterIndex] = resolvedToken;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else if (propertyKey !== undefined) {
|
|
58
|
+
// 2. Property Decorator
|
|
59
|
+
let resolvedToken = token;
|
|
60
|
+
if (resolvedToken === undefined) {
|
|
61
|
+
const propType = typeof globalThis.Reflect?.getMetadata === 'function'
|
|
62
|
+
? globalThis.Reflect.getMetadata('design:type', target, propertyKey)
|
|
63
|
+
: undefined;
|
|
64
|
+
if (propType &&
|
|
65
|
+
typeof propType === 'function' &&
|
|
66
|
+
propType !== Object &&
|
|
67
|
+
propType !== String &&
|
|
68
|
+
propType !== Number &&
|
|
69
|
+
propType !== Boolean &&
|
|
70
|
+
propType !== Symbol &&
|
|
71
|
+
propType !== Array &&
|
|
72
|
+
propType !== Function) {
|
|
73
|
+
resolvedToken = propType;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const proto = typeof target === 'function' ? target.prototype : target;
|
|
77
|
+
const propInjections = (proto[container_1.PROPERTY_INJECT_METADATA] =
|
|
78
|
+
proto[container_1.PROPERTY_INJECT_METADATA] || []);
|
|
79
|
+
propInjections.push({ propertyKey, token: resolvedToken });
|
|
31
80
|
}
|
|
32
81
|
};
|
|
33
82
|
}
|
|
34
83
|
/**
|
|
35
|
-
* Parameter decorator that marks a dependency as optional.
|
|
84
|
+
* Parameter or Property decorator that marks a dependency as optional.
|
|
36
85
|
* If the dependency cannot be resolved, `undefined` is injected instead of throwing an error.
|
|
37
86
|
*
|
|
38
87
|
* Example:
|
|
39
88
|
* ```ts
|
|
40
89
|
* class NotificationService {
|
|
90
|
+
* // Constructor
|
|
41
91
|
* constructor(
|
|
42
92
|
* @Inject('SLACK_WEBHOOK') @Optional() private webhook?: string
|
|
43
93
|
* ) {}
|
|
94
|
+
*
|
|
95
|
+
* // Property
|
|
96
|
+
* @Inject('METRICS')
|
|
97
|
+
* @Optional()
|
|
98
|
+
* private metrics?: MetricsService
|
|
44
99
|
* }
|
|
45
100
|
* ```
|
|
46
101
|
*/
|
|
47
102
|
function Optional() {
|
|
48
103
|
return function (target, propertyKey, parameterIndex) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
targetObj[container_1.OPTIONAL_METADATA]
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
104
|
+
if (typeof parameterIndex === 'number') {
|
|
105
|
+
const targetObj = target;
|
|
106
|
+
const currentOptional = (targetObj[container_1.OPTIONAL_METADATA] =
|
|
107
|
+
targetObj[container_1.OPTIONAL_METADATA] || new Set());
|
|
108
|
+
currentOptional.add(parameterIndex);
|
|
109
|
+
if (targetObj.prototype) {
|
|
110
|
+
const protoOptional = (targetObj.prototype[container_1.OPTIONAL_METADATA] = targetObj.prototype[container_1.OPTIONAL_METADATA] || new Set());
|
|
111
|
+
protoOptional.add(parameterIndex);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else if (propertyKey !== undefined) {
|
|
115
|
+
const proto = typeof target === 'function' ? target.prototype : target;
|
|
116
|
+
const optProps = (proto[container_1.OPTIONAL_METADATA] =
|
|
117
|
+
proto[container_1.OPTIONAL_METADATA] || new Set());
|
|
118
|
+
optProps.add(propertyKey);
|
|
56
119
|
}
|
|
57
120
|
};
|
|
58
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/di/decorators.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/di/decorators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface ForwardReference<T = any> {
|
|
2
|
+
forwardRef: () => T;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Creates a lazy forward reference for resolving circular dependencies between providers or modules.
|
|
6
|
+
*
|
|
7
|
+
* Example:
|
|
8
|
+
* ```ts
|
|
9
|
+
* @Injectable()
|
|
10
|
+
* export class OrderService {
|
|
11
|
+
* constructor(
|
|
12
|
+
* @Inject(forwardRef(() => InventoryService))
|
|
13
|
+
* private inventoryService: InventoryService
|
|
14
|
+
* ) {}
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare function forwardRef<T = any>(fn: () => T): ForwardReference<T>;
|
|
19
|
+
/**
|
|
20
|
+
* Checks if a value is a ForwardReference wrapper.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isForwardRef(val: any): val is ForwardReference;
|
|
23
|
+
//# sourceMappingURL=forward-ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forward-ref.d.ts","sourceRoot":"","sources":["../../src/di/forward-ref.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,GAAG;IACvC,UAAU,EAAE,MAAM,CAAC,CAAA;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAEpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,gBAAgB,CAM9D"}
|