@nestjs/core 8.0.5 → 8.0.9

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
@@ -67,8 +67,11 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
67
67
 
68
68
  <table style="text-align:center;"><tr><td>
69
69
  <a href="https://careers.labster.com/departments/platform" target="_blank"><img src="https://nestjs.com/img/labster-logo.png" width="170" valign="middle" /></a></td><td>
70
- <a href="https://weld.so/" target="_blank"><img src="https://nestjs.com/img/weld-logo.svg" width="150" valign="middle" /></a></td><td>
71
- <a href="https://valor-software.com/" target="_blank"><img src="https://docs.nestjs.com/assets/sponsors/valor-software.png" width="170" valign="middle" /></a></td></tr></table>
70
+ <a href="https://weld.app/" target="_blank"><img src="https://nestjs.com/img/weld-logo.svg" width="150" valign="middle" /></a></td>
71
+ <td>
72
+ <a href="https://valor-software.com/" target="_blank"><img src="https://docs.nestjs.com/assets/sponsors/valor-software.png" width="170" valign="middle" /></a></td>
73
+ <td>
74
+ <a href="https://intrinsic.ventures/" target="_blank"><img src="https://nestjs.com/img/intrinisic-logo.png" width="210" valign="middle" /></a></td></</tr></table>
72
75
 
73
76
  #### Silver Sponsors
74
77
 
@@ -76,8 +79,9 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
76
79
  <a href="https://neoteric.eu/" target="_blank"><img src="https://nestjs.com/img/neoteric-cut.png" width="120" valign="middle" /></a> </td><td>
77
80
  <a href="http://gojob.com" target="_blank"><img src="http://nestjs.com/img/gojob-logo.png" valign="middle" width="100" /></a> </td><td>
78
81
  <a href="http://www.leogistics.com" target="_blank"><img src="https://nestjs.com/img/leogistics-logo.jpeg" width="150" valign="middle" /></td><td>
79
- <a href="http://www.meetdandy.com" target="_blank"><img src="https://nestjs.com/img/dandy-wide-logo.png" width="150" valign="middle" /></td><td>
80
- <a href="https://www.castlecraft.in" target="_blank"><img src="https://nestjs.com/img/castlecraft-logo.png" width="150" valign="middle" /></td></tr></table>
82
+ <a href="http://www.meetdandy.com" target="_blank"><img src="https://nestjs.com/img/dandy-roles-logo.svg" width="150" valign="middle" /></td><td>
83
+ <a href="https://www.castlecraft.in" target="_blank"><img src="https://nestjs.com/img/castlecraft-logo.png" width="150" valign="middle" /></td>
84
+ <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>
81
85
 
82
86
  #### Sponsors
83
87
 
@@ -108,6 +112,7 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
108
112
  <td align="center" valign="middle"><a href="https://www.bystored.com/" target="_blank"><img src="https://nestjs.com/img/stored-logo.svg" width="110" valign="middle" /></a></td>
109
113
  <td align="center" valign="middle"><a href="https://studyclerk.com/pay-for-research-paper" target="_blank"><img src="https://nestjs.com/img/studyclerk-logo.png" width="125" valign="middle" /></a></td><td align="center" valign="middle"><a href="https://xyndata.com" target="_blank"><img src="https://nestjs.com/img/xyndata-logo.png" width="125" valign="middle" /></a></td></tr><tr>
110
114
  <td align="center" valign="middle"><a href="https://www.anonymistic.com/" target="_blank"><img src="https://nestjs.com/img/anonymistic-logo.png" width="125" valign="middle" /></a></td>
115
+ <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>
111
116
  </tr></table>
112
117
 
113
118
  ## Backers
@@ -6,9 +6,9 @@ import { NestApplicationOptions } from '@nestjs/common/interfaces/nest-applicati
6
6
  * @publicApi
7
7
  */
8
8
  export declare abstract class AbstractHttpAdapter<TServer = any, TRequest = any, TResponse = any> implements HttpServer<TRequest, TResponse> {
9
- protected readonly instance: any;
9
+ protected instance?: any;
10
10
  protected httpServer: TServer;
11
- constructor(instance: any);
11
+ constructor(instance?: any);
12
12
  init(): Promise<void>;
13
13
  use(...args: any[]): any;
14
14
  get(handler: RequestHandler): any;
@@ -31,6 +31,7 @@ export declare abstract class AbstractHttpAdapter<TServer = any, TRequest = any,
31
31
  listen(port: string | number, hostname: string, callback?: () => void): any;
32
32
  getHttpServer(): TServer;
33
33
  setHttpServer(httpServer: TServer): void;
34
+ setInstance<T = any>(instance: T): void;
34
35
  getInstance<T = any>(): T;
35
36
  abstract close(): any;
36
37
  abstract initHttpServer(options: NestApplicationOptions): any;
@@ -46,6 +46,9 @@ class AbstractHttpAdapter {
46
46
  setHttpServer(httpServer) {
47
47
  this.httpServer = httpServer;
48
48
  }
49
+ setInstance(instance) {
50
+ this.instance = instance;
51
+ }
49
52
  getInstance() {
50
53
  return this.instance;
51
54
  }
@@ -48,7 +48,7 @@ export declare class ExternalContextCreator {
48
48
  type: any;
49
49
  data: any;
50
50
  }, pipes: PipeTransform[]): Promise<any>;
51
- transformToResult(resultOrDeffered: any): Promise<any>;
51
+ transformToResult(resultOrDeferred: any): Promise<any>;
52
52
  createGuardsFn<TContext extends string = ContextType>(guards: any[], instance: Controller, callback: (...args: any[]) => any, contextType?: TContext): Function | null;
53
53
  registerRequestProvider<T = any>(request: T, contextId: ContextId): void;
54
54
  }
