@xsolla/payment-client-core 0.2.75 → 0.2.76

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.
@@ -1,5 +1,6 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { TextControlConfig } from '../../controls/text-control.config';
3
+ import { cpfFormulaValidator } from '../../validators/cpf-formula-validator/cpf-formula.validator';
3
4
  import { Converter } from '../converter.abstract';
4
5
  import { TranslateHelper } from '../../../../../shared/translate/translate.helper';
5
6
  import * as i0 from "@angular/core";
@@ -8,6 +9,9 @@ export class CpfNumberConverter extends Converter {
8
9
  constructor(syncService) {
9
10
  super(syncService);
10
11
  }
12
+ getValidators(field) {
13
+ return super.getValidators(field).concat([cpfFormulaValidator]);
14
+ }
11
15
  createControlConfig(field) {
12
16
  const config = this.createDefaultControlConfig(TextControlConfig, field);
13
17
  config.maskConfig = {
@@ -29,4 +33,4 @@ export class CpfNumberConverter extends Converter {
29
33
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: CpfNumberConverter, decorators: [{
30
34
  type: Injectable
31
35
  }], ctorParameters: () => [{ type: i1.SyncService }] });
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BmLW51bWJlci5jb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wYXltZW50LWNsaWVudC1jb3JlL3NyYy9saWIvY29yZS9wYXltZW50L2Zvcm0vY29udmVydGVycy9jcGYtbnVtYmVyL2NwZi1udW1iZXIuY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7O0FBR25GLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxTQUFTO0lBQy9DLFlBQW1CLFdBQXdCO1FBQ3pDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRVMsbUJBQW1CLENBQUMsS0FBWTtRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFekUsTUFBTSxDQUFDLFVBQVUsR0FBRztZQUNsQixJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO1FBRUYsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFFN0IsTUFBTSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUNwQyxrQ0FBa0MsRUFDbEMsZ0JBQWdCLENBQ2pCLENBQUM7UUFFRixNQUFNLENBQUMsT0FBTyxHQUFHO1lBQ2YsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQ3JCLG1DQUFtQyxFQUNuQyx3Q0FBd0MsQ0FDekM7WUFDRCxLQUFLLEVBQUUsWUFBWTtTQUNwQixDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs4R0E5QlUsa0JBQWtCO2tIQUFsQixrQkFBa0I7OzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uLy4uLy4uL2ZpZWxkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTeW5jU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3JlcXVlc3RzL3N5bmMvc3luYy5zZXJ2aWNlJztcbmltcG9ydCB7IFRleHRDb250cm9sQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvdGV4dC1jb250cm9sLmNvbmZpZyc7XG5pbXBvcnQgeyBDb252ZXJ0ZXIgfSBmcm9tICcuLi9jb252ZXJ0ZXIuYWJzdHJhY3QnO1xuaW1wb3J0IHsgVHJhbnNsYXRlSGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkL3RyYW5zbGF0ZS90cmFuc2xhdGUuaGVscGVyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENwZk51bWJlckNvbnZlcnRlciBleHRlbmRzIENvbnZlcnRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzeW5jU2VydmljZTogU3luY1NlcnZpY2UpIHtcbiAgICBzdXBlcihzeW5jU2VydmljZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlQ29udHJvbENvbmZpZyhmaWVsZDogRmllbGQpOiBUZXh0Q29udHJvbENvbmZpZyB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jcmVhdGVEZWZhdWx0Q29udHJvbENvbmZpZyhUZXh0Q29udHJvbENvbmZpZywgZmllbGQpO1xuXG4gICAgY29uZmlnLm1hc2tDb25maWcgPSB7XG4gICAgICBtYXNrOiAnOTk5Ljk5OS45OTktOTknLFxuICAgICAgdW5tYXNrTW9kZWxWYWx1ZTogdHJ1ZSxcbiAgICAgIGd1aWRlOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uZmlnLmlucHV0TW9kZSA9ICdudW1lcmljJztcblxuICAgIGNvbmZpZy5wbGFjZWhvbGRlciA9IFRyYW5zbGF0ZUhlbHBlci50KFxuICAgICAgJ2NwZi1udW1iZXIuY29udmVydGVyLnBsYWNlaG9sZGVyJyxcbiAgICAgICcwMDAuMDAwLjAwMC0wMCdcbiAgICApO1xuXG4gICAgY29uZmlnLnRvb2x0aXAgPSB7XG4gICAgICB0ZXh0OiBUcmFuc2xhdGVIZWxwZXIudChcbiAgICAgICAgJ2NwZi1udW1iZXIuY29udmVydGVyLnRvb2x0aXAudGV4dCcsXG4gICAgICAgICdXaGVyZSB0byBmaW5kIHlvdXIgcmVnaXN0cmF0aW9uIG51bWJlcidcbiAgICAgICksXG4gICAgICBpbWFnZTogJ2NwZi1udW1iZXInLFxuICAgIH07XG5cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG4iXX0=
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BmLW51bWJlci5jb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wYXltZW50LWNsaWVudC1jb3JlL3NyYy9saWIvY29yZS9wYXltZW50L2Zvcm0vY29udmVydGVycy9jcGYtbnVtYmVyL2NwZi1udW1iZXIuY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDbkcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7O0FBR25GLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxTQUFTO0lBQy9DLFlBQW1CLFdBQXdCO1FBQ3pDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRU0sYUFBYSxDQUFDLEtBQVk7UUFDL0IsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRVMsbUJBQW1CLENBQUMsS0FBWTtRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFekUsTUFBTSxDQUFDLFVBQVUsR0FBRztZQUNsQixJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO1FBRUYsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFFN0IsTUFBTSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUNwQyxrQ0FBa0MsRUFDbEMsZ0JBQWdCLENBQ2pCLENBQUM7UUFFRixNQUFNLENBQUMsT0FBTyxHQUFHO1lBQ2YsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQ3JCLG1DQUFtQyxFQUNuQyx3Q0FBd0MsQ0FDekM7WUFDRCxLQUFLLEVBQUUsWUFBWTtTQUNwQixDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs4R0FsQ1Usa0JBQWtCO2tIQUFsQixrQkFBa0I7OzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vZmllbGQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFN5bmNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vcmVxdWVzdHMvc3luYy9zeW5jLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dENvbnRyb2xDb25maWcgfSBmcm9tICcuLi8uLi9jb250cm9scy90ZXh0LWNvbnRyb2wuY29uZmlnJztcbmltcG9ydCB7IGNwZkZvcm11bGFWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL2NwZi1mb3JtdWxhLXZhbGlkYXRvci9jcGYtZm9ybXVsYS52YWxpZGF0b3InO1xuaW1wb3J0IHsgQ29udmVydGVyIH0gZnJvbSAnLi4vY29udmVydGVyLmFic3RyYWN0JztcbmltcG9ydCB7IFRyYW5zbGF0ZUhlbHBlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlZC90cmFuc2xhdGUvdHJhbnNsYXRlLmhlbHBlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDcGZOdW1iZXJDb252ZXJ0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3Ioc3luY1NlcnZpY2U6IFN5bmNTZXJ2aWNlKSB7XG4gICAgc3VwZXIoc3luY1NlcnZpY2UpO1xuICB9XG5cbiAgcHVibGljIGdldFZhbGlkYXRvcnMoZmllbGQ6IEZpZWxkKTogVmFsaWRhdG9yRm5bXSB7XG4gICAgcmV0dXJuIHN1cGVyLmdldFZhbGlkYXRvcnMoZmllbGQpLmNvbmNhdChbY3BmRm9ybXVsYVZhbGlkYXRvcl0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbnRyb2xDb25maWcoZmllbGQ6IEZpZWxkKTogVGV4dENvbnRyb2xDb25maWcge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY3JlYXRlRGVmYXVsdENvbnRyb2xDb25maWcoVGV4dENvbnRyb2xDb25maWcsIGZpZWxkKTtcblxuICAgIGNvbmZpZy5tYXNrQ29uZmlnID0ge1xuICAgICAgbWFzazogJzk5OS45OTkuOTk5LTk5JyxcbiAgICAgIHVubWFza01vZGVsVmFsdWU6IHRydWUsXG4gICAgICBndWlkZTogZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbmZpZy5pbnB1dE1vZGUgPSAnbnVtZXJpYyc7XG5cbiAgICBjb25maWcucGxhY2Vob2xkZXIgPSBUcmFuc2xhdGVIZWxwZXIudChcbiAgICAgICdjcGYtbnVtYmVyLmNvbnZlcnRlci5wbGFjZWhvbGRlcicsXG4gICAgICAnMDAwLjAwMC4wMDAtMDAnXG4gICAgKTtcblxuICAgIGNvbmZpZy50b29sdGlwID0ge1xuICAgICAgdGV4dDogVHJhbnNsYXRlSGVscGVyLnQoXG4gICAgICAgICdjcGYtbnVtYmVyLmNvbnZlcnRlci50b29sdGlwLnRleHQnLFxuICAgICAgICAnV2hlcmUgdG8gZmluZCB5b3VyIHJlZ2lzdHJhdGlvbiBudW1iZXInXG4gICAgICApLFxuICAgICAgaW1hZ2U6ICdjcGYtbnVtYmVyJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuIl19
@@ -0,0 +1,55 @@
1
+ import { isEmptyInputValue } from '../is-empty-input-value.function';
2
+ import { isString } from '../../../../type-guards/is-string.function';
3
+ import { TranslateHelper } from '../../../../../shared/translate/translate.helper';
4
+ const cpfLength = 11;
5
+ const firstCheckDigitPosition = 9;
6
+ const secondCheckDigitPosition = 10;
7
+ const maxCheckDigit = 10;
8
+ const repeatedDigitsRegex = /^(\d)\1+$/;
9
+ const allowedCharactersRegex = /[^0-9 .-]+/;
10
+ const moduloDivisor = 11;
11
+ /**
12
+ * Checks number match CPF validation algorithm.
13
+ * Based on https://en.wikipedia.org/wiki/CPF_number
14
+ */
15
+ export const cpfFormulaValidator = ({ value }) => {
16
+ if (isEmptyInputValue(value) || !isString(value)) {
17
+ return null;
18
+ }
19
+ const error = {
20
+ rewritableError: {
21
+ message: TranslateHelper.t('cpf-number.converter.validation.pattern', 'Enter a valid CPF number'),
22
+ },
23
+ };
24
+ if (allowedCharactersRegex.test(value)) {
25
+ // accept only spaces, digits, dots and dashes
26
+ return error;
27
+ }
28
+ // Remove non-numeric characters from CPF
29
+ const cpf = value.replace(/\D/g, '');
30
+ // Check if CPF has 11 digits
31
+ if (cpf.length !== cpfLength) {
32
+ return error;
33
+ }
34
+ // Disallow CPFs with all same digits (e.g., "11111111111")
35
+ if (repeatedDigitsRegex.test(cpf)) {
36
+ return error;
37
+ }
38
+ function calculateCheckDigit(cpfNumber, checkDigitPosition) {
39
+ let sum = 0;
40
+ for (let i = 0; i < checkDigitPosition; i++) {
41
+ sum += parseInt(cpfNumber.charAt(i)) * (checkDigitPosition + 1 - i);
42
+ }
43
+ const checkDigit = (sum * maxCheckDigit) % moduloDivisor;
44
+ return checkDigit >= maxCheckDigit ? 0 : checkDigit;
45
+ }
46
+ // Validate the check digits
47
+ for (const position of [firstCheckDigitPosition, secondCheckDigitPosition]) {
48
+ const checkDigit = calculateCheckDigit(cpf, position);
49
+ if (checkDigit !== parseInt(cpf.charAt(position))) {
50
+ return error;
51
+ }
52
+ }
53
+ return null;
54
+ };
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BmLWZvcm11bGEudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcGF5bWVudC1jbGllbnQtY29yZS9zcmMvbGliL2NvcmUvcGF5bWVudC9mb3JtL3ZhbGlkYXRvcnMvY3BmLWZvcm11bGEtdmFsaWRhdG9yL2NwZi1mb3JtdWxhLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUdyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRW5GLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUNyQixNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUNwQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDekIsTUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUM7QUFDeEMsTUFBTSxzQkFBc0IsR0FBRyxZQUFZLENBQUM7QUFDNUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQ3pCOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtJQUM1RCxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQXFCO1FBQzlCLGVBQWUsRUFBRTtZQUNmLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUN4Qix5Q0FBeUMsRUFDekMsMEJBQTBCLENBQzNCO1NBQ0Y7S0FDRixDQUFDO0lBRUYsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2Qyw4Q0FBOEM7UUFDOUMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXJDLDZCQUE2QjtJQUM3QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsMkRBQTJEO0lBQzNELElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsU0FBUyxtQkFBbUIsQ0FDMUIsU0FBaUIsRUFDakIsa0JBQTBCO1FBRTFCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLEdBQUcsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsR0FBRyxhQUFhLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDekQsT0FBTyxVQUFVLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUN0RCxDQUFDO0lBRUQsNEJBQTRCO0lBQzVCLEtBQUssTUFBTSxRQUFRLElBQUksQ0FBQyx1QkFBdUIsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7UUFDM0UsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELElBQUksVUFBVSxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0VtcHR5SW5wdXRWYWx1ZSB9IGZyb20gJy4uL2lzLWVtcHR5LWlucHV0LXZhbHVlLmZ1bmN0aW9uJztcbmltcG9ydCB7IFZhbGlkYXRvckZuIH0gZnJvbSAnLi4vdmFsaWRhdG9yLWZuLnR5cGUnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJy4uL3ZhbGlkYXRpb24tZXJyb3JzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uLy4uLy4uLy4uL3R5cGUtZ3VhcmRzL2lzLXN0cmluZy5mdW5jdGlvbic7XG5pbXBvcnQgeyBUcmFuc2xhdGVIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZWQvdHJhbnNsYXRlL3RyYW5zbGF0ZS5oZWxwZXInO1xuXG5jb25zdCBjcGZMZW5ndGggPSAxMTtcbmNvbnN0IGZpcnN0Q2hlY2tEaWdpdFBvc2l0aW9uID0gOTtcbmNvbnN0IHNlY29uZENoZWNrRGlnaXRQb3NpdGlvbiA9IDEwO1xuY29uc3QgbWF4Q2hlY2tEaWdpdCA9IDEwO1xuY29uc3QgcmVwZWF0ZWREaWdpdHNSZWdleCA9IC9eKFxcZClcXDErJC87XG5jb25zdCBhbGxvd2VkQ2hhcmFjdGVyc1JlZ2V4ID0gL1teMC05IC4tXSsvO1xuY29uc3QgbW9kdWxvRGl2aXNvciA9IDExO1xuLyoqXG4gKiBDaGVja3MgbnVtYmVyIG1hdGNoIENQRiB2YWxpZGF0aW9uIGFsZ29yaXRobS5cbiAqIEJhc2VkIG9uIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NQRl9udW1iZXJcbiAqL1xuZXhwb3J0IGNvbnN0IGNwZkZvcm11bGFWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKHsgdmFsdWUgfSkgPT4ge1xuICBpZiAoaXNFbXB0eUlucHV0VmFsdWUodmFsdWUpIHx8ICFpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGVycm9yOiBWYWxpZGF0aW9uRXJyb3JzID0ge1xuICAgIHJld3JpdGFibGVFcnJvcjoge1xuICAgICAgbWVzc2FnZTogVHJhbnNsYXRlSGVscGVyLnQoXG4gICAgICAgICdjcGYtbnVtYmVyLmNvbnZlcnRlci52YWxpZGF0aW9uLnBhdHRlcm4nLFxuICAgICAgICAnRW50ZXIgYSB2YWxpZCBDUEYgbnVtYmVyJ1xuICAgICAgKSxcbiAgICB9LFxuICB9O1xuXG4gIGlmIChhbGxvd2VkQ2hhcmFjdGVyc1JlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgLy8gYWNjZXB0IG9ubHkgc3BhY2VzLCBkaWdpdHMsIGRvdHMgYW5kIGRhc2hlc1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIC8vIFJlbW92ZSBub24tbnVtZXJpYyBjaGFyYWN0ZXJzIGZyb20gQ1BGXG4gIGNvbnN0IGNwZiA9IHZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG5cbiAgLy8gQ2hlY2sgaWYgQ1BGIGhhcyAxMSBkaWdpdHNcbiAgaWYgKGNwZi5sZW5ndGggIT09IGNwZkxlbmd0aCkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIC8vIERpc2FsbG93IENQRnMgd2l0aCBhbGwgc2FtZSBkaWdpdHMgKGUuZy4sIFwiMTExMTExMTExMTFcIilcbiAgaWYgKHJlcGVhdGVkRGlnaXRzUmVnZXgudGVzdChjcGYpKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlQ2hlY2tEaWdpdChcbiAgICBjcGZOdW1iZXI6IHN0cmluZyxcbiAgICBjaGVja0RpZ2l0UG9zaXRpb246IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hlY2tEaWdpdFBvc2l0aW9uOyBpKyspIHtcbiAgICAgIHN1bSArPSBwYXJzZUludChjcGZOdW1iZXIuY2hhckF0KGkpKSAqIChjaGVja0RpZ2l0UG9zaXRpb24gKyAxIC0gaSk7XG4gICAgfVxuICAgIGNvbnN0IGNoZWNrRGlnaXQgPSAoc3VtICogbWF4Q2hlY2tEaWdpdCkgJSBtb2R1bG9EaXZpc29yO1xuICAgIHJldHVybiBjaGVja0RpZ2l0ID49IG1heENoZWNrRGlnaXQgPyAwIDogY2hlY2tEaWdpdDtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHRoZSBjaGVjayBkaWdpdHNcbiAgZm9yIChjb25zdCBwb3NpdGlvbiBvZiBbZmlyc3RDaGVja0RpZ2l0UG9zaXRpb24sIHNlY29uZENoZWNrRGlnaXRQb3NpdGlvbl0pIHtcbiAgICBjb25zdCBjaGVja0RpZ2l0ID0gY2FsY3VsYXRlQ2hlY2tEaWdpdChjcGYsIHBvc2l0aW9uKTtcbiAgICBpZiAoY2hlY2tEaWdpdCAhPT0gcGFyc2VJbnQoY3BmLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuIl19
@@ -4047,10 +4047,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
4047
4047
  type: Injectable
4048
4048
  }], ctorParameters: () => [{ type: SyncService }] });
