@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
package/dist/cjs/common/phone.js
CHANGED
|
@@ -8,35 +8,87 @@ exports.toMsisdn = toMsisdn;
|
|
|
8
8
|
exports.phoneRegion = phoneRegion;
|
|
9
9
|
exports.maskPhone = maskPhone;
|
|
10
10
|
const google_libphonenumber_1 = __importDefault(require("google-libphonenumber"));
|
|
11
|
+
const errors_js_1 = require("./errors.js");
|
|
11
12
|
const util = google_libphonenumber_1.default.PhoneNumberUtil.getInstance();
|
|
12
13
|
const { PhoneNumberFormat } = google_libphonenumber_1.default;
|
|
13
14
|
/**
|
|
14
|
-
* Normalises a phone number to E.164
|
|
15
|
-
*
|
|
15
|
+
* Normalises a phone number to E.164. The region is required (no app default): local formats such as
|
|
16
|
+
* `0712345678` only make sense against a country, and that country is app configuration.
|
|
17
|
+
*
|
|
18
|
+
* @param phone Number as typed (local or international format).
|
|
19
|
+
* @param region ISO 3166-1 alpha-2 region used for local formats (e.g. `GB`, `US`).
|
|
20
|
+
* @returns E.164 (`+447400123456`), or null when not a valid number for that region.
|
|
21
|
+
* @example toE164('07400 123456', 'GB') // '+447400123456'
|
|
16
22
|
*/
|
|
17
|
-
function toE164(phone,
|
|
23
|
+
function toE164(phone, region) {
|
|
18
24
|
try {
|
|
19
|
-
const parsed = util.parseAndKeepRawInput(phone.trim(),
|
|
25
|
+
const parsed = util.parseAndKeepRawInput(phone.trim(), region);
|
|
20
26
|
return util.isValidNumber(parsed) ? util.format(parsed, PhoneNumberFormat.E164) : null;
|
|
21
27
|
}
|
|
22
28
|
catch {
|
|
23
29
|
return null;
|
|
24
30
|
}
|
|
25
31
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
const MOBILE_TYPES = new Set([google_libphonenumber_1.default.PhoneNumberType.MOBILE, google_libphonenumber_1.default.PhoneNumberType.FIXED_LINE_OR_MOBILE]);
|
|
33
|
+
/**
|
|
34
|
+
* E.164 without the plus sign (an MSISDN), as SMS gateways and mobile-money rails expect. Throws instead of
|
|
35
|
+
* returning null so a bad number can never be stored or sent by mistake; use {@link toE164} to test input.
|
|
36
|
+
*
|
|
37
|
+
* @param phone Number as typed (local or international format).
|
|
38
|
+
* @param region ISO 3166-1 alpha-2 region used for local formats (required; no app default).
|
|
39
|
+
* @param options Mobile-only and same-region checks.
|
|
40
|
+
* @returns Digits only, country code first.
|
|
41
|
+
* @throws BadRequestError (`INVALID_PHONE`) when the number is invalid or fails an option.
|
|
42
|
+
* @example toMsisdn('07400 123456', 'GB') // '447400123456'
|
|
43
|
+
*/
|
|
44
|
+
function toMsisdn(phone, region, options = {}) {
|
|
45
|
+
const invalid = () => new errors_js_1.BadRequestError('Enter a valid phone number', { code: 'INVALID_PHONE' });
|
|
46
|
+
if (typeof phone !== 'string' || !region)
|
|
47
|
+
throw invalid();
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = util.parseAndKeepRawInput(phone.trim(), region);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
throw invalid();
|
|
54
|
+
}
|
|
55
|
+
if (!util.isValidNumber(parsed))
|
|
56
|
+
throw invalid();
|
|
57
|
+
if (options.regionOnly && util.getRegionCodeForNumber(parsed) !== region.toUpperCase())
|
|
58
|
+
throw invalid();
|
|
59
|
+
if (options.mobileOnly && !MOBILE_TYPES.has(util.getNumberType(parsed)))
|
|
60
|
+
throw invalid();
|
|
61
|
+
return util.format(parsed, PhoneNumberFormat.E164).slice(1);
|
|
30
62
|
}
|
|
31
|
-
|
|
63
|
+
/**
|
|
64
|
+
* The region a number belongs to.
|
|
65
|
+
*
|
|
66
|
+
* @param phone Number as typed.
|
|
67
|
+
* @param region ISO region used to interpret local formats.
|
|
68
|
+
* @returns ISO region code, or null when it cannot be determined.
|
|
69
|
+
* @example phoneRegion('+447400123456', 'US') // 'GB'
|
|
70
|
+
*/
|
|
71
|
+
function phoneRegion(phone, region) {
|
|
32
72
|
try {
|
|
33
|
-
return util.getRegionCodeForNumber(util.parse(phone,
|
|
73
|
+
return util.getRegionCodeForNumber(util.parse(phone, region)) ?? null;
|
|
34
74
|
}
|
|
35
75
|
catch {
|
|
36
76
|
return null;
|
|
37
77
|
}
|
|
38
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Masks a phone number for logs, audit metadata and UI: every digit except the last 4 becomes `*`, so a
|
|
81
|
+
* full number never lands in a log line or on a screen. Fewer than 5 digits are fully masked
|
|
82
|
+
* (the same rule the logger applies to phone-like values).
|
|
83
|
+
*
|
|
84
|
+
* @param phone Any phone string (normalised or not).
|
|
85
|
+
* @returns The masked digits.
|
|
86
|
+
* @example maskPhone('+44 7400 123456') // '********3456'
|
|
87
|
+
*/
|
|
39
88
|
function maskPhone(phone) {
|
|
40
|
-
|
|
89
|
+
const digits = String(phone ?? '').replace(/\D/g, '');
|
|
90
|
+
if (digits.length < 5)
|
|
91
|
+
return '*'.repeat(digits.length || 4);
|
|
92
|
+
return `${'*'.repeat(digits.length - 4)}${digits.slice(-4)}`;
|
|
41
93
|
}
|
|
42
94
|
//# sourceMappingURL=phone.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phone.js","sourceRoot":"","sources":["../../../src/common/phone.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"phone.js","sourceRoot":"","sources":["../../../src/common/phone.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,26 +2,85 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.successResponse = successResponse;
|
|
4
4
|
exports.errorResponse = errorResponse;
|
|
5
|
+
exports.errorBody = errorBody;
|
|
5
6
|
exports.buildPaginationMeta = buildPaginationMeta;
|
|
6
7
|
exports.paginatedResponse = paginatedResponse;
|
|
7
8
|
exports.buildPaginatedResult = buildPaginatedResult;
|
|
8
9
|
exports.pageOffset = pageOffset;
|
|
9
|
-
|
|
10
|
+
exports.buildCursorPageMeta = buildCursorPageMeta;
|
|
11
|
+
exports.cursorPaginatedResponse = cursorPaginatedResponse;
|
|
12
|
+
/**
|
|
13
|
+
* Standard success envelope: `{ success, message, data }`.
|
|
14
|
+
*
|
|
15
|
+
* @param data Payload placed under `data`.
|
|
16
|
+
* @param message Human-readable message (default `Success`).
|
|
17
|
+
* @returns The envelope, ready for `res.json`.
|
|
18
|
+
* @example res.json(successResponse(order, 'Order placed'));
|
|
19
|
+
*/
|
|
10
20
|
function successResponse(data, message = 'Success') {
|
|
11
21
|
return { success: true, message, data };
|
|
12
22
|
}
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Standard error envelope: `{ success: false, message, code?, errors?, requestId? }`.
|
|
25
|
+
* Prefer throwing an AppError and letting the error middleware answer; use this only where a
|
|
26
|
+
* middleware must answer directly. For a body with a guaranteed `code`, use {@link errorBody}.
|
|
27
|
+
*
|
|
28
|
+
* @param message Message for the caller (never an internal error message).
|
|
29
|
+
* @param errors Optional field errors.
|
|
30
|
+
* @param code Optional UPPER_SNAKE_CASE code.
|
|
31
|
+
* @param requestId Optional correlation id of the request.
|
|
32
|
+
* @returns An envelope with `success: false`.
|
|
33
|
+
*/
|
|
34
|
+
function errorResponse(message, errors, code, requestId) {
|
|
35
|
+
return { success: false, message, ...(code ? { code } : {}), ...(errors ? { errors } : {}), ...(requestId ? { requestId } : {}) };
|
|
16
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* The error body with a required `code`, as the error middleware sends it.
|
|
39
|
+
*
|
|
40
|
+
* @param code UPPER_SNAKE_CASE machine-readable code.
|
|
41
|
+
* @param message Message for the caller (generic for 5xx).
|
|
42
|
+
* @param options `errors` (field errors) and `requestId` (correlation id), both omitted when absent.
|
|
43
|
+
* @returns `{ success: false, code, message, errors?, requestId? }`.
|
|
44
|
+
*
|
|
45
|
+
* @example res.status(404).json(errorBody('NOT_FOUND', 'Resource not found', { requestId }));
|
|
46
|
+
*/
|
|
47
|
+
function errorBody(code, message, options = {}) {
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
code,
|
|
51
|
+
message,
|
|
52
|
+
...(options.errors ? { errors: options.errors } : {}),
|
|
53
|
+
...(options.requestId ? { requestId: options.requestId } : {}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Offset pagination meta. `totalPages` is at least 1 so an empty list still reads as "page 1 of 1".
|
|
58
|
+
*
|
|
59
|
+
* @param total Total matching rows.
|
|
60
|
+
* @param page 1-based page that was returned.
|
|
61
|
+
* @param limit Page size.
|
|
62
|
+
* @returns `{ page, limit, total, totalPages, hasNext, hasPrev }`.
|
|
63
|
+
* @example buildPaginationMeta(45, 2, 20) // { page: 2, totalPages: 3, hasNext: true, hasPrev: true, … }
|
|
64
|
+
*/
|
|
17
65
|
function buildPaginationMeta(total, page, limit) {
|
|
18
66
|
const totalPages = limit > 0 ? Math.max(1, Math.ceil(total / limit)) : 1;
|
|
19
67
|
return { page, limit, total, totalPages, hasNext: page < totalPages, hasPrev: page > 1 };
|
|
20
68
|
}
|
|
21
|
-
/**
|
|
69
|
+
/**
|
|
70
|
+
* Offset-paginated envelope: `{ success, message, data: T[], meta }`.
|
|
71
|
+
*
|
|
72
|
+
* @returns The envelope with meta from {@link buildPaginationMeta}.
|
|
73
|
+
* @example res.json(paginatedResponse(rows, total, page, limit));
|
|
74
|
+
*/
|
|
22
75
|
function paginatedResponse(data, total, page, limit, message = 'Success') {
|
|
23
76
|
return { success: true, message, data, meta: buildPaginationMeta(total, page, limit) };
|
|
24
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Offset page as a service returns it (data + meta, no envelope).
|
|
80
|
+
*
|
|
81
|
+
* @returns `{ data, meta }`.
|
|
82
|
+
* @example return buildPaginatedResult(rows, total, page, limit);
|
|
83
|
+
*/
|
|
25
84
|
function buildPaginatedResult(data, total, page, limit) {
|
|
26
85
|
return { data, meta: buildPaginationMeta(total, page, limit) };
|
|
27
86
|
}
|
|
@@ -29,4 +88,18 @@ function buildPaginatedResult(data, total, page, limit) {
|
|
|
29
88
|
function pageOffset(page, limit) {
|
|
30
89
|
return Math.max(0, (Math.max(1, page) - 1) * limit);
|
|
31
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Cursor pagination meta. `hasMore` is derived from `nextCursor`, so the two can never disagree.
|
|
93
|
+
*
|
|
94
|
+
* @param limit The page size that was applied.
|
|
95
|
+
* @param nextCursor Opaque cursor for the next page, or null on the last page.
|
|
96
|
+
* @example buildCursorPageMeta(20, rows.length > 20 ? encodeCursor(rows[19]) : null)
|
|
97
|
+
*/
|
|
98
|
+
function buildCursorPageMeta(limit, nextCursor) {
|
|
99
|
+
return { limit, nextCursor, hasMore: nextCursor !== null };
|
|
100
|
+
}
|
|
101
|
+
/** Cursor-paginated envelope: `{ success, message, data: T[], meta: { limit, nextCursor, hasMore } }`. */
|
|
102
|
+
function cursorPaginatedResponse(page, message = 'Success') {
|
|
103
|
+
return { success: true, message, data: page.data, meta: page.meta };
|
|
104
|
+
}
|
|
32
105
|
//# sourceMappingURL=response.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/common/response.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/common/response.ts"],"names":[],"mappings":";;AAUA,0CAEC;AAaD,sCAEC;AAYD,8BAQC;AAWD,kDAGC;AAQD,8CAEC;AAQD,oDAEC;AAGD,gCAEC;AASD,kDAEC;AAGD,0DAEC;AApGD;;;;;;;GAOG;AACH,SAAgB,eAAe,CAAI,IAAO,EAAE,OAAO,GAAG,SAAS;IAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,aAAa,CAAC,OAAe,EAAE,MAAiC,EAAE,IAAa,EAAE,SAAkB;IACjH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACpI,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,SAAS,CAAC,IAAY,EAAE,OAAe,EAAE,UAAqE,EAAE;IAC9H,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI;QACJ,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,mBAAmB,CAAC,KAAa,EAAE,IAAY,EAAE,KAAa;IAC5E,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,GAAG,UAAU,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;AAC3F,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAI,IAAS,EAAE,KAAa,EAAE,IAAY,EAAE,KAAa,EAAE,OAAO,GAAG,SAAS;IAC7G,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;AACzF,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAI,IAAS,EAAE,KAAa,EAAE,IAAY,EAAE,KAAa;IAC3F,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,oCAAoC;AACpC,SAAgB,UAAU,CAAC,IAAY,EAAE,KAAa;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,mBAAmB,CAAC,KAAa,EAAE,UAAyB;IAC1E,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,KAAK,IAAI,EAAE,CAAC;AAC7D,CAAC;AAED,0GAA0G;AAC1G,SAAgB,uBAAuB,CAAI,IAAmB,EAAE,OAAO,GAAG,SAAS;IACjF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACtE,CAAC"}
|
package/dist/cjs/common/time.js
CHANGED
|
@@ -9,7 +9,8 @@ exports.parseClockTime = parseClockTime;
|
|
|
9
9
|
exports.zonedWallTimeToInstant = zonedWallTimeToInstant;
|
|
10
10
|
exports.zonedDayBounds = zonedDayBounds;
|
|
11
11
|
exports.quietWindowEndAt = quietWindowEndAt;
|
|
12
|
-
|
|
12
|
+
exports.toUtcIso = toUtcIso;
|
|
13
|
+
/** True for IANA zones the runtime knows (`Europe/Berlin`), false for garbage. */
|
|
13
14
|
function isValidTimeZone(zone) {
|
|
14
15
|
try {
|
|
15
16
|
new Intl.DateTimeFormat('en-US', { timeZone: zone });
|
|
@@ -81,8 +82,19 @@ function zonedWallTimeToInstant(year, month, day, minutesOfDay, zone) {
|
|
|
81
82
|
const estimate = wall - timeZoneOffsetMinutes(zone, new Date(wall)) * MS_PER_MINUTE;
|
|
82
83
|
return new Date(wall - timeZoneOffsetMinutes(zone, new Date(estimate)) * MS_PER_MINUTE);
|
|
83
84
|
}
|
|
84
|
-
/**
|
|
85
|
+
/**
|
|
86
|
+
* The local calendar day containing `at` in `zone`, as a half-open `[start, end)` UTC range (23–25 h on
|
|
87
|
+
* DST days). Use it for "today" in reports, business days and daily limits.
|
|
88
|
+
*
|
|
89
|
+
* @param at Any instant in the day.
|
|
90
|
+
* @param zone IANA zone (required; no app default).
|
|
91
|
+
* @returns `{ start, end }` with `start` inclusive and `end` exclusive.
|
|
92
|
+
* @throws RangeError for an unknown zone.
|
|
93
|
+
* @example zonedDayBounds(new Date('2026-10-11T22:30:00Z'), 'Asia/Riyadh') // 2026-10-11T21:00Z → 2026-10-12T21:00Z
|
|
94
|
+
*/
|
|
85
95
|
function zonedDayBounds(at, zone) {
|
|
96
|
+
if (!isValidTimeZone(zone))
|
|
97
|
+
throw new RangeError(`Unknown time zone "${zone}"`);
|
|
86
98
|
const { year, month, day } = localDate(at, zone);
|
|
87
99
|
return { start: zonedWallTimeToInstant(year, month, day, 0, zone), end: zonedWallTimeToInstant(year, month, day + 1, 0, zone) };
|
|
88
100
|
}
|
|
@@ -106,4 +118,18 @@ function quietWindowEndAt(at, zone, start, end) {
|
|
|
106
118
|
const endsTomorrow = crossesMidnight && msOfDay >= startMs;
|
|
107
119
|
return zonedWallTimeToInstant(year, month, day + (endsTomorrow ? 1 : 0), endMin, zone);
|
|
108
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* The instant as a UTC ISO-8601 string (`2026-11-13T09:00:00.000Z`), the form every timestamp travels in.
|
|
123
|
+
*
|
|
124
|
+
* @param instant A Date, an epoch-milliseconds number or a string `Date` can parse.
|
|
125
|
+
* @returns The `toISOString()` form.
|
|
126
|
+
* @throws RangeError when the input is not a valid instant (never returns `"Invalid Date"`).
|
|
127
|
+
* @example toUtcIso('2026-11-13T12:00:00+03:00') // '2026-11-13T09:00:00.000Z'
|
|
128
|
+
*/
|
|
129
|
+
function toUtcIso(instant) {
|
|
130
|
+
const date = instant instanceof Date ? instant : new Date(instant);
|
|
131
|
+
if (Number.isNaN(date.getTime()))
|
|
132
|
+
throw new RangeError(`Not a valid instant: "${String(instant)}"`);
|
|
133
|
+
return date.toISOString();
|
|
134
|
+
}
|
|
109
135
|
//# sourceMappingURL=time.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/common/time.ts"],"names":[],"mappings":";;;AACA,0CAOC;AAGD,4CAWC;AAeD,kDAKC;AAGD,sDAOC;AAUD,wCAIC;AAcD,wDAIC;
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/common/time.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/config/index.js
CHANGED
|
@@ -1,30 +1,47 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.listFromEnv = exports.ConfigError = exports.redisEnv = exports.messagingEnv = exports.databaseEnv = exports.serviceEnv = void 0;
|
|
3
|
+
exports.listFromEnv = exports.DEPLOYED_REQUIRED_ENV = exports.baseEnv = exports.ConfigError = exports.redisEnv = exports.messagingEnv = exports.databaseEnv = exports.internalServiceEnv = exports.serviceEnv = void 0;
|
|
4
4
|
exports.amqpUrlFromEnv = amqpUrlFromEnv;
|
|
5
5
|
exports.loadDotEnv = loadDotEnv;
|
|
6
|
+
exports.isDeployedNodeEnv = isDeployedNodeEnv;
|
|
7
|
+
exports.formatEnvProblems = formatEnvProblems;
|
|
8
|
+
exports.parseEnv = parseEnv;
|
|
6
9
|
exports.loadEnv = loadEnv;
|
|
7
10
|
const node_fs_1 = require("node:fs");
|
|
8
11
|
const node_path_1 = require("node:path");
|
|
9
12
|
const zod_1 = require("zod");
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
const internal_constants_js_1 = require("../common/internal-constants.js");
|
|
14
|
+
/*
|
|
15
|
+
* Environment building blocks. `loadEnv(schema)` merges a service's schema onto `baseEnv`;
|
|
16
|
+
* `parseEnv(schema)` validates any composition of the blocks without the base:
|
|
12
17
|
*
|
|
13
|
-
* const
|
|
18
|
+
* const config = loadEnv(z.object({ MY_VAR: z.string() }));
|
|
14
19
|
*/
|
|
20
|
+
/** Service identity, logging, CORS and the gateway signing secret. */
|
|
15
21
|
exports.serviceEnv = zod_1.z.object({
|
|
16
22
|
NODE_ENV: zod_1.z.enum(['development', 'test', 'staging', 'production']).default('development'),
|
|
17
23
|
PORT: zod_1.z.coerce.number().int().positive(),
|
|
18
24
|
SERVICE_NAME: zod_1.z.string().min(1),
|
|
19
|
-
/** Short app identifier used in exchange names and key prefixes (e.g. `
|
|
25
|
+
/** Short app identifier used in exchange names and key prefixes (e.g. `myapp`). */
|
|
20
26
|
APP_NAME: zod_1.z.string().min(1).default('app'),
|
|
21
27
|
LOG_LEVEL: zod_1.z.enum(['error', 'warn', 'info', 'http', 'debug']).optional(),
|
|
22
28
|
CORS_ORIGINS: zod_1.z.string().default(''),
|
|
23
|
-
/** Verifies gateway-signed identity headers. */
|
|
24
|
-
|
|
25
|
-
/** Authenticates service-to-service `/internal/*` calls. */
|
|
26
|
-
INTERNAL_SERVICE_SECRET: zod_1.z.string().min(16),
|
|
29
|
+
/** Verifies gateway-signed identity headers (v2); at least 32 characters, same value on the gateway and every service. */
|
|
30
|
+
GATEWAY_SIGNING_SECRET: zod_1.z.string().min(32),
|
|
27
31
|
});
|
|
32
|
+
/**
|
|
33
|
+
* Service-to-service credentials. Optional here because development may run without them;
|
|
34
|
+
* `assertInternalServiceAuthConfigured` enforces them in staging and production.
|
|
35
|
+
*/
|
|
36
|
+
exports.internalServiceEnv = zod_1.z.object({
|
|
37
|
+
/** This service's own name (its compose service name), sent with every internal call. */
|
|
38
|
+
INTERNAL_SERVICE_NAME: zod_1.z.string().regex(internal_constants_js_1.SERVICE_NAME_PATTERN).optional(),
|
|
39
|
+
/** This service's own secret (at least 32 characters), sent with every internal call. */
|
|
40
|
+
INTERNAL_SERVICE_CREDENTIAL: zod_1.z.string().min(internal_constants_js_1.MIN_INTERNAL_CREDENTIAL_LENGTH).optional(),
|
|
41
|
+
/** JSON map of caller name → secret this service accepts from that caller. */
|
|
42
|
+
INTERNAL_SERVICE_CREDENTIALS: zod_1.z.string().optional(),
|
|
43
|
+
});
|
|
44
|
+
/** Database connection env vars (MySQL defaults). */
|
|
28
45
|
exports.databaseEnv = zod_1.z.object({
|
|
29
46
|
DB_HOST: zod_1.z.string().default('127.0.0.1'),
|
|
30
47
|
DB_PORT: zod_1.z.coerce.number().int().positive().default(3306),
|
|
@@ -33,6 +50,7 @@ exports.databaseEnv = zod_1.z.object({
|
|
|
33
50
|
DB_NAME: zod_1.z.string().min(1),
|
|
34
51
|
DB_POOL_MAX: zod_1.z.coerce.number().int().positive().default(10),
|
|
35
52
|
});
|
|
53
|
+
/** RabbitMQ connection and queue-prefix env vars. */
|
|
36
54
|
exports.messagingEnv = zod_1.z.object({
|
|
37
55
|
RABBITMQ_URL: zod_1.z.string().optional(),
|
|
38
56
|
RABBITMQ_HOST: zod_1.z.string().default('127.0.0.1'),
|
|
@@ -44,20 +62,39 @@ exports.messagingEnv = zod_1.z.object({
|
|
|
44
62
|
QUEUE_PREFIX: zod_1.z.string().default('dev'),
|
|
45
63
|
RABBITMQ_ENABLED: zod_1.z.enum(['true', 'false']).default('true').transform((v) => v === 'true'),
|
|
46
64
|
});
|
|
65
|
+
/** Redis connection env vars. Keys are prefixed by the keyspace (`createRedisKeyspace`), never by the client. */
|
|
47
66
|
exports.redisEnv = zod_1.z.object({
|
|
67
|
+
/** Full connection URL; overrides host/port/password when set. */
|
|
48
68
|
REDIS_URL: zod_1.z.string().optional(),
|
|
69
|
+
REDIS_HOST: zod_1.z.string().default('127.0.0.1'),
|
|
70
|
+
REDIS_PORT: zod_1.z.coerce.number().int().positive().default(6379),
|
|
71
|
+
REDIS_PASSWORD: zod_1.z.string().optional(),
|
|
49
72
|
REDIS_DB: zod_1.z.coerce.number().int().min(0).default(0),
|
|
50
|
-
/**
|
|
51
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Environment segment of every Redis key (`{app}:{env}:{service}:…`), e.g. `dev`, `staging`, `prod`.
|
|
75
|
+
* Required in staging and production; never share one between environments.
|
|
76
|
+
*/
|
|
77
|
+
CACHE_KEY_PREFIX: zod_1.z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).optional(),
|
|
52
78
|
});
|
|
53
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* Builds an AMQP URL from discrete env vars (or returns RABBITMQ_URL when set). User, password and vhost are URL-encoded.
|
|
81
|
+
*
|
|
82
|
+
* @param env Parsed {@link messagingEnv} values.
|
|
83
|
+
* @returns An `amqp://` URL.
|
|
84
|
+
* @example const url = amqpUrlFromEnv(parseEnv(messagingEnv));
|
|
85
|
+
*/
|
|
54
86
|
function amqpUrlFromEnv(env) {
|
|
55
87
|
if (env.RABBITMQ_URL)
|
|
56
88
|
return env.RABBITMQ_URL;
|
|
57
89
|
const vhost = env.RABBITMQ_VHOST === '/' ? '%2F' : encodeURIComponent(env.RABBITMQ_VHOST.replace(/^\//, ''));
|
|
58
90
|
return `amqp://${encodeURIComponent(env.RABBITMQ_USER)}:${encodeURIComponent(env.RABBITMQ_PASSWORD)}@${env.RABBITMQ_HOST}:${env.RABBITMQ_PORT}/${vhost}`;
|
|
59
91
|
}
|
|
60
|
-
/**
|
|
92
|
+
/**
|
|
93
|
+
* Reads `KEY=value` lines from a dotenv file into process.env without overriding set values. Missing file is a no-op.
|
|
94
|
+
*
|
|
95
|
+
* @param path Dotenv file (default `./.env`).
|
|
96
|
+
* @example loadDotEnv(resolve(__dirname, '../.env.test'));
|
|
97
|
+
*/
|
|
61
98
|
function loadDotEnv(path = (0, node_path_1.resolve)(process.cwd(), '.env')) {
|
|
62
99
|
if (!(0, node_fs_1.existsSync)(path))
|
|
63
100
|
return;
|
|
@@ -76,21 +113,104 @@ function loadDotEnv(path = (0, node_path_1.resolve)(process.cwd(), '.env')) {
|
|
|
76
113
|
process.env[key] = value;
|
|
77
114
|
}
|
|
78
115
|
}
|
|
116
|
+
/** Thrown by the env loader when required variables are missing or invalid; lists every problem. */
|
|
79
117
|
class ConfigError extends Error {
|
|
80
118
|
}
|
|
81
119
|
exports.ConfigError = ConfigError;
|
|
82
|
-
/**
|
|
83
|
-
|
|
120
|
+
/**
|
|
121
|
+
* The base environment every service validates: service identity, gateway secret, database, Redis,
|
|
122
|
+
* RabbitMQ and internal-service credentials. `loadEnv` merges a service's own schema onto it.
|
|
123
|
+
*/
|
|
124
|
+
exports.baseEnv = exports.serviceEnv.merge(exports.databaseEnv).merge(exports.redisEnv).merge(exports.messagingEnv).merge(exports.internalServiceEnv);
|
|
125
|
+
/** Variables that have a development default but must be set explicitly in staging and production. */
|
|
126
|
+
exports.DEPLOYED_REQUIRED_ENV = Object.freeze(['CACHE_KEY_PREFIX', 'QUEUE_PREFIX']);
|
|
127
|
+
const DEPLOYED_NODE_ENVS = new Set(['staging', 'production']);
|
|
128
|
+
/**
|
|
129
|
+
* True for NODE_ENV values that must name their environments explicitly (staging, production).
|
|
130
|
+
*
|
|
131
|
+
* @param nodeEnv NODE_ENV value (default `process.env.NODE_ENV`).
|
|
132
|
+
* @returns Whether it is a deployed environment.
|
|
133
|
+
* @example isDeployedNodeEnv('production') // true
|
|
134
|
+
*/
|
|
135
|
+
function isDeployedNodeEnv(nodeEnv = process.env.NODE_ENV) {
|
|
136
|
+
return DEPLOYED_NODE_ENVS.has((nodeEnv ?? '').trim());
|
|
137
|
+
}
|
|
138
|
+
function collectProblems(issues, source) {
|
|
139
|
+
const byName = new Map();
|
|
140
|
+
for (const issue of issues) {
|
|
141
|
+
const name = String(issue.path[0] ?? '(root)');
|
|
142
|
+
const raw = source[name];
|
|
143
|
+
byName.set(name, { name, problem: raw === undefined || raw === '' ? 'missing' : 'invalid' });
|
|
144
|
+
}
|
|
145
|
+
return [...byName.values()];
|
|
146
|
+
}
|
|
147
|
+
function deployedProblems(source, required) {
|
|
148
|
+
if (!isDeployedNodeEnv(source.NODE_ENV))
|
|
149
|
+
return [];
|
|
150
|
+
return required.filter((name) => !source[name]?.trim()).map((name) => ({ name, problem: 'missing' }));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Formats problems as `NAME: missing|invalid` lines (names only — values are never printed, because
|
|
154
|
+
* Zod's own messages can echo them).
|
|
155
|
+
*
|
|
156
|
+
* @param problems Problems from validation.
|
|
157
|
+
* @returns A multi-line message.
|
|
158
|
+
* @example formatEnvProblems([{ name: 'DB_NAME', problem: 'missing' }]) // 'Invalid environment configuration:\n DB_NAME: missing'
|
|
159
|
+
*/
|
|
160
|
+
function formatEnvProblems(problems) {
|
|
161
|
+
return `Invalid environment configuration:\n${problems.map((p) => ` ${p.name}: ${p.problem}`).join('\n')}`;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Validates `source` against `schema` without merging the base or exiting. Use for partial configs
|
|
165
|
+
* (scripts, tests) and wherever the caller handles the error.
|
|
166
|
+
*
|
|
167
|
+
* @param schema Any Zod schema over the env object.
|
|
168
|
+
* @param source Values to validate (default process.env).
|
|
169
|
+
* @param options Dotenv and deployed-environment checks.
|
|
170
|
+
* @returns The parsed, typed config.
|
|
171
|
+
* @throws ConfigError listing every missing or invalid variable by name (never its value).
|
|
172
|
+
* @example const env = parseEnv(databaseEnv, { DB_NAME: 'app_test' });
|
|
173
|
+
*/
|
|
174
|
+
function parseEnv(schema, source = process.env, options = {}) {
|
|
84
175
|
if (options.dotenv !== false && source === process.env)
|
|
85
176
|
loadDotEnv();
|
|
86
177
|
const result = schema.safeParse(source);
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
178
|
+
const problems = [...(result.success ? [] : collectProblems(result.error.issues, source)), ...deployedProblems(source, options.deployedRequired ?? exports.DEPLOYED_REQUIRED_ENV)];
|
|
179
|
+
const unique = [...new Map(problems.map((p) => [p.name, p])).values()];
|
|
180
|
+
if (unique.length || !result.success)
|
|
181
|
+
throw new ConfigError(formatEnvProblems(unique));
|
|
91
182
|
return result.data;
|
|
92
183
|
}
|
|
93
|
-
/**
|
|
184
|
+
/**
|
|
185
|
+
* Service startup config: merges the base env schema with the service's own, validates, and on
|
|
186
|
+
* failure prints the missing/invalid variable **names** (never values) and exits non-zero.
|
|
187
|
+
*
|
|
188
|
+
* @param schema The service's own variables (default none).
|
|
189
|
+
* @param options Source, base override and injectable write/exit for tests.
|
|
190
|
+
* @returns The parsed, typed config (base + service variables).
|
|
191
|
+
* @example
|
|
192
|
+
* export const config = loadEnv(z.object({ UPSTREAM_INTERNAL_URL: z.string().url() }));
|
|
193
|
+
*/
|
|
194
|
+
function loadEnv(schema, options = {}) {
|
|
195
|
+
const base = (options.base ?? exports.baseEnv);
|
|
196
|
+
const merged = schema ? base.merge(schema) : base;
|
|
197
|
+
try {
|
|
198
|
+
return parseEnv(merged, options.source ?? process.env, options);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
if (!(error instanceof ConfigError))
|
|
202
|
+
throw error;
|
|
203
|
+
(options.write ?? ((text) => process.stderr.write(text)))(`${error.message}\n`);
|
|
204
|
+
return (options.exit ?? ((code) => process.exit(code)))(1);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Comma-separated env value → trimmed, non-empty list.
|
|
209
|
+
*
|
|
210
|
+
* @param value Raw env value.
|
|
211
|
+
* @returns The list (empty when unset).
|
|
212
|
+
* @example listFromEnv(' a, b ,,c') // ['a', 'b', 'c']
|
|
213
|
+
*/
|
|
94
214
|
const listFromEnv = (value) => (value ?? '').split(',').map((s) => s.trim()).filter(Boolean);
|
|
95
215
|
exports.listFromEnv = listFromEnv;
|
|
96
216
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runWithContext = runWithContext;
|
|
4
|
+
exports.getRequestContext = getRequestContext;
|
|
5
|
+
exports.updateRequestContext = updateRequestContext;
|
|
6
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
7
|
+
const storage = new node_async_hooks_1.AsyncLocalStorage();
|
|
8
|
+
/**
|
|
9
|
+
* Runs `fn` (and all async work it starts) inside `context`. Use it at every entry point that is not an
|
|
10
|
+
* HTTP request: queue consumers, jobs and scripts.
|
|
11
|
+
*
|
|
12
|
+
* @param context Values for the duration of `fn`; the object is copied, so later edits don't leak back.
|
|
13
|
+
* @param fn Work to run inside the context.
|
|
14
|
+
* @returns Whatever `fn` returns.
|
|
15
|
+
* @example await runWithContext({ correlationId: msg.correlationId, service: 'worker' }, () => handle(msg));
|
|
16
|
+
*/
|
|
17
|
+
function runWithContext(context, fn) {
|
|
18
|
+
return storage.run({ ...context, scopes: context.scopes ? { ...context.scopes } : undefined }, fn);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The current request context.
|
|
22
|
+
*
|
|
23
|
+
* @returns The context, or undefined outside {@link runWithContext} / `correlationMiddleware`.
|
|
24
|
+
* @example const id = getRequestContext()?.correlationId;
|
|
25
|
+
*/
|
|
26
|
+
function getRequestContext() {
|
|
27
|
+
return storage.getStore();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Adds values to the current context, for example the user id and scopes once auth has run. A no-op
|
|
31
|
+
* outside a context. The correlation id can't be changed once set.
|
|
32
|
+
*
|
|
33
|
+
* @param patch Values to add or replace; `scopes` are merged key by key.
|
|
34
|
+
* @returns True when a context was active and updated.
|
|
35
|
+
* @example updateRequestContext({ userId: user.id, scopes: user.scopes });
|
|
36
|
+
*/
|
|
37
|
+
function updateRequestContext(patch) {
|
|
38
|
+
const current = storage.getStore();
|
|
39
|
+
if (!current)
|
|
40
|
+
return false;
|
|
41
|
+
if (patch.service !== undefined)
|
|
42
|
+
current.service = patch.service;
|
|
43
|
+
if (patch.userId !== undefined)
|
|
44
|
+
current.userId = patch.userId;
|
|
45
|
+
if (patch.scopes)
|
|
46
|
+
current.scopes = { ...current.scopes, ...patch.scopes };
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/index.ts"],"names":[],"mappings":";;AA0BA,wCAEC;AAQD,8CAEC;AAUD,oDAOC;AAvDD,uDAAqD;AAerD,MAAM,OAAO,GAAG,IAAI,oCAAiB,EAAkB,CAAC;AAExD;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAAI,OAAuB,EAAE,EAAW;IACpE,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;AACrG,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB;IAC/B,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,oBAAoB,CAAC,KAAqD;IACxF,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -14,7 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./editorial-draft.js"), exports);
|
|
18
17
|
__exportStar(require("./notification-dispatch.js"), exports);
|
|
19
|
-
__exportStar(require("./upload-import.js"), exports);
|
|
20
18
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/contracts/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/contracts/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C"}
|