@thomlov81/n8n-nodes-esogr-custom 0.1.6 → 0.1.7

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.
@@ -0,0 +1,5 @@
1
+ import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class InputValidator implements INodeType {
3
+ description: INodeTypeDescription;
4
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
+ }
@@ -0,0 +1,347 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InputValidator = void 0;
4
+ const validators_1 = require("./validators");
5
+ const utils_1 = require("./utils");
6
+ class InputValidator {
7
+ constructor() {
8
+ this.description = {
9
+ displayName: 'Input Validator',
10
+ name: 'inputValidator',
11
+ icon: 'file:inputValidator.svg',
12
+ group: ['transform'],
13
+ version: 1,
14
+ subtitle: 'Validate {{$parameter["fields"]["field"].length}} field(s)',
15
+ description: 'Validate input data against defined rules with multi-language error messages',
16
+ defaults: {
17
+ name: 'Input Validator',
18
+ },
19
+ inputs: ['main'],
20
+ outputs: ['main', 'main'],
21
+ outputNames: ['Valid', 'Invalid'],
22
+ properties: [
23
+ {
24
+ displayName: 'Fields',
25
+ name: 'fields',
26
+ type: 'fixedCollection',
27
+ typeOptions: {
28
+ multipleValues: true,
29
+ sortable: true,
30
+ },
31
+ default: {},
32
+ options: [
33
+ {
34
+ name: 'field',
35
+ displayName: 'Field',
36
+ values: [
37
+ {
38
+ displayName: 'Allowed Values',
39
+ name: 'enum',
40
+ type: 'string',
41
+ default: '',
42
+ description: 'Comma-separated list of allowed values',
43
+ },
44
+ {
45
+ displayName: 'Field Path',
46
+ name: 'fieldPath',
47
+ type: 'string',
48
+ default: '',
49
+ placeholder: 'user.email or items[0 ].price',
50
+ description: 'Path to the field (supports dot notation and array indexes)',
51
+ },
52
+ {
53
+ displayName: 'Max Date',
54
+ name: 'maxDate',
55
+ type: 'string',
56
+ default: '',
57
+ description: 'Maximum date (YYYY-MM-DD or ISO 8601)',
58
+ },
59
+ {
60
+ displayName: 'Max Items',
61
+ name: 'maxItems',
62
+ type: 'number',
63
+ default: 0,
64
+ description: 'Maximum number of items (0 = no limit)',
65
+ },
66
+ {
67
+ displayName: 'Max Length',
68
+ name: 'maxLength',
69
+ type: 'number',
70
+ default: 0,
71
+ description: 'Maximum string length (0 = no limit)',
72
+ },
73
+ {
74
+ displayName: 'Maximum',
75
+ name: 'max',
76
+ type: 'number',
77
+ default: '',
78
+ description: 'Maximum value (leave empty for no limit)',
79
+ },
80
+ {
81
+ displayName: 'Min Date',
82
+ name: 'minDate',
83
+ type: 'string',
84
+ default: '',
85
+ description: 'Minimum date (YYYY-MM-DD or ISO 8601)',
86
+ },
87
+ {
88
+ displayName: 'Min Items',
89
+ name: 'minItems',
90
+ type: 'number',
91
+ default: 0,
92
+ description: 'Minimum number of items (0 = no limit)',
93
+ },
94
+ {
95
+ displayName: 'Min Length',
96
+ name: 'minLength',
97
+ type: 'number',
98
+ default: 0,
99
+ description: 'Minimum string length (0 = no limit)',
100
+ },
101
+ {
102
+ displayName: 'Minimum',
103
+ name: 'min',
104
+ type: 'number',
105
+ default: '',
106
+ description: 'Minimum value (leave empty for no limit)',
107
+ },
108
+ {
109
+ displayName: 'Pattern (Regex)',
110
+ name: 'pattern',
111
+ type: 'string',
112
+ default: '',
113
+ description: 'Regular expression pattern to match',
114
+ },
115
+ {
116
+ displayName: 'Required',
117
+ name: 'required',
118
+ type: 'boolean',
119
+ default: true,
120
+ description: 'Whether the field is required',
121
+ },
122
+ {
123
+ displayName: 'Trim Whitespace',
124
+ name: 'trim',
125
+ type: 'boolean',
126
+ default: true,
127
+ description: 'Whether to trim leading/trailing whitespace',
128
+ },
129
+ {
130
+ displayName: 'Type',
131
+ name: 'type',
132
+ type: 'options',
133
+ options: [
134
+ {
135
+ name: 'Array',
136
+ value: 'array',
137
+ },
138
+ {
139
+ name: 'Boolean',
140
+ value: 'boolean',
141
+ },
142
+ {
143
+ name: 'Date (YYYY-MM-DD)',
144
+ value: 'date',
145
+ },
146
+ {
147
+ name: 'Datetime (ISO 8601)',
148
+ value: 'datetime',
149
+ },
150
+ {
151
+ name: 'Email',
152
+ value: 'email',
153
+ },
154
+ {
155
+ name: 'Integer',
156
+ value: 'integer',
157
+ },
158
+ {
159
+ name: 'Number',
160
+ value: 'number',
161
+ },
162
+ {
163
+ name: 'Phone',
164
+ value: 'phone',
165
+ },
166
+ {
167
+ name: 'String',
168
+ value: 'string',
169
+ },
170
+ {
171
+ name: 'Time (HH:MM:SS)',
172
+ value: 'time',
173
+ },
174
+ {
175
+ name: 'URL',
176
+ value: 'url',
177
+ },
178
+ {
179
+ name: 'UUID',
180
+ value: 'uuid',
181
+ },
182
+ ],
183
+ default: 'string',
184
+ description: 'The expected type of the field',
185
+ },
186
+ ],
187
+ },
188
+ ],
189
+ },
190
+ {
191
+ displayName: 'Options',
192
+ name: 'options',
193
+ type: 'collection',
194
+ placeholder: 'Add Option',
195
+ default: {},
196
+ options: [
197
+ {
198
+ displayName: 'Pass Through All Data',
199
+ name: 'passThrough',
200
+ type: 'boolean',
201
+ default: true,
202
+ description: 'Whether to include all original data in output (false = only validated fields)',
203
+ },
204
+ {
205
+ displayName: 'Stop on First Error',
206
+ name: 'stopOnFirstError',
207
+ type: 'boolean',
208
+ default: false,
209
+ description: 'Whether to stop validation after the first error',
210
+ },
211
+ {
212
+ displayName: 'Coerce Types',
213
+ name: 'coerceTypes',
214
+ type: 'boolean',
215
+ default: true,
216
+ description: 'Whether to automatically convert compatible types (e.g., "123" to 123)',
217
+ },
218
+ ],
219
+ },
220
+ ],
221
+ };
222
+ }
223
+ async execute() {
224
+ const items = this.getInputData();
225
+ const validItems = [];
226
+ const invalidItems = [];
227
+ for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
228
+ const item = items[itemIndex];
229
+ const inputData = item.json;
230
+ const fieldsConfig = this.getNodeParameter('fields', itemIndex);
231
+ const options = this.getNodeParameter('options', itemIndex);
232
+ const fields = fieldsConfig.field || [];
233
+ const passThrough = options.passThrough !== false;
234
+ const stopOnFirstError = options.stopOnFirstError === true;
235
+ const coerceTypes = options.coerceTypes !== false;
236
+ const errors = {};
237
+ const validatedData = {};
238
+ for (const fieldConfig of fields) {
239
+ const fieldPath = fieldConfig.fieldPath;
240
+ const type = fieldConfig.type;
241
+ const required = fieldConfig.required;
242
+ if (!fieldPath) {
243
+ continue;
244
+ }
245
+ let value = (0, utils_1.getNestedValue)(inputData, fieldPath);
246
+ if (required && (0, utils_1.isEmpty)(value)) {
247
+ errors[fieldPath] = {
248
+ code: 'REQUIRED',
249
+ en: 'This field is required',
250
+ no: 'Dette feltet er påkrevd',
251
+ };
252
+ if (stopOnFirstError) {
253
+ break;
254
+ }
255
+ continue;
256
+ }
257
+ if (!required && (0, utils_1.isEmpty)(value)) {
258
+ continue;
259
+ }
260
+ if (coerceTypes && value !== null && value !== undefined) {
261
+ const coerced = (0, utils_1.coerceType)(value, type);
262
+ if (coerced.success) {
263
+ value = coerced.value;
264
+ }
265
+ }
266
+ const validationOptions = {};
267
+ if (type === 'string') {
268
+ if (fieldConfig.minLength && Number(fieldConfig.minLength) > 0) {
269
+ validationOptions.minLength = Number(fieldConfig.minLength);
270
+ }
271
+ if (fieldConfig.maxLength && Number(fieldConfig.maxLength) > 0) {
272
+ validationOptions.maxLength = Number(fieldConfig.maxLength);
273
+ }
274
+ if (fieldConfig.pattern) {
275
+ validationOptions.pattern = fieldConfig.pattern;
276
+ }
277
+ if (fieldConfig.enum) {
278
+ const enumStr = fieldConfig.enum;
279
+ validationOptions.enum = enumStr.split(',').map((s) => s.trim()).filter((s) => s);
280
+ }
281
+ validationOptions.trim = fieldConfig.trim !== false;
282
+ }
283
+ if (type === 'number' || type === 'integer') {
284
+ if (fieldConfig.min !== '' && fieldConfig.min !== undefined) {
285
+ validationOptions.min = Number(fieldConfig.min);
286
+ }
287
+ if (fieldConfig.max !== '' && fieldConfig.max !== undefined) {
288
+ validationOptions.max = Number(fieldConfig.max);
289
+ }
290
+ }
291
+ if (type === 'date' || type === 'datetime') {
292
+ if (fieldConfig.minDate) {
293
+ validationOptions.minDate = fieldConfig.minDate;
294
+ }
295
+ if (fieldConfig.maxDate) {
296
+ validationOptions.maxDate = fieldConfig.maxDate;
297
+ }
298
+ }
299
+ if (type === 'array') {
300
+ if (fieldConfig.minItems && Number(fieldConfig.minItems) > 0) {
301
+ validationOptions.minItems = Number(fieldConfig.minItems);
302
+ }
303
+ if (fieldConfig.maxItems && Number(fieldConfig.maxItems) > 0) {
304
+ validationOptions.maxItems = Number(fieldConfig.maxItems);
305
+ }
306
+ }
307
+ const result = (0, validators_1.validate)(value, type, validationOptions);
308
+ if (!result.valid && result.error) {
309
+ errors[fieldPath] = result.error;
310
+ if (stopOnFirstError) {
311
+ break;
312
+ }
313
+ }
314
+ else if (result.valid) {
315
+ (0, utils_1.setNestedValue)(validatedData, fieldPath, result.value);
316
+ }
317
+ }
318
+ if (Object.keys(errors).length > 0) {
319
+ invalidItems.push({
320
+ json: {
321
+ error: {
322
+ code: 'VALIDATION_ERROR',
323
+ fields: errors,
324
+ },
325
+ },
326
+ pairedItem: { item: itemIndex },
327
+ });
328
+ }
329
+ else {
330
+ let outputData;
331
+ if (passThrough) {
332
+ outputData = { ...inputData, ...validatedData };
333
+ }
334
+ else {
335
+ outputData = validatedData;
336
+ }
337
+ validItems.push({
338
+ json: outputData,
339
+ pairedItem: { item: itemIndex },
340
+ });
341
+ }
342
+ }
343
+ return [validItems, invalidItems];
344
+ }
345
+ }
346
+ exports.InputValidator = InputValidator;
347
+ //# sourceMappingURL=InputValidator.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputValidator.node.js","sourceRoot":"","sources":["../../../nodes/InputValidator/InputValidator.node.ts"],"names":[],"mappings":";;;AAQA,6CAA6E;AAC7E,mCAA8E;AAY9E,MAAa,cAAc;IAA3B;QACC,gBAAW,GAAyB;YACnC,WAAW,EAAE,iBAAiB;YAC9B,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,yBAAyB;YAC/B,KAAK,EAAE,CAAC,WAAW,CAAC;YACpB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,4DAA4D;YACtE,WAAW,EAAE,8EAA8E;YAC3F,QAAQ,EAAE;gBACT,IAAI,EAAE,iBAAiB;aACvB;YACD,MAAM,EAAE,CAAC,MAAM,CAAC;YAChB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;YACzB,WAAW,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;YACjC,UAAU,EAAE;gBAEX;oBACC,WAAW,EAAE,QAAQ;oBACrB,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,iBAAiB;oBACvB,WAAW,EAAE;wBACZ,cAAc,EAAE,IAAI;wBACpB,QAAQ,EAAE,IAAI;qBACd;oBACD,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,OAAO;4BACb,WAAW,EAAE,OAAO;4BACpB,MAAM,EAAE;gCACP;oCACD,WAAW,EAAE,gBAAgB;oCAC7B,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,EAAE;oCACX,WAAW,EAAE,wCAAwC;iCACnD;gCACD;oCACD,WAAW,EAAE,YAAY;oCACzB,IAAI,EAAE,WAAW;oCACjB,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,EAAE;oCACX,WAAW,EAAE,+BAA+B;oCAC5C,WAAW,EAAE,6DAA6D;iCACxE;gCACD;oCACD,WAAW,EAAE,UAAU;oCACvB,IAAI,EAAE,SAAS;oCACf,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,EAAE;oCACX,WAAW,EAAE,uCAAuC;iCAClD;gCACD;oCACD,WAAW,EAAE,WAAW;oCACxB,IAAI,EAAE,UAAU;oCAChB,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,CAAC;oCACV,WAAW,EAAE,wCAAwC;iCACnD;gCACD;oCACD,WAAW,EAAE,YAAY;oCACzB,IAAI,EAAE,WAAW;oCACjB,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,CAAC;oCACV,WAAW,EAAE,sCAAsC;iCACjD;gCACD;oCACD,WAAW,EAAE,SAAS;oCACtB,IAAI,EAAE,KAAK;oCACX,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,EAAE;oCACX,WAAW,EAAE,0CAA0C;iCACrD;gCACD;oCACD,WAAW,EAAE,UAAU;oCACvB,IAAI,EAAE,SAAS;oCACf,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,EAAE;oCACX,WAAW,EAAE,uCAAuC;iCAClD;gCACD;oCACD,WAAW,EAAE,WAAW;oCACxB,IAAI,EAAE,UAAU;oCAChB,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,CAAC;oCACV,WAAW,EAAE,wCAAwC;iCACnD;gCACD;oCACD,WAAW,EAAE,YAAY;oCACzB,IAAI,EAAE,WAAW;oCACjB,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,CAAC;oCACV,WAAW,EAAE,sCAAsC;iCACjD;gCACD;oCACD,WAAW,EAAE,SAAS;oCACtB,IAAI,EAAE,KAAK;oCACX,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,EAAE;oCACX,WAAW,EAAE,0CAA0C;iCACrD;gCACD;oCACD,WAAW,EAAE,iBAAiB;oCAC9B,IAAI,EAAE,SAAS;oCACf,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,EAAE;oCACX,WAAW,EAAE,qCAAqC;iCAChD;gCACD;oCACD,WAAW,EAAE,UAAU;oCACvB,IAAI,EAAE,UAAU;oCAChB,IAAI,EAAE,SAAS;oCACf,OAAO,EAAE,IAAI;oCACb,WAAW,EAAE,+BAA+B;iCAC1C;gCACD;oCACD,WAAW,EAAE,iBAAiB;oCAC9B,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,SAAS;oCACf,OAAO,EAAE,IAAI;oCACb,WAAW,EAAE,6CAA6C;iCACxD;gCACD;oCACD,WAAW,EAAE,MAAM;oCACnB,IAAI,EAAE,MAAM;oCACZ,IAAI,EAAE,SAAS;oCACf,OAAO,EAAE;wCACN;4CACC,IAAI,EAAE,OAAO;4CACb,KAAK,EAAE,OAAO;yCACd;wCACD;4CACC,IAAI,EAAE,SAAS;4CACf,KAAK,EAAE,SAAS;yCAChB;wCACD;4CACC,IAAI,EAAE,mBAAmB;4CACzB,KAAK,EAAE,MAAM;yCACb;wCACD;4CACC,IAAI,EAAE,qBAAqB;4CAC3B,KAAK,EAAE,UAAU;yCACjB;wCACD;4CACC,IAAI,EAAE,OAAO;4CACb,KAAK,EAAE,OAAO;yCACd;wCACD;4CACC,IAAI,EAAE,SAAS;4CACf,KAAK,EAAE,SAAS;yCAChB;wCACD;4CACC,IAAI,EAAE,QAAQ;4CACd,KAAK,EAAE,QAAQ;yCACf;wCACD;4CACC,IAAI,EAAE,OAAO;4CACb,KAAK,EAAE,OAAO;yCACd;wCACD;4CACC,IAAI,EAAE,QAAQ;4CACd,KAAK,EAAE,QAAQ;yCACf;wCACD;4CACC,IAAI,EAAE,iBAAiB;4CACvB,KAAK,EAAE,MAAM;yCACb;wCACD;4CACC,IAAI,EAAE,KAAK;4CACX,KAAK,EAAE,KAAK;yCACZ;wCACD;4CACC,IAAI,EAAE,MAAM;4CACZ,KAAK,EAAE,MAAM;yCACb;qCACJ;oCACA,OAAO,EAAE,QAAQ;oCACjB,WAAW,EAAE,gCAAgC;iCAC3C;6BACF;yBACA;qBACD;iBACD;gBAED;oBACC,WAAW,EAAE,SAAS;oBACtB,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,YAAY;oBAClB,WAAW,EAAE,YAAY;oBACzB,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE;wBACR;4BACC,WAAW,EAAE,uBAAuB;4BACpC,IAAI,EAAE,aAAa;4BACnB,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,IAAI;4BACb,WAAW,EAAE,gFAAgF;yBAC7F;wBACD;4BACC,WAAW,EAAE,qBAAqB;4BAClC,IAAI,EAAE,kBAAkB;4BACxB,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,KAAK;4BACd,WAAW,EAAE,kDAAkD;yBAC/D;wBACD;4BACC,WAAW,EAAE,cAAc;4BAC3B,IAAI,EAAE,aAAa;4BACnB,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,IAAI;4BACb,WAAW,EAAE,wEAAwE;yBACrF;qBACD;iBACD;aACD;SACD,CAAC;IAgKH,CAAC;IA9JA,KAAK,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,MAAM,YAAY,GAAyB,EAAE,CAAC;QAE9C,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;YAC/D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;YAE5B,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAgB,CAAC;YAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAgB,CAAC;YAE3E,MAAM,MAAM,GAAI,YAAY,CAAC,KAAuB,IAAI,EAAE,CAAC;YAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC;YAClD,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,KAAK,IAAI,CAAC;YAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC;YAElD,MAAM,MAAM,GAAqB,EAAE,CAAC;YACpC,MAAM,aAAa,GAA4B,EAAE,CAAC;YAElD,KAAK,MAAM,WAAW,IAAI,MAAM,EAAE,CAAC;gBAClC,MAAM,SAAS,GAAG,WAAW,CAAC,SAAmB,CAAC;gBAClD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAc,CAAC;gBACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAmB,CAAC;gBAEjD,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,SAAS;gBACV,CAAC;gBAGD,IAAI,KAAK,GAAG,IAAA,sBAAc,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAGjD,IAAI,QAAQ,IAAI,IAAA,eAAO,EAAC,KAAK,CAAC,EAAE,CAAC;oBAChC,MAAM,CAAC,SAAS,CAAC,GAAG;wBACnB,IAAI,EAAE,UAAU;wBAChB,EAAE,EAAE,wBAAwB;wBAC5B,EAAE,EAAE,yBAAyB;qBAC7B,CAAC;oBAEF,IAAI,gBAAgB,EAAE,CAAC;wBACtB,MAAM;oBACP,CAAC;oBACD,SAAS;gBACV,CAAC;gBAGD,IAAI,CAAC,QAAQ,IAAI,IAAA,eAAO,EAAC,KAAK,CAAC,EAAE,CAAC;oBACjC,SAAS;gBACV,CAAC;gBAGD,IAAI,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC1D,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBACxC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;wBACrB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;oBACvB,CAAC;gBACF,CAAC;gBAGD,MAAM,iBAAiB,GAAsB,EAAE,CAAC;gBAGhD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACvB,IAAI,WAAW,CAAC,SAAS,IAAI,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;wBAChE,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;oBAC7D,CAAC;oBACD,IAAI,WAAW,CAAC,SAAS,IAAI,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;wBAChE,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;oBAC7D,CAAC;oBACD,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;wBACzB,iBAAiB,CAAC,OAAO,GAAG,WAAW,CAAC,OAAiB,CAAC;oBAC3D,CAAC;oBACD,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;wBACtB,MAAM,OAAO,GAAG,WAAW,CAAC,IAAc,CAAC;wBAC3C,iBAAiB,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;oBACnF,CAAC;oBACD,iBAAiB,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC;gBACrD,CAAC;gBAGD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC7C,IAAI,WAAW,CAAC,GAAG,KAAK,EAAE,IAAI,WAAW,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;wBAC7D,iBAAiB,CAAC,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;oBACjD,CAAC;oBACD,IAAI,WAAW,CAAC,GAAG,KAAK,EAAE,IAAI,WAAW,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;wBAC7D,iBAAiB,CAAC,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;oBACjD,CAAC;gBACF,CAAC;gBAGD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC5C,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;wBACzB,iBAAiB,CAAC,OAAO,GAAG,WAAW,CAAC,OAAiB,CAAC;oBAC3D,CAAC;oBACD,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;wBACzB,iBAAiB,CAAC,OAAO,GAAG,WAAW,CAAC,OAAiB,CAAC;oBAC3D,CAAC;gBACF,CAAC;gBAGD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBACtB,IAAI,WAAW,CAAC,QAAQ,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC9D,iBAAiB,CAAC,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAC3D,CAAC;oBACD,IAAI,WAAW,CAAC,QAAQ,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC9D,iBAAiB,CAAC,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAC3D,CAAC;gBACF,CAAC;gBAGD,MAAM,MAAM,GAAqB,IAAA,qBAAQ,EAAC,KAAK,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;gBAE1E,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACnC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;oBAEjC,IAAI,gBAAgB,EAAE,CAAC;wBACtB,MAAM;oBACP,CAAC;gBACF,CAAC;qBAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBAEzB,IAAA,sBAAc,EAAC,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACxD,CAAC;YACF,CAAC;YAGD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAEpC,YAAY,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE;wBACL,KAAK,EAAE;4BACN,IAAI,EAAE,kBAAkB;4BACxB,MAAM,EAAE,MAAM;yBACd;qBACD;oBACD,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;iBAC/B,CAAC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBAEP,IAAI,UAAuB,CAAC;gBAE5B,IAAI,WAAW,EAAE,CAAC;oBAEjB,UAAU,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,aAAa,EAAiB,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBAEP,UAAU,GAAG,aAA4B,CAAC;gBAC3C,CAAC;gBAED,UAAU,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,UAAU;oBAChB,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;iBAC/B,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QAED,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACnC,CAAC;CACD;AAxXD,wCAwXC"}
@@ -0,0 +1,9 @@
1
+ export interface ErrorMessage {
2
+ en: string;
3
+ no: string;
4
+ }
5
+ export interface ErrorMessages {
6
+ [key: string]: ErrorMessage;
7
+ }
8
+ export declare const errorMessages: ErrorMessages;
9
+ export declare function formatErrorMessage(code: string, params?: Record<string, string | number>): ErrorMessage;
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.errorMessages = void 0;
4
+ exports.formatErrorMessage = formatErrorMessage;
5
+ exports.errorMessages = {
6
+ REQUIRED: {
7
+ en: 'This field is required',
8
+ no: 'Dette feltet er påkrevd',
9
+ },
10
+ INVALID_TYPE: {
11
+ en: 'Invalid type, expected {expected}',
12
+ no: 'Ugyldig type, forventet {expected}',
13
+ },
14
+ STRING_TOO_SHORT: {
15
+ en: 'Must be at least {min} characters',
16
+ no: 'Må være minst {min} tegn',
17
+ },
18
+ STRING_TOO_LONG: {
19
+ en: 'Must be at most {max} characters',
20
+ no: 'Må være maks {max} tegn',
21
+ },
22
+ INVALID_EMAIL: {
23
+ en: 'Invalid email format',
24
+ no: 'Ugyldig e-postformat',
25
+ },
26
+ INVALID_URL: {
27
+ en: 'Invalid URL format',
28
+ no: 'Ugyldig URL-format',
29
+ },
30
+ INVALID_UUID: {
31
+ en: 'Invalid UUID format',
32
+ no: 'Ugyldig UUID-format',
33
+ },
34
+ INVALID_PHONE: {
35
+ en: 'Invalid phone number format',
36
+ no: 'Ugyldig telefonnummerformat',
37
+ },
38
+ NUMBER_TOO_SMALL: {
39
+ en: 'Must be at least {min}',
40
+ no: 'Må være minst {min}',
41
+ },
42
+ NUMBER_TOO_LARGE: {
43
+ en: 'Must be at most {max}',
44
+ no: 'Må være maks {max}',
45
+ },
46
+ INVALID_INTEGER: {
47
+ en: 'Must be a whole number',
48
+ no: 'Må være et heltall',
49
+ },
50
+ INVALID_NUMBER: {
51
+ en: 'Must be a valid number',
52
+ no: 'Må være et gyldig tall',
53
+ },
54
+ INVALID_DATE: {
55
+ en: 'Invalid date format (expected YYYY-MM-DD)',
56
+ no: 'Ugyldig datoformat (forventet YYYY-MM-DD)',
57
+ },
58
+ DATE_TOO_EARLY: {
59
+ en: 'Date must be on or after {min}',
60
+ no: 'Dato må være på eller etter {min}',
61
+ },
62
+ DATE_TOO_LATE: {
63
+ en: 'Date must be on or before {max}',
64
+ no: 'Dato må være på eller før {max}',
65
+ },
66
+ INVALID_DATETIME: {
67
+ en: 'Invalid datetime format (expected ISO 8601)',
68
+ no: 'Ugyldig dato/tid-format (forventet ISO 8601)',
69
+ },
70
+ DATETIME_TOO_EARLY: {
71
+ en: 'Datetime must be on or after {min}',
72
+ no: 'Dato/tid må være på eller etter {min}',
73
+ },
74
+ DATETIME_TOO_LATE: {
75
+ en: 'Datetime must be on or before {max}',
76
+ no: 'Dato/tid må være på eller før {max}',
77
+ },
78
+ INVALID_TIME: {
79
+ en: 'Invalid time format (expected HH:MM or HH:MM:SS)',
80
+ no: 'Ugyldig tidsformat (forventet HH:MM eller HH:MM:SS)',
81
+ },
82
+ INVALID_BOOLEAN: {
83
+ en: 'Must be true or false',
84
+ no: 'Må være true eller false',
85
+ },
86
+ INVALID_PATTERN: {
87
+ en: 'Value does not match the required pattern',
88
+ no: 'Verdien samsvarer ikke med påkrevd mønster',
89
+ },
90
+ INVALID_ENUM: {
91
+ en: 'Value must be one of: {values}',
92
+ no: 'Verdien må være en av: {values}',
93
+ },
94
+ ARRAY_TOO_SHORT: {
95
+ en: 'Must have at least {min} items',
96
+ no: 'Må ha minst {min} elementer',
97
+ },
98
+ ARRAY_TOO_LONG: {
99
+ en: 'Must have at most {max} items',
100
+ no: 'Må ha maks {max} elementer',
101
+ },
102
+ INVALID_ARRAY: {
103
+ en: 'Must be an array',
104
+ no: 'Må være en liste',
105
+ },
106
+ };
107
+ function formatErrorMessage(code, params = {}) {
108
+ const template = exports.errorMessages[code] || {
109
+ en: `Validation error: ${code}`,
110
+ no: `Valideringsfeil: ${code}`,
111
+ };
112
+ let en = template.en;
113
+ let no = template.no;
114
+ for (const [key, value] of Object.entries(params)) {
115
+ const placeholder = `{${key}}`;
116
+ en = en.replace(placeholder, String(value));
117
+ no = no.replace(placeholder, String(value));
118
+ }
119
+ return { en, no };
120
+ }
121
+ //# sourceMappingURL=errorMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorMessages.js","sourceRoot":"","sources":["../../../nodes/InputValidator/errorMessages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="60" height="60">
2
+ <defs>
3
+ <linearGradient id="validatorGrad" x1="0%" y1="0%" x2="0%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#2196F3;stop-opacity:1" />
5
+ <stop offset="100%" style="stop-color:#1565C0;stop-opacity:1" />
6
+ </linearGradient>
7
+ </defs>
8
+ <rect x="3" y="3" width="18" height="18" rx="2" fill="url(#validatorGrad)"/>
9
+ <path fill="#fff" d="M7 9h10v1.5H7zM7 12h7v1.5H7zM7 15h5v1.5H7z"/>
10
+ <circle cx="17" cy="15" r="3" fill="#4CAF50"/>
11
+ <path fill="#fff" d="M16.2 15.5l-.7-.7.35-.35.35.35 1.05-1.05.35.35z" transform="scale(1.5) translate(5.5, 4.5)"/>
12
+ </svg>
@@ -0,0 +1,7 @@
1
+ export declare function getNestedValue(obj: unknown, path: string): unknown;
2
+ export declare function setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void;
3
+ export declare function coerceType(value: unknown, targetType: string): {
4
+ success: boolean;
5
+ value: unknown;
6
+ };
7
+ export declare function isEmpty(value: unknown): boolean;
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getNestedValue = getNestedValue;
4
+ exports.setNestedValue = setNestedValue;
5
+ exports.coerceType = coerceType;
6
+ exports.isEmpty = isEmpty;
7
+ function getNestedValue(obj, path) {
8
+ if (!obj || typeof obj !== 'object') {
9
+ return undefined;
10
+ }
11
+ const normalizedPath = path.replace(/\[(\d+)\]/g, '.$1');
12
+ const parts = normalizedPath.split('.');
13
+ let current = obj;
14
+ for (const part of parts) {
15
+ if (current === null || current === undefined) {
16
+ return undefined;
17
+ }
18
+ if (typeof current !== 'object') {
19
+ return undefined;
20
+ }
21
+ current = current[part];
22
+ }
23
+ return current;
24
+ }
25
+ function setNestedValue(obj, path, value) {
26
+ const normalizedPath = path.replace(/\[(\d+)\]/g, '.$1');
27
+ const parts = normalizedPath.split('.');
28
+ let current = obj;
29
+ for (let i = 0; i < parts.length - 1; i++) {
30
+ const part = parts[i];
31
+ if (!(part in current)) {
32
+ const nextPart = parts[i + 1];
33
+ current[part] = /^\d+$/.test(nextPart) ? [] : {};
34
+ }
35
+ current = current[part];
36
+ }
37
+ current[parts[parts.length - 1]] = value;
38
+ }
39
+ function coerceType(value, targetType) {
40
+ if (value === null || value === undefined) {
41
+ return { success: true, value };
42
+ }
43
+ switch (targetType) {
44
+ case 'string':
45
+ return { success: true, value: String(value) };
46
+ case 'number':
47
+ case 'integer': {
48
+ if (typeof value === 'number') {
49
+ return { success: true, value };
50
+ }
51
+ if (typeof value === 'string') {
52
+ const trimmed = value.trim();
53
+ if (trimmed === '') {
54
+ return { success: false, value };
55
+ }
56
+ const num = Number(trimmed);
57
+ if (!isNaN(num)) {
58
+ return { success: true, value: num };
59
+ }
60
+ }
61
+ return { success: false, value };
62
+ }
63
+ case 'boolean': {
64
+ if (typeof value === 'boolean') {
65
+ return { success: true, value };
66
+ }
67
+ if (typeof value === 'string') {
68
+ const lower = value.toLowerCase().trim();
69
+ if (lower === 'true' || lower === '1' || lower === 'yes') {
70
+ return { success: true, value: true };
71
+ }
72
+ if (lower === 'false' || lower === '0' || lower === 'no') {
73
+ return { success: true, value: false };
74
+ }
75
+ }
76
+ if (typeof value === 'number') {
77
+ return { success: true, value: value !== 0 };
78
+ }
79
+ return { success: false, value };
80
+ }
81
+ case 'array': {
82
+ if (Array.isArray(value)) {
83
+ return { success: true, value };
84
+ }
85
+ if (typeof value === 'string') {
86
+ try {
87
+ const parsed = JSON.parse(value);
88
+ if (Array.isArray(parsed)) {
89
+ return { success: true, value: parsed };
90
+ }
91
+ }
92
+ catch {
93
+ }
94
+ }
95
+ return { success: false, value };
96
+ }
97
+ default:
98
+ return { success: true, value };
99
+ }
100
+ }
101
+ function isEmpty(value) {
102
+ if (value === null || value === undefined) {
103
+ return true;
104
+ }
105
+ if (typeof value === 'string' && value.trim() === '') {
106
+ return true;
107
+ }
108
+ if (Array.isArray(value) && value.length === 0) {
109
+ return true;
110
+ }
111
+ return false;
112
+ }
113
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../nodes/InputValidator/utils.ts"],"names":[],"mappings":"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"}