@xsolla/payment-client-core 0.2.65 → 0.2.67

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.
Files changed (50) hide show
  1. package/esm2022/lib/core/payment/form/converters/birth-date/birth-date.converter.mjs +6 -5
  2. package/esm2022/lib/core/payment/form/converters/card-number/card-number.converter.mjs +5 -4
  3. package/esm2022/lib/core/payment/form/converters/checkbox/checkbox.converter.mjs +6 -2
  4. package/esm2022/lib/core/payment/form/converters/converter.abstract.mjs +6 -2
  5. package/esm2022/lib/core/payment/form/converters/cpf-name/cpf-name.converter.mjs +6 -5
  6. package/esm2022/lib/core/payment/form/converters/cvv/cvv.converter.mjs +5 -2
  7. package/esm2022/lib/core/payment/form/converters/street-number/street-number.converter.mjs +5 -2
  8. package/esm2022/lib/core/payment/form/converters/zip/zip.converter.mjs +8 -7
  9. package/esm2022/lib/core/payment/form/overrided-fields/fields-allowed-to-override.mjs +5 -0
  10. package/esm2022/lib/core/payment/form/overrided-fields/override-field-config.mjs +12 -0
  11. package/esm2022/lib/core/payment/form/validators/birth-date/birth-date.validator.mjs +6 -2
  12. package/esm2022/lib/core/payment/form/validators/card-expiration-date-validator/card-expiration-date.validator.mjs +31 -10
  13. package/esm2022/lib/core/payment/form/validators/card-month/card-month.validator.mjs +20 -7
  14. package/esm2022/lib/core/payment/form/validators/card-year/card-year.validator.mjs +20 -7
  15. package/esm2022/lib/core/payment/form/validators/convert.function.mjs +7 -6
  16. package/esm2022/lib/core/payment/form/validators/coupon/coupon-validator.mjs +6 -3
  17. package/esm2022/lib/core/payment/form/validators/credit-card-length/credit-card-max-length.validator.mjs +37 -0
  18. package/esm2022/lib/core/payment/form/validators/credit-card-length/credit-card-min-length.validator.mjs +13 -8
  19. package/esm2022/lib/core/payment/form/validators/email/email-validator.mjs +5 -2
  20. package/esm2022/lib/core/payment/form/validators/luhn-formula-validator/luhn-formula.validator.mjs +6 -2
  21. package/esm2022/lib/core/payment/form/validators/max-length-validator.mjs +6 -2
  22. package/esm2022/lib/core/payment/form/validators/min-length-validator.mjs +6 -2
  23. package/esm2022/lib/core/payment/form/validators/phone-validator.mjs +5 -2
  24. package/esm2022/lib/core/payment/form/validators/required/required.validator.mjs +5 -2
  25. package/esm2022/lib/core/payment/form/validators/validation-error-id.enum.mjs +24 -0
  26. package/esm2022/lib/core/payment/form/validators/validation-error-params.interface.mjs +2 -0
  27. package/esm2022/lib/core/payment/form/validators/validation-error.interface.mjs +1 -1
  28. package/esm2022/lib/core/payment/form/validators/validators.module.mjs +5 -4
  29. package/esm2022/lib/core/payment/payment-configuration.interface.mjs +1 -1
  30. package/esm2022/lib/core/payment/payment.service.mjs +22 -1
  31. package/esm2022/lib/core/type-guards/is-object.function.mjs +4 -0
  32. package/esm2022/lib/core/type-guards/is-xps-boolean.function.mjs +4 -0
  33. package/fesm2022/xsolla-payment-client-core.mjs +243 -69
  34. package/fesm2022/xsolla-payment-client-core.mjs.map +1 -1
  35. package/lib/core/payment/form/converters/card-number/card-number.converter.d.ts +2 -1
  36. package/lib/core/payment/form/overrided-fields/fields-allowed-to-override.d.ts +2 -0
  37. package/lib/core/payment/form/overrided-fields/override-field-config.d.ts +14 -0
  38. package/lib/core/payment/form/validators/convert.function.d.ts +2 -1
  39. package/lib/core/payment/form/validators/credit-card-length/credit-card-max-length.validator.d.ts +12 -0
  40. package/lib/core/payment/form/validators/credit-card-length/credit-card-min-length.validator.d.ts +2 -2
  41. package/lib/core/payment/form/validators/validation-error-id.enum.d.ts +22 -0
  42. package/lib/core/payment/form/validators/validation-error-params.interface.d.ts +6 -0
  43. package/lib/core/payment/form/validators/validation-error.interface.d.ts +2 -0
  44. package/lib/core/payment/payment-configuration.interface.d.ts +7 -0
  45. package/lib/core/payment/payment.service.d.ts +1 -0
  46. package/lib/core/type-guards/is-object.function.d.ts +1 -0
  47. package/lib/core/type-guards/is-xps-boolean.function.d.ts +2 -0
  48. package/package.json +1 -1
  49. package/xsolla-payment-client-core-0.2.67.tgz +0 -0
  50. package/xsolla-payment-client-core-0.2.65.tgz +0 -0
