@haus-tech/product-import-export-plugin 3.3.2-next.0 → 3.3.2-next.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/CHANGELOG.md +8 -0
- package/README.mdx +21 -4
- package/package.json +1 -1
- package/src/api/product-export.controller.d.ts +1 -0
- package/src/api/product-export.controller.js +16 -0
- package/src/api/product-export.controller.js.map +1 -1
- package/src/api/product-import.controller.js +2 -2
- package/src/api/product-import.controller.js.map +1 -1
- package/src/constants.d.ts +1 -0
- package/src/constants.js +2 -1
- package/src/constants.js.map +1 -1
- package/src/dashboard/export-dialog.tsx +21 -7
- package/src/dashboard/import.tsx +6 -3
- package/src/dashboard/utils.ts +0 -1
- package/src/index.d.ts +3 -0
- package/src/index.js +3 -0
- package/src/index.js.map +1 -1
- package/src/product-import-export.plugin.js +21 -0
- package/src/product-import-export.plugin.js.map +1 -1
- package/src/providers/import-providers/import-parser.d.ts +7 -5
- package/src/providers/import-providers/import-parser.js +53 -15
- package/src/providers/import-providers/import-parser.js.map +1 -1
- package/src/providers/import-providers/product-importer.d.ts +1 -0
- package/src/providers/import-providers/product-importer.js +120 -74
- package/src/providers/import-providers/product-importer.js.map +1 -1
- package/src/services/extended-fast-importer.service.d.ts +5 -3
- package/src/services/extended-fast-importer.service.js +18 -6
- package/src/services/extended-fast-importer.service.js.map +1 -1
- package/src/services/import-storage/import-job-storage-strategy.d.ts +22 -0
- package/src/services/import-storage/import-job-storage-strategy.js +3 -0
- package/src/services/import-storage/import-job-storage-strategy.js.map +1 -0
- package/src/services/import-storage/local-import-job-storage-strategy.d.ts +18 -0
- package/src/services/import-storage/local-import-job-storage-strategy.js +76 -0
- package/src/services/import-storage/local-import-job-storage-strategy.js.map +1 -0
- package/src/services/import-storage/s3-import-job-storage-strategy.d.ts +13 -0
- package/src/services/import-storage/s3-import-job-storage-strategy.js +109 -0
- package/src/services/import-storage/s3-import-job-storage-strategy.js.map +1 -0
- package/src/services/product-export.service.d.ts +1 -0
- package/src/services/product-export.service.js +24 -3
- package/src/services/product-export.service.js.map +1 -1
- package/src/services/product-import.service.d.ts +10 -6
- package/src/services/product-import.service.js +62 -37
- package/src/services/product-import.service.js.map +1 -1
- package/src/types.d.ts +21 -1
- package/src/ui/components/export-dialog.component.html +1 -1
- package/src/ui/components/export-dialog.component.ts +10 -2
- package/src/ui/components/product-import.component.html +6 -8
- package/src/ui/translations/en.json +1 -1
- package/src/ui/translations/sv.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
## 3.3.2-next.0
|
|
2
|
+
|
|
3
|
+
### 🚀 Features
|
|
4
|
+
|
|
5
|
+
- **product-import-export-plugin:** optimize asset handling and caching in product importer ([9d2888e](https://github.com/WeAreHausTech/haus-tech-vendure-plugins-public/commit/9d2888e))
|
|
6
|
+
- **product-import-export-plugin:** enhance testing and export functionality ([1764eb2](https://github.com/WeAreHausTech/haus-tech-vendure-plugins-public/commit/1764eb2))
|
|
7
|
+
- **product-import-export-plugin:** enforce import/export acceptance criteria (column-presence updates, multi-variant option requirements, no ProductID export option, clearer import CTA, and strict required relation custom-field validation)
|
|
8
|
+
|
|
1
9
|
## 3.3.1
|
|
2
10
|
|
|
3
11
|
This was a version bump only for product-import-export-plugin to align it with other projects, there were no code changes.
|
package/README.mdx
CHANGED
|
@@ -65,10 +65,18 @@ export const config = {
|
|
|
65
65
|
|
|
66
66
|
### Import options
|
|
67
67
|
|
|
68
|
-
| Option
|
|
69
|
-
|
|
|
70
|
-
| `updateProductSlug`
|
|
71
|
-
| `restoreSoftDeleted`
|
|
68
|
+
| Option | Type | Default | Description |
|
|
69
|
+
| ------------------------ | ----------------------------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
70
|
+
| `updateProductSlug` | `boolean` | `true` | Update product slug from the `name` field in the CSV |
|
|
71
|
+
| `restoreSoftDeleted` | `boolean` | `true` | Restore soft-deleted products/variants found by id or SKU during import. If `false`, new products will be created instead. |
|
|
72
|
+
| `storageStrategy` | `ImportJobStorageStrategy` | local disk | Strategy instance for queued import file storage and retrieval. |
|
|
73
|
+
| `storageStrategyFactory` | `(injector: Injector) => ImportJobStorageStrategy` | `undefined` | Factory for DI-aware strategy creation (recommended for S3/remote storage). |
|
|
74
|
+
| `importJobStorage` | `'local' \| 's3'` | `'local'` | Deprecated compatibility flag. Prefer `storageStrategy` / `storageStrategyFactory`. |
|
|
75
|
+
|
|
76
|
+
Available import storage strategies:
|
|
77
|
+
|
|
78
|
+
- `LocalImportJobStorageStrategy` (default)
|
|
79
|
+
- `S3ImportJobStorageStrategy`
|
|
72
80
|
|
|
73
81
|
### Export options
|
|
74
82
|
|
|
@@ -114,6 +122,12 @@ The plugin supports configurable storage for exported files:
|
|
|
114
122
|
| `enabled` | `true` or `false` | `true` |
|
|
115
123
|
| Custom fields | Column name = custom field name; value depends on field type | Add columns for any Product or ProductVariant custom fields defined in your Vendure config |
|
|
116
124
|
|
|
125
|
+
#### Import behavior rules
|
|
126
|
+
|
|
127
|
+
- If a column is omitted from the CSV header, that field is left unchanged on existing products/variants.
|
|
128
|
+
- If a column exists in the header but the cell is empty, that field is explicitly cleared.
|
|
129
|
+
- For products with more than one variant, `optionGroups` and `optionValues` are required.
|
|
130
|
+
|
|
117
131
|
#### Multi-language support
|
|
118
132
|
|
|
119
133
|
Use language-specific columns by suffixing the field name with the language code. The language codes must match those configured in your Vendure instance (e.g. `en`, `sv`).
|
|
@@ -161,6 +175,9 @@ The Admin UI offers basic import and export. Some features such as the export-al
|
|
|
161
175
|
|
|
162
176
|
1. In the Admin UI or Dashboard, select products to export (or use bulk export).
|
|
163
177
|
2. Configure export fields (assets, facets, custom fields, etc.).
|
|
178
|
+
- For products with more than one variant, `optionGroups` and `optionValues` must be included.
|
|
179
|
+
- `productId` is not available as a selectable export field.
|
|
180
|
+
- If `customFields` are not selected, no custom-field columns are written to the CSV.
|
|
164
181
|
3. Choose asset format: URL or JSON.
|
|
165
182
|
4. Start the export (it is added to a job queue and runs in the background).
|
|
166
183
|
5. Download the CSV when the export is complete. Your downloaded files will be listed in the export view.
|
package/package.json
CHANGED
|
@@ -11,6 +11,7 @@ export declare class ProductExportController {
|
|
|
11
11
|
private productExportQueueService;
|
|
12
12
|
constructor(options: PluginInitOptions, exportStorageStrategy: ExportStorageStrategy, productExportService: ProductExportService, productExportQueueService: ProductExportQueueService);
|
|
13
13
|
private validateExportFileName;
|
|
14
|
+
private validateOptionColumnsForMultiVariantExport;
|
|
14
15
|
exportProducts(ctx: RequestContext, res: Response, fileName: string, customFields: string, exportAssetsAs: 'url' | 'json', selectedExportFields: string, selection: ID[]): Promise<void>;
|
|
15
16
|
exportAllProducts(ctx: RequestContext, fileName: string, customFields: string, exportAssetsAs: 'url' | 'json', selectedExportFields: string): Promise<{
|
|
16
17
|
success: boolean;
|
|
@@ -46,6 +46,20 @@ let ProductExportController = class ProductExportController {
|
|
|
46
46
|
}
|
|
47
47
|
return trimmed;
|
|
48
48
|
}
|
|
49
|
+
async validateOptionColumnsForMultiVariantExport(ctx, selectedExportFields, selectionIds) {
|
|
50
|
+
const selected = new Set(selectedExportFields
|
|
51
|
+
.split(',')
|
|
52
|
+
.map((field) => field.trim())
|
|
53
|
+
.filter(Boolean));
|
|
54
|
+
const hasRequiredFields = selected.has('optionGroups') && selected.has('optionValues');
|
|
55
|
+
if (hasRequiredFields) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const hasMultiVariantProducts = await this.productExportService.hasMultiVariantProducts(ctx, selectionIds);
|
|
59
|
+
if (hasMultiVariantProducts) {
|
|
60
|
+
throw new common_1.UnprocessableEntityException('optionGroups and optionValues are required when exporting products with multiple variants');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
49
63
|
async exportProducts(ctx, res, fileName, customFields, exportAssetsAs, selectedExportFields, selection) {
|
|
50
64
|
try {
|
|
51
65
|
if (!selection ||
|
|
@@ -70,6 +84,7 @@ let ProductExportController = class ProductExportController {
|
|
|
70
84
|
if (!customFields) {
|
|
71
85
|
customFields = '';
|
|
72
86
|
}
|
|
87
|
+
await this.validateOptionColumnsForMultiVariantExport(ctx, selectedExportFields, selection);
|
|
73
88
|
const job = await this.productExportQueueService.triggerExportWithSelection(ctx, fileName, customFields, exportAssetsAs, selectedExportFields, selection);
|
|
74
89
|
if (!job || !job.id) {
|
|
75
90
|
throw new common_1.UnprocessableEntityException('Failed to queue export job');
|
|
@@ -99,6 +114,7 @@ let ProductExportController = class ProductExportController {
|
|
|
99
114
|
if (!customFields) {
|
|
100
115
|
customFields = '';
|
|
101
116
|
}
|
|
117
|
+
await this.validateOptionColumnsForMultiVariantExport(ctx, selectedExportFields);
|
|
102
118
|
const job = await this.productExportQueueService.triggerExport(ctx, fileName, customFields, exportAssetsAs, selectedExportFields, true);
|
|
103
119
|
return {
|
|
104
120
|
success: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product-export.controller.js","sourceRoot":"","sources":["../../../../../packages/product-import-export-plugin/src/api/product-export.controller.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"product-export.controller.js","sourceRoot":"","sources":["../../../../../packages/product-import-export-plugin/src/api/product-export.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,11 +34,11 @@ let ProductImportController = class ProductImportController {
|
|
|
34
34
|
return res.status(400).send('No mainLanguage provided');
|
|
35
35
|
}
|
|
36
36
|
try {
|
|
37
|
-
this.service.processFile(ctx, file, updateProductSlug === 'true', mainLanguage, updatingStrategy);
|
|
37
|
+
await this.service.processFile(ctx, file, updateProductSlug === 'true', mainLanguage, updatingStrategy);
|
|
38
38
|
return res.status(200).send('File uploaded successfully');
|
|
39
39
|
}
|
|
40
40
|
catch (error) {
|
|
41
|
-
return res.status(500).send('Internal Server Error');
|
|
41
|
+
return res.status(500).send(error?.message || 'Internal Server Error');
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product-import.controller.js","sourceRoot":"","sources":["../../../../../packages/product-import-export-plugin/src/api/product-import.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,wCAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"product-import.controller.js","sourceRoot":"","sources":["../../../../../packages/product-import-export-plugin/src/api/product-import.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,wCAAiE;AACjE,2CAQuB;AAEvB,+DAA0D;AAC1D,4CAAmE;AAEnE,+EAAyE;AAGlE,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAEsB;IAC9C;IAFV,YACwD,OAA0B,EACxE,OAA6B;QADiB,YAAO,GAAP,OAAO,CAAmB;QACxE,YAAO,GAAP,OAAO,CAAsB;IACpC,CAAC;IAIE,AAAN,KAAK,CAAC,cAAc,CACX,GAAmB,EACV,IAAyB,EAEzC,oBAAuC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc;QAC9E,EAAE,iBAAyB,IAAI,MAAM,EACjB,YAA0B,EACtB,gBAAkC,EAE5D,GAAa;QAEb,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACjD,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACzD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAC5B,GAAG,EACH,IAAI,EACJ,iBAAiB,KAAK,MAAM,EAC5B,YAAY,EACZ,gBAAgB,CACjB,CAAA;YACD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;QAC3D,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAE,KAAe,EAAE,OAAO,IAAI,uBAAuB,CAAC,CAAA;QACnF,CAAC;IACH,CAAC;CACF,CAAA;AAxCY,0DAAuB;AAQ5B;IAFL,IAAA,aAAI,EAAC,SAAS,CAAC;IACf,IAAA,wBAAe,EAAC,IAAA,kCAAe,EAAC,MAAM,CAAC,CAAC;IAEtC,WAAA,IAAA,UAAG,GAAE,CAAA;IACL,WAAA,IAAA,qBAAY,GAAE,CAAA;IACd,WAAA,IAAA,aAAI,EAAC,mBAAmB,CAAC,CAAA;IAGzB,WAAA,IAAA,aAAI,EAAC,cAAc,CAAC,CAAA;IACpB,WAAA,IAAA,aAAI,EAAC,kBAAkB,CAAC,CAAA;IACxB,WAAA,IAAA,YAAG,GAAE,CAAA;;qCAPM,qBAAc;;6DA8B3B;kCAvCU,uBAAuB;IADnC,IAAA,mBAAU,EAAC,gBAAgB,CAAC;IAGxB,WAAA,IAAA,eAAM,EAAC,gDAAoC,CAAC,CAAA;6CAC5B,6CAAoB;GAH5B,uBAAuB,CAwCnC"}
|
package/src/constants.d.ts
CHANGED
package/src/constants.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.loggerCtx = exports.EXPORT_STORAGE_STRATEGY = exports.PRODUCT_IMPORT_EXPORT_PLUGIN_OPTIONS = void 0;
|
|
3
|
+
exports.loggerCtx = exports.IMPORT_JOB_STORAGE_STRATEGY = exports.EXPORT_STORAGE_STRATEGY = exports.PRODUCT_IMPORT_EXPORT_PLUGIN_OPTIONS = void 0;
|
|
4
4
|
exports.PRODUCT_IMPORT_EXPORT_PLUGIN_OPTIONS = Symbol('PRODUCT_IMPORT_EXPORT_PLUGIN_OPTIONS');
|
|
5
5
|
exports.EXPORT_STORAGE_STRATEGY = Symbol('EXPORT_STORAGE_STRATEGY');
|
|
6
|
+
exports.IMPORT_JOB_STORAGE_STRATEGY = Symbol('IMPORT_JOB_STORAGE_STRATEGY');
|
|
6
7
|
exports.loggerCtx = 'ProductImportExportPlugin';
|
|
7
8
|
//# sourceMappingURL=constants.js.map
|
package/src/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../packages/product-import-export-plugin/src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,oCAAoC,GAAG,MAAM,CAAC,sCAAsC,CAAC,CAAA;AACrF,QAAA,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAA;AAC3D,QAAA,SAAS,GAAG,2BAA2B,CAAA"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../packages/product-import-export-plugin/src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,oCAAoC,GAAG,MAAM,CAAC,sCAAsC,CAAC,CAAA;AACrF,QAAA,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAA;AAC3D,QAAA,2BAA2B,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAA;AACnE,QAAA,SAAS,GAAG,2BAA2B,CAAA"}
|
|
@@ -36,13 +36,13 @@ export function ExportDialog({
|
|
|
36
36
|
productIds,
|
|
37
37
|
isExportAll = false,
|
|
38
38
|
}: ExportDialogProps) {
|
|
39
|
+
const mandatoryOptionFields: Array<ProductFields | VariantFields> = ['optionGroups', 'optionValues']
|
|
39
40
|
const [fileName, setFileName] = useState('')
|
|
40
41
|
const [customFields, setCustomFields] = useState<string[]>([])
|
|
41
42
|
const [selectedFields, setSelectedFields] = useState<string[]>([])
|
|
42
43
|
const [exportAssetsAs, setExportAssetsAs] = useState<'url' | 'json'>('url')
|
|
43
44
|
const [selectedExportFields, setSelectedExportFields] = useState<ExportFields>([])
|
|
44
45
|
const [availableExportFields] = useState<ExportFields>([
|
|
45
|
-
'productId',
|
|
46
46
|
'name',
|
|
47
47
|
'slug',
|
|
48
48
|
'description',
|
|
@@ -101,10 +101,15 @@ export function ExportDialog({
|
|
|
101
101
|
configData.exportOptions?.defaultExportFields ||
|
|
102
102
|
configData.exportOptions?.requiredExportFields
|
|
103
103
|
) {
|
|
104
|
-
setSelectedExportFields(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
104
|
+
setSelectedExportFields(
|
|
105
|
+
Array.from(
|
|
106
|
+
new Set([
|
|
107
|
+
...(configData.exportOptions.defaultExportFields || []),
|
|
108
|
+
...(configData.exportOptions.requiredExportFields || []),
|
|
109
|
+
...mandatoryOptionFields,
|
|
110
|
+
]),
|
|
111
|
+
) as ExportFields,
|
|
112
|
+
)
|
|
108
113
|
}
|
|
109
114
|
} catch (error) {
|
|
110
115
|
console.error('Failed to fetch config:', error)
|
|
@@ -123,6 +128,9 @@ export function ExportDialog({
|
|
|
123
128
|
}
|
|
124
129
|
|
|
125
130
|
const toggleExportFieldSelection = (fieldName: ProductFields | VariantFields) => {
|
|
131
|
+
if (mandatoryOptionFields.includes(fieldName)) {
|
|
132
|
+
return
|
|
133
|
+
}
|
|
126
134
|
setSelectedExportFields((prev) =>
|
|
127
135
|
prev.includes(fieldName) ? prev.filter((f) => f !== fieldName) : [...prev, fieldName],
|
|
128
136
|
)
|
|
@@ -134,7 +142,10 @@ export function ExportDialog({
|
|
|
134
142
|
setSelectedExportFields([...availableExportFields])
|
|
135
143
|
setSelectedFields([...customFields])
|
|
136
144
|
} else {
|
|
137
|
-
setSelectedExportFields([
|
|
145
|
+
setSelectedExportFields([
|
|
146
|
+
...(config?.requiredExportFields || []),
|
|
147
|
+
...mandatoryOptionFields,
|
|
148
|
+
])
|
|
138
149
|
setSelectedFields([])
|
|
139
150
|
}
|
|
140
151
|
}
|
|
@@ -220,7 +231,10 @@ export function ExportDialog({
|
|
|
220
231
|
id={`field-${field}`}
|
|
221
232
|
checked={selectedExportFields.includes(field)}
|
|
222
233
|
onCheckedChange={() => toggleExportFieldSelection(field)}
|
|
223
|
-
disabled={
|
|
234
|
+
disabled={
|
|
235
|
+
config?.requiredExportFields?.includes(field) ||
|
|
236
|
+
mandatoryOptionFields.includes(field)
|
|
237
|
+
}
|
|
224
238
|
/>
|
|
225
239
|
<Label htmlFor={`field-${field}`} className="font-normal">
|
|
226
240
|
{field}
|
package/src/dashboard/import.tsx
CHANGED
|
@@ -503,9 +503,6 @@ export function ProductImportBlock() {
|
|
|
503
503
|
<UploadIcon className="mr-2 h-4 w-4" />
|
|
504
504
|
{selectedFile.name}
|
|
505
505
|
</Button>
|
|
506
|
-
<Button type="button" onClick={uploadFile} disabled={!selectedMainLanguage}>
|
|
507
|
-
Upload file
|
|
508
|
-
</Button>
|
|
509
506
|
</>
|
|
510
507
|
) : (
|
|
511
508
|
<Button type="button" variant="default" onClick={() => fileInputRef.current?.click()}>
|
|
@@ -577,6 +574,12 @@ export function ProductImportBlock() {
|
|
|
577
574
|
</p>
|
|
578
575
|
)}
|
|
579
576
|
</div>
|
|
577
|
+
|
|
578
|
+
<div className="pt-2 border-t">
|
|
579
|
+
<Button type="button" onClick={uploadFile} disabled={!selectedMainLanguage}>
|
|
580
|
+
Start import now
|
|
581
|
+
</Button>
|
|
582
|
+
</div>
|
|
580
583
|
</div>
|
|
581
584
|
)}
|
|
582
585
|
</div>
|
package/src/dashboard/utils.ts
CHANGED
package/src/index.d.ts
CHANGED
|
@@ -3,4 +3,7 @@ export type { PluginInitOptions, UpdatingStrategy, JsonAsset } from './types';
|
|
|
3
3
|
export * from './services/export-storage/export-storage-strategy';
|
|
4
4
|
export * from './services/export-storage/local-export-storage-strategy';
|
|
5
5
|
export * from './services/export-storage/s3-export-storage-strategy';
|
|
6
|
+
export * from './services/import-storage/import-job-storage-strategy';
|
|
7
|
+
export * from './services/import-storage/local-import-job-storage-strategy';
|
|
8
|
+
export * from './services/import-storage/s3-import-job-storage-strategy';
|
|
6
9
|
export type { S3ExportStorageConfig } from './services/export-storage.util';
|
package/src/index.js
CHANGED
|
@@ -18,4 +18,7 @@ __exportStar(require("./product-import-export.plugin"), exports);
|
|
|
18
18
|
__exportStar(require("./services/export-storage/export-storage-strategy"), exports);
|
|
19
19
|
__exportStar(require("./services/export-storage/local-export-storage-strategy"), exports);
|
|
20
20
|
__exportStar(require("./services/export-storage/s3-export-storage-strategy"), exports);
|
|
21
|
+
__exportStar(require("./services/import-storage/import-job-storage-strategy"), exports);
|
|
22
|
+
__exportStar(require("./services/import-storage/local-import-job-storage-strategy"), exports);
|
|
23
|
+
__exportStar(require("./services/import-storage/s3-import-job-storage-strategy"), exports);
|
|
21
24
|
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/product-import-export-plugin/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA8C;AAG9C,oFAAiE;AACjE,0FAAuE;AACvE,uFAAoE"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/product-import-export-plugin/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA8C;AAG9C,oFAAiE;AACjE,0FAAuE;AACvE,uFAAoE;AACpE,wFAAqE;AACrE,8FAA2E;AAC3E,2FAAwE"}
|
|
@@ -60,6 +60,7 @@ const extended_fast_importer_service_1 = require("./services/extended-fast-impor
|
|
|
60
60
|
const product_export_service_1 = require("./services/product-export.service");
|
|
61
61
|
const product_export_queue_service_1 = require("./services/product-export-queue.service");
|
|
62
62
|
const local_export_storage_strategy_1 = require("./services/export-storage/local-export-storage-strategy");
|
|
63
|
+
const local_import_job_storage_strategy_1 = require("./services/import-storage/local-import-job-storage-strategy");
|
|
63
64
|
let ProductImportExportPlugin = class ProductImportExportPlugin {
|
|
64
65
|
static { ProductImportExportPlugin_1 = this; }
|
|
65
66
|
static options;
|
|
@@ -71,6 +72,9 @@ let ProductImportExportPlugin = class ProductImportExportPlugin {
|
|
|
71
72
|
restoreSoftDeleted: true,
|
|
72
73
|
};
|
|
73
74
|
}
|
|
75
|
+
if (!options.importOptions.importJobStorage) {
|
|
76
|
+
options.importOptions.importJobStorage = 'local';
|
|
77
|
+
}
|
|
74
78
|
// Ensure exportOptions exists
|
|
75
79
|
if (!options.exportOptions) {
|
|
76
80
|
options.exportOptions = {};
|
|
@@ -160,6 +164,23 @@ exports.ProductImportExportPlugin = ProductImportExportPlugin = ProductImportExp
|
|
|
160
164
|
},
|
|
161
165
|
inject: [core_2.ModuleRef],
|
|
162
166
|
},
|
|
167
|
+
{
|
|
168
|
+
provide: constants_1.IMPORT_JOB_STORAGE_STRATEGY,
|
|
169
|
+
useFactory: async (moduleRef) => {
|
|
170
|
+
const importOptions = ProductImportExportPlugin.options?.importOptions;
|
|
171
|
+
const injector = new core_1.Injector(moduleRef);
|
|
172
|
+
if (importOptions?.storageStrategy) {
|
|
173
|
+
return importOptions.storageStrategy;
|
|
174
|
+
}
|
|
175
|
+
if (importOptions?.storageStrategyFactory) {
|
|
176
|
+
return await importOptions.storageStrategyFactory(injector);
|
|
177
|
+
}
|
|
178
|
+
return new local_import_job_storage_strategy_1.LocalImportJobStorageStrategy({
|
|
179
|
+
baseDir: path.join(process.cwd(), 'static', 'imports-tmp'),
|
|
180
|
+
});
|
|
181
|
+
},
|
|
182
|
+
inject: [core_2.ModuleRef],
|
|
183
|
+
},
|
|
163
184
|
product_import_service_1.ProductImportService,
|
|
164
185
|
product_importer_1.ProductImporter,
|
|
165
186
|
extended_fast_importer_service_1.ExtendedFastImporterService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product-import-export.plugin.js","sourceRoot":"","sources":["../../../../packages/product-import-export-plugin/src/product-import-export.plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wCAAiF;AAEjF,uCAAwC;AACxC,2CAA4B;AAC5B,mCAA6B;AAE7B,
|
|
1
|
+
{"version":3,"file":"product-import-export.plugin.js","sourceRoot":"","sources":["../../../../packages/product-import-export-plugin/src/product-import-export.plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,13 +47,14 @@ export interface ParsedAsset {
|
|
|
47
47
|
export interface ParsedProductVariant {
|
|
48
48
|
sku: string;
|
|
49
49
|
price: number | undefined;
|
|
50
|
-
taxCategory
|
|
51
|
-
stockOnHand
|
|
52
|
-
trackInventory
|
|
50
|
+
taxCategory?: string;
|
|
51
|
+
stockOnHand?: number;
|
|
52
|
+
trackInventory?: GlobalFlag;
|
|
53
53
|
assetPaths: string[];
|
|
54
54
|
assetsJson?: ParsedAsset[];
|
|
55
55
|
facets: ParsedFacet[];
|
|
56
|
-
enabled
|
|
56
|
+
enabled?: boolean;
|
|
57
|
+
optionValuesProvided: boolean;
|
|
57
58
|
translations: Array<{
|
|
58
59
|
languageCode: LanguageCode;
|
|
59
60
|
optionValues: string[];
|
|
@@ -74,12 +75,13 @@ export interface ParsedProduct {
|
|
|
74
75
|
assetPaths: string[];
|
|
75
76
|
assetsJson?: ParsedAsset[];
|
|
76
77
|
optionGroups: ParsedOptionGroup[];
|
|
78
|
+
optionGroupsProvided: boolean;
|
|
77
79
|
facets: ParsedFacet[];
|
|
78
80
|
translations: Array<{
|
|
79
81
|
languageCode: LanguageCode;
|
|
80
82
|
name: string;
|
|
81
83
|
slug: string;
|
|
82
|
-
description
|
|
84
|
+
description?: string;
|
|
83
85
|
customFields: {
|
|
84
86
|
[name: string]: string;
|
|
85
87
|
};
|
|
@@ -136,8 +136,14 @@ let ImportParser = class ImportParser {
|
|
|
136
136
|
const r = mapRowToObject(headerRow, record);
|
|
137
137
|
if (getRawMainTranslation(r, 'name', mainLanguage)) {
|
|
138
138
|
if (currentRow) {
|
|
139
|
-
|
|
140
|
-
|
|
139
|
+
const multiVariantOptionsError = validateMultiVariantOptionRequirements(currentRow);
|
|
140
|
+
if (multiVariantOptionsError) {
|
|
141
|
+
errors.push(multiVariantOptionsError + ` on line ${line - 1}`);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
populateOptionGroupValues(currentRow);
|
|
145
|
+
results.push(currentRow);
|
|
146
|
+
}
|
|
141
147
|
}
|
|
142
148
|
currentRow = {
|
|
143
149
|
product: await this.parseProductFromRecord(r, usedLanguages, mainLanguage),
|
|
@@ -155,8 +161,14 @@ let ImportParser = class ImportParser {
|
|
|
155
161
|
}
|
|
156
162
|
}
|
|
157
163
|
if (currentRow) {
|
|
158
|
-
|
|
159
|
-
|
|
164
|
+
const multiVariantOptionsError = validateMultiVariantOptionRequirements(currentRow);
|
|
165
|
+
if (multiVariantOptionsError) {
|
|
166
|
+
errors.push(multiVariantOptionsError + ` on line ${line}`);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
populateOptionGroupValues(currentRow);
|
|
170
|
+
results.push(currentRow);
|
|
171
|
+
}
|
|
160
172
|
}
|
|
161
173
|
return { results, errors, processed: totalProducts };
|
|
162
174
|
}
|
|
@@ -294,6 +306,7 @@ let ImportParser = class ImportParser {
|
|
|
294
306
|
async parseProductFromRecord(r, usedLanguages, mainLanguage) {
|
|
295
307
|
const translationCodes = usedLanguages.length === 0 ? [mainLanguage] : usedLanguages;
|
|
296
308
|
const optionGroups = [];
|
|
309
|
+
let optionGroupsProvided = false;
|
|
297
310
|
for (const languageCode of translationCodes) {
|
|
298
311
|
const rawTranslOptionGroups = r.hasOwnProperty(`optionGroups:${languageCode}`)
|
|
299
312
|
? r[`optionGroups:${languageCode}`]
|
|
@@ -301,6 +314,7 @@ let ImportParser = class ImportParser {
|
|
|
301
314
|
if (!rawTranslOptionGroups) {
|
|
302
315
|
continue;
|
|
303
316
|
}
|
|
317
|
+
optionGroupsProvided = true;
|
|
304
318
|
const translatedOptionGroups = parseStringArray(rawTranslOptionGroups);
|
|
305
319
|
if (optionGroups.length === 0) {
|
|
306
320
|
for (const translatedOptionGroup of translatedOptionGroups) {
|
|
@@ -365,13 +379,16 @@ let ImportParser = class ImportParser {
|
|
|
365
379
|
languageCode: languageCode,
|
|
366
380
|
}), { value: name, entityName: 'Product', fieldName: 'slug' });
|
|
367
381
|
}
|
|
382
|
+
const hasDescriptionColumn = translatedFields.hasOwnProperty('description') || r.hasOwnProperty('description');
|
|
368
383
|
return {
|
|
369
384
|
languageCode,
|
|
370
385
|
name,
|
|
371
386
|
slug,
|
|
372
|
-
description:
|
|
373
|
-
?
|
|
374
|
-
|
|
387
|
+
description: hasDescriptionColumn
|
|
388
|
+
? translatedFields.hasOwnProperty('description')
|
|
389
|
+
? parseString(translatedFields.description)
|
|
390
|
+
: parseString(r.description)
|
|
391
|
+
: undefined,
|
|
375
392
|
customFields: parsedCustomFields,
|
|
376
393
|
};
|
|
377
394
|
});
|
|
@@ -380,6 +397,7 @@ let ImportParser = class ImportParser {
|
|
|
380
397
|
assetPaths: jsonAssets.length ? jsonAssets.map(({ url }) => url) : parseStringArray(r.assets),
|
|
381
398
|
assetsJson: jsonAssets,
|
|
382
399
|
optionGroups,
|
|
400
|
+
optionGroupsProvided,
|
|
383
401
|
facets,
|
|
384
402
|
translations: await Promise.all(translations),
|
|
385
403
|
};
|
|
@@ -387,6 +405,7 @@ let ImportParser = class ImportParser {
|
|
|
387
405
|
}
|
|
388
406
|
async parseVariantFromRecord(r, usedLanguages, mainLanguage) {
|
|
389
407
|
const translationCodes = usedLanguages.length === 0 ? [mainLanguage] : usedLanguages;
|
|
408
|
+
const optionValuesProvided = r.hasOwnProperty('optionValues') || r.hasOwnProperty(`optionValues:${mainLanguage}`);
|
|
390
409
|
const facets = [];
|
|
391
410
|
for (const languageCode of translationCodes) {
|
|
392
411
|
const rawTranslatedFacets = r.hasOwnProperty(`variantFacets:${languageCode}`)
|
|
@@ -429,23 +448,31 @@ let ImportParser = class ImportParser {
|
|
|
429
448
|
};
|
|
430
449
|
});
|
|
431
450
|
const jsonAssets = parseAssetsIfJson(r.variantAssets);
|
|
432
|
-
const
|
|
451
|
+
const hasEnabledColumn = r.enabled != null;
|
|
452
|
+
const variantIsEnabled = hasEnabledColumn
|
|
453
|
+
? r.enabled === ''
|
|
454
|
+
? undefined
|
|
455
|
+
: parseBoolean(r.enabled)
|
|
456
|
+
: undefined;
|
|
433
457
|
const parsedVariant = {
|
|
434
458
|
sku: parseString(r.sku),
|
|
435
459
|
price: r.price ? parseNumber(r.price) : undefined,
|
|
436
|
-
taxCategory: parseString(r.taxCategory),
|
|
437
|
-
stockOnHand: parseNumber(r.stockOnHand),
|
|
460
|
+
taxCategory: r.hasOwnProperty('taxCategory') ? parseString(r.taxCategory) : undefined,
|
|
461
|
+
stockOnHand: r.hasOwnProperty('stockOnHand') ? parseNumber(r.stockOnHand) : undefined,
|
|
438
462
|
enabled: variantIsEnabled,
|
|
439
|
-
trackInventory: r.trackInventory == null
|
|
440
|
-
?
|
|
441
|
-
:
|
|
442
|
-
?
|
|
443
|
-
:
|
|
463
|
+
trackInventory: r.trackInventory == null
|
|
464
|
+
? undefined
|
|
465
|
+
: r.trackInventory === ''
|
|
466
|
+
? undefined
|
|
467
|
+
: parseBoolean(r.trackInventory)
|
|
468
|
+
? generated_types_1.GlobalFlag.TRUE
|
|
469
|
+
: generated_types_1.GlobalFlag.FALSE,
|
|
444
470
|
assetPaths: jsonAssets.length
|
|
445
471
|
? jsonAssets.map(({ url }) => url)
|
|
446
472
|
: parseStringArray(r.variantAssets),
|
|
447
473
|
assetsJson: jsonAssets,
|
|
448
474
|
facets,
|
|
475
|
+
optionValuesProvided,
|
|
449
476
|
translations,
|
|
450
477
|
};
|
|
451
478
|
return parsedVariant;
|
|
@@ -563,6 +590,17 @@ function validateOptionValueCount(r, currentRow, mainLanguage) {
|
|
|
563
590
|
}
|
|
564
591
|
}
|
|
565
592
|
}
|
|
593
|
+
function validateMultiVariantOptionRequirements(row) {
|
|
594
|
+
if (row.variants.length <= 1) {
|
|
595
|
+
return;
|
|
596
|
+
}
|
|
597
|
+
if (!row.product.optionGroupsProvided || row.product.optionGroups.length === 0) {
|
|
598
|
+
return 'optionGroups and optionValues are required when importing products with multiple variants';
|
|
599
|
+
}
|
|
600
|
+
if (row.variants.some((variant) => !variant.optionValuesProvided)) {
|
|
601
|
+
return 'optionGroups and optionValues are required when importing products with multiple variants';
|
|
602
|
+
}
|
|
603
|
+
}
|
|
566
604
|
function getRawMainTranslation(r, field, mainLanguage) {
|
|
567
605
|
if (r.hasOwnProperty(field)) {
|
|
568
606
|
return r[field];
|