@nestjs/core 9.2.0 → 9.3.0-beta.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 (60) hide show
  1. package/LICENSE +1 -1
  2. package/Readme.md +8 -3
  3. package/constants.d.ts +2 -0
  4. package/constants.js +7 -1
  5. package/errors/messages.js +16 -4
  6. package/injector/container.d.ts +9 -5
  7. package/injector/container.js +14 -9
  8. package/injector/injector.d.ts +4 -0
  9. package/injector/injector.js +7 -1
  10. package/injector/instance-loader.d.ts +6 -4
  11. package/injector/instance-loader.js +17 -7
  12. package/injector/instance-wrapper.d.ts +3 -0
  13. package/injector/instance-wrapper.js +10 -1
  14. package/injector/internal-core-module/internal-core-module-factory.d.ts +2 -1
  15. package/injector/internal-core-module/internal-core-module-factory.js +16 -8
  16. package/injector/module.d.ts +18 -7
  17. package/injector/module.js +50 -13
  18. package/injector/modules-container.d.ts +1 -0
  19. package/injector/modules-container.js +3 -0
  20. package/inspector/deterministic-uuid-registry.d.ts +5 -0
  21. package/inspector/deterministic-uuid-registry.js +20 -0
  22. package/inspector/graph-inspector.d.ts +25 -0
  23. package/inspector/graph-inspector.js +136 -0
  24. package/inspector/interfaces/edge.interface.d.ts +28 -0
  25. package/inspector/interfaces/edge.interface.js +2 -0
  26. package/inspector/interfaces/enhancer-metadata-cache-entry.interface.d.ts +12 -0
  27. package/inspector/interfaces/enhancer-metadata-cache-entry.interface.js +2 -0
  28. package/inspector/interfaces/entrypoint.interface.d.ts +23 -0
  29. package/inspector/interfaces/entrypoint.interface.js +2 -0
  30. package/inspector/interfaces/extras.interface.d.ts +18 -0
  31. package/inspector/interfaces/extras.interface.js +2 -0
  32. package/inspector/interfaces/node.interface.d.ts +47 -0
  33. package/inspector/interfaces/node.interface.js +2 -0
  34. package/inspector/noop-graph-inspector.d.ts +2 -0
  35. package/inspector/noop-graph-inspector.js +5 -0
  36. package/inspector/serialized-graph.d.ts +56 -0
  37. package/inspector/serialized-graph.js +104 -0
  38. package/middleware/container.js +2 -1
  39. package/middleware/middleware-module.d.ts +3 -1
  40. package/middleware/middleware-module.js +18 -2
  41. package/middleware/resolver.d.ts +3 -2
  42. package/middleware/resolver.js +7 -8
  43. package/middleware/routes-mapper.d.ts +1 -1
  44. package/middleware/routes-mapper.js +3 -3
  45. package/nest-application-context.d.ts +10 -5
  46. package/nest-application-context.js +39 -4
  47. package/nest-application.d.ts +6 -4
  48. package/nest-application.js +28 -8
  49. package/nest-factory.d.ts +5 -4
  50. package/nest-factory.js +27 -14
  51. package/package.json +2 -2
  52. package/router/paths-explorer.d.ts +18 -0
  53. package/router/paths-explorer.js +37 -0
  54. package/router/router-explorer.d.ts +8 -9
  55. package/router/router-explorer.js +22 -31
  56. package/router/routes-resolver.d.ts +3 -2
  57. package/router/routes-resolver.js +2 -2
  58. package/scanner.d.ts +14 -8
  59. package/scanner.js +67 -36
  60. package/tsconfig.build.json +21 -0
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  (The MIT License)
2
2
 
3
- Copyright (c) 2017-2022 Kamil Mysliwiec <https://kamilmysliwiec.com>
3
+ Copyright (c) 2017-2023 Kamil Mysliwiec <https://kamilmysliwiec.com>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
package/Readme.md CHANGED
@@ -78,7 +78,10 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
78
78
  <td>
79
79
  <a href="https://jetbrains.com/" target="_blank"><img src="https://nestjs.com/img/jetbrains-logo.svg" width="110" valign="middle" /></a></td><td>
80
80
  <a href="https://snyk.co/nestjs" target="_blank"><img src="https://nestjs.com/img/snyk-logo-black.png" width="185" valign="middle" /></a></td><td>
81
- <a href="https://fuseautotech.com/" target="_blank"><img src="https://nestjs.com/img/fuse-logo.svg" width="105" valign="middle" /></a></td></</tr></table>
81
+ <a href="https://fuseautotech.com/" target="_blank"><img src="https://nestjs.com/img/fuse-logo.svg" width="105" valign="middle" /></a></td>
82
+ <td>
83
+ <a href="https://ridicorp.com/career/" target="_blank"><img src="https://nestjs.com/img/ridi-logo.svg" width="105" valign="middle" /></a></td><td>
84
+ <a href="https://www.movavi.com/imovie-for-windows.html" target="_blank"><img src="https://nestjs.com/img/movavi-logo.svg" width="105" valign="middle" /></a></td></</tr></table>
82
85
 
