@modainteract/moda-interact-shared 0.1.0 → 0.2.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,199 @@
1
+ // src/logging/redaction.ts
2
+ var REDACTED = "[REDACTED]";
3
+ var CIRCULAR = "[Circular]";
4
+ var MAX_DEPTH_REACHED = "[MaxDepth]";
5
+ var TRUNCATED = "[Truncated]";
6
+ var LOG_VALUE_LIMITS = Object.freeze({
7
+ maxDepth: 6,
8
+ maxArrayItems: 50,
9
+ maxObjectKeys: 100,
10
+ maxStringLength: 4096
11
+ });
12
+ var SENSITIVE_EXACT_KEYS = /* @__PURE__ */ new Set([
13
+ "authorization",
14
+ "cookie",
15
+ "setcookie",
16
+ "password",
17
+ "passwd",
18
+ "apikey",
19
+ "privatekey",
20
+ "cvv",
21
+ "cvc",
22
+ "cardnumber",
23
+ "creditcard",
24
+ "firstname",
25
+ "lastname"
26
+ ]);
27
+ function normalizeKey(key) {
28
+ return key.toLowerCase().replace(/[^a-z0-9]/g, "");
29
+ }
30
+ function isSensitiveLogKey(key) {
31
+ const normalized = normalizeKey(key);
32
+ return SENSITIVE_EXACT_KEYS.has(normalized) || normalized.includes("secret") || normalized.endsWith("token") || normalized.includes("email") || normalized.includes("phone") || normalized.endsWith("address");
33
+ }
34
+ function sanitizeString(value) {
35
+ const scrubbed = value.replace(/\bBearer\s+[^\s,;]+/gi, `Bearer ${REDACTED}`).replace(
36
+ /([?&](?:access_token|refresh_token|verify_token|client_secret|api_key|token|password)=)[^&#\s]*/gi,
37
+ `$1${REDACTED}`
38
+ );
39
+ if (scrubbed.length <= LOG_VALUE_LIMITS.maxStringLength) {
40
+ return scrubbed;
41
+ }
42
+ return `${scrubbed.slice(0, LOG_VALUE_LIMITS.maxStringLength)}\u2026${TRUNCATED}`;
43
+ }
44
+ function sanitizeError(error) {
45
+ return {
46
+ name: sanitizeString(error.name),
47
+ message: sanitizeString(error.message)
48
+ };
49
+ }
50
+ function sanitizeValue(value, depth, activeObjects) {
51
+ if (value === null || value === void 0) {
52
+ return value ?? null;
53
+ }
54
+ if (typeof value === "string") {
55
+ return sanitizeString(value);
56
+ }
57
+ if (typeof value === "number") {
58
+ return Number.isFinite(value) ? value : String(value);
59
+ }
60
+ if (typeof value === "boolean") {
61
+ return value;
62
+ }
63
+ if (typeof value === "bigint") {
64
+ return value.toString();
65
+ }
66
+ if (typeof value === "symbol" || typeof value === "function") {
67
+ return `[${typeof value}]`;
68
+ }
69
+ if (value instanceof Date) {
70
+ return Number.isNaN(value.getTime()) ? "Invalid Date" : value.toISOString();
71
+ }
72
+ if (value instanceof Error) {
73
+ return sanitizeError(value);
74
+ }
75
+ if (depth >= LOG_VALUE_LIMITS.maxDepth) {
76
+ return MAX_DEPTH_REACHED;
77
+ }
78
+ if (typeof value !== "object") {
79
+ return String(value);
80
+ }
81
+ if (activeObjects.has(value)) {
82
+ return CIRCULAR;
83
+ }
84
+ activeObjects.add(value);
85
+ try {
86
+ if (Array.isArray(value)) {
87
+ const result2 = value.slice(0, LOG_VALUE_LIMITS.maxArrayItems).map((item) => sanitizeValue(item, depth + 1, activeObjects));
88
+ if (value.length > LOG_VALUE_LIMITS.maxArrayItems) {
89
+ result2.push(TRUNCATED);
90
+ }
91
+ return result2;
92
+ }
93
+ const result = {};
94
+ const entries = Object.entries(value).slice(0, LOG_VALUE_LIMITS.maxObjectKeys);
95
+ for (const [key, item] of entries) {
96
+ result[key] = isSensitiveLogKey(key) ? REDACTED : sanitizeValue(item, depth + 1, activeObjects);
97
+ }
98
+ if (Object.keys(value).length > LOG_VALUE_LIMITS.maxObjectKeys) {
99
+ result.__truncated__ = true;
100
+ }
101
+ return result;
102
+ } finally {
103
+ activeObjects.delete(value);
104
+ }
105
+ }
106
+ function sanitizeLogFields(fields) {
107
+ return sanitizeValue(fields, 0, /* @__PURE__ */ new WeakSet());
108
+ }
109
+
110
+ // src/logging/logger.ts
111
+ var DEFAULT_SERVICE_NAMESPACE = "moda-interact";
112
+ function requireNonEmpty(value, field) {
113
+ const normalized = value.trim();
114
+ if (!normalized) {
115
+ throw new Error(`${field} must be a non-empty string`);
116
+ }
117
+ return normalized;
118
+ }
119
+ function defaultSink(record) {
120
+ const line = JSON.stringify(record);
121
+ switch (record.level) {
122
+ case "debug":
123
+ console.debug(line);
124
+ break;
125
+ case "warn":
126
+ console.warn(line);
127
+ break;
128
+ case "error":
129
+ console.error(line);
130
+ break;
131
+ case "info":
132
+ default:
133
+ console.info(line);
134
+ break;
135
+ }
136
+ }
137
+ function safeTimestamp(now) {
138
+ try {
139
+ const value = now();
140
+ if (value instanceof Date && !Number.isNaN(value.getTime())) {
141
+ return value.toISOString();
142
+ }
143
+ } catch {
144
+ }
145
+ return (/* @__PURE__ */ new Date()).toISOString();
146
+ }
147
+ function createLogger(options) {
148
+ const serviceName = requireNonEmpty(options.serviceName, "serviceName");
149
+ const environment = requireNonEmpty(options.environment, "environment");
150
+ const serviceNamespace = requireNonEmpty(
151
+ options.serviceNamespace ?? DEFAULT_SERVICE_NAMESPACE,
152
+ "serviceNamespace"
153
+ );
154
+ const sink = options.sink ?? defaultSink;
155
+ const now = options.now ?? (() => /* @__PURE__ */ new Date());
156
+ const initialBaseFields = { ...options.baseFields ?? {} };
157
+ function buildLogger(baseFields) {
158
+ function emit(level, event, fields = {}) {
159
+ try {
160
+ const eventName = event.trim() || "unknown";
161
+ const sanitizedData = sanitizeLogFields({ ...baseFields, ...fields });
162
+ const record = Object.freeze({
163
+ timestamp: safeTimestamp(now),
164
+ level,
165
+ event: eventName,
166
+ "service.namespace": serviceNamespace,
167
+ "service.name": serviceName,
168
+ "deployment.environment.name": environment,
169
+ ...Object.keys(sanitizedData).length > 0 ? { data: sanitizedData } : {}
170
+ });
171
+ sink(record);
172
+ } catch {
173
+ }
174
+ }
175
+ return Object.freeze({
176
+ debug: (event, fields) => emit("debug", event, fields),
177
+ info: (event, fields) => emit("info", event, fields),
178
+ warn: (event, fields) => emit("warn", event, fields),
179
+ error: (event, fields) => emit("error", event, fields),
180
+ child: (fields) => buildLogger({ ...baseFields, ...fields })
181
+ });
182
+ }
183
+ return buildLogger(initialBaseFields);
184
+ }
185
+
186
+ // src/logging/types.ts
187
+ var LOG_LEVELS = ["debug", "info", "warn", "error"];
188
+ export {
189
+ CIRCULAR,
190
+ LOG_LEVELS,
191
+ LOG_VALUE_LIMITS,
192
+ MAX_DEPTH_REACHED,
193
+ REDACTED,
194
+ TRUNCATED,
195
+ createLogger,
196
+ isSensitiveLogKey,
197
+ sanitizeLogFields
198
+ };
199
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/logging/redaction.ts","../../src/logging/logger.ts","../../src/logging/types.ts"],"sourcesContent":["export const REDACTED = \"[REDACTED]\";\nexport const CIRCULAR = \"[Circular]\";\nexport const MAX_DEPTH_REACHED = \"[MaxDepth]\";\nexport const TRUNCATED = \"[Truncated]\";\n\nexport const LOG_VALUE_LIMITS = Object.freeze({\n maxDepth: 6,\n maxArrayItems: 50,\n maxObjectKeys: 100,\n maxStringLength: 4096,\n});\n\nconst SENSITIVE_EXACT_KEYS = new Set([\n \"authorization\",\n \"cookie\",\n \"setcookie\",\n \"password\",\n \"passwd\",\n \"apikey\",\n \"privatekey\",\n \"cvv\",\n \"cvc\",\n \"cardnumber\",\n \"creditcard\",\n \"firstname\",\n \"lastname\",\n]);\n\nfunction normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nexport function isSensitiveLogKey(key: string): boolean {\n const normalized = normalizeKey(key);\n\n return (\n SENSITIVE_EXACT_KEYS.has(normalized) ||\n normalized.includes(\"secret\") ||\n normalized.endsWith(\"token\") ||\n normalized.includes(\"email\") ||\n normalized.includes(\"phone\") ||\n normalized.endsWith(\"address\")\n );\n}\n\nfunction sanitizeString(value: string): string {\n const scrubbed = value\n .replace(/\\bBearer\\s+[^\\s,;]+/gi, `Bearer ${REDACTED}`)\n .replace(\n /([?&](?:access_token|refresh_token|verify_token|client_secret|api_key|token|password)=)[^&#\\s]*/gi,\n `$1${REDACTED}`,\n );\n\n if (scrubbed.length <= LOG_VALUE_LIMITS.maxStringLength) {\n return scrubbed;\n }\n\n return `${scrubbed.slice(0, LOG_VALUE_LIMITS.maxStringLength)}…${TRUNCATED}`;\n}\n\nfunction sanitizeError(error: Error): Record<string, unknown> {\n return {\n name: sanitizeString(error.name),\n message: sanitizeString(error.message),\n };\n}\n\nfunction sanitizeValue(\n value: unknown,\n depth: number,\n activeObjects: WeakSet<object>,\n): unknown {\n if (value === null || value === undefined) {\n return value ?? null;\n }\n\n if (typeof value === \"string\") {\n return sanitizeString(value);\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : String(value);\n }\n\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n\n if (typeof value === \"symbol\" || typeof value === \"function\") {\n return `[${typeof value}]`;\n }\n\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? \"Invalid Date\" : value.toISOString();\n }\n\n if (value instanceof Error) {\n return sanitizeError(value);\n }\n\n if (depth >= LOG_VALUE_LIMITS.maxDepth) {\n return MAX_DEPTH_REACHED;\n }\n\n if (typeof value !== \"object\") {\n return String(value);\n }\n\n if (activeObjects.has(value)) {\n return CIRCULAR;\n }\n\n activeObjects.add(value);\n\n try {\n if (Array.isArray(value)) {\n const result = value\n .slice(0, LOG_VALUE_LIMITS.maxArrayItems)\n .map((item) => sanitizeValue(item, depth + 1, activeObjects));\n\n if (value.length > LOG_VALUE_LIMITS.maxArrayItems) {\n result.push(TRUNCATED);\n }\n\n return result;\n }\n\n const result: Record<string, unknown> = {};\n const entries = Object.entries(value).slice(0, LOG_VALUE_LIMITS.maxObjectKeys);\n\n for (const [key, item] of entries) {\n result[key] = isSensitiveLogKey(key)\n ? REDACTED\n : sanitizeValue(item, depth + 1, activeObjects);\n }\n\n if (Object.keys(value).length > LOG_VALUE_LIMITS.maxObjectKeys) {\n result.__truncated__ = true;\n }\n\n return result;\n } finally {\n activeObjects.delete(value);\n }\n}\n\nexport function sanitizeLogFields(\n fields: Readonly<Record<string, unknown>>,\n): Record<string, unknown> {\n return sanitizeValue(fields, 0, new WeakSet<object>()) as Record<string, unknown>;\n}\n","import { sanitizeLogFields } from \"./redaction.js\";\nimport type {\n LogFields,\n LogLevel,\n LogRecord,\n LogSink,\n LoggerOptions,\n StructuredLogger,\n} from \"./types.js\";\n\nconst DEFAULT_SERVICE_NAMESPACE = \"moda-interact\";\n\nfunction requireNonEmpty(value: string, field: string): string {\n const normalized = value.trim();\n if (!normalized) {\n throw new Error(`${field} must be a non-empty string`);\n }\n return normalized;\n}\n\nfunction defaultSink(record: LogRecord): void {\n const line = JSON.stringify(record);\n\n switch (record.level) {\n case \"debug\":\n console.debug(line);\n break;\n case \"warn\":\n console.warn(line);\n break;\n case \"error\":\n console.error(line);\n break;\n case \"info\":\n default:\n console.info(line);\n break;\n }\n}\n\nfunction safeTimestamp(now: () => Date): string {\n try {\n const value = now();\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n return value.toISOString();\n }\n } catch {\n // Logging must not become a correctness dependency.\n }\n\n return new Date().toISOString();\n}\n\nexport function createLogger(options: LoggerOptions): StructuredLogger {\n const serviceName = requireNonEmpty(options.serviceName, \"serviceName\");\n const environment = requireNonEmpty(options.environment, \"environment\");\n const serviceNamespace = requireNonEmpty(\n options.serviceNamespace ?? DEFAULT_SERVICE_NAMESPACE,\n \"serviceNamespace\",\n );\n const sink: LogSink = options.sink ?? defaultSink;\n const now = options.now ?? (() => new Date());\n const initialBaseFields = { ...(options.baseFields ?? {}) };\n\n function buildLogger(baseFields: Record<string, unknown>): StructuredLogger {\n function emit(level: LogLevel, event: string, fields: LogFields = {}): void {\n try {\n const eventName = event.trim() || \"unknown\";\n const sanitizedData = sanitizeLogFields({ ...baseFields, ...fields });\n\n const record: LogRecord = Object.freeze({\n timestamp: safeTimestamp(now),\n level,\n event: eventName,\n \"service.namespace\": serviceNamespace,\n \"service.name\": serviceName,\n \"deployment.environment.name\": environment,\n ...(Object.keys(sanitizedData).length > 0 ? { data: sanitizedData } : {}),\n });\n\n sink(record);\n } catch {\n // Logging is best-effort and must never alter business correctness.\n }\n }\n\n return Object.freeze({\n debug: (event: string, fields?: LogFields) => emit(\"debug\", event, fields),\n info: (event: string, fields?: LogFields) => emit(\"info\", event, fields),\n warn: (event: string, fields?: LogFields) => emit(\"warn\", event, fields),\n error: (event: string, fields?: LogFields) => emit(\"error\", event, fields),\n child: (fields: LogFields) => buildLogger({ ...baseFields, ...fields }),\n });\n }\n\n return buildLogger(initialBaseFields);\n}\n","export const LOG_LEVELS = [\"debug\", \"info\", \"warn\", \"error\"] as const;\n\nexport type LogLevel = (typeof LOG_LEVELS)[number];\n\nexport type LogFields = Readonly<Record<string, unknown>>;\n\nexport type LogRecord = Readonly<{\n timestamp: string;\n level: LogLevel;\n event: string;\n \"service.namespace\": string;\n \"service.name\": string;\n \"deployment.environment.name\": string;\n data?: Readonly<Record<string, unknown>>;\n}>;\n\nexport type LogSink = (record: LogRecord) => void;\n\nexport type LoggerOptions = {\n serviceName: string;\n environment: string;\n serviceNamespace?: string;\n baseFields?: LogFields;\n sink?: LogSink;\n now?: () => Date;\n};\n\nexport interface StructuredLogger {\n debug(event: string, fields?: LogFields): void;\n info(event: string, fields?: LogFields): void;\n warn(event: string, fields?: LogFields): void;\n error(event: string, fields?: LogFields): void;\n child(fields: LogFields): StructuredLogger;\n}\n"],"mappings":";AAAO,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,oBAAoB;AAC1B,IAAM,YAAY;AAElB,IAAM,mBAAmB,OAAO,OAAO;AAAA,EAC5C,UAAU;AAAA,EACV,eAAe;AAAA,EACf,eAAe;AAAA,EACf,iBAAiB;AACnB,CAAC;AAED,IAAM,uBAAuB,oBAAI,IAAI;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,aAAa,KAAqB;AACzC,SAAO,IAAI,YAAY,EAAE,QAAQ,cAAc,EAAE;AACnD;AAEO,SAAS,kBAAkB,KAAsB;AACtD,QAAM,aAAa,aAAa,GAAG;AAEnC,SACE,qBAAqB,IAAI,UAAU,KACnC,WAAW,SAAS,QAAQ,KAC5B,WAAW,SAAS,OAAO,KAC3B,WAAW,SAAS,OAAO,KAC3B,WAAW,SAAS,OAAO,KAC3B,WAAW,SAAS,SAAS;AAEjC;AAEA,SAAS,eAAe,OAAuB;AAC7C,QAAM,WAAW,MACd,QAAQ,yBAAyB,UAAU,QAAQ,EAAE,EACrD;AAAA,IACC;AAAA,IACA,KAAK,QAAQ;AAAA,EACf;AAEF,MAAI,SAAS,UAAU,iBAAiB,iBAAiB;AACvD,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,SAAS,MAAM,GAAG,iBAAiB,eAAe,CAAC,SAAI,SAAS;AAC5E;AAEA,SAAS,cAAc,OAAuC;AAC5D,SAAO;AAAA,IACL,MAAM,eAAe,MAAM,IAAI;AAAA,IAC/B,SAAS,eAAe,MAAM,OAAO;AAAA,EACvC;AACF;AAEA,SAAS,cACP,OACA,OACA,eACS;AACT,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,eAAe,KAAK;AAAA,EAC7B;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK;AAAA,EACtD;AAEA,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,SAAS;AAAA,EACxB;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY;AAC5D,WAAO,IAAI,OAAO,KAAK;AAAA,EACzB;AAEA,MAAI,iBAAiB,MAAM;AACzB,WAAO,OAAO,MAAM,MAAM,QAAQ,CAAC,IAAI,iBAAiB,MAAM,YAAY;AAAA,EAC5E;AAEA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,cAAc,KAAK;AAAA,EAC5B;AAEA,MAAI,SAAS,iBAAiB,UAAU;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,MAAI,cAAc,IAAI,KAAK,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,gBAAc,IAAI,KAAK;AAEvB,MAAI;AACF,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAMA,UAAS,MACZ,MAAM,GAAG,iBAAiB,aAAa,EACvC,IAAI,CAAC,SAAS,cAAc,MAAM,QAAQ,GAAG,aAAa,CAAC;AAE9D,UAAI,MAAM,SAAS,iBAAiB,eAAe;AACjD,QAAAA,QAAO,KAAK,SAAS;AAAA,MACvB;AAEA,aAAOA;AAAA,IACT;AAEA,UAAM,SAAkC,CAAC;AACzC,UAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,MAAM,GAAG,iBAAiB,aAAa;AAE7E,eAAW,CAAC,KAAK,IAAI,KAAK,SAAS;AACjC,aAAO,GAAG,IAAI,kBAAkB,GAAG,IAC/B,WACA,cAAc,MAAM,QAAQ,GAAG,aAAa;AAAA,IAClD;AAEA,QAAI,OAAO,KAAK,KAAK,EAAE,SAAS,iBAAiB,eAAe;AAC9D,aAAO,gBAAgB;AAAA,IACzB;AAEA,WAAO;AAAA,EACT,UAAE;AACA,kBAAc,OAAO,KAAK;AAAA,EAC5B;AACF;AAEO,SAAS,kBACd,QACyB;AACzB,SAAO,cAAc,QAAQ,GAAG,oBAAI,QAAgB,CAAC;AACvD;;;AChJA,IAAM,4BAA4B;AAElC,SAAS,gBAAgB,OAAe,OAAuB;AAC7D,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,GAAG,KAAK,6BAA6B;AAAA,EACvD;AACA,SAAO;AACT;AAEA,SAAS,YAAY,QAAyB;AAC5C,QAAM,OAAO,KAAK,UAAU,MAAM;AAElC,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AACH,cAAQ,MAAM,IAAI;AAClB;AAAA,IACF,KAAK;AACH,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF,KAAK;AACH,cAAQ,MAAM,IAAI;AAClB;AAAA,IACF,KAAK;AAAA,IACL;AACE,cAAQ,KAAK,IAAI;AACjB;AAAA,EACJ;AACF;AAEA,SAAS,cAAc,KAAyB;AAC9C,MAAI;AACF,UAAM,QAAQ,IAAI;AAClB,QAAI,iBAAiB,QAAQ,CAAC,OAAO,MAAM,MAAM,QAAQ,CAAC,GAAG;AAC3D,aAAO,MAAM,YAAY;AAAA,IAC3B;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAEO,SAAS,aAAa,SAA0C;AACrE,QAAM,cAAc,gBAAgB,QAAQ,aAAa,aAAa;AACtE,QAAM,cAAc,gBAAgB,QAAQ,aAAa,aAAa;AACtE,QAAM,mBAAmB;AAAA,IACvB,QAAQ,oBAAoB;AAAA,IAC5B;AAAA,EACF;AACA,QAAM,OAAgB,QAAQ,QAAQ;AACtC,QAAM,MAAM,QAAQ,QAAQ,MAAM,oBAAI,KAAK;AAC3C,QAAM,oBAAoB,EAAE,GAAI,QAAQ,cAAc,CAAC,EAAG;AAE1D,WAAS,YAAY,YAAuD;AAC1E,aAAS,KAAK,OAAiB,OAAe,SAAoB,CAAC,GAAS;AAC1E,UAAI;AACF,cAAM,YAAY,MAAM,KAAK,KAAK;AAClC,cAAM,gBAAgB,kBAAkB,EAAE,GAAG,YAAY,GAAG,OAAO,CAAC;AAEpE,cAAM,SAAoB,OAAO,OAAO;AAAA,UACtC,WAAW,cAAc,GAAG;AAAA,UAC5B;AAAA,UACA,OAAO;AAAA,UACP,qBAAqB;AAAA,UACrB,gBAAgB;AAAA,UAChB,+BAA+B;AAAA,UAC/B,GAAI,OAAO,KAAK,aAAa,EAAE,SAAS,IAAI,EAAE,MAAM,cAAc,IAAI,CAAC;AAAA,QACzE,CAAC;AAED,aAAK,MAAM;AAAA,MACb,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,OAAO,OAAO;AAAA,MACnB,OAAO,CAAC,OAAe,WAAuB,KAAK,SAAS,OAAO,MAAM;AAAA,MACzE,MAAM,CAAC,OAAe,WAAuB,KAAK,QAAQ,OAAO,MAAM;AAAA,MACvE,MAAM,CAAC,OAAe,WAAuB,KAAK,QAAQ,OAAO,MAAM;AAAA,MACvE,OAAO,CAAC,OAAe,WAAuB,KAAK,SAAS,OAAO,MAAM;AAAA,MACzE,OAAO,CAAC,WAAsB,YAAY,EAAE,GAAG,YAAY,GAAG,OAAO,CAAC;AAAA,IACxE,CAAC;AAAA,EACH;AAEA,SAAO,YAAY,iBAAiB;AACtC;;;AChGO,IAAM,aAAa,CAAC,SAAS,QAAQ,QAAQ,OAAO;","names":["result"]}
@@ -1,12 +1,21 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ declare const SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V1: 1;
4
+ declare const SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION_V2: 2;
3
5
  declare const SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION: 1;
