@open-mercato/checkout 0.6.6-develop.6339.1.193c6c7c71 → 0.6.6-develop.6343.1.8120f84f30

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.
@@ -72,8 +72,8 @@ function valuesEqual(left, right) {
72
72
  return left.length === right.length && left.every((value, index) => valuesEqual(value, right[index]));
73
73
  }
74
74
  if (left && right && typeof left === "object" && typeof right === "object" && !Array.isArray(left) && !Array.isArray(right)) {
75
- const leftKeys = Object.keys(left).sort();
76
- const rightKeys = Object.keys(right).sort();
75
+ const leftKeys = Object.keys(left).sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
76
+ const rightKeys = Object.keys(right).sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
77
77
  if (!valuesEqual(leftKeys, rightKeys)) return false;
78
78
  return leftKeys.every((key) => valuesEqual(
79
79
  left[key],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/checkout/commands/shared.ts"],
4
- "sourcesContent": ["import type { CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport { extractUndoPayload } from '@open-mercato/shared/lib/commands/undo'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport type { CustomFieldSnapshot } from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport { CheckoutLink, CheckoutLinkTemplate } from '../data/entities'\nimport { requireCheckoutScope, type CheckoutScope } from '../lib/utils'\nimport { serializeTemplateOrLink, toMoneyString } from '../lib/utils'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport function resolveCommandScope(ctx: CommandRuntimeContext): CheckoutScope {\n return requireCheckoutScope({ auth: ctx.auth })\n}\n\nexport function readCommandId(input: unknown, message: string): string {\n if (typeof input === 'string' && input.trim()) return input\n if (isRecord(input)) {\n if (typeof input.id === 'string' && input.id.trim()) return input.id\n if (isRecord(input.body) && typeof input.body.id === 'string' && input.body.id.trim()) return input.body.id\n }\n throw new CrudHttpError(400, { error: message })\n}\n\ntype CheckoutRecordView = ReturnType<typeof serializeTemplateOrLink>\n\nexport type CheckoutTemplateSnapshot = CheckoutRecordView & {\n organizationId: string\n tenantId: string\n passwordHash: string | null\n custom?: CustomFieldSnapshot\n}\n\nexport type CheckoutLinkSnapshot = CheckoutTemplateSnapshot & {\n slug: string\n templateId: string | null\n completionCount: number\n activeReservationCount: number\n isLocked: boolean\n}\n\nconst PROPAGATED_TEMPLATE_FIELD_KEYS = [\n 'name',\n 'title',\n 'subtitle',\n 'description',\n 'logoAttachmentId',\n 'logoUrl',\n 'primaryColor',\n 'secondaryColor',\n 'backgroundColor',\n 'themeMode',\n 'pricingMode',\n 'fixedPriceAmount',\n 'fixedPriceCurrencyCode',\n 'fixedPriceIncludesTax',\n 'fixedPriceOriginalAmount',\n 'customAmountMin',\n 'customAmountMax',\n 'customAmountCurrencyCode',\n 'priceListItems',\n 'gatewayProviderKey',\n 'gatewaySettings',\n 'customFieldsetCode',\n 'collectCustomerDetails',\n 'customerFieldsSchema',\n 'legalDocuments',\n 'displayCustomFieldsOnPage',\n 'successTitle',\n 'successMessage',\n 'cancelTitle',\n 'cancelMessage',\n 'errorTitle',\n 'errorMessage',\n 'successEmailSubject',\n 'successEmailBody',\n 'sendSuccessEmail',\n 'errorEmailSubject',\n 'errorEmailBody',\n 'sendErrorEmail',\n 'startEmailSubject',\n 'startEmailBody',\n 'sendStartEmail',\n 'passwordHash',\n 'maxCompletions',\n 'checkoutType',\n] as const satisfies ReadonlyArray<keyof CheckoutTemplateSnapshot>\n\ntype PropagatedTemplateFieldKey = (typeof PROPAGATED_TEMPLATE_FIELD_KEYS)[number]\n\nfunction cloneJson<T>(value: T): T {\n if (value == null) return value\n return JSON.parse(JSON.stringify(value)) as T\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n if (left === right) return true\n if (Array.isArray(left) && Array.isArray(right)) {\n return left.length === right.length && left.every((value, index) => valuesEqual(value, right[index]))\n }\n if (\n left &&\n right &&\n typeof left === 'object' &&\n typeof right === 'object' &&\n !Array.isArray(left) &&\n !Array.isArray(right)\n ) {\n const leftKeys = Object.keys(left as Record<string, unknown>).sort()\n const rightKeys = Object.keys(right as Record<string, unknown>).sort()\n if (!valuesEqual(leftKeys, rightKeys)) return false\n return leftKeys.every((key) => valuesEqual(\n (left as Record<string, unknown>)[key],\n (right as Record<string, unknown>)[key],\n ))\n }\n return false\n}\n\nfunction copyPropagatedTemplateField<K extends PropagatedTemplateFieldKey>(\n snapshot: CheckoutLinkSnapshot,\n nextTemplate: CheckoutTemplateSnapshot,\n key: K,\n): void {\n snapshot[key] = cloneJson(nextTemplate[key]) as CheckoutLinkSnapshot[K]\n}\n\nexport function captureTemplateSnapshot(\n record: CheckoutLinkTemplate,\n custom?: CustomFieldSnapshot,\n): CheckoutTemplateSnapshot {\n return {\n ...cloneJson(serializeTemplateOrLink(record)),\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n passwordHash: record.passwordHash ?? null,\n custom: custom ? cloneJson(custom) : undefined,\n }\n}\n\nexport function captureLinkSnapshot(\n record: CheckoutLink,\n custom?: CustomFieldSnapshot,\n): CheckoutLinkSnapshot {\n return {\n ...captureTemplateSnapshot(record, custom),\n slug: record.slug,\n templateId: record.templateId ?? null,\n completionCount: record.completionCount,\n activeReservationCount: record.activeReservationCount,\n isLocked: record.isLocked,\n }\n}\n\nexport function buildSelectiveLinkedLinkSnapshot(\n current: CheckoutLinkSnapshot,\n previousTemplate: CheckoutTemplateSnapshot,\n nextTemplate: CheckoutTemplateSnapshot,\n): { changed: boolean; snapshot: CheckoutLinkSnapshot } {\n let changed = false\n const snapshot = cloneJson(current)\n\n for (const key of PROPAGATED_TEMPLATE_FIELD_KEYS) {\n if (!valuesEqual(current[key], previousTemplate[key])) continue\n if (valuesEqual(current[key], nextTemplate[key])) continue\n copyPropagatedTemplateField(snapshot, nextTemplate, key)\n changed = true\n }\n\n return { changed, snapshot }\n}\n\nexport function buildSelectiveLinkedCustomFieldUpdates(\n current: CustomFieldSnapshot | undefined,\n previousTemplate: CustomFieldSnapshot | undefined,\n nextTemplate: CustomFieldSnapshot | undefined,\n): Record<string, unknown> {\n const values: Record<string, unknown> = {}\n const keys = new Set<string>()\n if (current) for (const key of Object.keys(current)) keys.add(key)\n if (previousTemplate) for (const key of Object.keys(previousTemplate)) keys.add(key)\n if (nextTemplate) for (const key of Object.keys(nextTemplate)) keys.add(key)\n\n for (const key of keys) {\n const currentValue = current?.[key]\n const previousValue = previousTemplate?.[key]\n if (!valuesEqual(currentValue, previousValue)) continue\n\n const hasNextValue = Boolean(nextTemplate && Object.prototype.hasOwnProperty.call(nextTemplate, key))\n const nextValue = hasNextValue ? nextTemplate?.[key] : undefined\n if (valuesEqual(currentValue, nextValue)) continue\n\n values[key] = hasNextValue\n ? cloneJson(nextValue)\n : Array.isArray(previousValue) ? [] : null\n }\n\n return values\n}\n\nfunction buildTemplateSnapshotData(snapshot: CheckoutTemplateSnapshot) {\n return {\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n name: snapshot.name,\n title: snapshot.title ?? null,\n subtitle: snapshot.subtitle ?? null,\n description: snapshot.description ?? null,\n logoAttachmentId: snapshot.logoAttachmentId ?? null,\n logoUrl: snapshot.logoUrl ?? null,\n primaryColor: snapshot.primaryColor ?? null,\n secondaryColor: snapshot.secondaryColor ?? null,\n backgroundColor: snapshot.backgroundColor ?? null,\n themeMode: snapshot.themeMode,\n pricingMode: snapshot.pricingMode,\n fixedPriceAmount: toMoneyString(snapshot.fixedPriceAmount),\n fixedPriceCurrencyCode: snapshot.fixedPriceCurrencyCode ?? null,\n fixedPriceIncludesTax: snapshot.fixedPriceIncludesTax,\n fixedPriceOriginalAmount: toMoneyString(snapshot.fixedPriceOriginalAmount),\n customAmountMin: toMoneyString(snapshot.customAmountMin),\n customAmountMax: toMoneyString(snapshot.customAmountMax),\n customAmountCurrencyCode: snapshot.customAmountCurrencyCode ?? null,\n priceListItems: cloneJson(snapshot.priceListItems ?? []),\n gatewayProviderKey: snapshot.gatewayProviderKey ?? null,\n gatewaySettings: cloneJson(snapshot.gatewaySettings ?? {}),\n customFieldsetCode: snapshot.customFieldsetCode ?? null,\n collectCustomerDetails: snapshot.collectCustomerDetails,\n customerFieldsSchema: cloneJson(snapshot.customerFieldsSchema ?? []),\n legalDocuments: cloneJson(snapshot.legalDocuments ?? {}),\n displayCustomFieldsOnPage: snapshot.displayCustomFieldsOnPage,\n successTitle: snapshot.successTitle ?? null,\n successMessage: snapshot.successMessage ?? null,\n cancelTitle: snapshot.cancelTitle ?? null,\n cancelMessage: snapshot.cancelMessage ?? null,\n errorTitle: snapshot.errorTitle ?? null,\n errorMessage: snapshot.errorMessage ?? null,\n successEmailSubject: snapshot.successEmailSubject ?? null,\n successEmailBody: snapshot.successEmailBody ?? null,\n sendSuccessEmail: snapshot.sendSuccessEmail,\n errorEmailSubject: snapshot.errorEmailSubject ?? null,\n errorEmailBody: snapshot.errorEmailBody ?? null,\n sendErrorEmail: snapshot.sendErrorEmail,\n startEmailSubject: snapshot.startEmailSubject ?? null,\n startEmailBody: snapshot.startEmailBody ?? null,\n sendStartEmail: snapshot.sendStartEmail,\n passwordHash: snapshot.passwordHash ?? null,\n maxCompletions: snapshot.maxCompletions ?? null,\n status: snapshot.status,\n checkoutType: snapshot.checkoutType,\n deletedAt: null,\n }\n}\n\nexport function restoreTemplateFromSnapshot(\n target: CheckoutLinkTemplate,\n snapshot: CheckoutTemplateSnapshot,\n): void {\n Object.assign(target, buildTemplateSnapshotData(snapshot))\n}\n\nexport function restoreLinkFromSnapshot(\n target: CheckoutLink,\n snapshot: CheckoutLinkSnapshot,\n): void {\n Object.assign(target, {\n ...buildTemplateSnapshotData(snapshot),\n slug: snapshot.slug,\n templateId: snapshot.templateId ?? null,\n completionCount: snapshot.completionCount,\n activeReservationCount: snapshot.activeReservationCount,\n isLocked: snapshot.isLocked,\n })\n}\n\nexport function createTemplateFromSnapshot(snapshot: CheckoutTemplateSnapshot) {\n return {\n id: snapshot.id,\n ...buildTemplateSnapshotData(snapshot),\n }\n}\n\nexport function createLinkFromSnapshot(snapshot: CheckoutLinkSnapshot) {\n return {\n id: snapshot.id,\n ...buildTemplateSnapshotData(snapshot),\n slug: snapshot.slug,\n templateId: snapshot.templateId ?? null,\n completionCount: snapshot.completionCount,\n activeReservationCount: snapshot.activeReservationCount,\n isLocked: snapshot.isLocked,\n }\n}\n\nexport function toCheckoutAuditSnapshot(\n snapshot: CheckoutTemplateSnapshot | CheckoutLinkSnapshot,\n): Record<string, unknown> {\n const { passwordHash: _passwordHash, ...rest } = snapshot\n return cloneJson(rest) as Record<string, unknown>\n}\n\nexport { extractUndoPayload }\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport { extractUndoPayload } from '@open-mercato/shared/lib/commands/undo'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport type { CustomFieldSnapshot } from '@open-mercato/shared/lib/commands/customFieldSnapshots'\nimport { CheckoutLink, CheckoutLinkTemplate } from '../data/entities'\nimport { requireCheckoutScope, type CheckoutScope } from '../lib/utils'\nimport { serializeTemplateOrLink, toMoneyString } from '../lib/utils'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport function resolveCommandScope(ctx: CommandRuntimeContext): CheckoutScope {\n return requireCheckoutScope({ auth: ctx.auth })\n}\n\nexport function readCommandId(input: unknown, message: string): string {\n if (typeof input === 'string' && input.trim()) return input\n if (isRecord(input)) {\n if (typeof input.id === 'string' && input.id.trim()) return input.id\n if (isRecord(input.body) && typeof input.body.id === 'string' && input.body.id.trim()) return input.body.id\n }\n throw new CrudHttpError(400, { error: message })\n}\n\ntype CheckoutRecordView = ReturnType<typeof serializeTemplateOrLink>\n\nexport type CheckoutTemplateSnapshot = CheckoutRecordView & {\n organizationId: string\n tenantId: string\n passwordHash: string | null\n custom?: CustomFieldSnapshot\n}\n\nexport type CheckoutLinkSnapshot = CheckoutTemplateSnapshot & {\n slug: string\n templateId: string | null\n completionCount: number\n activeReservationCount: number\n isLocked: boolean\n}\n\nconst PROPAGATED_TEMPLATE_FIELD_KEYS = [\n 'name',\n 'title',\n 'subtitle',\n 'description',\n 'logoAttachmentId',\n 'logoUrl',\n 'primaryColor',\n 'secondaryColor',\n 'backgroundColor',\n 'themeMode',\n 'pricingMode',\n 'fixedPriceAmount',\n 'fixedPriceCurrencyCode',\n 'fixedPriceIncludesTax',\n 'fixedPriceOriginalAmount',\n 'customAmountMin',\n 'customAmountMax',\n 'customAmountCurrencyCode',\n 'priceListItems',\n 'gatewayProviderKey',\n 'gatewaySettings',\n 'customFieldsetCode',\n 'collectCustomerDetails',\n 'customerFieldsSchema',\n 'legalDocuments',\n 'displayCustomFieldsOnPage',\n 'successTitle',\n 'successMessage',\n 'cancelTitle',\n 'cancelMessage',\n 'errorTitle',\n 'errorMessage',\n 'successEmailSubject',\n 'successEmailBody',\n 'sendSuccessEmail',\n 'errorEmailSubject',\n 'errorEmailBody',\n 'sendErrorEmail',\n 'startEmailSubject',\n 'startEmailBody',\n 'sendStartEmail',\n 'passwordHash',\n 'maxCompletions',\n 'checkoutType',\n] as const satisfies ReadonlyArray<keyof CheckoutTemplateSnapshot>\n\ntype PropagatedTemplateFieldKey = (typeof PROPAGATED_TEMPLATE_FIELD_KEYS)[number]\n\nfunction cloneJson<T>(value: T): T {\n if (value == null) return value\n return JSON.parse(JSON.stringify(value)) as T\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n if (left === right) return true\n if (Array.isArray(left) && Array.isArray(right)) {\n return left.length === right.length && left.every((value, index) => valuesEqual(value, right[index]))\n }\n if (\n left &&\n right &&\n typeof left === 'object' &&\n typeof right === 'object' &&\n !Array.isArray(left) &&\n !Array.isArray(right)\n ) {\n const leftKeys = Object.keys(left as Record<string, unknown>).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))\n const rightKeys = Object.keys(right as Record<string, unknown>).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))\n if (!valuesEqual(leftKeys, rightKeys)) return false\n return leftKeys.every((key) => valuesEqual(\n (left as Record<string, unknown>)[key],\n (right as Record<string, unknown>)[key],\n ))\n }\n return false\n}\n\nfunction copyPropagatedTemplateField<K extends PropagatedTemplateFieldKey>(\n snapshot: CheckoutLinkSnapshot,\n nextTemplate: CheckoutTemplateSnapshot,\n key: K,\n): void {\n snapshot[key] = cloneJson(nextTemplate[key]) as CheckoutLinkSnapshot[K]\n}\n\nexport function captureTemplateSnapshot(\n record: CheckoutLinkTemplate,\n custom?: CustomFieldSnapshot,\n): CheckoutTemplateSnapshot {\n return {\n ...cloneJson(serializeTemplateOrLink(record)),\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n passwordHash: record.passwordHash ?? null,\n custom: custom ? cloneJson(custom) : undefined,\n }\n}\n\nexport function captureLinkSnapshot(\n record: CheckoutLink,\n custom?: CustomFieldSnapshot,\n): CheckoutLinkSnapshot {\n return {\n ...captureTemplateSnapshot(record, custom),\n slug: record.slug,\n templateId: record.templateId ?? null,\n completionCount: record.completionCount,\n activeReservationCount: record.activeReservationCount,\n isLocked: record.isLocked,\n }\n}\n\nexport function buildSelectiveLinkedLinkSnapshot(\n current: CheckoutLinkSnapshot,\n previousTemplate: CheckoutTemplateSnapshot,\n nextTemplate: CheckoutTemplateSnapshot,\n): { changed: boolean; snapshot: CheckoutLinkSnapshot } {\n let changed = false\n const snapshot = cloneJson(current)\n\n for (const key of PROPAGATED_TEMPLATE_FIELD_KEYS) {\n if (!valuesEqual(current[key], previousTemplate[key])) continue\n if (valuesEqual(current[key], nextTemplate[key])) continue\n copyPropagatedTemplateField(snapshot, nextTemplate, key)\n changed = true\n }\n\n return { changed, snapshot }\n}\n\nexport function buildSelectiveLinkedCustomFieldUpdates(\n current: CustomFieldSnapshot | undefined,\n previousTemplate: CustomFieldSnapshot | undefined,\n nextTemplate: CustomFieldSnapshot | undefined,\n): Record<string, unknown> {\n const values: Record<string, unknown> = {}\n const keys = new Set<string>()\n if (current) for (const key of Object.keys(current)) keys.add(key)\n if (previousTemplate) for (const key of Object.keys(previousTemplate)) keys.add(key)\n if (nextTemplate) for (const key of Object.keys(nextTemplate)) keys.add(key)\n\n for (const key of keys) {\n const currentValue = current?.[key]\n const previousValue = previousTemplate?.[key]\n if (!valuesEqual(currentValue, previousValue)) continue\n\n const hasNextValue = Boolean(nextTemplate && Object.prototype.hasOwnProperty.call(nextTemplate, key))\n const nextValue = hasNextValue ? nextTemplate?.[key] : undefined\n if (valuesEqual(currentValue, nextValue)) continue\n\n values[key] = hasNextValue\n ? cloneJson(nextValue)\n : Array.isArray(previousValue) ? [] : null\n }\n\n return values\n}\n\nfunction buildTemplateSnapshotData(snapshot: CheckoutTemplateSnapshot) {\n return {\n organizationId: snapshot.organizationId,\n tenantId: snapshot.tenantId,\n name: snapshot.name,\n title: snapshot.title ?? null,\n subtitle: snapshot.subtitle ?? null,\n description: snapshot.description ?? null,\n logoAttachmentId: snapshot.logoAttachmentId ?? null,\n logoUrl: snapshot.logoUrl ?? null,\n primaryColor: snapshot.primaryColor ?? null,\n secondaryColor: snapshot.secondaryColor ?? null,\n backgroundColor: snapshot.backgroundColor ?? null,\n themeMode: snapshot.themeMode,\n pricingMode: snapshot.pricingMode,\n fixedPriceAmount: toMoneyString(snapshot.fixedPriceAmount),\n fixedPriceCurrencyCode: snapshot.fixedPriceCurrencyCode ?? null,\n fixedPriceIncludesTax: snapshot.fixedPriceIncludesTax,\n fixedPriceOriginalAmount: toMoneyString(snapshot.fixedPriceOriginalAmount),\n customAmountMin: toMoneyString(snapshot.customAmountMin),\n customAmountMax: toMoneyString(snapshot.customAmountMax),\n customAmountCurrencyCode: snapshot.customAmountCurrencyCode ?? null,\n priceListItems: cloneJson(snapshot.priceListItems ?? []),\n gatewayProviderKey: snapshot.gatewayProviderKey ?? null,\n gatewaySettings: cloneJson(snapshot.gatewaySettings ?? {}),\n customFieldsetCode: snapshot.customFieldsetCode ?? null,\n collectCustomerDetails: snapshot.collectCustomerDetails,\n customerFieldsSchema: cloneJson(snapshot.customerFieldsSchema ?? []),\n legalDocuments: cloneJson(snapshot.legalDocuments ?? {}),\n displayCustomFieldsOnPage: snapshot.displayCustomFieldsOnPage,\n successTitle: snapshot.successTitle ?? null,\n successMessage: snapshot.successMessage ?? null,\n cancelTitle: snapshot.cancelTitle ?? null,\n cancelMessage: snapshot.cancelMessage ?? null,\n errorTitle: snapshot.errorTitle ?? null,\n errorMessage: snapshot.errorMessage ?? null,\n successEmailSubject: snapshot.successEmailSubject ?? null,\n successEmailBody: snapshot.successEmailBody ?? null,\n sendSuccessEmail: snapshot.sendSuccessEmail,\n errorEmailSubject: snapshot.errorEmailSubject ?? null,\n errorEmailBody: snapshot.errorEmailBody ?? null,\n sendErrorEmail: snapshot.sendErrorEmail,\n startEmailSubject: snapshot.startEmailSubject ?? null,\n startEmailBody: snapshot.startEmailBody ?? null,\n sendStartEmail: snapshot.sendStartEmail,\n passwordHash: snapshot.passwordHash ?? null,\n maxCompletions: snapshot.maxCompletions ?? null,\n status: snapshot.status,\n checkoutType: snapshot.checkoutType,\n deletedAt: null,\n }\n}\n\nexport function restoreTemplateFromSnapshot(\n target: CheckoutLinkTemplate,\n snapshot: CheckoutTemplateSnapshot,\n): void {\n Object.assign(target, buildTemplateSnapshotData(snapshot))\n}\n\nexport function restoreLinkFromSnapshot(\n target: CheckoutLink,\n snapshot: CheckoutLinkSnapshot,\n): void {\n Object.assign(target, {\n ...buildTemplateSnapshotData(snapshot),\n slug: snapshot.slug,\n templateId: snapshot.templateId ?? null,\n completionCount: snapshot.completionCount,\n activeReservationCount: snapshot.activeReservationCount,\n isLocked: snapshot.isLocked,\n })\n}\n\nexport function createTemplateFromSnapshot(snapshot: CheckoutTemplateSnapshot) {\n return {\n id: snapshot.id,\n ...buildTemplateSnapshotData(snapshot),\n }\n}\n\nexport function createLinkFromSnapshot(snapshot: CheckoutLinkSnapshot) {\n return {\n id: snapshot.id,\n ...buildTemplateSnapshotData(snapshot),\n slug: snapshot.slug,\n templateId: snapshot.templateId ?? null,\n completionCount: snapshot.completionCount,\n activeReservationCount: snapshot.activeReservationCount,\n isLocked: snapshot.isLocked,\n }\n}\n\nexport function toCheckoutAuditSnapshot(\n snapshot: CheckoutTemplateSnapshot | CheckoutLinkSnapshot,\n): Record<string, unknown> {\n const { passwordHash: _passwordHash, ...rest } = snapshot\n return cloneJson(rest) as Record<string, unknown>\n}\n\nexport { extractUndoPayload }\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/checkout",
3
- "version": "0.6.6-develop.6339.1.193c6c7c71",
3
+ "version": "0.6.6-develop.6343.1.8120f84f30",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -62,18 +62,18 @@
62
62
  }
63
63
  },
64
64
  "dependencies": {
65
- "@open-mercato/core": "0.6.6-develop.6339.1.193c6c7c71",
66
- "@open-mercato/ui": "0.6.6-develop.6339.1.193c6c7c71",
65
+ "@open-mercato/core": "0.6.6-develop.6343.1.8120f84f30",
66
+ "@open-mercato/ui": "0.6.6-develop.6343.1.8120f84f30",
67
67
  "bcryptjs": "^3.0.3"
68
68
  },
69
69
  "peerDependencies": {
70
70
  "@mikro-orm/postgresql": "^7.0.14",
71
- "@open-mercato/shared": "0.6.6-develop.6339.1.193c6c7c71",
71
+ "@open-mercato/shared": "0.6.6-develop.6343.1.8120f84f30",
72
72
  "react": "^19.0.0",
73
73
  "react-dom": "^19.0.0"
74
74
  },
75
75
  "devDependencies": {
76
- "@open-mercato/shared": "0.6.6-develop.6339.1.193c6c7c71",
76
+ "@open-mercato/shared": "0.6.6-develop.6343.1.8120f84f30",
77
77
  "@types/jest": "^30.0.0",
78
78
  "@types/react": "^19.2.17",
79
79
  "@types/react-dom": "^19.2.3",
@@ -107,8 +107,8 @@ function valuesEqual(left: unknown, right: unknown): boolean {
107
107
  !Array.isArray(left) &&
108
108
  !Array.isArray(right)
109
109
  ) {
110
- const leftKeys = Object.keys(left as Record<string, unknown>).sort()
111
- const rightKeys = Object.keys(right as Record<string, unknown>).sort()
110
+ const leftKeys = Object.keys(left as Record<string, unknown>).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))
111
+ const rightKeys = Object.keys(right as Record<string, unknown>).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))
112
112
  if (!valuesEqual(leftKeys, rightKeys)) return false
113
113
  return leftKeys.every((key) => valuesEqual(
114
114
  (left as Record<string, unknown>)[key],