@shushed/helpers 0.0.202-v2-20251208085030 → 0.0.202

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 (95) hide show
  1. package/dist/cjs/contracts/asset.schema.json +78 -0
  2. package/dist/cjs/contracts/category.schema.json +86 -0
  3. package/dist/cjs/contracts/country.schema.json +258 -0
  4. package/dist/cjs/contracts/currency.schema.json +177 -0
  5. package/dist/cjs/contracts/customer-segment.schema.json +32 -0
  6. package/dist/cjs/contracts/development-colour.schema.json +97 -0
  7. package/dist/cjs/contracts/index.js +48 -0
  8. package/dist/cjs/contracts/marketing-preferences.schema.json +41 -0
  9. package/dist/cjs/contracts/messages/ean-change.schema.json +22 -0
  10. package/dist/cjs/contracts/messages/index.js +29 -0
  11. package/dist/cjs/contracts/messages/order/delivered.schema.json +26 -0
  12. package/dist/cjs/contracts/messages/order/index.js +18 -0
  13. package/dist/cjs/contracts/messages/order/new.schema.json +32 -0
  14. package/dist/cjs/contracts/messages/order/processed.schema.json +15 -0
  15. package/dist/cjs/contracts/messages/order/return-initiated.schema.json +26 -0
  16. package/dist/cjs/contracts/messages/order/returned.schema.json +25 -0
  17. package/dist/cjs/contracts/messages/order/shipped.schema.json +26 -0
  18. package/dist/cjs/contracts/messages/product-category.schema.json +21 -0
  19. package/dist/cjs/contracts/messages/product-draft.schema.json +66 -0
  20. package/dist/cjs/contracts/messages/product.schema.json +29 -0
  21. package/dist/cjs/contracts/money.schema.json +54 -0
  22. package/dist/cjs/contracts/order/address.schema.json +127 -0
  23. package/dist/cjs/contracts/order/customer.schema.json +149 -0
  24. package/dist/cjs/contracts/order/index.js +31 -0
  25. package/dist/cjs/contracts/order/item.schema.json +98 -0
  26. package/dist/cjs/contracts/order/payment.schema.json +115 -0
  27. package/dist/cjs/contracts/order/shipment/index.js +29 -0
  28. package/dist/cjs/contracts/order/shipment/item/index.js +8 -0
  29. package/dist/cjs/contracts/order/shipment/item/returned.schema.json +30 -0
  30. package/dist/cjs/contracts/order/shipment/item.schema.json +22 -0
  31. package/dist/cjs/contracts/order/shipment/pos/index.js +10 -0
  32. package/dist/cjs/contracts/order/shipment/pos/outbound.schema.json +37 -0
  33. package/dist/cjs/contracts/order/shipment/pos/return.schema.json +31 -0
  34. package/dist/cjs/contracts/order/shipment/pos.schema.json +48 -0
  35. package/dist/cjs/contracts/order/shipment/shipped/index.js +10 -0
  36. package/dist/cjs/contracts/order/shipment/shipped/outbound.schema.json +34 -0
  37. package/dist/cjs/contracts/order/shipment/shipped/return.schema.json +43 -0
  38. package/dist/cjs/contracts/order/shipment/shipped.schema.json +52 -0
  39. package/dist/cjs/contracts/order/shipment.schema.json +58 -0
  40. package/dist/cjs/contracts/order.schema.json +231 -0
  41. package/dist/cjs/contracts/product-category.schema.json +34 -0
  42. package/dist/cjs/contracts/product-draft.schema.json +782 -0
  43. package/dist/cjs/contracts/product.schema.json +816 -0
  44. package/dist/cjs/contracts/total.schema.json +41 -0
  45. package/dist/cjs/dist-dereferenced/messages/order/delivered.js +1 -1
  46. package/dist/cjs/dist-dereferenced/messages/order/new.js +1 -1
  47. package/dist/cjs/dist-dereferenced/messages/order/processed.js +1 -1
  48. package/dist/cjs/dist-dereferenced/messages/order/return-initiated.js +1 -1
  49. package/dist/cjs/dist-dereferenced/messages/order/returned.js +1 -1
  50. package/dist/cjs/dist-dereferenced/messages/order/shipped.js +1 -1
  51. package/dist/cjs/dist-dereferenced/order/customer.js +1 -1
  52. package/dist/cjs/dist-dereferenced/order/item.js +1 -1
  53. package/dist/cjs/dist-dereferenced/order/orderMain.js +1 -1
  54. package/dist/cjs/dist-dereferenced/order/payment.js +1 -1
  55. package/dist/cjs/dist-dereferenced/order/shipment/pos/outbound.js +1 -1
  56. package/dist/cjs/dist-dereferenced/order/shipment/pos/return.js +1 -1
  57. package/dist/cjs/src-public/bcOrder.js +943 -0
  58. package/dist/cjs/src-public/dato.js +10 -287
  59. package/dist/cjs/src-public/index.js +3 -1
  60. package/dist/cjs/src-public/validate.js +34 -0
  61. package/dist/types/contracts/index.d.ts +15 -0
  62. package/dist/types/contracts/messages/index.d.ts +5 -0
  63. package/dist/types/contracts/messages/order/index.d.ts +6 -0
  64. package/dist/types/contracts/order/index.d.ts +6 -0
  65. package/dist/types/contracts/order/shipment/index.d.ts +6 -0
  66. package/dist/types/contracts/order/shipment/item/index.d.ts +1 -0
  67. package/dist/types/contracts/order/shipment/pos/index.d.ts +2 -0
  68. package/dist/types/contracts/order/shipment/shipped/index.d.ts +2 -0
  69. package/dist/types/dist-dereferenced/messages/order/delivered.d.ts +34 -10
  70. package/dist/types/dist-dereferenced/messages/order/new.d.ts +34 -10
  71. package/dist/types/dist-dereferenced/messages/order/processed.d.ts +34 -10
  72. package/dist/types/dist-dereferenced/messages/order/return-initiated.d.ts +34 -10
  73. package/dist/types/dist-dereferenced/messages/order/returned.d.ts +34 -10
  74. package/dist/types/dist-dereferenced/messages/order/shipped.d.ts +34 -10
  75. package/dist/types/dist-dereferenced/order/customer.d.ts +3 -0
  76. package/dist/types/dist-dereferenced/order/index.d.ts +34 -10
  77. package/dist/types/dist-dereferenced/order/item.d.ts +6 -3
  78. package/dist/types/dist-dereferenced/order/orderMain.d.ts +34 -10
  79. package/dist/types/dist-dereferenced/order/payment.d.ts +16 -0
  80. package/dist/types/dist-dereferenced/order/shipment/pos/outbound.d.ts +0 -1
  81. package/dist/types/dist-dereferenced/order/shipment/pos/return.d.ts +0 -1
  82. package/dist/types/dist-types/messages/order/delivered.d.ts +13 -5
  83. package/dist/types/dist-types/messages/order/new.d.ts +13 -5
  84. package/dist/types/dist-types/messages/order/processed.d.ts +13 -5
  85. package/dist/types/dist-types/messages/order/return-initiated.d.ts +13 -5
  86. package/dist/types/dist-types/messages/order/returned.d.ts +13 -5
  87. package/dist/types/dist-types/messages/order/shipped.d.ts +13 -5
  88. package/dist/types/dist-types/order/customer.d.ts +1 -0
  89. package/dist/types/dist-types/order/item.d.ts +4 -3
  90. package/dist/types/dist-types/order/orderMain.d.ts +13 -5
  91. package/dist/types/dist-types/order/payment.d.ts +4 -0
  92. package/dist/types/src-public/bcOrder.d.ts +84 -0
  93. package/dist/types/src-public/dato.d.ts +1 -34
  94. package/dist/types/src-public/index.d.ts +1 -0
  95. package/package.json +1 -1
