@ukhomeoffice/cop-react-form-renderer 2.10.2 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/CheckYourAnswers/Answer.test.js +12 -12
- package/dist/components/FormComponent/FormComponent.test.js +18 -15
- package/dist/components/FormRenderer/FormRenderer.js +9 -22
- package/dist/components/FormRenderer/FormRenderer.stories.mdx +31 -29
- package/dist/context/HooksContext/HooksContext.js +91 -0
- package/dist/context/HooksContext/HooksContext.test.js +60 -0
- package/dist/context/HooksContext/index.js +23 -0
- package/dist/context/index.js +8 -0
- package/dist/hooks/useHooks.js +6 -53
- package/dist/index.js +1 -9
- package/dist/setupTests.js +31 -4
- package/dist/utils/CheckYourAnswers/getCYARowForGroup.test.js +4 -5
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.test.js +2 -4
- package/dist/utils/Component/getComponentTests/getComponent.date.test.js +6 -6
- package/dist/utils/Validate/index.js +3 -0
- package/dist/utils/Validate/validateCollection.js +9 -2
- package/dist/utils/Validate/validateComponent.js +23 -17
- package/dist/utils/Validate/validateContainer.js +12 -3
- package/dist/utils/Validate/validatePage.js +1 -1
- package/dist/utils/Validate/validateRegex.js +56 -0
- package/dist/utils/Validate/validateRegex.test.js +41 -0
- package/package.json +2 -2
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _react = require("@testing-library/react");
|
|
4
|
-
|
|
5
3
|
var _Readonly = require("@ukhomeoffice/cop-react-components/dist/Readonly");
|
|
6
4
|
|
|
7
|
-
var
|
|
5
|
+
var _react = _interopRequireDefault(require("react"));
|
|
6
|
+
|
|
7
|
+
var _setupTests = require("../../setupTests");
|
|
8
8
|
|
|
9
9
|
var _Answer = _interopRequireDefault(require("./Answer"));
|
|
10
10
|
|
|
@@ -17,7 +17,7 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar
|
|
|
17
17
|
describe('components', function () {
|
|
18
18
|
describe('CheckYourAnswers.Answer', function () {
|
|
19
19
|
it('should handle a null value', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
|
20
|
-
var VALUE, COMPONENT,
|
|
20
|
+
var VALUE, COMPONENT, _renderWithValidation, container;
|
|
21
21
|
|
|
22
22
|
return regeneratorRuntime.wrap(function _callee$(_context) {
|
|
23
23
|
while (1) {
|
|
@@ -25,10 +25,10 @@ describe('components', function () {
|
|
|
25
25
|
case 0:
|
|
26
26
|
VALUE = null;
|
|
27
27
|
COMPONENT = null;
|
|
28
|
-
|
|
28
|
+
_renderWithValidation = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_Answer.default, {
|
|
29
29
|
value: VALUE,
|
|
30
30
|
component: COMPONENT
|
|
31
|
-
})), container =
|
|
31
|
+
})), container = _renderWithValidation.container;
|
|
32
32
|
expect(container.childNodes.length).toEqual(1);
|
|
33
33
|
expect(container.childNodes[0].textContent).toEqual('No answer');
|
|
34
34
|
|
|
@@ -40,7 +40,7 @@ describe('components', function () {
|
|
|
40
40
|
}, _callee);
|
|
41
41
|
})));
|
|
42
42
|
it('should handle a null component', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
|
|
43
|
-
var VALUE, COMPONENT,
|
|
43
|
+
var VALUE, COMPONENT, _renderWithValidation2, container;
|
|
44
44
|
|
|
45
45
|
return regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
46
46
|
while (1) {
|
|
@@ -48,10 +48,10 @@ describe('components', function () {
|
|
|
48
48
|
case 0:
|
|
49
49
|
VALUE = 'Alpha';
|
|
50
50
|
COMPONENT = null;
|
|
51
|
-
|
|
51
|
+
_renderWithValidation2 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_Answer.default, {
|
|
52
52
|
value: VALUE,
|
|
53
53
|
component: COMPONENT
|
|
54
|
-
})), container =
|
|
54
|
+
})), container = _renderWithValidation2.container;
|
|
55
55
|
expect(container.textContent).toEqual(VALUE);
|
|
56
56
|
|
|
57
57
|
case 4:
|
|
@@ -62,7 +62,7 @@ describe('components', function () {
|
|
|
62
62
|
}, _callee2);
|
|
63
63
|
})));
|
|
64
64
|
it('should handle a component', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
|
|
65
|
-
var VALUE, COMPONENT,
|
|
65
|
+
var VALUE, COMPONENT, _renderWithValidation3, container, answer;
|
|
66
66
|
|
|
67
67
|
return regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
68
68
|
while (1) {
|
|
@@ -75,10 +75,10 @@ describe('components', function () {
|
|
|
75
75
|
type: 'text',
|
|
76
76
|
label: 'Alpha'
|
|
77
77
|
};
|
|
78
|
-
|
|
78
|
+
_renderWithValidation3 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_Answer.default, {
|
|
79
79
|
value: VALUE,
|
|
80
80
|
component: COMPONENT
|
|
81
|
-
})), container =
|
|
81
|
+
})), container = _renderWithValidation3.container;
|
|
82
82
|
answer = container.childNodes[0];
|
|
83
83
|
expect(answer.tagName).toEqual('DIV');
|
|
84
84
|
expect(answer.classList).toContain(_Readonly.DEFAULT_CLASS);
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var _react = _interopRequireDefault(require("react"));
|
|
4
4
|
|
|
5
|
-
var _useHooks = require("../../hooks/useHooks");
|
|
6
|
-
|
|
7
5
|
var _setupTests = require("../../setupTests");
|
|
8
6
|
|
|
9
7
|
var _FormComponent = _interopRequireDefault(require("./FormComponent"));
|
|
@@ -16,9 +14,6 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar
|
|
|
16
14
|
|
|
17
15
|
describe('components', function () {
|
|
18
16
|
describe('FormComponent', function () {
|
|
19
|
-
beforeEach(function () {
|
|
20
|
-
(0, _useHooks.resetHooks)();
|
|
21
|
-
});
|
|
22
17
|
it('should render a text component appropriately', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
|
23
18
|
var ID, VALUE, COMPONENT, ON_CHANGE, _renderWithValidation, container, formGroup, label, hint, input;
|
|
24
19
|
|
|
@@ -139,15 +134,17 @@ describe('components', function () {
|
|
|
139
134
|
}, _callee3);
|
|
140
135
|
})));
|
|
141
136
|
it('should render an overridden html component appropriately', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
|
|
142
|
-
var ID, COMPONENT, _renderWithValidation4, container, div;
|
|
137
|
+
var hooks, ID, COMPONENT, _renderWithValidation4, container, div;
|
|
143
138
|
|
|
144
139
|
return regeneratorRuntime.wrap(function _callee4$(_context4) {
|
|
145
140
|
while (1) {
|
|
146
141
|
switch (_context4.prev = _context4.next) {
|
|
147
142
|
case 0:
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
143
|
+
hooks = {
|
|
144
|
+
onGetComponent: function onGetComponent(config, wrap) {
|
|
145
|
+
return /*#__PURE__*/_react.default.createElement("div", null, "".concat(config.type, " | ").concat(config.tagName, " | ").concat(config.content, " | ").concat(wrap));
|
|
146
|
+
}
|
|
147
|
+
};
|
|
151
148
|
ID = 'component';
|
|
152
149
|
COMPONENT = {
|
|
153
150
|
type: 'html',
|
|
@@ -157,7 +154,9 @@ describe('components', function () {
|
|
|
157
154
|
_renderWithValidation4 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_FormComponent.default, {
|
|
158
155
|
"data-testid": ID,
|
|
159
156
|
component: COMPONENT
|
|
160
|
-
})
|
|
157
|
+
}), {
|
|
158
|
+
hooks: hooks
|
|
159
|
+
}), container = _renderWithValidation4.container;
|
|
161
160
|
div = container.childNodes[0];
|
|
162
161
|
expect(div.tagName).toEqual('DIV');
|
|
163
162
|
expect(div.textContent).toEqual("".concat(COMPONENT.type, " | ").concat(COMPONENT.tagName, " | ").concat(COMPONENT.content, " | true"));
|
|
@@ -170,15 +169,17 @@ describe('components', function () {
|
|
|
170
169
|
}, _callee4);
|
|
171
170
|
})));
|
|
172
171
|
it('should render the correct html component when the override returns null', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
|
|
173
|
-
var ID, COMPONENT, _renderWithValidation5, container, p;
|
|
172
|
+
var hooks, ID, COMPONENT, _renderWithValidation5, container, p;
|
|
174
173
|
|
|
175
174
|
return regeneratorRuntime.wrap(function _callee5$(_context5) {
|
|
176
175
|
while (1) {
|
|
177
176
|
switch (_context5.prev = _context5.next) {
|
|
178
177
|
case 0:
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
178
|
+
hooks = {
|
|
179
|
+
onGetComponent: function onGetComponent() {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
182
183
|
ID = 'component';
|
|
183
184
|
COMPONENT = {
|
|
184
185
|
type: 'html',
|
|
@@ -188,7 +189,9 @@ describe('components', function () {
|
|
|
188
189
|
_renderWithValidation5 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_FormComponent.default, {
|
|
189
190
|
"data-testid": ID,
|
|
190
191
|
component: COMPONENT
|
|
191
|
-
})
|
|
192
|
+
}), {
|
|
193
|
+
hooks: hooks
|
|
194
|
+
}), container = _renderWithValidation5.container;
|
|
192
195
|
p = container.childNodes[0];
|
|
193
196
|
expect(p.tagName).toEqual('P');
|
|
194
197
|
expect(p.textContent).toEqual(COMPONENT.content);
|
|
@@ -15,7 +15,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
15
15
|
|
|
16
16
|
var _context = require("../../context");
|
|
17
17
|
|
|
18
|
-
var
|
|
18
|
+
var _hooks = require("../../hooks");
|
|
19
19
|
|
|
20
20
|
var _models = require("../../models");
|
|
21
21
|
|
|
@@ -74,7 +74,9 @@ var FormRenderer = function FormRenderer(_ref) {
|
|
|
74
74
|
hide_title = _ref.hide_title,
|
|
75
75
|
summaryListClassModifiers = _ref.summaryListClassModifiers,
|
|
76
76
|
noChangeAction = _ref.noChangeAction;
|
|
77
|
-
return /*#__PURE__*/_react.default.createElement(_context.
|
|
77
|
+
return /*#__PURE__*/_react.default.createElement(_context.HooksContextProvider, {
|
|
78
|
+
overrides: hooks
|
|
79
|
+
}, /*#__PURE__*/_react.default.createElement(_context.ValidationContextProvider, null, /*#__PURE__*/_react.default.createElement(InternalFormRenderer, {
|
|
78
80
|
title: title,
|
|
79
81
|
type: type,
|
|
80
82
|
components: components,
|
|
@@ -82,14 +84,13 @@ var FormRenderer = function FormRenderer(_ref) {
|
|
|
82
84
|
hub: hub,
|
|
83
85
|
cya: cya,
|
|
84
86
|
data: data,
|
|
85
|
-
hooks: hooks,
|
|
86
87
|
classBlock: classBlock,
|
|
87
88
|
classModifiers: classModifiers,
|
|
88
89
|
className: className,
|
|
89
90
|
hide_title: hide_title,
|
|
90
91
|
summaryListClassModifiers: summaryListClassModifiers,
|
|
91
92
|
noChangeAction: noChangeAction
|
|
92
|
-
}));
|
|
93
|
+
})));
|
|
93
94
|
};
|
|
94
95
|
|
|
95
96
|
var DEFAULT_CLASS = 'hods-form';
|
|
@@ -103,7 +104,6 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
|
|
|
103
104
|
_hub = _ref2.hub,
|
|
104
105
|
cya = _ref2.cya,
|
|
105
106
|
_data = _ref2.data,
|
|
106
|
-
_hooks = _ref2.hooks,
|
|
107
107
|
classBlock = _ref2.classBlock,
|
|
108
108
|
classModifiers = _ref2.classModifiers,
|
|
109
109
|
className = _ref2.className,
|
|
@@ -153,19 +153,11 @@ var InternalFormRenderer = function InternalFormRenderer(_ref2) {
|
|
|
153
153
|
setHubDetails = _useState16[1]; // Set up hooks.
|
|
154
154
|
|
|
155
155
|
|
|
156
|
-
var _useHooks = (0,
|
|
157
|
-
hooks = _useHooks.hooks
|
|
158
|
-
addHook = _useHooks.addHook;
|
|
156
|
+
var _useHooks = (0, _hooks.useHooks)(),
|
|
157
|
+
hooks = _useHooks.hooks; // Set up the useValidation hook.
|
|
159
158
|
|
|
160
|
-
(0, _react.useEffect)(function () {
|
|
161
|
-
if (_hooks) {
|
|
162
|
-
Object.keys(_hooks).forEach(function (key) {
|
|
163
|
-
addHook(key, _hooks[key]);
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
}, [_hooks, addHook]); // Set up the useValidation hook.
|
|
167
159
|
|
|
168
|
-
var _useValidation = (0,
|
|
160
|
+
var _useValidation = (0, _hooks.useValidation)(),
|
|
169
161
|
addErrors = _useValidation.addErrors,
|
|
170
162
|
clearErrors = _useValidation.clearErrors,
|
|
171
163
|
validate = _useValidation.validate; // Setup data.
|
|
@@ -423,12 +415,7 @@ FormRenderer.propTypes = InternalFormRenderer.propTypes = {
|
|
|
423
415
|
hub: _propTypes.default.object,
|
|
424
416
|
cya: _propTypes.default.object,
|
|
425
417
|
data: _propTypes.default.object,
|
|
426
|
-
hooks: _propTypes.default.
|
|
427
|
-
onFormLoad: _propTypes.default.func,
|
|
428
|
-
onPageChange: _propTypes.default.func,
|
|
429
|
-
onRequest: _propTypes.default.func,
|
|
430
|
-
onSubmit: _propTypes.default.func
|
|
431
|
-
}),
|
|
418
|
+
hooks: _propTypes.default.object,
|
|
432
419
|
classBlock: _propTypes.default.string,
|
|
433
420
|
classModifiers: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)]),
|
|
434
421
|
className: _propTypes.default.string,
|
|
@@ -12,12 +12,9 @@ import { useState } from 'react';
|
|
|
12
12
|
import withMock from 'storybook-addon-mock';
|
|
13
13
|
|
|
14
14
|
<!-- Local imports -->
|
|
15
|
-
|
|
16
|
-
import { addHook } from '../../hooks/useHooks';
|
|
17
15
|
import FormRenderer from './FormRenderer';
|
|
18
16
|
|
|
19
17
|
<!-- JSON documents -->
|
|
20
|
-
|
|
21
18
|
import CIVIL_SERVANT from '../../json/areYouACivilServant.json';
|
|
22
19
|
import FIRST_FORM from '../../json/firstForm.json';
|
|
23
20
|
import GRADE from '../../json/grade.json';
|
|
@@ -82,31 +79,6 @@ on the basis of a <Link href="/?path=/docs/f-json-form">JSON</Link> that describ
|
|
|
82
79
|
{() => {
|
|
83
80
|
const [complete, setComplete] = useState(false);
|
|
84
81
|
const [returnLater, setReturnLater] = useState(false);
|
|
85
|
-
addHook('onRequest', (req) => {
|
|
86
|
-
// Do whatever you need to do to the request in here, such as adding an Authorization header.
|
|
87
|
-
console.log('onRequest hook called');
|
|
88
|
-
return req;
|
|
89
|
-
});
|
|
90
|
-
addHook('onFormLoad', () => {
|
|
91
|
-
console.log('onFormLoad called');
|
|
92
|
-
});
|
|
93
|
-
addHook('onFormComplete', () => {
|
|
94
|
-
console.log('onFormComplete called');
|
|
95
|
-
setComplete(true);
|
|
96
|
-
});
|
|
97
|
-
addHook('onPageChange', (pageId) => {
|
|
98
|
-
console.log('onPageChange called', pageId);
|
|
99
|
-
setReturnLater(!!pageId === false);
|
|
100
|
-
});
|
|
101
|
-
addHook('onSubmit', (type, payload, onSuccess, onError) => {
|
|
102
|
-
console.log(
|
|
103
|
-
'onSubmit called of type',
|
|
104
|
-
type,
|
|
105
|
-
'called, with the payload',
|
|
106
|
-
payload
|
|
107
|
-
);
|
|
108
|
-
onSuccess();
|
|
109
|
-
});
|
|
110
82
|
const reset = () => {
|
|
111
83
|
setComplete(false);
|
|
112
84
|
setReturnLater(false);
|
|
@@ -114,7 +86,37 @@ on the basis of a <Link href="/?path=/docs/f-json-form">JSON</Link> that describ
|
|
|
114
86
|
return (
|
|
115
87
|
<>
|
|
116
88
|
{!complete && !returnLater && (
|
|
117
|
-
<FormRenderer
|
|
89
|
+
<FormRenderer
|
|
90
|
+
{...FIRST_FORM}
|
|
91
|
+
data={{}}
|
|
92
|
+
hooks={{
|
|
93
|
+
onRequest: (req) => {
|
|
94
|
+
// Do whatever you need to do to the request in here, such as adding an Authorization header.
|
|
95
|
+
console.log('onRequest hook called');
|
|
96
|
+
return req;
|
|
97
|
+
},
|
|
98
|
+
onFormLoad: () => {
|
|
99
|
+
console.log('onFormLoad called');
|
|
100
|
+
},
|
|
101
|
+
onFormComplete: () => {
|
|
102
|
+
console.log('onFormComplete called');
|
|
103
|
+
setComplete(true);
|
|
104
|
+
},
|
|
105
|
+
onPageChange: (pageId) => {
|
|
106
|
+
console.log('onPageChange called', pageId);
|
|
107
|
+
setReturnLater(!!pageId === false);
|
|
108
|
+
},
|
|
109
|
+
onSubmit: (type, payload, onSuccess, onError) => {
|
|
110
|
+
console.log(
|
|
111
|
+
'onSubmit called of type',
|
|
112
|
+
type,
|
|
113
|
+
'called, with the payload',
|
|
114
|
+
payload
|
|
115
|
+
);
|
|
116
|
+
onSuccess();
|
|
117
|
+
}
|
|
118
|
+
}}
|
|
119
|
+
/>
|
|
118
120
|
)}
|
|
119
121
|
{complete && (
|
|
120
122
|
<div>
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.HooksContext = exports.ALLOWED_HOOKS = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
|
|
10
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
11
|
+
|
|
12
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
13
|
+
|
|
14
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
15
|
+
|
|
16
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
17
|
+
|
|
18
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
19
|
+
|
|
20
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
21
|
+
|
|
22
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
23
|
+
|
|
24
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
25
|
+
|
|
26
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
27
|
+
|
|
28
|
+
var DEFAULT_HOOKS = {
|
|
29
|
+
onFormComplete: function onFormComplete() {},
|
|
30
|
+
onFormLoad: function onFormLoad() {},
|
|
31
|
+
onGetComponent: function onGetComponent(config, wrap) {
|
|
32
|
+
return null;
|
|
33
|
+
},
|
|
34
|
+
onPageChange: function onPageChange(pageId) {
|
|
35
|
+
return pageId;
|
|
36
|
+
},
|
|
37
|
+
onRequest: function onRequest(req) {
|
|
38
|
+
return req;
|
|
39
|
+
},
|
|
40
|
+
onSubmit: function onSubmit(type, payload, onSuccess, onError) {
|
|
41
|
+
if (typeof onSuccess === 'function') onSuccess();
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
var ALLOWED_HOOKS = Object.keys(DEFAULT_HOOKS);
|
|
45
|
+
exports.ALLOWED_HOOKS = ALLOWED_HOOKS;
|
|
46
|
+
var HooksContext = /*#__PURE__*/(0, _react.createContext)();
|
|
47
|
+
exports.HooksContext = HooksContext;
|
|
48
|
+
|
|
49
|
+
var HooksContextProvider = function HooksContextProvider(_ref) {
|
|
50
|
+
var overrides = _ref.overrides,
|
|
51
|
+
children = _ref.children;
|
|
52
|
+
|
|
53
|
+
var _useState = (0, _react.useState)({
|
|
54
|
+
onFormComplete: (overrides === null || overrides === void 0 ? void 0 : overrides.onFormComplete) || DEFAULT_HOOKS.onFormComplete,
|
|
55
|
+
onFormLoad: (overrides === null || overrides === void 0 ? void 0 : overrides.onFormLoad) || DEFAULT_HOOKS.onFormLoad,
|
|
56
|
+
onGetComponent: (overrides === null || overrides === void 0 ? void 0 : overrides.onGetComponent) || DEFAULT_HOOKS.onGetComponent,
|
|
57
|
+
onPageChange: (overrides === null || overrides === void 0 ? void 0 : overrides.onPageChange) || DEFAULT_HOOKS.onPageChange,
|
|
58
|
+
onRequest: (overrides === null || overrides === void 0 ? void 0 : overrides.onRequest) || DEFAULT_HOOKS.onRequest,
|
|
59
|
+
onSubmit: (overrides === null || overrides === void 0 ? void 0 : overrides.onSubmit) || DEFAULT_HOOKS.onSubmit
|
|
60
|
+
}),
|
|
61
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
62
|
+
hooks = _useState2[0],
|
|
63
|
+
setHooks = _useState2[1];
|
|
64
|
+
|
|
65
|
+
var addHook = function addHook(name, hook) {
|
|
66
|
+
if (ALLOWED_HOOKS.includes(name)) {
|
|
67
|
+
setHooks(function (prev) {
|
|
68
|
+
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, hook || DEFAULT_HOOKS[name]));
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
var removeHook = function removeHook(name) {
|
|
74
|
+
if (ALLOWED_HOOKS.includes(name)) {
|
|
75
|
+
setHooks(function (prev) {
|
|
76
|
+
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, name, DEFAULT_HOOKS[name]));
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
return /*#__PURE__*/React.createElement(HooksContext.Provider, {
|
|
82
|
+
value: {
|
|
83
|
+
hooks: hooks,
|
|
84
|
+
addHook: addHook,
|
|
85
|
+
removeHook: removeHook
|
|
86
|
+
}
|
|
87
|
+
}, children);
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
var _default = HooksContextProvider;
|
|
91
|
+
exports.default = _default;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
4
|
+
|
|
5
|
+
var _react = require("@testing-library/react");
|
|
6
|
+
|
|
7
|
+
var _react2 = _interopRequireDefault(require("react"));
|
|
8
|
+
|
|
9
|
+
var _hooks = require("../../hooks");
|
|
10
|
+
|
|
11
|
+
var _HooksContext = _interopRequireWildcard(require("./HooksContext"));
|
|
12
|
+
|
|
13
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
14
|
+
|
|
15
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
16
|
+
|
|
17
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
|
+
|
|
19
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
20
|
+
|
|
21
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
22
|
+
|
|
23
|
+
var TestComponent = function TestComponent() {
|
|
24
|
+
var _useHooks = (0, _hooks.useHooks)(),
|
|
25
|
+
hooks = _useHooks.hooks,
|
|
26
|
+
addHook = _useHooks.addHook,
|
|
27
|
+
removeHook = _useHooks.removeHook;
|
|
28
|
+
|
|
29
|
+
return /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null, typeof addHook === 'function' && /*#__PURE__*/_react2.default.createElement("span", null, "addHook is a function"), typeof removeHook === 'function' && /*#__PURE__*/_react2.default.createElement("span", null, "removeHook is a function"), Object.keys(hooks).map(function (key) {
|
|
30
|
+
return typeof hooks[key] === 'function' && /*#__PURE__*/_react2.default.createElement("span", {
|
|
31
|
+
key: key
|
|
32
|
+
}, key, " is a function");
|
|
33
|
+
}));
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
describe('context.ValidationContext', function () {
|
|
37
|
+
it('should appropriately set up the context', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
|
38
|
+
var _render, container;
|
|
39
|
+
|
|
40
|
+
return regeneratorRuntime.wrap(function _callee$(_context) {
|
|
41
|
+
while (1) {
|
|
42
|
+
switch (_context.prev = _context.next) {
|
|
43
|
+
case 0:
|
|
44
|
+
_render = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(_HooksContext.default, null, /*#__PURE__*/_react2.default.createElement(TestComponent, null))), container = _render.container;
|
|
45
|
+
expect(container.childNodes.length).toEqual(2 + _HooksContext.ALLOWED_HOOKS.length);
|
|
46
|
+
expect(container.textContent).toContain('addHook is a function');
|
|
47
|
+
expect(container.textContent).toContain('removeHook is a function');
|
|
48
|
+
|
|
49
|
+
_HooksContext.ALLOWED_HOOKS.forEach(function (hook) {
|
|
50
|
+
expect(container.textContent).toContain("".concat(hook, " is a function"));
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
case 5:
|
|
54
|
+
case "end":
|
|
55
|
+
return _context.stop();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}, _callee);
|
|
59
|
+
})));
|
|
60
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
Object.defineProperty(exports, "HooksContext", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function get() {
|
|
11
|
+
return _HooksContext.HooksContext;
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
exports.default = void 0;
|
|
15
|
+
|
|
16
|
+
var _HooksContext = _interopRequireWildcard(require("./HooksContext"));
|
|
17
|
+
|
|
18
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
19
|
+
|
|
20
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
21
|
+
|
|
22
|
+
var _default = _HooksContext.default;
|
|
23
|
+
exports.default = _default;
|
package/dist/context/index.js
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
Object.defineProperty(exports, "HooksContextProvider", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _HooksContext.default;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
6
12
|
Object.defineProperty(exports, "ValidationContextProvider", {
|
|
7
13
|
enumerable: true,
|
|
8
14
|
get: function get() {
|
|
@@ -10,6 +16,8 @@ Object.defineProperty(exports, "ValidationContextProvider", {
|
|
|
10
16
|
}
|
|
11
17
|
});
|
|
12
18
|
|
|
19
|
+
var _HooksContext = _interopRequireDefault(require("./HooksContext"));
|
|
20
|
+
|
|
13
21
|
var _ValidationContext = _interopRequireDefault(require("./ValidationContext"));
|
|
14
22
|
|
|
15
23
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
package/dist/hooks/useHooks.js
CHANGED
|
@@ -3,63 +3,16 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
7
|
-
var ALLOWED_HOOKS = ['onFormComplete', 'onFormLoad', 'onGetComponent', 'onPageChange', 'onRequest', 'onSubmit'];
|
|
8
|
-
exports.ALLOWED_HOOKS = ALLOWED_HOOKS;
|
|
9
|
-
var DEFAULT_HOOKS = {
|
|
10
|
-
onFormComplete: function onFormComplete() {},
|
|
11
|
-
onFormLoad: function onFormLoad() {},
|
|
12
|
-
onGetComponent: function onGetComponent(config, wrap) {
|
|
13
|
-
return null;
|
|
14
|
-
},
|
|
15
|
-
onPageChange: function onPageChange(pageId) {
|
|
16
|
-
return pageId;
|
|
17
|
-
},
|
|
18
|
-
onRequest: function onRequest(req) {
|
|
19
|
-
return req;
|
|
20
|
-
},
|
|
21
|
-
onSubmit: function onSubmit(type, payload, onSuccess, onError) {
|
|
22
|
-
if (typeof onSuccess === 'function') onSuccess();
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
var hooks = {
|
|
26
|
-
onFormComplete: DEFAULT_HOOKS.onFormComplete,
|
|
27
|
-
onFormLoad: DEFAULT_HOOKS.onFormLoad,
|
|
28
|
-
onGetComponent: DEFAULT_HOOKS.onGetComponent,
|
|
29
|
-
onPageChange: DEFAULT_HOOKS.onPageChange,
|
|
30
|
-
onRequest: DEFAULT_HOOKS.onRequest,
|
|
31
|
-
onSubmit: DEFAULT_HOOKS.onSubmit
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
var addHook = function addHook(name, hook) {
|
|
35
|
-
if (ALLOWED_HOOKS.includes(name)) {
|
|
36
|
-
hooks[name] = hook || DEFAULT_HOOKS[name]; // Don't allow it to be undefined.
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
exports.addHook = addHook;
|
|
6
|
+
exports.default = void 0;
|
|
41
7
|
|
|
42
|
-
var
|
|
43
|
-
if (ALLOWED_HOOKS.includes(name)) {
|
|
44
|
-
hooks[name] = DEFAULT_HOOKS[name];
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
exports.removeHook = removeHook;
|
|
49
|
-
|
|
50
|
-
var resetHooks = function resetHooks() {
|
|
51
|
-
Object.keys(hooks).forEach(removeHook);
|
|
52
|
-
};
|
|
8
|
+
var _react = require("react");
|
|
53
9
|
|
|
54
|
-
|
|
10
|
+
var _HooksContext = require("../context/HooksContext");
|
|
55
11
|
|
|
12
|
+
// Global imports
|
|
13
|
+
// Local imports
|
|
56
14
|
var useHooks = function useHooks() {
|
|
57
|
-
return
|
|
58
|
-
hooks: hooks,
|
|
59
|
-
addHook: addHook,
|
|
60
|
-
removeHook: removeHook,
|
|
61
|
-
resetHooks: resetHooks
|
|
62
|
-
};
|
|
15
|
+
return (0, _react.useContext)(_HooksContext.HooksContext);
|
|
63
16
|
};
|
|
64
17
|
|
|
65
18
|
var _default = useHooks;
|
package/dist/index.js
CHANGED
|
@@ -39,14 +39,12 @@ Object.defineProperty(exports, "ValidationContextProvider", {
|
|
|
39
39
|
return _context.ValidationContextProvider;
|
|
40
40
|
}
|
|
41
41
|
});
|
|
42
|
-
exports.
|
|
42
|
+
exports.default = void 0;
|
|
43
43
|
|
|
44
44
|
var _components = require("./components");
|
|
45
45
|
|
|
46
46
|
var _context = require("./context");
|
|
47
47
|
|
|
48
|
-
var _useHooks = require("./hooks/useHooks");
|
|
49
|
-
|
|
50
48
|
var _models = require("./models");
|
|
51
49
|
|
|
52
50
|
var _utils = _interopRequireDefault(require("./utils"));
|
|
@@ -54,11 +52,5 @@ var _utils = _interopRequireDefault(require("./utils"));
|
|
|
54
52
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
55
53
|
|
|
56
54
|
// Local imports
|
|
57
|
-
var intercepts = {
|
|
58
|
-
add: _useHooks.addHook,
|
|
59
|
-
remove: _useHooks.removeHook,
|
|
60
|
-
reset: _useHooks.resetHooks
|
|
61
|
-
};
|
|
62
|
-
exports.intercepts = intercepts;
|
|
63
55
|
var _default = _components.FormRenderer;
|
|
64
56
|
exports.default = _default;
|
package/dist/setupTests.js
CHANGED
|
@@ -3,26 +3,53 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.renderWithValidation = exports.renderDomWithValidation = exports.expectObjectLike = void 0;
|
|
6
|
+
exports.renderWithValidation = exports.renderHookWithProvider = exports.renderDomWithValidation = exports.expectObjectLike = void 0;
|
|
7
7
|
|
|
8
8
|
var _react = require("@testing-library/react");
|
|
9
9
|
|
|
10
|
+
var _reactHooks = require("@testing-library/react-hooks");
|
|
11
|
+
|
|
10
12
|
var _reactDom = require("react-dom");
|
|
11
13
|
|
|
12
14
|
var _context = require("./context");
|
|
13
15
|
|
|
14
16
|
var renderWithValidation = function renderWithValidation(ui, options) {
|
|
15
|
-
return (0, _react.render)( /*#__PURE__*/React.createElement(_context.
|
|
17
|
+
return (0, _react.render)( /*#__PURE__*/React.createElement(_context.HooksContextProvider, {
|
|
18
|
+
overrides: options === null || options === void 0 ? void 0 : options.hooks
|
|
19
|
+
}, /*#__PURE__*/React.createElement(_context.ValidationContextProvider, {
|
|
20
|
+
key: "vcp"
|
|
21
|
+
}, ui)), options);
|
|
16
22
|
};
|
|
17
23
|
|
|
18
24
|
exports.renderWithValidation = renderWithValidation;
|
|
19
25
|
|
|
20
|
-
var renderDomWithValidation = function renderDomWithValidation(ui, container,
|
|
21
|
-
return (0, _reactDom.render)( /*#__PURE__*/React.createElement(_context.
|
|
26
|
+
var renderDomWithValidation = function renderDomWithValidation(ui, container, options) {
|
|
27
|
+
return (0, _reactDom.render)( /*#__PURE__*/React.createElement(_context.HooksContextProvider, {
|
|
28
|
+
overrides: options === null || options === void 0 ? void 0 : options.hooks
|
|
29
|
+
}, /*#__PURE__*/React.createElement(_context.ValidationContextProvider, {
|
|
30
|
+
key: "vcp"
|
|
31
|
+
}, ui)), container);
|
|
22
32
|
};
|
|
23
33
|
|
|
24
34
|
exports.renderDomWithValidation = renderDomWithValidation;
|
|
25
35
|
|
|
36
|
+
var renderHookWithProvider = function renderHookWithProvider(hook, options) {
|
|
37
|
+
var wrapper = function wrapper(_ref) {
|
|
38
|
+
var children = _ref.children;
|
|
39
|
+
return /*#__PURE__*/React.createElement(_context.HooksContextProvider, {
|
|
40
|
+
overrides: options === null || options === void 0 ? void 0 : options.hooks
|
|
41
|
+
}, children);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
return (0, _reactHooks.renderHook)(function () {
|
|
45
|
+
return hook();
|
|
46
|
+
}, {
|
|
47
|
+
wrapper: wrapper
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
exports.renderHookWithProvider = renderHookWithProvider;
|
|
52
|
+
|
|
26
53
|
var expectObjectLike = function expectObjectLike(received, expected) {
|
|
27
54
|
Object.keys(expected).forEach(function (key) {
|
|
28
55
|
expect(received[key]).toEqual(expected[key]);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _setupTests = require("../../setupTests");
|
|
4
4
|
|
|
5
5
|
var _getCYARowForGroup = _interopRequireDefault(require("./getCYARowForGroup"));
|
|
6
6
|
|
|
@@ -8,8 +8,7 @@ var _getCYARow = _interopRequireDefault(require("./getCYARow"));
|
|
|
8
8
|
|
|
9
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
10
|
|
|
11
|
-
//
|
|
12
|
-
//local imports
|
|
11
|
+
// Local imports
|
|
13
12
|
describe('utils', function () {
|
|
14
13
|
describe('CheckYourAnswers', function () {
|
|
15
14
|
describe('getCYARowsForGroup', function () {
|
|
@@ -63,8 +62,8 @@ describe('utils', function () {
|
|
|
63
62
|
return (0, _getCYARow.default)(PAGE, component, ON_ACTION);
|
|
64
63
|
});
|
|
65
64
|
|
|
66
|
-
var
|
|
67
|
-
container =
|
|
65
|
+
var _renderWithValidation = (0, _setupTests.renderWithValidation)((0, _getCYARowForGroup.default)(PAGE, PAGE.groups[0], rows, ON_ACTION).row.value),
|
|
66
|
+
container = _renderWithValidation.container;
|
|
68
67
|
|
|
69
68
|
expect(container.childNodes.length).toEqual(4);
|
|
70
69
|
var addressValues = container.childNodes;
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _react = require("@testing-library/react");
|
|
4
|
-
|
|
5
3
|
var _setupTests = require("../../setupTests");
|
|
6
4
|
|
|
7
5
|
var _models = require("../../models");
|
|
@@ -222,10 +220,10 @@ describe('utils', function () {
|
|
|
222
220
|
|
|
223
221
|
var ON_ACTION = function ON_ACTION() {};
|
|
224
222
|
|
|
225
|
-
var
|
|
223
|
+
var _renderWithValidation = (0, _setupTests.renderWithValidation)((0, _getCYARowsForPage.default)(PAGE, ON_ACTION).map(function (row) {
|
|
226
224
|
return row.value;
|
|
227
225
|
})),
|
|
228
|
-
container =
|
|
226
|
+
container = _renderWithValidation.container;
|
|
229
227
|
|
|
230
228
|
expect(container.childNodes.length).toEqual(4);
|
|
231
229
|
var addressValues = container.childNodes;
|
|
@@ -94,8 +94,8 @@ describe('utils.Component.get', function () {
|
|
|
94
94
|
}
|
|
95
95
|
});
|
|
96
96
|
|
|
97
|
-
expect(ON_CHANGE_CALLS.length).toEqual(
|
|
98
|
-
expect(ON_CHANGE_CALLS[
|
|
97
|
+
expect(ON_CHANGE_CALLS.length).toEqual(1);
|
|
98
|
+
expect(ON_CHANGE_CALLS[0]).toMatchObject({
|
|
99
99
|
name: FIELD_ID,
|
|
100
100
|
value: '5--'
|
|
101
101
|
}); // And now the month...
|
|
@@ -107,8 +107,8 @@ describe('utils.Component.get', function () {
|
|
|
107
107
|
}
|
|
108
108
|
});
|
|
109
109
|
|
|
110
|
-
expect(ON_CHANGE_CALLS.length).toEqual(
|
|
111
|
-
expect(ON_CHANGE_CALLS[
|
|
110
|
+
expect(ON_CHANGE_CALLS.length).toEqual(2);
|
|
111
|
+
expect(ON_CHANGE_CALLS[1]).toMatchObject({
|
|
112
112
|
name: FIELD_ID,
|
|
113
113
|
value: '5-11-'
|
|
114
114
|
}); // And finally the year.
|
|
@@ -120,8 +120,8 @@ describe('utils.Component.get', function () {
|
|
|
120
120
|
}
|
|
121
121
|
});
|
|
122
122
|
|
|
123
|
-
expect(ON_CHANGE_CALLS.length).toEqual(
|
|
124
|
-
expect(ON_CHANGE_CALLS[
|
|
123
|
+
expect(ON_CHANGE_CALLS.length).toEqual(3);
|
|
124
|
+
expect(ON_CHANGE_CALLS[2]).toMatchObject({
|
|
125
125
|
name: FIELD_ID,
|
|
126
126
|
value: '5-11-2022'
|
|
127
127
|
});
|
|
@@ -13,6 +13,8 @@ var _validateEmail = _interopRequireDefault(require("./validateEmail"));
|
|
|
13
13
|
|
|
14
14
|
var _validatePage = _interopRequireDefault(require("./validatePage"));
|
|
15
15
|
|
|
16
|
+
var _validateRegex = _interopRequireDefault(require("./validateRegex"));
|
|
17
|
+
|
|
16
18
|
var _validateRequired = _interopRequireDefault(require("./validateRequired"));
|
|
17
19
|
|
|
18
20
|
var _validateTime = _interopRequireDefault(require("./validateTime"));
|
|
@@ -25,6 +27,7 @@ var Validate = {
|
|
|
25
27
|
email: _validateEmail.default,
|
|
26
28
|
date: _validateDate.default,
|
|
27
29
|
page: _validatePage.default,
|
|
30
|
+
regex: _validateRegex.default,
|
|
28
31
|
required: _validateRequired.default,
|
|
29
32
|
time: _validateTime.default
|
|
30
33
|
};
|
|
@@ -15,7 +15,14 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
15
15
|
|
|
16
16
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Validates all of the items within a collection.
|
|
20
|
+
* @param {object} collection The collection to validate.
|
|
21
|
+
* @param {object} items The data items in the collection.
|
|
22
|
+
* @param {object} formData The data at the top level of the form.
|
|
23
|
+
* @returns Errors for all components for all items within the collection.
|
|
24
|
+
*/
|
|
25
|
+
var validateCollection = function validateCollection(collection, items, formData) {
|
|
19
26
|
var errors = [];
|
|
20
27
|
|
|
21
28
|
if (collection && Array.isArray(collection.item) && Array.isArray(items)) {
|
|
@@ -29,7 +36,7 @@ var validateCollection = function validateCollection(collection, items) {
|
|
|
29
36
|
});
|
|
30
37
|
})
|
|
31
38
|
};
|
|
32
|
-
errors.push((0, _validateContainer.default)(container, item));
|
|
39
|
+
errors.push((0, _validateContainer.default)(container, item, formData));
|
|
33
40
|
});
|
|
34
41
|
}
|
|
35
42
|
|
|
@@ -19,6 +19,8 @@ var _validateDate = _interopRequireDefault(require("./validateDate"));
|
|
|
19
19
|
|
|
20
20
|
var _validateEmail = _interopRequireDefault(require("./validateEmail"));
|
|
21
21
|
|
|
22
|
+
var _validateRegex = _interopRequireDefault(require("./validateRegex"));
|
|
23
|
+
|
|
22
24
|
var _validateRequired = _interopRequireDefault(require("./validateRequired"));
|
|
23
25
|
|
|
24
26
|
var _validateTime = _interopRequireDefault(require("./validateTime"));
|
|
@@ -30,25 +32,27 @@ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "functi
|
|
|
30
32
|
/**
|
|
31
33
|
* Validates a single component.
|
|
32
34
|
* @param {object} component The component to validate.
|
|
33
|
-
* @param {object}
|
|
35
|
+
* @param {object} outerData The data to use that holds this component's value.
|
|
36
|
+
* @param {object} formData The data at the top level of the form.
|
|
34
37
|
* @returns The first encountered error with the component.
|
|
35
38
|
*/
|
|
36
|
-
var validateComponent = function validateComponent(component, formData) {
|
|
39
|
+
var validateComponent = function validateComponent(component, outerData, formData) {
|
|
37
40
|
var _component$data$optio;
|
|
38
41
|
|
|
39
|
-
|
|
42
|
+
var fd = formData || outerData;
|
|
43
|
+
|
|
44
|
+
if (!(0, _showComponent.default)(component, fd)) {
|
|
40
45
|
return undefined;
|
|
41
46
|
}
|
|
42
47
|
|
|
43
|
-
var error = undefined;
|
|
44
|
-
var nestedId = undefined;
|
|
45
|
-
var propertiesInError = undefined;
|
|
46
|
-
var data = formData && _typeof(formData) === 'object' ? formData : {};
|
|
47
|
-
|
|
48
48
|
if (component.type === _models.ComponentTypes.CONTAINER) {
|
|
49
|
-
return (0, _validateContainer.default)(component,
|
|
49
|
+
return (0, _validateContainer.default)(component, outerData, fd);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
var error = undefined;
|
|
53
|
+
var nestedId = undefined;
|
|
54
|
+
var properties = undefined;
|
|
55
|
+
var data = outerData && _typeof(outerData) === 'object' ? outerData : {};
|
|
52
56
|
var value = data[component.fieldId];
|
|
53
57
|
|
|
54
58
|
if (component.required) {
|
|
@@ -58,7 +62,7 @@ var validateComponent = function validateComponent(component, formData) {
|
|
|
58
62
|
if (!error) {
|
|
59
63
|
switch (component.type) {
|
|
60
64
|
case _models.ComponentTypes.COLLECTION:
|
|
61
|
-
return (0, _validateCollection.default)(component, value);
|
|
65
|
+
return (0, _validateCollection.default)(component, value, fd);
|
|
62
66
|
|
|
63
67
|
case _models.ComponentTypes.EMAIL:
|
|
64
68
|
error = (0, _validateEmail.default)(value, component.label);
|
|
@@ -72,7 +76,7 @@ var validateComponent = function validateComponent(component, formData) {
|
|
|
72
76
|
message = _validator.message,
|
|
73
77
|
propsInError = _validator.propsInError;
|
|
74
78
|
|
|
75
|
-
|
|
79
|
+
properties = propsInError;
|
|
76
80
|
error = message;
|
|
77
81
|
break;
|
|
78
82
|
|
|
@@ -81,12 +85,10 @@ var validateComponent = function validateComponent(component, formData) {
|
|
|
81
85
|
var nestedError;
|
|
82
86
|
|
|
83
87
|
if (option.nested && option.nested.shown) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
nestedError = validateComponent(option.nested, formData);
|
|
87
|
-
error = (_nestedError = nestedError) === null || _nestedError === void 0 ? void 0 : _nestedError.error;
|
|
88
|
+
nestedError = validateComponent(option.nested, outerData, fd);
|
|
88
89
|
|
|
89
90
|
if (nestedError) {
|
|
91
|
+
error = nestedError.error;
|
|
90
92
|
nestedId = nestedError.id;
|
|
91
93
|
}
|
|
92
94
|
}
|
|
@@ -99,11 +101,15 @@ var validateComponent = function validateComponent(component, formData) {
|
|
|
99
101
|
break;
|
|
100
102
|
}
|
|
101
103
|
|
|
104
|
+
if (!error && component.pattern) {
|
|
105
|
+
error = (0, _validateRegex.default)(value, component.label, component.pattern, component.custom_errors);
|
|
106
|
+
}
|
|
107
|
+
|
|
102
108
|
if (!error && component.additionalValidation) {
|
|
103
109
|
error = (0, _additional.default)(component, value);
|
|
104
110
|
|
|
105
111
|
if (component.type === _models.ComponentTypes.DATE && error) {
|
|
106
|
-
|
|
112
|
+
properties = {
|
|
107
113
|
day: true,
|
|
108
114
|
month: true,
|
|
109
115
|
year: true
|
|
@@ -116,7 +122,7 @@ var validateComponent = function validateComponent(component, formData) {
|
|
|
116
122
|
return {
|
|
117
123
|
id: nestedId || component.full_path || component.id,
|
|
118
124
|
error: error,
|
|
119
|
-
properties:
|
|
125
|
+
properties: properties
|
|
120
126
|
};
|
|
121
127
|
}
|
|
122
128
|
|
|
@@ -10,13 +10,22 @@ var _validateComponent = _interopRequireDefault(require("./validateComponent"));
|
|
|
10
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
11
|
|
|
12
12
|
// Local imports
|
|
13
|
-
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Validates all components within a container.
|
|
16
|
+
* @param {object} container The container to validate.
|
|
17
|
+
* @param {object} outerData The data to use that holds this component's value.
|
|
18
|
+
* @param {object} formData The data at the top level of the form.
|
|
19
|
+
* @returns Errors for all components within the container.
|
|
20
|
+
*/
|
|
21
|
+
var validateContainer = function validateContainer(container, outerData, formData) {
|
|
22
|
+
var fd = formData || outerData;
|
|
14
23
|
var errors = [];
|
|
15
24
|
|
|
16
25
|
if (container && Array.isArray(container.components)) {
|
|
17
|
-
var
|
|
26
|
+
var containerData = outerData && container.fieldId ? outerData[container.fieldId] : outerData;
|
|
18
27
|
container.components.forEach(function (component) {
|
|
19
|
-
errors.push((0, _validateComponent.default)(component, fd));
|
|
28
|
+
errors.push((0, _validateComponent.default)(component, containerData, fd));
|
|
20
29
|
});
|
|
21
30
|
}
|
|
22
31
|
|
|
@@ -21,7 +21,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
21
21
|
var validatePage = function validatePage(page) {
|
|
22
22
|
if ((0, _showFormPage.default)(page, page.formData) && Array.isArray(page.components)) {
|
|
23
23
|
return page.components.reduce(function (errors, component) {
|
|
24
|
-
return errors.concat((0, _validateComponent.default)(component, page.formData));
|
|
24
|
+
return errors.concat((0, _validateComponent.default)(component, page.formData, page.formData));
|
|
25
25
|
}, []).filter(function (e) {
|
|
26
26
|
return !!e;
|
|
27
27
|
}).flat();
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Validates an components value against a given regex pattern.
|
|
10
|
+
*
|
|
11
|
+
* An empty string for value is considered valid as not all components
|
|
12
|
+
* with pattern validation have to be required.
|
|
13
|
+
* @param {*} value The value to validate.
|
|
14
|
+
* @param {string} label The label to use in the default error message.
|
|
15
|
+
* @param {string} pattern The regex pattern to validate against.
|
|
16
|
+
* @param {array} customErrors The array of custom errors for the component.
|
|
17
|
+
* @returns An error if the value doesn't match the regex pattern.
|
|
18
|
+
*/
|
|
19
|
+
var validateRegex = function validateRegex(value) {
|
|
20
|
+
var label = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
21
|
+
var pattern = arguments.length > 2 ? arguments[2] : undefined;
|
|
22
|
+
var customErrors = arguments.length > 3 ? arguments[3] : undefined;
|
|
23
|
+
|
|
24
|
+
if (!value) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (typeof value === 'string') {
|
|
29
|
+
var regex = new RegExp(pattern);
|
|
30
|
+
|
|
31
|
+
if (regex.test(value)) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (Array.isArray(customErrors)) {
|
|
36
|
+
var _result$;
|
|
37
|
+
|
|
38
|
+
var result = customErrors.filter(function (error) {
|
|
39
|
+
return error.type === 'pattern';
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
if (result !== null && result !== void 0 && (_result$ = result[0]) !== null && _result$ !== void 0 && _result$.message) {
|
|
43
|
+
return result[0].message;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (label === '') {
|
|
49
|
+
return 'Component failed regex validation';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return "".concat(label, " failed regex validation");
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
var _default = validateRegex;
|
|
56
|
+
exports.default = _default;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _validateRegex = _interopRequireDefault(require("./validateRegex"));
|
|
4
|
+
|
|
5
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
6
|
+
|
|
7
|
+
// Local imports
|
|
8
|
+
describe('utils', function () {
|
|
9
|
+
describe('Validate', function () {
|
|
10
|
+
describe('regex', function () {
|
|
11
|
+
var GOOD_VALUE = 'hello';
|
|
12
|
+
var BAD_VALUE = 'h3llo';
|
|
13
|
+
var LABEL = 'Component';
|
|
14
|
+
var PATTERN = '^[a-z]*$';
|
|
15
|
+
var CUSTOM_ERRORS = [{
|
|
16
|
+
"type": "pattern",
|
|
17
|
+
"message": "Regex validation failed for ".concat(LABEL)
|
|
18
|
+
}];
|
|
19
|
+
var DEFAULT_ERROR = [{
|
|
20
|
+
"type": "pattern"
|
|
21
|
+
}]; // Valid values
|
|
22
|
+
|
|
23
|
+
it('should return no error when the value matches the regex pattern', function () {
|
|
24
|
+
expect((0, _validateRegex.default)(GOOD_VALUE, LABEL, PATTERN, CUSTOM_ERRORS)).toBeUndefined();
|
|
25
|
+
});
|
|
26
|
+
it('should return no error when the value is an empty string', function () {
|
|
27
|
+
expect((0, _validateRegex.default)('', LABEL, PATTERN, CUSTOM_ERRORS)).toBeUndefined();
|
|
28
|
+
}); // Invalid values
|
|
29
|
+
|
|
30
|
+
it('should return a custom error when the value does not match the regex pattern and one is specified', function () {
|
|
31
|
+
expect((0, _validateRegex.default)(BAD_VALUE, LABEL, PATTERN, CUSTOM_ERRORS)).toEqual(CUSTOM_ERRORS[0].message);
|
|
32
|
+
});
|
|
33
|
+
it('should return an error using label when the value does not match the regex pattern and a custom error is not specified', function () {
|
|
34
|
+
expect((0, _validateRegex.default)(BAD_VALUE, LABEL, PATTERN, DEFAULT_ERROR)).toEqual("".concat(LABEL, " failed regex validation"));
|
|
35
|
+
});
|
|
36
|
+
it('should return a default error when the value does not match the regex pattern and both a custom error and label are not specified', function () {
|
|
37
|
+
expect((0, _validateRegex.default)(BAD_VALUE, '', PATTERN, DEFAULT_ERROR)).toEqual('Component failed regex validation');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ukhomeoffice/cop-react-form-renderer",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"scripts": {
|
|
6
6
|
"clean": "rimraf dist",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"post-compile": "rimraf dist/*.test.* dist/**/*.test.* dist/**/*.stories.* dist/docs dist/assets"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@ukhomeoffice/cop-react-components": "1.
|
|
19
|
+
"@ukhomeoffice/cop-react-components": "1.7.1",
|
|
20
20
|
"axios": "^0.21.1",
|
|
21
21
|
"dayjs": "^1.11.0",
|
|
22
22
|
"govuk-frontend": "^3.13.0",
|