goods-exporter 0.5.2 → 0.5.3

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 CHANGED
@@ -87,6 +87,12 @@ interface Product {
87
87
  * Пример: 01.01.2000
88
88
  */
89
89
  saleDate?: string;
90
+ /**
91
+ * **Вендор в магазине**
92
+ *
93
+ * Содержит номер вендора, а не ее название.
94
+ */
95
+ vendorId?: number;
90
96
  /**
91
97
  * **Категория в магазине**
92
98
  *
@@ -622,6 +628,12 @@ declare class JSONFormatter implements FormatterAbstract {
622
628
  format(products: Product[], categories?: Category[], brands?: Brand[], _?: FormatterOptions): Promise<Stream>;
623
629
  }
624
630
 
631
+ declare class SimpleJSONFormatter implements FormatterAbstract {
632
+ formatterName: string;
633
+ fileExtension: Extension;
634
+ format(products: Product[], categories?: Category[], brands?: Brand[], _?: FormatterOptions): Promise<Stream>;
635
+ }
636
+
625
637
  declare class TgShopFormatter implements FormatterAbstract {
626
638
  formatterName: string;
627
639
  fileExtension: Extension;
@@ -640,7 +652,7 @@ declare class YMLFormatter implements FormatterAbstract {
640
652
  format(products: Product[], categories?: Category[], brands?: Brand[], options?: FormatterOptions): Promise<Stream>;
641
653
  private getBrands;
642
654
  private getCategories;
643
- private getOffers;
655
+ private getOffer;
644
656
  }
645
657
 
646
658
  declare const Formatters: {
@@ -651,6 +663,7 @@ declare const Formatters: {
651
663
  TgShopFormatter: typeof TgShopFormatter;
652
664
  ExcelFormatter: typeof ExcelFormatter;
653
665
  JSONFormatter: typeof JSONFormatter;
666
+ SimpleJSONFormatter: typeof SimpleJSONFormatter;
654
667
  };
655
668
 
656
669
  type Transformer = (products: Product[]) => Product[] | Promise<Product[]>;
@@ -7,19 +7,19 @@ var fastXmlParser = require('fast-xml-parser');
7
7
  var xml = require('xml');
8
8
  var fs = require('fs');
9
9
 
10
- var __defProp$8 = Object.defineProperty;
11
- var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
- var __publicField$8 = (obj, key, value) => {
13
- __defNormalProp$8(obj, typeof key !== "symbol" ? key + "" : key, value);
10
+ var __defProp$9 = Object.defineProperty;
11
+ var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
+ var __publicField$9 = (obj, key, value) => {
13
+ __defNormalProp$9(obj, typeof key !== "symbol" ? key + "" : key, value);
14
14
  return value;
15
15
  };
16
16
  class CSVStream {
17
17
  constructor({ delimiter, lineSeparator, emptyFieldValue }) {
18
- __publicField$8(this, "stream", new stream$3.PassThrough());
19
- __publicField$8(this, "delimiter", ";");
20
- __publicField$8(this, "lineSeparator", "\n");
21
- __publicField$8(this, "emptyFieldValue", "");
22
- __publicField$8(this, "columns", /* @__PURE__ */ new Set());
18
+ __publicField$9(this, "stream", new stream$3.PassThrough());
19
+ __publicField$9(this, "delimiter", ";");
20
+ __publicField$9(this, "lineSeparator", "\n");
21
+ __publicField$9(this, "emptyFieldValue", "");
22
+ __publicField$9(this, "columns", /* @__PURE__ */ new Set());
23
23
  if (delimiter !== void 0)
24
24
  this.delimiter = delimiter;
25
25
  if (lineSeparator !== void 0)
@@ -55,16 +55,16 @@ var Extension = /* @__PURE__ */ ((Extension2) => {
55
55
  return Extension2;
56
56
  })(Extension || {});
57
57
 
