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.
@@ -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: 'filters',
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
- const filtersParam = this.getNodeParameter('filters', i, {});
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
- '=': { template: '[{v}]', requiresValue: true },
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 (error) {
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 (error) {
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
- { name: '= Equal to', value: '=' },
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, resource) {
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, resource) {
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.0",
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 package.json",
36
- "lintfix": "eslint nodes credentials package.json --fix",
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.15.0",
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.15.0",
88
+ "axios": "^1.16.0",
89
89
  "form-data": "^4.0.4",
90
90
  "follow-redirects": "^1.16.0"
91
91
  }