@@ -7,23 +7,15 @@ const fs_1 = __importDefault(require("fs"));
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const mime_types_1 = require("mime-types");
9
9
  const runtime_1 = __importDefault(require("./runtime"));
10
- const utils_1 = require("./utils");
11
10
  class DatoHelper extends runtime_1.default {
12
11
  apiToken;
13
12
  baseUrl;
14
13
  environment;
15
- root;
16
14
  constructor(opts, datoOpts) {
17
15
  super(opts);
18
16
  this.apiToken = datoOpts.apiToken;
19
17
  this.baseUrl = datoOpts.baseUrl || 'https://site-api.datocms.com';
20
18
  this.environment = datoOpts.environment || 'main';
21
- this.root = datoOpts.root;
22
- }
23
- handle429(response) {
24
- if (response.status === 429 && this.root) {
25
- (0, utils_1.setRetryAfterVariable)(response, { root: this.root });
26
- }
27
19
  }
28
20
  async requestUploadParameters(filename) {
29
21
  const response = await fetch(`${this.baseUrl}/upload-requests`, {
@@ -44,7 +36,6 @@ class DatoHelper extends runtime_1.default {
44
36
  },
45
37
  }),
46
38
  });
47
- this.handle429(response);
48
39
  if (!response.ok) {
49
40
  const errorText = await response.text();
50
41
  this.logging.error(`Failed to request upload parameters: ${response.statusText} - ${errorText}`);
@@ -81,11 +72,6 @@ class DatoHelper extends runtime_1.default {
81
72
  return response;
82
73
  }
83
74
  async createAssetFromUpload(uploadId, opts, uploadCollectionId) {
84
- const normalizedTags = Array.isArray(opts.tags) && opts.tags.length > 0
85
- ? opts.tags
86
- : ["integrations"];
87
- const safeTitle = opts.title && opts.title.trim().length > 0 ? opts.title : "untitled";
88
- const safeAlt = opts.alt && opts.alt.trim().length > 0 ? opts.alt : safeTitle;
89
75
  const body = {
90
76
  data: {
91
77
  type: 'upload',
@@ -94,35 +80,13 @@ class DatoHelper extends runtime_1.default {
94
80
  author: opts.author,
95
81
  copyright: opts.copyright,
96
82
  notes: opts.notes || null,
97
- title: safeTitle,
98
- alt: safeAlt,
99
83
  default_field_metadata: {
100
- "en-GB": {
101
- title: safeTitle,
102
- alt: safeAlt,
103
- custom_data: {
104
- source: normalizedTags[0] || "uploaded-by-integrations",
105
- tags: normalizedTags,
106
- }
107
- },
108
84
  en: {
109
- title: safeTitle,
110
- alt: safeAlt,
111
- custom_data: {
112
- source: normalizedTags[0] || "uploaded-by-integrations",
113
- tags: normalizedTags,
114
- }
115
- },
116
- "en-US": {
117
- title: safeTitle,
118
- alt: safeAlt,
119
- custom_data: {
120
- source: normalizedTags[0] || "uploaded-by-integrations",
121
- tags: normalizedTags,
122
- }
85
+ title: opts.title,
86
+ alt: opts.alt,
123
87
  }
124
88
  },
125
- tags: normalizedTags || [],
89
+ tags: opts.tags || [],
126
90
  },
127
91
  },
128
92
  };
@@ -147,7 +111,6 @@ class DatoHelper extends runtime_1.default {
147
111
  },
148
112
  body: JSON.stringify(body),
149
113
  });
