goods-exporter 0.5.6 → 1.1.1
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/dist/bundle.d.ts +10 -10
- package/dist/cjs/index.cjs +21 -26
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.mjs +21 -26
- package/dist/esm/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/bundle.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Writable } from 'stream';
|
|
2
2
|
|
|
3
3
|
interface Product {
|
|
4
4
|
/**
|
|
@@ -590,7 +590,7 @@ interface Brand {
|
|
|
590
590
|
declare abstract class FormatterAbstract {
|
|
591
591
|
abstract formatterName: string;
|
|
592
592
|
abstract fileExtension: Extension;
|
|
593
|
-
abstract format(products: Product[], categories?: Category[], brands?: Brand[], option?: FormatterOptions): Promise<
|
|
593
|
+
abstract format(writableStream: Writable, products: Product[], categories?: Category[], brands?: Brand[], option?: FormatterOptions): Promise<void>;
|
|
594
594
|
}
|
|
595
595
|
interface FormatterOptions {
|
|
596
596
|
shopName?: string;
|
|
@@ -607,49 +607,49 @@ declare enum Extension {
|
|
|
607
607
|
declare class CSVFormatter implements FormatterAbstract {
|
|
608
608
|
formatterName: string;
|
|
609
609
|
fileExtension: Extension;
|
|
610
|
-
format(products: Product[], categories?: Category[], _?: Brand[], __?: FormatterOptions): Promise<
|
|
610
|
+
format(writableStream: Writable, products: Product[], categories?: Category[], _?: Brand[], __?: FormatterOptions): Promise<void>;
|
|
611
611
|
}
|
|
612
612
|
|
|
613
613
|
declare class ExcelFormatter implements FormatterAbstract {
|
|
614
614
|
formatterName: string;
|
|
615
615
|
fileExtension: Extension;
|
|
616
|
-
format(products: Product[], categories?: Category[], _?: Brand[], __?: FormatterOptions): Promise<
|
|
616
|
+
format(writableStream: Writable, products: Product[], categories?: Category[], _?: Brand[], __?: FormatterOptions): Promise<void>;
|
|
617
617
|
}
|
|
618
618
|
|
|
619
619
|
declare class InsalesFormatter implements FormatterAbstract {
|
|
620
620
|
formatterName: string;
|
|
621
621
|
fileExtension: Extension;
|
|
622
|
-
format(products: Product[], categories?: Category[], _?: Brand[], __?: FormatterOptions): Promise<
|
|
622
|
+
format(writableStream: Writable, products: Product[], categories?: Category[], _?: Brand[], __?: FormatterOptions): Promise<void>;
|
|
623
623
|
}
|
|
624
624
|
|
|
625
625
|
declare class JSONFormatter implements FormatterAbstract {
|
|
626
626
|
formatterName: string;
|
|
627
627
|
fileExtension: Extension;
|
|
628
|
-
format(products: Product[], categories?: Category[], brands?: Brand[], _?: FormatterOptions): Promise<
|
|
628
|
+
format(writableStream: Writable, products: Product[], categories?: Category[], brands?: Brand[], _?: FormatterOptions): Promise<void>;
|
|
629
629
|
}
|
|
630
630
|
|
|
631
631
|
declare class SimpleJSONFormatter implements FormatterAbstract {
|
|
632
632
|
formatterName: string;
|
|
633
633
|
fileExtension: Extension;
|
|
634
|
-
format(products: Product[], categories?: Category[], brands?: Brand[], _?: FormatterOptions): Promise<
|
|
634
|
+
format(writableStream: Writable, products: Product[], categories?: Category[], brands?: Brand[], _?: FormatterOptions): Promise<void>;
|
|
635
635
|
}
|
|
636
636
|
|
|
637
637
|
declare class TgShopFormatter implements FormatterAbstract {
|
|
638
638
|
formatterName: string;
|
|
639
639
|
fileExtension: Extension;
|
|
640
|
-
format(products: Product[], categories?: Category[], _?: Brand[], __?: FormatterOptions): Promise<
|
|
640
|
+
format(writableStream: Writable, products: Product[], categories?: Category[], _?: Brand[], __?: FormatterOptions): Promise<void>;
|
|
641
641
|
}
|
|
642
642
|
|
|
643
643
|
declare class TildaFormatter implements FormatterAbstract {
|
|
644
644
|
formatterName: string;
|
|
645
645
|
fileExtension: Extension;
|
|
646
|
-
format(products: Product[], categories?: Category[], _?: Brand[], __?: FormatterOptions): Promise<
|
|
646
|
+
format(writableStream: Writable, products: Product[], categories?: Category[], _?: Brand[], __?: FormatterOptions): Promise<void>;
|
|
647
647
|
}
|
|
648
648
|
|
|
649
649
|
declare class YMLFormatter implements FormatterAbstract {
|
|
650
650
|
formatterName: string;
|
|
651
651
|
fileExtension: Extension;
|
|
652
|
-
format(products: Product[], categories?: Category[], brands?: Brand[], options?: FormatterOptions): Promise<
|
|
652
|
+
format(writableStream: Writable, products: Product[], categories?: Category[], brands?: Brand[], options?: FormatterOptions): Promise<void>;
|
|
653
653
|
private getBrands;
|
|
654
654
|
private getCategories;
|
|
655
655
|
private getOffer;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -56,7 +56,7 @@ class CSVFormatter {
|
|
|
56
56
|
__publicField$8(this, "formatterName", "CSV");
|
|
57
57
|
__publicField$8(this, "fileExtension", Extension.CSV);
|
|
58
58
|
}
|
|
59
|
-
async format(products, categories, _, __) {
|
|
59
|
+
async format(writableStream, products, categories, _, __) {
|
|
60
60
|
const mappedCategories = {};
|
|
61
61
|
categories?.forEach(({ id, name }) => mappedCategories[id] = name);
|
|
62
62
|
const csvStream = new CSVStream({
|
|
@@ -64,6 +64,7 @@ class CSVFormatter {
|
|
|
64
64
|
emptyFieldValue: "",
|
|
65
65
|
lineSeparator: "\n"
|
|
66
66
|
});
|
|
67
|
+
csvStream.getWritableStream().pipe(writableStream);
|
|
67
68
|
const columns = /* @__PURE__ */ new Set([
|
|
68
69
|
"url",
|
|
69
70
|
"productId",
|
|
@@ -113,7 +114,6 @@ class CSVFormatter {
|
|
|
113
114
|
csvStream.addRow(row);
|
|
114
115
|
});
|
|
115
116
|
csvStream.getWritableStream().end();
|
|
116
|
-
return csvStream.getWritableStream();
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
|
|
@@ -126,7 +126,7 @@ class ExcelFormatter {
|
|
|
126
126
|
__publicField$7(this, "formatterName", "Excel");
|
|
127
127
|
__publicField$7(this, "fileExtension", Extension.XLSX);
|
|
128
128
|
}
|
|
129
|
-
async format(products, categories, _, __) {
|
|
129
|
+
async format(writableStream, products, categories, _, __) {
|
|
130
130
|
const mappedCategories = {};
|
|
131
131
|
categories?.forEach(({ id, name }) => mappedCategories[id] = name);
|
|
132
132
|
const columns = /* @__PURE__ */ new Set([
|
|
@@ -160,9 +160,8 @@ class ExcelFormatter {
|
|
|
160
160
|
if (value) columns.add(key);
|
|
161
161
|
});
|
|
162
162
|
});
|
|
163
|
-
const passThroughStream = new stream$3.PassThrough();
|
|
164
163
|
const workbook = new stream$2.xlsx.WorkbookWriter({
|
|
165
|
-
stream:
|
|
164
|
+
stream: writableStream
|
|
166
165
|
});
|
|
167
166
|
const worksheet = workbook.addWorksheet("products");
|
|
168
167
|
worksheet.columns = Array.from(columns).map((column) => ({
|
|
@@ -187,8 +186,6 @@ class ExcelFormatter {
|
|
|
187
186
|
});
|
|
188
187
|
worksheet.commit();
|
|
189
188
|
await workbook.commit();
|
|
190
|
-
passThroughStream.end();
|
|
191
|
-
return passThroughStream;
|
|
192
189
|
}
|
|
193
190
|
}
|
|
194
191
|
|
|
@@ -201,7 +198,7 @@ class InsalesFormatter {
|
|
|
201
198
|
__publicField$6(this, "formatterName", "Insales");
|
|
202
199
|
__publicField$6(this, "fileExtension", Extension.XLSX);
|
|
203
200
|
}
|
|
204
|
-
async format(products, categories, _, __) {
|
|
201
|
+
async format(writableStream, products, categories, _, __) {
|
|
205
202
|
const mappedCategories = {};
|
|
206
203
|
categories?.forEach(
|
|
207
204
|
(category) => mappedCategories[category.id] = category
|
|
@@ -239,9 +236,8 @@ class InsalesFormatter {
|
|
|
239
236
|
});
|
|
240
237
|
return categories2;
|
|
241
238
|
};
|
|
242
|
-
const passThroughStream = new stream$3.PassThrough();
|
|
243
239
|
const workbook = new stream$1.xlsx.WorkbookWriter({
|
|
244
|
-
stream:
|
|
240
|
+
stream: writableStream
|
|
245
241
|
});
|
|
246
242
|
const worksheet = workbook.addWorksheet("products");
|
|
247
243
|
const columns = /* @__PURE__ */ new Set([
|
|
@@ -326,8 +322,6 @@ class InsalesFormatter {
|
|
|
326
322
|
});
|
|
327
323
|
worksheet.commit();
|
|
328
324
|
await workbook.commit();
|
|
329
|
-
passThroughStream.end();
|
|
330
|
-
return passThroughStream;
|
|
331
325
|
}
|
|
332
326
|
}
|
|
333
327
|
|
|
@@ -339,12 +333,13 @@ class JSONFormatter {
|
|
|
339
333
|
__publicField$5(this, "formatterName", "JSON");
|
|
340
334
|
__publicField$5(this, "fileExtension", Extension.JSON);
|
|
341
335
|
}
|
|
342
|
-
async format(products, categories, brands, _) {
|
|
343
|
-
|
|
336
|
+
async format(writableStream, products, categories, brands, _) {
|
|
337
|
+
const stream = new jsonStreamStringify.JsonStreamStringify({
|
|
344
338
|
categories,
|
|
345
339
|
brands,
|
|
346
340
|
products
|
|
347
341
|
});
|
|
342
|
+
stream.pipe(writableStream);
|
|
348
343
|
}
|
|
349
344
|
}
|
|
350
345
|
|
|
@@ -356,7 +351,7 @@ class SimpleJSONFormatter {
|
|
|
356
351
|
__publicField$4(this, "formatterName", "JSON");
|
|
357
352
|
__publicField$4(this, "fileExtension", Extension.JSON);
|
|
358
353
|
}
|
|
359
|
-
async format(products, categories, brands, _) {
|
|
354
|
+
async format(writableStream, products, categories, brands, _) {
|
|
360
355
|
const groupedProduct = /* @__PURE__ */ new Map();
|
|
361
356
|
products.forEach((product) => {
|
|
362
357
|
if (product.parentId !== void 0) return;
|
|
@@ -371,11 +366,12 @@ class SimpleJSONFormatter {
|
|
|
371
366
|
if (!parent) return;
|
|
372
367
|
parent.children.push(product);
|
|
373
368
|
});
|
|
374
|
-
|
|
369
|
+
const stream = new jsonStreamStringify.JsonStreamStringify({
|
|
375
370
|
categories,
|
|
376
371
|
brands,
|
|
377
372
|
products: Array.from(groupedProduct.values())
|
|
378
373
|
});
|
|
374
|
+
stream.pipe(writableStream);
|
|
379
375
|
}
|
|
380
376
|
}
|
|
381
377
|
|
|
@@ -388,7 +384,7 @@ class TgShopFormatter {
|
|
|
388
384
|
__publicField$3(this, "formatterName", "TgShop");
|
|
389
385
|
__publicField$3(this, "fileExtension", Extension.XLSX);
|
|
390
386
|
}
|
|
391
|
-
async format(products, categories, _, __) {
|
|
387
|
+
async format(writableStream, products, categories, _, __) {
|
|
392
388
|
const getParameter = (product, key) => product.params?.find((value) => value.key === key);
|
|
393
389
|
const convertProduct = (product) => ({
|
|
394
390
|
"category id": product.categoryId,
|
|
@@ -406,9 +402,8 @@ class TgShopFormatter {
|
|
|
406
402
|
size: getParameter(product, "size")?.value,
|
|
407
403
|
priority: void 0
|
|
408
404
|
});
|
|
409
|
-
const passThroughStream = new stream$3.PassThrough();
|
|
410
405
|
const workbook = new stream.xlsx.WorkbookWriter({
|
|
411
|
-
stream:
|
|
406
|
+
stream: writableStream
|
|
412
407
|
});
|
|
413
408
|
const categoryWorksheet = workbook.addWorksheet("categories");
|
|
414
409
|
const productsWorksheet = workbook.addWorksheet("offers");
|
|
@@ -455,7 +450,6 @@ class TgShopFormatter {
|
|
|
455
450
|
categoryWorksheet.commit();
|
|
456
451
|
productsWorksheet.commit();
|
|
457
452
|
await workbook.commit();
|
|
458
|
-
return passThroughStream;
|
|
459
453
|
}
|
|
460
454
|
}
|
|
461
455
|
|
|
@@ -467,7 +461,7 @@ class TildaFormatter {
|
|
|
467
461
|
__publicField$2(this, "formatterName", "Tilda");
|
|
468
462
|
__publicField$2(this, "fileExtension", Extension.CSV);
|
|
469
463
|
}
|
|
470
|
-
async format(products, categories, _, __) {
|
|
464
|
+
async format(writableStream, products, categories, _, __) {
|
|
471
465
|
const mappedCategories = {};
|
|
472
466
|
categories?.forEach(({ id, name }) => mappedCategories[id] = name);
|
|
473
467
|
const csvStream = new CSVStream({
|
|
@@ -475,6 +469,7 @@ class TildaFormatter {
|
|
|
475
469
|
emptyFieldValue: "",
|
|
476
470
|
lineSeparator: "\n"
|
|
477
471
|
});
|
|
472
|
+
csvStream.getWritableStream().pipe(writableStream);
|
|
478
473
|
const columns = /* @__PURE__ */ new Set([
|
|
479
474
|
"SKU",
|
|
480
475
|
"Brand",
|
|
@@ -508,7 +503,6 @@ class TildaFormatter {
|
|
|
508
503
|
csvStream.addRow(row);
|
|
509
504
|
});
|
|
510
505
|
csvStream.getWritableStream().end();
|
|
511
|
-
return csvStream.getWritableStream();
|
|
512
506
|
}
|
|
513
507
|
}
|
|
514
508
|
|
|
@@ -520,8 +514,9 @@ class YMLFormatter {
|
|
|
520
514
|
__publicField$1(this, "formatterName", "YMl");
|
|
521
515
|
__publicField$1(this, "fileExtension", Extension.YML);
|
|
522
516
|
}
|
|
523
|
-
async format(products, categories, brands, options) {
|
|
517
|
+
async format(writableStream, products, categories, brands, options) {
|
|
524
518
|
const result = new stream$3.PassThrough();
|
|
519
|
+
result.pipe(writableStream);
|
|
525
520
|
const builder = new fastXmlParser.XMLBuilder({
|
|
526
521
|
ignoreAttributes: false,
|
|
527
522
|
cdataPropName: "__cdata",
|
|
@@ -569,7 +564,6 @@ class YMLFormatter {
|
|
|
569
564
|
result.write("</yml_catalog>\n");
|
|
570
565
|
result.end();
|
|
571
566
|
});
|
|
572
|
-
return result;
|
|
573
567
|
}
|
|
574
568
|
getBrands(brands) {
|
|
575
569
|
if (!brands) return [];
|
|
@@ -702,13 +696,14 @@ class GoodsExporter {
|
|
|
702
696
|
let transformedProducts = products;
|
|
703
697
|
for (const transformer of this.transformers)
|
|
704
698
|
transformedProducts = await transformer(transformedProducts);
|
|
705
|
-
const
|
|
699
|
+
const writableStream = this.exporter();
|
|
700
|
+
await this.formatter.format(
|
|
701
|
+
writableStream,
|
|
706
702
|
transformedProducts,
|
|
707
703
|
categories,
|
|
708
704
|
brands,
|
|
709
705
|
option
|
|
710
706
|
);
|
|
711
|
-
stream.pipe(this.exporter());
|
|
712
707
|
}
|
|
713
708
|
}
|
|
714
709
|
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/streams/CSVStream.ts","../../src/formatter/formater.types.ts","../../src/formatter/CSV.formatter.ts","../../src/formatter/Excel.formatter.ts","../../src/formatter/Insales.formatter.ts","../../src/formatter/JSON.formatter.ts","../../src/formatter/SimpleJSON.formatter.ts","../../src/formatter/TgShop.formatter.ts","../../src/formatter/Tilda.formatter.ts","../../src/formatter/YML.formatter.ts","../../src/formatter/index.ts","../../src/exporter/goodsExporter.ts","../../src/types/Product.types.ts"],"sourcesContent":["import { PassThrough } from \"stream\";\n\nexport interface CSVStreamOptions {\n delimiter?: string;\n emptyFieldValue?: string;\n lineSeparator?: string;\n}\n\nexport class CSVStream {\n private readonly stream: PassThrough = new PassThrough();\n private readonly delimiter: string = \";\";\n private readonly lineSeparator: string = \"\\n\";\n private readonly emptyFieldValue: string = \"\";\n private columns = new Set<string>();\n\n constructor({ delimiter, lineSeparator, emptyFieldValue }: CSVStreamOptions) {\n if (delimiter !== undefined) this.delimiter = delimiter;\n if (lineSeparator !== undefined) this.lineSeparator = lineSeparator;\n if (emptyFieldValue !== undefined) this.emptyFieldValue = emptyFieldValue;\n }\n\n getWritableStream() {\n return this.stream;\n }\n\n setColumns(columns: Set<string>) {\n this.columns = columns;\n this.stream.write(\n Array.from(this.columns).join(this.delimiter) + this.lineSeparator,\n );\n }\n\n addRow(items: Record<string, any>) {\n this.stream.write(\n Array.from(this.columns)\n .map((key) =>\n items[key] === undefined ? this.emptyFieldValue : items[key] + \"\",\n )\n .join(this.delimiter) + this.lineSeparator,\n );\n }\n}\n","import { type Brand, type Category, type Product } from \"../types\";\n\nimport { type Stream } from \"stream\";\n\nexport abstract class FormatterAbstract {\n public abstract formatterName: string;\n public abstract fileExtension: Extension;\n\n public abstract format(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n option?: FormatterOptions,\n ): Promise<Stream>;\n}\n\nexport interface FormatterOptions {\n shopName?: string;\n\n companyName?: string;\n\n splitParams?: boolean;\n}\n\nexport enum Extension {\n CSV = \"csv\",\n YML = \"yml\",\n XLSX = \"xlsx\",\n JSON = \"json\",\n}\n","import { CSVStream } from \"../streams/CSVStream\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Stream } from \"stream\";\n\nexport class CSVFormatter implements FormatterAbstract {\n public formatterName = \"CSV\";\n public fileExtension = Extension.CSV;\n\n public async format(\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<Stream> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n\n const csvStream = new CSVStream({\n delimiter: \";\",\n emptyFieldValue: \"\",\n lineSeparator: \"\\n\",\n });\n const columns = new Set<string>([\n \"url\",\n \"productId\",\n \"parentId\",\n \"variantId\",\n \"title\",\n \"description\",\n \"vendor\",\n \"vendorCode\",\n \"category\",\n \"images\",\n \"videos\",\n \"price\",\n \"oldPrice\",\n \"purchasePrice\",\n \"currency\",\n \"saleDate\",\n \"countryOfOrigin\",\n \"tags\",\n \"codesTN\",\n \"params\",\n \"properties\",\n \"sizes\",\n \"keywords\",\n \"relatedProducts\",\n ]);\n products.forEach((product) => {\n Object.entries(product).forEach(([key, value]) => {\n if (value) columns.add(key);\n });\n });\n csvStream.setColumns(columns);\n products.forEach((product) => {\n const row: Record<string, any> = {\n ...product,\n category: mappedCategories[product.categoryId],\n images: product.images?.join(\",\"),\n videos: product.videos?.join(\",\"),\n tags: product.tags?.join(\",\"),\n codesTN: product.codesTN?.join(\", \"),\n params: product.params\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n properties: product.properties\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n sizes: product.sizes\n ?.map(({ name, value }) => `${name}=${value}`)\n .join(\", \"),\n keywords: product.keywords?.join(\",\"),\n relatedProducts: product.relatedProducts?.join(\",\"),\n };\n csvStream.addRow(row);\n });\n\n // Закрываем поток\n csvStream.getWritableStream().end();\n\n return csvStream.getWritableStream();\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { PassThrough, type Stream } from \"stream\";\nconst { stream } = pkg;\n\nexport class ExcelFormatter implements FormatterAbstract {\n public formatterName = \"Excel\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions\n ): Promise<Stream> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n const columns = new Set<string>([\n \"url\",\n \"productId\",\n \"parentId\",\n \"variantId\",\n \"title\",\n \"description\",\n \"vendor\",\n \"vendorCode\",\n \"category\",\n \"images\",\n \"videos\",\n \"price\",\n \"oldPrice\",\n \"purchasePrice\",\n \"currency\",\n \"saleDate\",\n \"countryOfOrigin\",\n \"tags\",\n \"codesTN\",\n \"params\",\n \"properties\",\n \"sizes\",\n \"keywords\",\n \"relatedProducts\",\n ]);\n products.forEach((product) => {\n Object.entries(product).forEach(([key, value]) => {\n if (value) columns.add(key);\n });\n });\n\n const passThroughStream = new PassThrough();\n\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: passThroughStream,\n });\n const worksheet = workbook.addWorksheet(\"products\");\n worksheet.columns = Array.from(columns).map((column) => ({\n key: column,\n header: column,\n }));\n\n products.forEach((product) => {\n const row = {\n ...product,\n category: mappedCategories[product.categoryId],\n images: product.images?.join(\",\"),\n videos: product.videos?.join(\",\"),\n tags: product.tags?.join(\",\"),\n keywords: product.keywords?.join(\",\"),\n relatedProducts: product.relatedProducts?.join(\",\"),\n codesTN: product.codesTN?.join(\", \"),\n params: product.params\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n properties: product.properties\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n sizes: product.sizes\n ?.map(({ name, value }) => `${name}=${value}`)\n .join(\", \"),\n };\n worksheet.addRow(row).commit();\n });\n worksheet.commit();\n await workbook.commit();\n passThroughStream.end();\n return passThroughStream;\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { PassThrough, type Stream } from \"stream\";\nconst { stream } = pkg;\n\nexport class InsalesFormatter implements FormatterAbstract {\n public formatterName = \"Insales\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<Stream> {\n const mappedCategories: Record<number, Category> = {};\n categories?.forEach(\n (category) => (mappedCategories[category.id] = category),\n );\n\n const getParams = (product: Product): Record<string, string> => {\n const properties: Record<string, string> = {};\n\n product.params?.forEach(\n (p) => (properties[`Свойство: ${p.key}`] = p.value),\n );\n\n return properties;\n };\n const getProperties = (product: Product): Record<string, string> => {\n const properties: Record<string, string> = {};\n\n product.properties?.forEach(\n (p) => (properties[`Параметр: ${p.key}`] = p.value),\n );\n\n return properties;\n };\n\n const getCategories = (product: Product) => {\n const categories: Record<string, string> = {};\n const categoryList = new Array<string>();\n\n function addCategory(categoryId: number | undefined) {\n if (categoryId === undefined) return;\n\n const category = mappedCategories[categoryId];\n if (category) {\n categoryList.push(category.name);\n addCategory(category.parentId);\n }\n }\n\n addCategory(product.categoryId);\n\n categoryList.forEach((name, i) => {\n const index = categoryList.length - 1 - i;\n const key = index === 0 ? \"Корневая\" : `Подкатегория ${index}`;\n categories[key] = name;\n });\n\n return categories;\n };\n const passThroughStream = new PassThrough();\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: passThroughStream,\n });\n const worksheet = workbook.addWorksheet(\"products\");\n const columns = new Set<string>([\n \"Внешний ID\",\n \"Ссылка на товар\",\n \"Артикул\",\n \"Корневая\",\n \"Подкатегория 1\",\n \"Подкатегория 2\",\n \"Название товара или услуги\",\n \"Старая цена\",\n \"Цена продажи\",\n \"Cебестоимость\",\n \"Категории\",\n \"Остаток\",\n \"Штрих-код\",\n \"Краткое описание\",\n \"Полное описание\",\n \"Габариты варианта\",\n \"Вес\",\n \"Размещение на сайте\",\n \"НДС\",\n \"Валюта склада\",\n \"Изображения варианта\",\n \"Изображения\",\n \"Ссылка на видео\",\n \"Параметры\",\n \"Свойства\",\n \"Параметр: Бренд\",\n \"Параметр: Коллекция\",\n \"Параметр: Пол\",\n \"Параметр: Дата выхода\",\n \"Размерная сетка\",\n \"Связанные товары\",\n \"Ключевые слова\",\n ]);\n products.forEach((product) => {\n Object.keys({\n ...getParams(product),\n ...getProperties(product),\n }).forEach((key) => {\n columns.add(key);\n });\n });\n worksheet.columns = Array.from(columns).map((column) => ({\n header: column,\n key: column,\n }));\n products.forEach((product) => {\n const row = {\n \"Внешний ID\": product.productId,\n \"Ссылка на товар\": product.url,\n Артикул: product.vendorCode,\n \"Название товара или услуги\": product.title,\n \"Старая цена\": product.oldPrice,\n \"Цена продажи\": product.price,\n Cебестоимость: product.purchasePrice,\n ...getCategories(product),\n Остаток: product.count,\n \"Штрих-код\": product.barcode,\n \"Краткое описание\": undefined,\n \"Полное описание\": product.description,\n \"Габариты варианта\": product.dimensions,\n Вес: product.weight,\n \"Размещение на сайте\": product.available,\n НДС: product.vat.toString(),\n \"Валюта склада\": product.currency.toString(),\n \"Изображения варианта\":\n product.parentId === undefined\n ? product.images?.join(\" \")\n : undefined,\n Изображения:\n product.parentId === undefined\n ? undefined\n : product.images?.join(\" \"),\n \"Ссылка на видео\": product.videos ? product.videos[0] : undefined,\n ...getParams(product),\n ...getProperties(product),\n \"Параметр: Бренд\": product.vendor,\n \"Параметр: Коллекция\": product.seriesName,\n \"Параметр: Пол\": product.gender,\n \"Параметр: Дата выхода\": product.saleDate,\n \"Размерная сетка\": JSON.stringify(product.sizes),\n \"Связанные товары\": product.relatedProducts?.join(\",\"),\n \"Ключевые слова\": product.keywords?.join(\",\"),\n };\n worksheet.addRow(row).commit();\n });\n worksheet.commit();\n await workbook.commit();\n passThroughStream.end();\n return passThroughStream;\n }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Stream } from \"stream\";\n\nexport class JSONFormatter implements FormatterAbstract {\n public formatterName = \"JSON\";\n public fileExtension = Extension.JSON;\n\n public async format(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n _?: FormatterOptions,\n ): Promise<Stream> {\n return new JsonStreamStringify({\n categories,\n brands,\n products,\n });\n }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Stream } from \"stream\";\n\ninterface SimpleProduct extends Product {\n children: Product[];\n}\n\nexport class SimpleJSONFormatter implements FormatterAbstract {\n public formatterName = \"JSON\";\n public fileExtension = Extension.JSON;\n\n public async format(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n _?: FormatterOptions,\n ): Promise<Stream> {\n const groupedProduct = new Map<number, SimpleProduct>();\n products.forEach((product) => {\n if (product.parentId !== undefined) return;\n groupedProduct.set(product.variantId, {\n ...product,\n children: [],\n });\n });\n products.forEach((product) => {\n if (product.parentId === undefined) return;\n const parent = groupedProduct.get(product.parentId);\n if (!parent) return;\n parent.children.push(product);\n });\n return new JsonStreamStringify({\n categories,\n brands,\n products: Array.from(groupedProduct.values()),\n });\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type IParam, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { PassThrough, type Stream } from \"stream\";\nconst { stream } = pkg;\n\nexport class TgShopFormatter implements FormatterAbstract {\n public formatterName = \"TgShop\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<Stream> {\n const getParameter = (product: Product, key: string): IParam | undefined =>\n product.params?.find((value) => value.key === key);\n\n const convertProduct = (product: Product) => ({\n \"category id\": product.categoryId,\n \"group id\": product.parentId,\n \"id product\": product.variantId,\n \"name product\": product.title,\n price: product.price,\n picture: product.images?.join(\", \"),\n vendorCode: product.vendorCode,\n oldprice: product.oldPrice,\n description: product.description,\n shortDescription: \"\",\n quantityInStock: product.count,\n color: getParameter(product, \"color\")?.value,\n size: getParameter(product, \"size\")?.value,\n priority: undefined,\n });\n const passThroughStream = new PassThrough();\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: passThroughStream,\n });\n const categoryWorksheet = workbook.addWorksheet(\"categories\");\n const productsWorksheet = workbook.addWorksheet(\"offers\");\n categoryWorksheet.columns = [\n {\n header: \"id\",\n key: \"id\",\n },\n {\n header: \"parentId\",\n key: \"parentId\",\n },\n {\n header: \"name\",\n key: \"name\",\n },\n ];\n const columns = [\n \"category id\",\n \"group id\",\n \"id product\",\n \"name product\",\n \"price\",\n \"picture\",\n \"vendorCode\",\n \"oldprice\",\n \"description\",\n \"shortDescription\",\n \"quantityInStock\",\n \"color\",\n \"size\",\n \"priority\",\n ];\n\n productsWorksheet.columns = columns.map((column) => ({\n header: column,\n key: column,\n }));\n\n categories?.forEach((category) => {\n categoryWorksheet.addRow(category).commit();\n });\n\n products.forEach((product) => {\n productsWorksheet.addRow(convertProduct(product)).commit();\n });\n categoryWorksheet.commit();\n productsWorksheet.commit();\n\n await workbook.commit();\n\n return passThroughStream;\n }\n}\n","import { CSVStream } from \"../streams/CSVStream\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Stream } from \"stream\";\n\nexport class TildaFormatter implements FormatterAbstract {\n public formatterName = \"Tilda\";\n public fileExtension = Extension.CSV;\n\n public async format(\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions\n ): Promise<Stream> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n\n const csvStream = new CSVStream({\n delimiter: \";\",\n emptyFieldValue: \"\",\n lineSeparator: \"\\n\",\n });\n const columns = new Set<string>([\n \"SKU\",\n \"Brand\",\n \"Category\",\n \"Title\",\n \"Text\",\n \"Photo\",\n \"Price\",\n \"Price Old\",\n \"Quantity\",\n \"Editions\",\n \"External ID\",\n \"Parent UID\",\n ]);\n csvStream.setColumns(columns);\n products.forEach((product) => {\n const row: Record<string, string | number | undefined> = {\n SKU: product.vendorCode,\n Brand: product.vendor,\n Category: mappedCategories[product.categoryId],\n Title: product.title,\n Text: product.description,\n Photo: product.images?.join(\";\"),\n Price: product.price,\n \"Price Old\": product.oldPrice,\n Quantity: product.count,\n Editions: product.params\n ?.map(({ key, value }) => `${key}:${value}`)\n .join(\";\"),\n \"External ID\": product.variantId,\n \"Parent UID\": product.parentId,\n };\n csvStream.addRow(row);\n });\n\n csvStream.getWritableStream().end();\n return csvStream.getWritableStream();\n }\n}\n","import { XMLBuilder } from \"fast-xml-parser\";\n\nimport { type Product, type Category, type Brand } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { PassThrough, type Stream } from \"stream\";\n\nexport class YMLFormatter implements FormatterAbstract {\n public formatterName = \"YMl\";\n public fileExtension = Extension.YML;\n\n public async format(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n options?: FormatterOptions,\n ): Promise<Stream> {\n const result = new PassThrough();\n\n const builder = new XMLBuilder({\n ignoreAttributes: false,\n cdataPropName: \"__cdata\",\n format: true,\n indentBy: \" \",\n });\n\n const date = new Date().toISOString().replace(/.\\d+Z/, \"\");\n\n // Начинаем формирование XML\n result.write('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n');\n result.write('<yml_catalog date=\"' + date + '\">\\n');\n\n // Открываем тег <shop>\n result.write(\"<shop>\\n\");\n\n // Добавляем информацию о магазине\n if (options?.shopName) {\n result.write(builder.build({ name: options.shopName }));\n result.write(\"\\n\");\n }\n if (options?.companyName) {\n result.write(builder.build({ company: options.companyName }));\n result.write(\"\\n\");\n }\n\n // Добавляем категории и бренды\n if (categories) {\n result.write(\n builder.build({\n // tagname: \"categories\",\n categories: { category: this.getCategories(categories) },\n }),\n );\n result.write(\"\\n\");\n }\n if (brands) {\n result.write(\n builder.build({ brands: { brand: this.getBrands(brands) } }),\n );\n result.write(\"\\n\");\n }\n\n // Открываем секцию <offers>\n result.write(\"<offers>\\n\");\n\n // Создаем поток для обработки offer элементов\n const offerStream = new PassThrough();\n\n // Пайпим поток offer элементов в основной итоговый поток\n offerStream.pipe(result, { end: false });\n\n // Записываем каждый продукт в поток\n products.forEach((product) => {\n const offer = builder.build({ offer: this.getOffer(product) });\n offerStream.write(offer + \"\\n\");\n });\n\n // Завершаем поток offer\n offerStream.end();\n\n offerStream.on(\"end\", () => {\n // Закрываем секцию <offers>\n result.write(\"</offers>\\n\");\n\n // Закрываем тег <shop>\n result.write(\"</shop>\\n\");\n\n // Закрываем тег <yml_catalog>\n result.write(\"</yml_catalog>\\n\");\n\n // Завершаем итоговый поток\n result.end();\n });\n\n return result;\n }\n\n private getBrands(brands?: Brand[]) {\n if (!brands) return [];\n\n return brands.map((brand) => ({\n \"@_id\": brand.id,\n \"@_url\": brand.coverURL ?? \"\",\n \"#text\": brand.name,\n }));\n }\n\n private getCategories(categories?: Category[]) {\n if (!categories) return [];\n\n return categories.map((cat) => ({\n \"@_id\": cat.id,\n \"@_parentId\": cat.parentId ?? \"\",\n \"#text\": cat.name,\n }));\n }\n\n private getOffer(product: Product): any {\n const result = {\n \"@_id\": product.variantId,\n name: product.title,\n price: product.price,\n oldprice: product.oldPrice,\n purchase_price: product.purchasePrice,\n additional_expenses: product.additionalExpenses,\n cofinance_price: product.cofinancePrice,\n currencyId: product.currency,\n categoryId: product.categoryId,\n vendorId: product.vendorId,\n vendor: product.vendor,\n vendorCode: product.vendorCode,\n picture: product.images,\n video: product.videos,\n available: product.available,\n series: product.seriesName,\n \"min-quantity\": product.minQuantity,\n \"step-quantity\": product.stepQuantity,\n size: product.sizes?.map((size) => ({\n \"#text\": size.value,\n \"@_name\": size.name,\n \"@_delimiter\": size.delimiter,\n })),\n keyword: product.keywords,\n saleDate: product.saleDate,\n property: product.properties?.map((property) => ({\n \"#text\": property.value,\n \"@_name\": property.key,\n })),\n param: product.params?.map((param) => ({\n \"#text\": param.value,\n \"@_name\": param.key,\n })),\n description: {\n __cdata: product.description,\n },\n country_of_origin: product.countryOfOrigin,\n barcode: product.barcode,\n vat: product.vat,\n count: product.count,\n \"set-ids\": product.tags?.join(\", \"),\n adult: product.adult,\n downloadable: product.downloadable,\n \"period-of-validity-days\": product.validityPeriod,\n \"comment-validity-days\": product.validityComment,\n \"service-life-days\": product.serviceLifePeriod,\n \"comment-life-days\": product.serviceLifeComment,\n \"warranty-days\": product.warrantyPeriod,\n \"comment-warranty\": product.warrantyComment,\n manufacturer_warranty: product.manufacturerWarranty,\n certificate: product.certificate,\n url: product.url,\n weight: product.weight,\n dimensions: product.dimensions,\n boxCount: product.boxCount,\n disabled: product.disabled,\n age: product.age != null && {\n \"@_unit\": product.age.unit,\n \"#text\": product.age.value,\n },\n \"tn-ved-codes\": product.codesTN?.length != null && {\n \"tn-ved-code\": product.codesTN,\n },\n relatedProduct: product.relatedProducts,\n gender: product.gender,\n };\n if (product.parentId !== undefined) {\n return {\n ...result,\n \"@_group_id\": product.parentId,\n };\n }\n return result;\n }\n}\n","import { CSVFormatter } from \"./CSV.formatter\";\nimport { ExcelFormatter } from \"./Excel.formatter\";\nimport { InsalesFormatter } from \"./Insales.formatter\";\nimport { JSONFormatter } from \"./JSON.formatter\";\nimport { SimpleJSONFormatter } from \"./SimpleJSON.formatter\";\nimport { TgShopFormatter } from \"./TgShop.formatter\";\nimport { TildaFormatter } from \"./Tilda.formatter\";\nimport { YMLFormatter } from \"./YML.formatter\";\n\nexport * from \"./formater.types\";\n\nexport const Formatters = {\n TildaFormatter,\n CSVFormatter,\n InsalesFormatter,\n YMLFormatter,\n TgShopFormatter,\n ExcelFormatter,\n JSONFormatter,\n SimpleJSONFormatter,\n};\n","import {\n type FormatterAbstract,\n type FormatterOptions,\n Formatters,\n} from \"../formatter\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport { type Exporter, type Transformer } from \"./exporter.types\";\n\nimport fs from \"fs\";\n\nexport class GoodsExporter {\n private formatter: FormatterAbstract = new Formatters.YMLFormatter();\n private exporter: Exporter = () => {\n return fs.createWriteStream(\n `${this.formatter.formatterName}.output.${this.formatter.fileExtension}`,\n );\n };\n\n private transformers = new Array<Transformer>();\n\n public setTransformers(transformers: Transformer[]): void {\n this.transformers = transformers;\n }\n\n public setFormatter(formatter: FormatterAbstract): void {\n this.formatter = formatter;\n }\n\n public setExporter(exporter: Exporter): void {\n this.exporter = exporter;\n }\n\n async export(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n option?: FormatterOptions,\n ): Promise<void> {\n let transformedProducts: Product[] = products;\n\n for (const transformer of this.transformers)\n transformedProducts = await transformer(transformedProducts);\n\n const stream = await this.formatter.format(\n transformedProducts,\n categories,\n brands,\n option,\n );\n stream.pipe(this.exporter());\n }\n}\n","export interface Product {\n /**\n * **ID товара**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n productId: number;\n /**\n * **Родительскй SKU**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n parentId?: number;\n /**\n * **SKU**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n variantId: number;\n /**\n * **Название**\n *\n * Составляйте название по схеме: тип + бренд или производитель + модель + особенности, если есть (например, цвет, размер или вес) и количество в упаковке.\n *\n * Не включайте в название условия продажи (например, «скидка», «бесплатная доставка» и т. д.), эмоциональные характеристики («хит», «супер» и т. д.). Не пишите слова большими буквами — кроме устоявшихся названий брендов и моделей.\n *\n * Оптимальная длина — 50–60 символов, максимальная — 150.\n *\n * Составлять хорошие названия помогут [рекомендации](https://yandex.ru/support/marketplace/assortment/fields/title.html).\n *\n * Пример: Ударная дрель Makita HP1630, 710 Вт\n */\n title: string;\n /**\n * **Описание**\n *\n * Подробное описание товара: например, его преимущества и особенности.\n *\n * Не давайте в описании инструкций по установке и сборке. Не используйте слова «скидка», «распродажа», «дешевый», «подарок» (кроме подарочных категорий), «бесплатно», «акция», «специальная цена», «новинка», «new», «аналог», «заказ», «хит». Не указывайте никакой контактной информации и не давайте ссылок.\n *\n * Можно использовать теги:\n *\n ** <h>, <h1>, <h2> и так далее — для заголовков;\n ** <br> и <p> — для переноса строки;\n ** <ol> — для нумерованного списка;\n ** <ul> — для маркированного списка;\n ** <li> — для создания элементов списка (должен находиться внутри <ol> или <ul>);\n ** <div> — поддерживается, но не влияет на отображение текста.\n * Оптимальная длина — 400–600 символов, максимальная — 6000.\n *\n * Составить хорошее описание помогут рекомендации.\n *\n * Пример: В комплекте с детским микроскопом есть все, что нужно вашему ребенку для изучения микромира\n */\n description: string;\n /**\n * **Бренд**\n *\n * Название бренда или производителя.\n *\n * Записывайте название так, как его пишет сам бренд.\n *\n * Пример: LEVENHUK\n */\n vendor?: string;\n /**\n * **Артикул производителя**\n *\n * Код товара, который ему присвоил производитель.\n *\n * Если артикулов несколько, укажите их через запятую.\n *\n * Пример: VNDR-0005A, VNDR-0005B\n */\n vendorCode?: string;\n /**\n * **Дата выхода**\n *\n * Пример: 01.01.2000\n */\n saleDate?: string;\n /**\n * **Вендор в магазине**\n *\n * Содержит номер вендора, а не ее название.\n */\n vendorId?: number;\n /**\n * **Категория в магазине**\n *\n * Категория, к которой вы относите товар. Она помогает точнее определить для товара категорию на Маркете.\n *\n * Указывайте конкретные категории — например, набор ножей лучше отнести к категории Столовые приборы, а не просто Посуда.\n *\n * Выбирайте категории, которые описывают товар, а не абстрактный признак — например, лучше указать Духи, а не Подарки.\n *\n * Содержит номер категории, а не ее название.\n */\n categoryId: number;\n /**\n * **Страна производства**\n *\n * Страна, где был произведен товар.\n *\n * Записывайте названия стран так, как они записаны в [списке](https://yastatic.net/s3/doc-binary/src/support/market/ru/countries.xlsx).\n *\n * Пример: Россия\n */\n countryOfOrigin?: string;\n /**\n * **Изображение**\n *\n * До двадцати изображений, которые показываются на карточке товара.\n *\n * Принимаются jpg- или png-изображения товара, соответствующие [требованиям](https://yandex.ru/support/marketplace/assortment/fields/images.html).\n *\n * В кабинете изображения добавляются в виде файлов. В Excel-файле — в виде ссылок через запятую. Первое фото становится основным.\n *\n * Чтобы изменить изображение, выложите новое по новой ссылке, иначе картинка не обновится.\n */\n images?: string[];\n /**\n * **Видео**\n *\n * Видеоиллюстрации для карточки товара.\n *\n * Видео должно соответствовать [требованиям](https://yandex.ru/support/marketplace/assortment/fields/video.html).\n *\n * Можно добавить не больше 6 видео.\n *\n * В кабинете можно загрузить видеофайлы. В Excel-шаблоне укажите ссылки на файлы.\n */\n videos?: string[];\n /**\n * **Базовая цена**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 240\n */\n price: number;\n /**\n * **Цена до скидки**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Вы можете указать цену со скидкой от 5 до 75 %.\n *\n * Пример:\n *\n * 250\n */\n oldPrice?: number;\n /**\n * **Себестоимость**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 200\n */\n purchasePrice?: number;\n /**\n * **Дополнительные расходы**\n *\n * Дополнительные расходы на товар. Например, на доставку или упаковку.\n *\n * После заполнения этого поля в калькуляторе и на странице управления ценами рассчитается потенциальная маржинальность товара.\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 75\n */\n additionalExpenses?: number;\n /**\n * **Порог для скидок с Маркетом**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 300\n */\n cofinancePrice?: number;\n /**\n * **Валюта (DBS)**\n *\n * Валюта, в которой указана цена товара. Покупателям Маркет показывает цену в рублях, пересчитывая ее по курсу Центробанка.\n *\n * Поле используется, если для кабинета еще не включена работа с базовыми ценами.\n *\n * Поддерживаются российские и белорусские рубли, евро, доллары, украинские гривны и казахстанские тенге.\n *\n * В кабинете валюту можно просто выбрать из списка. В Excel-файле указывается код валюты: RUR, BYN, EUR, USD, UAN, KZT.\n */\n currency: Currency;\n /**\n * **Ссылка на страницу товара**\n *\n * Адрес страницы на вашем сайте с фотографиями и описанием товара.\n *\n * Максимальная длина URL — 512 символов. Записывайте его согласно стандарту RFC 3986.\n *\n * Пример: http://best.seller.ru/product_page.asp?pid=12346\n */\n url?: string;\n /**\n * **Убрать из продажи**\n *\n * Поле позволяет приостановить продажу товара.\n *\n * Укажите значение true, если нужно приостановить продажу.\n */\n disabled?: boolean;\n /**\n * **Доступное количество товара**\n *\n * Общее количество товара, доступное для продажи\n *\n * Укажите 0, если товара нет в наличии.\n *\n * Пример: 7\n */\n count?: number;\n /**\n * **Товар в наличии (DBS)**\n *\n * Поле указывает, есть ли товар в наличии.\n */\n available?: boolean;\n /**\n * **Минимальное количество товара**\n *\n * Если значение задано, покупатель не сможет заказать меньше единиц товара. Ограничение не работает, когда товара на складе осталось меньше этого количества — тогда покупатель сможет сделать заказ на остаток.\n *\n * Целое число.\n */\n minQuantity?: number;\n /**\n * **Квант продажи**\n *\n * Если значение задано, покупатель сможет добавить к заказу только кратное количество товара. Ограничение не работает, когда на складе осталось меньше этого количества — тогда покупатель сможет сделать заказ на остаток.\n *\n * Целое число.\n */\n stepQuantity?: number;\n /**\n * **Штрихкод**\n *\n * Указывайте в виде последовательности символов. Подойдут коды EAN-13, EAN-8, UPC-A, UPC-E или Code 128.\n *\n * Для книг указывайте ISBN.\n *\n * Для товаров [определенных категорий и торговых марок](https://yastatic.net/s3/doc-binary/src/support/market/ru/yandex-market-list-for-gtin.xlsx) штрихкод должен быть действительным кодом GTIN. Обратите внимание: внутренние штрихкоды, начинающиеся на 2 или 02, и коды формата Code 128 не являются GTIN.\n *\n * Если штрихкодов несколько, напишите все через запятую.\n *\n * Пример: 46012300000000\n */\n barcode?: string;\n /**\n * **Код ТН ВЭД**\n *\n * Для некоторых категорий товаров код ТН ВЭД обязателен. Если это касается ваших товаров, вы получите уведомление в каталоге.\n *\n * 10 или 14 цифр без пробелов.\n *\n * Пример: 8517610008\n */\n codesTN?: string[];\n /**\n * **С какого возраста пользоваться**\n *\n * Если товар не предназначен для детей младше определенного возраста, укажите это.\n *\n * Возрастные ограничения можно задавать в годах (с нуля, с 6, 12, 16 или 18) или в месяцах (любое число от 0 до 12).\n */\n age?: { unit: \"year\" | \"month\"; value: number };\n /**\n * **Вес с упаковкой**\n *\n * Вес товара с упаковкой.\n *\n * Единица измерения — килограммы. Можно дроби: разделитель — точка или запятая, не больше трех цифр после него.\n *\n * Пример: 3.1\n */\n weight?: number;\n /**\n * **Габариты с упаковкой**\n *\n * Длина, ширина, высота в упаковке.\n *\n * Единица измерения — сантиметры. Можно дроби: разделитель — точка или запятая, не больше трех цифр после него.\n *\n * Пример: 20.1/20.551/22.5\n */\n dimensions?: string;\n /**\n * **Товар занимает больше одного места**\n *\n * Если товар занимает одно место (представляет собой одну коробку, упаковку и так далее), оставьте поле пустым. Если товар занимает несколько мест — укажите их количество. Например, кондиционер занимает два места — внешний и внутренний блоки в двух коробках.\n *\n * Укажите количество мест.\n *\n * Пример: 2\n */\n boxCount?: number;\n /**\n * **Ставка НДС**\n *\n * Значение ставки НДС для товара.\n *\n * Выберите одно из значений:\n *\n ** НДС не облагается — 6 или NO_VAT\n *\n ** 0 % — 5 или VAT_0\n *\n ** 10 % — 2 или VAT_10\n *\n ** 20 % — 7 или VAT_20\n *\n * Если не заполнено, Маркет устанавливает ставку, соответствующую схеме налогообложения.\n *\n * Пример: VAT_20\n */\n vat: Vat;\n /**\n * **Характеристики, которые есть только у товаров конкретной категории**\n *\n * Кроме общих свойств, у товара есть характеристики, присущие конкретной категории, к которой он относится. Например, у велосипеда есть размер рамы, а детское пюре бывает овощное, мясное или фруктовое.\n */\n params?: IParam[];\n /**\n * **Свойства товара**\n *\n * *не YML поле\n */\n properties?: IParam[];\n /**\n * **Теги**\n *\n * Придумайте любое название — его можно будет изменить после.\n *\n * Максимальная длина тега — 20 символов.\n *\n * У одного товара — максимум 10 тегов.\n *\n * Всего можно создать не больше 50 разных тегов.\n *\n * Пример: apple, до 500 рублей\n */\n tags?: string[];\n /**\n * **Товар для взрослых**\n *\n * Параметр включает для товара пометку 18+. Устанавливайте ее только для товаров, которые относятся к удовлетворению сексуальных потребностей.\n */\n adult?: boolean;\n /**\n * **Цифровой товар**\n *\n * Параметр, устанавливаемый для цифровых товаров, которые просто скачиваются.\n */\n downloadable?: boolean;\n /**\n * **Срок годности**\n *\n * Период с момента изготовления, по прошествии которого товар становится непригоден.\n *\n * Указывайте срок, указанный на банке или упаковке. Текущая дата, дата поставки или дата отгрузки значения не имеет.\n *\n * Срок можно указывать в годах, месяцах, днях, неделях и часах.\n *\n * Обязательно указывайте срок, если он есть.\n *\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y6M — 1 год и 6 месяцев;\n ** P15D — 15 дней.\n */\n validityPeriod?: string;\n /**\n * **Комментарий к сроку годности**\n *\n * Поле предназначено для описаний условий хранения.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Хранить в сухом помещении\n */\n validityComment?: string;\n /**\n * **Срок службы**\n *\n * В течение срока службы товар должен исправно выполнять свою функцию.\n *\n * Обязательно указывайте срок, если он есть.\n *\n * Срок можно указывать в годах, месяцах и днях.\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y2M — 1 год и 2 месяца;\n ** P15D — 15 дней;\n ** P2Y10D — 2 года, 10 дней;\n ** P2Y6M10D — 2 года, 6 месяцев и 10 дней.\n */\n serviceLifePeriod?: string;\n /**\n * **Комментарий к сроку службы**\n *\n * Поле предназначено для описаний условий использования.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Использовать при температуре не ниже −10 градусов\n */\n serviceLifeComment?: string;\n /**\n * **Гарантийный срок**\n *\n * В течение какого времени можно бесплатно заменить или починить товар.\n *\n * Срок можно указывать в годах, месяцах или днях.\n *\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y2M — 1 год и 2 месяца;\n ** P15D — 15 дней;\n ** P2Y10D — 2 года, 10 дней;\n ** P2Y6M10D — 2 года, 6 месяцев и 10 дней.\n */\n warrantyPeriod?: string;\n /**\n * **Комментарий к гарантийному сроку**\n *\n * Поле предназначено для описания особенностей гарантийных условий.\n *\n * Указывайте только то, что относится к гарантии изготовителя.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Гарантия на аккумулятор — 6 месяцев\n */\n warrantyComment?: string;\n /**\n * **Официальная гарантия производителя**\n */\n manufacturerWarranty?: boolean;\n /**\n * **Номер документа**\n *\n * Номер документа на товар: сертификата, декларации соответствия и т. п.\n *\n * Прежде чем указывать номер документа, загрузите скан документа через кабинет.\n *\n * Укажите номер документа.\n *\n * Пример: 6241421\n */\n certificate?: string;\n /**\n * **Ключевые слова**\n *\n * Пример: Кроссовки, высокая подошва\n */\n keywords?: string[];\n /**\n * **Размерная сетка**\n */\n sizes?: ISize[];\n /**\n * **Связанные товары**\n *\n * Указываются id товаров\n *\n * Пример: 1234\n */\n relatedProducts?: number[];\n /**\n * **Название коллекции, ряда или серии товара**\n *\n * Пример: Jordan 4\n */\n seriesName?: string;\n /**\n * **Пол или название группы потребителей**\n *\n * Пример: Дети, Женское, Унисекс\n */\n gender?: string;\n}\n\nexport enum Vat {\n NO_VAT = \"NO_VAT\",\n VAT_0 = \"VAT_0\",\n VAT_10 = \"VAT_10\",\n VAT_20 = \"VAT_20\",\n}\n\nexport enum Currency {\n RUR = \"RUR\",\n BYN = \"BYN\",\n EUR = \"EUR\",\n USD = \"USD\",\n UAN = \"UAN\",\n KZT = \"KZT\",\n}\n\nexport interface IParam {\n /**\n * **Название характеристики**\n */\n key: string;\n /**\n * **Значение**\n */\n value: string;\n}\n\nexport interface ISize {\n /**\n * **Название единицы измерения**\n */\n name: string;\n /**\n * **Разделитель**\n */\n delimiter: string;\n /**\n * **Значения размерного ряда**\n *\n * Размеры указываются через разделитель\n */\n value: string;\n}\n"],"names":["__publicField","PassThrough","Extension","stream","categories","JsonStreamStringify","XMLBuilder","Vat","Currency"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/streams/CSVStream.ts","../../src/formatter/formater.types.ts","../../src/formatter/CSV.formatter.ts","../../src/formatter/Excel.formatter.ts","../../src/formatter/Insales.formatter.ts","../../src/formatter/JSON.formatter.ts","../../src/formatter/SimpleJSON.formatter.ts","../../src/formatter/TgShop.formatter.ts","../../src/formatter/Tilda.formatter.ts","../../src/formatter/YML.formatter.ts","../../src/formatter/index.ts","../../src/exporter/goodsExporter.ts","../../src/types/Product.types.ts"],"sourcesContent":["import { PassThrough } from \"stream\";\n\nexport interface CSVStreamOptions {\n delimiter?: string;\n emptyFieldValue?: string;\n lineSeparator?: string;\n}\n\nexport class CSVStream {\n private readonly stream: PassThrough = new PassThrough();\n private readonly delimiter: string = \";\";\n private readonly lineSeparator: string = \"\\n\";\n private readonly emptyFieldValue: string = \"\";\n private columns = new Set<string>();\n\n constructor({ delimiter, lineSeparator, emptyFieldValue }: CSVStreamOptions) {\n if (delimiter !== undefined) this.delimiter = delimiter;\n if (lineSeparator !== undefined) this.lineSeparator = lineSeparator;\n if (emptyFieldValue !== undefined) this.emptyFieldValue = emptyFieldValue;\n }\n\n getWritableStream() {\n return this.stream;\n }\n\n setColumns(columns: Set<string>) {\n this.columns = columns;\n this.stream.write(\n Array.from(this.columns).join(this.delimiter) + this.lineSeparator,\n );\n }\n\n addRow(items: Record<string, any>) {\n this.stream.write(\n Array.from(this.columns)\n .map((key) =>\n items[key] === undefined ? this.emptyFieldValue : items[key] + \"\",\n )\n .join(this.delimiter) + this.lineSeparator,\n );\n }\n}\n","import { type Brand, type Category, type Product } from \"../types\";\n\nimport { type Writable } from \"stream\";\n\nexport abstract class FormatterAbstract {\n public abstract formatterName: string;\n public abstract fileExtension: Extension;\n\n public abstract format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n option?: FormatterOptions,\n ): Promise<void>;\n}\n\nexport interface FormatterOptions {\n shopName?: string;\n\n companyName?: string;\n\n splitParams?: boolean;\n}\n\nexport enum Extension {\n CSV = \"csv\",\n YML = \"yml\",\n XLSX = \"xlsx\",\n JSON = \"json\",\n}\n","import { CSVStream } from \"../streams/CSVStream\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\nexport class CSVFormatter implements FormatterAbstract {\n public formatterName = \"CSV\";\n public fileExtension = Extension.CSV;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<void> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n\n const csvStream = new CSVStream({\n delimiter: \";\",\n emptyFieldValue: \"\",\n lineSeparator: \"\\n\",\n });\n csvStream.getWritableStream().pipe(writableStream);\n const columns = new Set<string>([\n \"url\",\n \"productId\",\n \"parentId\",\n \"variantId\",\n \"title\",\n \"description\",\n \"vendor\",\n \"vendorCode\",\n \"category\",\n \"images\",\n \"videos\",\n \"price\",\n \"oldPrice\",\n \"purchasePrice\",\n \"currency\",\n \"saleDate\",\n \"countryOfOrigin\",\n \"tags\",\n \"codesTN\",\n \"params\",\n \"properties\",\n \"sizes\",\n \"keywords\",\n \"relatedProducts\",\n ]);\n products.forEach((product) => {\n Object.entries(product).forEach(([key, value]) => {\n if (value) columns.add(key);\n });\n });\n csvStream.setColumns(columns);\n products.forEach((product) => {\n const row: Record<string, any> = {\n ...product,\n category: mappedCategories[product.categoryId],\n images: product.images?.join(\",\"),\n videos: product.videos?.join(\",\"),\n tags: product.tags?.join(\",\"),\n codesTN: product.codesTN?.join(\", \"),\n params: product.params\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n properties: product.properties\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n sizes: product.sizes\n ?.map(({ name, value }) => `${name}=${value}`)\n .join(\", \"),\n keywords: product.keywords?.join(\",\"),\n relatedProducts: product.relatedProducts?.join(\",\"),\n };\n csvStream.addRow(row);\n });\n\n // Закрываем поток\n csvStream.getWritableStream().end();\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\nconst { stream } = pkg;\n\nexport class ExcelFormatter implements FormatterAbstract {\n public formatterName = \"Excel\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<void> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n const columns = new Set<string>([\n \"url\",\n \"productId\",\n \"parentId\",\n \"variantId\",\n \"title\",\n \"description\",\n \"vendor\",\n \"vendorCode\",\n \"category\",\n \"images\",\n \"videos\",\n \"price\",\n \"oldPrice\",\n \"purchasePrice\",\n \"currency\",\n \"saleDate\",\n \"countryOfOrigin\",\n \"tags\",\n \"codesTN\",\n \"params\",\n \"properties\",\n \"sizes\",\n \"keywords\",\n \"relatedProducts\",\n ]);\n products.forEach((product) => {\n Object.entries(product).forEach(([key, value]) => {\n if (value) columns.add(key);\n });\n });\n\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: writableStream,\n });\n const worksheet = workbook.addWorksheet(\"products\");\n worksheet.columns = Array.from(columns).map((column) => ({\n key: column,\n header: column,\n }));\n\n products.forEach((product) => {\n const row = {\n ...product,\n category: mappedCategories[product.categoryId],\n images: product.images?.join(\",\"),\n videos: product.videos?.join(\",\"),\n tags: product.tags?.join(\",\"),\n keywords: product.keywords?.join(\",\"),\n relatedProducts: product.relatedProducts?.join(\",\"),\n codesTN: product.codesTN?.join(\", \"),\n params: product.params\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n properties: product.properties\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n sizes: product.sizes\n ?.map(({ name, value }) => `${name}=${value}`)\n .join(\", \"),\n };\n worksheet.addRow(row).commit();\n });\n worksheet.commit();\n await workbook.commit();\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\nconst { stream } = pkg;\n\nexport class InsalesFormatter implements FormatterAbstract {\n public formatterName = \"Insales\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<void> {\n const mappedCategories: Record<number, Category> = {};\n categories?.forEach(\n (category) => (mappedCategories[category.id] = category),\n );\n\n const getParams = (product: Product): Record<string, string> => {\n const properties: Record<string, string> = {};\n\n product.params?.forEach(\n (p) => (properties[`Свойство: ${p.key}`] = p.value),\n );\n\n return properties;\n };\n const getProperties = (product: Product): Record<string, string> => {\n const properties: Record<string, string> = {};\n\n product.properties?.forEach(\n (p) => (properties[`Параметр: ${p.key}`] = p.value),\n );\n\n return properties;\n };\n\n const getCategories = (product: Product) => {\n const categories: Record<string, string> = {};\n const categoryList = new Array<string>();\n\n function addCategory(categoryId: number | undefined) {\n if (categoryId === undefined) return;\n\n const category = mappedCategories[categoryId];\n if (category) {\n categoryList.push(category.name);\n addCategory(category.parentId);\n }\n }\n\n addCategory(product.categoryId);\n\n categoryList.forEach((name, i) => {\n const index = categoryList.length - 1 - i;\n const key = index === 0 ? \"Корневая\" : `Подкатегория ${index}`;\n categories[key] = name;\n });\n\n return categories;\n };\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: writableStream,\n });\n const worksheet = workbook.addWorksheet(\"products\");\n const columns = new Set<string>([\n \"Внешний ID\",\n \"Ссылка на товар\",\n \"Артикул\",\n \"Корневая\",\n \"Подкатегория 1\",\n \"Подкатегория 2\",\n \"Название товара или услуги\",\n \"Старая цена\",\n \"Цена продажи\",\n \"Cебестоимость\",\n \"Категории\",\n \"Остаток\",\n \"Штрих-код\",\n \"Краткое описание\",\n \"Полное описание\",\n \"Габариты варианта\",\n \"Вес\",\n \"Размещение на сайте\",\n \"НДС\",\n \"Валюта склада\",\n \"Изображения варианта\",\n \"Изображения\",\n \"Ссылка на видео\",\n \"Параметры\",\n \"Свойства\",\n \"Параметр: Бренд\",\n \"Параметр: Коллекция\",\n \"Параметр: Пол\",\n \"Параметр: Дата выхода\",\n \"Размерная сетка\",\n \"Связанные товары\",\n \"Ключевые слова\",\n ]);\n products.forEach((product) => {\n Object.keys({\n ...getParams(product),\n ...getProperties(product),\n }).forEach((key) => {\n columns.add(key);\n });\n });\n worksheet.columns = Array.from(columns).map((column) => ({\n header: column,\n key: column,\n }));\n products.forEach((product) => {\n const row = {\n \"Внешний ID\": product.productId,\n \"Ссылка на товар\": product.url,\n Артикул: product.vendorCode,\n \"Название товара или услуги\": product.title,\n \"Старая цена\": product.oldPrice,\n \"Цена продажи\": product.price,\n Cебестоимость: product.purchasePrice,\n ...getCategories(product),\n Остаток: product.count,\n \"Штрих-код\": product.barcode,\n \"Краткое описание\": undefined,\n \"Полное описание\": product.description,\n \"Габариты варианта\": product.dimensions,\n Вес: product.weight,\n \"Размещение на сайте\": product.available,\n НДС: product.vat.toString(),\n \"Валюта склада\": product.currency.toString(),\n \"Изображения варианта\":\n product.parentId === undefined\n ? product.images?.join(\" \")\n : undefined,\n Изображения:\n product.parentId === undefined\n ? undefined\n : product.images?.join(\" \"),\n \"Ссылка на видео\": product.videos ? product.videos[0] : undefined,\n ...getParams(product),\n ...getProperties(product),\n \"Параметр: Бренд\": product.vendor,\n \"Параметр: Коллекция\": product.seriesName,\n \"Параметр: Пол\": product.gender,\n \"Параметр: Дата выхода\": product.saleDate,\n \"Размерная сетка\": JSON.stringify(product.sizes),\n \"Связанные товары\": product.relatedProducts?.join(\",\"),\n \"Ключевые слова\": product.keywords?.join(\",\"),\n };\n worksheet.addRow(row).commit();\n });\n worksheet.commit();\n await workbook.commit();\n }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\nexport class JSONFormatter implements FormatterAbstract {\n public formatterName = \"JSON\";\n public fileExtension = Extension.JSON;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n _?: FormatterOptions,\n ): Promise<void> {\n const stream = new JsonStreamStringify({\n categories,\n brands,\n products,\n });\n stream.pipe(writableStream);\n }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\ninterface SimpleProduct extends Product {\n children: Product[];\n}\n\nexport class SimpleJSONFormatter implements FormatterAbstract {\n public formatterName = \"JSON\";\n public fileExtension = Extension.JSON;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n _?: FormatterOptions,\n ): Promise<void> {\n const groupedProduct = new Map<number, SimpleProduct>();\n products.forEach((product) => {\n if (product.parentId !== undefined) return;\n groupedProduct.set(product.variantId, {\n ...product,\n children: [],\n });\n });\n products.forEach((product) => {\n if (product.parentId === undefined) return;\n const parent = groupedProduct.get(product.parentId);\n if (!parent) return;\n parent.children.push(product);\n });\n const stream = new JsonStreamStringify({\n categories,\n brands,\n products: Array.from(groupedProduct.values()),\n });\n stream.pipe(writableStream);\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type IParam, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\nconst { stream } = pkg;\n\nexport class TgShopFormatter implements FormatterAbstract {\n public formatterName = \"TgShop\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<void> {\n const getParameter = (product: Product, key: string): IParam | undefined =>\n product.params?.find((value) => value.key === key);\n\n const convertProduct = (product: Product) => ({\n \"category id\": product.categoryId,\n \"group id\": product.parentId,\n \"id product\": product.variantId,\n \"name product\": product.title,\n price: product.price,\n picture: product.images?.join(\", \"),\n vendorCode: product.vendorCode,\n oldprice: product.oldPrice,\n description: product.description,\n shortDescription: \"\",\n quantityInStock: product.count,\n color: getParameter(product, \"color\")?.value,\n size: getParameter(product, \"size\")?.value,\n priority: undefined,\n });\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: writableStream,\n });\n const categoryWorksheet = workbook.addWorksheet(\"categories\");\n const productsWorksheet = workbook.addWorksheet(\"offers\");\n categoryWorksheet.columns = [\n {\n header: \"id\",\n key: \"id\",\n },\n {\n header: \"parentId\",\n key: \"parentId\",\n },\n {\n header: \"name\",\n key: \"name\",\n },\n ];\n const columns = [\n \"category id\",\n \"group id\",\n \"id product\",\n \"name product\",\n \"price\",\n \"picture\",\n \"vendorCode\",\n \"oldprice\",\n \"description\",\n \"shortDescription\",\n \"quantityInStock\",\n \"color\",\n \"size\",\n \"priority\",\n ];\n\n productsWorksheet.columns = columns.map((column) => ({\n header: column,\n key: column,\n }));\n\n categories?.forEach((category) => {\n categoryWorksheet.addRow(category).commit();\n });\n\n products.forEach((product) => {\n productsWorksheet.addRow(convertProduct(product)).commit();\n });\n categoryWorksheet.commit();\n productsWorksheet.commit();\n\n await workbook.commit();\n }\n}\n","import { CSVStream } from \"../streams/CSVStream\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\nexport class TildaFormatter implements FormatterAbstract {\n public formatterName = \"Tilda\";\n public fileExtension = Extension.CSV;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<void> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n\n const csvStream = new CSVStream({\n delimiter: \";\",\n emptyFieldValue: \"\",\n lineSeparator: \"\\n\",\n });\n csvStream.getWritableStream().pipe(writableStream);\n const columns = new Set<string>([\n \"SKU\",\n \"Brand\",\n \"Category\",\n \"Title\",\n \"Text\",\n \"Photo\",\n \"Price\",\n \"Price Old\",\n \"Quantity\",\n \"Editions\",\n \"External ID\",\n \"Parent UID\",\n ]);\n csvStream.setColumns(columns);\n products.forEach((product) => {\n const row: Record<string, string | number | undefined> = {\n SKU: product.vendorCode,\n Brand: product.vendor,\n Category: mappedCategories[product.categoryId],\n Title: product.title,\n Text: product.description,\n Photo: product.images?.join(\";\"),\n Price: product.price,\n \"Price Old\": product.oldPrice,\n Quantity: product.count,\n Editions: product.params\n ?.map(({ key, value }) => `${key}:${value}`)\n .join(\";\"),\n \"External ID\": product.variantId,\n \"Parent UID\": product.parentId,\n };\n csvStream.addRow(row);\n });\n\n csvStream.getWritableStream().end();\n }\n}\n","import { XMLBuilder } from \"fast-xml-parser\";\n\nimport { type Product, type Category, type Brand } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { PassThrough, type Writable } from \"stream\";\n\nexport class YMLFormatter implements FormatterAbstract {\n public formatterName = \"YMl\";\n public fileExtension = Extension.YML;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n options?: FormatterOptions,\n ): Promise<void> {\n const result = new PassThrough();\n result.pipe(writableStream);\n\n const builder = new XMLBuilder({\n ignoreAttributes: false,\n cdataPropName: \"__cdata\",\n format: true,\n indentBy: \" \",\n });\n\n const date = new Date().toISOString().replace(/.\\d+Z/, \"\");\n\n // Начинаем формирование XML\n result.write('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n');\n result.write('<yml_catalog date=\"' + date + '\">\\n');\n\n // Открываем тег <shop>\n result.write(\"<shop>\\n\");\n\n // Добавляем информацию о магазине\n if (options?.shopName) {\n result.write(builder.build({ name: options.shopName }));\n result.write(\"\\n\");\n }\n if (options?.companyName) {\n result.write(builder.build({ company: options.companyName }));\n result.write(\"\\n\");\n }\n\n // Добавляем категории и бренды\n if (categories) {\n result.write(\n builder.build({\n // tagname: \"categories\",\n categories: { category: this.getCategories(categories) },\n }),\n );\n result.write(\"\\n\");\n }\n if (brands) {\n result.write(\n builder.build({ brands: { brand: this.getBrands(brands) } }),\n );\n result.write(\"\\n\");\n }\n\n // Открываем секцию <offers>\n result.write(\"<offers>\\n\");\n\n // Создаем поток для обработки offer элементов\n const offerStream = new PassThrough();\n\n // Пайпим поток offer элементов в основной итоговый поток\n offerStream.pipe(result, { end: false });\n\n // Записываем каждый продукт в поток\n products.forEach((product) => {\n const offer = builder.build({ offer: this.getOffer(product) });\n offerStream.write(offer + \"\\n\");\n });\n\n // Завершаем поток offer\n offerStream.end();\n\n offerStream.on(\"end\", () => {\n // Закрываем секцию <offers>\n result.write(\"</offers>\\n\");\n\n // Закрываем тег <shop>\n result.write(\"</shop>\\n\");\n\n // Закрываем тег <yml_catalog>\n result.write(\"</yml_catalog>\\n\");\n\n // Завершаем итоговый поток\n result.end();\n });\n }\n\n private getBrands(brands?: Brand[]) {\n if (!brands) return [];\n\n return brands.map((brand) => ({\n \"@_id\": brand.id,\n \"@_url\": brand.coverURL ?? \"\",\n \"#text\": brand.name,\n }));\n }\n\n private getCategories(categories?: Category[]) {\n if (!categories) return [];\n\n return categories.map((cat) => ({\n \"@_id\": cat.id,\n \"@_parentId\": cat.parentId ?? \"\",\n \"#text\": cat.name,\n }));\n }\n\n private getOffer(product: Product): any {\n const result = {\n \"@_id\": product.variantId,\n name: product.title,\n price: product.price,\n oldprice: product.oldPrice,\n purchase_price: product.purchasePrice,\n additional_expenses: product.additionalExpenses,\n cofinance_price: product.cofinancePrice,\n currencyId: product.currency,\n categoryId: product.categoryId,\n vendorId: product.vendorId,\n vendor: product.vendor,\n vendorCode: product.vendorCode,\n picture: product.images,\n video: product.videos,\n available: product.available,\n series: product.seriesName,\n \"min-quantity\": product.minQuantity,\n \"step-quantity\": product.stepQuantity,\n size: product.sizes?.map((size) => ({\n \"#text\": size.value,\n \"@_name\": size.name,\n \"@_delimiter\": size.delimiter,\n })),\n keyword: product.keywords,\n saleDate: product.saleDate,\n property: product.properties?.map((property) => ({\n \"#text\": property.value,\n \"@_name\": property.key,\n })),\n param: product.params?.map((param) => ({\n \"#text\": param.value,\n \"@_name\": param.key,\n })),\n description: {\n __cdata: product.description,\n },\n country_of_origin: product.countryOfOrigin,\n barcode: product.barcode,\n vat: product.vat,\n count: product.count,\n \"set-ids\": product.tags?.join(\", \"),\n adult: product.adult,\n downloadable: product.downloadable,\n \"period-of-validity-days\": product.validityPeriod,\n \"comment-validity-days\": product.validityComment,\n \"service-life-days\": product.serviceLifePeriod,\n \"comment-life-days\": product.serviceLifeComment,\n \"warranty-days\": product.warrantyPeriod,\n \"comment-warranty\": product.warrantyComment,\n manufacturer_warranty: product.manufacturerWarranty,\n certificate: product.certificate,\n url: product.url,\n weight: product.weight,\n dimensions: product.dimensions,\n boxCount: product.boxCount,\n disabled: product.disabled,\n age: product.age != null && {\n \"@_unit\": product.age.unit,\n \"#text\": product.age.value,\n },\n \"tn-ved-codes\": product.codesTN?.length != null && {\n \"tn-ved-code\": product.codesTN,\n },\n relatedProduct: product.relatedProducts,\n gender: product.gender,\n };\n if (product.parentId !== undefined) {\n return {\n ...result,\n \"@_group_id\": product.parentId,\n };\n }\n return result;\n }\n}\n","import { CSVFormatter } from \"./CSV.formatter\";\nimport { ExcelFormatter } from \"./Excel.formatter\";\nimport { InsalesFormatter } from \"./Insales.formatter\";\nimport { JSONFormatter } from \"./JSON.formatter\";\nimport { SimpleJSONFormatter } from \"./SimpleJSON.formatter\";\nimport { TgShopFormatter } from \"./TgShop.formatter\";\nimport { TildaFormatter } from \"./Tilda.formatter\";\nimport { YMLFormatter } from \"./YML.formatter\";\n\nexport * from \"./formater.types\";\n\nexport const Formatters = {\n TildaFormatter,\n CSVFormatter,\n InsalesFormatter,\n YMLFormatter,\n TgShopFormatter,\n ExcelFormatter,\n JSONFormatter,\n SimpleJSONFormatter,\n};\n","import {\n type FormatterAbstract,\n type FormatterOptions,\n Formatters,\n} from \"../formatter\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport { type Exporter, type Transformer } from \"./exporter.types\";\n\nimport fs from \"fs\";\n\nexport class GoodsExporter {\n private formatter: FormatterAbstract = new Formatters.YMLFormatter();\n private exporter: Exporter = () => {\n return fs.createWriteStream(\n `${this.formatter.formatterName}.output.${this.formatter.fileExtension}`,\n );\n };\n\n private transformers = new Array<Transformer>();\n\n public setTransformers(transformers: Transformer[]): void {\n this.transformers = transformers;\n }\n\n public setFormatter(formatter: FormatterAbstract): void {\n this.formatter = formatter;\n }\n\n public setExporter(exporter: Exporter): void {\n this.exporter = exporter;\n }\n\n async export(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n option?: FormatterOptions,\n ): Promise<void> {\n let transformedProducts: Product[] = products;\n\n for (const transformer of this.transformers)\n transformedProducts = await transformer(transformedProducts);\n\n const writableStream = this.exporter();\n\n await this.formatter.format(\n writableStream,\n transformedProducts,\n categories,\n brands,\n option,\n );\n }\n}\n","export interface Product {\n /**\n * **ID товара**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n productId: number;\n /**\n * **Родительскй SKU**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n parentId?: number;\n /**\n * **SKU**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n variantId: number;\n /**\n * **Название**\n *\n * Составляйте название по схеме: тип + бренд или производитель + модель + особенности, если есть (например, цвет, размер или вес) и количество в упаковке.\n *\n * Не включайте в название условия продажи (например, «скидка», «бесплатная доставка» и т. д.), эмоциональные характеристики («хит», «супер» и т. д.). Не пишите слова большими буквами — кроме устоявшихся названий брендов и моделей.\n *\n * Оптимальная длина — 50–60 символов, максимальная — 150.\n *\n * Составлять хорошие названия помогут [рекомендации](https://yandex.ru/support/marketplace/assortment/fields/title.html).\n *\n * Пример: Ударная дрель Makita HP1630, 710 Вт\n */\n title: string;\n /**\n * **Описание**\n *\n * Подробное описание товара: например, его преимущества и особенности.\n *\n * Не давайте в описании инструкций по установке и сборке. Не используйте слова «скидка», «распродажа», «дешевый», «подарок» (кроме подарочных категорий), «бесплатно», «акция», «специальная цена», «новинка», «new», «аналог», «заказ», «хит». Не указывайте никакой контактной информации и не давайте ссылок.\n *\n * Можно использовать теги:\n *\n ** <h>, <h1>, <h2> и так далее — для заголовков;\n ** <br> и <p> — для переноса строки;\n ** <ol> — для нумерованного списка;\n ** <ul> — для маркированного списка;\n ** <li> — для создания элементов списка (должен находиться внутри <ol> или <ul>);\n ** <div> — поддерживается, но не влияет на отображение текста.\n * Оптимальная длина — 400–600 символов, максимальная — 6000.\n *\n * Составить хорошее описание помогут рекомендации.\n *\n * Пример: В комплекте с детским микроскопом есть все, что нужно вашему ребенку для изучения микромира\n */\n description: string;\n /**\n * **Бренд**\n *\n * Название бренда или производителя.\n *\n * Записывайте название так, как его пишет сам бренд.\n *\n * Пример: LEVENHUK\n */\n vendor?: string;\n /**\n * **Артикул производителя**\n *\n * Код товара, который ему присвоил производитель.\n *\n * Если артикулов несколько, укажите их через запятую.\n *\n * Пример: VNDR-0005A, VNDR-0005B\n */\n vendorCode?: string;\n /**\n * **Дата выхода**\n *\n * Пример: 01.01.2000\n */\n saleDate?: string;\n /**\n * **Вендор в магазине**\n *\n * Содержит номер вендора, а не ее название.\n */\n vendorId?: number;\n /**\n * **Категория в магазине**\n *\n * Категория, к которой вы относите товар. Она помогает точнее определить для товара категорию на Маркете.\n *\n * Указывайте конкретные категории — например, набор ножей лучше отнести к категории Столовые приборы, а не просто Посуда.\n *\n * Выбирайте категории, которые описывают товар, а не абстрактный признак — например, лучше указать Духи, а не Подарки.\n *\n * Содержит номер категории, а не ее название.\n */\n categoryId: number;\n /**\n * **Страна производства**\n *\n * Страна, где был произведен товар.\n *\n * Записывайте названия стран так, как они записаны в [списке](https://yastatic.net/s3/doc-binary/src/support/market/ru/countries.xlsx).\n *\n * Пример: Россия\n */\n countryOfOrigin?: string;\n /**\n * **Изображение**\n *\n * До двадцати изображений, которые показываются на карточке товара.\n *\n * Принимаются jpg- или png-изображения товара, соответствующие [требованиям](https://yandex.ru/support/marketplace/assortment/fields/images.html).\n *\n * В кабинете изображения добавляются в виде файлов. В Excel-файле — в виде ссылок через запятую. Первое фото становится основным.\n *\n * Чтобы изменить изображение, выложите новое по новой ссылке, иначе картинка не обновится.\n */\n images?: string[];\n /**\n * **Видео**\n *\n * Видеоиллюстрации для карточки товара.\n *\n * Видео должно соответствовать [требованиям](https://yandex.ru/support/marketplace/assortment/fields/video.html).\n *\n * Можно добавить не больше 6 видео.\n *\n * В кабинете можно загрузить видеофайлы. В Excel-шаблоне укажите ссылки на файлы.\n */\n videos?: string[];\n /**\n * **Базовая цена**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 240\n */\n price: number;\n /**\n * **Цена до скидки**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Вы можете указать цену со скидкой от 5 до 75 %.\n *\n * Пример:\n *\n * 250\n */\n oldPrice?: number;\n /**\n * **Себестоимость**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 200\n */\n purchasePrice?: number;\n /**\n * **Дополнительные расходы**\n *\n * Дополнительные расходы на товар. Например, на доставку или упаковку.\n *\n * После заполнения этого поля в калькуляторе и на странице управления ценами рассчитается потенциальная маржинальность товара.\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 75\n */\n additionalExpenses?: number;\n /**\n * **Порог для скидок с Маркетом**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 300\n */\n cofinancePrice?: number;\n /**\n * **Валюта (DBS)**\n *\n * Валюта, в которой указана цена товара. Покупателям Маркет показывает цену в рублях, пересчитывая ее по курсу Центробанка.\n *\n * Поле используется, если для кабинета еще не включена работа с базовыми ценами.\n *\n * Поддерживаются российские и белорусские рубли, евро, доллары, украинские гривны и казахстанские тенге.\n *\n * В кабинете валюту можно просто выбрать из списка. В Excel-файле указывается код валюты: RUR, BYN, EUR, USD, UAN, KZT.\n */\n currency: Currency;\n /**\n * **Ссылка на страницу товара**\n *\n * Адрес страницы на вашем сайте с фотографиями и описанием товара.\n *\n * Максимальная длина URL — 512 символов. Записывайте его согласно стандарту RFC 3986.\n *\n * Пример: http://best.seller.ru/product_page.asp?pid=12346\n */\n url?: string;\n /**\n * **Убрать из продажи**\n *\n * Поле позволяет приостановить продажу товара.\n *\n * Укажите значение true, если нужно приостановить продажу.\n */\n disabled?: boolean;\n /**\n * **Доступное количество товара**\n *\n * Общее количество товара, доступное для продажи\n *\n * Укажите 0, если товара нет в наличии.\n *\n * Пример: 7\n */\n count?: number;\n /**\n * **Товар в наличии (DBS)**\n *\n * Поле указывает, есть ли товар в наличии.\n */\n available?: boolean;\n /**\n * **Минимальное количество товара**\n *\n * Если значение задано, покупатель не сможет заказать меньше единиц товара. Ограничение не работает, когда товара на складе осталось меньше этого количества — тогда покупатель сможет сделать заказ на остаток.\n *\n * Целое число.\n */\n minQuantity?: number;\n /**\n * **Квант продажи**\n *\n * Если значение задано, покупатель сможет добавить к заказу только кратное количество товара. Ограничение не работает, когда на складе осталось меньше этого количества — тогда покупатель сможет сделать заказ на остаток.\n *\n * Целое число.\n */\n stepQuantity?: number;\n /**\n * **Штрихкод**\n *\n * Указывайте в виде последовательности символов. Подойдут коды EAN-13, EAN-8, UPC-A, UPC-E или Code 128.\n *\n * Для книг указывайте ISBN.\n *\n * Для товаров [определенных категорий и торговых марок](https://yastatic.net/s3/doc-binary/src/support/market/ru/yandex-market-list-for-gtin.xlsx) штрихкод должен быть действительным кодом GTIN. Обратите внимание: внутренние штрихкоды, начинающиеся на 2 или 02, и коды формата Code 128 не являются GTIN.\n *\n * Если штрихкодов несколько, напишите все через запятую.\n *\n * Пример: 46012300000000\n */\n barcode?: string;\n /**\n * **Код ТН ВЭД**\n *\n * Для некоторых категорий товаров код ТН ВЭД обязателен. Если это касается ваших товаров, вы получите уведомление в каталоге.\n *\n * 10 или 14 цифр без пробелов.\n *\n * Пример: 8517610008\n */\n codesTN?: string[];\n /**\n * **С какого возраста пользоваться**\n *\n * Если товар не предназначен для детей младше определенного возраста, укажите это.\n *\n * Возрастные ограничения можно задавать в годах (с нуля, с 6, 12, 16 или 18) или в месяцах (любое число от 0 до 12).\n */\n age?: { unit: \"year\" | \"month\"; value: number };\n /**\n * **Вес с упаковкой**\n *\n * Вес товара с упаковкой.\n *\n * Единица измерения — килограммы. Можно дроби: разделитель — точка или запятая, не больше трех цифр после него.\n *\n * Пример: 3.1\n */\n weight?: number;\n /**\n * **Габариты с упаковкой**\n *\n * Длина, ширина, высота в упаковке.\n *\n * Единица измерения — сантиметры. Можно дроби: разделитель — точка или запятая, не больше трех цифр после него.\n *\n * Пример: 20.1/20.551/22.5\n */\n dimensions?: string;\n /**\n * **Товар занимает больше одного места**\n *\n * Если товар занимает одно место (представляет собой одну коробку, упаковку и так далее), оставьте поле пустым. Если товар занимает несколько мест — укажите их количество. Например, кондиционер занимает два места — внешний и внутренний блоки в двух коробках.\n *\n * Укажите количество мест.\n *\n * Пример: 2\n */\n boxCount?: number;\n /**\n * **Ставка НДС**\n *\n * Значение ставки НДС для товара.\n *\n * Выберите одно из значений:\n *\n ** НДС не облагается — 6 или NO_VAT\n *\n ** 0 % — 5 или VAT_0\n *\n ** 10 % — 2 или VAT_10\n *\n ** 20 % — 7 или VAT_20\n *\n * Если не заполнено, Маркет устанавливает ставку, соответствующую схеме налогообложения.\n *\n * Пример: VAT_20\n */\n vat: Vat;\n /**\n * **Характеристики, которые есть только у товаров конкретной категории**\n *\n * Кроме общих свойств, у товара есть характеристики, присущие конкретной категории, к которой он относится. Например, у велосипеда есть размер рамы, а детское пюре бывает овощное, мясное или фруктовое.\n */\n params?: IParam[];\n /**\n * **Свойства товара**\n *\n * *не YML поле\n */\n properties?: IParam[];\n /**\n * **Теги**\n *\n * Придумайте любое название — его можно будет изменить после.\n *\n * Максимальная длина тега — 20 символов.\n *\n * У одного товара — максимум 10 тегов.\n *\n * Всего можно создать не больше 50 разных тегов.\n *\n * Пример: apple, до 500 рублей\n */\n tags?: string[];\n /**\n * **Товар для взрослых**\n *\n * Параметр включает для товара пометку 18+. Устанавливайте ее только для товаров, которые относятся к удовлетворению сексуальных потребностей.\n */\n adult?: boolean;\n /**\n * **Цифровой товар**\n *\n * Параметр, устанавливаемый для цифровых товаров, которые просто скачиваются.\n */\n downloadable?: boolean;\n /**\n * **Срок годности**\n *\n * Период с момента изготовления, по прошествии которого товар становится непригоден.\n *\n * Указывайте срок, указанный на банке или упаковке. Текущая дата, дата поставки или дата отгрузки значения не имеет.\n *\n * Срок можно указывать в годах, месяцах, днях, неделях и часах.\n *\n * Обязательно указывайте срок, если он есть.\n *\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y6M — 1 год и 6 месяцев;\n ** P15D — 15 дней.\n */\n validityPeriod?: string;\n /**\n * **Комментарий к сроку годности**\n *\n * Поле предназначено для описаний условий хранения.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Хранить в сухом помещении\n */\n validityComment?: string;\n /**\n * **Срок службы**\n *\n * В течение срока службы товар должен исправно выполнять свою функцию.\n *\n * Обязательно указывайте срок, если он есть.\n *\n * Срок можно указывать в годах, месяцах и днях.\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y2M — 1 год и 2 месяца;\n ** P15D — 15 дней;\n ** P2Y10D — 2 года, 10 дней;\n ** P2Y6M10D — 2 года, 6 месяцев и 10 дней.\n */\n serviceLifePeriod?: string;\n /**\n * **Комментарий к сроку службы**\n *\n * Поле предназначено для описаний условий использования.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Использовать при температуре не ниже −10 градусов\n */\n serviceLifeComment?: string;\n /**\n * **Гарантийный срок**\n *\n * В течение какого времени можно бесплатно заменить или починить товар.\n *\n * Срок можно указывать в годах, месяцах или днях.\n *\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y2M — 1 год и 2 месяца;\n ** P15D — 15 дней;\n ** P2Y10D — 2 года, 10 дней;\n ** P2Y6M10D — 2 года, 6 месяцев и 10 дней.\n */\n warrantyPeriod?: string;\n /**\n * **Комментарий к гарантийному сроку**\n *\n * Поле предназначено для описания особенностей гарантийных условий.\n *\n * Указывайте только то, что относится к гарантии изготовителя.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Гарантия на аккумулятор — 6 месяцев\n */\n warrantyComment?: string;\n /**\n * **Официальная гарантия производителя**\n */\n manufacturerWarranty?: boolean;\n /**\n * **Номер документа**\n *\n * Номер документа на товар: сертификата, декларации соответствия и т. п.\n *\n * Прежде чем указывать номер документа, загрузите скан документа через кабинет.\n *\n * Укажите номер документа.\n *\n * Пример: 6241421\n */\n certificate?: string;\n /**\n * **Ключевые слова**\n *\n * Пример: Кроссовки, высокая подошва\n */\n keywords?: string[];\n /**\n * **Размерная сетка**\n */\n sizes?: ISize[];\n /**\n * **Связанные товары**\n *\n * Указываются id товаров\n *\n * Пример: 1234\n */\n relatedProducts?: number[];\n /**\n * **Название коллекции, ряда или серии товара**\n *\n * Пример: Jordan 4\n */\n seriesName?: string;\n /**\n * **Пол или название группы потребителей**\n *\n * Пример: Дети, Женское, Унисекс\n */\n gender?: string;\n}\n\nexport enum Vat {\n NO_VAT = \"NO_VAT\",\n VAT_0 = \"VAT_0\",\n VAT_10 = \"VAT_10\",\n VAT_20 = \"VAT_20\",\n}\n\nexport enum Currency {\n RUR = \"RUR\",\n BYN = \"BYN\",\n EUR = \"EUR\",\n USD = \"USD\",\n UAN = \"UAN\",\n KZT = \"KZT\",\n}\n\nexport interface IParam {\n /**\n * **Название характеристики**\n */\n key: string;\n /**\n * **Значение**\n */\n value: string;\n}\n\nexport interface ISize {\n /**\n * **Название единицы измерения**\n */\n name: string;\n /**\n * **Разделитель**\n */\n delimiter: string;\n /**\n * **Значения размерного ряда**\n *\n * Размеры указываются через разделитель\n */\n value: string;\n}\n"],"names":["__publicField","PassThrough","Extension","stream","categories","JsonStreamStringify","XMLBuilder","Vat","Currency"],"mappings":"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"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -54,7 +54,7 @@ class CSVFormatter {
|
|
|
54
54
|
__publicField$8(this, "formatterName", "CSV");
|
|
55
55
|
__publicField$8(this, "fileExtension", Extension.CSV);
|
|
56
56
|
}
|
|
57
|
-
async format(products, categories, _, __) {
|
|
57
|
+
async format(writableStream, products, categories, _, __) {
|
|
58
58
|
const mappedCategories = {};
|
|
59
59
|
categories?.forEach(({ id, name }) => mappedCategories[id] = name);
|
|
60
60
|
const csvStream = new CSVStream({
|
|
@@ -62,6 +62,7 @@ class CSVFormatter {
|
|
|
62
62
|
emptyFieldValue: "",
|
|
63
63
|
lineSeparator: "\n"
|
|
64
64
|
});
|
|
65
|
+
csvStream.getWritableStream().pipe(writableStream);
|
|
65
66
|
const columns = /* @__PURE__ */ new Set([
|
|
66
67
|
"url",
|
|
67
68
|
"productId",
|
|
@@ -111,7 +112,6 @@ class CSVFormatter {
|
|
|
111
112
|
csvStream.addRow(row);
|
|
112
113
|
});
|
|
113
114
|
csvStream.getWritableStream().end();
|
|
114
|
-
return csvStream.getWritableStream();
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
|
|
@@ -124,7 +124,7 @@ class ExcelFormatter {
|
|
|
124
124
|
__publicField$7(this, "formatterName", "Excel");
|
|
125
125
|
__publicField$7(this, "fileExtension", Extension.XLSX);
|
|
126
126
|
}
|
|
127
|
-
async format(products, categories, _, __) {
|
|
127
|
+
async format(writableStream, products, categories, _, __) {
|
|
128
128
|
const mappedCategories = {};
|
|
129
129
|
categories?.forEach(({ id, name }) => mappedCategories[id] = name);
|
|
130
130
|
const columns = /* @__PURE__ */ new Set([
|
|
@@ -158,9 +158,8 @@ class ExcelFormatter {
|
|
|
158
158
|
if (value) columns.add(key);
|
|
159
159
|
});
|
|
160
160
|
});
|
|
161
|
-
const passThroughStream = new PassThrough();
|
|
162
161
|
const workbook = new stream$2.xlsx.WorkbookWriter({
|
|
163
|
-
stream:
|
|
162
|
+
stream: writableStream
|
|
164
163
|
});
|
|
165
164
|
const worksheet = workbook.addWorksheet("products");
|
|
166
165
|
worksheet.columns = Array.from(columns).map((column) => ({
|
|
@@ -185,8 +184,6 @@ class ExcelFormatter {
|
|
|
185
184
|
});
|
|
186
185
|
worksheet.commit();
|
|
187
186
|
await workbook.commit();
|
|
188
|
-
passThroughStream.end();
|
|
189
|
-
return passThroughStream;
|
|
190
187
|
}
|
|
191
188
|
}
|
|
192
189
|
|
|
@@ -199,7 +196,7 @@ class InsalesFormatter {
|
|
|
199
196
|
__publicField$6(this, "formatterName", "Insales");
|
|
200
197
|
__publicField$6(this, "fileExtension", Extension.XLSX);
|
|
201
198
|
}
|
|
202
|
-
async format(products, categories, _, __) {
|
|
199
|
+
async format(writableStream, products, categories, _, __) {
|
|
203
200
|
const mappedCategories = {};
|
|
204
201
|
categories?.forEach(
|
|
205
202
|
(category) => mappedCategories[category.id] = category
|
|
@@ -237,9 +234,8 @@ class InsalesFormatter {
|
|
|
237
234
|
});
|
|
238
235
|
return categories2;
|
|
239
236
|
};
|
|
240
|
-
const passThroughStream = new PassThrough();
|
|
241
237
|
const workbook = new stream$1.xlsx.WorkbookWriter({
|
|
242
|
-
stream:
|
|
238
|
+
stream: writableStream
|
|
243
239
|
});
|
|
244
240
|
const worksheet = workbook.addWorksheet("products");
|
|
245
241
|
const columns = /* @__PURE__ */ new Set([
|
|
@@ -324,8 +320,6 @@ class InsalesFormatter {
|
|
|
324
320
|
});
|
|
325
321
|
worksheet.commit();
|
|
326
322
|
await workbook.commit();
|
|
327
|
-
passThroughStream.end();
|
|
328
|
-
return passThroughStream;
|
|
329
323
|
}
|
|
330
324
|
}
|
|
331
325
|
|
|
@@ -337,12 +331,13 @@ class JSONFormatter {
|
|
|
337
331
|
__publicField$5(this, "formatterName", "JSON");
|
|
338
332
|
__publicField$5(this, "fileExtension", Extension.JSON);
|
|
339
333
|
}
|
|
340
|
-
async format(products, categories, brands, _) {
|
|
341
|
-
|
|
334
|
+
async format(writableStream, products, categories, brands, _) {
|
|
335
|
+
const stream = new JsonStreamStringify({
|
|
342
336
|
categories,
|
|
343
337
|
brands,
|
|
344
338
|
products
|
|
345
339
|
});
|
|
340
|
+
stream.pipe(writableStream);
|
|
346
341
|
}
|
|
347
342
|
}
|
|
348
343
|
|
|
@@ -354,7 +349,7 @@ class SimpleJSONFormatter {
|
|
|
354
349
|
__publicField$4(this, "formatterName", "JSON");
|
|
355
350
|
__publicField$4(this, "fileExtension", Extension.JSON);
|
|
356
351
|
}
|
|
357
|
-
async format(products, categories, brands, _) {
|
|
352
|
+
async format(writableStream, products, categories, brands, _) {
|
|
358
353
|
const groupedProduct = /* @__PURE__ */ new Map();
|
|
359
354
|
products.forEach((product) => {
|
|
360
355
|
if (product.parentId !== void 0) return;
|
|
@@ -369,11 +364,12 @@ class SimpleJSONFormatter {
|
|
|
369
364
|
if (!parent) return;
|
|
370
365
|
parent.children.push(product);
|
|
371
366
|
});
|
|
372
|
-
|
|
367
|
+
const stream = new JsonStreamStringify({
|
|
373
368
|
categories,
|
|
374
369
|
brands,
|
|
375
370
|
products: Array.from(groupedProduct.values())
|
|
376
371
|
});
|
|
372
|
+
stream.pipe(writableStream);
|
|
377
373
|
}
|
|
378
374
|
}
|
|
379
375
|
|
|
@@ -386,7 +382,7 @@ class TgShopFormatter {
|
|
|
386
382
|
__publicField$3(this, "formatterName", "TgShop");
|
|
387
383
|
__publicField$3(this, "fileExtension", Extension.XLSX);
|
|
388
384
|
}
|
|
389
|
-
async format(products, categories, _, __) {
|
|
385
|
+
async format(writableStream, products, categories, _, __) {
|
|
390
386
|
const getParameter = (product, key) => product.params?.find((value) => value.key === key);
|
|
391
387
|
const convertProduct = (product) => ({
|
|
392
388
|
"category id": product.categoryId,
|
|
@@ -404,9 +400,8 @@ class TgShopFormatter {
|
|
|
404
400
|
size: getParameter(product, "size")?.value,
|
|
405
401
|
priority: void 0
|
|
406
402
|
});
|
|
407
|
-
const passThroughStream = new PassThrough();
|
|
408
403
|
const workbook = new stream.xlsx.WorkbookWriter({
|
|
409
|
-
stream:
|
|
404
|
+
stream: writableStream
|
|
410
405
|
});
|
|
411
406
|
const categoryWorksheet = workbook.addWorksheet("categories");
|
|
412
407
|
const productsWorksheet = workbook.addWorksheet("offers");
|
|
@@ -453,7 +448,6 @@ class TgShopFormatter {
|
|
|
453
448
|
categoryWorksheet.commit();
|
|
454
449
|
productsWorksheet.commit();
|
|
455
450
|
await workbook.commit();
|
|
456
|
-
return passThroughStream;
|
|
457
451
|
}
|
|
458
452
|
}
|
|
459
453
|
|
|
@@ -465,7 +459,7 @@ class TildaFormatter {
|
|
|
465
459
|
__publicField$2(this, "formatterName", "Tilda");
|
|
466
460
|
__publicField$2(this, "fileExtension", Extension.CSV);
|
|
467
461
|
}
|
|
468
|
-
async format(products, categories, _, __) {
|
|
462
|
+
async format(writableStream, products, categories, _, __) {
|
|
469
463
|
const mappedCategories = {};
|
|
470
464
|
categories?.forEach(({ id, name }) => mappedCategories[id] = name);
|
|
471
465
|
const csvStream = new CSVStream({
|
|
@@ -473,6 +467,7 @@ class TildaFormatter {
|
|
|
473
467
|
emptyFieldValue: "",
|
|
474
468
|
lineSeparator: "\n"
|
|
475
469
|
});
|
|
470
|
+
csvStream.getWritableStream().pipe(writableStream);
|
|
476
471
|
const columns = /* @__PURE__ */ new Set([
|
|
477
472
|
"SKU",
|
|
478
473
|
"Brand",
|
|
@@ -506,7 +501,6 @@ class TildaFormatter {
|
|
|
506
501
|
csvStream.addRow(row);
|
|
507
502
|
});
|
|
508
503
|
csvStream.getWritableStream().end();
|
|
509
|
-
return csvStream.getWritableStream();
|
|
510
504
|
}
|
|
511
505
|
}
|
|
512
506
|
|
|
@@ -518,8 +512,9 @@ class YMLFormatter {
|
|
|
518
512
|
__publicField$1(this, "formatterName", "YMl");
|
|
519
513
|
__publicField$1(this, "fileExtension", Extension.YML);
|
|
520
514
|
}
|
|
521
|
-
async format(products, categories, brands, options) {
|
|
515
|
+
async format(writableStream, products, categories, brands, options) {
|
|
522
516
|
const result = new PassThrough();
|
|
517
|
+
result.pipe(writableStream);
|
|
523
518
|
const builder = new XMLBuilder({
|
|
524
519
|
ignoreAttributes: false,
|
|
525
520
|
cdataPropName: "__cdata",
|
|
@@ -567,7 +562,6 @@ class YMLFormatter {
|
|
|
567
562
|
result.write("</yml_catalog>\n");
|
|
568
563
|
result.end();
|
|
569
564
|
});
|
|
570
|
-
return result;
|
|
571
565
|
}
|
|
572
566
|
getBrands(brands) {
|
|
573
567
|
if (!brands) return [];
|
|
@@ -700,13 +694,14 @@ class GoodsExporter {
|
|
|
700
694
|
let transformedProducts = products;
|
|
701
695
|
for (const transformer of this.transformers)
|
|
702
696
|
transformedProducts = await transformer(transformedProducts);
|
|
703
|
-
const
|
|
697
|
+
const writableStream = this.exporter();
|
|
698
|
+
await this.formatter.format(
|
|
699
|
+
writableStream,
|
|
704
700
|
transformedProducts,
|
|
705
701
|
categories,
|
|
706
702
|
brands,
|
|
707
703
|
option
|
|
708
704
|
);
|
|
709
|
-
stream.pipe(this.exporter());
|
|
710
705
|
}
|
|
711
706
|
}
|
|
712
707
|
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/streams/CSVStream.ts","../../src/formatter/formater.types.ts","../../src/formatter/CSV.formatter.ts","../../src/formatter/Excel.formatter.ts","../../src/formatter/Insales.formatter.ts","../../src/formatter/JSON.formatter.ts","../../src/formatter/SimpleJSON.formatter.ts","../../src/formatter/TgShop.formatter.ts","../../src/formatter/Tilda.formatter.ts","../../src/formatter/YML.formatter.ts","../../src/formatter/index.ts","../../src/exporter/goodsExporter.ts","../../src/types/Product.types.ts"],"sourcesContent":["import { PassThrough } from \"stream\";\n\nexport interface CSVStreamOptions {\n delimiter?: string;\n emptyFieldValue?: string;\n lineSeparator?: string;\n}\n\nexport class CSVStream {\n private readonly stream: PassThrough = new PassThrough();\n private readonly delimiter: string = \";\";\n private readonly lineSeparator: string = \"\\n\";\n private readonly emptyFieldValue: string = \"\";\n private columns = new Set<string>();\n\n constructor({ delimiter, lineSeparator, emptyFieldValue }: CSVStreamOptions) {\n if (delimiter !== undefined) this.delimiter = delimiter;\n if (lineSeparator !== undefined) this.lineSeparator = lineSeparator;\n if (emptyFieldValue !== undefined) this.emptyFieldValue = emptyFieldValue;\n }\n\n getWritableStream() {\n return this.stream;\n }\n\n setColumns(columns: Set<string>) {\n this.columns = columns;\n this.stream.write(\n Array.from(this.columns).join(this.delimiter) + this.lineSeparator,\n );\n }\n\n addRow(items: Record<string, any>) {\n this.stream.write(\n Array.from(this.columns)\n .map((key) =>\n items[key] === undefined ? this.emptyFieldValue : items[key] + \"\",\n )\n .join(this.delimiter) + this.lineSeparator,\n );\n }\n}\n","import { type Brand, type Category, type Product } from \"../types\";\n\nimport { type Stream } from \"stream\";\n\nexport abstract class FormatterAbstract {\n public abstract formatterName: string;\n public abstract fileExtension: Extension;\n\n public abstract format(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n option?: FormatterOptions,\n ): Promise<Stream>;\n}\n\nexport interface FormatterOptions {\n shopName?: string;\n\n companyName?: string;\n\n splitParams?: boolean;\n}\n\nexport enum Extension {\n CSV = \"csv\",\n YML = \"yml\",\n XLSX = \"xlsx\",\n JSON = \"json\",\n}\n","import { CSVStream } from \"../streams/CSVStream\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Stream } from \"stream\";\n\nexport class CSVFormatter implements FormatterAbstract {\n public formatterName = \"CSV\";\n public fileExtension = Extension.CSV;\n\n public async format(\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<Stream> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n\n const csvStream = new CSVStream({\n delimiter: \";\",\n emptyFieldValue: \"\",\n lineSeparator: \"\\n\",\n });\n const columns = new Set<string>([\n \"url\",\n \"productId\",\n \"parentId\",\n \"variantId\",\n \"title\",\n \"description\",\n \"vendor\",\n \"vendorCode\",\n \"category\",\n \"images\",\n \"videos\",\n \"price\",\n \"oldPrice\",\n \"purchasePrice\",\n \"currency\",\n \"saleDate\",\n \"countryOfOrigin\",\n \"tags\",\n \"codesTN\",\n \"params\",\n \"properties\",\n \"sizes\",\n \"keywords\",\n \"relatedProducts\",\n ]);\n products.forEach((product) => {\n Object.entries(product).forEach(([key, value]) => {\n if (value) columns.add(key);\n });\n });\n csvStream.setColumns(columns);\n products.forEach((product) => {\n const row: Record<string, any> = {\n ...product,\n category: mappedCategories[product.categoryId],\n images: product.images?.join(\",\"),\n videos: product.videos?.join(\",\"),\n tags: product.tags?.join(\",\"),\n codesTN: product.codesTN?.join(\", \"),\n params: product.params\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n properties: product.properties\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n sizes: product.sizes\n ?.map(({ name, value }) => `${name}=${value}`)\n .join(\", \"),\n keywords: product.keywords?.join(\",\"),\n relatedProducts: product.relatedProducts?.join(\",\"),\n };\n csvStream.addRow(row);\n });\n\n // Закрываем поток\n csvStream.getWritableStream().end();\n\n return csvStream.getWritableStream();\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { PassThrough, type Stream } from \"stream\";\nconst { stream } = pkg;\n\nexport class ExcelFormatter implements FormatterAbstract {\n public formatterName = \"Excel\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions\n ): Promise<Stream> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n const columns = new Set<string>([\n \"url\",\n \"productId\",\n \"parentId\",\n \"variantId\",\n \"title\",\n \"description\",\n \"vendor\",\n \"vendorCode\",\n \"category\",\n \"images\",\n \"videos\",\n \"price\",\n \"oldPrice\",\n \"purchasePrice\",\n \"currency\",\n \"saleDate\",\n \"countryOfOrigin\",\n \"tags\",\n \"codesTN\",\n \"params\",\n \"properties\",\n \"sizes\",\n \"keywords\",\n \"relatedProducts\",\n ]);\n products.forEach((product) => {\n Object.entries(product).forEach(([key, value]) => {\n if (value) columns.add(key);\n });\n });\n\n const passThroughStream = new PassThrough();\n\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: passThroughStream,\n });\n const worksheet = workbook.addWorksheet(\"products\");\n worksheet.columns = Array.from(columns).map((column) => ({\n key: column,\n header: column,\n }));\n\n products.forEach((product) => {\n const row = {\n ...product,\n category: mappedCategories[product.categoryId],\n images: product.images?.join(\",\"),\n videos: product.videos?.join(\",\"),\n tags: product.tags?.join(\",\"),\n keywords: product.keywords?.join(\",\"),\n relatedProducts: product.relatedProducts?.join(\",\"),\n codesTN: product.codesTN?.join(\", \"),\n params: product.params\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n properties: product.properties\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n sizes: product.sizes\n ?.map(({ name, value }) => `${name}=${value}`)\n .join(\", \"),\n };\n worksheet.addRow(row).commit();\n });\n worksheet.commit();\n await workbook.commit();\n passThroughStream.end();\n return passThroughStream;\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { PassThrough, type Stream } from \"stream\";\nconst { stream } = pkg;\n\nexport class InsalesFormatter implements FormatterAbstract {\n public formatterName = \"Insales\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<Stream> {\n const mappedCategories: Record<number, Category> = {};\n categories?.forEach(\n (category) => (mappedCategories[category.id] = category),\n );\n\n const getParams = (product: Product): Record<string, string> => {\n const properties: Record<string, string> = {};\n\n product.params?.forEach(\n (p) => (properties[`Свойство: ${p.key}`] = p.value),\n );\n\n return properties;\n };\n const getProperties = (product: Product): Record<string, string> => {\n const properties: Record<string, string> = {};\n\n product.properties?.forEach(\n (p) => (properties[`Параметр: ${p.key}`] = p.value),\n );\n\n return properties;\n };\n\n const getCategories = (product: Product) => {\n const categories: Record<string, string> = {};\n const categoryList = new Array<string>();\n\n function addCategory(categoryId: number | undefined) {\n if (categoryId === undefined) return;\n\n const category = mappedCategories[categoryId];\n if (category) {\n categoryList.push(category.name);\n addCategory(category.parentId);\n }\n }\n\n addCategory(product.categoryId);\n\n categoryList.forEach((name, i) => {\n const index = categoryList.length - 1 - i;\n const key = index === 0 ? \"Корневая\" : `Подкатегория ${index}`;\n categories[key] = name;\n });\n\n return categories;\n };\n const passThroughStream = new PassThrough();\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: passThroughStream,\n });\n const worksheet = workbook.addWorksheet(\"products\");\n const columns = new Set<string>([\n \"Внешний ID\",\n \"Ссылка на товар\",\n \"Артикул\",\n \"Корневая\",\n \"Подкатегория 1\",\n \"Подкатегория 2\",\n \"Название товара или услуги\",\n \"Старая цена\",\n \"Цена продажи\",\n \"Cебестоимость\",\n \"Категории\",\n \"Остаток\",\n \"Штрих-код\",\n \"Краткое описание\",\n \"Полное описание\",\n \"Габариты варианта\",\n \"Вес\",\n \"Размещение на сайте\",\n \"НДС\",\n \"Валюта склада\",\n \"Изображения варианта\",\n \"Изображения\",\n \"Ссылка на видео\",\n \"Параметры\",\n \"Свойства\",\n \"Параметр: Бренд\",\n \"Параметр: Коллекция\",\n \"Параметр: Пол\",\n \"Параметр: Дата выхода\",\n \"Размерная сетка\",\n \"Связанные товары\",\n \"Ключевые слова\",\n ]);\n products.forEach((product) => {\n Object.keys({\n ...getParams(product),\n ...getProperties(product),\n }).forEach((key) => {\n columns.add(key);\n });\n });\n worksheet.columns = Array.from(columns).map((column) => ({\n header: column,\n key: column,\n }));\n products.forEach((product) => {\n const row = {\n \"Внешний ID\": product.productId,\n \"Ссылка на товар\": product.url,\n Артикул: product.vendorCode,\n \"Название товара или услуги\": product.title,\n \"Старая цена\": product.oldPrice,\n \"Цена продажи\": product.price,\n Cебестоимость: product.purchasePrice,\n ...getCategories(product),\n Остаток: product.count,\n \"Штрих-код\": product.barcode,\n \"Краткое описание\": undefined,\n \"Полное описание\": product.description,\n \"Габариты варианта\": product.dimensions,\n Вес: product.weight,\n \"Размещение на сайте\": product.available,\n НДС: product.vat.toString(),\n \"Валюта склада\": product.currency.toString(),\n \"Изображения варианта\":\n product.parentId === undefined\n ? product.images?.join(\" \")\n : undefined,\n Изображения:\n product.parentId === undefined\n ? undefined\n : product.images?.join(\" \"),\n \"Ссылка на видео\": product.videos ? product.videos[0] : undefined,\n ...getParams(product),\n ...getProperties(product),\n \"Параметр: Бренд\": product.vendor,\n \"Параметр: Коллекция\": product.seriesName,\n \"Параметр: Пол\": product.gender,\n \"Параметр: Дата выхода\": product.saleDate,\n \"Размерная сетка\": JSON.stringify(product.sizes),\n \"Связанные товары\": product.relatedProducts?.join(\",\"),\n \"Ключевые слова\": product.keywords?.join(\",\"),\n };\n worksheet.addRow(row).commit();\n });\n worksheet.commit();\n await workbook.commit();\n passThroughStream.end();\n return passThroughStream;\n }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Stream } from \"stream\";\n\nexport class JSONFormatter implements FormatterAbstract {\n public formatterName = \"JSON\";\n public fileExtension = Extension.JSON;\n\n public async format(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n _?: FormatterOptions,\n ): Promise<Stream> {\n return new JsonStreamStringify({\n categories,\n brands,\n products,\n });\n }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Stream } from \"stream\";\n\ninterface SimpleProduct extends Product {\n children: Product[];\n}\n\nexport class SimpleJSONFormatter implements FormatterAbstract {\n public formatterName = \"JSON\";\n public fileExtension = Extension.JSON;\n\n public async format(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n _?: FormatterOptions,\n ): Promise<Stream> {\n const groupedProduct = new Map<number, SimpleProduct>();\n products.forEach((product) => {\n if (product.parentId !== undefined) return;\n groupedProduct.set(product.variantId, {\n ...product,\n children: [],\n });\n });\n products.forEach((product) => {\n if (product.parentId === undefined) return;\n const parent = groupedProduct.get(product.parentId);\n if (!parent) return;\n parent.children.push(product);\n });\n return new JsonStreamStringify({\n categories,\n brands,\n products: Array.from(groupedProduct.values()),\n });\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type IParam, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { PassThrough, type Stream } from \"stream\";\nconst { stream } = pkg;\n\nexport class TgShopFormatter implements FormatterAbstract {\n public formatterName = \"TgShop\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<Stream> {\n const getParameter = (product: Product, key: string): IParam | undefined =>\n product.params?.find((value) => value.key === key);\n\n const convertProduct = (product: Product) => ({\n \"category id\": product.categoryId,\n \"group id\": product.parentId,\n \"id product\": product.variantId,\n \"name product\": product.title,\n price: product.price,\n picture: product.images?.join(\", \"),\n vendorCode: product.vendorCode,\n oldprice: product.oldPrice,\n description: product.description,\n shortDescription: \"\",\n quantityInStock: product.count,\n color: getParameter(product, \"color\")?.value,\n size: getParameter(product, \"size\")?.value,\n priority: undefined,\n });\n const passThroughStream = new PassThrough();\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: passThroughStream,\n });\n const categoryWorksheet = workbook.addWorksheet(\"categories\");\n const productsWorksheet = workbook.addWorksheet(\"offers\");\n categoryWorksheet.columns = [\n {\n header: \"id\",\n key: \"id\",\n },\n {\n header: \"parentId\",\n key: \"parentId\",\n },\n {\n header: \"name\",\n key: \"name\",\n },\n ];\n const columns = [\n \"category id\",\n \"group id\",\n \"id product\",\n \"name product\",\n \"price\",\n \"picture\",\n \"vendorCode\",\n \"oldprice\",\n \"description\",\n \"shortDescription\",\n \"quantityInStock\",\n \"color\",\n \"size\",\n \"priority\",\n ];\n\n productsWorksheet.columns = columns.map((column) => ({\n header: column,\n key: column,\n }));\n\n categories?.forEach((category) => {\n categoryWorksheet.addRow(category).commit();\n });\n\n products.forEach((product) => {\n productsWorksheet.addRow(convertProduct(product)).commit();\n });\n categoryWorksheet.commit();\n productsWorksheet.commit();\n\n await workbook.commit();\n\n return passThroughStream;\n }\n}\n","import { CSVStream } from \"../streams/CSVStream\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Stream } from \"stream\";\n\nexport class TildaFormatter implements FormatterAbstract {\n public formatterName = \"Tilda\";\n public fileExtension = Extension.CSV;\n\n public async format(\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions\n ): Promise<Stream> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n\n const csvStream = new CSVStream({\n delimiter: \";\",\n emptyFieldValue: \"\",\n lineSeparator: \"\\n\",\n });\n const columns = new Set<string>([\n \"SKU\",\n \"Brand\",\n \"Category\",\n \"Title\",\n \"Text\",\n \"Photo\",\n \"Price\",\n \"Price Old\",\n \"Quantity\",\n \"Editions\",\n \"External ID\",\n \"Parent UID\",\n ]);\n csvStream.setColumns(columns);\n products.forEach((product) => {\n const row: Record<string, string | number | undefined> = {\n SKU: product.vendorCode,\n Brand: product.vendor,\n Category: mappedCategories[product.categoryId],\n Title: product.title,\n Text: product.description,\n Photo: product.images?.join(\";\"),\n Price: product.price,\n \"Price Old\": product.oldPrice,\n Quantity: product.count,\n Editions: product.params\n ?.map(({ key, value }) => `${key}:${value}`)\n .join(\";\"),\n \"External ID\": product.variantId,\n \"Parent UID\": product.parentId,\n };\n csvStream.addRow(row);\n });\n\n csvStream.getWritableStream().end();\n return csvStream.getWritableStream();\n }\n}\n","import { XMLBuilder } from \"fast-xml-parser\";\n\nimport { type Product, type Category, type Brand } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { PassThrough, type Stream } from \"stream\";\n\nexport class YMLFormatter implements FormatterAbstract {\n public formatterName = \"YMl\";\n public fileExtension = Extension.YML;\n\n public async format(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n options?: FormatterOptions,\n ): Promise<Stream> {\n const result = new PassThrough();\n\n const builder = new XMLBuilder({\n ignoreAttributes: false,\n cdataPropName: \"__cdata\",\n format: true,\n indentBy: \" \",\n });\n\n const date = new Date().toISOString().replace(/.\\d+Z/, \"\");\n\n // Начинаем формирование XML\n result.write('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n');\n result.write('<yml_catalog date=\"' + date + '\">\\n');\n\n // Открываем тег <shop>\n result.write(\"<shop>\\n\");\n\n // Добавляем информацию о магазине\n if (options?.shopName) {\n result.write(builder.build({ name: options.shopName }));\n result.write(\"\\n\");\n }\n if (options?.companyName) {\n result.write(builder.build({ company: options.companyName }));\n result.write(\"\\n\");\n }\n\n // Добавляем категории и бренды\n if (categories) {\n result.write(\n builder.build({\n // tagname: \"categories\",\n categories: { category: this.getCategories(categories) },\n }),\n );\n result.write(\"\\n\");\n }\n if (brands) {\n result.write(\n builder.build({ brands: { brand: this.getBrands(brands) } }),\n );\n result.write(\"\\n\");\n }\n\n // Открываем секцию <offers>\n result.write(\"<offers>\\n\");\n\n // Создаем поток для обработки offer элементов\n const offerStream = new PassThrough();\n\n // Пайпим поток offer элементов в основной итоговый поток\n offerStream.pipe(result, { end: false });\n\n // Записываем каждый продукт в поток\n products.forEach((product) => {\n const offer = builder.build({ offer: this.getOffer(product) });\n offerStream.write(offer + \"\\n\");\n });\n\n // Завершаем поток offer\n offerStream.end();\n\n offerStream.on(\"end\", () => {\n // Закрываем секцию <offers>\n result.write(\"</offers>\\n\");\n\n // Закрываем тег <shop>\n result.write(\"</shop>\\n\");\n\n // Закрываем тег <yml_catalog>\n result.write(\"</yml_catalog>\\n\");\n\n // Завершаем итоговый поток\n result.end();\n });\n\n return result;\n }\n\n private getBrands(brands?: Brand[]) {\n if (!brands) return [];\n\n return brands.map((brand) => ({\n \"@_id\": brand.id,\n \"@_url\": brand.coverURL ?? \"\",\n \"#text\": brand.name,\n }));\n }\n\n private getCategories(categories?: Category[]) {\n if (!categories) return [];\n\n return categories.map((cat) => ({\n \"@_id\": cat.id,\n \"@_parentId\": cat.parentId ?? \"\",\n \"#text\": cat.name,\n }));\n }\n\n private getOffer(product: Product): any {\n const result = {\n \"@_id\": product.variantId,\n name: product.title,\n price: product.price,\n oldprice: product.oldPrice,\n purchase_price: product.purchasePrice,\n additional_expenses: product.additionalExpenses,\n cofinance_price: product.cofinancePrice,\n currencyId: product.currency,\n categoryId: product.categoryId,\n vendorId: product.vendorId,\n vendor: product.vendor,\n vendorCode: product.vendorCode,\n picture: product.images,\n video: product.videos,\n available: product.available,\n series: product.seriesName,\n \"min-quantity\": product.minQuantity,\n \"step-quantity\": product.stepQuantity,\n size: product.sizes?.map((size) => ({\n \"#text\": size.value,\n \"@_name\": size.name,\n \"@_delimiter\": size.delimiter,\n })),\n keyword: product.keywords,\n saleDate: product.saleDate,\n property: product.properties?.map((property) => ({\n \"#text\": property.value,\n \"@_name\": property.key,\n })),\n param: product.params?.map((param) => ({\n \"#text\": param.value,\n \"@_name\": param.key,\n })),\n description: {\n __cdata: product.description,\n },\n country_of_origin: product.countryOfOrigin,\n barcode: product.barcode,\n vat: product.vat,\n count: product.count,\n \"set-ids\": product.tags?.join(\", \"),\n adult: product.adult,\n downloadable: product.downloadable,\n \"period-of-validity-days\": product.validityPeriod,\n \"comment-validity-days\": product.validityComment,\n \"service-life-days\": product.serviceLifePeriod,\n \"comment-life-days\": product.serviceLifeComment,\n \"warranty-days\": product.warrantyPeriod,\n \"comment-warranty\": product.warrantyComment,\n manufacturer_warranty: product.manufacturerWarranty,\n certificate: product.certificate,\n url: product.url,\n weight: product.weight,\n dimensions: product.dimensions,\n boxCount: product.boxCount,\n disabled: product.disabled,\n age: product.age != null && {\n \"@_unit\": product.age.unit,\n \"#text\": product.age.value,\n },\n \"tn-ved-codes\": product.codesTN?.length != null && {\n \"tn-ved-code\": product.codesTN,\n },\n relatedProduct: product.relatedProducts,\n gender: product.gender,\n };\n if (product.parentId !== undefined) {\n return {\n ...result,\n \"@_group_id\": product.parentId,\n };\n }\n return result;\n }\n}\n","import { CSVFormatter } from \"./CSV.formatter\";\nimport { ExcelFormatter } from \"./Excel.formatter\";\nimport { InsalesFormatter } from \"./Insales.formatter\";\nimport { JSONFormatter } from \"./JSON.formatter\";\nimport { SimpleJSONFormatter } from \"./SimpleJSON.formatter\";\nimport { TgShopFormatter } from \"./TgShop.formatter\";\nimport { TildaFormatter } from \"./Tilda.formatter\";\nimport { YMLFormatter } from \"./YML.formatter\";\n\nexport * from \"./formater.types\";\n\nexport const Formatters = {\n TildaFormatter,\n CSVFormatter,\n InsalesFormatter,\n YMLFormatter,\n TgShopFormatter,\n ExcelFormatter,\n JSONFormatter,\n SimpleJSONFormatter,\n};\n","import {\n type FormatterAbstract,\n type FormatterOptions,\n Formatters,\n} from \"../formatter\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport { type Exporter, type Transformer } from \"./exporter.types\";\n\nimport fs from \"fs\";\n\nexport class GoodsExporter {\n private formatter: FormatterAbstract = new Formatters.YMLFormatter();\n private exporter: Exporter = () => {\n return fs.createWriteStream(\n `${this.formatter.formatterName}.output.${this.formatter.fileExtension}`,\n );\n };\n\n private transformers = new Array<Transformer>();\n\n public setTransformers(transformers: Transformer[]): void {\n this.transformers = transformers;\n }\n\n public setFormatter(formatter: FormatterAbstract): void {\n this.formatter = formatter;\n }\n\n public setExporter(exporter: Exporter): void {\n this.exporter = exporter;\n }\n\n async export(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n option?: FormatterOptions,\n ): Promise<void> {\n let transformedProducts: Product[] = products;\n\n for (const transformer of this.transformers)\n transformedProducts = await transformer(transformedProducts);\n\n const stream = await this.formatter.format(\n transformedProducts,\n categories,\n brands,\n option,\n );\n stream.pipe(this.exporter());\n }\n}\n","export interface Product {\n /**\n * **ID товара**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n productId: number;\n /**\n * **Родительскй SKU**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n parentId?: number;\n /**\n * **SKU**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n variantId: number;\n /**\n * **Название**\n *\n * Составляйте название по схеме: тип + бренд или производитель + модель + особенности, если есть (например, цвет, размер или вес) и количество в упаковке.\n *\n * Не включайте в название условия продажи (например, «скидка», «бесплатная доставка» и т. д.), эмоциональные характеристики («хит», «супер» и т. д.). Не пишите слова большими буквами — кроме устоявшихся названий брендов и моделей.\n *\n * Оптимальная длина — 50–60 символов, максимальная — 150.\n *\n * Составлять хорошие названия помогут [рекомендации](https://yandex.ru/support/marketplace/assortment/fields/title.html).\n *\n * Пример: Ударная дрель Makita HP1630, 710 Вт\n */\n title: string;\n /**\n * **Описание**\n *\n * Подробное описание товара: например, его преимущества и особенности.\n *\n * Не давайте в описании инструкций по установке и сборке. Не используйте слова «скидка», «распродажа», «дешевый», «подарок» (кроме подарочных категорий), «бесплатно», «акция», «специальная цена», «новинка», «new», «аналог», «заказ», «хит». Не указывайте никакой контактной информации и не давайте ссылок.\n *\n * Можно использовать теги:\n *\n ** <h>, <h1>, <h2> и так далее — для заголовков;\n ** <br> и <p> — для переноса строки;\n ** <ol> — для нумерованного списка;\n ** <ul> — для маркированного списка;\n ** <li> — для создания элементов списка (должен находиться внутри <ol> или <ul>);\n ** <div> — поддерживается, но не влияет на отображение текста.\n * Оптимальная длина — 400–600 символов, максимальная — 6000.\n *\n * Составить хорошее описание помогут рекомендации.\n *\n * Пример: В комплекте с детским микроскопом есть все, что нужно вашему ребенку для изучения микромира\n */\n description: string;\n /**\n * **Бренд**\n *\n * Название бренда или производителя.\n *\n * Записывайте название так, как его пишет сам бренд.\n *\n * Пример: LEVENHUK\n */\n vendor?: string;\n /**\n * **Артикул производителя**\n *\n * Код товара, который ему присвоил производитель.\n *\n * Если артикулов несколько, укажите их через запятую.\n *\n * Пример: VNDR-0005A, VNDR-0005B\n */\n vendorCode?: string;\n /**\n * **Дата выхода**\n *\n * Пример: 01.01.2000\n */\n saleDate?: string;\n /**\n * **Вендор в магазине**\n *\n * Содержит номер вендора, а не ее название.\n */\n vendorId?: number;\n /**\n * **Категория в магазине**\n *\n * Категория, к которой вы относите товар. Она помогает точнее определить для товара категорию на Маркете.\n *\n * Указывайте конкретные категории — например, набор ножей лучше отнести к категории Столовые приборы, а не просто Посуда.\n *\n * Выбирайте категории, которые описывают товар, а не абстрактный признак — например, лучше указать Духи, а не Подарки.\n *\n * Содержит номер категории, а не ее название.\n */\n categoryId: number;\n /**\n * **Страна производства**\n *\n * Страна, где был произведен товар.\n *\n * Записывайте названия стран так, как они записаны в [списке](https://yastatic.net/s3/doc-binary/src/support/market/ru/countries.xlsx).\n *\n * Пример: Россия\n */\n countryOfOrigin?: string;\n /**\n * **Изображение**\n *\n * До двадцати изображений, которые показываются на карточке товара.\n *\n * Принимаются jpg- или png-изображения товара, соответствующие [требованиям](https://yandex.ru/support/marketplace/assortment/fields/images.html).\n *\n * В кабинете изображения добавляются в виде файлов. В Excel-файле — в виде ссылок через запятую. Первое фото становится основным.\n *\n * Чтобы изменить изображение, выложите новое по новой ссылке, иначе картинка не обновится.\n */\n images?: string[];\n /**\n * **Видео**\n *\n * Видеоиллюстрации для карточки товара.\n *\n * Видео должно соответствовать [требованиям](https://yandex.ru/support/marketplace/assortment/fields/video.html).\n *\n * Можно добавить не больше 6 видео.\n *\n * В кабинете можно загрузить видеофайлы. В Excel-шаблоне укажите ссылки на файлы.\n */\n videos?: string[];\n /**\n * **Базовая цена**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 240\n */\n price: number;\n /**\n * **Цена до скидки**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Вы можете указать цену со скидкой от 5 до 75 %.\n *\n * Пример:\n *\n * 250\n */\n oldPrice?: number;\n /**\n * **Себестоимость**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 200\n */\n purchasePrice?: number;\n /**\n * **Дополнительные расходы**\n *\n * Дополнительные расходы на товар. Например, на доставку или упаковку.\n *\n * После заполнения этого поля в калькуляторе и на странице управления ценами рассчитается потенциальная маржинальность товара.\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 75\n */\n additionalExpenses?: number;\n /**\n * **Порог для скидок с Маркетом**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 300\n */\n cofinancePrice?: number;\n /**\n * **Валюта (DBS)**\n *\n * Валюта, в которой указана цена товара. Покупателям Маркет показывает цену в рублях, пересчитывая ее по курсу Центробанка.\n *\n * Поле используется, если для кабинета еще не включена работа с базовыми ценами.\n *\n * Поддерживаются российские и белорусские рубли, евро, доллары, украинские гривны и казахстанские тенге.\n *\n * В кабинете валюту можно просто выбрать из списка. В Excel-файле указывается код валюты: RUR, BYN, EUR, USD, UAN, KZT.\n */\n currency: Currency;\n /**\n * **Ссылка на страницу товара**\n *\n * Адрес страницы на вашем сайте с фотографиями и описанием товара.\n *\n * Максимальная длина URL — 512 символов. Записывайте его согласно стандарту RFC 3986.\n *\n * Пример: http://best.seller.ru/product_page.asp?pid=12346\n */\n url?: string;\n /**\n * **Убрать из продажи**\n *\n * Поле позволяет приостановить продажу товара.\n *\n * Укажите значение true, если нужно приостановить продажу.\n */\n disabled?: boolean;\n /**\n * **Доступное количество товара**\n *\n * Общее количество товара, доступное для продажи\n *\n * Укажите 0, если товара нет в наличии.\n *\n * Пример: 7\n */\n count?: number;\n /**\n * **Товар в наличии (DBS)**\n *\n * Поле указывает, есть ли товар в наличии.\n */\n available?: boolean;\n /**\n * **Минимальное количество товара**\n *\n * Если значение задано, покупатель не сможет заказать меньше единиц товара. Ограничение не работает, когда товара на складе осталось меньше этого количества — тогда покупатель сможет сделать заказ на остаток.\n *\n * Целое число.\n */\n minQuantity?: number;\n /**\n * **Квант продажи**\n *\n * Если значение задано, покупатель сможет добавить к заказу только кратное количество товара. Ограничение не работает, когда на складе осталось меньше этого количества — тогда покупатель сможет сделать заказ на остаток.\n *\n * Целое число.\n */\n stepQuantity?: number;\n /**\n * **Штрихкод**\n *\n * Указывайте в виде последовательности символов. Подойдут коды EAN-13, EAN-8, UPC-A, UPC-E или Code 128.\n *\n * Для книг указывайте ISBN.\n *\n * Для товаров [определенных категорий и торговых марок](https://yastatic.net/s3/doc-binary/src/support/market/ru/yandex-market-list-for-gtin.xlsx) штрихкод должен быть действительным кодом GTIN. Обратите внимание: внутренние штрихкоды, начинающиеся на 2 или 02, и коды формата Code 128 не являются GTIN.\n *\n * Если штрихкодов несколько, напишите все через запятую.\n *\n * Пример: 46012300000000\n */\n barcode?: string;\n /**\n * **Код ТН ВЭД**\n *\n * Для некоторых категорий товаров код ТН ВЭД обязателен. Если это касается ваших товаров, вы получите уведомление в каталоге.\n *\n * 10 или 14 цифр без пробелов.\n *\n * Пример: 8517610008\n */\n codesTN?: string[];\n /**\n * **С какого возраста пользоваться**\n *\n * Если товар не предназначен для детей младше определенного возраста, укажите это.\n *\n * Возрастные ограничения можно задавать в годах (с нуля, с 6, 12, 16 или 18) или в месяцах (любое число от 0 до 12).\n */\n age?: { unit: \"year\" | \"month\"; value: number };\n /**\n * **Вес с упаковкой**\n *\n * Вес товара с упаковкой.\n *\n * Единица измерения — килограммы. Можно дроби: разделитель — точка или запятая, не больше трех цифр после него.\n *\n * Пример: 3.1\n */\n weight?: number;\n /**\n * **Габариты с упаковкой**\n *\n * Длина, ширина, высота в упаковке.\n *\n * Единица измерения — сантиметры. Можно дроби: разделитель — точка или запятая, не больше трех цифр после него.\n *\n * Пример: 20.1/20.551/22.5\n */\n dimensions?: string;\n /**\n * **Товар занимает больше одного места**\n *\n * Если товар занимает одно место (представляет собой одну коробку, упаковку и так далее), оставьте поле пустым. Если товар занимает несколько мест — укажите их количество. Например, кондиционер занимает два места — внешний и внутренний блоки в двух коробках.\n *\n * Укажите количество мест.\n *\n * Пример: 2\n */\n boxCount?: number;\n /**\n * **Ставка НДС**\n *\n * Значение ставки НДС для товара.\n *\n * Выберите одно из значений:\n *\n ** НДС не облагается — 6 или NO_VAT\n *\n ** 0 % — 5 или VAT_0\n *\n ** 10 % — 2 или VAT_10\n *\n ** 20 % — 7 или VAT_20\n *\n * Если не заполнено, Маркет устанавливает ставку, соответствующую схеме налогообложения.\n *\n * Пример: VAT_20\n */\n vat: Vat;\n /**\n * **Характеристики, которые есть только у товаров конкретной категории**\n *\n * Кроме общих свойств, у товара есть характеристики, присущие конкретной категории, к которой он относится. Например, у велосипеда есть размер рамы, а детское пюре бывает овощное, мясное или фруктовое.\n */\n params?: IParam[];\n /**\n * **Свойства товара**\n *\n * *не YML поле\n */\n properties?: IParam[];\n /**\n * **Теги**\n *\n * Придумайте любое название — его можно будет изменить после.\n *\n * Максимальная длина тега — 20 символов.\n *\n * У одного товара — максимум 10 тегов.\n *\n * Всего можно создать не больше 50 разных тегов.\n *\n * Пример: apple, до 500 рублей\n */\n tags?: string[];\n /**\n * **Товар для взрослых**\n *\n * Параметр включает для товара пометку 18+. Устанавливайте ее только для товаров, которые относятся к удовлетворению сексуальных потребностей.\n */\n adult?: boolean;\n /**\n * **Цифровой товар**\n *\n * Параметр, устанавливаемый для цифровых товаров, которые просто скачиваются.\n */\n downloadable?: boolean;\n /**\n * **Срок годности**\n *\n * Период с момента изготовления, по прошествии которого товар становится непригоден.\n *\n * Указывайте срок, указанный на банке или упаковке. Текущая дата, дата поставки или дата отгрузки значения не имеет.\n *\n * Срок можно указывать в годах, месяцах, днях, неделях и часах.\n *\n * Обязательно указывайте срок, если он есть.\n *\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y6M — 1 год и 6 месяцев;\n ** P15D — 15 дней.\n */\n validityPeriod?: string;\n /**\n * **Комментарий к сроку годности**\n *\n * Поле предназначено для описаний условий хранения.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Хранить в сухом помещении\n */\n validityComment?: string;\n /**\n * **Срок службы**\n *\n * В течение срока службы товар должен исправно выполнять свою функцию.\n *\n * Обязательно указывайте срок, если он есть.\n *\n * Срок можно указывать в годах, месяцах и днях.\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y2M — 1 год и 2 месяца;\n ** P15D — 15 дней;\n ** P2Y10D — 2 года, 10 дней;\n ** P2Y6M10D — 2 года, 6 месяцев и 10 дней.\n */\n serviceLifePeriod?: string;\n /**\n * **Комментарий к сроку службы**\n *\n * Поле предназначено для описаний условий использования.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Использовать при температуре не ниже −10 градусов\n */\n serviceLifeComment?: string;\n /**\n * **Гарантийный срок**\n *\n * В течение какого времени можно бесплатно заменить или починить товар.\n *\n * Срок можно указывать в годах, месяцах или днях.\n *\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y2M — 1 год и 2 месяца;\n ** P15D — 15 дней;\n ** P2Y10D — 2 года, 10 дней;\n ** P2Y6M10D — 2 года, 6 месяцев и 10 дней.\n */\n warrantyPeriod?: string;\n /**\n * **Комментарий к гарантийному сроку**\n *\n * Поле предназначено для описания особенностей гарантийных условий.\n *\n * Указывайте только то, что относится к гарантии изготовителя.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Гарантия на аккумулятор — 6 месяцев\n */\n warrantyComment?: string;\n /**\n * **Официальная гарантия производителя**\n */\n manufacturerWarranty?: boolean;\n /**\n * **Номер документа**\n *\n * Номер документа на товар: сертификата, декларации соответствия и т. п.\n *\n * Прежде чем указывать номер документа, загрузите скан документа через кабинет.\n *\n * Укажите номер документа.\n *\n * Пример: 6241421\n */\n certificate?: string;\n /**\n * **Ключевые слова**\n *\n * Пример: Кроссовки, высокая подошва\n */\n keywords?: string[];\n /**\n * **Размерная сетка**\n */\n sizes?: ISize[];\n /**\n * **Связанные товары**\n *\n * Указываются id товаров\n *\n * Пример: 1234\n */\n relatedProducts?: number[];\n /**\n * **Название коллекции, ряда или серии товара**\n *\n * Пример: Jordan 4\n */\n seriesName?: string;\n /**\n * **Пол или название группы потребителей**\n *\n * Пример: Дети, Женское, Унисекс\n */\n gender?: string;\n}\n\nexport enum Vat {\n NO_VAT = \"NO_VAT\",\n VAT_0 = \"VAT_0\",\n VAT_10 = \"VAT_10\",\n VAT_20 = \"VAT_20\",\n}\n\nexport enum Currency {\n RUR = \"RUR\",\n BYN = \"BYN\",\n EUR = \"EUR\",\n USD = \"USD\",\n UAN = \"UAN\",\n KZT = \"KZT\",\n}\n\nexport interface IParam {\n /**\n * **Название характеристики**\n */\n key: string;\n /**\n * **Значение**\n */\n value: string;\n}\n\nexport interface ISize {\n /**\n * **Название единицы измерения**\n */\n name: string;\n /**\n * **Разделитель**\n */\n delimiter: string;\n /**\n * **Значения размерного ряда**\n *\n * Размеры указываются через разделитель\n */\n value: string;\n}\n"],"names":["__publicField","Extension","stream","categories","Vat","Currency"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/streams/CSVStream.ts","../../src/formatter/formater.types.ts","../../src/formatter/CSV.formatter.ts","../../src/formatter/Excel.formatter.ts","../../src/formatter/Insales.formatter.ts","../../src/formatter/JSON.formatter.ts","../../src/formatter/SimpleJSON.formatter.ts","../../src/formatter/TgShop.formatter.ts","../../src/formatter/Tilda.formatter.ts","../../src/formatter/YML.formatter.ts","../../src/formatter/index.ts","../../src/exporter/goodsExporter.ts","../../src/types/Product.types.ts"],"sourcesContent":["import { PassThrough } from \"stream\";\n\nexport interface CSVStreamOptions {\n delimiter?: string;\n emptyFieldValue?: string;\n lineSeparator?: string;\n}\n\nexport class CSVStream {\n private readonly stream: PassThrough = new PassThrough();\n private readonly delimiter: string = \";\";\n private readonly lineSeparator: string = \"\\n\";\n private readonly emptyFieldValue: string = \"\";\n private columns = new Set<string>();\n\n constructor({ delimiter, lineSeparator, emptyFieldValue }: CSVStreamOptions) {\n if (delimiter !== undefined) this.delimiter = delimiter;\n if (lineSeparator !== undefined) this.lineSeparator = lineSeparator;\n if (emptyFieldValue !== undefined) this.emptyFieldValue = emptyFieldValue;\n }\n\n getWritableStream() {\n return this.stream;\n }\n\n setColumns(columns: Set<string>) {\n this.columns = columns;\n this.stream.write(\n Array.from(this.columns).join(this.delimiter) + this.lineSeparator,\n );\n }\n\n addRow(items: Record<string, any>) {\n this.stream.write(\n Array.from(this.columns)\n .map((key) =>\n items[key] === undefined ? this.emptyFieldValue : items[key] + \"\",\n )\n .join(this.delimiter) + this.lineSeparator,\n );\n }\n}\n","import { type Brand, type Category, type Product } from \"../types\";\n\nimport { type Writable } from \"stream\";\n\nexport abstract class FormatterAbstract {\n public abstract formatterName: string;\n public abstract fileExtension: Extension;\n\n public abstract format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n option?: FormatterOptions,\n ): Promise<void>;\n}\n\nexport interface FormatterOptions {\n shopName?: string;\n\n companyName?: string;\n\n splitParams?: boolean;\n}\n\nexport enum Extension {\n CSV = \"csv\",\n YML = \"yml\",\n XLSX = \"xlsx\",\n JSON = \"json\",\n}\n","import { CSVStream } from \"../streams/CSVStream\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\nexport class CSVFormatter implements FormatterAbstract {\n public formatterName = \"CSV\";\n public fileExtension = Extension.CSV;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<void> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n\n const csvStream = new CSVStream({\n delimiter: \";\",\n emptyFieldValue: \"\",\n lineSeparator: \"\\n\",\n });\n csvStream.getWritableStream().pipe(writableStream);\n const columns = new Set<string>([\n \"url\",\n \"productId\",\n \"parentId\",\n \"variantId\",\n \"title\",\n \"description\",\n \"vendor\",\n \"vendorCode\",\n \"category\",\n \"images\",\n \"videos\",\n \"price\",\n \"oldPrice\",\n \"purchasePrice\",\n \"currency\",\n \"saleDate\",\n \"countryOfOrigin\",\n \"tags\",\n \"codesTN\",\n \"params\",\n \"properties\",\n \"sizes\",\n \"keywords\",\n \"relatedProducts\",\n ]);\n products.forEach((product) => {\n Object.entries(product).forEach(([key, value]) => {\n if (value) columns.add(key);\n });\n });\n csvStream.setColumns(columns);\n products.forEach((product) => {\n const row: Record<string, any> = {\n ...product,\n category: mappedCategories[product.categoryId],\n images: product.images?.join(\",\"),\n videos: product.videos?.join(\",\"),\n tags: product.tags?.join(\",\"),\n codesTN: product.codesTN?.join(\", \"),\n params: product.params\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n properties: product.properties\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n sizes: product.sizes\n ?.map(({ name, value }) => `${name}=${value}`)\n .join(\", \"),\n keywords: product.keywords?.join(\",\"),\n relatedProducts: product.relatedProducts?.join(\",\"),\n };\n csvStream.addRow(row);\n });\n\n // Закрываем поток\n csvStream.getWritableStream().end();\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\nconst { stream } = pkg;\n\nexport class ExcelFormatter implements FormatterAbstract {\n public formatterName = \"Excel\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<void> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n const columns = new Set<string>([\n \"url\",\n \"productId\",\n \"parentId\",\n \"variantId\",\n \"title\",\n \"description\",\n \"vendor\",\n \"vendorCode\",\n \"category\",\n \"images\",\n \"videos\",\n \"price\",\n \"oldPrice\",\n \"purchasePrice\",\n \"currency\",\n \"saleDate\",\n \"countryOfOrigin\",\n \"tags\",\n \"codesTN\",\n \"params\",\n \"properties\",\n \"sizes\",\n \"keywords\",\n \"relatedProducts\",\n ]);\n products.forEach((product) => {\n Object.entries(product).forEach(([key, value]) => {\n if (value) columns.add(key);\n });\n });\n\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: writableStream,\n });\n const worksheet = workbook.addWorksheet(\"products\");\n worksheet.columns = Array.from(columns).map((column) => ({\n key: column,\n header: column,\n }));\n\n products.forEach((product) => {\n const row = {\n ...product,\n category: mappedCategories[product.categoryId],\n images: product.images?.join(\",\"),\n videos: product.videos?.join(\",\"),\n tags: product.tags?.join(\",\"),\n keywords: product.keywords?.join(\",\"),\n relatedProducts: product.relatedProducts?.join(\",\"),\n codesTN: product.codesTN?.join(\", \"),\n params: product.params\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n properties: product.properties\n ?.map(({ key, value }) => `${key}=${value}`)\n .join(\", \"),\n sizes: product.sizes\n ?.map(({ name, value }) => `${name}=${value}`)\n .join(\", \"),\n };\n worksheet.addRow(row).commit();\n });\n worksheet.commit();\n await workbook.commit();\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\nconst { stream } = pkg;\n\nexport class InsalesFormatter implements FormatterAbstract {\n public formatterName = \"Insales\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<void> {\n const mappedCategories: Record<number, Category> = {};\n categories?.forEach(\n (category) => (mappedCategories[category.id] = category),\n );\n\n const getParams = (product: Product): Record<string, string> => {\n const properties: Record<string, string> = {};\n\n product.params?.forEach(\n (p) => (properties[`Свойство: ${p.key}`] = p.value),\n );\n\n return properties;\n };\n const getProperties = (product: Product): Record<string, string> => {\n const properties: Record<string, string> = {};\n\n product.properties?.forEach(\n (p) => (properties[`Параметр: ${p.key}`] = p.value),\n );\n\n return properties;\n };\n\n const getCategories = (product: Product) => {\n const categories: Record<string, string> = {};\n const categoryList = new Array<string>();\n\n function addCategory(categoryId: number | undefined) {\n if (categoryId === undefined) return;\n\n const category = mappedCategories[categoryId];\n if (category) {\n categoryList.push(category.name);\n addCategory(category.parentId);\n }\n }\n\n addCategory(product.categoryId);\n\n categoryList.forEach((name, i) => {\n const index = categoryList.length - 1 - i;\n const key = index === 0 ? \"Корневая\" : `Подкатегория ${index}`;\n categories[key] = name;\n });\n\n return categories;\n };\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: writableStream,\n });\n const worksheet = workbook.addWorksheet(\"products\");\n const columns = new Set<string>([\n \"Внешний ID\",\n \"Ссылка на товар\",\n \"Артикул\",\n \"Корневая\",\n \"Подкатегория 1\",\n \"Подкатегория 2\",\n \"Название товара или услуги\",\n \"Старая цена\",\n \"Цена продажи\",\n \"Cебестоимость\",\n \"Категории\",\n \"Остаток\",\n \"Штрих-код\",\n \"Краткое описание\",\n \"Полное описание\",\n \"Габариты варианта\",\n \"Вес\",\n \"Размещение на сайте\",\n \"НДС\",\n \"Валюта склада\",\n \"Изображения варианта\",\n \"Изображения\",\n \"Ссылка на видео\",\n \"Параметры\",\n \"Свойства\",\n \"Параметр: Бренд\",\n \"Параметр: Коллекция\",\n \"Параметр: Пол\",\n \"Параметр: Дата выхода\",\n \"Размерная сетка\",\n \"Связанные товары\",\n \"Ключевые слова\",\n ]);\n products.forEach((product) => {\n Object.keys({\n ...getParams(product),\n ...getProperties(product),\n }).forEach((key) => {\n columns.add(key);\n });\n });\n worksheet.columns = Array.from(columns).map((column) => ({\n header: column,\n key: column,\n }));\n products.forEach((product) => {\n const row = {\n \"Внешний ID\": product.productId,\n \"Ссылка на товар\": product.url,\n Артикул: product.vendorCode,\n \"Название товара или услуги\": product.title,\n \"Старая цена\": product.oldPrice,\n \"Цена продажи\": product.price,\n Cебестоимость: product.purchasePrice,\n ...getCategories(product),\n Остаток: product.count,\n \"Штрих-код\": product.barcode,\n \"Краткое описание\": undefined,\n \"Полное описание\": product.description,\n \"Габариты варианта\": product.dimensions,\n Вес: product.weight,\n \"Размещение на сайте\": product.available,\n НДС: product.vat.toString(),\n \"Валюта склада\": product.currency.toString(),\n \"Изображения варианта\":\n product.parentId === undefined\n ? product.images?.join(\" \")\n : undefined,\n Изображения:\n product.parentId === undefined\n ? undefined\n : product.images?.join(\" \"),\n \"Ссылка на видео\": product.videos ? product.videos[0] : undefined,\n ...getParams(product),\n ...getProperties(product),\n \"Параметр: Бренд\": product.vendor,\n \"Параметр: Коллекция\": product.seriesName,\n \"Параметр: Пол\": product.gender,\n \"Параметр: Дата выхода\": product.saleDate,\n \"Размерная сетка\": JSON.stringify(product.sizes),\n \"Связанные товары\": product.relatedProducts?.join(\",\"),\n \"Ключевые слова\": product.keywords?.join(\",\"),\n };\n worksheet.addRow(row).commit();\n });\n worksheet.commit();\n await workbook.commit();\n }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\nexport class JSONFormatter implements FormatterAbstract {\n public formatterName = \"JSON\";\n public fileExtension = Extension.JSON;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n _?: FormatterOptions,\n ): Promise<void> {\n const stream = new JsonStreamStringify({\n categories,\n brands,\n products,\n });\n stream.pipe(writableStream);\n }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\ninterface SimpleProduct extends Product {\n children: Product[];\n}\n\nexport class SimpleJSONFormatter implements FormatterAbstract {\n public formatterName = \"JSON\";\n public fileExtension = Extension.JSON;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n _?: FormatterOptions,\n ): Promise<void> {\n const groupedProduct = new Map<number, SimpleProduct>();\n products.forEach((product) => {\n if (product.parentId !== undefined) return;\n groupedProduct.set(product.variantId, {\n ...product,\n children: [],\n });\n });\n products.forEach((product) => {\n if (product.parentId === undefined) return;\n const parent = groupedProduct.get(product.parentId);\n if (!parent) return;\n parent.children.push(product);\n });\n const stream = new JsonStreamStringify({\n categories,\n brands,\n products: Array.from(groupedProduct.values()),\n });\n stream.pipe(writableStream);\n }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type IParam, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\nconst { stream } = pkg;\n\nexport class TgShopFormatter implements FormatterAbstract {\n public formatterName = \"TgShop\";\n public fileExtension = Extension.XLSX;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<void> {\n const getParameter = (product: Product, key: string): IParam | undefined =>\n product.params?.find((value) => value.key === key);\n\n const convertProduct = (product: Product) => ({\n \"category id\": product.categoryId,\n \"group id\": product.parentId,\n \"id product\": product.variantId,\n \"name product\": product.title,\n price: product.price,\n picture: product.images?.join(\", \"),\n vendorCode: product.vendorCode,\n oldprice: product.oldPrice,\n description: product.description,\n shortDescription: \"\",\n quantityInStock: product.count,\n color: getParameter(product, \"color\")?.value,\n size: getParameter(product, \"size\")?.value,\n priority: undefined,\n });\n const workbook = new stream.xlsx.WorkbookWriter({\n stream: writableStream,\n });\n const categoryWorksheet = workbook.addWorksheet(\"categories\");\n const productsWorksheet = workbook.addWorksheet(\"offers\");\n categoryWorksheet.columns = [\n {\n header: \"id\",\n key: \"id\",\n },\n {\n header: \"parentId\",\n key: \"parentId\",\n },\n {\n header: \"name\",\n key: \"name\",\n },\n ];\n const columns = [\n \"category id\",\n \"group id\",\n \"id product\",\n \"name product\",\n \"price\",\n \"picture\",\n \"vendorCode\",\n \"oldprice\",\n \"description\",\n \"shortDescription\",\n \"quantityInStock\",\n \"color\",\n \"size\",\n \"priority\",\n ];\n\n productsWorksheet.columns = columns.map((column) => ({\n header: column,\n key: column,\n }));\n\n categories?.forEach((category) => {\n categoryWorksheet.addRow(category).commit();\n });\n\n products.forEach((product) => {\n productsWorksheet.addRow(convertProduct(product)).commit();\n });\n categoryWorksheet.commit();\n productsWorksheet.commit();\n\n await workbook.commit();\n }\n}\n","import { CSVStream } from \"../streams/CSVStream\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\nexport class TildaFormatter implements FormatterAbstract {\n public formatterName = \"Tilda\";\n public fileExtension = Extension.CSV;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n _?: Brand[],\n __?: FormatterOptions,\n ): Promise<void> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n\n const csvStream = new CSVStream({\n delimiter: \";\",\n emptyFieldValue: \"\",\n lineSeparator: \"\\n\",\n });\n csvStream.getWritableStream().pipe(writableStream);\n const columns = new Set<string>([\n \"SKU\",\n \"Brand\",\n \"Category\",\n \"Title\",\n \"Text\",\n \"Photo\",\n \"Price\",\n \"Price Old\",\n \"Quantity\",\n \"Editions\",\n \"External ID\",\n \"Parent UID\",\n ]);\n csvStream.setColumns(columns);\n products.forEach((product) => {\n const row: Record<string, string | number | undefined> = {\n SKU: product.vendorCode,\n Brand: product.vendor,\n Category: mappedCategories[product.categoryId],\n Title: product.title,\n Text: product.description,\n Photo: product.images?.join(\";\"),\n Price: product.price,\n \"Price Old\": product.oldPrice,\n Quantity: product.count,\n Editions: product.params\n ?.map(({ key, value }) => `${key}:${value}`)\n .join(\";\"),\n \"External ID\": product.variantId,\n \"Parent UID\": product.parentId,\n };\n csvStream.addRow(row);\n });\n\n csvStream.getWritableStream().end();\n }\n}\n","import { XMLBuilder } from \"fast-xml-parser\";\n\nimport { type Product, type Category, type Brand } from \"../types\";\nimport {\n Extension,\n type FormatterAbstract,\n type FormatterOptions,\n} from \"./formater.types\";\n\nimport { PassThrough, type Writable } from \"stream\";\n\nexport class YMLFormatter implements FormatterAbstract {\n public formatterName = \"YMl\";\n public fileExtension = Extension.YML;\n\n public async format(\n writableStream: Writable,\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n options?: FormatterOptions,\n ): Promise<void> {\n const result = new PassThrough();\n result.pipe(writableStream);\n\n const builder = new XMLBuilder({\n ignoreAttributes: false,\n cdataPropName: \"__cdata\",\n format: true,\n indentBy: \" \",\n });\n\n const date = new Date().toISOString().replace(/.\\d+Z/, \"\");\n\n // Начинаем формирование XML\n result.write('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n');\n result.write('<yml_catalog date=\"' + date + '\">\\n');\n\n // Открываем тег <shop>\n result.write(\"<shop>\\n\");\n\n // Добавляем информацию о магазине\n if (options?.shopName) {\n result.write(builder.build({ name: options.shopName }));\n result.write(\"\\n\");\n }\n if (options?.companyName) {\n result.write(builder.build({ company: options.companyName }));\n result.write(\"\\n\");\n }\n\n // Добавляем категории и бренды\n if (categories) {\n result.write(\n builder.build({\n // tagname: \"categories\",\n categories: { category: this.getCategories(categories) },\n }),\n );\n result.write(\"\\n\");\n }\n if (brands) {\n result.write(\n builder.build({ brands: { brand: this.getBrands(brands) } }),\n );\n result.write(\"\\n\");\n }\n\n // Открываем секцию <offers>\n result.write(\"<offers>\\n\");\n\n // Создаем поток для обработки offer элементов\n const offerStream = new PassThrough();\n\n // Пайпим поток offer элементов в основной итоговый поток\n offerStream.pipe(result, { end: false });\n\n // Записываем каждый продукт в поток\n products.forEach((product) => {\n const offer = builder.build({ offer: this.getOffer(product) });\n offerStream.write(offer + \"\\n\");\n });\n\n // Завершаем поток offer\n offerStream.end();\n\n offerStream.on(\"end\", () => {\n // Закрываем секцию <offers>\n result.write(\"</offers>\\n\");\n\n // Закрываем тег <shop>\n result.write(\"</shop>\\n\");\n\n // Закрываем тег <yml_catalog>\n result.write(\"</yml_catalog>\\n\");\n\n // Завершаем итоговый поток\n result.end();\n });\n }\n\n private getBrands(brands?: Brand[]) {\n if (!brands) return [];\n\n return brands.map((brand) => ({\n \"@_id\": brand.id,\n \"@_url\": brand.coverURL ?? \"\",\n \"#text\": brand.name,\n }));\n }\n\n private getCategories(categories?: Category[]) {\n if (!categories) return [];\n\n return categories.map((cat) => ({\n \"@_id\": cat.id,\n \"@_parentId\": cat.parentId ?? \"\",\n \"#text\": cat.name,\n }));\n }\n\n private getOffer(product: Product): any {\n const result = {\n \"@_id\": product.variantId,\n name: product.title,\n price: product.price,\n oldprice: product.oldPrice,\n purchase_price: product.purchasePrice,\n additional_expenses: product.additionalExpenses,\n cofinance_price: product.cofinancePrice,\n currencyId: product.currency,\n categoryId: product.categoryId,\n vendorId: product.vendorId,\n vendor: product.vendor,\n vendorCode: product.vendorCode,\n picture: product.images,\n video: product.videos,\n available: product.available,\n series: product.seriesName,\n \"min-quantity\": product.minQuantity,\n \"step-quantity\": product.stepQuantity,\n size: product.sizes?.map((size) => ({\n \"#text\": size.value,\n \"@_name\": size.name,\n \"@_delimiter\": size.delimiter,\n })),\n keyword: product.keywords,\n saleDate: product.saleDate,\n property: product.properties?.map((property) => ({\n \"#text\": property.value,\n \"@_name\": property.key,\n })),\n param: product.params?.map((param) => ({\n \"#text\": param.value,\n \"@_name\": param.key,\n })),\n description: {\n __cdata: product.description,\n },\n country_of_origin: product.countryOfOrigin,\n barcode: product.barcode,\n vat: product.vat,\n count: product.count,\n \"set-ids\": product.tags?.join(\", \"),\n adult: product.adult,\n downloadable: product.downloadable,\n \"period-of-validity-days\": product.validityPeriod,\n \"comment-validity-days\": product.validityComment,\n \"service-life-days\": product.serviceLifePeriod,\n \"comment-life-days\": product.serviceLifeComment,\n \"warranty-days\": product.warrantyPeriod,\n \"comment-warranty\": product.warrantyComment,\n manufacturer_warranty: product.manufacturerWarranty,\n certificate: product.certificate,\n url: product.url,\n weight: product.weight,\n dimensions: product.dimensions,\n boxCount: product.boxCount,\n disabled: product.disabled,\n age: product.age != null && {\n \"@_unit\": product.age.unit,\n \"#text\": product.age.value,\n },\n \"tn-ved-codes\": product.codesTN?.length != null && {\n \"tn-ved-code\": product.codesTN,\n },\n relatedProduct: product.relatedProducts,\n gender: product.gender,\n };\n if (product.parentId !== undefined) {\n return {\n ...result,\n \"@_group_id\": product.parentId,\n };\n }\n return result;\n }\n}\n","import { CSVFormatter } from \"./CSV.formatter\";\nimport { ExcelFormatter } from \"./Excel.formatter\";\nimport { InsalesFormatter } from \"./Insales.formatter\";\nimport { JSONFormatter } from \"./JSON.formatter\";\nimport { SimpleJSONFormatter } from \"./SimpleJSON.formatter\";\nimport { TgShopFormatter } from \"./TgShop.formatter\";\nimport { TildaFormatter } from \"./Tilda.formatter\";\nimport { YMLFormatter } from \"./YML.formatter\";\n\nexport * from \"./formater.types\";\n\nexport const Formatters = {\n TildaFormatter,\n CSVFormatter,\n InsalesFormatter,\n YMLFormatter,\n TgShopFormatter,\n ExcelFormatter,\n JSONFormatter,\n SimpleJSONFormatter,\n};\n","import {\n type FormatterAbstract,\n type FormatterOptions,\n Formatters,\n} from \"../formatter\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport { type Exporter, type Transformer } from \"./exporter.types\";\n\nimport fs from \"fs\";\n\nexport class GoodsExporter {\n private formatter: FormatterAbstract = new Formatters.YMLFormatter();\n private exporter: Exporter = () => {\n return fs.createWriteStream(\n `${this.formatter.formatterName}.output.${this.formatter.fileExtension}`,\n );\n };\n\n private transformers = new Array<Transformer>();\n\n public setTransformers(transformers: Transformer[]): void {\n this.transformers = transformers;\n }\n\n public setFormatter(formatter: FormatterAbstract): void {\n this.formatter = formatter;\n }\n\n public setExporter(exporter: Exporter): void {\n this.exporter = exporter;\n }\n\n async export(\n products: Product[],\n categories?: Category[],\n brands?: Brand[],\n option?: FormatterOptions,\n ): Promise<void> {\n let transformedProducts: Product[] = products;\n\n for (const transformer of this.transformers)\n transformedProducts = await transformer(transformedProducts);\n\n const writableStream = this.exporter();\n\n await this.formatter.format(\n writableStream,\n transformedProducts,\n categories,\n brands,\n option,\n );\n }\n}\n","export interface Product {\n /**\n * **ID товара**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n productId: number;\n /**\n * **Родительскй SKU**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n parentId?: number;\n /**\n * **SKU**\n *\n * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n *\n * Пример: belaya-kofta-12345\n */\n variantId: number;\n /**\n * **Название**\n *\n * Составляйте название по схеме: тип + бренд или производитель + модель + особенности, если есть (например, цвет, размер или вес) и количество в упаковке.\n *\n * Не включайте в название условия продажи (например, «скидка», «бесплатная доставка» и т. д.), эмоциональные характеристики («хит», «супер» и т. д.). Не пишите слова большими буквами — кроме устоявшихся названий брендов и моделей.\n *\n * Оптимальная длина — 50–60 символов, максимальная — 150.\n *\n * Составлять хорошие названия помогут [рекомендации](https://yandex.ru/support/marketplace/assortment/fields/title.html).\n *\n * Пример: Ударная дрель Makita HP1630, 710 Вт\n */\n title: string;\n /**\n * **Описание**\n *\n * Подробное описание товара: например, его преимущества и особенности.\n *\n * Не давайте в описании инструкций по установке и сборке. Не используйте слова «скидка», «распродажа», «дешевый», «подарок» (кроме подарочных категорий), «бесплатно», «акция», «специальная цена», «новинка», «new», «аналог», «заказ», «хит». Не указывайте никакой контактной информации и не давайте ссылок.\n *\n * Можно использовать теги:\n *\n ** <h>, <h1>, <h2> и так далее — для заголовков;\n ** <br> и <p> — для переноса строки;\n ** <ol> — для нумерованного списка;\n ** <ul> — для маркированного списка;\n ** <li> — для создания элементов списка (должен находиться внутри <ol> или <ul>);\n ** <div> — поддерживается, но не влияет на отображение текста.\n * Оптимальная длина — 400–600 символов, максимальная — 6000.\n *\n * Составить хорошее описание помогут рекомендации.\n *\n * Пример: В комплекте с детским микроскопом есть все, что нужно вашему ребенку для изучения микромира\n */\n description: string;\n /**\n * **Бренд**\n *\n * Название бренда или производителя.\n *\n * Записывайте название так, как его пишет сам бренд.\n *\n * Пример: LEVENHUK\n */\n vendor?: string;\n /**\n * **Артикул производителя**\n *\n * Код товара, который ему присвоил производитель.\n *\n * Если артикулов несколько, укажите их через запятую.\n *\n * Пример: VNDR-0005A, VNDR-0005B\n */\n vendorCode?: string;\n /**\n * **Дата выхода**\n *\n * Пример: 01.01.2000\n */\n saleDate?: string;\n /**\n * **Вендор в магазине**\n *\n * Содержит номер вендора, а не ее название.\n */\n vendorId?: number;\n /**\n * **Категория в магазине**\n *\n * Категория, к которой вы относите товар. Она помогает точнее определить для товара категорию на Маркете.\n *\n * Указывайте конкретные категории — например, набор ножей лучше отнести к категории Столовые приборы, а не просто Посуда.\n *\n * Выбирайте категории, которые описывают товар, а не абстрактный признак — например, лучше указать Духи, а не Подарки.\n *\n * Содержит номер категории, а не ее название.\n */\n categoryId: number;\n /**\n * **Страна производства**\n *\n * Страна, где был произведен товар.\n *\n * Записывайте названия стран так, как они записаны в [списке](https://yastatic.net/s3/doc-binary/src/support/market/ru/countries.xlsx).\n *\n * Пример: Россия\n */\n countryOfOrigin?: string;\n /**\n * **Изображение**\n *\n * До двадцати изображений, которые показываются на карточке товара.\n *\n * Принимаются jpg- или png-изображения товара, соответствующие [требованиям](https://yandex.ru/support/marketplace/assortment/fields/images.html).\n *\n * В кабинете изображения добавляются в виде файлов. В Excel-файле — в виде ссылок через запятую. Первое фото становится основным.\n *\n * Чтобы изменить изображение, выложите новое по новой ссылке, иначе картинка не обновится.\n */\n images?: string[];\n /**\n * **Видео**\n *\n * Видеоиллюстрации для карточки товара.\n *\n * Видео должно соответствовать [требованиям](https://yandex.ru/support/marketplace/assortment/fields/video.html).\n *\n * Можно добавить не больше 6 видео.\n *\n * В кабинете можно загрузить видеофайлы. В Excel-шаблоне укажите ссылки на файлы.\n */\n videos?: string[];\n /**\n * **Базовая цена**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 240\n */\n price: number;\n /**\n * **Цена до скидки**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Вы можете указать цену со скидкой от 5 до 75 %.\n *\n * Пример:\n *\n * 250\n */\n oldPrice?: number;\n /**\n * **Себестоимость**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 200\n */\n purchasePrice?: number;\n /**\n * **Дополнительные расходы**\n *\n * Дополнительные расходы на товар. Например, на доставку или упаковку.\n *\n * После заполнения этого поля в калькуляторе и на странице управления ценами рассчитается потенциальная маржинальность товара.\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 75\n */\n additionalExpenses?: number;\n /**\n * **Порог для скидок с Маркетом**\n *\n * Цена указывается в рублях. Число должно быть целым.\n *\n * Пример:\n *\n * 300\n */\n cofinancePrice?: number;\n /**\n * **Валюта (DBS)**\n *\n * Валюта, в которой указана цена товара. Покупателям Маркет показывает цену в рублях, пересчитывая ее по курсу Центробанка.\n *\n * Поле используется, если для кабинета еще не включена работа с базовыми ценами.\n *\n * Поддерживаются российские и белорусские рубли, евро, доллары, украинские гривны и казахстанские тенге.\n *\n * В кабинете валюту можно просто выбрать из списка. В Excel-файле указывается код валюты: RUR, BYN, EUR, USD, UAN, KZT.\n */\n currency: Currency;\n /**\n * **Ссылка на страницу товара**\n *\n * Адрес страницы на вашем сайте с фотографиями и описанием товара.\n *\n * Максимальная длина URL — 512 символов. Записывайте его согласно стандарту RFC 3986.\n *\n * Пример: http://best.seller.ru/product_page.asp?pid=12346\n */\n url?: string;\n /**\n * **Убрать из продажи**\n *\n * Поле позволяет приостановить продажу товара.\n *\n * Укажите значение true, если нужно приостановить продажу.\n */\n disabled?: boolean;\n /**\n * **Доступное количество товара**\n *\n * Общее количество товара, доступное для продажи\n *\n * Укажите 0, если товара нет в наличии.\n *\n * Пример: 7\n */\n count?: number;\n /**\n * **Товар в наличии (DBS)**\n *\n * Поле указывает, есть ли товар в наличии.\n */\n available?: boolean;\n /**\n * **Минимальное количество товара**\n *\n * Если значение задано, покупатель не сможет заказать меньше единиц товара. Ограничение не работает, когда товара на складе осталось меньше этого количества — тогда покупатель сможет сделать заказ на остаток.\n *\n * Целое число.\n */\n minQuantity?: number;\n /**\n * **Квант продажи**\n *\n * Если значение задано, покупатель сможет добавить к заказу только кратное количество товара. Ограничение не работает, когда на складе осталось меньше этого количества — тогда покупатель сможет сделать заказ на остаток.\n *\n * Целое число.\n */\n stepQuantity?: number;\n /**\n * **Штрихкод**\n *\n * Указывайте в виде последовательности символов. Подойдут коды EAN-13, EAN-8, UPC-A, UPC-E или Code 128.\n *\n * Для книг указывайте ISBN.\n *\n * Для товаров [определенных категорий и торговых марок](https://yastatic.net/s3/doc-binary/src/support/market/ru/yandex-market-list-for-gtin.xlsx) штрихкод должен быть действительным кодом GTIN. Обратите внимание: внутренние штрихкоды, начинающиеся на 2 или 02, и коды формата Code 128 не являются GTIN.\n *\n * Если штрихкодов несколько, напишите все через запятую.\n *\n * Пример: 46012300000000\n */\n barcode?: string;\n /**\n * **Код ТН ВЭД**\n *\n * Для некоторых категорий товаров код ТН ВЭД обязателен. Если это касается ваших товаров, вы получите уведомление в каталоге.\n *\n * 10 или 14 цифр без пробелов.\n *\n * Пример: 8517610008\n */\n codesTN?: string[];\n /**\n * **С какого возраста пользоваться**\n *\n * Если товар не предназначен для детей младше определенного возраста, укажите это.\n *\n * Возрастные ограничения можно задавать в годах (с нуля, с 6, 12, 16 или 18) или в месяцах (любое число от 0 до 12).\n */\n age?: { unit: \"year\" | \"month\"; value: number };\n /**\n * **Вес с упаковкой**\n *\n * Вес товара с упаковкой.\n *\n * Единица измерения — килограммы. Можно дроби: разделитель — точка или запятая, не больше трех цифр после него.\n *\n * Пример: 3.1\n */\n weight?: number;\n /**\n * **Габариты с упаковкой**\n *\n * Длина, ширина, высота в упаковке.\n *\n * Единица измерения — сантиметры. Можно дроби: разделитель — точка или запятая, не больше трех цифр после него.\n *\n * Пример: 20.1/20.551/22.5\n */\n dimensions?: string;\n /**\n * **Товар занимает больше одного места**\n *\n * Если товар занимает одно место (представляет собой одну коробку, упаковку и так далее), оставьте поле пустым. Если товар занимает несколько мест — укажите их количество. Например, кондиционер занимает два места — внешний и внутренний блоки в двух коробках.\n *\n * Укажите количество мест.\n *\n * Пример: 2\n */\n boxCount?: number;\n /**\n * **Ставка НДС**\n *\n * Значение ставки НДС для товара.\n *\n * Выберите одно из значений:\n *\n ** НДС не облагается — 6 или NO_VAT\n *\n ** 0 % — 5 или VAT_0\n *\n ** 10 % — 2 или VAT_10\n *\n ** 20 % — 7 или VAT_20\n *\n * Если не заполнено, Маркет устанавливает ставку, соответствующую схеме налогообложения.\n *\n * Пример: VAT_20\n */\n vat: Vat;\n /**\n * **Характеристики, которые есть только у товаров конкретной категории**\n *\n * Кроме общих свойств, у товара есть характеристики, присущие конкретной категории, к которой он относится. Например, у велосипеда есть размер рамы, а детское пюре бывает овощное, мясное или фруктовое.\n */\n params?: IParam[];\n /**\n * **Свойства товара**\n *\n * *не YML поле\n */\n properties?: IParam[];\n /**\n * **Теги**\n *\n * Придумайте любое название — его можно будет изменить после.\n *\n * Максимальная длина тега — 20 символов.\n *\n * У одного товара — максимум 10 тегов.\n *\n * Всего можно создать не больше 50 разных тегов.\n *\n * Пример: apple, до 500 рублей\n */\n tags?: string[];\n /**\n * **Товар для взрослых**\n *\n * Параметр включает для товара пометку 18+. Устанавливайте ее только для товаров, которые относятся к удовлетворению сексуальных потребностей.\n */\n adult?: boolean;\n /**\n * **Цифровой товар**\n *\n * Параметр, устанавливаемый для цифровых товаров, которые просто скачиваются.\n */\n downloadable?: boolean;\n /**\n * **Срок годности**\n *\n * Период с момента изготовления, по прошествии которого товар становится непригоден.\n *\n * Указывайте срок, указанный на банке или упаковке. Текущая дата, дата поставки или дата отгрузки значения не имеет.\n *\n * Срок можно указывать в годах, месяцах, днях, неделях и часах.\n *\n * Обязательно указывайте срок, если он есть.\n *\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y6M — 1 год и 6 месяцев;\n ** P15D — 15 дней.\n */\n validityPeriod?: string;\n /**\n * **Комментарий к сроку годности**\n *\n * Поле предназначено для описаний условий хранения.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Хранить в сухом помещении\n */\n validityComment?: string;\n /**\n * **Срок службы**\n *\n * В течение срока службы товар должен исправно выполнять свою функцию.\n *\n * Обязательно указывайте срок, если он есть.\n *\n * Срок можно указывать в годах, месяцах и днях.\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y2M — 1 год и 2 месяца;\n ** P15D — 15 дней;\n ** P2Y10D — 2 года, 10 дней;\n ** P2Y6M10D — 2 года, 6 месяцев и 10 дней.\n */\n serviceLifePeriod?: string;\n /**\n * **Комментарий к сроку службы**\n *\n * Поле предназначено для описаний условий использования.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Использовать при температуре не ниже −10 градусов\n */\n serviceLifeComment?: string;\n /**\n * **Гарантийный срок**\n *\n * В течение какого времени можно бесплатно заменить или починить товар.\n *\n * Срок можно указывать в годах, месяцах или днях.\n *\n * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\n *\n ** P1Y — 1 год;\n ** P1Y2M — 1 год и 2 месяца;\n ** P15D — 15 дней;\n ** P2Y10D — 2 года, 10 дней;\n ** P2Y6M10D — 2 года, 6 месяцев и 10 дней.\n */\n warrantyPeriod?: string;\n /**\n * **Комментарий к гарантийному сроку**\n *\n * Поле предназначено для описания особенностей гарантийных условий.\n *\n * Указывайте только то, что относится к гарантии изготовителя.\n *\n * Не длиннее 250 знаков и без спецсимволов.\n *\n * Пример: Гарантия на аккумулятор — 6 месяцев\n */\n warrantyComment?: string;\n /**\n * **Официальная гарантия производителя**\n */\n manufacturerWarranty?: boolean;\n /**\n * **Номер документа**\n *\n * Номер документа на товар: сертификата, декларации соответствия и т. п.\n *\n * Прежде чем указывать номер документа, загрузите скан документа через кабинет.\n *\n * Укажите номер документа.\n *\n * Пример: 6241421\n */\n certificate?: string;\n /**\n * **Ключевые слова**\n *\n * Пример: Кроссовки, высокая подошва\n */\n keywords?: string[];\n /**\n * **Размерная сетка**\n */\n sizes?: ISize[];\n /**\n * **Связанные товары**\n *\n * Указываются id товаров\n *\n * Пример: 1234\n */\n relatedProducts?: number[];\n /**\n * **Название коллекции, ряда или серии товара**\n *\n * Пример: Jordan 4\n */\n seriesName?: string;\n /**\n * **Пол или название группы потребителей**\n *\n * Пример: Дети, Женское, Унисекс\n */\n gender?: string;\n}\n\nexport enum Vat {\n NO_VAT = \"NO_VAT\",\n VAT_0 = \"VAT_0\",\n VAT_10 = \"VAT_10\",\n VAT_20 = \"VAT_20\",\n}\n\nexport enum Currency {\n RUR = \"RUR\",\n BYN = \"BYN\",\n EUR = \"EUR\",\n USD = \"USD\",\n UAN = \"UAN\",\n KZT = \"KZT\",\n}\n\nexport interface IParam {\n /**\n * **Название характеристики**\n */\n key: string;\n /**\n * **Значение**\n */\n value: string;\n}\n\nexport interface ISize {\n /**\n * **Название единицы измерения**\n */\n name: string;\n /**\n * **Разделитель**\n */\n delimiter: string;\n /**\n * **Значения размерного ряда**\n *\n * Размеры указываются через разделитель\n */\n value: string;\n}\n"],"names":["__publicField","Extension","stream","categories","Vat","Currency"],"mappings":";;;;;;;;;AAQO,MAAM,SAAU,CAAA;AAAA,EAOrB,WAAY,CAAA,EAAE,SAAW,EAAA,aAAA,EAAe,iBAAqC,EAAA;AAN7E,IAAiBA,eAAA,CAAA,IAAA,EAAA,QAAA,EAAsB,IAAI,WAAY,EAAA,CAAA,CAAA;AACvD,IAAAA,eAAA,CAAA,IAAA,EAAiB,WAAoB,EAAA,GAAA,CAAA,CAAA;AACrC,IAAAA,eAAA,CAAA,IAAA,EAAiB,eAAwB,EAAA,IAAA,CAAA,CAAA;AACzC,IAAAA,eAAA,CAAA,IAAA,EAAiB,iBAA0B,EAAA,EAAA,CAAA,CAAA;AAC3C,IAAQA,eAAA,CAAA,IAAA,EAAA,SAAA,sBAAc,GAAY,EAAA,CAAA,CAAA;AAGhC,IAAI,IAAA,SAAA,KAAc,KAAW,CAAA,EAAA,IAAA,CAAK,SAAY,GAAA,SAAA,CAAA;AAC9C,IAAI,IAAA,aAAA,KAAkB,KAAW,CAAA,EAAA,IAAA,CAAK,aAAgB,GAAA,aAAA,CAAA;AACtD,IAAI,IAAA,eAAA,KAAoB,KAAW,CAAA,EAAA,IAAA,CAAK,eAAkB,GAAA,eAAA,CAAA;AAAA,GAC5D;AAAA,EAEA,iBAAoB,GAAA;AAClB,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GACd;AAAA,EAEA,WAAW,OAAsB,EAAA;AAC/B,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA,CAAA;AACf,IAAA,IAAA,CAAK,MAAO,CAAA,KAAA;AAAA,MACV,KAAA,CAAM,KAAK,IAAK,CAAA,OAAO,EAAE,IAAK,CAAA,IAAA,CAAK,SAAS,CAAA,GAAI,IAAK,CAAA,aAAA;AAAA,KACvD,CAAA;AAAA,GACF;AAAA,EAEA,OAAO,KAA4B,EAAA;AACjC,IAAA,IAAA,CAAK,MAAO,CAAA,KAAA;AAAA,MACV,KAAM,CAAA,IAAA,CAAK,IAAK,CAAA,OAAO,CACpB,CAAA,GAAA;AAAA,QAAI,CAAC,GACJ,KAAA,KAAA,CAAM,GAAG,CAAA,KAAM,SAAY,IAAK,CAAA,eAAA,GAAkB,KAAM,CAAA,GAAG,CAAI,GAAA,EAAA;AAAA,OAEhE,CAAA,IAAA,CAAK,IAAK,CAAA,SAAS,IAAI,IAAK,CAAA,aAAA;AAAA,KACjC,CAAA;AAAA,GACF;AACF;;ACrCO,MAAe,iBAAkB,CAAA;AAWxC,CAAA;AAUY,IAAA,SAAA,qBAAAC,UAAL,KAAA;AACL,EAAAA,WAAA,KAAM,CAAA,GAAA,KAAA,CAAA;AACN,EAAAA,WAAA,KAAM,CAAA,GAAA,KAAA,CAAA;AACN,EAAAA,WAAA,MAAO,CAAA,GAAA,MAAA,CAAA;AACP,EAAAA,WAAA,MAAO,CAAA,GAAA,MAAA,CAAA;AAJG,EAAAA,OAAAA,UAAAA,CAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;;;;;ACfL,MAAM,YAA0C,CAAA;AAAA,EAAhD,WAAA,GAAA;AACL,IAAAD,eAAA,CAAA,IAAA,EAAO,eAAgB,EAAA,KAAA,CAAA,CAAA;AACvB,IAAAA,eAAA,CAAA,IAAA,EAAO,iBAAgB,SAAU,CAAA,GAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAEjC,MAAa,MACX,CAAA,cAAA,EACA,QACA,EAAA,UAAA,EACA,GACA,EACe,EAAA;AACf,IAAA,MAAM,mBAA2C,EAAC,CAAA;AAClD,IAAY,UAAA,EAAA,OAAA,CAAQ,CAAC,EAAE,EAAA,EAAI,MAAY,KAAA,gBAAA,CAAiB,EAAE,CAAA,GAAI,IAAK,CAAA,CAAA;AAEnE,IAAM,MAAA,SAAA,GAAY,IAAI,SAAU,CAAA;AAAA,MAC9B,SAAW,EAAA,GAAA;AAAA,MACX,eAAiB,EAAA,EAAA;AAAA,MACjB,aAAe,EAAA,IAAA;AAAA,KAChB,CAAA,CAAA;AACD,IAAU,SAAA,CAAA,iBAAA,EAAoB,CAAA,IAAA,CAAK,cAAc,CAAA,CAAA;AACjD,IAAM,MAAA,OAAA,uBAAc,GAAY,CAAA;AAAA,MAC9B,KAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA;AAAA,KACD,CAAA,CAAA;AACD,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC5B,MAAO,MAAA,CAAA,OAAA,CAAQ,OAAO,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AAChD,QAAI,IAAA,KAAA,EAAe,OAAA,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AAAA,OAC3B,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AACD,IAAA,SAAA,CAAU,WAAW,OAAO,CAAA,CAAA;AAC5B,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC5B,MAAA,MAAM,GAA2B,GAAA;AAAA,QAC/B,GAAG,OAAA;AAAA,QACH,QAAA,EAAU,gBAAiB,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,QAC7C,MAAQ,EAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QAChC,MAAQ,EAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QAChC,IAAM,EAAA,OAAA,CAAQ,IAAM,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QAC5B,OAAS,EAAA,OAAA,CAAQ,OAAS,EAAA,IAAA,CAAK,IAAI,CAAA;AAAA,QACnC,QAAQ,OAAQ,CAAA,MAAA,EACZ,GAAI,CAAA,CAAC,EAAE,GAAK,EAAA,KAAA,EAAY,KAAA,CAAA,EAAG,GAAG,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAC1C,KAAK,IAAI,CAAA;AAAA,QACZ,YAAY,OAAQ,CAAA,UAAA,EAChB,GAAI,CAAA,CAAC,EAAE,GAAK,EAAA,KAAA,EAAY,KAAA,CAAA,EAAG,GAAG,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAC1C,KAAK,IAAI,CAAA;AAAA,QACZ,OAAO,OAAQ,CAAA,KAAA,EACX,GAAI,CAAA,CAAC,EAAE,IAAM,EAAA,KAAA,EAAY,KAAA,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAC5C,KAAK,IAAI,CAAA;AAAA,QACZ,QAAU,EAAA,OAAA,CAAQ,QAAU,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QACpC,eAAiB,EAAA,OAAA,CAAQ,eAAiB,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,OACpD,CAAA;AACA,MAAA,SAAA,CAAU,OAAO,GAAG,CAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AAGD,IAAU,SAAA,CAAA,iBAAA,GAAoB,GAAI,EAAA,CAAA;AAAA,GACpC;AACF;;;;;AC9EA,MAAM,UAAEE,UAAW,GAAA,GAAA,CAAA;AAEZ,MAAM,cAA4C,CAAA;AAAA,EAAlD,WAAA,GAAA;AACL,IAAAF,eAAA,CAAA,IAAA,EAAO,eAAgB,EAAA,OAAA,CAAA,CAAA;AACvB,IAAAA,eAAA,CAAA,IAAA,EAAO,iBAAgB,SAAU,CAAA,IAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAEjC,MAAa,MACX,CAAA,cAAA,EACA,QACA,EAAA,UAAA,EACA,GACA,EACe,EAAA;AACf,IAAA,MAAM,mBAA2C,EAAC,CAAA;AAClD,IAAY,UAAA,EAAA,OAAA,CAAQ,CAAC,EAAE,EAAA,EAAI,MAAY,KAAA,gBAAA,CAAiB,EAAE,CAAA,GAAI,IAAK,CAAA,CAAA;AACnE,IAAM,MAAA,OAAA,uBAAc,GAAY,CAAA;AAAA,MAC9B,KAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA;AAAA,KACD,CAAA,CAAA;AACD,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC5B,MAAO,MAAA,CAAA,OAAA,CAAQ,OAAO,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AAChD,QAAI,IAAA,KAAA,EAAe,OAAA,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AAAA,OAC3B,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAED,IAAA,MAAM,QAAW,GAAA,IAAIE,QAAO,CAAA,IAAA,CAAK,cAAe,CAAA;AAAA,MAC9C,MAAQ,EAAA,cAAA;AAAA,KACT,CAAA,CAAA;AACD,IAAM,MAAA,SAAA,GAAY,QAAS,CAAA,YAAA,CAAa,UAAU,CAAA,CAAA;AAClD,IAAA,SAAA,CAAU,UAAU,KAAM,CAAA,IAAA,CAAK,OAAO,CAAE,CAAA,GAAA,CAAI,CAAC,MAAY,MAAA;AAAA,MACvD,GAAK,EAAA,MAAA;AAAA,MACL,MAAQ,EAAA,MAAA;AAAA,KACR,CAAA,CAAA,CAAA;AAEF,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC5B,MAAA,MAAM,GAAM,GAAA;AAAA,QACV,GAAG,OAAA;AAAA,QACH,QAAA,EAAU,gBAAiB,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,QAC7C,MAAQ,EAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QAChC,MAAQ,EAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QAChC,IAAM,EAAA,OAAA,CAAQ,IAAM,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QAC5B,QAAU,EAAA,OAAA,CAAQ,QAAU,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QACpC,eAAiB,EAAA,OAAA,CAAQ,eAAiB,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QAClD,OAAS,EAAA,OAAA,CAAQ,OAAS,EAAA,IAAA,CAAK,IAAI,CAAA;AAAA,QACnC,QAAQ,OAAQ,CAAA,MAAA,EACZ,GAAI,CAAA,CAAC,EAAE,GAAK,EAAA,KAAA,EAAY,KAAA,CAAA,EAAG,GAAG,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAC1C,KAAK,IAAI,CAAA;AAAA,QACZ,YAAY,OAAQ,CAAA,UAAA,EAChB,GAAI,CAAA,CAAC,EAAE,GAAK,EAAA,KAAA,EAAY,KAAA,CAAA,EAAG,GAAG,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAC1C,KAAK,IAAI,CAAA;AAAA,QACZ,OAAO,OAAQ,CAAA,KAAA,EACX,GAAI,CAAA,CAAC,EAAE,IAAM,EAAA,KAAA,EAAY,KAAA,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAC5C,KAAK,IAAI,CAAA;AAAA,OACd,CAAA;AACA,MAAU,SAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,MAAO,EAAA,CAAA;AAAA,KAC9B,CAAA,CAAA;AACD,IAAA,SAAA,CAAU,MAAO,EAAA,CAAA;AACjB,IAAA,MAAM,SAAS,MAAO,EAAA,CAAA;AAAA,GACxB;AACF;;;;;ACjFA,MAAM,UAAEA,UAAW,GAAA,GAAA,CAAA;AAEZ,MAAM,gBAA8C,CAAA;AAAA,EAApD,WAAA,GAAA;AACL,IAAAF,eAAA,CAAA,IAAA,EAAO,eAAgB,EAAA,SAAA,CAAA,CAAA;AACvB,IAAAA,eAAA,CAAA,IAAA,EAAO,iBAAgB,SAAU,CAAA,IAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAEjC,MAAa,MACX,CAAA,cAAA,EACA,QACA,EAAA,UAAA,EACA,GACA,EACe,EAAA;AACf,IAAA,MAAM,mBAA6C,EAAC,CAAA;AACpD,IAAY,UAAA,EAAA,OAAA;AAAA,MACV,CAAC,QAAA,KAAc,gBAAiB,CAAA,QAAA,CAAS,EAAE,CAAI,GAAA,QAAA;AAAA,KACjD,CAAA;AAEA,IAAM,MAAA,SAAA,GAAY,CAAC,OAA6C,KAAA;AAC9D,MAAA,MAAM,aAAqC,EAAC,CAAA;AAE5C,MAAA,OAAA,CAAQ,MAAQ,EAAA,OAAA;AAAA,QACd,CAAC,MAAO,UAAW,CAAA,CAAA,kDAAA,EAAa,EAAE,GAAG,CAAA,CAAE,IAAI,CAAE,CAAA,KAAA;AAAA,OAC/C,CAAA;AAEA,MAAO,OAAA,UAAA,CAAA;AAAA,KACT,CAAA;AACA,IAAM,MAAA,aAAA,GAAgB,CAAC,OAA6C,KAAA;AAClE,MAAA,MAAM,aAAqC,EAAC,CAAA;AAE5C,MAAA,OAAA,CAAQ,UAAY,EAAA,OAAA;AAAA,QAClB,CAAC,MAAO,UAAW,CAAA,CAAA,kDAAA,EAAa,EAAE,GAAG,CAAA,CAAE,IAAI,CAAE,CAAA,KAAA;AAAA,OAC/C,CAAA;AAEA,MAAO,OAAA,UAAA,CAAA;AAAA,KACT,CAAA;AAEA,IAAM,MAAA,aAAA,GAAgB,CAAC,OAAqB,KAAA;AAC1C,MAAA,MAAMG,cAAqC,EAAC,CAAA;AAC5C,MAAM,MAAA,YAAA,GAAe,IAAI,KAAc,EAAA,CAAA;AAEvC,MAAA,SAAS,YAAY,UAAgC,EAAA;AACnD,QAAA,IAAI,eAAe,KAAW,CAAA,EAAA,OAAA;AAE9B,QAAM,MAAA,QAAA,GAAW,iBAAiB,UAAU,CAAA,CAAA;AAC5C,QAAA,IAAI,QAAU,EAAA;AACZ,UAAa,YAAA,CAAA,IAAA,CAAK,SAAS,IAAI,CAAA,CAAA;AAC/B,UAAA,WAAA,CAAY,SAAS,QAAQ,CAAA,CAAA;AAAA,SAC/B;AAAA,OACF;AAEA,MAAA,WAAA,CAAY,QAAQ,UAAU,CAAA,CAAA;AAE9B,MAAa,YAAA,CAAA,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAM,KAAA;AAChC,QAAM,MAAA,KAAA,GAAQ,YAAa,CAAA,MAAA,GAAS,CAAI,GAAA,CAAA,CAAA;AACxC,QAAA,MAAM,GAAM,GAAA,KAAA,KAAU,CAAI,GAAA,kDAAA,GAAa,4EAAgB,KAAK,CAAA,CAAA,CAAA;AAC5D,QAAAA,WAAAA,CAAW,GAAG,CAAI,GAAA,IAAA,CAAA;AAAA,OACnB,CAAA,CAAA;AAED,MAAOA,OAAAA,WAAAA,CAAAA;AAAA,KACT,CAAA;AACA,IAAA,MAAM,QAAW,GAAA,IAAID,QAAO,CAAA,IAAA,CAAK,cAAe,CAAA;AAAA,MAC9C,MAAQ,EAAA,cAAA;AAAA,KACT,CAAA,CAAA;AACD,IAAM,MAAA,SAAA,GAAY,QAAS,CAAA,YAAA,CAAa,UAAU,CAAA,CAAA;AAClD,IAAM,MAAA,OAAA,uBAAc,GAAY,CAAA;AAAA,MAC9B,+CAAA;AAAA,MACA,kFAAA;AAAA,MACA,4CAAA;AAAA,MACA,kDAAA;AAAA,MACA,4EAAA;AAAA,MACA,4EAAA;AAAA,MACA,+IAAA;AAAA,MACA,+DAAA;AAAA,MACA,qEAAA;AAAA,MACA,2EAAA;AAAA,MACA,wDAAA;AAAA,MACA,4CAAA;AAAA,MACA,mDAAA;AAAA,MACA,6FAAA;AAAA,MACA,uFAAA;AAAA,MACA,mGAAA;AAAA,MACA,oBAAA;AAAA,MACA,0GAAA;AAAA,MACA,oBAAA;AAAA,MACA,2EAAA;AAAA,MACA,qHAAA;AAAA,MACA,oEAAA;AAAA,MACA,kFAAA;AAAA,MACA,wDAAA;AAAA,MACA,kDAAA;AAAA,MACA,kFAAA;AAAA,MACA,0GAAA;AAAA,MACA,sEAAA;AAAA,MACA,iHAAA;AAAA,MACA,uFAAA;AAAA,MACA,6FAAA;AAAA,MACA,iFAAA;AAAA,KACD,CAAA,CAAA;AACD,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC5B,MAAA,MAAA,CAAO,IAAK,CAAA;AAAA,QACV,GAAG,UAAU,OAAO,CAAA;AAAA,QACpB,GAAG,cAAc,OAAO,CAAA;AAAA,OACzB,CAAA,CAAE,OAAQ,CAAA,CAAC,GAAQ,KAAA;AAClB,QAAA,OAAA,CAAQ,IAAI,GAAG,CAAA,CAAA;AAAA,OAChB,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AACD,IAAA,SAAA,CAAU,UAAU,KAAM,CAAA,IAAA,CAAK,OAAO,CAAE,CAAA,GAAA,CAAI,CAAC,MAAY,MAAA;AAAA,MACvD,MAAQ,EAAA,MAAA;AAAA,MACR,GAAK,EAAA,MAAA;AAAA,KACL,CAAA,CAAA,CAAA;AACF,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC5B,MAAA,MAAM,GAAM,GAAA;AAAA,QACV,iDAAc,OAAQ,CAAA,SAAA;AAAA,QACtB,oFAAmB,OAAQ,CAAA,GAAA;AAAA,QAC3B,4CAAS,OAAQ,CAAA,UAAA;AAAA,QACjB,iJAA8B,OAAQ,CAAA,KAAA;AAAA,QACtC,iEAAe,OAAQ,CAAA,QAAA;AAAA,QACvB,uEAAgB,OAAQ,CAAA,KAAA;AAAA,QACxB,2EAAe,OAAQ,CAAA,aAAA;AAAA,QACvB,GAAG,cAAc,OAAO,CAAA;AAAA,QACxB,4CAAS,OAAQ,CAAA,KAAA;AAAA,QACjB,qDAAa,OAAQ,CAAA,OAAA;AAAA,QACrB,6FAAoB,EAAA,KAAA,CAAA;AAAA,QACpB,yFAAmB,OAAQ,CAAA,WAAA;AAAA,QAC3B,qGAAqB,OAAQ,CAAA,UAAA;AAAA,QAC7B,oBAAK,OAAQ,CAAA,MAAA;AAAA,QACb,4GAAuB,OAAQ,CAAA,SAAA;AAAA,QAC/B,kBAAA,EAAK,OAAQ,CAAA,GAAA,CAAI,QAAS,EAAA;AAAA,QAC1B,2EAAA,EAAiB,OAAQ,CAAA,QAAA,CAAS,QAAS,EAAA;AAAA,QAC3C,qHAAA,EACE,QAAQ,QAAa,KAAA,KAAA,CAAA,GACjB,QAAQ,MAAQ,EAAA,IAAA,CAAK,GAAG,CACxB,GAAA,KAAA,CAAA;AAAA,QACN,kEAAA,EACE,QAAQ,QAAa,KAAA,KAAA,CAAA,GACjB,SACA,OAAQ,CAAA,MAAA,EAAQ,KAAK,GAAG,CAAA;AAAA,QAC9B,oFAAmB,OAAQ,CAAA,MAAA,GAAS,OAAQ,CAAA,MAAA,CAAO,CAAC,CAAI,GAAA,KAAA,CAAA;AAAA,QACxD,GAAG,UAAU,OAAO,CAAA;AAAA,QACpB,GAAG,cAAc,OAAO,CAAA;AAAA,QACxB,oFAAmB,OAAQ,CAAA,MAAA;AAAA,QAC3B,4GAAuB,OAAQ,CAAA,UAAA;AAAA,QAC/B,wEAAiB,OAAQ,CAAA,MAAA;AAAA,QACzB,mHAAyB,OAAQ,CAAA,QAAA;AAAA,QACjC,uFAAmB,EAAA,IAAA,CAAK,SAAU,CAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QAC/C,6FAAoB,EAAA,OAAA,CAAQ,eAAiB,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QACrD,iFAAkB,EAAA,OAAA,CAAQ,QAAU,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,OAC9C,CAAA;AACA,MAAU,SAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,MAAO,EAAA,CAAA;AAAA,KAC9B,CAAA,CAAA;AACD,IAAA,SAAA,CAAU,MAAO,EAAA,CAAA;AACjB,IAAA,MAAM,SAAS,MAAO,EAAA,CAAA;AAAA,GACxB;AACF;;;;;ACzJO,MAAM,aAA2C,CAAA;AAAA,EAAjD,WAAA,GAAA;AACL,IAAAF,eAAA,CAAA,IAAA,EAAO,eAAgB,EAAA,MAAA,CAAA,CAAA;AACvB,IAAAA,eAAA,CAAA,IAAA,EAAO,iBAAgB,SAAU,CAAA,IAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAEjC,MAAa,MACX,CAAA,cAAA,EACA,QACA,EAAA,UAAA,EACA,QACA,CACe,EAAA;AACf,IAAM,MAAA,MAAA,GAAS,IAAI,mBAAoB,CAAA;AAAA,MACrC,UAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,KACD,CAAA,CAAA;AACD,IAAA,MAAA,CAAO,KAAK,cAAc,CAAA,CAAA;AAAA,GAC5B;AACF;;;;;ACdO,MAAM,mBAAiD,CAAA;AAAA,EAAvD,WAAA,GAAA;AACL,IAAAA,eAAA,CAAA,IAAA,EAAO,eAAgB,EAAA,MAAA,CAAA,CAAA;AACvB,IAAAA,eAAA,CAAA,IAAA,EAAO,iBAAgB,SAAU,CAAA,IAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAEjC,MAAa,MACX,CAAA,cAAA,EACA,QACA,EAAA,UAAA,EACA,QACA,CACe,EAAA;AACf,IAAM,MAAA,cAAA,uBAAqB,GAA2B,EAAA,CAAA;AACtD,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC5B,MAAI,IAAA,OAAA,CAAQ,aAAa,KAAW,CAAA,EAAA,OAAA;AACpC,MAAe,cAAA,CAAA,GAAA,CAAI,QAAQ,SAAW,EAAA;AAAA,QACpC,GAAG,OAAA;AAAA,QACH,UAAU,EAAC;AAAA,OACZ,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AACD,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC5B,MAAI,IAAA,OAAA,CAAQ,aAAa,KAAW,CAAA,EAAA,OAAA;AACpC,MAAA,MAAM,MAAS,GAAA,cAAA,CAAe,GAAI,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAClD,MAAA,IAAI,CAAC,MAAQ,EAAA,OAAA;AACb,MAAO,MAAA,CAAA,QAAA,CAAS,KAAK,OAAO,CAAA,CAAA;AAAA,KAC7B,CAAA,CAAA;AACD,IAAM,MAAA,MAAA,GAAS,IAAI,mBAAoB,CAAA;AAAA,MACrC,UAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAU,EAAA,KAAA,CAAM,IAAK,CAAA,cAAA,CAAe,QAAQ,CAAA;AAAA,KAC7C,CAAA,CAAA;AACD,IAAA,MAAA,CAAO,KAAK,cAAc,CAAA,CAAA;AAAA,GAC5B;AACF;;;;;ACrCA,MAAM,EAAE,QAAW,GAAA,GAAA,CAAA;AAEZ,MAAM,eAA6C,CAAA;AAAA,EAAnD,WAAA,GAAA;AACL,IAAAA,eAAA,CAAA,IAAA,EAAO,eAAgB,EAAA,QAAA,CAAA,CAAA;AACvB,IAAAA,eAAA,CAAA,IAAA,EAAO,iBAAgB,SAAU,CAAA,IAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAEjC,MAAa,MACX,CAAA,cAAA,EACA,QACA,EAAA,UAAA,EACA,GACA,EACe,EAAA;AACf,IAAM,MAAA,YAAA,GAAe,CAAC,OAAA,EAAkB,GACtC,KAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,CAAK,CAAC,KAAA,KAAU,KAAM,CAAA,GAAA,KAAQ,GAAG,CAAA,CAAA;AAEnD,IAAM,MAAA,cAAA,GAAiB,CAAC,OAAsB,MAAA;AAAA,MAC5C,eAAe,OAAQ,CAAA,UAAA;AAAA,MACvB,YAAY,OAAQ,CAAA,QAAA;AAAA,MACpB,cAAc,OAAQ,CAAA,SAAA;AAAA,MACtB,gBAAgB,OAAQ,CAAA,KAAA;AAAA,MACxB,OAAO,OAAQ,CAAA,KAAA;AAAA,MACf,OAAS,EAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,CAAK,IAAI,CAAA;AAAA,MAClC,YAAY,OAAQ,CAAA,UAAA;AAAA,MACpB,UAAU,OAAQ,CAAA,QAAA;AAAA,MAClB,aAAa,OAAQ,CAAA,WAAA;AAAA,MACrB,gBAAkB,EAAA,EAAA;AAAA,MAClB,iBAAiB,OAAQ,CAAA,KAAA;AAAA,MACzB,KAAO,EAAA,YAAA,CAAa,OAAS,EAAA,OAAO,CAAG,EAAA,KAAA;AAAA,MACvC,IAAM,EAAA,YAAA,CAAa,OAAS,EAAA,MAAM,CAAG,EAAA,KAAA;AAAA,MACrC,QAAU,EAAA,KAAA,CAAA;AAAA,KACZ,CAAA,CAAA;AACA,IAAA,MAAM,QAAW,GAAA,IAAI,MAAO,CAAA,IAAA,CAAK,cAAe,CAAA;AAAA,MAC9C,MAAQ,EAAA,cAAA;AAAA,KACT,CAAA,CAAA;AACD,IAAM,MAAA,iBAAA,GAAoB,QAAS,CAAA,YAAA,CAAa,YAAY,CAAA,CAAA;AAC5D,IAAM,MAAA,iBAAA,GAAoB,QAAS,CAAA,YAAA,CAAa,QAAQ,CAAA,CAAA;AACxD,IAAA,iBAAA,CAAkB,OAAU,GAAA;AAAA,MAC1B;AAAA,QACE,MAAQ,EAAA,IAAA;AAAA,QACR,GAAK,EAAA,IAAA;AAAA,OACP;AAAA,MACA;AAAA,QACE,MAAQ,EAAA,UAAA;AAAA,QACR,GAAK,EAAA,UAAA;AAAA,OACP;AAAA,MACA;AAAA,QACE,MAAQ,EAAA,MAAA;AAAA,QACR,GAAK,EAAA,MAAA;AAAA,OACP;AAAA,KACF,CAAA;AACA,IAAA,MAAM,OAAU,GAAA;AAAA,MACd,aAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,kBAAA;AAAA,MACA,iBAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,KACF,CAAA;AAEA,IAAA,iBAAA,CAAkB,OAAU,GAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,MAAY,MAAA;AAAA,MACnD,MAAQ,EAAA,MAAA;AAAA,MACR,GAAK,EAAA,MAAA;AAAA,KACL,CAAA,CAAA,CAAA;AAEF,IAAY,UAAA,EAAA,OAAA,CAAQ,CAAC,QAAa,KAAA;AAChC,MAAkB,iBAAA,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAO,EAAA,CAAA;AAAA,KAC3C,CAAA,CAAA;AAED,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC5B,MAAA,iBAAA,CAAkB,MAAO,CAAA,cAAA,CAAe,OAAO,CAAC,EAAE,MAAO,EAAA,CAAA;AAAA,KAC1D,CAAA,CAAA;AACD,IAAA,iBAAA,CAAkB,MAAO,EAAA,CAAA;AACzB,IAAA,iBAAA,CAAkB,MAAO,EAAA,CAAA;AAEzB,IAAA,MAAM,SAAS,MAAO,EAAA,CAAA;AAAA,GACxB;AACF;;;;;ACrFO,MAAM,cAA4C,CAAA;AAAA,EAAlD,WAAA,GAAA;AACL,IAAAA,eAAA,CAAA,IAAA,EAAO,eAAgB,EAAA,OAAA,CAAA,CAAA;AACvB,IAAAA,eAAA,CAAA,IAAA,EAAO,iBAAgB,SAAU,CAAA,GAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAEjC,MAAa,MACX,CAAA,cAAA,EACA,QACA,EAAA,UAAA,EACA,GACA,EACe,EAAA;AACf,IAAA,MAAM,mBAA2C,EAAC,CAAA;AAClD,IAAY,UAAA,EAAA,OAAA,CAAQ,CAAC,EAAE,EAAA,EAAI,MAAY,KAAA,gBAAA,CAAiB,EAAE,CAAA,GAAI,IAAK,CAAA,CAAA;AAEnE,IAAM,MAAA,SAAA,GAAY,IAAI,SAAU,CAAA;AAAA,MAC9B,SAAW,EAAA,GAAA;AAAA,MACX,eAAiB,EAAA,EAAA;AAAA,MACjB,aAAe,EAAA,IAAA;AAAA,KAChB,CAAA,CAAA;AACD,IAAU,SAAA,CAAA,iBAAA,EAAoB,CAAA,IAAA,CAAK,cAAc,CAAA,CAAA;AACjD,IAAM,MAAA,OAAA,uBAAc,GAAY,CAAA;AAAA,MAC9B,KAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,KACD,CAAA,CAAA;AACD,IAAA,SAAA,CAAU,WAAW,OAAO,CAAA,CAAA;AAC5B,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC5B,MAAA,MAAM,GAAmD,GAAA;AAAA,QACvD,KAAK,OAAQ,CAAA,UAAA;AAAA,QACb,OAAO,OAAQ,CAAA,MAAA;AAAA,QACf,QAAA,EAAU,gBAAiB,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,QAC7C,OAAO,OAAQ,CAAA,KAAA;AAAA,QACf,MAAM,OAAQ,CAAA,WAAA;AAAA,QACd,KAAO,EAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,CAAK,GAAG,CAAA;AAAA,QAC/B,OAAO,OAAQ,CAAA,KAAA;AAAA,QACf,aAAa,OAAQ,CAAA,QAAA;AAAA,QACrB,UAAU,OAAQ,CAAA,KAAA;AAAA,QAClB,UAAU,OAAQ,CAAA,MAAA,EACd,GAAI,CAAA,CAAC,EAAE,GAAK,EAAA,KAAA,EAAY,KAAA,CAAA,EAAG,GAAG,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAC1C,KAAK,GAAG,CAAA;AAAA,QACX,eAAe,OAAQ,CAAA,SAAA;AAAA,QACvB,cAAc,OAAQ,CAAA,QAAA;AAAA,OACxB,CAAA;AACA,MAAA,SAAA,CAAU,OAAO,GAAG,CAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AAED,IAAU,SAAA,CAAA,iBAAA,GAAoB,GAAI,EAAA,CAAA;AAAA,GACpC;AACF;;;;;ACxDO,MAAM,YAA0C,CAAA;AAAA,EAAhD,WAAA,GAAA;AACL,IAAAA,eAAA,CAAA,IAAA,EAAO,eAAgB,EAAA,KAAA,CAAA,CAAA;AACvB,IAAAA,eAAA,CAAA,IAAA,EAAO,iBAAgB,SAAU,CAAA,GAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAEjC,MAAa,MACX,CAAA,cAAA,EACA,QACA,EAAA,UAAA,EACA,QACA,OACe,EAAA;AACf,IAAM,MAAA,MAAA,GAAS,IAAI,WAAY,EAAA,CAAA;AAC/B,IAAA,MAAA,CAAO,KAAK,cAAc,CAAA,CAAA;AAE1B,IAAM,MAAA,OAAA,GAAU,IAAI,UAAW,CAAA;AAAA,MAC7B,gBAAkB,EAAA,KAAA;AAAA,MAClB,aAAe,EAAA,SAAA;AAAA,MACf,MAAQ,EAAA,IAAA;AAAA,MACR,QAAU,EAAA,IAAA;AAAA,KACX,CAAA,CAAA;AAED,IAAM,MAAA,IAAA,GAAA,qBAAW,IAAK,EAAA,EAAE,aAAc,CAAA,OAAA,CAAQ,SAAS,EAAE,CAAA,CAAA;AAGzD,IAAA,MAAA,CAAO,MAAM,2DAA2D,CAAA,CAAA;AACxE,IAAO,MAAA,CAAA,KAAA,CAAM,qBAAwB,GAAA,IAAA,GAAO,MAAM,CAAA,CAAA;AAGlD,IAAA,MAAA,CAAO,MAAM,UAAU,CAAA,CAAA;AAGvB,IAAA,IAAI,SAAS,QAAU,EAAA;AACrB,MAAO,MAAA,CAAA,KAAA,CAAM,QAAQ,KAAM,CAAA,EAAE,MAAM,OAAQ,CAAA,QAAA,EAAU,CAAC,CAAA,CAAA;AACtD,MAAA,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA;AAAA,KACnB;AACA,IAAA,IAAI,SAAS,WAAa,EAAA;AACxB,MAAO,MAAA,CAAA,KAAA,CAAM,QAAQ,KAAM,CAAA,EAAE,SAAS,OAAQ,CAAA,WAAA,EAAa,CAAC,CAAA,CAAA;AAC5D,MAAA,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA;AAAA,KACnB;AAGA,IAAA,IAAI,UAAY,EAAA;AACd,MAAO,MAAA,CAAA,KAAA;AAAA,QACL,QAAQ,KAAM,CAAA;AAAA;AAAA,UAEZ,YAAY,EAAE,QAAA,EAAU,IAAK,CAAA,aAAA,CAAc,UAAU,CAAE,EAAA;AAAA,SACxD,CAAA;AAAA,OACH,CAAA;AACA,MAAA,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA;AAAA,KACnB;AACA,IAAA,IAAI,MAAQ,EAAA;AACV,MAAO,MAAA,CAAA,KAAA;AAAA,QACL,OAAA,CAAQ,KAAM,CAAA,EAAE,MAAQ,EAAA,EAAE,KAAO,EAAA,IAAA,CAAK,SAAU,CAAA,MAAM,CAAE,EAAA,EAAG,CAAA;AAAA,OAC7D,CAAA;AACA,MAAA,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA;AAAA,KACnB;AAGA,IAAA,MAAA,CAAO,MAAM,YAAY,CAAA,CAAA;AAGzB,IAAM,MAAA,WAAA,GAAc,IAAI,WAAY,EAAA,CAAA;AAGpC,IAAA,WAAA,CAAY,IAAK,CAAA,MAAA,EAAQ,EAAE,GAAA,EAAK,OAAO,CAAA,CAAA;AAGvC,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC5B,MAAM,MAAA,KAAA,GAAQ,QAAQ,KAAM,CAAA,EAAE,OAAO,IAAK,CAAA,QAAA,CAAS,OAAO,CAAA,EAAG,CAAA,CAAA;AAC7D,MAAY,WAAA,CAAA,KAAA,CAAM,QAAQ,IAAI,CAAA,CAAA;AAAA,KAC/B,CAAA,CAAA;AAGD,IAAA,WAAA,CAAY,GAAI,EAAA,CAAA;AAEhB,IAAY,WAAA,CAAA,EAAA,CAAG,OAAO,MAAM;AAE1B,MAAA,MAAA,CAAO,MAAM,aAAa,CAAA,CAAA;AAG1B,MAAA,MAAA,CAAO,MAAM,WAAW,CAAA,CAAA;AAGxB,MAAA,MAAA,CAAO,MAAM,kBAAkB,CAAA,CAAA;AAG/B,MAAA,MAAA,CAAO,GAAI,EAAA,CAAA;AAAA,KACZ,CAAA,CAAA;AAAA,GACH;AAAA,EAEQ,UAAU,MAAkB,EAAA;AAClC,IAAI,IAAA,CAAC,MAAQ,EAAA,OAAO,EAAC,CAAA;AAErB,IAAO,OAAA,MAAA,CAAO,GAAI,CAAA,CAAC,KAAW,MAAA;AAAA,MAC5B,QAAQ,KAAM,CAAA,EAAA;AAAA,MACd,OAAA,EAAS,MAAM,QAAY,IAAA,EAAA;AAAA,MAC3B,SAAS,KAAM,CAAA,IAAA;AAAA,KACf,CAAA,CAAA,CAAA;AAAA,GACJ;AAAA,EAEQ,cAAc,UAAyB,EAAA;AAC7C,IAAI,IAAA,CAAC,UAAY,EAAA,OAAO,EAAC,CAAA;AAEzB,IAAO,OAAA,UAAA,CAAW,GAAI,CAAA,CAAC,GAAS,MAAA;AAAA,MAC9B,QAAQ,GAAI,CAAA,EAAA;AAAA,MACZ,YAAA,EAAc,IAAI,QAAY,IAAA,EAAA;AAAA,MAC9B,SAAS,GAAI,CAAA,IAAA;AAAA,KACb,CAAA,CAAA,CAAA;AAAA,GACJ;AAAA,EAEQ,SAAS,OAAuB,EAAA;AACtC,IAAA,MAAM,MAAS,GAAA;AAAA,MACb,QAAQ,OAAQ,CAAA,SAAA;AAAA,MAChB,MAAM,OAAQ,CAAA,KAAA;AAAA,MACd,OAAO,OAAQ,CAAA,KAAA;AAAA,MACf,UAAU,OAAQ,CAAA,QAAA;AAAA,MAClB,gBAAgB,OAAQ,CAAA,aAAA;AAAA,MACxB,qBAAqB,OAAQ,CAAA,kBAAA;AAAA,MAC7B,iBAAiB,OAAQ,CAAA,cAAA;AAAA,MACzB,YAAY,OAAQ,CAAA,QAAA;AAAA,MACpB,YAAY,OAAQ,CAAA,UAAA;AAAA,MACpB,UAAU,OAAQ,CAAA,QAAA;AAAA,MAClB,QAAQ,OAAQ,CAAA,MAAA;AAAA,MAChB,YAAY,OAAQ,CAAA,UAAA;AAAA,MACpB,SAAS,OAAQ,CAAA,MAAA;AAAA,MACjB,OAAO,OAAQ,CAAA,MAAA;AAAA,MACf,WAAW,OAAQ,CAAA,SAAA;AAAA,MACnB,QAAQ,OAAQ,CAAA,UAAA;AAAA,MAChB,gBAAgB,OAAQ,CAAA,WAAA;AAAA,MACxB,iBAAiB,OAAQ,CAAA,YAAA;AAAA,MACzB,IAAM,EAAA,OAAA,CAAQ,KAAO,EAAA,GAAA,CAAI,CAAC,IAAU,MAAA;AAAA,QAClC,SAAS,IAAK,CAAA,KAAA;AAAA,QACd,UAAU,IAAK,CAAA,IAAA;AAAA,QACf,eAAe,IAAK,CAAA,SAAA;AAAA,OACpB,CAAA,CAAA;AAAA,MACF,SAAS,OAAQ,CAAA,QAAA;AAAA,MACjB,UAAU,OAAQ,CAAA,QAAA;AAAA,MAClB,QAAU,EAAA,OAAA,CAAQ,UAAY,EAAA,GAAA,CAAI,CAAC,QAAc,MAAA;AAAA,QAC/C,SAAS,QAAS,CAAA,KAAA;AAAA,QAClB,UAAU,QAAS,CAAA,GAAA;AAAA,OACnB,CAAA,CAAA;AAAA,MACF,KAAO,EAAA,OAAA,CAAQ,MAAQ,EAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,QACrC,SAAS,KAAM,CAAA,KAAA;AAAA,QACf,UAAU,KAAM,CAAA,GAAA;AAAA,OAChB,CAAA,CAAA;AAAA,MACF,WAAa,EAAA;AAAA,QACX,SAAS,OAAQ,CAAA,WAAA;AAAA,OACnB;AAAA,MACA,mBAAmB,OAAQ,CAAA,eAAA;AAAA,MAC3B,SAAS,OAAQ,CAAA,OAAA;AAAA,MACjB,KAAK,OAAQ,CAAA,GAAA;AAAA,MACb,OAAO,OAAQ,CAAA,KAAA;AAAA,MACf,SAAW,EAAA,OAAA,CAAQ,IAAM,EAAA,IAAA,CAAK,IAAI,CAAA;AAAA,MAClC,OAAO,OAAQ,CAAA,KAAA;AAAA,MACf,cAAc,OAAQ,CAAA,YAAA;AAAA,MACtB,2BAA2B,OAAQ,CAAA,cAAA;AAAA,MACnC,yBAAyB,OAAQ,CAAA,eAAA;AAAA,MACjC,qBAAqB,OAAQ,CAAA,iBAAA;AAAA,MAC7B,qBAAqB,OAAQ,CAAA,kBAAA;AAAA,MAC7B,iBAAiB,OAAQ,CAAA,cAAA;AAAA,MACzB,oBAAoB,OAAQ,CAAA,eAAA;AAAA,MAC5B,uBAAuB,OAAQ,CAAA,oBAAA;AAAA,MAC/B,aAAa,OAAQ,CAAA,WAAA;AAAA,MACrB,KAAK,OAAQ,CAAA,GAAA;AAAA,MACb,QAAQ,OAAQ,CAAA,MAAA;AAAA,MAChB,YAAY,OAAQ,CAAA,UAAA;AAAA,MACpB,UAAU,OAAQ,CAAA,QAAA;AAAA,MAClB,UAAU,OAAQ,CAAA,QAAA;AAAA,MAClB,GAAA,EAAK,OAAQ,CAAA,GAAA,IAAO,IAAQ,IAAA;AAAA,QAC1B,QAAA,EAAU,QAAQ,GAAI,CAAA,IAAA;AAAA,QACtB,OAAA,EAAS,QAAQ,GAAI,CAAA,KAAA;AAAA,OACvB;AAAA,MACA,cAAgB,EAAA,OAAA,CAAQ,OAAS,EAAA,MAAA,IAAU,IAAQ,IAAA;AAAA,QACjD,eAAe,OAAQ,CAAA,OAAA;AAAA,OACzB;AAAA,MACA,gBAAgB,OAAQ,CAAA,eAAA;AAAA,MACxB,QAAQ,OAAQ,CAAA,MAAA;AAAA,KAClB,CAAA;AACA,IAAI,IAAA,OAAA,CAAQ,aAAa,KAAW,CAAA,EAAA;AAClC,MAAO,OAAA;AAAA,QACL,GAAG,MAAA;AAAA,QACH,cAAc,OAAQ,CAAA,QAAA;AAAA,OACxB,CAAA;AAAA,KACF;AACA,IAAO,OAAA,MAAA,CAAA;AAAA,GACT;AACF;;AC1LO,MAAM,UAAa,GAAA;AAAA,EACxB,cAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,mBAAA;AACF;;;;;ACVO,MAAM,aAAc,CAAA;AAAA,EAApB,WAAA,GAAA;AACL,IAAQ,aAAA,CAAA,IAAA,EAAA,WAAA,EAA+B,IAAI,UAAA,CAAW,YAAa,EAAA,CAAA,CAAA;AACnE,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAqB,MAAM;AACjC,MAAA,OAAO,EAAG,CAAA,iBAAA;AAAA,QACR,GAAG,IAAK,CAAA,SAAA,CAAU,aAAa,CAAW,QAAA,EAAA,IAAA,CAAK,UAAU,aAAa,CAAA,CAAA;AAAA,OACxE,CAAA;AAAA,KACF,CAAA,CAAA;AAEA,IAAQ,aAAA,CAAA,IAAA,EAAA,cAAA,EAAe,IAAI,KAAmB,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAEvC,gBAAgB,YAAmC,EAAA;AACxD,IAAA,IAAA,CAAK,YAAe,GAAA,YAAA,CAAA;AAAA,GACtB;AAAA,EAEO,aAAa,SAAoC,EAAA;AACtD,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA,CAAA;AAAA,GACnB;AAAA,EAEO,YAAY,QAA0B,EAAA;AAC3C,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAAA,GAClB;AAAA,EAEA,MAAM,MAAA,CACJ,QACA,EAAA,UAAA,EACA,QACA,MACe,EAAA;AACf,IAAA,IAAI,mBAAiC,GAAA,QAAA,CAAA;AAErC,IAAA,KAAA,MAAW,eAAe,IAAK,CAAA,YAAA;AAC7B,MAAsB,mBAAA,GAAA,MAAM,YAAY,mBAAmB,CAAA,CAAA;AAE7D,IAAM,MAAA,cAAA,GAAiB,KAAK,QAAS,EAAA,CAAA;AAErC,IAAA,MAAM,KAAK,SAAU,CAAA,MAAA;AAAA,MACnB,cAAA;AAAA,MACA,mBAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,KACF,CAAA;AAAA,GACF;AACF;;ACucY,IAAA,GAAA,qBAAAI,IAAL,KAAA;AACL,EAAAA,KAAA,QAAS,CAAA,GAAA,QAAA,CAAA;AACT,EAAAA,KAAA,OAAQ,CAAA,GAAA,OAAA,CAAA;AACR,EAAAA,KAAA,QAAS,CAAA,GAAA,QAAA,CAAA;AACT,EAAAA,KAAA,QAAS,CAAA,GAAA,QAAA,CAAA;AAJC,EAAAA,OAAAA,IAAAA,CAAAA;AAAA,CAAA,EAAA,GAAA,IAAA,EAAA,EAAA;AAOA,IAAA,QAAA,qBAAAC,SAAL,KAAA;AACL,EAAAA,UAAA,KAAM,CAAA,GAAA,KAAA,CAAA;AACN,EAAAA,UAAA,KAAM,CAAA,GAAA,KAAA,CAAA;AACN,EAAAA,UAAA,KAAM,CAAA,GAAA,KAAA,CAAA;AACN,EAAAA,UAAA,KAAM,CAAA,GAAA,KAAA,CAAA;AACN,EAAAA,UAAA,KAAM,CAAA,GAAA,KAAA,CAAA;AACN,EAAAA,UAAA,KAAM,CAAA,GAAA,KAAA,CAAA;AANI,EAAAA,OAAAA,SAAAA,CAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;;;;"}
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"url": "https://github.com/Bagi4-source/goods-converter/issues"
|
|
12
12
|
},
|
|
13
13
|
"name": "goods-exporter",
|
|
14
|
-
"version": "
|
|
14
|
+
"version": "1.1.1",
|
|
15
15
|
"description": "A versatile JavaScript library for exporting goods data to various formats such as YML, CSV, and Excel. Simplify data export tasks with ease. Supports streams.",
|
|
16
16
|
"main": "./dist/cjs/index.cjs",
|
|
17
17
|
"type": "module",
|