@explorins/pers-shared 2.1.154 → 2.1.156
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/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/shared-lib/dto/ai/ai-generation-log.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/ai/ai-generation-log.dto.js +2 -0
- package/dist/cjs/shared-lib/dto/ai/ai-generation-log.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/analytics/redemption-redeem-analytics-request.dto.d.ts +1 -1
- package/dist/cjs/shared-lib/dto/api-key/api-key.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/api-key/api-key.dto.js +1 -0
- package/dist/cjs/shared-lib/dto/api-key/api-key.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/business/business-membership.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/business/business-membership.dto.js +4 -2
- package/dist/cjs/shared-lib/dto/business/business-membership.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/business/business-type.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/business/business-type.dto.js +8 -0
- package/dist/cjs/shared-lib/dto/business/business-type.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/campaign/campaignUserClaim.dto.js +2 -2
- package/dist/cjs/shared-lib/dto/campaign/campaignUserClaim.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/purchase/donationType.dto.d.ts +4 -2
- package/dist/cjs/shared-lib/dto/purchase/donationType.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/purchase/donationType.dto.js +14 -6
- package/dist/cjs/shared-lib/dto/purchase/donationType.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/tenant/email-config.dto.d.ts +7 -0
- package/dist/cjs/shared-lib/dto/tenant/email-config.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/tenant/email-config.dto.js +26 -0
- package/dist/cjs/shared-lib/dto/tenant/email-config.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/tenant/tenant.dto.d.ts +0 -2
- package/dist/cjs/shared-lib/dto/tenant/tenant.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/tenant/tenant.dto.js +8 -11
- package/dist/cjs/shared-lib/dto/tenant/tenant.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/transaction/transaction.dto.js +2 -2
- package/dist/cjs/shared-lib/dto/transaction/transaction.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/wallet.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/wallet.dto.js +4 -2
- package/dist/cjs/shared-lib/dto/wallet.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/webhook/webhook.dto.js +2 -2
- package/dist/cjs/shared-lib/dto/webhook/webhook.dto.js.map +1 -1
- package/dist/cjs/shared-lib/enum/index.d.ts +1 -0
- package/dist/cjs/shared-lib/enum/index.d.ts.map +1 -1
- package/dist/cjs/shared-lib/enum/index.js +2 -0
- package/dist/cjs/shared-lib/enum/index.js.map +1 -1
- package/dist/cjs/shared-lib/errors/domains/validation-errors.d.ts +12 -1
- package/dist/cjs/shared-lib/errors/domains/validation-errors.d.ts.map +1 -1
- package/dist/cjs/shared-lib/errors/domains/validation-errors.js +25 -1
- package/dist/cjs/shared-lib/errors/domains/validation-errors.js.map +1 -1
- package/dist/cjs/shared-lib/interfaces/email-config.interface.d.ts +2 -0
- package/dist/cjs/shared-lib/interfaces/email-config.interface.d.ts.map +1 -1
- package/dist/cjs/shared-lib/types/filter-options.type.d.ts +4 -4
- package/dist/cjs/shared-lib/types/filter-options.type.d.ts.map +1 -1
- package/dist/cjs/shared-lib/types/index.d.ts +3 -0
- package/dist/cjs/shared-lib/types/index.d.ts.map +1 -1
- package/dist/cjs/shared-lib/types/index.js +3 -0
- package/dist/cjs/shared-lib/types/index.js.map +1 -1
- package/dist/cjs/shared-lib/types/unique-user-identifier-keys.d.ts +13 -0
- package/dist/cjs/shared-lib/types/unique-user-identifier-keys.d.ts.map +1 -1
- package/dist/cjs/shared-lib/types/unique-user-identifier-keys.js +22 -3
- package/dist/cjs/shared-lib/types/unique-user-identifier-keys.js.map +1 -1
- package/dist/cjs/shared-lib/types/user-fields.type.d.ts +105 -0
- package/dist/cjs/shared-lib/types/user-fields.type.d.ts.map +1 -0
- package/dist/cjs/shared-lib/types/user-fields.type.js +76 -0
- package/dist/cjs/shared-lib/types/user-fields.type.js.map +1 -0
- package/dist/cjs/shared-lib/types/uuid.type.d.ts +15 -0
- package/dist/cjs/shared-lib/types/uuid.type.d.ts.map +1 -0
- package/dist/cjs/shared-lib/types/uuid.type.js +11 -0
- package/dist/cjs/shared-lib/types/uuid.type.js.map +1 -0
- package/dist/cjs/shared-lib/validation/field-validation.d.ts +35 -0
- package/dist/cjs/shared-lib/validation/field-validation.d.ts.map +1 -0
- package/dist/cjs/shared-lib/validation/field-validation.js +238 -0
- package/dist/cjs/shared-lib/validation/field-validation.js.map +1 -0
- package/dist/cjs/shared-lib/validation/index.d.ts +4 -0
- package/dist/cjs/shared-lib/validation/index.d.ts.map +1 -0
- package/dist/cjs/shared-lib/validation/index.js +23 -0
- package/dist/cjs/shared-lib/validation/index.js.map +1 -0
- package/dist/cjs/shared-lib/validation/validation.types.d.ts +50 -0
- package/dist/cjs/shared-lib/validation/validation.types.d.ts.map +1 -0
- package/dist/cjs/shared-lib/validation/validation.types.js +19 -0
- package/dist/cjs/shared-lib/validation/validation.types.js.map +1 -0
- package/dist/cjs/shared-lib/validation/validators.d.ts +37 -0
- package/dist/cjs/shared-lib/validation/validators.d.ts.map +1 -0
- package/dist/cjs/shared-lib/validation/validators.js +69 -0
- package/dist/cjs/shared-lib/validation/validators.js.map +1 -0
- package/dist/cjs/shared-patterns/errors/error-factory.d.ts +3 -1
- package/dist/cjs/shared-patterns/errors/error-factory.d.ts.map +1 -1
- package/dist/cjs/shared-patterns/errors/error-factory.js +8 -0
- package/dist/cjs/shared-patterns/errors/error-factory.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/shared-lib/dto/ai/ai-generation-log.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/ai/ai-generation-log.dto.js +2 -0
- package/dist/esm/shared-lib/dto/ai/ai-generation-log.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/analytics/redemption-redeem-analytics-request.dto.d.ts +1 -1
- package/dist/esm/shared-lib/dto/api-key/api-key.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/api-key/api-key.dto.js +1 -0
- package/dist/esm/shared-lib/dto/api-key/api-key.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/business/business-membership.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/business/business-membership.dto.js +4 -2
- package/dist/esm/shared-lib/dto/business/business-membership.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/business/business-type.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/business/business-type.dto.js +13 -5
- package/dist/esm/shared-lib/dto/business/business-type.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/campaign/campaignUserClaim.dto.js +2 -2
- package/dist/esm/shared-lib/dto/campaign/campaignUserClaim.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/purchase/donationType.dto.d.ts +4 -2
- package/dist/esm/shared-lib/dto/purchase/donationType.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/purchase/donationType.dto.js +14 -7
- package/dist/esm/shared-lib/dto/purchase/donationType.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/tenant/email-config.dto.d.ts +7 -0
- package/dist/esm/shared-lib/dto/tenant/email-config.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/tenant/email-config.dto.js +24 -0
- package/dist/esm/shared-lib/dto/tenant/email-config.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/tenant/tenant.dto.d.ts +0 -2
- package/dist/esm/shared-lib/dto/tenant/tenant.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/tenant/tenant.dto.js +8 -10
- package/dist/esm/shared-lib/dto/tenant/tenant.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/transaction/transaction.dto.js +2 -2
- package/dist/esm/shared-lib/dto/transaction/transaction.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/wallet.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/wallet.dto.js +4 -2
- package/dist/esm/shared-lib/dto/wallet.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/webhook/webhook.dto.js +2 -2
- package/dist/esm/shared-lib/dto/webhook/webhook.dto.js.map +1 -1
- package/dist/esm/shared-lib/enum/index.d.ts +1 -0
- package/dist/esm/shared-lib/enum/index.d.ts.map +1 -1
- package/dist/esm/shared-lib/enum/index.js +2 -0
- package/dist/esm/shared-lib/enum/index.js.map +1 -1
- package/dist/esm/shared-lib/errors/domains/validation-errors.d.ts +12 -1
- package/dist/esm/shared-lib/errors/domains/validation-errors.d.ts.map +1 -1
- package/dist/esm/shared-lib/errors/domains/validation-errors.js +24 -1
- package/dist/esm/shared-lib/errors/domains/validation-errors.js.map +1 -1
- package/dist/esm/shared-lib/interfaces/email-config.interface.d.ts +2 -0
- package/dist/esm/shared-lib/interfaces/email-config.interface.d.ts.map +1 -1
- package/dist/esm/shared-lib/types/filter-options.type.d.ts +4 -4
- package/dist/esm/shared-lib/types/filter-options.type.d.ts.map +1 -1
- package/dist/esm/shared-lib/types/index.d.ts +3 -0
- package/dist/esm/shared-lib/types/index.d.ts.map +1 -1
- package/dist/esm/shared-lib/types/index.js +3 -0
- package/dist/esm/shared-lib/types/index.js.map +1 -1
- package/dist/esm/shared-lib/types/unique-user-identifier-keys.d.ts +13 -0
- package/dist/esm/shared-lib/types/unique-user-identifier-keys.d.ts.map +1 -1
- package/dist/esm/shared-lib/types/unique-user-identifier-keys.js +21 -2
- package/dist/esm/shared-lib/types/unique-user-identifier-keys.js.map +1 -1
- package/dist/esm/shared-lib/types/user-fields.type.d.ts +105 -0
- package/dist/esm/shared-lib/types/user-fields.type.d.ts.map +1 -0
- package/dist/esm/shared-lib/types/user-fields.type.js +67 -0
- package/dist/esm/shared-lib/types/user-fields.type.js.map +1 -0
- package/dist/esm/shared-lib/types/uuid.type.d.ts +15 -0
- package/dist/esm/shared-lib/types/uuid.type.d.ts.map +1 -0
- package/dist/esm/shared-lib/types/uuid.type.js +7 -0
- package/dist/esm/shared-lib/types/uuid.type.js.map +1 -0
- package/dist/esm/shared-lib/validation/field-validation.d.ts +35 -0
- package/dist/esm/shared-lib/validation/field-validation.d.ts.map +1 -0
- package/dist/esm/shared-lib/validation/field-validation.js +219 -0
- package/dist/esm/shared-lib/validation/field-validation.js.map +1 -0
- package/dist/esm/shared-lib/validation/index.d.ts +4 -0
- package/dist/esm/shared-lib/validation/index.d.ts.map +1 -0
- package/dist/esm/shared-lib/validation/index.js +7 -0
- package/dist/esm/shared-lib/validation/index.js.map +1 -0
- package/dist/esm/shared-lib/validation/validation.types.d.ts +50 -0
- package/dist/esm/shared-lib/validation/validation.types.d.ts.map +1 -0
- package/dist/esm/shared-lib/validation/validation.types.js +16 -0
- package/dist/esm/shared-lib/validation/validation.types.js.map +1 -0
- package/dist/esm/shared-lib/validation/validators.d.ts +37 -0
- package/dist/esm/shared-lib/validation/validators.d.ts.map +1 -0
- package/dist/esm/shared-lib/validation/validators.js +61 -0
- package/dist/esm/shared-lib/validation/validators.js.map +1 -0
- package/dist/esm/shared-patterns/errors/error-factory.d.ts +3 -1
- package/dist/esm/shared-patterns/errors/error-factory.d.ts.map +1 -1
- package/dist/esm/shared-patterns/errors/error-factory.js +9 -1
- package/dist/esm/shared-patterns/errors/error-factory.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/shared-lib/enum/lambda.enum.d.ts +0 -25
- package/dist/cjs/shared-lib/enum/lambda.enum.d.ts.map +0 -1
- package/dist/cjs/shared-lib/enum/lambda.enum.js +0 -31
- package/dist/cjs/shared-lib/enum/lambda.enum.js.map +0 -1
- package/dist/esm/shared-lib/enum/lambda.enum.d.ts +0 -25
- package/dist/esm/shared-lib/enum/lambda.enum.d.ts.map +0 -1
- package/dist/esm/shared-lib/enum/lambda.enum.js +0 -28
- package/dist/esm/shared-lib/enum/lambda.enum.js.map +0 -1
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateAllFields = exports.validateFieldComparisons = exports.validateFieldValue = exports.getOperatorText = exports.compareValues = exports.UUID_REGEX = exports.WALLET_ADDRESS_REGEX = exports.URL_REGEX = exports.EMAIL_MAX_LENGTH = exports.EMAIL_REGEX = exports.isValidUuid = exports.isValidNonEmptyString = exports.isValidWalletAddress = exports.isValidUrl = exports.isValidEmail = exports.operatorText = void 0;
|
|
4
|
+
const validation_types_1 = require("./validation.types");
|
|
5
|
+
const validators_1 = require("./validators");
|
|
6
|
+
var validation_types_2 = require("./validation.types");
|
|
7
|
+
Object.defineProperty(exports, "operatorText", { enumerable: true, get: function () { return validation_types_2.operatorText; } });
|
|
8
|
+
// Re-export standalone validators
|
|
9
|
+
var validators_2 = require("./validators");
|
|
10
|
+
Object.defineProperty(exports, "isValidEmail", { enumerable: true, get: function () { return validators_2.isValidEmail; } });
|
|
11
|
+
Object.defineProperty(exports, "isValidUrl", { enumerable: true, get: function () { return validators_2.isValidUrl; } });
|
|
12
|
+
Object.defineProperty(exports, "isValidWalletAddress", { enumerable: true, get: function () { return validators_2.isValidWalletAddress; } });
|
|
13
|
+
Object.defineProperty(exports, "isValidNonEmptyString", { enumerable: true, get: function () { return validators_2.isValidNonEmptyString; } });
|
|
14
|
+
Object.defineProperty(exports, "isValidUuid", { enumerable: true, get: function () { return validators_2.isValidUuid; } });
|
|
15
|
+
Object.defineProperty(exports, "EMAIL_REGEX", { enumerable: true, get: function () { return validators_2.EMAIL_REGEX; } });
|
|
16
|
+
Object.defineProperty(exports, "EMAIL_MAX_LENGTH", { enumerable: true, get: function () { return validators_2.EMAIL_MAX_LENGTH; } });
|
|
17
|
+
Object.defineProperty(exports, "URL_REGEX", { enumerable: true, get: function () { return validators_2.URL_REGEX; } });
|
|
18
|
+
Object.defineProperty(exports, "WALLET_ADDRESS_REGEX", { enumerable: true, get: function () { return validators_2.WALLET_ADDRESS_REGEX; } });
|
|
19
|
+
Object.defineProperty(exports, "UUID_REGEX", { enumerable: true, get: function () { return validators_2.UUID_REGEX; } });
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Comparison Functions
|
|
22
|
+
// ============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Compare two values using the specified operator.
|
|
25
|
+
* Works with numbers, dates, and strings.
|
|
26
|
+
*/
|
|
27
|
+
const compareValues = (a, b, op) => {
|
|
28
|
+
switch (op) {
|
|
29
|
+
case '<': return a < b;
|
|
30
|
+
case '<=': return a <= b;
|
|
31
|
+
case '>': return a > b;
|
|
32
|
+
case '>=': return a >= b;
|
|
33
|
+
case '==': return a === b;
|
|
34
|
+
case '!=': return a !== b;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
exports.compareValues = compareValues;
|
|
38
|
+
/** Get human-readable operator text for error messages. */
|
|
39
|
+
const getOperatorText = (op) => validation_types_1.operatorText[op];
|
|
40
|
+
exports.getOperatorText = getOperatorText;
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// Single Field Validation
|
|
43
|
+
// ============================================================================
|
|
44
|
+
/**
|
|
45
|
+
* Validate a single field value against validation rules.
|
|
46
|
+
* Does not check cross-field comparisons (use validateFieldComparisons for that).
|
|
47
|
+
*/
|
|
48
|
+
const validateFieldValue = (value, rules, fieldType) => {
|
|
49
|
+
// No rules = valid
|
|
50
|
+
if (!rules) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const stringValue = value !== null && value !== undefined ? String(value) : '';
|
|
54
|
+
const isEmpty = value === null || value === undefined || value === '';
|
|
55
|
+
// Required check
|
|
56
|
+
if (rules.required && isEmpty) {
|
|
57
|
+
return { field: '', message: 'This field is required', code: 'required' };
|
|
58
|
+
}
|
|
59
|
+
// If empty and not required, skip other validations
|
|
60
|
+
if (isEmpty) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
// Type-specific validation
|
|
64
|
+
switch (fieldType) {
|
|
65
|
+
case 'text':
|
|
66
|
+
if (rules.minLength && stringValue.length < rules.minLength) {
|
|
67
|
+
return { field: '', message: `Minimum ${rules.minLength} characters required`, code: 'minLength' };
|
|
68
|
+
}
|
|
69
|
+
if (rules.maxLength && stringValue.length > rules.maxLength) {
|
|
70
|
+
return { field: '', message: `Maximum ${rules.maxLength} characters allowed`, code: 'maxLength' };
|
|
71
|
+
}
|
|
72
|
+
if (rules.pattern && !new RegExp(rules.pattern).test(stringValue)) {
|
|
73
|
+
return { field: '', message: rules.patternMessage || 'Invalid format', code: 'pattern' };
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
case 'email':
|
|
77
|
+
if (stringValue.length > validators_1.EMAIL_MAX_LENGTH || !validators_1.EMAIL_REGEX.test(stringValue)) {
|
|
78
|
+
return { field: '', message: 'Invalid email format', code: 'email' };
|
|
79
|
+
}
|
|
80
|
+
if (rules.maxLength && stringValue.length > rules.maxLength) {
|
|
81
|
+
return { field: '', message: `Maximum ${rules.maxLength} characters allowed`, code: 'maxLength' };
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
case 'url':
|
|
85
|
+
if (!validators_1.URL_REGEX.test(stringValue)) {
|
|
86
|
+
return { field: '', message: 'Invalid URL format', code: 'url' };
|
|
87
|
+
}
|
|
88
|
+
if (rules.maxLength && stringValue.length > rules.maxLength) {
|
|
89
|
+
return { field: '', message: `Maximum ${rules.maxLength} characters allowed`, code: 'maxLength' };
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
case 'number':
|
|
93
|
+
const numValue = typeof value === 'number' ? value : parseFloat(stringValue);
|
|
94
|
+
if (isNaN(numValue)) {
|
|
95
|
+
return { field: '', message: 'Must be a valid number', code: 'type' };
|
|
96
|
+
}
|
|
97
|
+
if (rules.min !== undefined && numValue < rules.min) {
|
|
98
|
+
return { field: '', message: `Minimum value is ${rules.min}`, code: 'min' };
|
|
99
|
+
}
|
|
100
|
+
if (rules.max !== undefined && numValue > rules.max) {
|
|
101
|
+
return { field: '', message: `Maximum value is ${rules.max}`, code: 'max' };
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
case 'boolean':
|
|
105
|
+
if (typeof value !== 'boolean' && stringValue !== 'true' && stringValue !== 'false') {
|
|
106
|
+
return { field: '', message: 'Must be true or false', code: 'type' };
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
case 'date':
|
|
110
|
+
const dateValue = new Date(stringValue);
|
|
111
|
+
if (isNaN(dateValue.getTime())) {
|
|
112
|
+
return { field: '', message: 'Must be a valid date', code: 'type' };
|
|
113
|
+
}
|
|
114
|
+
const now = new Date();
|
|
115
|
+
if (rules.minDate) {
|
|
116
|
+
const minDate = rules.minDate === 'now' ? now : new Date(rules.minDate);
|
|
117
|
+
if (dateValue < minDate) {
|
|
118
|
+
return {
|
|
119
|
+
field: '',
|
|
120
|
+
message: rules.minDate === 'now' ? 'Date must be in the future' : `Date must be after ${rules.minDate}`,
|
|
121
|
+
code: 'minDate'
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (rules.maxDate) {
|
|
126
|
+
const maxDate = rules.maxDate === 'now' ? now : new Date(rules.maxDate);
|
|
127
|
+
if (dateValue > maxDate) {
|
|
128
|
+
return {
|
|
129
|
+
field: '',
|
|
130
|
+
message: rules.maxDate === 'now' ? 'Date must be in the past' : `Date must be before ${rules.maxDate}`,
|
|
131
|
+
code: 'maxDate'
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
return null;
|
|
138
|
+
};
|
|
139
|
+
exports.validateFieldValue = validateFieldValue;
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// Cross-Field / Literal Comparison Validation
|
|
142
|
+
// ============================================================================
|
|
143
|
+
/** Type guard for field comparison */
|
|
144
|
+
const isFieldComparison = (c) => 'field' in c && c.field !== undefined;
|
|
145
|
+
/**
|
|
146
|
+
* Validate comparison rules for a single field.
|
|
147
|
+
* Supports comparing to another field OR a literal value.
|
|
148
|
+
*/
|
|
149
|
+
const validateFieldComparisons = (fieldKey, value, comparisons, allData, fieldType) => {
|
|
150
|
+
if (!comparisons || comparisons.length === 0)
|
|
151
|
+
return [];
|
|
152
|
+
const errors = [];
|
|
153
|
+
for (const comparison of comparisons) {
|
|
154
|
+
// Skip if this field's value is empty
|
|
155
|
+
if (value === null || value === undefined || value === '')
|
|
156
|
+
continue;
|
|
157
|
+
// Get the comparison target (field value or literal)
|
|
158
|
+
const isField = isFieldComparison(comparison);
|
|
159
|
+
const targetValue = isField ? allData[comparison.field] : comparison.value;
|
|
160
|
+
const targetLabel = isField ? comparison.field : String(comparison.value);
|
|
161
|
+
// Skip if comparing to field and that field is empty
|
|
162
|
+
if (isField && (targetValue === null || targetValue === undefined || targetValue === ''))
|
|
163
|
+
continue;
|
|
164
|
+
let isValid = true;
|
|
165
|
+
const { operator, message } = comparison;
|
|
166
|
+
switch (fieldType) {
|
|
167
|
+
case 'date': {
|
|
168
|
+
const thisDate = new Date(String(value));
|
|
169
|
+
const otherDate = new Date(String(targetValue));
|
|
170
|
+
if (isNaN(thisDate.getTime()) || isNaN(otherDate.getTime()))
|
|
171
|
+
continue;
|
|
172
|
+
isValid = (0, exports.compareValues)(thisDate.getTime(), otherDate.getTime(), operator);
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
case 'number': {
|
|
176
|
+
const thisNum = typeof value === 'number' ? value : parseFloat(String(value));
|
|
177
|
+
const otherNum = typeof targetValue === 'number' ? targetValue : parseFloat(String(targetValue));
|
|
178
|
+
if (isNaN(thisNum) || isNaN(otherNum))
|
|
179
|
+
continue;
|
|
180
|
+
isValid = (0, exports.compareValues)(thisNum, otherNum, operator);
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
case 'boolean': {
|
|
184
|
+
const thisBool = typeof value === 'boolean' ? value : value === 'true';
|
|
185
|
+
const otherBool = typeof targetValue === 'boolean' ? targetValue : targetValue === 'true';
|
|
186
|
+
isValid = operator === '==' ? thisBool === otherBool :
|
|
187
|
+
operator === '!=' ? thisBool !== otherBool : true;
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
default: {
|
|
191
|
+
isValid = (0, exports.compareValues)(String(value), String(targetValue), operator);
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (!isValid) {
|
|
196
|
+
errors.push({
|
|
197
|
+
field: fieldKey,
|
|
198
|
+
message: message || `Must be ${(0, exports.getOperatorText)(operator)} ${targetLabel}`,
|
|
199
|
+
code: `comparison:${operator}:${targetLabel}`,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return errors;
|
|
204
|
+
};
|
|
205
|
+
exports.validateFieldComparisons = validateFieldComparisons;
|
|
206
|
+
// ============================================================================
|
|
207
|
+
// Full Data Validation
|
|
208
|
+
// ============================================================================
|
|
209
|
+
/**
|
|
210
|
+
* Validate all fields in a data object against their definitions.
|
|
211
|
+
* Runs both single-field and comparison validations.
|
|
212
|
+
*
|
|
213
|
+
* @param data - The data object to validate
|
|
214
|
+
* @param definitions - Field definitions with validation rules
|
|
215
|
+
* @returns Array of all validation errors
|
|
216
|
+
*/
|
|
217
|
+
const validateAllFields = (data, definitions) => {
|
|
218
|
+
const errors = [];
|
|
219
|
+
const definitionMap = new Map(definitions.map(d => [d.key, d]));
|
|
220
|
+
for (const [key, value] of Object.entries(data)) {
|
|
221
|
+
const def = definitionMap.get(key);
|
|
222
|
+
if (!def)
|
|
223
|
+
continue;
|
|
224
|
+
// Single-field validation
|
|
225
|
+
const error = (0, exports.validateFieldValue)(value, def.validation, def.fieldType);
|
|
226
|
+
if (error) {
|
|
227
|
+
errors.push({ ...error, field: key });
|
|
228
|
+
}
|
|
229
|
+
// Comparison validation
|
|
230
|
+
if (def.validation?.comparisons) {
|
|
231
|
+
const comparisonErrors = (0, exports.validateFieldComparisons)(key, value, def.validation.comparisons, data, def.fieldType);
|
|
232
|
+
errors.push(...comparisonErrors);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return errors;
|
|
236
|
+
};
|
|
237
|
+
exports.validateAllFields = validateAllFields;
|
|
238
|
+
//# sourceMappingURL=field-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-validation.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/field-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAC;AAGnC,cAAc,cAAc,CAAC;AAG7B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
// Types
|
|
18
|
+
__exportStar(require("./validation.types"), exports);
|
|
19
|
+
// Standalone validators
|
|
20
|
+
__exportStar(require("./validators"), exports);
|
|
21
|
+
// Field validation functions (also re-exports types and validators)
|
|
22
|
+
__exportStar(require("./field-validation"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,QAAQ;AACR,qDAAmC;AAEnC,wBAAwB;AACxB,+CAA6B;AAE7B,oEAAoE;AACpE,qDAAmC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Types
|
|
3
|
+
* Shared type definitions for field validation.
|
|
4
|
+
*/
|
|
5
|
+
export type ComparisonOperator = '<' | '<=' | '>' | '>=' | '==' | '!=';
|
|
6
|
+
/**
|
|
7
|
+
* Compare to another field by key.
|
|
8
|
+
* Example: { field: 'checkOutDate', operator: '<' } // thisField < checkOutDate
|
|
9
|
+
*/
|
|
10
|
+
export interface FieldComparisonToField {
|
|
11
|
+
field: string;
|
|
12
|
+
operator: ComparisonOperator;
|
|
13
|
+
message?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Compare to a literal value.
|
|
17
|
+
* Example: { value: 18, operator: '>=' } // thisField >= 18
|
|
18
|
+
*/
|
|
19
|
+
export interface FieldComparisonToValue {
|
|
20
|
+
value: number | boolean | string;
|
|
21
|
+
operator: ComparisonOperator;
|
|
22
|
+
message?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Discriminated union - compare to field OR value, never both */
|
|
25
|
+
export type FieldComparison = FieldComparisonToField | FieldComparisonToValue;
|
|
26
|
+
export interface FieldValidationRules {
|
|
27
|
+
required?: boolean;
|
|
28
|
+
minLength?: number;
|
|
29
|
+
maxLength?: number;
|
|
30
|
+
min?: number;
|
|
31
|
+
max?: number;
|
|
32
|
+
pattern?: string;
|
|
33
|
+
patternMessage?: string;
|
|
34
|
+
/** Minimum date - supports 'now' for dynamic current date comparison */
|
|
35
|
+
minDate?: string;
|
|
36
|
+
/** Maximum date - supports 'now' for dynamic current date comparison */
|
|
37
|
+
maxDate?: string;
|
|
38
|
+
/** Cross-field / literal comparison rules */
|
|
39
|
+
comparisons?: FieldComparison[];
|
|
40
|
+
}
|
|
41
|
+
export type FieldType = 'text' | 'number' | 'date' | 'select' | 'boolean' | 'url' | 'email';
|
|
42
|
+
export type { ValidationErrorDetail } from '../errors/base/error-classification-enums';
|
|
43
|
+
export interface FieldDefinition {
|
|
44
|
+
key: string;
|
|
45
|
+
fieldType: FieldType;
|
|
46
|
+
label: string;
|
|
47
|
+
validation?: FieldValidationRules | null;
|
|
48
|
+
}
|
|
49
|
+
export declare const operatorText: Record<ComparisonOperator, string>;
|
|
50
|
+
//# sourceMappingURL=validation.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.types.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/validation.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,MAAM,kBAAkB,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvE;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACjC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,kEAAkE;AAClE,MAAM,MAAM,eAAe,GAAG,sBAAsB,GAAG,sBAAsB,CAAC;AAM9E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,OAAO,CAAC;AAM5F,YAAY,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAEvF,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC1C;AAMD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAO3D,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Validation Types
|
|
4
|
+
* Shared type definitions for field validation.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.operatorText = void 0;
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Operator Text Mapping
|
|
10
|
+
// ============================================================================
|
|
11
|
+
exports.operatorText = {
|
|
12
|
+
'<': 'less than',
|
|
13
|
+
'<=': 'less than or equal to',
|
|
14
|
+
'>': 'greater than',
|
|
15
|
+
'>=': 'greater than or equal to',
|
|
16
|
+
'==': 'equal to',
|
|
17
|
+
'!=': 'not equal to',
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=validation.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.types.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/validation.types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAkEH,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAElE,QAAA,YAAY,GAAuC;IAC9D,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,uBAAuB;IAC7B,GAAG,EAAE,cAAc;IACnB,IAAI,EAAE,0BAA0B;IAChC,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,cAAc;CACrB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone Validators
|
|
3
|
+
* Pure validation functions that can be used independently.
|
|
4
|
+
* Shared between backend and frontend.
|
|
5
|
+
*/
|
|
6
|
+
/** RFC-compliant email regex */
|
|
7
|
+
export declare const EMAIL_REGEX: RegExp;
|
|
8
|
+
export declare const EMAIL_MAX_LENGTH = 254;
|
|
9
|
+
/** Basic URL pattern - http(s) with domain */
|
|
10
|
+
export declare const URL_REGEX: RegExp;
|
|
11
|
+
/** Ethereum address format: 0x followed by 40 hexadecimal characters */
|
|
12
|
+
export declare const WALLET_ADDRESS_REGEX: RegExp;
|
|
13
|
+
/** UUID v4 format */
|
|
14
|
+
export declare const UUID_REGEX: RegExp;
|
|
15
|
+
/**
|
|
16
|
+
* Validates email format according to RFC standards.
|
|
17
|
+
* RFC 5321 length limit (254 characters) enforced.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isValidEmail(email: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Validates URL format (http/https only).
|
|
22
|
+
*/
|
|
23
|
+
export declare function isValidUrl(url: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Validates Ethereum wallet address format.
|
|
26
|
+
* Format: 0x followed by 40 hexadecimal characters.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isValidWalletAddress(address: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Validates that a string is not empty and meets minimum length.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isValidNonEmptyString(value: string, minLength?: number): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Validates UUID v4 format.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isValidUuid(uuid: string): boolean;
|
|
37
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,gCAAgC;AAChC,eAAO,MAAM,WAAW,QAA+B,CAAC;AACxD,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,8CAA8C;AAC9C,eAAO,MAAM,SAAS,QAAoC,CAAC;AAE3D,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,QAAwB,CAAC;AAE1D,qBAAqB;AACrB,eAAO,MAAM,UAAU,QAA2E,CAAC;AAMnG;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG/C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,OAAO,CAEnF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Standalone Validators
|
|
4
|
+
* Pure validation functions that can be used independently.
|
|
5
|
+
* Shared between backend and frontend.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.UUID_REGEX = exports.WALLET_ADDRESS_REGEX = exports.URL_REGEX = exports.EMAIL_MAX_LENGTH = exports.EMAIL_REGEX = void 0;
|
|
9
|
+
exports.isValidEmail = isValidEmail;
|
|
10
|
+
exports.isValidUrl = isValidUrl;
|
|
11
|
+
exports.isValidWalletAddress = isValidWalletAddress;
|
|
12
|
+
exports.isValidNonEmptyString = isValidNonEmptyString;
|
|
13
|
+
exports.isValidUuid = isValidUuid;
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Regex Patterns
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/** RFC-compliant email regex */
|
|
18
|
+
exports.EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
19
|
+
exports.EMAIL_MAX_LENGTH = 254; // RFC 5321
|
|
20
|
+
/** Basic URL pattern - http(s) with domain */
|
|
21
|
+
exports.URL_REGEX = /^https?:\/\/[^\s/$.?#].[^\s]*$/i;
|
|
22
|
+
/** Ethereum address format: 0x followed by 40 hexadecimal characters */
|
|
23
|
+
exports.WALLET_ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/;
|
|
24
|
+
/** UUID v4 format */
|
|
25
|
+
exports.UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Validators
|
|
28
|
+
// ============================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Validates email format according to RFC standards.
|
|
31
|
+
* RFC 5321 length limit (254 characters) enforced.
|
|
32
|
+
*/
|
|
33
|
+
function isValidEmail(email) {
|
|
34
|
+
if (!email || email.length > exports.EMAIL_MAX_LENGTH)
|
|
35
|
+
return false;
|
|
36
|
+
return exports.EMAIL_REGEX.test(email);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validates URL format (http/https only).
|
|
40
|
+
*/
|
|
41
|
+
function isValidUrl(url) {
|
|
42
|
+
if (!url)
|
|
43
|
+
return false;
|
|
44
|
+
return exports.URL_REGEX.test(url);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Validates Ethereum wallet address format.
|
|
48
|
+
* Format: 0x followed by 40 hexadecimal characters.
|
|
49
|
+
*/
|
|
50
|
+
function isValidWalletAddress(address) {
|
|
51
|
+
if (!address)
|
|
52
|
+
return false;
|
|
53
|
+
return exports.WALLET_ADDRESS_REGEX.test(address);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Validates that a string is not empty and meets minimum length.
|
|
57
|
+
*/
|
|
58
|
+
function isValidNonEmptyString(value, minLength = 1) {
|
|
59
|
+
return typeof value === 'string' && value.trim().length >= minLength;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validates UUID v4 format.
|
|
63
|
+
*/
|
|
64
|
+
function isValidUuid(uuid) {
|
|
65
|
+
if (!uuid)
|
|
66
|
+
return false;
|
|
67
|
+
return exports.UUID_REGEX.test(uuid);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/validators.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AA2BH,oCAGC;AAKD,gCAGC;AAMD,oDAGC;AAKD,sDAEC;AAKD,kCAGC;AA5DD,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,gCAAgC;AACnB,QAAA,WAAW,GAAG,4BAA4B,CAAC;AAC3C,QAAA,gBAAgB,GAAG,GAAG,CAAC,CAAC,WAAW;AAEhD,8CAA8C;AACjC,QAAA,SAAS,GAAG,iCAAiC,CAAC;AAE3D,wEAAwE;AAC3D,QAAA,oBAAoB,GAAG,qBAAqB,CAAC;AAE1D,qBAAqB;AACR,QAAA,UAAU,GAAG,wEAAwE,CAAC;AAEnG,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;GAGG;AACH,SAAgB,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,wBAAgB;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,mBAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,OAAO,iBAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,OAAe;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,4BAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,KAAa,EAAE,YAAoB,CAAC;IACxE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,SAAS,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,kBAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -4,7 +4,7 @@ import { TokenNotFoundError, TokenNotActiveError, TokenIdRequiredError, TokenTyp
|
|
|
4
4
|
import { TransactionNotFoundError, TransactionAlreadyCompletedError, TransactionNotPendingError, TransactionValidationError, UnexpectedValidationScenarioError, TransactionExpiredError } from '../../shared-lib/errors/domains/transaction-errors';
|
|
5
5
|
import { AuthenticationRequiredError, InvalidTokenError, TokenExpiredError, TokenRevokedException, RefreshTokenExpiredError, RefreshTokenRevokedError, AuthorizationFailedError, MultipleContextSelectionRequiredError, AdminTenantRequiredError } from '../../shared-lib/errors/domains/authentication-errors';
|
|
6
6
|
import { InsufficientBalanceError } from '../../shared-lib/errors/domains/balance-errors';
|
|
7
|
-
import { InvalidInputError, RequiredFieldError, InvalidFormatError } from '../../shared-lib/errors/domains/validation-errors';
|
|
7
|
+
import { InvalidInputError, RequiredFieldError, InvalidFormatError, FieldValidationFailedError } from '../../shared-lib/errors/domains/validation-errors';
|
|
8
8
|
import { SystemError, ExternalServiceError, ConfigurationMissingError } from '../../shared-lib/errors/domains/system-errors';
|
|
9
9
|
import { TriggerSourceNotFoundError } from '../../shared-lib/errors/domains/trigger-source-errors';
|
|
10
10
|
import { WebhookNotFoundError, WebhookInactiveError, WebhookSourceNotAllowedError, WebhookSignatureInvalidError, WebhookForwardFailedError, WebhookTimeoutError, WebhookValidationError, WebhookBlockedError, WebhookMethodNotAllowedError, WebhookExecutionNotFoundError, WebhookCallbackRejectedError } from '../../shared-lib/errors/domains/webhook-errors';
|
|
@@ -12,6 +12,7 @@ import { SigningAccountValidationError, SigningAccountNotFoundError, SigningAcco
|
|
|
12
12
|
import { WalletNotFoundError, WalletMissingSigningError, SmartWalletProcessingError } from '../../shared-lib/errors/domains/wallet-errors';
|
|
13
13
|
import { TenantNotFoundError } from '../../shared-lib/errors/domains/tenant-errors';
|
|
14
14
|
import { CampaignUserInfoRequiredError, CampaignBusinessRequiredError, CampaignConditionNotMetError, CampaignAlreadyClaimedError, CampaignNoTriggerError, CampaignLocationRequiredError, CampaignDistanceExceededError, CampaignNotActiveError, CampaignEndedError, CampaignNotStartedError, CampaignClaimLimitReachedError, CampaignCooldownActiveError, CampaignDailyLimitReachedError, CampaignGlobalLimitReachedError, CampaignGlobalDailyLimitReachedError, TriggerNotFoundError, ResourceAlreadyExistsError, ResourceInUseError } from '../../shared-lib/errors/domains/campaign-errors';
|
|
15
|
+
import type { ValidationErrorDetail } from '../../shared-lib/errors/base/error-classification-enums';
|
|
15
16
|
/**
|
|
16
17
|
* Convenient shortcut object for the most commonly used error patterns
|
|
17
18
|
* Provides clean, discoverable API for NestJS applications
|
|
@@ -61,6 +62,7 @@ export declare const Errors: {
|
|
|
61
62
|
invalidInput: (field: string, reason?: string) => InvalidInputError;
|
|
62
63
|
requiredField: (field: string) => RequiredFieldError;
|
|
63
64
|
invalidFormat: (field: string, format: string) => InvalidFormatError;
|
|
65
|
+
fieldValidation: (target: string, violations: ValidationErrorDetail[]) => FieldValidationFailedError;
|
|
64
66
|
insufficientBalance: (required: string, available: string) => InsufficientBalanceError;
|
|
65
67
|
systemError: (operation: string, details: string) => SystemError;
|
|
66
68
|
externalServiceError: (service: string, operation: string) => ExternalServiceError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-factory.d.ts","sourceRoot":"","sources":["../../../../src/shared-patterns/errors/error-factory.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,4BAA4B,EAC5B,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,2BAA2B,EAC3B,gCAAgC,EAChC,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,iBAAiB,EAClB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,2BAA2B,EAC5B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,wBAAwB,EACxB,gCAAgC,EAChC,0BAA0B,EAC1B,0BAA0B,EAC1B,iCAAiC,EACjC,uBAAuB,EACxB,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EACL,2BAA2B,EAC3B,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,qCAAqC,EACrC,wBAAwB,EACzB,MAAM,uDAAuD,CAAC;AAC/D,OAAO,EACL,wBAAwB,EACzB,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"error-factory.d.ts","sourceRoot":"","sources":["../../../../src/shared-patterns/errors/error-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -192,6 +192,13 @@ class ErrorFactory {
|
|
|
192
192
|
static invalidFormat(field, expectedFormat) {
|
|
193
193
|
return new validation_errors_1.InvalidFormatError(field, expectedFormat);
|
|
194
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Field validation with multiple violations.
|
|
197
|
+
* Use when validateAllFields() returns errors to throw as structured error.
|
|
198
|
+
*/
|
|
199
|
+
static fieldValidation(target, violations) {
|
|
200
|
+
return new validation_errors_1.FieldValidationFailedError(target, violations);
|
|
201
|
+
}
|
|
195
202
|
/**
|
|
196
203
|
* Financial/Balance patterns
|
|
197
204
|
*/
|
|
@@ -392,6 +399,7 @@ exports.Errors = {
|
|
|
392
399
|
invalidInput: (field, reason) => ErrorFactory.invalidInput(field, reason),
|
|
393
400
|
requiredField: (field) => ErrorFactory.requiredField(field),
|
|
394
401
|
invalidFormat: (field, format) => ErrorFactory.invalidFormat(field, format),
|
|
402
|
+
fieldValidation: (target, violations) => ErrorFactory.fieldValidation(target, violations),
|
|
395
403
|
// Financial
|
|
396
404
|
insufficientBalance: (required, available) => ErrorFactory.insufficientBalance(required, available),
|
|
397
405
|
// Technical
|