150
- this.handle429(response);
151
114
  if (!response.ok) {
152
115
  const errorText = await response.text();
153
116
  this.logging.error(`Failed to create asset from upload: ${response.statusText} - ${errorText}`);
@@ -165,7 +128,6 @@ class DatoHelper extends runtime_1.default {
165
128
  'X-Environment': this.environment
166
129
  },
167
130
  });
168
- this.handle429(response);
169
131
  if (!response.ok) {
170
132
  if (response.status === 404) {
171
133
  return null;
@@ -193,120 +155,8 @@ class DatoHelper extends runtime_1.default {
193
155
  this.logging.error(timeoutMsg);
194
156
  throw new Error(timeoutMsg);
195
157
  }
196
- updateUpload = async (options) => {
197
- try {
198
- this.logging.log(`Starting update upload - ${JSON.stringify(options)}`);
199
- if (!options.id)
200
- throw new Error("updateUpload requires 'id' in options");
201
- const safeTitle = options.title && options.title.trim().length > 0
202
- ? options.title.trim()
203
- : options.filename?.trim().split(".")[0] || "untitled";
204
- const safeAlt = options.alt && options.alt.trim().length > 0
205
- ? options.alt.trim()
206
- : safeTitle;
207
- const normalizedTags = Array.isArray(options.tags) && options.tags.length > 0
208
- ? options.tags
209
- : ["integrations"];
210
- const body = {
211
- data: {
212
- type: "upload",
213
- id: options.id,
214
- attributes: {
215
- author: options.author,
216
- copyright: options.copyright,
217
- tags: normalizedTags,
218
- notes: options.notes || null,
219
- default_field_metadata: {
220
- "en-GB": {
221
- title: safeTitle,
222
- alt: safeAlt,
223
- custom_data: {
224
- source: normalizedTags[0] || "uploaded-by-integrations",
225
- tags: normalizedTags,
226
- },
227
- },
228
- en: {
229
- title: safeTitle,
230
- alt: safeAlt,
231
- custom_data: {
232
- source: normalizedTags[0] || "uploaded-by-integrations",
233
- tags: normalizedTags,
234
- },
235
- },
236
- "en-US": {
237
- title: safeTitle,
238
- alt: safeAlt,
239
- custom_data: {
240
- source: normalizedTags[0] || "uploaded-by-integrations",
241
- tags: normalizedTags,
242
- },
243
- },
244
- },
245
- },
246
- },
247
- };
248
- if (options.uploadCollectionId) {
249
- body.data.relationships = {
250
- upload_collection: {
251
- data: {
252
- type: "upload_collection",
253
- id: options.uploadCollectionId,
254
- },
255
- },
256
- };
257
- }
258
- const response = await fetch(`${this.baseUrl}/uploads/${options.id}`, {
259
- method: "PATCH",
260
- headers: {
261
- Authorization: `Bearer ${this.apiToken}`,
262
- "X-Api-Version": "3",
263
- "X-Environment": this.environment,
264
- "Content-Type": "application/vnd.api+json",
265
- Accept: "application/json",
266
- },
267
- body: JSON.stringify(body),
268
- });
269
- this.handle429(response);
270
- if (!response.ok) {
271
- const errorText = await response.text();
272
- this.logging.error(`Failed to update upload: ${response.statusText} - ${errorText}`);
273
- throw new Error(`Failed to update upload: ${response.statusText} - ${errorText}`);
274
- }
275
- const updated = await response.json();
276
- if (Array.isArray(updated.data) && updated.data[0]?.type === "api_error") {
277
- const errorCode = updated.data[0].attributes?.code || "UNKNOWN_ERROR";
278
- const errorMsg = `DatoCMS API error: ${errorCode}`;
279
- this.logging.error(errorMsg);
280
- throw new Error(errorMsg);
281
- }
282
- if (updated.data?.type === "job") {
283
- this.logging.log(`Waiting for job completion: ${updated.data.id}`);
284
- const jobPayload = await this.waitForJobCompletion(updated.data.id);
285
- const assetId = jobPayload?.data?.id;
286
- const assetUrl = jobPayload?.data?.attributes?.url;
287
- if (!assetId || !assetUrl) {
288
- throw new Error(`Job completed but payload missing expected fields: ${JSON.stringify(jobPayload)}`);
289
- }
290
- this.logging.log(`Job completed for upload: ${assetId}`);
291
- return { success: true, assetId, upload: assetUrl };
292
- }
293
- if (updated.data?.type === "upload") {
294
- const { id, attributes } = updated.data;
295
- this.logging.log(`Upload updated successfully: ${id}`);
296
- return { success: true, assetId: id, upload: attributes.url };
297
- }
298
- const errMsg = `Unexpected update response: ${JSON.stringify(updated)}`;
299
- this.logging.error(errMsg);
300
- throw new Error(errMsg);
301
- }
302
- catch (err) {
303
- const msg = err?.message ?? JSON.stringify(err);
304
- this.logging.error(`[updateUpload] failed: ${msg}`);
305
- throw new Error(msg);
306
- }
307
- };
308
158
  async uploadFromUrl(options) {
309
- const { url, filename, uploadCollectionId, skipCreationIfAlreadyExists } = options;
159
+ const { url, filename, uploadCollectionId } = options;
310
160
  this.logging.log(`Starting upload from URL: ${url}`);
311
161
  const fileResponse = await fetch(url);
312
162
  if (!fileResponse.ok) {
@@ -314,43 +164,9 @@ class DatoHelper extends runtime_1.default {
314
164
  this.logging.error(errorMsg);
315
165
  throw new Error(errorMsg);
316
166
  }
317
- let finalFilename = filename || path_1.default.basename(new URL(url).pathname) ||
318
- `bs-${this.triggerId}-${Date.now()}`;
319
- if (filename && !path_1.default.extname(finalFilename)) {
320
- const urlObj = new URL(url);
321
- const pathname = urlObj.pathname;
322
- if (pathname.includes(".")) {
323
- const urlExtension = path_1.default.extname(pathname);
324
- if (urlExtension) {
325
- finalFilename += urlExtension;
326
- }
327
- }
328
- if (!path_1.default.extname(finalFilename) && fileResponse.headers.has('content-type')) {
329
- const ext = (0, mime_types_1.extension)(fileResponse.headers.get('content-type'));
330
- if (typeof ext === "string" && ext.length > 0) {
331
- finalFilename += `.${ext}`;
332
- }
333
- }
334
- }
335
- else if (!filename) {
336
- if (!path_1.default.extname(finalFilename) && fileResponse.headers.has('content-type')) {
337
- const ext = (0, mime_types_1.extension)(fileResponse.headers.get('content-type'));
338
- if (typeof ext === "string" && ext.length > 0) {
339
- finalFilename += `.${ext}`;
340
- }
341
- }
342
- }
343
- if (skipCreationIfAlreadyExists) {
344
- const existing = await this.findUploadByFilename(finalFilename);
345
- if (existing) {
346
- this.logging.log(`Skipping upload: existing asset found for "${finalFilename}"`);
347
- return {
348
- success: true,
349
- assetId: existing.id,
350
- upload: existing.attributes.url,
351
- skipped: true,
352
- };
353
- }
167
+ let finalFilename = filename || path_1.default.basename(new URL(url).pathname) || 'bs-' + this.triggerId + '-' + new Date().getTime();
168
+ if (!path_1.default.extname(finalFilename) && fileResponse.headers.has('content-type')) {
169
+ finalFilename += `.${(0, mime_types_1.extension)(fileResponse.headers.get('content-type'))}`;
354
170
  }
355
171
  const uploadRequest = await this.requestUploadParameters(finalFilename);
356
172
  const uploadId = uploadRequest.data.id;
@@ -367,7 +183,6 @@ class DatoHelper extends runtime_1.default {
367
183
  success: true,
368
184
  upload: assetPayload.data.attributes.url,
369
185
  assetId: assetPayload.data.id,
370
- skipped: false,
371
186
  };
372
187
  }
373
188
  async uploadFromFile(options) {
@@ -404,7 +219,6 @@ class DatoHelper extends runtime_1.default {
404
219
  'Accept': 'application/json',
405
220
  },
406
221
  });
407
- this.handle429(response);
408
222
  if (!response.ok) {
409
223
  const errorText = await response.text();
410
224
  this.logging.error(`Failed to fetch upload collections: ${response.statusText} - ${errorText}`);
@@ -450,14 +264,7 @@ class DatoHelper extends runtime_1.default {
450
264
  }
451
265
  async findUploadByFilename(filename) {
452
266
  try {
453
- if (!filename || typeof filename !== 'string') {
454
- this.logging.log(`findUploadByFilename called with invalid filename: ${String(filename)}`);
455
- return null;
456
- }
457
- const normalizedTarget = filename.trim().toLowerCase().replace(/\.[^.]+$/, '');
458
- const query = encodeURIComponent(normalizedTarget);
459
- this.logging.log(`Searching uploads with query="${normalizedTarget}" for filename="${filename}"`);
460
- const response = await fetch(`${this.baseUrl}/uploads?filter[query]=${query}&page[limit]=100`, {
267
+ const response = await fetch(`${this.baseUrl}/uploads?filter[filename]=${encodeURIComponent(filename)}`, {
461
268
  headers: {
462
269
  'Authorization': `Bearer ${this.apiToken}`,
463
270
  'X-Api-Version': '3',
@@ -465,7 +272,6 @@ class DatoHelper extends runtime_1.default {
465
272
  'Accept': 'application/json',
466
273
  },
467
274
  });
468
- this.handle429(response);
469
275
  if (!response.ok) {
470
276
  const errorText = await response.text();
471
277
  this.logging.error(`Failed to search for existing upload: ${response.status} ${response.statusText} - ${errorText}`);
@@ -475,32 +281,10 @@ class DatoHelper extends runtime_1.default {
475
281
  this.logging.error(`Failed to parse JSON in findUploadByFilename: ${err.message}`);
476
282
  return null;
477
283
  });
478
- const uploads = data?.data || [];
479
- if (!uploads.length) {
480
- this.logging.log(`No uploads returned for query="${normalizedTarget}"`);
481
- return null;
482
- }
483
- const targetFull = filename.trim().toLowerCase();
484
- const match = uploads.find((u) => {
485
- const storedFull = u?.attributes?.filename?.toLowerCase();
486
- if (!storedFull)
487
- return false;
488
- if (storedFull === targetFull)
489
- return true;
490
- const storedNormalized = storedFull.replace(/\.[^.]+$/, '');
491
- if (storedNormalized === normalizedTarget)
492
- return true;
493
- return false;
494
- });
495
- if (match) {
496
- this.logging.log(`Found existing upload for "${filename}" -> asset_id=${match.id}, storedFilename=${match.attributes?.filename}`);
497
- return match;
498
- }
499
- this.logging.log(`No exact filename match found among ${uploads.length} uploads for "${filename}" (query="${normalizedTarget}")`);
500
- return null;
284
+ return data?.data?.[0] || null;
501
285
  }
502
286
  catch (err) {
503
- this.logging.error(`Error in findUploadByFilename: ${err?.message ?? String(err)}`);
287
+ this.logging.error(`Error in findUploadByFilename: ${err.message}`);
504
288
  return null;
505
289
  }
506
290
  }
@@ -515,7 +299,6 @@ class DatoHelper extends runtime_1.default {
515
299
  Accept: "application/json",
516
300
  },
517
301
  });
518
- this.handle429(res);
519
302
  if (!res.ok) {
520
303
  const errorText = await res.text();
521
304
  throw new Error(`Failed to fetch item types: ${res.status} ${res.statusText} - ${errorText}`);
@@ -543,7 +326,6 @@ class DatoHelper extends runtime_1.default {
543
326
  Accept: "application/json",
544
327
  },
545
328
  });
546
- this.handle429(res);
547
329
  if (!res.ok) {
548
330
  const errorText = await res.text();
549
331
  throw new Error(`Failed to fetch product by SKU: ${res.status} ${res.statusText} - ${errorText}`);
@@ -576,7 +358,6 @@ class DatoHelper extends runtime_1.default {
576
358
  },
577
359
  }),
578
360
  });
579
- this.handle429(res);
580
361
  if (!res.ok) {
581
362
  const errorText = await res.text();
582
363
  throw new Error(`Failed to create product: ${res.status} ${res.statusText} - ${errorText}`);
@@ -607,7 +388,6 @@ class DatoHelper extends runtime_1.default {
607
388
  },
608
389
  }),