4
- declare const SHOPIFY_COMMERCE_QUEUE: "commerce-events";
5
- declare const SHOPIFY_COMMERCE_JOB: "shopify-commerce-event";
6
6
  declare const SHOPIFY_COMMERCE_EVENT_TYPES: {
7
7
  readonly CHECKOUT_OBSERVED: "checkout.observed";
8
8
  readonly ORDER_COMPLETED: "order.completed";
9
9
  };
10
+ declare const SHOPIFY_RECOVERY_EVENT_TYPES_V2: {
11
+ readonly CHECKOUT_CREATED: "checkout.created";
12
+ readonly CHECKOUT_UPDATED: "checkout.updated";
13
+ readonly ORDER_COMPLETED: "order.completed";
14
+ };
15
+ declare const SHOPIFY_WEBHOOK_OUTBOX_DESTINATIONS: {
16
+ readonly CHECKOUT_EVENTS: "CHECKOUT_EVENTS";
17
+ readonly ORDER_EVENTS: "ORDER_EVENTS";
18
+ };
10
19
 
11
20
  declare const MAX_URL_LENGTH = 2048;
12
21
  declare const MAX_LINE_ITEMS = 250;
@@ -87,7 +96,7 @@ type CheckoutObservedPayload = z.infer<typeof CheckoutObservedPayloadSchema>;
87
96
 