@@ -147,11 +147,11 @@ class ExternalContextCreator {
147
147
  ? value
148
148
  : this.pipesConsumer.apply(value, { metatype, type, data }, pipes);
149
149
  }
150
- async transformToResult(resultOrDeffered) {
151
- if (resultOrDeffered && shared_utils_1.isFunction(resultOrDeffered.subscribe)) {
152
- return rxjs_1.lastValueFrom(resultOrDeffered);
150
+ async transformToResult(resultOrDeferred) {
151
+ if (resultOrDeferred && shared_utils_1.isFunction(resultOrDeferred.subscribe)) {
152
+ return rxjs_1.lastValueFrom(resultOrDeferred);
153
153
  }
154
- return resultOrDeffered;
154
+ return resultOrDeferred;
155
155
  }
156
156
  createGuardsFn(guards, instance, callback, contextType) {
157
157
  const canActivateFn = async (args) => {
@@ -32,7 +32,12 @@ function callOperator(instances, signal) {
32
32
  async function callBeforeAppShutdownHook(module, signal) {
33
33
  const providers = module.getNonAliasProviders();
34
34
  const [_, moduleClassHost] = providers.shift();
35
- const instances = [...module.controllers, ...providers];
35
+ const instances = [
36
+ ...module.controllers,
37
+ ...providers,
38
+ ...module.injectables,
39
+ ...module.middlewares,
40
+ ];
36
41
  const nonTransientInstances = transient_instances_1.getNonTransientInstances(instances);
37
42
  await Promise.all(callOperator(nonTransientInstances, signal));
38
43
  const transientInstances = transient_instances_1.getTransientInstances(instances);
@@ -47,7 +47,7 @@ class NestContainer {
47
47
  }
48
48
  const { type, dynamicMetadata, token } = await this.moduleCompiler.compile(metatype);
49
49
  if (this.modules.has(token)) {
50
- return;
50
+ return this.modules.get(token);
51
51
  }
52
52
  const moduleRef = new module_1.Module(type, this);
53
53
  moduleRef.token = token;
@@ -5,5 +5,5 @@ import { ExecutionContextHost } from '../helpers/execution-context-host';
5
5
  export declare class InterceptorsConsumer {
6
6
  intercept<TContext extends string = ContextType>(interceptors: NestInterceptor[], args: unknown[], instance: Controller, callback: (...args: unknown[]) => unknown, next: () => Promise<unknown>, type?: TContext): Promise<unknown>;
7
7
  createContext(args: unknown[], instance: Controller, callback: (...args: unknown[]) => unknown): ExecutionContextHost;
8
- transformDeffered(next: () => Promise<any>): Observable<any>;
8
+ transformDeferred(next: () => Promise<any>): Observable<any>;
9
9
  }
@@ -12,7 +12,7 @@ class InterceptorsConsumer {
12
12
  }
13
13
  const context = this.createContext(args, instance, callback);
14
14
  context.setType(type);
15
- const start$ = rxjs_1.defer(() => this.transformDeffered(next));
15
+ const start$ = rxjs_1.defer(() => this.transformDeferred(next));
16
16
  const nextFn = (i = 0) => async () => {
17
17
  if (i >= interceptors.length) {
18
18
  return start$;
@@ -27,10 +27,10 @@ class InterceptorsConsumer {
27
27
  createContext(args, instance, callback) {
28
28
  return new execution_context_host_1.ExecutionContextHost(args, instance.constructor, callback);
29
29
  }
30
- transformDeffered(next) {
30
+ transformDeferred(next) {
31
31
  return rxjs_1.from(next()).pipe(operators_1.switchMap(res => {
32
- const isDeffered = res instanceof Promise || res instanceof rxjs_1.Observable;
33
- return isDeffered ? res : Promise.resolve(res);
32
+ const isDeferred = res instanceof Promise || res instanceof rxjs_1.Observable;
33
+ return isDeferred ? res : Promise.resolve(res);
34
34
  }));
35
35
  }
36
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestjs/core",
3
- "version": "8.0.5",
3
+ "version": "8.0.9",
4
4
  "description": "Nest - modern, fast, powerful node.js web framework (@core)",
5
5
  "author": "Kamil Mysliwiec",
6
6
  "license": "MIT",
@@ -28,15 +28,15 @@
28
28
  },
29
29
  "dependencies": {
30
30
  "@nuxtjs/opencollective": "0.3.2",
31
- "fast-safe-stringify": "2.0.8",
31
+ "fast-safe-stringify": "2.1.1",
32
32
  "iterare": "1.2.1",
33
33
  "object-hash": "2.2.0",
34
34
  "path-to-regexp": "3.2.0",
35
- "tslib": "2.3.0",
35
+ "tslib": "2.3.1",
36
36
  "uuid": "8.3.2"
37
37
  },
38
38
  "devDependencies": {
39
- "@nestjs/common": "8.0.5"
39
+ "@nestjs/common": "8.0.9"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "@nestjs/common": "^8.0.0",
@@ -11,8 +11,8 @@ class PipesConsumer {
11
11
  return this.applyPipes(value, { metatype, type: token, data }, pipes);
12
12
  }
13
13
  async applyPipes(value, { metatype, type, data }, transforms) {
14
- return transforms.reduce(async (defferedValue, pipe) => {
15
- const val = await defferedValue;
14
+ return transforms.reduce(async (deferredValue, pipe) => {
15
+ const val = await deferredValue;
16
16
  const result = pipe.transform(val, { metatype, type, data });
17
17
  return result;
18
18
  }, Promise.resolve(value));
@@ -112,7 +112,7 @@ class RouterExplorer {
112
112
  if (isVersioned &&
113
113
  routePathMetadata.versioningOptions.type !== version_type_enum_1.VersioningType.URI) {
114
114
  // All versioning (except for URI Versioning) is done via the "Version Filter"
115
- routeHandler = this.applyVersionFilter(routePathMetadata, routeHandler);
115
+ routeHandler = this.applyVersionFilter(router, routePathMetadata, routeHandler);
116
116
  }
117
117
  routePathMetadata.methodPath = path;
118
118
  const pathsToRegister = this.routePathFactory.create(routePathMetadata, requestMethod);
@@ -159,9 +159,16 @@ class RouterExplorer {
159
159
  return next();
160
160
  };
161
161
  }
162
- applyVersionFilter(routePathMetadata, handler) {
162
+ applyVersionFilter(router, routePathMetadata, handler) {
163
163
  const { versioningOptions } = routePathMetadata;
164
164
  const version = this.routePathFactory.getVersion(routePathMetadata);
165
+ if (router === null || router === void 0 ? void 0 : router.applyVersionFilter) {
166
+ return router.applyVersionFilter(handler, version, versioningOptions);
167
+ }
168
+ /**
169
+ * This can be removed in the next major release.
170
+ * Left for backward-compatibility.
171
+ */
165
172
  return (req, res, next) => {
166
173
  var _a, _b, _c, _d;
167
174
  if (version === version_options_interface_1.VERSION_NEUTRAL) {
@@ -12,6 +12,7 @@ export declare class RouterModule {
12
12
  private readonly routes;
13
13
  constructor(modulesContainer: ModulesContainer, routes: Routes);
14
14
  static register(routes: Routes): DynamicModule;
15
+ private deepCloneRoutes;
15
16
  private initialize;
16
17
  private registerModulePathMetadata;
17
18
  private updateTargetModulesCache;
@@ -17,6 +17,7 @@ let RouterModule = RouterModule_1 = class RouterModule {
17
17
  constructor(modulesContainer, routes) {
18
18
  this.modulesContainer = modulesContainer;
19
19
  this.routes = routes;
20
+ this.routes = this.deepCloneRoutes(routes);
20
21
  this.initialize();
21
22
  }
22
23
  static register(routes) {
@@ -30,6 +31,17 @@ let RouterModule = RouterModule_1 = class RouterModule {
30
31
  ],
31
32
  };
32
33
  }
34
+ deepCloneRoutes(routes) {
35
+ return routes.map((routeOrType) => {
36
+ if (typeof routeOrType === 'function') {
37
+ return routeOrType;
38
+ }
39
+ if (routeOrType.children) {
40
+ return Object.assign(Object.assign({}, routeOrType), { children: this.deepCloneRoutes(routeOrType.children) });
41
+ }
42
+ return Object.assign({}, routeOrType);
43
+ });
44
+ }
33
45
  initialize() {
34
46
  const flattenedRoutes = utils_1.flattenRoutePaths(this.routes);
35
47
  flattenedRoutes.forEach(route => {
package/scanner.js CHANGED
@@ -166,8 +166,10 @@ class DependenciesScanner {
166
166
  modulesStack.push(moduleRef);
167
167
  const moduleImports = moduleRef.imports;
168
168
  moduleImports.forEach(importedModuleRef => {
169
- importedModuleRef.distance = distance;
170
- calculateDistance(importedModuleRef, distance + 1);
169
+ if (importedModuleRef) {
170
+ importedModuleRef.distance = distance;
171
+ calculateDistance(importedModuleRef, distance + 1);
172
+ }
171
173
  });
172
174
  };
173
175
  const rootModule = modulesGenerator.next().value;