@heavybit/shared-lib 2.1.0 → 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 +163 -2
- 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/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 +41 -22
- package/dist/cjs/common/phone.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 +139 -19
- package/dist/cjs/config/index.js.map +1 -1
- package/dist/cjs/contracts/notification-dispatch.js +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 +64 -50
- package/dist/cjs/express/auth.js.map +1 -1
- package/dist/cjs/express/index.js +2 -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/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 +6 -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/redact.js +6 -11
- package/dist/cjs/logging/redact.js.map +1 -1
- 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 +2 -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 +4 -4
- package/dist/cjs/messaging/staff-notifier.js.map +1 -1
- 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/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/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 +41 -22
- package/dist/esm/common/phone.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 +135 -18
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/contracts/notification-dispatch.js +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 +62 -48
- package/dist/esm/express/auth.js.map +1 -1
- package/dist/esm/express/index.js +2 -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/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 +6 -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/redact.js +3 -7
- package/dist/esm/logging/redact.js.map +1 -1
- 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 +2 -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 +4 -4
- package/dist/esm/messaging/staff-notifier.js.map +1 -1
- 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/types/access/index.d.ts +9 -3
- package/dist/types/access/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/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 +25 -15
- package/dist/types/common/phone.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 +251 -27
- package/dist/types/config/index.d.ts.map +1 -1
- package/dist/types/contracts/notification-dispatch.d.ts +13 -13
- 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 +40 -24
- package/dist/types/express/auth.d.ts.map +1 -1
- package/dist/types/express/index.d.ts +2 -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/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 +6 -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/redact.d.ts +2 -2
- package/dist/types/logging/redact.d.ts.map +1 -1
- 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 +7 -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 +9 -9
- package/dist/types/messaging/staff-notifier.d.ts.map +1 -1
- package/dist/types/messaging/staff-recipients.d.ts +1 -1
- 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 +26 -14
- package/dist/types/types/index.d.ts.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/** Header carrying the calling service's name. */
|
|
2
|
+
export declare const INTERNAL_SERVICE_NAME_HEADER: "x-internal-service-name";
|
|
3
|
+
/** Header carrying the calling service's own secret. */
|
|
4
|
+
export declare const INTERNAL_SERVICE_SECRET_HEADER: "x-internal-service-secret";
|
|
5
|
+
export { MIN_INTERNAL_CREDENTIAL_LENGTH, SERVICE_NAME_PATTERN } from './internal-constants.js';
|
|
6
|
+
/** The credential a service sends when it calls another service. */
|
|
7
|
+
export interface InternalCallerCredential {
|
|
8
|
+
/** This service's own name (`INTERNAL_SERVICE_NAME`). */
|
|
9
|
+
name: string;
|
|
10
|
+
/** This service's own secret (`INTERNAL_SERVICE_CREDENTIAL`). */
|
|
11
|
+
secret: string;
|
|
12
|
+
}
|
|
13
|
+
/** Internal-auth settings read from the environment. */
|
|
14
|
+
export interface InternalServiceAuthConfig {
|
|
15
|
+
/** Own name, or `''` when unset. */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Own secret, or `''` when unset. */
|
|
18
|
+
credential: string;
|
|
19
|
+
/** Caller name → secret accepted from it (empty when unset). */
|
|
20
|
+
credentials: Readonly<Record<string, string>>;
|
|
21
|
+
}
|
|
22
|
+
/** process.env or a parsed config object; only string values are read. */
|
|
23
|
+
type Env = Readonly<Record<string, unknown>>;
|
|
24
|
+
/**
|
|
25
|
+
* Parses `INTERNAL_SERVICE_CREDENTIALS` (a JSON object of caller name → secret).
|
|
26
|
+
*
|
|
27
|
+
* @param raw The env value; empty or undefined gives `{}`.
|
|
28
|
+
* @returns A frozen map of caller name → secret.
|
|
29
|
+
* @throws ConfigError when the JSON is malformed, not an object, a name is not a valid service name, or a
|
|
30
|
+
* secret is not a non-empty string. The message names the bad key, never a secret.
|
|
31
|
+
* @example parseInternalServiceCredentials('{"alpha-service":"<secret>"}') // { 'alpha-service': '<secret>' }
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseInternalServiceCredentials(raw: string | undefined): Readonly<Record<string, string>>;
|
|
34
|
+
/**
|
|
35
|
+
* Reads `INTERNAL_SERVICE_NAME`, `INTERNAL_SERVICE_CREDENTIAL` and `INTERNAL_SERVICE_CREDENTIALS`.
|
|
36
|
+
*
|
|
37
|
+
* @param env process.env (default) or a parsed config object.
|
|
38
|
+
* @returns The settings; missing values are empty.
|
|
39
|
+
* @throws ConfigError when `INTERNAL_SERVICE_CREDENTIALS` is malformed.
|
|
40
|
+
* @example const internalAuth = internalServiceAuthConfigFromEnv();
|
|
41
|
+
*/
|
|
42
|
+
export declare function internalServiceAuthConfigFromEnv(env?: Env): InternalServiceAuthConfig;
|
|
43
|
+
/**
|
|
44
|
+
* The headers a service adds to every internal call it makes.
|
|
45
|
+
*
|
|
46
|
+
* @param caller This service's name and secret.
|
|
47
|
+
* @returns `{ 'x-internal-service-name', 'x-internal-service-secret' }`.
|
|
48
|
+
* @example fetch(url, { headers: { ...internalServiceHeaders({ name, secret }) } });
|
|
49
|
+
*/
|
|
50
|
+
export declare function internalServiceHeaders(caller: InternalCallerCredential): Record<string, string>;
|
|
51
|
+
/** What a service does with internal routes, for {@link assertInternalServiceAuthConfigured}. */
|
|
52
|
+
export interface InternalServiceAuthReadiness {
|
|
53
|
+
/** The service calls other services' internal routes (needs its own name and credential). */
|
|
54
|
+
calls?: boolean;
|
|
55
|
+
/** The service exposes internal routes (needs the map of accepted callers). */
|
|
56
|
+
serves?: boolean;
|
|
57
|
+
/** Defaults to env `NODE_ENV`. */
|
|
58
|
+
nodeEnv?: string;
|
|
59
|
+
/** Defaults to process.env. */
|
|
60
|
+
env?: Env;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Startup guard. In staging and production it refuses to start when a calling service lacks a valid name or a
|
|
64
|
+
* credential of at least 32 characters, or when a serving service has no accepted callers or any accepted
|
|
65
|
+
* secret shorter than 32 characters. In other environments it only checks that what is set parses.
|
|
66
|
+
*
|
|
67
|
+
* @param options Whether the service calls and/or serves internal routes.
|
|
68
|
+
* @throws ConfigError listing every problem (names only, never secret values).
|
|
69
|
+
* @example assertInternalServiceAuthConfigured({ calls: true, serves: true });
|
|
70
|
+
*/
|
|
71
|
+
export declare function assertInternalServiceAuthConfigured(options: InternalServiceAuthReadiness): void;
|
|
72
|
+
/** Outcome of {@link verifyInternalCaller}. */
|
|
73
|
+
export type InternalCallerVerdict = {
|
|
74
|
+
ok: true;
|
|
75
|
+
caller: string;
|
|
76
|
+
} | {
|
|
77
|
+
ok: false;
|
|
78
|
+
status: 401;
|
|
79
|
+
reason: 'missing-credentials' | 'invalid-credentials';
|
|
80
|
+
caller?: string;
|
|
81
|
+
} | {
|
|
82
|
+
ok: false;
|
|
83
|
+
status: 403;
|
|
84
|
+
reason: 'caller-not-allowed';
|
|
85
|
+
caller: string;
|
|
86
|
+
};
|
|
87
|
+
type HeaderBag = Readonly<Record<string, string | string[] | undefined>>;
|
|
88
|
+
/**
|
|
89
|
+
* Checks the internal headers against the accepted credentials and the route's caller list.
|
|
90
|
+
* 401 when the name or secret is missing, the name is unknown or the secret is wrong; 403 when a correctly
|
|
91
|
+
* authenticated caller is not in `allowed`.
|
|
92
|
+
*
|
|
93
|
+
* @param input Request headers, accepted credentials and the route's allowed callers.
|
|
94
|
+
* @returns A verdict; the caller name is included when one was sent (safe to log), the secret never is.
|
|
95
|
+
* @example verifyInternalCaller({ headers: req.headers, credentials, allowed: ['alpha-service'] });
|
|
96
|
+
*/
|
|
97
|
+
export declare function verifyInternalCaller(input: {
|
|
98
|
+
headers: HeaderBag;
|
|
99
|
+
credentials: Readonly<Record<string, string>>;
|
|
100
|
+
allowed: readonly string[];
|
|
101
|
+
}): InternalCallerVerdict;
|
|
102
|
+
//# sourceMappingURL=internal-service-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-service-auth.d.ts","sourceRoot":"","sources":["../../../src/common/internal-service-auth.ts"],"names":[],"mappings":"AAoBA,kDAAkD;AAClD,eAAO,MAAM,4BAA4B,2BAAwC,CAAC;AAClF,wDAAwD;AACxD,eAAO,MAAM,8BAA8B,6BAAkC,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAK/F,oEAAoE;AACpE,MAAM,WAAW,wBAAwB;IACvC,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wDAAwD;AACxD,MAAM,WAAW,yBAAyB;IACxC,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;AAED,0EAA0E;AAC1E,KAAK,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAO7C;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAkBzG;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAAC,GAAG,GAAE,GAAiB,GAAG,yBAAyB,CAMlG;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE/F;AAED,iGAAiG;AACjG,MAAM,WAAW,4BAA4B;IAC3C,6FAA6F;IAC7F,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAED;;;;;;;;GAQG;AACH,wBAAgB,mCAAmC,CAAC,OAAO,EAAE,4BAA4B,GAAG,IAAI,CAmB/F;AAMD,+CAA+C;AAC/C,MAAM,MAAM,qBAAqB,GAC7B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,qBAAqB,GAAG,qBAAqB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAClG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E,KAAK,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;AAOzE;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,OAAO,EAAE,SAAS,CAAC;IACnB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B,GAAG,qBAAqB,CASxB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/** A currency: its ISO 4217 code and how many decimal places its minor unit has. */
|
|
2
|
+
export interface CurrencySpec {
|
|
3
|
+
/** ISO 4217 code, e.g. `USD`. */
|
|
4
|
+
readonly code: string;
|
|
5
|
+
/** Decimal places of the minor unit (2 for cents, 3 for fils, 0 for yen). */
|
|
6
|
+
readonly minorUnits: number;
|
|
7
|
+
}
|
|
8
|
+
/** A currency code (minor units read from the runtime's ISO 4217 data) or an explicit spec. */
|
|
9
|
+
export type CurrencyInput = string | CurrencySpec;
|
|
10
|
+
/** A rate or ratio: a decimal string (`"0.16"`) or a finite number (converted through its shortest decimal form). */
|
|
11
|
+
export type DecimalInput = string | number;
|
|
12
|
+
/**
|
|
13
|
+
* Resolves a currency code or spec, validating both.
|
|
14
|
+
*
|
|
15
|
+
* @param currency ISO 4217 code (minor units from `Intl`) or `{ code, minorUnits }`.
|
|
16
|
+
* @returns The spec.
|
|
17
|
+
* @throws RangeError for a malformed code or minor-unit count.
|
|
18
|
+
* @example resolveCurrency('USD') // { code: 'USD', minorUnits: 2 }
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveCurrency(currency: CurrencyInput): CurrencySpec;
|
|
21
|
+
/** An immutable amount of one currency, always a whole number of minor units. */
|
|
22
|
+
export declare class Money {
|
|
23
|
+
private readonly value;
|
|
24
|
+
/** The amount's currency. */
|
|
25
|
+
readonly currency: CurrencySpec;
|
|
26
|
+
private constructor();
|
|
27
|
+
/**
|
|
28
|
+
* Parses a decimal string. Strict: no thousands separators, symbols or more decimals than the
|
|
29
|
+
* currency allows (D5), so a stored value is never silently rounded on the way in.
|
|
30
|
+
*
|
|
31
|
+
* @param amount e.g. `"1250.5"` or `"-3.25"`.
|
|
32
|
+
* @param currency Code or spec.
|
|
33
|
+
* @returns The amount.
|
|
34
|
+
* @throws RangeError for anything else.
|
|
35
|
+
* @example Money.fromDecimalString('19.99', 'USD')
|
|
36
|
+
*/
|
|
37
|
+
static fromDecimalString(amount: string, currency: CurrencyInput): Money;
|
|
38
|
+
/**
|
|
39
|
+
* Builds an amount from an integer count of minor units (e.g. cents).
|
|
40
|
+
*
|
|
41
|
+
* @param units Integer (number within the safe range, or bigint).
|
|
42
|
+
* @param currency Code or spec.
|
|
43
|
+
* @returns The amount.
|
|
44
|
+
* @example Money.fromMinorUnits(1999, 'USD').toDecimalString() // '19.99'
|
|
45
|
+
*/
|
|
46
|
+
static fromMinorUnits(units: number | bigint, currency: CurrencyInput): Money;
|
|
47
|
+
/**
|
|
48
|
+
* Zero in a currency.
|
|
49
|
+
*
|
|
50
|
+
* @param currency Code or spec.
|
|
51
|
+
* @returns `0` of that currency.
|
|
52
|
+
*/
|
|
53
|
+
static zero(currency: CurrencyInput): Money;
|
|
54
|
+
/** The amount with exactly the currency's decimal places, e.g. `"1250.00"` — the wire and storage form. */
|
|
55
|
+
toDecimalString(): string;
|
|
56
|
+
/** The amount as an integer count of minor units. */
|
|
57
|
+
toMinorUnits(): bigint;
|
|
58
|
+
/** Serialises as the decimal string, so an amount never becomes a JSON number by accident. */
|
|
59
|
+
toJSON(): string;
|
|
60
|
+
/** Same as {@link toDecimalString}. */
|
|
61
|
+
toString(): string;
|
|
62
|
+
/** Sum of two amounts of the same currency. */
|
|
63
|
+
add(other: Money): Money;
|
|
64
|
+
/** Difference of two amounts of the same currency. */
|
|
65
|
+
sub(other: Money): Money;
|
|
66
|
+
/**
|
|
67
|
+
* Multiplies by a rate (tax, fee, quantity), rounding half-up to the minor unit.
|
|
68
|
+
*
|
|
69
|
+
* @param rate e.g. `"0.16"` or `3`.
|
|
70
|
+
* @returns The rounded product.
|
|
71
|
+
* @example Money.fromDecimalString('10.05', 'USD').mul('0.5').toDecimalString() // '5.03'
|
|
72
|
+
*/
|
|
73
|
+
mul(rate: DecimalInput): Money;
|
|
74
|
+
/**
|
|
75
|
+
* Splits the amount in proportion to `ratios`; the parts always sum to the amount exactly. Each part is
|
|
76
|
+
* rounded down to the minor unit and the left-over units go, one each, to the parts with the largest
|
|
77
|
+
* remainders (earlier parts win ties). A negative amount is split like its absolute value, then negated.
|
|
78
|
+
*
|
|
79
|
+
* @param ratios Non-negative weights with a positive sum, e.g. `['1', '1', '1']` or `[70, 30]`.
|
|
80
|
+
* @returns One amount per ratio, in order.
|
|
81
|
+
* @throws RangeError for an empty list, a negative ratio or a zero sum.
|
|
82
|
+
* @example Money.fromDecimalString('100.00', 'USD').allocate([1, 1, 1]).map(String) // ['33.34', '33.33', '33.33']
|
|
83
|
+
*/
|
|
84
|
+
allocate(ratios: readonly DecimalInput[]): Money[];
|
|
85
|
+
/**
|
|
86
|
+
* Rounds up (toward +∞) to a multiple of `unit`, e.g. whole units for a payment rail that rejects cents.
|
|
87
|
+
*
|
|
88
|
+
* @param unit Positive step in major units, e.g. `"1"` or `"0.05"`; defaults to `"1"`.
|
|
89
|
+
* @returns The rounded-up amount.
|
|
90
|
+
* @example Money.fromDecimalString('99.01', 'USD').ceilToUnit().toDecimalString() // '100.00'
|
|
91
|
+
*/
|
|
92
|
+
ceilToUnit(unit?: DecimalInput): Money;
|
|
93
|
+
/** -1, 0 or 1 comparing this amount with `other` (same currency). */
|
|
94
|
+
compare(other: Money): -1 | 0 | 1;
|
|
95
|
+
/** True when both amounts have the same currency and value. */
|
|
96
|
+
equals(other: Money): boolean;
|
|
97
|
+
/** True for zero. */
|
|
98
|
+
isZero(): boolean;
|
|
99
|
+
/** True below zero. */
|
|
100
|
+
isNegative(): boolean;
|
|
101
|
+
private same;
|
|
102
|
+
private round;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=money.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money.d.ts","sourceRoot":"","sources":["../../../src/common/money.ts"],"names":[],"mappings":"AAeA,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,+FAA+F;AAC/F,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;AAElD,qHAAqH;AACrH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAK3C;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,YAAY,CAWrE;AASD,iFAAiF;AACjF,qBAAa,KAAK;IAEd,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,6BAA6B;IAC7B,QAAQ,CAAC,QAAQ,EAAE,YAAY;IAHjC,OAAO;IAQP;;;;;;;;;OASG;IACH,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,KAAK;IAUxE;;;;;;;OAOG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,KAAK;IAM7E;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,KAAK;IAI3C,2GAA2G;IAC3G,eAAe,IAAI,MAAM;IAIzB,qDAAqD;IACrD,YAAY,IAAI,MAAM;IAItB,8FAA8F;IAC9F,MAAM,IAAI,MAAM;IAIhB,uCAAuC;IACvC,QAAQ,IAAI,MAAM;IAIlB,+CAA+C;IAC/C,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK;IAIxB,sDAAsD;IACtD,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK;IAIxB;;;;;;OAMG;IACH,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,KAAK;IAI9B;;;;;;;;;OASG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,KAAK,EAAE;IAsBlD;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,GAAE,YAAkB,GAAG,KAAK;IAO3C,qEAAqE;IACrE,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAIjC,+DAA+D;IAC/D,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAI7B,qBAAqB;IACrB,MAAM,IAAI,OAAO;IAIjB,uBAAuB;IACvB,UAAU,IAAI,OAAO;IAIrB,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -3,37 +3,47 @@
|
|
|
3
3
|
* `0712345678` only make sense against a country, and that country is app configuration.
|
|
4
4
|
*
|
|
5
5
|
* @param phone Number as typed (local or international format).
|
|
6
|
-
* @param region ISO 3166-1 alpha-2 region used for local formats (e.g. `
|
|
7
|
-
* @returns E.164 (`+
|
|
8
|
-
* @example toE164('
|
|
6
|
+
* @param region ISO 3166-1 alpha-2 region used for local formats (e.g. `GB`, `US`).
|
|
7
|
+
* @returns E.164 (`+447400123456`), or null when not a valid number for that region.
|
|
8
|
+
* @example toE164('07400 123456', 'GB') // '+447400123456'
|
|
9
9
|
*/
|
|
10
10
|
export declare function toE164(phone: string, region: string): string | null;
|
|
11
|
+
/** Options for {@link toMsisdn}. */
|
|
12
|
+
export interface MsisdnOptions {
|
|
13
|
+
/** Reject numbers that are not mobile (or mobile-or-fixed) lines, e.g. for SMS or mobile-money payers. */
|
|
14
|
+
mobileOnly?: boolean;
|
|
15
|
+
/** Reject numbers that belong to another country than `region` (a foreign `+…` number). */
|
|
16
|
+
regionOnly?: boolean;
|
|
17
|
+
}
|
|
11
18
|
/**
|
|
12
|
-
* E.164 without the plus sign, as
|
|
19
|
+
* E.164 without the plus sign (an MSISDN), as SMS gateways and mobile-money rails expect. Throws instead of
|
|
20
|
+
* returning null so a bad number can never be stored or sent by mistake; use {@link toE164} to test input.
|
|
13
21
|
*
|
|
14
|
-
* @param phone Number as typed.
|
|
15
|
-
* @param region ISO region for local formats.
|
|
16
|
-
* @
|
|
17
|
-
* @
|
|
22
|
+
* @param phone Number as typed (local or international format).
|
|
23
|
+
* @param region ISO 3166-1 alpha-2 region used for local formats (required; no app default).
|
|
24
|
+
* @param options Mobile-only and same-region checks.
|
|
25
|
+
* @returns Digits only, country code first.
|
|
26
|
+
* @throws BadRequestError (`INVALID_PHONE`) when the number is invalid or fails an option.
|
|
27
|
+
* @example toMsisdn('07400 123456', 'GB') // '447400123456'
|
|
18
28
|
*/
|
|
19
|
-
export declare function toMsisdn(phone: string, region: string): string
|
|
29
|
+
export declare function toMsisdn(phone: string, region: string, options?: MsisdnOptions): string;
|
|
20
30
|
/**
|
|
21
31
|
* The region a number belongs to.
|
|
22
32
|
*
|
|
23
33
|
* @param phone Number as typed.
|
|
24
34
|
* @param region ISO region used to interpret local formats.
|
|
25
35
|
* @returns ISO region code, or null when it cannot be determined.
|
|
26
|
-
* @example phoneRegion('+447400123456', '
|
|
36
|
+
* @example phoneRegion('+447400123456', 'US') // 'GB'
|
|
27
37
|
*/
|
|
28
38
|
export declare function phoneRegion(phone: string, region: string): string | null;
|
|
29
39
|
/**
|
|
30
|
-
* Masks a phone number for logs and UI
|
|
31
|
-
*
|
|
32
|
-
*
|
|
40
|
+
* Masks a phone number for logs, audit metadata and UI: every digit except the last 4 becomes `*`, so a
|
|
41
|
+
* full number never lands in a log line or on a screen. Fewer than 5 digits are fully masked
|
|
42
|
+
* (the same rule the logger applies to phone-like values).
|
|
33
43
|
*
|
|
34
44
|
* @param phone Any phone string (normalised or not).
|
|
35
|
-
* @returns The masked
|
|
36
|
-
* @example maskPhone('
|
|
45
|
+
* @returns The masked digits.
|
|
46
|
+
* @example maskPhone('+44 7400 123456') // '********3456'
|
|
37
47
|
*/
|
|
38
48
|
export declare function maskPhone(phone: string): string;
|
|
39
49
|
//# sourceMappingURL=phone.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phone.d.ts","sourceRoot":"","sources":["../../../src/common/phone.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"phone.d.ts","sourceRoot":"","sources":["../../../src/common/phone.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOnE;AAED,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,0GAA0G;IAC1G,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAa3F;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMxE;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/C"}
|
|
@@ -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"}
|