@ukhomeoffice/cop-react-form-renderer 2.10.0 → 3.0.0

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;
@@ -1,16 +1,22 @@
1
1
  "use strict";
2
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
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
8
  exports.default = exports.ValidationContext = void 0;
7
9
 
8
- var _react = require("react");
10
+ var _react = _interopRequireWildcard(require("react"));
9
11
 
10
12
  var _utils = _interopRequireDefault(require("../../utils"));
11
13
 
12
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
15
 
16
+ 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); }
17
+
18
+ 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; }
19
+
14
20
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
15
21
 
16
22
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -108,7 +114,7 @@ var ValidationContextProvider = function ValidationContextProvider(_ref) {
108
114
  return pagesErrors;
109
115
  }
110
116
  };
111
- return /*#__PURE__*/React.createElement(ValidationContext.Provider, {
117
+ return /*#__PURE__*/_react.default.createElement(ValidationContext.Provider, {
112
118
  value: {
113
119
  errors: errors,
114
120
  addErrors: addErrors,
@@ -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;
@@ -5,6 +5,33 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
9
+
10
+ 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."); }
11
+
12
+ 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); }
13
+
14
+ 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; }
15
+
16
+ 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; }
17
+
18
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
19
+
20
+ var getItemInArray = function getItemInArray(arr, index) {
21
+ if (Array.isArray(arr)) {
22
+ return arr[parseInt(index, 10)];
23
+ }
24
+
25
+ return undefined;
26
+ };
27
+
28
+ var isArrayProp = function isArrayProp(prop) {
29
+ return prop.includes('[');
30
+ };
31
+
32
+ var getPropertyAndIndex = function getPropertyAndIndex(prop) {
33
+ return prop.replace(']', '').split('[');
34
+ };
8
35
  /**
9
36
  * Gets the value of a field within the top-level JSON form data,
10
37
  * based on a dot-separated field identifier.
@@ -20,12 +47,23 @@ exports.default = void 0;
20
47
  * @param {string} fieldId The dot-separated path to the field.
21
48
  * @returns The value of the field specified.
22
49
  */
50
+
51
+
23
52
  var getSourceData = function getSourceData(data, fieldId) {
24
53
  if (!fieldId) {
25
54
  return undefined;
26
55
  }
27
56
 
28
57
  return fieldId.split('.').reduce(function (obj, prop) {
58
+ if (obj && isArrayProp(prop)) {
59
+ var _getPropertyAndIndex = getPropertyAndIndex(prop),
60
+ _getPropertyAndIndex2 = _slicedToArray(_getPropertyAndIndex, 2),
61
+ actualProp = _getPropertyAndIndex2[0],
62
+ index = _getPropertyAndIndex2[1];
63
+
64
+ return getItemInArray(obj[actualProp], index);
65
+ }
66
+
29
67
  return obj ? obj[prop] : undefined;
30
68
  }, data);
31
69
  };
@@ -120,6 +120,22 @@ describe('utils', function () {
120
120
  var value = (0, _getSourceData.default)(DATA, FIELD_ID);
121
121
  expect(value).toBeUndefined();
122
122
  });
123
+ it('should handle a reference to an array item', function () {
124
+ var FIELD_ID = 'items[1]';
125
+ var ALPHA = 'alpha';
126
+ var BETA = 'beta';
127
+ var DATA = {
128
+ items: [ALPHA, BETA]
129
+ };
130
+ var value = (0, _getSourceData.default)(DATA, FIELD_ID);
131
+ expect(value).toEqual(BETA);
132
+ });
133
+ it('should handle a reference to an array that does not exist', function () {
134
+ var FIELD_ID = 'items[1]';
135
+ var DATA = {};
136
+ var value = (0, _getSourceData.default)(DATA, FIELD_ID);
137
+ expect(value).toBeUndefined();
138
+ });
123
139
  });
124
140
  });
125
141
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ukhomeoffice/cop-react-form-renderer",
3
- "version": "2.10.0",
3
+ "version": "3.0.0",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "clean": "rimraf dist",
@@ -9,7 +9,7 @@
9
9
  "lint": "eslint --ext .js,.jsx src",
10
10
  "storybook:start": "start-storybook --docs -s src/assets --no-manager-cache -p 6007",
11
11
  "storybook:build": "build-storybook --docs -s src/assets",
12
- "storybook:deploy": "yarn deploy-storybook",
12
+ "storybook:deploy": "yarn storybook:build && yarn deploy-storybook",
13
13
  "storybook": "yarn storybook:start",
14
14
  "deploy-storybook": "storybook-to-ghpages -e storybook-static",
15
15
  "compile": "yarn clean && cross-env NODE_ENV=production babel src --out-dir dist --copy-files && yarn post-compile",