@tellescope/validation 1.82.0 → 1.83.1

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/src/validation.ts CHANGED
@@ -272,6 +272,7 @@ import {
272
272
  SenderAssignmentStrategies,
273
273
  SmartMeterPlaceOrderAutomationAction,
274
274
  SmartMeterOrderLineItem,
275
+ FormFieldFeedback,
275
276
  } from "@tellescope/types-models"
276
277
  import {
277
278
  UserDisplayInfo,
@@ -1273,6 +1274,11 @@ export const phoneValidator: ValidatorDefinition<string> = {
1273
1274
  : escaped.length === 10 ? '+1' + escaped // assume US country code for now
1274
1275
  : "+" + escaped // assume country code provided, but missing leading +
1275
1276
 
1277
+ // phone numbers from Gambia, which is not supported by isMobilePhone
1278
+ if (escaped.length === 11 && escaped.startsWith('+220') && /[0-9]$/.test(escaped.substring(1))) {
1279
+ return escaped
1280
+ }
1281
+
1276
1282
  if (!isMobilePhone(escaped, 'any', { strictMode: true })) {
1277
1283
  throw `Invalid phone number: ${phone}`
1278
1284
  }
@@ -1296,6 +1302,11 @@ export const phoneValidatorOptional: ValidatorDefinition<string> = {
1296
1302
  : escaped.length === 10 ? '+1' + escaped // assume US country code for now
1297
1303
  : "+" + escaped // assume country code provided, but missing leading +
1298
1304
 
1305
+ // phone numbers from Gambia, which is not supported by isMobilePhone
1306
+ if (escaped.length === 11 && escaped.startsWith('+220') && /[0-9]$/.test(escaped.substring(1))) {
1307
+ return escaped
1308
+ }
1309
+
1299
1310
  if (!isMobilePhone(escaped, 'any', { strictMode: true })) {
1300
1311
  throw `Invalid phone number: ${phone}`
1301
1312
  }
@@ -2319,6 +2330,7 @@ const delayValidation = {
2319
2330
  delay: nonNegNumberValidator, // for UI only
2320
2331
  unit: UnitOfTimeValidator, // for UI only
2321
2332
  cancelConditions: cancelConditionsValidatorOptional,
2333
+ officeHoursOnly: booleanValidatorOptional,
2322
2334
  }
2323
2335
 
2324
2336
  export const automationEventValidator = orValidator<{ [K in AutomationEventType]: AutomationEvent & { type: K } } >({
@@ -2523,6 +2535,7 @@ export const automationActionValidator = orValidator<{ [K in AutomationActionTyp
2523
2535
  requireConfirmation: booleanValidatorOptional,
2524
2536
  reminders: listValidatorOptionalOrEmptyOk(ticketReminderValidator),
2525
2537
  priority: numberValidatorOptional,
2538
+ preserveContext: booleanValidatorOptional,
2526
2539
  }, { emptyOk: false }),
2527
2540
  }),
2528
2541
  sendWebhook: objectValidator<SendWebhookAutomationAction>({
@@ -2621,6 +2634,7 @@ export const journeyContextValidator = objectValidator<JourneyContext>({
2621
2634
  calendarEventId: mongoIdStringOptional,
2622
2635
  formResponseId: mongoIdStringOptional,
2623
2636
  purchaseId: mongoIdStringOptional,
2637
+ templateId: mongoIdStringOptional,
2624
2638
  })
2625
2639
 
2626
2640
  export const relatedRecordValidator = objectValidator<RelatedRecord>({
@@ -2819,6 +2833,11 @@ export const tableInputChoiceValidator = orValidator<{ [K in TableInputChoiceTyp
2819
2833
  }),
2820
2834
  })
2821
2835
 
2836
+ export const formFieldFeedbackValidator = objectValidator<FormFieldFeedback>({
2837
+ ifEquals: stringValidator,
2838
+ display: stringValidator,
2839
+ })
2840
+
2822
2841
  export const formFieldOptionsValidator = objectValidator<FormFieldOptions>({
2823
2842
  bookingPageId: stringValidatorOptional,
2824
2843
  tableChoices: listValidatorOptionalOrEmptyOk(tableInputChoiceValidator),
@@ -2960,6 +2979,7 @@ export const databaseFieldValidator = orValidator<{ [K in DatabaseRecordFieldTyp
2960
2979
  type: exactMatchValidator(['Text']),
2961
2980
  label: stringValidator250,
2962
2981
  hideFromTable: booleanValidatorOptional,
2982
+ wrap: stringValidatorOptional,
2963
2983
  required: booleanValidatorOptional,
2964
2984
  options: objectValidator<DatabaseRecordFields['Text']['options']>({
2965
2985
  width: stringValidatorOptionalEmptyOkay,
@@ -2969,6 +2989,7 @@ export const databaseFieldValidator = orValidator<{ [K in DatabaseRecordFieldTyp
2969
2989
  type: exactMatchValidator(['Email']),
2970
2990
  label: stringValidator250,
2971
2991
  hideFromTable: booleanValidatorOptional,
2992
+ wrap: stringValidatorOptional,
2972
2993
  required: booleanValidatorOptional,
2973
2994
  options: objectValidator<DatabaseRecordFields['Email']['options']>({
2974
2995
  width: stringValidatorOptionalEmptyOkay,
@@ -2978,6 +2999,7 @@ export const databaseFieldValidator = orValidator<{ [K in DatabaseRecordFieldTyp
2978
2999
  type: exactMatchValidator(['Phone']),
2979
3000
  label: stringValidator250,
2980
3001
  hideFromTable: booleanValidatorOptional,
3002
+ wrap: stringValidatorOptional,
2981
3003
  required: booleanValidatorOptional,
2982
3004
  options: objectValidator<DatabaseRecordFields['Phone']['options']>({
2983
3005
  width: stringValidatorOptionalEmptyOkay,
@@ -2987,6 +3009,7 @@ export const databaseFieldValidator = orValidator<{ [K in DatabaseRecordFieldTyp
2987
3009
  type: exactMatchValidator(['Text Long']),
2988
3010
  label: stringValidator250,
2989
3011
  hideFromTable: booleanValidatorOptional,
3012
+ wrap: stringValidatorOptional,
2990
3013
  required: booleanValidatorOptional,
2991
3014
  options: objectValidator<DatabaseRecordFields['Text Long']['options']>({
2992
3015
  width: stringValidatorOptionalEmptyOkay,
@@ -2996,6 +3019,7 @@ export const databaseFieldValidator = orValidator<{ [K in DatabaseRecordFieldTyp
2996
3019
  type: exactMatchValidator(['Text List']),
2997
3020
  label: stringValidator250,
2998
3021
  hideFromTable: booleanValidatorOptional,
3022
+ wrap: stringValidatorOptional,
2999
3023
  required: booleanValidatorOptional,
3000
3024
  options: objectValidator<DatabaseRecordFields['Text List']['options']>({
3001
3025
  width: stringValidatorOptionalEmptyOkay,
@@ -3005,6 +3029,7 @@ export const databaseFieldValidator = orValidator<{ [K in DatabaseRecordFieldTyp
3005
3029
  type: exactMatchValidator(['Number']),
3006
3030
  label: stringValidator250,
3007
3031
  hideFromTable: booleanValidatorOptional,
3032
+ wrap: stringValidatorOptional,
3008
3033
  required: booleanValidatorOptional,
3009
3034
  options: objectValidator<DatabaseRecordFields['Number']['options']>({
3010
3035
  width: stringValidatorOptionalEmptyOkay,
@@ -3014,6 +3039,7 @@ export const databaseFieldValidator = orValidator<{ [K in DatabaseRecordFieldTyp
3014
3039
  type: exactMatchValidator(['Address']),
3015
3040
  label: stringValidator250,
3016
3041
  hideFromTable: booleanValidatorOptional,
3042
+ wrap: stringValidatorOptional,
3017
3043
  required: booleanValidatorOptional,
3018
3044
  options: objectValidator<DatabaseRecordFields['Address']['options']>({
3019
3045
  width: stringValidatorOptionalEmptyOkay,
@@ -3023,6 +3049,7 @@ export const databaseFieldValidator = orValidator<{ [K in DatabaseRecordFieldTyp
3023
3049
  type: exactMatchValidator(['Multiple Select']),
3024
3050
  label: stringValidator250,
3025
3051
  hideFromTable: booleanValidatorOptional,
3052
+ wrap: stringValidatorOptional,
3026
3053
  required: booleanValidatorOptional,
3027
3054
  options: objectValidator<DatabaseRecordFields['Multiple Select']['options']>({
3028
3055
  width: stringValidatorOptionalEmptyOkay,
@@ -3071,7 +3098,7 @@ export const databaseRecordValueValidator = orValidator<{ [K in DatabaseRecordFi
3071
3098
  }),
3072
3099
  'Multiple Select': objectValidator<DatabaseRecordValues['Multiple Select']>({
3073
3100
  type: exactMatchValidator(['Multiple Select']),
3074
- value: listOfStringsValidatorEmptyOk,
3101
+ value: listOfStringsValidatorOptionalOrEmptyOk,
3075
3102
  label: stringValidator250,
3076
3103
  }),
3077
3104
  })
@@ -3189,6 +3216,7 @@ export const weeklyAvailabilityValidator = objectValidator<WeeklyAvailability>({
3189
3216
  locationId: mongoIdStringOptional,
3190
3217
  active: dateRangeOptionalValidator,
3191
3218
  validTemplateIds: listOfMongoIdStringValidatorOptionalOrEmptyOk,
3219
+ intervalInMinutes: numberValidatorOptional,
3192
3220
  })
3193
3221
  export const weeklyAvailabilitiesValidator = listValidatorEmptyOk(weeklyAvailabilityValidator)
3194
3222
 
@@ -3308,6 +3336,7 @@ export const organizationSettingsValidator = objectValidator<OrganizationSetting
3308
3336
  recordCalls: booleanValidatorOptional,
3309
3337
  transcribeCalls: booleanValidatorOptional,
3310
3338
  showFreeNote: booleanValidatorOptional,
3339
+ canDeleteFreeNote: booleanValidatorOptional,
3311
3340
  customFields: customEnduserFieldsValidatorOptionalOrEmpty,
3312
3341
  builtinFields: buildInFieldsValidator,
3313
3342
  tags: listOfStringsValidatorOptionalOrEmptyOk,
@@ -3404,6 +3433,7 @@ const _AUTOMATION_TRIGGER_EVENT_TYPES: { [K in AutomationTriggerEventType]: any
3404
3433
  "Has Not Engaged": true,
3405
3434
  "Vital Count": true,
3406
3435
  'Vital Update': true,
3436
+ "SMS Reply": true,
3407
3437
  }
3408
3438
  export const AUTOMATION_TRIGGER_EVENT_TYPES = Object.keys(_AUTOMATION_TRIGGER_EVENT_TYPES) as AutomationTriggerEventType[]
3409
3439
 
@@ -3499,6 +3529,13 @@ export const automationTriggerEventValidator = orValidator<{ [K in AutomationTri
3499
3529
  }),
3500
3530
  conditions: optionalEmptyObjectValidator,
3501
3531
  }),
3532
+ "SMS Reply": objectValidator<AutomationTriggerEvents["SMS Reply"]>({
3533
+ type: exactMatchValidator(['SMS Reply']),
3534
+ info: objectValidator<AutomationTriggerEvents['SMS Reply']['info']>({
3535
+ templateIds: listOfMongoIdStringValidator,
3536
+ }),
3537
+ conditions: optionalEmptyObjectValidator,
3538
+ }),
3502
3539
  })
3503
3540
 
3504
3541
  const _AUTOMATION_TRIGGER_ACTION_TYPES: { [K in AutomationTriggerActionType]: any } = {
@@ -3949,7 +3986,7 @@ export const analyticsQueryValidator = orValidator<{ [K in AnalyticsQueryType]:
3949
3986
  State: booleanValidatorOptional,
3950
3987
  }, { isOptional: true, emptyOk: true }),
3951
3988
  range: objectValidator<AnalyticsQueryRange<any>>({
3952
- interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly']),
3989
+ interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly', 'Hourly']),
3953
3990
  key: exactMatchValidator<AnalyticsQueryRangeKeyForType['Endusers']>(['Created At', 'Updated At']),
3954
3991
  }, { isOptional: true, emptyOk: true })
3955
3992
  }),
@@ -3981,7 +4018,7 @@ export const analyticsQueryValidator = orValidator<{ [K in AnalyticsQueryType]:
3981
4018
  State: booleanValidatorOptional,
3982
4019
  }, { isOptional: true, emptyOk: true }),
3983
4020
  range: objectValidator<AnalyticsQueryRange<any>>({
3984
- interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly']),
4021
+ interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly', 'Hourly']),
3985
4022
  key: exactMatchValidator<AnalyticsQueryRangeKeyForType['Calendar Events']>(['Created At', 'Updated At']),
3986
4023
  }, { isOptional: true, emptyOk: true })
3987
4024
  }),
@@ -4011,7 +4048,7 @@ export const analyticsQueryValidator = orValidator<{ [K in AnalyticsQueryType]:
4011
4048
  State: booleanValidatorOptional,
4012
4049
  }, { isOptional: true, emptyOk: true }),
4013
4050
  range: objectValidator<AnalyticsQueryRange<any>>({
4014
- interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly']),
4051
+ interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly', 'Hourly']),
4015
4052
  key: exactMatchValidator<AnalyticsQueryRangeKeyForType['Form Responses']>(['Created At', 'Updated At']),
4016
4053
  }, { isOptional: true, emptyOk: true })
4017
4054
  }),
@@ -4035,7 +4072,7 @@ export const analyticsQueryValidator = orValidator<{ [K in AnalyticsQueryType]:
4035
4072
  State: booleanValidatorOptional,
4036
4073
  }, { isOptional: true, emptyOk: true }),
4037
4074
  range: objectValidator<AnalyticsQueryRange<any>>({
4038
- interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly']),
4075
+ interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly', 'Hourly']),
4039
4076
  key: exactMatchValidator<AnalyticsQueryRangeKeyForType['Calendar Events']>(['Created At', 'Updated At']),
4040
4077
  }, { isOptional: true, emptyOk: true })
4041
4078
  }),
@@ -4058,7 +4095,7 @@ export const analyticsQueryValidator = orValidator<{ [K in AnalyticsQueryType]:
4058
4095
  State: booleanValidatorOptional,
4059
4096
  }, { isOptional: true, emptyOk: true }),
4060
4097
  range: objectValidator<AnalyticsQueryRange<any>>({
4061
- interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly']),
4098
+ interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly', 'Hourly']),
4062
4099
  key: exactMatchValidator<AnalyticsQueryRangeKeyForType['Purchase Credits']>(['Created At', 'Updated At']),
4063
4100
  }, { isOptional: true, emptyOk: true })
4064
4101
  }),
@@ -4081,7 +4118,7 @@ export const analyticsQueryValidator = orValidator<{ [K in AnalyticsQueryType]:
4081
4118
  State: booleanValidatorOptional,
4082
4119
  }, { isOptional: true, emptyOk: true }),
4083
4120
  range: objectValidator<AnalyticsQueryRange<any>>({
4084
- interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly']),
4121
+ interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly', 'Hourly']),
4085
4122
  key: exactMatchValidator<AnalyticsQueryRangeKeyForType['Tickets']>(['Created At', 'Updated At']),
4086
4123
  }, { isOptional: true, emptyOk: true })
4087
4124
  }),
@@ -4104,7 +4141,7 @@ export const analyticsQueryValidator = orValidator<{ [K in AnalyticsQueryType]:
4104
4141
  State: booleanValidatorOptional,
4105
4142
  }, { isOptional: true, emptyOk: true }),
4106
4143
  range: objectValidator<AnalyticsQueryRange<any>>({
4107
- interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly']),
4144
+ interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly', 'Hourly']),
4108
4145
  key: exactMatchValidator<AnalyticsQueryRangeKeyForType['Emails']>(['Created At', 'Updated At']),
4109
4146
  }, { isOptional: true, emptyOk: true })
4110
4147
  }),
@@ -4131,7 +4168,7 @@ export const analyticsQueryValidator = orValidator<{ [K in AnalyticsQueryType]:
4131
4168
  State: booleanValidatorOptional,
4132
4169
  }, { isOptional: true, emptyOk: true }),
4133
4170
  range: objectValidator<AnalyticsQueryRange<any>>({
4134
- interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly']),
4171
+ interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly', 'Hourly']),
4135
4172
  key: exactMatchValidator<AnalyticsQueryRangeKeyForType['Phone Calls']>(['Created At', 'Updated At']),
4136
4173
  }, { isOptional: true, emptyOk: true })
4137
4174
  }),
@@ -4158,7 +4195,7 @@ export const analyticsQueryValidator = orValidator<{ [K in AnalyticsQueryType]:
4158
4195
  State: booleanValidatorOptional,
4159
4196
  }, { isOptional: true, emptyOk: true }),
4160
4197
  range: objectValidator<AnalyticsQueryRange<any>>({
4161
- interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly']),
4198
+ interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly', 'Hourly']),
4162
4199
  key: exactMatchValidator<AnalyticsQueryRangeKeyForType['SMS Messages']>(['Created At', 'Updated At']),
4163
4200
  }, { isOptional: true, emptyOk: true })
4164
4201
  }),
@@ -4181,7 +4218,7 @@ export const analyticsQueryValidator = orValidator<{ [K in AnalyticsQueryType]:
4181
4218
  State: booleanValidatorOptional,
4182
4219
  }, { isOptional: true, emptyOk: true }),
4183
4220
  range: objectValidator<AnalyticsQueryRange<any>>({
4184
- interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly']),
4221
+ interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly', 'Hourly']),
4185
4222
  key: exactMatchValidator<AnalyticsQueryRangeKeyForType['Medications']>(['Created At', 'Updated At']),
4186
4223
  }, { isOptional: true, emptyOk: true })
4187
4224
  }),
@@ -4206,7 +4243,7 @@ export const analyticsQueryValidator = orValidator<{ [K in AnalyticsQueryType]:
4206
4243
  State: booleanValidatorOptional,
4207
4244
  }, { isOptional: true, emptyOk: true }),
4208
4245
  range: objectValidator<AnalyticsQueryRange<any>>({
4209
- interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly']),
4246
+ interval: exactMatchValidator<AnalyticsQueryRangeInterval>(['Daily', 'Weekly', 'Monthly', 'Hourly']),
4210
4247
  key: exactMatchValidator<AnalyticsQueryRangeKeyForType['Files']>(['Created At', 'Updated At']),
4211
4248
  }, { isOptional: true, emptyOk: true })
4212
4249
  }),
@@ -4430,6 +4467,7 @@ export const tableViewColumnsValidator = listValidatorEmptyOk(objectValidator<Ta
4430
4467
  field: stringValidator100,
4431
4468
  width: numberValidatorOptional,
4432
4469
  type: stringValidatorOptionalEmptyOkay,
4470
+ wrap: stringValidatorOptional,
4433
4471
  }))
4434
4472
 
4435
4473
  export const formFieldCalloutConditionsValidator = listValidatorOptionalOrEmptyOk(objectValidator<FormFieldCalloutCondition>({