{"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/Price.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\";\n\nexport const buildCategoryPaths = (\n  categories: Category[],\n): Map<number, Category[]> => {\n  const idToCategory = new Map<number, Category>();\n\n  categories.forEach((category) => {\n    idToCategory.set(category.id, category);\n  });\n\n  const categoryPaths = new Map<number, Category[]>();\n\n  categories.forEach((category) => {\n    const path: Category[] = [];\n\n    let currentCategory: Category | undefined = category;\n\n    while (currentCategory) {\n      path.unshift(currentCategory);\n\n      if (currentCategory.parentId !== undefined) {\n        currentCategory = idToCategory.get(currentCategory.parentId);\n      } else {\n        currentCategory = undefined;\n      }\n    }\n\n    categoryPaths.set(category.id, path);\n  });\n\n  return categoryPaths;\n};\n","import { once } from \"events\";\nimport { type Writable } from \"stream\";\n\nexport const writeWithDrain = (stream: Writable) => {\n  return async (chunk: any) => {\n    const canWrite = stream.write(chunk);\n    if (!canWrite) {\n      await once(stream, \"drain\");\n    }\n  };\n};\n","export const delay = async (ms: number) =>\n  await new Promise((resolve) => setTimeout(resolve, ms));\n","export function getRFC3339Date(date: Date): string {\n  const pad = (n: number) => n.toString().padStart(2, \"0\");\n  const year = date.getFullYear();\n  const month = pad(date.getMonth() + 1);\n  const day = pad(date.getDate());\n  const hour = pad(date.getHours());\n  const min = pad(date.getMinutes());\n\n  // Смещение в минутах\n  const tzOffset = -date.getTimezoneOffset();\n  const sign = tzOffset >= 0 ? \"+\" : \"-\";\n  const absOffset = Math.abs(tzOffset);\n  const offsetHour = pad(Math.floor(absOffset / 60));\n  const offsetMin = pad(absOffset % 60);\n\n  return `${year}-${month}-${day}T${hour}:${min}${sign}${offsetHour}:${offsetMin}`;\n}","export const urlQueryEncode = (inputUrl: string): string => {\n  try {\n    const url = new URL(inputUrl);\n    url.search = url.search.replace(/^\\?/, \"\").replace(/,/g, \"%2C\");\n    return url.toString();\n  } catch (error) {\n    console.error(\"Invalid URL:\", error);\n    return \"\";\n  }\n};\n","import { writeWithDrain } from \"../utils\";\n\nimport { PassThrough } from \"stream\";\n\nexport interface CSVStreamOptions {\n  delimiter?: string;\n  emptyFieldValue?: string;\n  lineSeparator?: string;\n}\n\nexport class CSVStream {\n  private readonly stream: PassThrough = new PassThrough();\n  private readonly delimiter: string = \";\";\n  private readonly lineSeparator: string = \"\\n\";\n  private readonly emptyFieldValue: string = \"\";\n  private columns = new Set<string>();\n  private readonly writer = writeWithDrain(this.stream);\n\n  constructor({ delimiter, lineSeparator, emptyFieldValue }: CSVStreamOptions) {\n    if (delimiter !== undefined) this.delimiter = delimiter;\n    if (lineSeparator !== undefined) this.lineSeparator = lineSeparator;\n    if (emptyFieldValue !== undefined) this.emptyFieldValue = emptyFieldValue;\n  }\n\n  public get writableStream() {\n    return this.stream;\n  }\n\n  setColumns(columns: Set<string>) {\n    this.columns = columns;\n    this.stream.write(\n      Array.from(this.columns).join(this.delimiter) + this.lineSeparator,\n    );\n  }\n\n  async addRow(items: Record<string, any>) {\n    const data =\n      Array.from(this.columns)\n        .map((key) =>\n          items[key] === undefined ? this.emptyFieldValue : items[key] + \"\",\n        )\n        .join(this.delimiter) + this.lineSeparator;\n\n    await this.writer(data);\n  }\n}\n","import { type Brand, type Category, type Product } from \"../types\";\n\nimport { type Writable } from \"stream\";\n\nexport abstract class FormatterAbstract {\n  public abstract formatterName: string;\n  public abstract fileExtension: Extension;\n\n  public abstract format(\n    writableStream: Writable,\n    products: Product[],\n    categories?: Category[],\n    brands?: Brand[],\n    option?: FormatterOptions,\n  ): Promise<void>;\n}\n\nexport interface FormatterOptions {\n  shopName?: string;\n\n  companyName?: string;\n\n  splitParams?: boolean;\n}\n\nexport enum Extension {\n  CSV = \"csv\",\n  YML = \"yml\",\n  XML = \"xml\",\n  XLSX = \"xlsx\",\n  JSON = \"json\",\n}\n","import { CSVStream } from \"../streams/CSVStream\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n  Extension,\n  type FormatterAbstract,\n  type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\nexport class CSVFormatter implements FormatterAbstract {\n  public formatterName = \"CSV\";\n  public fileExtension = Extension.CSV;\n\n  public async format(\n    writableStream: Writable,\n    products: Product[],\n    categories?: Category[],\n    _?: Brand[],\n    __?: FormatterOptions,\n  ): Promise<void> {\n    const mappedCategories: Record<number, string> = {};\n    categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n\n    const csvStream = new CSVStream({\n      delimiter: \";\",\n      emptyFieldValue: \"\",\n      lineSeparator: \"\\n\",\n    });\n    csvStream.writableStream.pipe(writableStream);\n    const columns = new Set<string>([\n      \"url\",\n      \"productId\",\n      \"parentId\",\n      \"variantId\",\n      \"title\",\n      \"description\",\n      \"vendor\",\n      \"vendorCode\",\n      \"category\",\n      \"images\",\n      \"videos\",\n      \"timeDeliveryMin\",\n      \"timeDeliveryMax\",\n      \"price\",\n      \"oldPrice\",\n      \"purchasePrice\",\n      \"currency\",\n      \"saleDate\",\n      \"countryOfOrigin\",\n      \"tags\",\n      \"codesTN\",\n      \"params\",\n      \"properties\",\n      \"sizes\",\n      \"keywords\",\n      \"relatedProducts\",\n    ]);\n    products.forEach((product) => {\n      Object.entries(product).forEach(([key, value]) => {\n        if (value) columns.add(key);\n      });\n    });\n    csvStream.setColumns(columns);\n    for (const product of products) {\n      const row: Record<string, any> = {\n        ...product,\n        category: mappedCategories[product.categoryId],\n        images: product.images?.join(\",\"),\n        videos: product.videos?.join(\",\"),\n        tags: product.tags?.join(\",\"),\n        codesTN: product.codesTN?.join(\", \"),\n        params: product.params\n          ?.map(({ key, value }) => `${key}=${value}`)\n          .join(\", \"),\n        properties: product.properties\n          ?.map(({ key, value }) => `${key}=${value}`)\n          .join(\", \"),\n        sizes: product.sizes\n          ?.map(({ name, value }) => `${name}=${value}`)\n          .join(\", \"),\n        keywords: product.keywords?.join(\",\"),\n        relatedProducts: product.relatedProducts?.join(\",\"),\n        timeDeliveryMin: product.timeDelivery?.min,\n        timeDeliveryMax: product.timeDelivery?.max,\n      };\n      await csvStream.addRow(row);\n    }\n\n    // Закрываем поток\n    csvStream.writableStream.end();\n  }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n  Extension,\n  type FormatterAbstract,\n  type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\nconst { stream } = pkg;\n\nexport class ExcelFormatter implements FormatterAbstract {\n  public formatterName = \"Excel\";\n  public fileExtension = Extension.XLSX;\n\n  public async format(\n    writableStream: Writable,\n    products: Product[],\n    categories?: Category[],\n    _?: Brand[],\n    __?: FormatterOptions,\n  ): Promise<void> {\n    const mappedCategories: Record<number, string> = {};\n    categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n    const columns = new Set<string>([\n      \"url\",\n      \"productId\",\n      \"parentId\",\n      \"variantId\",\n      \"title\",\n      \"description\",\n      \"vendor\",\n      \"vendorCode\",\n      \"category\",\n      \"images\",\n      \"videos\",\n      \"timeDeliveryMin\",\n      \"timeDeliveryMax\",\n      \"price\",\n      \"oldPrice\",\n      \"purchasePrice\",\n      \"currency\",\n      \"saleDate\",\n      \"countryOfOrigin\",\n      \"tags\",\n      \"codesTN\",\n      \"params\",\n      \"properties\",\n      \"sizes\",\n      \"keywords\",\n      \"relatedProducts\",\n    ]);\n    products.forEach((product) => {\n      Object.entries(product).forEach(([key, value]) => {\n        if (value) columns.add(key);\n      });\n    });\n\n    const workbook = new stream.xlsx.WorkbookWriter({\n      stream: writableStream,\n    });\n    const worksheet = workbook.addWorksheet(\"products\");\n    worksheet.columns = Array.from(columns).map((column) => ({\n      key: column,\n      header: column,\n    }));\n\n    products.forEach((product) => {\n      const row = {\n        ...product,\n        category: mappedCategories[product.categoryId],\n        images: product.images?.join(\",\"),\n        videos: product.videos?.join(\",\"),\n        tags: product.tags?.join(\",\"),\n        keywords: product.keywords?.join(\",\"),\n        relatedProducts: product.relatedProducts?.join(\",\"),\n        codesTN: product.codesTN?.join(\", \"),\n        params: product.params\n          ?.map(({ key, value }) => `${key}=${value}`)\n          .join(\", \"),\n        properties: product.properties\n          ?.map(({ key, value }) => `${key}=${value}`)\n          .join(\", \"),\n        sizes: product.sizes\n          ?.map(({ name, value }) => `${name}=${value}`)\n          .join(\", \"),\n        timeDeliveryMin: product.timeDelivery?.min,\n        timeDeliveryMax: product.timeDelivery?.max,\n      };\n      worksheet.addRow(row).commit();\n    });\n    worksheet.commit();\n    await workbook.commit();\n  }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n  Extension,\n  type FormatterAbstract,\n  type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\nconst { stream } = pkg;\n\nexport class InsalesFormatter implements FormatterAbstract {\n  public formatterName = \"Insales\";\n  public fileExtension = Extension.XLSX;\n\n  public async format(\n    writableStream: Writable,\n    products: Product[],\n    categories?: Category[],\n    _?: Brand[],\n    __?: FormatterOptions,\n  ): Promise<void> {\n    const mappedCategories: Record<number, Category> = {};\n    categories?.forEach(\n      (category) => (mappedCategories[category.id] = category),\n    );\n\n    const getParams = (product: Product): Record<string, string> => {\n      const properties: Record<string, string> = {};\n\n      product.params?.forEach(\n        (p) => (properties[`Свойство: ${p.key}`] = p.value),\n      );\n\n      return properties;\n    };\n    const getProperties = (product: Product): Record<string, string> => {\n      const properties: Record<string, string> = {};\n\n      product.properties?.forEach(\n        (p) => (properties[`Параметр: ${p.key}`] = p.value),\n      );\n\n      return properties;\n    };\n\n    const getCategories = (product: Product) => {\n      const categories: Record<string, string> = {};\n      const categoryList = new Array<string>();\n\n      function addCategory(categoryId: number | undefined) {\n        if (categoryId === undefined) return;\n\n        const category = mappedCategories[categoryId];\n        if (category) {\n          categoryList.push(category.name);\n          addCategory(category.parentId);\n        }\n      }\n\n      addCategory(product.categoryId);\n\n      categoryList.forEach((name, i) => {\n        const index = categoryList.length - 1 - i;\n        const key = index === 0 ? \"Корневая\" : `Подкатегория ${index}`;\n        categories[key] = name;\n      });\n\n      return categories;\n    };\n    const workbook = new stream.xlsx.WorkbookWriter({\n      stream: writableStream,\n    });\n    const worksheet = workbook.addWorksheet(\"products\");\n    const columns = new Set<string>([\n      \"Внешний ID\",\n      \"Ссылка на товар\",\n      \"Артикул\",\n      \"Корневая\",\n      \"Подкатегория 1\",\n      \"Подкатегория 2\",\n      \"Название товара или услуги\",\n      \"Время доставки: Минимальное\",\n      \"Время доставки: Максимальное\",\n      \"Старая цена\",\n      \"Цена продажи\",\n      \"Cебестоимость\",\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\n    worksheet.columns = Array.from(columns).map((column) => ({\n      header: column,\n      key: column,\n    }));\n\n    for (const product of products) {\n      const externalId = `${product.productId}-${product.variantId}`;\n      const row = {\n        \"Внешний ID\": externalId,\n        \"Ссылка на товар\": product.url,\n        Артикул: externalId, // TODO: product.vendorCode,\n        \"Название товара или услуги\": product.title,\n        \"Время доставки: Минимальное\": product.timeDelivery?.min,\n        \"Время доставки: Максимальное\": product.timeDelivery?.max,\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        \"Параметр: Артикул\": product.vendorCode, // TODO: брать из обычных параметров\n        ...getParams(product),\n        ...getProperties(product),\n        \"Размерная сетка\": JSON.stringify(product.sizes),\n        \"Связанные товары\": product.relatedProducts?.join(\",\"),\n        \"Ключевые слова\": product.keywords?.join(\",\"),\n      };\n      // todo(delay)\n      worksheet.addRow(row).commit();\n    }\n\n    worksheet.commit();\n    await workbook.commit();\n  }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n  Extension,\n  type FormatterAbstract,\n  type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\nexport class JSONFormatter implements FormatterAbstract {\n  public formatterName = \"JSON\";\n  public fileExtension = Extension.JSON;\n\n  public async format(\n    writableStream: Writable,\n    products: Product[],\n    categories?: Category[],\n    brands?: Brand[],\n    _?: FormatterOptions,\n  ): Promise<void> {\n    const stream = new JsonStreamStringify({\n      categories,\n      brands,\n      products,\n    });\n    stream.pipe(writableStream);\n  }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\n\nimport type { Brand, Category, Currency, IParam, Product } from \"../types\";\nimport {\n  Extension,\n  type FormatterAbstract,\n  type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\ninterface PriceSku {\n  skuId: string;\n  price: number;\n  currency: Currency;\n  timeDelivery?: {\n    min: number;\n    max: number;\n  };\n  params?: IParam[];\n}\n\ninterface PriceProduct {\n  productId: number;\n  skus: PriceSku[];\n}\n\nexport class PriceFormatter implements FormatterAbstract {\n  public formatterName = \"Price\";\n  public fileExtension = Extension.JSON;\n\n  public async format(\n    writableStream: Writable,\n    products: Product[],\n    _categories?: Category[],\n    _brands?: Brand[],\n    _?: FormatterOptions,\n  ): Promise<void> {\n    const priceMap = new Map<number, PriceProduct>();\n\n    products.forEach((product) => {\n      const existing = priceMap.get(product.productId);\n      const sku: PriceSku = {\n        skuId: String(product.variantId),\n        price: product.price,\n        currency: product.currency,\n        params: product.params,\n      };\n\n      if (\n        product.timeDelivery?.min !== undefined ||\n        product.timeDelivery?.max !== undefined\n      ) {\n        sku.timeDelivery = {\n          min: product.timeDelivery.min ?? 0,\n          max: product.timeDelivery.max ?? 0,\n        };\n      }\n\n      if (existing) {\n        existing.skus.push(sku);\n      } else {\n        priceMap.set(product.productId, {\n          productId: product.productId,\n          skus: [sku],\n        });\n      }\n    });\n\n    const result: PriceProduct[] = Array.from(priceMap.values());\n    const stream = new JsonStreamStringify(result);\n    stream.pipe(writableStream);\n  }\n}\n","import { JsonStreamStringify } from \"json-stream-stringify\";\n\nimport { type Brand, type Category, type Product } from \"../types\";\nimport {\n  Extension,\n  type FormatterAbstract,\n  type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\ninterface SimpleProduct extends Product {\n  children: Product[];\n}\n\nexport class SimpleJSONFormatter implements FormatterAbstract {\n  public formatterName = \"JSON\";\n  public fileExtension = Extension.JSON;\n\n  public async format(\n    writableStream: Writable,\n    products: Product[],\n    categories?: Category[],\n    brands?: Brand[],\n    _?: FormatterOptions,\n  ): Promise<void> {\n    const groupedProduct = new Map<number, SimpleProduct>();\n    products.forEach((product) => {\n      if (product.parentId !== undefined) return;\n      groupedProduct.set(product.variantId, {\n        ...product,\n        children: [],\n      });\n    });\n    products.forEach((product) => {\n      if (product.parentId === undefined) return;\n      const parent = groupedProduct.get(product.parentId);\n      if (!parent) return;\n      parent.children.push(product);\n    });\n    const stream = new JsonStreamStringify({\n      categories,\n      brands,\n      products: Array.from(groupedProduct.values()),\n    });\n    stream.pipe(writableStream);\n  }\n}\n","import pkg from \"exceljs\";\n\nimport { type Brand, type Category, type IParam, type Product } from \"../types\";\nimport {\n  Extension,\n  type FormatterAbstract,\n  type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\nconst { stream } = pkg;\n\nexport class TgShopFormatter implements FormatterAbstract {\n  public formatterName = \"TgShop\";\n  public fileExtension = Extension.XLSX;\n\n  public async format(\n    writableStream: Writable,\n    products: Product[],\n    categories?: Category[],\n    _?: Brand[],\n    __?: FormatterOptions,\n  ): Promise<void> {\n    const getParameter = (product: Product, key: string): IParam | undefined =>\n      product.params?.find((value) => value.key === key);\n\n    const convertProduct = (product: Product) => ({\n      \"category id\": product.categoryId,\n      \"group id\": product.parentId,\n      \"id product\": product.variantId,\n      \"name product\": product.title,\n      price: product.price,\n      picture: product.images?.join(\", \"),\n      vendorCode: product.vendorCode,\n      oldprice: product.oldPrice,\n      description: product.description,\n      shortDescription: \"\",\n      quantityInStock: product.count,\n      color: getParameter(product, \"color\")?.value,\n      size: getParameter(product, \"size\")?.value,\n      priority: undefined,\n    });\n    const workbook = new stream.xlsx.WorkbookWriter({\n      stream: writableStream,\n    });\n    const categoryWorksheet = workbook.addWorksheet(\"categories\");\n    const productsWorksheet = workbook.addWorksheet(\"offers\");\n    categoryWorksheet.columns = [\n      {\n        header: \"id\",\n        key: \"id\",\n      },\n      {\n        header: \"parentId\",\n        key: \"parentId\",\n      },\n      {\n        header: \"name\",\n        key: \"name\",\n      },\n    ];\n    const columns = [\n      \"category id\",\n      \"group id\",\n      \"id product\",\n      \"name product\",\n      \"price\",\n      \"picture\",\n      \"vendorCode\",\n      \"oldprice\",\n      \"description\",\n      \"shortDescription\",\n      \"quantityInStock\",\n      \"color\",\n      \"size\",\n      \"priority\",\n    ];\n\n    productsWorksheet.columns = columns.map((column) => ({\n      header: column,\n      key: column,\n    }));\n\n    categories?.forEach((category) => {\n      categoryWorksheet.addRow(category).commit();\n    });\n\n    products.forEach((product) => {\n      productsWorksheet.addRow(convertProduct(product)).commit();\n    });\n    categoryWorksheet.commit();\n    productsWorksheet.commit();\n\n    await workbook.commit();\n  }\n}\n","import { CSVStream } from \"../streams/CSVStream\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport { urlQueryEncode } from \"../utils\";\nimport {\n  Extension,\n  type FormatterAbstract,\n  type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\nexport class TildaFormatter implements FormatterAbstract {\n  public formatterName = \"Tilda\";\n  public fileExtension = Extension.CSV;\n\n  public async format(\n    writableStream: Writable,\n    products: Product[],\n    categories?: Category[],\n    _?: Brand[],\n    __?: FormatterOptions,\n  ): Promise<void> {\n    const mappedCategories: Record<number, string> = {};\n    categories?.forEach(({ id, name }) => (mappedCategories[id] = name));\n\n    const csvStream = new CSVStream({\n      delimiter: \"\\t\",\n      emptyFieldValue: \"\",\n      lineSeparator: \"\\n\",\n    });\n    csvStream.writableStream.pipe(writableStream);\n    const columns = new Set<string>([\n      \"SKU\",\n      \"Brand\",\n      \"Category\",\n      \"Title\",\n      \"Text\",\n      \"Photo\",\n      \"Price\",\n      \"Price Old\",\n      \"Quantity\",\n      \"Editions\",\n      \"External ID\",\n      \"Parent UID\",\n    ]);\n\n    const characteristics = new Set<string>();\n\n    products.forEach((product) => {\n      product.properties?.forEach(({ key }) => {\n        characteristics.add(key);\n      });\n    });\n\n    characteristics.forEach((charKey) => {\n      columns.add(`Characteristics:${charKey}`);\n    });\n\n    csvStream.setColumns(columns);\n    for (const product of products) {\n      const row: Record<string, string | number | undefined> = {\n        SKU: product.vendorCode,\n        Brand: product.vendor,\n        Category: mappedCategories[product.categoryId],\n        Title: product.title,\n        Text: product.description,\n        Photo: product.images?.map(urlQueryEncode).join(\",\"),\n        Price: product.price,\n        \"Price Old\": product.oldPrice,\n        Quantity: product.count,\n        Editions: product.params\n          ?.map(({ key, value }) => `${key}:${value}`)\n          .join(\";\"),\n        \"External ID\": product.variantId,\n        \"Parent UID\": product.parentId,\n      };\n\n      product.properties?.forEach(({ key, value }) => {\n        row[`Characteristics:${key}`] = value;\n      });\n\n      await csvStream.addRow(row);\n    }\n\n    csvStream.writableStream.end();\n  }\n}\n","import { CSVStream } from \"../streams/CSVStream\";\nimport { type IParam, type Brand, type Category, type Product } from \"../types\";\nimport { buildCategoryPaths, urlQueryEncode } from \"../utils\";\nimport {\n  Extension,\n  type FormatterAbstract,\n  type FormatterOptions,\n} from \"./formater.types\";\n\nimport { type Writable } from \"stream\";\n\nexport interface CreateAttributeProps {\n  name?: string;\n  id?: number;\n  values?: string | number;\n  visible?: number;\n  global?: number;\n}\n\nexport class WooCommerceFormatter implements FormatterAbstract {\n  public formatterName = \"WooCommerce\";\n  public fileExtension = Extension.CSV;\n\n  private readonly DEFAULT_COLUMNS = [\n    \"ID\",\n    \"Type\",\n    \"SKU\",\n    \"Name\",\n    \"Parent\",\n    \"Short description\",\n    \"Description\",\n    \"Stock\",\n    \"Regular price\",\n    \"Position\",\n    \"Categories\",\n    \"Tags\",\n    \"Images\",\n    \"SizeGrid\",\n  ];\n\n  private formatKeyAttribute(key: string) {\n    const keyWithoutInvalidCharacters = key\n      .replaceAll(\",\", \"\")\n      .replaceAll(\";\", \"\");\n\n    return keyWithoutInvalidCharacters.length >= 28\n      ? keyWithoutInvalidCharacters.slice(0, 24) + \"...\"\n      : keyWithoutInvalidCharacters;\n  }\n\n  private formatValueAttribute(value: string) {\n    return value.replaceAll(\",\", \"\").replaceAll(\";\", \"\");\n  }\n\n  private formatProducts(products: Product[]) {\n    const formatParams = (params: IParam[] | undefined) => {\n      return params?.map(({ key, value }) => {\n        const formatedKey = this.formatKeyAttribute(key);\n        const formatedValue = this.formatValueAttribute(value);\n        return { key: formatedKey, value: formatedValue };\n      });\n    };\n\n    return products.map((product) => {\n      const params = formatParams(product.params);\n      const properties = formatParams(product.properties);\n      return { ...product, params, properties };\n    });\n  }\n\n  private createAttribute(data: CreateAttributeProps) {\n    if (!data?.name || data.id === undefined) return;\n\n    const attributeStartName = \"Attribute\";\n\n    const attribute: Record<string, string | number> = {};\n\n    attribute[`${attributeStartName} ${data.id} name`] = data.name;\n\n    if (data.values !== undefined)\n      attribute[`${attributeStartName} ${data.id} value(s)`] = data.values;\n    if (data.visible !== undefined)\n      attribute[`${attributeStartName} ${data.id} visible`] = data.visible;\n    if (data.global !== undefined)\n      attribute[`${attributeStartName} ${data.id} global`] = data.global;\n\n    return attribute;\n  }\n\n  private extractAttributes(products: Product[]) {\n    const formatedProducts = this.formatProducts(products);\n    const paramsMap = new Map<number, Record<string, string | number>>();\n    const propertiesMap = new Map<number, Record<string, string | number>>();\n    const uniqueAttributes = new Map<string, number>();\n\n    const genderTitle = \"Пол\";\n\n    formatedProducts.forEach((product) => {\n      product.params?.forEach(({ key }) => {\n        if (!uniqueAttributes.has(key)) {\n          uniqueAttributes.set(key, uniqueAttributes.size);\n        }\n      });\n\n      uniqueAttributes.set(genderTitle, uniqueAttributes.size);\n\n      product.properties?.forEach(({ key }) => {\n        if (!uniqueAttributes.has(key)) {\n          uniqueAttributes.set(key, uniqueAttributes.size);\n        }\n      });\n    });\n\n    formatedProducts.forEach((product) => {\n      const paramAttributes = paramsMap.get(product.variantId) ?? {};\n      const propertyAttributes = propertiesMap.get(product.variantId) ?? {};\n\n      product.params?.forEach(({ key, value }) => {\n        const index = uniqueAttributes.get(key);\n\n        if (index === undefined) {\n          console.error(`Не нашлось уникального ключа для параметра - ${key}`);\n          return;\n        }\n\n        const attribute = this.createAttribute({\n          name: key,\n          id: index,\n          values: value,\n          visible: 0,\n          global: 0,\n        });\n\n        if (!attribute) return;\n\n        Object.entries(attribute).forEach(\n          ([key, value]) => (paramAttributes[key] = value),\n        );\n      });\n\n      const genderIndex = uniqueAttributes.get(genderTitle);\n\n      const genderAttribute = this.createAttribute({\n        name: genderTitle,\n        id: genderIndex,\n        values: product.gender,\n        global: 0,\n      });\n\n      if (genderAttribute) {\n        Object.entries(genderAttribute).forEach(\n          ([key, value]) => (propertyAttributes[key] = value),\n        );\n      }\n\n      product.properties?.forEach(({ key, value }) => {\n        const index = uniqueAttributes.get(key);\n\n        if (index === undefined) {\n          console.error(`Не нашлось уникального ключа для параметра - ${key}`);\n          return;\n        }\n\n        if (paramAttributes[`Attribute ${index} name`]) {\n          console.warn(`Данное свойство уже существует в параметрах - ${key}`);\n          return;\n        }\n\n        const attribute = this.createAttribute({\n          name: key,\n          id: index,\n          values: value,\n          global: 0,\n        });\n\n        if (!attribute) return;\n\n        Object.entries(attribute).forEach(\n          ([key, value]) => (propertyAttributes[key] = value),\n        );\n      });\n\n      paramsMap.set(product.variantId, paramAttributes);\n      propertiesMap.set(product.variantId, propertyAttributes);\n    });\n\n    return { params: paramsMap, properties: propertiesMap };\n  }\n\n  private removeVisibleFromAttributes(params: Record<string, string | number>) {\n    Object.entries(params).forEach(([key]) => {\n      if (key.includes(\"visible\")) params[key] = \"\";\n    });\n  }\n\n  public async format(\n    writableStream: Writable,\n    products: Product[],\n    categories?: Category[],\n    _?: Brand[],\n    __?: FormatterOptions,\n  ): Promise<void> {\n    const categoryPaths = buildCategoryPaths(categories ?? []);\n\n    const csvStream = new CSVStream({\n      delimiter: \";\",\n      emptyFieldValue: \"\",\n      lineSeparator: \"\\n\",\n    });\n    csvStream.writableStream.pipe(writableStream);\n    const columns = new Set<string>(this.DEFAULT_COLUMNS);\n\n    const attributes = this.extractAttributes(products);\n\n    const variationsByParentId = new Map<\n      number,\n      Array<Record<string, string | number | undefined>>\n    >();\n\n    const imagesByParentId = new Map<number, string | undefined>();\n    const sizesByParentId = new Map<number, string | undefined>();\n\n    const variations = products.map((product, index) => {\n      const pathsArray = categoryPaths\n        .get(product.categoryId)\n        ?.map((category) => category.name);\n\n      const price = product.price ? product.price : \"\";\n      const images = product.images?.map(urlQueryEncode).join(\",\");\n\n      let row = {\n        ID: product.variantId,\n        Type: \"variation\",\n        SKU: product.variantId,\n        Name: product.title,\n        Parent: product.parentId ?? 0,\n        \"Short description\": \"\",\n        Description: product.description,\n        Stock: product.count ?? 0,\n        \"Regular price\": price,\n        Position: index + 1,\n        Categories: pathsArray?.join(\" > \"),\n        Tags: product.keywords?.join(\",\"),\n        Images: images,\n        SizeGrid: \"\",\n      };\n\n      const productParams = attributes.params.get(product.variantId) ?? {};\n\n      if (!imagesByParentId.has(row.Parent)) {\n        imagesByParentId.set(row.Parent, images);\n      }\n\n      if (!sizesByParentId.has(row.Parent)) {\n        sizesByParentId.set(\n          row.Parent,\n          product.sizes ? JSON.stringify(product.sizes) : \"\",\n        );\n      }\n\n      this.removeVisibleFromAttributes(productParams);\n\n      row = { ...row, ...productParams };\n\n      if (variationsByParentId.has(row.Parent)) {\n        variationsByParentId.get(row.Parent)?.push(row);\n      } else {\n        variationsByParentId.set(row.Parent, [row]);\n      }\n\n      return row;\n    });\n\n    const parentProducts = new Map<number, any>();\n\n    variations.forEach((product) => {\n      const currentParent = parentProducts.get(product.Parent);\n\n      let row = {\n        ...product,\n        Type: \"variable\",\n        ID: product.Parent,\n        SKU: product.Parent,\n        Position: 0,\n        Parent: \"\",\n        \"Regular price\": \"\",\n        Images: imagesByParentId.get(product.Parent) ?? \"\",\n        SizeGrid: sizesByParentId.get(product.Parent) ?? \"\",\n      };\n\n      row.Stock = (currentParent?.Stock || 0) + (product?.Stock || 0);\n\n      const productParams = attributes.params.get(product.SKU) ?? {};\n      const productProperties = attributes.properties.get(product.SKU) ?? {};\n\n      Object.entries(productParams).forEach(([key]) => {\n        if (key.includes(\"visible\")) productParams[key] = 0;\n      });\n\n      if (currentParent) {\n        Object.entries(productParams).forEach(([key, value]) => {\n          if (key.includes(\"value(s)\")) {\n            productParams[key] = currentParent[key] + `, ${value}`;\n          }\n        });\n      }\n\n      Object.keys({ ...row, ...productParams, ...productProperties }).forEach(\n        (item) => columns.add(item),\n      );\n\n      row = { ...row, ...productParams, ...productProperties };\n\n      parentProducts.set(product.Parent, row);\n    });\n\n    const variableProducts = Array.from(parentProducts.values());\n\n    csvStream.setColumns(columns);\n    for (const parentProduct of variableProducts) {\n      await csvStream.addRow(parentProduct);\n\n      for (const variationProduct of variationsByParentId.get(\n        parentProduct.ID,\n      ) ?? []) {\n        await csvStream.addRow(variationProduct);\n      }\n    }\n\n    csvStream.writableStream.end();\n  }\n}\n","import { XMLBuilder } from \"fast-xml-parser\";\n\nimport { type Product, type Category, type Brand } from \"../types\";\nimport { getRFC3339Date, writeWithDrain } from \"../utils\";\nimport {\n  Extension,\n  type FormatterAbstract,\n  type FormatterOptions,\n} from \"./formater.types\";\n\nimport { PassThrough, type Writable } from \"stream\";\n\nexport class YMLFormatter implements FormatterAbstract {\n  public formatterName = \"YMl\";\n  public fileExtension = Extension.YML;\n\n  public async format(\n    writableStream: Writable,\n    products: Product[],\n    categories?: Category[],\n    brands?: Brand[],\n    options?: FormatterOptions,\n  ): Promise<void> {\n    const result = new PassThrough();\n    result.pipe(writableStream);\n\n    const builder = new XMLBuilder({\n      ignoreAttributes: false,\n      cdataPropName: \"__cdata\",\n      format: true,\n      indentBy: \"  \",\n    });\n\n    const date = getRFC3339Date(new Date());\n\n    // Начинаем формирование XML\n    result.write('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n');\n    result.write('<yml_catalog date=\"' + date + '\">\\n');\n\n    // Открываем тег <shop>\n    result.write(\"<shop>\\n\");\n\n    const resultWriter = writeWithDrain(result);\n    // Добавляем информацию о магазине\n    if (options?.shopName) {\n      await resultWriter(builder.build({ name: options.shopName }));\n      await resultWriter(\"\\n\");\n    }\n    if (options?.companyName) {\n      await resultWriter(builder.build({ company: options.companyName }));\n      await resultWriter(\"\\n\");\n    }\n\n    // Добавляем категории и бренды\n    if (categories) {\n      await resultWriter(\n        builder.build({\n          // tagname: \"categories\",\n          categories: { category: this.getCategories(categories) },\n        }),\n      );\n      await resultWriter(\"\\n\");\n    }\n    if (brands) {\n      await resultWriter(\n        builder.build({ brands: { brand: this.getBrands(brands) } }),\n      );\n      await resultWriter(\"\\n\");\n    }\n\n    // Открываем секцию <offers>\n    await resultWriter(\"<offers>\\n\");\n\n    // Создаем поток для обработки offer элементов\n    const offerStream = new PassThrough();\n    const offerWriter = writeWithDrain(offerStream);\n\n    // Пайпим поток offer элементов в основной итоговый поток\n    offerStream.pipe(result, { end: false });\n\n    // Записываем каждый продукт в поток\n    for (const product of products) {\n      if (product.price === 0) continue;\n      const offer = builder.build({ offer: this.getOffer(product) });\n      await offerWriter(offer + \"\\n\");\n    }\n\n    // Завершаем поток offer\n    offerStream.end();\n\n    offerStream.on(\"end\", () => {\n      // Закрываем секцию <offers>\n      result.write(\"</offers>\\n\");\n\n      // Закрываем тег <shop>\n      result.write(\"</shop>\\n\");\n\n      // Закрываем тег <yml_catalog>\n      result.write(\"</yml_catalog>\\n\");\n\n      // Завершаем итоговый поток\n      result.end();\n    });\n  }\n\n  private getBrands(brands?: Brand[]) {\n    if (!brands) return [];\n\n    return brands.map((brand) => ({\n      \"@_id\": brand.id,\n      \"@_url\": brand.coverURL ?? \"\",\n      \"#text\": brand.name,\n    }));\n  }\n\n  private getCategories(categories?: Category[]) {\n    if (!categories) return [];\n\n    return categories.map((cat) => ({\n      \"@_id\": cat.id,\n      \"@_parentId\": cat.parentId ?? \"\",\n      \"#text\": cat.name || `Категория #${cat.id}`,\n    }));\n  }\n\n  private getOffer(product: Product): any {\n    const result = {\n      \"@_id\": product.variantId,\n      name: product.title,\n      price: product.price,\n      oldprice: product.oldPrice,\n      purchase_price: product.purchasePrice,\n      additional_expenses: product.additionalExpenses,\n      cofinance_price: product.cofinancePrice,\n      currencyId: product.currency,\n      categoryId: product.categoryId,\n      vendorId: product.vendorId,\n      vendor: product.vendor,\n      vendorCode: product.vendorCode,\n      picture: product.images,\n      video: product.videos,\n      available: product.available,\n      \"time-delivery\": product.timeDelivery\n        ? {\n            \"@_min\": product.timeDelivery.min,\n            \"@_max\": product.timeDelivery.max,\n            \"#text\": `${product.timeDelivery.min}-${product.timeDelivery.max}`,\n          }\n        : undefined,\n      series: product.seriesName,\n      \"min-quantity\": product.minQuantity,\n      \"step-quantity\": product.stepQuantity,\n      size: product.sizes?.map((size) => ({\n        \"#text\": size.value,\n        \"@_name\": size.name,\n        \"@_delimiter\": size.delimiter,\n      })),\n      keyword: product.keywords,\n      saleDate: product.saleDate,\n      property: product.properties?.map((property) => ({\n        \"#text\": property.value,\n        \"@_name\": property.key,\n      })),\n      param: product.params?.map((param) => ({\n        \"#text\": param.value,\n        \"@_name\": param.key,\n      })),\n      description: {\n        __cdata: product.description,\n      },\n      country_of_origin: product.countryOfOrigin,\n      barcode: product.barcode,\n      vat: product.vat,\n      count: product.count,\n      \"set-ids\": product.tags?.join(\", \"),\n      adult: product.adult,\n      downloadable: product.downloadable,\n      \"period-of-validity-days\": product.validityPeriod,\n      \"comment-validity-days\": product.validityComment,\n      \"service-life-days\": product.serviceLifePeriod,\n      \"comment-life-days\": product.serviceLifeComment,\n      \"warranty-days\": product.warrantyPeriod,\n      \"comment-warranty\": product.warrantyComment,\n      manufacturer_warranty: product.manufacturerWarranty,\n      certificate: product.certificate,\n      url: product.url,\n      weight: product.weight,\n      dimensions: product.dimensions,\n      boxCount: product.boxCount,\n      disabled: product.disabled,\n      age: product.age\n        ? {\n            \"@_unit\": product.age.unit,\n            \"#text\": product.age.value,\n          }\n        : undefined,\n      \"tn-ved-codes\": product.codesTN?.length\n        ? {\n            \"tn-ved-code\": product.codesTN,\n          }\n        : undefined,\n      relatedProduct: product.relatedProducts,\n      gender: product.gender,\n    };\n    if (product.parentId !== undefined) {\n      return {\n        ...result,\n        \"@_group_id\": product.parentId,\n      };\n    }\n    return result;\n  }\n}\n","import { Extension } from \"./formater.types\";\nimport { YMLFormatter } from \"./YML.formatter\";\n\nexport class XMLFormatter extends YMLFormatter {\n  public formatterName = \"XML\";\n  public fileExtension = Extension.XML;\n}\n","import { CSVFormatter } from \"./CSV.formatter\";\nimport { ExcelFormatter } from \"./Excel.formatter\";\nimport { InsalesFormatter } from \"./Insales.formatter\";\nimport { JSONFormatter } from \"./JSON.formatter\";\nimport { PriceFormatter } from \"./Price.formatter\";\nimport { SimpleJSONFormatter } from \"./SimpleJSON.formatter\";\nimport { TgShopFormatter } from \"./TgShop.formatter\";\nimport { TildaFormatter } from \"./Tilda.formatter\";\nimport { WooCommerceFormatter } from \"./WooCommerce.formatter\";\nimport { XMLFormatter } from \"./XML.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  XMLFormatter,\n  WooCommerceFormatter,\n  PriceFormatter,\n};\n","import {\n  type FormatterAbstract,\n  type FormatterOptions,\n  Formatters,\n} from \"../formatter\";\nimport { type Brand, type Category, type Product } from \"../types\";\nimport { type Exporter, type Transformer } from \"./exporter.types\";\n\nimport fs from \"fs\";\n\nexport class GoodsExporter<Context extends object | undefined> {\n  private _context: Context;\n\n  constructor(readonly context: Context) {\n    this._context = context;\n  }\n\n  public setContext(context: Context): void {\n    this._context = context;\n  }\n\n  private formatter: FormatterAbstract = new Formatters.YMLFormatter();\n  private exporter: Exporter = () => {\n    return fs.createWriteStream(\n      `${this.formatter.formatterName}.output.${this.formatter.fileExtension}`,\n    );\n  };\n\n  private transformers = new Array<Transformer<Context>>();\n\n  public setTransformers(transformers: Array<Transformer<Context>>): void {\n    this.transformers = transformers;\n  }\n\n  public setFormatter(formatter: FormatterAbstract): void {\n    this.formatter = formatter;\n  }\n\n  public setExporter(exporter: Exporter): void {\n    this.exporter = exporter;\n  }\n\n  async export(\n    products: Product[],\n    categories?: Category[],\n    brands?: Brand[],\n    option?: FormatterOptions,\n  ): Promise<void> {\n    let transformedProducts: Product[] = products;\n\n    for (const transformer of this.transformers)\n      transformedProducts = await transformer(\n        transformedProducts,\n        this._context,\n      );\n\n    const writableStream = this.exporter();\n\n    await this.formatter.format(\n      writableStream,\n      transformedProducts,\n      categories,\n      brands,\n      option,\n    );\n  }\n}\n","export interface Product {\n  /**\n   * **ID товара**\n   *\n   * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n   *\n   * Пример: belaya-kofta-12345\n   */\n  productId: number;\n  /**\n   * **Родительскй SKU**\n   *\n   * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n   *\n   * Пример: belaya-kofta-12345\n   */\n  parentId?: number;\n  /**\n   * **SKU**\n   *\n   * Любая последовательность длиной до 80 знаков. В нее могут входить английские и русские (кроме ё) буквы, цифры и символы . , / \\ ( ) [ ] - = _\n   *\n   * Пример: belaya-kofta-12345\n   */\n  variantId: number;\n  /**\n   * **Название**\n   *\n   * Составляйте название по схеме: тип + бренд или производитель + модель + особенности, если есть (например, цвет, размер или вес) и количество в упаковке.\n   *\n   * Не включайте в название условия продажи (например, «скидка», «бесплатная доставка» и т. д.), эмоциональные характеристики («хит», «супер» и т. д.). Не пишите слова большими буквами — кроме устоявшихся названий брендов и моделей.\n   *\n   * Оптимальная длина — 50–60 символов, максимальная — 150.\n   *\n   * Составлять хорошие названия помогут [рекомендации](https://yandex.ru/support/marketplace/assortment/fields/title.html).\n   *\n   * Пример: Ударная дрель Makita HP1630, 710 Вт\n   */\n  title: string;\n  /**\n   * **Описание**\n   *\n   * Подробное описание товара: например, его преимущества и особенности.\n   *\n   * Не давайте в описании инструкций по установке и сборке. Не используйте слова «скидка», «распродажа», «дешевый», «подарок» (кроме подарочных категорий), «бесплатно», «акция», «специальная цена», «новинка», «new», «аналог», «заказ», «хит». Не указывайте никакой контактной информации и не давайте ссылок.\n   *\n   * Можно использовать теги:\n   *\n   ** &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  timeDelivery?: { min?: number; max?: number };\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   * **Кол-во клиентов, которым понравился товар**\n   *\n   * Пример: 982134\n   */\n  favoriteCount?: number;\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":["once","__publicField","PassThrough","Extension","stream","categories","JsonStreamStringify","key","value","XMLBuilder","Vat","Currency"],"mappings":"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"}