goods-exporter 0.1.3 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# goods-exporter
|
|
2
2
|
|
|
3
|
-

|
|
4
4
|

|
|
5
5
|
|
|
6
6
|
A versatile JavaScript library for exporting goods data to various formats such as YML, CSV, and Excel. Simplify data export tasks with ease.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/formatter/CSV.formatter.ts","../../src/formatter/YML.formatter.ts","../../src/formatter/formater.types.ts","../../src/exporter/exporter.ts"],"sourcesContent":["import {Category, Product} from \"../types\";\nimport {json2csv} from \"json-2-csv\";\nimport {Formatter, FormatterOptions} from \"./formater.types\";\n\nexport class CSVFormatter implements Formatter {\n async format(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({id, name}) => mappedCategories[id] = name);\n\n const getParams = (product: Product) => {\n const params: Record<string, string> = {};\n\n if (!option?.splitParams)\n return params\n\n product.params?.forEach(({key, value}) => params[`Param [${key}]`] = value)\n return params\n }\n const data = products.map(product => ({\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?.map(({key, value}) => `${key}=${value}`).join(\",\"),\n ...getParams(product)\n }))\n return json2csv(data, {emptyFieldValue: \"\"})\n }\n}\n\n","import {XMLBuilder} from \"fast-xml-parser\";\nimport {Product, Category} from \"../types\";\nimport {Formatter, FormatterOptions} from \"./formater.types\";\n\n\nexport class YMLFormatter implements Formatter {\n builder = new XMLBuilder({ignoreAttributes: false, cdataPropName: '__cdata',});\n\n async format(products: Product[], categories?: Category[], options?: FormatterOptions): Promise<string> {\n const mappedCategories = {\n category: categories?.map(cat => ({\n \"@_id\": cat.id, \"@_parentId\": cat.parentId, \"#text\": cat.name\n }))\n };\n const shopName = options?.shopName ?? \"ShopName\";\n const companyName = options?.companyName ?? \"CompanyName\";\n const offers = {\"offer\": products.map(this.getOffers)};\n const result = {\n \"?xml\": {\n \"@_version\": '1.0',\n \"@_encoding\": 'UTF-8',\n \"@_standalone\": 'yes'\n },\n \"yml_catalog\": {\n \"@_date\": new Date().toISOString().replace(/.\\d+Z/, ''),\n \"shop\": {\n name: shopName,\n company: companyName,\n categories: mappedCategories,\n offers\n }\n }\n };\n\n return this.builder.build(result);\n }\n\n private getOffers(product: Product) {\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 \"vendor\": product.vendor,\n \"vendorCode\": product.vendorCode,\n \"picture\": product.images,\n \"video\": product.videos,\n \"available\": product.available,\n \"min-quantity\": product.minQuantity,\n \"step-quantity\": product.stepQuantity,\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 \"@_unit\": product.age.unit,\n \"#text\": product.age.value,\n },\n \"tn-ved-codes\": product.codesTN?.length && {\n \"tn-ved-code\": product.codesTN\n }\n };\n if (product.parentId)\n return {\n ...result,\n \"@_group_id\": product.parentId\n };\n return result;\n }\n}\n\n","import {YMLFormatter} from \"./YML.formatter\";\nimport {Category, Product} from \"../types\";\nimport {CSVFormatter} from \"./CSV.formatter\";\n\nexport interface Formatter {\n format(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string>;\n}\n\nexport interface FormatterOptions {\n shopName?: string\n companyName?: string\n splitParams?: boolean\n}\n\nexport const Formatters = {\n CSV: new CSVFormatter(),\n YML: new YMLFormatter(),\n}\n\n","import {Formatter, FormatterOptions, Formatters} from \"../formatter\";\nimport {Transformer} from \"./exporter.types\";\nimport {Category, Product} from \"../types\";\nimport deepcopy from \"deepcopy\";\n\nexport class Exporter {\n private formatter: Formatter = Formatters.YML\n private transformers = new Array<Transformer>()\n\n\n setTransformers(transformers: Transformer[]) {\n this.transformers = transformers\n }\n\n setFormatter(formatter: Formatter) {\n this.formatter = formatter\n }\n\n async export(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string> {\n const transformedProducts = deepcopy(products).map(product => {\n let transformedProduct: Product = product;\n this.transformers.forEach(transformer => {\n transformedProduct = transformer(transformedProduct)\n })\n return transformedProduct\n })\n return this.formatter.format(transformedProducts, categories, option)\n }\n}"],"names":["json2csv","XMLBuilder"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/formatter/CSV.formatter.ts","../../src/formatter/YML.formatter.ts","../../src/formatter/formater.types.ts","../../src/exporter/exporter.ts"],"sourcesContent":["import {Category, Product} from \"../types\";\nimport {json2csv} from \"json-2-csv\";\nimport {Formatter, FormatterOptions} from \"./formater.types\";\n\nexport class CSVFormatter implements Formatter {\n async format(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({id, name}) => mappedCategories[id] = name);\n\n const getParams = (product: Product) => {\n const params: Record<string, string> = {};\n\n if (!option?.splitParams)\n return params\n\n product.params?.forEach(({key, value}) => params[`Param [${key}]`] = value)\n return params\n }\n const data = products.map(product => ({\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?.map(({key, value}) => `${key}=${value}`).join(\",\"),\n ...getParams(product)\n }))\n return json2csv(data, {emptyFieldValue: \"\"})\n }\n}\n\n","import {XMLBuilder} from \"fast-xml-parser\";\nimport {Product, Category} from \"../types\";\nimport {Formatter, FormatterOptions} from \"./formater.types\";\n\n\nexport class YMLFormatter implements Formatter {\n builder = new XMLBuilder({ignoreAttributes: false, cdataPropName: '__cdata',});\n\n async format(products: Product[], categories?: Category[], options?: FormatterOptions): Promise<string> {\n const mappedCategories = {\n category: categories?.map(cat => ({\n \"@_id\": cat.id, \"@_parentId\": cat.parentId, \"#text\": cat.name\n }))\n };\n const shopName = options?.shopName ?? \"ShopName\";\n const companyName = options?.companyName ?? \"CompanyName\";\n const offers = {\"offer\": products.map(this.getOffers)};\n const result = {\n \"?xml\": {\n \"@_version\": '1.0',\n \"@_encoding\": 'UTF-8',\n \"@_standalone\": 'yes'\n },\n \"yml_catalog\": {\n \"@_date\": new Date().toISOString().replace(/.\\d+Z/, ''),\n \"shop\": {\n name: shopName,\n company: companyName,\n categories: mappedCategories,\n offers\n }\n }\n };\n\n return this.builder.build(result);\n }\n\n private getOffers(product: Product) {\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 \"vendor\": product.vendor,\n \"vendorCode\": product.vendorCode,\n \"picture\": product.images,\n \"video\": product.videos,\n \"available\": product.available,\n \"min-quantity\": product.minQuantity,\n \"step-quantity\": product.stepQuantity,\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 \"@_unit\": product.age.unit,\n \"#text\": product.age.value,\n },\n \"tn-ved-codes\": product.codesTN?.length && {\n \"tn-ved-code\": product.codesTN\n }\n };\n if (product.parentId)\n return {\n ...result,\n \"@_group_id\": product.parentId\n };\n return result;\n }\n}\n\n","import {YMLFormatter} from \"./YML.formatter\";\nimport {Category, Product} from \"../types\";\nimport {CSVFormatter} from \"./CSV.formatter\";\n\nexport interface Formatter {\n format(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string>;\n}\n\nexport interface FormatterOptions {\n shopName?: string\n companyName?: string\n splitParams?: boolean\n}\n\nexport const Formatters = {\n CSV: new CSVFormatter(),\n YML: new YMLFormatter(),\n}\n\n","import {Formatter, FormatterOptions, Formatters} from \"../formatter\";\nimport {Transformer} from \"./exporter.types\";\nimport {Category, Product} from \"../types\";\nimport deepcopy from \"deepcopy\";\n\nexport class Exporter {\n private formatter: Formatter = Formatters.YML\n private transformers = new Array<Transformer>()\n\n\n setTransformers(transformers: Transformer[]) {\n this.transformers = transformers\n }\n\n setFormatter(formatter: Formatter) {\n this.formatter = formatter\n }\n\n async export(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string> {\n const transformedProducts = deepcopy(products).map(product => {\n let transformedProduct: Product = product;\n this.transformers.forEach(transformer => {\n transformedProduct = transformer(transformedProduct)\n })\n return transformedProduct\n })\n return this.formatter.format(transformedProducts, categories, option)\n }\n}"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -11,10 +11,14 @@
|
|
|
11
11
|
"url": "https://github.com/Bagi4-source/goods-converter/issues"
|
|
12
12
|
},
|
|
13
13
|
"name": "goods-exporter",
|
|
14
|
-
"version": "0.1
|
|
14
|
+
"version": "0.2.1",
|
|
15
15
|
"description": "A versatile JavaScript library for exporting goods data to various formats such as YML, CSV, and Excel. Simplify data export tasks with ease.",
|
|
16
|
-
"main": "dist/index.
|
|
17
|
-
"
|
|
16
|
+
"main": "./dist/cjs/index.cjs",
|
|
17
|
+
"exports": {
|
|
18
|
+
"require": "./dist/cjs/index.cjs",
|
|
19
|
+
"import": "./dist/esm/index.mjs"
|
|
20
|
+
},
|
|
21
|
+
"types": "./dist/bundle.d.ts",
|
|
18
22
|
"type": "module",
|
|
19
23
|
"files": [
|
|
20
24
|
"dist"
|
|
@@ -28,14 +32,12 @@
|
|
|
28
32
|
"YML",
|
|
29
33
|
"CSV",
|
|
30
34
|
"EXCEL",
|
|
31
|
-
"goods
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"Excel-export",
|
|
38
|
-
"export-tool"
|
|
35
|
+
"goods",
|
|
36
|
+
"export",
|
|
37
|
+
"exporter",
|
|
38
|
+
"tool",
|
|
39
|
+
"yandex",
|
|
40
|
+
"market"
|
|
39
41
|
],
|
|
40
42
|
"dependencies": {
|
|
41
43
|
"deepcopy": "^2.1.0",
|
package/dist/index.esm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/formatter/CSV.formatter.ts","../src/formatter/YML.formatter.ts","../src/formatter/formater.types.ts","../src/exporter/exporter.ts"],"sourcesContent":["import {Category, Product} from \"../types\";\nimport {json2csv} from \"json-2-csv\";\nimport {Formatter, FormatterOptions} from \"./formater.types\";\n\nexport class CSVFormatter implements Formatter {\n async format(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({id, name}) => mappedCategories[id] = name);\n\n const getParams = (product: Product) => {\n const params: Record<string, string> = {};\n\n if (!option?.splitParams)\n return params\n\n product.params?.forEach(({key, value}) => params[`Param [${key}]`] = value)\n return params\n }\n const data = products.map(product => ({\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?.map(({key, value}) => `${key}=${value}`).join(\",\"),\n ...getParams(product)\n }))\n return json2csv(data, {emptyFieldValue: \"\"})\n }\n}\n\n","import {XMLBuilder} from \"fast-xml-parser\";\nimport {Product, Category} from \"../types\";\nimport {Formatter, FormatterOptions} from \"./formater.types\";\n\n\nexport class YMLFormatter implements Formatter {\n builder = new XMLBuilder({ignoreAttributes: false, cdataPropName: '__cdata',});\n\n async format(products: Product[], categories?: Category[], options?: FormatterOptions): Promise<string> {\n const mappedCategories = {\n category: categories?.map(cat => ({\n \"@_id\": cat.id, \"@_parentId\": cat.parentId, \"#text\": cat.name\n }))\n };\n const shopName = options?.shopName ?? \"ShopName\";\n const companyName = options?.companyName ?? \"CompanyName\";\n const offers = {\"offer\": products.map(this.getOffers)};\n const result = {\n \"?xml\": {\n \"@_version\": '1.0',\n \"@_encoding\": 'UTF-8',\n \"@_standalone\": 'yes'\n },\n \"yml_catalog\": {\n \"@_date\": new Date().toISOString().replace(/.\\d+Z/, ''),\n \"shop\": {\n name: shopName,\n company: companyName,\n categories: mappedCategories,\n offers\n }\n }\n };\n\n return this.builder.build(result);\n }\n\n private getOffers(product: Product) {\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 \"vendor\": product.vendor,\n \"vendorCode\": product.vendorCode,\n \"picture\": product.images,\n \"video\": product.videos,\n \"available\": product.available,\n \"min-quantity\": product.minQuantity,\n \"step-quantity\": product.stepQuantity,\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 \"@_unit\": product.age.unit,\n \"#text\": product.age.value,\n },\n \"tn-ved-codes\": product.codesTN?.length && {\n \"tn-ved-code\": product.codesTN\n }\n };\n if (product.parentId)\n return {\n ...result,\n \"@_group_id\": product.parentId\n };\n return result;\n }\n}\n\n","import {YMLFormatter} from \"./YML.formatter\";\nimport {Category, Product} from \"../types\";\nimport {CSVFormatter} from \"./CSV.formatter\";\n\nexport interface Formatter {\n format(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string>;\n}\n\nexport interface FormatterOptions {\n shopName?: string\n companyName?: string\n splitParams?: boolean\n}\n\nexport const Formatters = {\n CSV: new CSVFormatter(),\n YML: new YMLFormatter(),\n}\n\n","import {Formatter, FormatterOptions, Formatters} from \"../formatter\";\nimport {Transformer} from \"./exporter.types\";\nimport {Category, Product} from \"../types\";\nimport deepcopy from \"deepcopy\";\n\nexport class Exporter {\n private formatter: Formatter = Formatters.YML\n private transformers = new Array<Transformer>()\n\n\n setTransformers(transformers: Transformer[]) {\n this.transformers = transformers\n }\n\n setFormatter(formatter: Formatter) {\n this.formatter = formatter\n }\n\n async export(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string> {\n const transformedProducts = deepcopy(products).map(product => {\n let transformedProduct: Product = product;\n this.transformers.forEach(transformer => {\n transformedProduct = transformer(transformedProduct)\n })\n return transformedProduct\n })\n return this.formatter.format(transformedProducts, categories, option)\n }\n}"],"names":[],"mappings":"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"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/formatter/CSV.formatter.ts","../src/formatter/YML.formatter.ts","../src/formatter/formater.types.ts","../src/exporter/exporter.ts"],"sourcesContent":["import {Category, Product} from \"../types\";\nimport {json2csv} from \"json-2-csv\";\nimport {Formatter, FormatterOptions} from \"./formater.types\";\n\nexport class CSVFormatter implements Formatter {\n async format(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string> {\n const mappedCategories: Record<number, string> = {};\n categories?.forEach(({id, name}) => mappedCategories[id] = name);\n\n const getParams = (product: Product) => {\n const params: Record<string, string> = {};\n\n if (!option?.splitParams)\n return params\n\n product.params?.forEach(({key, value}) => params[`Param [${key}]`] = value)\n return params\n }\n const data = products.map(product => ({\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?.map(({key, value}) => `${key}=${value}`).join(\",\"),\n ...getParams(product)\n }))\n return json2csv(data, {emptyFieldValue: \"\"})\n }\n}\n\n","import {XMLBuilder} from \"fast-xml-parser\";\nimport {Product, Category} from \"../types\";\nimport {Formatter, FormatterOptions} from \"./formater.types\";\n\n\nexport class YMLFormatter implements Formatter {\n builder = new XMLBuilder({ignoreAttributes: false, cdataPropName: '__cdata',});\n\n async format(products: Product[], categories?: Category[], options?: FormatterOptions): Promise<string> {\n const mappedCategories = {\n category: categories?.map(cat => ({\n \"@_id\": cat.id, \"@_parentId\": cat.parentId, \"#text\": cat.name\n }))\n };\n const shopName = options?.shopName ?? \"ShopName\";\n const companyName = options?.companyName ?? \"CompanyName\";\n const offers = {\"offer\": products.map(this.getOffers)};\n const result = {\n \"?xml\": {\n \"@_version\": '1.0',\n \"@_encoding\": 'UTF-8',\n \"@_standalone\": 'yes'\n },\n \"yml_catalog\": {\n \"@_date\": new Date().toISOString().replace(/.\\d+Z/, ''),\n \"shop\": {\n name: shopName,\n company: companyName,\n categories: mappedCategories,\n offers\n }\n }\n };\n\n return this.builder.build(result);\n }\n\n private getOffers(product: Product) {\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 \"vendor\": product.vendor,\n \"vendorCode\": product.vendorCode,\n \"picture\": product.images,\n \"video\": product.videos,\n \"available\": product.available,\n \"min-quantity\": product.minQuantity,\n \"step-quantity\": product.stepQuantity,\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 \"@_unit\": product.age.unit,\n \"#text\": product.age.value,\n },\n \"tn-ved-codes\": product.codesTN?.length && {\n \"tn-ved-code\": product.codesTN\n }\n };\n if (product.parentId)\n return {\n ...result,\n \"@_group_id\": product.parentId\n };\n return result;\n }\n}\n\n","import {YMLFormatter} from \"./YML.formatter\";\nimport {Category, Product} from \"../types\";\nimport {CSVFormatter} from \"./CSV.formatter\";\n\nexport interface Formatter {\n format(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string>;\n}\n\nexport interface FormatterOptions {\n shopName?: string\n companyName?: string\n splitParams?: boolean\n}\n\nexport const Formatters = {\n CSV: new CSVFormatter(),\n YML: new YMLFormatter(),\n}\n\n","import {Formatter, FormatterOptions, Formatters} from \"../formatter\";\nimport {Transformer} from \"./exporter.types\";\nimport {Category, Product} from \"../types\";\nimport deepcopy from \"deepcopy\";\n\nexport class Exporter {\n private formatter: Formatter = Formatters.YML\n private transformers = new Array<Transformer>()\n\n\n setTransformers(transformers: Transformer[]) {\n this.transformers = transformers\n }\n\n setFormatter(formatter: Formatter) {\n this.formatter = formatter\n }\n\n async export(products: Product[], categories?: Category[], option?: FormatterOptions): Promise<string> {\n const transformedProducts = deepcopy(products).map(product => {\n let transformedProduct: Product = product;\n this.transformers.forEach(transformer => {\n transformedProduct = transformer(transformedProduct)\n })\n return transformedProduct\n })\n return this.formatter.format(transformedProducts, categories, option)\n }\n}"],"names":["json2csv","XMLBuilder"],"mappings":"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"}
|