{"version":3,"file":"index.cjs","sources":["../../src/utils/buildCategoryPath.ts","../../src/utils/writeWithDrain.ts","../../src/utils/delay.ts","../../src/utils/getRFC3339Date.ts","../../src/utils/urlQueryEncode.ts","../../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/WooCommerce.formatter.ts","../../src/formatter/YML.formatter.ts","../../src/formatter/XML.formatter.ts","../../src/formatter/index.ts","../../src/exporter/goodsExporter.ts","../../src/types/Product.types.ts"],"sourcesContent":["import { type Category } from \"../types\";\r\n\r\nexport const buildCategoryPaths = (\r\n  categories: Category[],\r\n): Map<number, Category[]> => {\r\n  const idToCategory = new Map<number, Category>();\r\n\r\n  categories.forEach((category) => {\r\n    idToCategory.set(category.id, category);\r\n  });\r\n\r\n  const categoryPaths = new Map<number, Category[]>();\r\n\r\n  categories.forEach((category) => {\r\n    const path: Category[] = [];\r\n\r\n    let currentCategory: Category | undefined = category;\r\n\r\n    while (currentCategory) {\r\n      path.unshift(currentCategory);\r\n\r\n      if (currentCategory.parentId !== undefined) {\r\n        currentCategory = idToCategory.get(currentCategory.parentId);\r\n      } else {\r\n        currentCategory = undefined;\r\n      }\r\n    }\r\n\r\n    categoryPaths.set(category.id, path);\r\n  });\r\n\r\n  return categoryPaths;\r\n};\r\n","import { once } from \"events\";\r\nimport { type Writable } from \"stream\";\r\n\r\nexport const writeWithDrain = (stream: Writable) => {\r\n  return async (chunk: any) => {\r\n    const canWrite = stream.write(chunk);\r\n    if (!canWrite) {\r\n      await once(stream, \"drain\");\r\n    }\r\n  };\r\n};\r\n","export const delay = async (ms: number) =>\r\n  await new Promise((resolve) => setTimeout(resolve, ms));\r\n","export function getRFC3339Date(date: Date): string {\r\n  const pad = (n: number) => n.toString().padStart(2, \"0\");\r\n  const year = date.getFullYear();\r\n  const month = pad(date.getMonth() + 1);\r\n  const day = pad(date.getDate());\r\n  const hour = pad(date.getHours());\r\n  const min = pad(date.getMinutes());\r\n\r\n  // Смещение в минутах\r\n  const tzOffset = -date.getTimezoneOffset();\r\n  const sign = tzOffset >= 0 ? \"+\" : \"-\";\r\n  const absOffset = Math.abs(tzOffset);\r\n  const offsetHour = pad(Math.floor(absOffset / 60));\r\n  const offsetMin = pad(absOffset % 60);\r\n\r\n  return `${year}-${month}-${day}T${hour}:${min}${sign}${offsetHour}:${offsetMin}`;\r\n}","export const urlQueryEncode = (inputUrl: string): string => {\r\n  try {\r\n    const url = new URL(inputUrl);\r\n    url.search = url.search.replace(/^\\?/, \"\").replace(/,/g, \"%2C\");\r\n    return url.toString();\r\n  } catch (error) {\r\n    console.error(\"Invalid URL:\", error);\r\n    return \"\";\r\n  }\r\n};\r\n","import { writeWithDrain } from \"../utils\";\r\n\r\nimport { 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  private readonly writer = writeWithDrain(this.stream);\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  public get writableStream() {\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  async addRow(items: Record<string, any>) {\r\n    const data =\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    await this.writer(data);\r\n  }\r\n}\r\n","import { type Brand, type Category, type Product } from \"../types\";\r\n\r\nimport { type Writable } from \"stream\";\r\n\r\nexport abstract class FormatterAbstract {\r\n  public abstract formatterName: string;\r\n  public abstract fileExtension: Extension;\r\n\r\n  public abstract format(\r\n    writableStream: Writable,\r\n    products: Product[],\r\n    categories?: Category[],\r\n    brands?: Brand[],\r\n    option?: FormatterOptions,\r\n  ): Promise<void>;\r\n}\r\n\r\nexport interface FormatterOptions {\r\n  shopName?: string;\r\n\r\n  companyName?: string;\r\n\r\n  splitParams?: boolean;\r\n}\r\n\r\nexport enum Extension {\r\n  CSV = \"csv\",\r\n  YML = \"yml\",\r\n  XML = \"xml\",\r\n  XLSX = \"xlsx\",\r\n  JSON = \"json\",\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 Writable } 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    writableStream: Writable,\r\n    products: Product[],\r\n    categories?: Category[],\r\n    _?: Brand[],\r\n    __?: FormatterOptions,\r\n  ): Promise<void> {\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    csvStream.writableStream.pipe(writableStream);\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      \"timeDeliveryMin\",\r\n      \"timeDeliveryMax\",\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    for (const product of products) {\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        timeDeliveryMin: product.timeDelivery?.min,\r\n        timeDeliveryMax: product.timeDelivery?.max,\r\n      };\r\n      await csvStream.addRow(row);\r\n    }\r\n\r\n    // Закрываем поток\r\n    csvStream.writableStream.end();\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 Writable } 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    writableStream: Writable,\r\n    products: Product[],\r\n    categories?: Category[],\r\n    _?: Brand[],\r\n    __?: FormatterOptions,\r\n  ): Promise<void> {\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      \"timeDeliveryMin\",\r\n      \"timeDeliveryMax\",\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      stream: writableStream,\r\n    });\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        timeDeliveryMin: product.timeDelivery?.min,\r\n        timeDeliveryMax: product.timeDelivery?.max,\r\n      };\r\n      worksheet.addRow(row).commit();\r\n    });\r\n    worksheet.commit();\r\n    await workbook.commit();\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 Writable } from \"stream\";\r\n\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    writableStream: Writable,\r\n    products: Product[],\r\n    categories?: Category[],\r\n    _?: Brand[],\r\n    __?: FormatterOptions,\r\n  ): Promise<void> {\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      stream: writableStream,\r\n    });\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      \"Старая цена\",\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    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\r\n    worksheet.columns = Array.from(columns).map((column) => ({\r\n      header: column,\r\n      key: column,\r\n    }));\r\n\r\n    for (const product of products) {\r\n      const externalId = `${product.productId}-${product.variantId}`;\r\n      const row = {\r\n        \"Внешний ID\": externalId,\r\n        \"Ссылка на товар\": product.url,\r\n        Артикул: externalId, // TODO: product.vendorCode,\r\n        \"Название товара или услуги\": product.title,\r\n        \"Время доставки: Минимальное\": product.timeDelivery?.min,\r\n        \"Время доставки: Максимальное\": product.timeDelivery?.max,\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        \"Параметр: Артикул\": product.vendorCode, // TODO: брать из обычных параметров\r\n        ...getParams(product),\r\n        ...getProperties(product),\r\n        \"Размерная сетка\": JSON.stringify(product.sizes),\r\n        \"Связанные товары\": product.relatedProducts?.join(\",\"),\r\n        \"Ключевые слова\": product.keywords?.join(\",\"),\r\n      };\r\n      // todo(delay)\r\n      worksheet.addRow(row).commit();\r\n    }\r\n\r\n    worksheet.commit();\r\n    await workbook.commit();\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 Writable } 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    writableStream: Writable,\r\n    products: Product[],\r\n    categories?: Category[],\r\n    brands?: Brand[],\r\n    _?: FormatterOptions,\r\n  ): Promise<void> {\r\n    const stream = new JsonStreamStringify({\r\n      categories,\r\n      brands,\r\n      products,\r\n    });\r\n    stream.pipe(writableStream);\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 Writable } 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    writableStream: Writable,\r\n    products: Product[],\r\n    categories?: Category[],\r\n    brands?: Brand[],\r\n    _?: FormatterOptions,\r\n  ): Promise<void> {\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    const stream = new JsonStreamStringify({\r\n      categories,\r\n      brands,\r\n      products: Array.from(groupedProduct.values()),\r\n    });\r\n    stream.pipe(writableStream);\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 Writable } 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    writableStream: Writable,\r\n    products: Product[],\r\n    categories?: Category[],\r\n    _?: Brand[],\r\n    __?: FormatterOptions,\r\n  ): Promise<void> {\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      stream: writableStream,\r\n    });\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  }\r\n}\r\n","import { CSVStream } from \"../streams/CSVStream\";\r\nimport { type Brand, type Category, type Product } from \"../types\";\r\nimport { urlQueryEncode } from \"../utils\";\r\nimport {\r\n  Extension,\r\n  type FormatterAbstract,\r\n  type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Writable } 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    writableStream: Writable,\r\n    products: Product[],\r\n    categories?: Category[],\r\n    _?: Brand[],\r\n    __?: FormatterOptions,\r\n  ): Promise<void> {\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: \"\\t\",\r\n      emptyFieldValue: \"\",\r\n      lineSeparator: \"\\n\",\r\n    });\r\n    csvStream.writableStream.pipe(writableStream);\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\r\n    const characteristics = new Set<string>();\r\n\r\n    products.forEach((product) => {\r\n      product.properties?.forEach(({ key }) => {\r\n        characteristics.add(key);\r\n      });\r\n    });\r\n\r\n    characteristics.forEach((charKey) => {\r\n      columns.add(`Characteristics:${charKey}`);\r\n    });\r\n\r\n    csvStream.setColumns(columns);\r\n    for (const product of products) {\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?.map(urlQueryEncode).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\r\n      product.properties?.forEach(({ key, value }) => {\r\n        row[`Characteristics:${key}`] = value;\r\n      });\r\n\r\n      await csvStream.addRow(row);\r\n    }\r\n\r\n    csvStream.writableStream.end();\r\n  }\r\n}\r\n","import { CSVStream } from \"../streams/CSVStream\";\r\nimport { type IParam, type Brand, type Category, type Product } from \"../types\";\r\nimport { buildCategoryPaths, urlQueryEncode } from \"../utils\";\r\nimport {\r\n  Extension,\r\n  type FormatterAbstract,\r\n  type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { type Writable } from \"stream\";\r\n\r\nexport interface CreateAttributeProps {\r\n  name?: string;\r\n  id?: number;\r\n  values?: string | number;\r\n  visible?: number;\r\n  global?: number;\r\n}\r\n\r\nexport class WooCommerceFormatter implements FormatterAbstract {\r\n  public formatterName = \"WooCommerce\";\r\n  public fileExtension = Extension.CSV;\r\n\r\n  private readonly DEFAULT_COLUMNS = [\r\n    \"ID\",\r\n    \"Type\",\r\n    \"SKU\",\r\n    \"Name\",\r\n    \"Parent\",\r\n    \"Short description\",\r\n    \"Description\",\r\n    \"Stock\",\r\n    \"Regular price\",\r\n    \"Position\",\r\n    \"Categories\",\r\n    \"Tags\",\r\n    \"Images\",\r\n    \"SizeGrid\",\r\n  ];\r\n\r\n  private formatKeyAttribute(key: string) {\r\n    const keyWithoutInvalidCharacters = key\r\n      .replaceAll(\",\", \"\")\r\n      .replaceAll(\";\", \"\");\r\n\r\n    return keyWithoutInvalidCharacters.length >= 28\r\n      ? keyWithoutInvalidCharacters.slice(0, 24) + \"...\"\r\n      : keyWithoutInvalidCharacters;\r\n  }\r\n\r\n  private formatValueAttribute(value: string) {\r\n    return value.replaceAll(\",\", \"\").replaceAll(\";\", \"\");\r\n  }\r\n\r\n  private formatProducts(products: Product[]) {\r\n    const formatParams = (params: IParam[] | undefined) => {\r\n      return params?.map(({ key, value }) => {\r\n        const formatedKey = this.formatKeyAttribute(key);\r\n        const formatedValue = this.formatValueAttribute(value);\r\n        return { key: formatedKey, value: formatedValue };\r\n      });\r\n    };\r\n\r\n    return products.map((product) => {\r\n      const params = formatParams(product.params);\r\n      const properties = formatParams(product.properties);\r\n      return { ...product, params, properties };\r\n    });\r\n  }\r\n\r\n  private createAttribute(data: CreateAttributeProps) {\r\n    if (!data?.name || data.id === undefined) return;\r\n\r\n    const attributeStartName = \"Attribute\";\r\n\r\n    const attribute: Record<string, string | number> = {};\r\n\r\n    attribute[`${attributeStartName} ${data.id} name`] = data.name;\r\n\r\n    if (data.values !== undefined)\r\n      attribute[`${attributeStartName} ${data.id} value(s)`] = data.values;\r\n    if (data.visible !== undefined)\r\n      attribute[`${attributeStartName} ${data.id} visible`] = data.visible;\r\n    if (data.global !== undefined)\r\n      attribute[`${attributeStartName} ${data.id} global`] = data.global;\r\n\r\n    return attribute;\r\n  }\r\n\r\n  private extractAttributes(products: Product[]) {\r\n    const formatedProducts = this.formatProducts(products);\r\n    const paramsMap = new Map<number, Record<string, string | number>>();\r\n    const propertiesMap = new Map<number, Record<string, string | number>>();\r\n    const uniqueAttributes = new Map<string, number>();\r\n\r\n    const genderTitle = \"Пол\";\r\n\r\n    formatedProducts.forEach((product) => {\r\n      product.params?.forEach(({ key }) => {\r\n        if (!uniqueAttributes.has(key)) {\r\n          uniqueAttributes.set(key, uniqueAttributes.size);\r\n        }\r\n      });\r\n\r\n      uniqueAttributes.set(genderTitle, uniqueAttributes.size);\r\n\r\n      product.properties?.forEach(({ key }) => {\r\n        if (!uniqueAttributes.has(key)) {\r\n          uniqueAttributes.set(key, uniqueAttributes.size);\r\n        }\r\n      });\r\n    });\r\n\r\n    formatedProducts.forEach((product) => {\r\n      const paramAttributes = paramsMap.get(product.variantId) ?? {};\r\n      const propertyAttributes = propertiesMap.get(product.variantId) ?? {};\r\n\r\n      product.params?.forEach(({ key, value }) => {\r\n        const index = uniqueAttributes.get(key);\r\n\r\n        if (index === undefined) {\r\n          console.error(`Не нашлось уникального ключа для параметра - ${key}`);\r\n          return;\r\n        }\r\n\r\n        const attribute = this.createAttribute({\r\n          name: key,\r\n          id: index,\r\n          values: value,\r\n          visible: 0,\r\n          global: 0,\r\n        });\r\n\r\n        if (!attribute) return;\r\n\r\n        Object.entries(attribute).forEach(\r\n          ([key, value]) => (paramAttributes[key] = value),\r\n        );\r\n      });\r\n\r\n      const genderIndex = uniqueAttributes.get(genderTitle);\r\n\r\n      const genderAttribute = this.createAttribute({\r\n        name: genderTitle,\r\n        id: genderIndex,\r\n        values: product.gender,\r\n        global: 0,\r\n      });\r\n\r\n      if (genderAttribute) {\r\n        Object.entries(genderAttribute).forEach(\r\n          ([key, value]) => (propertyAttributes[key] = value),\r\n        );\r\n      }\r\n\r\n      product.properties?.forEach(({ key, value }) => {\r\n        const index = uniqueAttributes.get(key);\r\n\r\n        if (index === undefined) {\r\n          console.error(`Не нашлось уникального ключа для параметра - ${key}`);\r\n          return;\r\n        }\r\n\r\n        if (paramAttributes[`Attribute ${index} name`]) {\r\n          console.warn(`Данное свойство уже существует в параметрах - ${key}`);\r\n          return;\r\n        }\r\n\r\n        const attribute = this.createAttribute({\r\n          name: key,\r\n          id: index,\r\n          values: value,\r\n          global: 0,\r\n        });\r\n\r\n        if (!attribute) return;\r\n\r\n        Object.entries(attribute).forEach(\r\n          ([key, value]) => (propertyAttributes[key] = value),\r\n        );\r\n      });\r\n\r\n      paramsMap.set(product.variantId, paramAttributes);\r\n      propertiesMap.set(product.variantId, propertyAttributes);\r\n    });\r\n\r\n    return { params: paramsMap, properties: propertiesMap };\r\n  }\r\n\r\n  private removeVisibleFromAttributes(params: Record<string, string | number>) {\r\n    Object.entries(params).forEach(([key]) => {\r\n      if (key.includes(\"visible\")) params[key] = \"\";\r\n    });\r\n  }\r\n\r\n  public async format(\r\n    writableStream: Writable,\r\n    products: Product[],\r\n    categories?: Category[],\r\n    _?: Brand[],\r\n    __?: FormatterOptions,\r\n  ): Promise<void> {\r\n    const categoryPaths = buildCategoryPaths(categories ?? []);\r\n\r\n    const csvStream = new CSVStream({\r\n      delimiter: \";\",\r\n      emptyFieldValue: \"\",\r\n      lineSeparator: \"\\n\",\r\n    });\r\n    csvStream.writableStream.pipe(writableStream);\r\n    const columns = new Set<string>(this.DEFAULT_COLUMNS);\r\n\r\n    const attributes = this.extractAttributes(products);\r\n\r\n    const variationsByParentId = new Map<\r\n      number,\r\n      Array<Record<string, string | number | undefined>>\r\n    >();\r\n\r\n    const imagesByParentId = new Map<number, string | undefined>();\r\n    const sizesByParentId = new Map<number, string | undefined>();\r\n\r\n    const variations = products.map((product, index) => {\r\n      const pathsArray = categoryPaths\r\n        .get(product.categoryId)\r\n        ?.map((category) => category.name);\r\n\r\n      const price = product.price ? product.price : \"\";\r\n      const images = product.images?.map(urlQueryEncode).join(\",\");\r\n\r\n      let row = {\r\n        ID: product.variantId,\r\n        Type: \"variation\",\r\n        SKU: product.variantId,\r\n        Name: product.title,\r\n        Parent: product.parentId ?? 0,\r\n        \"Short description\": \"\",\r\n        Description: product.description,\r\n        Stock: product.count ?? 0,\r\n        \"Regular price\": price,\r\n        Position: index + 1,\r\n        Categories: pathsArray?.join(\" > \"),\r\n        Tags: product.keywords?.join(\",\"),\r\n        Images: images,\r\n        SizeGrid: \"\",\r\n      };\r\n\r\n      const productParams = attributes.params.get(product.variantId) ?? {};\r\n\r\n      if (!imagesByParentId.has(row.Parent)) {\r\n        imagesByParentId.set(row.Parent, images);\r\n      }\r\n\r\n      if (!sizesByParentId.has(row.Parent)) {\r\n        sizesByParentId.set(\r\n          row.Parent,\r\n          product.sizes ? JSON.stringify(product.sizes) : \"\",\r\n        );\r\n      }\r\n\r\n      this.removeVisibleFromAttributes(productParams);\r\n\r\n      row = { ...row, ...productParams };\r\n\r\n      if (variationsByParentId.has(row.Parent)) {\r\n        variationsByParentId.get(row.Parent)?.push(row);\r\n      } else {\r\n        variationsByParentId.set(row.Parent, [row]);\r\n      }\r\n\r\n      return row;\r\n    });\r\n\r\n    const parentProducts = new Map<number, any>();\r\n\r\n    variations.forEach((product) => {\r\n      const currentParent = parentProducts.get(product.Parent);\r\n\r\n      let row = {\r\n        ...product,\r\n        Type: \"variable\",\r\n        ID: product.Parent,\r\n        SKU: product.Parent,\r\n        Position: 0,\r\n        Parent: \"\",\r\n        \"Regular price\": \"\",\r\n        Images: imagesByParentId.get(product.Parent) ?? \"\",\r\n        SizeGrid: sizesByParentId.get(product.Parent) ?? \"\",\r\n      };\r\n\r\n      row.Stock = (currentParent?.Stock || 0) + (product?.Stock || 0);\r\n\r\n      const productParams = attributes.params.get(product.SKU) ?? {};\r\n      const productProperties = attributes.properties.get(product.SKU) ?? {};\r\n\r\n      Object.entries(productParams).forEach(([key]) => {\r\n        if (key.includes(\"visible\")) productParams[key] = 0;\r\n      });\r\n\r\n      if (currentParent) {\r\n        Object.entries(productParams).forEach(([key, value]) => {\r\n          if (key.includes(\"value(s)\")) {\r\n            productParams[key] = currentParent[key] + `, ${value}`;\r\n          }\r\n        });\r\n      }\r\n\r\n      Object.keys({ ...row, ...productParams, ...productProperties }).forEach(\r\n        (item) => columns.add(item),\r\n      );\r\n\r\n      row = { ...row, ...productParams, ...productProperties };\r\n\r\n      parentProducts.set(product.Parent, row);\r\n    });\r\n\r\n    const variableProducts = Array.from(parentProducts.values());\r\n\r\n    csvStream.setColumns(columns);\r\n    for (const parentProduct of variableProducts) {\r\n      await csvStream.addRow(parentProduct);\r\n\r\n      for (const variationProduct of variationsByParentId.get(\r\n        parentProduct.ID,\r\n      ) ?? []) {\r\n        await csvStream.addRow(variationProduct);\r\n      }\r\n    }\r\n\r\n    csvStream.writableStream.end();\r\n  }\r\n}\r\n","import { XMLBuilder } from \"fast-xml-parser\";\r\n\r\nimport { type Product, type Category, type Brand } from \"../types\";\r\nimport { getRFC3339Date, writeWithDrain } from \"../utils\";\r\nimport {\r\n  Extension,\r\n  type FormatterAbstract,\r\n  type FormatterOptions,\r\n} from \"./formater.types\";\r\n\r\nimport { PassThrough, type Writable } 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    writableStream: Writable,\r\n    products: Product[],\r\n    categories?: Category[],\r\n    brands?: Brand[],\r\n    options?: FormatterOptions,\r\n  ): Promise<void> {\r\n    const result = new PassThrough();\r\n    result.pipe(writableStream);\r\n\r\n    const builder = new XMLBuilder({\r\n      ignoreAttributes: false,\r\n      cdataPropName: \"__cdata\",\r\n      format: true,\r\n      indentBy: \"  \",\r\n    });\r\n\r\n    const date = getRFC3339Date(new Date());\r\n\r\n    // Начинаем формирование XML\r\n    result.write('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n');\r\n    result.write('<yml_catalog date=\"' + date + '\">\\n');\r\n\r\n    // Открываем тег <shop>\r\n    result.write(\"<shop>\\n\");\r\n\r\n    const resultWriter = writeWithDrain(result);\r\n    // Добавляем информацию о магазине\r\n    if (options?.shopName) {\r\n      await resultWriter(builder.build({ name: options.shopName }));\r\n      await resultWriter(\"\\n\");\r\n    }\r\n    if (options?.companyName) {\r\n      await resultWriter(builder.build({ company: options.companyName }));\r\n      await resultWriter(\"\\n\");\r\n    }\r\n\r\n    // Добавляем категории и бренды\r\n    if (categories) {\r\n      await resultWriter(\r\n        builder.build({\r\n          // tagname: \"categories\",\r\n          categories: { category: this.getCategories(categories) },\r\n        }),\r\n      );\r\n      await resultWriter(\"\\n\");\r\n    }\r\n    if (brands) {\r\n      await resultWriter(\r\n        builder.build({ brands: { brand: this.getBrands(brands) } }),\r\n      );\r\n      await resultWriter(\"\\n\");\r\n    }\r\n\r\n    // Открываем секцию <offers>\r\n    await resultWriter(\"<offers>\\n\");\r\n\r\n    // Создаем поток для обработки offer элементов\r\n    const offerStream = new PassThrough();\r\n    const offerWriter = writeWithDrain(offerStream);\r\n\r\n    // Пайпим поток offer элементов в основной итоговый поток\r\n    offerStream.pipe(result, { end: false });\r\n\r\n    // Записываем каждый продукт в поток\r\n    for (const product of products) {\r\n      if (product.price === 0) continue;\r\n      const offer = builder.build({ offer: this.getOffer(product) });\r\n      await offerWriter(offer + \"\\n\");\r\n    }\r\n\r\n    // Завершаем поток offer\r\n    offerStream.end();\r\n\r\n    offerStream.on(\"end\", () => {\r\n      // Закрываем секцию <offers>\r\n      result.write(\"</offers>\\n\");\r\n\r\n      // Закрываем тег <shop>\r\n      result.write(\"</shop>\\n\");\r\n\r\n      // Закрываем тег <yml_catalog>\r\n      result.write(\"</yml_catalog>\\n\");\r\n\r\n      // Завершаем итоговый поток\r\n      result.end();\r\n    });\r\n  }\r\n\r\n  private getBrands(brands?: Brand[]) {\r\n    if (!brands) return [];\r\n\r\n    return brands.map((brand) => ({\r\n      \"@_id\": brand.id,\r\n      \"@_url\": brand.coverURL ?? \"\",\r\n      \"#text\": brand.name,\r\n    }));\r\n  }\r\n\r\n  private getCategories(categories?: Category[]) {\r\n    if (!categories) return [];\r\n\r\n    return categories.map((cat) => ({\r\n      \"@_id\": cat.id,\r\n      \"@_parentId\": cat.parentId ?? \"\",\r\n      \"#text\": cat.name || `Категория #${cat.id}`,\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      \"time-delivery\": product.timeDelivery\r\n        ? {\r\n            \"@_min\": product.timeDelivery.min,\r\n            \"@_max\": product.timeDelivery.max,\r\n            \"#text\": `${product.timeDelivery.min}-${product.timeDelivery.max}`,\r\n          }\r\n        : undefined,\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\r\n        ? {\r\n            \"@_unit\": product.age.unit,\r\n            \"#text\": product.age.value,\r\n          }\r\n        : undefined,\r\n      \"tn-ved-codes\": product.codesTN?.length\r\n        ? {\r\n            \"tn-ved-code\": product.codesTN,\r\n          }\r\n        : undefined,\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 { Extension } from \"./formater.types\";\r\nimport { YMLFormatter } from \"./YML.formatter\";\r\n\r\nexport class XMLFormatter extends YMLFormatter {\r\n  public formatterName = \"XML\";\r\n  public fileExtension = Extension.XML;\r\n}\r\n","import { CSVFormatter } from \"./CSV.formatter\";\r\nimport { ExcelFormatter } from \"./Excel.formatter\";\r\nimport { InsalesFormatter } from \"./Insales.formatter\";\r\nimport { JSONFormatter } from \"./JSON.formatter\";\r\nimport { SimpleJSONFormatter } from \"./SimpleJSON.formatter\";\r\nimport { TgShopFormatter } from \"./TgShop.formatter\";\r\nimport { TildaFormatter } from \"./Tilda.formatter\";\r\nimport { WooCommerceFormatter } from \"./WooCommerce.formatter\";\r\nimport { XMLFormatter } from \"./XML.formatter\";\r\nimport { YMLFormatter } from \"./YML.formatter\";\r\n\r\nexport * from \"./formater.types\";\r\n\r\nexport const Formatters = {\r\n  TildaFormatter,\r\n  CSVFormatter,\r\n  InsalesFormatter,\r\n  YMLFormatter,\r\n  TgShopFormatter,\r\n  ExcelFormatter,\r\n  JSONFormatter,\r\n  SimpleJSONFormatter,\r\n  XMLFormatter,\r\n  WooCommerceFormatter,\r\n};\r\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<Context extends object | undefined> {\r\n  private _context: Context;\r\n\r\n  constructor(readonly context: Context) {\r\n    this._context = context;\r\n  }\r\n\r\n  public setContext(context: Context): void {\r\n    this._context = context;\r\n  }\r\n\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<Context>>();\r\n\r\n  public setTransformers(transformers: Array<Transformer<Context>>): 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(\r\n        transformedProducts,\r\n        this._context,\r\n      );\r\n\r\n    const writableStream = this.exporter();\r\n\r\n    await this.formatter.format(\r\n      writableStream,\r\n      transformedProducts,\r\n      categories,\r\n      brands,\r\n      option,\r\n    );\r\n  }\r\n}\r\n","export interface Product {\r\n  /**\r\n   * **ID товара**\r\n   *\r\n   * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\r\n   *\r\n   * Пример: belaya-kofta-12345\r\n   */\r\n  productId: number;\r\n  /**\r\n   * **Родительскй SKU**\r\n   *\r\n   * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\r\n   *\r\n   * Пример: belaya-kofta-12345\r\n   */\r\n  parentId?: number;\r\n  /**\r\n   * **SKU**\r\n   *\r\n   * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\r\n   *\r\n   * Пример: belaya-kofta-12345\r\n   */\r\n  variantId: number;\r\n  /**\r\n   * **Название**\r\n   *\r\n   * Составляйте название по схеме: тип + бренд или производитель + модель + особенности, если есть (например, цвет, размер или вес) и количество в упаковке.\r\n   *\r\n   * Не включайте в название условия продажи (например, «скидка», «бесплатная доставка» и т. д.), эмоциональные характеристики («хит», «супер» и т. д.). Не пишите слова большими буквами — кроме устоявшихся названий брендов и моделей.\r\n   *\r\n   * Оптимальная длина — 50–60 символов, максимальная — 150.\r\n   *\r\n   * Составлять хорошие названия помогут [рекомендации](https://yandex.ru/support/marketplace/assortment/fields/title.html).\r\n   *\r\n   * Пример: Ударная дрель Makita HP1630, 710 Вт\r\n   */\r\n  title: string;\r\n  /**\r\n   * **Описание**\r\n   *\r\n   * Подробное описание товара: например, его преимущества и особенности.\r\n   *\r\n   * Не давайте в описании инструкций по установке и сборке. Не используйте слова «скидка», «распродажа», «дешевый», «подарок» (кроме подарочных категорий), «бесплатно», «акция», «специальная цена», «новинка», «new», «аналог», «заказ», «хит». Не указывайте никакой контактной информации и не давайте ссылок.\r\n   *\r\n   * Можно использовать теги:\r\n   *\r\n   ** &lt;h&gt;, &lt;h1&gt;, &lt;h2&gt; и так далее — для заголовков;\r\n   ** &lt;br&gt; и &lt;p&gt; — для переноса строки;\r\n   ** &lt;ol&gt; — для нумерованного списка;\r\n   ** &lt;ul&gt; — для маркированного списка;\r\n   ** &lt;li&gt; — для создания элементов списка (должен находиться внутри &lt;ol&gt; или &lt;ul&gt;);\r\n   ** &lt;div&gt; — поддерживается, но не влияет на отображение текста.\r\n   * Оптимальная длина — 400–600 символов, максимальная — 6000.\r\n   *\r\n   * Составить хорошее описание помогут рекомендации.\r\n   *\r\n   * Пример: В комплекте с детским микроскопом есть все, что нужно вашему ребенку для изучения микромира\r\n   */\r\n  description: string;\r\n  /**\r\n   * **Бренд**\r\n   *\r\n   * Название бренда или производителя.\r\n   *\r\n   * Записывайте название так, как его пишет сам бренд.\r\n   *\r\n   * Пример: LEVENHUK\r\n   */\r\n  vendor?: string;\r\n  /**\r\n   * **Артикул производителя**\r\n   *\r\n   * Код товара, который ему присвоил производитель.\r\n   *\r\n   * Если артикулов несколько, укажите их через запятую.\r\n   *\r\n   * Пример: VNDR-0005A, VNDR-0005B\r\n   */\r\n  vendorCode?: string;\r\n  /**\r\n   * **Дата выхода**\r\n   *\r\n   * Пример: 01.01.2000\r\n   */\r\n  saleDate?: string;\r\n  /**\r\n   * **Вендор в магазине**\r\n   *\r\n   * Содержит номер вендора, а не ее название.\r\n   */\r\n  vendorId?: number;\r\n  /**\r\n   * **Категория в магазине**\r\n   *\r\n   * Категория, к которой вы относите товар. Она помогает точнее определить для товара категорию на Маркете.\r\n   *\r\n   * Указывайте конкретные категории — например, набор ножей лучше отнести к категории Столовые приборы, а не просто Посуда.\r\n   *\r\n   * Выбирайте категории, которые описывают товар, а не абстрактный признак — например, лучше указать Духи, а не Подарки.\r\n   *\r\n   * Содержит номер категории, а не ее название.\r\n   */\r\n  categoryId: number;\r\n  /**\r\n   * **Страна производства**\r\n   *\r\n   * Страна, где был произведен товар.\r\n   *\r\n   * Записывайте названия стран так, как они записаны в [списке](https://yastatic.net/s3/doc-binary/src/support/market/ru/countries.xlsx).\r\n   *\r\n   * Пример: Россия\r\n   */\r\n  countryOfOrigin?: string;\r\n  /**\r\n   * **Изображение**\r\n   *\r\n   * До двадцати изображений, которые показываются на карточке товара.\r\n   *\r\n   * Принимаются jpg- или png-изображения товара, соответствующие [требованиям](https://yandex.ru/support/marketplace/assortment/fields/images.html).\r\n   *\r\n   * В кабинете изображения добавляются в виде файлов. В Excel-файле — в виде ссылок через запятую. Первое фото становится основным.\r\n   *\r\n   * Чтобы изменить изображение, выложите новое по новой ссылке, иначе картинка не обновится.\r\n   */\r\n  images?: string[];\r\n  /**\r\n   * **Видео**\r\n   *\r\n   * Видеоиллюстрации для карточки товара.\r\n   *\r\n   * Видео должно соответствовать [требованиям](https://yandex.ru/support/marketplace/assortment/fields/video.html).\r\n   *\r\n   * Можно добавить не больше 6 видео.\r\n   *\r\n   * В кабинете можно загрузить видеофайлы. В Excel-шаблоне укажите ссылки на файлы.\r\n   */\r\n  videos?: string[];\r\n  /**\r\n   * **Базовая цена**\r\n   *\r\n   * Цена указывается в рублях. Число должно быть целым.\r\n   *\r\n   * Пример:\r\n   *\r\n   * 240\r\n   */\r\n  price: number;\r\n  /**\r\n   * **Цена до скидки**\r\n   *\r\n   * Цена указывается в рублях. Число должно быть целым.\r\n   *\r\n   * Вы можете указать цену со скидкой от 5 до 75 %.\r\n   *\r\n   * Пример:\r\n   *\r\n   * 250\r\n   */\r\n  oldPrice?: number;\r\n  /**\r\n   * **Себестоимость**\r\n   *\r\n   * Цена указывается в рублях. Число должно быть целым.\r\n   *\r\n   * Пример:\r\n   *\r\n   * 200\r\n   */\r\n  purchasePrice?: number;\r\n  /**\r\n   * **Дополнительные расходы**\r\n   *\r\n   * Дополнительные расходы на товар. Например, на доставку или упаковку.\r\n   *\r\n   * После заполнения этого поля в калькуляторе и на странице управления ценами рассчитается потенциальная маржинальность товара.\r\n   *\r\n   * Цена указывается в рублях. Число должно быть целым.\r\n   *\r\n   * Пример:\r\n   *\r\n   * 75\r\n   */\r\n  additionalExpenses?: number;\r\n  /**\r\n   * **Порог для скидок с Маркетом**\r\n   *\r\n   * Цена указывается в рублях. Число должно быть целым.\r\n   *\r\n   * Пример:\r\n   *\r\n   * 300\r\n   */\r\n  cofinancePrice?: number;\r\n  /**\r\n   * **Валюта (DBS)**\r\n   *\r\n   * Валюта, в которой указана цена товара. Покупателям Маркет показывает цену в рублях, пересчитывая ее по курсу Центробанка.\r\n   *\r\n   * Поле используется, если для кабинета еще не включена работа с базовыми ценами.\r\n   *\r\n   * Поддерживаются российские и белорусские рубли, евро, доллары, украинские гривны и казахстанские тенге.\r\n   *\r\n   * В кабинете валюту можно просто выбрать из списка. В Excel-файле указывается код валюты: RUR, BYN, EUR, USD, UAN, KZT.\r\n   */\r\n  currency: Currency;\r\n  /**\r\n   * **Ссылка на страницу товара**\r\n   *\r\n   * Адрес страницы на вашем сайте с фотографиями и описанием товара.\r\n   *\r\n   * Максимальная длина URL — 512 символов. Записывайте его согласно стандарту RFC 3986.\r\n   *\r\n   * Пример: http://best.seller.ru/product_page.asp?pid=12346\r\n   */\r\n  url?: string;\r\n  /**\r\n   * **Убрать из продажи**\r\n   *\r\n   * Поле позволяет приостановить продажу товара.\r\n   *\r\n   * Укажите значение true, если нужно приостановить продажу.\r\n   */\r\n  disabled?: boolean;\r\n  /**\r\n   * **Доступное количество товара**\r\n   *\r\n   * Общее количество товара, доступное для продажи\r\n   *\r\n   * Укажите 0, если товара нет в наличии.\r\n   *\r\n   * Пример: 7\r\n   */\r\n  count?: number;\r\n  /**\r\n   * **Товар в наличии (DBS)**\r\n   *\r\n   * Поле указывает, есть ли товар в наличии.\r\n   */\r\n  available?: boolean;\r\n  /**\r\n   * **Время доставки**\r\n   *\r\n   * Указывает на время доставки в днях, от и до скольких.\r\n   */\r\n  timeDelivery?: { min?: number; max?: number };\r\n  /**\r\n   * **Минимальное количество товара**\r\n   *\r\n   * Если значение задано, покупатель не сможет заказать меньше единиц товара. Ограничение не работает, когда товара на складе осталось меньше этого количества — тогда покупатель сможет сделать заказ на остаток.\r\n   *\r\n   * Целое число.\r\n   */\r\n  minQuantity?: number;\r\n  /**\r\n   * **Квант продажи**\r\n   *\r\n   * Если значение задано, покупатель сможет добавить к заказу только кратное количество товара. Ограничение не работает, когда на складе осталось меньше этого количества — тогда покупатель сможет сделать заказ на остаток.\r\n   *\r\n   * Целое число.\r\n   */\r\n  stepQuantity?: number;\r\n  /**\r\n   * **Штрихкод**\r\n   *\r\n   * Указывайте в виде последовательности символов. Подойдут коды EAN-13, EAN-8, UPC-A, UPC-E или Code 128.\r\n   *\r\n   * Для книг указывайте ISBN.\r\n   *\r\n   * Для товаров [определенных категорий и торговых марок](https://yastatic.net/s3/doc-binary/src/support/market/ru/yandex-market-list-for-gtin.xlsx) штрихкод должен быть действительным кодом GTIN. Обратите внимание: внутренние штрихкоды, начинающиеся на 2 или 02, и коды формата Code 128 не являются GTIN.\r\n   *\r\n   * Если штрихкодов несколько, напишите все через запятую.\r\n   *\r\n   * Пример: 46012300000000\r\n   */\r\n  barcode?: string;\r\n  /**\r\n   * **Код ТН ВЭД**\r\n   *\r\n   * Для некоторых категорий товаров код ТН ВЭД обязателен. Если это касается ваших товаров, вы получите уведомление в каталоге.\r\n   *\r\n   * 10 или 14 цифр без пробелов.\r\n   *\r\n   * Пример: 8517610008\r\n   */\r\n  codesTN?: string[];\r\n  /**\r\n   * **С какого возраста пользоваться**\r\n   *\r\n   * Если товар не предназначен для детей младше определенного возраста, укажите это.\r\n   *\r\n   * Возрастные ограничения можно задавать в годах (с нуля, с 6, 12, 16 или 18) или в месяцах (любое число от 0 до 12).\r\n   */\r\n  age?: { unit: \"year\" | \"month\"; value: number };\r\n  /**\r\n   * **Вес с упаковкой**\r\n   *\r\n   * Вес товара с упаковкой.\r\n   *\r\n   * Единица измерения — килограммы. Можно дроби: разделитель — точка или запятая, не больше трех цифр после него.\r\n   *\r\n   * Пример: 3.1\r\n   */\r\n  weight?: number;\r\n  /**\r\n   * **Габариты с упаковкой**\r\n   *\r\n   * Длина, ширина, высота в упаковке.\r\n   *\r\n   * Единица измерения — сантиметры. Можно дроби: разделитель — точка или запятая, не больше трех цифр после него.\r\n   *\r\n   * Пример: 20.1/20.551/22.5\r\n   */\r\n  dimensions?: string;\r\n  /**\r\n   * **Товар занимает больше одного места**\r\n   *\r\n   * Если товар занимает одно место (представляет собой одну коробку, упаковку и так далее), оставьте поле пустым. Если товар занимает несколько мест — укажите их количество. Например, кондиционер занимает два места — внешний и внутренний блоки в двух коробках.\r\n   *\r\n   * Укажите количество мест.\r\n   *\r\n   * Пример: 2\r\n   */\r\n  boxCount?: number;\r\n  /**\r\n   * **Ставка НДС**\r\n   *\r\n   * Значение ставки НДС для товара.\r\n   *\r\n   * Выберите одно из значений:\r\n   *\r\n   ** НДС не облагается — 6 или NO_VAT\r\n   *\r\n   ** 0 % — 5 или VAT_0\r\n   *\r\n   ** 10 % — 2 или VAT_10\r\n   *\r\n   ** 20 % — 7 или VAT_20\r\n   *\r\n   * Если не заполнено, Маркет устанавливает ставку, соответствующую схеме налогообложения.\r\n   *\r\n   * Пример: VAT_20\r\n   */\r\n  vat: Vat;\r\n  /**\r\n   * **Характеристики, которые есть только у товаров конкретной категории**\r\n   *\r\n   * Кроме общих свойств, у товара есть характеристики, присущие конкретной категории, к которой он относится. Например, у велосипеда есть размер рамы, а детское пюре бывает овощное, мясное или фруктовое.\r\n   */\r\n  params?: IParam[];\r\n  /**\r\n   * **Свойства товара**\r\n   *\r\n   * *не YML поле\r\n   */\r\n  properties?: IParam[];\r\n  /**\r\n   * **Теги**\r\n   *\r\n   * Придумайте любое название — его можно будет изменить после.\r\n   *\r\n   * Максимальная длина тега — 20 символов.\r\n   *\r\n   * У одного товара — максимум 10 тегов.\r\n   *\r\n   * Всего можно создать не больше 50 разных тегов.\r\n   *\r\n   * Пример: apple, до 500 рублей\r\n   */\r\n  tags?: string[];\r\n  /**\r\n   * **Товар для взрослых**\r\n   *\r\n   * Параметр включает для товара пометку 18+. Устанавливайте ее только для товаров, которые относятся к удовлетворению сексуальных потребностей.\r\n   */\r\n  adult?: boolean;\r\n  /**\r\n   * **Цифровой товар**\r\n   *\r\n   * Параметр, устанавливаемый для цифровых товаров, которые просто скачиваются.\r\n   */\r\n  downloadable?: boolean;\r\n  /**\r\n   * **Срок годности**\r\n   *\r\n   * Период с момента изготовления, по прошествии которого товар становится непригоден.\r\n   *\r\n   * Указывайте срок, указанный на банке или упаковке. Текущая дата, дата поставки или дата отгрузки значения не имеет.\r\n   *\r\n   * Срок можно указывать в годах, месяцах, днях, неделях и часах.\r\n   *\r\n   * Обязательно указывайте срок, если он есть.\r\n   *\r\n   * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\r\n   *\r\n   ** P1Y — 1 год;\r\n   ** P1Y6M — 1 год и 6 месяцев;\r\n   ** P15D — 15 дней.\r\n   */\r\n  validityPeriod?: string;\r\n  /**\r\n   * **Комментарий к сроку годности**\r\n   *\r\n   * Поле предназначено для описаний условий хранения.\r\n   *\r\n   * Не длиннее 250 знаков и без спецсимволов.\r\n   *\r\n   * Пример: Хранить в сухом помещении\r\n   */\r\n  validityComment?: string;\r\n  /**\r\n   * **Срок службы**\r\n   *\r\n   * В течение срока службы товар должен исправно выполнять свою функцию.\r\n   *\r\n   * Обязательно указывайте срок, если он есть.\r\n   *\r\n   * Срок можно указывать в годах, месяцах и днях.\r\n   * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\r\n   *\r\n   ** P1Y — 1 год;\r\n   ** P1Y2M — 1 год и 2 месяца;\r\n   ** P15D — 15 дней;\r\n   ** P2Y10D — 2 года, 10 дней;\r\n   ** P2Y6M10D — 2 года, 6 месяцев и 10 дней.\r\n   */\r\n  serviceLifePeriod?: string;\r\n  /**\r\n   * **Комментарий к сроку службы**\r\n   *\r\n   * Поле предназначено для описаний условий использования.\r\n   *\r\n   * Не длиннее 250 знаков и без спецсимволов.\r\n   *\r\n   * Пример: Использовать при температуре не ниже −10 градусов\r\n   */\r\n  serviceLifeComment?: string;\r\n  /**\r\n   * **Гарантийный срок**\r\n   *\r\n   * В течение какого времени можно бесплатно заменить или починить товар.\r\n   *\r\n   *  Срок можно указывать в годах, месяцах или днях.\r\n   *\r\n   * Продолжительность указывается согласно ISO 8601, то есть в виде строчки, начинающейся буквой P:\r\n   *\r\n   ** P1Y — 1 год;\r\n   ** P1Y2M — 1 год и 2 месяца;\r\n   ** P15D — 15 дней;\r\n   ** P2Y10D — 2 года, 10 дней;\r\n   ** P2Y6M10D — 2 года, 6 месяцев и 10 дней.\r\n   */\r\n  warrantyPeriod?: string;\r\n  /**\r\n   * **Комментарий к гарантийному сроку**\r\n   *\r\n   * Поле предназначено для описания особенностей гарантийных условий.\r\n   *\r\n   * Указывайте только то, что относится к гарантии изготовителя.\r\n   *\r\n   * Не длиннее 250 знаков и без спецсимволов.\r\n   *\r\n   * Пример: Гарантия на аккумулятор — 6 месяцев\r\n   */\r\n  warrantyComment?: string;\r\n  /**\r\n   * **Официальная гарантия производителя**\r\n   */\r\n  manufacturerWarranty?: boolean;\r\n  /**\r\n   * **Номер документа**\r\n   *\r\n   * Номер документа на товар: сертификата, декларации соответствия и т. п.\r\n   *\r\n   * Прежде чем указывать номер документа, загрузите скан документа через кабинет.\r\n   *\r\n   * Укажите номер документа.\r\n   *\r\n   * Пример: 6241421\r\n   */\r\n  certificate?: string;\r\n  /**\r\n   * **Ключевые слова**\r\n   *\r\n   * Пример: Кроссовки, высокая подошва\r\n   */\r\n  keywords?: string[];\r\n  /**\r\n   * **Размерная сетка**\r\n   */\r\n  sizes?: ISize[];\r\n  /**\r\n   * **Связанные товары**\r\n   *\r\n   * Указываются id товаров\r\n   *\r\n   * Пример: 1234\r\n   */\r\n  relatedProducts?: number[];\r\n  /**\r\n   * **Название коллекции, ряда или серии товара**\r\n   *\r\n   * Пример: Jordan 4\r\n   */\r\n  seriesName?: string;\r\n  /**\r\n   * **Пол или название группы потребителей**\r\n   *\r\n   * Пример: Дети, Женское, Унисекс\r\n   */\r\n  gender?: string;\r\n  /**\r\n   * **Кол-во клиентов, которым понравился товар**\r\n   *\r\n   * Пример: 982134\r\n   */\r\n  favoriteCount?: number;\r\n}\r\n\r\nexport enum Vat {\r\n  NO_VAT = \"NO_VAT\",\r\n  VAT_0 = \"VAT_0\",\r\n  VAT_10 = \"VAT_10\",\r\n  VAT_20 = \"VAT_20\",\r\n}\r\n\r\nexport enum Currency {\r\n  RUR = \"RUR\",\r\n  BYN = \"BYN\",\r\n  EUR = \"EUR\",\r\n  USD = \"USD\",\r\n  UAN = \"UAN\",\r\n  KZT = \"KZT\",\r\n}\r\n\r\nexport interface IParam {\r\n  /**\r\n   * **Название характеристики**\r\n   */\r\n  key: string;\r\n  /**\r\n   * **Значение**\r\n   */\r\n  value: string;\r\n}\r\n\r\nexport interface ISize {\r\n  /**\r\n   * **Название единицы измерения**\r\n   */\r\n  name: string;\r\n  /**\r\n   * **Разделитель**\r\n   */\r\n  delimiter: string;\r\n  /**\r\n   * **Значения размерного ряда**\r\n   *\r\n   * Размеры указываются через разделитель\r\n   */\r\n  value: string;\r\n}\r\n"],"names":["once","__publicField","PassThrough","Extension","stream","categories","JsonStreamStringify","key","value","XMLBuilder","Vat","Currency"],"mappings":"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"}