@explorins/pers-shared 2.1.167 → 2.1.169
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/shared-lib/dto/analytics/campaign-claim-analytics-request.dto.d.ts +1 -1
- package/dist/cjs/shared-lib/dto/analytics/campaign-claim-analytics-request.dto.d.ts.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/analytics/redemption-redeem-analytics-request.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/analytics/transaction-analytics.request.dto.d.ts +1 -1
- package/dist/cjs/shared-lib/dto/analytics/transaction-analytics.request.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/analytics/user-analytics.dto.d.ts +1 -1
- package/dist/cjs/shared-lib/dto/analytics/user-analytics.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/booking/booking.dto.d.ts +53 -0
- package/dist/cjs/shared-lib/dto/booking/booking.dto.d.ts.map +1 -0
- package/dist/cjs/shared-lib/dto/booking/booking.dto.js +146 -0
- package/dist/cjs/shared-lib/dto/booking/booking.dto.js.map +1 -0
- package/dist/cjs/shared-lib/dto/booking/index.d.ts +2 -0
- package/dist/cjs/shared-lib/dto/booking/index.d.ts.map +1 -0
- package/dist/cjs/shared-lib/dto/booking/index.js +18 -0
- package/dist/cjs/shared-lib/dto/booking/index.js.map +1 -0
- package/dist/cjs/shared-lib/dto/campaign/campaignTrigger.dto.d.ts +1 -1
- package/dist/cjs/shared-lib/dto/campaign/campaignTrigger.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/campaign/campaignTrigger.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/campaign/campaignUserClaim.dto.d.ts +2 -0
- package/dist/cjs/shared-lib/dto/campaign/campaignUserClaim.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/campaign/campaignUserClaim.dto.js +10 -0
- package/dist/cjs/shared-lib/dto/campaign/campaignUserClaim.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/campaign/trigger-source.dto.d.ts +1 -1
- package/dist/cjs/shared-lib/dto/campaign/trigger-source.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/campaign/trigger-source.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/data-source.dto.d.ts +13 -0
- package/dist/cjs/shared-lib/dto/data-source.dto.d.ts.map +1 -0
- package/dist/cjs/shared-lib/dto/data-source.dto.js +59 -0
- package/dist/cjs/shared-lib/dto/data-source.dto.js.map +1 -0
- package/dist/cjs/shared-lib/dto/index.d.ts +2 -0
- package/dist/cjs/shared-lib/dto/index.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/index.js +4 -0
- package/dist/cjs/shared-lib/dto/index.js.map +1 -1
- package/dist/cjs/shared-lib/dto/redemption/redemption.dto.d.ts +18 -2
- package/dist/cjs/shared-lib/dto/redemption/redemption.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/redemption/redemption.dto.js +35 -4
- package/dist/cjs/shared-lib/dto/redemption/redemption.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/redemption/redemptionCreate.request.dto.d.ts +3 -0
- package/dist/cjs/shared-lib/dto/redemption/redemptionCreate.request.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/redemption/redemptionCreate.request.dto.js +24 -0
- package/dist/cjs/shared-lib/dto/redemption/redemptionCreate.request.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/redemption/redemptionRedeem.dto.d.ts +2 -0
- package/dist/cjs/shared-lib/dto/redemption/redemptionRedeem.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/redemption/redemptionRedeem.dto.js +10 -0
- package/dist/cjs/shared-lib/dto/redemption/redemptionRedeem.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/redemption/redemptionType.dto.d.ts +3 -0
- package/dist/cjs/shared-lib/dto/redemption/redemptionType.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/redemption/redemptionType.dto.js +23 -0
- package/dist/cjs/shared-lib/dto/redemption/redemptionType.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/token/token-metadata.dto.js +2 -2
- package/dist/cjs/shared-lib/dto/token/token-metadata.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/user/custom-field-definition.dto.d.ts +2 -2
- package/dist/cjs/shared-lib/dto/user/custom-field-definition.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/user/custom-field-definition.dto.js +5 -25
- package/dist/cjs/shared-lib/dto/user/custom-field-definition.dto.js.map +1 -1
- package/dist/cjs/shared-lib/dto/user/user.dto.d.ts +2 -0
- package/dist/cjs/shared-lib/dto/user/user.dto.d.ts.map +1 -1
- package/dist/cjs/shared-lib/dto/user/user.dto.js +10 -0
- package/dist/cjs/shared-lib/dto/user/user.dto.js.map +1 -1
- package/dist/cjs/shared-lib/interfaces/local-storage-item.interface.d.ts +3 -0
- package/dist/cjs/shared-lib/interfaces/local-storage-item.interface.d.ts.map +1 -1
- package/dist/cjs/shared-lib/types/booking.type.d.ts +21 -0
- package/dist/cjs/shared-lib/types/booking.type.d.ts.map +1 -0
- package/dist/cjs/shared-lib/types/booking.type.js +15 -0
- package/dist/cjs/shared-lib/types/booking.type.js.map +1 -0
- package/dist/cjs/shared-lib/types/custom-fields.type.d.ts +17 -10
- package/dist/cjs/shared-lib/types/custom-fields.type.d.ts.map +1 -1
- package/dist/cjs/shared-lib/types/custom-fields.type.js +9 -2
- package/dist/cjs/shared-lib/types/custom-fields.type.js.map +1 -1
- package/dist/cjs/shared-lib/types/data-source.type.d.ts +90 -0
- package/dist/cjs/shared-lib/types/data-source.type.d.ts.map +1 -0
- package/dist/cjs/shared-lib/types/data-source.type.js +74 -0
- package/dist/cjs/shared-lib/types/data-source.type.js.map +1 -0
- package/dist/cjs/shared-lib/types/index.d.ts +2 -0
- package/dist/cjs/shared-lib/types/index.d.ts.map +1 -1
- package/dist/cjs/shared-lib/types/index.js +2 -0
- package/dist/cjs/shared-lib/types/index.js.map +1 -1
- package/dist/cjs/shared-lib/types/redemption-include-relation.type.d.ts +6 -4
- package/dist/cjs/shared-lib/types/redemption-include-relation.type.d.ts.map +1 -1
- package/dist/cjs/shared-lib/types/redemption-include-relation.type.js +2 -1
- package/dist/cjs/shared-lib/types/redemption-include-relation.type.js.map +1 -1
- package/dist/cjs/shared-lib/validation/field-validation.d.ts +2 -12
- package/dist/cjs/shared-lib/validation/field-validation.d.ts.map +1 -1
- package/dist/cjs/shared-lib/validation/field-validation.js +27 -79
- package/dist/cjs/shared-lib/validation/field-validation.js.map +1 -1
- package/dist/cjs/shared-lib/validation/validation.types.d.ts +13 -46
- package/dist/cjs/shared-lib/validation/validation.types.d.ts.map +1 -1
- package/dist/cjs/shared-lib/validation/validation.types.js.map +1 -1
- package/dist/esm/shared-lib/dto/analytics/campaign-claim-analytics-request.dto.d.ts +1 -1
- package/dist/esm/shared-lib/dto/analytics/campaign-claim-analytics-request.dto.d.ts.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/analytics/redemption-redeem-analytics-request.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/analytics/transaction-analytics.request.dto.d.ts +1 -1
- package/dist/esm/shared-lib/dto/analytics/transaction-analytics.request.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/analytics/user-analytics.dto.d.ts +1 -1
- package/dist/esm/shared-lib/dto/analytics/user-analytics.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/booking/booking.dto.d.ts +53 -0
- package/dist/esm/shared-lib/dto/booking/booking.dto.d.ts.map +1 -0
- package/dist/esm/shared-lib/dto/booking/booking.dto.js +121 -0
- package/dist/esm/shared-lib/dto/booking/booking.dto.js.map +1 -0
- package/dist/esm/shared-lib/dto/booking/index.d.ts +2 -0
- package/dist/esm/shared-lib/dto/booking/index.d.ts.map +1 -0
- package/dist/esm/shared-lib/dto/booking/index.js +2 -0
- package/dist/esm/shared-lib/dto/booking/index.js.map +1 -0
- package/dist/esm/shared-lib/dto/campaign/campaignTrigger.dto.d.ts +1 -1
- package/dist/esm/shared-lib/dto/campaign/campaignTrigger.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/campaign/campaignTrigger.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/campaign/campaignUserClaim.dto.d.ts +2 -0
- package/dist/esm/shared-lib/dto/campaign/campaignUserClaim.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/campaign/campaignUserClaim.dto.js +9 -0
- package/dist/esm/shared-lib/dto/campaign/campaignUserClaim.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/campaign/trigger-source.dto.d.ts +1 -1
- package/dist/esm/shared-lib/dto/campaign/trigger-source.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/campaign/trigger-source.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/data-source.dto.d.ts +13 -0
- package/dist/esm/shared-lib/dto/data-source.dto.d.ts.map +1 -0
- package/dist/esm/shared-lib/dto/data-source.dto.js +47 -0
- package/dist/esm/shared-lib/dto/data-source.dto.js.map +1 -0
- package/dist/esm/shared-lib/dto/index.d.ts +2 -0
- package/dist/esm/shared-lib/dto/index.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/index.js +4 -0
- package/dist/esm/shared-lib/dto/index.js.map +1 -1
- package/dist/esm/shared-lib/dto/redemption/redemption.dto.d.ts +18 -2
- package/dist/esm/shared-lib/dto/redemption/redemption.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/redemption/redemption.dto.js +33 -4
- package/dist/esm/shared-lib/dto/redemption/redemption.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionCreate.request.dto.d.ts +3 -0
- package/dist/esm/shared-lib/dto/redemption/redemptionCreate.request.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionCreate.request.dto.js +23 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionCreate.request.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionRedeem.dto.d.ts +2 -0
- package/dist/esm/shared-lib/dto/redemption/redemptionRedeem.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionRedeem.dto.js +10 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionRedeem.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionType.dto.d.ts +3 -0
- package/dist/esm/shared-lib/dto/redemption/redemptionType.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionType.dto.js +22 -1
- package/dist/esm/shared-lib/dto/redemption/redemptionType.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/token/token-metadata.dto.js +2 -2
- package/dist/esm/shared-lib/dto/token/token-metadata.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/user/custom-field-definition.dto.d.ts +2 -2
- package/dist/esm/shared-lib/dto/user/custom-field-definition.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/user/custom-field-definition.dto.js +5 -24
- package/dist/esm/shared-lib/dto/user/custom-field-definition.dto.js.map +1 -1
- package/dist/esm/shared-lib/dto/user/user.dto.d.ts +2 -0
- package/dist/esm/shared-lib/dto/user/user.dto.d.ts.map +1 -1
- package/dist/esm/shared-lib/dto/user/user.dto.js +9 -0
- package/dist/esm/shared-lib/dto/user/user.dto.js.map +1 -1
- package/dist/esm/shared-lib/interfaces/local-storage-item.interface.d.ts +3 -0
- package/dist/esm/shared-lib/interfaces/local-storage-item.interface.d.ts.map +1 -1
- package/dist/esm/shared-lib/types/booking.type.d.ts +21 -0
- package/dist/esm/shared-lib/types/booking.type.d.ts.map +1 -0
- package/dist/esm/shared-lib/types/booking.type.js +12 -0
- package/dist/esm/shared-lib/types/booking.type.js.map +1 -0
- package/dist/esm/shared-lib/types/custom-fields.type.d.ts +17 -10
- package/dist/esm/shared-lib/types/custom-fields.type.d.ts.map +1 -1
- package/dist/esm/shared-lib/types/custom-fields.type.js +8 -1
- package/dist/esm/shared-lib/types/custom-fields.type.js.map +1 -1
- package/dist/esm/shared-lib/types/data-source.type.d.ts +90 -0
- package/dist/esm/shared-lib/types/data-source.type.d.ts.map +1 -0
- package/dist/esm/shared-lib/types/data-source.type.js +70 -0
- package/dist/esm/shared-lib/types/data-source.type.js.map +1 -0
- package/dist/esm/shared-lib/types/index.d.ts +2 -0
- package/dist/esm/shared-lib/types/index.d.ts.map +1 -1
- package/dist/esm/shared-lib/types/index.js +2 -0
- package/dist/esm/shared-lib/types/index.js.map +1 -1
- package/dist/esm/shared-lib/types/redemption-include-relation.type.d.ts +6 -4
- package/dist/esm/shared-lib/types/redemption-include-relation.type.d.ts.map +1 -1
- package/dist/esm/shared-lib/types/redemption-include-relation.type.js +2 -1
- package/dist/esm/shared-lib/types/redemption-include-relation.type.js.map +1 -1
- package/dist/esm/shared-lib/validation/field-validation.d.ts +2 -12
- package/dist/esm/shared-lib/validation/field-validation.d.ts.map +1 -1
- package/dist/esm/shared-lib/validation/field-validation.js +26 -77
- package/dist/esm/shared-lib/validation/field-validation.js.map +1 -1
- package/dist/esm/shared-lib/validation/validation.types.d.ts +13 -46
- package/dist/esm/shared-lib/validation/validation.types.d.ts.map +1 -1
- package/dist/esm/shared-lib/validation/validation.types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Booking status computed at query time.
|
|
3
|
+
*/
|
|
4
|
+
export type BookingStatus = 'past' | 'active' | 'future';
|
|
5
|
+
/**
|
|
6
|
+
* Booking requirement types for redemption eligibility.
|
|
7
|
+
* Determines what kind of booking a user must have to redeem.
|
|
8
|
+
*/
|
|
9
|
+
export type BookingRequirementType = 'active' | 'future' | 'past' | 'active_future' | 'any';
|
|
10
|
+
/**
|
|
11
|
+
* Location types for bookings.
|
|
12
|
+
* Broad categories for different booking contexts.
|
|
13
|
+
*/
|
|
14
|
+
export declare const LOCATION_TYPES: readonly ["property", "service", "event", "experience", "destination"];
|
|
15
|
+
export type LocationType = typeof LOCATION_TYPES[number];
|
|
16
|
+
/**
|
|
17
|
+
* @deprecated Use DataSource from data-source.type.ts instead
|
|
18
|
+
* Keeping for backward compatibility during migration.
|
|
19
|
+
*/
|
|
20
|
+
export type BookingSource = 'manual' | 'api' | 'import' | 'migration';
|
|
21
|
+
//# sourceMappingURL=booking.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/booking.type.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEzD;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAC9B,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,eAAe,GACf,KAAK,CAAC;AAEV;;;GAGG;AACH,eAAO,MAAM,cAAc,wEAMjB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAEzD;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LOCATION_TYPES = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Location types for bookings.
|
|
6
|
+
* Broad categories for different booking contexts.
|
|
7
|
+
*/
|
|
8
|
+
exports.LOCATION_TYPES = [
|
|
9
|
+
'property', // Physical property (hotel, resort, vacation rental)
|
|
10
|
+
'service', // Service-based booking (spa, salon, restaurant)
|
|
11
|
+
'event', // Event/activity booking (concert, tour, class)
|
|
12
|
+
'experience', // Experience package (multi-activity, bundle)
|
|
13
|
+
'destination', // Destination/location-based (city pass, area access)
|
|
14
|
+
];
|
|
15
|
+
//# sourceMappingURL=booking.type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/booking.type.ts"],"names":[],"mappings":";;;AAgBA;;;GAGG;AACU,QAAA,cAAc,GAAG;IAC5B,UAAU,EAAM,qDAAqD;IACrE,SAAS,EAAO,iDAAiD;IACjE,OAAO,EAAS,gDAAgD;IAChE,YAAY,EAAI,8CAA8C;IAC9D,aAAa,EAAG,sDAAsD;CAC9D,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { UserModelField, userModelFields } from './unique-user-identifier-keys';
|
|
2
|
-
import type { FieldValidationRules, FieldComparison, ComparisonOperator, ValidationErrorDetail, FieldType, FieldDefinition
|
|
2
|
+
import type { FieldValidationRules, FieldComparison, ComparisonOperator, ValidationErrorDetail, FieldType, FieldDefinition } from '../validation';
|
|
3
3
|
/**
|
|
4
4
|
* Built-in user profile fields that can be required for redemptions.
|
|
5
5
|
* These are a subset of UserModelField - excludes 'id' and 'identifierEmail'
|
|
@@ -57,7 +57,6 @@ export interface BuiltInFieldDefinition {
|
|
|
57
57
|
label: string;
|
|
58
58
|
description: string;
|
|
59
59
|
fieldType: BuiltInFieldType;
|
|
60
|
-
objectSchema: null;
|
|
61
60
|
selectOptions: null;
|
|
62
61
|
selectOptionsSource: null;
|
|
63
62
|
validation: null;
|
|
@@ -91,12 +90,11 @@ export interface CustomFieldValidationInfo {
|
|
|
91
90
|
value: string;
|
|
92
91
|
label: string;
|
|
93
92
|
}[] | null;
|
|
94
|
-
objectSchema: ObjectFieldSchema[] | null;
|
|
95
93
|
validation: FieldValidationRules | null;
|
|
96
94
|
}
|
|
97
95
|
export type CustomFieldValidationRules = FieldValidationRules;
|
|
98
96
|
export type CustomFieldType = FieldType;
|
|
99
|
-
export type { FieldComparison, ComparisonOperator, ValidationErrorDetail, FieldDefinition
|
|
97
|
+
export type { FieldComparison, ComparisonOperator, ValidationErrorDetail, FieldDefinition };
|
|
100
98
|
export { validateFieldValue, validateFieldComparisons, validateAllFields, compareValues, getOperatorText, } from '../validation';
|
|
101
99
|
export interface UserFieldValidationResult {
|
|
102
100
|
valid: boolean;
|
|
@@ -120,6 +118,15 @@ declare const customFieldEntityTypesArray: readonly ["user", "business", "campai
|
|
|
120
118
|
export type CustomFieldEntityType = typeof customFieldEntityTypesArray[number];
|
|
121
119
|
/** All supported custom field entity types for iteration/validation */
|
|
122
120
|
export declare const customFieldEntityTypes: CustomFieldEntityType[];
|
|
121
|
+
/**
|
|
122
|
+
* Entity types available for select options source (includes static sources)
|
|
123
|
+
* - Database entities: user, business, campaign, redemption
|
|
124
|
+
* - Static sources: country (ISO 3166-1 country list)
|
|
125
|
+
*/
|
|
126
|
+
declare const selectOptionsSourceEntityArray: readonly ["user", "business", "campaign", "redemption", "country"];
|
|
127
|
+
export type SelectOptionsSourceEntity = typeof selectOptionsSourceEntityArray[number];
|
|
128
|
+
/** All supported select options source entities for iteration/validation */
|
|
129
|
+
export declare const selectOptionsSourceEntities: SelectOptionsSourceEntity[];
|
|
123
130
|
/**
|
|
124
131
|
* Filter conditions for dynamic select options
|
|
125
132
|
*/
|
|
@@ -135,12 +142,12 @@ export interface SelectOptionsFilter {
|
|
|
135
142
|
* Configuration for fetching select options dynamically from an entity
|
|
136
143
|
*/
|
|
137
144
|
export interface SelectOptionsSource {
|
|
138
|
-
/** Entity to fetch options from */
|
|
139
|
-
entity:
|
|
140
|
-
/** Field to use as option value (usually 'id') */
|
|
141
|
-
valueField
|
|
142
|
-
/** Field to use as option label (e.g., 'name') */
|
|
143
|
-
labelField
|
|
145
|
+
/** Entity to fetch options from (database entities or static sources like 'country') */
|
|
146
|
+
entity: SelectOptionsSourceEntity;
|
|
147
|
+
/** Field to use as option value (usually 'id'). Optional for static sources. */
|
|
148
|
+
valueField?: string;
|
|
149
|
+
/** Field to use as option label (e.g., 'name'). Optional for static sources. */
|
|
150
|
+
labelField?: string;
|
|
144
151
|
/** Optional filter conditions */
|
|
145
152
|
filter?: SelectOptionsFilter;
|
|
146
153
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-fields.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/custom-fields.type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,SAAS,EACT,eAAe,
|
|
1
|
+
{"version":3,"file":"custom-fields.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/custom-fields.type.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.customFieldEntityTypes = exports.getOperatorText = exports.compareValues = exports.validateAllFields = exports.validateFieldComparisons = exports.validateFieldValue = exports.getAllBuiltInFieldDefinitions = exports.getBuiltInFieldDefinition = exports.isBuiltInUserField = exports.builtInUserFieldMetadata = exports.userModelFields = exports.builtInUserFields = void 0;
|
|
3
|
+
exports.selectOptionsSourceEntities = exports.customFieldEntityTypes = exports.getOperatorText = exports.compareValues = exports.validateAllFields = exports.validateFieldComparisons = exports.validateFieldValue = exports.getAllBuiltInFieldDefinitions = exports.getBuiltInFieldDefinition = exports.isBuiltInUserField = exports.builtInUserFieldMetadata = exports.userModelFields = exports.builtInUserFields = void 0;
|
|
4
4
|
const unique_user_identifier_keys_1 = require("./unique-user-identifier-keys");
|
|
5
5
|
Object.defineProperty(exports, "userModelFields", { enumerable: true, get: function () { return unique_user_identifier_keys_1.userModelFields; } });
|
|
6
6
|
/**
|
|
@@ -82,7 +82,6 @@ const getBuiltInFieldDefinition = (field) => {
|
|
|
82
82
|
label: metadata.label,
|
|
83
83
|
description: metadata.description,
|
|
84
84
|
fieldType: metadata.fieldType,
|
|
85
|
-
objectSchema: null,
|
|
86
85
|
selectOptions: null,
|
|
87
86
|
selectOptionsSource: null,
|
|
88
87
|
validation: null,
|
|
@@ -118,4 +117,12 @@ Object.defineProperty(exports, "getOperatorText", { enumerable: true, get: funct
|
|
|
118
117
|
const customFieldEntityTypesArray = ['user', 'business', 'campaign', 'redemption'];
|
|
119
118
|
/** All supported custom field entity types for iteration/validation */
|
|
120
119
|
exports.customFieldEntityTypes = [...customFieldEntityTypesArray];
|
|
120
|
+
/**
|
|
121
|
+
* Entity types available for select options source (includes static sources)
|
|
122
|
+
* - Database entities: user, business, campaign, redemption
|
|
123
|
+
* - Static sources: country (ISO 3166-1 country list)
|
|
124
|
+
*/
|
|
125
|
+
const selectOptionsSourceEntityArray = [...customFieldEntityTypesArray, 'country'];
|
|
126
|
+
/** All supported select options source entities for iteration/validation */
|
|
127
|
+
exports.selectOptionsSourceEntities = [...selectOptionsSourceEntityArray];
|
|
121
128
|
//# sourceMappingURL=custom-fields.type.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-fields.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/custom-fields.type.ts"],"names":[],"mappings":";;;AAAA,+EAAgF;
|
|
1
|
+
{"version":3,"file":"custom-fields.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/custom-fields.type.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified data source tracking for analytics across all entities.
|
|
3
|
+
*
|
|
4
|
+
* Use this type to track the origin/channel of data for:
|
|
5
|
+
* - Users (registration source)
|
|
6
|
+
* - Claims (how the claim was initiated)
|
|
7
|
+
* - Redeems (redemption channel)
|
|
8
|
+
* - Bookings (booking source)
|
|
9
|
+
* - Purchases (transaction origin)
|
|
10
|
+
*
|
|
11
|
+
* ## HTTP Headers for SDK/API
|
|
12
|
+
*
|
|
13
|
+
* | Header | Purpose | Examples |
|
|
14
|
+
* |---------------------|----------------------------|-------------------------------------------------------|
|
|
15
|
+
* | `x-source-channel` | How the request arrived | `web`, `mobile`, `api`, `admin`, `webhook`, `import` |
|
|
16
|
+
* | `x-source-medium` | Marketing channel type | `email`, `referral`, `direct`, `organic`, `paid` |
|
|
17
|
+
* | `x-source-campaign` | Campaign ID for attribution| `summer_promo_2026`, `welcome_series`, `partner_launch`|
|
|
18
|
+
* | `x-source` | Traffic origin reference | `google`, `facebook`, `partner_xyz`, `qr_code_lobby` |
|
|
19
|
+
*
|
|
20
|
+
* ## Example Scenarios
|
|
21
|
+
*
|
|
22
|
+
* | Scenario | channel | medium | campaign | source |
|
|
23
|
+
* |-----------------------------|-----------|------------|--------------|--------------|
|
|
24
|
+
* | User clicks email link | `web` | `email` | `summer_promo`| `mailchimp` |
|
|
25
|
+
* | Mobile app registration | `mobile` | `app` | - | - |
|
|
26
|
+
* | Partner API integration | `api` | `affiliate`| - | `partner_xyz`|
|
|
27
|
+
* | QR code scan in hotel | `mobile` | `referral` | `lobby_qr` | `qr_code` |
|
|
28
|
+
* | Admin creates user | `admin` | - | - | - |
|
|
29
|
+
* | Webhook from Stripe | `webhook` | - | - | `stripe` |
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* // Simple usage - just channel
|
|
33
|
+
* const source: DataSource = { channel: 'web' };
|
|
34
|
+
*
|
|
35
|
+
* // Full attribution tracking
|
|
36
|
+
* const source: DataSource = {
|
|
37
|
+
* channel: 'web',
|
|
38
|
+
* medium: 'email',
|
|
39
|
+
* campaign: 'summer_promo_2026',
|
|
40
|
+
* source: 'mailchimp',
|
|
41
|
+
* referrer: 'https://email.example.com/campaign/123'
|
|
42
|
+
* };
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* Primary ingestion channels for data source tracking.
|
|
46
|
+
*/
|
|
47
|
+
export declare const DATA_SOURCE_CHANNELS: readonly ["web", "mobile", "api", "admin", "system", "import", "webhook", "sync", "migration"];
|
|
48
|
+
export type DataSourceChannel = typeof DATA_SOURCE_CHANNELS[number];
|
|
49
|
+
/**
|
|
50
|
+
* Unified data source tracking interface.
|
|
51
|
+
*
|
|
52
|
+
* Provides both simple channel categorization and optional
|
|
53
|
+
* detailed attribution fields for analytics.
|
|
54
|
+
*/
|
|
55
|
+
export interface DataSource {
|
|
56
|
+
/**
|
|
57
|
+
* Primary ingestion channel.
|
|
58
|
+
* Required field for basic source categorization.
|
|
59
|
+
*/
|
|
60
|
+
channel: DataSourceChannel;
|
|
61
|
+
/**
|
|
62
|
+
* Marketing medium for attribution.
|
|
63
|
+
* Examples: 'email', 'referral', 'direct', 'organic', 'paid', 'social', 'affiliate'
|
|
64
|
+
*/
|
|
65
|
+
medium?: string;
|
|
66
|
+
/**
|
|
67
|
+
* Campaign identifier for tracking.
|
|
68
|
+
* Examples: 'summer_promo_2026', 'welcome_series', 'partner_launch'
|
|
69
|
+
*/
|
|
70
|
+
campaign?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Traffic source reference.
|
|
73
|
+
* Examples: 'google', 'facebook', 'partner_xyz', 'newsletter'
|
|
74
|
+
*/
|
|
75
|
+
source?: string;
|
|
76
|
+
/**
|
|
77
|
+
* Original referrer URL.
|
|
78
|
+
* Full URL of the referring page.
|
|
79
|
+
*/
|
|
80
|
+
referrer?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Type guard to check if a value is a valid DataSourceChannel.
|
|
84
|
+
*/
|
|
85
|
+
export declare function isDataSourceChannel(value: unknown): value is DataSourceChannel;
|
|
86
|
+
/**
|
|
87
|
+
* Default data source for manual/admin operations.
|
|
88
|
+
*/
|
|
89
|
+
export declare const DEFAULT_DATA_SOURCE: DataSource;
|
|
90
|
+
//# sourceMappingURL=data-source.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/data-source.type.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH;;GAEG;AACH,eAAO,MAAM,oBAAoB,gGAUvB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,OAAO,EAAE,iBAAiB,CAAC;IAE3B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAEjC,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Unified data source tracking for analytics across all entities.
|
|
4
|
+
*
|
|
5
|
+
* Use this type to track the origin/channel of data for:
|
|
6
|
+
* - Users (registration source)
|
|
7
|
+
* - Claims (how the claim was initiated)
|
|
8
|
+
* - Redeems (redemption channel)
|
|
9
|
+
* - Bookings (booking source)
|
|
10
|
+
* - Purchases (transaction origin)
|
|
11
|
+
*
|
|
12
|
+
* ## HTTP Headers for SDK/API
|
|
13
|
+
*
|
|
14
|
+
* | Header | Purpose | Examples |
|
|
15
|
+
* |---------------------|----------------------------|-------------------------------------------------------|
|
|
16
|
+
* | `x-source-channel` | How the request arrived | `web`, `mobile`, `api`, `admin`, `webhook`, `import` |
|
|
17
|
+
* | `x-source-medium` | Marketing channel type | `email`, `referral`, `direct`, `organic`, `paid` |
|
|
18
|
+
* | `x-source-campaign` | Campaign ID for attribution| `summer_promo_2026`, `welcome_series`, `partner_launch`|
|
|
19
|
+
* | `x-source` | Traffic origin reference | `google`, `facebook`, `partner_xyz`, `qr_code_lobby` |
|
|
20
|
+
*
|
|
21
|
+
* ## Example Scenarios
|
|
22
|
+
*
|
|
23
|
+
* | Scenario | channel | medium | campaign | source |
|
|
24
|
+
* |-----------------------------|-----------|------------|--------------|--------------|
|
|
25
|
+
* | User clicks email link | `web` | `email` | `summer_promo`| `mailchimp` |
|
|
26
|
+
* | Mobile app registration | `mobile` | `app` | - | - |
|
|
27
|
+
* | Partner API integration | `api` | `affiliate`| - | `partner_xyz`|
|
|
28
|
+
* | QR code scan in hotel | `mobile` | `referral` | `lobby_qr` | `qr_code` |
|
|
29
|
+
* | Admin creates user | `admin` | - | - | - |
|
|
30
|
+
* | Webhook from Stripe | `webhook` | - | - | `stripe` |
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* // Simple usage - just channel
|
|
34
|
+
* const source: DataSource = { channel: 'web' };
|
|
35
|
+
*
|
|
36
|
+
* // Full attribution tracking
|
|
37
|
+
* const source: DataSource = {
|
|
38
|
+
* channel: 'web',
|
|
39
|
+
* medium: 'email',
|
|
40
|
+
* campaign: 'summer_promo_2026',
|
|
41
|
+
* source: 'mailchimp',
|
|
42
|
+
* referrer: 'https://email.example.com/campaign/123'
|
|
43
|
+
* };
|
|
44
|
+
*/
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.DEFAULT_DATA_SOURCE = exports.DATA_SOURCE_CHANNELS = void 0;
|
|
47
|
+
exports.isDataSourceChannel = isDataSourceChannel;
|
|
48
|
+
/**
|
|
49
|
+
* Primary ingestion channels for data source tracking.
|
|
50
|
+
*/
|
|
51
|
+
exports.DATA_SOURCE_CHANNELS = [
|
|
52
|
+
'web', // Web application/browser
|
|
53
|
+
'mobile', // Mobile app (iOS/Android)
|
|
54
|
+
'api', // Direct API integration
|
|
55
|
+
'admin', // Admin panel/back-office
|
|
56
|
+
'system', // System-generated (automated)
|
|
57
|
+
'import', // Bulk import/CSV upload
|
|
58
|
+
'webhook', // External webhook callback
|
|
59
|
+
'sync', // Synchronization from external system
|
|
60
|
+
'migration', // Data migration
|
|
61
|
+
];
|
|
62
|
+
/**
|
|
63
|
+
* Type guard to check if a value is a valid DataSourceChannel.
|
|
64
|
+
*/
|
|
65
|
+
function isDataSourceChannel(value) {
|
|
66
|
+
return typeof value === 'string' && exports.DATA_SOURCE_CHANNELS.includes(value);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Default data source for manual/admin operations.
|
|
70
|
+
*/
|
|
71
|
+
exports.DEFAULT_DATA_SOURCE = {
|
|
72
|
+
channel: 'admin',
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=data-source.type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/data-source.type.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;;;AA4DH,kDAEC;AA5DD;;GAEG;AACU,QAAA,oBAAoB,GAAG;IAClC,KAAK,EAAQ,0BAA0B;IACvC,QAAQ,EAAK,2BAA2B;IACxC,KAAK,EAAQ,yBAAyB;IACtC,OAAO,EAAM,0BAA0B;IACvC,QAAQ,EAAK,+BAA+B;IAC5C,QAAQ,EAAK,yBAAyB;IACtC,SAAS,EAAI,4BAA4B;IACzC,MAAM,EAAO,uCAAuC;IACpD,WAAW,EAAE,iBAAiB;CACtB,CAAC;AA0CX;;GAEG;AACH,SAAgB,mBAAmB,CAAC,KAAc;IAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,4BAAoB,CAAC,QAAQ,CAAC,KAA0B,CAAC,CAAC;AAChG,CAAC;AAED;;GAEG;AACU,QAAA,mBAAmB,GAAe;IAC7C,OAAO,EAAE,OAAO;CACjB,CAAC"}
|
|
@@ -19,4 +19,6 @@ export * from './business-membership-include-relation.type';
|
|
|
19
19
|
export * from './user-include-relation.type';
|
|
20
20
|
export * from './token-metadata-include-relation.type';
|
|
21
21
|
export * from './filter-options.type';
|
|
22
|
+
export * from './booking.type';
|
|
23
|
+
export * from './data-source.type';
|
|
22
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,WAAW,CAAC;AAC1B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AACvD,cAAc,oCAAoC,CAAC;AACnD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wCAAwC,CAAC;AACvD,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,WAAW,CAAC;AAC1B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AACvD,cAAc,oCAAoC,CAAC;AACnD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wCAAwC,CAAC;AACvD,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
|
|
@@ -36,4 +36,6 @@ __exportStar(require("./business-membership-include-relation.type"), exports);
|
|
|
36
36
|
__exportStar(require("./user-include-relation.type"), exports);
|
|
37
37
|
__exportStar(require("./token-metadata-include-relation.type"), exports);
|
|
38
38
|
__exportStar(require("./filter-options.type"), exports);
|
|
39
|
+
__exportStar(require("./booking.type"), exports);
|
|
40
|
+
__exportStar(require("./data-source.type"), exports);
|
|
39
41
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAmD;AACnD,8CAA4B;AAC5B,uDAAqC;AACrC,gDAA8B;AAC9B,mDAAiC;AACjC,gEAA8C;AAC9C,sDAAoC;AACpC,mDAAiC;AACjC,0DAAwC;AACxC,4CAA0B;AAC1B,8DAA4C;AAC5C,6DAA2C;AAC3C,6DAA2C;AAC3C,sEAAoD;AACpD,mEAAiD;AACjD,yEAAuD;AACvD,qEAAmD;AACnD,4EAA0D;AAC1D,8EAA4D;AAC5D,+DAA6C;AAC7C,yEAAuD;AACvD,wDAAsC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAmD;AACnD,8CAA4B;AAC5B,uDAAqC;AACrC,gDAA8B;AAC9B,mDAAiC;AACjC,gEAA8C;AAC9C,sDAAoC;AACpC,mDAAiC;AACjC,0DAAwC;AACxC,4CAA0B;AAC1B,8DAA4C;AAC5C,6DAA2C;AAC3C,6DAA2C;AAC3C,sEAAoD;AACpD,mEAAiD;AACjD,yEAAuD;AACvD,qEAAmD;AACnD,4EAA0D;AAC1D,8EAA4D;AAC5D,+DAA6C;AAC7C,yEAAuD;AACvD,wDAAsC;AACtC,iDAA+B;AAC/B,qDAAmC"}
|
|
@@ -3,15 +3,17 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Follows JSON:API sideloading convention
|
|
5
5
|
*
|
|
6
|
-
* Usage: GET /redemptions?include=redeemCount,ownerBusiness,
|
|
6
|
+
* Usage: GET /redemptions?include=redeemCount,ownerBusiness,userInfo,booking
|
|
7
7
|
*
|
|
8
8
|
* - redeemCount: Include total number of redeems for the redemption
|
|
9
9
|
* - ownerBusiness: Include the owner business entity (when ownerBusinessId is set)
|
|
10
|
-
* -
|
|
10
|
+
* - userInfo: Include user info validation with field definitions and isValid flag.
|
|
11
11
|
* When user is authenticated, each definition includes `isMissing: boolean` to indicate
|
|
12
|
-
* if the user lacks that field.
|
|
12
|
+
* if the user lacks that field. `isValid` summarizes if all required fields are satisfied.
|
|
13
|
+
* - booking: Include booking validation status. When user is authenticated and
|
|
14
|
+
* redemption has booking requirement, includes `isValid` flag and matching `data`.
|
|
13
15
|
*/
|
|
14
|
-
export type RedemptionIncludeRelation = 'redeemCount' | 'ownerBusiness' | '
|
|
16
|
+
export type RedemptionIncludeRelation = 'redeemCount' | 'ownerBusiness' | 'userInfo' | 'booking';
|
|
15
17
|
/**
|
|
16
18
|
* Array of all valid redemption include relations
|
|
17
19
|
* Used for runtime validation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redemption-include-relation.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/redemption-include-relation.type.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"redemption-include-relation.type.d.ts","sourceRoot":"","sources":["../../../../src/shared-lib/types/redemption-include-relation.type.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,yBAAyB,GAAG,aAAa,GAAG,eAAe,GAAG,UAAU,GAAG,SAAS,CAAC;AAEjG;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,SAAS,yBAAyB,EAKjE,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,yBAAyB,CAE3F"}
|
|
@@ -9,7 +9,8 @@ exports.isValidRedemptionRelation = isValidRedemptionRelation;
|
|
|
9
9
|
exports.VALID_REDEMPTION_RELATIONS = [
|
|
10
10
|
'redeemCount',
|
|
11
11
|
'ownerBusiness',
|
|
12
|
-
'
|
|
12
|
+
'userInfo',
|
|
13
|
+
'booking'
|
|
13
14
|
];
|
|
14
15
|
/**
|
|
15
16
|
* Type guard to validate redemption include relation at runtime
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redemption-include-relation.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/redemption-include-relation.type.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"redemption-include-relation.type.js","sourceRoot":"","sources":["../../../../src/shared-lib/types/redemption-include-relation.type.ts"],"names":[],"mappings":";;;AAkCA,8DAEC;AAnBD;;;GAGG;AACU,QAAA,0BAA0B,GAAyC;IAC9E,aAAa;IACb,eAAe;IACf,UAAU;IACV,SAAS;CACD,CAAC;AAEX;;;;;GAKG;AACH,SAAgB,yBAAyB,CAAC,KAAa;IACrD,OAAO,kCAA0B,CAAC,QAAQ,CAAC,KAAkC,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Field Validation Functions
|
|
3
3
|
* Shared between backend and frontend for consistent validation.
|
|
4
4
|
*/
|
|
5
|
-
import type { ComparisonOperator, FieldComparison, FieldDefinition, FieldType, FieldValidationRules,
|
|
6
|
-
export type { ComparisonOperator, FieldComparison, FieldComparisonToField, FieldComparisonToValue, FieldDefinition, FieldType, FieldValidationRules,
|
|
5
|
+
import type { ComparisonOperator, FieldComparison, FieldDefinition, FieldType, FieldValidationRules, ValidationErrorDetail } from './validation.types';
|
|
6
|
+
export type { ComparisonOperator, FieldComparison, FieldComparisonToField, FieldComparisonToValue, FieldDefinition, FieldType, FieldValidationRules, ValidationErrorDetail, } from './validation.types';
|
|
7
7
|
export { operatorText } from './validation.types';
|
|
8
8
|
export { isValidEmail, isValidUrl, isValidWalletAddress, isValidNonEmptyString, isValidUuid, EMAIL_REGEX, EMAIL_MAX_LENGTH, URL_REGEX, WALLET_ADDRESS_REGEX, UUID_REGEX, } from './validators';
|
|
9
9
|
/**
|
|
@@ -23,16 +23,6 @@ export declare const validateFieldValue: (value: unknown, rules: FieldValidation
|
|
|
23
23
|
* Supports comparing to another field OR a literal value.
|
|
24
24
|
*/
|
|
25
25
|
export declare const validateFieldComparisons: (fieldKey: string, value: unknown, comparisons: FieldComparison[] | undefined, allData: Record<string, unknown>, fieldType: FieldType) => ValidationErrorDetail[];
|
|
26
|
-
/**
|
|
27
|
-
* Validate each item in an object array against the object schema.
|
|
28
|
-
* Checks required properties, type validation, and validates each property.
|
|
29
|
-
*
|
|
30
|
-
* @param fieldKey - Parent field key (for error reporting)
|
|
31
|
-
* @param items - Array of objects to validate
|
|
32
|
-
* @param schema - Schema defining expected properties
|
|
33
|
-
* @returns Array of validation errors with item index in field path (e.g., "contacts[0].phone")
|
|
34
|
-
*/
|
|
35
|
-
export declare const validateObjectArrayItems: (fieldKey: string, items: unknown[], schema: ObjectFieldSchema[]) => ValidationErrorDetail[];
|
|
36
26
|
/**
|
|
37
27
|
* Validate all fields in a data object against their definitions.
|
|
38
28
|
* Runs both single-field and comparison validations.
|
|
@@ -1 +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,
|
|
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,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAK5B,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,oBAAoB,EACpB,qBAAqB,GACtB,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,qBAAqB,GAAG,IAsI1B,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,qBAAqB,EA6DvB,CAAC;AAMF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,aAAa,eAAe,EAAE,KAC7B,qBAAqB,EA4BvB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateAllFields = exports.
|
|
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
4
|
const validation_types_1 = require("./validation.types");
|
|
5
5
|
const validators_1 = require("./validators");
|
|
6
6
|
var validation_types_2 = require("./validation.types");
|
|
@@ -130,15 +130,38 @@ const validateFieldValue = (value, rules, fieldType) => {
|
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
break;
|
|
133
|
-
case '
|
|
133
|
+
case 'phone':
|
|
134
|
+
// Basic phone validation - allows digits, spaces, dashes, parentheses, plus
|
|
135
|
+
const phoneRegex = /^[\d\s\-\(\)\+]+$/;
|
|
136
|
+
if (!phoneRegex.test(stringValue)) {
|
|
137
|
+
return { field: '', message: 'Invalid phone number format', code: 'phone' };
|
|
138
|
+
}
|
|
139
|
+
if (rules.minLength && stringValue.replace(/\D/g, '').length < rules.minLength) {
|
|
140
|
+
return { field: '', message: `Phone number too short`, code: 'minLength' };
|
|
141
|
+
}
|
|
142
|
+
if (rules.maxLength && stringValue.length > rules.maxLength) {
|
|
143
|
+
return { field: '', message: `Maximum ${rules.maxLength} characters allowed`, code: 'maxLength' };
|
|
144
|
+
}
|
|
145
|
+
break;
|
|
146
|
+
case 'select':
|
|
147
|
+
// Single selection - just validate it's a string (option validation done separately)
|
|
148
|
+
if (typeof value !== 'string') {
|
|
149
|
+
return { field: '', message: 'Must be a string', code: 'type' };
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
case 'multiselect':
|
|
134
153
|
if (!Array.isArray(value)) {
|
|
135
154
|
return { field: '', message: 'Must be an array', code: 'type' };
|
|
136
155
|
}
|
|
137
156
|
if (rules.minItems !== undefined && value.length < rules.minItems) {
|
|
138
|
-
return { field: '', message: `
|
|
157
|
+
return { field: '', message: `Select at least ${rules.minItems} options`, code: 'minItems' };
|
|
139
158
|
}
|
|
140
159
|
if (rules.maxItems !== undefined && value.length > rules.maxItems) {
|
|
141
|
-
return { field: '', message: `
|
|
160
|
+
return { field: '', message: `Select at most ${rules.maxItems} options`, code: 'maxItems' };
|
|
161
|
+
}
|
|
162
|
+
// Validate each item is a string
|
|
163
|
+
if (!value.every(item => typeof item === 'string')) {
|
|
164
|
+
return { field: '', message: 'All selections must be strings', code: 'type' };
|
|
142
165
|
}
|
|
143
166
|
break;
|
|
144
167
|
}
|
|
@@ -212,76 +235,6 @@ const validateFieldComparisons = (fieldKey, value, comparisons, allData, fieldTy
|
|
|
212
235
|
};
|
|
213
236
|
exports.validateFieldComparisons = validateFieldComparisons;
|
|
214
237
|
// ============================================================================
|
|
215
|
-
// Object Array Item Validation
|
|
216
|
-
// ============================================================================
|
|
217
|
-
/**
|
|
218
|
-
* Validate each item in an object array against the object schema.
|
|
219
|
-
* Checks required properties, type validation, and validates each property.
|
|
220
|
-
*
|
|
221
|
-
* @param fieldKey - Parent field key (for error reporting)
|
|
222
|
-
* @param items - Array of objects to validate
|
|
223
|
-
* @param schema - Schema defining expected properties
|
|
224
|
-
* @returns Array of validation errors with item index in field path (e.g., "contacts[0].phone")
|
|
225
|
-
*/
|
|
226
|
-
const validateObjectArrayItems = (fieldKey, items, schema) => {
|
|
227
|
-
const errors = [];
|
|
228
|
-
if (!Array.isArray(items))
|
|
229
|
-
return errors;
|
|
230
|
-
items.forEach((item, index) => {
|
|
231
|
-
if (typeof item !== 'object' || item === null) {
|
|
232
|
-
errors.push({
|
|
233
|
-
field: `${fieldKey}[${index}]`,
|
|
234
|
-
code: 'type',
|
|
235
|
-
message: 'Item must be an object',
|
|
236
|
-
});
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
const obj = item;
|
|
240
|
-
// Check each schema property
|
|
241
|
-
for (const prop of schema) {
|
|
242
|
-
const value = obj[prop.key];
|
|
243
|
-
const propPath = `${fieldKey}[${index}].${prop.key}`;
|
|
244
|
-
const isEmpty = value === null || value === undefined || value === '';
|
|
245
|
-
// Required check for nested properties (ObjectFieldSchema.required)
|
|
246
|
-
if (prop.required && isEmpty) {
|
|
247
|
-
errors.push({
|
|
248
|
-
field: propPath,
|
|
249
|
-
code: 'required',
|
|
250
|
-
message: `${prop.label} is required`,
|
|
251
|
-
});
|
|
252
|
-
continue;
|
|
253
|
-
}
|
|
254
|
-
if (isEmpty)
|
|
255
|
-
continue;
|
|
256
|
-
// Convert ObjectFieldSchema inline rules to FieldValidationRules
|
|
257
|
-
const rules = {
|
|
258
|
-
min: prop.min,
|
|
259
|
-
max: prop.max,
|
|
260
|
-
minLength: prop.minLength,
|
|
261
|
-
maxLength: prop.maxLength,
|
|
262
|
-
pattern: prop.pattern,
|
|
263
|
-
patternMessage: prop.patternMessage,
|
|
264
|
-
};
|
|
265
|
-
// Validate the property value
|
|
266
|
-
const error = (0, exports.validateFieldValue)(value, rules, prop.fieldType);
|
|
267
|
-
if (error) {
|
|
268
|
-
errors.push({ ...error, field: propPath });
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
// Cross-property comparisons within the same object item
|
|
272
|
-
// e.g., checkOutDate > checkInDate within each reservation
|
|
273
|
-
for (const prop of schema) {
|
|
274
|
-
const value = obj[prop.key];
|
|
275
|
-
if (value === null || value === undefined || value === '')
|
|
276
|
-
continue;
|
|
277
|
-
// ObjectFieldSchema doesn't currently have comparisons, but we could
|
|
278
|
-
// validate date fields against 'now' using minDate/maxDate if we extend the schema
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
return errors;
|
|
282
|
-
};
|
|
283
|
-
exports.validateObjectArrayItems = validateObjectArrayItems;
|
|
284
|
-
// ============================================================================
|
|
285
238
|
// Full Data Validation
|
|
286
239
|
// ============================================================================
|
|
287
240
|
/**
|
|
@@ -309,11 +262,6 @@ const validateAllFields = (data, definitions) => {
|
|
|
309
262
|
const comparisonErrors = (0, exports.validateFieldComparisons)(key, value, def.validation.comparisons, data, def.fieldType);
|
|
310
263
|
errors.push(...comparisonErrors);
|
|
311
264
|
}
|
|
312
|
-
// Object array item validation (validate each item's properties against objectSchema)
|
|
313
|
-
if (def.fieldType === 'objectArray' && def.objectSchema && Array.isArray(value)) {
|
|
314
|
-
const itemErrors = (0, exports.validateObjectArrayItems)(key, value, def.objectSchema);
|
|
315
|
-
errors.push(...itemErrors);
|
|
316
|
-
}
|
|
317
265
|
}
|
|
318
266
|
return errors;
|
|
319
267
|
};
|