n8n-nodes-prestashop8 2.4.0 → 2.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/nodes/PrestaShop8/PrestaShop8.node.description.js +4 -2
- package/dist/nodes/PrestaShop8/PrestaShop8.node.js +5 -14
- package/dist/nodes/PrestaShop8/helpers/http.js +2 -1
- package/dist/nodes/PrestaShop8/loadOptions.js +2 -2
- package/dist/nodes/PrestaShop8/types.js +3 -1
- package/dist/nodes/PrestaShop8/utils/response.js +2 -2
- package/dist/nodes/PrestaShop8/utils/xml.js +1 -1
- package/package.json +5 -5
|
@@ -19,7 +19,7 @@ function buildOperatorField() {
|
|
|
19
19
|
name: 'operator',
|
|
20
20
|
type: 'options',
|
|
21
21
|
options: types_1.FILTER_OPERATORS,
|
|
22
|
-
default: '
|
|
22
|
+
default: 'EQ',
|
|
23
23
|
noDataExpression: true,
|
|
24
24
|
description: 'Comparison operator for filtering. Custom allows you to write your own filter expression.',
|
|
25
25
|
};
|
|
@@ -354,9 +354,11 @@ exports.PrestaShop8Description = {
|
|
|
354
354
|
description: 'PrestaShop field list format: [field1,field2,field3] or comma-separated: field1,field2,field3',
|
|
355
355
|
},
|
|
356
356
|
// Search Filters - Images resource (custom filter only)
|
|
357
|
+
// NOTE: distinct name from the generic 'filters' below. Two parameters sharing
|
|
358
|
+
// the same name break n8n's NDV value binding (operator could not be selected).
|
|
357
359
|
{
|
|
358
360
|
displayName: 'Search Filters',
|
|
359
|
-
name: '
|
|
361
|
+
name: 'filtersImages',
|
|
360
362
|
type: 'fixedCollection',
|
|
361
363
|
...showForResourceOp('images', 'search'),
|
|
362
364
|
default: {},
|
|
@@ -97,7 +97,6 @@ class PrestaShop8 {
|
|
|
97
97
|
try {
|
|
98
98
|
let responseData;
|
|
99
99
|
let requestUrl = '';
|
|
100
|
-
let requestHeaders = {};
|
|
101
100
|
let requestDebugInfo = {};
|
|
102
101
|
const opts = (0, http_1.getOperationOptions)(this, i);
|
|
103
102
|
const { rawMode, timeout, neverError, includeResponseHeaders, showRequestInfo, showRequestUrl } = opts;
|
|
@@ -124,14 +123,12 @@ class PrestaShop8 {
|
|
|
124
123
|
const rawResult = await (0, http_1.executeRawModeRequest)(requestUrl, credentials, timeout, neverError, includeResponseHeaders, operation, resource);
|
|
125
124
|
responseData = rawResult.responseData;
|
|
126
125
|
requestDebugInfo = rawResult.requestDebugInfo;
|
|
127
|
-
requestHeaders = rawResult.requestHeaders;
|
|
128
126
|
}
|
|
129
127
|
else {
|
|
130
128
|
const options = (0, http_1.buildHttpOptions)('GET', requestUrl, credentials, rawMode, timeout);
|
|
131
129
|
const { response, debugInfo, url, responseHeaders, statusCode } = await (0, http_1.executeHttpRequest)(this.helpers, options, credentials, rawMode, operation, resource, neverError);
|
|
132
130
|
requestUrl = url;
|
|
133
131
|
requestDebugInfo = debugInfo;
|
|
134
|
-
requestHeaders = debugInfo.headers;
|
|
135
132
|
const processedResponse = (0, utils_1.processResponseForMode)(response, resource);
|
|
136
133
|
responseData = (0, http_1.wrapResponse)(processedResponse, includeResponseHeaders, responseHeaders, statusCode);
|
|
137
134
|
}
|
|
@@ -155,7 +152,6 @@ class PrestaShop8 {
|
|
|
155
152
|
const { response, debugInfo, url, responseHeaders, statusCode } = await (0, http_1.executeHttpRequest)(this.helpers, options, credentials, rawMode, operation, resource, neverError);
|
|
156
153
|
requestUrl = url;
|
|
157
154
|
requestDebugInfo = debugInfo;
|
|
158
|
-
requestHeaders = debugInfo.headers;
|
|
159
155
|
const processedResponse = rawMode ? { raw: response } : (0, utils_1.processResponseForMode)(response, resource);
|
|
160
156
|
responseData = (0, http_1.wrapResponse)(processedResponse, includeResponseHeaders, responseHeaders, statusCode);
|
|
161
157
|
break;
|
|
@@ -193,7 +189,6 @@ class PrestaShop8 {
|
|
|
193
189
|
const { response, debugInfo, url, responseHeaders, statusCode } = await (0, http_1.executeHttpRequest)(this.helpers, options, credentials, rawMode, operation, resource, neverError, body);
|
|
194
190
|
requestUrl = url;
|
|
195
191
|
requestDebugInfo = debugInfo;
|
|
196
|
-
requestHeaders = debugInfo.headers;
|
|
197
192
|
const processedResponse = rawMode ? { raw: response } : (0, utils_1.processResponseForMode)(response, resource);
|
|
198
193
|
responseData = (0, http_1.wrapResponse)(processedResponse, includeResponseHeaders, responseHeaders, statusCode);
|
|
199
194
|
break;
|
|
@@ -227,13 +222,16 @@ class PrestaShop8 {
|
|
|
227
222
|
const { response, debugInfo, url, responseHeaders, statusCode } = await (0, http_1.executeHttpRequest)(this.helpers, options, credentials, rawMode, operation, resource, neverError, body);
|
|
228
223
|
requestUrl = url;
|
|
229
224
|
requestDebugInfo = debugInfo;
|
|
230
|
-
requestHeaders = debugInfo.headers;
|
|
231
225
|
const processedResponse = rawMode ? { raw: response } : (0, utils_1.processResponseForMode)(response, resource);
|
|
232
226
|
responseData = (0, http_1.wrapResponse)(processedResponse, includeResponseHeaders, responseHeaders, statusCode);
|
|
233
227
|
break;
|
|
234
228
|
}
|
|
235
229
|
case 'search': {
|
|
236
|
-
|
|
230
|
+
// Images uses a separate parameter ('filtersImages') to avoid a duplicate
|
|
231
|
+
// parameter name that breaks n8n's NDV value binding.
|
|
232
|
+
const filtersParam = (resource === 'images'
|
|
233
|
+
? this.getNodeParameter('filtersImages', i, {})
|
|
234
|
+
: this.getNodeParameter('filters', i, {}));
|
|
237
235
|
const advancedOptions = this.getNodeParameter('advancedOptions', i, {});
|
|
238
236
|
const display = this.getNodeParameter('display', i, 'full');
|
|
239
237
|
const customFields = this.getNodeParameter('customFields', i, '');
|
|
@@ -296,14 +294,12 @@ class PrestaShop8 {
|
|
|
296
294
|
const rawResult = await (0, http_1.executeRawModeRequest)(requestUrl, credentials, timeout, neverError, includeResponseHeaders, operation, resource);
|
|
297
295
|
responseData = rawResult.responseData;
|
|
298
296
|
requestDebugInfo = rawResult.requestDebugInfo;
|
|
299
|
-
requestHeaders = rawResult.requestHeaders;
|
|
300
297
|
}
|
|
301
298
|
else {
|
|
302
299
|
const options = (0, http_1.buildHttpOptions)('GET', requestUrl, credentials, rawMode, timeout);
|
|
303
300
|
const { response, debugInfo, url, responseHeaders, statusCode } = await (0, http_1.executeHttpRequest)(this.helpers, options, credentials, rawMode, operation, resource, neverError);
|
|
304
301
|
requestUrl = url;
|
|
305
302
|
requestDebugInfo = debugInfo;
|
|
306
|
-
requestHeaders = debugInfo.headers;
|
|
307
303
|
const processedResponse = (0, utils_1.processResponseForMode)(response, resource);
|
|
308
304
|
responseData = (0, http_1.wrapResponse)(processedResponse, includeResponseHeaders, responseHeaders, statusCode);
|
|
309
305
|
}
|
|
@@ -318,7 +314,6 @@ class PrestaShop8 {
|
|
|
318
314
|
const { debugInfo, url, responseHeaders, statusCode } = await (0, http_1.executeHttpRequest)(this.helpers, options, credentials, rawMode, operation, resource, neverError);
|
|
319
315
|
requestUrl = url;
|
|
320
316
|
requestDebugInfo = debugInfo;
|
|
321
|
-
requestHeaders = debugInfo.headers;
|
|
322
317
|
const deleteResponse = {
|
|
323
318
|
success: true,
|
|
324
319
|
message: `${resource} with ID ${id} deleted successfully`,
|
|
@@ -343,10 +338,6 @@ class PrestaShop8 {
|
|
|
343
338
|
timestamp: new Date().toISOString(),
|
|
344
339
|
};
|
|
345
340
|
}
|
|
346
|
-
// Add headers to output if requested
|
|
347
|
-
if (showRequestInfo) {
|
|
348
|
-
requestHeaders = requestDebugInfo.headers;
|
|
349
|
-
}
|
|
350
341
|
if (showRequestUrl || showRequestInfo) {
|
|
351
342
|
responseData = {
|
|
352
343
|
data: responseData,
|
|
@@ -14,7 +14,8 @@ const axios = require('axios');
|
|
|
14
14
|
* {v} is replaced by the filter value.
|
|
15
15
|
*/
|
|
16
16
|
exports.FILTER_OPERATOR_FORMATS = {
|
|
17
|
-
'
|
|
17
|
+
'EQ': { template: '[{v}]', requiresValue: true },
|
|
18
|
+
'=': { template: '[{v}]', requiresValue: true }, // legacy alias (custom filters / API)
|
|
18
19
|
'!=': { template: '![{v}]', requiresValue: true },
|
|
19
20
|
'>': { template: '>[{v}]', requiresValue: true },
|
|
20
21
|
'>=': { template: '>=[{v}]', requiresValue: true },
|
|
@@ -115,7 +115,7 @@ exports.loadOptionsMethods = {
|
|
|
115
115
|
description: `Required field: ${field}`,
|
|
116
116
|
}));
|
|
117
117
|
}
|
|
118
|
-
catch
|
|
118
|
+
catch {
|
|
119
119
|
return [{
|
|
120
120
|
name: 'Custom Field',
|
|
121
121
|
value: '__custom__',
|
|
@@ -170,7 +170,7 @@ exports.loadOptionsMethods = {
|
|
|
170
170
|
});
|
|
171
171
|
return fieldOptions;
|
|
172
172
|
}
|
|
173
|
-
catch
|
|
173
|
+
catch {
|
|
174
174
|
return [];
|
|
175
175
|
}
|
|
176
176
|
},
|
|
@@ -376,7 +376,9 @@ exports.PRESTASHOP_RESOURCES = {
|
|
|
376
376
|
};
|
|
377
377
|
// Available filter operators
|
|
378
378
|
exports.FILTER_OPERATORS = [
|
|
379
|
-
|
|
379
|
+
// Value must NOT be '=': n8n treats any parameter value starting with '='
|
|
380
|
+
// as an expression, which makes the option impossible to select in the UI.
|
|
381
|
+
{ name: '= Equal to', value: 'EQ' },
|
|
380
382
|
{ name: '≠ Not equal to', value: '!=' },
|
|
381
383
|
{ name: '> Greater than', value: '>' },
|
|
382
384
|
{ name: '≥ Greater than or equal to', value: '>=' },
|
|
@@ -95,7 +95,7 @@ function simplifyPrestashopResponse(rawData, resource) {
|
|
|
95
95
|
/**
|
|
96
96
|
* Simplifies an individual element
|
|
97
97
|
*/
|
|
98
|
-
function simplifyItem(item,
|
|
98
|
+
function simplifyItem(item, _resource) {
|
|
99
99
|
if (!item || typeof item !== 'object') {
|
|
100
100
|
return item;
|
|
101
101
|
}
|
|
@@ -193,7 +193,7 @@ function buildPrestashopXml(resource, data) {
|
|
|
193
193
|
/**
|
|
194
194
|
* Converts simplified JSON to PrestaShop format
|
|
195
195
|
*/
|
|
196
|
-
function convertSimplifiedToPrestaShop(data,
|
|
196
|
+
function convertSimplifiedToPrestaShop(data, _resource) {
|
|
197
197
|
if (!data || typeof data !== 'object') {
|
|
198
198
|
return data;
|
|
199
199
|
}
|
|
@@ -81,7 +81,7 @@ function buildFieldsXml(fields) {
|
|
|
81
81
|
// Group fields by base name (for multilingual support)
|
|
82
82
|
const fieldGroups = {};
|
|
83
83
|
for (const field of fields) {
|
|
84
|
-
if (field.name && field.value !== undefined) {
|
|
84
|
+
if (field.name && field.value !== undefined && field.value !== null) {
|
|
85
85
|
const multilingualMatch = field.name.match(/^(.+)-(\d+)$/);
|
|
86
86
|
if (multilingualMatch) {
|
|
87
87
|
const [, fieldName, langId] = multilingualMatch;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "n8n-nodes-prestashop8",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.2",
|
|
4
4
|
"description": "Nœud n8n personnalisé pour PrestaShop 8 avec support CRUD complet et conversion XML/JSON automatique",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"n8n-community-node-package",
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
"build": "tsc && gulp build:icons",
|
|
33
33
|
"dev": "tsc --watch",
|
|
34
34
|
"format": "prettier nodes credentials --write",
|
|
35
|
-
"lint": "eslint nodes credentials
|
|
36
|
-
"lintfix": "eslint nodes credentials
|
|
35
|
+
"lint": "eslint nodes credentials",
|
|
36
|
+
"lintfix": "eslint nodes credentials --fix",
|
|
37
37
|
"prepublishOnly": "npm run build && npm run lint",
|
|
38
38
|
"test": "jest",
|
|
39
39
|
"test:watch": "jest --watch",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@eslint/js": "^9.39.4",
|
|
59
59
|
"@types/jest": "^30.0.0",
|
|
60
|
-
"axios": "^1.
|
|
60
|
+
"axios": "^1.16.0",
|
|
61
61
|
"@types/node": "^24.12.2",
|
|
62
62
|
"@types/xml2js": "^0.4.14",
|
|
63
63
|
"@typescript-eslint/eslint-plugin": "^8.59.0",
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"picomatch": "^4.0.4",
|
|
86
86
|
"brace-expansion": "^1.1.13",
|
|
87
87
|
"uuid": "^14.0.0",
|
|
88
|
-
"axios": "^1.
|
|
88
|
+
"axios": "^1.16.0",
|
|
89
89
|
"form-data": "^4.0.4",
|
|
90
90
|
"follow-redirects": "^1.16.0"
|
|
91
91
|
}
|