@digigov/form 1.1.5-496927f3 → 1.2.0-01ea6f24

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 (32) hide show
  1. package/Questions/__snapshots__/index.spec.tsx.snap +30 -30
  2. package/cjs/Questions/__snapshots__/index.spec.tsx.snap +30 -30
  3. package/cjs/inputs/ImageInput/index.js +2 -2
  4. package/cjs/inputs/Input/Input.stories/index.js +12 -0
  5. package/cjs/inputs/Input/__stories__/LandlineNumber/index.js +36 -0
  6. package/cjs/inputs/Input/__stories__/MobilePhone/index.js +4 -0
  7. package/cjs/inputs/Input/__stories__/PhoneNumber/index.js +4 -1
  8. package/cjs/lazy/index.js +517 -0
  9. package/cjs/validators/utils/phone/index.js +94 -70
  10. package/index.js +1 -1
  11. package/inputs/ImageInput/index.js +2 -2
  12. package/inputs/Input/Input.stories/index.js +1 -0
  13. package/inputs/Input/Input.stories.d.ts +1 -0
  14. package/inputs/Input/__stories__/LandlineNumber/index.js +26 -0
  15. package/inputs/Input/__stories__/LandlineNumber/package.json +6 -0
  16. package/inputs/Input/__stories__/LandlineNumber.d.ts +3 -0
  17. package/inputs/Input/__stories__/MobilePhone/index.js +4 -0
  18. package/inputs/Input/__stories__/PhoneNumber/index.js +4 -1
  19. package/lazy/index.js +395 -0
  20. package/lazy/package.json +6 -0
  21. package/lazy.d.ts +69 -0
  22. package/package.json +4 -5
  23. package/src/Questions/__snapshots__/index.spec.tsx.snap +30 -30
  24. package/src/inputs/ImageInput/index.tsx +2 -2
  25. package/src/inputs/Input/Input.stories.js +1 -0
  26. package/src/inputs/Input/__stories__/LandlineNumber.tsx +27 -0
  27. package/src/inputs/Input/__stories__/MobilePhone.tsx +4 -0
  28. package/src/inputs/Input/__stories__/PhoneNumber.tsx +4 -1
  29. package/src/lazy.js +60 -0
  30. package/src/validators/utils/phone.ts +152 -72
  31. package/validators/utils/phone/index.js +92 -66
  32. package/validators/utils/phone.d.ts +2 -2