609
390
  });
610
- this.handle429(res);
611
391
  if (!res.ok) {
612
392
  const errorText = await res.text();
613
393
  throw new Error(`Failed to update product gallery: ${res.status} ${res.statusText} - ${errorText}`);
@@ -619,62 +399,5 @@ class DatoHelper extends runtime_1.default {
619
399
  throw err;
620
400
  }
621
401
  }
622
- async updateProductSwatch(productId, uploadId) {
623
- try {
624
- const res = await fetch(`${this.baseUrl}/items/${productId}`, {
625
- method: "PATCH",
626
- headers: {
627
- Authorization: `Bearer ${this.apiToken}`,
628
- "X-Api-Version": "3",
629
- "X-Environment": this.environment,
630
- "Content-Type": "application/vnd.api+json",
631
- Accept: "application/json",
632
- },
633
- body: JSON.stringify({
634
- data: {
635
- type: "item",
636
- id: productId,
637
- attributes: {
638
- swatch: { upload_id: uploadId },
639
- },
640
- },
641
- }),
642
- });
643
- this.handle429(res);
644
- if (!res.ok) {
645
- const errorText = await res.text();
646
- throw new Error(`Failed to update product swatch: ${res.status} ${res.statusText} - ${errorText}`);
647
- }
648
- return await res.json();
649
- }
650
- catch (err) {
651
- this.logging.error(`updateProductSwatch failed: ${err.message}`);
652
- throw err;
653
- }
654
- }
655
- async publishProduct(productId) {
656
- try {
657
- const res = await fetch(`${this.baseUrl}/items/${productId}/publish`, {
658
- method: "PUT",
659
- headers: {
660
- Authorization: `Bearer ${this.apiToken}`,
661
- "X-Api-Version": "3",
662
- "X-Environment": this.environment,
663
- "Content-Type": "application/vnd.api+json",
664
- Accept: "application/json",
665
- },
666
- });
667
- this.handle429(res);
668
- if (!res.ok) {
669
- const errorText = await res.text();
670
- throw new Error(`Failed to publish product: ${res.status} ${res.statusText} - ${errorText}`);
671
- }
672
- return await res.json();
673
- }
674
- catch (err) {
675
- this.logging.error(`publishProduct failed: ${err.message}`);
676
- throw err;
677
- }
678
- }
679
402
  }
