@pie-lib/config-ui 12.2.0-next.2 → 12.2.0-next.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +80 -28
  2. package/LICENSE.md +5 -0
  3. package/lib/alert-dialog.js +1 -1
  4. package/lib/checkbox.js +1 -1
  5. package/lib/choice-configuration/feedback-menu.js +1 -1
  6. package/lib/choice-configuration/index.js +1 -1
  7. package/lib/choice-utils.js +1 -1
  8. package/lib/feedback-config/feedback-selector.js +1 -1
  9. package/lib/feedback-config/group.js +1 -1
  10. package/lib/feedback-config/index.js +1 -1
  11. package/lib/form-section.js +1 -1
  12. package/lib/help.js +1 -1
  13. package/lib/index.js +1 -1
  14. package/lib/input.js +1 -1
  15. package/lib/inputs.js +1 -1
  16. package/lib/langs.js +1 -1
  17. package/lib/layout/config-layout.js +1 -1
  18. package/lib/layout/index.js +1 -1
  19. package/lib/layout/layout-contents.js +1 -1
  20. package/lib/layout/settings-box.js +1 -1
  21. package/lib/mui-box/index.js +1 -1
  22. package/lib/number-text-field-custom.js +1 -1
  23. package/lib/number-text-field.js +2 -2
  24. package/lib/number-text-field.js.map +1 -1
  25. package/lib/radio-with-label.js +1 -1
  26. package/lib/settings/display-size.js +1 -1
  27. package/lib/settings/index.js +1 -1
  28. package/lib/settings/panel.js +1 -1
  29. package/lib/settings/settings-radio-label.js +1 -1
  30. package/lib/settings/toggle.js +1 -1
  31. package/lib/tabs/index.js +1 -1
  32. package/lib/tags-input/index.js +1 -1
  33. package/lib/two-choice.js +1 -1
  34. package/lib/with-stateful-model.js +1 -1
  35. package/package.json +5 -5
  36. package/src/number-text-field.jsx +1 -1
  37. package/lib/__tests__/alert-dialog.test.js +0 -262
  38. package/lib/__tests__/checkbox.test.js +0 -227
  39. package/lib/__tests__/choice-utils.test.js +0 -14
  40. package/lib/__tests__/form-section.test.js +0 -252
  41. package/lib/__tests__/help.test.js +0 -270
  42. package/lib/__tests__/input.test.js +0 -268
  43. package/lib/__tests__/langs.test.js +0 -541
  44. package/lib/__tests__/number-text-field-custom.test.js +0 -362
  45. package/lib/__tests__/number-text-field.test.js +0 -421
  46. package/lib/__tests__/radio-with-label.test.js +0 -233
  47. package/lib/__tests__/settings-panel.test.js +0 -184
  48. package/lib/__tests__/settings.test.js +0 -653
  49. package/lib/__tests__/tabs.test.js +0 -211
  50. package/lib/__tests__/two-choice.test.js +0 -124
  51. package/lib/__tests__/with-stateful-model.test.js +0 -221
  52. package/lib/choice-configuration/__tests__/feedback-menu.test.js +0 -287
  53. package/lib/choice-configuration/__tests__/index.test.js +0 -253
  54. package/lib/feedback-config/__tests__/feedback-config.test.js +0 -201
  55. package/lib/feedback-config/__tests__/feedback-selector.test.js +0 -177
  56. package/lib/layout/__tests__/config.layout.test.js +0 -70
  57. package/lib/layout/__tests__/layout-content.test.js +0 -6
  58. package/lib/tags-input/__tests__/index.test.js +0 -183