@@ -1,76 +1,102 @@
1
- import * as gPhoneNumber from 'google-libphonenumber';
2
- export function validatePhoneNumber(phoneNumber) {
3
- var countries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ['gr'];
4
- var typeOfPhoneNumber = arguments.length > 2 ? arguments[2] : undefined;
5
- var phoneUtil = gPhoneNumber.PhoneNumberUtil.getInstance();
6
- if (!countries || countries.length === 0) {
7
- return true;
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ // add more countries from here libphonenumber-js/metadata.full.json
3
+ var countryPhoneData = {
4
+ "GR": ["30", "00", "5005000\\d{3}|8\\d{9,11}|(?:[269]\\d|70)\\d{8}", [10, 11, 12], [["(\\d{2})(\\d{4})(\\d{4})", "$1 $2 $3", ["21|7"]], ["(\\d{4})(\\d{6})", "$1 $2", ["2(?:2|3[2-57-9]|4[2-469]|5[2-59]|6[2-9]|7[2-69]|8[2-49])|5"]], ["(\\d{3})(\\d{3})(\\d{4})", "$1 $2 $3", ["[2689]"]], ["(\\d{3})(\\d{3,4})(\\d{5})", "$1 $2 $3", ["8"]]], 0, 0, 0, 0, 0, 0, [["2(?:1\\d\\d|2(?:2[1-46-9]|[36][1-8]|4[1-7]|5[1-4]|7[1-5]|[89][1-9])|3(?:1\\d|2[1-57]|[35][1-3]|4[13]|7[1-7]|8[124-6]|9[1-79])|4(?:1\\d|2[1-8]|3[1-4]|4[13-5]|6[1-578]|9[1-5])|5(?:1\\d|[29][1-4]|3[1-5]|4[124]|5[1-6])|6(?:1\\d|[269][1-6]|3[1245]|4[1-7]|5[13-9]|7[14]|8[1-5])|7(?:1\\d|2[1-5]|3[1-6]|4[1-7]|5[1-57]|6[135]|9[125-7])|8(?:1\\d|2[1-5]|[34][1-4]|9[1-57]))\\d{6}", [10]], ["68[57-9]\\d{7}|(?:69|94)\\d{8}", [10]], ["800\\d{7,9}"], ["90[19]\\d{7}", [10]], ["70\\d{8}", [10]], 0, ["5005000\\d{3}", [10]], 0, 0, ["8(?:0[16]|12|[27]5|50)\\d{7}", [10]]]]
5
+ };
6
+ function expandPhoneNumberStructure(compressed) {
7
+ var countries = Object.keys(compressed);
8
+ var expanded = {};
9
+ for (var _i = 0, _countries = countries; _i < _countries.length; _i++) {
10
+ var country = _countries[_i];
11
+ expanded[country] = {
12
+ fixedLine: {
13
+ possibleLengths: {
14
+ _national: compressed[country][3].map(String)
15
+ },
16
+ nationalNumberPattern: compressed[country][11][0][0]
17
+ },
18
+ mobile: {
19
+ nationalNumberPattern: compressed[country][11][1][0]
20
+ },
21
+ tollFree: {
22
+ nationalNumberPattern: compressed[country][11][2][0]
23
+ },
24
+ premiumRate: {
25
+ nationalNumberPattern: compressed[country][11][3][0]
26
+ },
27
+ sharedCost: {
28
+ nationalNumberPattern: compressed[country][11][9][0]
29
+ },
30
+ personalNumber: {
31
+ nationalNumberPattern: compressed[country][11][4][0]
32
+ },
33
+ uan: {
34
+ nationalNumberPattern: compressed[country][11][6][0]
35
+ },
36
+ id: country,
37
+ countryCode: compressed[country][0],
38
+ internationalPrefix: compressed[country][1]
39
+ };
8
40
  }
9
- return countries.some(function (country) {
10
- try {
11
- var phone = phoneUtil.parse(phoneNumber, country.toUpperCase());
12
- if (phoneUtil.isValidNumber(phone)) {
13
- if (typeOfPhoneNumber) {
14
- if (matchTypeOfPhoneNumber(phone, typeOfPhoneNumber, phoneUtil)) {
15
- return true;
16
- } else {
17
- return false;
18
- }
19
- } else {
20
- return true;
21
- }
22
- }
23
- return false;
24
- } catch (error) {
25
- console.error(error);
26
- return false;
27
- }
28
- });
41
+ return expanded;
29
42
  }
30
- var phoneNumberTypes = {
31
- 0: 'landline',
32
- 1: 'mobile',
33
- 2: 'landline_or_mobile'
34
- };
35
- export function matchTypeOfPhoneNumber(phone, type, phoneUtil) {
36
- try {
37
- var phoneNumberType = phoneUtil.getNumberType(phone);
38
- var numberType = phoneNumberTypes[phoneNumberType];
39
- if (numberType === 'landline_or_mobile' || numberType === type) {
40
- return true;
41
- } else {
42
- return false;
43
+ var PHONENUMBER_SPEC = expandPhoneNumberStructure(countryPhoneData);
44
+ export function discoverPhoneType(phoneNumber, config) {
45
+ var cleanNumber = phoneNumber.replace(/\D/g, "").replace(/\s/g, "").replace(/^\+/, "").replace(new RegExp("^" + config.internationalPrefix, ""), "").replace(new RegExp("^" + config.countryCode, ""), "");
46
+ var categories = {
47
+ "landline": config.fixedLine,
48
+ mobile: config.mobile,
49
+ "toll-free": config.tollFree,
50
+ "premium-rate": config.premiumRate
51
+ };
52
+ for (var _i2 = 0, _Object$entries = Object.entries(categories); _i2 < _Object$entries.length; _i2++) {
53
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2),
54
+ categoryName = _Object$entries$_i[0],
55
+ categoryDetails = _Object$entries$_i[1];
56
+ var pattern = new RegExp("^(" + categoryDetails.nationalNumberPattern.replace(/\s/g, "") + ")$", "");
57
+ if (cleanNumber.match(pattern)) {
58
+ return categoryName; // Returns the category name if the number matches the pattern
43
59
  }
44
- } catch (error) {
45
- console.error(error);
46
- return false;
47
60
  }
61
+
62
+ // If no category matches, return 'Unknown'
63
+ return "unknown";
48
64
  }
49
- function validateMobile(value) {
50
- var phoneUtil = gPhoneNumber.PhoneNumberUtil.getInstance();
51
- var origValue = value;
52
- // probably catch all the cases with a regex instead of gphonenumber
53
- if (!value.match(/^((\+|00){0,1}\d{1,3}[- ]?)?\d{10}$/)) {
54
- return false;
65
+ function getNumberType(phoneNumber, country) {
66
+ var spec = PHONENUMBER_SPEC[country.toUpperCase()];
67
+ if (!spec) {
68
+ throw new Error("Country ".concat(country, " is not supported"));
55
69
  }
56
- try {
57
- var phone;
58
- try {
59
- phone = phoneUtil.parse(value);
60
- } catch (err) {
61
- try {
62
- value = '+' + value;
63
- phone = phoneUtil.parse(value);
64
- } catch (err) {
65
- value = '+30' + origValue;
66
- phone = phoneUtil.parse(value);
67
- }
70
+ var type = discoverPhoneType(phoneNumber, spec);
71
+ return type;
72
+ }
73
+ function isPhoneNumberValid(phoneNumber, countries) {
74
+ var types = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ['mobile', 'landline'];
75
+ return countries.some(function (country) {
76
+ var numberType = getNumberType(phoneNumber, country);
77
+ if (numberType && types.includes(numberType)) {
78
+ return true;
68
79
  }
69
- return phoneUtil.isValidNumber(phone);
70
- } catch (err) {
71
- console.error(err);
72
80
  return false;
81
+ });
82
+ }
83
+ function isNumberOfType(phoneNumber, country, type) {
84
+ var numberType = getNumberType(phoneNumber, country);
85
+ if (numberType === type) {
86
+ return true;
87
+ }
88
+ return false;
89
+ }
90
+ export function validatePhoneNumber(phoneNumber) {
91
+ var countries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ['gr'];
92
+ var typeOfPhoneNumber = arguments.length > 2 ? arguments[2] : undefined;
93
+ if (!countries || countries.length === 0) {
94
+ return true;
73
95
  }
96
+ return isPhoneNumberValid(phoneNumber, countries, typeOfPhoneNumber ? [typeOfPhoneNumber] : undefined);
97
+ }
98
+ function validateMobile(value) {
99
+ return isNumberOfType(value, 'gr', 'mobile');
74
100
  }
75
101
  export var MOBILE_PHONE_VALIDATOR = {
76
102
  name: 'mobile-phone-validator',
@@ -84,7 +110,7 @@ export var MOBILE_PHONE_VALIDATOR = {
84
110
  };
85
111
  export var PHONE_NUMBER_VALIDATOR = function PHONE_NUMBER_VALIDATOR(field) {
86
112
  var _field$extra, _field$extra2;
87
- var countryCode = field === null || field === void 0 ? void 0 : (_field$extra = field.extra) === null || _field$extra === void 0 ? void 0 : _field$extra.countries;
113
+ var countryCodes = field === null || field === void 0 ? void 0 : (_field$extra = field.extra) === null || _field$extra === void 0 ? void 0 : _field$extra.countries;
88
114
  var typeOfPhone = field === null || field === void 0 ? void 0 : (_field$extra2 = field.extra) === null || _field$extra2 === void 0 ? void 0 : _field$extra2.phoneType;
89
115
  return {
90
116
  name: 'phone-number-validator',
@@ -102,7 +128,7 @@ export var PHONE_NUMBER_VALIDATOR = function PHONE_NUMBER_VALIDATOR(field) {
102
128
  if (!value) {
103
129
  return true;
104
130
  }
105
- return validatePhoneNumber(value, countryCode, typeOfPhone);
131
+ return validatePhoneNumber(value, countryCodes, typeOfPhone);
106
132
  }
107
133
  };
108
134
  };
@@ -1,8 +1,8 @@
1
1
  import { FieldSpec } from '@digigov/form/types';
2
2
  import { ValidatorSchema } from '@digigov/form/validators/types';
3
3
  export type PhoneNumberType = 'landline' | 'mobile' | null;
4
- export declare function validatePhoneNumber(phoneNumber: string, countries: string[] | undefined, typeOfPhoneNumber: PhoneNumberType): boolean;
5
- export declare function matchTypeOfPhoneNumber(phone: any, type: string, phoneUtil: any): boolean;
4
+ export declare function discoverPhoneType(phoneNumber: string, config: any): string;
5
+ export declare function validatePhoneNumber(phoneNumber: string, countries?: Array<string>, typeOfPhoneNumber?: PhoneNumberType): boolean;
6
6
  export declare const MOBILE_PHONE_VALIDATOR: {
7
7
  name: string;
8
8
  message: string;