680
403
  exports.default = DatoHelper;
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.RedisConnectionError = exports.RateLimit = exports.setHeaders = exports.DatoHelper = exports.AirtableHelper = exports.CentraHelper = exports.BigQueryHelper = exports.JWKSHelper = exports.CloudTasksHelper = exports.Secrets = exports.SchedulerHelper = exports.Logging = exports.Runtime = exports.PubSubHelper = exports.EnvEngine = exports.validate = void 0;
20
+ exports.RedisConnectionError = exports.RateLimit = exports.setHeaders = exports.BCOrderHelper = exports.DatoHelper = exports.AirtableHelper = exports.CentraHelper = exports.BigQueryHelper = exports.JWKSHelper = exports.CloudTasksHelper = exports.Secrets = exports.SchedulerHelper = exports.Logging = exports.Runtime = exports.PubSubHelper = exports.EnvEngine = exports.validate = void 0;
21
21
  var validate_1 = require("./validate");
22
22
  Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return __importDefault(validate_1).default; } });
23
23
  __exportStar(require("./sanitize"), exports);
@@ -45,6 +45,8 @@ var airtable_1 = require("./airtable");
45
45
  Object.defineProperty(exports, "AirtableHelper", { enumerable: true, get: function () { return __importDefault(airtable_1).default; } });
