@tinloof/medusa-sanity-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.
- package/.medusa/server/src/admin/index.js +1521 -0
- package/.medusa/server/src/admin/index.mjs +1520 -0
- package/.medusa/server/src/api/admin/sanity/documents/[id]/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/sanity/documents/[id]/route.d.ts.map +1 -0
- package/.medusa/server/src/api/admin/sanity/documents/[id]/route.js +12 -0
- package/.medusa/server/src/api/admin/sanity/entities/[entityType]/[id]/sync/route.d.ts +7 -0
- package/.medusa/server/src/api/admin/sanity/entities/[entityType]/[id]/sync/route.d.ts.map +1 -0
- package/.medusa/server/src/api/admin/sanity/entities/[entityType]/[id]/sync/route.js +23 -0
- package/.medusa/server/src/api/admin/sanity/syncs/route.d.ts +14 -0
- package/.medusa/server/src/api/admin/sanity/syncs/route.d.ts.map +1 -0
- package/.medusa/server/src/api/admin/sanity/syncs/route.js +60 -0
- package/.medusa/server/src/core/default-entities.d.ts +35 -0
- package/.medusa/server/src/core/default-entities.d.ts.map +1 -0
- package/.medusa/server/src/core/default-entities.js +67 -0
- package/.medusa/server/src/core/entity-registry.d.ts +15 -0
- package/.medusa/server/src/core/entity-registry.d.ts.map +1 -0
- package/.medusa/server/src/core/entity-registry.js +35 -0
- package/.medusa/server/src/core/index.d.ts +4 -0
- package/.medusa/server/src/core/index.d.ts.map +1 -0
- package/.medusa/server/src/core/index.js +17 -0
- package/.medusa/server/src/core/transformer.d.ts +49 -0
- package/.medusa/server/src/core/transformer.d.ts.map +1 -0
- package/.medusa/server/src/core/transformer.js +76 -0
- package/.medusa/server/src/event-batcher/event-batcher.d.ts +29 -0
- package/.medusa/server/src/event-batcher/event-batcher.d.ts.map +1 -0
- package/.medusa/server/src/event-batcher/event-batcher.js +93 -0
- package/.medusa/server/src/event-batcher/event-buffer.d.ts +35 -0
- package/.medusa/server/src/event-batcher/event-buffer.d.ts.map +1 -0
- package/.medusa/server/src/event-batcher/event-buffer.js +127 -0
- package/.medusa/server/src/event-batcher/index.d.ts +4 -0
- package/.medusa/server/src/event-batcher/index.d.ts.map +1 -0
- package/.medusa/server/src/event-batcher/index.js +8 -0
- package/.medusa/server/src/event-batcher/types.d.ts +50 -0
- package/.medusa/server/src/event-batcher/types.d.ts.map +1 -0
- package/.medusa/server/src/event-batcher/types.js +3 -0
- package/.medusa/server/src/index.d.ts +40 -0
- package/.medusa/server/src/index.d.ts.map +1 -0
- package/.medusa/server/src/index.js +62 -0
- package/.medusa/server/src/modules/sanity/index.d.ts +8 -0
- package/.medusa/server/src/modules/sanity/index.d.ts.map +1 -0
- package/.medusa/server/src/modules/sanity/index.js +15 -0
- package/.medusa/server/src/modules/sanity/service.d.ts +115 -0
- package/.medusa/server/src/modules/sanity/service.d.ts.map +1 -0
- package/.medusa/server/src/modules/sanity/service.js +301 -0
- package/.medusa/server/src/subscribers/factory.d.ts +43 -0
- package/.medusa/server/src/subscribers/factory.d.ts.map +1 -0
- package/.medusa/server/src/subscribers/factory.js +68 -0
- package/.medusa/server/src/subscribers/index.d.ts +9 -0
- package/.medusa/server/src/subscribers/index.d.ts.map +1 -0
- package/.medusa/server/src/subscribers/index.js +13 -0
- package/.medusa/server/src/subscribers/sanity-sync.d.ts +10 -0
- package/.medusa/server/src/subscribers/sanity-sync.d.ts.map +1 -0
- package/.medusa/server/src/subscribers/sanity-sync.js +81 -0
- package/.medusa/server/src/types/index.d.ts +189 -0
- package/.medusa/server/src/types/index.d.ts.map +1 -0
- package/.medusa/server/src/types/index.js +3 -0
- package/.medusa/server/src/workflows/index.d.ts +2 -0
- package/.medusa/server/src/workflows/index.d.ts.map +1 -0
- package/.medusa/server/src/workflows/index.js +6 -0
- package/.medusa/server/src/workflows/sanity-sync-products/index.d.ts +6 -0
- package/.medusa/server/src/workflows/sanity-sync-products/index.d.ts.map +1 -0
- package/.medusa/server/src/workflows/sanity-sync-products/index.js +16 -0
- package/.medusa/server/src/workflows/sanity-sync-products/steps/sync.d.ts +4 -0
- package/.medusa/server/src/workflows/sanity-sync-products/steps/sync.d.ts.map +1 -0
- package/.medusa/server/src/workflows/sanity-sync-products/steps/sync.js +90 -0
- package/README.md +459 -0
- package/package.json +120 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import type { Logger } from "@medusajs/framework/types";
|
|
2
|
+
import type { SanityClient } from "@sanity/client";
|
|
3
|
+
import type { BatcherConfig } from "../event-batcher";
|
|
4
|
+
/**
|
|
5
|
+
* Context passed to sync handlers
|
|
6
|
+
*/
|
|
7
|
+
export type SyncContext = {
|
|
8
|
+
sanityClient: SanityClient;
|
|
9
|
+
logger: Logger;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Custom sync handlers for create/update/delete operations
|
|
13
|
+
*/
|
|
14
|
+
export type SyncHandlers<T = any> = {
|
|
15
|
+
/**
|
|
16
|
+
* Handle entity creation. Receives raw Medusa data.
|
|
17
|
+
* Default: transform + sanity client.create()
|
|
18
|
+
*/
|
|
19
|
+
onCreate?: (entityType: string, id: string, data: T, ctx: SyncContext) => Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Handle entity update. Receives raw Medusa data.
|
|
22
|
+
* Default: transform + sanity client.patch()
|
|
23
|
+
*/
|
|
24
|
+
onUpdate?: (entityType: string, id: string, data: T, ctx: SyncContext) => Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Handle entity deletion. Only receives ID.
|
|
27
|
+
* Default: sanity client.delete()
|
|
28
|
+
*/
|
|
29
|
+
onDelete?: (entityType: string, id: string, ctx: SyncContext) => Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Entity definition for configuring how a Medusa entity syncs to Sanity.
|
|
33
|
+
*/
|
|
34
|
+
export type EntityDefinition = {
|
|
35
|
+
/**
|
|
36
|
+
* Medusa entity name (e.g., "product", "product_category", "product_collection")
|
|
37
|
+
*/
|
|
38
|
+
medusaEntity: string;
|
|
39
|
+
/**
|
|
40
|
+
* Sanity document type to create/update
|
|
41
|
+
*/
|
|
42
|
+
sanityType: string;
|
|
43
|
+
/**
|
|
44
|
+
* Events that trigger sync (e.g., ["product.created", "product.updated"])
|
|
45
|
+
*/
|
|
46
|
+
events: string[];
|
|
47
|
+
/**
|
|
48
|
+
* Additional fields or relations to query from Medusa.
|
|
49
|
+
* All entity fields are fetched by default using "*".
|
|
50
|
+
* Use this to fetch relations like "images.*", "variants.*", etc.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* // Fetch product images and variants
|
|
55
|
+
* queryFields: ["images.*", "variants.*"]
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
queryFields?: string[];
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Top-level transformer function signature.
|
|
62
|
+
* This single function handles all entity transformations.
|
|
63
|
+
*
|
|
64
|
+
* @param entityType - The Medusa entity type (e.g., "product", "product_category")
|
|
65
|
+
* @param data - The raw Medusa entity data
|
|
66
|
+
* @returns The transformed data for Sanity (without _type and _id, those are added automatically)
|
|
67
|
+
*/
|
|
68
|
+
export type TransformerFunction<T = any> = (entityType: string, data: T) => Record<string, any>;
|
|
69
|
+
/**
|
|
70
|
+
* Main plugin options for configuring the Sanity Sync plugin
|
|
71
|
+
*/
|
|
72
|
+
export type SanitySyncPluginOptions = {
|
|
73
|
+
/**
|
|
74
|
+
* Sanity API token with write permissions
|
|
75
|
+
*/
|
|
76
|
+
api_token: string;
|
|
77
|
+
/**
|
|
78
|
+
* Sanity project ID
|
|
79
|
+
*/
|
|
80
|
+
project_id: string;
|
|
81
|
+
/**
|
|
82
|
+
* Sanity API version (e.g., "2024-01-01")
|
|
83
|
+
*/
|
|
84
|
+
api_version: string;
|
|
85
|
+
/**
|
|
86
|
+
* Sanity dataset to use
|
|
87
|
+
*/
|
|
88
|
+
dataset: "production" | "development" | string;
|
|
89
|
+
/**
|
|
90
|
+
* URL to the Sanity Studio (for generating links in Admin UI)
|
|
91
|
+
*/
|
|
92
|
+
studio_url?: string;
|
|
93
|
+
/**
|
|
94
|
+
* Entity definitions for syncing.
|
|
95
|
+
* If not provided, default product entity is used.
|
|
96
|
+
* If provided, it replaces the defaults - use defaultProductEntity to include it.
|
|
97
|
+
*/
|
|
98
|
+
entities?: EntityDefinition[];
|
|
99
|
+
/**
|
|
100
|
+
* Global transformer function for all entities.
|
|
101
|
+
* If not provided, a default transformer is used that maps basic fields.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* transformer: (entityType, data) => {
|
|
106
|
+
* switch (entityType) {
|
|
107
|
+
* case "product":
|
|
108
|
+
* return { title: data.title, handle: data.handle };
|
|
109
|
+
* case "product_category":
|
|
110
|
+
* return { name: data.name, handle: data.handle };
|
|
111
|
+
* default:
|
|
112
|
+
* return data;
|
|
113
|
+
* }
|
|
114
|
+
* }
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
transformer?: TransformerFunction;
|
|
118
|
+
/**
|
|
119
|
+
* Batching configuration for event processing.
|
|
120
|
+
* If not provided, defaults to: flushInterval=10000ms, maxBatchSize=50, enabled=true
|
|
121
|
+
*/
|
|
122
|
+
batching?: BatcherConfig;
|
|
123
|
+
/**
|
|
124
|
+
* Custom sync handlers for create/update/delete operations.
|
|
125
|
+
* If not provided, uses default Sanity create/patch/delete operations.
|
|
126
|
+
*/
|
|
127
|
+
syncHandlers?: SyncHandlers;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Module options passed to the Sanity module service (internal use)
|
|
131
|
+
*/
|
|
132
|
+
export type SanityModuleOptions = {
|
|
133
|
+
api_token: string;
|
|
134
|
+
project_id: string;
|
|
135
|
+
api_version: string;
|
|
136
|
+
dataset: string;
|
|
137
|
+
studio_url?: string;
|
|
138
|
+
entities?: EntityDefinition[];
|
|
139
|
+
transformer?: TransformerFunction;
|
|
140
|
+
batching?: BatcherConfig;
|
|
141
|
+
syncHandlers?: SyncHandlers;
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Input for the generic sync entities workflow
|
|
145
|
+
*/
|
|
146
|
+
export type SyncEntitiesInput = {
|
|
147
|
+
/**
|
|
148
|
+
* The entity type to sync (e.g., "product", "product_category")
|
|
149
|
+
*/
|
|
150
|
+
entityType: string;
|
|
151
|
+
/**
|
|
152
|
+
* Optional list of entity IDs to sync. If not provided, syncs all entities.
|
|
153
|
+
*/
|
|
154
|
+
ids?: string[];
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Result of a sync operation
|
|
158
|
+
*/
|
|
159
|
+
export type SyncResult = {
|
|
160
|
+
/**
|
|
161
|
+
* Total number of entities synced
|
|
162
|
+
*/
|
|
163
|
+
total: number;
|
|
164
|
+
/**
|
|
165
|
+
* Number of entities created
|
|
166
|
+
*/
|
|
167
|
+
created: number;
|
|
168
|
+
/**
|
|
169
|
+
* Number of entities updated
|
|
170
|
+
*/
|
|
171
|
+
updated: number;
|
|
172
|
+
/**
|
|
173
|
+
* Any errors that occurred during sync
|
|
174
|
+
*/
|
|
175
|
+
errors: Array<{
|
|
176
|
+
id: string;
|
|
177
|
+
error: string;
|
|
178
|
+
}>;
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* Upsert map entry for tracking sync operations (used for compensation)
|
|
182
|
+
*/
|
|
183
|
+
export type UpsertMapEntry = {
|
|
184
|
+
id: string;
|
|
185
|
+
before: any;
|
|
186
|
+
after: any;
|
|
187
|
+
isCreate: boolean;
|
|
188
|
+
};
|
|
189
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/workflows/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncEntitiesWorkflow = void 0;
|
|
4
|
+
var sanity_sync_products_1 = require("./sanity-sync-products");
|
|
5
|
+
Object.defineProperty(exports, "syncEntitiesWorkflow", { enumerable: true, get: function () { return sanity_sync_products_1.syncEntitiesWorkflow; } });
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtEQUE4RDtBQUFyRCw0SEFBQSxvQkFBb0IsT0FBQSJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SyncEntitiesInput, SyncResult } from "../../types";
|
|
2
|
+
/**
|
|
3
|
+
* Workflow for syncing any entity type to Sanity.
|
|
4
|
+
*/
|
|
5
|
+
export declare const syncEntitiesWorkflow: import("@medusajs/framework/workflows-sdk").ReturnWorkflow<SyncEntitiesInput, SyncResult, []>;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/workflows/sanity-sync-products/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGjE;;GAEG;AACH,eAAO,MAAM,oBAAoB,+FAShC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncEntitiesWorkflow = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const sync_1 = require("./steps/sync");
|
|
6
|
+
/**
|
|
7
|
+
* Workflow for syncing any entity type to Sanity.
|
|
8
|
+
*/
|
|
9
|
+
exports.syncEntitiesWorkflow = (0, workflows_sdk_1.createWorkflow)({
|
|
10
|
+
name: "sanity-sync-entities",
|
|
11
|
+
retentionTime: 10_000,
|
|
12
|
+
}, (input) => {
|
|
13
|
+
const result = (0, sync_1.syncStep)(input);
|
|
14
|
+
return new workflows_sdk_1.WorkflowResponse(result);
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3Nhbml0eS1zeW5jLXByb2R1Y3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUcyQztBQUczQyx1Q0FBd0M7QUFFeEM7O0dBRUc7QUFDVSxRQUFBLG9CQUFvQixHQUFHLElBQUEsOEJBQWMsRUFDaEQ7SUFDRSxJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLGFBQWEsRUFBRSxNQUFNO0NBQ3RCLEVBQ0QsQ0FBQyxLQUF3QixFQUFnQyxFQUFFO0lBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUEsZUFBUSxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQ0YsQ0FBQyJ9
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SyncEntitiesInput, SyncResult } from "../../../types";
|
|
2
|
+
export type SyncStepInput = SyncEntitiesInput;
|
|
3
|
+
export declare const syncStep: import("@medusajs/framework/workflows-sdk").StepFunction<SyncEntitiesInput, SyncResult>;
|
|
4
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../../../../src/workflows/sanity-sync-products/steps/sync.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EAEX,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAE9C,eAAO,MAAM,QAAQ,yFAoHpB,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncStep = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
const sanity_1 = require("../../../modules/sanity");
|
|
7
|
+
exports.syncStep = (0, workflows_sdk_1.createStep)({ name: "sync-step", async: true }, async (input, { container }) => {
|
|
8
|
+
const sanityModule = container.resolve(sanity_1.SANITY_MODULE);
|
|
9
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
10
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
11
|
+
const entityRegistry = sanityModule.getEntityRegistry();
|
|
12
|
+
const entity = entityRegistry.get(input.entityType);
|
|
13
|
+
if (!entity) {
|
|
14
|
+
return workflows_sdk_1.StepResponse.permanentFailure(`Entity type "${input.entityType}" is not registered`, []);
|
|
15
|
+
}
|
|
16
|
+
const upsertMap = [];
|
|
17
|
+
const result = {
|
|
18
|
+
total: 0,
|
|
19
|
+
created: 0,
|
|
20
|
+
updated: 0,
|
|
21
|
+
errors: [],
|
|
22
|
+
};
|
|
23
|
+
const batchSize = 200;
|
|
24
|
+
let hasMore = true;
|
|
25
|
+
let offset = 0;
|
|
26
|
+
// Build filters
|
|
27
|
+
const filters = input.ids ? { id: input.ids } : {};
|
|
28
|
+
// Use explicit queryFields if provided, otherwise fall back to wildcard
|
|
29
|
+
const queryFields = entity.queryFields?.length
|
|
30
|
+
? entity.queryFields
|
|
31
|
+
: ["*"];
|
|
32
|
+
while (hasMore) {
|
|
33
|
+
const { data: entities, metadata: { count } = { count: 0 } } = await query.graph({
|
|
34
|
+
entity: entity.medusaEntity,
|
|
35
|
+
fields: queryFields,
|
|
36
|
+
filters,
|
|
37
|
+
pagination: {
|
|
38
|
+
skip: offset,
|
|
39
|
+
take: batchSize,
|
|
40
|
+
order: {
|
|
41
|
+
id: "ASC",
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
try {
|
|
46
|
+
await Promise.all(entities.map(async (entityData) => {
|
|
47
|
+
try {
|
|
48
|
+
// Get existing sanity document for rollback purposes
|
|
49
|
+
const existingDoc = await sanityModule.retrieve(entityData.id);
|
|
50
|
+
const { document, isCreate } = await sanityModule.upsertSyncDocument(input.entityType, entityData);
|
|
51
|
+
upsertMap.push({
|
|
52
|
+
id: entityData.id,
|
|
53
|
+
before: existingDoc,
|
|
54
|
+
after: document,
|
|
55
|
+
isCreate,
|
|
56
|
+
});
|
|
57
|
+
if (isCreate) {
|
|
58
|
+
result.created += 1;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
result.updated += 1;
|
|
62
|
+
}
|
|
63
|
+
result.total += 1;
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
const errorMessage = e instanceof Error ? e.message : String(e);
|
|
67
|
+
result.errors.push({
|
|
68
|
+
id: entityData.id,
|
|
69
|
+
error: errorMessage,
|
|
70
|
+
});
|
|
71
|
+
logger.error(`Failed to sync ${input.entityType} ${entityData.id}: ${errorMessage}`);
|
|
72
|
+
}
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
return workflows_sdk_1.StepResponse.permanentFailure(`An error occurred while syncing documents: ${e}`, upsertMap);
|
|
77
|
+
}
|
|
78
|
+
offset += batchSize;
|
|
79
|
+
hasMore = offset < count;
|
|
80
|
+
}
|
|
81
|
+
logger.info(`Synced ${result.total} ${input.entityType}(s) to Sanity (${result.created} created, ${result.updated} updated, ${result.errors.length} errors)`);
|
|
82
|
+
return new workflows_sdk_1.StepResponse(result, upsertMap);
|
|
83
|
+
}, async (upsertMap, { container }) => {
|
|
84
|
+
if (!upsertMap || upsertMap.length === 0) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const sanityModule = container.resolve(sanity_1.SANITY_MODULE);
|
|
88
|
+
await sanityModule.compensate(upsertMap);
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc2FuaXR5LXN5bmMtcHJvZHVjdHMvc3RlcHMvc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBc0U7QUFDdEUscUVBQTZFO0FBRTdFLG9EQUF3RDtBQVUzQyxRQUFBLFFBQVEsR0FBRyxJQUFBLDBCQUFVLEVBQ2hDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQ2xDLEtBQUssRUFBRSxLQUFvQixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUM1QyxNQUFNLFlBQVksR0FBd0IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxzQkFBYSxDQUFDLENBQUM7SUFDM0UsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRW5FLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXBELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sNEJBQVksQ0FBQyxnQkFBZ0IsQ0FDbEMsZ0JBQWdCLEtBQUssQ0FBQyxVQUFVLHFCQUFxQixFQUNyRCxFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBcUIsRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sTUFBTSxHQUFlO1FBQ3pCLEtBQUssRUFBRSxDQUFDO1FBQ1IsT0FBTyxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQztRQUNWLE1BQU0sRUFBRSxFQUFFO0tBQ1gsQ0FB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
|