@digigov/form 2.0.0-d0adc9fb → 2.0.0-d4fe516b

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 (83) hide show
  1. package/Field/ErrorGroup/index.js +48 -0
  2. package/Field/ErrorGroup/package.json +6 -0
  3. package/Field/ErrorGroup.d.ts +15 -0
  4. package/Field/ErrorGroup.js.map +7 -0
  5. package/Field/FieldBase/index.js +30 -22
  6. package/Field/FieldBase.js.map +2 -2
  7. package/Field/FieldBaseContainer/index.js +3 -2
  8. package/Field/FieldBaseContainer.js.map +2 -2
  9. package/Field/types.d.ts +2 -0
  10. package/FieldArray/index.js +1 -0
  11. package/FieldArray/index.js.map +2 -2
  12. package/FormBuilder/FormBuilder.stories.d.ts +2 -0
  13. package/FormBuilder/__stories__/AutoErrorGrouping.d.ts +3 -0
  14. package/FormBuilder/__stories__/ErrorGrouping.d.ts +3 -0
  15. package/FormBuilder/index.js +79 -3
  16. package/FormBuilder/index.js.map +2 -2
  17. package/FormBuilder/interaction.test.d.ts +1 -0
  18. package/MultiplicityField/index.js +1 -0
  19. package/MultiplicityField/index.js.map +2 -2
  20. package/cjs/Field/ErrorGroup/index.js +82 -0
  21. package/cjs/Field/ErrorGroup.js.map +7 -0
  22. package/cjs/Field/FieldBase/index.js +29 -21
  23. package/cjs/Field/FieldBase.js.map +2 -2
  24. package/cjs/Field/FieldBaseContainer/index.js +3 -2
  25. package/cjs/Field/FieldBaseContainer.js.map +2 -2
  26. package/cjs/Field/types.js.map +1 -1
  27. package/cjs/FieldArray/index.js +1 -0
  28. package/cjs/FieldArray/index.js.map +2 -2
  29. package/cjs/FormBuilder/index.js +79 -3
  30. package/cjs/FormBuilder/index.js.map +2 -2
  31. package/cjs/MultiplicityField/index.js +1 -0
  32. package/cjs/MultiplicityField/index.js.map +2 -2
  33. package/cjs/inputs/Input/index.js +1 -0
  34. package/cjs/inputs/Input/index.js.map +2 -2
  35. package/cjs/lazy/index.js +3 -1
  36. package/cjs/lazy.js.map +2 -2
  37. package/cjs/registry/index.js +4 -2
  38. package/cjs/registry.js.map +2 -2
  39. package/cjs/validators/index.js +18 -12
  40. package/cjs/validators/index.js.map +2 -2
  41. package/cjs/validators/utils/int/index.js +1 -1
  42. package/cjs/validators/utils/int.js.map +2 -2
  43. package/cjs/validators/utils/number/index.js +1 -1
  44. package/cjs/validators/utils/number.js.map +2 -2
  45. package/index.js +1 -1
  46. package/inputs/Input/Input.stories.d.ts +1 -0
  47. package/inputs/Input/__stories__/StringWithTrimValidation.d.ts +3 -0
  48. package/inputs/Input/index.js +1 -0
  49. package/inputs/Input/index.js.map +2 -2
  50. package/lazy/index.js +3 -1
  51. package/package.json +4 -4
  52. package/registry/index.js +4 -2
  53. package/src/Field/ErrorGroup.tsx +84 -0
  54. package/src/Field/FieldBase.tsx +33 -22
  55. package/src/Field/FieldBaseContainer.tsx +3 -2
  56. package/src/Field/types.tsx +2 -0
  57. package/src/FieldArray/index.tsx +1 -0
  58. package/src/FormBuilder/FormBuilder.stories.js +2 -0
  59. package/src/FormBuilder/__stories__/AutoErrorGrouping.tsx +63 -0
  60. package/src/FormBuilder/__stories__/ErrorGrouping.tsx +43 -0
  61. package/src/FormBuilder/index.test.tsx +19 -10
  62. package/src/FormBuilder/index.tsx +88 -5
  63. package/src/FormBuilder/interaction.test.tsx +32 -0
  64. package/src/FormBuilder/scenarios.test.tsx +111 -4
  65. package/src/MultiplicityField/index.tsx +1 -0
  66. package/src/Questions/__snapshots__/index.spec.tsx.snap +2 -1
  67. package/src/Questions/index.spec.tsx +8 -0
  68. package/src/inputs/Input/Input.stories.js +1 -0
  69. package/src/inputs/Input/__stories__/StringWithTrimValidation.tsx +26 -0
  70. package/src/inputs/Input/__stories__/TextWithLimit.tsx +1 -0
  71. package/src/inputs/Input/index.test.tsx +4 -0
  72. package/src/inputs/Input/index.tsx +1 -0
  73. package/src/lazy.js +3 -1
  74. package/src/registry.js +4 -2
  75. package/src/validators/index.ts +38 -13
  76. package/src/validators/utils/int.ts +1 -1
  77. package/src/validators/utils/number.ts +1 -1
  78. package/validators/index.js +18 -12
  79. package/validators/index.js.map +2 -2
  80. package/validators/utils/int/index.js +1 -1
  81. package/validators/utils/int.js.map +2 -2
  82. package/validators/utils/number/index.js +1 -1
  83. package/validators/utils/number.js.map +2 -2
@@ -469,7 +469,11 @@ const expectErrorMessages = async (formBuilder, scenarioExpect, expect) => {
469
469
  );
470
470
  }
471
471
  }
472
- await expect(labelLocator).toHaveText(expectText);
472
+ if (expectObj.textAssertion === 'toContainText') {
473
+ await expect(labelLocator).toContainText(expectText);
474
+ } else {
475
+ await expect(labelLocator).toHaveText(expectText);
476
+ }
473
477
  }
474
478
  }
475
479
  };
@@ -1289,6 +1293,54 @@ const INPUTS_INPUT_FIELDS = [
1289
1293
  },
1290
1294
  ];
1291
1295
 
