@nestjs/common 11.1.5 → 11.1.7

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
@@ -8,7 +8,7 @@
8
8
  <p align="center">A progressive <a href="https://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p>
9
9
  <p align="center">
10
10
  <a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a>
11
- <a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
11
+ <a href="https://github.com/nestjs/nest/blob/master/LICENSE" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
12
12
  <a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a>
13
13
  <a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a>
14
14
  <a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
@@ -78,10 +78,7 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
78
78
  </tr>
79
79
  <tr>
80
80
  <td><a href="https://snyk.co/nestjs" target="_blank"><img src="https://nestjs.com/img/logos/snyk-logo-black.png" width="185" valign="middle" /></a></td>
81
- <td><a href="https://fuseautotech.com/" target="_blank"><img src="https://nestjs.com/img/logos/fuse-logo.svg" width="105" valign="middle" /></a></td>
82
- <td><a href="https://ridicorp.com/career/" target="_blank"><img src="https://nestjs.com/img/logos/ridi-logo.svg" width="105" valign="middle" /></a></td>
83
81
  <td><a href="https://www.movavi.com/imovie-for-windows.html" target="_blank"><img src="https://nestjs.com/img/logos/movavi-logo.svg" width="105" valign="middle" /></a></td>
84
- <td><a href="https://skunk.team" target="_blank"><img src="https://nestjs.com/img/logos/skunk-logo.png" height="60" valign="middle" /></a></td>
85
82
  </tr>
86
83
  </table>
87
84
 
@@ -91,10 +88,10 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
91
88
  <tr>
92
89
  <td><a href="https://www.mercedes-benz.com/" target="_blank"><img src="https://nestjs.com/img/logos/mercedes-logo.png" width="100" valign="middle" /></a></td>
93
90
  <td><a href="https://www.dinii.jp/" target="_blank"><img src="https://nestjs.com/img/logos/dinii-logo.png" width="65" valign="middle" /></a></td>
94
- <td><a href="https://bloodycase.com/?promocode=NEST" target="_blank"><img src="https://nestjs.com/img/logos/bloodycase-logo.png" width="65" valign="middle" /></a></td>
95
91
  <td><a href="https://handsontable.com/docs/react-data-grid/?utm_source=NestJS_GH&utm_medium=sponsorship&utm_campaign=library_sponsorship_2024" target="_blank"><img src="https://nestjs.com/img/logos/handsontable-dark-logo.svg#2" width="150" valign="middle" /></a></td>
96
92
  <td align="center" valign="middle"><a href="https://www.itflashcards.com/" target="_blank"><img src="https://nestjs.com/img/logos/it_flashcards-logo.png" width="170" valign="middle" /></a></td>
97
93
  <td align="center" valign="middle"><a href="https://arcjet.com/?ref=nestjs" target="_blank"><img src="https://nestjs.com/img/logos/arcjet-logo.svg" width="170" valign="middle" /></a></td>
94
+ <td align="center" valign="middle"><a href="https://crawljobs.com" target="_blank"><img src="https://nestjs.com/img/logos/crawljobs-logo.svg" width="130" valign="middle" /></a></td>
98
95
  </tr>
99
96
  </table>
100
97
 
@@ -118,19 +115,16 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
118
115
  <td align="center" valign="middle"><a href="https://triplecore.io" target="_blank"><img src="https://nestjs.com/img/logos/triplecore-logo.svg" width="50" valign="middle" /></a></td>
119
116
  </tr>
120
117
  <tr>
121
- <td align="center" valign="middle"><a href="https://thecasinowizard.com/bonuses/no-deposit-bonuses/" target="_blank"><img src="https://nestjs.com/img/logos/casinowizard-logo.png" width="120" valign="middle" /></a></td>
122
118
  <td align="center" valign="middle"><a href="https://polygon-software.ch/" target="_blank"><img src="https://nestjs.com/img/logos/polygon-logo.svg" width="120" valign="middle" /></a></td>
123
119
  <td align="center" valign="middle"><a href="https://boringowl.io/" target="_blank"><img src="https://nestjs.com/img/logos/boringowl-logo.svg" width="120" valign="middle" /></a></td>
124
120
  <td align="center" valign="middle"><a href="https://nordbot.app/" target="_blank"><img src="https://nestjs.com/img/logos/nordbot-logo.png" width="120" valign="middle" /></a></td>
125
121
  <td align="center" valign="middle"><a href="https://doppio.sh/" target="_blank"><img src="https://nestjs.com/img/logos/dopiosh-logo.png" width="50" valign="middle" /></a></td>