88
97
  declare const OrderCompletedPayloadSchema: z.ZodObject<{
89
98
  orderId: z.ZodString;
90
- checkoutToken: z.ZodString;
99
+ checkoutToken: z.ZodNullable<z.ZodString>;
91
100
  shopifyCustomerId: z.ZodNullable<z.ZodString>;
92
101
  total: z.ZodNullable<z.ZodObject<{
93
102
  amount: z.ZodString;
@@ -162,7 +171,7 @@ declare const ShopifyOrderCompletedEventSchema: z.ZodObject<{
162
171
  eventType: z.ZodLiteral<"order.completed">;
163
172
  payload: z.ZodObject<{
164
173
  orderId: z.ZodString;
165
- checkoutToken: z.ZodString;
174
+ checkoutToken: z.ZodNullable<z.ZodString>;
166
175
  shopifyCustomerId: z.ZodNullable<z.ZodString>;
167
176
  total: z.ZodNullable<z.ZodObject<{
168
177
  amount: z.ZodString;
@@ -235,7 +244,7 @@ declare const ShopifyCommerceEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
235
244
  eventType: z.ZodLiteral<"order.completed">;
236
245
  payload: z.ZodObject<{
237
246
  orderId: z.ZodString;
238
- checkoutToken: z.ZodString;
247
+ checkoutToken: z.ZodNullable<z.ZodString>;
239
248
  shopifyCustomerId: z.ZodNullable<z.ZodString>;
240
249
  total: z.ZodNullable<z.ZodObject<{
241
250
  amount: z.ZodString;
@@ -310,7 +319,7 @@ declare function safeParseShopifyCommerceEvent(input: unknown): z.ZodSafeParseRe
310
319
  eventType: "order.completed";
311
320
  payload: {
312
321
  orderId: string;
313
- checkoutToken: string;
322
+ checkoutToken: string | null;
314
323
  shopifyCustomerId: string | null;
315
324
  total: {
316
325
  amount: string;
@@ -322,10 +331,257 @@ declare function safeParseShopifyCommerceEvent(input: unknown): z.ZodSafeParseRe
322
331
  declare function isCheckoutObservedEvent(event: ShopifyCommerceEvent): event is ShopifyCheckoutObservedEvent;
323
332
  declare function isOrderCompletedEvent(event: ShopifyCommerceEvent): event is ShopifyOrderCompletedEvent;
324
333
  /**
325
- * Stable ordering key for a shop/checkout pair. Checkout and order events for the
326
- * same checkout must share this key, so deliveryId is intentionally excluded.
327
- * Values are length-prefixed to avoid ambiguous concatenation (e.g. "1" + "23" vs "12" + "3").
334
+ * Stable ordering key for a shop/checkout pair.
335
+ * Checkout and order events for the same checkout must share this key, so
336
+ * deliveryId is intentionally excluded.
328
337
  */
329
338
  declare function createShopifyCommerceOrderingKey(shopId: string, checkoutToken: string): string;
339
+ declare function createShopifyOrderOrderingKey(shopId: string, orderId: string): string;
340
+
341
+ declare const CheckoutCreatedPayloadV2Schema: z.ZodObject<{
342
+ checkoutToken: z.ZodString;
343
+ cartToken: z.ZodNullable<z.ZodString>;
344
+ abandonedCheckoutUrl: z.ZodNullable<z.ZodURL>;
345
+ checkoutCreatedAt: z.ZodNullable<z.ZodISODateTime>;
346
+ }, z.core.$strict>;
347
+ type CheckoutCreatedPayloadV2 = z.infer<typeof CheckoutCreatedPayloadV2Schema>;
348
+
349
+ declare const CheckoutUpdatedPayloadV2Schema: z.ZodObject<{
350
+ checkoutToken: z.ZodString;
351
+ }, z.core.$strict>;
352
+ type CheckoutUpdatedPayloadV2 = z.infer<typeof CheckoutUpdatedPayloadV2Schema>;
353
+
354
+ declare const OrderCompletedPayloadV2Schema: z.ZodObject<{
355
+ orderId: z.ZodString;
356
+ checkoutToken: z.ZodNullable<z.ZodString>;
357
+ cartToken: z.ZodNullable<z.ZodString>;
358
+ completedAt: z.ZodISODateTime;
359
+ }, z.core.$strict>;
360
+ type OrderCompletedPayloadV2 = z.infer<typeof OrderCompletedPayloadV2Schema>;
361
+
362
+ declare const ShopifyCheckoutCreatedEventV2Schema: z.ZodObject<{
363
+ schemaVersion: z.ZodLiteral<2>;
364
+ receiptId: z.ZodString;
365
+ deliveryId: z.ZodString;
366
+ eventId: z.ZodNullable<z.ZodString>;
367
+ source: z.ZodLiteral<"shopify">;
368
+ providerTopic: z.ZodString;
369
+ tenant: z.ZodObject<{
370
+ shopId: z.ZodString;
371
+ shopDomain: z.ZodString;
372
+ }, z.core.$strict>;
373
+ occurredAt: z.ZodNullable<z.ZodISODateTime>;
374
+ receivedAt: z.ZodISODateTime;
375
+ traceId: z.ZodString;
376
+ orderingKey: z.ZodString;
377
+ eventType: z.ZodLiteral<"checkout.created">;
378
+ payload: z.ZodObject<{
379
+ checkoutToken: z.ZodString;
380
+ cartToken: z.ZodNullable<z.ZodString>;
381
+ abandonedCheckoutUrl: z.ZodNullable<z.ZodURL>;
382
+ checkoutCreatedAt: z.ZodNullable<z.ZodISODateTime>;
383
+ }, z.core.$strict>;
384
+ }, z.core.$strict>;
385
+ type ShopifyCheckoutCreatedEventV2 = z.infer<typeof ShopifyCheckoutCreatedEventV2Schema>;
386
+ declare const ShopifyCheckoutUpdatedEventV2Schema: z.ZodObject<{
387
+ schemaVersion: z.ZodLiteral<2>;
388
+ receiptId: z.ZodString;
389
+ deliveryId: z.ZodString;
390
+ eventId: z.ZodNullable<z.ZodString>;
391
+ source: z.ZodLiteral<"shopify">;
392
+ providerTopic: z.ZodString;
393
+ tenant: z.ZodObject<{
394
+ shopId: z.ZodString;
395
+ shopDomain: z.ZodString;
396
+ }, z.core.$strict>;
397
+ occurredAt: z.ZodNullable<z.ZodISODateTime>;
398
+ receivedAt: z.ZodISODateTime;
399
+ traceId: z.ZodString;
400
+ orderingKey: z.ZodString;
401
+ eventType: z.ZodLiteral<"checkout.updated">;
402
+ payload: z.ZodObject<{
403
+ checkoutToken: z.ZodString;
404
+ }, z.core.$strict>;
405
+ }, z.core.$strict>;
406
+ type ShopifyCheckoutUpdatedEventV2 = z.infer<typeof ShopifyCheckoutUpdatedEventV2Schema>;
407
+ declare const ShopifyOrderCompletedEventV2Schema: z.ZodObject<{
408
+ schemaVersion: z.ZodLiteral<2>;
409
+ receiptId: z.ZodString;
410
+ deliveryId: z.ZodString;
411
+ eventId: z.ZodNullable<z.ZodString>;
412
+ source: z.ZodLiteral<"shopify">;
413
+ providerTopic: z.ZodString;
414
+ tenant: z.ZodObject<{
415
+ shopId: z.ZodString;
416
+ shopDomain: z.ZodString;
417
+ }, z.core.$strict>;
418
+ occurredAt: z.ZodNullable<z.ZodISODateTime>;
419
+ receivedAt: z.ZodISODateTime;
420
+ traceId: z.ZodString;
421
+ orderingKey: z.ZodString;
422
+ eventType: z.ZodLiteral<"order.completed">;
423
+ payload: z.ZodObject<{
424
+ orderId: z.ZodString;
425
+ checkoutToken: z.ZodNullable<z.ZodString>;
426
+ cartToken: z.ZodNullable<z.ZodString>;
427
+ completedAt: z.ZodISODateTime;
428
+ }, z.core.$strict>;
429
+ }, z.core.$strict>;
430
+ type ShopifyOrderCompletedEventV2 = z.infer<typeof ShopifyOrderCompletedEventV2Schema>;
431
+ declare const ShopifyRecoveryEventV2Schema: z.ZodDiscriminatedUnion<[z.ZodObject<{
432
+ schemaVersion: z.ZodLiteral<2>;
433
+ receiptId: z.ZodString;
434
+ deliveryId: z.ZodString;
435
+ eventId: z.ZodNullable<z.ZodString>;
436
+ source: z.ZodLiteral<"shopify">;
437
+ providerTopic: z.ZodString;
438
+ tenant: z.ZodObject<{
439
+ shopId: z.ZodString;
440
+ shopDomain: z.ZodString;
441
+ }, z.core.$strict>;
442
+ occurredAt: z.ZodNullable<z.ZodISODateTime>;
443
+ receivedAt: z.ZodISODateTime;
444
+ traceId: z.ZodString;
445
+ orderingKey: z.ZodString;
446
+ eventType: z.ZodLiteral<"checkout.created">;
447
+ payload: z.ZodObject<{
448
+ checkoutToken: z.ZodString;
449
+ cartToken: z.ZodNullable<z.ZodString>;
450
+ abandonedCheckoutUrl: z.ZodNullable<z.ZodURL>;
451
+ checkoutCreatedAt: z.ZodNullable<z.ZodISODateTime>;
452
+ }, z.core.$strict>;
453
+ }, z.core.$strict>, z.ZodObject<{
454
+ schemaVersion: z.ZodLiteral<2>;
455
+ receiptId: z.ZodString;
456
+ deliveryId: z.ZodString;
457
+ eventId: z.ZodNullable<z.ZodString>;
458
+ source: z.ZodLiteral<"shopify">;
459
+ providerTopic: z.ZodString;
460
+ tenant: z.ZodObject<{
461
+ shopId: z.ZodString;
462
+ shopDomain: z.ZodString;
463
+ }, z.core.$strict>;
464
+ occurredAt: z.ZodNullable<z.ZodISODateTime>;
465
+ receivedAt: z.ZodISODateTime;
466
+ traceId: z.ZodString;
467
+ orderingKey: z.ZodString;
468
+ eventType: z.ZodLiteral<"checkout.updated">;
469
+ payload: z.ZodObject<{
470
+ checkoutToken: z.ZodString;
471
+ }, z.core.$strict>;
472
+ }, z.core.$strict>, z.ZodObject<{
473
+ schemaVersion: z.ZodLiteral<2>;
474
+ receiptId: z.ZodString;
475
+ deliveryId: z.ZodString;
476
+ eventId: z.ZodNullable<z.ZodString>;
477
+ source: z.ZodLiteral<"shopify">;
478
+ providerTopic: z.ZodString;
479
+ tenant: z.ZodObject<{
480
+ shopId: z.ZodString;
481
+ shopDomain: z.ZodString;
482
+ }, z.core.$strict>;
483
+ occurredAt: z.ZodNullable<z.ZodISODateTime>;
484
+ receivedAt: z.ZodISODateTime;
485
+ traceId: z.ZodString;
486
+ orderingKey: z.ZodString;
487
+ eventType: z.ZodLiteral<"order.completed">;
488
+ payload: z.ZodObject<{
489
+ orderId: z.ZodString;
490
+ checkoutToken: z.ZodNullable<z.ZodString>;
491
+ cartToken: z.ZodNullable<z.ZodString>;
492
+ completedAt: z.ZodISODateTime;
493
+ }, z.core.$strict>;
494
+ }, z.core.$strict>], "eventType">;
495
+ type ShopifyRecoveryEventV2 = z.infer<typeof ShopifyRecoveryEventV2Schema>;
496
+ type ShopifyRecoveryEventTypeV2 = ShopifyRecoveryEventV2["eventType"];
497
+ declare function parseShopifyRecoveryEventV2(input: unknown): ShopifyRecoveryEventV2;
498
+ declare function safeParseShopifyRecoveryEventV2(input: unknown): z.ZodSafeParseResult<{
499
+ schemaVersion: 2;
500
+ receiptId: string;
501
+ deliveryId: string;
502
+ eventId: string | null;
503
+ source: "shopify";
504
+ providerTopic: string;
505
+ tenant: {
506
+ shopId: string;
507
+ shopDomain: string;
508
+ };
509
+ occurredAt: string | null;
510
+ receivedAt: string;
511
+ traceId: string;
512
+ orderingKey: string;
513
+ eventType: "checkout.created";
514
+ payload: {
515
+ checkoutToken: string;
516
+ cartToken: string | null;
517
+ abandonedCheckoutUrl: string | null;
518
+ checkoutCreatedAt: string | null;
519
+ };
520
+ } | {
521
+ schemaVersion: 2;
522
+ receiptId: string;
523
+ deliveryId: string;
524
+ eventId: string | null;
525
+ source: "shopify";
526
+ providerTopic: string;
527
+ tenant: {
528
+ shopId: string;
529
+ shopDomain: string;
530
+ };
531
+ occurredAt: string | null;
532
+ receivedAt: string;
533
+ traceId: string;
534
+ orderingKey: string;
535
+ eventType: "checkout.updated";
536
+ payload: {
537
+ checkoutToken: string;
538
+ };
539
+ } | {
540
+ schemaVersion: 2;
541
+ receiptId: string;
542
+ deliveryId: string;
543
+ eventId: string | null;
544
+ source: "shopify";
545
+ providerTopic: string;
546
+ tenant: {
547
+ shopId: string;
548
+ shopDomain: string;
549
+ };
550
+ occurredAt: string | null;
551
+ receivedAt: string;
552
+ traceId: string;
553
+ orderingKey: string;
554
+ eventType: "order.completed";
555
+ payload: {
556
+ orderId: string;
557
+ checkoutToken: string | null;
558
+ cartToken: string | null;
559
+ completedAt: string;
560
+ };
561
+ }>;
562
+ declare function isCheckoutCreatedEventV2(event: ShopifyRecoveryEventV2): event is ShopifyCheckoutCreatedEventV2;
563
+ declare function isCheckoutUpdatedEventV2(event: ShopifyRecoveryEventV2): event is ShopifyCheckoutUpdatedEventV2;
564
+ declare function isOrderCompletedEventV2(event: ShopifyRecoveryEventV2): event is ShopifyOrderCompletedEventV2;
565
+ declare function createShopifyPendingRecoveryOrderingKey(shopId: string, checkoutToken: string): string;
566
+ declare function createShopifyOrderCorrelationOrderingKey(input: {
567
+ shopId: string;
568
+ orderId: string;
569
+ checkoutToken: string | null;
570
+ }): string;
571
+
572
+ declare const SHOPIFY_WEBHOOK_QUEUE_CONTRACTS: {
573
+ readonly CHECKOUT_EVENTS: {
574
+ readonly queueName: "checkout-events";
575
+ readonly jobName: "checkout-created";
576
+ };
577
+ readonly CHECKOUT_UPDATED_EVENTS: {
578
+ readonly queueName: "checkout-events";
579
+ readonly jobName: "checkout-updated";
580
+ };
581
+ readonly ORDER_EVENTS: {
582
+ readonly queueName: "order-events";
583
+ readonly jobName: "order-completed";
584
+ };
585
+ };
330
586
 
331
- export { type CheckoutObservedPayload, CheckoutObservedPayloadSchema, MAX_LINE_ITEMS, MAX_URL_LENGTH, type OrderCompletedPayload, OrderCompletedPayloadSchema, SHOPIFY_COMMERCE_EVENT_SCHEMA_VERSION, SHOPIFY_COMMERCE_EVENT_TYPES, SHOPIFY_COMMERCE_JOB, SHOPIFY_COMMERCE_QUEUE, type ShopifyCheckoutLineItem, ShopifyCheckoutLineItemSchema, ShopifyCheckoutLineItemsSchema, type ShopifyCheckoutObservedEvent, ShopifyCheckoutObservedEventSchema, type ShopifyCommerceEvent, ShopifyCommerceEventSchema, type ShopifyCommerceEventType, type ShopifyCustomerReference, ShopifyCustomerReferenceSchema, type ShopifyMoney, ShopifyMoneySchema, type ShopifyOrderCompletedEvent, ShopifyOrderCompletedEventSchema, type ShopifyTenant, ShopifyTenantSchema, createShopifyCommerceOrderingKey, isCheckoutObservedEvent, isOrderCompletedEvent, parseShopifyCommerceEvent, safeParseShopifyCommerceEvent };
587
+ export { type CheckoutCreatedPayloadV2, CheckoutCreatedPayloadV2Schema, type CheckoutObservedPayload, CheckoutObservedPayloadSchema, type CheckoutUpdatedPayloadV2, CheckoutUpdatedPayloadV2Schema, MAX_LINE_ITEMS, MAX_URL_LENGTH, type OrderCompletedPayload, OrderCompletedPayloadSchema, type 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, type ShopifyCheckoutCreatedEventV2, ShopifyCheckoutCreatedEventV2Schema, type ShopifyCheckoutLineItem, ShopifyCheckoutLineItemSchema, ShopifyCheckoutLineItemsSchema, type ShopifyCheckoutObservedEvent, ShopifyCheckoutObservedEventSchema, type ShopifyCheckoutUpdatedEventV2, ShopifyCheckoutUpdatedEventV2Schema, type ShopifyCommerceEvent, ShopifyCommerceEventSchema, type ShopifyCommerceEventType, type ShopifyCustomerReference, ShopifyCustomerReferenceSchema, type ShopifyMoney, ShopifyMoneySchema, type ShopifyOrderCompletedEvent, ShopifyOrderCompletedEventSchema, type ShopifyOrderCompletedEventV2, ShopifyOrderCompletedEventV2Schema, type ShopifyRecoveryEventTypeV2, type ShopifyRecoveryEventV2, ShopifyRecoveryEventV2Schema, type ShopifyTenant, ShopifyTenantSchema, createShopifyCommerceOrderingKey, createShopifyOrderCorrelationOrderingKey, createShopifyOrderOrderingKey, createShopifyPendingRecoveryOrderingKey, isCheckoutCreatedEventV2, isCheckoutObservedEvent, isCheckoutUpdatedEventV2, isOrderCompletedEvent, isOrderCompletedEventV2, parseShopifyCommerceEvent, parseShopifyRecoveryEventV2, safeParseShopifyCommerceEvent, safeParseShopifyRecoveryEventV2 };
@@ -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
@@ -1,7 +1,10 @@
1
1
  /**
2
- * Deterministic, BullMQ-safe job ID: "shopify-<sha256(appKey + ":" + deliveryId)>".
3
- * The hex digest contains no colons and no secret material, only a one-way hash.
2
+ * Legacy webhook delivery job id used by earlier receipt/outbox flows.
3
+ * Prefer the resource-scoped helpers below for current queue publication.
4
4
  */
5
5
  declare function createShopifyWebhookJobId(appKey: string, deliveryId: string): string;
6
+ declare function createShopifyCheckoutJobId(shopId: string, checkoutToken: string): string;
7
+ declare function createShopifyOrderJobId(shopId: string, orderGid: string): string;
8
+ declare function createPendingRecoveryCandidateJobId(shopId: string, checkoutToken: string): string;
6
9
 
7
- export { createShopifyWebhookJobId };
10
+ export { createPendingRecoveryCandidateJobId, createShopifyCheckoutJobId, createShopifyOrderJobId, createShopifyWebhookJobId };