46
46
  var dato_1 = require("./dato");
47
47
  Object.defineProperty(exports, "DatoHelper", { enumerable: true, get: function () { return __importDefault(dato_1).default; } });
48
+ var bcOrder_1 = require("./bcOrder");
49
+ Object.defineProperty(exports, "BCOrderHelper", { enumerable: true, get: function () { return __importDefault(bcOrder_1).default; } });
48
50
  var setHeaders_1 = require("./setHeaders");
49
51
  Object.defineProperty(exports, "setHeaders", { enumerable: true, get: function () { return __importDefault(setHeaders_1).default; } });
50
52
  var rateLimit_1 = require("./rateLimit");
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.default = validate;
7
7
  const ajv_1 = __importDefault(require("ajv"));
8
8
  const ajv_formats_1 = __importDefault(require("ajv-formats"));
9
+ const contracts_1 = require("../contracts");
9
10
  function validate(payload, schema, options) {
10
11
  const ajv = new ajv_1.default({
11
12
  allErrors: true,
@@ -19,6 +20,33 @@ function validate(payload, schema, options) {
19
20
  },
20
21
  });
21
22
  (0, ajv_formats_1.default)(ajv);
23
+ const schemas = [
24
+ contracts_1.Currency,
25
+ contracts_1.Country,
26
+ contracts_1.Money,
27
+ contracts_1.Total,
28
+ contracts_1.Order,
29
+ contracts_1.OrderAddress,
30
+ contracts_1.OrderCustomer,
31
+ contracts_1.OrderItem,
32
+ contracts_1.OrderPayment,
33
+ contracts_1.OrderShipment,
34
+ contracts_1.OrderShipmentItem,
35
+ contracts_1.OrderShipmentItemReturned,
36
+ contracts_1.OrderShipmentPOS,
37
+ contracts_1.OrderShipmentPOSOutbound,
38
+ contracts_1.OrderShipmentPOSReturn,
39
+ contracts_1.OrderShipmentShipped,
40
+ contracts_1.OrderShipmentShippedOutbound,
41
+ contracts_1.OrderShipmentShippedReturn,
42
+ ].filter(Boolean);
43
+ for (const s of schemas) {
44
+ try {
45
+ ajv.addSchema(s);
46
+ }
47
+ catch {
48
+ }
49
+ }
22
50
  const validate = ajv.compile(schema);
23
51
  if (!validate(payload)) {
24
52
  const errors = validate.errors?.map(error => `${error.instancePath} ${error.message}: ${JSON.stringify({
@@ -35,6 +63,12 @@ function validate(payload, schema, options) {
35
63
  errors.join('\n'));
36
64
  }
37
65
  else {
66
+ try {
67
+ options.log.log('Validation succeeded');
68
+ }
69
+ catch {
70
+ void 0;
71
+ }
38
72
  return payload;
39
73
  }
40
74
  }
@@ -0,0 +1,15 @@
1
+ export { default as Currency } from './currency.schema.json';
2
+ export { default as Country } from './country.schema.json';
3
+ export { default as Money } from './money.schema.json';
4
+ export { default as Total } from './total.schema.json';
5
+ export { default as ProductDraft } from './product-draft.schema.json';
6
+ export { default as Product } from './product.schema.json';
7
+ export { default as ProductCategory } from './product-category.schema.json';
8
+ export { default as Category } from './category.schema.json';
9
+ export { default as DevelopmentColour } from './development-colour.schema.json';
10
+ export { default as Asset } from './asset.schema.json';
11
+ export { default as CustomerSegment } from './customer-segment.schema.json';
12
+ export { default as MarketingPref } from './marketing-preferences.schema.json';
13
+ export * from './order';
14
+ export { default as Order } from './order.schema.json';
15
+ export * from './messages';
@@ -0,0 +1,5 @@
1
+ export { default as MessageProductDraft } from './product-draft.schema.json';
2
+ export { default as MessageEanChange } from './ean-change.schema.json';
3
+ export { default as MessageProductChange } from './product.schema.json';
4
+ export { default as MessageProductCategory } from './product-category.schema.json';
5
+ export * from './order';
@@ -0,0 +1,6 @@
1
+ export { default as MessageOrderDelivered } from './delivered.schema.json';
2
+ export { default as MessageOrderNew } from './new.schema.json';
3
+ export { default as MessageOrderProcessed } from './processed.schema.json';
4
+ export { default as MessageOrderReturnInitiated } from './return-initiated.schema.json';
5
+ export { default as MessageOrderReturned } from './returned.schema.json';
6
+ export { default as MessageOrderShipped } from './shipped.schema.json';
@@ -0,0 +1,6 @@
1
+ export { default as OrderAddress } from './address.schema.json';
2
+ export { default as OrderCustomer } from './customer.schema.json';
3
+ export { default as OrderItem } from './item.schema.json';
4
+ export { default as OrderPayment } from './payment.schema.json';
5
+ export { default as OrderShipment } from './shipment.schema.json';
6
+ export * from './shipment';
@@ -0,0 +1,6 @@
1
+ export { default as OrderShipmentItem } from './item.schema.json';
2
+ export { default as OrderShipmentPOS } from './pos.schema.json';
3
+ export { default as OrderShipmentShipped } from './shipped.schema.json';
4
+ export * from './item';
5
+ export * from './pos';
6
+ export * from './shipped';
@@ -0,0 +1 @@
1
+ export { default as OrderShipmentItemReturned } from './returned.schema.json';
@@ -0,0 +1,2 @@
1
+ export { default as OrderShipmentPOSOutbound } from './outbound.schema.json';
2
+ export { default as OrderShipmentPOSReturn } from './return.schema.json';
@@ -0,0 +1,2 @@
1
+ export { default as OrderShipmentShippedOutbound } from './outbound.schema.json';
2
+ export { default as OrderShipmentShippedReturn } from './return.schema.json';