83
86
  #### Silver Sponsors
84
87
 
@@ -91,7 +94,8 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
91
94
  <td><a href="https://www.tinystacks.com" target="_blank"><img src="https://nestjs.com/img/tinystacks-logo.png#1" width="140" valign="middle" /></td>
92
95
  <td><a href="https://n.inc" target="_blank"><img src="https://nestjs.com/img/n-inc-logo.svg" width="120" valign="middle" /></td></tr><tr>
93
96
  <td><a href="https://bilberrry.com/" target="_blank"><img src="https://nestjs.com/img/bilberrry-logo.svg" width="180" valign="middle" /></td>
94
- <td><a href="https://ipinfo.ai/" target="_blank"><img src="https://nestjs.com/img/ipinfo-logo.png" width="130" valign="middle" /></td></tr>
97
+ <td><a href="https://ipinfo.ai/" target="_blank"><img src="https://nestjs.com/img/ipinfo-logo.png" width="130" valign="middle" /></td>
98
+ <td><a href="https://chax.at" target="_blank"><img src="https://nestjs.com/img/chaxat-logo.png" width="100" valign="middle" /></td></tr>
95
99
  </table>
96
100
 
97
101
  #### Sponsors
@@ -132,7 +136,8 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
132
136
  <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>
133
137
  <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>
134
138
  <td align="center" valign="middle"><a href="https://www.mobilefactory.jp/" target="_blank"><img src="https://nestjs.com/img/mobilefactory-logo.png" width="100" valign="middle" /></a></td>
135
- <td align="center" valign="middle"><a href="https://db.nordbot.app/" target="_blank"><img src="https://nestjs.com/img/nord-logo.png" width="50" valign="middle" /></a></td>
139
+ <td align="center" valign="middle"><a href="https://nordbot.app/" target="_blank"><img src="https://nestjs.com/img/nordbot-logo.png" width="120" valign="middle" /></a></td>
140
+ <td align="center" valign="middle"><a href="https://doppio.sh/" target="_blank"><img src="https://nestjs.com/img/dopiosh-logo.png" width="50" valign="middle" /></a></td>
136
141
  </tr></table>
137
142
 
138
143
  ## Backers
