@modainteract/moda-interact-shared 0.1.0 → 0.3.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.
@@ -0,0 +1,303 @@
1
+ // src/shopify/constants.ts
2
+ var SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V1 = 1;
3
+ var SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2 = 2;
4
+ var SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION = SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V1;
5
+ var SHOPIFY_COMMERCE_EVENT_TYPES = {
6
+ CHECKOUT_OBSERVED: "checkout.observed",
7
+ ORDER_COMPLETED: "order.completed"
8
+ };
9
+ var SHOPIFY_RECOVERY_EVENT_TYPES_V2 = {
10
+ CHECKOUT_CREATED: "checkout.created",
11
+ CHECKOUT_UPDATED: "checkout.updated",
12
+ ORDER_COMPLETED: "order.completed"
13
+ };
14
+ var SHOPIFY_WEBHOOK_OUTBOX_DESTINATIONS = {
15
+ CHECKOUT_EVENTS: "CHECKOUT_EVENTS",
16
+ ORDER_EVENTS: "ORDER_EVENTS"
17
+ };
18
+
19
+ // src/shopify/common.schema.ts
20
+ import { z } from "zod";
21
+ var MAX_ID_LENGTH = 100;
22
+ var MAX_SHORT_TEXT_LENGTH = 320;
23
+ var MAX_TITLE_LENGTH = 500;
24
+ var MAX_URL_LENGTH = 2048;
25
+ var MAX_LINE_ITEMS = 250;
26
+ var decimalStringPattern = /^-?\d+(\.\d+)?$/;
27
+ var DecimalStringSchema = z.string().min(1).max(32).regex(decimalStringPattern, 'must be a decimal string, e.g. "12.34"');
28
+ var ShopifyTenantSchema = z.object({
29
+ shopId: z.string().min(1).max(MAX_ID_LENGTH),
30
+ shopDomain: z.string().min(1).max(MAX_SHORT_TEXT_LENGTH).toLowerCase().trim()
31
+ }).strict();
32
+ var ShopifyCustomerReferenceSchema = z.object({
33
+ shopifyCustomerId: z.string().min(1).max(MAX_ID_LENGTH).nullable(),
34
+ email: z.string().email().max(MAX_SHORT_TEXT_LENGTH).nullable(),
35
+ phone: z.string().min(1).max(64).nullable(),
36
+ firstName: z.string().min(1).max(MAX_TITLE_LENGTH).nullable(),
37
+ lastName: z.string().min(1).max(MAX_TITLE_LENGTH).nullable()
38
+ }).strict();
39
+ var ShopifyMoneySchema = z.object({
40
+ amount: DecimalStringSchema,
41
+ currencyCode: z.string().regex(/^[A-Z]{3}$/, "must be an uppercase three-letter currency code")
42
+ }).strict();
43
+ var ShopifyCheckoutLineItemSchema = z.object({
44
+ lineItemId: z.string().min(1).max(MAX_ID_LENGTH).nullable(),
45
+ variantId: z.string().min(1).max(MAX_ID_LENGTH).nullable(),
46
+ productId: z.string().min(1).max(MAX_ID_LENGTH).nullable(),
47
+ title: z.string().min(1).max(MAX_TITLE_LENGTH),
48
+ variantTitle: z.string().min(1).max(MAX_TITLE_LENGTH).nullable(),
49
+ quantity: z.number().int().positive(),
50
+ unitPrice: DecimalStringSchema.nullable(),
51
+ sku: z.string().min(1).max(MAX_ID_LENGTH).nullable()
52
+ }).strict();
53
+ var ShopifyCheckoutLineItemsSchema = z.array(ShopifyCheckoutLineItemSchema).max(MAX_LINE_ITEMS);
54
+
55
+ // src/shopify/v1/checkout-observed.schema.ts
56
+ import { z as z2 } from "zod";
57
+ var CheckoutObservedPayloadSchema = z2.object({
58
+ checkoutToken: z2.string().min(1),
59
+ cartToken: z2.string().min(1).nullable(),
60
+ checkoutUrl: z2.url().max(MAX_URL_LENGTH).nullable(),
61
+ customer: ShopifyCustomerReferenceSchema.nullable(),
62
+ total: ShopifyMoneySchema.nullable(),
63
+ lineItems: ShopifyCheckoutLineItemsSchema,
64
+ checkoutCreatedAt: z2.iso.datetime().nullable(),
65
+ checkoutUpdatedAt: z2.iso.datetime().nullable(),
66
+ completedAt: z2.iso.datetime().nullable()
67
+ }).strict();
68
+
69
+ // src/shopify/v1/order-completed.schema.ts
70
+ import { z as z3 } from "zod";
71
+ var OrderCompletedPayloadSchema = z3.object({
72
+ orderId: z3.string().min(1),
73
+ checkoutToken: z3.string().min(1).nullable(),
74
+ shopifyCustomerId: z3.string().min(1).nullable(),
75
+ total: ShopifyMoneySchema.nullable(),
76
+ completedAt: z3.iso.datetime()
77
+ }).strict();
78
+
79
+ // src/shopify/v1/commerce-event.schema.ts
80
+ import { z as z4 } from "zod";
81
+ var ShopifyCommerceEventBaseSchema = z4.object({
82
+ schemaVersion: z4.literal(SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION),
83
+ receiptId: z4.string().min(1),
84
+ deliveryId: z4.string().min(1),
85
+ eventId: z4.string().min(1).nullable(),
86
+ source: z4.literal("shopify"),
87
+ providerTopic: z4.string().min(1),
88
+ tenant: ShopifyTenantSchema,
89
+ occurredAt: z4.iso.datetime().nullable(),
90
+ receivedAt: z4.iso.datetime(),
91
+ traceId: z4.string().min(1),
92
+ orderingKey: z4.string().min(1)
93
+ });
94
+ var ShopifyCheckoutObservedEventSchema = ShopifyCommerceEventBaseSchema.extend({
95
+ eventType: z4.literal(SHOPIFY_COMMERCE_EVENT_TYPES.CHECKOUT_OBSERVED),
96
+ payload: CheckoutObservedPayloadSchema
97
+ }).strict();
98
+ var ShopifyOrderCompletedEventSchema = ShopifyCommerceEventBaseSchema.extend({
99
+ eventType: z4.literal(SHOPIFY_COMMERCE_EVENT_TYPES.ORDER_COMPLETED),
100
+ payload: OrderCompletedPayloadSchema
101
+ }).strict();
102
+ var ShopifyCommerceEventSchema = z4.discriminatedUnion("eventType", [
103
+ ShopifyCheckoutObservedEventSchema,
104
+ ShopifyOrderCompletedEventSchema
105
+ ]);
106
+ function parseShopifyCommerceEvent(input) {
107
+ return ShopifyCommerceEventSchema.parse(input);
108
+ }
109
+ function safeParseShopifyCommerceEvent(input) {
110
+ return ShopifyCommerceEventSchema.safeParse(input);
111
+ }
112
+ function isCheckoutObservedEvent(event) {
113
+ return event.eventType === SHOPIFY_COMMERCE_EVENT_TYPES.CHECKOUT_OBSERVED;
114
+ }
115
+ function isOrderCompletedEvent(event) {
116
+ return event.eventType === SHOPIFY_COMMERCE_EVENT_TYPES.ORDER_COMPLETED;
117
+ }
118
+ function createShopifyCommerceOrderingKey(shopId, checkoutToken) {
119
+ if (typeof shopId !== "string" || shopId.length === 0) {
120
+ throw new Error(
121
+ "createShopifyCommerceOrderingKey: shopId must be a non-empty string"
122
+ );
123
+ }
124
+ if (typeof checkoutToken !== "string" || checkoutToken.length === 0) {
125
+ throw new Error(
126
+ "createShopifyCommerceOrderingKey: checkoutToken must be a non-empty string"
127
+ );
128
+ }
129
+ return `${shopId}:${checkoutToken}`;
130
+ }
131
+ function createShopifyOrderOrderingKey(shopId, orderId) {
132
+ if (typeof shopId !== "string" || shopId.length === 0) {
133
+ throw new Error(
134
+ "createShopifyOrderOrderingKey: shopId must be a non-empty string"
135
+ );
136
+ }
137
+ if (typeof orderId !== "string" || orderId.length === 0) {
138
+ throw new Error(
139
+ "createShopifyOrderOrderingKey: orderId must be a non-empty string"
140
+ );
141
+ }
142
+ return `${shopId}:${orderId}`;
143
+ }
144
+
145
+ // src/shopify/v2/checkout-created.schema.ts
146
+ import { z as z5 } from "zod";
147
+ var CheckoutCreatedPayloadV2Schema = z5.object({
148
+ checkoutToken: z5.string().min(1),
149
+ cartToken: z5.string().min(1).nullable(),
150
+ abandonedCheckoutUrl: z5.url().max(MAX_URL_LENGTH).nullable(),
151
+ checkoutCreatedAt: z5.iso.datetime().nullable()
152
+ }).strict();
153
+
154
+ // src/shopify/v2/checkout-updated.schema.ts
155
+ import { z as z6 } from "zod";
156
+ var CheckoutUpdatedPayloadV2Schema = z6.object({
157
+ checkoutToken: z6.string().min(1)
158
+ }).strict();
159
+
160
+ // src/shopify/v2/order-completed.schema.ts
161
+ import { z as z7 } from "zod";
162
+ var OrderCompletedPayloadV2Schema = z7.object({
163
+ orderId: z7.string().min(1),
164
+ checkoutToken: z7.string().min(1).nullable(),
165
+ cartToken: z7.string().min(1).nullable(),
166
+ completedAt: z7.iso.datetime()
167
+ }).strict();
168
+
169
+ // src/shopify/v2/recovery-event.schema.ts
170
+ import { z as z8 } from "zod";
171
+ var ShopifyRecoveryEventBaseV2Schema = z8.object({
172
+ schemaVersion: z8.literal(SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2),
173
+ receiptId: z8.string().min(1),
174
+ deliveryId: z8.string().min(1),
175
+ eventId: z8.string().min(1).nullable(),
176
+ source: z8.literal("shopify"),
177
+ providerTopic: z8.string().min(1),
178
+ tenant: ShopifyTenantSchema,
179
+ occurredAt: z8.iso.datetime().nullable(),
180
+ receivedAt: z8.iso.datetime(),
181
+ traceId: z8.string().min(1),
182
+ orderingKey: z8.string().min(1)
183
+ }).strict();
184
+ var ShopifyCheckoutCreatedEventV2Schema = ShopifyRecoveryEventBaseV2Schema.extend({
185
+ eventType: z8.literal(SHOPIFY_RECOVERY_EVENT_TYPES_V2.CHECKOUT_CREATED),
186
+ payload: CheckoutCreatedPayloadV2Schema
187
+ }).strict();
188
+ var ShopifyCheckoutUpdatedEventV2Schema = ShopifyRecoveryEventBaseV2Schema.extend({
189
+ eventType: z8.literal(SHOPIFY_RECOVERY_EVENT_TYPES_V2.CHECKOUT_UPDATED),
190
+ payload: CheckoutUpdatedPayloadV2Schema
191
+ }).strict();
192
+ var ShopifyOrderCompletedEventV2Schema = ShopifyRecoveryEventBaseV2Schema.extend({
193
+ eventType: z8.literal(SHOPIFY_RECOVERY_EVENT_TYPES_V2.ORDER_COMPLETED),
194
+ payload: OrderCompletedPayloadV2Schema
195
+ }).strict();
196
+ var ShopifyRecoveryEventV2Schema = z8.discriminatedUnion("eventType", [
197
+ ShopifyCheckoutCreatedEventV2Schema,
198
+ ShopifyCheckoutUpdatedEventV2Schema,
199
+ ShopifyOrderCompletedEventV2Schema
200
+ ]);
201
+ function parseShopifyRecoveryEventV2(input) {
202
+ return ShopifyRecoveryEventV2Schema.parse(input);
203
+ }
204
+ function safeParseShopifyRecoveryEventV2(input) {
205
+ return ShopifyRecoveryEventV2Schema.safeParse(input);
206
+ }
207
+ function isCheckoutCreatedEventV2(event) {
208
+ return event.eventType === SHOPIFY_RECOVERY_EVENT_TYPES_V2.CHECKOUT_CREATED;
209
+ }
210
+ function isCheckoutUpdatedEventV2(event) {
211
+ return event.eventType === SHOPIFY_RECOVERY_EVENT_TYPES_V2.CHECKOUT_UPDATED;
212
+ }
213
+ function isOrderCompletedEventV2(event) {
214
+ return event.eventType === SHOPIFY_RECOVERY_EVENT_TYPES_V2.ORDER_COMPLETED;
215
+ }
216
+ function createShopifyPendingRecoveryOrderingKey(shopId, checkoutToken) {
217
+ if (typeof shopId !== "string" || shopId.length === 0) {
218
+ throw new Error(
219
+ "createShopifyPendingRecoveryOrderingKey: shopId must be a non-empty string"
220
+ );
221
+ }
222
+ if (typeof checkoutToken !== "string" || checkoutToken.length === 0) {
223
+ throw new Error(
224
+ "createShopifyPendingRecoveryOrderingKey: checkoutToken must be a non-empty string"
225
+ );
226
+ }
227
+ return `${shopId}:${checkoutToken}`;
228
+ }
229
+ function createShopifyOrderCorrelationOrderingKey(input) {
230
+ if (input.checkoutToken) {
231
+ return createShopifyPendingRecoveryOrderingKey(input.shopId, input.checkoutToken);
232
+ }
233
+ if (typeof input.orderId !== "string" || input.orderId.length === 0) {
234
+ throw new Error(
235
+ "createShopifyOrderCorrelationOrderingKey: orderId must be a non-empty string"
236
+ );
237
+ }
238
+ if (typeof input.shopId !== "string" || input.shopId.length === 0) {
239
+ throw new Error(
240
+ "createShopifyOrderCorrelationOrderingKey: shopId must be a non-empty string"
241
+ );
242
+ }
243
+ return `${input.shopId}:${input.orderId}`;
244
+ }
245
+
246
+ // src/shopify/queue-contracts.ts
247
+ var SHOPIFY_WEBHOOK_QUEUE_CONTRACTS = {
248
+ CHECKOUT_EVENTS: {
249
+ queueName: "checkout-events",
250
+ jobName: "checkout-created"
251
+ },
252
+ CHECKOUT_UPDATED_EVENTS: {
253
+ queueName: "checkout-events",
254
+ jobName: "checkout-updated"
255
+ },
256
+ ORDER_EVENTS: {
257
+ queueName: "order-events",
258
+ jobName: "order-completed"
259
+ }
260
+ };
261
+
262
+ export {
263
+ SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V1,
264
+ SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2,
265
+ SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION,
266
+ SHOPIFY_COMMERCE_EVENT_TYPES,
267
+ SHOPIFY_RECOVERY_EVENT_TYPES_V2,
268
+ SHOPIFY_WEBHOOK_OUTBOX_DESTINATIONS,
269
+ MAX_URL_LENGTH,
270
+ MAX_LINE_ITEMS,
271
+ ShopifyTenantSchema,
272
+ ShopifyCustomerReferenceSchema,
273
+ ShopifyMoneySchema,
274
+ ShopifyCheckoutLineItemSchema,
275
+ ShopifyCheckoutLineItemsSchema,
276
+ CheckoutObservedPayloadSchema,
277
+ OrderCompletedPayloadSchema,
278
+ ShopifyCheckoutObservedEventSchema,
279
+ ShopifyOrderCompletedEventSchema,
280
+ ShopifyCommerceEventSchema,
281
+ parseShopifyCommerceEvent,
282
+ safeParseShopifyCommerceEvent,
283
+ isCheckoutObservedEvent,
284
+ isOrderCompletedEvent,
285
+ createShopifyCommerceOrderingKey,
286
+ createShopifyOrderOrderingKey,
287
+ CheckoutCreatedPayloadV2Schema,
288
+ CheckoutUpdatedPayloadV2Schema,
289
+ OrderCompletedPayloadV2Schema,
290
+ ShopifyCheckoutCreatedEventV2Schema,
291
+ ShopifyCheckoutUpdatedEventV2Schema,
292
+ ShopifyOrderCompletedEventV2Schema,
293
+ ShopifyRecoveryEventV2Schema,
294
+ parseShopifyRecoveryEventV2,
295
+ safeParseShopifyRecoveryEventV2,
296
+ isCheckoutCreatedEventV2,
297
+ isCheckoutUpdatedEventV2,
298
+ isOrderCompletedEventV2,
299
+ createShopifyPendingRecoveryOrderingKey,
300
+ createShopifyOrderCorrelationOrderingKey,
301
+ SHOPIFY_WEBHOOK_QUEUE_CONTRACTS
302
+ };
303
+ //# sourceMappingURL=chunk-T6DNWLWW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shopify/constants.ts","../src/shopify/common.schema.ts","../src/shopify/v1/checkout-observed.schema.ts","../src/shopify/v1/order-completed.schema.ts","../src/shopify/v1/commerce-event.schema.ts","../src/shopify/v2/checkout-created.schema.ts","../src/shopify/v2/checkout-updated.schema.ts","../src/shopify/v2/order-completed.schema.ts","../src/shopify/v2/recovery-event.schema.ts","../src/shopify/queue-contracts.ts"],"sourcesContent":["export const SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V1 = 1 as const;\nexport const SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2 = 2 as const;\n\n// Backward-compatible alias for existing v1 callers.\nexport const SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION =\n SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V1;\n\nexport const SHOPIFY_COMMERCE_EVENT_TYPES = {\n CHECKOUT_OBSERVED: \"checkout.observed\",\n ORDER_COMPLETED: \"order.completed\",\n} as const;\n\nexport const SHOPIFY_RECOVERY_EVENT_TYPES_V2 = {\n CHECKOUT_CREATED: \"checkout.created\",\n CHECKOUT_UPDATED: \"checkout.updated\",\n ORDER_COMPLETED: \"order.completed\",\n} as const;\n\nexport const SHOPIFY_WEBHOOK_OUTBOX_DESTINATIONS = {\n CHECKOUT_EVENTS: \"CHECKOUT_EVENTS\",\n ORDER_EVENTS: \"ORDER_EVENTS\",\n} as const;\n","import { z } from \"zod\";\n\n/**\n * Reasonable upper bounds for externally controlled (Shopify-originated) strings.\n * These exist to keep queue messages small and predictable, not to validate business rules.\n */\nconst MAX_ID_LENGTH = 100;\nconst MAX_SHORT_TEXT_LENGTH = 320;\nconst MAX_TITLE_LENGTH = 500;\nconst MAX_URL_LENGTH = 2048;\nconst MAX_LINE_ITEMS = 250;\n\nconst decimalStringPattern = /^-?\\d+(\\.\\d+)?$/;\n\n/** Decimal amount encoded as a string; never a JS number to avoid float precision loss. */\nconst DecimalStringSchema = z\n .string()\n .min(1)\n .max(32)\n .regex(decimalStringPattern, \"must be a decimal string, e.g. \\\"12.34\\\"\");\n\nexport const ShopifyTenantSchema = z\n .object({\n shopId: z.string().min(1).max(MAX_ID_LENGTH),\n shopDomain: z\n .string()\n .min(1)\n .max(MAX_SHORT_TEXT_LENGTH)\n .toLowerCase()\n .trim(),\n })\n .strict();\n\nexport type ShopifyTenant = z.infer<typeof ShopifyTenantSchema>;\n\nexport const ShopifyCustomerReferenceSchema = z\n .object({\n shopifyCustomerId: z.string().min(1).max(MAX_ID_LENGTH).nullable(),\n email: z.string().email().max(MAX_SHORT_TEXT_LENGTH).nullable(),\n phone: z.string().min(1).max(64).nullable(),\n firstName: z.string().min(1).max(MAX_TITLE_LENGTH).nullable(),\n lastName: z.string().min(1).max(MAX_TITLE_LENGTH).nullable(),\n })\n .strict();\n\nexport type ShopifyCustomerReference = z.infer<typeof ShopifyCustomerReferenceSchema>;\n\nexport const ShopifyMoneySchema = z\n .object({\n amount: DecimalStringSchema,\n currencyCode: z\n .string()\n .regex(/^[A-Z]{3}$/, \"must be an uppercase three-letter currency code\"),\n })\n .strict();\n\nexport type ShopifyMoney = z.infer<typeof ShopifyMoneySchema>;\n\n/**\n * Fields limited to what checkout recovery and customer-facing basket context require.\n * Line-item arrays are bounded (see MAX_LINE_ITEMS) to prevent unexpectedly large queue messages.\n */\nexport const ShopifyCheckoutLineItemSchema = z\n .object({\n lineItemId: z.string().min(1).max(MAX_ID_LENGTH).nullable(),\n variantId: z.string().min(1).max(MAX_ID_LENGTH).nullable(),\n productId: z.string().min(1).max(MAX_ID_LENGTH).nullable(),\n title: z.string().min(1).max(MAX_TITLE_LENGTH),\n variantTitle: z.string().min(1).max(MAX_TITLE_LENGTH).nullable(),\n quantity: z.number().int().positive(),\n unitPrice: DecimalStringSchema.nullable(),\n sku: z.string().min(1).max(MAX_ID_LENGTH).nullable(),\n })\n .strict();\n\nexport type ShopifyCheckoutLineItem = z.infer<typeof ShopifyCheckoutLineItemSchema>;\n\nexport const ShopifyCheckoutLineItemsSchema = z\n .array(ShopifyCheckoutLineItemSchema)\n .max(MAX_LINE_ITEMS);\n\nexport { MAX_URL_LENGTH, MAX_LINE_ITEMS };\n","import { z } from \"zod\";\nimport {\n MAX_URL_LENGTH,\n ShopifyCheckoutLineItemsSchema,\n ShopifyCustomerReferenceSchema,\n ShopifyMoneySchema,\n} from \"../common.schema.js\";\n\nexport const CheckoutObservedPayloadSchema = z\n .object({\n checkoutToken: z.string().min(1),\n cartToken: z.string().min(1).nullable(),\n checkoutUrl: z.url().max(MAX_URL_LENGTH).nullable(),\n customer: ShopifyCustomerReferenceSchema.nullable(),\n total: ShopifyMoneySchema.nullable(),\n lineItems: ShopifyCheckoutLineItemsSchema,\n checkoutCreatedAt: z.iso.datetime().nullable(),\n checkoutUpdatedAt: z.iso.datetime().nullable(),\n completedAt: z.iso.datetime().nullable(),\n })\n .strict();\n\nexport type CheckoutObservedPayload = z.infer<typeof CheckoutObservedPayloadSchema>;\n","import { z } from \"zod\";\nimport { ShopifyMoneySchema } from \"../common.schema.js\";\n\nexport const OrderCompletedPayloadSchema = z\n .object({\n orderId: z.string().min(1),\n checkoutToken: z.string().min(1).nullable(),\n shopifyCustomerId: z.string().min(1).nullable(),\n total: ShopifyMoneySchema.nullable(),\n completedAt: z.iso.datetime(),\n })\n .strict();\n\nexport type OrderCompletedPayload = z.infer<typeof OrderCompletedPayloadSchema>;\n","import { z } from \"zod\";\nimport {\n SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION,\n SHOPIFY_COMMERCE_EVENT_TYPES,\n} from \"../constants.js\";\nimport { ShopifyTenantSchema } from \"../common.schema.js\";\nimport { CheckoutObservedPayloadSchema } from \"./checkout-observed.schema.js\";\nimport { OrderCompletedPayloadSchema } from \"./order-completed.schema.js\";\n\nconst ShopifyCommerceEventBaseSchema = z.object({\n schemaVersion: z.literal(SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION),\n receiptId: z.string().min(1),\n deliveryId: z.string().min(1),\n eventId: z.string().min(1).nullable(),\n source: z.literal(\"shopify\"),\n providerTopic: z.string().min(1),\n tenant: ShopifyTenantSchema,\n occurredAt: z.iso.datetime().nullable(),\n receivedAt: z.iso.datetime(),\n traceId: z.string().min(1),\n orderingKey: z.string().min(1),\n});\n\nexport const ShopifyCheckoutObservedEventSchema = ShopifyCommerceEventBaseSchema.extend({\n eventType: z.literal(SHOPIFY_COMMERCE_EVENT_TYPES.CHECKOUT_OBSERVED),\n payload: CheckoutObservedPayloadSchema,\n}).strict();\n\nexport type ShopifyCheckoutObservedEvent = z.infer<\n typeof ShopifyCheckoutObservedEventSchema\n>;\n\nexport const ShopifyOrderCompletedEventSchema = ShopifyCommerceEventBaseSchema.extend({\n eventType: z.literal(SHOPIFY_COMMERCE_EVENT_TYPES.ORDER_COMPLETED),\n payload: OrderCompletedPayloadSchema,\n}).strict();\n\nexport type ShopifyOrderCompletedEvent = z.infer<\n typeof ShopifyOrderCompletedEventSchema\n>;\n\nexport const ShopifyCommerceEventSchema = z.discriminatedUnion(\"eventType\", [\n ShopifyCheckoutObservedEventSchema,\n ShopifyOrderCompletedEventSchema,\n]);\n\nexport type ShopifyCommerceEvent = z.infer<typeof ShopifyCommerceEventSchema>;\nexport type ShopifyCommerceEventType = ShopifyCommerceEvent[\"eventType\"];\n\nexport function parseShopifyCommerceEvent(input: unknown): ShopifyCommerceEvent {\n return ShopifyCommerceEventSchema.parse(input);\n}\n\nexport function safeParseShopifyCommerceEvent(input: unknown) {\n return ShopifyCommerceEventSchema.safeParse(input);\n}\n\nexport function isCheckoutObservedEvent(\n event: ShopifyCommerceEvent,\n): event is ShopifyCheckoutObservedEvent {\n return event.eventType === SHOPIFY_COMMERCE_EVENT_TYPES.CHECKOUT_OBSERVED;\n}\n\nexport function isOrderCompletedEvent(\n event: ShopifyCommerceEvent,\n): event is ShopifyOrderCompletedEvent {\n return event.eventType === SHOPIFY_COMMERCE_EVENT_TYPES.ORDER_COMPLETED;\n}\n\n/**\n * Stable ordering key for a shop/checkout pair.\n * Checkout and order events for the same checkout must share this key, so\n * deliveryId is intentionally excluded.\n */\nexport function createShopifyCommerceOrderingKey(\n shopId: string,\n checkoutToken: string,\n): string {\n if (typeof shopId !== \"string\" || shopId.length === 0) {\n throw new Error(\n \"createShopifyCommerceOrderingKey: shopId must be a non-empty string\",\n );\n }\n\n if (typeof checkoutToken !== \"string\" || checkoutToken.length === 0) {\n throw new Error(\n \"createShopifyCommerceOrderingKey: checkoutToken must be a non-empty string\",\n );\n }\n\n return `${shopId}:${checkoutToken}`;\n}\n\nexport function createShopifyOrderOrderingKey(\n shopId: string,\n orderId: string,\n): string {\n if (typeof shopId !== \"string\" || shopId.length === 0) {\n throw new Error(\n \"createShopifyOrderOrderingKey: shopId must be a non-empty string\",\n );\n }\n\n if (typeof orderId !== \"string\" || orderId.length === 0) {\n throw new Error(\n \"createShopifyOrderOrderingKey: orderId must be a non-empty string\",\n );\n }\n\n return `${shopId}:${orderId}`;\n}","import { z } from \"zod\";\nimport { MAX_URL_LENGTH } from \"../common.schema.js\";\n\nexport const CheckoutCreatedPayloadV2Schema = z\n .object({\n checkoutToken: z.string().min(1),\n cartToken: z.string().min(1).nullable(),\n abandonedCheckoutUrl: z.url().max(MAX_URL_LENGTH).nullable(),\n checkoutCreatedAt: z.iso.datetime().nullable(),\n })\n .strict();\n\nexport type CheckoutCreatedPayloadV2 = z.infer<\n typeof CheckoutCreatedPayloadV2Schema\n>;\n","import { z } from \"zod\";\n\nexport const CheckoutUpdatedPayloadV2Schema = z\n .object({\n checkoutToken: z.string().min(1),\n })\n .strict();\n\nexport type CheckoutUpdatedPayloadV2 = z.infer<\n typeof CheckoutUpdatedPayloadV2Schema\n>;\n","import { z } from \"zod\";\n\nexport const OrderCompletedPayloadV2Schema = z\n .object({\n orderId: z.string().min(1),\n checkoutToken: z.string().min(1).nullable(),\n cartToken: z.string().min(1).nullable(),\n completedAt: z.iso.datetime(),\n })\n .strict();\n\nexport type OrderCompletedPayloadV2 = z.infer<typeof OrderCompletedPayloadV2Schema>;\n","import { z } from \"zod\";\nimport {\n SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2,\n SHOPIFY_RECOVERY_EVENT_TYPES_V2,\n} from \"../constants.js\";\nimport { ShopifyTenantSchema } from \"../common.schema.js\";\nimport { CheckoutCreatedPayloadV2Schema } from \"./checkout-created.schema.js\";\nimport { CheckoutUpdatedPayloadV2Schema } from \"./checkout-updated.schema.js\";\nimport { OrderCompletedPayloadV2Schema } from \"./order-completed.schema.js\";\n\nconst ShopifyRecoveryEventBaseV2Schema = z\n .object({\n schemaVersion: z.literal(SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2),\n receiptId: z.string().min(1),\n deliveryId: z.string().min(1),\n eventId: z.string().min(1).nullable(),\n source: z.literal(\"shopify\"),\n providerTopic: z.string().min(1),\n tenant: ShopifyTenantSchema,\n occurredAt: z.iso.datetime().nullable(),\n receivedAt: z.iso.datetime(),\n traceId: z.string().min(1),\n orderingKey: z.string().min(1),\n })\n .strict();\n\nexport const ShopifyCheckoutCreatedEventV2Schema =\n ShopifyRecoveryEventBaseV2Schema.extend({\n eventType: z.literal(SHOPIFY_RECOVERY_EVENT_TYPES_V2.CHECKOUT_CREATED),\n payload: CheckoutCreatedPayloadV2Schema,\n }).strict();\n\nexport type ShopifyCheckoutCreatedEventV2 = z.infer<\n typeof ShopifyCheckoutCreatedEventV2Schema\n>;\n\nexport const ShopifyCheckoutUpdatedEventV2Schema =\n ShopifyRecoveryEventBaseV2Schema.extend({\n eventType: z.literal(SHOPIFY_RECOVERY_EVENT_TYPES_V2.CHECKOUT_UPDATED),\n payload: CheckoutUpdatedPayloadV2Schema,\n }).strict();\n\nexport type ShopifyCheckoutUpdatedEventV2 = z.infer<\n typeof ShopifyCheckoutUpdatedEventV2Schema\n>;\n\nexport const ShopifyOrderCompletedEventV2Schema =\n ShopifyRecoveryEventBaseV2Schema.extend({\n eventType: z.literal(SHOPIFY_RECOVERY_EVENT_TYPES_V2.ORDER_COMPLETED),\n payload: OrderCompletedPayloadV2Schema,\n }).strict();\n\nexport type ShopifyOrderCompletedEventV2 = z.infer<\n typeof ShopifyOrderCompletedEventV2Schema\n>;\n\nexport const ShopifyRecoveryEventV2Schema = z.discriminatedUnion(\"eventType\", [\n ShopifyCheckoutCreatedEventV2Schema,\n ShopifyCheckoutUpdatedEventV2Schema,\n ShopifyOrderCompletedEventV2Schema,\n]);\n\nexport type ShopifyRecoveryEventV2 = z.infer<typeof ShopifyRecoveryEventV2Schema>;\nexport type ShopifyRecoveryEventTypeV2 = ShopifyRecoveryEventV2[\"eventType\"];\n\nexport function parseShopifyRecoveryEventV2(input: unknown): ShopifyRecoveryEventV2 {\n return ShopifyRecoveryEventV2Schema.parse(input);\n}\n\nexport function safeParseShopifyRecoveryEventV2(input: unknown) {\n return ShopifyRecoveryEventV2Schema.safeParse(input);\n}\n\nexport function isCheckoutCreatedEventV2(\n event: ShopifyRecoveryEventV2,\n): event is ShopifyCheckoutCreatedEventV2 {\n return event.eventType === SHOPIFY_RECOVERY_EVENT_TYPES_V2.CHECKOUT_CREATED;\n}\n\nexport function isCheckoutUpdatedEventV2(\n event: ShopifyRecoveryEventV2,\n): event is ShopifyCheckoutUpdatedEventV2 {\n return event.eventType === SHOPIFY_RECOVERY_EVENT_TYPES_V2.CHECKOUT_UPDATED;\n}\n\nexport function isOrderCompletedEventV2(\n event: ShopifyRecoveryEventV2,\n): event is ShopifyOrderCompletedEventV2 {\n return event.eventType === SHOPIFY_RECOVERY_EVENT_TYPES_V2.ORDER_COMPLETED;\n}\n\nexport function createShopifyPendingRecoveryOrderingKey(\n shopId: string,\n checkoutToken: string,\n): string {\n if (typeof shopId !== \"string\" || shopId.length === 0) {\n throw new Error(\n \"createShopifyPendingRecoveryOrderingKey: shopId must be a non-empty string\",\n );\n }\n\n if (typeof checkoutToken !== \"string\" || checkoutToken.length === 0) {\n throw new Error(\n \"createShopifyPendingRecoveryOrderingKey: checkoutToken must be a non-empty string\",\n );\n }\n\n return `${shopId}:${checkoutToken}`;\n}\n\nexport function createShopifyOrderCorrelationOrderingKey(input: {\n shopId: string;\n orderId: string;\n checkoutToken: string | null;\n}): string {\n if (input.checkoutToken) {\n return createShopifyPendingRecoveryOrderingKey(input.shopId, input.checkoutToken);\n }\n\n if (typeof input.orderId !== \"string\" || input.orderId.length === 0) {\n throw new Error(\n \"createShopifyOrderCorrelationOrderingKey: orderId must be a non-empty string\",\n );\n }\n\n if (typeof input.shopId !== \"string\" || input.shopId.length === 0) {\n throw new Error(\n \"createShopifyOrderCorrelationOrderingKey: shopId must be a non-empty string\",\n );\n }\n\n return `${input.shopId}:${input.orderId}`;\n}\n","export const SHOPIFY_WEBHOOK_QUEUE_CONTRACTS = {\n CHECKOUT_EVENTS: {\n queueName: \"checkout-events\",\n jobName: \"checkout-created\",\n },\n CHECKOUT_UPDATED_EVENTS: {\n queueName: \"checkout-events\",\n jobName: \"checkout-updated\",\n },\n ORDER_EVENTS: {\n queueName: \"order-events\",\n jobName: \"order-completed\",\n },\n} as const;\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","z"]}
@@ -0,0 +1,27 @@
1
+ // src/logging/loki.ts
2
+ function globalState() {
3
+ return globalThis;
4
+ }
5
+ function setLokiLogEmitter(emitter) {
6
+ try {
7
+ const state = globalState();
8
+ if (emitter) {
9
+ state.__modaInteractLokiLogEmitterV1 = emitter;
10
+ } else {
11
+ delete state.__modaInteractLokiLogEmitterV1;
12
+ }
13
+ } catch {
14
+ }
15
+ }
16
+ function emitLokiLog(record) {
17
+ try {
18
+ globalState().__modaInteractLokiLogEmitterV1?.(record);
19
+ } catch {
20
+ }
21
+ }
22
+
23
+ export {
24
+ setLokiLogEmitter,
25
+ emitLokiLog
26
+ };
27
+ //# sourceMappingURL=chunk-XU4XX7SD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/logging/loki.ts"],"sourcesContent":["import type { LogRecord } from \"./types.js\";\n\nexport type LokiLogEmitter = (record: LogRecord) => void;\n\ntype ModaLoggingGlobal = typeof globalThis & {\n __modaInteractLokiLogEmitterV1?: LokiLogEmitter;\n};\n\nfunction globalState(): ModaLoggingGlobal {\n return globalThis as ModaLoggingGlobal;\n}\n\n/**\n * Installs/removes the Node-owned direct Loki emitter.\n *\n * This bridge deliberately contains no Winston, Loki or Node networking\n * imports so it remains safe inside the normal ./logging entry.\n *\n * globalThis is required because tsup emits ./logging and ./logging/node as\n * independent bundles. A module-local variable would not be shared between\n * those package entry points.\n */\nexport function setLokiLogEmitter(emitter: LokiLogEmitter | null): void {\n try {\n const state = globalState();\n\n if (emitter) {\n state.__modaInteractLokiLogEmitterV1 = emitter;\n } else {\n delete state.__modaInteractLokiLogEmitterV1;\n }\n } catch {\n // Logging configuration must never become a correctness dependency.\n }\n}\n\n/**\n * Sends an already-sanitized canonical Moda log record to the optional Loki\n * emitter installed by ./logging/node.\n */\nexport function emitLokiLog(record: LogRecord): void {\n try {\n globalState().__modaInteractLokiLogEmitterV1?.(record);\n } catch {\n // Direct Loki delivery is always best-effort.\n }\n}\n"],"mappings":";AAQA,SAAS,cAAiC;AACxC,SAAO;AACT;AAYO,SAAS,kBAAkB,SAAsC;AACtE,MAAI;AACF,UAAM,QAAQ,YAAY;AAE1B,QAAI,SAAS;AACX,YAAM,iCAAiC;AAAA,IACzC,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAMO,SAAS,YAAY,QAAyB;AACnD,MAAI;AACF,gBAAY,EAAE,iCAAiC,MAAM;AAAA,EACvD,QAAQ;AAAA,EAER;AACF;","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { CheckoutObservedPayload, CheckoutObservedPayloadSchema, MAX_LINE_ITEMS, MAX_URL_LENGTH, OrderCompletedPayload, OrderCompletedPayloadSchema, SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION, SHOPIFY_COMMERCE_EVENT_TYPES, SHOPIFY_COMMERCE_JOB, SHOPIFY_COMMERCE_QUEUE, ShopifyCheckoutLineItem, ShopifyCheckoutLineItemSchema, ShopifyCheckoutLineItemsSchema, ShopifyCheckoutObservedEvent, ShopifyCheckoutObservedEventSchema, ShopifyCommerceEvent, ShopifyCommerceEventSchema, ShopifyCommerceEventType, ShopifyCustomerReference, ShopifyCustomerReferenceSchema, ShopifyMoney, ShopifyMoneySchema, ShopifyOrderCompletedEvent, ShopifyOrderCompletedEventSchema, ShopifyTenant, ShopifyTenantSchema, createShopifyCommerceOrderingKey, isCheckoutObservedEvent, isOrderCompletedEvent, parseShopifyCommerceEvent, safeParseShopifyCommerceEvent } from './shopify/index.js';
1
+ export { CheckoutCreatedPayloadV2, CheckoutCreatedPayloadV2Schema, CheckoutObservedPayload, CheckoutObservedPayloadSchema, CheckoutUpdatedPayloadV2, CheckoutUpdatedPayloadV2Schema, MAX_LINE_ITEMS, MAX_URL_LENGTH, OrderCompletedPayload, OrderCompletedPayloadSchema, OrderCompletedPayloadV2, OrderCompletedPayloadV2Schema, SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION, SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V1, SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2, SHOPIFY_COMMERCE_EVENT_TYPES, SHOPIFY_RECOVERY_EVENT_TYPES_V2, SHOPIFY_WEBHOOK_OUTBOX_DESTINATIONS, SHOPIFY_WEBHOOK_QUEUE_CONTRACTS, ShopifyCheckoutCreatedEventV2, ShopifyCheckoutCreatedEventV2Schema, ShopifyCheckoutLineItem, ShopifyCheckoutLineItemSchema, ShopifyCheckoutLineItemsSchema, ShopifyCheckoutObservedEvent, ShopifyCheckoutObservedEventSchema, ShopifyCheckoutUpdatedEventV2, ShopifyCheckoutUpdatedEventV2Schema, ShopifyCommerceEvent, ShopifyCommerceEventSchema, ShopifyCommerceEventType, ShopifyCustomerReference, ShopifyCustomerReferenceSchema, ShopifyMoney, ShopifyMoneySchema, ShopifyOrderCompletedEvent, ShopifyOrderCompletedEventSchema, ShopifyOrderCompletedEventV2, ShopifyOrderCompletedEventV2Schema, ShopifyRecoveryEventTypeV2, ShopifyRecoveryEventV2, ShopifyRecoveryEventV2Schema, ShopifyTenant, ShopifyTenantSchema, createShopifyCommerceOrderingKey, createShopifyOrderCorrelationOrderingKey, createShopifyOrderOrderingKey, createShopifyPendingRecoveryOrderingKey, isCheckoutCreatedEventV2, isCheckoutObservedEvent, isCheckoutUpdatedEventV2, isOrderCompletedEvent, isOrderCompletedEventV2, parseShopifyCommerceEvent, parseShopifyRecoveryEventV2, safeParseShopifyCommerceEvent, safeParseShopifyRecoveryEventV2 } from './shopify/index.js';
2
2
  import 'zod';
