@nestjs/core 8.2.6 → 8.4.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/Readme.md +8 -2
- package/helpers/context-utils.js +7 -3
- package/injector/injector.d.ts +4 -1
- package/injector/injector.js +35 -7
- package/injector/instance-wrapper.d.ts +2 -1
- package/injector/module.d.ts +12 -8
- package/middleware/container.d.ts +0 -1
- package/middleware/container.js +2 -6
- package/package.json +3 -3
- package/router/router-explorer.js +24 -0
- package/router/routes-resolver.js +4 -1
- package/router/sse-stream.js +1 -1
- package/scanner.js +1 -1
- package/CHANGELOG.md +0 -12
package/Readme.md
CHANGED
|
@@ -54,7 +54,7 @@ With official support, you can get expert help straight from Nest core team. We
|
|
|
54
54
|
|
|
55
55
|
## Support
|
|
56
56
|
|
|
57
|
-
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support
|
|
57
|
+
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support from the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).
|
|
58
58
|
|
|
59
59
|
#### Principal Sponsors
|
|
60
60
|
<table style="text-align:center;"><tr>
|
|
@@ -84,7 +84,8 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
|
|
|
84
84
|
<a href="https://www.myleodsc.com/" target="_blank"><img src="https://nestjs.com/img/myleo-logo.png" width="180" valign="middle" /></td><td>
|
|
85
85
|
<a href="https://careers.meetdandy.com/?gh_src=063ba61e3us" target="_blank"><img src="https://nestjs.com/img/dandy-roles-logo.svg" width="150" valign="middle" /></td><td>
|
|
86
86
|
<a href="https://www.castlecraft.in" target="_blank"><img src="https://nestjs.com/img/castlecraft-logo.png" width="150" valign="middle" /></td>
|
|
87
|
-
<td><a href="https://www.tinystacks.com" target="_blank"><img src="https://nestjs.com/img/tinystacks-logo.png#1" width="140" valign="middle" /></td
|
|
87
|
+
<td><a href="https://www.tinystacks.com" target="_blank"><img src="https://nestjs.com/img/tinystacks-logo.png#1" width="140" valign="middle" /></td>
|
|
88
|
+
<td><a href="https://n.inc" target="_blank"><img src="https://nestjs.com/img/n-inc-logo.svg" width="120" valign="middle" /></td></tr></table>
|
|
88
89
|
|
|
89
90
|
#### Sponsors
|
|
90
91
|
|
|
@@ -118,6 +119,11 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
|
|
|
118
119
|
<td align="center" valign="middle"><a href="https://www.naologic.com/" target="_blank"><img src="https://nestjs.com/img/naologic-logo.svg" width="125" valign="middle" /></a></td>
|
|
119
120
|
<td align="center" valign="middle"><a href="https://messaged.com/" target="_blank"><img src="https://nestjs.com/img/messaged-logo.png" width="50" valign="middle" /></a></td>
|
|
120
121
|
<td align="center" valign="middle"><a href="https://triplecore.io" target="_blank"><img src="https://nestjs.com/img/triplecore-logo.svg" width="50" valign="middle" /></a></td>
|
|
122
|
+
<td align="center" valign="middle"><a href="https://klqc.de" target="_blank"><img src="https://nestjs.com/img/klcqcl-logo.png" width="120" valign="middle" /></a></td>
|
|
123
|
+
<td align="center" valign="middle"><a href="https://thecasinowizard.com/bonuses/no-deposit-bonuses/" target="_blank"><img src="https://nestjs.com/img/casinowizard-logo.png" width="120" valign="middle" /></a></td></tr><tr>
|
|
124
|
+
<td align="center" valign="middle"><a href="https://polygon-software.ch/" target="_blank"><img src="https://nestjs.com/img/polygon-logo.svg" width="120" valign="middle" /></a></td>
|
|
125
|
+
<td align="center" valign="middle"><a href="https://mobilereality.pl/" target="_blank"><img src="https://nestjs.com/img/mobile-reality-logo.png" width="45" valign="middle" /></a></td>
|
|
126
|
+
<td align="center" valign="middle"><a href="https://boringowl.io/" target="_blank"><img src="https://nestjs.com/img/boringowl-logo.svg" width="120" valign="middle" /></a></td>
|
|
121
127
|
</tr></table>
|
|
122
128
|
|
|
123
129
|
## Backers
|
package/helpers/context-utils.js
CHANGED
|
@@ -19,11 +19,15 @@ class ContextUtils {
|
|
|
19
19
|
return Reflect.getMetadata(constants_1.RESPONSE_PASSTHROUGH_METADATA, instance.constructor, methodName);
|
|
20
20
|
}
|
|
21
21
|
getArgumentsLength(keys, metadata) {
|
|
22
|
-
return
|
|
22
|
+
return keys.length
|
|
23
|
+
? Math.max(...keys.map(key => metadata[key].index)) + 1
|
|
24
|
+
: 0;
|
|
23
25
|
}
|
|
24
26
|
createNullArray(length) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
const a = new Array(length);
|
|
28
|
+
for (let i = 0; i < length; ++i)
|
|
29
|
+
a[i] = undefined;
|
|
30
|
+
return a;
|
|
27
31
|
}
|
|
28
32
|
mergeParamsMetatypes(paramsProperties, paramtypes) {
|
|
29
33
|
if (!paramtypes) {
|
package/injector/injector.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { InjectionToken } from '@nestjs/common';
|
|
1
2
|
import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface';
|
|
2
3
|
import { Injectable } from '@nestjs/common/interfaces/injectable.interface';
|
|
3
4
|
import { Type } from '@nestjs/common/interfaces/type.interface';
|
|
@@ -6,7 +7,7 @@ import { InstanceToken, Module } from './module';
|
|
|
6
7
|
/**
|
|
7
8
|
* The type of an injectable dependency
|
|
8
9
|
*/
|
|
9
|
-
export declare type InjectorDependency =
|
|
10
|
+
export declare type InjectorDependency = InjectionToken;
|
|
10
11
|
/**
|
|
11
12
|
* The property-based dependency
|
|
12
13
|
*/
|
|
@@ -49,6 +50,8 @@ export declare class Injector {
|
|
|
49
50
|
loadProvider(wrapper: InstanceWrapper<Injectable>, moduleRef: Module, contextId?: ContextId, inquirer?: InstanceWrapper): Promise<void>;
|
|
50
51
|
applyDoneHook<T>(wrapper: InstancePerContext<T>): () => void;
|
|
51
52
|
resolveConstructorParams<T>(wrapper: InstanceWrapper<T>, moduleRef: Module, inject: InjectorDependency[], callback: (args: unknown[]) => void | Promise<void>, contextId?: ContextId, inquirer?: InstanceWrapper, parentInquirer?: InstanceWrapper): Promise<void>;
|
|
53
|
+
getClassDependencies<T>(wrapper: InstanceWrapper<T>): [InjectorDependency[], number[]];
|
|
54
|
+
getFactoryProviderDependencies<T>(wrapper: InstanceWrapper<T>): [InjectorDependency[], number[]];
|
|
52
55
|
reflectConstructorParams<T>(type: Type<T>): any[];
|
|
53
56
|
reflectOptionalParams<T>(type: Type<T>): any[];
|
|
54
57
|
reflectSelfParams<T>(type: Type<T>): any[];
|
package/injector/injector.js
CHANGED
|
@@ -89,12 +89,10 @@ class Injector {
|
|
|
89
89
|
const deps = await this.loadCtorMetadata(metadata, contextId, inquirer, parentInquirer);
|
|
90
90
|
return callback(deps);
|
|
91
91
|
}
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
? this.reflectOptionalParams(wrapper.metatype)
|
|
97
|
-
: [];
|
|
92
|
+
const isFactoryProvider = !shared_utils_1.isNil(inject);
|
|
93
|
+
const [dependencies, optionalDependenciesIds] = isFactoryProvider
|
|
94
|
+
? this.getFactoryProviderDependencies(wrapper)
|
|
95
|
+
: this.getClassDependencies(wrapper);
|
|
98
96
|
let isResolved = true;
|
|
99
97
|
const resolveParam = async (param, index) => {
|
|
100
98
|
try {
|
|
@@ -123,6 +121,35 @@ class Injector {
|
|
|
123
121
|
const instances = await Promise.all(dependencies.map(resolveParam));
|
|
124
122
|
isResolved && (await callback(instances));
|
|
125
123
|
}
|
|
124
|
+
getClassDependencies(wrapper) {
|
|
125
|
+
const ctorRef = wrapper.metatype;
|
|
126
|
+
return [
|
|
127
|
+
this.reflectConstructorParams(ctorRef),
|
|
128
|
+
this.reflectOptionalParams(ctorRef),
|
|
129
|
+
];
|
|
130
|
+
}
|
|
131
|
+
getFactoryProviderDependencies(wrapper) {
|
|
132
|
+
var _a, _b;
|
|
133
|
+
const optionalDependenciesIds = [];
|
|
134
|
+
const isOptionalFactoryDep = (item) => !shared_utils_1.isUndefined(item.token) &&
|
|
135
|
+
!shared_utils_1.isUndefined(item.optional);
|
|
136
|
+
const mapFactoryProviderInjectArray = (item, index) => {
|
|
137
|
+
if (typeof item !== 'object') {
|
|
138
|
+
return item;
|
|
139
|
+
}
|
|
140
|
+
if (isOptionalFactoryDep(item)) {
|
|
141
|
+
if (item.optional) {
|
|
142
|
+
optionalDependenciesIds.push(index);
|
|
143
|
+
}
|
|
144
|
+
return item === null || item === void 0 ? void 0 : item.token;
|
|
145
|
+
}
|
|
146
|
+
return item;
|
|
147
|
+
};
|
|
148
|
+
return [
|
|
149
|
+
(_b = (_a = wrapper.inject) === null || _a === void 0 ? void 0 : _a.map) === null || _b === void 0 ? void 0 : _b.call(_a, mapFactoryProviderInjectArray),
|
|
150
|
+
optionalDependenciesIds,
|
|
151
|
+
];
|
|
152
|
+
}
|
|
126
153
|
reflectConstructorParams(type) {
|
|
127
154
|
const paramtypes = Reflect.getMetadata(constants_1.PARAMTYPES_METADATA, type) || [];
|
|
128
155
|
const selfParams = this.reflectSelfParams(type);
|
|
@@ -184,8 +211,9 @@ class Injector {
|
|
|
184
211
|
return instanceWrapper;
|
|
185
212
|
}
|
|
186
213
|
async lookupComponent(providers, moduleRef, dependencyContext, wrapper, contextId = constants_2.STATIC_CONTEXT, inquirer, keyOrIndex) {
|
|
214
|
+
const token = wrapper.token || wrapper.name;
|
|
187
215
|
const { name } = dependencyContext;
|
|
188
|
-
if (wrapper &&
|
|
216
|
+
if (wrapper && token === name) {
|
|
189
217
|
throw new unknown_dependencies_exception_1.UnknownDependenciesException(wrapper.name, dependencyContext, moduleRef);
|
|
190
218
|
}
|
|
191
219
|
if (providers.has(name)) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Provider, Scope, Type } from '@nestjs/common';
|
|
2
|
+
import { FactoryProvider } from '@nestjs/common/interfaces';
|
|
2
3
|
import { InstanceToken, Module } from './module';
|
|
3
4
|
export declare const INSTANCE_METADATA_SYMBOL: unique symbol;
|
|
4
5
|
export declare const INSTANCE_ID_SYMBOL: unique symbol;
|
|
@@ -23,7 +24,7 @@ export declare class InstanceWrapper<T = any> {
|
|
|
23
24
|
readonly isAlias: boolean;
|
|
24
25
|
scope?: Scope;
|
|
25
26
|
metatype: Type<T> | Function;
|
|
26
|
-
inject?:
|
|
27
|
+
inject?: FactoryProvider['inject'];
|
|
27
28
|
forwardRef?: boolean;
|
|
28
29
|
private readonly values;
|
|
29
30
|
private readonly [INSTANCE_METADATA_SYMBOL];
|
package/injector/module.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ClassProvider, Controller, DynamicModule, ExistingProvider, FactoryProvider, Injectable, InjectionToken, NestModule, Provider, ValueProvider } from '@nestjs/common/interfaces';
|
|
2
2
|
import { Type } from '@nestjs/common/interfaces/type.interface';
|
|
3
3
|
import { NestContainer } from './container';
|
|
4
4
|
import { InstanceWrapper } from './instance-wrapper';
|
|
5
5
|
import { ModuleRef } from './module-ref';
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* @note
|
|
8
|
+
* Left for backward compatibility
|
|
9
|
+
*/
|
|
10
|
+
export declare type InstanceToken = InjectionToken;
|
|
7
11
|
export declare class Module {
|
|
8
12
|
private readonly _metatype;
|
|
9
13
|
private readonly container;
|
|
@@ -46,10 +50,10 @@ export declare class Module {
|
|
|
46
50
|
addModuleRef(): void;
|
|
47
51
|
addModuleAsProvider(): void;
|
|
48
52
|
addApplicationConfig(): void;
|
|
49
|
-
addInjectable<T extends Injectable>(injectable: Provider, host?: Type<T>):
|
|
50
|
-
addProvider(provider: Provider):
|
|
53
|
+
addInjectable<T extends Injectable>(injectable: Provider, host?: Type<T>): InjectionToken;
|
|
54
|
+
addProvider(provider: Provider): InjectionToken;
|
|
51
55
|
isCustomProvider(provider: Provider): provider is ClassProvider | FactoryProvider | ValueProvider | ExistingProvider;
|
|
52
|
-
addCustomProvider(provider: ClassProvider | FactoryProvider | ValueProvider | ExistingProvider, collection: Map<Function | string | symbol, any>):
|
|
56
|
+
addCustomProvider(provider: ClassProvider | FactoryProvider | ValueProvider | ExistingProvider, collection: Map<Function | string | symbol, any>): InjectionToken;
|
|
53
57
|
isCustomClass(provider: any): provider is ClassProvider;
|
|
54
58
|
isCustomValue(provider: any): provider is ValueProvider;
|
|
55
59
|
isCustomFactory(provider: any): provider is FactoryProvider;
|
|
@@ -59,9 +63,9 @@ export declare class Module {
|
|
|
59
63
|
addCustomValue(provider: ValueProvider, collection: Map<Function | string | symbol, InstanceWrapper>): void;
|
|
60
64
|
addCustomFactory(provider: FactoryProvider, collection: Map<Function | string | symbol, InstanceWrapper>): void;
|
|
61
65
|
addCustomUseExisting(provider: ExistingProvider, collection: Map<Function | string | symbol, InstanceWrapper>): void;
|
|
62
|
-
addExportedProvider(provider: Provider | string | symbol | DynamicModule): Set<
|
|
63
|
-
addCustomExportedProvider(provider: FactoryProvider | ValueProvider | ClassProvider | ExistingProvider): Set<
|
|
64
|
-
validateExportedProvider(token: InstanceToken):
|
|
66
|
+
addExportedProvider(provider: Provider | string | symbol | DynamicModule): Set<InjectionToken>;
|
|
67
|
+
addCustomExportedProvider(provider: FactoryProvider | ValueProvider | ClassProvider | ExistingProvider): Set<InjectionToken>;
|
|
68
|
+
validateExportedProvider(token: InstanceToken): InjectionToken;
|
|
65
69
|
addController(controller: Type<Controller>): void;
|
|
66
70
|
assignControllerUniqueId(controller: Type<Controller>): void;
|
|
67
71
|
addRelatedModule(module: Module): void;
|
package/middleware/container.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MiddlewareContainer = void 0;
|
|
4
|
-
const constants_1 = require("@nestjs/common/constants");
|
|
5
4
|
const instance_wrapper_1 = require("../injector/instance-wrapper");
|
|
5
|
+
const get_class_scope_1 = require("../helpers/get-class-scope");
|
|
6
6
|
class MiddlewareContainer {
|
|
7
7
|
constructor(container) {
|
|
8
8
|
this.container = container;
|
|
@@ -26,7 +26,7 @@ class MiddlewareContainer {
|
|
|
26
26
|
const insertMiddleware = (metatype) => {
|
|
27
27
|
const token = metatype;
|
|
28
28
|
middleware.set(token, new instance_wrapper_1.InstanceWrapper({
|
|
29
|
-
scope:
|
|
29
|
+
scope: get_class_scope_1.getClassScope(metatype),
|
|
30
30
|
name: token,
|
|
31
31
|
metatype,
|
|
32
32
|
token,
|
|
@@ -43,9 +43,5 @@ class MiddlewareContainer {
|
|
|
43
43
|
}
|
|
44
44
|
return this.configurationSets.get(moduleName);
|
|
45
45
|
}
|
|
46
|
-
getClassScope(type) {
|
|
47
|
-
const metadata = Reflect.getMetadata(constants_1.SCOPE_OPTIONS_METADATA, type);
|
|
48
|
-
return metadata && metadata.scope;
|
|
49
|
-
}
|
|
50
46
|
}
|
|
51
47
|
exports.MiddlewareContainer = MiddlewareContainer;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nestjs/core",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.4.0",
|
|
4
4
|
"description": "Nest - modern, fast, powerful node.js web framework (@core)",
|
|
5
5
|
"author": "Kamil Mysliwiec",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
"@nuxtjs/opencollective": "0.3.2",
|
|
31
31
|
"fast-safe-stringify": "2.1.1",
|
|
32
32
|
"iterare": "1.2.1",
|
|
33
|
-
"object-hash": "
|
|
33
|
+
"object-hash": "3.0.0",
|
|
34
34
|
"path-to-regexp": "3.2.0",
|
|
35
35
|
"tslib": "2.3.1",
|
|
36
36
|
"uuid": "8.3.2"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@nestjs/common": "8.
|
|
39
|
+
"@nestjs/common": "8.4.0"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
42
|
"@nestjs/common": "^8.0.0",
|
|
@@ -178,6 +178,30 @@ class RouterExplorer {
|
|
|
178
178
|
if (versioningOptions.type === version_type_enum_1.VersioningType.URI) {
|
|
179
179
|
return handler(req, res, next);
|
|
180
180
|
}
|
|
181
|
+
// Custom Extractor Versioning Handler
|
|
182
|
+
if (versioningOptions.type === version_type_enum_1.VersioningType.CUSTOM) {
|
|
183
|
+
const extractedVersion = versioningOptions.extractor(req);
|
|
184
|
+
if (Array.isArray(version)) {
|
|
185
|
+
if (Array.isArray(extractedVersion) &&
|
|
186
|
+
version.filter(extractedVersion.includes).length) {
|
|
187
|
+
return handler(req, res, next);
|
|
188
|
+
}
|
|
189
|
+
else if (shared_utils_1.isString(extractedVersion) &&
|
|
190
|
+
version.includes(extractedVersion)) {
|
|
191
|
+
return handler(req, res, next);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
if (Array.isArray(extractedVersion) &&
|
|
196
|
+
extractedVersion.includes(version)) {
|
|
197
|
+
return handler(req, res, next);
|
|
198
|
+
}
|
|
199
|
+
else if (shared_utils_1.isString(extractedVersion) &&
|
|
200
|
+
version === extractedVersion) {
|
|
201
|
+
return handler(req, res, next);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
181
205
|
// Media Type (Accept Header) Versioning Handler
|
|
182
206
|
if (versioningOptions.type === version_type_enum_1.VersioningType.MEDIA_TYPE) {
|
|
183
207
|
const MEDIA_TYPE_HEADER = 'Accept';
|
|
@@ -93,7 +93,10 @@ class RoutesResolver {
|
|
|
93
93
|
}
|
|
94
94
|
mapExternalException(err) {
|
|
95
95
|
switch (true) {
|
|
96
|
-
|
|
96
|
+
// SyntaxError is thrown by Express body-parser when given invalid JSON (#422, #430)
|
|
97
|
+
// URIError is thrown by Express when given a path parameter with an invalid percentage
|
|
98
|
+
// encoding, e.g. '%FF' (#8915)
|
|
99
|
+
case err instanceof SyntaxError || err instanceof URIError:
|
|
97
100
|
return new common_1.BadRequestException(err.message);
|
|
98
101
|
default:
|
|
99
102
|
return err;
|
package/router/sse-stream.js
CHANGED
|
@@ -46,7 +46,7 @@ class SseStream extends stream_1.Transform {
|
|
|
46
46
|
'X-Accel-Buffering': 'no' }));
|
|
47
47
|
destination.flushHeaders();
|
|
48
48
|
}
|
|
49
|
-
destination.write('
|
|
49
|
+
destination.write('\n');
|
|
50
50
|
return super.pipe(destination, options);
|
|
51
51
|
}
|
|
52
52
|
_transform(message, encoding, callback) {
|
package/scanner.js
CHANGED
|
@@ -10,8 +10,8 @@ const iterare_1 = require("iterare");
|
|
|
10
10
|
const application_config_1 = require("./application-config");
|
|
11
11
|
const constants_2 = require("./constants");
|
|
12
12
|
const circular_dependency_exception_1 = require("./errors/exceptions/circular-dependency.exception");
|
|
13
|
-
const invalid_module_exception_1 = require("./errors/exceptions/invalid-module.exception");
|
|
14
13
|
const invalid_class_module_exception_1 = require("./errors/exceptions/invalid-class-module.exception");
|
|
14
|
+
const invalid_module_exception_1 = require("./errors/exceptions/invalid-module.exception");
|
|
15
15
|
const undefined_module_exception_1 = require("./errors/exceptions/undefined-module.exception");
|
|
16
16
|
const get_class_scope_1 = require("./helpers/get-class-scope");
|
|
17
17
|
const internal_core_module_factory_1 = require("./injector/internal-core-module-factory");
|
package/CHANGELOG.md
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Change Log
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
|
-
|
|
6
|
-
<a name="8.2.0"></a>
|
|
7
|
-
# [8.2.0](https://github.com/nestjs/nest/compare/v8.1.2...v8.2.0) (2021-11-08)
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
**Note:** Version bump only for package @nestjs/core
|