@explorins/pers-shared 2.1.154 → 2.1.155
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/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 +54 -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/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/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 +54 -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/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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unique-user-identifier-keys.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/unique-user-identifier-keys.ts"],"names":[],"mappings":"AACA,UAAU,oBAAoB;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;
|
|
1
|
+
{"version":3,"file":"unique-user-identifier-keys.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/unique-user-identifier-keys.ts"],"names":[],"mappings":"AACA,UAAU,oBAAoB;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED;;;GAGG;AACH,QAAA,MAAM,oBAAoB,+HAShB,CAAC;AAEX,gDAAgD;AAChD,MAAM,MAAM,cAAc,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAEjE,8CAA8C;AAC9C,eAAO,MAAM,eAAe,EAAE,cAAc,EAA8B,CAAC;AAE3E;;;GAGG;AACH,QAAA,MAAM,6BAA6B,iFAMW,CAAC;AAG/C,MAAM,MAAM,uBAAuB,GAAG,OAAO,6BAA6B,CAAC,MAAM,CAAC,CAAC;AACnF,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG;IAClF,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,OAAO,wBAAwB,GAAG,MAAM,CAAC;CACpD,CAAC;AACF,MAAM,MAAM,0BAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,GAAG;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAGH,eAAO,MAAM,wBAAwB,EAAE,uBAAuB,EAAuC,CAAC;AA0BtG;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GACjC,KAAK,MAAM,EACX,QAAQ,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,KACxC,IAQF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,eAAe,GAAG,KAAG;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAiBvG,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,KAAK,GAAG,KAAG,GAAG,IAAI,oBAIxD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,GAAI,QAAQ;IACjD,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,OAAO,wBAAwB,GAAG,MAAM,GAAG,IAAI,CAAC;CAE5D,KAAG,oBA6BH,CAAC"}
|
|
@@ -1,10 +1,29 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Base array of all string-valued user model property keys.
|
|
3
|
+
* Single source of truth for user field names across the codebase.
|
|
4
|
+
*/
|
|
5
|
+
const userModelFieldsArray = [
|
|
6
|
+
'id',
|
|
7
|
+
'email',
|
|
8
|
+
'identifierEmail',
|
|
9
|
+
'firstName',
|
|
10
|
+
'lastName',
|
|
11
|
+
'externalId',
|
|
12
|
+
'instagramAccountId',
|
|
13
|
+
'googleAccountName',
|
|
14
|
+
];
|
|
15
|
+
/** Iterable array of all user model fields */
|
|
16
|
+
export const userModelFields = [...userModelFieldsArray];
|
|
17
|
+
/**
|
|
18
|
+
* Fields that can be used to uniquely identify/lookup a user.
|
|
19
|
+
* Used for wildcard search, user lookup queries.
|
|
20
|
+
*/
|
|
2
21
|
const uniqueUserIdentifierKeysArray = [
|
|
3
22
|
'id',
|
|
4
23
|
'email',
|
|
5
24
|
'identifierEmail',
|
|
6
25
|
'instagramAccountId',
|
|
7
|
-
'externalId',
|
|
26
|
+
'externalId',
|
|
8
27
|
];
|
|
9
28
|
// Export the array
|
|
10
29
|
export const uniqueUserIdentifierKeys = [...uniqueUserIdentifierKeysArray];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unique-user-identifier-keys.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/unique-user-identifier-keys.ts"],"names":[],"mappings":"AAOA,
|
|
1
|
+
{"version":3,"file":"unique-user-identifier-keys.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/unique-user-identifier-keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { UserModelField, userModelFields } from './unique-user-identifier-keys';
|
|
2
|
+
import type { FieldValidationRules, FieldComparison, ComparisonOperator, FieldValidationError, FieldType, FieldDefinition } from '../validation';
|
|
3
|
+
/**
|
|
4
|
+
* Built-in user profile fields that can be required for redemptions.
|
|
5
|
+
* These are a subset of UserModelField - excludes 'id' and 'identifierEmail'
|
|
6
|
+
* since those are system-managed, not user-fillable profile fields.
|
|
7
|
+
*
|
|
8
|
+
* Used for:
|
|
9
|
+
* - Redemption required fields (Redemption.requiredUserFields)
|
|
10
|
+
* - User profile validation before redemption claims
|
|
11
|
+
* - Form generation for missing field prompts
|
|
12
|
+
*/
|
|
13
|
+
declare const builtInUserFieldsArray: readonly ["email", "firstName", "lastName", "externalId", "instagramAccountId", "googleAccountName"];
|
|
14
|
+
export type BuiltInUserField = typeof builtInUserFieldsArray[number];
|
|
15
|
+
export declare const builtInUserFields: BuiltInUserField[];
|
|
16
|
+
/** Re-export base type for convenience */
|
|
17
|
+
export type { UserModelField };
|
|
18
|
+
export { userModelFields };
|
|
19
|
+
/**
|
|
20
|
+
* Field type hints for form generation and validation
|
|
21
|
+
*/
|
|
22
|
+
export type BuiltInFieldType = 'text' | 'email';
|
|
23
|
+
/**
|
|
24
|
+
* Metadata for built-in fields - UI hints for display and form generation
|
|
25
|
+
*/
|
|
26
|
+
export interface BuiltInFieldMetadata {
|
|
27
|
+
/** Human-readable label for UI display */
|
|
28
|
+
label: string;
|
|
29
|
+
/** Description for the field */
|
|
30
|
+
description: string;
|
|
31
|
+
/** Field type for form input rendering */
|
|
32
|
+
fieldType: BuiltInFieldType;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Static metadata mapping for all built-in user fields.
|
|
36
|
+
* Used by validation services and UI form generation.
|
|
37
|
+
*/
|
|
38
|
+
export declare const builtInUserFieldMetadata: Record<BuiltInUserField, BuiltInFieldMetadata>;
|
|
39
|
+
/**
|
|
40
|
+
* Check if a string is a valid built-in user field
|
|
41
|
+
*/
|
|
42
|
+
export declare const isBuiltInUserField: (value: string) => value is BuiltInUserField;
|
|
43
|
+
/**
|
|
44
|
+
* Validation result types for user field checks
|
|
45
|
+
*/
|
|
46
|
+
export interface BuiltInFieldValidationInfo {
|
|
47
|
+
field: BuiltInUserField;
|
|
48
|
+
label: string;
|
|
49
|
+
fieldType: BuiltInFieldType;
|
|
50
|
+
}
|
|
51
|
+
export interface CustomFieldValidationInfo {
|
|
52
|
+
definitionId: string;
|
|
53
|
+
key: string;
|
|
54
|
+
label: string;
|
|
55
|
+
description: string | null;
|
|
56
|
+
fieldType: string;
|
|
57
|
+
selectOptions: {
|
|
58
|
+
value: string;
|
|
59
|
+
label: string;
|
|
60
|
+
}[] | null;
|
|
61
|
+
validation: FieldValidationRules | null;
|
|
62
|
+
}
|
|
63
|
+
export type CustomFieldValidationRules = FieldValidationRules;
|
|
64
|
+
export type CustomFieldType = FieldType;
|
|
65
|
+
export type { FieldComparison, ComparisonOperator, FieldValidationError, FieldDefinition };
|
|
66
|
+
export { validateFieldValue, validateFieldComparisons, validateAllFields, compareValues, getOperatorText, } from '../validation';
|
|
67
|
+
export interface UserFieldValidationResult {
|
|
68
|
+
valid: boolean;
|
|
69
|
+
missingBuiltInFields: BuiltInFieldValidationInfo[];
|
|
70
|
+
missingCustomFields: CustomFieldValidationInfo[];
|
|
71
|
+
totalMissing: number;
|
|
72
|
+
}
|
|
73
|
+
export interface CustomFieldSelectOption {
|
|
74
|
+
value: string;
|
|
75
|
+
label: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Supported entities for dynamic select options
|
|
79
|
+
*/
|
|
80
|
+
export type SelectOptionsEntity = 'business' | 'campaign' | 'redemption' | 'user';
|
|
81
|
+
/**
|
|
82
|
+
* Filter conditions for dynamic select options
|
|
83
|
+
*/
|
|
84
|
+
export interface SelectOptionsFilter {
|
|
85
|
+
/** Filter by tags (OR logic - has any of these) */
|
|
86
|
+
tags?: string[];
|
|
87
|
+
/** Filter by active status */
|
|
88
|
+
isActive?: boolean;
|
|
89
|
+
/** Generic key-value filters */
|
|
90
|
+
[key: string]: unknown;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Configuration for fetching select options dynamically from an entity
|
|
94
|
+
*/
|
|
95
|
+
export interface SelectOptionsSource {
|
|
96
|
+
/** Entity to fetch options from */
|
|
97
|
+
entity: SelectOptionsEntity;
|
|
98
|
+
/** Field to use as option value (usually 'id') */
|
|
99
|
+
valueField: string;
|
|
100
|
+
/** Field to use as option label (e.g., 'name') */
|
|
101
|
+
labelField: string;
|
|
102
|
+
/** Optional filter conditions */
|
|
103
|
+
filter?: SelectOptionsFilter;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=user-fields.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-fields.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/user-fields.type.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { userModelFields } from './unique-user-identifier-keys.js';
|
|
2
|
+
/**
|
|
3
|
+
* Built-in user profile fields that can be required for redemptions.
|
|
4
|
+
* These are a subset of UserModelField - excludes 'id' and 'identifierEmail'
|
|
5
|
+
* since those are system-managed, not user-fillable profile fields.
|
|
6
|
+
*
|
|
7
|
+
* Used for:
|
|
8
|
+
* - Redemption required fields (Redemption.requiredUserFields)
|
|
9
|
+
* - User profile validation before redemption claims
|
|
10
|
+
* - Form generation for missing field prompts
|
|
11
|
+
*/
|
|
12
|
+
// Fields that can be required for user profile validation (excludes system fields)
|
|
13
|
+
const builtInUserFieldsArray = [
|
|
14
|
+
'email',
|
|
15
|
+
'firstName',
|
|
16
|
+
'lastName',
|
|
17
|
+
'externalId',
|
|
18
|
+
'instagramAccountId',
|
|
19
|
+
'googleAccountName',
|
|
20
|
+
];
|
|
21
|
+
// Export the array for iteration
|
|
22
|
+
export const builtInUserFields = [...builtInUserFieldsArray];
|
|
23
|
+
export { userModelFields };
|
|
24
|
+
/**
|
|
25
|
+
* Static metadata mapping for all built-in user fields.
|
|
26
|
+
* Used by validation services and UI form generation.
|
|
27
|
+
*/
|
|
28
|
+
export const builtInUserFieldMetadata = {
|
|
29
|
+
email: {
|
|
30
|
+
label: 'Email Address',
|
|
31
|
+
description: 'User email address',
|
|
32
|
+
fieldType: 'email',
|
|
33
|
+
},
|
|
34
|
+
firstName: {
|
|
35
|
+
label: 'First Name',
|
|
36
|
+
description: 'User first name',
|
|
37
|
+
fieldType: 'text',
|
|
38
|
+
},
|
|
39
|
+
lastName: {
|
|
40
|
+
label: 'Last Name',
|
|
41
|
+
description: 'User last name',
|
|
42
|
+
fieldType: 'text',
|
|
43
|
+
},
|
|
44
|
+
externalId: {
|
|
45
|
+
label: 'External ID',
|
|
46
|
+
description: 'External identifier from third-party system',
|
|
47
|
+
fieldType: 'text',
|
|
48
|
+
},
|
|
49
|
+
instagramAccountId: {
|
|
50
|
+
label: 'Instagram Account',
|
|
51
|
+
description: 'Instagram account ID',
|
|
52
|
+
fieldType: 'text',
|
|
53
|
+
},
|
|
54
|
+
googleAccountName: {
|
|
55
|
+
label: 'Google Account',
|
|
56
|
+
description: 'Google account name',
|
|
57
|
+
fieldType: 'text',
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Check if a string is a valid built-in user field
|
|
62
|
+
*/
|
|
63
|
+
export const isBuiltInUserField = (value) => {
|
|
64
|
+
return builtInUserFields.includes(value);
|
|
65
|
+
};
|
|
66
|
+
export { validateFieldValue, validateFieldComparisons, validateAllFields, compareValues, getOperatorText, } from '../validation/index.js';
|
|
67
|
+
//# sourceMappingURL=user-fields.type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-fields.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/user-fields.type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAUhF;;;;;;;;;GASG;AAEH,mFAAmF;AACnF,MAAM,sBAAsB,GAAG;IAC7B,OAAO;IACP,WAAW;IACX,UAAU;IACV,YAAY;IACZ,oBAAoB;IACpB,mBAAmB;CACyB,CAAC;AAK/C,iCAAiC;AACjC,MAAM,CAAC,MAAM,iBAAiB,GAAuB,CAAC,GAAG,sBAAsB,CAAC,CAAC;AAIjF,OAAO,EAAE,eAAe,EAAE,CAAC;AAmB3B;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAmD;IACtF,KAAK,EAAE;QACL,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,oBAAoB;QACjC,SAAS,EAAE,OAAO;KACnB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,iBAAiB;QAC9B,SAAS,EAAE,MAAM;KAClB;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,gBAAgB;QAC7B,SAAS,EAAE,MAAM;KAClB;IACD,UAAU,EAAE;QACV,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,6CAA6C;QAC1D,SAAS,EAAE,MAAM;KAClB;IACD,kBAAkB,EAAE;QAClB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,sBAAsB;QACnC,SAAS,EAAE,MAAM;KAClB;IACD,iBAAiB,EAAE;QACjB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,qBAAqB;QAClC,SAAS,EAAE,MAAM;KAClB;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAA6B,EAAE;IAC7E,OAAO,iBAAiB,CAAC,QAAQ,CAAC,KAAyB,CAAC,CAAC;AAC/D,CAAC,CAAC;AA4BF,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UUID type using template literal for compile-time differentiation.
|
|
3
|
+
* Matches standard UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
4
|
+
*/
|
|
5
|
+
export type UUID = `${string}-${string}-${string}-${string}-${string}`;
|
|
6
|
+
/**
|
|
7
|
+
* Branded UUID for custom field definition IDs.
|
|
8
|
+
* Provides semantic meaning while maintaining UUID structure.
|
|
9
|
+
*/
|
|
10
|
+
export type CustomFieldId = UUID;
|
|
11
|
+
/**
|
|
12
|
+
* Check if a string matches UUID format
|
|
13
|
+
*/
|
|
14
|
+
export declare const isUUID: (value: string) => value is UUID;
|
|
15
|
+
//# sourceMappingURL=uuid.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/uuid.type.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AAEvE;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC;AAEjC;;GAEG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,MAAM,KAAG,KAAK,IAAI,IAE/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/uuid.type.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAiB,EAAE;IACrD,OAAO,iEAAiE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field Validation Functions
|
|
3
|
+
* Shared between backend and frontend for consistent validation.
|
|
4
|
+
*/
|
|
5
|
+
import type { ComparisonOperator, FieldComparison, FieldDefinition, FieldType, FieldValidationError, FieldValidationRules } from './validation.types';
|
|
6
|
+
export type { ComparisonOperator, FieldComparison, FieldComparisonToField, FieldComparisonToValue, FieldDefinition, FieldType, FieldValidationError, FieldValidationRules, } from './validation.types';
|
|
7
|
+
export { operatorText } from './validation.types';
|
|
8
|
+
export { isValidEmail, isValidUrl, isValidWalletAddress, isValidNonEmptyString, isValidUuid, EMAIL_REGEX, EMAIL_MAX_LENGTH, URL_REGEX, WALLET_ADDRESS_REGEX, UUID_REGEX, } from './validators';
|
|
9
|
+
/**
|
|
10
|
+
* Compare two values using the specified operator.
|
|
11
|
+
* Works with numbers, dates, and strings.
|
|
12
|
+
*/
|
|
13
|
+
export declare const compareValues: <T extends number | Date | string>(a: T, b: T, op: ComparisonOperator) => boolean;
|
|
14
|
+
/** Get human-readable operator text for error messages. */
|
|
15
|
+
export declare const getOperatorText: (op: ComparisonOperator) => string;
|
|
16
|
+
/**
|
|
17
|
+
* Validate a single field value against validation rules.
|
|
18
|
+
* Does not check cross-field comparisons (use validateFieldComparisons for that).
|
|
19
|
+
*/
|
|
20
|
+
export declare const validateFieldValue: (value: unknown, rules: FieldValidationRules | null | undefined, fieldType: FieldType) => FieldValidationError | null;
|
|
21
|
+
/**
|
|
22
|
+
* Validate comparison rules for a single field.
|
|
23
|
+
* Supports comparing to another field OR a literal value.
|
|
24
|
+
*/
|
|
25
|
+
export declare const validateFieldComparisons: (fieldKey: string, value: unknown, comparisons: FieldComparison[] | undefined, allData: Record<string, unknown>, fieldType: FieldType) => FieldValidationError[];
|
|
26
|
+
/**
|
|
27
|
+
* Validate all fields in a data object against their definitions.
|
|
28
|
+
* Runs both single-field and comparison validations.
|
|
29
|
+
*
|
|
30
|
+
* @param data - The data object to validate
|
|
31
|
+
* @param definitions - Field definitions with validation rules
|
|
32
|
+
* @returns Array of all validation errors
|
|
33
|
+
*/
|
|
34
|
+
export declare const validateAllFields: (data: Record<string, unknown>, definitions: FieldDefinition[]) => FieldValidationError[];
|
|
35
|
+
//# sourceMappingURL=field-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-validation.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/validation/field-validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EAEf,eAAe,EACf,SAAS,EACT,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAK5B,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,oBAAoB,EACpB,UAAU,GACX,MAAM,cAAc,CAAC;AAMtB;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,MAAM,EAC5D,GAAG,CAAC,EACJ,GAAG,CAAC,EACJ,IAAI,kBAAkB,KACrB,OASF,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,eAAe,GAAI,IAAI,kBAAkB,KAAG,MAA0B,CAAC;AAMpF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,OAAO,EACd,OAAO,oBAAoB,GAAG,IAAI,GAAG,SAAS,EAC9C,WAAW,SAAS,KACnB,oBAAoB,GAAG,IAqGzB,CAAC;AAUF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,MAAM,EAChB,OAAO,OAAO,EACd,aAAa,eAAe,EAAE,GAAG,SAAS,EAC1C,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,WAAW,SAAS,KACnB,oBAAoB,EA6DtB,CAAC;AAMF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,aAAa,eAAe,EAAE,KAC7B,oBAAoB,EA4BtB,CAAC"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { operatorText } from './validation.types.js';
|
|
2
|
+
import { EMAIL_MAX_LENGTH, EMAIL_REGEX, URL_REGEX } from './validators.js';
|
|
3
|
+
export { operatorText } from './validation.types.js';
|
|
4
|
+
// Re-export standalone validators
|
|
5
|
+
export { isValidEmail, isValidUrl, isValidWalletAddress, isValidNonEmptyString, isValidUuid, EMAIL_REGEX, EMAIL_MAX_LENGTH, URL_REGEX, WALLET_ADDRESS_REGEX, UUID_REGEX, } from './validators.js';
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Comparison Functions
|
|
8
|
+
// ============================================================================
|
|
9
|
+
/**
|
|
10
|
+
* Compare two values using the specified operator.
|
|
11
|
+
* Works with numbers, dates, and strings.
|
|
12
|
+
*/
|
|
13
|
+
export const compareValues = (a, b, op) => {
|
|
14
|
+
switch (op) {
|
|
15
|
+
case '<': return a < b;
|
|
16
|
+
case '<=': return a <= b;
|
|
17
|
+
case '>': return a > b;
|
|
18
|
+
case '>=': return a >= b;
|
|
19
|
+
case '==': return a === b;
|
|
20
|
+
case '!=': return a !== b;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
/** Get human-readable operator text for error messages. */
|
|
24
|
+
export const getOperatorText = (op) => operatorText[op];
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Single Field Validation
|
|
27
|
+
// ============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* Validate a single field value against validation rules.
|
|
30
|
+
* Does not check cross-field comparisons (use validateFieldComparisons for that).
|
|
31
|
+
*/
|
|
32
|
+
export const validateFieldValue = (value, rules, fieldType) => {
|
|
33
|
+
// No rules = valid
|
|
34
|
+
if (!rules) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const stringValue = value !== null && value !== undefined ? String(value) : '';
|
|
38
|
+
const isEmpty = value === null || value === undefined || value === '';
|
|
39
|
+
// Required check
|
|
40
|
+
if (rules.required && isEmpty) {
|
|
41
|
+
return { field: '', message: 'This field is required', rule: 'required' };
|
|
42
|
+
}
|
|
43
|
+
// If empty and not required, skip other validations
|
|
44
|
+
if (isEmpty) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
// Type-specific validation
|
|
48
|
+
switch (fieldType) {
|
|
49
|
+
case 'text':
|
|
50
|
+
if (rules.minLength && stringValue.length < rules.minLength) {
|
|
51
|
+
return { field: '', message: `Minimum ${rules.minLength} characters required`, rule: 'minLength' };
|
|
52
|
+
}
|
|
53
|
+
if (rules.maxLength && stringValue.length > rules.maxLength) {
|
|
54
|
+
return { field: '', message: `Maximum ${rules.maxLength} characters allowed`, rule: 'maxLength' };
|
|
55
|
+
}
|
|
56
|
+
if (rules.pattern && !new RegExp(rules.pattern).test(stringValue)) {
|
|
57
|
+
return { field: '', message: rules.patternMessage || 'Invalid format', rule: 'pattern' };
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
case 'email':
|
|
61
|
+
if (stringValue.length > EMAIL_MAX_LENGTH || !EMAIL_REGEX.test(stringValue)) {
|
|
62
|
+
return { field: '', message: 'Invalid email format', rule: 'email' };
|
|
63
|
+
}
|
|
64
|
+
if (rules.maxLength && stringValue.length > rules.maxLength) {
|
|
65
|
+
return { field: '', message: `Maximum ${rules.maxLength} characters allowed`, rule: 'maxLength' };
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
case 'url':
|
|
69
|
+
if (!URL_REGEX.test(stringValue)) {
|
|
70
|
+
return { field: '', message: 'Invalid URL format', rule: 'url' };
|
|
71
|
+
}
|
|
72
|
+
if (rules.maxLength && stringValue.length > rules.maxLength) {
|
|
73
|
+
return { field: '', message: `Maximum ${rules.maxLength} characters allowed`, rule: 'maxLength' };
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
case 'number':
|
|
77
|
+
const numValue = typeof value === 'number' ? value : parseFloat(stringValue);
|
|
78
|
+
if (isNaN(numValue)) {
|
|
79
|
+
return { field: '', message: 'Must be a valid number', rule: 'type' };
|
|
80
|
+
}
|
|
81
|
+
if (rules.min !== undefined && numValue < rules.min) {
|
|
82
|
+
return { field: '', message: `Minimum value is ${rules.min}`, rule: 'min' };
|
|
83
|
+
}
|
|
84
|
+
if (rules.max !== undefined && numValue > rules.max) {
|
|
85
|
+
return { field: '', message: `Maximum value is ${rules.max}`, rule: 'max' };
|
|
86
|
+
}
|
|
87
|
+
break;
|
|
88
|
+
case 'boolean':
|
|
89
|
+
if (typeof value !== 'boolean' && stringValue !== 'true' && stringValue !== 'false') {
|
|
90
|
+
return { field: '', message: 'Must be true or false', rule: 'type' };
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
case 'date':
|
|
94
|
+
const dateValue = new Date(stringValue);
|
|
95
|
+
if (isNaN(dateValue.getTime())) {
|
|
96
|
+
return { field: '', message: 'Must be a valid date', rule: 'type' };
|
|
97
|
+
}
|
|
98
|
+
const now = new Date();
|
|
99
|
+
if (rules.minDate) {
|
|
100
|
+
const minDate = rules.minDate === 'now' ? now : new Date(rules.minDate);
|
|
101
|
+
if (dateValue < minDate) {
|
|
102
|
+
return {
|
|
103
|
+
field: '',
|
|
104
|
+
message: rules.minDate === 'now' ? 'Date must be in the future' : `Date must be after ${rules.minDate}`,
|
|
105
|
+
rule: 'minDate'
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (rules.maxDate) {
|
|
110
|
+
const maxDate = rules.maxDate === 'now' ? now : new Date(rules.maxDate);
|
|
111
|
+
if (dateValue > maxDate) {
|
|
112
|
+
return {
|
|
113
|
+
field: '',
|
|
114
|
+
message: rules.maxDate === 'now' ? 'Date must be in the past' : `Date must be before ${rules.maxDate}`,
|
|
115
|
+
rule: 'maxDate'
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
};
|
|
123
|
+
// ============================================================================
|
|
124
|
+
// Cross-Field / Literal Comparison Validation
|
|
125
|
+
// ============================================================================
|
|
126
|
+
/** Type guard for field comparison */
|
|
127
|
+
const isFieldComparison = (c) => 'field' in c && c.field !== undefined;
|
|
128
|
+
/**
|
|
129
|
+
* Validate comparison rules for a single field.
|
|
130
|
+
* Supports comparing to another field OR a literal value.
|
|
131
|
+
*/
|
|
132
|
+
export const validateFieldComparisons = (fieldKey, value, comparisons, allData, fieldType) => {
|
|
133
|
+
if (!comparisons || comparisons.length === 0)
|
|
134
|
+
return [];
|
|
135
|
+
const errors = [];
|
|
136
|
+
for (const comparison of comparisons) {
|
|
137
|
+
// Skip if this field's value is empty
|
|
138
|
+
if (value === null || value === undefined || value === '')
|
|
139
|
+
continue;
|
|
140
|
+
// Get the comparison target (field value or literal)
|
|
141
|
+
const isField = isFieldComparison(comparison);
|
|
142
|
+
const targetValue = isField ? allData[comparison.field] : comparison.value;
|
|
143
|
+
const targetLabel = isField ? comparison.field : String(comparison.value);
|
|
144
|
+
// Skip if comparing to field and that field is empty
|
|
145
|
+
if (isField && (targetValue === null || targetValue === undefined || targetValue === ''))
|
|
146
|
+
continue;
|
|
147
|
+
let isValid = true;
|
|
148
|
+
const { operator, message } = comparison;
|
|
149
|
+
switch (fieldType) {
|
|
150
|
+
case 'date': {
|
|
151
|
+
const thisDate = new Date(String(value));
|
|
152
|
+
const otherDate = new Date(String(targetValue));
|
|
153
|
+
if (isNaN(thisDate.getTime()) || isNaN(otherDate.getTime()))
|
|
154
|
+
continue;
|
|
155
|
+
isValid = compareValues(thisDate.getTime(), otherDate.getTime(), operator);
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
case 'number': {
|
|
159
|
+
const thisNum = typeof value === 'number' ? value : parseFloat(String(value));
|
|
160
|
+
const otherNum = typeof targetValue === 'number' ? targetValue : parseFloat(String(targetValue));
|
|
161
|
+
if (isNaN(thisNum) || isNaN(otherNum))
|
|
162
|
+
continue;
|
|
163
|
+
isValid = compareValues(thisNum, otherNum, operator);
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
case 'boolean': {
|
|
167
|
+
const thisBool = typeof value === 'boolean' ? value : value === 'true';
|
|
168
|
+
const otherBool = typeof targetValue === 'boolean' ? targetValue : targetValue === 'true';
|
|
169
|
+
isValid = operator === '==' ? thisBool === otherBool :
|
|
170
|
+
operator === '!=' ? thisBool !== otherBool : true;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
default: {
|
|
174
|
+
isValid = compareValues(String(value), String(targetValue), operator);
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (!isValid) {
|
|
179
|
+
errors.push({
|
|
180
|
+
field: fieldKey,
|
|
181
|
+
message: message || `Must be ${getOperatorText(operator)} ${targetLabel}`,
|
|
182
|
+
rule: `comparison:${operator}:${targetLabel}`,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return errors;
|
|
187
|
+
};
|
|
188
|
+
// ============================================================================
|
|
189
|
+
// Full Data Validation
|
|
190
|
+
// ============================================================================
|
|
191
|
+
/**
|
|
192
|
+
* Validate all fields in a data object against their definitions.
|
|
193
|
+
* Runs both single-field and comparison validations.
|
|
194
|
+
*
|
|
195
|
+
* @param data - The data object to validate
|
|
196
|
+
* @param definitions - Field definitions with validation rules
|
|
197
|
+
* @returns Array of all validation errors
|
|
198
|
+
*/
|
|
199
|
+
export const validateAllFields = (data, definitions) => {
|
|
200
|
+
const errors = [];
|
|
201
|
+
const definitionMap = new Map(definitions.map(d => [d.key, d]));
|
|
202
|
+
for (const [key, value] of Object.entries(data)) {
|
|
203
|
+
const def = definitionMap.get(key);
|
|
204
|
+
if (!def)
|
|
205
|
+
continue;
|
|
206
|
+
// Single-field validation
|
|
207
|
+
const error = validateFieldValue(value, def.validation, def.fieldType);
|
|
208
|
+
if (error) {
|
|
209
|
+
errors.push({ ...error, field: key });
|
|
210
|
+
}
|
|
211
|
+
// Comparison validation
|
|
212
|
+
if (def.validation?.comparisons) {
|
|
213
|
+
const comparisonErrors = validateFieldComparisons(key, value, def.validation.comparisons, data, def.fieldType);
|
|
214
|
+
errors.push(...comparisonErrors);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return errors;
|
|
218
|
+
};
|
|
219
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/validation/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,oBAAoB,CAAC;AAEnC,wBAAwB;AACxB,cAAc,cAAc,CAAC;AAE7B,oEAAoE;AACpE,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
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 interface FieldValidationError {
|
|
43
|
+
field: string;
|
|
44
|
+
message: string;
|
|
45
|
+
rule: string;
|
|
46
|
+
}
|
|
47
|
+
export interface FieldDefinition {
|
|
48
|
+
key: string;
|
|
49
|
+
fieldType: FieldType;
|
|
50
|
+
label: string;
|
|
51
|
+
validation?: FieldValidationRules | null;
|
|
52
|
+
}
|
|
53
|
+
export declare const operatorText: Record<ComparisonOperator, string>;
|
|
54
|
+
//# 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,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,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"}
|