@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 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 by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/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></tr></table>
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
@@ -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 Math.max(...keys.map(key => metadata[key].index)) + 1;
22
+ return keys.length
23
+ ? Math.max(...keys.map(key => metadata[key].index)) + 1
24
+ : 0;
23
25
  }
24
26
  createNullArray(length) {
25
- // eslint-disable-next-line prefer-spread
26
- return Array.apply(null, { length }).fill(undefined);
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) {
@@ -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 = Type<any> | Function | string | symbol;
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[];
@@ -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 dependencies = shared_utils_1.isNil(inject)
93
- ? this.reflectConstructorParams(wrapper.metatype)
94
- : inject;
95
- const optionalDependenciesIds = shared_utils_1.isNil(inject)
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 && wrapper.name === name) {
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?: (string | symbol | Function | Type<any>)[];
27
+ inject?: FactoryProvider['inject'];
27
28
  forwardRef?: boolean;
28
29
  private readonly values;
29
30
  private readonly [INSTANCE_METADATA_SYMBOL];
@@ -1,9 +1,13 @@
1
- import { Abstract, ClassProvider, Controller, DynamicModule, ExistingProvider, FactoryProvider, Injectable, NestModule, Provider, ValueProvider } from '@nestjs/common/interfaces';
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
- export declare type InstanceToken = string | symbol | Type<any> | Abstract<any> | Function;
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>): string | symbol | Function | Type<any> | Abstract<any>;
50
- addProvider(provider: Provider): string | symbol | Function;
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>): string | symbol | Function | Type<any> | Abstract<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<InstanceToken>;
63
- addCustomExportedProvider(provider: FactoryProvider | ValueProvider | ClassProvider | ExistingProvider): Set<InstanceToken>;
64
- validateExportedProvider(token: InstanceToken): 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;
@@ -11,5 +11,4 @@ export declare class MiddlewareContainer {
11
11
  getConfigurations(): Map<string, Set<MiddlewareConfiguration>>;
12
12
  insertConfig(configList: MiddlewareConfiguration[], moduleKey: string): void;
13
13
  private getTargetConfig;
14
- private getClassScope;
15
14
  }
@@ -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: this.getClassScope(metatype),
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.2.6",
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": "2.2.0",
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.2.6"
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
- case err instanceof SyntaxError:
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;
@@ -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(':\n');
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