126
122
  <td align="center" valign="middle"><a href="https://www.hingehealth.com/" target="_blank"><img src="https://nestjs.com/img/logos/hinge-health-logo.svg" width="100" valign="middle" /></a></td>
123
+ <td align="center" valign="middle"><a href="https://www.tripoffice.com/" target="_blank"><img src="https://nestjs.com/img/logos/tripoffice-logo.png" width="140" valign="middle" /></a></td>
127
124
  </tr>
128
125
  <tr>
129
- <td align="center" valign="middle"><a href="https://julienferand.dev/" target="_blank"><img src="https://nestjs.com/img/logos/julienferand-logo.jpeg" width="55" valign="middle" /></a></td>
130
- <td align="center" valign="middle"><a href="https://www.tripoffice.com/" target="_blank"><img src="https://nestjs.com/img/logos/tripoffice-logo.png" width="140" valign="middle" /></a></td>
131
126
  <td align="center" valign="middle"><a href="https://solcellsforetag.se/" target="_blank"><img src="https://nestjs.com/img/logos/solcellsforetag-logo.svg" width="140" valign="middle" /></a></td>
132
127
  <td align="center" valign="middle"><a href="https://www.route4me.com/" target="_blank"><img src="https://nestjs.com/img/logos/route4me-logo.svg" width="100" valign="middle" /></a></td>
133
- <td align="center" valign="middle"><a href="https://www.slotsup.com/" target="_blank"><img src="https://nestjs.com/img/logos/slotsup-logo.png" width="60" valign="middle" /></a></td>
134
128
  </tr>
135
129
  </table>
136
130
 
@@ -11,5 +11,6 @@ export declare enum RouteParamtypes {
11
11
  FILES = 9,
12
12
  HOST = 10,
13
13
  IP = 11,
14
- RAW_BODY = 12
14
+ RAW_BODY = 12,
15
+ ACK = 13
15
16
  }
@@ -16,4 +16,5 @@ var RouteParamtypes;
16
16
  RouteParamtypes[RouteParamtypes["HOST"] = 10] = "HOST";
17
17
  RouteParamtypes[RouteParamtypes["IP"] = 11] = "IP";
18
18
  RouteParamtypes[RouteParamtypes["RAW_BODY"] = 12] = "RAW_BODY";
19
+ RouteParamtypes[RouteParamtypes["ACK"] = 13] = "ACK";
19
20
  })(RouteParamtypes || (exports.RouteParamtypes = RouteParamtypes = {}));
@@ -59,4 +59,10 @@ export declare class NestApplicationContextOptions {
59
59
  */
60
60
  instanceDecorator: (instance: unknown) => unknown;
61
61
  };
62
+ /**
63
+ * If enabled, will force the use of console.log/console.error instead of process.stdout/stderr.write
64
+ * in the default ConsoleLogger. This is useful for test environments like Jest that can buffer console calls.
65
+ * @default false
66
+ */
67
+ forceConsole?: boolean;
62
68
  }
@@ -5,6 +5,7 @@ import { Observable } from 'rxjs';
5
5
  export interface WsMessageHandler<T = string> {
6
6
  message: T;
7
7
  callback: (...args: any[]) => Observable<any> | Promise<any>;
8
+ isAckHandledManually: boolean;
8
9
  }
9
10
  /**
10
11
  * @publicApi
@@ -144,7 +144,7 @@ class ConfigurableModuleBuilder {
144
144
  providers,
145
145
  }, {
146
146
  ...self.extras,
147
- ...options,
147
+ ...this.extractExtrasFromAsyncOptions(options, self.extras),
148
148
  });
149
149
  }
150
150
  static omitExtras(input, extras) {
@@ -160,6 +160,18 @@ class ConfigurableModuleBuilder {
160
160
  });
161
161
  return moduleOptions;
162
162
  }
163
+ static extractExtrasFromAsyncOptions(input, extras) {
164
+ if (!extras) {
165
+ return {};
166
+ }
167
+ const extrasOptions = {};
168
+ Object.keys(input)
169
+ .filter(key => !constants_1.ASYNC_OPTIONS_METADATA_KEYS.includes(key))
170
+ .forEach(key => {
171
+ extrasOptions[key] = input[key];
172
+ });
173
+ return extrasOptions;
174
+ }
163
175
  static createAsyncProviders(options) {
164
176
  if (options.useExisting || options.useFactory) {
165
177
  if (options.inject && options.provideInjectionTokensFrom) {
@@ -2,3 +2,8 @@ export declare const DEFAULT_METHOD_KEY = "register";
2
2
  export declare const DEFAULT_FACTORY_CLASS_METHOD_KEY = "create";
3
3
  export declare const ASYNC_METHOD_SUFFIX = "Async";
4
4
  export declare const CONFIGURABLE_MODULE_ID = "CONFIGURABLE_MODULE_ID";
5
+ /**
6
+ * List of keys that are specific to ConfigurableModuleAsyncOptions
7
+ * and should be excluded when extracting user-defined extras.
8
+ */
9
+ export declare const ASYNC_OPTIONS_METADATA_KEYS: readonly ["useFactory", "useClass", "useExisting", "inject", "imports", "provideInjectionTokensFrom"];
@@ -1,7 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CONFIGURABLE_MODULE_ID = exports.ASYNC_METHOD_SUFFIX = exports.DEFAULT_FACTORY_CLASS_METHOD_KEY = exports.DEFAULT_METHOD_KEY = void 0;
3
+ exports.ASYNC_OPTIONS_METADATA_KEYS = exports.CONFIGURABLE_MODULE_ID = exports.ASYNC_METHOD_SUFFIX = exports.DEFAULT_FACTORY_CLASS_METHOD_KEY = exports.DEFAULT_METHOD_KEY = void 0;
4
4
  exports.DEFAULT_METHOD_KEY = 'register';
