@nestjs/core 9.4.3 → 10.0.1

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.
Files changed (69) hide show
  1. package/adapters/http-adapter.d.ts +2 -0
  2. package/adapters/http-adapter.js +3 -0
  3. package/discovery/discovery-module.js +2 -3
  4. package/discovery/discovery-service.js +2 -3
  5. package/errors/exception-handler.js +1 -1
  6. package/errors/exceptions-zone.js +1 -1
  7. package/errors/messages.js +7 -8
  8. package/exceptions/base-exception-filter.js +2 -2
  9. package/exceptions/exceptions-handler.d.ts +1 -1
  10. package/exceptions/exceptions-handler.js +3 -6
  11. package/exceptions/external-exception-filter.js +1 -1
  12. package/exceptions/external-exceptions-handler.d.ts +1 -1
  13. package/exceptions/external-exceptions-handler.js +3 -6
  14. package/helpers/context-id-factory.js +1 -2
  15. package/helpers/context-utils.js +4 -1
  16. package/helpers/execution-context-host.js +1 -0
  17. package/injector/abstract-instance-resolver.js +1 -1
  18. package/injector/compiler.js +2 -3
  19. package/injector/container.d.ts +6 -1
  20. package/injector/container.js +23 -3
  21. package/injector/helpers/provider-classifier.js +2 -2
  22. package/injector/helpers/transient-instances.d.ts +3 -3
  23. package/injector/injector.d.ts +7 -7
  24. package/injector/injector.js +24 -20
  25. package/injector/instance-links-host.d.ts +4 -4
  26. package/injector/instance-links-host.js +1 -1
  27. package/injector/instance-wrapper.d.ts +4 -4
  28. package/injector/instance-wrapper.js +17 -10
  29. package/injector/internal-core-module/internal-core-module-factory.d.ts +2 -1
  30. package/injector/internal-core-module/internal-core-module-factory.js +2 -6
  31. package/injector/internal-core-module/internal-core-module.js +2 -3
  32. package/injector/lazy-module-loader/lazy-module-loader.d.ts +3 -1
  33. package/injector/lazy-module-loader/lazy-module-loader.js +7 -3
  34. package/injector/module.d.ts +12 -29
  35. package/injector/module.js +14 -32
  36. package/inspector/deterministic-uuid-registry.js +1 -1
  37. package/inspector/graph-inspector.js +18 -14
  38. package/inspector/initialize-on-preview.allowlist.js +1 -1
  39. package/inspector/partial-graph.host.js +2 -4
  40. package/inspector/serialized-graph.js +15 -8
  41. package/inspector/uuid-factory.js +2 -2
  42. package/interceptors/interceptors-consumer.js +4 -5
  43. package/middleware/builder.js +26 -3
  44. package/middleware/container.d.ts +2 -2
  45. package/middleware/container.js +1 -2
  46. package/middleware/middleware-module.js +4 -4
  47. package/middleware/route-info-path-extractor.js +1 -2
  48. package/middleware/routes-mapper.d.ts +5 -2
  49. package/middleware/routes-mapper.js +45 -26
  50. package/middleware/utils.js +2 -3
  51. package/nest-application-context.js +3 -5
  52. package/nest-application.js +9 -10
  53. package/nest-factory.js +3 -3
  54. package/package.json +6 -6
  55. package/repl/native-functions/help-repl-fn.js +1 -1
  56. package/repl/native-functions/methods-repl-fn.js +1 -1
  57. package/repl/repl-context.js +6 -5
  58. package/repl/repl-logger.js +1 -1
  59. package/repl/repl-native-commands.js +1 -1
  60. package/router/route-path-factory.d.ts +4 -2
  61. package/router/route-path-factory.js +20 -4
  62. package/router/router-execution-context.js +1 -2
  63. package/router/router-explorer.js +12 -2
  64. package/router/router-module.js +8 -6
  65. package/router/routes-resolver.js +3 -3
  66. package/router/sse-stream.js +9 -4
  67. package/scanner.d.ts +17 -3
  68. package/scanner.js +49 -10
  69. package/services/reflector.service.js +4 -1
@@ -13,7 +13,7 @@ exports.targetModulesByContainer = new WeakMap();
13
13
  /**
14
14
  * @publicApi
15
15
  */
16
- let RouterModule = RouterModule_1 = class RouterModule {
16
+ let RouterModule = exports.RouterModule = RouterModule_1 = class RouterModule {
17
17
  constructor(modulesContainer, routes) {
18
18
  this.modulesContainer = modulesContainer;
19
19
  this.routes = routes;
@@ -37,9 +37,12 @@ let RouterModule = RouterModule_1 = class RouterModule {
37
37
  return routeOrType;
38
38
  }
39
39
  if (routeOrType.children) {
40
- return Object.assign(Object.assign({}, routeOrType), { children: this.deepCloneRoutes(routeOrType.children) });
40
+ return {
41
+ ...routeOrType,
42
+ children: this.deepCloneRoutes(routeOrType.children),
43
+ };
41
44
  }
42
- return Object.assign({}, routeOrType);
45
+ return { ...routeOrType };
43
46
  });
44
47
  }
45
48
  initialize() {
@@ -62,16 +65,15 @@ let RouterModule = RouterModule_1 = class RouterModule {
62
65
  moduleClassSet = new WeakSet();
63
66
  exports.targetModulesByContainer.set(this.modulesContainer, moduleClassSet);
64
67
  }
65
- const moduleRef = Array.from(this.modulesContainer.values()).find(item => (item === null || item === void 0 ? void 0 : item.metatype) === moduleCtor);
68
+ const moduleRef = Array.from(this.modulesContainer.values()).find(item => item?.metatype === moduleCtor);
66
69
  if (!moduleRef) {
67
70
  return;
68
71
  }
69
72
  moduleClassSet.add(moduleRef);
70
73
  }
71
74
  };
72
- RouterModule = RouterModule_1 = tslib_1.__decorate([
75
+ exports.RouterModule = RouterModule = RouterModule_1 = tslib_1.__decorate([
73
76
  (0, common_1.Module)({}),
74
77
  tslib_1.__param(1, (0, common_1.Inject)(exports.ROUTES)),
75
78
  tslib_1.__metadata("design:paramtypes", [modules_container_1.ModulesContainer, Array])
76
79
  ], RouterModule);
77
- exports.RouterModule = RouterModule;
@@ -105,16 +105,16 @@ class RoutesResolver {
105
105
  getModulePathMetadata(metatype) {
106
106
  const modulesContainer = this.container.getModules();
107
107
  const modulePath = Reflect.getMetadata(constants_1.MODULE_PATH + modulesContainer.applicationId, metatype);
108
- return modulePath !== null && modulePath !== void 0 ? modulePath : Reflect.getMetadata(constants_1.MODULE_PATH, metatype);
108
+ return modulePath ?? Reflect.getMetadata(constants_1.MODULE_PATH, metatype);
109
109
  }
110
110
  getHostMetadata(metatype) {
111
111
  return Reflect.getMetadata(constants_1.HOST_METADATA, metatype);
112
112
  }
113
113
  getVersionMetadata(metatype) {
114
- var _a;
115
114
  const versioningConfig = this.applicationConfig.getVersioning();
116
115
  if (versioningConfig) {
117
- return ((_a = Reflect.getMetadata(constants_1.VERSION_METADATA, metatype)) !== null && _a !== void 0 ? _a : versioningConfig.defaultVersion);
116
+ return (Reflect.getMetadata(constants_1.VERSION_METADATA, metatype) ??
117
+ versioningConfig.defaultVersion);
118
118
  }
119
119
  }
120
120
  }
@@ -37,13 +37,18 @@ class SseStream extends stream_1.Transform {
37
37
  }
38
38
  pipe(destination, options) {
39
39
  if (destination.writeHead) {
40
- destination.writeHead(200, Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.additionalHeaders), {
40
+ destination.writeHead(200, {
41
+ ...options?.additionalHeaders,
41
42
  // See https://github.com/dunglas/mercure/blob/master/hub/subscribe.go#L124-L130
42
- 'Content-Type': 'text/event-stream', Connection: 'keep-alive',
43
+ 'Content-Type': 'text/event-stream',
44
+ Connection: 'keep-alive',
43
45
  // Disable cache, even for old browsers and proxies
44
- 'Cache-Control': 'private, no-cache, no-store, must-revalidate, max-age=0, no-transform', Pragma: 'no-cache', Expire: '0',
46
+ 'Cache-Control': 'private, no-cache, no-store, must-revalidate, max-age=0, no-transform',
47
+ Pragma: 'no-cache',
48
+ Expire: '0',
45
49
  // NGINX support https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/#x-accel-buffering
46
- 'X-Accel-Buffering': 'no' }));
50
+ 'X-Accel-Buffering': 'no',
51
+ });
47
52
  destination.flushHeaders();
48
53
  }
49
54
  destination.write('\n');
package/scanner.d.ts CHANGED
@@ -6,7 +6,15 @@ import { NestContainer } from './injector/container';
6
6
  import { InstanceWrapper } from './injector/instance-wrapper';
7
7
  import { Module } from './injector/module';
8
8
  import { GraphInspector } from './inspector/graph-inspector';
9
+ import { ModuleDefinition } from './interfaces/module-definition.interface';
10
+ import { ModuleOverride } from './interfaces/module-override.interface';
9
11
  import { MetadataScanner } from './metadata-scanner';
12
+ interface ModulesScanParameters {
13
+ moduleDefinition: ModuleDefinition;
14
+ scope?: Type<unknown>[];
15
+ ctxRegistry?: (ForwardReference | DynamicModule | Type<unknown>)[];
16
+ overrides?: ModuleOverride[];
17
+ }
10
18
  export declare class DependenciesScanner {
11
19
  private readonly container;
12
20
  private readonly metadataScanner;
@@ -14,8 +22,10 @@ export declare class DependenciesScanner {
14
22
  private readonly applicationConfig;
15
23
  private readonly applicationProvidersApplyMap;
16
24
  constructor(container: NestContainer, metadataScanner: MetadataScanner, graphInspector: GraphInspector, applicationConfig?: ApplicationConfig);
17
- scan(module: Type<any>): Promise<void>;
18
- scanForModules(moduleDefinition: ForwardReference | Type<unknown> | DynamicModule | Promise<DynamicModule>, scope?: Type<unknown>[], ctxRegistry?: (ForwardReference | DynamicModule | Type<unknown>)[]): Promise<Module[]>;
25
+ scan(module: Type<any>, options?: {
26
+ overrides?: ModuleOverride[];
27
+ }): Promise<void>;
28
+ scanForModules({ moduleDefinition, scope, ctxRegistry, overrides, }: ModulesScanParameters): Promise<Module[]>;
19
29
  insertModule(moduleDefinition: any, scope: Type<unknown>[]): Promise<Module | undefined>;
20
30
  scanModulesForDependencies(modules?: Map<string, Module>): Promise<void>;
21
31
  reflectImports(module: Type<unknown>, token: string, context: string): Promise<void>;
@@ -36,8 +46,11 @@ export declare class DependenciesScanner {
36
46
  insertInjectable(injectable: Type<Injectable> | object, token: string, host: Type<Injectable>, subtype: EnhancerSubtype, methodKey?: string): InstanceWrapper<any>;
37
47
  insertExportedProvider(exportedProvider: Type<Injectable>, token: string): void;
38
48
  insertController(controller: Type<Controller>, token: string): void;
49
+ private insertOrOverrideModule;
50
+ private getOverrideModuleByModule;
51
+ private overrideModule;
39
52
  reflectMetadata<T = any>(metadataKey: string, metatype: Type<any>): T[];
40
- registerCoreModule(): Promise<void>;
53
+ registerCoreModule(overrides?: ModuleOverride[]): Promise<void>;
41
54
  /**
42
55
  * Add either request or transient globally scoped enhancers
43
56
  * to all controllers metadata storage
@@ -69,3 +82,4 @@ export declare class DependenciesScanner {
69
82
  private isForwardReference;
70
83
  private isRequestOrTransient;
71
84
  }
85
+ export {};
package/scanner.js CHANGED
@@ -22,16 +22,22 @@ class DependenciesScanner {
22
22
  this.applicationConfig = applicationConfig;
23
23
  this.applicationProvidersApplyMap = [];
24
24
  }
25
- async scan(module) {
26
- await this.registerCoreModule();
27
- await this.scanForModules(module);
25
+ async scan(module, options) {
26
+ await this.registerCoreModule(options?.overrides);
27
+ await this.scanForModules({
28
+ moduleDefinition: module,
29
+ overrides: options?.overrides,
30
+ });
28
31
  await this.scanModulesForDependencies();
29
32
  this.calculateModulesDistance();
30
33
  this.addScopedEnhancersMetadata();
31
34
  this.container.bindGlobalScope();
32
35
  }
33
- async scanForModules(moduleDefinition, scope = [], ctxRegistry = []) {
34
- const moduleInstance = await this.insertModule(moduleDefinition, scope);
36
+ async scanForModules({ moduleDefinition, scope = [], ctxRegistry = [], overrides = [], }) {
37
+ const moduleInstance = await this.insertOrOverrideModule(moduleDefinition, overrides, scope);
38
+ moduleDefinition =
39
+ this.getOverrideModuleByModule(moduleDefinition, overrides)?.newModule ??
40
+ moduleDefinition;
35
41
  moduleDefinition =
36
42
  moduleDefinition instanceof Promise
37
43
  ? await moduleDefinition
@@ -58,7 +64,12 @@ class DependenciesScanner {
58
64
  if (ctxRegistry.includes(innerModule)) {
59
65
  continue;
60
66
  }
61
- const moduleRefs = await this.scanForModules(innerModule, [].concat(scope, moduleDefinition), ctxRegistry);
67
+ const moduleRefs = await this.scanForModules({
68
+ moduleDefinition: innerModule,
69
+ scope: [].concat(scope, moduleDefinition),
70
+ ctxRegistry,
71
+ overrides,
72
+ });
62
73
  registeredModuleRefs = registeredModuleRefs.concat(moduleRefs);
63
74
  }
64
75
  if (!moduleInstance) {
@@ -236,7 +247,11 @@ class DependenciesScanner {
236
247
  providerKey: providerToken,
237
248
  scope,
238
249
  });
239
- const newProvider = Object.assign(Object.assign({}, provider), { provide: providerToken, scope });
250
+ const newProvider = {
251
+ ...provider,
252
+ provide: providerToken,
253
+ scope,
254
+ };
240
255
  const enhancerSubtype = constants_2.ENHANCER_TOKEN_TO_SUBTYPE_MAP[type];
241
256
  const factoryOrClassProvider = newProvider;
242
257
  if (this.isRequestOrTransient(factoryOrClassProvider.scope)) {
@@ -273,12 +288,36 @@ class DependenciesScanner {
273
288
  insertController(controller, token) {
274
289
  this.container.addController(controller, token);
275
290
  }
291
+ insertOrOverrideModule(moduleDefinition, overrides, scope) {
292
+ const overrideModule = this.getOverrideModuleByModule(moduleDefinition, overrides);
293
+ if (overrideModule !== undefined) {
294
+ return this.overrideModule(moduleDefinition, overrideModule.newModule, scope);
295
+ }
296
+ return this.insertModule(moduleDefinition, scope);
297
+ }
298
+ getOverrideModuleByModule(module, overrides) {
299
+ if (this.isForwardReference(module)) {
300
+ return overrides.find(moduleToOverride => {
301
+ return (moduleToOverride.moduleToReplace === module.forwardRef() ||
302
+ moduleToOverride.moduleToReplace.forwardRef?.() === module.forwardRef());
303
+ });
304
+ }
305
+ return overrides.find(moduleToOverride => moduleToOverride.moduleToReplace === module);
306
+ }
307
+ async overrideModule(moduleToOverride, newModule, scope) {
308
+ return this.container.replaceModule(this.isForwardReference(moduleToOverride)
309
+ ? moduleToOverride.forwardRef()
310
+ : moduleToOverride, this.isForwardReference(newModule) ? newModule.forwardRef() : newModule, scope);
311
+ }
276
312
  reflectMetadata(metadataKey, metatype) {
277
313
  return Reflect.getMetadata(metadataKey, metatype) || [];
278
314
  }
279
- async registerCoreModule() {
280
- const moduleDefinition = internal_core_module_factory_1.InternalCoreModuleFactory.create(this.container, this, this.container.getModuleCompiler(), this.container.getHttpAdapterHostRef(), this.graphInspector);
281
- const [instance] = await this.scanForModules(moduleDefinition);
315
+ async registerCoreModule(overrides) {
316
+ const moduleDefinition = internal_core_module_factory_1.InternalCoreModuleFactory.create(this.container, this, this.container.getModuleCompiler(), this.container.getHttpAdapterHostRef(), this.graphInspector, overrides);
317
+ const [instance] = await this.scanForModules({
318
+ moduleDefinition,
319
+ overrides,
320
+ });
282
321
  this.container.registerCoreModuleRef(instance);
283
322
  }
284
323
  /**
@@ -50,7 +50,10 @@ class Reflector {
50
50
  return a.concat(b);
51
51
  }
52
52
  if ((0, shared_utils_1.isObject)(a) && (0, shared_utils_1.isObject)(b)) {
53
- return Object.assign(Object.assign({}, a), b);
53
+ return {
54
+ ...a,
55
+ ...b,
56
+ };
54
57
  }
55
58
  return [a, b];
56
59
  });