package/dist/index.js CHANGED
@@ -1,47 +1,83 @@
1
1
  import {
2
+ CheckoutCreatedPayloadV2Schema,
2
3
  CheckoutObservedPayloadSchema,
4
+ CheckoutUpdatedPayloadV2Schema,
3
5
  MAX_LINE_ITEMS,
4
6
  MAX_URL_LENGTH,
5
7
  OrderCompletedPayloadSchema,
8
+ OrderCompletedPayloadV2Schema,
6
9
  SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION,
10
+ SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V1,
11
+ SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2,
7
12
  SHOPIFY_COMMERCE_EVENT_TYPES,
8
- SHOPIFY_COMMERCE_JOB,
9
- SHOPIFY_COMMERCE_QUEUE,
13
+ SHOPIFY_RECOVERY_EVENT_TYPES_V2,
14
+ SHOPIFY_WEBHOOK_OUTBOX_DESTINATIONS,
15
+ SHOPIFY_WEBHOOK_QUEUE_CONTRACTS,
16
+ ShopifyCheckoutCreatedEventV2Schema,
10
17
  ShopifyCheckoutLineItemSchema,
11
18
  ShopifyCheckoutLineItemsSchema,
12
19
  ShopifyCheckoutObservedEventSchema,
20
+ ShopifyCheckoutUpdatedEventV2Schema,
13
21
  ShopifyCommerceEventSchema,
14
22
  ShopifyCustomerReferenceSchema,
15
23
  ShopifyMoneySchema,
16
24
  ShopifyOrderCompletedEventSchema,
25
+ ShopifyOrderCompletedEventV2Schema,
26
+ ShopifyRecoveryEventV2Schema,
17
27
  ShopifyTenantSchema,
18
28
  createShopifyCommerceOrderingKey,
29
+ createShopifyOrderCorrelationOrderingKey,
30
+ createShopifyOrderOrderingKey,
31
+ createShopifyPendingRecoveryOrderingKey,
32
+ isCheckoutCreatedEventV2,
19
33
  isCheckoutObservedEvent,
34
+ isCheckoutUpdatedEventV2,
20
35
  isOrderCompletedEvent,
36
+ isOrderCompletedEventV2,
21
37
  parseShopifyCommerceEvent,
22
- safeParseShopifyCommerceEvent
23
- } from "./chunk-NE5RMNXU.js";
38
+ parseShopifyRecoveryEventV2,
39
+ safeParseShopifyCommerceEvent,
40
+ safeParseShopifyRecoveryEventV2
41
+ } from "./chunk-T6DNWLWW.js";
24
42
  export {
43
+ CheckoutCreatedPayloadV2Schema,
25
44
  CheckoutObservedPayloadSchema,
45
+ CheckoutUpdatedPayloadV2Schema,
26
46
  MAX_LINE_ITEMS,
27
47
  MAX_URL_LENGTH,
28
48
  OrderCompletedPayloadSchema,
49
+ OrderCompletedPayloadV2Schema,
29
50
  SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION,
51
+ SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V1,
52
+ SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2,
30
53
  SHOPIFY_COMMERCE_EVENT_TYPES,
31
- SHOPIFY_COMMERCE_JOB,
32
- SHOPIFY_COMMERCE_QUEUE,
54
+ SHOPIFY_RECOVERY_EVENT_TYPES_V2,
55
+ SHOPIFY_WEBHOOK_OUTBOX_DESTINATIONS,
56
+ SHOPIFY_WEBHOOK_QUEUE_CONTRACTS,
57
+ ShopifyCheckoutCreatedEventV2Schema,
33
58
  ShopifyCheckoutLineItemSchema,
34
59
  ShopifyCheckoutLineItemsSchema,
35
60
  ShopifyCheckoutObservedEventSchema,
61
+ ShopifyCheckoutUpdatedEventV2Schema,
36
62
  ShopifyCommerceEventSchema,
37
63
  ShopifyCustomerReferenceSchema,
38
64
  ShopifyMoneySchema,
39
65
  ShopifyOrderCompletedEventSchema,
66
+ ShopifyOrderCompletedEventV2Schema,
67
+ ShopifyRecoveryEventV2Schema,
40
68
  ShopifyTenantSchema,
41
69
  createShopifyCommerceOrderingKey,
70
+ createShopifyOrderCorrelationOrderingKey,
71
+ createShopifyOrderOrderingKey,
72
+ createShopifyPendingRecoveryOrderingKey,
73
+ isCheckoutCreatedEventV2,
42
74
  isCheckoutObservedEvent,
75
+ isCheckoutUpdatedEventV2,
43
76
  isOrderCompletedEvent,
77
+ isOrderCompletedEventV2,
44
78
  parseShopifyCommerceEvent,
45
- safeParseShopifyCommerceEvent
79
+ parseShopifyRecoveryEventV2,
80
+ safeParseShopifyCommerceEvent,
81
+ safeParseShopifyRecoveryEventV2
46
82
  };