package/constants.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { EnhancerSubtype } from '@nestjs/common/constants';
1
2
  export declare const MESSAGES: {
2
3
  APPLICATION_START: string;
3
4
  APPLICATION_READY: string;
@@ -10,3 +11,4 @@ export declare const APP_INTERCEPTOR = "APP_INTERCEPTOR";
10
11
  export declare const APP_PIPE = "APP_PIPE";
11
12
  export declare const APP_GUARD = "APP_GUARD";
12
13
  export declare const APP_FILTER = "APP_FILTER";
14
+ export declare const ENHANCER_TOKEN_TO_SUBTYPE_MAP: Record<typeof APP_GUARD | typeof APP_PIPE | typeof APP_FILTER | typeof APP_INTERCEPTOR, EnhancerSubtype>;
package/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.APP_FILTER = exports.APP_GUARD = exports.APP_PIPE = exports.APP_INTERCEPTOR = exports.MESSAGES = void 0;
3
+ exports.ENHANCER_TOKEN_TO_SUBTYPE_MAP = exports.APP_FILTER = exports.APP_GUARD = exports.APP_PIPE = exports.APP_INTERCEPTOR = exports.MESSAGES = void 0;
4
4
  exports.MESSAGES = {
5
5
  APPLICATION_START: `Starting Nest application...`,
6
6
  APPLICATION_READY: `Nest application successfully started`,
@@ -13,3 +13,9 @@ exports.APP_INTERCEPTOR = 'APP_INTERCEPTOR';
13
13
  exports.APP_PIPE = 'APP_PIPE';
14
14
  exports.APP_GUARD = 'APP_GUARD';
15
15
  exports.APP_FILTER = 'APP_FILTER';
16
+ exports.ENHANCER_TOKEN_TO_SUBTYPE_MAP = {
17
+ [exports.APP_GUARD]: 'guard',
18
+ [exports.APP_INTERCEPTOR]: 'interceptor',
19
+ [exports.APP_PIPE]: 'pipe',
20
+ [exports.APP_FILTER]: 'filter',
21
+ };
@@ -40,17 +40,29 @@ const getModuleName = (module) => (module && getInstanceName(module.metatype)) |
40
40
  const stringifyScope = (scope) => (scope || []).map(getInstanceName).join(' -> ');
41
41
  const UNKNOWN_DEPENDENCIES_MESSAGE = (type, unknownDependencyContext, module) => {
42
42
  const { index, name = 'dependency', dependencies, key, } = unknownDependencyContext;
43
- const moduleName = getModuleName(module) || 'Module';
43
+ const moduleName = getModuleName(module);
44
44
  const dependencyName = getDependencyName(name);
45
- let message = `Nest can't resolve dependencies of the ${type.toString()}`;
46
- const potentialSolutions = `\n
45
+ const potentialSolutions =
46
+ // If module's name is well defined
47
+ moduleName !== 'current'
48
+ ? `\n
47
49
  Potential solutions:
50
+ - Is ${moduleName} a valid NestJS module?
48
51
  - If ${dependencyName} is a provider, is it part of the current ${moduleName}?
49
52
  - If ${dependencyName} is exported from a separate @Module, is that module imported within ${moduleName}?
50
53
  @Module({
51
54
  imports: [ /* the Module containing ${dependencyName} */ ]
52
55
  })
56
+ `
57
+ : `\n
58
+ Potential solutions:
59
+ - If ${dependencyName} is a provider, is it part of the current Module?
60
+ - If ${dependencyName} is exported from a separate @Module, is that module imported within Module?
61
+ @Module({
62
+ imports: [ /* the Module containing ${dependencyName} */ ]
63
+ })
53
64
  `;
65
+ let message = `Nest can't resolve dependencies of the ${type.toString()}`;
54
66
  if ((0, shared_utils_1.isNil)(index)) {
55
67
  message += `. Please make sure that the "${key.toString()}" property is available in the current context.${potentialSolutions}`;
56
68
  return message;
@@ -59,7 +71,7 @@ Potential solutions:
59
71
  dependenciesName[index] = '?';
60
72
  message += ` (`;
61
73
  message += dependenciesName.join(', ');
62
- message += `). Please make sure that the argument ${dependencyName} at index [${index}] is available in the ${getModuleName(module)} context.`;
74
+ message += `). Please make sure that the argument ${dependencyName} at index [${index}] is available in the ${moduleName} context.`;
63
75
  message += potentialSolutions;
64
76
  return message;
65
77
  };
@@ -1,7 +1,8 @@
1
1
  import { DynamicModule, Provider } from '@nestjs/common';
2
- import { Injectable } from '@nestjs/common/interfaces/injectable.interface';
3
- import { Type } from '@nestjs/common/interfaces/type.interface';
2
+ import { EnhancerSubtype } from '@nestjs/common/constants';
3
+ import { Injectable, Type } from '@nestjs/common/interfaces';
4
4
  import { ApplicationConfig } from '../application-config';
5
+ import { SerializedGraph } from '../inspector/serialized-graph';
5
6
  import { ModuleCompiler } from './compiler';
6
7
  import { ContextId } from './instance-wrapper';
7
8
  import { Module } from './module';
@@ -15,8 +16,10 @@ export declare class NestContainer {
15
16
  private readonly modules;
16
17
  private readonly dynamicModulesMetadata;
17
18
  private readonly internalProvidersStorage;
19
+ private readonly _serializedGraph;
18
20
  private internalCoreModule;
19
21
  constructor(_applicationConfig?: ApplicationConfig);
22
+ get serializedGraph(): SerializedGraph;
20
23
  get applicationConfig(): ApplicationConfig | undefined;
21
24
  setHttpAdapter(httpAdapter: any): void;
22
25
  getHttpAdapterRef(): import("..").AbstractHttpAdapter<any, any, any>;
@@ -31,8 +34,8 @@ export declare class NestContainer {
31
34
  getModuleByKey(moduleKey: string): Module;
32
35
  getInternalCoreModuleRef(): Module | undefined;
33
36
  addImport(relatedModule: Type<any> | DynamicModule, token: string): Promise<void>;
34
- addProvider(provider: Provider, token: string): string | symbol | Function;
35
- addInjectable(injectable: Provider, token: string, host?: Type<Injectable>): void;
37
+ addProvider(provider: Provider, token: string, enhancerSubtype?: EnhancerSubtype): string | symbol | Function;
38
+ addInjectable(injectable: Provider, token: string, enhancerSubtype: EnhancerSubtype, host?: Type<Injectable>): string | symbol | Function | import("./instance-wrapper").InstanceWrapper<unknown>;
36
39
  addExportedProvider(provider: Type<any>, token: string): void;
37
40
  addController(controller: Type<any>, token: string): void;
38
41
  clear(): void;
@@ -42,7 +45,8 @@ export declare class NestContainer {
42
45
  bindGlobalScope(): void;
43
46
  bindGlobalsToImports(moduleRef: Module): void;
44
47
  bindGlobalModuleToModule(target: Module, globalModule: Module): void;
45
- getDynamicMetadataByToken(token: string, metadataKey: keyof DynamicModule): any[];
48
+ getDynamicMetadataByToken(token: string): Partial<DynamicModule>;
49
+ getDynamicMetadataByToken<K extends Exclude<keyof DynamicModule, 'global' | 'module'>>(token: string, metadataKey: K): DynamicModule[K];
46
50
  registerCoreModuleRef(moduleRef: Module): void;
47
51
  getModuleTokenFactory(): ModuleTokenFactory;
48
52
  registerRequestProvider<T = any>(request: T, contextId: ContextId): void;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NestContainer = void 0;
4
4
  const constants_1 = require("@nestjs/common/constants");
5
5
  const exceptions_1 = require("../errors/exceptions");
6
+ const serialized_graph_1 = require("../inspector/serialized-graph");
6
7
  const request_constants_1 = require("../router/request/request-constants");
7
8
  const compiler_1 = require("./compiler");
8
9
  const internal_core_module_1 = require("./internal-core-module/internal-core-module");
@@ -19,6 +20,10 @@ class NestContainer {
19
20
  this.modules = new modules_container_1.ModulesContainer();
20
21
  this.dynamicModulesMetadata = new Map();
21
22
  this.internalProvidersStorage = new internal_providers_storage_1.InternalProvidersStorage();
23
+ this._serializedGraph = new serialized_graph_1.SerializedGraph();
24
+ }
25
+ get serializedGraph() {
26
+ return this._serializedGraph;
22
27
  }
23
28
  get applicationConfig() {
24
29
  return this._applicationConfig;
@@ -50,8 +55,10 @@ class NestContainer {
50
55
  const moduleRef = new module_1.Module(type, this);
51
56
  moduleRef.token = token;
52
57
  this.modules.set(token, moduleRef);
53
- await this.addDynamicMetadata(token, dynamicMetadata, [].concat(scope, type));
58
+ const updatedScope = [].concat(scope, type);
59
+ await this.addDynamicMetadata(token, dynamicMetadata, updatedScope);
54
60
  if (this.isGlobalModule(type, dynamicMetadata)) {
61
+ moduleRef.isGlobal = true;
55
62
  this.addGlobalModule(moduleRef);
56
63
  }
57
64
  return moduleRef;
@@ -100,7 +107,7 @@ class NestContainer {
100
107
  const related = this.modules.get(relatedModuleToken);
101
108
  moduleRef.addRelatedModule(related);
102
109
  }
103
- addProvider(provider, token) {
110
+ addProvider(provider, token, enhancerSubtype) {
104
111
  const moduleRef = this.modules.get(token);
105
112
  if (!provider) {
106
113
  throw new exceptions_1.CircularDependencyException(moduleRef === null || moduleRef === void 0 ? void 0 : moduleRef.metatype.name);
@@ -108,14 +115,14 @@ class NestContainer {
108
115
  if (!moduleRef) {
109
116
  throw new exceptions_1.UnknownModuleException();
110
117
  }
111
- return moduleRef.addProvider(provider);
118
+ return moduleRef.addProvider(provider, enhancerSubtype);
112
119
  }
113
- addInjectable(injectable, token, host) {
120
+ addInjectable(injectable, token, enhancerSubtype, host) {
114
121
  if (!this.modules.has(token)) {
115
122
  throw new exceptions_1.UnknownModuleException();
116
123
  }
117
124
  const moduleRef = this.modules.get(token);
118
- moduleRef.addInjectable(injectable, host);
125
+ return moduleRef.addInjectable(injectable, enhancerSubtype, host);
119
126
  }
120
127
  addExportedProvider(provider, token) {
121
128
  if (!this.modules.has(token)) {
@@ -150,11 +157,9 @@ class NestContainer {
150
157
  target.addRelatedModule(globalModule);
151
158
  }
152
159
  getDynamicMetadataByToken(token, metadataKey) {
160
+ var _a;
153
161
  const metadata = this.dynamicModulesMetadata.get(token);
154
- if (metadata && metadata[metadataKey]) {
155
- return metadata[metadataKey];
156
- }
157
- return [];
162
+ return metadataKey ? (_a = metadata === null || metadata === void 0 ? void 0 : metadata[metadataKey]) !== null && _a !== void 0 ? _a : [] : metadata;
158
163
  }
159
164
  registerCoreModuleRef(moduleRef) {
160
165
  this.internalCoreModule = moduleRef;
@@ -39,7 +39,11 @@ export interface InjectorDependencyContext {
39
39
  dependencies?: InjectorDependency[];
40
40
  }
41
41
  export declare class Injector {
42
+ private readonly options?;
42
43
  private logger;
44
+ constructor(options?: {
45
+ preview: boolean;
46
+ });
43
47
  loadPrototype<T>({ token }: InstanceWrapper<T>, collection: Map<InstanceToken, InstanceWrapper<T>>, contextId?: ContextId): void;
44
48
  loadInstance<T>(wrapper: InstanceWrapper<T>, collection: Map<InstanceToken, InstanceWrapper>, moduleRef: Module, contextId?: ContextId, inquirer?: InstanceWrapper): Promise<void>;
45
49
  loadMiddleware(wrapper: InstanceWrapper, collection: Map<InstanceToken, InstanceWrapper>, moduleRef: Module, contextId?: ContextId, inquirer?: InstanceWrapper): Promise<void>;
@@ -13,7 +13,8 @@ const constants_2 = require("./constants");
13
13
  const inquirer_1 = require("./inquirer");
14
14
  const instance_wrapper_1 = require("./instance-wrapper");
15
15
  class Injector {
16
- constructor() {
16
+ constructor(options) {
17
+ this.options = options;
17
18
  this.logger = new common_1.Logger('InjectorLogger');
18
19
  }
19
20
  loadPrototype({ token }, collection, contextId = constants_2.STATIC_CONTEXT) {
@@ -327,6 +328,7 @@ class Injector {
327
328
  .forEach(item => (instance[item.key] = item.instance));
328
329
  }
329
330
  async instantiateClass(instances, wrapper, targetMetatype, contextId = constants_2.STATIC_CONTEXT, inquirer) {
331
+ var _a;
330
332
  const { metatype, inject } = wrapper;
331
333
  const inquirerId = this.getInquirerId(inquirer);
332
334
  const instanceHost = targetMetatype.getInstanceByContextId(this.getContextId(contextId, targetMetatype), inquirerId);
@@ -334,6 +336,10 @@ class Injector {
334
336
  wrapper.isInRequestScope(contextId, inquirer) ||
335
337
  wrapper.isLazyTransient(contextId, inquirer) ||
336
338
  wrapper.isExplicitlyRequested(contextId, inquirer);
339
+ if ((_a = this.options) === null || _a === void 0 ? void 0 : _a.preview) {
340
+ instanceHost.isResolved = true;
341
+ return instanceHost.instance;
342
+ }
337
343
  if ((0, shared_utils_1.isNil)(inject) && isInContext) {
338
344
  instanceHost.instance = wrapper.forwardRef
339
345
  ? Object.assign(instanceHost.instance, new metatype(...instances))
@@ -1,12 +1,14 @@
1
- import { Logger } from '@nestjs/common';
1
+ import { Logger, LoggerService } from '@nestjs/common';
2
+ import { GraphInspector } from '../inspector/graph-inspector';
2
3
  import { NestContainer } from './container';
3
4
  import { Injector } from './injector';
4
5
  import { Module } from './module';
5
- export declare class InstanceLoader {
6
+ export declare class InstanceLoader<TInjector extends Injector = Injector> {
6
7
  protected readonly container: NestContainer;
8
+ protected readonly injector: TInjector;
9
+ protected readonly graphInspector: GraphInspector;
7
10
  private logger;
8
- protected readonly injector: Injector;
9
- constructor(container: NestContainer, logger?: Logger);
11
+ constructor(container: NestContainer, injector: TInjector, graphInspector: GraphInspector, logger?: LoggerService);
10
12
  setLogger(logger: Logger): void;
11
13
  createInstancesOfDependencies(modules?: Map<string, Module>): Promise<void>;
12
14
  private createPrototypes;
@@ -3,15 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InstanceLoader = void 0;
4
4
  const common_1 = require("@nestjs/common");
5
5
  const messages_1 = require("../helpers/messages");
6
- const injector_1 = require("./injector");
7
6
  const internal_core_module_1 = require("./internal-core-module/internal-core-module");
8
7
  class InstanceLoader {
9
- constructor(container, logger = new common_1.Logger(InstanceLoader.name, {
8
+ constructor(container, injector, graphInspector, logger = new common_1.Logger(InstanceLoader.name, {
10
9
  timestamp: true,
11
10
  })) {
12
11
  this.container = container;
12
+ this.injector = injector;
13
+ this.graphInspector = graphInspector;
13
14
  this.logger = logger;
14
- this.injector = new injector_1.Injector();
15
15
  }
16
16
  setLogger(logger) {
17
17
  this.logger = logger;
@@ -19,6 +19,7 @@ class InstanceLoader {
19
19
  async createInstancesOfDependencies(modules = this.container.getModules()) {
20
20
  this.createPrototypes(modules);
21
21
  await this.createInstances(modules);
22
+ this.graphInspector.inspectModules(modules);
22
23
  }
23
24
  createPrototypes(modules) {
24
25
  modules.forEach(moduleRef => {
@@ -32,7 +33,7 @@ class InstanceLoader {
32
33
  await this.createInstancesOfProviders(moduleRef);
33
34
  await this.createInstancesOfInjectables(moduleRef);
34
35
  await this.createInstancesOfControllers(moduleRef);
35
- const { name } = moduleRef.metatype;
36
+ const { name } = moduleRef;
36
37
  this.isModuleWhitelisted(name) &&
37
38
  this.logger.log((0, messages_1.MODULE_INIT_MESSAGE) `${name}`);
38
39
  }));
@@ -44,7 +45,10 @@ class InstanceLoader {
44
45
  async createInstancesOfProviders(moduleRef) {
45
46
  const { providers } = moduleRef;
46
47
  const wrappers = [...providers.values()];
47
- await Promise.all(wrappers.map(item => this.injector.loadProvider(item, moduleRef)));
48
+ await Promise.all(wrappers.map(async (item) => {
49
+ await this.injector.loadProvider(item, moduleRef);
50
+ this.graphInspector.inspectInstanceWrapper(item, moduleRef);
51
+ }));
48
52
  }
49
53
  createPrototypesOfControllers(moduleRef) {
50
54
  const { controllers } = moduleRef;
@@ -53,7 +57,10 @@ class InstanceLoader {
53
57
  async createInstancesOfControllers(moduleRef) {
54
58
  const { controllers } = moduleRef;
55
59
  const wrappers = [...controllers.values()];
56
- await Promise.all(wrappers.map(item => this.injector.loadController(item, moduleRef)));
60
+ await Promise.all(wrappers.map(async (item) => {
61
+ await this.injector.loadController(item, moduleRef);
62
+ this.graphInspector.inspectInstanceWrapper(item, moduleRef);
63
+ }));
57
64
  }
58
65
  createPrototypesOfInjectables(moduleRef) {
59
66
  const { injectables } = moduleRef;
@@ -62,7 +69,10 @@ class InstanceLoader {
62
69
  async createInstancesOfInjectables(moduleRef) {
63
70
  const { injectables } = moduleRef;
64
71
  const wrappers = [...injectables.values()];
65
- await Promise.all(wrappers.map(item => this.injector.loadInjectable(item, moduleRef)));
72
+ await Promise.all(wrappers.map(async (item) => {
73
+ await this.injector.loadInjectable(item, moduleRef);
74
+ this.graphInspector.inspectInstanceWrapper(item, moduleRef);
75
+ }));
66
76
  }
67
77
  isModuleWhitelisted(name) {
68
78
  return name !== internal_core_module_1.InternalCoreModule.name;
@@ -1,4 +1,5 @@
1
1
  import { Provider, Scope, Type } from '@nestjs/common';
2
+ import { EnhancerSubtype } from '@nestjs/common/constants';
2
3
  import { FactoryProvider } from '@nestjs/common/interfaces';
3
4
  import { InstanceToken, Module } from './module';
4
5
  export declare const INSTANCE_METADATA_SYMBOL: unique symbol;
@@ -34,6 +35,7 @@ export declare class InstanceWrapper<T = any> {
34
35
  readonly async?: boolean;
35
36
  readonly host?: Module;
36
37
  readonly isAlias: boolean;
38
+ readonly subtype?: EnhancerSubtype;
37
39
  scope?: Scope;
38
40
  metatype: Type<T> | Function;
39
41
  inject?: FactoryProvider['inject'];
@@ -79,4 +81,5 @@ export declare class InstanceWrapper<T = any> {
79
81
  private printIntrospectedAsRequestScoped;
80
82
  private printIntrospectedAsDurable;
81
83
  private isDebugMode;
84
+ private generateUuid;
82
85
  }
@@ -8,18 +8,21 @@ const cli_colors_util_1 = require("@nestjs/common/utils/cli-colors.util");
8
8
  const random_string_generator_util_1 = require("@nestjs/common/utils/random-string-generator.util");
9
9
  const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
10
10
  const iterare_1 = require("iterare");
11
+ const deterministic_uuid_registry_1 = require("../inspector/deterministic-uuid-registry");
11
12
  const constants_1 = require("./constants");
12
13
  const provider_classifier_1 = require("./helpers/provider-classifier");
13
14
  exports.INSTANCE_METADATA_SYMBOL = Symbol.for('instance_metadata:cache');
14
15
  exports.INSTANCE_ID_SYMBOL = Symbol.for('instance_metadata:id');
15
16
  class InstanceWrapper {
16
17
  constructor(metadata = {}) {
18
+ var _b;
17
19
  this.isAlias = false;
18
20
  this.scope = common_1.Scope.DEFAULT;
19
21
  this.values = new WeakMap();
20
22
  this[_a] = {};
21
- this[exports.INSTANCE_ID_SYMBOL] = (0, random_string_generator_util_1.randomStringGenerator)();
22
23
  this.initialize(metadata);
24
+ this[exports.INSTANCE_ID_SYMBOL] =
25
+ (_b = metadata[exports.INSTANCE_ID_SYMBOL]) !== null && _b !== void 0 ? _b : this.generateUuid();
23
26
  }
24
27
  get id() {
25
28
  return this[exports.INSTANCE_ID_SYMBOL];
@@ -271,6 +274,12 @@ class InstanceWrapper {
271
274
  isDebugMode() {
272
275
  return !!process.env.NEST_DEBUG;
273
276
  }
277
+ generateUuid() {
278
+ var _b, _c, _d, _e, _f;
279
+ let key = (_c = (_b = this.name) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : (_d = this.token) === null || _d === void 0 ? void 0 : _d.toString();
280
+ key += (_f = (_e = this.host) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : '';
281
+ return key ? deterministic_uuid_registry_1.DeterministicUuidRegistry.get(key) : (0, random_string_generator_util_1.randomStringGenerator)();
282
+ }
274
283
  }
275
284
  exports.InstanceWrapper = InstanceWrapper;
276
285
  _a = exports.INSTANCE_METADATA_SYMBOL;
@@ -1,7 +1,8 @@
1
1
  import { HttpAdapterHost } from '../../helpers/http-adapter-host';
2
+ import { GraphInspector } from '../../inspector/graph-inspector';
2
3
  import { DependenciesScanner } from '../../scanner';
3
4
  import { ModuleCompiler } from '../compiler';
4
5
  import { NestContainer } from '../container';
5
6
  export declare class InternalCoreModuleFactory {
6
- static create(container: NestContainer, scanner: DependenciesScanner, moduleCompiler: ModuleCompiler, httpAdapterHost: HttpAdapterHost): import("@nestjs/common").DynamicModule;
7
+ static create(container: NestContainer, scanner: DependenciesScanner, moduleCompiler: ModuleCompiler, httpAdapterHost: HttpAdapterHost, graphInspector: GraphInspector): import("@nestjs/common").DynamicModule;
7
8
  }
@@ -4,12 +4,22 @@ exports.InternalCoreModuleFactory = void 0;
4
4
  const common_1 = require("@nestjs/common");
5
5
  const external_context_creator_1 = require("../../helpers/external-context-creator");
6
6
  const http_adapter_host_1 = require("../../helpers/http-adapter-host");
7
+ const serialized_graph_1 = require("../../inspector/serialized-graph");
8
+ const injector_1 = require("../injector");
7
9
  const instance_loader_1 = require("../instance-loader");
8
10
  const lazy_module_loader_1 = require("../lazy-module-loader/lazy-module-loader");
9
11
  const modules_container_1 = require("../modules-container");
10
12
  const internal_core_module_1 = require("./internal-core-module");
11
13
  class InternalCoreModuleFactory {
12
- static create(container, scanner, moduleCompiler, httpAdapterHost) {
14
+ static create(container, scanner, moduleCompiler, httpAdapterHost, graphInspector) {
15
+ const lazyModuleLoaderFactory = () => {
16
+ const logger = new common_1.Logger(lazy_module_loader_1.LazyModuleLoader.name, {
17
+ timestamp: false,
18
+ });
19
+ const injector = new injector_1.Injector();
20
+ const instanceLoader = new instance_loader_1.InstanceLoader(container, injector, graphInspector, logger);
21
+ return new lazy_module_loader_1.LazyModuleLoader(scanner, instanceLoader, moduleCompiler, container.getModules());
22
+ };
13
23
  return internal_core_module_1.InternalCoreModule.register([
14
24
  {
15
25
  provide: external_context_creator_1.ExternalContextCreator,
@@ -29,13 +39,11 @@ class InternalCoreModuleFactory {
29
39
  },
30
40
  {
31
41
  provide: lazy_module_loader_1.LazyModuleLoader,
32
- useFactory: () => {
33
- const logger = new common_1.Logger(lazy_module_loader_1.LazyModuleLoader.name, {
34
- timestamp: false,
35
- });
36
- const instanceLoader = new instance_loader_1.InstanceLoader(container, logger);
37
- return new lazy_module_loader_1.LazyModuleLoader(scanner, instanceLoader, moduleCompiler, container.getModules());
38
- },
42
+ useFactory: lazyModuleLoaderFactory,
43
+ },
44
+ {
45
+ provide: serialized_graph_1.SerializedGraph,
46
+ useValue: container.serializedGraph,
39
47
  },
40
48
  ]);
41
49
  }
@@ -1,3 +1,4 @@
1
+ import { EnhancerSubtype } from '@nestjs/common/constants';
1
2
  import { ClassProvider, Controller, DynamicModule, ExistingProvider, FactoryProvider, Injectable, InjectionToken, NestModule, Provider, Type, ValueProvider } from '@nestjs/common/interfaces';
2
3
  import { NestContainer } from './container';
3
4
  import { InstanceWrapper } from './instance-wrapper';
@@ -18,11 +19,15 @@ export declare class Module {
18
19
  private readonly _controllers;
19
20
  private readonly _exports;
20
21
  private _distance;
22
+ private _isGlobal;
21
23
  private _token;
22
24
  constructor(_metatype: Type<any>, container: NestContainer);
23
25
  get id(): string;
24
26
  get token(): string;
25
27
  set token(token: string);
28
+ get name(): string;
29
+ get isGlobal(): boolean;
30
+ set isGlobal(global: boolean);
26
31
  get providers(): Map<InstanceToken, InstanceWrapper<Injectable>>;
27
32
  get middlewares(): Map<InstanceToken, InstanceWrapper<Injectable>>;
28
33
  get imports(): Set<Module>;
@@ -49,19 +54,20 @@ export declare class Module {
49
54
  addModuleRef(): void;
50
55
  addModuleAsProvider(): void;
51
56
  addApplicationConfig(): void;
52
- addInjectable<T extends Injectable>(injectable: Provider, host?: Type<T>): InjectionToken;
53
- addProvider(provider: Provider): InjectionToken;
57
+ addInjectable<T extends Injectable>(injectable: Provider, enhancerSubtype: EnhancerSubtype, host?: Type<T>): string | symbol | Function | InstanceWrapper<unknown>;
58
+ addProvider(provider: Provider): Provider | InjectionToken;
59
+ addProvider(provider: Provider, enhancerSubtype: EnhancerSubtype): Provider | InjectionToken;
54
60
  isCustomProvider(provider: Provider): provider is ClassProvider | FactoryProvider | ValueProvider | ExistingProvider;
55
- addCustomProvider(provider: ClassProvider | FactoryProvider | ValueProvider | ExistingProvider, collection: Map<Function | string | symbol, any>): InjectionToken;
61
+ addCustomProvider(provider: ClassProvider | FactoryProvider | ValueProvider | ExistingProvider, collection: Map<Function | string | symbol, any>, enhancerSubtype?: EnhancerSubtype): InjectionToken;
56
62
  isCustomClass(provider: any): provider is ClassProvider;
57
63
  isCustomValue(provider: any): provider is ValueProvider;
58
64
  isCustomFactory(provider: any): provider is FactoryProvider;
59
65
  isCustomUseExisting(provider: any): provider is ExistingProvider;
60
66
  isDynamicModule(exported: any): exported is DynamicModule;
61
- addCustomClass(provider: ClassProvider, collection: Map<InstanceToken, InstanceWrapper>): void;
62
- addCustomValue(provider: ValueProvider, collection: Map<Function | string | symbol, InstanceWrapper>): void;
63
- addCustomFactory(provider: FactoryProvider, collection: Map<Function | string | symbol, InstanceWrapper>): void;
64
- addCustomUseExisting(provider: ExistingProvider, collection: Map<Function | string | symbol, InstanceWrapper>): void;
67
+ addCustomClass(provider: ClassProvider, collection: Map<InstanceToken, InstanceWrapper>, enhancerSubtype?: EnhancerSubtype): void;
68
+ addCustomValue(provider: ValueProvider, collection: Map<Function | string | symbol, InstanceWrapper>, enhancerSubtype?: EnhancerSubtype): void;
69
+ addCustomFactory(provider: FactoryProvider, collection: Map<Function | string | symbol, InstanceWrapper>, enhancerSubtype?: EnhancerSubtype): void;
70
+ addCustomUseExisting(provider: ExistingProvider, collection: Map<Function | string | symbol, InstanceWrapper>, enhancerSubtype?: EnhancerSubtype): void;
65
71
  addExportedProvider(provider: Provider | string | symbol | DynamicModule): Set<InjectionToken>;
66
72
  addCustomExportedProvider(provider: FactoryProvider | ValueProvider | ClassProvider | ExistingProvider): Set<InjectionToken>;
67
73
  validateExportedProvider(token: InstanceToken): InjectionToken;
@@ -72,9 +78,14 @@ export declare class Module {
72
78
  hasProvider(token: InstanceToken): boolean;
73
79
  hasInjectable(token: InstanceToken): boolean;
74
80
  getProviderByKey<T = any>(name: InstanceToken): InstanceWrapper<T>;
81
+ getProviderById<T = any>(id: string): InstanceWrapper<T> | undefined;
82
+ getControllerById<T = any>(id: string): InstanceWrapper<T> | undefined;
83
+ getInjectableById<T = any>(id: string): InstanceWrapper<T> | undefined;
84
+ getMiddlewareById<T = any>(id: string): InstanceWrapper<T> | undefined;
75
85
  getNonAliasProviders(): Array<[
76
86
  InstanceToken,
77
87
  InstanceWrapper<Injectable>
78
88
  ]>;
79
89
  createModuleReferenceType(): Type<ModuleRef>;
90
+ private generateUuid;
80
91
  }