1296
+ const ERROR_GROUPING_FIELDS = [
1297
+ {
1298
+ key: 'address',
1299
+ type: 'string',
1300
+ required: true,
1301
+ layout: { xl: 6, lg: 6, md: 6, xs: 6 },
1302
+ label: {
1303
+ primary: 'Οδός',
1304
+ },
1305
+ },
1306
+ {
1307
+ key: 'address_number',
1308
+ type: 'int',
1309
+ required: true,
1310
+ layout: { xl: 2, lg: 2, md: 2, xs: 6 },
1311
+ label: {
1312
+ primary: 'Αριθμός',
1313
+ },
1314
+ },
1315
+ {
1316
+ key: 'postal_code',
1317
+ type: 'postal_code',
1318
+ required: true,
1319
+ layout: { xl: 4, lg: 4, md: 4, xs: 6 },
1320
+ label: {
1321
+ primary: 'Ταχ. Κώδικας',
1322
+ },
1323
+ },
1324
+ {
1325
+ key: 'town',
1326
+ type: 'string',
1327
+ required: true,
1328
+ layout: { xl: 6, lg: 6, md: 6, xs: 6 },
1329
+ label: {
1330
+ primary: 'Πόλη',
1331
+ },
1332
+ },
1333
+ {
1334
+ key: 'country',
1335
+ type: 'string',
1336
+ required: true,
1337
+ layout: { xl: 6, lg: 6, md: 6, xs: 6 },
1338
+ label: {
1339
+ primary: 'Χώρα',
1340
+ },
1341
+ },
1342
+ ];
1343
+
1292
1344
  const inputsInputScenarios = [
1293
1345
  {
1294
1346
  title: 'success fill for inputs Input',
@@ -1410,7 +1462,7 @@ const inputsInputScenarios = [
1410
1462
  {
1411
1463
  title: 'empty fill for inputs Input',
1412
1464
  describe: 'inputs Input scenario',
1413
- fields: INPUTS_INPUT_FIELDS,
1465
+ fields: [...INPUTS_INPUT_FIELDS, ...ERROR_GROUPING_FIELDS],
1414
1466
  fill: [],
1415
1467
  expect: [
1416
1468
  {
@@ -1468,12 +1520,42 @@ const inputsInputScenarios = [
1468
1520
  fieldKey: 'uuid4',
1469
1521
  text: el.form.error.required,
1470
1522
  },
1523
+ {
1524
+ type: 'error',
1525
+ fieldKey: 'address',
1526
+ text: el.form.error.required,
1527
+ textAssertion: 'toContainText',
1528
+ },
1529
+ {
1530
+ type: 'error',
1531
+ fieldKey: 'address_number',
1532
+ text: el.form.error.required,
1533
+ textAssertion: 'toContainText',
1534
+ },
1535
+ {
1536
+ type: 'error',
1537
+ fieldKey: 'postal_code',
1538
+ text: el.form.error.required,
1539
+ textAssertion: 'toContainText',
1540
+ },
1541
+ {
1542
+ type: 'error',
1543
+ fieldKey: 'town',
1544
+ text: el.form.error.required,
1545
+ textAssertion: 'toContainText',
1546
+ },
1547
+ {
1548
+ type: 'error',
1549
+ fieldKey: 'country',
1550
+ text: el.form.error.required,
1551
+ textAssertion: 'toContainText',
1552
+ },
1471
1553
  ],
1472
1554
  },
1473
1555
  {
1474
1556
  title: 'incorrect types for inputs Input',
1475
1557
  describe: 'inputs Input scenario',
1476
- fields: INPUTS_INPUT_FIELDS,
1558
+ fields: [...INPUTS_INPUT_FIELDS, ...ERROR_GROUPING_FIELDS],
1477
1559
  fill: [
1478
1560
  {
1479
1561
  fieldKey: 'age',
@@ -1519,6 +1601,14 @@ const inputsInputScenarios = [
1519
1601
  fieldKey: 'uuid4',
1520
1602
  value: 'aaaaaa',
1521
1603
  },
1604
+ {
1605
+ fieldKey: 'address_number',
1606
+ value: 'aa',
1607
+ },
1608
+ {
1609
+ fieldKey: 'postal_code',
1610
+ value: 'aaaaa',
1611
+ },
1522
1612
  ],
1523
1613
  expect: [
1524
1614
  {
@@ -1576,6 +1666,18 @@ const inputsInputScenarios = [
1576
1666
  fieldKey: 'uuid4',
1577
1667
  text: el.form.error.uuid4,
1578
1668
  },
1669
+ {
1670
+ type: 'error',
1671
+ fieldKey: 'address_number',
1672
+ text: el.form.error.number,
1673
+ textAssertion: 'toContainText',
1674
+ },
1675
+ {
1676
+ type: 'error',
1677
+ fieldKey: 'postal_code',
1678
+ text: el.form.error.postalCode,
1679
+ textAssertion: 'toContainText',
1680
+ },
1579
1681
  ],
1580
1682
  },
1581
1683
  ];
@@ -1847,7 +1949,12 @@ for (const scenario of scenarios) {
1847
1949
  test(scenario.title, async ({ mount, page }) => {
1848
1950
  const formBuilder = await mount(
1849
1951
  // @ts-ignore
1850
- <FormBuilder auto={true} fields={scenario.fields} onSubmit={() => {}} />
1952
+ <FormBuilder
1953
+ auto={true}
1954
+ grid={true}
1955
+ fields={scenario.fields}
1956
+ onSubmit={() => {}}
1957
+ />
1851
1958
  );
1852
1959
  await fillFields(page, formBuilder, scenario);
1853
1960
  await submitForm(formBuilder);
@@ -57,6 +57,7 @@ export const Multiplicity: React.FC<MultiplicityProps> = ({
57
57
  ? error
58
58
  : undefined
59
59
  }
60
+ hasError={formState.isSubmitted && !formState.isSubmitting && !!error}
60
61
  wrapper="fieldset"
61
62
  name={name}
62
63
  >
@@ -45,7 +45,7 @@ exports[`renders the Questions 1`] = `
45
45
  class="ds-form"
46
46
  >
47
47
  <div
48
- class="ds-field xs:ds-grid__col-span-12"
48
+ class="ds-field xs:ds-grid__col-span-12 sm:ds-grid__col-span-12 md:ds-grid__col-span-12 lg:ds-grid__col-span-12 xl:ds-grid__col-span-12"
49
49
  >
50
50
  <label
51
51
  class="ds-label"
@@ -64,6 +64,7 @@ exports[`renders the Questions 1`] = `
64
64
  aria-required="true"
65
65
  class="ds-input"
66
66
  data-type="string"
67
+ id="name"
67
68
  name="name"
68
69
  type="text"
69
70
  />
@@ -46,6 +46,14 @@ const steps = [
46
46
  },
47
47
  ];
48
48
 
49
+ beforeAll(() => {
50
+ global.ResizeObserver = class ResizeObserver {
51
+ observe() {}
52
+ unobserve() {}
53
+ disconnect() {}
54
+ };
55
+ });
56
+
49
57
  it('renders the Questions', () => {
50
58
  expect(
51
59
  render(
@@ -5,6 +5,7 @@ export default {
5
5
  displayName: 'Input',
6
6
  };
7
7
  export { String } from '@digigov/form/inputs/Input/__stories__/String';
8
+ export { StringWithTrimValidation } from '@digigov/form/inputs/Input/__stories__/StringWithTrimValidation';
8
9
  export { Integer } from '@digigov/form/inputs/Input/__stories__/Integer';
9
10
  export { Boolean } from '@digigov/form/inputs/Input/__stories__/Boolean';
10
11
  export { PhoneNumber } from '@digigov/form/inputs/Input/__stories__/PhoneNumber';
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import FormBuilder, { Field } from '@digigov/form';
3
+ import { Button } from '@digigov/ui/form/Button';
4
+
5
+ export const StringWithTrimValidation = () => (
6
+ <FormBuilder
7
+ onSubmit={(data) => {
8
+ console.log(data);
9
+ }}
10
+ >
11
+ <Field
12
+ key="business-title"
13
+ name="business-title"
14
+ type="string"
15
+ trim={true}
16
+ label={{
17
+ primary: 'Όνομα επιχείρησης',
18
+ secondary:
19
+ 'Εισάγετε μια σειρά από χαρακτήρες και αριθμούς (το πειδίο δεν δέχεται κενά στην αρχή της πρότασης)',
20
+ }}
21
+ required
22
+ />
23
+ <Button type="submit">Συνέχεια</Button>
24
+ </FormBuilder>
25
+ );
26
+ export default StringWithTrimValidation;
@@ -12,6 +12,7 @@ export const TextWithLimit = () => (
12
12
  key="text"
13
13
  name="text"
14
14
  type="text"
15
+ trim
15
16
  label={{
16
17
  primary: 'Μπορείτε να δώσετε περισσότερες πληροφορίες;',
17
18
  }}
@@ -10,6 +10,7 @@ import { MobilePhone } from '@digigov/form/inputs/Input/__stories__/MobilePhone'
10
10
  import { PhoneNumber } from '@digigov/form/inputs/Input/__stories__/PhoneNumber';
11
11
  import { PostalCode } from '@digigov/form/inputs/Input/__stories__/PostalCode';
12
12
  import { String } from '@digigov/form/inputs/Input/__stories__/String';
13
+ import { StringWithTrimValidation } from '@digigov/form/inputs/Input/__stories__/StringWithTrimValidation';
13
14
  import { TextWithLimit } from '@digigov/form/inputs/Input/__stories__/TextWithLimit';
14
15
 
15
16
  test('renders the All Input variants', async ({ mount, page }) => {
@@ -43,6 +44,9 @@ test('renders the All Input variants', async ({ mount, page }) => {
43
44
  <TestVariant title="String">
44
45
  <String />
45
46
  </TestVariant>
47
+ <TestVariant title="StringWithTrimValidation">
48
+ <StringWithTrimValidation />
49
+ </TestVariant>
46
50
  <TestVariant title="TextWithLimit">
47
51
  <TextWithLimit />
48
52
  </TestVariant>
@@ -93,6 +93,7 @@ export const Input: React.ExoticComponent<InputProps> = React.forwardRef(
93
93
  return (
94
94
  <TextInput
95
95
  name={name}
96
+ id={name}
96
97
  type={fieldType}
97
98
  data-type={type}
98
99
  className={className}
package/src/lazy.js CHANGED
@@ -4,15 +4,17 @@ export default {
4
4
  'Field': lazy(() => import('@digigov/form/Field').then((module) => ({ default: module['Field'] }))),
5
5
  'Fieldset': lazy(() => import('@digigov/form/Fieldset').then((module) => ({ default: module['Fieldset'] }))),
6
6
  'Label': lazy(() => import('@digigov/form/inputs/Label').then((module) => ({ default: module['Label'] }))),
7
+ 'ErrorGroupContext': lazy(() => import('@digigov/form/Field/ErrorGroup').then((module) => ({ default: module['ErrorGroupContext'] }))),
8
+ 'ErrorGroup': lazy(() => import('@digigov/form/Field/ErrorGroup').then((module) => ({ default: module['ErrorGroup'] }))),
7
9
  'FieldBase': lazy(() => import('@digigov/form/Field/FieldBase').then((module) => ({ default: module['FieldBase'] }))),
8
10
  'FieldBaseContainer': lazy(() => import('@digigov/form/Field/FieldBaseContainer').then((module) => ({ default: module['FieldBaseContainer'] }))),
9
11
  'FieldConditional': lazy(() => import('@digigov/form/Field/FieldConditional').then((module) => ({ default: module['FieldConditional'] }))),
10
- 'FieldObject': lazy(() => import('@digigov/form/FieldObject').then((module) => ({ default: module['FieldObject'] }))),
11
12
  'FormDialog': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['FormDialog'] }))),
12
13
  'ArrayItemModal': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['ArrayItemModal'] }))),
13
14
  'ArrayItemHeader': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['ArrayItemHeader'] }))),
14
15
  'ArrayItemDisplay': lazy(() => import('@digigov/form/FieldArray/FormDialog').then((module) => ({ default: module['ArrayItemDisplay'] }))),
15
16
  'FieldArray': lazy(() => import('@digigov/form/FieldArray').then((module) => ({ default: module['FieldArray'] }))),
17
+ 'FieldObject': lazy(() => import('@digigov/form/FieldObject').then((module) => ({ default: module['FieldObject'] }))),
16
18
  'FieldsetWithContext': lazy(() => import('@digigov/form/Fieldset/FieldsetWithContext').then((module) => ({ default: module['FieldsetWithContext'] }))),
17
19
  'FieldsetLabel': lazy(() => import('@digigov/form/Fieldset').then((module) => ({ default: module['FieldsetLabel'] }))),
18
20
  'FieldsetCaption': lazy(() => import('@digigov/form/Fieldset').then((module) => ({ default: module['FieldsetCaption'] }))),
package/src/registry.js CHANGED
@@ -4,14 +4,15 @@ import * as _digigov_form from "@digigov/form";
4
4
  import * as _digigov_form_internal from "@digigov/form/internal";
5
5
  import * as _digigov_form_types from "@digigov/form/types";
6
6
  import * as _digigov_form_utils from "@digigov/form/utils";
7
+ import * as _digigov_form_Field_ErrorGroup from "@digigov/form/Field/ErrorGroup";
7
8
  import * as _digigov_form_Field_FieldBase from "@digigov/form/Field/FieldBase";
8
9
  import * as _digigov_form_Field_FieldBaseContainer from "@digigov/form/Field/FieldBaseContainer";
9
10
  import * as _digigov_form_Field_FieldConditional from "@digigov/form/Field/FieldConditional";
10
11
  import * as _digigov_form_Field from "@digigov/form/Field";
11
12
  import * as _digigov_form_Field_types from "@digigov/form/Field/types";
12
- import * as _digigov_form_FieldObject from "@digigov/form/FieldObject";
13
13
  import * as _digigov_form_FieldArray_FormDialog from "@digigov/form/FieldArray/FormDialog";
14
14
  import * as _digigov_form_FieldArray from "@digigov/form/FieldArray";
15
+ import * as _digigov_form_FieldObject from "@digigov/form/FieldObject";
15
16
  import * as _digigov_form_Fieldset_FieldsetWithContext from "@digigov/form/Fieldset/FieldsetWithContext";
16
17
  import * as _digigov_form_Fieldset from "@digigov/form/Fieldset";
17
18
  import * as _digigov_form_Fieldset_types from "@digigov/form/Fieldset/types";
@@ -94,14 +95,15 @@ export default {
94
95
  '@digigov/form/internal': lazyImport(_digigov_form_internal),
95
96
  '@digigov/form/types': lazyImport(_digigov_form_types),
96
97
  '@digigov/form/utils': lazyImport(_digigov_form_utils),
98
+ '@digigov/form/Field/ErrorGroup': lazyImport(_digigov_form_Field_ErrorGroup),
97
99
  '@digigov/form/Field/FieldBase': lazyImport(_digigov_form_Field_FieldBase),
98
100
  '@digigov/form/Field/FieldBaseContainer': lazyImport(_digigov_form_Field_FieldBaseContainer),
99
101
  '@digigov/form/Field/FieldConditional': lazyImport(_digigov_form_Field_FieldConditional),
100
102
  '@digigov/form/Field': lazyImport(_digigov_form_Field),
101
103
  '@digigov/form/Field/types': lazyImport(_digigov_form_Field_types),
102
- '@digigov/form/FieldObject': lazyImport(_digigov_form_FieldObject),
103
104
  '@digigov/form/FieldArray/FormDialog': lazyImport(_digigov_form_FieldArray_FormDialog),
104
105
  '@digigov/form/FieldArray': lazyImport(_digigov_form_FieldArray),
106
+ '@digigov/form/FieldObject': lazyImport(_digigov_form_FieldObject),
105
107
  '@digigov/form/Fieldset/FieldsetWithContext': lazyImport(_digigov_form_Fieldset_FieldsetWithContext),
106
108
  '@digigov/form/Fieldset': lazyImport(_digigov_form_Fieldset),
107
109
  '@digigov/form/Fieldset/types': lazyImport(_digigov_form_Fieldset_types),
@@ -44,7 +44,13 @@ export const getYUPTypeMap = (): Record<string, any> => {
44
44
  .nullable()
45
45
  .test(FILE_MAX_SIZE_VALIDATOR(field));
46
46
  },
47
- string: (): yup.StringSchema => yup.string().trim(),
47
+ string: (field): yup.StringSchema => {
48
+ if (field.trim) {
49
+ return yup.string().trim();
50
+ } else {
51
+ return yup.string();
52
+ }
53
+ },
48
54
  boolean: (): yup.BooleanSchema<
49
55
  boolean | null | undefined,
50
56
  AnyObject,
@@ -111,26 +117,39 @@ export const getYUPTypeMap = (): Record<string, any> => {
111
117
  number: (): MixedSchema =>
112
118
  yup
113
119
  .mixed()
114
- .transform((_, val) => (val !== '' ? Number(val) : null))
120
+ .transform((_, val) => (val !== '' ? Number(val) : undefined))
115
121
  .test(NUMBER_VALIDATOR()),
116
122
  int: (): MixedSchema =>
117
123
  yup
118
124
  .mixed()
119
- .transform((_, val) => (val !== '' ? Number(val) : null))
125
+ .transform((_, val) => (val !== '' ? Number(val) : undefined))
120
126
  .test(NUMBER_VALIDATOR())
121
127
  .test(INT_VALIDATOR()),
122
- email: (): yup.StringSchema => yup.string().email('form.error.email'),
123
- afm: (): yup.StringSchema => yup.string().trim().test(AFM_VALIDATOR),
124
- uuid4: (): yup.StringSchema => yup.string().trim().test(UUID4_VALIDATOR),
128
+ email: (field): yup.StringSchema =>
129
+ field.trim
130
+ ? yup.string().trim().email('form.error.email')
131
+ : yup.string().email('form.error.email'),
132
+ afm: (field): yup.StringSchema =>
133
+ field.trim
134
+ ? yup.string().trim().test(AFM_VALIDATOR)
135
+ : yup.string().test(AFM_VALIDATOR),
136
+ uuid4: (field): yup.StringSchema =>
137
+ field.trim
138
+ ? yup.string().trim().test(UUID4_VALIDATOR)
139
+ : yup.string().test(UUID4_VALIDATOR),
125
140
  iban: (field): yup.StringSchema =>
126
- yup.string().trim().test(IBAN_VALIDATOR(field)),
141
+ field.trim
142
+ ? yup.string().trim().test(IBAN_VALIDATOR(field))
143
+ : yup.string().trim().test(IBAN_VALIDATOR(field)),
127
144
  otp: (field): yup.StringSchema =>
128
145
  yup.string().trim().test(OTP_VALIDATOR(field)),
129
146
  text: (field): yup.StringSchema => {
130
147
  if (field?.extra?.limit?.max || !!field?.extra?.limit?.min) {
131
- return yup.string().test(TEXT_LIMIT_VALIDATOR(field));
148
+ return field.trim
149
+ ? yup.string().trim().test(TEXT_LIMIT_VALIDATOR(field))
150
+ : yup.string().test(TEXT_LIMIT_VALIDATOR(field));
132
151
  } else {
133
- return yup.string();
152
+ return field.trim ? yup.string().trim() : yup.string();
134
153
  }
135
154
  },
136
155
  image: (field): MixedSchema => {
@@ -147,11 +166,17 @@ export const getYUPTypeMap = (): Record<string, any> => {
147
166
  .test(IMAGE_DIMENSION_VALIDATOR(field));
148
167
  },
149
168
  postal_code: (field): yup.StringSchema =>
150
- yup.string().trim().test(POSTALCODE_VALIDATOR(field)),
151
- mobile_phone: (): yup.StringSchema =>
152
- yup.string().trim().test(MOBILE_PHONE_VALIDATOR),
169
+ field.trim
170
+ ? yup.string().trim().test(POSTALCODE_VALIDATOR(field))
171
+ : yup.string().test(POSTALCODE_VALIDATOR(field)),
172
+ mobile_phone: (field): yup.StringSchema =>
173
+ field.trim
174
+ ? yup.string().trim().test(MOBILE_PHONE_VALIDATOR)
175
+ : yup.string().test(MOBILE_PHONE_VALIDATOR),
153
176
  phone_number: (field): yup.StringSchema =>
154
- yup.string().trim().test(PHONE_NUMBER_VALIDATOR(field)),
177
+ field.trim
178
+ ? yup.string().trim().test(PHONE_NUMBER_VALIDATOR(field))
179
+ : yup.string().test(PHONE_NUMBER_VALIDATOR(field)),
155
180
  'choice:multiple': (): yup.ArraySchema<
156
181
  yup.StringSchema<string | undefined, AnyObject, string | undefined>,
157
182
  AnyObject,
@@ -13,7 +13,7 @@ export const INT_VALIDATOR = (): ValidatorSchema => {
13
13
  name: 'int-validator',
14
14
  message: 'form.error.positive_integer_number',
15
15
  test: (value: number): boolean => {
16
- if (value === null) {
16
+ if (value === undefined) {
17
17
  return true;
18
18
  }
19
19
  return validateIntNumber(value);
@@ -9,7 +9,7 @@ export const NUMBER_VALIDATOR = (): ValidatorSchema => {
9
9
  name: 'number-validator',
10
10
  message: 'form.error.number',
11
11
  test: (value: number): boolean => {
12
- if (value === null) {
12
+ if (value === undefined) {
13
13
  return true;
14
14
  }
15
15
  return validateNumber(value);
@@ -31,7 +31,13 @@ const getYUPTypeMap = () => {
31
31
  return value;
32
32
  }).nullable().test(FILE_MAX_SIZE_VALIDATOR(field));
33
33
  },
34
- string: () => yup.string().trim(),
34
+ string: (field) => {
35
+ if (field.trim) {
36
+ return yup.string().trim();
37
+ } else {
38
+ return yup.string();
39
+ }
40
+ },
35
41
  boolean: () => {
36
42
  return yup.boolean().nullable().transform((value) => {
37
43
  if (value === "" || typeof value === "string") return null;
@@ -74,18 +80,18 @@ const getYUPTypeMap = () => {
74
80
  return yup.array().of(yup.string());
75
81
  }
76
82
  },
77
- number: () => yup.mixed().transform((_, val) => val !== "" ? Number(val) : null).test(NUMBER_VALIDATOR()),
78
- int: () => yup.mixed().transform((_, val) => val !== "" ? Number(val) : null).test(NUMBER_VALIDATOR()).test(INT_VALIDATOR()),
79
- email: () => yup.string().email("form.error.email"),
80
- afm: () => yup.string().trim().test(AFM_VALIDATOR),
81
- uuid4: () => yup.string().trim().test(UUID4_VALIDATOR),
82
- iban: (field) => yup.string().trim().test(IBAN_VALIDATOR(field)),
83
+ number: () => yup.mixed().transform((_, val) => val !== "" ? Number(val) : void 0).test(NUMBER_VALIDATOR()),
84
+ int: () => yup.mixed().transform((_, val) => val !== "" ? Number(val) : void 0).test(NUMBER_VALIDATOR()).test(INT_VALIDATOR()),
85
+ email: (field) => field.trim ? yup.string().trim().email("form.error.email") : yup.string().email("form.error.email"),
86
+ afm: (field) => field.trim ? yup.string().trim().test(AFM_VALIDATOR) : yup.string().test(AFM_VALIDATOR),
87
+ uuid4: (field) => field.trim ? yup.string().trim().test(UUID4_VALIDATOR) : yup.string().test(UUID4_VALIDATOR),
88
+ iban: (field) => field.trim ? yup.string().trim().test(IBAN_VALIDATOR(field)) : yup.string().trim().test(IBAN_VALIDATOR(field)),
83
89
  otp: (field) => yup.string().trim().test(OTP_VALIDATOR(field)),
84
90
  text: (field) => {
85
91
  if (field?.extra?.limit?.max || !!field?.extra?.limit?.min) {
86
- return yup.string().test(TEXT_LIMIT_VALIDATOR(field));
92
+ return field.trim ? yup.string().trim().test(TEXT_LIMIT_VALIDATOR(field)) : yup.string().test(TEXT_LIMIT_VALIDATOR(field));
87
93
  } else {
88
- return yup.string();
94
+ return field.trim ? yup.string().trim() : yup.string();
89
95
  }
90
96
  },
91
97
  image: (field) => {
@@ -96,9 +102,9 @@ const getYUPTypeMap = () => {
96
102
  return value;
97
103
  }).nullable().test(FILE_MAX_SIZE_VALIDATOR(field)).test(IMAGE_DIMENSION_VALIDATOR(field));
98
104
  },
99
- postal_code: (field) => yup.string().trim().test(POSTALCODE_VALIDATOR(field)),
100
- mobile_phone: () => yup.string().trim().test(MOBILE_PHONE_VALIDATOR),
101
- phone_number: (field) => yup.string().trim().test(PHONE_NUMBER_VALIDATOR(field)),
105
+ postal_code: (field) => field.trim ? yup.string().trim().test(POSTALCODE_VALIDATOR(field)) : yup.string().test(POSTALCODE_VALIDATOR(field)),
106
+ mobile_phone: (field) => field.trim ? yup.string().trim().test(MOBILE_PHONE_VALIDATOR) : yup.string().test(MOBILE_PHONE_VALIDATOR),
107
+ phone_number: (field) => field.trim ? yup.string().trim().test(PHONE_NUMBER_VALIDATOR(field)) : yup.string().test(PHONE_NUMBER_VALIDATOR(field)),
102
108
  "choice:multiple": () => yup.array().of(yup.string()).nullable(),
103
109
  "choice:single": () => yup.string().nullable(),
104
110
  date: (field) => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/validators/index.ts"],
4
- "sourcesContent": ["import { MutableRefObject, useMemo } from 'react';\nimport * as yup from 'yup';\nimport { AnyObjectSchema, StringSchema } from 'yup';\nimport { RequiredArraySchema } from 'yup/lib/array';\nimport Lazy from 'yup/lib/Lazy';\nimport { MixedSchema } from 'yup/lib/mixed';\nimport { TypeOfShape, AssertsShape } from 'yup/lib/object';\nimport { AnyObject } from 'yup/lib/types';\nimport { FieldSpec } from '@digigov/form/types';\nimport { ValidatorSchema } from '@digigov/form/validators/types';\nimport {\n getYupObjectShape,\n AFM_VALIDATOR,\n FILE_MAX_SIZE_VALIDATOR,\n IBAN_VALIDATOR,\n OTP_VALIDATOR,\n MOBILE_PHONE_VALIDATOR,\n PHONE_NUMBER_VALIDATOR,\n TEXT_LIMIT_VALIDATOR,\n POSTALCODE_VALIDATOR,\n UUID4_VALIDATOR,\n IMAGE_DIMENSION_VALIDATOR,\n DATE_VALIDATOR,\n LATER_THAN_VALIDATOR,\n EARLIER_THAN_VALIDATOR,\n DATETIME_VALIDATOR,\n LATER_THAN_DATETIME_VALIDATOR,\n EARLIER_THAN_DATETIME_VALIDATOR,\n} from '@digigov/form/validators/utils';\nimport { INT_VALIDATOR } from '@digigov/form/validators/utils/int';\nimport { NUMBER_VALIDATOR } from '@digigov/form/validators/utils/number';\n\nexport const getYUPTypeMap = (): Record<string, any> => {\n const yupTypeMap = {\n file: (field): MixedSchema => {\n return yup\n .mixed()\n .transform((value) => {\n if (!value.length) {\n return null;\n }\n return value;\n })\n .nullable()\n .test(FILE_MAX_SIZE_VALIDATOR(field));\n },\n string: (): yup.StringSchema => yup.string().trim(),\n boolean: (): yup.BooleanSchema<\n boolean | null | undefined,\n AnyObject,\n boolean | null | undefined\n > => {\n return yup\n .boolean()\n .nullable()\n .transform((value) => {\n if (value === '' || typeof value === 'string') return null;\n if (typeof value === 'boolean') return value;\n if (value === 0 || value === 1) return Boolean(value);\n return value;\n });\n },\n object: (\n field\n ):\n | yup.ObjectSchema<any, AnyObject, TypeOfShape<any>, AssertsShape<any>>\n | Lazy<any, unknown> => {\n return getYupObjectShape(field.extra.fields, yupTypeMap);\n },\n array: (\n field\n ):\n | yup.ArraySchema<any, AnyObject, any[] | undefined>\n | RequiredArraySchema<any, AnyObject, any[] | undefined> => {\n if (typeof field.extra.of === 'object') {\n // else if the field is an object then it is a scalar type\n // eg. number, string etc.\n let arrayValidator = yup\n .array()\n .of(yupTypeMap[field.extra.of.type](field.extra.of))\n .required(field.required);\n if (field.extra.length)\n arrayValidator = arrayValidator.length(field.extra.length, {\n key: 'form.error.array.length',\n context: {\n length: field.extra.length,\n },\n });\n if (field.extra.min)\n arrayValidator = arrayValidator.min(field.extra.min, {\n key: 'form.error.array.min',\n context: {\n min: field.extra.min,\n },\n });\n if (field.extra.max)\n arrayValidator = arrayValidator.max(field.extra.max, {\n key: 'form.error.array.max',\n context: {\n max: field.extra.max,\n },\n });\n return arrayValidator;\n } else if (typeof field.extra.of === 'string') {\n return yup.array().of(yupTypeMap[field.extra.of]());\n } else {\n // in any other case it will be string\n return yup.array().of(yup.string());\n }\n },\n number: (): MixedSchema =>\n yup\n .mixed()\n .transform((_, val) => (val !== '' ? Number(val) : null))\n .test(NUMBER_VALIDATOR()),\n int: (): MixedSchema =>\n yup\n .mixed()\n .transform((_, val) => (val !== '' ? Number(val) : null))\n .test(NUMBER_VALIDATOR())\n .test(INT_VALIDATOR()),\n email: (): yup.StringSchema => yup.string().email('form.error.email'),\n afm: (): yup.StringSchema => yup.string().trim().test(AFM_VALIDATOR),\n uuid4: (): yup.StringSchema => yup.string().trim().test(UUID4_VALIDATOR),\n iban: (field): yup.StringSchema =>\n yup.string().trim().test(IBAN_VALIDATOR(field)),\n otp: (field): yup.StringSchema =>\n yup.string().trim().test(OTP_VALIDATOR(field)),\n text: (field): yup.StringSchema => {\n if (field?.extra?.limit?.max || !!field?.extra?.limit?.min) {\n return yup.string().test(TEXT_LIMIT_VALIDATOR(field));\n } else {\n return yup.string();\n }\n },\n image: (field): MixedSchema => {\n return yup\n .mixed()\n .transform((value) => {\n if (!value.length || value.length === 0) {\n return null;\n }\n return value;\n })\n .nullable()\n .test(FILE_MAX_SIZE_VALIDATOR(field))\n .test(IMAGE_DIMENSION_VALIDATOR(field));\n },\n postal_code: (field): yup.StringSchema =>\n yup.string().trim().test(POSTALCODE_VALIDATOR(field)),\n mobile_phone: (): yup.StringSchema =>\n yup.string().trim().test(MOBILE_PHONE_VALIDATOR),\n phone_number: (field): yup.StringSchema =>\n yup.string().trim().test(PHONE_NUMBER_VALIDATOR(field)),\n 'choice:multiple': (): yup.ArraySchema<\n yup.StringSchema<string | undefined, AnyObject, string | undefined>,\n AnyObject,\n (string | undefined)[] | null | undefined,\n (string | undefined)[] | null | undefined\n > => yup.array().of(yup.string()).nullable(),\n 'choice:single': (): StringSchema<\n string | null | undefined,\n AnyObject,\n string | null | undefined\n > => yup.string().nullable(),\n date: (\n field\n ): yup.StringSchema<\n string | null | undefined,\n AnyObject,\n string | null | undefined\n > => {\n let schema = yup.string().nullable();\n if (field?.extra?.min) {\n schema = schema.test(LATER_THAN_VALIDATOR(field));\n }\n if (field?.extra?.max) {\n schema = schema.test(EARLIER_THAN_VALIDATOR(field));\n } else {\n schema = schema.test(DATE_VALIDATOR);\n }\n return schema;\n },\n datetime: (field): yup.StringSchema => {\n if (field?.extra?.min) {\n return yup.string().test(LATER_THAN_DATETIME_VALIDATOR(field));\n }\n if (field?.extra?.max) {\n return yup.string().test(EARLIER_THAN_DATETIME_VALIDATOR(field));\n }\n return yup.string().test(DATETIME_VALIDATOR);\n },\n };\n return yupTypeMap;\n};\n\nexport interface MutableRefObjectProps {}\n// Create a yup validation schema from given fields input\nexport function useValidationSchema(\n fields: FieldSpec[] | MutableRefObject<MutableRefObjectProps>,\n validatorRegistry?: Record<string, ValidatorSchema[]>\n): Lazy<any, unknown> | AnyObjectSchema | void {\n return useMemo(() => {\n const yupTypeMap = getYUPTypeMap();\n return getYupObjectShape(fields, yupTypeMap, validatorRegistry);\n }, []);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { MutableRefObject, useMemo } from 'react';\nimport * as yup from 'yup';\nimport { AnyObjectSchema, StringSchema } from 'yup';\nimport { RequiredArraySchema } from 'yup/lib/array';\nimport Lazy from 'yup/lib/Lazy';\nimport { MixedSchema } from 'yup/lib/mixed';\nimport { TypeOfShape, AssertsShape } from 'yup/lib/object';\nimport { AnyObject } from 'yup/lib/types';\nimport { FieldSpec } from '@digigov/form/types';\nimport { ValidatorSchema } from '@digigov/form/validators/types';\nimport {\n getYupObjectShape,\n AFM_VALIDATOR,\n FILE_MAX_SIZE_VALIDATOR,\n IBAN_VALIDATOR,\n OTP_VALIDATOR,\n MOBILE_PHONE_VALIDATOR,\n PHONE_NUMBER_VALIDATOR,\n TEXT_LIMIT_VALIDATOR,\n POSTALCODE_VALIDATOR,\n UUID4_VALIDATOR,\n IMAGE_DIMENSION_VALIDATOR,\n DATE_VALIDATOR,\n LATER_THAN_VALIDATOR,\n EARLIER_THAN_VALIDATOR,\n DATETIME_VALIDATOR,\n LATER_THAN_DATETIME_VALIDATOR,\n EARLIER_THAN_DATETIME_VALIDATOR,\n} from '@digigov/form/validators/utils';\nimport { INT_VALIDATOR } from '@digigov/form/validators/utils/int';\nimport { NUMBER_VALIDATOR } from '@digigov/form/validators/utils/number';\n\nexport const getYUPTypeMap = (): Record<string, any> => {\n const yupTypeMap = {\n file: (field): MixedSchema => {\n return yup\n .mixed()\n .transform((value) => {\n if (!value.length) {\n return null;\n }\n return value;\n })\n .nullable()\n .test(FILE_MAX_SIZE_VALIDATOR(field));\n },\n string: (field): yup.StringSchema => {\n if (field.trim) {\n return yup.string().trim();\n } else {\n return yup.string();\n }\n },\n boolean: (): yup.BooleanSchema<\n boolean | null | undefined,\n AnyObject,\n boolean | null | undefined\n > => {\n return yup\n .boolean()\n .nullable()\n .transform((value) => {\n if (value === '' || typeof value === 'string') return null;\n if (typeof value === 'boolean') return value;\n if (value === 0 || value === 1) return Boolean(value);\n return value;\n });\n },\n object: (\n field\n ):\n | yup.ObjectSchema<any, AnyObject, TypeOfShape<any>, AssertsShape<any>>\n | Lazy<any, unknown> => {\n return getYupObjectShape(field.extra.fields, yupTypeMap);\n },\n array: (\n field\n ):\n | yup.ArraySchema<any, AnyObject, any[] | undefined>\n | RequiredArraySchema<any, AnyObject, any[] | undefined> => {\n if (typeof field.extra.of === 'object') {\n // else if the field is an object then it is a scalar type\n // eg. number, string etc.\n let arrayValidator = yup\n .array()\n .of(yupTypeMap[field.extra.of.type](field.extra.of))\n .required(field.required);\n if (field.extra.length)\n arrayValidator = arrayValidator.length(field.extra.length, {\n key: 'form.error.array.length',\n context: {\n length: field.extra.length,\n },\n });\n if (field.extra.min)\n arrayValidator = arrayValidator.min(field.extra.min, {\n key: 'form.error.array.min',\n context: {\n min: field.extra.min,\n },\n });\n if (field.extra.max)\n arrayValidator = arrayValidator.max(field.extra.max, {\n key: 'form.error.array.max',\n context: {\n max: field.extra.max,\n },\n });\n return arrayValidator;\n } else if (typeof field.extra.of === 'string') {\n return yup.array().of(yupTypeMap[field.extra.of]());\n } else {\n // in any other case it will be string\n return yup.array().of(yup.string());\n }\n },\n number: (): MixedSchema =>\n yup\n .mixed()\n .transform((_, val) => (val !== '' ? Number(val) : undefined))\n .test(NUMBER_VALIDATOR()),\n int: (): MixedSchema =>\n yup\n .mixed()\n .transform((_, val) => (val !== '' ? Number(val) : undefined))\n .test(NUMBER_VALIDATOR())\n .test(INT_VALIDATOR()),\n email: (field): yup.StringSchema =>\n field.trim\n ? yup.string().trim().email('form.error.email')\n : yup.string().email('form.error.email'),\n afm: (field): yup.StringSchema =>\n field.trim\n ? yup.string().trim().test(AFM_VALIDATOR)\n : yup.string().test(AFM_VALIDATOR),\n uuid4: (field): yup.StringSchema =>\n field.trim\n ? yup.string().trim().test(UUID4_VALIDATOR)\n : yup.string().test(UUID4_VALIDATOR),\n iban: (field): yup.StringSchema =>\n field.trim\n ? yup.string().trim().test(IBAN_VALIDATOR(field))\n : yup.string().trim().test(IBAN_VALIDATOR(field)),\n otp: (field): yup.StringSchema =>\n yup.string().trim().test(OTP_VALIDATOR(field)),\n text: (field): yup.StringSchema => {\n if (field?.extra?.limit?.max || !!field?.extra?.limit?.min) {\n return field.trim\n ? yup.string().trim().test(TEXT_LIMIT_VALIDATOR(field))\n : yup.string().test(TEXT_LIMIT_VALIDATOR(field));\n } else {\n return field.trim ? yup.string().trim() : yup.string();\n }\n },\n image: (field): MixedSchema => {\n return yup\n .mixed()\n .transform((value) => {\n if (!value.length || value.length === 0) {\n return null;\n }\n return value;\n })\n .nullable()\n .test(FILE_MAX_SIZE_VALIDATOR(field))\n .test(IMAGE_DIMENSION_VALIDATOR(field));\n },\n postal_code: (field): yup.StringSchema =>\n field.trim\n ? yup.string().trim().test(POSTALCODE_VALIDATOR(field))\n : yup.string().test(POSTALCODE_VALIDATOR(field)),\n mobile_phone: (field): yup.StringSchema =>\n field.trim\n ? yup.string().trim().test(MOBILE_PHONE_VALIDATOR)\n : yup.string().test(MOBILE_PHONE_VALIDATOR),\n phone_number: (field): yup.StringSchema =>\n field.trim\n ? yup.string().trim().test(PHONE_NUMBER_VALIDATOR(field))\n : yup.string().test(PHONE_NUMBER_VALIDATOR(field)),\n 'choice:multiple': (): yup.ArraySchema<\n yup.StringSchema<string | undefined, AnyObject, string | undefined>,\n AnyObject,\n (string | undefined)[] | null | undefined,\n (string | undefined)[] | null | undefined\n > => yup.array().of(yup.string()).nullable(),\n 'choice:single': (): StringSchema<\n string | null | undefined,\n AnyObject,\n string | null | undefined\n > => yup.string().nullable(),\n date: (\n field\n ): yup.StringSchema<\n string | null | undefined,\n AnyObject,\n string | null | undefined\n > => {\n let schema = yup.string().nullable();\n if (field?.extra?.min) {\n schema = schema.test(LATER_THAN_VALIDATOR(field));\n }\n if (field?.extra?.max) {\n schema = schema.test(EARLIER_THAN_VALIDATOR(field));\n } else {\n schema = schema.test(DATE_VALIDATOR);\n }\n return schema;\n },\n datetime: (field): yup.StringSchema => {\n if (field?.extra?.min) {\n return yup.string().test(LATER_THAN_DATETIME_VALIDATOR(field));\n }\n if (field?.extra?.max) {\n return yup.string().test(EARLIER_THAN_DATETIME_VALIDATOR(field));\n }\n return yup.string().test(DATETIME_VALIDATOR);\n },\n };\n return yupTypeMap;\n};\n\nexport interface MutableRefObjectProps {}\n// Create a yup validation schema from given fields input\nexport function useValidationSchema(\n fields: FieldSpec[] | MutableRefObject<MutableRefObjectProps>,\n validatorRegistry?: Record<string, ValidatorSchema[]>\n): Lazy<any, unknown> | AnyObjectSchema | void {\n return useMemo(() => {\n const yupTypeMap = getYUPTypeMap();\n return getYupObjectShape(fields, yupTypeMap, validatorRegistry);\n }, []);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -10,7 +10,7 @@ const INT_VALIDATOR = () => {
10
10
  name: "int-validator",
11
11
  message: "form.error.positive_integer_number",
12
12
  test: (value) => {
13
- if (value === null) {
13
+ if (value === void 0) {
14
14
  return true;
15
15
  }
16
16
  return validateIntNumber(value);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/validators/utils/int.ts"],
4
- "sourcesContent": ["import { ValidatorSchema } from '@digigov/form/validators/types';\n\nexport function validateIntNumber(number: number): boolean {\n if (number === undefined) {\n return false;\n } else {\n return Number.isInteger(number) && Number(number) > 0;\n }\n}\n\nexport const INT_VALIDATOR = (): ValidatorSchema => {\n return {\n name: 'int-validator',\n message: 'form.error.positive_integer_number',\n test: (value: number): boolean => {\n if (value === null) {\n return true;\n }\n return validateIntNumber(value);\n },\n };\n};\n"],
5
- "mappings": "AAEO,SAAS,kBAAkB,QAAyB;AACzD,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT,OAAO;AACL,WAAO,OAAO,UAAU,MAAM,KAAK,OAAO,MAAM,IAAI;AAAA,EACtD;AACF;AAEO,MAAM,gBAAgB,MAAuB;AAClD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,UAA2B;AAChC,UAAI,UAAU,MAAM;AAClB,eAAO;AAAA,MACT;AACA,aAAO,kBAAkB,KAAK;AAAA,IAChC;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { ValidatorSchema } from '@digigov/form/validators/types';\n\nexport function validateIntNumber(number: number): boolean {\n if (number === undefined) {\n return false;\n } else {\n return Number.isInteger(number) && Number(number) > 0;\n }\n}\n\nexport const INT_VALIDATOR = (): ValidatorSchema => {\n return {\n name: 'int-validator',\n message: 'form.error.positive_integer_number',\n test: (value: number): boolean => {\n if (value === undefined) {\n return true;\n }\n return validateIntNumber(value);\n },\n };\n};\n"],
5
+ "mappings": "AAEO,SAAS,kBAAkB,QAAyB;AACzD,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT,OAAO;AACL,WAAO,OAAO,UAAU,MAAM,KAAK,OAAO,MAAM,IAAI;AAAA,EACtD;AACF;AAEO,MAAM,gBAAgB,MAAuB;AAClD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,UAA2B;AAChC,UAAI,UAAU,QAAW;AACvB,eAAO;AAAA,MACT;AACA,aAAO,kBAAkB,KAAK;AAAA,IAChC;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -6,7 +6,7 @@ const NUMBER_VALIDATOR = () => {
6
6
  name: "number-validator",
7
7
  message: "form.error.number",
8
8
  test: (value) => {
9
- if (value === null) {
9
+ if (value === void 0) {
10
10
  return true;
11
11
  }
12
12
  return validateNumber(value);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/validators/utils/number.ts"],
4
- "sourcesContent": ["import { ValidatorSchema } from '@digigov/form/validators/types';\n\nexport function validateNumber(number: number): boolean {\n return !Number.isNaN(number);\n}\n\nexport const NUMBER_VALIDATOR = (): ValidatorSchema => {\n return {\n name: 'number-validator',\n message: 'form.error.number',\n test: (value: number): boolean => {\n if (value === null) {\n return true;\n }\n return validateNumber(value);\n },\n };\n};\n"],
5
- "mappings": "AAEO,SAAS,eAAe,QAAyB;AACtD,SAAO,CAAC,OAAO,MAAM,MAAM;AAC7B;AAEO,MAAM,mBAAmB,MAAuB;AACrD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,UAA2B;AAChC,UAAI,UAAU,MAAM;AAClB,eAAO;AAAA,MACT;AACA,aAAO,eAAe,KAAK;AAAA,IAC7B;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { ValidatorSchema } from '@digigov/form/validators/types';\n\nexport function validateNumber(number: number): boolean {\n return !Number.isNaN(number);\n}\n\nexport const NUMBER_VALIDATOR = (): ValidatorSchema => {\n return {\n name: 'number-validator',\n message: 'form.error.number',\n test: (value: number): boolean => {\n if (value === undefined) {\n return true;\n }\n return validateNumber(value);\n },\n };\n};\n"],
5
+ "mappings": "AAEO,SAAS,eAAe,QAAyB;AACtD,SAAO,CAAC,OAAO,MAAM,MAAM;AAC7B;AAEO,MAAM,mBAAmB,MAAuB;AACrD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,UAA2B;AAChC,UAAI,UAAU,QAAW;AACvB,eAAO;AAAA,MACT;AACA,aAAO,eAAe,KAAK;AAAA,IAC7B;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }