@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.
- package/.medusa/server/src/admin/index.js +26 -0
- package/.medusa/server/src/admin/index.mjs +27 -0
- package/.medusa/server/src/modules/payload-sync/domain/contracts.js +35 -0
- package/.medusa/server/src/modules/payload-sync/domain/errors.js +54 -0
- package/.medusa/server/src/modules/payload-sync/domain/options.js +43 -0
- package/.medusa/server/src/modules/payload-sync/domain/reconciliation.js +31 -0
- package/.medusa/server/src/modules/payload-sync/domain/status.js +7 -0
- package/.medusa/server/src/modules/payload-sync/index.js +15 -0
- package/.medusa/server/src/modules/payload-sync/loaders/register-payload-client.js +108 -0
- package/.medusa/server/src/modules/payload-sync/service.js +213 -0
- package/.medusa/server/src/modules/payload-sync/services/payload-rest-client.js +326 -0
- package/.medusa/server/src/scripts/reconcile-payload-catalog.js +160 -0
- package/.medusa/server/src/subscribers/payload-sync-product-deleted.js +18 -0
- package/.medusa/server/src/subscribers/payload-sync-product-upserted.js +18 -0
- package/.medusa/server/src/subscribers/payload-sync-variant-deleted.js +18 -0
- package/.medusa/server/src/subscribers/payload-sync-variant-upserted.js +21 -0
- package/.medusa/server/src/types/index.js +18 -0
- package/.medusa/server/src/types/public.js +3 -0
- package/.medusa/server/src/workflows/payload-sync/authoritative-reconciliation.js +357 -0
- package/.medusa/server/src/workflows/payload-sync/external-step-failure.js +14 -0
- package/.medusa/server/src/workflows/payload-sync/reconcile-catalog.js +103 -0
- package/.medusa/server/src/workflows/payload-sync/sync-product.js +78 -0
- package/.medusa/server/src/workflows/payload-sync/sync-variant.js +129 -0
- package/.medusa/server/src/workflows/payload-sync/unpublish-product.js +36 -0
- package/.medusa/server/src/workflows/payload-sync/unpublish-variant.js +36 -0
- package/LICENSE +21 -0
- package/README.md +507 -0
- package/package.json +52 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PayloadRestClient = void 0;
|
|
4
|
+
const zod_1 = require("@medusajs/framework/zod");
|
|
5
|
+
const contracts_1 = require("../domain/contracts");
|
|
6
|
+
const errors_1 = require("../domain/errors");
|
|
7
|
+
const MAX_RESPONSE_EXCERPT_LENGTH = 512;
|
|
8
|
+
const MAX_SUCCESS_RESPONSE_BYTES = 8 * 1024 * 1024;
|
|
9
|
+
const findByMedusaIdResponseSchema = zod_1.z.object({
|
|
10
|
+
docs: zod_1.z.array(contracts_1.MirrorDocumentSchema),
|
|
11
|
+
});
|
|
12
|
+
const mirrorWriteEnvelopeSchema = zod_1.z.object({
|
|
13
|
+
doc: contracts_1.MirrorDocumentSchema,
|
|
14
|
+
});
|
|
15
|
+
const mirrorWriteResponseSchema = zod_1.z.preprocess((response) => ({
|
|
16
|
+
representation: ownsDoc(response) ? "envelope" : "document",
|
|
17
|
+
response,
|
|
18
|
+
}), zod_1.z
|
|
19
|
+
.discriminatedUnion("representation", [
|
|
20
|
+
zod_1.z.object({
|
|
21
|
+
representation: zod_1.z.literal("envelope"),
|
|
22
|
+
response: mirrorWriteEnvelopeSchema,
|
|
23
|
+
}),
|
|
24
|
+
zod_1.z.object({
|
|
25
|
+
representation: zod_1.z.literal("document"),
|
|
26
|
+
response: contracts_1.MirrorDocumentSchema,
|
|
27
|
+
}),
|
|
28
|
+
])
|
|
29
|
+
.transform((parsed) => parsed.representation === "envelope"
|
|
30
|
+
? parsed.response.doc
|
|
31
|
+
: parsed.response));
|
|
32
|
+
const uniqueMedusaIdValidationErrorSchema = zod_1.z.object({
|
|
33
|
+
errors: zod_1.z.tuple([
|
|
34
|
+
zod_1.z.object({
|
|
35
|
+
name: zod_1.z.literal("ValidationError"),
|
|
36
|
+
data: zod_1.z.object({
|
|
37
|
+
collection: zod_1.z.string(),
|
|
38
|
+
errors: zod_1.z.tuple([
|
|
39
|
+
zod_1.z.object({
|
|
40
|
+
path: zod_1.z.literal("medusaId"),
|
|
41
|
+
}),
|
|
42
|
+
]),
|
|
43
|
+
}),
|
|
44
|
+
}),
|
|
45
|
+
]),
|
|
46
|
+
});
|
|
47
|
+
class PayloadRestClient {
|
|
48
|
+
constructor(options, fetchImpl = globalThis.fetch) {
|
|
49
|
+
this.options = options;
|
|
50
|
+
this.fetchImpl = fetchImpl;
|
|
51
|
+
this.origin = new URL(options.payloadUrl).origin;
|
|
52
|
+
}
|
|
53
|
+
async requestJson(path, init, schema) {
|
|
54
|
+
const controller = new AbortController();
|
|
55
|
+
let timedOut = false;
|
|
56
|
+
const timeout = setTimeout(() => {
|
|
57
|
+
timedOut = true;
|
|
58
|
+
controller.abort();
|
|
59
|
+
}, this.options.requestTimeoutMs);
|
|
60
|
+
const { body, headers: suppliedHeaders, signal: suppliedSignal, ...requestInit } = init;
|
|
61
|
+
const headers = new Headers(suppliedHeaders);
|
|
62
|
+
headers.set("Authorization", `${this.options.payloadAuthCollection} API-Key ${this.options.payloadApiKey}`);
|
|
63
|
+
headers.set("Accept", "application/json");
|
|
64
|
+
if (body === undefined || body === null) {
|
|
65
|
+
headers.delete("Content-Type");
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
headers.set("Content-Type", "application/json");
|
|
69
|
+
}
|
|
70
|
+
const abortSuppliedRequest = () => controller.abort();
|
|
71
|
+
suppliedSignal?.addEventListener("abort", abortSuppliedRequest, { once: true });
|
|
72
|
+
try {
|
|
73
|
+
const url = this.urlFor(path);
|
|
74
|
+
const collection = this.collectionFor(url);
|
|
75
|
+
const response = await this.fetchImpl(url, {
|
|
76
|
+
...requestInit,
|
|
77
|
+
body,
|
|
78
|
+
headers,
|
|
79
|
+
signal: controller.signal,
|
|
80
|
+
});
|
|
81
|
+
if (!response.ok) {
|
|
82
|
+
throw await this.httpError(response, collection);
|
|
83
|
+
}
|
|
84
|
+
const responseText = await this.successResponseText(response, collection);
|
|
85
|
+
let responseBody;
|
|
86
|
+
try {
|
|
87
|
+
responseBody = JSON.parse(responseText);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
throw this.invalidResponseError(responseText, collection);
|
|
91
|
+
}
|
|
92
|
+
const parsed = schema.safeParse(responseBody);
|
|
93
|
+
if (!parsed.success) {
|
|
94
|
+
throw this.invalidResponseError(responseText, collection);
|
|
95
|
+
}
|
|
96
|
+
return parsed.data;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (error instanceof errors_1.PayloadSyncError) {
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
if (timedOut || isAbortError(error)) {
|
|
103
|
+
throw new errors_1.PayloadSyncError("Payload request timed out.", {
|
|
104
|
+
code: "PAYLOAD_TIMEOUT",
|
|
105
|
+
retryable: true,
|
|
106
|
+
collection: this.collectionForPath(path),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
throw new errors_1.PayloadSyncError("Payload network request failed.", {
|
|
110
|
+
code: "PAYLOAD_NETWORK_ERROR",
|
|
111
|
+
retryable: true,
|
|
112
|
+
collection: this.collectionForPath(path),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
clearTimeout(timeout);
|
|
117
|
+
suppliedSignal?.removeEventListener("abort", abortSuppliedRequest);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async findByMedusaId(collection, medusaId) {
|
|
121
|
+
const query = new URLSearchParams();
|
|
122
|
+
query.set("depth", "0");
|
|
123
|
+
query.set("limit", "2");
|
|
124
|
+
query.set("where[medusaId][equals]", medusaId);
|
|
125
|
+
const response = await this.requestJson(this.collectionPath(collection, query), { method: "GET" }, findByMedusaIdResponseSchema);
|
|
126
|
+
if (response.docs.length >= 2) {
|
|
127
|
+
throw new errors_1.PayloadSyncError("Payload contains duplicate Medusa IDs.", {
|
|
128
|
+
code: "PAYLOAD_DUPLICATE_MEDUSA_ID",
|
|
129
|
+
retryable: false,
|
|
130
|
+
collection,
|
|
131
|
+
medusaId,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return response.docs[0] ?? null;
|
|
135
|
+
}
|
|
136
|
+
createDocument(collection, body) {
|
|
137
|
+
return this.requestJson(this.collectionPath(collection), { method: "POST", body: JSON.stringify(body) }, mirrorWriteResponseSchema);
|
|
138
|
+
}
|
|
139
|
+
updateDocument(collection, id, body) {
|
|
140
|
+
return this.requestJson(`${this.collectionPath(collection)}/${encodeURIComponent(String(id))}`, { method: "PATCH", body: JSON.stringify(body) }, mirrorWriteResponseSchema);
|
|
141
|
+
}
|
|
142
|
+
async listDocuments(input) {
|
|
143
|
+
const query = new URLSearchParams(input.where);
|
|
144
|
+
query.set("page", String(input.page));
|
|
145
|
+
query.set("limit", String(input.limit));
|
|
146
|
+
query.set("sort", input.sort);
|
|
147
|
+
return await this.requestJson(this.collectionPath(input.collection, query), { method: "GET" }, payloadPageSchema(input.schema));
|
|
148
|
+
}
|
|
149
|
+
getAccess() {
|
|
150
|
+
return this.requestJson("/api/access", { method: "GET" }, contracts_1.PayloadAccessResponseSchema);
|
|
151
|
+
}
|
|
152
|
+
collectionPath(collection, query) {
|
|
153
|
+
const path = `/api/${encodeURIComponent(collection)}`;
|
|
154
|
+
return query === undefined || query.size === 0 ? path : `${path}?${query.toString()}`;
|
|
155
|
+
}
|
|
156
|
+
urlFor(path) {
|
|
157
|
+
if (!path.startsWith("/api/")) {
|
|
158
|
+
throw invalidRequestPathError();
|
|
159
|
+
}
|
|
160
|
+
const url = new URL(path, this.origin);
|
|
161
|
+
if (url.origin !== this.origin || !url.pathname.startsWith("/api/")) {
|
|
162
|
+
throw invalidRequestPathError();
|
|
163
|
+
}
|
|
164
|
+
return url;
|
|
165
|
+
}
|
|
166
|
+
collectionFor(url) {
|
|
167
|
+
let collection;
|
|
168
|
+
try {
|
|
169
|
+
collection = decodeURIComponent(url.pathname.slice("/api/".length).split("/")[0]);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
return collection === this.options.collections.product ||
|
|
175
|
+
collection === this.options.collections.variant
|
|
176
|
+
? collection
|
|
177
|
+
: undefined;
|
|
178
|
+
}
|
|
179
|
+
collectionForPath(path) {
|
|
180
|
+
try {
|
|
181
|
+
return this.collectionFor(this.urlFor(path));
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async httpError(response, collection) {
|
|
188
|
+
const responseText = await this.responseExcerptText(response);
|
|
189
|
+
const excerpt = this.safeExcerpt(responseText);
|
|
190
|
+
const status = response.status;
|
|
191
|
+
const retryable = status === 408 || status === 429 || status >= 500;
|
|
192
|
+
const suffix = excerpt.length > 0 ? ` Response: ${excerpt}` : "";
|
|
193
|
+
const code = status === 400 &&
|
|
194
|
+
collection !== undefined &&
|
|
195
|
+
isUniqueMedusaIdValidationError(responseText, collection)
|
|
196
|
+
? "PAYLOAD_UNIQUE_MEDUSA_ID_CONFLICT"
|
|
197
|
+
: `PAYLOAD_HTTP_${status}`;
|
|
198
|
+
return new errors_1.PayloadSyncError(`Payload returned HTTP ${status}.${suffix}`, {
|
|
199
|
+
code,
|
|
200
|
+
retryable,
|
|
201
|
+
httpStatus: status,
|
|
202
|
+
collection,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
invalidResponseError(responseText, collection) {
|
|
206
|
+
const excerpt = this.safeExcerpt(responseText);
|
|
207
|
+
const suffix = excerpt.length > 0 ? ` Response: ${excerpt}` : "";
|
|
208
|
+
return new errors_1.PayloadSyncError(`Payload returned an invalid response.${suffix}`, {
|
|
209
|
+
code: "PAYLOAD_INVALID_RESPONSE",
|
|
210
|
+
retryable: false,
|
|
211
|
+
collection,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
async successResponseText(response, collection) {
|
|
215
|
+
if (response.body === null) {
|
|
216
|
+
return "";
|
|
217
|
+
}
|
|
218
|
+
const reader = response.body.getReader();
|
|
219
|
+
const chunks = [];
|
|
220
|
+
let length = 0;
|
|
221
|
+
try {
|
|
222
|
+
while (true) {
|
|
223
|
+
const { done, value } = await reader.read();
|
|
224
|
+
if (done) {
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
if (length + value.byteLength > MAX_SUCCESS_RESPONSE_BYTES) {
|
|
228
|
+
throw new errors_1.PayloadSyncError("Payload response exceeded the allowed size.", {
|
|
229
|
+
code: "PAYLOAD_RESPONSE_TOO_LARGE",
|
|
230
|
+
retryable: false,
|
|
231
|
+
collection,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
chunks.push(value);
|
|
235
|
+
length += value.byteLength;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
await reader.cancel().catch(() => undefined);
|
|
240
|
+
throw error;
|
|
241
|
+
}
|
|
242
|
+
const body = new Uint8Array(length);
|
|
243
|
+
let offset = 0;
|
|
244
|
+
for (const chunk of chunks) {
|
|
245
|
+
body.set(chunk, offset);
|
|
246
|
+
offset += chunk.byteLength;
|
|
247
|
+
}
|
|
248
|
+
return new TextDecoder().decode(body);
|
|
249
|
+
}
|
|
250
|
+
async responseExcerptText(response) {
|
|
251
|
+
if (response.body === null) {
|
|
252
|
+
return "";
|
|
253
|
+
}
|
|
254
|
+
const reader = response.body.getReader();
|
|
255
|
+
const limit = MAX_RESPONSE_EXCERPT_LENGTH + Buffer.byteLength(this.options.payloadApiKey);
|
|
256
|
+
const chunks = [];
|
|
257
|
+
let length = 0;
|
|
258
|
+
try {
|
|
259
|
+
while (length < limit) {
|
|
260
|
+
const { done, value } = await reader.read();
|
|
261
|
+
if (done) {
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
const remaining = limit - length;
|
|
265
|
+
const chunk = value.byteLength > remaining ? value.slice(0, remaining) : value;
|
|
266
|
+
chunks.push(chunk);
|
|
267
|
+
length += chunk.byteLength;
|
|
268
|
+
if (chunk.byteLength < value.byteLength) {
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return "";
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
await reader.cancel().catch(() => undefined);
|
|
278
|
+
}
|
|
279
|
+
const excerptBytes = new Uint8Array(length);
|
|
280
|
+
let offset = 0;
|
|
281
|
+
for (const chunk of chunks) {
|
|
282
|
+
excerptBytes.set(chunk, offset);
|
|
283
|
+
offset += chunk.byteLength;
|
|
284
|
+
}
|
|
285
|
+
return new TextDecoder().decode(excerptBytes);
|
|
286
|
+
}
|
|
287
|
+
safeExcerpt(value) {
|
|
288
|
+
return (0, errors_1.redactPayloadSyncText)(value, [this.options.payloadApiKey]).slice(0, MAX_RESPONSE_EXCERPT_LENGTH);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
exports.PayloadRestClient = PayloadRestClient;
|
|
292
|
+
function payloadPageSchema(schema) {
|
|
293
|
+
return zod_1.z.object({
|
|
294
|
+
docs: zod_1.z.array(schema),
|
|
295
|
+
page: zod_1.z.number(),
|
|
296
|
+
totalPages: zod_1.z.number(),
|
|
297
|
+
hasNextPage: zod_1.z.boolean(),
|
|
298
|
+
nextPage: zod_1.z.number().nullable(),
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
function ownsDoc(value) {
|
|
302
|
+
return (typeof value === "object" &&
|
|
303
|
+
value !== null &&
|
|
304
|
+
Object.prototype.hasOwnProperty.call(value, "doc"));
|
|
305
|
+
}
|
|
306
|
+
function invalidRequestPathError() {
|
|
307
|
+
return new errors_1.PayloadSyncError("Payload request path must stay within the configured API origin.", {
|
|
308
|
+
code: "PAYLOAD_INVALID_REQUEST_PATH",
|
|
309
|
+
retryable: false,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
function isUniqueMedusaIdValidationError(responseText, collection) {
|
|
313
|
+
let body;
|
|
314
|
+
try {
|
|
315
|
+
body = JSON.parse(responseText);
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
const parsed = uniqueMedusaIdValidationErrorSchema.safeParse(body);
|
|
321
|
+
return parsed.success && parsed.data.errors[0].data.collection === collection;
|
|
322
|
+
}
|
|
323
|
+
function isAbortError(error) {
|
|
324
|
+
return error instanceof DOMException && error.name === "AbortError";
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bG9hZC1yZXN0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3BheWxvYWQtc3luYy9zZXJ2aWNlcy9wYXlsb2FkLXJlc3QtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUEyQztBQUUzQyxtREFRNEI7QUFDNUIsNkNBQTBFO0FBRzFFLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFBO0FBQ3ZDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUE7QUFFbEQsTUFBTSw0QkFBNEIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVDLElBQUksRUFBRSxPQUFDLENBQUMsS0FBSyxDQUFDLGdDQUFvQixDQUFDO0NBQ3BDLENBQUMsQ0FBQTtBQUNGLE1BQU0seUJBQXlCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN6QyxHQUFHLEVBQUUsZ0NBQW9CO0NBQzFCLENBQUMsQ0FBQTtBQUNGLE1BQU0seUJBQXlCLEdBQUcsT0FBQyxDQUFDLFVBQVUsQ0FDNUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDYixjQUFjLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVU7SUFDM0QsUUFBUTtDQUNULENBQUMsRUFDRixPQUFDO0tBQ0Usa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUU7SUFDcEMsT0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNQLGNBQWMsRUFBRSxPQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxRQUFRLEVBQUUseUJBQXlCO0tBQ3BDLENBQUM7SUFDRixPQUFDLENBQUMsTUFBTSxDQUFDO1FBQ1AsY0FBYyxFQUFFLE9BQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JDLFFBQVEsRUFBRSxnQ0FBb0I7S0FDL0Is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
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reconcilePayloadCatalog = reconcilePayloadCatalog;
|
|
4
|
+
exports.default = reconcilePayloadCatalogScript;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const reconciliation_1 = require("../modules/payload-sync/domain/reconciliation");
|
|
7
|
+
const errors_1 = require("../modules/payload-sync/domain/errors");
|
|
8
|
+
const payload_sync_1 = require("../modules/payload-sync");
|
|
9
|
+
const sync_product_1 = require("../workflows/payload-sync/sync-product");
|
|
10
|
+
const reconcile_catalog_1 = require("../workflows/payload-sync/reconcile-catalog");
|
|
11
|
+
async function reconcilePayloadCatalog(args) {
|
|
12
|
+
const service = args.container.resolve(payload_sync_1.PAYLOAD_SYNC_MODULE);
|
|
13
|
+
const query = args.container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
14
|
+
const logger = args.container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
15
|
+
const defaults = service.getReconciliationOptions();
|
|
16
|
+
const batchSize = args.batchSize ?? defaults.batchSize;
|
|
17
|
+
const batchDelayMs = args.batchDelayMs ?? defaults.batchDelayMs;
|
|
18
|
+
const sleep = args.sleep ?? defaultSleep;
|
|
19
|
+
const summary = (0, reconciliation_1.emptyReconciliationSummary)();
|
|
20
|
+
let skip = 0;
|
|
21
|
+
while (true) {
|
|
22
|
+
const page = await query.graph({
|
|
23
|
+
entity: "product",
|
|
24
|
+
fields: ["id"],
|
|
25
|
+
pagination: {
|
|
26
|
+
skip,
|
|
27
|
+
take: batchSize,
|
|
28
|
+
order: { id: "ASC" },
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
const productIds = page.data.map(readId);
|
|
32
|
+
summary.scannedProducts += productIds.length;
|
|
33
|
+
for (const productId of productIds) {
|
|
34
|
+
try {
|
|
35
|
+
const { errors, result } = await (0, sync_product_1.syncProductToPayloadWorkflow)(args.container).run({
|
|
36
|
+
input: {
|
|
37
|
+
id: productId,
|
|
38
|
+
eventName: "payload-sync.reconciliation",
|
|
39
|
+
},
|
|
40
|
+
throwOnError: false,
|
|
41
|
+
});
|
|
42
|
+
if (errors.length > 0) {
|
|
43
|
+
throw readWorkflowFailure(errors[0]);
|
|
44
|
+
}
|
|
45
|
+
summary.syncedProducts += 1;
|
|
46
|
+
summary.syncedVariants += result.currentVariantIds.length;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
summary.failedProductIds.push(productId);
|
|
50
|
+
logger.error((0, errors_1.formatPayloadSyncLog)(error, {
|
|
51
|
+
operation: "reconcile-product",
|
|
52
|
+
entityType: "product",
|
|
53
|
+
medusaId: productId,
|
|
54
|
+
eventName: "payload-sync.reconciliation",
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const nextSkip = skip + productIds.length;
|
|
59
|
+
const hasNextPage = nextSkip < (page.metadata?.count ?? nextSkip);
|
|
60
|
+
if (!hasNextPage) {
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
await sleep(batchDelayMs);
|
|
64
|
+
skip = nextSkip;
|
|
65
|
+
}
|
|
66
|
+
summary.draftedOrphanProducts = await reconcileMirrorPages(args.container, batchSize, reconcile_catalog_1.reconcileProductMirrorPageWorkflow);
|
|
67
|
+
summary.draftedOrphanVariants = await reconcileMirrorPages(args.container, batchSize, reconcile_catalog_1.reconcileVariantMirrorPageWorkflow);
|
|
68
|
+
summary.failedProductIds = [...new Set(summary.failedProductIds)].sort();
|
|
69
|
+
logger.info(JSON.stringify({ component: "payload-sync-reconciliation", ...summary }));
|
|
70
|
+
if (summary.failedProductIds.length > 0) {
|
|
71
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Payload catalog reconciliation failed for ${summary.failedProductIds.length} product(s).`);
|
|
72
|
+
}
|
|
73
|
+
return summary;
|
|
74
|
+
}
|
|
75
|
+
async function reconcileMirrorPages(container, limit, workflow) {
|
|
76
|
+
let drafted = 0;
|
|
77
|
+
let page = 1;
|
|
78
|
+
while (true) {
|
|
79
|
+
const { result } = await workflow(container).run({
|
|
80
|
+
input: { page, limit },
|
|
81
|
+
});
|
|
82
|
+
drafted += result.draftedIds.length;
|
|
83
|
+
if (result.nextPage === null) {
|
|
84
|
+
return drafted;
|
|
85
|
+
}
|
|
86
|
+
page = result.nextPage;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function reconcilePayloadCatalogScript({ container, }) {
|
|
90
|
+
await reconcilePayloadCatalog({ container });
|
|
91
|
+
}
|
|
92
|
+
async function defaultSleep(milliseconds) {
|
|
93
|
+
await new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
94
|
+
}
|
|
95
|
+
function readId(value) {
|
|
96
|
+
if (typeof value !== "object" ||
|
|
97
|
+
value === null ||
|
|
98
|
+
!("id" in value) ||
|
|
99
|
+
typeof value.id !== "string" ||
|
|
100
|
+
value.id.length === 0) {
|
|
101
|
+
throw new Error("Medusa product query returned an invalid ID.");
|
|
102
|
+
}
|
|
103
|
+
return value.id;
|
|
104
|
+
}
|
|
105
|
+
function readWorkflowFailure(value) {
|
|
106
|
+
if (typeof value !== "object" || value === null || !("error" in value)) {
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
109
|
+
const error = value.error;
|
|
110
|
+
if (error instanceof errors_1.PayloadSyncError) {
|
|
111
|
+
return error;
|
|
112
|
+
}
|
|
113
|
+
const message = readErrorMessage(error);
|
|
114
|
+
if (message === null) {
|
|
115
|
+
return error;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const parsed = JSON.parse(message);
|
|
119
|
+
return readPayloadSyncError(parsed) ?? error;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return error;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function readErrorMessage(value) {
|
|
126
|
+
if (value instanceof Error) {
|
|
127
|
+
return value.message;
|
|
128
|
+
}
|
|
129
|
+
if (typeof value === "object" &&
|
|
130
|
+
value !== null &&
|
|
131
|
+
"message" in value &&
|
|
132
|
+
typeof value.message === "string") {
|
|
133
|
+
return value.message;
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
function readPayloadSyncError(value) {
|
|
138
|
+
if (typeof value !== "object" ||
|
|
139
|
+
value === null ||
|
|
140
|
+
!("code" in value) ||
|
|
141
|
+
typeof value.code !== "string" ||
|
|
142
|
+
!("message" in value) ||
|
|
143
|
+
typeof value.message !== "string" ||
|
|
144
|
+
!("retryable" in value) ||
|
|
145
|
+
typeof value.retryable !== "boolean") {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const httpStatus = "httpStatus" in value ? readOptionalInteger(value.httpStatus) : undefined;
|
|
149
|
+
return new errors_1.PayloadSyncError(value.message, {
|
|
150
|
+
code: value.code,
|
|
151
|
+
retryable: value.retryable,
|
|
152
|
+
httpStatus,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
function readOptionalInteger(value) {
|
|
156
|
+
return typeof value === "number" && Number.isInteger(value)
|
|
157
|
+
? value
|
|
158
|
+
: undefined;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb25jaWxlLXBheWxvYWQtY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zY3JpcHRzL3JlY29uY2lsZS1wYXlsb2FkLWNhdGFsb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE2QkEsMERBOEZDO0FBeUJELGdEQUlDO0FBdkpELHFEQUdtQztBQUVuQyxrRkFHdUQ7QUFDdkQsa0VBRytDO0FBQy9DLDBEQUE4RDtBQUU5RCx5RUFBc0Y7QUFDdEYsbUZBR3FEO0FBUzlDLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsSUFBaUM7SUFFakMsTUFBTSxPQUFPLEdBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQTJCLGtDQUFtQixDQUFDLENBQUM7SUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDcEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDO0lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQztJQUNoRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQztJQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFBLDJDQUEwQixHQUFFLENBQUM7SUFDN0MsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBRWIsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUM3QixNQUFNLEVB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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = payloadSyncProductDeletedSubscriber;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const zod_1 = require("@medusajs/framework/zod");
|
|
7
|
+
const unpublish_product_1 = require("../workflows/payload-sync/unpublish-product");
|
|
8
|
+
const EntityEventSchema = zod_1.z.object({ id: zod_1.z.string().trim().min(1) });
|
|
9
|
+
async function payloadSyncProductDeletedSubscriber({ event, container, }) {
|
|
10
|
+
const { id } = EntityEventSchema.parse(event.data);
|
|
11
|
+
await (0, unpublish_product_1.unpublishProductFromPayloadWorkflow)(container).run({
|
|
12
|
+
input: { id, eventName: event.name },
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
exports.config = {
|
|
16
|
+
event: utils_1.ProductWorkflowEvents.DELETED,
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bG9hZC1zeW5jLXByb2R1Y3QtZGVsZXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9wYXlsb2FkLXN5bmMtcHJvZHVjdC1kZWxldGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVlBLHNEQVNDO0FBakJELHFEQUFrRTtBQUNsRSxpREFBNEM7QUFFNUMsbUZBQWtHO0FBRWxHLE1BQU0saUJBQWlCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUd0RCxLQUFLLFVBQVUsbUNBQW1DLENBQUMsRUFDaEUsS0FBSyxFQUNMLFNBQVMsR0FDbUI7SUFDNUIsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbkQsTUFBTSxJQUFBLHVEQUFtQyxFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUN2RCxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7S0FDckMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsNkJBQXFCLENBQUMsT0FBTztDQUNyQyxDQUFDIn0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = payloadSyncProductUpsertedSubscriber;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const zod_1 = require("@medusajs/framework/zod");
|
|
7
|
+
const sync_product_1 = require("../workflows/payload-sync/sync-product");
|
|
8
|
+
const EntityEventSchema = zod_1.z.object({ id: zod_1.z.string().trim().min(1) });
|
|
9
|
+
async function payloadSyncProductUpsertedSubscriber({ event, container, }) {
|
|
10
|
+
const { id } = EntityEventSchema.parse(event.data);
|
|
11
|
+
await (0, sync_product_1.syncProductToPayloadWorkflow)(container).run({
|
|
12
|
+
input: { id, eventName: event.name },
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
exports.config = {
|
|
16
|
+
event: [utils_1.ProductWorkflowEvents.CREATED, utils_1.ProductWorkflowEvents.UPDATED],
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bG9hZC1zeW5jLXByb2R1Y3QtdXBzZXJ0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvcGF5bG9hZC1zeW5jLXByb2R1Y3QtdXBzZXJ0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBWUEsdURBU0M7QUFqQkQscURBQWtFO0FBQ2xFLGlEQUE0QztBQUU1Qyx5RUFBc0Y7QUFFdEYsTUFBTSxpQkFBaUIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBR3RELEtBQUssVUFBVSxvQ0FBb0MsQ0FBQyxFQUNqRSxLQUFLLEVBQ0wsU0FBUyxHQUNtQjtJQUM1QixNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVuRCxNQUFNLElBQUEsMkNBQTRCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2hELEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTtLQUNyQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSxDQUFDLDZCQUFxQixDQUFDLE9BQU8sRUFBRSw2QkFBcUIsQ0FBQyxPQUFPLENBQUM7Q0FDdEUsQ0FBQyJ9
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = payloadSyncVariantDeletedSubscriber;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const zod_1 = require("@medusajs/framework/zod");
|
|
7
|
+
const unpublish_variant_1 = require("../workflows/payload-sync/unpublish-variant");
|
|
8
|
+
const EntityEventSchema = zod_1.z.object({ id: zod_1.z.string().trim().min(1) });
|
|
9
|
+
async function payloadSyncVariantDeletedSubscriber({ event, container, }) {
|
|
10
|
+
const { id } = EntityEventSchema.parse(event.data);
|
|
11
|
+
await (0, unpublish_variant_1.unpublishVariantFromPayloadWorkflow)(container).run({
|
|
12
|
+
input: { id, eventName: event.name },
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
exports.config = {
|
|
16
|
+
event: utils_1.ProductVariantWorkflowEvents.DELETED,
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bG9hZC1zeW5jLXZhcmlhbnQtZGVsZXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9wYXlsb2FkLXN5bmMtdmFyaWFudC1kZWxldGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVlBLHNEQVNDO0FBakJELHFEQUF5RTtBQUN6RSxpREFBNEM7QUFFNUMsbUZBQWtHO0FBRWxHLE1BQU0saUJBQWlCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUd0RCxLQUFLLFVBQVUsbUNBQW1DLENBQUMsRUFDaEUsS0FBSyxFQUNMLFNBQVMsR0FDbUI7SUFDNUIsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbkQsTUFBTSxJQUFBLHVEQUFtQyxFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUN2RCxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7S0FDckMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsb0NBQTRCLENBQUMsT0FBTztDQUM1QyxDQUFDIn0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = payloadSyncVariantUpsertedSubscriber;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const zod_1 = require("@medusajs/framework/zod");
|
|
7
|
+
const sync_variant_1 = require("../workflows/payload-sync/sync-variant");
|
|
8
|
+
const EntityEventSchema = zod_1.z.object({ id: zod_1.z.string().trim().min(1) });
|
|
9
|
+
async function payloadSyncVariantUpsertedSubscriber({ event, container, }) {
|
|
10
|
+
const { id } = EntityEventSchema.parse(event.data);
|
|
11
|
+
await (0, sync_variant_1.syncVariantToPayloadWorkflow)(container).run({
|
|
12
|
+
input: { id, eventName: event.name },
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
exports.config = {
|
|
16
|
+
event: [
|
|
17
|
+
utils_1.ProductVariantWorkflowEvents.CREATED,
|
|
18
|
+
utils_1.ProductVariantWorkflowEvents.UPDATED,
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bG9hZC1zeW5jLXZhcmlhbnQtdXBzZXJ0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvcGF5bG9hZC1zeW5jLXZhcmlhbnQtdXBzZXJ0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBWUEsdURBU0M7QUFqQkQscURBQXlFO0FBQ3pFLGlEQUE0QztBQUU1Qyx5RUFBc0Y7QUFFdEYsTUFBTSxpQkFBaUIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBR3RELEtBQUssVUFBVSxvQ0FBb0MsQ0FBQyxFQUNqRSxLQUFLLEVBQ0wsU0FBUyxHQUNtQjtJQUM1QixNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVuRCxNQUFNLElBQUEsMkNBQTRCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2hELEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTtLQUNyQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRTtRQUNMLG9DQUE0QixDQUFDLE9BQU87UUFDcEMsb0NBQTRCLENBQUMsT0FBTztLQUNyQztDQUNGLENBQUMifQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./public"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUF3QiJ9
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3R5cGVzL3B1YmxpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|