@application-kit/bootstrap 0.0.0-stage → 0.2.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/CHANGELOG.md ADDED
@@ -0,0 +1,27 @@
1
+ # @application-kit/bootstrap
2
+
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - da305d9: `bootstrap/web` экспортирует `createFastifyAdapter` и `configureFastifyApplication` — адаптер с request-id и шаг настройки (cookie, хук `x-request-id`, `configure`, интерцептор ошибок, `ValidationPipe`); `createFastifyApplication` собирается из них. `buildWebApplication` из `testing` вызывает оба: в e2e теперь 422 на невалидный DTO, заголовок `x-request-id` и плагин cookie, как в проде.
8
+
9
+ ### Patch Changes
10
+
11
+ - @application-kit/observability@0.6.1
12
+
13
+ ## 0.1.0
14
+
15
+ ### Minor Changes
16
+
17
+ - aed5baf: Первый выпуск: бутстрап процессов NestJS. Вход `/web` — `createFastifyApplication(rootModule, options)`: Fastify-адаптер
18
+ с `genReqId` и доверенными прокси по числу хопов (`trustProxyHops`, по умолчанию 0), `@fastify/cookie` (`cookie`),
19
+ заголовок `x-request-id` на каждый ответ, колбэк продукта `configure`, логгер `nestjs-pino` и `uncaughtException` в лог,
20
+ shutdown hooks, глобальный `ValidationPipe` со статусом `validationErrorStatus` (по умолчанию 422) и телом
21
+ `{ statusCode, validationErrors: [{ property, constraints }] }`. Вход `/cli` — `cliBootstrap(rootModule)`:
22
+ nestjs-console с логгером `nestjs-pino`, упавшая команда — запись в лог и код выхода 1.
23
+
24
+ ### Patch Changes
25
+
26
+ - Updated dependencies [aed5baf]
27
+ - @application-kit/observability@0.6.0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 application-kit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,69 @@
1
- # Temporary Holding Version
1
+ # @application-kit/bootstrap
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Бутстрап процессов NestJS: web на Fastify с периметром и CLI на nestjs-console. Состав модулей, Swagger, метрики, порт и
4
+ число прокси перед приложением знает приложение: пакет собирает процесс из его корневого модуля и опций.
5
+
6
+ ## Установка
7
+
8
+ ```sh
9
+ yarn add @application-kit/bootstrap
10
+ ```
11
+
12
+ Peer-зависимости — `@nestjs/common`, `@nestjs/core`, `nestjs-pino`; остальные optional и нужны только своему входу.
13
+ `@application-kit/observability` пакет приносит сам. Логгер обоих входов — `nestjs-pino`: его `LoggerModule` обязан быть
14
+ в графе корневого модуля.
15
+
16
+ ## Входы
17
+
18
+ | Вход | Для чего | Тянет |
19
+ |------|----------|-------|
20
+ | `@application-kit/bootstrap/web` | `createFastifyApplication` — web-процесс на Fastify | `@nestjs/platform-fastify`, `@fastify/cookie`, `class-validator`, `class-transformer`, `@opentelemetry/api` |
21
+ | `@application-kit/bootstrap/cli` | `cliBootstrap` — CLI-процесс | `nestjs-console` |
22
+
23
+ Корневого входа нет: web-процессу `nestjs-console` не нужен, CLI — Fastify.
24
+
25
+ ## Web
26
+
27
+ ```ts
28
+ import { createFastifyApplication } from '@application-kit/bootstrap/web'
29
+
30
+ const app = await createFastifyApplication(AppModule, {
31
+ configure: (app) => {
32
+ setupMetricsHooks(app)
33
+ },
34
+ trustProxyHops: 2,
35
+ })
36
+ await app.listen(port, '0.0.0.0')
37
+ ```
38
+
39
+ Периметр, который ставит пакет, по порядку:
40
+
41
+ 1. Fastify-адаптер: `genReqId` — `x-request-id` от прокси либо свой UUID (`fastifyRequestId` из
42
+ `@application-kit/observability/logging`); доверенные прокси — первые `trustProxyHops` прыжков справа в
43
+ `X-Forwarded-For`, так что адрес, подсунутый клиентом слева, `request.ip` не подменяет.
44
+ 2. `@fastify/cookie` с опциями `cookie`.
45
+ 3. Хук `onRequest`: заголовок `x-request-id` на каждый ответ, включая 404 и ошибки парсинга тела.
46
+ 4. `configure(app)` — настройка продукта.
47
+ 5. `LoggerErrorInterceptor` и логгер `nestjs-pino` для Nest; `uncaughtException` — в тот же лог.
48
+ 6. Shutdown hooks: по SIGTERM/SIGINT провайдеры закрываются, HTTP-сервер дожидается открытых соединений.
49
+ 7. Глобальный `ValidationPipe` с `transform: true`: невалидный DTO — статус `validationErrorStatus` и тело
50
+ `{ statusCode, validationErrors: [{ property, constraints }] }`, вложенное поле — путём `parent.child`.
51
+
52
+ | Опция | По умолчанию | |
53
+ |-------|--------------|---|
54
+ | `trustProxyHops` | `0` | сколько прокси перед приложением доверенные; `0` — только сокет |
55
+ | `validationErrorStatus` | `422` | статус ответа на невалидный DTO |
56
+ | `cookie` | `{}` | опции `@fastify/cookie`; `false` — плагин не регистрируется |
57
+ | `configure` | — | `(app) => void`, зовётся после хука request-id, до интерцептора и пайпа |
58
+
59
+ ## CLI
60
+
61
+ ```ts
62
+ import { cliBootstrap } from '@application-kit/bootstrap/cli'
63
+
64
+ void cliBootstrap(CliModule)
65
+ ```
66
+
67
+ Команда берётся из `process.argv`, после неё приложение закрывается. Упавшая команда — запись уровня `error` с
68
+ `context: 'Console process failed.'` и код выхода 1: cron и джоба кластера видят провал только по коду. Корневой модуль
69
+ импортирует `ConsoleModule` из `nestjs-console`.
@@ -0,0 +1,2 @@
1
+ import type { Type } from '@nestjs/common';
2
+ export declare const cliBootstrap: (rootModule: Type) => Promise<void>;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cliBootstrap = void 0;
4
+ const nestjs_console_1 = require("nestjs-console");
5
+ const nestjs_pino_1 = require("nestjs-pino");
6
+ const node_process_1 = require("node:process");
7
+ const runConsole = async (bootstrap, app) => {
8
+ await app.init();
9
+ await bootstrap.boot();
10
+ await app.close();
11
+ };
12
+ const cliBootstrap = async (rootModule) => {
13
+ const bootstrap = new nestjs_console_1.BootstrapConsole({
14
+ module: rootModule,
15
+ useDecorators: true,
16
+ });
17
+ const app = await bootstrap.init();
18
+ const logger = app.get(nestjs_pino_1.Logger);
19
+ app.useLogger(logger);
20
+ try {
21
+ await runConsole(bootstrap, app);
22
+ }
23
+ catch (error) {
24
+ logger.error(error, 'Console process failed.');
25
+ await app.close();
26
+ (0, node_process_1.exit)(1);
27
+ }
28
+ };
29
+ exports.cliBootstrap = cliBootstrap;
@@ -0,0 +1 @@
1
+ export * from './cli-bootstrap.js';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cli-bootstrap.js"), exports);
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,7 @@
1
+ import type { Type } from '@nestjs/common';
2
+ import type { NestFastifyApplication } from '@nestjs/platform-fastify';
3
+ import { FastifyAdapter } from '@nestjs/platform-fastify';
4
+ import type { FastifyApplicationOptionsInterface } from './fastify-application-options.interface.js';
5
+ export declare const createFastifyAdapter: (trustProxyHops?: number) => FastifyAdapter;
6
+ export declare const configureFastifyApplication: (app: NestFastifyApplication, options?: FastifyApplicationOptionsInterface) => Promise<void>;
7
+ export declare const createFastifyApplication: (rootModule: Type, options?: FastifyApplicationOptionsInterface) => Promise<NestFastifyApplication>;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createFastifyApplication = exports.configureFastifyApplication = exports.createFastifyAdapter = void 0;
7
+ const logging_1 = require("@application-kit/observability/logging");
8
+ const cookie_1 = __importDefault(require("@fastify/cookie"));
9
+ const common_1 = require("@nestjs/common");
10
+ const core_1 = require("@nestjs/core");
11
+ const platform_fastify_1 = require("@nestjs/platform-fastify");
12
+ const nestjs_pino_1 = require("nestjs-pino");
13
+ const NO_CHILDREN = [];
14
+ const propertyPath = (parentPath, property) => (parentPath === '' ? property : `${parentPath}.${property}`);
15
+ const flattenValidationErrors = (errors, parentPath = '') => errors.flatMap((validationError) => {
16
+ const property = propertyPath(parentPath, validationError.property);
17
+ const own = validationError.constraints === undefined
18
+ ? []
19
+ : [{ constraints: Object.values(validationError.constraints), property }];
20
+ return [...own, ...flattenValidationErrors(validationError.children ?? NO_CHILDREN, property)];
21
+ });
22
+ const createFastifyAdapter = (trustProxyHops = 0) => new platform_fastify_1.FastifyAdapter({
23
+ genReqId: logging_1.fastifyRequestId.genReqId,
24
+ trustProxy: (_address, hop) => hop < trustProxyHops,
25
+ });
26
+ exports.createFastifyAdapter = createFastifyAdapter;
27
+ const registerCookie = async (app, cookie = {}) => {
28
+ if (cookie !== false) {
29
+ await app.register(cookie_1.default, cookie);
30
+ }
31
+ };
32
+ const useProcessLogger = (app) => {
33
+ const logger = app.get(nestjs_pino_1.Logger);
34
+ app.useLogger(logger);
35
+ process.on('uncaughtException', (error) => {
36
+ logger.error(error);
37
+ });
38
+ };
39
+ const createValidationPipe = (status = common_1.HttpStatus.UNPROCESSABLE_ENTITY) => new common_1.ValidationPipe({
40
+ exceptionFactory: (errors) => new common_1.HttpException({
41
+ statusCode: status,
42
+ validationErrors: flattenValidationErrors(errors),
43
+ }, status),
44
+ transform: true,
45
+ });
46
+ const configureFastifyApplication = async (app, options = {}) => {
47
+ await registerCookie(app, options.cookie);
48
+ app.getHttpAdapter().getInstance()
49
+ .addHook('onRequest', logging_1.fastifyRequestId.onRequest);
50
+ options.configure?.(app);
51
+ app.useGlobalInterceptors(new nestjs_pino_1.LoggerErrorInterceptor());
52
+ app.useGlobalPipes(createValidationPipe(options.validationErrorStatus));
53
+ };
54
+ exports.configureFastifyApplication = configureFastifyApplication;
55
+ const createFastifyApplication = async (rootModule, options = {}) => {
56
+ const adapter = (0, exports.createFastifyAdapter)(options.trustProxyHops);
57
+ const app = await core_1.NestFactory.create(rootModule, adapter, { bufferLogs: true });
58
+ await (0, exports.configureFastifyApplication)(app, options);
59
+ useProcessLogger(app);
60
+ app.enableShutdownHooks();
61
+ return app;
62
+ };
63
+ exports.createFastifyApplication = createFastifyApplication;
@@ -0,0 +1,9 @@
1
+ import type { FastifyCookieOptions } from '@fastify/cookie';
2
+ import type { HttpStatus } from '@nestjs/common';
3
+ import type { NestFastifyApplication } from '@nestjs/platform-fastify';
4
+ export interface FastifyApplicationOptionsInterface {
5
+ configure?(app: NestFastifyApplication): void;
6
+ cookie?: false | FastifyCookieOptions;
7
+ trustProxyHops?: number;
8
+ validationErrorStatus?: HttpStatus;
9
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ export * from './create-fastify-application.js';
2
+ export * from './fastify-application-options.interface.js';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./create-fastify-application.js"), exports);
18
+ __exportStar(require("./fastify-application-options.interface.js"), exports);
@@ -0,0 +1,2 @@
1
+ import type { Type } from '@nestjs/common';
2
+ export declare const cliBootstrap: (rootModule: Type) => Promise<void>;
@@ -0,0 +1,25 @@
1
+ import { BootstrapConsole } from 'nestjs-console';
2
+ import { Logger } from 'nestjs-pino';
3
+ import { exit } from 'node:process';
4
+ const runConsole = async (bootstrap, app) => {
5
+ await app.init();
6
+ await bootstrap.boot();
7
+ await app.close();
8
+ };
9
+ export const cliBootstrap = async (rootModule) => {
10
+ const bootstrap = new BootstrapConsole({
11
+ module: rootModule,
12
+ useDecorators: true,
13
+ });
14
+ const app = await bootstrap.init();
15
+ const logger = app.get(Logger);
16
+ app.useLogger(logger);
17
+ try {
18
+ await runConsole(bootstrap, app);
19
+ }
20
+ catch (error) {
21
+ logger.error(error, 'Console process failed.');
22
+ await app.close();
23
+ exit(1);
24
+ }
25
+ };
@@ -0,0 +1 @@
1
+ export * from './cli-bootstrap.js';
@@ -0,0 +1 @@
1
+ export * from './cli-bootstrap.js';
@@ -0,0 +1,7 @@
1
+ import type { Type } from '@nestjs/common';
2
+ import type { NestFastifyApplication } from '@nestjs/platform-fastify';
3
+ import { FastifyAdapter } from '@nestjs/platform-fastify';
4
+ import type { FastifyApplicationOptionsInterface } from './fastify-application-options.interface.js';
5
+ export declare const createFastifyAdapter: (trustProxyHops?: number) => FastifyAdapter;
6
+ export declare const configureFastifyApplication: (app: NestFastifyApplication, options?: FastifyApplicationOptionsInterface) => Promise<void>;
7
+ export declare const createFastifyApplication: (rootModule: Type, options?: FastifyApplicationOptionsInterface) => Promise<NestFastifyApplication>;
@@ -0,0 +1,54 @@
1
+ import { fastifyRequestId } from '@application-kit/observability/logging';
2
+ import fastifyCookie from '@fastify/cookie';
3
+ import { HttpException, HttpStatus, ValidationPipe } from '@nestjs/common';
4
+ import { NestFactory } from '@nestjs/core';
5
+ import { FastifyAdapter } from '@nestjs/platform-fastify';
6
+ import { Logger, LoggerErrorInterceptor } from 'nestjs-pino';
7
+ const NO_CHILDREN = [];
8
+ const propertyPath = (parentPath, property) => (parentPath === '' ? property : `${parentPath}.${property}`);
9
+ const flattenValidationErrors = (errors, parentPath = '') => errors.flatMap((validationError) => {
10
+ const property = propertyPath(parentPath, validationError.property);
11
+ const own = validationError.constraints === undefined
12
+ ? []
13
+ : [{ constraints: Object.values(validationError.constraints), property }];
14
+ return [...own, ...flattenValidationErrors(validationError.children ?? NO_CHILDREN, property)];
15
+ });
16
+ export const createFastifyAdapter = (trustProxyHops = 0) => new FastifyAdapter({
17
+ genReqId: fastifyRequestId.genReqId,
18
+ trustProxy: (_address, hop) => hop < trustProxyHops,
19
+ });
20
+ const registerCookie = async (app, cookie = {}) => {
21
+ if (cookie !== false) {
22
+ await app.register(fastifyCookie, cookie);
23
+ }
24
+ };
25
+ const useProcessLogger = (app) => {
26
+ const logger = app.get(Logger);
27
+ app.useLogger(logger);
28
+ process.on('uncaughtException', (error) => {
29
+ logger.error(error);
30
+ });
31
+ };
32
+ const createValidationPipe = (status = HttpStatus.UNPROCESSABLE_ENTITY) => new ValidationPipe({
33
+ exceptionFactory: (errors) => new HttpException({
34
+ statusCode: status,
35
+ validationErrors: flattenValidationErrors(errors),
36
+ }, status),
37
+ transform: true,
38
+ });
39
+ export const configureFastifyApplication = async (app, options = {}) => {
40
+ await registerCookie(app, options.cookie);
41
+ app.getHttpAdapter().getInstance()
42
+ .addHook('onRequest', fastifyRequestId.onRequest);
43
+ options.configure?.(app);
44
+ app.useGlobalInterceptors(new LoggerErrorInterceptor());
45
+ app.useGlobalPipes(createValidationPipe(options.validationErrorStatus));
46
+ };
47
+ export const createFastifyApplication = async (rootModule, options = {}) => {
48
+ const adapter = createFastifyAdapter(options.trustProxyHops);
49
+ const app = await NestFactory.create(rootModule, adapter, { bufferLogs: true });
50
+ await configureFastifyApplication(app, options);
51
+ useProcessLogger(app);
52
+ app.enableShutdownHooks();
53
+ return app;
54
+ };
@@ -0,0 +1,9 @@
1
+ import type { FastifyCookieOptions } from '@fastify/cookie';
2
+ import type { HttpStatus } from '@nestjs/common';
3
+ import type { NestFastifyApplication } from '@nestjs/platform-fastify';
4
+ export interface FastifyApplicationOptionsInterface {
5
+ configure?(app: NestFastifyApplication): void;
6
+ cookie?: false | FastifyCookieOptions;
7
+ trustProxyHops?: number;
8
+ validationErrorStatus?: HttpStatus;
9
+ }
@@ -0,0 +1,2 @@
1
+ export * from './create-fastify-application.js';
2
+ export * from './fastify-application-options.interface.js';
@@ -0,0 +1,2 @@
1
+ export * from './create-fastify-application.js';
2
+ export * from './fastify-application-options.interface.js';
package/package.json CHANGED
@@ -1,6 +1,119 @@
1
1
  {
2
2
  "name": "@application-kit/bootstrap",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "Бутстрап процессов NestJS: web на Fastify с периметром (доверенные прокси по хопам, request-id в каждом ответе, cookie, ValidationPipe с плоским списком ошибок, graceful shutdown) и CLI на nestjs-console с логгером pino",
5
+ "keywords": [
6
+ "bootstrap",
7
+ "fastify",
8
+ "nestjs",
9
+ "nestjs-console"
10
+ ],
11
+ "homepage": "https://gitlab.com/application-kit/application-kit/-/tree/main/packages/bootstrap",
12
+ "bugs": "https://gitlab.com/application-kit/application-kit/-/issues",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://gitlab.com/application-kit/application-kit.git",
16
+ "directory": "packages/bootstrap"
17
+ },
18
+ "license": "MIT",
19
+ "author": {
20
+ "name": "application-kit"
21
+ },
22
+ "sideEffects": false,
23
+ "type": "module",
24
+ "exports": {
25
+ "./cli": {
26
+ "import": {
27
+ "types": "./dist/esm/cli/index.d.ts",
28
+ "default": "./dist/esm/cli/index.js"
29
+ },
30
+ "require": {
31
+ "types": "./dist/cjs/cli/index.d.ts",
32
+ "default": "./dist/cjs/cli/index.js"
33
+ }
34
+ },
35
+ "./package.json": "./package.json",
36
+ "./web": {
37
+ "import": {
38
+ "types": "./dist/esm/web/index.d.ts",
39
+ "default": "./dist/esm/web/index.js"
40
+ },
41
+ "require": {
42
+ "types": "./dist/cjs/web/index.d.ts",
43
+ "default": "./dist/cjs/web/index.js"
44
+ }
45
+ }
46
+ },
47
+ "main": "./dist/cjs/web/index.js",
48
+ "module": "./dist/esm/web/index.js",
49
+ "types": "./dist/cjs/web/index.d.ts",
50
+ "files": [
51
+ "dist"
52
+ ],
53
+ "scripts": {
54
+ "build": "rm -rf ./dist && node ../../scripts/barrels.mjs create ./src/cli && node ../../scripts/barrels.mjs create ./src/web && tsc --project tsconfig.build.json && tsc --project tsconfig.build.cjs.json && node ../../scripts/barrels.mjs clean ./src && node ../../scripts/mark-cjs.mjs ./dist/cjs",
55
+ "lint:tsc": "tsc --noEmit --pretty --project .",
56
+ "test:mutation": "stryker run",
57
+ "test:unit": "vitest run"
58
+ },
59
+ "dependencies": {
60
+ "@application-kit/observability": "^0.6.1"
61
+ },
62
+ "devDependencies": {
63
+ "@fastify/cookie": "^11.1.3",
64
+ "@nestjs/common": "^11.2.7",
65
+ "@nestjs/core": "^11.2.7",
66
+ "@nestjs/platform-fastify": "^11.2.7",
67
+ "@opentelemetry/api": "^1.9.1",
68
+ "@stryker-mutator/core": "^10.0.0",
69
+ "@stryker-mutator/vitest-runner": "^10.0.0",
70
+ "@types/node": "^26.2.0",
71
+ "class-transformer": "^0.5.1",
72
+ "class-validator": "^0.15.1",
73
+ "fastify": "^5.12.5",
74
+ "nestjs-console": "^10.0.0",
75
+ "nestjs-pino": "^4.6.1",
76
+ "pino": "^10.3.1",
77
+ "reflect-metadata": "^0.2.2",
78
+ "rxjs": "^7.8.2",
79
+ "typescript": "^6.0.3",
80
+ "vitest": "^4.1.11"
81
+ },
82
+ "peerDependencies": {
83
+ "@fastify/cookie": "^11.0.0",
84
+ "@nestjs/common": "^11.0.0",
85
+ "@nestjs/core": "^11.0.0",
86
+ "@nestjs/platform-fastify": "^11.0.0",
87
+ "@opentelemetry/api": "^1.9.0",
88
+ "class-transformer": "^0.5.1",
89
+ "class-validator": "^0.15.1",
90
+ "nestjs-console": "^10.0.0",
91
+ "nestjs-pino": "^4.6.1"
92
+ },
93
+ "peerDependenciesMeta": {
94
+ "@fastify/cookie": {
95
+ "optional": true
96
+ },
97
+ "@nestjs/platform-fastify": {
98
+ "optional": true
99
+ },
100
+ "@opentelemetry/api": {
101
+ "optional": true
102
+ },
103
+ "class-transformer": {
104
+ "optional": true
105
+ },
106
+ "class-validator": {
107
+ "optional": true
108
+ },
109
+ "nestjs-console": {
110
+ "optional": true
111
+ }
112
+ },
113
+ "engines": {
114
+ "node": ">=24"
115
+ },
116
+ "publishConfig": {
117
+ "access": "public"
118
+ }
6
119
  }