47
83
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,45 @@
1
+ declare const LOG_LEVELS: readonly ["debug", "info", "warn", "error"];
2
+ type LogLevel = (typeof LOG_LEVELS)[number];
3
+ type LogFields = Readonly<Record<string, unknown>>;
4
+ type LogRecord = Readonly<{
5
+ timestamp: string;
6
+ level: LogLevel;
7
+ event: string;
8
+ "service.namespace": string;
9
+ "service.name": string;
10
+ "deployment.environment.name": string;
11
+ data?: Readonly<Record<string, unknown>>;
12
+ }>;
13
+ type LogSink = (record: LogRecord) => void;
14
+ type LoggerOptions = {
15
+ serviceName: string;
16
+ environment: string;
17
+ serviceNamespace?: string;
18
+ baseFields?: LogFields;
19
+ sink?: LogSink;
20
+ now?: () => Date;
21
+ };
22
+ interface StructuredLogger {
23
+ debug(event: string, fields?: LogFields): void;
24
+ info(event: string, fields?: LogFields): void;
25
+ warn(event: string, fields?: LogFields): void;
26
+ error(event: string, fields?: LogFields): void;
27
+ child(fields: LogFields): StructuredLogger;
28
+ }
29
+
30
+ declare function createLogger(options: LoggerOptions): StructuredLogger;
31
+
32
+ declare const REDACTED = "[REDACTED]";
33
+ declare const CIRCULAR = "[Circular]";
34
+ declare const MAX_DEPTH_REACHED = "[MaxDepth]";
35
+ declare const TRUNCATED = "[Truncated]";
36
+ declare const LOG_VALUE_LIMITS: Readonly<{
37
+ maxDepth: 6;
38
+ maxArrayItems: 50;
39
+ maxObjectKeys: 100;
40
+ maxStringLength: 4096;
41
+ }>;
42
+ declare function isSensitiveLogKey(key: string): boolean;
43
+ declare function sanitizeLogFields(fields: Readonly<Record<string, unknown>>): Record<string, unknown>;
44
+
45
+ export { CIRCULAR, LOG_LEVELS, LOG_VALUE_LIMITS, type LogFields, type LogLevel, type LogRecord, type LogSink, type LoggerOptions, MAX_DEPTH_REACHED, REDACTED, type StructuredLogger, TRUNCATED, createLogger, isSensitiveLogKey, sanitizeLogFields };