5
5
  exports.DEFAULT_FACTORY_CLASS_METHOD_KEY = 'create';
6
6
  exports.ASYNC_METHOD_SUFFIX = 'Async';
7
7
  exports.CONFIGURABLE_MODULE_ID = 'CONFIGURABLE_MODULE_ID';
8
+ /**
9
+ * List of keys that are specific to ConfigurableModuleAsyncOptions
10
+ * and should be excluded when extracting user-defined extras.
11
+ */
12
+ exports.ASYNC_OPTIONS_METADATA_KEYS = [
13
+ 'useFactory',
14
+ 'useClass',
15
+ 'useExisting',
16
+ 'inject',
17
+ 'imports',
18
+ 'provideInjectionTokensFrom',
19
+ ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestjs/common",
3
- "version": "11.1.5",
3
+ "version": "11.1.7",
4
4
  "description": "Nest - modern, fast, powerful node.js web framework (@common)",
5
5
  "author": "Kamil Mysliwiec",
6
6
  "homepage": "https://nestjs.com",
@@ -20,7 +20,7 @@
20
20
  "dependencies": {
21
21
  "file-type": "21.0.0",
22
22
  "iterare": "1.2.1",
23
- "load-esm": "1.0.2",
23
+ "load-esm": "1.0.3",
24
24
  "tslib": "2.8.1",
25
25
  "uid": "2.0.2"
26
26
  },
@@ -31,6 +31,12 @@ export interface ConsoleLoggerOptions {
31
31
  * The context of the logger.
32
32
  */
33
33
  context?: string;
34
+ /**
35
+ * If enabled, will force the use of console.log/console.error instead of process.stdout/stderr.write.
36
+ * This is useful for test environments like Jest that can buffer console calls.
37
+ * @default false
38
+ */
39
+ forceConsole?: boolean;
34
40
  /**
35
41
  * If enabled, will print the log message in a single line, even if it is an object with multiple properties.
36
42
  * If set to a number, the most n inner elements are united on a single line as long as all properties fit into breakLength. Short array elements are also grouped together.
@@ -38,7 +38,7 @@ let ConsoleLogger = ConsoleLogger_1 = class ConsoleLogger {
38
38
  : [contextOrOptions?.context, contextOrOptions];
39
39
  opts = opts ?? {};
40
40
  opts.logLevels ??= DEFAULT_LOG_LEVELS;
41
- opts.colors ??= opts.colors ?? (opts.json ? false : true);
41
+ opts.colors ??= opts.colors ?? (opts.json ? false : (0, cli_colors_util_1.isColorAllowed)());
42
42
  opts.prefix ??= 'Nest';
43
43
  this.options = opts;
44
44
  this.inspectOptions = this.getInspectOptions();
@@ -151,7 +151,17 @@ let ConsoleLogger = ConsoleLogger_1 = class ConsoleLogger {
151
151
  const timestampDiff = this.updateAndGetTimestampDiff();
152
152
  const formattedLogLevel = logLevel.toUpperCase().padStart(7, ' ');
153
153
  const formattedMessage = this.formatMessage(logLevel, message, pidMessage, formattedLogLevel, contextMessage, timestampDiff);
154
- process[writeStreamType ?? 'stdout'].write(formattedMessage);
154
+ if (this.options.forceConsole) {
155
+ if (writeStreamType === 'stderr') {
156
+ console.error(formattedMessage.trim());
157
+ }
158
+ else {
159
+ console.log(formattedMessage.trim());
160
+ }
161
+ }
162
+ else {
163
+ process[writeStreamType ?? 'stdout'].write(formattedMessage);
164
+ }
155
165
  });
156
166
  }
157
167
  printAsJson(message, options) {
@@ -159,7 +169,17 @@ let ConsoleLogger = ConsoleLogger_1 = class ConsoleLogger {
159
169
  const formattedMessage = !this.options.colors && this.inspectOptions.compact === true
160
170
  ? JSON.stringify(logObject, this.stringifyReplacer)
161
171
  : (0, util_1.inspect)(logObject, this.inspectOptions);
162
- process[options.writeStreamType ?? 'stdout'].write(`${formattedMessage}\n`);
172
+ if (this.options.forceConsole) {
173
+ if (options.writeStreamType === 'stderr') {
174
+ console.error(formattedMessage);
175
+ }
176
+ else {
177
+ console.log(formattedMessage);
178
+ }
179
+ }
180
+ else {
181
+ process[options.writeStreamType ?? 'stdout'].write(`${formattedMessage}\n`);
182
+ }
163
183
  }
164
184
  getJsonLogObject(message, options) {
165
185
  const logObject = {
@@ -226,7 +246,12 @@ let ConsoleLogger = ConsoleLogger_1 = class ConsoleLogger {
226
246
  if (!stack || this.options.json) {
227
247
  return;
228
248
  }
229
- process.stderr.write(`${stack}\n`);
249
+ if (this.options.forceConsole) {
250
+ console.error(stack);
251
+ }
252
+ else {
253
+ process.stderr.write(`${stack}\n`);
254
+ }
230
255
  }
231
256
  updateAndGetTimestampDiff() {
232
257
  const includeTimestamp = ConsoleLogger_1.lastTimestampAt && this.options?.timestamp;
@@ -7,17 +7,17 @@ const is_log_level_util_1 = require("./is-log-level.util");
7
7
  * @publicApi
8
8
  */
9
9
  function filterLogLevels(parseableString = '') {
10
- const sanitizedSring = parseableString.replaceAll(' ', '').toLowerCase();
11
- if (sanitizedSring[0] === '>') {
12
- const orEqual = sanitizedSring[1] === '=';
13
- const logLevelIndex = logger_service_1.LOG_LEVELS.indexOf(sanitizedSring.substring(orEqual ? 2 : 1));
10
+ const sanitizedString = parseableString.replaceAll(' ', '').toLowerCase();
11
+ if (sanitizedString[0] === '>') {
12
+ const orEqual = sanitizedString[1] === '=';
13
+ const logLevelIndex = logger_service_1.LOG_LEVELS.indexOf(sanitizedString.substring(orEqual ? 2 : 1));
14
14
  if (logLevelIndex === -1) {
15
- throw new Error(`parse error (unknown log level): ${sanitizedSring}`);
15
+ throw new Error(`parse error (unknown log level): ${sanitizedString}`);
16
16
  }
17
17
  return logger_service_1.LOG_LEVELS.slice(orEqual ? logLevelIndex : logLevelIndex + 1);
18
18
  }
19
- else if (sanitizedSring.includes(',')) {
20
- return sanitizedSring.split(',').filter(is_log_level_util_1.isLogLevel);
19
+ else if (sanitizedString.includes(',')) {
20
+ return sanitizedString.split(',').filter(is_log_level_util_1.isLogLevel);
21
21
  }
22
- return (0, is_log_level_util_1.isLogLevel)(sanitizedSring) ? [sanitizedSring] : logger_service_1.LOG_LEVELS;
22
+ return (0, is_log_level_util_1.isLogLevel)(sanitizedString) ? [sanitizedString] : logger_service_1.LOG_LEVELS;
23
23
  }
@@ -1,3 +1,4 @@
1
+ export declare const isColorAllowed: () => boolean;
1
2
  export declare const clc: {
2
3
  bold: (text: string) => string;
3
4
  green: (text: string) => string;
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.yellow = exports.clc = void 0;
3
+ exports.yellow = exports.clc = exports.isColorAllowed = void 0;
4
4
  const isColorAllowed = () => !process.env.NO_COLOR;
5
- const colorIfAllowed = (colorFn) => (text) => isColorAllowed() ? colorFn(text) : text;
5
+ exports.isColorAllowed = isColorAllowed;
6
+ const colorIfAllowed = (colorFn) => (text) => (0, exports.isColorAllowed)() ? colorFn(text) : text;
6
7
  exports.clc = {
7
8
  bold: colorIfAllowed((text) => `\x1B[1m${text}\x1B[0m`),
8
9
  green: colorIfAllowed((text) => `\x1B[32m${text}\x1B[39m`),