@@ -1,221 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
- var _react = _interopRequireDefault(require("react"));
8
- var _react2 = require("@testing-library/react");
9
- var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
10
- var _withStatefulModel = _interopRequireDefault(require("../with-stateful-model"));
11
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13
- var MockComponent = function MockComponent(_ref) {
14
- var model = _ref.model,
15
- onChange = _ref.onChange;
16
- return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", {
17
- "data-testid": "model-value"
18
- }, JSON.stringify(model)), /*#__PURE__*/_react["default"].createElement("button", {
19
- onClick: function onClick() {
20
- return onChange(_objectSpread(_objectSpread({}, model), {}, {
21
- updated: true
22
- }));
23
- }
24
- }, "Update Model"));
25
- };
26
- describe('withStatefulModel', function () {
27
- it('wraps component and passes model and onChange', function () {
28
- var WrappedComponent = (0, _withStatefulModel["default"])(MockComponent);
29
- var model = {
30
- name: 'test'
31
- };
32
- var onChange = jest.fn();
33
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(WrappedComponent, {
34
- model: model,
35
- onChange: onChange
36
- }));
37
- expect(_react2.screen.getByTestId('model-value')).toBeInTheDocument();
38
- expect(_react2.screen.getByText(JSON.stringify(model))).toBeInTheDocument();
39
- });
40
- it('manages local state with initial model prop', function () {
41
- var WrappedComponent = (0, _withStatefulModel["default"])(MockComponent);
42
- var model = {
43
- id: 1,
44
- name: 'test'
45
- };
46
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(WrappedComponent, {
47
- model: model,
48
- onChange: jest.fn()
49
- }));
50
- expect(_react2.screen.getByText(JSON.stringify(model))).toBeInTheDocument();
51
- });
52
- it('calls onChange with updated model when component calls onChange', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
53
- var user, WrappedComponent, model, onChange, updateButton;
54
- return _regenerator["default"].wrap(function (_context) {
55
- while (1) switch (_context.prev = _context.next) {
56
- case 0:
57
- user = _userEvent["default"].setup();
58
- WrappedComponent = (0, _withStatefulModel["default"])(MockComponent);
59
- model = {
60
- name: 'test'
61
- };
62
- onChange = jest.fn();
63
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(WrappedComponent, {
64
- model: model,
65
- onChange: onChange
66
- }));
67
- updateButton = _react2.screen.getByRole('button', {
68
- name: /Update Model/i
69
- });
70
- _context.next = 1;
71
- return user.click(updateButton);
72
- case 1:
73
- expect(onChange).toHaveBeenCalled();
74
- expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
75
- updated: true
76
- }));
77
- case 2:
78
- case "end":
79
- return _context.stop();
80
- }
81
- }, _callee);
82
- })));
83
- it('updates internal state when model prop changes', function () {
84
- var WrappedComponent = (0, _withStatefulModel["default"])(MockComponent);
85
- var initialModel = {
86
- name: 'initial'
87
- };
88
- var updatedModel = {
89
- name: 'updated'
90
- };
91
- var onChange = jest.fn();
92
- var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(WrappedComponent, {
93
- model: initialModel,
94
- onChange: onChange
95
- })),
96
- rerender = _render.rerender;
97
- expect(_react2.screen.getByText(JSON.stringify(initialModel))).toBeInTheDocument();
98
- rerender(/*#__PURE__*/_react["default"].createElement(WrappedComponent, {
99
- model: updatedModel,
100
- onChange: onChange
101
- }));
102
- expect(_react2.screen.getByText(JSON.stringify(updatedModel))).toBeInTheDocument();
103
- });
104
- it('maintains state across multiple onChange calls', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
105
- var user, WrappedComponent, model, onChange, updateButton;
106
- return _regenerator["default"].wrap(function (_context2) {
107
- while (1) switch (_context2.prev = _context2.next) {
108
- case 0:
109
- user = _userEvent["default"].setup();
110
- WrappedComponent = (0, _withStatefulModel["default"])(MockComponent);
111
- model = {
112
- count: 0
113
- };
114
- onChange = jest.fn();
115
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(WrappedComponent, {
116
- model: model,
117
- onChange: onChange
118
- }));
119
- updateButton = _react2.screen.getByRole('button', {
120
- name: /Update Model/i
121
- });
122
- _context2.next = 1;
123
- return user.click(updateButton);
124
- case 1:
125
- expect(onChange).toHaveBeenCalledTimes(1);
126
- _context2.next = 2;
127
- return user.click(updateButton);
128
- case 2:
129
- expect(onChange).toHaveBeenCalledTimes(2);
130
- case 3:
131
- case "end":
132
- return _context2.stop();
133
- }
134
- }, _callee2);
135
- })));
136
- it('passes updated model state to onChange callback', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
137
- var user, WrappedComponent, model, onChange, updateButton, lastCall;
138
- return _regenerator["default"].wrap(function (_context3) {
139
- while (1) switch (_context3.prev = _context3.next) {
140
- case 0:
141
- user = _userEvent["default"].setup();
142
- WrappedComponent = (0, _withStatefulModel["default"])(MockComponent);
143
- model = {
144
- value: 'original'
145
- };
146
- onChange = jest.fn();
147
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(WrappedComponent, {
148
- model: model,
149
- onChange: onChange
150
- }));
151
- updateButton = _react2.screen.getByRole('button', {
152
- name: /Update Model/i
153
- });
154
- _context3.next = 1;
155
- return user.click(updateButton);
156
- case 1:
157
- lastCall = onChange.mock.calls[onChange.mock.calls.length - 1];
158
- expect(lastCall[0]).toHaveProperty('updated', true);
159
- expect(lastCall[0]).toHaveProperty('value', 'original');
160
- case 2:
161
- case "end":
162
- return _context3.stop();
163
- }
164
- }, _callee3);
165
- })));
166
- it('handles empty model object', function () {
167
- var WrappedComponent = (0, _withStatefulModel["default"])(MockComponent);
168
- var model = {};
169
- var onChange = jest.fn();
170
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(WrappedComponent, {
171
- model: model,
172
- onChange: onChange
173
- }));
174
- expect(_react2.screen.getByText(JSON.stringify(model))).toBeInTheDocument();
175
- });
176
- it('handles model with nested properties', function () {
177
- var WrappedComponent = (0, _withStatefulModel["default"])(MockComponent);
178
- var model = {
179
- user: {
180
- name: 'John',
181
- age: 30
182
- },
183
- settings: {
184
- theme: 'dark'
185
- }
186
- };
187
- var onChange = jest.fn();
188
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(WrappedComponent, {
189
- model: model,
190
- onChange: onChange
191
- }));
192
- expect(_react2.screen.getByText(JSON.stringify(model))).toBeInTheDocument();
193
- });
194
- it('requires model and onChange props', function () {
195
- var WrappedComponent = (0, _withStatefulModel["default"])(MockComponent);
196
- var consoleSpy = jest.spyOn(console, 'error').mockImplementation();
197
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(WrappedComponent, {
198
- model: {
199
- test: 'data'
200
- },
201
- onChange: jest.fn()
202
- }));
203
- expect(_react2.screen.getByTestId('model-value')).toBeInTheDocument();
204
- consoleSpy.mockRestore();
205
- });
206
- it('renders wrapped component with correct props structure', function () {
207
- var WrappedComponent = (0, _withStatefulModel["default"])(MockComponent);
208
- var model = {
209
- id: 1
210
- };
211
- var onChange = jest.fn();
212
- var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(WrappedComponent, {
213
- model: model,
214
- onChange: onChange
215
- })),
216
- container = _render2.container;
217
- expect(container.querySelector('[data-testid="model-value"]')).toBeInTheDocument();
218
- expect(container.querySelector('button')).toBeInTheDocument();
219
- });
220
- });
221
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdXNlckV2ZW50IiwiX3dpdGhTdGF0ZWZ1bE1vZGVsIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJNb2NrQ29tcG9uZW50IiwiX3JlZiIsIm1vZGVsIiwib25DaGFuZ2UiLCJjcmVhdGVFbGVtZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsIm9uQ2xpY2siLCJ1cGRhdGVkIiwiZGVzY3JpYmUiLCJpdCIsIldyYXBwZWRDb21wb25lbnQiLCJ3aXRoU3RhdGVmdWxNb2RlbCIsIm5hbWUiLCJqZXN0IiwiZm4iLCJyZW5kZXIiLCJleHBlY3QiLCJzY3JlZW4iLCJnZXRCeVRlc3RJZCIsInRvQmVJblRoZURvY3VtZW50IiwiZ2V0QnlUZXh0IiwiaWQiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInVzZXIiLCJ1cGRhdGVCdXR0b24iLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInVzZXJFdmVudCIsInNldHVwIiwiZ2V0QnlSb2xlIiwiY2xpY2siLCJ0b0hhdmVCZWVuQ2FsbGVkIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJvYmplY3RDb250YWluaW5nIiwic3RvcCIsImluaXRpYWxNb2RlbCIsInVwZGF0ZWRNb2RlbCIsIl9yZW5kZXIiLCJyZXJlbmRlciIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiY291bnQiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJfY2FsbGVlMyIsImxhc3RDYWxsIiwiX2NvbnRleHQzIiwidmFsdWUiLCJtb2NrIiwiY2FsbHMiLCJ0b0hhdmVQcm9wZXJ0eSIsImFnZSIsInNldHRpbmdzIiwidGhlbWUiLCJjb25zb2xlU3B5Iiwic3B5T24iLCJjb25zb2xlIiwibW9ja0ltcGxlbWVudGF0aW9uIiwidGVzdCIsIm1vY2tSZXN0b3JlIiwiX3JlbmRlcjIiLCJjb250YWluZXIiLCJxdWVyeVNlbGVjdG9yIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy93aXRoLXN0YXRlZnVsLW1vZGVsLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIsIHNjcmVlbiB9IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvcmVhY3QnO1xuaW1wb3J0IHVzZXJFdmVudCBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3VzZXItZXZlbnQnO1xuaW1wb3J0IHdpdGhTdGF0ZWZ1bE1vZGVsIGZyb20gJy4uL3dpdGgtc3RhdGVmdWwtbW9kZWwnO1xuXG5jb25zdCBNb2NrQ29tcG9uZW50ID0gKHsgbW9kZWwsIG9uQ2hhbmdlIH0pID0+IChcbiAgPGRpdj5cbiAgICA8ZGl2IGRhdGEtdGVzdGlkPVwibW9kZWwtdmFsdWVcIj57SlNPTi5zdHJpbmdpZnkobW9kZWwpfTwvZGl2PlxuICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gb25DaGFuZ2UoeyAuLi5tb2RlbCwgdXBkYXRlZDogdHJ1ZSB9KX0+VXBkYXRlIE1vZGVsPC9idXR0b24+XG4gIDwvZGl2PlxuKTtcblxuZGVzY3JpYmUoJ3dpdGhTdGF0ZWZ1bE1vZGVsJywgKCkgPT4ge1xuICBpdCgnd3JhcHMgY29tcG9uZW50IGFuZCBwYXNzZXMgbW9kZWwgYW5kIG9uQ2hhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IFdyYXBwZWRDb21wb25lbnQgPSB3aXRoU3RhdGVmdWxNb2RlbChNb2NrQ29tcG9uZW50KTtcbiAgICBjb25zdCBtb2RlbCA9IHsgbmFtZTogJ3Rlc3QnIH07XG4gICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG5cbiAgICByZW5kZXIoPFdyYXBwZWRDb21wb25lbnQgbW9kZWw9e21vZGVsfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXN0SWQoJ21vZGVsLXZhbHVlJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoSlNPTi5zdHJpbmdpZnkobW9kZWwpKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ21hbmFnZXMgbG9jYWwgc3RhdGUgd2l0aCBpbml0aWFsIG1vZGVsIHByb3AnLCAoKSA9PiB7XG4gICAgY29uc3QgV3JhcHBlZENvbXBvbmVudCA9IHdpdGhTdGF0ZWZ1bE1vZGVsKE1vY2tDb21wb25lbnQpO1xuICAgIGNvbnN0IG1vZGVsID0geyBpZDogMSwgbmFtZTogJ3Rlc3QnIH07XG5cbiAgICByZW5kZXIoPFdyYXBwZWRDb21wb25lbnQgbW9kZWw9e21vZGVsfSBvbkNoYW5nZT17amVzdC5mbigpfSAvPik7XG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dChKU09OLnN0cmluZ2lmeShtb2RlbCkpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCB1cGRhdGVkIG1vZGVsIHdoZW4gY29tcG9uZW50IGNhbGxzIG9uQ2hhbmdlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICBjb25zdCBXcmFwcGVkQ29tcG9uZW50ID0gd2l0aFN0YXRlZnVsTW9kZWwoTW9ja0NvbXBvbmVudCk7XG4gICAgY29uc3QgbW9kZWwgPSB7IG5hbWU6ICd0ZXN0JyB9O1xuICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuXG4gICAgcmVuZGVyKDxXcmFwcGVkQ29tcG9uZW50IG1vZGVsPXttb2RlbH0gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICBjb25zdCB1cGRhdGVCdXR0b24gPSBzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6IC9VcGRhdGUgTW9kZWwvaSB9KTtcbiAgICBhd2FpdCB1c2VyLmNsaWNrKHVwZGF0ZUJ1dHRvbik7XG5cbiAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgdXBkYXRlZDogdHJ1ZSB9KSk7XG4gIH0pO1xuXG4gIGl0KCd1cGRhdGVzIGludGVybmFsIHN0YXRlIHdoZW4gbW9kZWwgcHJvcCBjaGFuZ2VzJywgKCkgPT4ge1xuICAgIGNvbnN0IFdyYXBwZWRDb21wb25lbnQgPSB3aXRoU3RhdGVmdWxNb2RlbChNb2NrQ29tcG9uZW50KTtcbiAgICBjb25zdCBpbml0aWFsTW9kZWwgPSB7IG5hbWU6ICdpbml0aWFsJyB9O1xuICAgIGNvbnN0IHVwZGF0ZWRNb2RlbCA9IHsgbmFtZTogJ3VwZGF0ZWQnIH07XG4gICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG5cbiAgICBjb25zdCB7IHJlcmVuZGVyIH0gPSByZW5kZXIoPFdyYXBwZWRDb21wb25lbnQgbW9kZWw9e2luaXRpYWxNb2RlbH0gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dChKU09OLnN0cmluZ2lmeShpbml0aWFsTW9kZWwpKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgIHJlcmVuZGVyKDxXcmFwcGVkQ29tcG9uZW50IG1vZGVsPXt1cGRhdGVkTW9kZWx9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoSlNPTi5zdHJpbmdpZnkodXBkYXRlZE1vZGVsKSkpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdtYWludGFpbnMgc3RhdGUgYWNyb3NzIG11bHRpcGxlIG9uQ2hhbmdlIGNhbGxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICBjb25zdCBXcmFwcGVkQ29tcG9uZW50ID0gd2l0aFN0YXRlZnVsTW9kZWwoTW9ja0NvbXBvbmVudCk7XG4gICAgY29uc3QgbW9kZWwgPSB7IGNvdW50OiAwIH07XG4gICAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG5cbiAgICByZW5kZXIoPFdyYXBwZWRDb21wb25lbnQgbW9kZWw9e21vZGVsfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgIGNvbnN0IHVwZGF0ZUJ1dHRvbiA9IHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogL1VwZGF0ZSBNb2RlbC9pIH0pO1xuXG4gICAgYXdhaXQgdXNlci5jbGljayh1cGRhdGVCdXR0b24pO1xuICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuXG4gICAgYXdhaXQgdXNlci5jbGljayh1cGRhdGVCdXR0b24pO1xuICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICB9KTtcblxuICBpdCgncGFzc2VzIHVwZGF0ZWQgbW9kZWwgc3RhdGUgdG8gb25DaGFuZ2UgY2FsbGJhY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdXNlciA9IHVzZXJFdmVudC5zZXR1cCgpO1xuICAgIGNvbnN0IFdyYXBwZWRDb21wb25lbnQgPSB3aXRoU3RhdGVmdWxNb2RlbChNb2NrQ29tcG9uZW50KTtcbiAgICBjb25zdCBtb2RlbCA9IHsgdmFsdWU6ICdvcmlnaW5hbCcgfTtcbiAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcblxuICAgIHJlbmRlcig8V3JhcHBlZENvbXBvbmVudCBtb2RlbD17bW9kZWx9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgY29uc3QgdXBkYXRlQnV0dG9uID0gc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAvVXBkYXRlIE1vZGVsL2kgfSk7XG4gICAgYXdhaXQgdXNlci5jbGljayh1cGRhdGVCdXR0b24pO1xuXG4gICAgY29uc3QgbGFzdENhbGwgPSBvbkNoYW5nZS5tb2NrLmNhbGxzW29uQ2hhbmdlLm1vY2suY2FsbHMubGVuZ3RoIC0gMV07XG4gICAgZXhwZWN0KGxhc3RDYWxsWzBdKS50b0hhdmVQcm9wZXJ0eSgndXBkYXRlZCcsIHRydWUpO1xuICAgIGV4cGVjdChsYXN0Q2FsbFswXSkudG9IYXZlUHJvcGVydHkoJ3ZhbHVlJywgJ29yaWdpbmFsJyk7XG4gIH0pO1xuXG4gIGl0KCdoYW5kbGVzIGVtcHR5IG1vZGVsIG9iamVjdCcsICgpID0+IHtcbiAgICBjb25zdCBXcmFwcGVkQ29tcG9uZW50ID0gd2l0aFN0YXRlZnVsTW9kZWwoTW9ja0NvbXBvbmVudCk7XG4gICAgY29uc3QgbW9kZWwgPSB7fTtcbiAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcblxuICAgIHJlbmRlcig8V3JhcHBlZENvbXBvbmVudCBtb2RlbD17bW9kZWx9IG9uQ2hhbmdlPXtvbkNoYW5nZX0gLz4pO1xuXG4gICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoSlNPTi5zdHJpbmdpZnkobW9kZWwpKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ2hhbmRsZXMgbW9kZWwgd2l0aCBuZXN0ZWQgcHJvcGVydGllcycsICgpID0+IHtcbiAgICBjb25zdCBXcmFwcGVkQ29tcG9uZW50ID0gd2l0aFN0YXRlZnVsTW9kZWwoTW9ja0NvbXBvbmVudCk7XG4gICAgY29uc3QgbW9kZWwgPSB7IHVzZXI6IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH0sIHNldHRpbmdzOiB7IHRoZW1lOiAnZGFyaycgfSB9O1xuICAgIGNvbnN0IG9uQ2hhbmdlID0gamVzdC5mbigpO1xuXG4gICAgcmVuZGVyKDxXcmFwcGVkQ29tcG9uZW50IG1vZGVsPXttb2RlbH0gb25DaGFuZ2U9e29uQ2hhbmdlfSAvPik7XG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dChKU09OLnN0cmluZ2lmeShtb2RlbCkpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgncmVxdWlyZXMgbW9kZWwgYW5kIG9uQ2hhbmdlIHByb3BzJywgKCkgPT4ge1xuICAgIGNvbnN0IFdyYXBwZWRDb21wb25lbnQgPSB3aXRoU3RhdGVmdWxNb2RlbChNb2NrQ29tcG9uZW50KTtcblxuICAgIGNvbnN0IGNvbnNvbGVTcHkgPSBqZXN0LnNweU9uKGNvbnNvbGUsICdlcnJvcicpLm1vY2tJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgcmVuZGVyKDxXcmFwcGVkQ29tcG9uZW50IG1vZGVsPXt7IHRlc3Q6ICdkYXRhJyB9fSBvbkNoYW5nZT17amVzdC5mbigpfSAvPik7XG5cbiAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGVzdElkKCdtb2RlbC12YWx1ZScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuXG4gICAgY29uc29sZVNweS5tb2NrUmVzdG9yZSgpO1xuICB9KTtcblxuICBpdCgncmVuZGVycyB3cmFwcGVkIGNvbXBvbmVudCB3aXRoIGNvcnJlY3QgcHJvcHMgc3RydWN0dXJlJywgKCkgPT4ge1xuICAgIGNvbnN0IFdyYXBwZWRDb21wb25lbnQgPSB3aXRoU3RhdGVmdWxNb2RlbChNb2NrQ29tcG9uZW50KTtcbiAgICBjb25zdCBtb2RlbCA9IHsgaWQ6IDEgfTtcbiAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcblxuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPFdyYXBwZWRDb21wb25lbnQgbW9kZWw9e21vZGVsfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcblxuICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignW2RhdGEtdGVzdGlkPVwibW9kZWwtdmFsdWVcIl0nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxrQkFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQXVELFNBQUFJLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdBQUFkLENBQUEsUUFBQWUsZ0JBQUEsYUFBQWhCLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQUUsTUFBQSxDQUFBYyx5QkFBQSxH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
@@ -1,287 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
- var _react = _interopRequireDefault(require("react"));
7
- var _react2 = require("@testing-library/react");
8
- var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
9
- var _feedbackMenu = _interopRequireDefault(require("../feedback-menu"));
10
- describe('feedback-menu', function () {
11
- var onChange = jest.fn();
12
- beforeEach(function () {
13
- onChange.mockClear();
14
- });
15
- describe('rendering', function () {
16
- it('renders feedback menu with default options', function () {
17
- var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
18
- onChange: onChange,
19
- classes: {}
20
- })),
21
- container = _render.container;
22
- expect(container.firstChild).toBeInTheDocument();
23
- });
24
- it('renders menu with feedback type selector', function () {
25
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
26
- onChange: onChange,
27
- value: {
28
- type: 'default'
29
- },
30
- classes: {}
31
- }));
32
- // Menu button should be in the document
33
- expect(_react2.screen.getByRole('button')).toBeInTheDocument();
34
- });
35
- it('renders with no feedback type', function () {
36
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
37
- onChange: onChange,
38
- value: {
39
- type: 'none'
40
- },
41
- classes: {}
42
- }));
43
- expect(_react2.screen.getByRole('button')).toBeInTheDocument();
44
- });
45
- it('renders with custom feedback type', function () {
46
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
47
- onChange: onChange,
48
- value: {
49
- type: 'custom'
50
- },
51
- classes: {}
52
- }));
53
- expect(_react2.screen.getByRole('button')).toBeInTheDocument();
54
- });
55
- it('renders feedback icon button', function () {
56
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
57
- onChange: onChange,
58
- classes: {}
59
- }));
60
- var button = _react2.screen.getByRole('button');
61
- expect(button).toBeInTheDocument();
62
- });
63
- });
64
- describe('user interactions', function () {
65
- it('opens menu when button is clicked', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
66
- var user, button;
67
- return _regenerator["default"].wrap(function (_context) {
68
- while (1) switch (_context.prev = _context.next) {
69
- case 0:
70
- user = _userEvent["default"].setup();
71
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
72
- onChange: onChange,
73
- value: {
74
- type: 'default'
75
- },
76
- classes: {}
77
- }));
78
- button = _react2.screen.getByRole('button');
79
- _context.next = 1;
80
- return user.click(button);
81
- case 1:
82
- // Menu items should appear
83
- expect(_react2.screen.getByText('No Feedback')).toBeInTheDocument();
84
- expect(_react2.screen.getByText('Default')).toBeInTheDocument();
85
- expect(_react2.screen.getByText('Custom')).toBeInTheDocument();
86
- case 2:
87
- case "end":
88
- return _context.stop();
89
- }
90
- }, _callee);
91
- })));
92
- it('calls onChange with "none" when No Feedback is selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
93
- var user, button, noFeedbackOption;
94
- return _regenerator["default"].wrap(function (_context2) {
95
- while (1) switch (_context2.prev = _context2.next) {
96
- case 0:
97
- user = _userEvent["default"].setup();
98
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
99
- onChange: onChange,
100
- value: {
101
- type: 'default'
102
- },
103
- classes: {}
104
- }));
105
- button = _react2.screen.getByRole('button');
106
- _context2.next = 1;
107
- return user.click(button);
108
- case 1:
109
- noFeedbackOption = _react2.screen.getByText('No Feedback');
110
- _context2.next = 2;
111
- return user.click(noFeedbackOption);
112
- case 2:
113
- expect(onChange).toHaveBeenCalledWith('none');
114
- case 3:
115
- case "end":
116
- return _context2.stop();
117
- }
118
- }, _callee2);
119
- })));
120
- it('calls onChange with "default" when Default is selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
121
- var user, button, defaultOption;
122
- return _regenerator["default"].wrap(function (_context3) {
123
- while (1) switch (_context3.prev = _context3.next) {
124
- case 0:
125
- user = _userEvent["default"].setup();
126
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
127
- onChange: onChange,
128
- value: {
129
- type: 'none'
130
- },
131
- classes: {}
132
- }));
133
- button = _react2.screen.getByRole('button');
134
- _context3.next = 1;
135
- return user.click(button);
136
- case 1:
137
- defaultOption = _react2.screen.getByText('Default');
138
- _context3.next = 2;
139
- return user.click(defaultOption);
140
- case 2:
141
- expect(onChange).toHaveBeenCalledWith('default');
142
- case 3:
143
- case "end":
144
- return _context3.stop();
145
- }
146
- }, _callee3);
147
- })));
148
- it('calls onChange with "custom" when Custom is selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
149
- var user, button, customOption;
150
- return _regenerator["default"].wrap(function (_context4) {
151
- while (1) switch (_context4.prev = _context4.next) {
152
- case 0:
153
- user = _userEvent["default"].setup();
154
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
155
- onChange: onChange,
156
- value: {
157
- type: 'none'
158
- },
159
- classes: {}
160
- }));
161
- button = _react2.screen.getByRole('button');
162
- _context4.next = 1;
163
- return user.click(button);
164
- case 1:
165
- customOption = _react2.screen.getByText('Custom');
166
- _context4.next = 2;
167
- return user.click(customOption);
168
- case 2:
169
- expect(onChange).toHaveBeenCalledWith('custom');
170
- case 3:
171
- case "end":
172
- return _context4.stop();
173
- }
174
- }, _callee4);
175
- })));
176
- it('closes menu after selection', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
177
- var user, button, noFeedbackOption;
178
- return _regenerator["default"].wrap(function (_context5) {
179
- while (1) switch (_context5.prev = _context5.next) {
180
- case 0:
181
- user = _userEvent["default"].setup();
182
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
183
- onChange: onChange,
184
- value: {
185
- type: 'default'
186
- },
187
- classes: {}
188
- }));
189
- button = _react2.screen.getByRole('button');
190
- _context5.next = 1;
191
- return user.click(button);
192
- case 1:
193
- expect(_react2.screen.getByText('No Feedback')).toBeInTheDocument();
194
- noFeedbackOption = _react2.screen.getByText('No Feedback');
195
- _context5.next = 2;
196
- return user.click(noFeedbackOption);
197
- case 2:
198
- // Menu should close after selection
199
- expect(onChange).toHaveBeenCalledWith('none');
200
- case 3:
201
- case "end":
202
- return _context5.stop();
203
- }
204
- }, _callee5);
205
- })));
206
- });
207
- describe('feedback type indicators', function () {
208
- it('shows correct icon color for default feedback', function () {
209
- var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
210
- onChange: onChange,
211
- value: {
212
- type: 'default'
213
- },
214
- classes: {}
215
- })),
216
- container = _render2.container;
217
- // Icon should be present with primary color
218
- expect(container.querySelector('svg')).toBeInTheDocument();
219
- });
220
- it('shows correct icon color for custom feedback', function () {
221
- var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
222
- onChange: onChange,
223
- value: {
224
- type: 'custom'
225
- },
226
- classes: {}
227
- })),
228
- container = _render3.container;
229
- // Icon should be present with primary color
230
- expect(container.querySelector('svg')).toBeInTheDocument();
231
- });
232
- it('shows correct icon color for disabled feedback', function () {
233
- var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
234
- onChange: onChange,
235
- value: {
236
- type: 'none'
237
- },
238
- classes: {}
239
- })),
240
- container = _render4.container;
241
- // Icon should be present with disabled color
242
- expect(container.querySelector('svg')).toBeInTheDocument();
243
- });
244
- });
245
- describe('aria labels', function () {
246
- it('has aria-label on button for default feedback', function () {
247
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
248
- onChange: onChange,
249
- value: {
250
- type: 'default'
251
- },
252
- classes: {}
253
- }));
254
- var button = _react2.screen.getByRole('button', {
255
- name: /Default Feedback/i
256
- });
257
- expect(button).toBeInTheDocument();
258
- });
259
- it('has aria-label on button for custom feedback', function () {
260
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
261
- onChange: onChange,
262
- value: {
263
- type: 'custom'
264
- },
265
- classes: {}
266
- }));
267
- var button = _react2.screen.getByRole('button', {
268
- name: /Custom Feedback/i
269
- });
270
- expect(button).toBeInTheDocument();
271
- });
272
- it('has aria-label on button for disabled feedback', function () {
273
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_feedbackMenu["default"], {
274
- onChange: onChange,
275
- value: {
276
- type: 'none'
277
- },
278
- classes: {}
279
- }));
280
- var button = _react2.screen.getByRole('button', {
281
- name: /Feedback disabled/i
282
- });
283
- expect(button).toBeInTheDocument();
284
- });
285
- });
286
- });
287
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdXNlckV2ZW50IiwiX2ZlZWRiYWNrTWVudSIsImRlc2NyaWJlIiwib25DaGFuZ2UiLCJqZXN0IiwiZm4iLCJiZWZvcmVFYWNoIiwibW9ja0NsZWFyIiwiaXQiLCJfcmVuZGVyIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzZXMiLCJjb250YWluZXIiLCJleHBlY3QiLCJmaXJzdENoaWxkIiwidG9CZUluVGhlRG9jdW1lbnQiLCJ2YWx1ZSIsInR5cGUiLCJzY3JlZW4iLCJnZXRCeVJvbGUiLCJidXR0b24iLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInVzZXIiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInVzZXJFdmVudCIsInNldHVwIiwiY2xpY2siLCJnZXRCeVRleHQiLCJzdG9wIiwiX2NhbGxlZTIiLCJub0ZlZWRiYWNrT3B0aW9uIiwiX2NvbnRleHQyIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJfY2FsbGVlMyIsImRlZmF1bHRPcHRpb24iLCJfY29udGV4dDMiLCJfY2FsbGVlNCIsImN1c3RvbU9wdGlvbiIsIl9jb250ZXh0NCIsIl9jYWxsZWU1IiwiX2NvbnRleHQ1IiwiX3JlbmRlcjIiLCJxdWVyeVNlbGVjdG9yIiwiX3JlbmRlcjMiLCJfcmVuZGVyNCIsIm5hbWUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2hvaWNlLWNvbmZpZ3VyYXRpb24vX190ZXN0c19fL2ZlZWRiYWNrLW1lbnUudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciwgc2NyZWVuIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgdXNlckV2ZW50IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvdXNlci1ldmVudCc7XG5pbXBvcnQgRmVlZGJhY2tNZW51IGZyb20gJy4uL2ZlZWRiYWNrLW1lbnUnO1xuXG5kZXNjcmliZSgnZmVlZGJhY2stbWVudScsICgpID0+IHtcbiAgY29uc3Qgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25DaGFuZ2UubW9ja0NsZWFyKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMgZmVlZGJhY2sgbWVudSB3aXRoIGRlZmF1bHQgb3B0aW9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEZlZWRiYWNrTWVudSBvbkNoYW5nZT17b25DaGFuZ2V9IGNsYXNzZXM9e3t9fSAvPik7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBtZW51IHdpdGggZmVlZGJhY2sgdHlwZSBzZWxlY3RvcicsICgpID0+IHtcbiAgICAgIHJlbmRlcig8RmVlZGJhY2tNZW51IG9uQ2hhbmdlPXtvbkNoYW5nZX0gdmFsdWU9e3sgdHlwZTogJ2RlZmF1bHQnIH19IGNsYXNzZXM9e3t9fSAvPik7XG4gICAgICAvLyBNZW51IGJ1dHRvbiBzaG91bGQgYmUgaW4gdGhlIGRvY3VtZW50XG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyB3aXRoIG5vIGZlZWRiYWNrIHR5cGUnLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPEZlZWRiYWNrTWVudSBvbkNoYW5nZT17b25DaGFuZ2V9IHZhbHVlPXt7IHR5cGU6ICdub25lJyB9fSBjbGFzc2VzPXt7fX0gLz4pO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgd2l0aCBjdXN0b20gZmVlZGJhY2sgdHlwZScsICgpID0+IHtcbiAgICAgIHJlbmRlcig8RmVlZGJhY2tNZW51IG9uQ2hhbmdlPXtvbkNoYW5nZX0gdmFsdWU9e3sgdHlwZTogJ2N1c3RvbScgfX0gY2xhc3Nlcz17e319IC8+KTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGZlZWRiYWNrIGljb24gYnV0dG9uJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxGZWVkYmFja01lbnUgb25DaGFuZ2U9e29uQ2hhbmdlfSBjbGFzc2VzPXt7fX0gLz4pO1xuICAgICAgY29uc3QgYnV0dG9uID0gc2NyZWVuLmdldEJ5Um9sZSgnYnV0dG9uJyk7XG4gICAgICBleHBlY3QoYnV0dG9uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXNlciBpbnRlcmFjdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ29wZW5zIG1lbnUgd2hlbiBidXR0b24gaXMgY2xpY2tlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIHJlbmRlcig8RmVlZGJhY2tNZW51IG9uQ2hhbmdlPXtvbkNoYW5nZX0gdmFsdWU9e3sgdHlwZTogJ2RlZmF1bHQnIH19IGNsYXNzZXM9e3t9fSAvPik7XG5cbiAgICAgIGNvbnN0IGJ1dHRvbiA9IHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicpO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhidXR0b24pO1xuXG4gICAgICAvLyBNZW51IGl0ZW1zIHNob3VsZCBhcHBlYXJcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdObyBGZWVkYmFjaycpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0RlZmF1bHQnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdDdXN0b20nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aXRoIFwibm9uZVwiIHdoZW4gTm8gRmVlZGJhY2sgaXMgc2VsZWN0ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICByZW5kZXIoPEZlZWRiYWNrTWVudSBvbkNoYW5nZT17b25DaGFuZ2V9IHZhbHVlPXt7IHR5cGU6ICdkZWZhdWx0JyB9fSBjbGFzc2VzPXt7fX0gLz4pO1xuXG4gICAgICBjb25zdCBidXR0b24gPSBzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xpY2soYnV0dG9uKTtcblxuICAgICAgY29uc3Qgbm9GZWVkYmFja09wdGlvbiA9IHNjcmVlbi5nZXRCeVRleHQoJ05vIEZlZWRiYWNrJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKG5vRmVlZGJhY2tPcHRpb24pO1xuXG4gICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdub25lJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgb25DaGFuZ2Ugd2l0aCBcImRlZmF1bHRcIiB3aGVuIERlZmF1bHQgaXMgc2VsZWN0ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICByZW5kZXIoPEZlZWRiYWNrTWVudSBvbkNoYW5nZT17b25DaGFuZ2V9IHZhbHVlPXt7IHR5cGU6ICdub25lJyB9fSBjbGFzc2VzPXt7fX0gLz4pO1xuXG4gICAgICBjb25zdCBidXR0b24gPSBzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xpY2soYnV0dG9uKTtcblxuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbiA9IHNjcmVlbi5nZXRCeVRleHQoJ0RlZmF1bHQnKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xpY2soZGVmYXVsdE9wdGlvbik7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2RlZmF1bHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBvbkNoYW5nZSB3aXRoIFwiY3VzdG9tXCIgd2hlbiBDdXN0b20gaXMgc2VsZWN0ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gdXNlckV2ZW50LnNldHVwKCk7XG4gICAgICByZW5kZXIoPEZlZWRiYWNrTWVudSBvbkNoYW5nZT17b25DaGFuZ2V9IHZhbHVlPXt7IHR5cGU6ICdub25lJyB9fSBjbGFzc2VzPXt7fX0gLz4pO1xuXG4gICAgICBjb25zdCBidXR0b24gPSBzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nKTtcbiAgICAgIGF3YWl0IHVzZXIuY2xpY2soYnV0dG9uKTtcblxuICAgICAgY29uc3QgY3VzdG9tT3B0aW9uID0gc2NyZWVuLmdldEJ5VGV4dCgnQ3VzdG9tJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKGN1c3RvbU9wdGlvbik7XG5cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2N1c3RvbScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Nsb3NlcyBtZW51IGFmdGVyIHNlbGVjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2VyRXZlbnQuc2V0dXAoKTtcbiAgICAgIHJlbmRlcig8RmVlZGJhY2tNZW51IG9uQ2hhbmdlPXtvbkNoYW5nZX0gdmFsdWU9e3sgdHlwZTogJ2RlZmF1bHQnIH19IGNsYXNzZXM9e3t9fSAvPik7XG5cbiAgICAgIGNvbnN0IGJ1dHRvbiA9IHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicpO1xuICAgICAgYXdhaXQgdXNlci5jbGljayhidXR0b24pO1xuXG4gICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnTm8gRmVlZGJhY2snKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgICAgY29uc3Qgbm9GZWVkYmFja09wdGlvbiA9IHNjcmVlbi5nZXRCeVRleHQoJ05vIEZlZWRiYWNrJyk7XG4gICAgICBhd2FpdCB1c2VyLmNsaWNrKG5vRmVlZGJhY2tPcHRpb24pO1xuXG4gICAgICAvLyBNZW51IHNob3VsZCBjbG9zZSBhZnRlciBzZWxlY3Rpb25cbiAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ25vbmUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZlZWRiYWNrIHR5cGUgaW5kaWNhdG9ycycsICgpID0+IHtcbiAgICBpdCgnc2hvd3MgY29ycmVjdCBpY29uIGNvbG9yIGZvciBkZWZhdWx0IGZlZWRiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8RmVlZGJhY2tNZW51IG9uQ2hhbmdlPXtvbkNoYW5nZX0gdmFsdWU9e3sgdHlwZTogJ2RlZmF1bHQnIH19IGNsYXNzZXM9e3t9fSAvPik7XG4gICAgICAvLyBJY29uIHNob3VsZCBiZSBwcmVzZW50IHdpdGggcHJpbWFyeSBjb2xvclxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG93cyBjb3JyZWN0IGljb24gY29sb3IgZm9yIGN1c3RvbSBmZWVkYmFjaycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEZlZWRiYWNrTWVudSBvbkNoYW5nZT17b25DaGFuZ2V9IHZhbHVlPXt7IHR5cGU6ICdjdXN0b20nIH19IGNsYXNzZXM9e3t9fSAvPik7XG4gICAgICAvLyBJY29uIHNob3VsZCBiZSBwcmVzZW50IHdpdGggcHJpbWFyeSBjb2xvclxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG93cyBjb3JyZWN0IGljb24gY29sb3IgZm9yIGRpc2FibGVkIGZlZWRiYWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8RmVlZGJhY2tNZW51IG9uQ2hhbmdlPXtvbkNoYW5nZX0gdmFsdWU9e3sgdHlwZTogJ25vbmUnIH19IGNsYXNzZXM9e3t9fSAvPik7XG4gICAgICAvLyBJY29uIHNob3VsZCBiZSBwcmVzZW50IHdpdGggZGlzYWJsZWQgY29sb3JcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3Rvcignc3ZnJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhcmlhIGxhYmVscycsICgpID0+IHtcbiAgICBpdCgnaGFzIGFyaWEtbGFiZWwgb24gYnV0dG9uIGZvciBkZWZhdWx0IGZlZWRiYWNrJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxGZWVkYmFja01lbnUgb25DaGFuZ2U9e29uQ2hhbmdlfSB2YWx1ZT17eyB0eXBlOiAnZGVmYXVsdCcgfX0gY2xhc3Nlcz17e319IC8+KTtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IHNjcmVlbi5nZXRCeVJvbGUoJ2J1dHRvbicsIHsgbmFtZTogL0RlZmF1bHQgRmVlZGJhY2svaSB9KTtcbiAgICAgIGV4cGVjdChidXR0b24pLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFzIGFyaWEtbGFiZWwgb24gYnV0dG9uIGZvciBjdXN0b20gZmVlZGJhY2snLCAoKSA9PiB7XG4gICAgICByZW5kZXIoPEZlZWRiYWNrTWVudSBvbkNoYW5nZT17b25DaGFuZ2V9IHZhbHVlPXt7IHR5cGU6ICdjdXN0b20nIH19IGNsYXNzZXM9e3t9fSAvPik7XG4gICAgICBjb25zdCBidXR0b24gPSBzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6IC9DdXN0b20gRmVlZGJhY2svaSB9KTtcbiAgICAgIGV4cGVjdChidXR0b24pLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFzIGFyaWEtbGFiZWwgb24gYnV0dG9uIGZvciBkaXNhYmxlZCBmZWVkYmFjaycsICgpID0+IHtcbiAgICAgIHJlbmRlcig8RmVlZGJhY2tNZW51IG9uQ2hhbmdlPXtvbkNoYW5nZX0gdmFsdWU9e3sgdHlwZTogJ25vbmUnIH19IGNsYXNzZXM9e3t9fSAvPik7XG4gICAgICBjb25zdCBidXR0b24gPSBzY3JlZW4uZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6IC9GZWVkYmFjayBkaXNhYmxlZC9pIH0pO1xuICAgICAgZXhwZWN0KGJ1dHRvbikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxhQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFFQUksUUFBUSxDQUFDLGVBQWUsRUFBRSxZQUFNO0VBQzlCLElBQU1DLFFBQVEsR0FBR0MsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztFQUUxQkMsVUFBVSxDQUFDLFlBQU07SUFDZkgsUUFBUSxDQUFDSSxTQUFTLENBQUMsQ0FBQztFQUN0QixDQUFDLENBQUM7RUFFRkwsUUFBUSxDQUFDLFdBQVcsRUFBRSxZQUFNO0lBQzFCTSxFQUFFLENBQUMsNENBQTRDLEVBQUUsWUFBTTtNQUNyRCxJQUFBQyxPQUFBLEdBQXNCLElBQUFDLGNBQU0sZUFBQ2QsTUFBQSxZQUFBZSxhQUFBLENBQUNWLGFBQUEsV0FBWTtVQUFDRSxRQUFRLEVBQUVBLFFBQVM7VUFBQ1MsT0FB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