@byline/core 0.9.3
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/LICENSE +373 -0
- package/README.md +17 -0
- package/dist/@types/admin-types.d.ts +275 -0
- package/dist/@types/admin-types.d.ts.map +1 -0
- package/dist/@types/admin-types.js +18 -0
- package/dist/@types/admin-types.js.map +1 -0
- package/dist/@types/collection-types.d.ts +816 -0
- package/dist/@types/collection-types.d.ts.map +1 -0
- package/dist/@types/collection-types.js +217 -0
- package/dist/@types/collection-types.js.map +1 -0
- package/dist/@types/db-types.d.ts +463 -0
- package/dist/@types/db-types.d.ts.map +1 -0
- package/dist/@types/db-types.js +2 -0
- package/dist/@types/db-types.js.map +1 -0
- package/dist/@types/field-data-types.d.ts +147 -0
- package/dist/@types/field-data-types.d.ts.map +1 -0
- package/dist/@types/field-data-types.js +38 -0
- package/dist/@types/field-data-types.js.map +1 -0
- package/dist/@types/field-types.d.ts +579 -0
- package/dist/@types/field-types.d.ts.map +1 -0
- package/dist/@types/field-types.js +32 -0
- package/dist/@types/field-types.js.map +1 -0
- package/dist/@types/index.d.ts +18 -0
- package/dist/@types/index.d.ts.map +1 -0
- package/dist/@types/index.js +18 -0
- package/dist/@types/index.js.map +1 -0
- package/dist/@types/populate-types.d.ts +54 -0
- package/dist/@types/populate-types.d.ts.map +1 -0
- package/dist/@types/populate-types.js +9 -0
- package/dist/@types/populate-types.js.map +1 -0
- package/dist/@types/query-predicate.d.ts +74 -0
- package/dist/@types/query-predicate.d.ts.map +1 -0
- package/dist/@types/query-predicate.js +9 -0
- package/dist/@types/query-predicate.js.map +1 -0
- package/dist/@types/site-config.d.ts +212 -0
- package/dist/@types/site-config.d.ts.map +1 -0
- package/dist/@types/site-config.js +9 -0
- package/dist/@types/site-config.js.map +1 -0
- package/dist/@types/storage-types.d.ts +86 -0
- package/dist/@types/storage-types.d.ts.map +1 -0
- package/dist/@types/storage-types.js +9 -0
- package/dist/@types/storage-types.js.map +1 -0
- package/dist/@types/store-types.d.ts +134 -0
- package/dist/@types/store-types.d.ts.map +1 -0
- package/dist/@types/store-types.js +24 -0
- package/dist/@types/store-types.js.map +1 -0
- package/dist/@types/type-utils.d.ts +17 -0
- package/dist/@types/type-utils.d.ts.map +1 -0
- package/dist/@types/type-utils.js +9 -0
- package/dist/@types/type-utils.js.map +1 -0
- package/dist/auth/apply-before-read.d.ts +36 -0
- package/dist/auth/apply-before-read.d.ts.map +1 -0
- package/dist/auth/apply-before-read.js +68 -0
- package/dist/auth/apply-before-read.js.map +1 -0
- package/dist/auth/apply-before-read.test.node.d.ts +9 -0
- package/dist/auth/apply-before-read.test.node.d.ts.map +1 -0
- package/dist/auth/apply-before-read.test.node.js +144 -0
- package/dist/auth/apply-before-read.test.node.js.map +1 -0
- package/dist/auth/assert-actor-can-perform.d.ts +39 -0
- package/dist/auth/assert-actor-can-perform.d.ts.map +1 -0
- package/dist/auth/assert-actor-can-perform.js +64 -0
- package/dist/auth/assert-actor-can-perform.js.map +1 -0
- package/dist/auth/assert-actor-can-perform.test.node.d.ts +9 -0
- package/dist/auth/assert-actor-can-perform.test.node.d.ts.map +1 -0
- package/dist/auth/assert-actor-can-perform.test.node.js +119 -0
- package/dist/auth/assert-actor-can-perform.test.node.js.map +1 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/register-collection-abilities.d.ts +40 -0
- package/dist/auth/register-collection-abilities.d.ts.map +1 -0
- package/dist/auth/register-collection-abilities.js +87 -0
- package/dist/auth/register-collection-abilities.js.map +1 -0
- package/dist/auth/register-collection-abilities.test.node.d.ts +9 -0
- package/dist/auth/register-collection-abilities.test.node.d.ts.map +1 -0
- package/dist/auth/register-collection-abilities.test.node.js +124 -0
- package/dist/auth/register-collection-abilities.test.node.js.map +1 -0
- package/dist/config/config.d.ts +10 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +108 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/routes.d.ts +16 -0
- package/dist/config/routes.d.ts.map +1 -0
- package/dist/config/routes.js +26 -0
- package/dist/config/routes.js.map +1 -0
- package/dist/config/validate-admin-configs.d.ts +33 -0
- package/dist/config/validate-admin-configs.d.ts.map +1 -0
- package/dist/config/validate-admin-configs.js +250 -0
- package/dist/config/validate-admin-configs.js.map +1 -0
- package/dist/config/validate-admin-configs.test.node.d.ts +9 -0
- package/dist/config/validate-admin-configs.test.node.d.ts.map +1 -0
- package/dist/config/validate-admin-configs.test.node.js +224 -0
- package/dist/config/validate-admin-configs.test.node.js.map +1 -0
- package/dist/config/validate-collections.d.ts +33 -0
- package/dist/config/validate-collections.d.ts.map +1 -0
- package/dist/config/validate-collections.js +70 -0
- package/dist/config/validate-collections.js.map +1 -0
- package/dist/config/validate-collections.test.node.d.ts +9 -0
- package/dist/config/validate-collections.test.node.d.ts.map +1 -0
- package/dist/config/validate-collections.test.node.js +149 -0
- package/dist/config/validate-collections.test.node.js.map +1 -0
- package/dist/core.d.ts +89 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +99 -0
- package/dist/core.js.map +1 -0
- package/dist/defaults/default-values.d.ts +13 -0
- package/dist/defaults/default-values.d.ts.map +1 -0
- package/dist/defaults/default-values.js +60 -0
- package/dist/defaults/default-values.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/errors.d.ts +98 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +134 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/logger.d.ts +62 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +120 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/registry.d.ts +65 -0
- package/dist/lib/registry.d.ts.map +1 -0
- package/dist/lib/registry.js +133 -0
- package/dist/lib/registry.js.map +1 -0
- package/dist/logger/index.d.ts +3 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +3 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/patches/apply-patches.d.ts +21 -0
- package/dist/patches/apply-patches.d.ts.map +1 -0
- package/dist/patches/apply-patches.js +357 -0
- package/dist/patches/apply-patches.js.map +1 -0
- package/dist/patches/index.d.ts +3 -0
- package/dist/patches/index.d.ts.map +1 -0
- package/dist/patches/index.js +4 -0
- package/dist/patches/index.js.map +1 -0
- package/dist/patches/patch-types.d.ts +82 -0
- package/dist/patches/patch-types.d.ts.map +1 -0
- package/dist/patches/patch-types.js +3 -0
- package/dist/patches/patch-types.js.map +1 -0
- package/dist/patches/patch.test.node.d.ts +2 -0
- package/dist/patches/patch.test.node.d.ts.map +1 -0
- package/dist/patches/patch.test.node.js +193 -0
- package/dist/patches/patch.test.node.js.map +1 -0
- package/dist/query/parse-where.d.ts +100 -0
- package/dist/query/parse-where.d.ts.map +1 -0
- package/dist/query/parse-where.js +352 -0
- package/dist/query/parse-where.js.map +1 -0
- package/dist/query/parse-where.test.node.d.ts +9 -0
- package/dist/query/parse-where.test.node.d.ts.map +1 -0
- package/dist/query/parse-where.test.node.js +581 -0
- package/dist/query/parse-where.test.node.js.map +1 -0
- package/dist/schemas/zod/builder.d.ts +466 -0
- package/dist/schemas/zod/builder.d.ts.map +1 -0
- package/dist/schemas/zod/builder.js +276 -0
- package/dist/schemas/zod/builder.js.map +1 -0
- package/dist/schemas/zod/cache.d.ts +14 -0
- package/dist/schemas/zod/cache.d.ts.map +1 -0
- package/dist/schemas/zod/cache.js +40 -0
- package/dist/schemas/zod/cache.js.map +1 -0
- package/dist/schemas/zod/index.d.ts +4 -0
- package/dist/schemas/zod/index.d.ts.map +1 -0
- package/dist/schemas/zod/index.js +4 -0
- package/dist/schemas/zod/index.js.map +1 -0
- package/dist/schemas/zod/types.d.ts +13 -0
- package/dist/schemas/zod/types.d.ts.map +1 -0
- package/dist/schemas/zod/types.js +2 -0
- package/dist/schemas/zod/types.js.map +1 -0
- package/dist/services/collection-bootstrap.d.ts +46 -0
- package/dist/services/collection-bootstrap.d.ts.map +1 -0
- package/dist/services/collection-bootstrap.js +108 -0
- package/dist/services/collection-bootstrap.js.map +1 -0
- package/dist/services/collection-bootstrap.test.node.d.ts +9 -0
- package/dist/services/collection-bootstrap.test.node.d.ts.map +1 -0
- package/dist/services/collection-bootstrap.test.node.js +208 -0
- package/dist/services/collection-bootstrap.test.node.js.map +1 -0
- package/dist/services/document-lifecycle.d.ts +245 -0
- package/dist/services/document-lifecycle.d.ts.map +1 -0
- package/dist/services/document-lifecycle.js +481 -0
- package/dist/services/document-lifecycle.js.map +1 -0
- package/dist/services/document-lifecycle.test.node.d.ts +9 -0
- package/dist/services/document-lifecycle.test.node.d.ts.map +1 -0
- package/dist/services/document-lifecycle.test.node.js +781 -0
- package/dist/services/document-lifecycle.test.node.js.map +1 -0
- package/dist/services/document-read.d.ts +26 -0
- package/dist/services/document-read.d.ts.map +1 -0
- package/dist/services/document-read.js +60 -0
- package/dist/services/document-read.js.map +1 -0
- package/dist/services/field-upload.d.ts +100 -0
- package/dist/services/field-upload.d.ts.map +1 -0
- package/dist/services/field-upload.js +328 -0
- package/dist/services/field-upload.js.map +1 -0
- package/dist/services/field-upload.test.node.d.ts +9 -0
- package/dist/services/field-upload.test.node.d.ts.map +1 -0
- package/dist/services/field-upload.test.node.js +337 -0
- package/dist/services/field-upload.test.node.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +11 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/populate.d.ts +299 -0
- package/dist/services/populate.d.ts.map +1 -0
- package/dist/services/populate.js +484 -0
- package/dist/services/populate.js.map +1 -0
- package/dist/services/populate.test.node.d.ts +9 -0
- package/dist/services/populate.test.node.d.ts.map +1 -0
- package/dist/services/populate.test.node.js +910 -0
- package/dist/services/populate.test.node.js.map +1 -0
- package/dist/services/relation-projection.d.ts +52 -0
- package/dist/services/relation-projection.d.ts.map +1 -0
- package/dist/services/relation-projection.js +81 -0
- package/dist/services/relation-projection.js.map +1 -0
- package/dist/services/richtext-populate.d.ts +87 -0
- package/dist/services/richtext-populate.d.ts.map +1 -0
- package/dist/services/richtext-populate.js +189 -0
- package/dist/services/richtext-populate.js.map +1 -0
- package/dist/services/richtext-populate.test.node.d.ts +9 -0
- package/dist/services/richtext-populate.test.node.d.ts.map +1 -0
- package/dist/services/richtext-populate.test.node.js +197 -0
- package/dist/services/richtext-populate.test.node.js.map +1 -0
- package/dist/storage/collection-fingerprint.d.ts +21 -0
- package/dist/storage/collection-fingerprint.d.ts.map +1 -0
- package/dist/storage/collection-fingerprint.js +172 -0
- package/dist/storage/collection-fingerprint.js.map +1 -0
- package/dist/storage/collection-fingerprint.test.node.d.ts +9 -0
- package/dist/storage/collection-fingerprint.test.node.d.ts.map +1 -0
- package/dist/storage/collection-fingerprint.test.node.js +256 -0
- package/dist/storage/collection-fingerprint.test.node.js.map +1 -0
- package/dist/storage/field-store-map.d.ts +59 -0
- package/dist/storage/field-store-map.d.ts.map +1 -0
- package/dist/storage/field-store-map.js +75 -0
- package/dist/storage/field-store-map.js.map +1 -0
- package/dist/storage/field-store-map.test.node.d.ts +9 -0
- package/dist/storage/field-store-map.test.node.d.ts.map +1 -0
- package/dist/storage/field-store-map.test.node.js +117 -0
- package/dist/storage/field-store-map.test.node.js.map +1 -0
- package/dist/storage/index.d.ts +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +10 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/utils/normalise-dates.d.ts +15 -0
- package/dist/utils/normalise-dates.d.ts.map +1 -0
- package/dist/utils/normalise-dates.js +22 -0
- package/dist/utils/normalise-dates.js.map +1 -0
- package/dist/utils/slugify.d.ts +56 -0
- package/dist/utils/slugify.d.ts.map +1 -0
- package/dist/utils/slugify.js +91 -0
- package/dist/utils/slugify.js.map +1 -0
- package/dist/utils/slugify.test.node.d.ts +9 -0
- package/dist/utils/slugify.test.node.d.ts.map +1 -0
- package/dist/utils/slugify.test.node.js +86 -0
- package/dist/utils/slugify.test.node.js.map +1 -0
- package/dist/utils/storage-utils.d.ts +36 -0
- package/dist/utils/storage-utils.d.ts.map +1 -0
- package/dist/utils/storage-utils.js +38 -0
- package/dist/utils/storage-utils.js.map +1 -0
- package/dist/utils/utils.general.d.ts +64 -0
- package/dist/utils/utils.general.d.ts.map +1 -0
- package/dist/utils/utils.general.js +219 -0
- package/dist/utils/utils.general.js.map +1 -0
- package/dist/validation/index.d.ts +9 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +9 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/shared.d.ts +36 -0
- package/dist/validation/shared.d.ts.map +1 -0
- package/dist/validation/shared.js +42 -0
- package/dist/validation/shared.js.map +1 -0
- package/dist/workflow/index.d.ts +2 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +3 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/workflow.d.ts +40 -0
- package/dist/workflow/workflow.d.ts.map +1 -0
- package/dist/workflow/workflow.js +96 -0
- package/dist/workflow/workflow.js.map +1 -0
- package/dist/workflow/workflow.test.node.d.ts +2 -0
- package/dist/workflow/workflow.test.node.d.ts.map +1 -0
- package/dist/workflow/workflow.test.node.js +198 -0
- package/dist/workflow/workflow.test.node.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*
|
|
8
|
+
* Structured error handling for Byline CMS.
|
|
9
|
+
*
|
|
10
|
+
* Follows the Modulus CoreError pattern: every error carries a machine-readable
|
|
11
|
+
* `code`, optional `details` (included in API responses), and optional `logExtra`
|
|
12
|
+
* (included only in logs). The `.log(logger)` method logs the error exactly once
|
|
13
|
+
* and then sets the log level to 'silent' to prevent double-logging up the stack.
|
|
14
|
+
*
|
|
15
|
+
* Errors are created via factory functions produced by `createErrorType()`:
|
|
16
|
+
*
|
|
17
|
+
* throw ERR_NOT_FOUND({
|
|
18
|
+
* message: 'document not found',
|
|
19
|
+
* details: { documentId },
|
|
20
|
+
* }).log(logger)
|
|
21
|
+
*/
|
|
22
|
+
import type { BylineLogger, LogLevel, LogLevelWithSilent } from './logger.js';
|
|
23
|
+
export type ErrorReport = {
|
|
24
|
+
code: string;
|
|
25
|
+
message: string;
|
|
26
|
+
details?: Record<string, unknown>;
|
|
27
|
+
};
|
|
28
|
+
export type BylineErrorOptions = {
|
|
29
|
+
/** Short description of the error, for internal consumption. */
|
|
30
|
+
message: string;
|
|
31
|
+
/** Optional underlying cause (e.g. a 3rd-party error). */
|
|
32
|
+
cause?: unknown;
|
|
33
|
+
/** Details to be included in the error report (API responses) AND logs. */
|
|
34
|
+
details?: Record<string, unknown>;
|
|
35
|
+
/** If true, stack trace will be captured. */
|
|
36
|
+
captureStack?: boolean;
|
|
37
|
+
/** Log level for this error. Defaults to 'error'. */
|
|
38
|
+
logLevel?: LogLevelWithSilent;
|
|
39
|
+
/** Extra data to include only in logs (never in API responses). */
|
|
40
|
+
logExtra?: Record<string, unknown>;
|
|
41
|
+
};
|
|
42
|
+
export declare class BylineError extends Error {
|
|
43
|
+
/** Machine-readable error code (e.g. 'ERR_NOT_FOUND'). */
|
|
44
|
+
readonly code: string;
|
|
45
|
+
/** Additional details included in both error reports and logs. */
|
|
46
|
+
readonly details?: Record<string, unknown>;
|
|
47
|
+
/** Extra values included only when logging this error. */
|
|
48
|
+
readonly logExtra?: Record<string, unknown>;
|
|
49
|
+
/**
|
|
50
|
+
* Level at which this error should be logged when caught. Will always be
|
|
51
|
+
* 'silent' after `.log()` has been called.
|
|
52
|
+
*/
|
|
53
|
+
private logLevel;
|
|
54
|
+
constructor(code: string, options: BylineErrorOptions, errorConstructor?: any);
|
|
55
|
+
/**
|
|
56
|
+
* Log this error via the given logger. Sets `logLevel` to 'silent' after
|
|
57
|
+
* the first call to prevent double-logging when the error is re-thrown.
|
|
58
|
+
*
|
|
59
|
+
* Returns `this` for chaining: `throw ERR_X({ ... }).log(logger)`
|
|
60
|
+
*/
|
|
61
|
+
log(logger: BylineLogger): typeof this;
|
|
62
|
+
/**
|
|
63
|
+
* Serialize this error for API responses. Includes `code`, `message`,
|
|
64
|
+
* and `details` but deliberately excludes `logExtra`.
|
|
65
|
+
*/
|
|
66
|
+
report(): ErrorReport;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a reusable error factory for a given error code and default log level.
|
|
70
|
+
*
|
|
71
|
+
* ```ts
|
|
72
|
+
* export const ERR_NOT_FOUND = createErrorType('ERR_NOT_FOUND', 'warn')
|
|
73
|
+
*
|
|
74
|
+
* throw ERR_NOT_FOUND({ message: 'document not found' }).log(logger)
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare const createErrorType: (code: string, logLevel?: LogLevel) => (opts: BylineErrorOptions, errorConstructor?: any) => BylineError;
|
|
78
|
+
export declare const ErrorCodes: {
|
|
79
|
+
readonly UNHANDLED: "ERR_UNHANDLED";
|
|
80
|
+
readonly NOT_FOUND: "ERR_NOT_FOUND";
|
|
81
|
+
readonly CONFLICT: "ERR_CONFLICT";
|
|
82
|
+
readonly VALIDATION: "ERR_VALIDATION";
|
|
83
|
+
readonly INVALID_TRANSITION: "ERR_INVALID_TRANSITION";
|
|
84
|
+
readonly PATCH_FAILED: "ERR_PATCH_FAILED";
|
|
85
|
+
readonly DATABASE: "ERR_DATABASE";
|
|
86
|
+
readonly STORAGE: "ERR_STORAGE";
|
|
87
|
+
readonly READ_BUDGET_EXCEEDED: "ERR_READ_BUDGET_EXCEEDED";
|
|
88
|
+
};
|
|
89
|
+
export declare const ERR_UNHANDLED: (opts: BylineErrorOptions, errorConstructor?: any) => BylineError;
|
|
90
|
+
export declare const ERR_NOT_FOUND: (opts: BylineErrorOptions, errorConstructor?: any) => BylineError;
|
|
91
|
+
export declare const ERR_CONFLICT: (opts: BylineErrorOptions, errorConstructor?: any) => BylineError;
|
|
92
|
+
export declare const ERR_VALIDATION: (opts: BylineErrorOptions, errorConstructor?: any) => BylineError;
|
|
93
|
+
export declare const ERR_INVALID_TRANSITION: (opts: BylineErrorOptions, errorConstructor?: any) => BylineError;
|
|
94
|
+
export declare const ERR_PATCH_FAILED: (opts: BylineErrorOptions, errorConstructor?: any) => BylineError;
|
|
95
|
+
export declare const ERR_DATABASE: (opts: BylineErrorOptions, errorConstructor?: any) => BylineError;
|
|
96
|
+
export declare const ERR_STORAGE: (opts: BylineErrorOptions, errorConstructor?: any) => BylineError;
|
|
97
|
+
export declare const ERR_READ_BUDGET_EXCEEDED: (opts: BylineErrorOptions, errorConstructor?: any) => BylineError;
|
|
98
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAM7E,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;IACf,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,6CAA6C;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC,CAAA;AAMD,qBAAa,WAAY,SAAQ,KAAK;IACpC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,kEAAkE;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE1C,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE3C;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAoB;gBAExB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,EAAE,GAAG;IAiC7E;;;;;OAKG;IACH,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,IAAI;IAQtC;;;OAGG;IACH,MAAM,IAAI,WAAW;CAOtB;AAMD;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,WAAU,QAAkB,YACpD,kBAAkB,qBAAqB,GAAG,gBAG/D,CAAA;AAMD,eAAO,MAAM,UAAU;;;;;;;;;;CAUb,CAAA;AAMV,eAAO,MAAM,aAAa,SAzBJ,kBAAkB,qBAAqB,GAAG,gBAyBE,CAAA;AAClE,eAAO,MAAM,aAAa,SA1BJ,kBAAkB,qBAAqB,GAAG,gBA0BU,CAAA;AAC1E,eAAO,MAAM,YAAY,SA3BH,kBAAkB,qBAAqB,GAAG,gBA2BQ,CAAA;AACxE,eAAO,MAAM,cAAc,SA5BL,kBAAkB,qBAAqB,GAAG,gBA4BY,CAAA;AAC5E,eAAO,MAAM,sBAAsB,SA7Bb,kBAAkB,qBAAqB,GAAG,gBA6B4B,CAAA;AAC5F,eAAO,MAAM,gBAAgB,SA9BP,kBAAkB,qBAAqB,GAAG,gBA8BQ,CAAA;AACxE,eAAO,MAAM,YAAY,SA/BH,kBAAkB,qBAAqB,GAAG,gBA+BA,CAAA;AAChE,eAAO,MAAM,WAAW,SAhCF,kBAAkB,qBAAqB,GAAG,gBAgCF,CAAA;AAC9D,eAAO,MAAM,wBAAwB,SAjCf,kBAAkB,qBAAqB,GAAG,gBAiCwB,CAAA"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*
|
|
8
|
+
* Structured error handling for Byline CMS.
|
|
9
|
+
*
|
|
10
|
+
* Follows the Modulus CoreError pattern: every error carries a machine-readable
|
|
11
|
+
* `code`, optional `details` (included in API responses), and optional `logExtra`
|
|
12
|
+
* (included only in logs). The `.log(logger)` method logs the error exactly once
|
|
13
|
+
* and then sets the log level to 'silent' to prevent double-logging up the stack.
|
|
14
|
+
*
|
|
15
|
+
* Errors are created via factory functions produced by `createErrorType()`:
|
|
16
|
+
*
|
|
17
|
+
* throw ERR_NOT_FOUND({
|
|
18
|
+
* message: 'document not found',
|
|
19
|
+
* details: { documentId },
|
|
20
|
+
* }).log(logger)
|
|
21
|
+
*/
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// BylineError base class
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
export class BylineError extends Error {
|
|
26
|
+
/** Machine-readable error code (e.g. 'ERR_NOT_FOUND'). */
|
|
27
|
+
code;
|
|
28
|
+
/** Additional details included in both error reports and logs. */
|
|
29
|
+
details;
|
|
30
|
+
/** Extra values included only when logging this error. */
|
|
31
|
+
logExtra;
|
|
32
|
+
/**
|
|
33
|
+
* Level at which this error should be logged when caught. Will always be
|
|
34
|
+
* 'silent' after `.log()` has been called.
|
|
35
|
+
*/
|
|
36
|
+
logLevel;
|
|
37
|
+
constructor(code, options, errorConstructor) {
|
|
38
|
+
const { message, cause, details, captureStack = false, logLevel = 'error', logExtra } = options;
|
|
39
|
+
// If Error.captureStackTrace is available, skip the default stack trace
|
|
40
|
+
// generation (which would happen during the call to super()), and then
|
|
41
|
+
// explicitly capture a stack trace _if_ captureStack is true _and_
|
|
42
|
+
// logLevel is not 'silent'.
|
|
43
|
+
if ('captureStackTrace' in Error) {
|
|
44
|
+
const { stackTraceLimit } = Error;
|
|
45
|
+
Error.stackTraceLimit = 0;
|
|
46
|
+
super(message, { cause });
|
|
47
|
+
Error.stackTraceLimit = stackTraceLimit;
|
|
48
|
+
if (captureStack && logLevel !== 'silent') {
|
|
49
|
+
Error.captureStackTrace(this, errorConstructor ?? this.constructor);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
super(message, { cause });
|
|
54
|
+
}
|
|
55
|
+
this.code = code;
|
|
56
|
+
this.details = details;
|
|
57
|
+
this.logExtra = logExtra;
|
|
58
|
+
this.logLevel = logLevel;
|
|
59
|
+
// Mark these properties as non-enumerable so Pino doesn't serialize them
|
|
60
|
+
// as part of the error object itself.
|
|
61
|
+
Object.defineProperties(this, {
|
|
62
|
+
details: { enumerable: false },
|
|
63
|
+
logLevel: { enumerable: false },
|
|
64
|
+
logExtra: { enumerable: false },
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Log this error via the given logger. Sets `logLevel` to 'silent' after
|
|
69
|
+
* the first call to prevent double-logging when the error is re-thrown.
|
|
70
|
+
*
|
|
71
|
+
* Returns `this` for chaining: `throw ERR_X({ ... }).log(logger)`
|
|
72
|
+
*/
|
|
73
|
+
log(logger) {
|
|
74
|
+
if (this.logLevel !== 'silent') {
|
|
75
|
+
logger.log(this.logLevel, { err: this, ...this.details, ...this.logExtra });
|
|
76
|
+
this.logLevel = 'silent';
|
|
77
|
+
}
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Serialize this error for API responses. Includes `code`, `message`,
|
|
82
|
+
* and `details` but deliberately excludes `logExtra`.
|
|
83
|
+
*/
|
|
84
|
+
report() {
|
|
85
|
+
return {
|
|
86
|
+
code: this.code,
|
|
87
|
+
message: this.message,
|
|
88
|
+
details: this.details,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Factory
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
/**
|
|
96
|
+
* Create a reusable error factory for a given error code and default log level.
|
|
97
|
+
*
|
|
98
|
+
* ```ts
|
|
99
|
+
* export const ERR_NOT_FOUND = createErrorType('ERR_NOT_FOUND', 'warn')
|
|
100
|
+
*
|
|
101
|
+
* throw ERR_NOT_FOUND({ message: 'document not found' }).log(logger)
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export const createErrorType = (code, logLevel = 'error') => {
|
|
105
|
+
const cons = (opts, errorConstructor) => new BylineError(code, { logLevel, ...opts }, errorConstructor ?? cons);
|
|
106
|
+
return cons;
|
|
107
|
+
};
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// Error codes
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
export const ErrorCodes = {
|
|
112
|
+
UNHANDLED: 'ERR_UNHANDLED',
|
|
113
|
+
NOT_FOUND: 'ERR_NOT_FOUND',
|
|
114
|
+
CONFLICT: 'ERR_CONFLICT',
|
|
115
|
+
VALIDATION: 'ERR_VALIDATION',
|
|
116
|
+
INVALID_TRANSITION: 'ERR_INVALID_TRANSITION',
|
|
117
|
+
PATCH_FAILED: 'ERR_PATCH_FAILED',
|
|
118
|
+
DATABASE: 'ERR_DATABASE',
|
|
119
|
+
STORAGE: 'ERR_STORAGE',
|
|
120
|
+
READ_BUDGET_EXCEEDED: 'ERR_READ_BUDGET_EXCEEDED',
|
|
121
|
+
};
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
// Pre-instantiated factories
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
export const ERR_UNHANDLED = createErrorType(ErrorCodes.UNHANDLED);
|
|
126
|
+
export const ERR_NOT_FOUND = createErrorType(ErrorCodes.NOT_FOUND, 'warn');
|
|
127
|
+
export const ERR_CONFLICT = createErrorType(ErrorCodes.CONFLICT, 'warn');
|
|
128
|
+
export const ERR_VALIDATION = createErrorType(ErrorCodes.VALIDATION, 'warn');
|
|
129
|
+
export const ERR_INVALID_TRANSITION = createErrorType(ErrorCodes.INVALID_TRANSITION, 'warn');
|
|
130
|
+
export const ERR_PATCH_FAILED = createErrorType(ErrorCodes.PATCH_FAILED);
|
|
131
|
+
export const ERR_DATABASE = createErrorType(ErrorCodes.DATABASE);
|
|
132
|
+
export const ERR_STORAGE = createErrorType(ErrorCodes.STORAGE);
|
|
133
|
+
export const ERR_READ_BUDGET_EXCEEDED = createErrorType(ErrorCodes.READ_BUDGET_EXCEEDED);
|
|
134
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*
|
|
8
|
+
* Structured logging for Byline CMS.
|
|
9
|
+
*
|
|
10
|
+
* ## Architecture
|
|
11
|
+
*
|
|
12
|
+
* This module defines two layers:
|
|
13
|
+
*
|
|
14
|
+
* 1. **Transport-agnostic interface** — `BylineLogger`, `LogLevel`, `LogData`,
|
|
15
|
+
* `LogContext`, `withLogContext`. These have zero dependency on any logging
|
|
16
|
+
* library. All consumer code (services, db adapters, route handlers, errors)
|
|
17
|
+
* depends only on this layer.
|
|
18
|
+
*
|
|
19
|
+
* 2. **Pino transport** — `createBylineLogger` + `BylineLoggerImpl`. This is
|
|
20
|
+
* the default implementation registered in the DI graph via `core.ts`. To
|
|
21
|
+
* swap transports (e.g. for Cloudflare Workers or edge runtimes), provide a
|
|
22
|
+
* different factory that produces a `BylineLogger` and register it in the
|
|
23
|
+
* Registry instead of `createBylineLogger`.
|
|
24
|
+
*
|
|
25
|
+
* Context propagation uses `AsyncLocalStorage` (Node/Bun/Deno/Workers) with a
|
|
26
|
+
* no-op fallback for environments that don't support it (browser bundles).
|
|
27
|
+
* When TC39 `AsyncContext` reaches Stage 3+, this can be swapped transparently.
|
|
28
|
+
*
|
|
29
|
+
* Primary access is via the typed Registry (see core.ts). A globalThis
|
|
30
|
+
* singleton (defineLogger / getLogger) provides an escape hatch for code
|
|
31
|
+
* outside the DI graph (e.g. API route handlers, db adapters).
|
|
32
|
+
*/
|
|
33
|
+
import type { Logger as PinoLogger } from 'pino';
|
|
34
|
+
export interface LogContext {
|
|
35
|
+
domain?: string;
|
|
36
|
+
module?: string;
|
|
37
|
+
class?: string;
|
|
38
|
+
function?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare const getLogContext: () => LogContext;
|
|
41
|
+
export declare const withLogContext: <T>(context: LogContext, fn: () => T) => T;
|
|
42
|
+
export type LogLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace';
|
|
43
|
+
export type LogLevelWithSilent = LogLevel | 'silent';
|
|
44
|
+
export type LogData = Record<string, unknown>;
|
|
45
|
+
type LogFnArgs = [message: string, ...args: unknown[]] | [data: LogData, message?: string, ...args: unknown[]];
|
|
46
|
+
export interface BylineLogger {
|
|
47
|
+
log(level: LogLevel, ...args: LogFnArgs): void;
|
|
48
|
+
fatal(...args: LogFnArgs): void;
|
|
49
|
+
error(...args: LogFnArgs): void;
|
|
50
|
+
warn(...args: LogFnArgs): void;
|
|
51
|
+
info(...args: LogFnArgs): void;
|
|
52
|
+
debug(...args: LogFnArgs): void;
|
|
53
|
+
trace(...args: LogFnArgs): void;
|
|
54
|
+
silent(...args: LogFnArgs): void;
|
|
55
|
+
}
|
|
56
|
+
export declare const createBylineLogger: (deps: {
|
|
57
|
+
pinoLogger: PinoLogger;
|
|
58
|
+
}) => BylineLogger;
|
|
59
|
+
export declare function defineLogger(logger: BylineLogger): void;
|
|
60
|
+
export declare function getLogger(): BylineLogger;
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAA;AAMhD,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AA4BD,eAAO,MAAM,aAAa,kBAAyC,CAAA;AACnE,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,SAAS,UAAU,EAAE,IAAI,MAAM,CAAC,KAAG,CAEpE,CAAA;AAMD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAA;AAC9E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEpD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE7C,KAAK,SAAS,GACV,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,GACrC,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;AAEzD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IAC9C,KAAK,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IAC9B,IAAI,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IAC9B,KAAK,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IAC/B,MAAM,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;CACjC;AAWD,eAAO,MAAM,kBAAkB,GAAI,MAAM;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,KAAG,YAErE,CAAA;AAyDD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,QAEhD;AAED,wBAAgB,SAAS,IAAI,YAAY,CAQxC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*
|
|
8
|
+
* Structured logging for Byline CMS.
|
|
9
|
+
*
|
|
10
|
+
* ## Architecture
|
|
11
|
+
*
|
|
12
|
+
* This module defines two layers:
|
|
13
|
+
*
|
|
14
|
+
* 1. **Transport-agnostic interface** — `BylineLogger`, `LogLevel`, `LogData`,
|
|
15
|
+
* `LogContext`, `withLogContext`. These have zero dependency on any logging
|
|
16
|
+
* library. All consumer code (services, db adapters, route handlers, errors)
|
|
17
|
+
* depends only on this layer.
|
|
18
|
+
*
|
|
19
|
+
* 2. **Pino transport** — `createBylineLogger` + `BylineLoggerImpl`. This is
|
|
20
|
+
* the default implementation registered in the DI graph via `core.ts`. To
|
|
21
|
+
* swap transports (e.g. for Cloudflare Workers or edge runtimes), provide a
|
|
22
|
+
* different factory that produces a `BylineLogger` and register it in the
|
|
23
|
+
* Registry instead of `createBylineLogger`.
|
|
24
|
+
*
|
|
25
|
+
* Context propagation uses `AsyncLocalStorage` (Node/Bun/Deno/Workers) with a
|
|
26
|
+
* no-op fallback for environments that don't support it (browser bundles).
|
|
27
|
+
* When TC39 `AsyncContext` reaches Stage 3+, this can be swapped transparently.
|
|
28
|
+
*
|
|
29
|
+
* Primary access is via the typed Registry (see core.ts). A globalThis
|
|
30
|
+
* singleton (defineLogger / getLogger) provides an escape hatch for code
|
|
31
|
+
* outside the DI graph (e.g. API route handlers, db adapters).
|
|
32
|
+
*/
|
|
33
|
+
const noopStore = {
|
|
34
|
+
getStore: () => undefined,
|
|
35
|
+
run: (_store, fn) => fn(),
|
|
36
|
+
};
|
|
37
|
+
let logContextStore;
|
|
38
|
+
try {
|
|
39
|
+
const { AsyncLocalStorage } = await import('node:async_hooks');
|
|
40
|
+
logContextStore = new AsyncLocalStorage();
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
logContextStore = noopStore;
|
|
44
|
+
}
|
|
45
|
+
export const getLogContext = () => logContextStore.getStore() ?? {};
|
|
46
|
+
export const withLogContext = (context, fn) => {
|
|
47
|
+
return logContextStore.run({ ...getLogContext(), ...context }, fn);
|
|
48
|
+
};
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Pino transport (swappable — see module docblock)
|
|
51
|
+
//
|
|
52
|
+
// Everything below this line depends on pino. To use a different logging
|
|
53
|
+
// backend, replace `createBylineLogger` with a factory that accepts your
|
|
54
|
+
// transport and returns a `BylineLogger`. Register it in the DI graph
|
|
55
|
+
// (core.ts) instead of the default.
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
export const createBylineLogger = (deps) => {
|
|
58
|
+
return new BylineLoggerImpl(deps.pinoLogger);
|
|
59
|
+
};
|
|
60
|
+
class BylineLoggerImpl {
|
|
61
|
+
pinoLogger;
|
|
62
|
+
constructor(pinoLogger) {
|
|
63
|
+
this.pinoLogger = pinoLogger;
|
|
64
|
+
}
|
|
65
|
+
log(level, ...[first, second, ...rest]) {
|
|
66
|
+
if (typeof first === 'string') {
|
|
67
|
+
// args have shape [string, ...unknown[]]
|
|
68
|
+
this.pinoLogger[level](getLogContext(), first, second, ...rest);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// Treat err field specially if present. Other values, if present, go
|
|
72
|
+
// into extra.
|
|
73
|
+
const { err, ...data } = first;
|
|
74
|
+
const extra = Object.keys(data).length > 0 ? data : undefined;
|
|
75
|
+
if (typeof second === 'string') {
|
|
76
|
+
// args have shape [LogData, string, ...unknown[]]
|
|
77
|
+
this.pinoLogger[level]({ ...getLogContext(), extra, err }, second, ...rest);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// args have shape [LogData]
|
|
81
|
+
this.pinoLogger[level]({ ...getLogContext(), extra, err });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
fatal(...args) {
|
|
86
|
+
this.log('fatal', ...args);
|
|
87
|
+
}
|
|
88
|
+
error(...args) {
|
|
89
|
+
this.log('error', ...args);
|
|
90
|
+
}
|
|
91
|
+
warn(...args) {
|
|
92
|
+
this.log('warn', ...args);
|
|
93
|
+
}
|
|
94
|
+
info(...args) {
|
|
95
|
+
this.log('info', ...args);
|
|
96
|
+
}
|
|
97
|
+
debug(...args) {
|
|
98
|
+
this.log('debug', ...args);
|
|
99
|
+
}
|
|
100
|
+
trace(...args) {
|
|
101
|
+
this.log('trace', ...args);
|
|
102
|
+
}
|
|
103
|
+
silent(..._args) { }
|
|
104
|
+
}
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// Global escape hatch — same pattern as defineServerConfig / getServerConfig
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
const BYLINE_LOGGER = Symbol.for('__byline_logger__');
|
|
109
|
+
export function defineLogger(logger) {
|
|
110
|
+
;
|
|
111
|
+
globalThis[BYLINE_LOGGER] = logger;
|
|
112
|
+
}
|
|
113
|
+
export function getLogger() {
|
|
114
|
+
const logger = globalThis[BYLINE_LOGGER];
|
|
115
|
+
if (logger == null) {
|
|
116
|
+
throw new Error('Byline logger has not been initialized. Ensure initBylineCore() has been called.');
|
|
117
|
+
}
|
|
118
|
+
return logger;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*
|
|
8
|
+
* Typed dependency injection registry. Ported from the Modulus project
|
|
9
|
+
* (https://github.com/infonomic/modulus) with permission.
|
|
10
|
+
*
|
|
11
|
+
* Provides compile-time validation of dependency graphs via TypeScript
|
|
12
|
+
* conditional types. Services declare their dependencies via constructor
|
|
13
|
+
* or factory signatures; the registry validates that all requirements
|
|
14
|
+
* are satisfied before composition.
|
|
15
|
+
*/
|
|
16
|
+
type Token = string | symbol;
|
|
17
|
+
type Normalize<T> = T extends object ? {
|
|
18
|
+
[P in keyof T]: T[P];
|
|
19
|
+
} : never;
|
|
20
|
+
type Extend<TSource extends object, TName extends Token, TValue> = Normalize<Omit<TSource, TName> & {
|
|
21
|
+
[K in TName]: TValue;
|
|
22
|
+
}>;
|
|
23
|
+
type IsNever<T> = [T] extends [never] ? true : false;
|
|
24
|
+
type IsMergeable<T1, T2> = {
|
|
25
|
+
[K in keyof T1 & keyof T2]: IsNever<T1[K] & T2[K]> extends true ? false : true;
|
|
26
|
+
} extends Record<keyof T1 & keyof T2, true> ? true : false;
|
|
27
|
+
type ValidateDeps<TRequires, TProvides, TName, TDeps> = TName extends keyof TRequires ? {
|
|
28
|
+
error: 'Name conflict with prior requirement';
|
|
29
|
+
name: TName;
|
|
30
|
+
requirements: TRequires;
|
|
31
|
+
} : TName extends keyof TProvides ? {
|
|
32
|
+
error: 'Duplicate provider name';
|
|
33
|
+
name: TName;
|
|
34
|
+
} : Pick<TProvides, keyof TProvides & keyof TDeps> extends Pick<TDeps, keyof TProvides & keyof TDeps> ? IsMergeable<Pick<Omit<TDeps, keyof TProvides>, Extract<keyof TRequires, keyof Omit<TDeps, keyof TProvides>>>, Pick<TRequires, Extract<keyof TRequires, keyof Omit<TDeps, keyof TProvides>>>> extends true ? true : {
|
|
35
|
+
error: 'Dependency type conflicts with required type';
|
|
36
|
+
deps: TDeps;
|
|
37
|
+
requirements: TRequires;
|
|
38
|
+
} : {
|
|
39
|
+
error: 'Dependency type conflicts with provided type';
|
|
40
|
+
deps: TDeps;
|
|
41
|
+
provides: TProvides;
|
|
42
|
+
};
|
|
43
|
+
export declare class Registry<TRequires extends Record<Token, unknown> = {}, TProvides extends Record<Token, unknown> = {}> {
|
|
44
|
+
private readonly providers;
|
|
45
|
+
addClass<Name extends Token, TClass extends new (deps: any) => any, TValidation extends ValidateDeps<TRequires, TProvides, Name, ConstructorParameters<TClass>[0]> = ValidateDeps<TRequires, TProvides, Name, ConstructorParameters<TClass>[0]>>(name: Name, value: TValidation extends true ? TClass : TValidation): Registry<Normalize<TRequires & Omit<ConstructorParameters<TClass>[0], keyof TProvides>>, Extend<TProvides, Name, InstanceType<TClass>>>;
|
|
46
|
+
addFactory<Name extends Token, TFactory extends (deps: any) => any, TValidation extends ValidateDeps<TRequires, TProvides, Name, Parameters<TFactory>[0]> = ValidateDeps<TRequires, TProvides, Name, Parameters<TFactory>[0]>>(name: Name, value: TValidation extends true ? TFactory : TValidation): Registry<Normalize<TRequires & Omit<Parameters<TFactory>[0], keyof TProvides>>, Extend<TProvides, Name, ReturnType<TFactory>>>;
|
|
47
|
+
addValue<Name extends Token, TValue, TValidation extends ValidateDeps<TRequires, TProvides, Name, {}> = ValidateDeps<TRequires, TProvides, Name, {}>>(name: Name, value: TValidation extends true ? TValue : TValidation): Registry<TRequires, Extend<TProvides, Name, TValue>>;
|
|
48
|
+
addNested<Name extends Token, TNested extends Registry<any, any>, TValidation extends ValidateDeps<TRequires, TProvides, Name, TNested extends Registry<infer TNestedRequired, any> ? TNestedRequired : never> = ValidateDeps<TRequires, TProvides, Name, TNested extends Registry<infer TNestedRequired, any> ? TNestedRequired : never>>(name: Name, nested: TValidation extends true ? TNested : TValidation): TNested extends Registry<infer TNestedRequires, infer TNestedProvides> ? Registry<Normalize<TRequires & Omit<TNestedRequires, keyof TProvides>>, Extend<TProvides, Name, TNestedProvides>> : never;
|
|
49
|
+
compose(requirements: TRequires): Normalize<TProvides>;
|
|
50
|
+
}
|
|
51
|
+
export declare class AsyncRegistry<TRequires extends Record<Token, unknown> = {}, TProvides extends Record<Token, unknown> = {}> {
|
|
52
|
+
private readonly providers;
|
|
53
|
+
addClass<Name extends Token, TClass extends new (deps: any) => any, TValidation extends ValidateDeps<TRequires, TProvides, Name, ConstructorParameters<TClass>[0]> = ValidateDeps<TRequires, TProvides, Name, ConstructorParameters<TClass>[0]>>(name: Name, value: TValidation extends true ? TClass : TValidation): AsyncRegistry<Normalize<TRequires & Omit<ConstructorParameters<TClass>[0], keyof TProvides>>, Extend<TProvides, Name, InstanceType<TClass>>>;
|
|
54
|
+
addAsyncClass<Name extends Token, TClass extends {
|
|
55
|
+
create(deps: any): Promise<any>;
|
|
56
|
+
}, TValidation extends ValidateDeps<TRequires, TProvides, Name, Parameters<TClass['create']>[0]> = ValidateDeps<TRequires, TProvides, Name, Parameters<TClass['create']>[0]>>(name: Name, value: TValidation extends true ? TClass : TValidation): AsyncRegistry<Normalize<TRequires & Omit<Parameters<TClass['create']>[0], keyof TProvides>>, Extend<TProvides, Name, Awaited<ReturnType<TClass['create']>>>>;
|
|
57
|
+
addFactory<Name extends Token, TFactory extends (deps: any) => any, TValidation extends ValidateDeps<TRequires, TProvides, Name, Parameters<TFactory>[0]> = ValidateDeps<TRequires, TProvides, Name, Parameters<TFactory>[0]>>(name: Name, value: TValidation extends true ? TFactory : TValidation): AsyncRegistry<Normalize<TRequires & Omit<Parameters<TFactory>[0], keyof TProvides>>, Extend<TProvides, Name, Awaited<ReturnType<TFactory>>>>;
|
|
58
|
+
addValue<Name extends Token, TValue, TValidation extends ValidateDeps<TRequires, TProvides, Name, {}> = ValidateDeps<TRequires, TProvides, Name, {}>>(name: Name, value: TValidation extends true ? TValue : TValidation): AsyncRegistry<TRequires, Extend<TProvides, Name, Awaited<TValue>>>;
|
|
59
|
+
addNested<Name extends Token, TNested extends Registry<any, any>, TValidation extends ValidateDeps<TRequires, TProvides, Name, TNested extends Registry<infer TNestedRequired, any> ? TNestedRequired : never> = ValidateDeps<TRequires, TProvides, Name, TNested extends Registry<infer TNestedRequired, any> ? TNestedRequired : never>>(name: Name, nested: TValidation extends true ? TNested : TValidation): TNested extends Registry<infer TNestedRequires, infer TNestedProvides> ? AsyncRegistry<Normalize<TRequires & Omit<TNestedRequires, keyof TProvides>>, Extend<TProvides, Name, TNestedProvides>> : never;
|
|
60
|
+
addNestedAsync<Name extends Token, TNested extends AsyncRegistry<any, any>, TValidation extends ValidateDeps<TRequires, TProvides, Name, TNested extends AsyncRegistry<infer TNestedRequired, any> ? TNestedRequired : never> = ValidateDeps<TRequires, TProvides, Name, TNested extends AsyncRegistry<infer TNestedRequired, any> ? TNestedRequired : never>>(name: Name, nested: TValidation extends true ? TNested : TValidation): TNested extends AsyncRegistry<infer TNestedRequires, infer TNestedProvides> ? AsyncRegistry<Normalize<TRequires & Omit<TNestedRequires, keyof TProvides>>, Extend<TProvides, Name, TNestedProvides>> : never;
|
|
61
|
+
compose(requirements: TRequires): Promise<Normalize<TProvides>>;
|
|
62
|
+
}
|
|
63
|
+
export type RegisteredServices<TRegistry extends Registry<any, any> | AsyncRegistry<any, any>> = TRegistry extends Registry<any, infer TProvided> ? TProvided : TRegistry extends AsyncRegistry<any, infer TProvided> ? Normalize<TProvided> : never;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,KAAK,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAE5B,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,KAAK,CAAA;AAEvE,KAAK,MAAM,CAAC,OAAO,SAAS,MAAM,EAAE,KAAK,SAAS,KAAK,EAAE,MAAM,IAAI,SAAS,CAC1E,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG;KACpB,CAAC,IAAI,KAAK,GAAG,MAAM;CACrB,CACF,CAAA;AAQD,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,KAAK,CAAA;AAGpD,KAAK,WAAW,CAAC,EAAE,EAAE,EAAE,IACrB;KACG,CAAC,IAAI,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,KAAK,GAAG,IAAI;CAC/E,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,GACvC,IAAI,GACJ,KAAK,CAAA;AAEX,KAAK,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,IAElD,KAAK,SAAS,MAAM,SAAS,GAEzB;IACE,KAAK,EAAE,sCAAsC,CAAA;IAC7C,IAAI,EAAE,KAAK,CAAA;IACX,YAAY,EAAE,SAAS,CAAA;CACxB,GAGD,KAAK,SAAS,MAAM,SAAS,GAE3B;IAAE,KAAK,EAAE,yBAAyB,CAAC;IAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GAGjD,IAAI,CAAC,SAAS,EAAE,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,IAAI,CACvD,KAAK,EACL,MAAM,SAAS,GAAG,MAAM,KAAK,CAC9B,GAID,WAAW,CACT,IAAI,CACF,IAAI,CAAC,KAAK,EAAE,MAAM,SAAS,CAAC,EAC5B,OAAO,CAAC,MAAM,SAAS,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,SAAS,CAAC,CAAC,CAC7D,EACD,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,SAAS,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC,CAC9E,SAAS,IAAI,GAEZ,IAAI,GAEJ;IACE,KAAK,EAAE,8CAA8C,CAAA;IACrD,IAAI,EAAE,KAAK,CAAA;IACX,YAAY,EAAE,SAAS,CAAA;CACxB,GAEH;IACE,KAAK,EAAE,8CAA8C,CAAA;IACrD,IAAI,EAAE,KAAK,CAAA;IACX,QAAQ,EAAE,SAAS,CAAA;CACpB,CAAA;AAEX,qBAAa,QAAQ,CACnB,SAAS,SAAS,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,EAC7C,SAAS,SAAS,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE;IAE7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAE3C,QAAQ,CACN,IAAI,SAAS,KAAK,EAClB,MAAM,SAAS,KACb,IAAI,EAAE,GAAG,KACN,GAAG,EACR,WAAW,SAAS,YAAY,CAC9B,SAAS,EACT,SAAS,EACT,IAAI,EACJ,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CACjC,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAE9E,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,SAAS,IAAI,GAAG,MAAM,GAAG,WAAW,GACrD,QAAQ,CACT,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,SAAS,CAAC,CAAC,EAC9E,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAC9C;IASD,UAAU,CACR,IAAI,SAAS,KAAK,EAClB,QAAQ,SAAS,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,EACnC,WAAW,SAAS,YAAY,CAC9B,SAAS,EACT,SAAS,EACT,IAAI,EACJ,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CACxB,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAErE,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,SAAS,IAAI,GAAG,QAAQ,GAAG,WAAW,GACvD,QAAQ,CACT,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,SAAS,CAAC,CAAC,EACrE,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAC9C;IASD,QAAQ,CACN,IAAI,SAAS,KAAK,EAClB,MAAM,EACN,WAAW,SAAS,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,YAAY,CAC7E,SAAS,EACT,SAAS,EACT,IAAI,EACJ,EAAE,CACH,EAED,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,SAAS,IAAI,GAAG,MAAM,GAAG,WAAW,GACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IASvD,SAAS,CACP,IAAI,SAAS,KAAK,EAClB,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAClC,WAAW,SAAS,YAAY,CAC9B,SAAS,EACT,SAAS,EACT,IAAI,EACJ,OAAO,SAAS,QAAQ,CAAC,MAAM,eAAe,EAAE,GAAG,CAAC,GAAG,eAAe,GAAG,KAAK,CAC/E,GAAG,YAAY,CACd,SAAS,EACT,SAAS,EACT,IAAI,EACJ,OAAO,SAAS,QAAQ,CAAC,MAAM,eAAe,EAAE,GAAG,CAAC,GAAG,eAAe,GAAG,KAAK,CAC/E,EAED,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,WAAW,SAAS,IAAI,GAAG,OAAO,GAAG,WAAW,GACvD,OAAO,SAAS,QAAQ,CAAC,MAAM,eAAe,EAAE,MAAM,eAAe,CAAC,GACrE,QAAQ,CACN,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,SAAS,CAAC,CAAC,EAC7D,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,eAAe,CAAC,CACzC,GACD,KAAK;IAKT,OAAO,CAAC,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;CAmBvD;AAED,qBAAa,aAAa,CACxB,SAAS,SAAS,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,EAC7C,SAAS,SAAS,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE;IAE7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAE3C,QAAQ,CACN,IAAI,SAAS,KAAK,EAClB,MAAM,SAAS,KACb,IAAI,EAAE,GAAG,KACN,GAAG,EACR,WAAW,SAAS,YAAY,CAC9B,SAAS,EACT,SAAS,EACT,IAAI,EACJ,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CACjC,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAE9E,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,SAAS,IAAI,GAAG,MAAM,GAAG,WAAW,GACrD,aAAa,CACd,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,SAAS,CAAC,CAAC,EAC9E,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAC9C;IASD,aAAa,CACX,IAAI,SAAS,KAAK,EAClB,MAAM,SAAS;QAAE,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;KAAE,EAClD,WAAW,SAAS,YAAY,CAC9B,SAAS,EACT,SAAS,EACT,IAAI,EACJ,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAChC,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAE7E,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,SAAS,IAAI,GAAG,MAAM,GAAG,WAAW,GACrD,aAAa,CACd,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,SAAS,CAAC,CAAC,EAC7E,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAC/D;IASD,UAAU,CACR,IAAI,SAAS,KAAK,EAClB,QAAQ,SAAS,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,EACnC,WAAW,SAAS,YAAY,CAC9B,SAAS,EACT,SAAS,EACT,IAAI,EACJ,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CACxB,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAErE,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,SAAS,IAAI,GAAG,QAAQ,GAAG,WAAW,GACvD,aAAa,CACd,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,SAAS,CAAC,CAAC,EACrE,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CACvD;IASD,QAAQ,CACN,IAAI,SAAS,KAAK,EAClB,MAAM,EACN,WAAW,SAAS,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,YAAY,CAC7E,SAAS,EACT,SAAS,EACT,IAAI,EACJ,EAAE,CACH,EAED,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,WAAW,SAAS,IAAI,GAAG,MAAM,GAAG,WAAW,GACrD,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IASrE,SAAS,CACP,IAAI,SAAS,KAAK,EAClB,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAClC,WAAW,SAAS,YAAY,CAC9B,SAAS,EACT,SAAS,EACT,IAAI,EACJ,OAAO,SAAS,QAAQ,CAAC,MAAM,eAAe,EAAE,GAAG,CAAC,GAAG,eAAe,GAAG,KAAK,CAC/E,GAAG,YAAY,CACd,SAAS,EACT,SAAS,EACT,IAAI,EACJ,OAAO,SAAS,QAAQ,CAAC,MAAM,eAAe,EAAE,GAAG,CAAC,GAAG,eAAe,GAAG,KAAK,CAC/E,EAED,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,WAAW,SAAS,IAAI,GAAG,OAAO,GAAG,WAAW,GACvD,OAAO,SAAS,QAAQ,CAAC,MAAM,eAAe,EAAE,MAAM,eAAe,CAAC,GACrE,aAAa,CACX,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,SAAS,CAAC,CAAC,EAC7D,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,eAAe,CAAC,CACzC,GACD,KAAK;IAKT,cAAc,CACZ,IAAI,SAAS,KAAK,EAClB,OAAO,SAAS,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EACvC,WAAW,SAAS,YAAY,CAC9B,SAAS,EACT,SAAS,EACT,IAAI,EACJ,OAAO,SAAS,aAAa,CAAC,MAAM,eAAe,EAAE,GAAG,CAAC,GAAG,eAAe,GAAG,KAAK,CACpF,GAAG,YAAY,CACd,SAAS,EACT,SAAS,EACT,IAAI,EACJ,OAAO,SAAS,aAAa,CAAC,MAAM,eAAe,EAAE,GAAG,CAAC,GAAG,eAAe,GAAG,KAAK,CACpF,EAED,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,WAAW,SAAS,IAAI,GAAG,OAAO,GAAG,WAAW,GACvD,OAAO,SAAS,aAAa,CAAC,MAAM,eAAe,EAAE,MAAM,eAAe,CAAC,GAC1E,aAAa,CACX,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,SAAS,CAAC,CAAC,EAC7D,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,eAAe,CAAC,CACzC,GACD,KAAK;IAKH,OAAO,CAAC,YAAY,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;CAqBtE;AAED,MAAM,MAAM,kBAAkB,CAAC,SAAS,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,IAC3F,SAAS,SAAS,QAAQ,CAAC,GAAG,EAAE,MAAM,SAAS,CAAC,GAC5C,SAAS,GACT,SAAS,SAAS,aAAa,CAAC,GAAG,EAAE,MAAM,SAAS,CAAC,GACnD,SAAS,CAAC,SAAS,CAAC,GACpB,KAAK,CAAA"}
|