@@ -710,6 +710,25 @@ var ErrorTags;
710
710
  ErrorTags["PAYTM"] = "paytm";
711
711
  })(ErrorTags || (ErrorTags = {}));
712
712
 
713
+ const fieldsAllowedToOverride = new Set([
714
+ FieldNames.allowSubscription,
715
+ ]);
716
+
717
+ function isXpsBoolean(value) {
718
+ return value === "1" /* XpsBoolean.true */ || value === "0" /* XpsBoolean.false */;
719
+ }
720
+
721
+ /**
722
+ * Configuration for fields that can be overridden by partner.
723
+ * We can extend this configuration with additional fields in the future.
724
+ */
725
+ const overrideFieldConfigs = {
726
+ allowSubscription: {
727
+ validator: isXpsBoolean,
728
+ defaultValue: "0" /* XpsBoolean.false */,
729
+ },
730
+ };
731
+
713
732
  class TaggedError extends Error {
714
733
  constructor(message, tags) {
715
734
  super(message);
@@ -3280,28 +3299,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
3280
3299
  args: [syncResponseFactoryToken]
3281
3300
  }] }, { type: XpsApiService }, { type: NextActionService }, { type: SettingsService }, { type: XpsResponseErrorsMappingService }, { type: EncryptCreditCardService }, { type: ShowErrorsActionCreator }, { type: UserBehaviourAnalyticsService }, { type: PaymentSettingsService }] });
3282
3301
 
