@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.
@@ -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 _react2 = _interopRequireDefault(require("react"));
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, _render, container;
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
- _render = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(_Answer.default, {
28
+ _renderWithValidation = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_Answer.default, {
29
29
  value: VALUE,
30
30
  component: COMPONENT
31
- })), container = _render.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, _render2, container;
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
- _render2 = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(_Answer.default, {
51
+ _renderWithValidation2 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_Answer.default, {
52
52
  value: VALUE,
53
53
  component: COMPONENT
54
- })), container = _render2.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, _render3, container, answer;
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
- _render3 = (0, _react.render)( /*#__PURE__*/_react2.default.createElement(_Answer.default, {
78
+ _renderWithValidation3 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_Answer.default, {
79
79
  value: VALUE,
80
80
  component: COMPONENT
81
- })), container = _render3.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
- (0, _useHooks.addHook)('onGetComponent', function (config, wrap) {
149
- return /*#__PURE__*/_react.default.createElement("div", null, "".concat(config.type, " | ").concat(config.tagName, " | ").concat(config.content, " | ").concat(wrap));
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
- })), container = _renderWithValidation4.container;
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
- (0, _useHooks.addHook)('onGetComponent', function () {
180
- return null;
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
- })), container = _renderWithValidation5.container;
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 _hooks2 = require("../../hooks");
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.ValidationContextProvider, null, /*#__PURE__*/_react.default.createElement(InternalFormRenderer, {
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, _hooks2.useHooks)(),
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, _hooks2.useValidation)(),
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.shape({
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 {...FIRST_FORM} data={{}} />
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;
@@ -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 }; }
@@ -3,63 +3,16 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.resetHooks = exports.removeHook = exports.default = exports.addHook = exports.ALLOWED_HOOKS = void 0;
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 removeHook = function removeHook(name) {
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
- exports.resetHooks = resetHooks;
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.intercepts = exports.default = void 0;
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;
@@ -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.ValidationContextProvider, null, ui), options);
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, callback) {
21
- return (0, _reactDom.render)( /*#__PURE__*/React.createElement(_context.ValidationContextProvider, null, ui), container, callback);
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 _react = require("@testing-library/react");
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
- // Global imports
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 _render = (0, _react.render)((0, _getCYARowForGroup.default)(PAGE, PAGE.groups[0], rows, ON_ACTION).row.value),
67
- container = _render.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 _render = (0, _react.render)((0, _getCYARowsForPage.default)(PAGE, ON_ACTION).map(function (row) {
223
+ var _renderWithValidation = (0, _setupTests.renderWithValidation)((0, _getCYARowsForPage.default)(PAGE, ON_ACTION).map(function (row) {
226
224
  return row.value;
227
225
  })),
228
- container = _render.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(2);
98
- expect(ON_CHANGE_CALLS[1]).toMatchObject({
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(3);
111
- expect(ON_CHANGE_CALLS[2]).toMatchObject({
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(4);
124
- expect(ON_CHANGE_CALLS[3]).toMatchObject({
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
- var validateCollection = function validateCollection(collection, items) {
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} formData The data to use that holds this component's value.
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
- if (!(0, _showComponent.default)(component, formData)) {
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, formData);
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
- propertiesInError = propsInError;
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
- var _nestedError;
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
- propertiesInError = {
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: propertiesInError
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
- var validateContainer = function validateContainer(container, formData) {
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 fd = formData && container.fieldId ? formData[container.fieldId] : formData;
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": "2.10.2",
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.6.0",
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",