@hartl-services/medusa-payload-sync 0.1.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.
Files changed (28) hide show
  1. package/.medusa/server/src/admin/index.js +26 -0
  2. package/.medusa/server/src/admin/index.mjs +27 -0
  3. package/.medusa/server/src/modules/payload-sync/domain/contracts.js +35 -0
  4. package/.medusa/server/src/modules/payload-sync/domain/errors.js +54 -0
  5. package/.medusa/server/src/modules/payload-sync/domain/options.js +43 -0
  6. package/.medusa/server/src/modules/payload-sync/domain/reconciliation.js +31 -0
  7. package/.medusa/server/src/modules/payload-sync/domain/status.js +7 -0
  8. package/.medusa/server/src/modules/payload-sync/index.js +15 -0
  9. package/.medusa/server/src/modules/payload-sync/loaders/register-payload-client.js +108 -0
  10. package/.medusa/server/src/modules/payload-sync/service.js +213 -0
  11. package/.medusa/server/src/modules/payload-sync/services/payload-rest-client.js +326 -0
  12. package/.medusa/server/src/scripts/reconcile-payload-catalog.js +160 -0
  13. package/.medusa/server/src/subscribers/payload-sync-product-deleted.js +18 -0
  14. package/.medusa/server/src/subscribers/payload-sync-product-upserted.js +18 -0
  15. package/.medusa/server/src/subscribers/payload-sync-variant-deleted.js +18 -0
  16. package/.medusa/server/src/subscribers/payload-sync-variant-upserted.js +21 -0
  17. package/.medusa/server/src/types/index.js +18 -0
  18. package/.medusa/server/src/types/public.js +3 -0
  19. package/.medusa/server/src/workflows/payload-sync/authoritative-reconciliation.js +357 -0
  20. package/.medusa/server/src/workflows/payload-sync/external-step-failure.js +14 -0
  21. package/.medusa/server/src/workflows/payload-sync/reconcile-catalog.js +103 -0
  22. package/.medusa/server/src/workflows/payload-sync/sync-product.js +78 -0
  23. package/.medusa/server/src/workflows/payload-sync/sync-variant.js +129 -0
  24. package/.medusa/server/src/workflows/payload-sync/unpublish-product.js +36 -0
  25. package/.medusa/server/src/workflows/payload-sync/unpublish-variant.js +36 -0
  26. package/LICENSE +21 -0
  27. package/README.md +507 -0
  28. package/package.json +52 -0
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ const widgetModule = { widgets: [] };
3
+ const routeModule = {
4
+ routes: []
5
+ };
6
+ const menuItemModule = {
7
+ menuItems: []
8
+ };
9
+ const formModule = { customFields: {} };
10
+ const displayModule = {
11
+ displays: {}
12
+ };
13
+ const i18nModule = { resources: {} };
14
+ const cellRendererModule = {};
15
+ const layoutModule = { layouts: [] };
16
+ const plugin = {
17
+ widgetModule,
18
+ routeModule,
19
+ menuItemModule,
20
+ formModule,
21
+ displayModule,
22
+ i18nModule,
23
+ cellRendererModule,
24
+ layoutModule
25
+ };
26
+ module.exports = plugin;
@@ -0,0 +1,27 @@
1
+ const widgetModule = { widgets: [] };
2
+ const routeModule = {
3
+ routes: []
4
+ };
5
+ const menuItemModule = {
6
+ menuItems: []
7
+ };
8
+ const formModule = { customFields: {} };
9
+ const displayModule = {
10
+ displays: {}
11
+ };
12
+ const i18nModule = { resources: {} };
13
+ const cellRendererModule = {};
14
+ const layoutModule = { layouts: [] };
15
+ const plugin = {
16
+ widgetModule,
17
+ routeModule,
18
+ menuItemModule,
19
+ formModule,
20
+ displayModule,
21
+ i18nModule,
22
+ cellRendererModule,
23
+ layoutModule
24
+ };
25
+ export {
26
+ plugin as default
27
+ };
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PayloadAccessResponseSchema = exports.PayloadFieldAccessSchema = exports.PayloadPermissionSchema = exports.MirrorDocumentSchema = exports.PayloadDocumentIdSchema = void 0;
4
+ const zod_1 = require("@medusajs/framework/zod");
5
+ exports.PayloadDocumentIdSchema = zod_1.z.union([zod_1.z.string(), zod_1.z.number()]);
6
+ exports.MirrorDocumentSchema = zod_1.z.object({
7
+ id: exports.PayloadDocumentIdSchema,
8
+ medusaId: zod_1.z.string().min(1),
9
+ _status: zod_1.z.enum(["draft", "published"]),
10
+ });
11
+ exports.PayloadPermissionSchema = zod_1.z.union([
12
+ zod_1.z.boolean(),
13
+ zod_1.z.object({
14
+ permission: zod_1.z.boolean(),
15
+ }),
16
+ ]);
17
+ exports.PayloadFieldAccessSchema = zod_1.z.object({
18
+ read: exports.PayloadPermissionSchema.optional(),
19
+ create: exports.PayloadPermissionSchema.optional(),
20
+ update: exports.PayloadPermissionSchema.optional(),
21
+ });
22
+ exports.PayloadAccessResponseSchema = zod_1.z.object({
23
+ collections: zod_1.z.record(zod_1.z.string(), zod_1.z.object({
24
+ fields: zod_1.z
25
+ .union([
26
+ zod_1.z.boolean(),
27
+ zod_1.z.record(zod_1.z.string(), zod_1.z.union([zod_1.z.boolean(), exports.PayloadFieldAccessSchema])),
28
+ ])
29
+ .default({}),
30
+ read: exports.PayloadPermissionSchema.optional(),
31
+ create: exports.PayloadPermissionSchema.optional(),
32
+ update: exports.PayloadPermissionSchema.optional(),
33
+ })),
34
+ });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcGF5bG9hZC1zeW5jL2RvbWFpbi9jb250cmFjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQTJDO0FBRzlCLFFBQUEsdUJBQXVCLEdBQUcsT0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBOEIzRCxRQUFBLG9CQUFvQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0MsRUFBRSxFQUFFLCtCQUF1QjtJQUMzQixRQUFRLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0IsT0FBTyxFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7Q0FDeEMsQ0FBQyxDQUFBO0FBaUJXLFFBQUEsdUJBQXVCLEdBQUcsT0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3QyxPQUFDLENBQUMsT0FBTyxFQUFFO0lBQ1gsT0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNQLFVBQVUsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFO0tBQ3hCLENBQUM7Q0FDSCxDQUFDLENBQUE7QUFHVyxRQUFBLHdCQUF3QixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0MsSUFBSSxFQUFFLCtCQUF1QixDQUFDLFFBQVEsRUFBRTtJQUN4QyxNQUFNLEVBQUUsK0JBQXVCLENBQUMsUUFBUSxFQUFFO0lBQzFDLE1BQU0sRUFBRSwrQkFBdUIsQ0FBQyxRQUFRLEVBQUU7Q0FDM0MsQ0FBQyxDQUFBO0FBR1csUUFBQSwyQkFBMkIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2xELFdBQVcsRUFBRSxPQUFDLENBQUMsTUFBTSxDQUNuQixPQUFDLENBQUMsTUFBTSxFQUFFLEVBQ1YsT0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sRUFBRSxPQUFDO2FBQ04sS0FBSyxDQUFDO1lBQ0wsT0FBQyxDQUFDLE9BQU8sRUFBRTtZQUNYLE9BQUMsQ0FBQyxNQUFNLENBQ04sT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUNWLE9BQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsZ0NBQXdCLENBQUMsQ0FBQyxDQUNqRDtTQUNGLENBQUM7YUFDRCxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2QsSUFBSSxFQUFFLCtCQUF1QixDQUFDLFFBQVEsRUFBRTtRQUN4QyxNQUFNLEVBQUUsK0JBQXVCLENBQUMsUUFBUSxFQUFFO1FBQzFDLE1BQU0sRUFBRSwrQkFBdUIsQ0FBQyxRQUFRLEVBQUU7S0FDM0MsQ0FBQyxDQUNIO0NBQ0YsQ0FBQyxDQUFBIn0=
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PayloadSyncError = void 0;
4
+ exports.redactPayloadSyncText = redactPayloadSyncText;
5
+ exports.formatPayloadSyncLog = formatPayloadSyncLog;
6
+ class PayloadSyncError extends Error {
7
+ constructor(message, options) {
8
+ super(redactAuthorizationData(message));
9
+ this.name = "PayloadSyncError";
10
+ this.code = options.code;
11
+ this.retryable = options.retryable;
12
+ this.httpStatus = options.httpStatus;
13
+ this.collection = options.collection;
14
+ this.medusaId = options.medusaId;
15
+ }
16
+ }
17
+ exports.PayloadSyncError = PayloadSyncError;
18
+ function redactPayloadSyncText(value, sensitiveValues = []) {
19
+ let redacted = redactAuthorizationData(value);
20
+ for (const sensitiveValue of sensitiveValues) {
21
+ if (sensitiveValue.length > 0) {
22
+ redacted = redacted.replaceAll(sensitiveValue, "[REDACTED]");
23
+ }
24
+ }
25
+ return redacted;
26
+ }
27
+ function redactAuthorizationData(value) {
28
+ return value
29
+ .replace(/bearer\s+[^\s,;]+/gi, "Bearer [REDACTED]")
30
+ .replace(/(?:response\s+)?headers?\s*[:=]\s*\{[^}]*\}/gi, "headers: [REDACTED]")
31
+ .replace(/(authorization|x-api-key|api[-_ ]?key)\s*[:=]\s*[^\r\n,;]+/gi, "$1: [REDACTED]");
32
+ }
33
+ function toSafePayloadSyncError(error) {
34
+ if (error instanceof PayloadSyncError) {
35
+ return error;
36
+ }
37
+ const message = error instanceof Error ? error.message : "Unknown Payload sync error.";
38
+ return new PayloadSyncError(redactPayloadSyncText(message), {
39
+ code: "PAYLOAD_UNKNOWN_ERROR",
40
+ retryable: false,
41
+ });
42
+ }
43
+ function formatPayloadSyncLog(error, context, sensitiveValues = []) {
44
+ const safeError = toSafePayloadSyncError(error);
45
+ return JSON.stringify({
46
+ ...context,
47
+ code: safeError.code,
48
+ message: redactPayloadSyncText(safeError.message, sensitiveValues),
49
+ retryable: safeError.retryable,
50
+ collection: safeError.collection,
51
+ httpStatus: safeError.httpStatus,
52
+ });
53
+ }
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcGF5bG9hZC1zeW5jL2RvbWFpbi9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMEJBLHNEQWFDO0FBaUNELG9EQWVDO0FBL0VELE1BQWEsZ0JBQWlCLFNBQVEsS0FBSztJQU96QyxZQUFZLE9BQWUsRUFBRSxPQUFnQztRQUMzRCxLQUFLLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFBO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUE7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFBO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQTtRQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUE7SUFDbEMsQ0FBQztDQUNGO0FBaEJELDRDQWdCQztBQUVELFNBQWdCLHFCQUFxQixDQUNuQyxLQUFhLEVBQ2Isa0JBQXFDLEVBQUU7SUFFdkMsSUFBSSxRQUFRLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFN0MsS0FBSyxNQUFNLGNBQWMsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUM3QyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQztBQWFELFNBQVMsdUJBQXVCLENBQUMsS0FBYTtJQUM1QyxPQUFPLEtBQUs7U0FDVCxPQUFPLENBQUMscUJBQXFCLEVBQUUsbUJBQW1CLENBQUM7U0FDbkQsT0FBTyxDQUFDLCtDQUErQyxFQUFFLHFCQUFxQixDQUFDO1NBQy9FLE9BQU8sQ0FBQyw4REFBOEQsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO0FBQzlGLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQWM7SUFDNUMsSUFBSSxLQUFLLFlBQVksZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQTtJQUV0RixPQUFPLElBQUksZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDMUQsSUFBSSxFQUFFLHVCQUF1QjtRQUM3QixTQUFTLEVBQUUsS0FBSztLQUNqQixDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQ2xDLEtBQWMsRUFDZCxPQUE4QixFQUM5QixrQkFBcUMsRUFBRTtJQUV2QyxNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUUvQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEIsR0FBRyxPQUFPO1FBQ1YsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO1FBQ3BCLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQztRQUNsRSxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7UUFDOUIsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO1FBQ2hDLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTtLQUNqQyxDQUFDLENBQUE7QUFDSixDQUFDIn0=
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PayloadSyncPluginOptionsSchema = void 0;
4
+ exports.normalizePayloadSyncOptions = normalizePayloadSyncOptions;
5
+ const zod_1 = require("@medusajs/framework/zod");
6
+ const slugSchema = zod_1.z
7
+ .string()
8
+ .trim()
9
+ .regex(/^[a-z0-9][a-z0-9-_]*$/, "Must be a lowercase slug.");
10
+ const payloadUrlSchema = zod_1.z
11
+ .string()
12
+ .trim()
13
+ .refine((value) => {
14
+ try {
15
+ const protocol = new URL(value).protocol;
16
+ return protocol === "http:" || protocol === "https:";
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }, "Must be an http or https URL.")
22
+ .transform((value) => value.replace(/\/$/, ""));
23
+ exports.PayloadSyncPluginOptionsSchema = zod_1.z.object({
24
+ payloadUrl: payloadUrlSchema,
25
+ payloadApiKey: zod_1.z.string().trim().min(1, "Payload API key is required."),
26
+ payloadAuthCollection: slugSchema.default("users"),
27
+ collections: zod_1.z
28
+ .object({
29
+ product: slugSchema.default("medusa-products"),
30
+ variant: slugSchema.default("medusa-product-variants"),
31
+ })
32
+ .default({
33
+ product: "medusa-products",
34
+ variant: "medusa-product-variants",
35
+ }),
36
+ requestTimeoutMs: zod_1.z.number().int().min(100).max(120_000).default(10_000),
37
+ backfillBatchSize: zod_1.z.number().int().min(1).max(500).default(50),
38
+ backfillBatchDelayMs: zod_1.z.number().int().min(0).max(60_000).default(250),
39
+ });
40
+ function normalizePayloadSyncOptions(options) {
41
+ return exports.PayloadSyncPluginOptionsSchema.parse(options);
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3BheWxvYWQtc3luYy9kb21haW4vb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFnREEsa0VBSUM7QUFwREQsaURBQTJDO0FBSTNDLE1BQU0sVUFBVSxHQUFHLE9BQUM7S0FDakIsTUFBTSxFQUFFO0tBQ1IsSUFBSSxFQUFFO0tBQ04sS0FBSyxDQUFDLHVCQUF1QixFQUFFLDJCQUEyQixDQUFDLENBQUE7QUFFOUQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFDO0tBQ3ZCLE1BQU0sRUFBRTtLQUNSLElBQUksRUFBRTtLQUNOLE1BQU0sQ0FDTCxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ1IsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFBO1FBRXhDLE9BQU8sUUFBUSxLQUFLLE9BQU8sSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFBO0lBQ3RELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7QUFDSCxDQUFDLEVBQ0QsK0JBQStCLENBQ2hDO0tBQ0EsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBRXBDLFFBQUEsOEJBQThCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyRCxVQUFVLEVBQUUsZ0JBQWdCO0lBQzVCLGFBQWEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSw4QkFBOEIsQ0FBQztJQUN2RSxxQkFBcUIsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNsRCxXQUFXLEVBQUUsT0FBQztTQUNYLE1BQU0sQ0FBQztRQUNOLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBQzlDLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDO0tBQ3ZELENBQUM7U0FDRCxPQUFPLENBQUM7UUFDUCxPQUFPLEVBQUUsaUJBQWlCO1FBQzFCLE9BQU8sRUFBRSx5QkFBeUI7S0FDbkMsQ0FBQztJQUNKLGdCQUFnQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDeEUsaUJBQWlCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMvRCxvQkFBb0IsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO0NBQ3ZFLENBQUMsQ0FBQTtBQU1GLFNBQWdCLDJCQUEyQixDQUN6QyxPQUFpQztJQUVqQyxPQUFPLHNDQUE4QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUN0RCxDQUFDIn0=
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findStaleIds = findStaleIds;
4
+ exports.emptyReconciliationSummary = emptyReconciliationSummary;
5
+ exports.mergeReconciliationSummary = mergeReconciliationSummary;
6
+ function findStaleIds(mirroredIds, currentIds) {
7
+ return mirroredIds.filter((id) => !currentIds.has(id)).sort();
8
+ }
9
+ function emptyReconciliationSummary() {
10
+ return {
11
+ scannedProducts: 0,
12
+ syncedProducts: 0,
13
+ syncedVariants: 0,
14
+ draftedOrphanProducts: 0,
15
+ draftedOrphanVariants: 0,
16
+ failedProductIds: [],
17
+ };
18
+ }
19
+ function mergeReconciliationSummary(left, right) {
20
+ return {
21
+ scannedProducts: left.scannedProducts + right.scannedProducts,
22
+ syncedProducts: left.syncedProducts + right.syncedProducts,
23
+ syncedVariants: left.syncedVariants + right.syncedVariants,
24
+ draftedOrphanProducts: left.draftedOrphanProducts + right.draftedOrphanProducts,
25
+ draftedOrphanVariants: left.draftedOrphanVariants + right.draftedOrphanVariants,
26
+ failedProductIds: [
27
+ ...new Set([...left.failedProductIds, ...right.failedProductIds]),
28
+ ].sort(),
29
+ };
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb25jaWxpYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wYXlsb2FkLXN5bmMvZG9tYWluL3JlY29uY2lsaWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsb0NBS0M7QUFXRCxnRUFTQztBQUVELGdFQWdCQztBQTNDRCxTQUFnQixZQUFZLENBQzFCLFdBQThCLEVBQzlCLFVBQStCO0lBRS9CLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7QUFDL0QsQ0FBQztBQVdELFNBQWdCLDBCQUEwQjtJQUN4QyxPQUFPO1FBQ0wsZUFBZSxFQUFFLENBQUM7UUFDbEIsY0FBYyxFQUFFLENBQUM7UUFDakIsY0FBYyxFQUFFLENBQUM7UUFDakIscUJBQXFCLEVBQUUsQ0FBQztRQUN4QixxQkFBcUIsRUFBRSxDQUFDO1FBQ3hCLGdCQUFnQixFQUFFLEVBQUU7S0FDckIsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFnQiwwQkFBMEIsQ0FDeEMsSUFBMkIsRUFDM0IsS0FBNEI7SUFFNUIsT0FBTztRQUNMLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlO1FBQzdELGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjO1FBQzFELGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjO1FBQzFELHFCQUFxQixFQUNuQixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDLHFCQUFxQjtRQUMxRCxxQkFBcUIsRUFDbkIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxxQkFBcUI7UUFDMUQsZ0JBQWdCLEVBQUU7WUFDaEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDbEUsQ0FBQyxJQUFJLEVBQUU7S0FDVCxDQUFBO0FBQ0gsQ0FBQyJ9
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toPayloadStatus = toPayloadStatus;
4
+ function toPayloadStatus(status) {
5
+ return status === "published" ? "published" : "draft";
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcGF5bG9hZC1zeW5jL2RvbWFpbi9zdGF0dXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSwwQ0FJQztBQUpELFNBQWdCLGVBQWUsQ0FDN0IsTUFBMkI7SUFFM0IsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtBQUN2RCxDQUFDIn0=
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PAYLOAD_SYNC_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const register_payload_client_1 = __importDefault(require("./loaders/register-payload-client"));
9
+ const service_1 = __importDefault(require("./service"));
10
+ exports.PAYLOAD_SYNC_MODULE = "payload_sync";
11
+ exports.default = (0, utils_1.Module)(exports.PAYLOAD_SYNC_MODULE, {
12
+ service: service_1.default,
13
+ loaders: [register_payload_client_1.default],
14
+ });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wYXlsb2FkLXN5bmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBRWxELGdHQUFxRTtBQUNyRSx3REFBZ0Q7QUFFbkMsUUFBQSxtQkFBbUIsR0FBRyxjQUFjLENBQUE7QUFFakQsa0JBQWUsSUFBQSxjQUFNLEVBQUMsMkJBQW1CLEVBQUU7SUFDekMsT0FBTyxFQUFFLGlCQUF3QjtJQUNqQyxPQUFPLEVBQUUsQ0FBQyxpQ0FBcUIsQ0FBQztDQUNqQyxDQUFDLENBQUEifQ==
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PAYLOAD_SYNC_OPTIONS = exports.PAYLOAD_SYNC_REST_CLIENT = void 0;
4
+ exports.runPayloadPreflight = runPayloadPreflight;
5
+ exports.registerPayloadClient = registerPayloadClient;
6
+ const awilix_1 = require("@medusajs/framework/awilix");
7
+ const errors_1 = require("../domain/errors");
8
+ const options_1 = require("../domain/options");
9
+ const payload_rest_client_1 = require("../services/payload-rest-client");
10
+ exports.PAYLOAD_SYNC_REST_CLIENT = "payloadSyncRestClient";
11
+ exports.PAYLOAD_SYNC_OPTIONS = "payloadSyncOptions";
12
+ async function runPayloadPreflight(client, options, logger) {
13
+ try {
14
+ const access = await client.getAccess();
15
+ assertPayloadCapabilities(access, options);
16
+ return { ok: true, degraded: false };
17
+ }
18
+ catch (error) {
19
+ if (!isDegradedPayloadFailure(error)) {
20
+ throw error;
21
+ }
22
+ logger?.warn((0, errors_1.formatPayloadSyncLog)(error, { operation: "payload-preflight" }, [options.payloadApiKey]));
23
+ return { ok: false, degraded: true };
24
+ }
25
+ }
26
+ async function registerPayloadClient({ container, options, logger, dataLoaderOnly }) {
27
+ const normalizedOptions = (0, options_1.normalizePayloadSyncOptions)(options);
28
+ const client = new payload_rest_client_1.PayloadRestClient(normalizedOptions);
29
+ container.register({
30
+ [exports.PAYLOAD_SYNC_REST_CLIENT]: (0, awilix_1.asValue)(client),
31
+ [exports.PAYLOAD_SYNC_OPTIONS]: (0, awilix_1.asValue)(normalizedOptions),
32
+ });
33
+ if (dataLoaderOnly === true) {
34
+ return;
35
+ }
36
+ await runPayloadPreflight(client, normalizedOptions, logger);
37
+ }
38
+ const REQUIRED_OPERATIONS = ["read", "create", "update"];
39
+ function assertPayloadCapabilities(access, options) {
40
+ assertCollectionCapabilities(access, options.collections.product, [
41
+ "medusaId",
42
+ "title",
43
+ "handle",
44
+ ]);
45
+ assertCollectionCapabilities(access, options.collections.variant, [
46
+ "medusaId",
47
+ "title",
48
+ "product",
49
+ ]);
50
+ }
51
+ function assertCollectionCapabilities(access, collection, requiredFields) {
52
+ if (!(collection in access.collections)) {
53
+ throw missingCapabilityError(collection, collection);
54
+ }
55
+ const collectionAccess = access.collections[collection];
56
+ for (const operation of REQUIRED_OPERATIONS) {
57
+ if (!hasPermission(collectionAccess[operation])) {
58
+ throw missingCapabilityError(collection, `${collection}.${operation}`);
59
+ }
60
+ }
61
+ if (collectionAccess.fields === true) {
62
+ return;
63
+ }
64
+ if (collectionAccess.fields === false) {
65
+ throw missingCapabilityError(collection, `${collection}.${requiredFields[0]}`);
66
+ }
67
+ for (const field of requiredFields) {
68
+ const fieldAccess = collectionAccess.fields[field];
69
+ if (fieldAccess === undefined || typeof fieldAccess === "boolean") {
70
+ continue;
71
+ }
72
+ for (const operation of REQUIRED_OPERATIONS) {
73
+ if (!hasFieldPermission(fieldAccess, operation)) {
74
+ throw missingCapabilityError(collection, `${collection}.${field}.${operation}`);
75
+ }
76
+ }
77
+ }
78
+ }
79
+ function hasFieldPermission(fieldAccess, operation) {
80
+ const permission = fieldAccess[operation];
81
+ return permission !== undefined && hasPermission(permission);
82
+ }
83
+ function hasPermission(permission) {
84
+ return (permission === true ||
85
+ (typeof permission === "object" && permission.permission === true));
86
+ }
87
+ function missingCapabilityError(collection, capability) {
88
+ return new errors_1.PayloadSyncError(`Payload capability ${capability} is missing.`, {
89
+ code: "PAYLOAD_CAPABILITY_MISSING",
90
+ retryable: false,
91
+ collection,
92
+ });
93
+ }
94
+ function isDegradedPayloadFailure(error) {
95
+ if (!(error instanceof errors_1.PayloadSyncError) || !error.retryable) {
96
+ return false;
97
+ }
98
+ if (error.code === "PAYLOAD_NETWORK_ERROR" ||
99
+ error.code === "PAYLOAD_TIMEOUT") {
100
+ return true;
101
+ }
102
+ const status = error.httpStatus;
103
+ return (status === 408 ||
104
+ status === 429 ||
105
+ (status !== undefined && status >= 500 && status < 600));
106
+ }
107
+ exports.default = registerPayloadClient;
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItcGF5bG9hZC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wYXlsb2FkLXN5bmMvbG9hZGVycy9yZWdpc3Rlci1wYXlsb2FkLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1QkEsa0RBNEJDO0FBRUQsc0RBa0JDO0FBdkVELHVEQUFvRDtBQVVwRCw2Q0FHeUI7QUFDekIsK0NBRzBCO0FBQzFCLHlFQUFtRTtBQUV0RCxRQUFBLHdCQUF3QixHQUFHLHVCQUF1QixDQUFBO0FBQ2xELFFBQUEsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUE7QUFFakQsS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxNQUF1QixFQUN2QixPQUFxQyxFQUNyQyxNQUFlO0lBSWYsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUE7UUFFdkMseUJBQXlCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRTFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQTtJQUN0QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztRQUVELE1BQU0sRUFBRSxJQUFJLENBQ1YsSUFBQSw2QkFBb0IsRUFDbEIsS0FBSyxFQUNMLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLEVBQ2xDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUN4QixDQUNGLENBQUE7UUFFRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUE7SUFDdEMsQ0FBQztBQUNILENBQUM7QUFFTSxLQUFLLFVBQVUscUJBQXFC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
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const contracts_1 = require("./domain/contracts");
4
+ const errors_1 = require("./domain/errors");
5
+ const reconciliation_1 = require("./domain/reconciliation");
6
+ const status_1 = require("./domain/status");
7
+ class PayloadSyncModuleService {
8
+ constructor({ payloadSyncRestClient, payloadSyncOptions, }) {
9
+ this.client = payloadSyncRestClient;
10
+ this.options = payloadSyncOptions;
11
+ }
12
+ async findProductMirror(medusaId) {
13
+ return await this.client.findByMedusaId(this.options.collections.product, medusaId);
14
+ }
15
+ async syncProductSnapshot(snapshot) {
16
+ const status = (0, status_1.toPayloadStatus)(snapshot.status);
17
+ const productInput = {
18
+ medusaId: snapshot.id,
19
+ title: snapshot.title,
20
+ handle: snapshot.handle,
21
+ status,
22
+ };
23
+ const product = await this.upsertByMedusaId(this.options.collections.product, productInput.medusaId, {
24
+ medusaId: productInput.medusaId,
25
+ title: productInput.title,
26
+ handle: productInput.handle,
27
+ _status: productInput.status,
28
+ });
29
+ const currentVariantIds = [];
30
+ for (const variant of snapshot.variants) {
31
+ currentVariantIds.push(variant.id);
32
+ await this.syncVariantSnapshot({
33
+ variant,
34
+ payloadProductId: product.id,
35
+ productStatus: snapshot.status,
36
+ });
37
+ }
38
+ const mirroredVariants = await this.listRelatedVariantMirrors(product.id);
39
+ assertUniqueMedusaIds(mirroredVariants, this.options.collections.variant);
40
+ const currentVariantIdSet = new Set(currentVariantIds);
41
+ const draftedStaleVariantIds = (0, reconciliation_1.findStaleIds)(mirroredVariants.map(({ medusaId }) => medusaId), currentVariantIdSet);
42
+ for (const staleId of draftedStaleVariantIds) {
43
+ const staleVariant = mirroredVariants.find(({ medusaId }) => medusaId === staleId);
44
+ if (staleVariant !== undefined) {
45
+ await this.client.updateDocument(this.options.collections.variant, staleVariant.id, { _status: "draft" });
46
+ }
47
+ }
48
+ return {
49
+ product,
50
+ currentVariantIds,
51
+ draftedStaleVariantIds,
52
+ };
53
+ }
54
+ async syncVariantSnapshot(input) {
55
+ const variantInput = {
56
+ medusaId: input.variant.id,
57
+ payloadProductId: input.payloadProductId,
58
+ title: input.variant.title,
59
+ status: (0, status_1.toPayloadStatus)(input.productStatus),
60
+ };
61
+ return await this.upsertByMedusaId(this.options.collections.variant, variantInput.medusaId, {
62
+ medusaId: variantInput.medusaId,
63
+ title: variantInput.title,
64
+ product: variantInput.payloadProductId,
65
+ _status: variantInput.status,
66
+ });
67
+ }
68
+ async unpublishProduct(medusaId) {
69
+ await this.draftProductMirror(medusaId);
70
+ }
71
+ async draftProductMirror(medusaId) {
72
+ const product = await this.client.findByMedusaId(this.options.collections.product, medusaId);
73
+ if (product === null) {
74
+ return null;
75
+ }
76
+ const draftedProduct = await this.client.updateDocument(this.options.collections.product, product.id, {
77
+ _status: "draft",
78
+ });
79
+ const variants = await this.listRelatedVariantMirrors(product.id);
80
+ const draftedStaleVariantIds = [];
81
+ for (const variant of variants) {
82
+ await this.client.updateDocument(this.options.collections.variant, variant.id, {
83
+ _status: "draft",
84
+ });
85
+ draftedStaleVariantIds.push(variant.medusaId);
86
+ }
87
+ return {
88
+ product: draftedProduct,
89
+ currentVariantIds: [],
90
+ draftedStaleVariantIds,
91
+ };
92
+ }
93
+ async unpublishVariant(medusaId) {
94
+ await this.draftVariantMirror(medusaId);
95
+ }
96
+ async draftVariantMirror(medusaId) {
97
+ const variant = await this.client.findByMedusaId(this.options.collections.variant, medusaId);
98
+ if (variant === null) {
99
+ return null;
100
+ }
101
+ return await this.client.updateDocument(this.options.collections.variant, variant.id, {
102
+ _status: "draft",
103
+ });
104
+ }
105
+ async listProductMirrorPage(page, limit) {
106
+ return await this.client.listDocuments({
107
+ collection: this.options.collections.product,
108
+ page,
109
+ limit,
110
+ sort: "medusaId",
111
+ where: new URLSearchParams({ draft: "true" }),
112
+ schema: contracts_1.MirrorDocumentSchema,
113
+ });
114
+ }
115
+ async listVariantMirrorPage(page, limit) {
116
+ return await this.client.listDocuments({
117
+ collection: this.options.collections.variant,
118
+ page,
119
+ limit,
120
+ sort: "medusaId",
121
+ where: new URLSearchParams({ draft: "true" }),
122
+ schema: contracts_1.MirrorDocumentSchema,
123
+ });
124
+ }
125
+ async draftProductMirrorIds(ids) {
126
+ return await this.draftMirrorIds(this.options.collections.product, ids);
127
+ }
128
+ async draftVariantMirrorIds(ids) {
129
+ return await this.draftMirrorIds(this.options.collections.variant, ids);
130
+ }
131
+ getReconciliationOptions() {
132
+ return {
133
+ batchSize: this.options.backfillBatchSize,
134
+ batchDelayMs: this.options.backfillBatchDelayMs,
135
+ };
136
+ }
137
+ async upsertByMedusaId(collection, medusaId, body) {
138
+ const existing = await this.client.findByMedusaId(collection, medusaId);
139
+ if (existing !== null) {
140
+ return await this.client.updateDocument(collection, existing.id, body);
141
+ }
142
+ try {
143
+ return await this.client.createDocument(collection, body);
144
+ }
145
+ catch (error) {
146
+ if (!isPayloadUniqueConflict(error)) {
147
+ throw error;
148
+ }
149
+ const raced = await this.client.findByMedusaId(collection, medusaId);
150
+ if (raced === null) {
151
+ throw error;
152
+ }
153
+ return await this.client.updateDocument(collection, raced.id, body);
154
+ }
155
+ }
156
+ async listRelatedVariantMirrors(payloadProductId) {
157
+ const documents = [];
158
+ let page = 1;
159
+ while (true) {
160
+ const where = new URLSearchParams();
161
+ where.set("where[product][equals]", String(payloadProductId));
162
+ const result = await this.client.listDocuments({
163
+ collection: this.options.collections.variant,
164
+ page,
165
+ limit: this.options.backfillBatchSize,
166
+ sort: "medusaId",
167
+ where,
168
+ schema: contracts_1.MirrorDocumentSchema,
169
+ });
170
+ documents.push(...result.docs);
171
+ if (result.nextPage === null) {
172
+ return documents;
173
+ }
174
+ page = result.nextPage;
175
+ }
176
+ }
177
+ async draftMirrorIds(collection, ids) {
178
+ let changed = 0;
179
+ for (const medusaId of ids) {
180
+ const document = await this.client.findByMedusaId(collection, medusaId);
181
+ if (document === null) {
182
+ continue;
183
+ }
184
+ await this.client.updateDocument(collection, document.id, {
185
+ _status: "draft",
186
+ });
187
+ changed += 1;
188
+ }
189
+ return changed;
190
+ }
191
+ }
192
+ function isPayloadUniqueConflict(error) {
193
+ return (error instanceof errors_1.PayloadSyncError &&
194
+ (error.httpStatus === 409 ||
195
+ (error.httpStatus === 400 &&
196
+ error.code === "PAYLOAD_UNIQUE_MEDUSA_ID_CONFLICT")));
197
+ }
198
+ function assertUniqueMedusaIds(documents, collection) {
199
+ const seen = new Set();
200
+ for (const document of documents) {
201
+ if (seen.has(document.medusaId)) {
202
+ throw new errors_1.PayloadSyncError("Payload contains duplicate Medusa IDs.", {
203
+ code: "PAYLOAD_DUPLICATE_MEDUSA_ID",
204
+ retryable: false,
205
+ collection,
206
+ medusaId: document.medusaId,
207
+ });
208
+ }
209
+ seen.add(document.medusaId);
210
+ }
211
+ }
212
+ exports.default = PayloadSyncModuleService;
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3BheWxvYWQtc3luYy9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0Esa0RBQXlEO0FBQ3pELDRDQUFrRDtBQUVsRCw0REFBc0Q7QUFDdEQsNENBQWlEO0FBRWpELE1BQU0sd0JBQXdCO0lBSTVCLFlBQVksRUFDVixxQkFBcUIsRUFDckIsa0JBQWtCLEdBSW5CO1FBQ0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQTtRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLGtCQUFrQixDQUFBO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBZ0I7UUFDdEMsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQ2hDLFFBQVEsQ0FDVCxDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUIsQ0FDdkIsUUFBK0I7UUFFL0IsTUFBTSxNQUFNLEdBQUcsSUFBQSx3QkFBZSxFQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMvQyxNQUFNLFlBQVksR0FBdUI7WUFDdkMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFO1lBQ3JCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztZQUNyQixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsTUFBTTtTQUNQLENBQUE7UUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUNoQyxZQUFZLENBQUMsUUFBUSxFQUNyQjtZQUNFLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUTtZQUMvQixLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7WUFDekIsTUFBTSxFQUFF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