3283
- function convert(validator, message) {
3302
+ function isObject(value) {
3303
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3304
+ }
3305
+
3306
+ function convert(validator, message, params) {
3284
3307
  return (control) => {
3285
3308
  const errors = validator(control);
3286
- if (!errors) {
3287
- return errors;
3288
- }
3309
+ if (!errors)
3310
+ return null;
3289
3311
  const firstErrorKey = Object.keys(errors)[0];
3290
3312
  const firstError = errors[firstErrorKey];
3291
- const error = typeof firstError === 'object' && firstError !== null ? firstError : {};
3313
+ const error = isObject(firstError) ? firstError : {};
3292
3314
  error.message = message;
3315
+ error.params = params;
3293
3316
  errors[firstErrorKey] = error;
3294
3317
  return errors;
3295
3318
  };
3296
3319
  }
3297
3320
 
3321
+ var ValidationErrorId;
3322
+ (function (ValidationErrorId) {
3323
+ ValidationErrorId["birthDatePattern"] = "birthDatePattern";
3324
+ ValidationErrorId["expirationLength"] = "expirationLength";
3325
+ ValidationErrorId["expirationMonthPattern"] = "expirationMonthPattern";
3326
+ ValidationErrorId["expirationMinMonth"] = "expirationMinMonth";
3327
+ ValidationErrorId["expirationMaxMonth"] = "expirationMaxMonth";
3328
+ ValidationErrorId["expirationYearPattern"] = "expirationYearPattern";
3329
+ ValidationErrorId["expirationMinYear"] = "expirationMinYear";
3330
+ ValidationErrorId["expirationMaxYear"] = "expirationMaxYear";
3331
+ ValidationErrorId["couponPattern"] = "couponPattern";
3332
+ ValidationErrorId["emailPattern"] = "emailPattern";
3333
+ ValidationErrorId["cardNumberPattern"] = "cardNumberPattern";
3334
+ ValidationErrorId["required"] = "required";
3335
+ ValidationErrorId["minLength"] = "minLength";
3336
+ ValidationErrorId["maxLength"] = "maxLength";
3337
+ ValidationErrorId["cpfNumberPattern"] = "cpfNumberPattern";
3338
+ ValidationErrorId["cvvPattern"] = "cvvPattern";
3339
+ ValidationErrorId["phonePattern"] = "phonePattern";
3340
+ ValidationErrorId["buildingNumberPattern"] = "buildingNumberPattern";
3341
+ ValidationErrorId["zipPattern"] = "zipPattern";
3342
+ ValidationErrorId["dataPattern"] = "dataPattern";
3343
+ })(ValidationErrorId || (ValidationErrorId = {}));
3344
+
3298
3345
  const emailRegexp = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i; // eslint-disable-line
3299
3346
  function convertedEmailValidator() {
3300
- return convert(Validators.pattern(emailRegexp), 'Enter a valid email');
3347
+ return convert(Validators.pattern(emailRegexp), 'Enter a valid email', {
3348
+ id: ValidationErrorId.emailPattern,
3349
+ });
3301
3350
  }
3302
3351
 
3303
3352
  function convertedRequiredValidator() {
3304
- return convert(Validators.required, 'Required');
3353
+ return convert(Validators.required, 'Required', {
3354
+ id: ValidationErrorId.required,
3355
+ });
3305
3356
  }
3306
3357
 
3307
3358
  class Converter {
@@ -3334,7 +3385,10 @@ class Converter {
3334
3385
  const errorMessage = field.validation_error_msg
3335
3386
  ? field.validation_error_msg
3336
3387
  : 'Enter valid data';
3337
- validators.push(convert(Validators.pattern(pattern), errorMessage));
3388
+ validators.push(convert(Validators.pattern(pattern), errorMessage, {
3389
+ id: ValidationErrorId.dataPattern,
3390
+ defaultMessage: field.validation_error_msg,
3391
+ }));
3338
3392
  }
3339
3393
  }
3340
3394
  return validators;
@@ -3425,6 +3479,20 @@ class TextControlConfig extends ControlConfig {
3425
3479
  }
3426
3480
  }
3427
3481
 