4049
4049
 
4050
+ const cpfLength = 11;
4051
+ const firstCheckDigitPosition = 9;
4052
+ const secondCheckDigitPosition = 10;
4053
+ const maxCheckDigit = 10;
4054
+ const repeatedDigitsRegex = /^(\d)\1+$/;
4055
+ const allowedCharactersRegex = /[^0-9 .-]+/;
4056
+ const moduloDivisor = 11;
4057
+ /**
4058
+ * Checks number match CPF validation algorithm.
4059
+ * Based on https://en.wikipedia.org/wiki/CPF_number
4060
+ */
4061
+ const cpfFormulaValidator = ({ value }) => {
4062
+ if (isEmptyInputValue(value) || !isString(value)) {
4063
+ return null;
4064
+ }
4065
+ const error = {
4066
+ rewritableError: {
4067
+ message: TranslateHelper.t('cpf-number.converter.validation.pattern', 'Enter a valid CPF number'),
4068
+ },
4069
+ };
4070
+ if (allowedCharactersRegex.test(value)) {
4071
+ // accept only spaces, digits, dots and dashes
4072
+ return error;
4073
+ }
4074
+ // Remove non-numeric characters from CPF
4075
+ const cpf = value.replace(/\D/g, '');
4076
+ // Check if CPF has 11 digits
4077
+ if (cpf.length !== cpfLength) {
4078
+ return error;
4079
+ }
4080
+ // Disallow CPFs with all same digits (e.g., "11111111111")
4081
+ if (repeatedDigitsRegex.test(cpf)) {
4082
+ return error;
4083
+ }
4084
+ function calculateCheckDigit(cpfNumber, checkDigitPosition) {
4085
+ let sum = 0;
4086
+ for (let i = 0; i < checkDigitPosition; i++) {
4087
+ sum += parseInt(cpfNumber.charAt(i)) * (checkDigitPosition + 1 - i);
4088
+ }
4089
+ const checkDigit = (sum * maxCheckDigit) % moduloDivisor;
4090
+ return checkDigit >= maxCheckDigit ? 0 : checkDigit;
4091
+ }
4092
+ // Validate the check digits
4093
+ for (const position of [firstCheckDigitPosition, secondCheckDigitPosition]) {
4094
+ const checkDigit = calculateCheckDigit(cpf, position);
4095
+ if (checkDigit !== parseInt(cpf.charAt(position))) {
4096
+ return error;
4097
+ }
4098
+ }
4099
+ return null;
4100
+ };
4101
+
4050
4102
  class CpfNumberConverter extends Converter {
4051
4103
  constructor(syncService) {
4052
4104
  super(syncService);
4053
4105
  }
4106
+ getValidators(field) {
4107
+ return super.getValidators(field).concat([cpfFormulaValidator]);
4108
+ }
4054
4109
  createControlConfig(field) {
4055
4110
  const config = this.createDefaultControlConfig(TextControlConfig, field);
4056
4111
  config.maskConfig = {