58
- var __defProp$7 = Object.defineProperty;
59
- var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
60
- var __publicField$7 = (obj, key, value) => {
61
- __defNormalProp$7(obj, typeof key !== "symbol" ? key + "" : key, value);
58
+ var __defProp$8 = Object.defineProperty;
59
+ var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
60
+ var __publicField$8 = (obj, key, value) => {
61
+ __defNormalProp$8(obj, typeof key !== "symbol" ? key + "" : key, value);
62
62
  return value;
63
63
  };
64
64
  class CSVFormatter {
65
65
  constructor() {
66
- __publicField$7(this, "formatterName", "CSV");
67
- __publicField$7(this, "fileExtension", Extension.CSV);
66
+ __publicField$8(this, "formatterName", "CSV");
67
+ __publicField$8(this, "fileExtension", Extension.CSV);
68
68
  }
69
69
  async format(products, categories, _, __) {
70
70
  const mappedCategories = {};
@@ -127,17 +127,17 @@ class CSVFormatter {
127
127
  }
128
128
  }
129
129
 
130
- var __defProp$6 = Object.defineProperty;
131
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
132
- var __publicField$6 = (obj, key, value) => {
133
- __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
130
+ var __defProp$7 = Object.defineProperty;
131
+ var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
132
+ var __publicField$7 = (obj, key, value) => {
133
+ __defNormalProp$7(obj, typeof key !== "symbol" ? key + "" : key, value);
134
134
  return value;
135
135
  };
136
136
  const { stream: stream$2 } = pkg;
137
137
  class ExcelFormatter {
138
138
  constructor() {
139
- __publicField$6(this, "formatterName", "Excel");
140
- __publicField$6(this, "fileExtension", Extension.XLSX);
139
+ __publicField$7(this, "formatterName", "Excel");
140
+ __publicField$7(this, "fileExtension", Extension.XLSX);
141
141
  }
142
142
  async format(products, categories, _, __) {
143
143
  const mappedCategories = {};
@@ -202,17 +202,17 @@ class ExcelFormatter {
202
202
  }
203
203
  }
204
204
 
205
- var __defProp$5 = Object.defineProperty;
206
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
207
- var __publicField$5 = (obj, key, value) => {
208
- __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
205
+ var __defProp$6 = Object.defineProperty;
206
+ var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
207
+ var __publicField$6 = (obj, key, value) => {
208
+ __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
209
209
  return value;
210
210
  };
211
211
  const { stream: stream$1 } = pkg;
212
212
  class InsalesFormatter {
213
213
  constructor() {
214
- __publicField$5(this, "formatterName", "Insales");
215
- __publicField$5(this, "fileExtension", Extension.XLSX);
214
+ __publicField$6(this, "formatterName", "Insales");
215
+ __publicField$6(this, "fileExtension", Extension.XLSX);
216
216
  }
217
217
  async format(products, categories, _, __) {
218
218
  const mappedCategories = {};
@@ -341,22 +341,59 @@ class InsalesFormatter {
341
341
  }
342
342
  }
343
343
 
344
+ var __defProp$5 = Object.defineProperty;
345
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
346
+ var __publicField$5 = (obj, key, value) => {
347
+ __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
348
+ return value;
349
+ };
350
+ class JSONFormatter {
351
+ constructor() {
352
+ __publicField$5(this, "formatterName", "JSON");
353
+ __publicField$5(this, "fileExtension", Extension.JSON);
354
+ }
355
+ async format(products, categories, brands, _) {
356
+ return new jsonStreamStringify.JsonStreamStringify({
357
+ categories,
358
+ brands,
359
+ products
360
+ });
361
+ }
362
+ }
363
+
344
364
  var __defProp$4 = Object.defineProperty;
345
365
  var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
346
366
  var __publicField$4 = (obj, key, value) => {
347
367
  __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
348
368
  return value;
349
369
  };
350
- class JSONFormatter {
370
+ class SimpleJSONFormatter {
351
371
  constructor() {
352
372
  __publicField$4(this, "formatterName", "JSON");
353
373
  __publicField$4(this, "fileExtension", Extension.JSON);
354
374
  }
355
375
  async format(products, categories, brands, _) {
376
+ const groupedProduct = /* @__PURE__ */ new Map();
377
+ products.forEach((product) => {
378
+ if (product.parentId !== void 0)
379
+ return;
380
+ groupedProduct.set(product.variantId, {
381
+ ...product,
382
+ children: []
383
+ });
384
+ });
385
+ products.forEach((product) => {
386
+ if (product.parentId === void 0)
387
+ return;
388
+ const parent = groupedProduct.get(product.parentId);
389
+ if (!parent)
390
+ return;
391
+ parent.children.push(product);
392
+ });
356
393
  return new jsonStreamStringify.JsonStreamStringify({
357
394
  categories,
358
395
  brands,
359
- products
396
+ products: Array.from(groupedProduct.values())
360
397
  });
361
398
  }
362
399
  }
@@ -523,6 +560,7 @@ class YMLFormatter {
523
560
  declaration: { standalone: "yes", encoding: "UTF-8" }
524
561
  }
525
562
  );
563
+ stream.pipe(result, { end: false });
526
564
  const shop = xml.element();
527
565
  const streamShop = xml({ shop }, { stream: true });
528
566
  shop.push({ name: options?.shopName });
@@ -531,12 +569,13 @@ class YMLFormatter {
531
569
  shop.push({ brands: this.getBrands(brands) });
532
570
  streamShop.pipe(result, { end: false });
533
571
  const offers = xml.element();
534
- const streamOffers = xml({ offers }, { stream: true });
535
- streamOffers.pipe(result, { end: false });
572
+ const streamOffersTag = xml({ offers }, { stream: true });
573
+ streamOffersTag.pipe(result, { end: false });
574
+ const streamOffers = new stream$3.PassThrough();
536
575
  products.forEach((product) => {
537
- result.write(builder.build({ offer: this.getOffers(product) }));
576
+ streamOffers.write(builder.build({ offer: this.getOffer(product) }));
538
577
  });
539
- stream.pipe(result, { end: false });
578
+ streamOffers.pipe(result, { end: false });
540
579
  offers.close();
541
580
  shop.close();
542
581
  ymlCatalog.close();
@@ -558,7 +597,7 @@ class YMLFormatter {
558
597
  ]
559
598
  }));
560
599
  }
561
- getOffers(product) {
600
+ getOffer(product) {
562
601
  const result = {
563
602
  "@_id": product.variantId,
564
603
  name: product.title,
@@ -569,6 +608,7 @@ class YMLFormatter {
569
608
  cofinance_price: product.cofinancePrice,
570
609
  currencyId: product.currency,
571
610
  categoryId: product.categoryId,
611
+ vendorId: product.vendorId,
572
612
  vendor: product.vendor,
573
613
  vendorCode: product.vendorCode,
574
614
  picture: product.images,
@@ -642,7 +682,8 @@ const Formatters = {
642
682
  YMLFormatter,
643
683
  TgShopFormatter,
644
684
  ExcelFormatter,
645
- JSONFormatter
685
+ JSONFormatter,
686
+ SimpleJSONFormatter
646
687
  };
647
688
 
648
689
  var __defProp = Object.defineProperty;
@@ -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/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\";\r\n\r\nexport interface CSVStreamOptions {\r\n delimiter?: string;\r\n emptyFieldValue?: string;\r\n lineSeparator?: string;\r\n}\r\n\r\nexport class CSVStream {\r\n private readonly stream: PassThrough = new PassThrough();\r\n private readonly delimiter: string = \";\";\r\n private readonly lineSeparator: string = \"\\n\";\r\n private readonly emptyFieldValue: string = \"\";\r\n private columns = new Set<string>();\r\n\r\n constructor({ delimiter, lineSeparator, emptyFieldValue }: CSVStreamOptions) {\r\n if (delimiter !== undefined) this.delimiter = delimiter;\r\n if (lineSeparator !== undefined) this.lineSeparator = lineSeparator;\r\n if (emptyFieldValue !== undefined) this.emptyFieldValue = emptyFieldValue;\r\n }\r\n\r\n getWritableStream() {\r\n return this.stream;\r\n }\r\n\r\n setColumns(columns: Set<string>) {\r\n this.columns = columns;\r\n this.stream.write(\r\n Array.from(this.columns).join(this.delimiter) + this.lineSeparator,\r\n );\r\n }\r\n\r\n addRow(items: Record<string, any>) {\r\n this.stream.write(\r\n Array.from(this.columns)\r\n .map((key) =>\r\n items[key] === undefined ? this.emptyFieldValue : items[key] + \"\",\r\n )\r\n .join(this.delimiter) + this.lineSeparator,\r\n );\r\n }\r\n}\r\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\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class CSVFormatter implements FormatterAbstract {\r\n public formatterName = \"CSV\";\r\n public fileExtension = Extension.CSV;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, string> = {};\r\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\r\n\r\n const csvStream = new CSVStream({\r\n delimiter: \";\",\r\n emptyFieldValue: \"\",\r\n lineSeparator: \"\\n\",\r\n });\r\n const columns = new Set<string>([\r\n \"url\",\r\n \"productId\",\r\n \"parentId\",\r\n \"variantId\",\r\n \"title\",\r\n \"description\",\r\n \"vendor\",\r\n \"vendorCode\",\r\n \"category\",\r\n \"images\",\r\n \"videos\",\r\n \"price\",\r\n \"oldPrice\",\r\n \"purchasePrice\",\r\n \"currency\",\r\n \"saleDate\",\r\n \"countryOfOrigin\",\r\n \"tags\",\r\n \"codesTN\",\r\n \"params\",\r\n \"properties\",\r\n \"sizes\",\r\n \"keywords\",\r\n \"relatedProducts\",\r\n ]);\r\n products.forEach((product) => {\r\n Object.entries(product).forEach(([key, value]) => {\r\n if (value) columns.add(key);\r\n });\r\n });\r\n csvStream.setColumns(columns);\r\n products.forEach((product) => {\r\n const row: Record<string, any> = {\r\n ...product,\r\n category: mappedCategories[product.categoryId],\r\n images: product.images?.join(\",\"),\r\n videos: product.videos?.join(\",\"),\r\n tags: product.tags?.join(\",\"),\r\n codesTN: product.codesTN?.join(\", \"),\r\n params: product.params\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n properties: product.properties\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n sizes: product.sizes\r\n ?.map(({ name, value }) => `${name}=${value}`)\r\n .join(\", \"),\r\n keywords: product.keywords?.join(\",\"),\r\n relatedProducts: product.relatedProducts?.join(\",\"),\r\n };\r\n csvStream.addRow(row);\r\n });\r\n return csvStream.getWritableStream();\r\n }\r\n}\r\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 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 workbook = new stream.xlsx.WorkbookWriter({});\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 // @ts-ignore\n return workbook.stream;\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 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 workbook = new stream.xlsx.WorkbookWriter({});\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 // @ts-ignore\n return workbook.stream;\n }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\r\n\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class JSONFormatter implements FormatterAbstract {\r\n public formatterName = \"JSON\";\r\n public fileExtension = Extension.JSON;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n _?: FormatterOptions,\r\n ): Promise<Stream> {\r\n return new JsonStreamStringify({\r\n categories,\r\n brands,\r\n products,\r\n });\r\n }\r\n}\r\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 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 workbook = new stream.xlsx.WorkbookWriter({});\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 // @ts-ignore\n return workbook.stream;\n }\n}\n","import { CSVStream } from \"../streams/CSVStream\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class TildaFormatter implements FormatterAbstract {\r\n public formatterName = \"Tilda\";\r\n public fileExtension = Extension.CSV;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, string> = {};\r\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\r\n\r\n const csvStream = new CSVStream({\r\n delimiter: \";\",\r\n emptyFieldValue: \"\",\r\n lineSeparator: \"\\n\",\r\n });\r\n const columns = new Set<string>([\r\n \"SKU\",\r\n \"Brand\",\r\n \"Category\",\r\n \"Title\",\r\n \"Text\",\r\n \"Photo\",\r\n \"Price\",\r\n \"Price Old\",\r\n \"Quantity\",\r\n \"Editions\",\r\n \"External ID\",\r\n \"Parent UID\",\r\n ]);\r\n csvStream.setColumns(columns);\r\n products.forEach((product) => {\r\n const row: Record<string, string | number | undefined> = {\r\n SKU: product.vendorCode,\r\n Brand: product.vendor,\r\n Category: mappedCategories[product.categoryId],\r\n Title: product.title,\r\n Text: product.description,\r\n Photo: product.images?.join(\";\"),\r\n Price: product.price,\r\n \"Price Old\": product.oldPrice,\r\n Quantity: product.count,\r\n Editions: product.params\r\n ?.map(({ key, value }) => `${key}:${value}`)\r\n .join(\";\"),\r\n \"External ID\": product.variantId,\r\n \"Parent UID\": product.parentId,\r\n };\r\n csvStream.addRow(row);\r\n });\r\n return csvStream.getWritableStream();\r\n }\r\n}\r\n","import { XMLBuilder } from \"fast-xml-parser\";\r\nimport xml from \"xml\";\r\n\r\nimport { type Product, type Category, type Brand } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { PassThrough, type Stream } from \"stream\";\r\n\r\nexport class YMLFormatter implements FormatterAbstract {\r\n public formatterName = \"YMl\";\r\n public fileExtension = Extension.YML;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n options?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const result = new PassThrough();\r\n\r\n const builder = new XMLBuilder({\r\n ignoreAttributes: false,\r\n cdataPropName: \"__cdata\",\r\n });\r\n\r\n const ymlCatalog = xml.element({\r\n _attr: { date: new Date().toISOString().replace(/.\\d+Z/, \"\") },\r\n });\r\n const stream = xml(\r\n { yml_catalog: ymlCatalog },\r\n {\r\n stream: true,\r\n declaration: { standalone: \"yes\", encoding: \"UTF-8\" },\r\n },\r\n );\r\n\r\n const shop = xml.element();\r\n const streamShop = xml({ shop }, { stream: true });\r\n shop.push({ name: options?.shopName });\r\n shop.push({ company: options?.companyName });\r\n shop.push({ categories: this.getCategories(categories) });\r\n shop.push({ brands: this.getBrands(brands) });\r\n streamShop.pipe(result, { end: false });\r\n\r\n const offers = xml.element();\r\n const streamOffers = xml({ offers }, { stream: true });\r\n streamOffers.pipe(result, { end: false });\r\n\r\n products.forEach((product) => {\r\n result.write(builder.build({ offer: this.getOffers(product) }));\r\n });\r\n\r\n stream.pipe(result, { end: false });\r\n\r\n offers.close();\r\n shop.close();\r\n ymlCatalog.close();\r\n return result;\r\n }\r\n\r\n private getBrands(brands?: Brand[]) {\r\n return brands?.map((brand) => ({\r\n brand: [\r\n { _attr: { id: brand.id, url: brand.coverURL ?? \"\" } },\r\n brand.name,\r\n ],\r\n }));\r\n }\r\n\r\n private getCategories(categories?: Category[]) {\r\n return categories?.map((cat) => ({\r\n category: [\r\n { _attr: { id: cat.id, parentId: cat.parentId ?? \"\" } },\r\n cat.name,\r\n ],\r\n }));\r\n }\r\n\r\n private getOffers(product: Product): any {\r\n const result = {\r\n \"@_id\": product.variantId,\r\n name: product.title,\r\n price: product.price,\r\n oldprice: product.oldPrice,\r\n purchase_price: product.purchasePrice,\r\n additional_expenses: product.additionalExpenses,\r\n cofinance_price: product.cofinancePrice,\r\n currencyId: product.currency,\r\n categoryId: product.categoryId,\r\n vendor: product.vendor,\r\n vendorCode: product.vendorCode,\r\n picture: product.images,\r\n video: product.videos,\r\n available: product.available,\r\n series: product.seriesName,\r\n \"min-quantity\": product.minQuantity,\r\n \"step-quantity\": product.stepQuantity,\r\n size: product.sizes?.map((size) => ({\r\n \"#text\": size.value,\r\n \"@_name\": size.name,\r\n \"@_delimiter\": size.delimiter,\r\n })),\r\n keyword: product.keywords,\r\n saleDate: product.saleDate,\r\n property: product.properties?.map((property) => ({\r\n \"#text\": property.value,\r\n \"@_name\": property.key,\r\n })),\r\n param: product.params?.map((param) => ({\r\n \"#text\": param.value,\r\n \"@_name\": param.key,\r\n })),\r\n description: {\r\n __cdata: product.description,\r\n },\r\n country_of_origin: product.countryOfOrigin,\r\n barcode: product.barcode,\r\n vat: product.vat,\r\n count: product.count,\r\n \"set-ids\": product.tags?.join(\", \"),\r\n adult: product.adult,\r\n downloadable: product.downloadable,\r\n \"period-of-validity-days\": product.validityPeriod,\r\n \"comment-validity-days\": product.validityComment,\r\n \"service-life-days\": product.serviceLifePeriod,\r\n \"comment-life-days\": product.serviceLifeComment,\r\n \"warranty-days\": product.warrantyPeriod,\r\n \"comment-warranty\": product.warrantyComment,\r\n manufacturer_warranty: product.manufacturerWarranty,\r\n certificate: product.certificate,\r\n url: product.url,\r\n weight: product.weight,\r\n dimensions: product.dimensions,\r\n boxCount: product.boxCount,\r\n disabled: product.disabled,\r\n age: product.age != null && {\r\n \"@_unit\": product.age.unit,\r\n \"#text\": product.age.value,\r\n },\r\n \"tn-ved-codes\": product.codesTN?.length != null && {\r\n \"tn-ved-code\": product.codesTN,\r\n },\r\n relatedProduct: product.relatedProducts,\r\n gender: product.gender,\r\n };\r\n if (product.parentId !== undefined) {\r\n return {\r\n ...result,\r\n \"@_group_id\": product.parentId,\r\n };\r\n }\r\n return result;\r\n }\r\n}\r\n","import { CSVFormatter } from \"./CSV.formatter\";\nimport { ExcelFormatter } from \"./Excel.formatter\";\nimport { InsalesFormatter } from \"./Insales.formatter\";\nimport { JSONFormatter } from \"./JSON.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};\n","import {\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n Formatters,\r\n} from \"../formatter\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport { type Exporter, type Transformer } from \"./exporter.types\";\r\n\r\nimport fs from \"fs\";\r\n\r\nexport class GoodsExporter {\r\n private formatter: FormatterAbstract = new Formatters.YMLFormatter();\r\n private exporter: Exporter = () => {\r\n return fs.createWriteStream(\r\n `${this.formatter.formatterName}.output.${this.formatter.fileExtension}`,\r\n );\r\n };\r\n\r\n private transformers = new Array<Transformer>();\r\n\r\n public setTransformers(transformers: Transformer[]): void {\r\n this.transformers = transformers;\r\n }\r\n\r\n public setFormatter(formatter: FormatterAbstract): void {\r\n this.formatter = formatter;\r\n }\r\n\r\n public setExporter(exporter: Exporter): void {\r\n this.exporter = exporter;\r\n }\r\n\r\n async export(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n option?: FormatterOptions,\r\n ): Promise<void> {\r\n let transformedProducts: Product[] = products;\r\n\r\n for (const transformer of this.transformers)\r\n transformedProducts = await transformer(transformedProducts);\r\n\r\n const stream = await this.formatter.format(\r\n transformedProducts,\r\n categories,\r\n brands,\r\n option,\r\n );\r\n stream.pipe(this.exporter());\r\n }\r\n}\r\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 ** &lt;h&gt;, &lt;h1&gt;, &lt;h2&gt; и так далее — для заголовков;\n ** &lt;br&gt; и &lt;p&gt; — для переноса строки;\n ** &lt;ol&gt; — для нумерованного списка;\n ** &lt;ul&gt; — для маркированного списка;\n ** &lt;li&gt; — для создания элементов списка (должен находиться внутри &lt;ol&gt; или &lt;ul&gt;);\n ** &lt;div&gt; — поддерживается, но не влияет на отображение текста.\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 * Указывайте конкретные категории — например, набор ножей лучше отнести к категории Столовые приборы, а не просто Посуда.\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\";\r\n\r\nexport interface CSVStreamOptions {\r\n delimiter?: string;\r\n emptyFieldValue?: string;\r\n lineSeparator?: string;\r\n}\r\n\r\nexport class CSVStream {\r\n private readonly stream: PassThrough = new PassThrough();\r\n private readonly delimiter: string = \";\";\r\n private readonly lineSeparator: string = \"\\n\";\r\n private readonly emptyFieldValue: string = \"\";\r\n private columns = new Set<string>();\r\n\r\n constructor({ delimiter, lineSeparator, emptyFieldValue }: CSVStreamOptions) {\r\n if (delimiter !== undefined) this.delimiter = delimiter;\r\n if (lineSeparator !== undefined) this.lineSeparator = lineSeparator;\r\n if (emptyFieldValue !== undefined) this.emptyFieldValue = emptyFieldValue;\r\n }\r\n\r\n getWritableStream() {\r\n return this.stream;\r\n }\r\n\r\n setColumns(columns: Set<string>) {\r\n this.columns = columns;\r\n this.stream.write(\r\n Array.from(this.columns).join(this.delimiter) + this.lineSeparator,\r\n );\r\n }\r\n\r\n addRow(items: Record<string, any>) {\r\n this.stream.write(\r\n Array.from(this.columns)\r\n .map((key) =>\r\n items[key] === undefined ? this.emptyFieldValue : items[key] + \"\",\r\n )\r\n .join(this.delimiter) + this.lineSeparator,\r\n );\r\n }\r\n}\r\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\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class CSVFormatter implements FormatterAbstract {\r\n public formatterName = \"CSV\";\r\n public fileExtension = Extension.CSV;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, string> = {};\r\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\r\n\r\n const csvStream = new CSVStream({\r\n delimiter: \";\",\r\n emptyFieldValue: \"\",\r\n lineSeparator: \"\\n\",\r\n });\r\n const columns = new Set<string>([\r\n \"url\",\r\n \"productId\",\r\n \"parentId\",\r\n \"variantId\",\r\n \"title\",\r\n \"description\",\r\n \"vendor\",\r\n \"vendorCode\",\r\n \"category\",\r\n \"images\",\r\n \"videos\",\r\n \"price\",\r\n \"oldPrice\",\r\n \"purchasePrice\",\r\n \"currency\",\r\n \"saleDate\",\r\n \"countryOfOrigin\",\r\n \"tags\",\r\n \"codesTN\",\r\n \"params\",\r\n \"properties\",\r\n \"sizes\",\r\n \"keywords\",\r\n \"relatedProducts\",\r\n ]);\r\n products.forEach((product) => {\r\n Object.entries(product).forEach(([key, value]) => {\r\n if (value) columns.add(key);\r\n });\r\n });\r\n csvStream.setColumns(columns);\r\n products.forEach((product) => {\r\n const row: Record<string, any> = {\r\n ...product,\r\n category: mappedCategories[product.categoryId],\r\n images: product.images?.join(\",\"),\r\n videos: product.videos?.join(\",\"),\r\n tags: product.tags?.join(\",\"),\r\n codesTN: product.codesTN?.join(\", \"),\r\n params: product.params\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n properties: product.properties\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n sizes: product.sizes\r\n ?.map(({ name, value }) => `${name}=${value}`)\r\n .join(\", \"),\r\n keywords: product.keywords?.join(\",\"),\r\n relatedProducts: product.relatedProducts?.join(\",\"),\r\n };\r\n csvStream.addRow(row);\r\n });\r\n return csvStream.getWritableStream();\r\n }\r\n}\r\n","import pkg from \"exceljs\";\r\n\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\nconst { stream } = pkg;\r\n\r\nexport class ExcelFormatter implements FormatterAbstract {\r\n public formatterName = \"Excel\";\r\n public fileExtension = Extension.XLSX;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, string> = {};\r\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\r\n const columns = new Set<string>([\r\n \"url\",\r\n \"productId\",\r\n \"parentId\",\r\n \"variantId\",\r\n \"title\",\r\n \"description\",\r\n \"vendor\",\r\n \"vendorCode\",\r\n \"category\",\r\n \"images\",\r\n \"videos\",\r\n \"price\",\r\n \"oldPrice\",\r\n \"purchasePrice\",\r\n \"currency\",\r\n \"saleDate\",\r\n \"countryOfOrigin\",\r\n \"tags\",\r\n \"codesTN\",\r\n \"params\",\r\n \"properties\",\r\n \"sizes\",\r\n \"keywords\",\r\n \"relatedProducts\",\r\n ]);\r\n products.forEach((product) => {\r\n Object.entries(product).forEach(([key, value]) => {\r\n if (value) columns.add(key);\r\n });\r\n });\r\n\r\n const workbook = new stream.xlsx.WorkbookWriter({});\r\n const worksheet = workbook.addWorksheet(\"products\");\r\n worksheet.columns = Array.from(columns).map((column) => ({\r\n key: column,\r\n header: column,\r\n }));\r\n\r\n products.forEach((product) => {\r\n const row = {\r\n ...product,\r\n category: mappedCategories[product.categoryId],\r\n images: product.images?.join(\",\"),\r\n videos: product.videos?.join(\",\"),\r\n tags: product.tags?.join(\",\"),\r\n keywords: product.keywords?.join(\",\"),\r\n relatedProducts: product.relatedProducts?.join(\",\"),\r\n codesTN: product.codesTN?.join(\", \"),\r\n params: product.params\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n properties: product.properties\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n sizes: product.sizes\r\n ?.map(({ name, value }) => `${name}=${value}`)\r\n .join(\", \"),\r\n };\r\n worksheet.addRow(row).commit();\r\n });\r\n worksheet.commit();\r\n await workbook.commit();\r\n // @ts-ignore\r\n return workbook.stream;\r\n }\r\n}\r\n","import pkg from \"exceljs\";\r\n\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\nconst { stream } = pkg;\r\n\r\nexport class InsalesFormatter implements FormatterAbstract {\r\n public formatterName = \"Insales\";\r\n public fileExtension = Extension.XLSX;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, Category> = {};\r\n categories?.forEach(\r\n (category) => (mappedCategories[category.id] = category),\r\n );\r\n\r\n const getParams = (product: Product): Record<string, string> => {\r\n const properties: Record<string, string> = {};\r\n\r\n product.params?.forEach(\r\n (p) => (properties[`Свойство: ${p.key}`] = p.value),\r\n );\r\n\r\n return properties;\r\n };\r\n const getProperties = (product: Product): Record<string, string> => {\r\n const properties: Record<string, string> = {};\r\n\r\n product.properties?.forEach(\r\n (p) => (properties[`Параметр: ${p.key}`] = p.value),\r\n );\r\n\r\n return properties;\r\n };\r\n\r\n const getCategories = (product: Product) => {\r\n const categories: Record<string, string> = {};\r\n const categoryList = new Array<string>();\r\n\r\n function addCategory(categoryId: number | undefined) {\r\n if (categoryId === undefined) return;\r\n\r\n const category = mappedCategories[categoryId];\r\n if (category) {\r\n categoryList.push(category.name);\r\n addCategory(category.parentId);\r\n }\r\n }\r\n\r\n addCategory(product.categoryId);\r\n\r\n categoryList.forEach((name, i) => {\r\n const index = categoryList.length - 1 - i;\r\n const key = index === 0 ? \"Корневая\" : `Подкатегория ${index}`;\r\n categories[key] = name;\r\n });\r\n\r\n return categories;\r\n };\r\n const workbook = new stream.xlsx.WorkbookWriter({});\r\n const worksheet = workbook.addWorksheet(\"products\");\r\n const columns = new Set<string>([\r\n \"Внешний ID\",\r\n \"Ссылка на товар\",\r\n \"Артикул\",\r\n \"Корневая\",\r\n \"Подкатегория 1\",\r\n \"Подкатегория 2\",\r\n \"Название товара или услуги\",\r\n \"Старая цена\",\r\n \"Цена продажи\",\r\n \"Cебестоимость\",\r\n \"Категории\",\r\n \"Остаток\",\r\n \"Штрих-код\",\r\n \"Краткое описание\",\r\n \"Полное описание\",\r\n \"Габариты варианта\",\r\n \"Вес\",\r\n \"Размещение на сайте\",\r\n \"НДС\",\r\n \"Валюта склада\",\r\n \"Изображения варианта\",\r\n \"Изображения\",\r\n \"Ссылка на видео\",\r\n \"Параметры\",\r\n \"Свойства\",\r\n \"Параметр: Бренд\",\r\n \"Параметр: Коллекция\",\r\n \"Параметр: Пол\",\r\n \"Параметр: Дата выхода\",\r\n \"Размерная сетка\",\r\n \"Связанные товары\",\r\n \"Ключевые слова\",\r\n ]);\r\n products.forEach((product) => {\r\n Object.keys({\r\n ...getParams(product),\r\n ...getProperties(product),\r\n }).forEach((key) => {\r\n columns.add(key);\r\n });\r\n });\r\n worksheet.columns = Array.from(columns).map((column) => ({\r\n header: column,\r\n key: column,\r\n }));\r\n products.forEach((product) => {\r\n const row = {\r\n \"Внешний ID\": product.productId,\r\n \"Ссылка на товар\": product.url,\r\n Артикул: product.vendorCode,\r\n \"Название товара или услуги\": product.title,\r\n \"Старая цена\": product.oldPrice,\r\n \"Цена продажи\": product.price,\r\n Cебестоимость: product.purchasePrice,\r\n ...getCategories(product),\r\n Остаток: product.count,\r\n \"Штрих-код\": product.barcode,\r\n \"Краткое описание\": undefined,\r\n \"Полное описание\": product.description,\r\n \"Габариты варианта\": product.dimensions,\r\n Вес: product.weight,\r\n \"Размещение на сайте\": product.available,\r\n НДС: product.vat.toString(),\r\n \"Валюта склада\": product.currency.toString(),\r\n \"Изображения варианта\":\r\n product.parentId === undefined\r\n ? product.images?.join(\" \")\r\n : undefined,\r\n Изображения:\r\n product.parentId === undefined\r\n ? undefined\r\n : product.images?.join(\" \"),\r\n \"Ссылка на видео\": product.videos ? product.videos[0] : undefined,\r\n ...getParams(product),\r\n ...getProperties(product),\r\n \"Параметр: Бренд\": product.vendor,\r\n \"Параметр: Коллекция\": product.seriesName,\r\n \"Параметр: Пол\": product.gender,\r\n \"Параметр: Дата выхода\": product.saleDate,\r\n \"Размерная сетка\": JSON.stringify(product.sizes),\r\n \"Связанные товары\": product.relatedProducts?.join(\",\"),\r\n \"Ключевые слова\": product.keywords?.join(\",\"),\r\n };\r\n worksheet.addRow(row).commit();\r\n });\r\n worksheet.commit();\r\n await workbook.commit();\r\n // @ts-ignore\r\n return workbook.stream;\r\n }\r\n}\r\n","import { JsonStreamStringify } from \"json-stream-stringify\";\r\n\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class JSONFormatter implements FormatterAbstract {\r\n public formatterName = \"JSON\";\r\n public fileExtension = Extension.JSON;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n _?: FormatterOptions,\r\n ): Promise<Stream> {\r\n return new JsonStreamStringify({\r\n categories,\r\n brands,\r\n products,\r\n });\r\n }\r\n}\r\n","import { JsonStreamStringify } from \"json-stream-stringify\";\r\n\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\ninterface SimpleProduct extends Product {\r\n children: Product[];\r\n}\r\n\r\nexport class SimpleJSONFormatter implements FormatterAbstract {\r\n public formatterName = \"JSON\";\r\n public fileExtension = Extension.JSON;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n _?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const groupedProduct = new Map<number, SimpleProduct>();\r\n products.forEach((product) => {\r\n if (product.parentId !== undefined) return;\r\n groupedProduct.set(product.variantId, {\r\n ...product,\r\n children: [],\r\n });\r\n });\r\n products.forEach((product) => {\r\n if (product.parentId === undefined) return;\r\n const parent = groupedProduct.get(product.parentId);\r\n if (!parent) return;\r\n parent.children.push(product);\r\n });\r\n return new JsonStreamStringify({\r\n categories,\r\n brands,\r\n products: Array.from(groupedProduct.values()),\r\n });\r\n }\r\n}\r\n","import pkg from \"exceljs\";\r\n\r\nimport { type Brand, type Category, type IParam, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\nconst { stream } = pkg;\r\n\r\nexport class TgShopFormatter implements FormatterAbstract {\r\n public formatterName = \"TgShop\";\r\n public fileExtension = Extension.XLSX;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const getParameter = (product: Product, key: string): IParam | undefined =>\r\n product.params?.find((value) => value.key === key);\r\n\r\n const convertProduct = (product: Product) => ({\r\n \"category id\": product.categoryId,\r\n \"group id\": product.parentId,\r\n \"id product\": product.variantId,\r\n \"name product\": product.title,\r\n price: product.price,\r\n picture: product.images?.join(\", \"),\r\n vendorCode: product.vendorCode,\r\n oldprice: product.oldPrice,\r\n description: product.description,\r\n shortDescription: \"\",\r\n quantityInStock: product.count,\r\n color: getParameter(product, \"color\")?.value,\r\n size: getParameter(product, \"size\")?.value,\r\n priority: undefined,\r\n });\r\n const workbook = new stream.xlsx.WorkbookWriter({});\r\n const categoryWorksheet = workbook.addWorksheet(\"categories\");\r\n const productsWorksheet = workbook.addWorksheet(\"offers\");\r\n categoryWorksheet.columns = [\r\n {\r\n header: \"id\",\r\n key: \"id\",\r\n },\r\n {\r\n header: \"parentId\",\r\n key: \"parentId\",\r\n },\r\n {\r\n header: \"name\",\r\n key: \"name\",\r\n },\r\n ];\r\n const columns = [\r\n \"category id\",\r\n \"group id\",\r\n \"id product\",\r\n \"name product\",\r\n \"price\",\r\n \"picture\",\r\n \"vendorCode\",\r\n \"oldprice\",\r\n \"description\",\r\n \"shortDescription\",\r\n \"quantityInStock\",\r\n \"color\",\r\n \"size\",\r\n \"priority\",\r\n ];\r\n\r\n productsWorksheet.columns = columns.map((column) => ({\r\n header: column,\r\n key: column,\r\n }));\r\n\r\n categories?.forEach((category) => {\r\n categoryWorksheet.addRow(category).commit();\r\n });\r\n\r\n products.forEach((product) => {\r\n productsWorksheet.addRow(convertProduct(product)).commit();\r\n });\r\n categoryWorksheet.commit();\r\n productsWorksheet.commit();\r\n\r\n await workbook.commit();\r\n // @ts-ignore\r\n return workbook.stream;\r\n }\r\n}\r\n","import { CSVStream } from \"../streams/CSVStream\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class TildaFormatter implements FormatterAbstract {\r\n public formatterName = \"Tilda\";\r\n public fileExtension = Extension.CSV;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, string> = {};\r\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\r\n\r\n const csvStream = new CSVStream({\r\n delimiter: \";\",\r\n emptyFieldValue: \"\",\r\n lineSeparator: \"\\n\",\r\n });\r\n const columns = new Set<string>([\r\n \"SKU\",\r\n \"Brand\",\r\n \"Category\",\r\n \"Title\",\r\n \"Text\",\r\n \"Photo\",\r\n \"Price\",\r\n \"Price Old\",\r\n \"Quantity\",\r\n \"Editions\",\r\n \"External ID\",\r\n \"Parent UID\",\r\n ]);\r\n csvStream.setColumns(columns);\r\n products.forEach((product) => {\r\n const row: Record<string, string | number | undefined> = {\r\n SKU: product.vendorCode,\r\n Brand: product.vendor,\r\n Category: mappedCategories[product.categoryId],\r\n Title: product.title,\r\n Text: product.description,\r\n Photo: product.images?.join(\";\"),\r\n Price: product.price,\r\n \"Price Old\": product.oldPrice,\r\n Quantity: product.count,\r\n Editions: product.params\r\n ?.map(({ key, value }) => `${key}:${value}`)\r\n .join(\";\"),\r\n \"External ID\": product.variantId,\r\n \"Parent UID\": product.parentId,\r\n };\r\n csvStream.addRow(row);\r\n });\r\n return csvStream.getWritableStream();\r\n }\r\n}\r\n","import { XMLBuilder } from \"fast-xml-parser\";\r\nimport xml from \"xml\";\r\n\r\nimport { type Product, type Category, type Brand } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { PassThrough, type Stream } from \"stream\";\r\n\r\nexport class YMLFormatter implements FormatterAbstract {\r\n public formatterName = \"YMl\";\r\n public fileExtension = Extension.YML;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n options?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const result = new PassThrough();\r\n\r\n const builder = new XMLBuilder({\r\n ignoreAttributes: false,\r\n cdataPropName: \"__cdata\",\r\n });\r\n\r\n const ymlCatalog = xml.element({\r\n _attr: { date: new Date().toISOString().replace(/.\\d+Z/, \"\") },\r\n });\r\n const stream = xml(\r\n { yml_catalog: ymlCatalog },\r\n {\r\n stream: true,\r\n declaration: { standalone: \"yes\", encoding: \"UTF-8\" },\r\n },\r\n );\r\n stream.pipe(result, { end: false });\r\n\r\n const shop = xml.element();\r\n const streamShop = xml({ shop }, { stream: true });\r\n shop.push({ name: options?.shopName });\r\n shop.push({ company: options?.companyName });\r\n shop.push({ categories: this.getCategories(categories) });\r\n shop.push({ brands: this.getBrands(brands) });\r\n streamShop.pipe(result, { end: false });\r\n\r\n const offers = xml.element();\r\n const streamOffersTag = xml({ offers }, { stream: true });\r\n streamOffersTag.pipe(result, { end: false });\r\n\r\n const streamOffers = new PassThrough();\r\n\r\n products.forEach((product) => {\r\n streamOffers.write(builder.build({ offer: this.getOffer(product) }));\r\n });\r\n streamOffers.pipe(result, { end: false });\r\n\r\n offers.close();\r\n shop.close();\r\n ymlCatalog.close();\r\n return result;\r\n }\r\n\r\n private getBrands(brands?: Brand[]) {\r\n return brands?.map((brand) => ({\r\n brand: [\r\n { _attr: { id: brand.id, url: brand.coverURL ?? \"\" } },\r\n brand.name,\r\n ],\r\n }));\r\n }\r\n\r\n private getCategories(categories?: Category[]) {\r\n return categories?.map((cat) => ({\r\n category: [\r\n { _attr: { id: cat.id, parentId: cat.parentId ?? \"\" } },\r\n cat.name,\r\n ],\r\n }));\r\n }\r\n\r\n private getOffer(product: Product): any {\r\n const result = {\r\n \"@_id\": product.variantId,\r\n name: product.title,\r\n price: product.price,\r\n oldprice: product.oldPrice,\r\n purchase_price: product.purchasePrice,\r\n additional_expenses: product.additionalExpenses,\r\n cofinance_price: product.cofinancePrice,\r\n currencyId: product.currency,\r\n categoryId: product.categoryId,\r\n vendorId: product.vendorId,\r\n vendor: product.vendor,\r\n vendorCode: product.vendorCode,\r\n picture: product.images,\r\n video: product.videos,\r\n available: product.available,\r\n series: product.seriesName,\r\n \"min-quantity\": product.minQuantity,\r\n \"step-quantity\": product.stepQuantity,\r\n size: product.sizes?.map((size) => ({\r\n \"#text\": size.value,\r\n \"@_name\": size.name,\r\n \"@_delimiter\": size.delimiter,\r\n })),\r\n keyword: product.keywords,\r\n saleDate: product.saleDate,\r\n property: product.properties?.map((property) => ({\r\n \"#text\": property.value,\r\n \"@_name\": property.key,\r\n })),\r\n param: product.params?.map((param) => ({\r\n \"#text\": param.value,\r\n \"@_name\": param.key,\r\n })),\r\n description: {\r\n __cdata: product.description,\r\n },\r\n country_of_origin: product.countryOfOrigin,\r\n barcode: product.barcode,\r\n vat: product.vat,\r\n count: product.count,\r\n \"set-ids\": product.tags?.join(\", \"),\r\n adult: product.adult,\r\n downloadable: product.downloadable,\r\n \"period-of-validity-days\": product.validityPeriod,\r\n \"comment-validity-days\": product.validityComment,\r\n \"service-life-days\": product.serviceLifePeriod,\r\n \"comment-life-days\": product.serviceLifeComment,\r\n \"warranty-days\": product.warrantyPeriod,\r\n \"comment-warranty\": product.warrantyComment,\r\n manufacturer_warranty: product.manufacturerWarranty,\r\n certificate: product.certificate,\r\n url: product.url,\r\n weight: product.weight,\r\n dimensions: product.dimensions,\r\n boxCount: product.boxCount,\r\n disabled: product.disabled,\r\n age: product.age != null && {\r\n \"@_unit\": product.age.unit,\r\n \"#text\": product.age.value,\r\n },\r\n \"tn-ved-codes\": product.codesTN?.length != null && {\r\n \"tn-ved-code\": product.codesTN,\r\n },\r\n relatedProduct: product.relatedProducts,\r\n gender: product.gender,\r\n };\r\n if (product.parentId !== undefined) {\r\n return {\r\n ...result,\r\n \"@_group_id\": product.parentId,\r\n };\r\n }\r\n return result;\r\n }\r\n}\r\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 {\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n Formatters,\r\n} from \"../formatter\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport { type Exporter, type Transformer } from \"./exporter.types\";\r\n\r\nimport fs from \"fs\";\r\n\r\nexport class GoodsExporter {\r\n private formatter: FormatterAbstract = new Formatters.YMLFormatter();\r\n private exporter: Exporter = () => {\r\n return fs.createWriteStream(\r\n `${this.formatter.formatterName}.output.${this.formatter.fileExtension}`,\r\n );\r\n };\r\n\r\n private transformers = new Array<Transformer>();\r\n\r\n public setTransformers(transformers: Transformer[]): void {\r\n this.transformers = transformers;\r\n }\r\n\r\n public setFormatter(formatter: FormatterAbstract): void {\r\n this.formatter = formatter;\r\n }\r\n\r\n public setExporter(exporter: Exporter): void {\r\n this.exporter = exporter;\r\n }\r\n\r\n async export(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n option?: FormatterOptions,\r\n ): Promise<void> {\r\n let transformedProducts: Product[] = products;\r\n\r\n for (const transformer of this.transformers)\r\n transformedProducts = await transformer(transformedProducts);\r\n\r\n const stream = await this.formatter.format(\r\n transformedProducts,\r\n categories,\r\n brands,\r\n option,\r\n );\r\n stream.pipe(this.exporter());\r\n }\r\n}\r\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 ** &lt;h&gt;, &lt;h1&gt;, &lt;h2&gt; и так далее — для заголовков;\n ** &lt;br&gt; и &lt;p&gt; — для переноса строки;\n ** &lt;ol&gt; — для нумерованного списка;\n ** &lt;ul&gt; — для маркированного списка;\n ** &lt;li&gt; — для создания элементов списка (должен находиться внутри &lt;ol&gt; или &lt;ul&gt;);\n ** &lt;div&gt; — поддерживается, но не влияет на отображение текста.\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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"}
@@ -5,19 +5,19 @@ import { XMLBuilder } from 'fast-xml-parser';
5
5
  import xml from 'xml';
6
6
  import fs from 'fs';
7
7
 
8
- var __defProp$8 = Object.defineProperty;
9
- var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
- var __publicField$8 = (obj, key, value) => {
11
- __defNormalProp$8(obj, typeof key !== "symbol" ? key + "" : key, value);
8
+ var __defProp$9 = Object.defineProperty;
9
+ var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __publicField$9 = (obj, key, value) => {
11
+ __defNormalProp$9(obj, typeof key !== "symbol" ? key + "" : key, value);
12
12
  return value;
13
13
  };
14
14
  class CSVStream {
15
15
  constructor({ delimiter, lineSeparator, emptyFieldValue }) {
16
- __publicField$8(this, "stream", new PassThrough());
17
- __publicField$8(this, "delimiter", ";");
18
- __publicField$8(this, "lineSeparator", "\n");
19
- __publicField$8(this, "emptyFieldValue", "");
20
- __publicField$8(this, "columns", /* @__PURE__ */ new Set());
16
+ __publicField$9(this, "stream", new PassThrough());
17
+ __publicField$9(this, "delimiter", ";");
18
+ __publicField$9(this, "lineSeparator", "\n");
19
+ __publicField$9(this, "emptyFieldValue", "");
20
+ __publicField$9(this, "columns", /* @__PURE__ */ new Set());
21
21
  if (delimiter !== void 0)
22
22
  this.delimiter = delimiter;
23
23
  if (lineSeparator !== void 0)
@@ -53,16 +53,16 @@ var Extension = /* @__PURE__ */ ((Extension2) => {
53
53
  return Extension2;
54
54
  })(Extension || {});
55
55
 
56
- var __defProp$7 = Object.defineProperty;
57
- var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
58
- var __publicField$7 = (obj, key, value) => {
59
- __defNormalProp$7(obj, typeof key !== "symbol" ? key + "" : key, value);
56
+ var __defProp$8 = Object.defineProperty;
57
+ var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
58
+ var __publicField$8 = (obj, key, value) => {
59
+ __defNormalProp$8(obj, typeof key !== "symbol" ? key + "" : key, value);
60
60
  return value;
61
61
  };
62
62
  class CSVFormatter {
63
63
  constructor() {
64
- __publicField$7(this, "formatterName", "CSV");
65
- __publicField$7(this, "fileExtension", Extension.CSV);
64
+ __publicField$8(this, "formatterName", "CSV");
65
+ __publicField$8(this, "fileExtension", Extension.CSV);
66
66
  }
67
67
  async format(products, categories, _, __) {
68
68
  const mappedCategories = {};
@@ -125,17 +125,17 @@ class CSVFormatter {
125
125
  }
126
126
  }
127
127
 
128
- var __defProp$6 = Object.defineProperty;
129
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
130
- var __publicField$6 = (obj, key, value) => {
131
- __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
128
+ var __defProp$7 = Object.defineProperty;
129
+ var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
130
+ var __publicField$7 = (obj, key, value) => {
131
+ __defNormalProp$7(obj, typeof key !== "symbol" ? key + "" : key, value);
132
132
  return value;
133
133
  };
134
134
  const { stream: stream$2 } = pkg;
135
135
  class ExcelFormatter {
136
136
  constructor() {
137
- __publicField$6(this, "formatterName", "Excel");
138
- __publicField$6(this, "fileExtension", Extension.XLSX);
137
+ __publicField$7(this, "formatterName", "Excel");
138
+ __publicField$7(this, "fileExtension", Extension.XLSX);
139
139
  }
140
140
  async format(products, categories, _, __) {
141
141
  const mappedCategories = {};
@@ -200,17 +200,17 @@ class ExcelFormatter {
200
200
  }
201
201
  }
202
202
 
203
- var __defProp$5 = Object.defineProperty;
204
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
205
- var __publicField$5 = (obj, key, value) => {
206
- __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
203
+ var __defProp$6 = Object.defineProperty;
204
+ var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
205
+ var __publicField$6 = (obj, key, value) => {
206
+ __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
207
207
  return value;
208
208
  };
209
209
  const { stream: stream$1 } = pkg;
210
210
  class InsalesFormatter {
211
211
  constructor() {
212
- __publicField$5(this, "formatterName", "Insales");
213
- __publicField$5(this, "fileExtension", Extension.XLSX);
212
+ __publicField$6(this, "formatterName", "Insales");
213
+ __publicField$6(this, "fileExtension", Extension.XLSX);
214
214
  }
215
215
  async format(products, categories, _, __) {
216
216
  const mappedCategories = {};
@@ -339,22 +339,59 @@ class InsalesFormatter {
339
339
  }
340
340
  }
341
341
 
342
+ var __defProp$5 = Object.defineProperty;
343
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
344
+ var __publicField$5 = (obj, key, value) => {
345
+ __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
346
+ return value;
347
+ };
348
+ class JSONFormatter {
349
+ constructor() {
350
+ __publicField$5(this, "formatterName", "JSON");
351
+ __publicField$5(this, "fileExtension", Extension.JSON);
352
+ }
353
+ async format(products, categories, brands, _) {
354
+ return new JsonStreamStringify({
355
+ categories,
356
+ brands,
357
+ products
358
+ });
359
+ }
360
+ }
361
+
342
362
  var __defProp$4 = Object.defineProperty;
343
363
  var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
344
364
  var __publicField$4 = (obj, key, value) => {
345
365
  __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
346
366
  return value;
347
367
  };
348
- class JSONFormatter {
368
+ class SimpleJSONFormatter {
349
369
  constructor() {
350
370
  __publicField$4(this, "formatterName", "JSON");
351
371
  __publicField$4(this, "fileExtension", Extension.JSON);
352
372
  }
353
373
  async format(products, categories, brands, _) {
374
+ const groupedProduct = /* @__PURE__ */ new Map();
375
+ products.forEach((product) => {
376
+ if (product.parentId !== void 0)
377
+ return;
378
+ groupedProduct.set(product.variantId, {
379
+ ...product,
380
+ children: []
381
+ });
382
+ });
383
+ products.forEach((product) => {
384
+ if (product.parentId === void 0)
385
+ return;
386
+ const parent = groupedProduct.get(product.parentId);
387
+ if (!parent)
388
+ return;
389
+ parent.children.push(product);
390
+ });
354
391
  return new JsonStreamStringify({
355
392
  categories,
356
393
  brands,
357
- products
394
+ products: Array.from(groupedProduct.values())
358
395
  });
359
396
  }
360
397
  }
@@ -521,6 +558,7 @@ class YMLFormatter {
521
558
  declaration: { standalone: "yes", encoding: "UTF-8" }
522
559
  }
523
560
  );
561
+ stream.pipe(result, { end: false });
524
562
  const shop = xml.element();
525
563
  const streamShop = xml({ shop }, { stream: true });
526
564
  shop.push({ name: options?.shopName });
@@ -529,12 +567,13 @@ class YMLFormatter {
529
567
  shop.push({ brands: this.getBrands(brands) });
530
568
  streamShop.pipe(result, { end: false });
531
569
  const offers = xml.element();
532
- const streamOffers = xml({ offers }, { stream: true });
533
- streamOffers.pipe(result, { end: false });
570
+ const streamOffersTag = xml({ offers }, { stream: true });
571
+ streamOffersTag.pipe(result, { end: false });
572
+ const streamOffers = new PassThrough();
534
573
  products.forEach((product) => {
535
- result.write(builder.build({ offer: this.getOffers(product) }));
574
+ streamOffers.write(builder.build({ offer: this.getOffer(product) }));
536
575
  });
537
- stream.pipe(result, { end: false });
576
+ streamOffers.pipe(result, { end: false });
538
577
  offers.close();
539
578
  shop.close();
540
579
  ymlCatalog.close();
@@ -556,7 +595,7 @@ class YMLFormatter {
556
595
  ]
557
596
  }));
558
597
  }
559
- getOffers(product) {
598
+ getOffer(product) {
560
599
  const result = {
561
600
  "@_id": product.variantId,
562
601
  name: product.title,
@@ -567,6 +606,7 @@ class YMLFormatter {
567
606
  cofinance_price: product.cofinancePrice,
568
607
  currencyId: product.currency,
569
608
  categoryId: product.categoryId,
609
+ vendorId: product.vendorId,
570
610
  vendor: product.vendor,
571
611
  vendorCode: product.vendorCode,
572
612
  picture: product.images,
@@ -640,7 +680,8 @@ const Formatters = {
640
680
  YMLFormatter,
641
681
  TgShopFormatter,
642
682
  ExcelFormatter,
643
- JSONFormatter
683
+ JSONFormatter,
684
+ SimpleJSONFormatter
644
685
  };
645
686
 
646
687
  var __defProp = Object.defineProperty;
@@ -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/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\";\r\n\r\nexport interface CSVStreamOptions {\r\n delimiter?: string;\r\n emptyFieldValue?: string;\r\n lineSeparator?: string;\r\n}\r\n\r\nexport class CSVStream {\r\n private readonly stream: PassThrough = new PassThrough();\r\n private readonly delimiter: string = \";\";\r\n private readonly lineSeparator: string = \"\\n\";\r\n private readonly emptyFieldValue: string = \"\";\r\n private columns = new Set<string>();\r\n\r\n constructor({ delimiter, lineSeparator, emptyFieldValue }: CSVStreamOptions) {\r\n if (delimiter !== undefined) this.delimiter = delimiter;\r\n if (lineSeparator !== undefined) this.lineSeparator = lineSeparator;\r\n if (emptyFieldValue !== undefined) this.emptyFieldValue = emptyFieldValue;\r\n }\r\n\r\n getWritableStream() {\r\n return this.stream;\r\n }\r\n\r\n setColumns(columns: Set<string>) {\r\n this.columns = columns;\r\n this.stream.write(\r\n Array.from(this.columns).join(this.delimiter) + this.lineSeparator,\r\n );\r\n }\r\n\r\n addRow(items: Record<string, any>) {\r\n this.stream.write(\r\n Array.from(this.columns)\r\n .map((key) =>\r\n items[key] === undefined ? this.emptyFieldValue : items[key] + \"\",\r\n )\r\n .join(this.delimiter) + this.lineSeparator,\r\n );\r\n }\r\n}\r\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\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class CSVFormatter implements FormatterAbstract {\r\n public formatterName = \"CSV\";\r\n public fileExtension = Extension.CSV;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, string> = {};\r\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\r\n\r\n const csvStream = new CSVStream({\r\n delimiter: \";\",\r\n emptyFieldValue: \"\",\r\n lineSeparator: \"\\n\",\r\n });\r\n const columns = new Set<string>([\r\n \"url\",\r\n \"productId\",\r\n \"parentId\",\r\n \"variantId\",\r\n \"title\",\r\n \"description\",\r\n \"vendor\",\r\n \"vendorCode\",\r\n \"category\",\r\n \"images\",\r\n \"videos\",\r\n \"price\",\r\n \"oldPrice\",\r\n \"purchasePrice\",\r\n \"currency\",\r\n \"saleDate\",\r\n \"countryOfOrigin\",\r\n \"tags\",\r\n \"codesTN\",\r\n \"params\",\r\n \"properties\",\r\n \"sizes\",\r\n \"keywords\",\r\n \"relatedProducts\",\r\n ]);\r\n products.forEach((product) => {\r\n Object.entries(product).forEach(([key, value]) => {\r\n if (value) columns.add(key);\r\n });\r\n });\r\n csvStream.setColumns(columns);\r\n products.forEach((product) => {\r\n const row: Record<string, any> = {\r\n ...product,\r\n category: mappedCategories[product.categoryId],\r\n images: product.images?.join(\",\"),\r\n videos: product.videos?.join(\",\"),\r\n tags: product.tags?.join(\",\"),\r\n codesTN: product.codesTN?.join(\", \"),\r\n params: product.params\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n properties: product.properties\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n sizes: product.sizes\r\n ?.map(({ name, value }) => `${name}=${value}`)\r\n .join(\", \"),\r\n keywords: product.keywords?.join(\",\"),\r\n relatedProducts: product.relatedProducts?.join(\",\"),\r\n };\r\n csvStream.addRow(row);\r\n });\r\n return csvStream.getWritableStream();\r\n }\r\n}\r\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 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 workbook = new stream.xlsx.WorkbookWriter({});\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 // @ts-ignore\n return workbook.stream;\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 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 workbook = new stream.xlsx.WorkbookWriter({});\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 // @ts-ignore\n return workbook.stream;\n }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\r\n\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class JSONFormatter implements FormatterAbstract {\r\n public formatterName = \"JSON\";\r\n public fileExtension = Extension.JSON;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n _?: FormatterOptions,\r\n ): Promise<Stream> {\r\n return new JsonStreamStringify({\r\n categories,\r\n brands,\r\n products,\r\n });\r\n }\r\n}\r\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 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 workbook = new stream.xlsx.WorkbookWriter({});\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 // @ts-ignore\n return workbook.stream;\n }\n}\n","import { CSVStream } from \"../streams/CSVStream\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class TildaFormatter implements FormatterAbstract {\r\n public formatterName = \"Tilda\";\r\n public fileExtension = Extension.CSV;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, string> = {};\r\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\r\n\r\n const csvStream = new CSVStream({\r\n delimiter: \";\",\r\n emptyFieldValue: \"\",\r\n lineSeparator: \"\\n\",\r\n });\r\n const columns = new Set<string>([\r\n \"SKU\",\r\n \"Brand\",\r\n \"Category\",\r\n \"Title\",\r\n \"Text\",\r\n \"Photo\",\r\n \"Price\",\r\n \"Price Old\",\r\n \"Quantity\",\r\n \"Editions\",\r\n \"External ID\",\r\n \"Parent UID\",\r\n ]);\r\n csvStream.setColumns(columns);\r\n products.forEach((product) => {\r\n const row: Record<string, string | number | undefined> = {\r\n SKU: product.vendorCode,\r\n Brand: product.vendor,\r\n Category: mappedCategories[product.categoryId],\r\n Title: product.title,\r\n Text: product.description,\r\n Photo: product.images?.join(\";\"),\r\n Price: product.price,\r\n \"Price Old\": product.oldPrice,\r\n Quantity: product.count,\r\n Editions: product.params\r\n ?.map(({ key, value }) => `${key}:${value}`)\r\n .join(\";\"),\r\n \"External ID\": product.variantId,\r\n \"Parent UID\": product.parentId,\r\n };\r\n csvStream.addRow(row);\r\n });\r\n return csvStream.getWritableStream();\r\n }\r\n}\r\n","import { XMLBuilder } from \"fast-xml-parser\";\r\nimport xml from \"xml\";\r\n\r\nimport { type Product, type Category, type Brand } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { PassThrough, type Stream } from \"stream\";\r\n\r\nexport class YMLFormatter implements FormatterAbstract {\r\n public formatterName = \"YMl\";\r\n public fileExtension = Extension.YML;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n options?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const result = new PassThrough();\r\n\r\n const builder = new XMLBuilder({\r\n ignoreAttributes: false,\r\n cdataPropName: \"__cdata\",\r\n });\r\n\r\n const ymlCatalog = xml.element({\r\n _attr: { date: new Date().toISOString().replace(/.\\d+Z/, \"\") },\r\n });\r\n const stream = xml(\r\n { yml_catalog: ymlCatalog },\r\n {\r\n stream: true,\r\n declaration: { standalone: \"yes\", encoding: \"UTF-8\" },\r\n },\r\n );\r\n\r\n const shop = xml.element();\r\n const streamShop = xml({ shop }, { stream: true });\r\n shop.push({ name: options?.shopName });\r\n shop.push({ company: options?.companyName });\r\n shop.push({ categories: this.getCategories(categories) });\r\n shop.push({ brands: this.getBrands(brands) });\r\n streamShop.pipe(result, { end: false });\r\n\r\n const offers = xml.element();\r\n const streamOffers = xml({ offers }, { stream: true });\r\n streamOffers.pipe(result, { end: false });\r\n\r\n products.forEach((product) => {\r\n result.write(builder.build({ offer: this.getOffers(product) }));\r\n });\r\n\r\n stream.pipe(result, { end: false });\r\n\r\n offers.close();\r\n shop.close();\r\n ymlCatalog.close();\r\n return result;\r\n }\r\n\r\n private getBrands(brands?: Brand[]) {\r\n return brands?.map((brand) => ({\r\n brand: [\r\n { _attr: { id: brand.id, url: brand.coverURL ?? \"\" } },\r\n brand.name,\r\n ],\r\n }));\r\n }\r\n\r\n private getCategories(categories?: Category[]) {\r\n return categories?.map((cat) => ({\r\n category: [\r\n { _attr: { id: cat.id, parentId: cat.parentId ?? \"\" } },\r\n cat.name,\r\n ],\r\n }));\r\n }\r\n\r\n private getOffers(product: Product): any {\r\n const result = {\r\n \"@_id\": product.variantId,\r\n name: product.title,\r\n price: product.price,\r\n oldprice: product.oldPrice,\r\n purchase_price: product.purchasePrice,\r\n additional_expenses: product.additionalExpenses,\r\n cofinance_price: product.cofinancePrice,\r\n currencyId: product.currency,\r\n categoryId: product.categoryId,\r\n vendor: product.vendor,\r\n vendorCode: product.vendorCode,\r\n picture: product.images,\r\n video: product.videos,\r\n available: product.available,\r\n series: product.seriesName,\r\n \"min-quantity\": product.minQuantity,\r\n \"step-quantity\": product.stepQuantity,\r\n size: product.sizes?.map((size) => ({\r\n \"#text\": size.value,\r\n \"@_name\": size.name,\r\n \"@_delimiter\": size.delimiter,\r\n })),\r\n keyword: product.keywords,\r\n saleDate: product.saleDate,\r\n property: product.properties?.map((property) => ({\r\n \"#text\": property.value,\r\n \"@_name\": property.key,\r\n })),\r\n param: product.params?.map((param) => ({\r\n \"#text\": param.value,\r\n \"@_name\": param.key,\r\n })),\r\n description: {\r\n __cdata: product.description,\r\n },\r\n country_of_origin: product.countryOfOrigin,\r\n barcode: product.barcode,\r\n vat: product.vat,\r\n count: product.count,\r\n \"set-ids\": product.tags?.join(\", \"),\r\n adult: product.adult,\r\n downloadable: product.downloadable,\r\n \"period-of-validity-days\": product.validityPeriod,\r\n \"comment-validity-days\": product.validityComment,\r\n \"service-life-days\": product.serviceLifePeriod,\r\n \"comment-life-days\": product.serviceLifeComment,\r\n \"warranty-days\": product.warrantyPeriod,\r\n \"comment-warranty\": product.warrantyComment,\r\n manufacturer_warranty: product.manufacturerWarranty,\r\n certificate: product.certificate,\r\n url: product.url,\r\n weight: product.weight,\r\n dimensions: product.dimensions,\r\n boxCount: product.boxCount,\r\n disabled: product.disabled,\r\n age: product.age != null && {\r\n \"@_unit\": product.age.unit,\r\n \"#text\": product.age.value,\r\n },\r\n \"tn-ved-codes\": product.codesTN?.length != null && {\r\n \"tn-ved-code\": product.codesTN,\r\n },\r\n relatedProduct: product.relatedProducts,\r\n gender: product.gender,\r\n };\r\n if (product.parentId !== undefined) {\r\n return {\r\n ...result,\r\n \"@_group_id\": product.parentId,\r\n };\r\n }\r\n return result;\r\n }\r\n}\r\n","import { CSVFormatter } from \"./CSV.formatter\";\nimport { ExcelFormatter } from \"./Excel.formatter\";\nimport { InsalesFormatter } from \"./Insales.formatter\";\nimport { JSONFormatter } from \"./JSON.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};\n","import {\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n Formatters,\r\n} from \"../formatter\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport { type Exporter, type Transformer } from \"./exporter.types\";\r\n\r\nimport fs from \"fs\";\r\n\r\nexport class GoodsExporter {\r\n private formatter: FormatterAbstract = new Formatters.YMLFormatter();\r\n private exporter: Exporter = () => {\r\n return fs.createWriteStream(\r\n `${this.formatter.formatterName}.output.${this.formatter.fileExtension}`,\r\n );\r\n };\r\n\r\n private transformers = new Array<Transformer>();\r\n\r\n public setTransformers(transformers: Transformer[]): void {\r\n this.transformers = transformers;\r\n }\r\n\r\n public setFormatter(formatter: FormatterAbstract): void {\r\n this.formatter = formatter;\r\n }\r\n\r\n public setExporter(exporter: Exporter): void {\r\n this.exporter = exporter;\r\n }\r\n\r\n async export(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n option?: FormatterOptions,\r\n ): Promise<void> {\r\n let transformedProducts: Product[] = products;\r\n\r\n for (const transformer of this.transformers)\r\n transformedProducts = await transformer(transformedProducts);\r\n\r\n const stream = await this.formatter.format(\r\n transformedProducts,\r\n categories,\r\n brands,\r\n option,\r\n );\r\n stream.pipe(this.exporter());\r\n }\r\n}\r\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 ** &lt;h&gt;, &lt;h1&gt;, &lt;h2&gt; и так далее — для заголовков;\n ** &lt;br&gt; и &lt;p&gt; — для переноса строки;\n ** &lt;ol&gt; — для нумерованного списка;\n ** &lt;ul&gt; — для маркированного списка;\n ** &lt;li&gt; — для создания элементов списка (должен находиться внутри &lt;ol&gt; или &lt;ul&gt;);\n ** &lt;div&gt; — поддерживается, но не влияет на отображение текста.\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 * Указывайте конкретные категории — например, набор ножей лучше отнести к категории Столовые приборы, а не просто Посуда.\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\";\r\n\r\nexport interface CSVStreamOptions {\r\n delimiter?: string;\r\n emptyFieldValue?: string;\r\n lineSeparator?: string;\r\n}\r\n\r\nexport class CSVStream {\r\n private readonly stream: PassThrough = new PassThrough();\r\n private readonly delimiter: string = \";\";\r\n private readonly lineSeparator: string = \"\\n\";\r\n private readonly emptyFieldValue: string = \"\";\r\n private columns = new Set<string>();\r\n\r\n constructor({ delimiter, lineSeparator, emptyFieldValue }: CSVStreamOptions) {\r\n if (delimiter !== undefined) this.delimiter = delimiter;\r\n if (lineSeparator !== undefined) this.lineSeparator = lineSeparator;\r\n if (emptyFieldValue !== undefined) this.emptyFieldValue = emptyFieldValue;\r\n }\r\n\r\n getWritableStream() {\r\n return this.stream;\r\n }\r\n\r\n setColumns(columns: Set<string>) {\r\n this.columns = columns;\r\n this.stream.write(\r\n Array.from(this.columns).join(this.delimiter) + this.lineSeparator,\r\n );\r\n }\r\n\r\n addRow(items: Record<string, any>) {\r\n this.stream.write(\r\n Array.from(this.columns)\r\n .map((key) =>\r\n items[key] === undefined ? this.emptyFieldValue : items[key] + \"\",\r\n )\r\n .join(this.delimiter) + this.lineSeparator,\r\n );\r\n }\r\n}\r\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\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class CSVFormatter implements FormatterAbstract {\r\n public formatterName = \"CSV\";\r\n public fileExtension = Extension.CSV;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, string> = {};\r\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\r\n\r\n const csvStream = new CSVStream({\r\n delimiter: \";\",\r\n emptyFieldValue: \"\",\r\n lineSeparator: \"\\n\",\r\n });\r\n const columns = new Set<string>([\r\n \"url\",\r\n \"productId\",\r\n \"parentId\",\r\n \"variantId\",\r\n \"title\",\r\n \"description\",\r\n \"vendor\",\r\n \"vendorCode\",\r\n \"category\",\r\n \"images\",\r\n \"videos\",\r\n \"price\",\r\n \"oldPrice\",\r\n \"purchasePrice\",\r\n \"currency\",\r\n \"saleDate\",\r\n \"countryOfOrigin\",\r\n \"tags\",\r\n \"codesTN\",\r\n \"params\",\r\n \"properties\",\r\n \"sizes\",\r\n \"keywords\",\r\n \"relatedProducts\",\r\n ]);\r\n products.forEach((product) => {\r\n Object.entries(product).forEach(([key, value]) => {\r\n if (value) columns.add(key);\r\n });\r\n });\r\n csvStream.setColumns(columns);\r\n products.forEach((product) => {\r\n const row: Record<string, any> = {\r\n ...product,\r\n category: mappedCategories[product.categoryId],\r\n images: product.images?.join(\",\"),\r\n videos: product.videos?.join(\",\"),\r\n tags: product.tags?.join(\",\"),\r\n codesTN: product.codesTN?.join(\", \"),\r\n params: product.params\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n properties: product.properties\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n sizes: product.sizes\r\n ?.map(({ name, value }) => `${name}=${value}`)\r\n .join(\", \"),\r\n keywords: product.keywords?.join(\",\"),\r\n relatedProducts: product.relatedProducts?.join(\",\"),\r\n };\r\n csvStream.addRow(row);\r\n });\r\n return csvStream.getWritableStream();\r\n }\r\n}\r\n","import pkg from \"exceljs\";\r\n\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\nconst { stream } = pkg;\r\n\r\nexport class ExcelFormatter implements FormatterAbstract {\r\n public formatterName = \"Excel\";\r\n public fileExtension = Extension.XLSX;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, string> = {};\r\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\r\n const columns = new Set<string>([\r\n \"url\",\r\n \"productId\",\r\n \"parentId\",\r\n \"variantId\",\r\n \"title\",\r\n \"description\",\r\n \"vendor\",\r\n \"vendorCode\",\r\n \"category\",\r\n \"images\",\r\n \"videos\",\r\n \"price\",\r\n \"oldPrice\",\r\n \"purchasePrice\",\r\n \"currency\",\r\n \"saleDate\",\r\n \"countryOfOrigin\",\r\n \"tags\",\r\n \"codesTN\",\r\n \"params\",\r\n \"properties\",\r\n \"sizes\",\r\n \"keywords\",\r\n \"relatedProducts\",\r\n ]);\r\n products.forEach((product) => {\r\n Object.entries(product).forEach(([key, value]) => {\r\n if (value) columns.add(key);\r\n });\r\n });\r\n\r\n const workbook = new stream.xlsx.WorkbookWriter({});\r\n const worksheet = workbook.addWorksheet(\"products\");\r\n worksheet.columns = Array.from(columns).map((column) => ({\r\n key: column,\r\n header: column,\r\n }));\r\n\r\n products.forEach((product) => {\r\n const row = {\r\n ...product,\r\n category: mappedCategories[product.categoryId],\r\n images: product.images?.join(\",\"),\r\n videos: product.videos?.join(\",\"),\r\n tags: product.tags?.join(\",\"),\r\n keywords: product.keywords?.join(\",\"),\r\n relatedProducts: product.relatedProducts?.join(\",\"),\r\n codesTN: product.codesTN?.join(\", \"),\r\n params: product.params\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n properties: product.properties\r\n ?.map(({ key, value }) => `${key}=${value}`)\r\n .join(\", \"),\r\n sizes: product.sizes\r\n ?.map(({ name, value }) => `${name}=${value}`)\r\n .join(\", \"),\r\n };\r\n worksheet.addRow(row).commit();\r\n });\r\n worksheet.commit();\r\n await workbook.commit();\r\n // @ts-ignore\r\n return workbook.stream;\r\n }\r\n}\r\n","import pkg from \"exceljs\";\r\n\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\nconst { stream } = pkg;\r\n\r\nexport class InsalesFormatter implements FormatterAbstract {\r\n public formatterName = \"Insales\";\r\n public fileExtension = Extension.XLSX;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, Category> = {};\r\n categories?.forEach(\r\n (category) => (mappedCategories[category.id] = category),\r\n );\r\n\r\n const getParams = (product: Product): Record<string, string> => {\r\n const properties: Record<string, string> = {};\r\n\r\n product.params?.forEach(\r\n (p) => (properties[`Свойство: ${p.key}`] = p.value),\r\n );\r\n\r\n return properties;\r\n };\r\n const getProperties = (product: Product): Record<string, string> => {\r\n const properties: Record<string, string> = {};\r\n\r\n product.properties?.forEach(\r\n (p) => (properties[`Параметр: ${p.key}`] = p.value),\r\n );\r\n\r\n return properties;\r\n };\r\n\r\n const getCategories = (product: Product) => {\r\n const categories: Record<string, string> = {};\r\n const categoryList = new Array<string>();\r\n\r\n function addCategory(categoryId: number | undefined) {\r\n if (categoryId === undefined) return;\r\n\r\n const category = mappedCategories[categoryId];\r\n if (category) {\r\n categoryList.push(category.name);\r\n addCategory(category.parentId);\r\n }\r\n }\r\n\r\n addCategory(product.categoryId);\r\n\r\n categoryList.forEach((name, i) => {\r\n const index = categoryList.length - 1 - i;\r\n const key = index === 0 ? \"Корневая\" : `Подкатегория ${index}`;\r\n categories[key] = name;\r\n });\r\n\r\n return categories;\r\n };\r\n const workbook = new stream.xlsx.WorkbookWriter({});\r\n const worksheet = workbook.addWorksheet(\"products\");\r\n const columns = new Set<string>([\r\n \"Внешний ID\",\r\n \"Ссылка на товар\",\r\n \"Артикул\",\r\n \"Корневая\",\r\n \"Подкатегория 1\",\r\n \"Подкатегория 2\",\r\n \"Название товара или услуги\",\r\n \"Старая цена\",\r\n \"Цена продажи\",\r\n \"Cебестоимость\",\r\n \"Категории\",\r\n \"Остаток\",\r\n \"Штрих-код\",\r\n \"Краткое описание\",\r\n \"Полное описание\",\r\n \"Габариты варианта\",\r\n \"Вес\",\r\n \"Размещение на сайте\",\r\n \"НДС\",\r\n \"Валюта склада\",\r\n \"Изображения варианта\",\r\n \"Изображения\",\r\n \"Ссылка на видео\",\r\n \"Параметры\",\r\n \"Свойства\",\r\n \"Параметр: Бренд\",\r\n \"Параметр: Коллекция\",\r\n \"Параметр: Пол\",\r\n \"Параметр: Дата выхода\",\r\n \"Размерная сетка\",\r\n \"Связанные товары\",\r\n \"Ключевые слова\",\r\n ]);\r\n products.forEach((product) => {\r\n Object.keys({\r\n ...getParams(product),\r\n ...getProperties(product),\r\n }).forEach((key) => {\r\n columns.add(key);\r\n });\r\n });\r\n worksheet.columns = Array.from(columns).map((column) => ({\r\n header: column,\r\n key: column,\r\n }));\r\n products.forEach((product) => {\r\n const row = {\r\n \"Внешний ID\": product.productId,\r\n \"Ссылка на товар\": product.url,\r\n Артикул: product.vendorCode,\r\n \"Название товара или услуги\": product.title,\r\n \"Старая цена\": product.oldPrice,\r\n \"Цена продажи\": product.price,\r\n Cебестоимость: product.purchasePrice,\r\n ...getCategories(product),\r\n Остаток: product.count,\r\n \"Штрих-код\": product.barcode,\r\n \"Краткое описание\": undefined,\r\n \"Полное описание\": product.description,\r\n \"Габариты варианта\": product.dimensions,\r\n Вес: product.weight,\r\n \"Размещение на сайте\": product.available,\r\n НДС: product.vat.toString(),\r\n \"Валюта склада\": product.currency.toString(),\r\n \"Изображения варианта\":\r\n product.parentId === undefined\r\n ? product.images?.join(\" \")\r\n : undefined,\r\n Изображения:\r\n product.parentId === undefined\r\n ? undefined\r\n : product.images?.join(\" \"),\r\n \"Ссылка на видео\": product.videos ? product.videos[0] : undefined,\r\n ...getParams(product),\r\n ...getProperties(product),\r\n \"Параметр: Бренд\": product.vendor,\r\n \"Параметр: Коллекция\": product.seriesName,\r\n \"Параметр: Пол\": product.gender,\r\n \"Параметр: Дата выхода\": product.saleDate,\r\n \"Размерная сетка\": JSON.stringify(product.sizes),\r\n \"Связанные товары\": product.relatedProducts?.join(\",\"),\r\n \"Ключевые слова\": product.keywords?.join(\",\"),\r\n };\r\n worksheet.addRow(row).commit();\r\n });\r\n worksheet.commit();\r\n await workbook.commit();\r\n // @ts-ignore\r\n return workbook.stream;\r\n }\r\n}\r\n","import { JsonStreamStringify } from \"json-stream-stringify\";\r\n\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class JSONFormatter implements FormatterAbstract {\r\n public formatterName = \"JSON\";\r\n public fileExtension = Extension.JSON;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n _?: FormatterOptions,\r\n ): Promise<Stream> {\r\n return new JsonStreamStringify({\r\n categories,\r\n brands,\r\n products,\r\n });\r\n }\r\n}\r\n","import { JsonStreamStringify } from \"json-stream-stringify\";\r\n\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\ninterface SimpleProduct extends Product {\r\n children: Product[];\r\n}\r\n\r\nexport class SimpleJSONFormatter implements FormatterAbstract {\r\n public formatterName = \"JSON\";\r\n public fileExtension = Extension.JSON;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n _?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const groupedProduct = new Map<number, SimpleProduct>();\r\n products.forEach((product) => {\r\n if (product.parentId !== undefined) return;\r\n groupedProduct.set(product.variantId, {\r\n ...product,\r\n children: [],\r\n });\r\n });\r\n products.forEach((product) => {\r\n if (product.parentId === undefined) return;\r\n const parent = groupedProduct.get(product.parentId);\r\n if (!parent) return;\r\n parent.children.push(product);\r\n });\r\n return new JsonStreamStringify({\r\n categories,\r\n brands,\r\n products: Array.from(groupedProduct.values()),\r\n });\r\n }\r\n}\r\n","import pkg from \"exceljs\";\r\n\r\nimport { type Brand, type Category, type IParam, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\nconst { stream } = pkg;\r\n\r\nexport class TgShopFormatter implements FormatterAbstract {\r\n public formatterName = \"TgShop\";\r\n public fileExtension = Extension.XLSX;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const getParameter = (product: Product, key: string): IParam | undefined =>\r\n product.params?.find((value) => value.key === key);\r\n\r\n const convertProduct = (product: Product) => ({\r\n \"category id\": product.categoryId,\r\n \"group id\": product.parentId,\r\n \"id product\": product.variantId,\r\n \"name product\": product.title,\r\n price: product.price,\r\n picture: product.images?.join(\", \"),\r\n vendorCode: product.vendorCode,\r\n oldprice: product.oldPrice,\r\n description: product.description,\r\n shortDescription: \"\",\r\n quantityInStock: product.count,\r\n color: getParameter(product, \"color\")?.value,\r\n size: getParameter(product, \"size\")?.value,\r\n priority: undefined,\r\n });\r\n const workbook = new stream.xlsx.WorkbookWriter({});\r\n const categoryWorksheet = workbook.addWorksheet(\"categories\");\r\n const productsWorksheet = workbook.addWorksheet(\"offers\");\r\n categoryWorksheet.columns = [\r\n {\r\n header: \"id\",\r\n key: \"id\",\r\n },\r\n {\r\n header: \"parentId\",\r\n key: \"parentId\",\r\n },\r\n {\r\n header: \"name\",\r\n key: \"name\",\r\n },\r\n ];\r\n const columns = [\r\n \"category id\",\r\n \"group id\",\r\n \"id product\",\r\n \"name product\",\r\n \"price\",\r\n \"picture\",\r\n \"vendorCode\",\r\n \"oldprice\",\r\n \"description\",\r\n \"shortDescription\",\r\n \"quantityInStock\",\r\n \"color\",\r\n \"size\",\r\n \"priority\",\r\n ];\r\n\r\n productsWorksheet.columns = columns.map((column) => ({\r\n header: column,\r\n key: column,\r\n }));\r\n\r\n categories?.forEach((category) => {\r\n categoryWorksheet.addRow(category).commit();\r\n });\r\n\r\n products.forEach((product) => {\r\n productsWorksheet.addRow(convertProduct(product)).commit();\r\n });\r\n categoryWorksheet.commit();\r\n productsWorksheet.commit();\r\n\r\n await workbook.commit();\r\n // @ts-ignore\r\n return workbook.stream;\r\n }\r\n}\r\n","import { CSVStream } from \"../streams/CSVStream\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Stream } from \"stream\";\r\n\r\nexport class TildaFormatter implements FormatterAbstract {\r\n public formatterName = \"Tilda\";\r\n public fileExtension = Extension.CSV;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n _?: Brand[],\r\n __?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const mappedCategories: Record<number, string> = {};\r\n categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\r\n\r\n const csvStream = new CSVStream({\r\n delimiter: \";\",\r\n emptyFieldValue: \"\",\r\n lineSeparator: \"\\n\",\r\n });\r\n const columns = new Set<string>([\r\n \"SKU\",\r\n \"Brand\",\r\n \"Category\",\r\n \"Title\",\r\n \"Text\",\r\n \"Photo\",\r\n \"Price\",\r\n \"Price Old\",\r\n \"Quantity\",\r\n \"Editions\",\r\n \"External ID\",\r\n \"Parent UID\",\r\n ]);\r\n csvStream.setColumns(columns);\r\n products.forEach((product) => {\r\n const row: Record<string, string | number | undefined> = {\r\n SKU: product.vendorCode,\r\n Brand: product.vendor,\r\n Category: mappedCategories[product.categoryId],\r\n Title: product.title,\r\n Text: product.description,\r\n Photo: product.images?.join(\";\"),\r\n Price: product.price,\r\n \"Price Old\": product.oldPrice,\r\n Quantity: product.count,\r\n Editions: product.params\r\n ?.map(({ key, value }) => `${key}:${value}`)\r\n .join(\";\"),\r\n \"External ID\": product.variantId,\r\n \"Parent UID\": product.parentId,\r\n };\r\n csvStream.addRow(row);\r\n });\r\n return csvStream.getWritableStream();\r\n }\r\n}\r\n","import { XMLBuilder } from \"fast-xml-parser\";\r\nimport xml from \"xml\";\r\n\r\nimport { type Product, type Category, type Brand } from \"../types\";\r\nimport {\r\n Extension,\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { PassThrough, type Stream } from \"stream\";\r\n\r\nexport class YMLFormatter implements FormatterAbstract {\r\n public formatterName = \"YMl\";\r\n public fileExtension = Extension.YML;\r\n\r\n public async format(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n options?: FormatterOptions,\r\n ): Promise<Stream> {\r\n const result = new PassThrough();\r\n\r\n const builder = new XMLBuilder({\r\n ignoreAttributes: false,\r\n cdataPropName: \"__cdata\",\r\n });\r\n\r\n const ymlCatalog = xml.element({\r\n _attr: { date: new Date().toISOString().replace(/.\\d+Z/, \"\") },\r\n });\r\n const stream = xml(\r\n { yml_catalog: ymlCatalog },\r\n {\r\n stream: true,\r\n declaration: { standalone: \"yes\", encoding: \"UTF-8\" },\r\n },\r\n );\r\n stream.pipe(result, { end: false });\r\n\r\n const shop = xml.element();\r\n const streamShop = xml({ shop }, { stream: true });\r\n shop.push({ name: options?.shopName });\r\n shop.push({ company: options?.companyName });\r\n shop.push({ categories: this.getCategories(categories) });\r\n shop.push({ brands: this.getBrands(brands) });\r\n streamShop.pipe(result, { end: false });\r\n\r\n const offers = xml.element();\r\n const streamOffersTag = xml({ offers }, { stream: true });\r\n streamOffersTag.pipe(result, { end: false });\r\n\r\n const streamOffers = new PassThrough();\r\n\r\n products.forEach((product) => {\r\n streamOffers.write(builder.build({ offer: this.getOffer(product) }));\r\n });\r\n streamOffers.pipe(result, { end: false });\r\n\r\n offers.close();\r\n shop.close();\r\n ymlCatalog.close();\r\n return result;\r\n }\r\n\r\n private getBrands(brands?: Brand[]) {\r\n return brands?.map((brand) => ({\r\n brand: [\r\n { _attr: { id: brand.id, url: brand.coverURL ?? \"\" } },\r\n brand.name,\r\n ],\r\n }));\r\n }\r\n\r\n private getCategories(categories?: Category[]) {\r\n return categories?.map((cat) => ({\r\n category: [\r\n { _attr: { id: cat.id, parentId: cat.parentId ?? \"\" } },\r\n cat.name,\r\n ],\r\n }));\r\n }\r\n\r\n private getOffer(product: Product): any {\r\n const result = {\r\n \"@_id\": product.variantId,\r\n name: product.title,\r\n price: product.price,\r\n oldprice: product.oldPrice,\r\n purchase_price: product.purchasePrice,\r\n additional_expenses: product.additionalExpenses,\r\n cofinance_price: product.cofinancePrice,\r\n currencyId: product.currency,\r\n categoryId: product.categoryId,\r\n vendorId: product.vendorId,\r\n vendor: product.vendor,\r\n vendorCode: product.vendorCode,\r\n picture: product.images,\r\n video: product.videos,\r\n available: product.available,\r\n series: product.seriesName,\r\n \"min-quantity\": product.minQuantity,\r\n \"step-quantity\": product.stepQuantity,\r\n size: product.sizes?.map((size) => ({\r\n \"#text\": size.value,\r\n \"@_name\": size.name,\r\n \"@_delimiter\": size.delimiter,\r\n })),\r\n keyword: product.keywords,\r\n saleDate: product.saleDate,\r\n property: product.properties?.map((property) => ({\r\n \"#text\": property.value,\r\n \"@_name\": property.key,\r\n })),\r\n param: product.params?.map((param) => ({\r\n \"#text\": param.value,\r\n \"@_name\": param.key,\r\n })),\r\n description: {\r\n __cdata: product.description,\r\n },\r\n country_of_origin: product.countryOfOrigin,\r\n barcode: product.barcode,\r\n vat: product.vat,\r\n count: product.count,\r\n \"set-ids\": product.tags?.join(\", \"),\r\n adult: product.adult,\r\n downloadable: product.downloadable,\r\n \"period-of-validity-days\": product.validityPeriod,\r\n \"comment-validity-days\": product.validityComment,\r\n \"service-life-days\": product.serviceLifePeriod,\r\n \"comment-life-days\": product.serviceLifeComment,\r\n \"warranty-days\": product.warrantyPeriod,\r\n \"comment-warranty\": product.warrantyComment,\r\n manufacturer_warranty: product.manufacturerWarranty,\r\n certificate: product.certificate,\r\n url: product.url,\r\n weight: product.weight,\r\n dimensions: product.dimensions,\r\n boxCount: product.boxCount,\r\n disabled: product.disabled,\r\n age: product.age != null && {\r\n \"@_unit\": product.age.unit,\r\n \"#text\": product.age.value,\r\n },\r\n \"tn-ved-codes\": product.codesTN?.length != null && {\r\n \"tn-ved-code\": product.codesTN,\r\n },\r\n relatedProduct: product.relatedProducts,\r\n gender: product.gender,\r\n };\r\n if (product.parentId !== undefined) {\r\n return {\r\n ...result,\r\n \"@_group_id\": product.parentId,\r\n };\r\n }\r\n return result;\r\n }\r\n}\r\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 {\r\n type FormatterAbstract,\r\n type FormatterOptions,\r\n Formatters,\r\n} from \"../formatter\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport { type Exporter, type Transformer } from \"./exporter.types\";\r\n\r\nimport fs from \"fs\";\r\n\r\nexport class GoodsExporter {\r\n private formatter: FormatterAbstract = new Formatters.YMLFormatter();\r\n private exporter: Exporter = () => {\r\n return fs.createWriteStream(\r\n `${this.formatter.formatterName}.output.${this.formatter.fileExtension}`,\r\n );\r\n };\r\n\r\n private transformers = new Array<Transformer>();\r\n\r\n public setTransformers(transformers: Transformer[]): void {\r\n this.transformers = transformers;\r\n }\r\n\r\n public setFormatter(formatter: FormatterAbstract): void {\r\n this.formatter = formatter;\r\n }\r\n\r\n public setExporter(exporter: Exporter): void {\r\n this.exporter = exporter;\r\n }\r\n\r\n async export(\r\n products: Product[],\r\n categories?: Category[],\r\n brands?: Brand[],\r\n option?: FormatterOptions,\r\n ): Promise<void> {\r\n let transformedProducts: Product[] = products;\r\n\r\n for (const transformer of this.transformers)\r\n transformedProducts = await transformer(transformedProducts);\r\n\r\n const stream = await this.formatter.format(\r\n transformedProducts,\r\n categories,\r\n brands,\r\n option,\r\n );\r\n stream.pipe(this.exporter());\r\n }\r\n}\r\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 ** &lt;h&gt;, &lt;h1&gt;, &lt;h2&gt; и так далее — для заголовков;\n ** &lt;br&gt; и &lt;p&gt; — для переноса строки;\n ** &lt;ol&gt; — для нумерованного списка;\n ** &lt;ul&gt; — для маркированного списка;\n ** &lt;li&gt; — для создания элементов списка (должен находиться внутри &lt;ol&gt; или &lt;ul&gt;);\n ** &lt;div&gt; — поддерживается, но не влияет на отображение текста.\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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"}
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": "0.5.2",
14
+ "version": "0.5.3",
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",