3482
+ function minLengthValidator(minLength) {
3483
+ return convert(Validators.minLength(minLength), `Enter at least ${minLength} characters`, {
3484
+ id: ValidationErrorId.minLength,
3485
+ minLength,
3486
+ });
3487
+ }
3488
+
3489
+ function maxLengthValidator(maxLength) {
3490
+ return convert(Validators.maxLength(maxLength), `Enter no more than ${maxLength} characters`, {
3491
+ id: ValidationErrorId.maxLength,
3492
+ maxLength,
3493
+ });
3494
+ }
3495
+
3428
3496
  const restrictedValueValidator = (restrictedValue) => {
3429
3497
  return ({ value }) => {
3430
3498
  return value !== restrictedValue ? null : { valueAllowed: false };
@@ -3447,12 +3515,11 @@ class ZipConverter extends Converter {
3447
3515
  const maxLength = this.isUsCountry ? this.usCountryLength : this.maxLength;
3448
3516
  const validators = super
3449
3517
  .getValidators(field)
3450
- .concat([
3451
- convert(Validators.minLength(minLength), `Enter at least ${minLength} characters`),
3452
- convert(Validators.maxLength(maxLength), `Enter no more than ${maxLength} characters`),
3453
- ]);
3518
+ .concat([minLengthValidator(minLength), maxLengthValidator(maxLength)]);
3454
3519
  if (this.isUsCountry) {
3455
- validators.push(convert(restrictedValueValidator('00000'), 'Enter a valid ZIP code'));
3520
+ validators.push(convert(restrictedValueValidator('00000'), 'Enter a valid ZIP code', {
3521
+ id: ValidationErrorId.zipPattern,
3522
+ }));
3456
3523
  }
3457
3524
  return validators;
3458
3525
  }
@@ -3505,7 +3572,10 @@ const luhnFormulaValidator = ({ value }) => {
3505
3572
  }
3506
3573
  const error = {
3507
3574
  rewritableError: {
3508
- message: `Enter a valid card number`,
3575
+ message: 'Enter a valid card number',
3576
+ params: {
3577
+ id: ValidationErrorId.cardNumberPattern,
3578
+ },
3509
3579
  },
3510
3580
  };
3511
3581
  if (/[^0-9 -]+/.test(value)) {
@@ -3542,6 +3612,37 @@ class CardNumberConfig extends ControlConfig {
3542
3612
  }
3543
3613
  }
3544
3614
 
3615
+ class CreditCardMaxLengthValidator {
3616
+ constructor(creditService) {
3617
+ this.creditService = creditService;
3618
+ this.validate = (field) => {
3619
+ if (isEmptyInputValue(field.value) || !isString(field.value)) {
3620
+ return null;
3621
+ }
3622
+ const length = field.value.length;
3623
+ const cardType = this.creditService.getTypeByNumber(field.value);
3624
+ const { maxLength } = this.creditService.getCreditCardSettings(cardType);
3625
+ if (length <= maxLength)
3626
+ return null;
3627
+ return {
3628
+ rewritableError: {
3629
+ message: `Enter no more than ${maxLength} characters`,
3630
+ number: maxLength,
3631
+ params: {
3632
+ id: ValidationErrorId.maxLength,
3633
+ maxLength,
3634
+ },
3635
+ },
3636
+ };
3637
+ };
3638
+ }
3639
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CreditCardMaxLengthValidator, deps: [{ token: CreditCardService }], target: i0.ɵɵFactoryTarget.Injectable }); }
3640
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CreditCardMaxLengthValidator }); }
3641
+ }
3642
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CreditCardMaxLengthValidator, decorators: [{
3643
+ type: Injectable
3644
+ }], ctorParameters: () => [{ type: CreditCardService }] });
3645
+
3545
3646
  class CreditCardMinLengthValidator {
3546
3647
  constructor(creditService) {
3547
3648
  this.creditService = creditService;
@@ -3552,14 +3653,18 @@ class CreditCardMinLengthValidator {
3552
3653
  const length = field.value.length;
3553
3654
  const cardType = this.creditService.getTypeByNumber(field.value);
3554
3655
  const { minLength } = this.creditService.getCreditCardSettings(cardType);
3555
- return length < minLength
3556
- ? {
3557
- rewritableError: {
3558
- message: `Enter at least ${minLength} characters`,
3559
- number: minLength,
3656
+ if (length >= minLength)
3657
+ return null;
3658
+ return {
3659
+ rewritableError: {
3660
+ message: `Enter at least ${minLength} characters`,
3661
+ number: minLength,
3662
+ params: {
3663
+ id: ValidationErrorId.minLength,
3664
+ minLength,
3560
3665
  },
3561
- }
3562
- : null;
3666
+ },
3667
+ };
3563
3668
  };
3564
3669
  }
3565
3670
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CreditCardMinLengthValidator, deps: [{ token: CreditCardService }], target: i0.ɵɵFactoryTarget.Injectable }); }
@@ -3600,12 +3705,12 @@ class CardNumberConverter extends Converter {
3600
3705
  getDataType() {
3601
3706
  return 'text';
3602
3707
  }
3603
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CardNumberConverter, deps: [{ token: SyncService }, { token: CreditCardMinLengthValidator }, { token: CreditCardMinLengthValidator }], target: i0.ɵɵFactoryTarget.Injectable }); }
3708
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CardNumberConverter, deps: [{ token: SyncService }, { token: CreditCardMaxLengthValidator }, { token: CreditCardMinLengthValidator }], target: i0.ɵɵFactoryTarget.Injectable }); }
3604
3709
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CardNumberConverter }); }
3605
3710
  }
3606
3711
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CardNumberConverter, decorators: [{
3607
3712
  type: Injectable
3608
- }], ctorParameters: () => [{ type: SyncService }, { type: CreditCardMinLengthValidator }, { type: CreditCardMinLengthValidator }] });
3713
+ }], ctorParameters: () => [{ type: SyncService }, { type: CreditCardMaxLengthValidator }, { type: CreditCardMinLengthValidator }] });
3609
3714
 
