@heavybit/shared-lib 1.3.2 → 2.7.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/README.md +261 -0
- package/dist/cjs/access/index.js +9 -1
- package/dist/cjs/access/index.js.map +1 -1
- package/dist/cjs/approvals/index.js +137 -0
- package/dist/cjs/approvals/index.js.map +1 -0
- package/dist/cjs/audit/index.js +74 -0
- package/dist/cjs/audit/index.js.map +1 -0
- package/dist/cjs/cache/index.js +90 -16
- package/dist/cjs/cache/index.js.map +1 -1
- package/dist/cjs/cache/keyspace.js +101 -0
- package/dist/cjs/cache/keyspace.js.map +1 -0
- package/dist/cjs/common/circuit-breaker.js +74 -0
- package/dist/cjs/common/circuit-breaker.js.map +1 -0
- package/dist/cjs/common/errors.js +44 -5
- package/dist/cjs/common/errors.js.map +1 -1
- package/dist/cjs/common/index.js +4 -0
- package/dist/cjs/common/index.js.map +1 -1
- package/dist/cjs/common/internal-client.js +177 -0
- package/dist/cjs/common/internal-client.js.map +1 -0
- package/dist/cjs/common/internal-constants.js +12 -0
- package/dist/cjs/common/internal-constants.js.map +1 -0
- package/dist/cjs/common/internal-service-auth.js +160 -0
- package/dist/cjs/common/internal-service-auth.js.map +1 -0
- package/dist/cjs/common/money.js +215 -0
- package/dist/cjs/common/money.js.map +1 -0
- package/dist/cjs/common/phone.js +63 -11
- package/dist/cjs/common/phone.js.map +1 -1
- package/dist/cjs/common/response.js +78 -5
- package/dist/cjs/common/response.js.map +1 -1
- package/dist/cjs/common/time.js +28 -2
- package/dist/cjs/common/time.js.map +1 -1
- package/dist/cjs/config/index.js +140 -20
- package/dist/cjs/config/index.js.map +1 -1
- package/dist/cjs/context/index.js +49 -0
- package/dist/cjs/context/index.js.map +1 -0
- package/dist/cjs/contracts/index.js +0 -2
- package/dist/cjs/contracts/index.js.map +1 -1
- package/dist/cjs/contracts/notification-dispatch.js +87 -63
- package/dist/cjs/contracts/notification-dispatch.js.map +1 -1
- package/dist/cjs/database/db.js +37 -0
- package/dist/cjs/database/db.js.map +1 -0
- package/dist/cjs/database/index.js +22 -51
- package/dist/cjs/database/index.js.map +1 -1
- package/dist/cjs/database/pagination.js +88 -0
- package/dist/cjs/database/pagination.js.map +1 -0
- package/dist/cjs/database/pool.js +60 -0
- package/dist/cjs/database/pool.js.map +1 -0
- package/dist/cjs/database/scoped-repository.js +132 -0
- package/dist/cjs/database/scoped-repository.js.map +1 -0
- package/dist/cjs/database/scopes.js +166 -0
- package/dist/cjs/database/scopes.js.map +1 -0
- package/dist/cjs/database/table-names.js +14 -0
- package/dist/cjs/database/table-names.js.map +1 -0
- package/dist/cjs/database/tables.js +71 -0
- package/dist/cjs/database/tables.js.map +1 -0
- package/dist/cjs/express/auth.js +88 -41
- package/dist/cjs/express/auth.js.map +1 -1
- package/dist/cjs/express/index.js +3 -0
- package/dist/cjs/express/index.js.map +1 -1
- package/dist/cjs/express/internal-caller.js +52 -0
- package/dist/cjs/express/internal-caller.js.map +1 -0
- package/dist/cjs/express/middleware.js +154 -34
- package/dist/cjs/express/middleware.js.map +1 -1
- package/dist/cjs/express/respond.js +47 -0
- package/dist/cjs/express/respond.js.map +1 -0
- package/dist/cjs/express/step-up.js +41 -0
- package/dist/cjs/express/step-up.js.map +1 -0
- package/dist/cjs/http/index.js +3 -71
- package/dist/cjs/http/index.js.map +1 -1
- package/dist/cjs/identity/index.js +269 -67
- package/dist/cjs/identity/index.js.map +1 -1
- package/dist/cjs/identity/step-up.js +52 -0
- package/dist/cjs/identity/step-up.js.map +1 -0
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/knex/columns.js +36 -0
- package/dist/cjs/knex/columns.js.map +1 -0
- package/dist/cjs/knex/index.js +26 -43
- package/dist/cjs/knex/index.js.map +1 -1
- package/dist/cjs/knex/migration-helpers.js +57 -0
- package/dist/cjs/knex/migration-helpers.js.map +1 -0
- package/dist/cjs/logging/index.js +76 -40
- package/dist/cjs/logging/index.js.map +1 -1
- package/dist/cjs/logging/redact.js +112 -0
- package/dist/cjs/logging/redact.js.map +1 -0
- package/dist/cjs/messaging/base-consumer.js +36 -0
- package/dist/cjs/messaging/base-consumer.js.map +1 -0
- package/dist/cjs/messaging/consumer.js +142 -73
- package/dist/cjs/messaging/consumer.js.map +1 -1
- package/dist/cjs/messaging/envelope.js +53 -10
- package/dist/cjs/messaging/envelope.js.map +1 -1
- package/dist/cjs/messaging/idempotency.js +95 -8
- package/dist/cjs/messaging/idempotency.js.map +1 -1
- package/dist/cjs/messaging/index.js +3 -1
- package/dist/cjs/messaging/index.js.map +1 -1
- package/dist/cjs/messaging/outbox.js +97 -55
- package/dist/cjs/messaging/outbox.js.map +1 -1
- package/dist/cjs/messaging/publisher.js +86 -38
- package/dist/cjs/messaging/publisher.js.map +1 -1
- package/dist/cjs/messaging/staff-notifier.js +36 -44
- package/dist/cjs/messaging/staff-notifier.js.map +1 -1
- package/dist/cjs/messaging/staff-recipients.js +57 -0
- package/dist/cjs/messaging/staff-recipients.js.map +1 -0
- package/dist/cjs/messaging/topology.js +41 -5
- package/dist/cjs/messaging/topology.js.map +1 -1
- package/dist/cjs/rate-limit/index.js +57 -6
- package/dist/cjs/rate-limit/index.js.map +1 -1
- package/dist/cjs/rate-limit/keys.js +47 -0
- package/dist/cjs/rate-limit/keys.js.map +1 -0
- package/dist/cjs/socket/index.js +127 -16
- package/dist/cjs/socket/index.js.map +1 -1
- package/dist/cjs/socket/ticket.js +124 -0
- package/dist/cjs/socket/ticket.js.map +1 -0
- package/dist/cjs/testing/index.js +23 -14
- package/dist/cjs/testing/index.js.map +1 -1
- package/dist/cjs/validation/index.js +27 -3
- package/dist/cjs/validation/index.js.map +1 -1
- package/dist/esm/access/index.js +9 -1
- package/dist/esm/access/index.js.map +1 -1
- package/dist/esm/approvals/index.js +127 -0
- package/dist/esm/approvals/index.js.map +1 -0
- package/dist/esm/audit/index.js +70 -0
- package/dist/esm/audit/index.js.map +1 -0
- package/dist/esm/cache/index.js +70 -13
- package/dist/esm/cache/index.js.map +1 -1
- package/dist/esm/cache/keyspace.js +95 -0
- package/dist/esm/cache/keyspace.js.map +1 -0
- package/dist/esm/common/circuit-breaker.js +70 -0
- package/dist/esm/common/circuit-breaker.js.map +1 -0
- package/dist/esm/common/errors.js +42 -4
- package/dist/esm/common/errors.js.map +1 -1
- package/dist/esm/common/index.js +4 -0
- package/dist/esm/common/index.js.map +1 -1
- package/dist/esm/common/internal-client.js +173 -0
- package/dist/esm/common/internal-client.js.map +1 -0
- package/dist/esm/common/internal-constants.js +9 -0
- package/dist/esm/common/internal-constants.js.map +1 -0
- package/dist/esm/common/internal-service-auth.js +150 -0
- package/dist/esm/common/internal-service-auth.js.map +1 -0
- package/dist/esm/common/money.js +207 -0
- package/dist/esm/common/money.js.map +1 -0
- package/dist/esm/common/phone.js +63 -11
- package/dist/esm/common/phone.js.map +1 -1
- package/dist/esm/common/response.js +75 -5
- package/dist/esm/common/response.js.map +1 -1
- package/dist/esm/common/time.js +27 -2
- package/dist/esm/common/time.js.map +1 -1
- package/dist/esm/config/index.js +136 -19
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/context/index.js +44 -0
- package/dist/esm/context/index.js.map +1 -0
- package/dist/esm/contracts/index.js +0 -2
- package/dist/esm/contracts/index.js.map +1 -1
- package/dist/esm/contracts/notification-dispatch.js +85 -62
- package/dist/esm/contracts/notification-dispatch.js.map +1 -1
- package/dist/esm/database/db.js +32 -0
- package/dist/esm/database/db.js.map +1 -0
- package/dist/esm/database/index.js +9 -45
- package/dist/esm/database/index.js.map +1 -1
- package/dist/esm/database/pagination.js +81 -0
- package/dist/esm/database/pagination.js.map +1 -0
- package/dist/esm/database/pool.js +51 -0
- package/dist/esm/database/pool.js.map +1 -0
- package/dist/esm/database/scoped-repository.js +128 -0
- package/dist/esm/database/scoped-repository.js.map +1 -0
- package/dist/esm/database/scopes.js +157 -0
- package/dist/esm/database/scopes.js.map +1 -0
- package/dist/esm/database/table-names.js +11 -0
- package/dist/esm/database/table-names.js.map +1 -0
- package/dist/esm/database/tables.js +61 -0
- package/dist/esm/database/tables.js.map +1 -0
- package/dist/esm/express/auth.js +87 -40
- package/dist/esm/express/auth.js.map +1 -1
- package/dist/esm/express/index.js +3 -0
- package/dist/esm/express/index.js.map +1 -1
- package/dist/esm/express/internal-caller.js +49 -0
- package/dist/esm/express/internal-caller.js.map +1 -0
- package/dist/esm/express/middleware.js +146 -27
- package/dist/esm/express/middleware.js.map +1 -1
- package/dist/esm/express/respond.js +42 -0
- package/dist/esm/express/respond.js.map +1 -0
- package/dist/esm/express/step-up.js +38 -0
- package/dist/esm/express/step-up.js.map +1 -0
- package/dist/esm/http/index.js +3 -70
- package/dist/esm/http/index.js.map +1 -1
- package/dist/esm/identity/index.js +246 -64
- package/dist/esm/identity/index.js.map +1 -1
- package/dist/esm/identity/step-up.js +47 -0
- package/dist/esm/identity/step-up.js.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/knex/columns.js +28 -0
- package/dist/esm/knex/columns.js.map +1 -0
- package/dist/esm/knex/index.js +8 -34
- package/dist/esm/knex/index.js.map +1 -1
- package/dist/esm/knex/migration-helpers.js +51 -0
- package/dist/esm/knex/migration-helpers.js.map +1 -0
- package/dist/esm/logging/index.js +68 -39
- package/dist/esm/logging/index.js.map +1 -1
- package/dist/esm/logging/redact.js +106 -0
- package/dist/esm/logging/redact.js.map +1 -0
- package/dist/esm/messaging/base-consumer.js +32 -0
- package/dist/esm/messaging/base-consumer.js.map +1 -0
- package/dist/esm/messaging/consumer.js +139 -71
- package/dist/esm/messaging/consumer.js.map +1 -1
- package/dist/esm/messaging/envelope.js +50 -10
- package/dist/esm/messaging/envelope.js.map +1 -1
- package/dist/esm/messaging/idempotency.js +91 -7
- package/dist/esm/messaging/idempotency.js.map +1 -1
- package/dist/esm/messaging/index.js +3 -1
- package/dist/esm/messaging/index.js.map +1 -1
- package/dist/esm/messaging/outbox.js +97 -54
- package/dist/esm/messaging/outbox.js.map +1 -1
- package/dist/esm/messaging/publisher.js +86 -38
- package/dist/esm/messaging/publisher.js.map +1 -1
- package/dist/esm/messaging/staff-notifier.js +36 -43
- package/dist/esm/messaging/staff-notifier.js.map +1 -1
- package/dist/esm/messaging/staff-recipients.js +53 -0
- package/dist/esm/messaging/staff-recipients.js.map +1 -0
- package/dist/esm/messaging/topology.js +39 -4
- package/dist/esm/messaging/topology.js.map +1 -1
- package/dist/esm/rate-limit/index.js +41 -6
- package/dist/esm/rate-limit/index.js.map +1 -1
- package/dist/esm/rate-limit/keys.js +43 -0
- package/dist/esm/rate-limit/keys.js.map +1 -0
- package/dist/esm/socket/index.js +112 -17
- package/dist/esm/socket/index.js.map +1 -1
- package/dist/esm/socket/ticket.js +117 -0
- package/dist/esm/socket/ticket.js.map +1 -0
- package/dist/esm/testing/index.js +24 -15
- package/dist/esm/testing/index.js.map +1 -1
- package/dist/esm/validation/index.js +27 -2
- package/dist/esm/validation/index.js.map +1 -1
- package/dist/types/access/index.d.ts +9 -3
- package/dist/types/access/index.d.ts.map +1 -1
- package/dist/types/alerting/index.d.ts +1 -1
- package/dist/types/alerting/index.d.ts.map +1 -1
- package/dist/types/approvals/index.d.ts +99 -0
- package/dist/types/approvals/index.d.ts.map +1 -0
- package/dist/types/audit/index.d.ts +82 -0
- package/dist/types/audit/index.d.ts.map +1 -0
- package/dist/types/cache/index.d.ts +64 -14
- package/dist/types/cache/index.d.ts.map +1 -1
- package/dist/types/cache/keyspace.d.ts +84 -0
- package/dist/types/cache/keyspace.d.ts.map +1 -0
- package/dist/types/common/circuit-breaker.d.ts +51 -0
- package/dist/types/common/circuit-breaker.d.ts.map +1 -0
- package/dist/types/common/errors.d.ts +48 -7
- package/dist/types/common/errors.d.ts.map +1 -1
- package/dist/types/common/index.d.ts +4 -0
- package/dist/types/common/index.d.ts.map +1 -1
- package/dist/types/common/internal-client.d.ts +116 -0
- package/dist/types/common/internal-client.d.ts.map +1 -0
- package/dist/types/common/internal-constants.d.ts +9 -0
- package/dist/types/common/internal-constants.d.ts.map +1 -0
- package/dist/types/common/internal-service-auth.d.ts +102 -0
- package/dist/types/common/internal-service-auth.d.ts.map +1 -0
- package/dist/types/common/money.d.ts +104 -0
- package/dist/types/common/money.d.ts.map +1 -0
- package/dist/types/common/phone.d.ts +45 -6
- package/dist/types/common/phone.d.ts.map +1 -1
- package/dist/types/common/response.d.ts +66 -5
- package/dist/types/common/response.d.ts.map +1 -1
- package/dist/types/common/time.d.ts +20 -2
- package/dist/types/common/time.d.ts.map +1 -1
- package/dist/types/config/index.d.ts +252 -28
- package/dist/types/config/index.d.ts.map +1 -1
- package/dist/types/context/index.d.ts +39 -0
- package/dist/types/context/index.d.ts.map +1 -0
- package/dist/types/contracts/index.d.ts +0 -2
- package/dist/types/contracts/index.d.ts.map +1 -1
- package/dist/types/contracts/notification-dispatch.d.ts +204 -86
- package/dist/types/contracts/notification-dispatch.d.ts.map +1 -1
- package/dist/types/database/db.d.ts +46 -0
- package/dist/types/database/db.d.ts.map +1 -0
- package/dist/types/database/index.d.ts +9 -22
- package/dist/types/database/index.d.ts.map +1 -1
- package/dist/types/database/pagination.d.ts +68 -0
- package/dist/types/database/pagination.d.ts.map +1 -0
- package/dist/types/database/pool.d.ts +39 -0
- package/dist/types/database/pool.d.ts.map +1 -0
- package/dist/types/database/scoped-repository.d.ts +92 -0
- package/dist/types/database/scoped-repository.d.ts.map +1 -0
- package/dist/types/database/scopes.d.ts +159 -0
- package/dist/types/database/scopes.d.ts.map +1 -0
- package/dist/types/database/table-names.d.ts +13 -0
- package/dist/types/database/table-names.d.ts.map +1 -0
- package/dist/types/database/tables.d.ts +748 -0
- package/dist/types/database/tables.d.ts.map +1 -0
- package/dist/types/express/auth.d.ts +63 -11
- package/dist/types/express/auth.d.ts.map +1 -1
- package/dist/types/express/index.d.ts +3 -0
- package/dist/types/express/index.d.ts.map +1 -1
- package/dist/types/express/internal-caller.d.ts +53 -0
- package/dist/types/express/internal-caller.d.ts.map +1 -0
- package/dist/types/express/middleware.d.ts +86 -7
- package/dist/types/express/middleware.d.ts.map +1 -1
- package/dist/types/express/respond.d.ts +41 -0
- package/dist/types/express/respond.d.ts.map +1 -0
- package/dist/types/express/step-up.d.ts +38 -0
- package/dist/types/express/step-up.d.ts.map +1 -0
- package/dist/types/http/index.d.ts +3 -31
- package/dist/types/http/index.d.ts.map +1 -1
- package/dist/types/identity/index.d.ts +159 -21
- package/dist/types/identity/index.d.ts.map +1 -1
- package/dist/types/identity/step-up.d.ts +41 -0
- package/dist/types/identity/step-up.d.ts.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/knex/columns.d.ts +15 -0
- package/dist/types/knex/columns.d.ts.map +1 -0
- package/dist/types/knex/index.d.ts +3 -11
- package/dist/types/knex/index.d.ts.map +1 -1
- package/dist/types/knex/migration-helpers.d.ts +28 -0
- package/dist/types/knex/migration-helpers.d.ts.map +1 -0
- package/dist/types/logging/index.d.ts +30 -4
- package/dist/types/logging/index.d.ts.map +1 -1
- package/dist/types/logging/redact.d.ts +54 -0
- package/dist/types/logging/redact.d.ts.map +1 -0
- package/dist/types/messaging/base-consumer.d.ts +33 -0
- package/dist/types/messaging/base-consumer.d.ts.map +1 -0
- package/dist/types/messaging/consumer.d.ts +59 -21
- package/dist/types/messaging/consumer.d.ts.map +1 -1
- package/dist/types/messaging/envelope.d.ts +50 -11
- package/dist/types/messaging/envelope.d.ts.map +1 -1
- package/dist/types/messaging/idempotency.d.ts +60 -3
- package/dist/types/messaging/idempotency.d.ts.map +1 -1
- package/dist/types/messaging/index.d.ts +8 -0
- package/dist/types/messaging/index.d.ts.map +1 -1
- package/dist/types/messaging/outbox.d.ts +62 -22
- package/dist/types/messaging/outbox.d.ts.map +1 -1
- package/dist/types/messaging/publisher.d.ts +54 -21
- package/dist/types/messaging/publisher.d.ts.map +1 -1
- package/dist/types/messaging/staff-notifier.d.ts +69 -38
- package/dist/types/messaging/staff-notifier.d.ts.map +1 -1
- package/dist/types/messaging/staff-recipients.d.ts +50 -0
- package/dist/types/messaging/staff-recipients.d.ts.map +1 -0
- package/dist/types/messaging/topology.d.ts +40 -8
- package/dist/types/messaging/topology.d.ts.map +1 -1
- package/dist/types/rate-limit/index.d.ts +40 -4
- package/dist/types/rate-limit/index.d.ts.map +1 -1
- package/dist/types/rate-limit/keys.d.ts +52 -0
- package/dist/types/rate-limit/keys.d.ts.map +1 -0
- package/dist/types/socket/index.d.ts +86 -2
- package/dist/types/socket/index.d.ts.map +1 -1
- package/dist/types/socket/ticket.d.ts +90 -0
- package/dist/types/socket/ticket.d.ts.map +1 -0
- package/dist/types/testing/index.d.ts +31 -10
- package/dist/types/testing/index.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +62 -15
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/validation/index.d.ts +33 -2
- package/dist/types/validation/index.d.ts.map +1 -1
- package/package.json +3 -1
- package/dist/cjs/contracts/editorial-draft.js +0 -120
- package/dist/cjs/contracts/editorial-draft.js.map +0 -1
- package/dist/cjs/contracts/upload-import.js +0 -54
- package/dist/cjs/contracts/upload-import.js.map +0 -1
- package/dist/esm/contracts/editorial-draft.js +0 -117
- package/dist/esm/contracts/editorial-draft.js.map +0 -1
- package/dist/esm/contracts/upload-import.js +0 -51
- package/dist/esm/contracts/upload-import.js.map +0 -1
- package/dist/types/contracts/editorial-draft.d.ts +0 -610
- package/dist/types/contracts/editorial-draft.d.ts.map +0 -1
- package/dist/types/contracts/upload-import.d.ts +0 -96
- package/dist/types/contracts/upload-import.d.ts.map +0 -1
|
@@ -1,12 +1,73 @@
|
|
|
1
|
-
import type { ApiResponse, PaginationMeta, PaginatedResult } from '../types/index.js';
|
|
2
|
-
/**
|
|
1
|
+
import type { ApiResponse, CursorPage, CursorPageMeta, ErrorBody, PaginationMeta, PaginatedResult } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Standard success envelope: `{ success, message, data }`.
|
|
4
|
+
*
|
|
5
|
+
* @param data Payload placed under `data`.
|
|
6
|
+
* @param message Human-readable message (default `Success`).
|
|
7
|
+
* @returns The envelope, ready for `res.json`.
|
|
8
|
+
* @example res.json(successResponse(order, 'Order placed'));
|
|
9
|
+
*/
|
|
3
10
|
export declare function successResponse<T>(data: T, message?: string): ApiResponse<T>;
|
|
4
|
-
/**
|
|
5
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Standard error envelope: `{ success: false, message, code?, errors?, requestId? }`.
|
|
13
|
+
* Prefer throwing an AppError and letting the error middleware answer; use this only where a
|
|
14
|
+
* middleware must answer directly. For a body with a guaranteed `code`, use {@link errorBody}.
|
|
15
|
+
*
|
|
16
|
+
* @param message Message for the caller (never an internal error message).
|
|
17
|
+
* @param errors Optional field errors.
|
|
18
|
+
* @param code Optional UPPER_SNAKE_CASE code.
|
|
19
|
+
* @param requestId Optional correlation id of the request.
|
|
20
|
+
* @returns An envelope with `success: false`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function errorResponse(message: string, errors?: Record<string, string[]>, code?: string, requestId?: string): ApiResponse<never>;
|
|
23
|
+
/**
|
|
24
|
+
* The error body with a required `code`, as the error middleware sends it.
|
|
25
|
+
*
|
|
26
|
+
* @param code UPPER_SNAKE_CASE machine-readable code.
|
|
27
|
+
* @param message Message for the caller (generic for 5xx).
|
|
28
|
+
* @param options `errors` (field errors) and `requestId` (correlation id), both omitted when absent.
|
|
29
|
+
* @returns `{ success: false, code, message, errors?, requestId? }`.
|
|
30
|
+
*
|
|
31
|
+
* @example res.status(404).json(errorBody('NOT_FOUND', 'Resource not found', { requestId }));
|
|
32
|
+
*/
|
|
33
|
+
export declare function errorBody(code: string, message: string, options?: {
|
|
34
|
+
errors?: Record<string, string[]>;
|
|
35
|
+
requestId?: string;
|
|
36
|
+
}): ErrorBody;
|
|
37
|
+
/**
|
|
38
|
+
* Offset pagination meta. `totalPages` is at least 1 so an empty list still reads as "page 1 of 1".
|
|
39
|
+
*
|
|
40
|
+
* @param total Total matching rows.
|
|
41
|
+
* @param page 1-based page that was returned.
|
|
42
|
+
* @param limit Page size.
|
|
43
|
+
* @returns `{ page, limit, total, totalPages, hasNext, hasPrev }`.
|
|
44
|
+
* @example buildPaginationMeta(45, 2, 20) // { page: 2, totalPages: 3, hasNext: true, hasPrev: true, … }
|
|
45
|
+
*/
|
|
6
46
|
export declare function buildPaginationMeta(total: number, page: number, limit: number): PaginationMeta;
|
|
7
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* Offset-paginated envelope: `{ success, message, data: T[], meta }`.
|
|
49
|
+
*
|
|
50
|
+
* @returns The envelope with meta from {@link buildPaginationMeta}.
|
|
51
|
+
* @example res.json(paginatedResponse(rows, total, page, limit));
|
|
52
|
+
*/
|
|
8
53
|
export declare function paginatedResponse<T>(data: T[], total: number, page: number, limit: number, message?: string): ApiResponse<T[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Offset page as a service returns it (data + meta, no envelope).
|
|
56
|
+
*
|
|
57
|
+
* @returns `{ data, meta }`.
|
|
58
|
+
* @example return buildPaginatedResult(rows, total, page, limit);
|
|
59
|
+
*/
|
|
9
60
|
export declare function buildPaginatedResult<T>(data: T[], total: number, page: number, limit: number): PaginatedResult<T>;
|
|
10
61
|
/** SQL offset for 1-based pages. */
|
|
11
62
|
export declare function pageOffset(page: number, limit: number): number;
|
|
63
|
+
/**
|
|
64
|
+
* Cursor pagination meta. `hasMore` is derived from `nextCursor`, so the two can never disagree.
|
|
65
|
+
*
|
|
66
|
+
* @param limit The page size that was applied.
|
|
67
|
+
* @param nextCursor Opaque cursor for the next page, or null on the last page.
|
|
68
|
+
* @example buildCursorPageMeta(20, rows.length > 20 ? encodeCursor(rows[19]) : null)
|
|
69
|
+
*/
|
|
70
|
+
export declare function buildCursorPageMeta(limit: number, nextCursor: string | null): CursorPageMeta;
|
|
71
|
+
/** Cursor-paginated envelope: `{ success, message, data: T[], meta: { limit, nextCursor, hasMore } }`. */
|
|
72
|
+
export declare function cursorPaginatedResponse<T>(page: CursorPage<T>, message?: string): ApiResponse<T[]>;
|
|
12
73
|
//# sourceMappingURL=response.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/common/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/common/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE7H;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,SAAY,GAAG,WAAW,CAAC,CAAC,CAAC,CAE/E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAEvI;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,SAAS,CAQ3I;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAG9F;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,SAAY,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAEjI;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAEjH;AAED,oCAAoC;AACpC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAE5F;AAED,0GAA0G;AAC1G,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,SAAY,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAErG"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** True for IANA zones the runtime knows (`
|
|
1
|
+
/** True for IANA zones the runtime knows (`Europe/Berlin`), false for garbage. */
|
|
2
2
|
export declare function isValidTimeZone(zone: string): boolean;
|
|
3
3
|
/** Formats an instant in a zone, e.g. `30 Sep 2026, 14:05 EAT`. Falls back to UTC for invalid zones. */
|
|
4
4
|
export declare function formatInTimeZone(date: Date | string | number, zone: string, locale?: string): string;
|
|
@@ -27,7 +27,16 @@ export declare function parseClockTime(value: string): number;
|
|
|
27
27
|
* time skipped by a spring-forward resolves to the nearest valid instant.
|
|
28
28
|
*/
|
|
29
29
|
export declare function zonedWallTimeToInstant(year: number, month: number, day: number, minutesOfDay: number, zone: string): Date;
|
|
30
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* The local calendar day containing `at` in `zone`, as a half-open `[start, end)` UTC range (23–25 h on
|
|
32
|
+
* DST days). Use it for "today" in reports, business days and daily limits.
|
|
33
|
+
*
|
|
34
|
+
* @param at Any instant in the day.
|
|
35
|
+
* @param zone IANA zone (required; no app default).
|
|
36
|
+
* @returns `{ start, end }` with `start` inclusive and `end` exclusive.
|
|
37
|
+
* @throws RangeError for an unknown zone.
|
|
38
|
+
* @example zonedDayBounds(new Date('2026-10-11T22:30:00Z'), 'Asia/Riyadh') // 2026-10-11T21:00Z → 2026-10-12T21:00Z
|
|
39
|
+
*/
|
|
31
40
|
export declare function zonedDayBounds(at: Date, zone: string): {
|
|
32
41
|
start: Date;
|
|
33
42
|
end: Date;
|
|
@@ -37,4 +46,13 @@ export declare function zonedDayBounds(at: Date, zone: string): {
|
|
|
37
46
|
* cross midnight), the instant that window ends; otherwise null. `start === end` means no window.
|
|
38
47
|
*/
|
|
39
48
|
export declare function quietWindowEndAt(at: Date, zone: string, start: string, end: string): Date | null;
|
|
49
|
+
/**
|
|
50
|
+
* The instant as a UTC ISO-8601 string (`2026-11-13T09:00:00.000Z`), the form every timestamp travels in.
|
|
51
|
+
*
|
|
52
|
+
* @param instant A Date, an epoch-milliseconds number or a string `Date` can parse.
|
|
53
|
+
* @returns The `toISOString()` form.
|
|
54
|
+
* @throws RangeError when the input is not a valid instant (never returns `"Invalid Date"`).
|
|
55
|
+
* @example toUtcIso('2026-11-13T12:00:00+03:00') // '2026-11-13T09:00:00.000Z'
|
|
56
|
+
*/
|
|
57
|
+
export declare function toUtcIso(instant: Date | string | number): string;
|
|
40
58
|
//# sourceMappingURL=time.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/common/time.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/common/time.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED,wGAAwG;AACxG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAU,GAAG,MAAM,CAWrG;AAED,MAAM,WAAW,SAAS;IACxB,wGAAwG;IACxG,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,SAAQ,EAAE,MAAM,SAAU,GAAG,SAAS,CAKrI;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAE,IAAiB,GAAG,MAAM,CAOjF;AAED,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,EAAE,SAAS,MAAM,KAAG,IAAiD,CAAC;AAC3G,eAAO,MAAM,UAAU,GAAI,MAAM,IAAI,EAAE,SAAS,MAAM,KAAG,IAAsC,CAAC;AAMhG,uGAAuG;AACvG,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD;AASD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzH;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,CAIjF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAchG;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAIhE"}
|
|
@@ -1,40 +1,53 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
/**
|
|
3
|
-
* Environment building blocks. Services compose the pieces they need:
|
|
4
|
-
*
|
|
5
|
-
* const env = loadEnv(serviceEnv.merge(databaseEnv).merge(messagingEnv).extend({ MY_VAR: z.string() }));
|
|
6
|
-
*/
|
|
2
|
+
/** Service identity, logging, CORS and the gateway signing secret. */
|
|
7
3
|
export declare const serviceEnv: z.ZodObject<{
|
|
8
4
|
NODE_ENV: z.ZodDefault<z.ZodEnum<["development", "test", "staging", "production"]>>;
|
|
9
5
|
PORT: z.ZodNumber;
|
|
10
6
|
SERVICE_NAME: z.ZodString;
|
|
11
|
-
/** Short app identifier used in exchange names and key prefixes (e.g. `
|
|
7
|
+
/** Short app identifier used in exchange names and key prefixes (e.g. `myapp`). */
|
|
12
8
|
APP_NAME: z.ZodDefault<z.ZodString>;
|
|
13
9
|
LOG_LEVEL: z.ZodOptional<z.ZodEnum<["error", "warn", "info", "http", "debug"]>>;
|
|
14
10
|
CORS_ORIGINS: z.ZodDefault<z.ZodString>;
|
|
15
|
-
/** Verifies gateway-signed identity headers. */
|
|
16
|
-
|
|
17
|
-
/** Authenticates service-to-service `/internal/*` calls. */
|
|
18
|
-
INTERNAL_SERVICE_SECRET: z.ZodString;
|
|
11
|
+
/** Verifies gateway-signed identity headers (v2); at least 32 characters, same value on the gateway and every service. */
|
|
12
|
+
GATEWAY_SIGNING_SECRET: z.ZodString;
|
|
19
13
|
}, "strip", z.ZodTypeAny, {
|
|
20
|
-
NODE_ENV: "
|
|
14
|
+
NODE_ENV: "development" | "test" | "staging" | "production";
|
|
21
15
|
PORT: number;
|
|
22
16
|
SERVICE_NAME: string;
|
|
23
17
|
APP_NAME: string;
|
|
24
18
|
CORS_ORIGINS: string;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
LOG_LEVEL?: "info" | "debug" | "error" | "warn" | "http" | undefined;
|
|
19
|
+
GATEWAY_SIGNING_SECRET: string;
|
|
20
|
+
LOG_LEVEL?: "error" | "warn" | "info" | "http" | "debug" | undefined;
|
|
28
21
|
}, {
|
|
29
22
|
PORT: number;
|
|
30
23
|
SERVICE_NAME: string;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
NODE_ENV?: "production" | "test" | "development" | "staging" | undefined;
|
|
34
|
-
LOG_LEVEL?: "info" | "debug" | "error" | "warn" | "http" | undefined;
|
|
24
|
+
GATEWAY_SIGNING_SECRET: string;
|
|
25
|
+
NODE_ENV?: "development" | "test" | "staging" | "production" | undefined;
|
|
35
26
|
APP_NAME?: string | undefined;
|
|
27
|
+
LOG_LEVEL?: "error" | "warn" | "info" | "http" | "debug" | undefined;
|
|
36
28
|
CORS_ORIGINS?: string | undefined;
|
|
37
29
|
}>;
|
|
30
|
+
/**
|
|
31
|
+
* Service-to-service credentials. Optional here because development may run without them;
|
|
32
|
+
* `assertInternalServiceAuthConfigured` enforces them in staging and production.
|
|
33
|
+
*/
|
|
34
|
+
export declare const internalServiceEnv: z.ZodObject<{
|
|
35
|
+
/** This service's own name (its compose service name), sent with every internal call. */
|
|
36
|
+
INTERNAL_SERVICE_NAME: z.ZodOptional<z.ZodString>;
|
|
37
|
+
/** This service's own secret (at least 32 characters), sent with every internal call. */
|
|
38
|
+
INTERNAL_SERVICE_CREDENTIAL: z.ZodOptional<z.ZodString>;
|
|
39
|
+
/** JSON map of caller name → secret this service accepts from that caller. */
|
|
40
|
+
INTERNAL_SERVICE_CREDENTIALS: z.ZodOptional<z.ZodString>;
|
|
41
|
+
}, "strip", z.ZodTypeAny, {
|
|
42
|
+
INTERNAL_SERVICE_NAME?: string | undefined;
|
|
43
|
+
INTERNAL_SERVICE_CREDENTIAL?: string | undefined;
|
|
44
|
+
INTERNAL_SERVICE_CREDENTIALS?: string | undefined;
|
|
45
|
+
}, {
|
|
46
|
+
INTERNAL_SERVICE_NAME?: string | undefined;
|
|
47
|
+
INTERNAL_SERVICE_CREDENTIAL?: string | undefined;
|
|
48
|
+
INTERNAL_SERVICE_CREDENTIALS?: string | undefined;
|
|
49
|
+
}>;
|
|
50
|
+
/** Database connection env vars (MySQL defaults). */
|
|
38
51
|
export declare const databaseEnv: z.ZodObject<{
|
|
39
52
|
DB_HOST: z.ZodDefault<z.ZodString>;
|
|
40
53
|
DB_PORT: z.ZodDefault<z.ZodNumber>;
|
|
@@ -57,6 +70,7 @@ export declare const databaseEnv: z.ZodObject<{
|
|
|
57
70
|
DB_PASSWORD?: string | undefined;
|
|
58
71
|
DB_POOL_MAX?: number | undefined;
|
|
59
72
|
}>;
|
|
73
|
+
/** RabbitMQ connection and queue-prefix env vars. */
|
|
60
74
|
export declare const messagingEnv: z.ZodObject<{
|
|
61
75
|
RABBITMQ_URL: z.ZodOptional<z.ZodString>;
|
|
62
76
|
RABBITMQ_HOST: z.ZodDefault<z.ZodString>;
|
|
@@ -86,30 +100,240 @@ export declare const messagingEnv: z.ZodObject<{
|
|
|
86
100
|
QUEUE_PREFIX?: string | undefined;
|
|
87
101
|
RABBITMQ_ENABLED?: "true" | "false" | undefined;
|
|
88
102
|
}>;
|
|
103
|
+
/** Redis connection env vars. Keys are prefixed by the keyspace (`createRedisKeyspace`), never by the client. */
|
|
89
104
|
export declare const redisEnv: z.ZodObject<{
|
|
105
|
+
/** Full connection URL; overrides host/port/password when set. */
|
|
90
106
|
REDIS_URL: z.ZodOptional<z.ZodString>;
|
|
107
|
+
REDIS_HOST: z.ZodDefault<z.ZodString>;
|
|
108
|
+
REDIS_PORT: z.ZodDefault<z.ZodNumber>;
|
|
109
|
+
REDIS_PASSWORD: z.ZodOptional<z.ZodString>;
|
|
91
110
|
REDIS_DB: z.ZodDefault<z.ZodNumber>;
|
|
92
|
-
/**
|
|
93
|
-
|
|
111
|
+
/**
|
|
112
|
+
* Environment segment of every Redis key (`{app}:{env}:{service}:…`), e.g. `dev`, `staging`, `prod`.
|
|
113
|
+
* Required in staging and production; never share one between environments.
|
|
114
|
+
*/
|
|
115
|
+
CACHE_KEY_PREFIX: z.ZodOptional<z.ZodString>;
|
|
94
116
|
}, "strip", z.ZodTypeAny, {
|
|
117
|
+
REDIS_HOST: string;
|
|
118
|
+
REDIS_PORT: number;
|
|
95
119
|
REDIS_DB: number;
|
|
96
|
-
REDIS_PREFIX: string;
|
|
97
120
|
REDIS_URL?: string | undefined;
|
|
121
|
+
REDIS_PASSWORD?: string | undefined;
|
|
122
|
+
CACHE_KEY_PREFIX?: string | undefined;
|
|
98
123
|
}, {
|
|
99
124
|
REDIS_URL?: string | undefined;
|
|
125
|
+
REDIS_HOST?: string | undefined;
|
|
126
|
+
REDIS_PORT?: number | undefined;
|
|
127
|
+
REDIS_PASSWORD?: string | undefined;
|
|
100
128
|
REDIS_DB?: number | undefined;
|
|
101
|
-
|
|
129
|
+
CACHE_KEY_PREFIX?: string | undefined;
|
|
102
130
|
}>;
|
|
103
|
-
/**
|
|
131
|
+
/**
|
|
132
|
+
* Builds an AMQP URL from discrete env vars (or returns RABBITMQ_URL when set). User, password and vhost are URL-encoded.
|
|
133
|
+
*
|
|
134
|
+
* @param env Parsed {@link messagingEnv} values.
|
|
135
|
+
* @returns An `amqp://` URL.
|
|
136
|
+
* @example const url = amqpUrlFromEnv(parseEnv(messagingEnv));
|
|
137
|
+
*/
|
|
104
138
|
export declare function amqpUrlFromEnv(env: z.infer<typeof messagingEnv>): string;
|
|
105
|
-
/**
|
|
139
|
+
/**
|
|
140
|
+
* Reads `KEY=value` lines from a dotenv file into process.env without overriding set values. Missing file is a no-op.
|
|
141
|
+
*
|
|
142
|
+
* @param path Dotenv file (default `./.env`).
|
|
143
|
+
* @example loadDotEnv(resolve(__dirname, '../.env.test'));
|
|
144
|
+
*/
|
|
106
145
|
export declare function loadDotEnv(path?: string): void;
|
|
146
|
+
/** Thrown by the env loader when required variables are missing or invalid; lists every problem. */
|
|
107
147
|
export declare class ConfigError extends Error {
|
|
108
148
|
}
|
|
109
|
-
/**
|
|
110
|
-
|
|
149
|
+
/**
|
|
150
|
+
* The base environment every service validates: service identity, gateway secret, database, Redis,
|
|
151
|
+
* RabbitMQ and internal-service credentials. `loadEnv` merges a service's own schema onto it.
|
|
152
|
+
*/
|
|
153
|
+
export declare const baseEnv: z.ZodObject<{
|
|
154
|
+
NODE_ENV: z.ZodDefault<z.ZodEnum<["development", "test", "staging", "production"]>>;
|
|
155
|
+
PORT: z.ZodNumber;
|
|
156
|
+
SERVICE_NAME: z.ZodString;
|
|
157
|
+
/** Short app identifier used in exchange names and key prefixes (e.g. `myapp`). */
|
|
158
|
+
APP_NAME: z.ZodDefault<z.ZodString>;
|
|
159
|
+
LOG_LEVEL: z.ZodOptional<z.ZodEnum<["error", "warn", "info", "http", "debug"]>>;
|
|
160
|
+
CORS_ORIGINS: z.ZodDefault<z.ZodString>;
|
|
161
|
+
/** Verifies gateway-signed identity headers (v2); at least 32 characters, same value on the gateway and every service. */
|
|
162
|
+
GATEWAY_SIGNING_SECRET: z.ZodString;
|
|
163
|
+
} & {
|
|
164
|
+
DB_HOST: z.ZodDefault<z.ZodString>;
|
|
165
|
+
DB_PORT: z.ZodDefault<z.ZodNumber>;
|
|
166
|
+
DB_USER: z.ZodDefault<z.ZodString>;
|
|
167
|
+
DB_PASSWORD: z.ZodDefault<z.ZodString>;
|
|
168
|
+
DB_NAME: z.ZodString;
|
|
169
|
+
DB_POOL_MAX: z.ZodDefault<z.ZodNumber>;
|
|
170
|
+
} & {
|
|
171
|
+
/** Full connection URL; overrides host/port/password when set. */
|
|
172
|
+
REDIS_URL: z.ZodOptional<z.ZodString>;
|
|
173
|
+
REDIS_HOST: z.ZodDefault<z.ZodString>;
|
|
174
|
+
REDIS_PORT: z.ZodDefault<z.ZodNumber>;
|
|
175
|
+
REDIS_PASSWORD: z.ZodOptional<z.ZodString>;
|
|
176
|
+
REDIS_DB: z.ZodDefault<z.ZodNumber>;
|
|
177
|
+
/**
|
|
178
|
+
* Environment segment of every Redis key (`{app}:{env}:{service}:…`), e.g. `dev`, `staging`, `prod`.
|
|
179
|
+
* Required in staging and production; never share one between environments.
|
|
180
|
+
*/
|
|
181
|
+
CACHE_KEY_PREFIX: z.ZodOptional<z.ZodString>;
|
|
182
|
+
} & {
|
|
183
|
+
RABBITMQ_URL: z.ZodOptional<z.ZodString>;
|
|
184
|
+
RABBITMQ_HOST: z.ZodDefault<z.ZodString>;
|
|
185
|
+
RABBITMQ_PORT: z.ZodDefault<z.ZodNumber>;
|
|
186
|
+
RABBITMQ_USER: z.ZodDefault<z.ZodString>;
|
|
187
|
+
RABBITMQ_PASSWORD: z.ZodDefault<z.ZodString>;
|
|
188
|
+
RABBITMQ_VHOST: z.ZodDefault<z.ZodString>;
|
|
189
|
+
/** Environment prefix for queue and exchange names (`dev`, `staging`, `prod`). */
|
|
190
|
+
QUEUE_PREFIX: z.ZodDefault<z.ZodString>;
|
|
191
|
+
RABBITMQ_ENABLED: z.ZodEffects<z.ZodDefault<z.ZodEnum<["true", "false"]>>, boolean, "true" | "false" | undefined>;
|
|
192
|
+
} & {
|
|
193
|
+
/** This service's own name (its compose service name), sent with every internal call. */
|
|
194
|
+
INTERNAL_SERVICE_NAME: z.ZodOptional<z.ZodString>;
|
|
195
|
+
/** This service's own secret (at least 32 characters), sent with every internal call. */
|
|
196
|
+
INTERNAL_SERVICE_CREDENTIAL: z.ZodOptional<z.ZodString>;
|
|
197
|
+
/** JSON map of caller name → secret this service accepts from that caller. */
|
|
198
|
+
INTERNAL_SERVICE_CREDENTIALS: z.ZodOptional<z.ZodString>;
|
|
199
|
+
}, "strip", z.ZodTypeAny, {
|
|
200
|
+
NODE_ENV: "development" | "test" | "staging" | "production";
|
|
201
|
+
PORT: number;
|
|
202
|
+
SERVICE_NAME: string;
|
|
203
|
+
APP_NAME: string;
|
|
204
|
+
CORS_ORIGINS: string;
|
|
205
|
+
GATEWAY_SIGNING_SECRET: string;
|
|
206
|
+
DB_HOST: string;
|
|
207
|
+
DB_PORT: number;
|
|
208
|
+
DB_USER: string;
|
|
209
|
+
DB_PASSWORD: string;
|
|
210
|
+
DB_NAME: string;
|
|
211
|
+
DB_POOL_MAX: number;
|
|
212
|
+
RABBITMQ_HOST: string;
|
|
213
|
+
RABBITMQ_PORT: number;
|
|
214
|
+
RABBITMQ_USER: string;
|
|
215
|
+
RABBITMQ_PASSWORD: string;
|
|
216
|
+
RABBITMQ_VHOST: string;
|
|
217
|
+
QUEUE_PREFIX: string;
|
|
218
|
+
RABBITMQ_ENABLED: boolean;
|
|
219
|
+
REDIS_HOST: string;
|
|
220
|
+
REDIS_PORT: number;
|
|
221
|
+
REDIS_DB: number;
|
|
222
|
+
LOG_LEVEL?: "error" | "warn" | "info" | "http" | "debug" | undefined;
|
|
223
|
+
INTERNAL_SERVICE_NAME?: string | undefined;
|
|
224
|
+
INTERNAL_SERVICE_CREDENTIAL?: string | undefined;
|
|
225
|
+
INTERNAL_SERVICE_CREDENTIALS?: string | undefined;
|
|
226
|
+
RABBITMQ_URL?: string | undefined;
|
|
227
|
+
REDIS_URL?: string | undefined;
|
|
228
|
+
REDIS_PASSWORD?: string | undefined;
|
|
229
|
+
CACHE_KEY_PREFIX?: string | undefined;
|
|
230
|
+
}, {
|
|
231
|
+
PORT: number;
|
|
232
|
+
SERVICE_NAME: string;
|
|
233
|
+
GATEWAY_SIGNING_SECRET: string;
|
|
234
|
+
DB_NAME: string;
|
|
235
|
+
NODE_ENV?: "development" | "test" | "staging" | "production" | undefined;
|
|
236
|
+
APP_NAME?: string | undefined;
|
|
237
|
+
LOG_LEVEL?: "error" | "warn" | "info" | "http" | "debug" | undefined;
|
|
238
|
+
CORS_ORIGINS?: string | undefined;
|
|
239
|
+
INTERNAL_SERVICE_NAME?: string | undefined;
|
|
240
|
+
INTERNAL_SERVICE_CREDENTIAL?: string | undefined;
|
|
241
|
+
INTERNAL_SERVICE_CREDENTIALS?: string | undefined;
|
|
242
|
+
DB_HOST?: string | undefined;
|
|
243
|
+
DB_PORT?: number | undefined;
|
|
244
|
+
DB_USER?: string | undefined;
|
|
245
|
+
DB_PASSWORD?: string | undefined;
|
|
246
|
+
DB_POOL_MAX?: number | undefined;
|
|
247
|
+
RABBITMQ_URL?: string | undefined;
|
|
248
|
+
RABBITMQ_HOST?: string | undefined;
|
|
249
|
+
RABBITMQ_PORT?: number | undefined;
|
|
250
|
+
RABBITMQ_USER?: string | undefined;
|
|
251
|
+
RABBITMQ_PASSWORD?: string | undefined;
|
|
252
|
+
RABBITMQ_VHOST?: string | undefined;
|
|
253
|
+
QUEUE_PREFIX?: string | undefined;
|
|
254
|
+
RABBITMQ_ENABLED?: "true" | "false" | undefined;
|
|
255
|
+
REDIS_URL?: string | undefined;
|
|
256
|
+
REDIS_HOST?: string | undefined;
|
|
257
|
+
REDIS_PORT?: number | undefined;
|
|
258
|
+
REDIS_PASSWORD?: string | undefined;
|
|
259
|
+
REDIS_DB?: number | undefined;
|
|
260
|
+
CACHE_KEY_PREFIX?: string | undefined;
|
|
261
|
+
}>;
|
|
262
|
+
/** Variables that have a development default but must be set explicitly in staging and production. */
|
|
263
|
+
export declare const DEPLOYED_REQUIRED_ENV: readonly string[];
|
|
264
|
+
/**
|
|
265
|
+
* True for NODE_ENV values that must name their environments explicitly (staging, production).
|
|
266
|
+
*
|
|
267
|
+
* @param nodeEnv NODE_ENV value (default `process.env.NODE_ENV`).
|
|
268
|
+
* @returns Whether it is a deployed environment.
|
|
269
|
+
* @example isDeployedNodeEnv('production') // true
|
|
270
|
+
*/
|
|
271
|
+
export declare function isDeployedNodeEnv(nodeEnv?: string | undefined): boolean;
|
|
272
|
+
/** One problem with one variable. Holds the variable name and kind of problem only, never its value. */
|
|
273
|
+
export interface EnvProblem {
|
|
274
|
+
name: string;
|
|
275
|
+
problem: 'missing' | 'invalid';
|
|
276
|
+
}
|
|
277
|
+
type EnvSource = Record<string, string | undefined>;
|
|
278
|
+
/**
|
|
279
|
+
* Formats problems as `NAME: missing|invalid` lines (names only — values are never printed, because
|
|
280
|
+
* Zod's own messages can echo them).
|
|
281
|
+
*
|
|
282
|
+
* @param problems Problems from validation.
|
|
283
|
+
* @returns A multi-line message.
|
|
284
|
+
* @example formatEnvProblems([{ name: 'DB_NAME', problem: 'missing' }]) // 'Invalid environment configuration:\n DB_NAME: missing'
|
|
285
|
+
*/
|
|
286
|
+
export declare function formatEnvProblems(problems: EnvProblem[]): string;
|
|
287
|
+
/** Options for {@link parseEnv}. */
|
|
288
|
+
export interface ParseEnvOptions {
|
|
289
|
+
/** Read `./.env` first when `source` is `process.env` (default true). */
|
|
111
290
|
dotenv?: boolean;
|
|
112
|
-
})
|
|
113
|
-
|
|
291
|
+
/** Names that must be set when NODE_ENV is staging or production (default {@link DEPLOYED_REQUIRED_ENV}). */
|
|
292
|
+
deployedRequired?: readonly string[];
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Validates `source` against `schema` without merging the base or exiting. Use for partial configs
|
|
296
|
+
* (scripts, tests) and wherever the caller handles the error.
|
|
297
|
+
*
|
|
298
|
+
* @param schema Any Zod schema over the env object.
|
|
299
|
+
* @param source Values to validate (default process.env).
|
|
300
|
+
* @param options Dotenv and deployed-environment checks.
|
|
301
|
+
* @returns The parsed, typed config.
|
|
302
|
+
* @throws ConfigError listing every missing or invalid variable by name (never its value).
|
|
303
|
+
* @example const env = parseEnv(databaseEnv, { DB_NAME: 'app_test' });
|
|
304
|
+
*/
|
|
305
|
+
export declare function parseEnv<S extends z.ZodTypeAny>(schema: S, source?: EnvSource, options?: ParseEnvOptions): z.infer<S>;
|
|
306
|
+
/** Options for {@link loadEnv}: parse options plus source, base and injectable output/exit. */
|
|
307
|
+
export interface LoadEnvOptions extends ParseEnvOptions {
|
|
308
|
+
/** Values to validate (default process.env). */
|
|
309
|
+
source?: EnvSource;
|
|
310
|
+
/** Base schema merged under the service schema (default {@link baseEnv}). */
|
|
311
|
+
base?: z.AnyZodObject;
|
|
312
|
+
/** Where the problem list is written (default stderr). */
|
|
313
|
+
write?: (text: string) => void;
|
|
314
|
+
/** Called with exit code 1 on failure (default `process.exit`). */
|
|
315
|
+
exit?: (code: number) => never;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Service startup config: merges the base env schema with the service's own, validates, and on
|
|
319
|
+
* failure prints the missing/invalid variable **names** (never values) and exits non-zero.
|
|
320
|
+
*
|
|
321
|
+
* @param schema The service's own variables (default none).
|
|
322
|
+
* @param options Source, base override and injectable write/exit for tests.
|
|
323
|
+
* @returns The parsed, typed config (base + service variables).
|
|
324
|
+
* @example
|
|
325
|
+
* export const config = loadEnv(z.object({ UPSTREAM_INTERNAL_URL: z.string().url() }));
|
|
326
|
+
*/
|
|
327
|
+
export declare function loadEnv<S extends z.AnyZodObject = z.ZodObject<Record<string, never>>, B extends z.AnyZodObject = typeof baseEnv>(schema?: S, options?: LoadEnvOptions & {
|
|
328
|
+
base?: B;
|
|
329
|
+
}): z.infer<B> & z.infer<S>;
|
|
330
|
+
/**
|
|
331
|
+
* Comma-separated env value → trimmed, non-empty list.
|
|
332
|
+
*
|
|
333
|
+
* @param value Raw env value.
|
|
334
|
+
* @returns The list (empty when unset).
|
|
335
|
+
* @example listFromEnv(' a, b ,,c') // ['a', 'b', 'c']
|
|
336
|
+
*/
|
|
114
337
|
export declare const listFromEnv: (value: string | undefined) => string[];
|
|
338
|
+
export {};
|
|
115
339
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request values that follow the request through every `await`, timer and callback, so loggers,
|
|
3
|
+
* error handlers and outbound clients can read them without threading `req` through every call.
|
|
4
|
+
* `scopes` is a generic map of the scope ids the caller acts within (for example `{ tenant: '01J…' }`);
|
|
5
|
+
* the app decides the key names.
|
|
6
|
+
*/
|
|
7
|
+
export interface RequestContext {
|
|
8
|
+
correlationId: string;
|
|
9
|
+
service?: string;
|
|
10
|
+
userId?: string;
|
|
11
|
+
scopes?: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Runs `fn` (and all async work it starts) inside `context`. Use it at every entry point that is not an
|
|
15
|
+
* HTTP request: queue consumers, jobs and scripts.
|
|
16
|
+
*
|
|
17
|
+
* @param context Values for the duration of `fn`; the object is copied, so later edits don't leak back.
|
|
18
|
+
* @param fn Work to run inside the context.
|
|
19
|
+
* @returns Whatever `fn` returns.
|
|
20
|
+
* @example await runWithContext({ correlationId: msg.correlationId, service: 'worker' }, () => handle(msg));
|
|
21
|
+
*/
|
|
22
|
+
export declare function runWithContext<T>(context: RequestContext, fn: () => T): T;
|
|
23
|
+
/**
|
|
24
|
+
* The current request context.
|
|
25
|
+
*
|
|
26
|
+
* @returns The context, or undefined outside {@link runWithContext} / `correlationMiddleware`.
|
|
27
|
+
* @example const id = getRequestContext()?.correlationId;
|
|
28
|
+
*/
|
|
29
|
+
export declare function getRequestContext(): Readonly<RequestContext> | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Adds values to the current context, for example the user id and scopes once auth has run. A no-op
|
|
32
|
+
* outside a context. The correlation id can't be changed once set.
|
|
33
|
+
*
|
|
34
|
+
* @param patch Values to add or replace; `scopes` are merged key by key.
|
|
35
|
+
* @returns True when a context was active and updated.
|
|
36
|
+
* @example updateRequestContext({ userId: user.id, scopes: user.scopes });
|
|
37
|
+
*/
|
|
38
|
+
export declare function updateRequestContext(patch: Partial<Omit<RequestContext, 'correlationId'>>): boolean;
|
|
39
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/context/index.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAID;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEzE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,QAAQ,CAAC,cAAc,CAAC,GAAG,SAAS,CAExE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,GAAG,OAAO,CAOnG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
|