3610
3715
  const maxMonths$1 = 12;
3611
3716
  const getMinMonth$1 = (parsedYear) => {
@@ -3615,9 +3720,10 @@ const getMinMonth$1 = (parsedYear) => {
3615
3720
  minMonth = year === today.getFullYear() ? today.getMonth() + 1 : 1;
3616
3721
  return minMonth;
3617
3722
  };
3618
- const sendErrMessage$2 = (fn) => ({
3723
+ const sendErrMessage$2 = (message, params) => ({
3619
3724
  cardMonthExpiration: {
3620
- message: fn,
3725
+ message,
3726
+ params,
3621
3727
  },
3622
3728
  });
3623
3729
  function cardMonthValidator(formState) {
@@ -3629,16 +3735,27 @@ function cardMonthValidator(formState) {
3629
3735
  const twoDigitsRegex = new RegExp(/^\d{2}$/);
3630
3736
  const fieldCommonLength = 2;
3631
3737
  if (value.length !== fieldCommonLength) {
3632
- return sendErrMessage$2(`Enter ${fieldCommonLength} characters`);
3738
+ return sendErrMessage$2(`Enter ${fieldCommonLength} characters`, {
3739
+ id: ValidationErrorId.expirationLength,
3740
+ requiredLength: fieldCommonLength,
3741
+ });
3633
3742
  }
3634
3743
  if (!twoDigitsRegex.test(value)) {
3635
- return sendErrMessage$2(`Enter a valid expiration month`);
3744
+ return sendErrMessage$2('Enter a valid expiration month', {
3745
+ id: ValidationErrorId.expirationMonthPattern,
3746
+ });
3636
3747
  }
3637
3748
  if (Number(value) < minMonth) {
3638
- return sendErrMessage$2(`Enter a month greater than or equal to ${minMonth}`);
3749
+ return sendErrMessage$2(`Enter a month greater than or equal to ${minMonth}`, {
3750
+ id: ValidationErrorId.expirationMinMonth,
3751
+ minMonth,
3752
+ });
3639
3753
  }
3640
3754
  if (Number(value) > maxMonths$1) {
3641
- return sendErrMessage$2(`Enter a month less than or equal to ${maxMonths$1}`);
3755
+ return sendErrMessage$2(`Enter a month less than or equal to ${maxMonths$1}`, {
3756
+ id: ValidationErrorId.expirationMaxMonth,
3757
+ maxMonth: maxMonths$1,
3758
+ });
3642
3759
  }
3643
3760
  return null;
3644
3761
  };
@@ -3685,7 +3802,9 @@ class CvvConverter extends Converter {
3685
3802
  getValidators(field, formState) {
3686
3803
  const validators = super.getValidators(field);
3687
3804
  const activeCardType = formState ? formState.activeCardType : null;
3688
- const getPatternValidator = (pattern) => convert(Validators.pattern(pattern), `Enter a valid CVV/CVC`);
3805
+ const getPatternValidator = (pattern) => convert(Validators.pattern(pattern), 'Enter a valid CVV/CVC', {
3806
+ id: ValidationErrorId.cvvPattern,
3807
+ });
3689
3808
  switch (activeCardType) {
3690
3809
  case CreditCardTypes.AMERICAN_EXPRESS: {
3691
3810
  this.maxFieldLength = 4;
@@ -3746,7 +3865,10 @@ const birthdateValidator = ({ value }) => {
3746
3865
  }
3747
3866
  const error = {
3748
3867
  invalidBirthDate: {
3749
- message: `Enter a valid birth date`,
3868
+ message: 'Enter a valid birth date',
3869
+ params: {
3870
+ id: ValidationErrorId.birthDatePattern,
3871
+ },
3750
3872
  },
3751
3873
  };
3752
3874
  const dateArr = value.split('/');
@@ -3781,10 +3903,10 @@ class BirthDateConverter extends Converter {
3781
3903
  super(syncService);
3782
3904
  }
3783
3905
  getValidators(field) {
3784
- return super
3785
- .getValidators(field)
3786
- .concat([
3787
- convert(Validators.pattern(/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/), `Enter a valid birth date`),
3906
+ return super.getValidators(field).concat([
3907
+ convert(Validators.pattern(/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/), 'Enter a valid birth date', {
3908
+ id: ValidationErrorId.birthDatePattern,
3909
+ }),
3788
3910
  birthdateValidator,
3789
3911
  ]);
3790
3912
  }
@@ -3833,10 +3955,10 @@ class CpfNameConverter extends Converter {
3833
3955
  super(syncService);
3834
3956
  }
3835
3957
  getValidators(field) {
3836
- return super
3837
- .getValidators(field)
3838
- .concat([
3839
- convert(Validators.pattern(cpfNameRegex), `Enter a valid name`),
3958
+ return super.getValidators(field).concat([
3959
+ convert(Validators.pattern(cpfNameRegex), 'Enter a valid CPF number', {
3960
+ id: ValidationErrorId.cpfNumberPattern,
3961
+ }),
3840
3962
  ]);
3841
3963
  }
3842
3964
  createControlConfig(field) {
@@ -3887,7 +4009,9 @@ class StreetNumberConverter extends Converter {
3887
4009
  getValidators(field, formState) {
3888
4010
  const validators = super.getValidators(field);
3889
4011
  if (formState?.country === 'BL') {
3890
- validators.push(convert(restrictedValueValidator('0'), `Enter a valid building number`));
4012
+ validators.push(convert(restrictedValueValidator('0'), 'Enter a valid building number', {
4013
+ id: ValidationErrorId.buildingNumberPattern,
4014
+ }));
3891
4015
  }
3892
4016
  return validators;
3893
4017
  }
@@ -3931,7 +4055,10 @@ class CheckboxConverter extends Converter {
3931
4055
  getValidators(field) {
3932
4056
  const validators = [];
3933
4057
  if (field.isMandatory === this.checkedValue) {
3934
- validators.push(convert(restrictedValueValidator(this.uncheckedValue), 'validation_message_required_checkbox'));
4058
+ validators.push(convert(restrictedValueValidator(this.uncheckedValue), field.validation_error_msg || 'Required', {
4059
+ id: ValidationErrorId.required,
4060
+ defaultMessage: field.validation_error_msg,
4061
+ }));
3935
4062
  }
3936
4063
  return validators;
3937
4064
  }
@@ -4044,8 +4171,10 @@ class CouponControlConfig extends ControlConfig {
4044
4171
  }
4045
4172
  }
4046
4173
 
4047
- function couponValidator(message = `Enter a valid promo code`) {
4048
- return convert(Validators.pattern(/^[0-9a-z_-]+$/i), message);
4174
+ function couponValidator(message = 'Enter a valid promo code') {
4175
+ return convert(Validators.pattern(/^[0-9a-z_-]+$/i), message, {
4176
+ id: ValidationErrorId.couponPattern,
4177
+ });
4049
4178
  }
4050
4179
 
4051
4180
  class CouponConverter extends Converter {
@@ -4067,9 +4196,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
4067
4196
  type: Injectable
4068
4197
  }], ctorParameters: () => [{ type: SyncService }] });
4069
4198
 
4070
- const sendErrMessage$1 = (fn) => ({
4199
+ const sendErrMessage$1 = (message, params) => ({
4071
4200
  cardYearExpiration: {
4072
- message: fn,
4201
+ message,
4202
+ params,
4073
4203
  },
4074
4204
  });
4075
4205
  const getLastCharactersInYear$1 = (str = new Date().getFullYear().toString()) => {
@@ -4086,17 +4216,28 @@ function cardYearValidator(control) {
4086
4216
  const twoDigitsRegex = new RegExp(/^\d{2}$/);
4087
4217
  const fieldCommonLength = 2;
4088
4218
  if (value.length !== fieldCommonLength) {
4089
- return sendErrMessage$1(`Enter ${fieldCommonLength} characters`);
4219
+ return sendErrMessage$1(`Enter ${fieldCommonLength} characters`, {
4220
+ id: ValidationErrorId.expirationLength,
4221
+ requiredLength: fieldCommonLength,
4222
+ });
4090
4223
  }
4091
4224
  if (!twoDigitsRegex.test(value)) {
4092
- return sendErrMessage$1(`Enter a valid expiration year`);
4225
+ return sendErrMessage$1('Enter a valid expiration year', {
4226
+ id: ValidationErrorId.expirationYearPattern,
4227
+ });
4093
4228
  }
4094
4229
  if (Number(value) < minYear) {
4095
- return sendErrMessage$1(`Enter a year greater than or equal to ${minYear}`);
4230
+ return sendErrMessage$1(`Enter a year greater than or equal to ${minYear}`, {
4231
+ id: ValidationErrorId.expirationMinYear,
4232
+ minYear,
4233
+ });
4096
4234
  }
4097
4235
  const maxValidYear = minYear + maxYearsCount$1;
4098
4236
  if (Number(value) > maxValidYear) {
4099
- return sendErrMessage$1(`Enter a year less than or equal to ${maxValidYear}`);
4237
+ return sendErrMessage$1(`Enter a year less than or equal to ${maxValidYear}`, {
4238
+ id: ValidationErrorId.expirationMaxYear,
4239
+ maxYear: maxValidYear,
4240
+ });
4100
4241
  }
4101
4242
  return null;
4102
4243
  }
@@ -4134,15 +4275,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
4134
4275
  }], ctorParameters: () => [{ type: SyncService }] });
4135
4276
 
4136
4277
  function phoneValidator() {
4137
- return convert(Validators.pattern(/^\d*$/), 'Enter a valid phone');
4138
- }
4139
-
4140
- function minLengthValidator(minLength) {
4141
- return convert(Validators.minLength(minLength), `Enter at least ${minLength} characters`);
4142
- }
4143
-
4144
- function maxLengthValidator(maxLength) {
4145
- return convert(Validators.maxLength(maxLength), `Enter no more than ${maxLength} characters`);
4278
+ return convert(Validators.pattern(/^\d*$/), 'Enter a valid phone', {
4279
+ id: ValidationErrorId.phonePattern,
4280
+ });
4146
4281
  }
4147
4282
 
4148
4283
  class PhoneControlConfig extends ControlConfig {
@@ -4191,9 +4326,10 @@ const getMinMonth = (parsedYear) => {
4191
4326
  }
4192
4327
  return minMonth;
4193
4328
  };
4194
- const sendErrMessage = (fn) => ({
4329
+ const sendErrMessage = (message, params) => ({
4195
4330
  rewritableError: {
4196
- message: fn,
4331
+ message,
4332
+ params,
4197
4333
  },
4198
4334
  });
4199
4335
  const getLastCharactersInYear = (str = new Date().getFullYear().toString()) => {
@@ -4218,26 +4354,45 @@ function cardExpValidator(control) {
4218
4354
  const fieldCommonLength = 4;
4219
4355
  const trickyFieldLength = fieldCommonLength + 1;
4220
4356
  if (value.length !== trickyFieldLength) {
4221
- return sendErrMessage(`Enter ${fieldCommonLength} characters`);
4357
+ return sendErrMessage(`Enter ${fieldCommonLength} characters`, {
4358
+ id: ValidationErrorId.expirationLength,
4359
+ requiredLength: fieldCommonLength,
4360
+ });
4222
4361
  }
4223
4362
  if (!twoDigitsRegex.test(month)) {
4224
- return sendErrMessage('Enter a valid expiration month');
4363
+ return sendErrMessage('Enter a valid expiration month', {
4364
+ id: ValidationErrorId.expirationMonthPattern,
4365
+ });
4225
4366
  }
4226
4367
  if (Number(month) < minMonth) {
4227
- return sendErrMessage(`Enter a month greater than or equal to ${minMonth}`);
4368
+ return sendErrMessage(`Enter a month greater than or equal to ${minMonth}`, {
4369
+ id: ValidationErrorId.expirationMinMonth,
4370
+ minMonth,
4371
+ });
4228
4372
  }
4229
4373
  if (Number(month) > maxMonths) {
4230
- return sendErrMessage(`Enter a month less than or equal to ${maxMonths}`);
4374
+ return sendErrMessage(`Enter a month less than or equal to ${maxMonths}`, {
4375
+ id: ValidationErrorId.expirationMaxMonth,
4376
+ maxMonth: maxMonths,
4377
+ });
4231
4378
  }
4232
4379
  if (!twoDigitsRegex.test(year)) {
4233
- return sendErrMessage(`Enter a valid expiration year`);
4380
+ return sendErrMessage('Enter a valid expiration year', {
4381
+ id: ValidationErrorId.expirationYearPattern,
4382
+ });
4234
4383
  }
4235
4384
  if (Number(year) < minYear) {
4236
- return sendErrMessage(`Enter a year greater than or equal to ${minYear}`);
4385
+ return sendErrMessage(`Enter a year greater than or equal to ${minYear}`, {
4386
+ id: ValidationErrorId.expirationMinYear,
4387
+ minYear,
4388
+ });
4237
4389
  }
4238
4390
  const maxValidYear = minYear + maxYearsCount;
4239
4391
  if (Number(year) > maxValidYear) {
4240
- return sendErrMessage(`Enter a year less than or equal to ${maxValidYear}`);
4392
+ return sendErrMessage(`Enter a year less than or equal to ${maxValidYear}`, {
4393
+ id: ValidationErrorId.expirationMaxYear,
4394
+ maxYear: maxValidYear,
4395
+ });
4241
4396
  }
4242
4397
  return null;
4243
4398
  }
@@ -6852,6 +7007,7 @@ class PaymentService {
6852
7007
  this.initializeBehaviourStrategies(config);
6853
7008
  this.emitFormResponse(this.data);
6854
7009
  this.fields = this.getFields();
7010
+ this.setupInitialFieldValues();
6855
7011
  this.form = this.formService.createForm(this.fields);
6856
7012
  this.updatePidConfig();
6857
7013
  this.setupSyncService(this.form, this.fields, config);
@@ -6921,6 +7077,24 @@ class PaymentService {
6921
7077
  this.syncService.setup(this.form, this.fields, this.config);
6922
7078
  return submitResponse;
6923
7079
  }
7080
+ setupInitialFieldValues() {
7081
+ const fieldsToOverride = this.config.overrideFormFields;
7082
+ if (!fieldsToOverride)
7083
+ return;
7084
+ const overridableNames = new Set(Object.keys(fieldsToOverride).filter((name) => fieldsAllowedToOverride.has(name)));
7085
+ for (const field of this.fields) {
7086
+ const fieldName = field.name;
7087
+ if (!overridableNames.has(fieldName))
7088
+ continue;
7089
+ const config = overrideFieldConfigs[fieldName];
7090
+ if (!config)
7091
+ continue;
7092
+ const overriddenValue = fieldsToOverride[fieldName]?.initialValue;
7093
+ field.value = String(config.validator(overriddenValue)
7094
+ ? overriddenValue
7095
+ : config.defaultValue);
7096
+ }
7097
+ }
6924
7098
  getFields() {
6925
7099
  if (this.data instanceof SubmitResponse) {
6926
7100
  return this.data.fields ?? [];
@@ -8119,14 +8293,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
8119
8293
  class ValidatorsModule {
8120
8294
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ValidatorsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
8121
8295
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.3", ngImport: i0, type: ValidatorsModule, imports: [CommonModule] }); }
8122
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ValidatorsModule, providers: [CreditCardMinLengthValidator], imports: [CommonModule] }); }
8296
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ValidatorsModule, providers: [CreditCardMinLengthValidator, CreditCardMaxLengthValidator], imports: [CommonModule] }); }
8123
8297
  }
8124
8298
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ValidatorsModule, decorators: [{
8125
8299
  type: NgModule,
8126
8300
  args: [{
8127
8301
  declarations: [],
8128
8302
  imports: [CommonModule],
8129
- providers: [CreditCardMinLengthValidator],
8303
+ providers: [CreditCardMinLengthValidator, CreditCardMaxLengthValidator],
8130
8304
  }]
8131
8305
  }] });
8132
8306