@pie-element/drag-in-the-blank 8.0.1 → 8.2.0-mui-update.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/configure/CHANGELOG.md +80 -0
  3. package/configure/lib/__tests__/choice.test.js +103 -0
  4. package/configure/lib/__tests__/choices.test.js +326 -0
  5. package/configure/lib/__tests__/main.test.js +160 -0
  6. package/configure/lib/__tests__/markupUtils.test.js +105 -0
  7. package/configure/lib/choice.js +103 -102
  8. package/configure/lib/choice.js.map +1 -1
  9. package/configure/lib/choices.js +209 -311
  10. package/configure/lib/choices.js.map +1 -1
  11. package/configure/lib/defaults.js +3 -4
  12. package/configure/lib/defaults.js.map +1 -1
  13. package/configure/lib/index.js +120 -189
  14. package/configure/lib/index.js.map +1 -1
  15. package/configure/lib/main.js +411 -417
  16. package/configure/lib/main.js.map +1 -1
  17. package/configure/lib/markupUtils.js +36 -55
  18. package/configure/lib/markupUtils.js.map +1 -1
  19. package/configure/package.json +13 -10
  20. package/controller/CHANGELOG.md +61 -0
  21. package/controller/lib/__tests__/index.test.js +778 -0
  22. package/controller/lib/defaults.js +3 -4
  23. package/controller/lib/defaults.js.map +1 -1
  24. package/controller/lib/index.js +110 -199
  25. package/controller/lib/index.js.map +1 -1
  26. package/controller/lib/utils.js +13 -25
  27. package/controller/lib/utils.js.map +1 -1
  28. package/controller/package.json +2 -2
  29. package/docs/demo/pie.manifest.json +11 -0
  30. package/lib/__tests__/index.test.js +122 -0
  31. package/lib/__tests__/main.test.js +83 -0
  32. package/lib/index.js +171 -238
  33. package/lib/index.js.map +1 -1
  34. package/lib/main.js +102 -161
  35. package/lib/main.js.map +1 -1
  36. package/package.json +14 -29
  37. package/LICENSE.md +0 -5
  38. package/esm/configure.js +0 -18123
  39. package/esm/configure.js.map +0 -1
  40. package/esm/controller.js +0 -328
  41. package/esm/controller.js.map +0 -1
  42. package/esm/element.js +0 -7763
  43. package/esm/element.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,87 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [8.3.3](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@8.3.2...@pie-element/drag-in-the-blank@8.3.3) (2025-11-27)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * bump libs PD-5274, PD-5211, PD-5248 ([7610b25](https://github.com/pie-framework/pie-elements/commit/7610b25423956b6492f33322513b3430051fca77))
12
+
13
+
14
+
15
+
16
+
17
+ ## [8.3.2](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@8.3.1...@pie-element/drag-in-the-blank@8.3.2) (2025-10-22)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * bump libs PD-5265 ([184a978](https://github.com/pie-framework/pie-elements/commit/184a978f57a2a84dc6ba87c1eba0b92d5cdd9eae))
23
+
24
+
25
+
26
+
27
+
28
+ ## [8.3.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@8.2.1...@pie-element/drag-in-the-blank@8.3.1) (2025-10-16)
29
+
30
+
31
+ ### Bug Fixes
32
+
33
+ * bump pie-lib versions and pslb module versions ([393d39f](https://github.com/pie-framework/pie-elements/commit/393d39fb850ad055568f4d20464213e9043f208f))
34
+
35
+
36
+
37
+
38
+
39
+ # [8.3.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@8.2.0...@pie-element/drag-in-the-blank@8.3.0) (2025-10-15)
40
+
41
+
42
+ ### Bug Fixes
43
+
44
+ * bump libs ([2616ab2](https://github.com/pie-framework/pie-elements/commit/2616ab24f776f4df02302f5855c381ee52527665))
45
+
46
+
47
+
48
+
49
+
50
+ ## [8.2.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@8.2.0...@pie-element/drag-in-the-blank@8.2.1) (2025-10-14)
51
+
52
+
53
+ ### Bug Fixes
54
+
55
+ * bump libs ([2616ab2](https://github.com/pie-framework/pie-elements/commit/2616ab24f776f4df02302f5855c381ee52527665))
56
+
57
+
58
+
59
+
60
+
61
+ # [8.2.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@8.0.0...@pie-element/drag-in-the-blank@8.2.0) (2025-10-10)
62
+
63
+
64
+ ### Bug Fixes
65
+
66
+ * tests ([a473075](https://github.com/pie-framework/pie-elements/commit/a473075d3942e900b1e7137483ea6064951549c2))
67
+ * **drag-in-the-blank:** prevent duplicate IDs when adding choices after removal PD-5225 ([31c1357](https://github.com/pie-framework/pie-elements/commit/31c13578e73397ae1334b7abd06545f3299cdf28))
68
+
69
+
70
+ ### Features
71
+
72
+ * update completion rule for categorize, ditb, and image-cloze PD-5179 ([cd03a6e](https://github.com/pie-framework/pie-elements/commit/cd03a6e56e51cc3778749b3679b87f9122405936))
73
+ * update libs PD-5208, PD-5211, PD-5199, PD-5218, PD-5217 ([da327fa](https://github.com/pie-framework/pie-elements/commit/da327fa501f6e9eff1c0b30b5ef092426a91f78b))
74
+
75
+
76
+
77
+
78
+
79
+ # [8.1.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@7.0.0...@pie-element/drag-in-the-blank@8.1.0) (2025-10-07)
80
+
81
+ **Note:** Version bump only for package @pie-element/drag-in-the-blank
82
+
83
+
84
+
85
+
86
+
6
87
  # [8.0.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank@6.13.4...@pie-element/drag-in-the-blank@8.0.0) (2025-10-02)
7
88
 
8
89
 
@@ -3,6 +3,86 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [7.3.3](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@7.3.2...@pie-element/drag-in-the-blank-configure@7.3.3) (2025-11-27)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * bump libs PD-5274, PD-5211, PD-5248 ([7610b25](https://github.com/pie-framework/pie-elements/commit/7610b25423956b6492f33322513b3430051fca77))
12
+
13
+
14
+
15
+
16
+
17
+ ## [7.3.2](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@7.3.1...@pie-element/drag-in-the-blank-configure@7.3.2) (2025-10-22)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * bump libs PD-5265 ([184a978](https://github.com/pie-framework/pie-elements/commit/184a978f57a2a84dc6ba87c1eba0b92d5cdd9eae))
23
+
24
+
25
+
26
+
27
+
28
+ ## [7.3.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@7.2.1...@pie-element/drag-in-the-blank-configure@7.3.1) (2025-10-16)
29
+
30
+
31
+ ### Bug Fixes
32
+
33
+ * bump pie-lib versions and pslb module versions ([393d39f](https://github.com/pie-framework/pie-elements/commit/393d39fb850ad055568f4d20464213e9043f208f))
34
+
35
+
36
+
37
+
38
+
39
+ # [7.3.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@7.2.0...@pie-element/drag-in-the-blank-configure@7.3.0) (2025-10-15)
40
+
41
+
42
+ ### Bug Fixes
43
+
44
+ * bump libs ([2616ab2](https://github.com/pie-framework/pie-elements/commit/2616ab24f776f4df02302f5855c381ee52527665))
45
+
46
+
47
+
48
+
49
+
50
+ ## [7.2.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@7.2.0...@pie-element/drag-in-the-blank-configure@7.2.1) (2025-10-14)
51
+
52
+
53
+ ### Bug Fixes
54
+
55
+ * bump libs ([2616ab2](https://github.com/pie-framework/pie-elements/commit/2616ab24f776f4df02302f5855c381ee52527665))
56
+
57
+
58
+
59
+
60
+
61
+ # [7.2.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@7.0.1...@pie-element/drag-in-the-blank-configure@7.2.0) (2025-10-10)
62
+
63
+
64
+ ### Bug Fixes
65
+
66
+ * tests ([a473075](https://github.com/pie-framework/pie-elements/commit/a473075d3942e900b1e7137483ea6064951549c2))
67
+ * **drag-in-the-blank:** prevent duplicate IDs when adding choices after removal PD-5225 ([31c1357](https://github.com/pie-framework/pie-elements/commit/31c13578e73397ae1334b7abd06545f3299cdf28))
68
+
69
+
70
+ ### Features
71
+
72
+ * update libs PD-5208, PD-5211, PD-5199, PD-5218, PD-5217 ([da327fa](https://github.com/pie-framework/pie-elements/commit/da327fa501f6e9eff1c0b30b5ef092426a91f78b))
73
+
74
+
75
+
76
+
77
+
78
+ # [7.1.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@7.0.0...@pie-element/drag-in-the-blank-configure@7.1.0) (2025-10-07)
79
+
80
+ **Note:** Version bump only for package @pie-element/drag-in-the-blank-configure
81
+
82
+
83
+
84
+
85
+
6
86
  ## [7.0.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/drag-in-the-blank-configure@6.7.0...@pie-element/drag-in-the-blank-configure@7.0.1) (2025-10-02)
7
87
 
8
88
  **Note:** Version bump only for package @pie-element/drag-in-the-blank-configure
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _enzyme = require("enzyme");
5
+ var _react = _interopRequireDefault(require("react"));
6
+ var _choice = _interopRequireWildcard(require("../choice"));
7
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
8
+ describe('Choice', () => {
9
+ let onClick;
10
+ let onRemoveChoice;
11
+ let connectDragSource;
12
+ let connectDragPreview;
13
+ beforeEach(() => {
14
+ onClick = jest.fn();
15
+ onRemoveChoice = jest.fn();
16
+ connectDragSource = jest.fn();
17
+ connectDragPreview = jest.fn();
18
+ });
19
+ const wrapper = extras => {
20
+ const props = {
21
+ classes: {},
22
+ key: '0',
23
+ duplicates: true,
24
+ choice: {
25
+ value: '<div>6</div>',
26
+ id: '0'
27
+ },
28
+ targetId: '0',
29
+ onClick,
30
+ onRemoveChoice,
31
+ connectDragSource,
32
+ connectDragPreview,
33
+ ...extras
34
+ };
35
+ return (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_choice.default, props));
36
+ };
37
+ describe('snapshot', () => {
38
+ it('renders', () => {
39
+ const w = wrapper();
40
+ expect(w).toMatchSnapshot();
41
+ });
42
+ });
43
+ });
44
+ describe('spec', () => {
45
+ describe('canDrag', () => {
46
+ it('returns true if category has any value and is enabled', () => {
47
+ const result = _choice.tileSource.canDrag({
48
+ choice: {
49
+ value: '<div>6</div>',
50
+ id: '0'
51
+ },
52
+ disabled: false
53
+ });
54
+ expect(result).toEqual(true);
55
+ });
56
+ it('returns false if category has any value and is disabled', () => {
57
+ const jsdomAlert = window.alert; // remember the jsdom alert
58
+ window.alert = () => {};
59
+ const result = _choice.tileSource.canDrag({
60
+ choice: {
61
+ value: '<div>6</div>',
62
+ id: '0'
63
+ },
64
+ disabled: true
65
+ });
66
+ expect(result).toEqual(false);
67
+ window.alert = jsdomAlert;
68
+ });
69
+ it('returns false if category value is empty', () => {
70
+ const jsdomAlert = window.alert; // remember the jsdom alert
71
+ window.alert = () => {};
72
+ const result = _choice.tileSource.canDrag({
73
+ choice: {
74
+ value: '',
75
+ id: '0'
76
+ }
77
+ });
78
+ expect(result).toEqual(false);
79
+ window.alert = jsdomAlert;
80
+ });
81
+ });
82
+ describe('beginDrag', () => {
83
+ it('returns the proper object', () => {
84
+ const result = _choice.tileSource.beginDrag({
85
+ choice: {
86
+ value: '<div>0</div>',
87
+ id: '0'
88
+ },
89
+ instanceId: '1',
90
+ targetId: '0'
91
+ });
92
+ expect(result).toEqual({
93
+ id: '0',
94
+ instanceId: '1',
95
+ value: {
96
+ value: '<div>0</div>',
97
+ id: '0'
98
+ }
99
+ });
100
+ });
101
+ });
102
+ });
103
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZW56eW1lIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2hvaWNlIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJkZXNjcmliZSIsIm9uQ2xpY2siLCJvblJlbW92ZUNob2ljZSIsImNvbm5lY3REcmFnU291cmNlIiwiY29ubmVjdERyYWdQcmV2aWV3IiwiYmVmb3JlRWFjaCIsImplc3QiLCJmbiIsIndyYXBwZXIiLCJleHRyYXMiLCJwcm9wcyIsImNsYXNzZXMiLCJrZXkiLCJkdXBsaWNhdGVzIiwiY2hvaWNlIiwidmFsdWUiLCJpZCIsInRhcmdldElkIiwic2hhbGxvdyIsImNyZWF0ZUVsZW1lbnQiLCJpdCIsInciLCJleHBlY3QiLCJ0b01hdGNoU25hcHNob3QiLCJyZXN1bHQiLCJ0aWxlU291cmNlIiwiY2FuRHJhZyIsImRpc2FibGVkIiwidG9FcXVhbCIsImpzZG9tQWxlcnQiLCJ3aW5kb3ciLCJhbGVydCIsImJlZ2luRHJhZyIsImluc3RhbmNlSWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2Nob2ljZS50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzaGFsbG93IH0gZnJvbSAnZW56eW1lJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ2hvaWNlLCB7IHRpbGVTb3VyY2UgfSBmcm9tICcuLi9jaG9pY2UnO1xuXG5kZXNjcmliZSgnQ2hvaWNlJywgKCkgPT4ge1xuICBsZXQgb25DbGljaztcbiAgbGV0IG9uUmVtb3ZlQ2hvaWNlO1xuICBsZXQgY29ubmVjdERyYWdTb3VyY2U7XG4gIGxldCBjb25uZWN0RHJhZ1ByZXZpZXc7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25DbGljayA9IGplc3QuZm4oKTtcbiAgICBvblJlbW92ZUNob2ljZSA9IGplc3QuZm4oKTtcbiAgICBjb25uZWN0RHJhZ1NvdXJjZSA9IGplc3QuZm4oKTtcbiAgICBjb25uZWN0RHJhZ1ByZXZpZXcgPSBqZXN0LmZuKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHdyYXBwZXIgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIGtleTogJzAnLFxuICAgICAgZHVwbGljYXRlczogdHJ1ZSxcbiAgICAgIGNob2ljZToge1xuICAgICAgICB2YWx1ZTogJzxkaXY+NjwvZGl2PicsXG4gICAgICAgIGlkOiAnMCcsXG4gICAgICB9LFxuICAgICAgdGFyZ2V0SWQ6ICcwJyxcbiAgICAgIG9uQ2xpY2ssXG4gICAgICBvblJlbW92ZUNob2ljZSxcbiAgICAgIGNvbm5lY3REcmFnU291cmNlLFxuICAgICAgY29ubmVjdERyYWdQcmV2aWV3LFxuICAgICAgLi4uZXh0cmFzLFxuICAgIH07XG5cbiAgICByZXR1cm4gc2hhbGxvdyg8Q2hvaWNlIHsuLi5wcm9wc30gLz4pO1xuICB9O1xuICBkZXNjcmliZSgnc25hcHNob3QnLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3ID0gd3JhcHBlcigpO1xuICAgICAgZXhwZWN0KHcpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnc3BlYycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2NhbkRyYWcnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgdHJ1ZSBpZiBjYXRlZ29yeSBoYXMgYW55IHZhbHVlIGFuZCBpcyBlbmFibGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGlsZVNvdXJjZS5jYW5EcmFnKHsgY2hvaWNlOiB7IHZhbHVlOiAnPGRpdj42PC9kaXY+JywgaWQ6ICcwJyB9LCBkaXNhYmxlZDogZmFsc2UgfSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgZmFsc2UgaWYgY2F0ZWdvcnkgaGFzIGFueSB2YWx1ZSBhbmQgaXMgZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBqc2RvbUFsZXJ0ID0gd2luZG93LmFsZXJ0OyAvLyByZW1lbWJlciB0aGUganNkb20gYWxlcnRcbiAgICAgIHdpbmRvdy5hbGVydCA9ICgpID0+IHt9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB0aWxlU291cmNlLmNhbkRyYWcoeyBjaG9pY2U6IHsgdmFsdWU6ICc8ZGl2PjY8L2Rpdj4nLCBpZDogJzAnIH0sIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChmYWxzZSk7XG5cbiAgICAgIHdpbmRvdy5hbGVydCA9IGpzZG9tQWxlcnQ7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBmYWxzZSBpZiBjYXRlZ29yeSB2YWx1ZSBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IGpzZG9tQWxlcnQgPSB3aW5kb3cuYWxlcnQ7IC8vIHJlbWVtYmVyIHRoZSBqc2RvbSBhbGVydFxuICAgICAgd2luZG93LmFsZXJ0ID0gKCkgPT4ge307XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRpbGVTb3VyY2UuY2FuRHJhZyh7IGNob2ljZTogeyB2YWx1ZTogJycsIGlkOiAnMCcgfSB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZmFsc2UpO1xuXG4gICAgICB3aW5kb3cuYWxlcnQgPSBqc2RvbUFsZXJ0O1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYmVnaW5EcmFnJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHRoZSBwcm9wZXIgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGlsZVNvdXJjZS5iZWdpbkRyYWcoe1xuICAgICAgICBjaG9pY2U6IHsgdmFsdWU6ICc8ZGl2PjA8L2Rpdj4nLCBpZDogJzAnIH0sXG4gICAgICAgIGluc3RhbmNlSWQ6ICcxJyxcbiAgICAgICAgdGFyZ2V0SWQ6ICcwJyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7IGlkOiAnMCcsIGluc3RhbmNlSWQ6ICcxJywgdmFsdWU6IHsgdmFsdWU6ICc8ZGl2PjA8L2Rpdj4nLCBpZDogJzAnIH0gfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUErQyxTQUFBSSx3QkFBQUMsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUgsdUJBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLFFBQUFDLE9BQUEsRUFBQVYsQ0FBQSxpQkFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsUUFBQUcsQ0FBQSxDQUFBSyxHQUFBLENBQUFYLENBQUEsVUFBQU0sQ0FBQSxDQUFBTSxHQUFBLENBQUFaLENBQUEsR0FBQU0sQ0FBQSxDQUFBTyxHQUFBLENBQUFiLENBQUEsRUFBQVEsQ0FBQSxnQkFBQVAsQ0FBQSxJQUFBRCxDQUFBLGdCQUFBQyxDQUFB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W119
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _enzyme = require("enzyme");
5
+ var _react = _interopRequireDefault(require("react"));
6
+ var _choices = require("../choices");
7
+ var _defaults = _interopRequireDefault(require("../defaults"));
8
+ var _markupUtils = require("../markupUtils");
9
+ jest.mock('@pie-lib/config-ui', () => ({
10
+ choiceUtils: {
11
+ firstAvailableIndex: jest.fn()
12
+ },
13
+ settings: {
14
+ Panel: props => /*#__PURE__*/_react.default.createElement("div", props),
15
+ toggle: jest.fn(),
16
+ radio: jest.fn(),
17
+ dropdown: jest.fn()
18
+ },
19
+ layout: {
20
+ ConfigLayout: props => /*#__PURE__*/_react.default.createElement("div", null, props.children)
21
+ }
22
+ }));
23
+ const model = {
24
+ markup: '{{0}} + {{1}} = 15',
25
+ prompt: '<p>Solve the equation below.</p>',
26
+ choices: [{
27
+ value: '<div>6</div>',
28
+ id: '0'
29
+ }, {
30
+ value: '<div>9</div>',
31
+ id: '1'
32
+ }, {
33
+ value: '<div>12</div>',
34
+ id: '2'
35
+ }],
36
+ choicesPosition: 'below',
37
+ correctResponse: {
38
+ 0: '0',
39
+ 1: '1'
40
+ },
41
+ duplicates: true,
42
+ alternateResponses: [['1'], ['0']],
43
+ rationale: '<p>A correct response is shown below:</p><ul><li>2/6 = 1/3</li><li>4/8 = 1/2</li><li>6/10 = 3/5</li><li>9/12 = 3/4</li></ul>'
44
+ };
45
+ const prepareModel = (model = {}) => {
46
+ const joinedObj = {
47
+ ..._defaults.default.model,
48
+ ...model
49
+ };
50
+ const slateMarkup = model.slateMarkup || (0, _markupUtils.createSlateMarkup)(joinedObj.markup, joinedObj.choices, joinedObj.correctResponse);
51
+ const processedMarkup = (0, _markupUtils.processMarkup)(slateMarkup);
52
+ return {
53
+ ...joinedObj,
54
+ slateMarkup,
55
+ markup: processedMarkup.markup,
56
+ correctResponse: processedMarkup.correctResponse
57
+ };
58
+ };
59
+ describe('Choices', () => {
60
+ let onChange;
61
+ beforeEach(() => {
62
+ onChange = jest.fn();
63
+ });
64
+ const wrapper = extras => {
65
+ const defaults = {
66
+ onChange,
67
+ classes: {},
68
+ model: prepareModel(model),
69
+ duplicates: true,
70
+ ...extras
71
+ };
72
+ const props = {
73
+ ...defaults
74
+ };
75
+ return (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_choices.Choices, props), {
76
+ disableLifecycleMethods: true
77
+ });
78
+ };
79
+ describe('snapshot', () => {
80
+ it('renders with duplicates', () => {
81
+ expect(wrapper()).toMatchSnapshot();
82
+ });
83
+ it('renders without duplicates', () => {
84
+ expect(wrapper({
85
+ duplicates: false
86
+ })).toMatchSnapshot();
87
+ });
88
+ });
89
+ describe('logic', () => {
90
+ let w;
91
+ beforeEach(() => {
92
+ w = wrapper();
93
+ });
94
+ describe('onChoiceChanged', () => {
95
+ it('removes a choice if its new value is empty', () => {
96
+ w.instance().onChoiceChanged('<div>12</div>', '', '2');
97
+ expect(onChange).toBeCalledWith([{
98
+ value: '<div>6</div>',
99
+ id: '0'
100
+ }, {
101
+ value: '<div>9</div>',
102
+ id: '1'
103
+ }]);
104
+ });
105
+ it('does not add new choice if it is identical to another choice', () => {
106
+ w.instance().onChoiceChanged('', '<div>9</div>', '2');
107
+ expect(onChange).toBeCalledWith([{
108
+ value: '<div>6</div>',
109
+ id: '0'
110
+ }, {
111
+ value: '<div>9</div>',
112
+ id: '1'
113
+ }]);
114
+ });
115
+ it('does not change choice if it would be identical to another choice', () => {
116
+ w.instance().onChoiceChanged('<div>6</div>', '<div>9</div>', '0');
117
+ expect(onChange).toHaveBeenCalledTimes(0);
118
+ });
119
+ it('does not remove a choice if its new value is empty, but is used in correct response', () => {
120
+ const jsdomAlert = window.alert; // remember the jsdom alert
121
+
122
+ window.alert = () => {};
123
+ w.instance().onChoiceChanged('<div>9</div>', '', '1');
124
+ expect(onChange).not.toBeCalled();
125
+ window.alert = jsdomAlert;
126
+ });
127
+ it('does not remove a choice if its new value is empty, but is used in alternate response', () => {
128
+ const jsdomAlert = window.alert; // remember the jsdom alert
129
+
130
+ window.alert = () => {};
131
+ wrapper({
132
+ markup: '{{0}}'
133
+ }).instance().onChoiceChanged('<div>9</div>', '', '1');
134
+ expect(onChange).not.toBeCalled();
135
+ window.alert = jsdomAlert;
136
+ });
137
+ it('does not remove a choice if its new value is empty, but the old value was empty as well (at focusing a new choice without editing)', () => {
138
+ const jsdomAlert = window.alert; // remember the jsdom alert
139
+
140
+ window.alert = () => {};
141
+ wrapper({
142
+ markup: '{{0}}'
143
+ }).instance().onChoiceChanged('', '', '1');
144
+ expect(onChange).not.toBeCalled();
145
+ window.alert = jsdomAlert;
146
+ });
147
+ it('updates choices', () => {
148
+ w.instance().onChoiceChanged('<div>9</div>', '<div>3*3</div>', '1');
149
+ expect(onChange).toBeCalledWith([{
150
+ value: '<div>6</div>',
151
+ id: '0'
152
+ }, {
153
+ value: '<div>3*3</div>',
154
+ id: '1'
155
+ }, {
156
+ value: '<div>12</div>',
157
+ id: '2'
158
+ }]);
159
+ });
160
+ });
161
+ describe('onChoiceFocus', () => {
162
+ it('sets focused element id on state', () => {
163
+ w.instance().onChoiceFocus('1');
164
+ expect(w.instance().state.focusedEl).toEqual('1');
165
+ });
166
+ });
167
+ describe('onAddChoice', () => {
168
+ it('adds a choice', () => {
169
+ wrapper().instance().onAddChoice();
170
+ expect(onChange).toBeCalledWith([...model.choices, {
171
+ id: '3',
172
+ value: ''
173
+ }]);
174
+ });
175
+ });
176
+ describe('onChoiceRemove', () => {
177
+ it('removes a choice', () => {
178
+ wrapper().instance().onChoiceRemove('1');
179
+ expect(onChange).toBeCalledWith([{
180
+ value: '<div>6</div>',
181
+ id: '0'
182
+ }, {
183
+ value: '<div>12</div>',
184
+ id: '2'
185
+ }]);
186
+ });
187
+ });
188
+ describe('onChoiceRemove & onAddChoice', () => {
189
+ it('prevents duplicate IDs when adding choices after removing some', () => {
190
+ const initialWrapper = wrapper();
191
+ initialWrapper.instance().onChoiceRemove('1');
192
+ expect(onChange).toHaveBeenCalledWith([{
193
+ value: '<div>6</div>',
194
+ id: '0'
195
+ }, {
196
+ value: '<div>12</div>',
197
+ id: '2'
198
+ }]);
199
+ const updatedChoices = [{
200
+ value: '<div>6</div>',
201
+ id: '0'
202
+ }, {
203
+ value: '<div>12</div>',
204
+ id: '2'
205
+ }];
206
+ const wrapperWithUpdatedState = wrapper({
207
+ model: {
208
+ ...model,
209
+ choices: updatedChoices
210
+ }
211
+ });
212
+ wrapperWithUpdatedState.instance().onAddChoice();
213
+ expect(onChange).toHaveBeenLastCalledWith([{
214
+ value: '<div>6</div>',
215
+ id: '0'
216
+ }, {
217
+ value: '<div>12</div>',
218
+ id: '2'
219
+ }, {
220
+ id: '3',
221
+ value: ''
222
+ }]);
223
+ });
224
+ });
225
+ describe('getVisibleChoices', () => {
226
+ it('choices are null => returns []', () => {
227
+ const visibleChoices = wrapper({
228
+ model: {
229
+ choices: null
230
+ }
231
+ }).instance().getVisibleChoices();
232
+ expect(visibleChoices).toEqual([]);
233
+ });
234
+ it('duplicates = true', () => {
235
+ const choices = [{
236
+ value: '<div>6</div>',
237
+ id: '0'
238
+ }, {
239
+ value: '<div>9</div>',
240
+ id: '1'
241
+ }, {
242
+ value: '<div>12</div>',
243
+ id: '2'
244
+ }];
245
+ const visibleChoices = wrapper({
246
+ model: {
247
+ duplicates: true,
248
+ choices: choices,
249
+ correctResponse: {
250
+ 0: '0',
251
+ 1: '1'
252
+ }
253
+ }
254
+ }).instance().getVisibleChoices();
255
+ expect(visibleChoices).toEqual(choices);
256
+ });
257
+ it('duplicates = false', () => {
258
+ const choices = [{
259
+ value: '<div>6</div>',
260
+ id: '0'
261
+ }, {
262
+ value: '<div>9</div>',
263
+ id: '1'
264
+ }, {
265
+ value: '<div>12</div>',
266
+ id: '2'
267
+ }];
268
+ const visibleChoices = wrapper({
269
+ duplicates: false,
270
+ model: {
271
+ choices: choices,
272
+ correctResponse: {
273
+ 0: '0',
274
+ 1: '1'
275
+ }
276
+ }
277
+ }).instance().getVisibleChoices();
278
+ expect(visibleChoices).toEqual([{
279
+ value: '<div>12</div>',
280
+ id: '2'
281
+ }]);
282
+ });
283
+ it('duplicates = false, empty correctResponse', () => {
284
+ const choices = [{
285
+ value: '<div>6</div>',
286
+ id: '0'
287
+ }, {
288
+ value: '<div>9</div>',
289
+ id: '1'
290
+ }, {
291
+ value: '<div>12</div>',
292
+ id: '2'
293
+ }];
294
+ const visibleChoices = wrapper({
295
+ duplicates: false,
296
+ model: {
297
+ choices: choices,
298
+ correctResponse: {}
299
+ }
300
+ }).instance().getVisibleChoices();
301
+ expect(visibleChoices).toEqual(choices);
302
+ });
303
+ it('duplicates = false, correctResponse = null', () => {
304
+ const choices = [{
305
+ value: '<div>6</div>',
306
+ id: '0'
307
+ }, {
308
+ value: '<div>9</div>',
309
+ id: '1'
310
+ }, {
311
+ value: '<div>12</div>',
312
+ id: '2'
313
+ }];
314
+ const visibleChoices = wrapper({
315
+ duplicates: false,
316
+ model: {
317
+ choices: choices,
318
+ correctResponse: null
319
+ }
320
+ }).instance().getVisibleChoices();
321
+ expect(visibleChoices).toEqual(choices);
322
+ });
323
+ });
324
+ });
325
+ });
326
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZW56eW1lIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2hvaWNlcyIsIl9kZWZhdWx0cyIsIl9tYXJrdXBVdGlscyIsImplc3QiLCJtb2NrIiwiY2hvaWNlVXRpbHMiLCJmaXJzdEF2YWlsYWJsZUluZGV4IiwiZm4iLCJzZXR0aW5ncyIsIlBhbmVsIiwicHJvcHMiLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsInRvZ2dsZSIsInJhZGlvIiwiZHJvcGRvd24iLCJsYXlvdXQiLCJDb25maWdMYXlvdXQiLCJjaGlsZHJlbiIsIm1vZGVsIiwibWFya3VwIiwicHJvbXB0IiwiY2hvaWNlcyIsInZhbHVlIiwiaWQiLCJjaG9pY2VzUG9zaXRpb24iLCJjb3JyZWN0UmVzcG9uc2UiLCJkdXBsaWNhdGVzIiwiYWx0ZXJuYXRlUmVzcG9uc2VzIiwicmF0aW9uYWxlIiwicHJlcGFyZU1vZGVsIiwiam9pbmVkT2JqIiwic2Vuc2libGVEZWZhdWx0cyIsInNsYXRlTWFya3VwIiwiY3JlYXRlU2xhdGVNYXJrdXAiLCJwcm9jZXNzZWRNYXJrdXAiLCJwcm9jZXNzTWFya3VwIiwiZGVzY3JpYmUiLCJvbkNoYW5nZSIsImJlZm9yZUVhY2giLCJ3cmFwcGVyIiwiZXh0cmFzIiwiZGVmYXVsdHMiLCJjbGFzc2VzIiwic2hhbGxvdyIsIkNob2ljZXMiLCJkaXNhYmxlTGlmZWN5Y2xlTWV0aG9kcyIsIml0IiwiZXhwZWN0IiwidG9NYXRjaFNuYXBzaG90IiwidyIsImluc3RhbmNlIiwib25DaG9pY2VDaGFuZ2VkIiwidG9CZUNhbGxlZFdpdGgiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJqc2RvbUFsZXJ0Iiwid2luZG93IiwiYWxlcnQiLCJub3QiLCJ0b0JlQ2FsbGVkIiwib25DaG9pY2VGb2N1cyIsInN0YXRlIiwiZm9jdXNlZEVsIiwidG9FcXVhbCIsIm9uQWRkQ2hvaWNlIiwib25DaG9pY2VSZW1vdmUiLCJpbml0aWFsV3JhcHBlciIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwidXBkYXRlZENob2ljZXMiLCJ3cmFwcGVyV2l0aFVwZGF0ZWRTdGF0ZSIsInRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCIsInZpc2libGVDaG9pY2VzIiwiZ2V0VmlzaWJsZUNob2ljZXMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2Nob2ljZXMudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2hhbGxvdyB9IGZyb20gJ2VuenltZSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBDaG9pY2VzIH0gZnJvbSAnLi4vY2hvaWNlcyc7XG5pbXBvcnQgc2Vuc2libGVEZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cyc7XG5pbXBvcnQgeyBjcmVhdGVTbGF0ZU1hcmt1cCwgcHJvY2Vzc01hcmt1cCB9IGZyb20gJy4uL21hcmt1cFV0aWxzJztcblxuamVzdC5tb2NrKCdAcGllLWxpYi9jb25maWctdWknLCAoKSA9PiAoe1xuICBjaG9pY2VVdGlsczoge1xuICAgIGZpcnN0QXZhaWxhYmxlSW5kZXg6IGplc3QuZm4oKSxcbiAgfSxcbiAgc2V0dGluZ3M6IHtcbiAgICBQYW5lbDogKHByb3BzKSA9PiA8ZGl2IHsuLi5wcm9wc30gLz4sXG4gICAgdG9nZ2xlOiBqZXN0LmZuKCksXG4gICAgcmFkaW86IGplc3QuZm4oKSxcbiAgICBkcm9wZG93bjogamVzdC5mbigpLFxuICB9LFxuICBsYXlvdXQ6IHtcbiAgICBDb25maWdMYXlvdXQ6IChwcm9wcykgPT4gPGRpdj57cHJvcHMuY2hpbGRyZW59PC9kaXY+LFxuICB9LFxufSkpO1xuXG5jb25zdCBtb2RlbCA9IHtcbiAgbWFya3VwOiAne3swfX0gKyB7ezF9fSA9IDE1JyxcbiAgcHJvbXB0OiAnPHA+U29sdmUgdGhlIGVxdWF0aW9uIGJlbG93LjwvcD4nLFxuICBjaG9pY2VzOiBbXG4gICAgeyB2YWx1ZTogJzxkaXY+NjwvZGl2PicsIGlkOiAnMCcgfSxcbiAgICB7IHZhbHVlOiAnPGRpdj45PC9kaXY+JywgaWQ6ICcxJyB9LFxuICAgIHsgdmFsdWU6ICc8ZGl2PjEyPC9kaXY+JywgaWQ6ICcyJyB9LFxuICBdLFxuICBjaG9pY2VzUG9zaXRpb246ICdiZWxvdycsXG4gIGNvcnJlY3RSZXNwb25zZToge1xuICAgIDA6ICcwJyxcbiAgICAxOiAnMScsXG4gIH0sXG4gIGR1cGxpY2F0ZXM6IHRydWUsXG4gIGFsdGVybmF0ZVJlc3BvbnNlczogW1snMSddLCBbJzAnXV0sXG4gIHJhdGlvbmFsZTpcbiAgICAnPHA+QSBjb3JyZWN0IHJlc3BvbnNlIGlzIHNob3duIGJlbG93OjwvcD48dWw+PGxpPjIvNiA9IDEvMzwvbGk+PGxpPjQvOCA9IDEvMjwvbGk+PGxpPjYvMTAgPSAzLzU8L2xpPjxsaT45LzEyID0gMy80PC9saT48L3VsPicsXG59O1xuXG5jb25zdCBwcmVwYXJlTW9kZWwgPSAobW9kZWwgPSB7fSkgPT4ge1xuICBjb25zdCBqb2luZWRPYmogPSB7XG4gICAgLi4uc2Vuc2libGVEZWZhdWx0cy5tb2RlbCxcbiAgICAuLi5tb2RlbCxcbiAgfTtcbiAgY29uc3Qgc2xhdGVNYXJrdXAgPVxuICAgIG1vZGVsLnNsYXRlTWFya3VwIHx8IGNyZWF0ZVNsYXRlTWFya3VwKGpvaW5lZE9iai5tYXJrdXAsIGpvaW5lZE9iai5jaG9pY2VzLCBqb2luZWRPYmouY29ycmVjdFJlc3BvbnNlKTtcbiAgY29uc3QgcHJvY2Vzc2VkTWFya3VwID0gcHJvY2Vzc01hcmt1cChzbGF0ZU1hcmt1cCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5qb2luZWRPYmosXG4gICAgc2xhdGVNYXJrdXAsXG4gICAgbWFya3VwOiBwcm9jZXNzZWRNYXJrdXAubWFya3VwLFxuICAgIGNvcnJlY3RSZXNwb25zZTogcHJvY2Vzc2VkTWFya3VwLmNvcnJlY3RSZXNwb25zZSxcbiAgfTtcbn07XG5cbmRlc2NyaWJlKCdDaG9pY2VzJywgKCkgPT4ge1xuICBsZXQgb25DaGFuZ2U7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgb25DaGFuZ2UgPSBqZXN0LmZuKCk7XG4gIH0pO1xuXG4gIGNvbnN0IHdyYXBwZXIgPSAoZXh0cmFzKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgICBvbkNoYW5nZSxcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgbW9kZWw6IHByZXBhcmVNb2RlbChtb2RlbCksXG4gICAgICBkdXBsaWNhdGVzOiB0cnVlLFxuICAgICAgLi4uZXh0cmFzLFxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLmRlZmF1bHRzIH07XG5cbiAgICByZXR1cm4gc2hhbGxvdyg8Q2hvaWNlcyB7Li4ucHJvcHN9IC8+LCB7IGRpc2FibGVMaWZlY3ljbGVNZXRob2RzOiB0cnVlIH0pO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdzbmFwc2hvdCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRoIGR1cGxpY2F0ZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qod3JhcHBlcigpKS50b01hdGNoU25hcHNob3QoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGhvdXQgZHVwbGljYXRlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh3cmFwcGVyKHsgZHVwbGljYXRlczogZmFsc2UgfSkpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgbGV0IHc7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHcgPSB3cmFwcGVyKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25DaG9pY2VDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgaXQoJ3JlbW92ZXMgYSBjaG9pY2UgaWYgaXRzIG5ldyB2YWx1ZSBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQ2hvaWNlQ2hhbmdlZCgnPGRpdj4xMjwvZGl2PicsICcnLCAnMicpO1xuXG4gICAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9CZUNhbGxlZFdpdGgoW1xuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjY8L2Rpdj4nLCBpZDogJzAnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+OTwvZGl2PicsIGlkOiAnMScgfSxcbiAgICAgICAgXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RvZXMgbm90IGFkZCBuZXcgY2hvaWNlIGlmIGl0IGlzIGlkZW50aWNhbCB0byBhbm90aGVyIGNob2ljZScsICgpID0+IHtcbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQ2hvaWNlQ2hhbmdlZCgnJywgJzxkaXY+OTwvZGl2PicsICcyJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0JlQ2FsbGVkV2l0aChbXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+NjwvZGl2PicsIGlkOiAnMCcgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj45PC9kaXY+JywgaWQ6ICcxJyB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZG9lcyBub3QgY2hhbmdlIGNob2ljZSBpZiBpdCB3b3VsZCBiZSBpZGVudGljYWwgdG8gYW5vdGhlciBjaG9pY2UnLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNob2ljZUNoYW5nZWQoJzxkaXY+NjwvZGl2PicsICc8ZGl2Pjk8L2Rpdj4nLCAnMCcpO1xuXG4gICAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkb2VzIG5vdCByZW1vdmUgYSBjaG9pY2UgaWYgaXRzIG5ldyB2YWx1ZSBpcyBlbXB0eSwgYnV0IGlzIHVzZWQgaW4gY29ycmVjdCByZXNwb25zZScsICgpID0+IHtcbiAgICAgICAgY29uc3QganNkb21BbGVydCA9IHdpbmRvdy5hbGVydDsgLy8gcmVtZW1iZXIgdGhlIGpzZG9tIGFsZXJ0XG5cbiAgICAgICAgd2luZG93LmFsZXJ0ID0gKCkgPT4ge307XG5cbiAgICAgICAgdy5pbnN0YW5jZSgpLm9uQ2hvaWNlQ2hhbmdlZCgnPGRpdj45PC9kaXY+JywgJycsICcxJyk7XG5cbiAgICAgICAgZXhwZWN0KG9uQ2hhbmdlKS5ub3QudG9CZUNhbGxlZCgpO1xuXG4gICAgICAgIHdpbmRvdy5hbGVydCA9IGpzZG9tQWxlcnQ7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2RvZXMgbm90IHJlbW92ZSBhIGNob2ljZSBpZiBpdHMgbmV3IHZhbHVlIGlzIGVtcHR5LCBidXQgaXMgdXNlZCBpbiBhbHRlcm5hdGUgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGpzZG9tQWxlcnQgPSB3aW5kb3cuYWxlcnQ7IC8vIHJlbWVtYmVyIHRoZSBqc2RvbSBhbGVydFxuXG4gICAgICAgIHdpbmRvdy5hbGVydCA9ICgpID0+IHt9O1xuXG4gICAgICAgIHdyYXBwZXIoeyBtYXJrdXA6ICd7ezB9fScgfSkuaW5zdGFuY2UoKS5vbkNob2ljZUNoYW5nZWQoJzxkaXY+OTwvZGl2PicsICcnLCAnMScpO1xuXG4gICAgICAgIGV4cGVjdChvbkNoYW5nZSkubm90LnRvQmVDYWxsZWQoKTtcblxuICAgICAgICB3aW5kb3cuYWxlcnQgPSBqc2RvbUFsZXJ0O1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkb2VzIG5vdCByZW1vdmUgYSBjaG9pY2UgaWYgaXRzIG5ldyB2YWx1ZSBpcyBlbXB0eSwgYnV0IHRoZSBvbGQgdmFsdWUgd2FzIGVtcHR5IGFzIHdlbGwgKGF0IGZvY3VzaW5nIGEgbmV3IGNob2ljZSB3aXRob3V0IGVkaXRpbmcpJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBqc2RvbUFsZXJ0ID0gd2luZG93LmFsZXJ0OyAvLyByZW1lbWJlciB0aGUganNkb20gYWxlcnRcblxuICAgICAgICB3aW5kb3cuYWxlcnQgPSAoKSA9PiB7fTtcblxuICAgICAgICB3cmFwcGVyKHsgbWFya3VwOiAne3swfX0nIH0pLmluc3RhbmNlKCkub25DaG9pY2VDaGFuZ2VkKCcnLCAnJywgJzEnKTtcblxuICAgICAgICBleHBlY3Qob25DaGFuZ2UpLm5vdC50b0JlQ2FsbGVkKCk7XG5cbiAgICAgICAgd2luZG93LmFsZXJ0ID0ganNkb21BbGVydDtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgndXBkYXRlcyBjaG9pY2VzJywgKCkgPT4ge1xuICAgICAgICB3Lmluc3RhbmNlKCkub25DaG9pY2VDaGFuZ2VkKCc8ZGl2Pjk8L2Rpdj4nLCAnPGRpdj4zKjM8L2Rpdj4nLCAnMScpO1xuXG4gICAgICAgIGV4cGVjdChvbkNoYW5nZSkudG9CZUNhbGxlZFdpdGgoW1xuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjY8L2Rpdj4nLCBpZDogJzAnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+MyozPC9kaXY+JywgaWQ6ICcxJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjEyPC9kaXY+JywgaWQ6ICcyJyB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uQ2hvaWNlRm9jdXMnLCAoKSA9PiB7XG4gICAgICBpdCgnc2V0cyBmb2N1c2VkIGVsZW1lbnQgaWQgb24gc3RhdGUnLCAoKSA9PiB7XG4gICAgICAgIHcuaW5zdGFuY2UoKS5vbkNob2ljZUZvY3VzKCcxJyk7XG5cbiAgICAgICAgZXhwZWN0KHcuaW5zdGFuY2UoKS5zdGF0ZS5mb2N1c2VkRWwpLnRvRXF1YWwoJzEnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uQWRkQ2hvaWNlJywgKCkgPT4ge1xuICAgICAgaXQoJ2FkZHMgYSBjaG9pY2UnLCAoKSA9PiB7XG4gICAgICAgIHdyYXBwZXIoKS5pbnN0YW5jZSgpLm9uQWRkQ2hvaWNlKCk7XG5cbiAgICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0JlQ2FsbGVkV2l0aChbLi4ubW9kZWwuY2hvaWNlcywgeyBpZDogJzMnLCB2YWx1ZTogJycgfV0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb25DaG9pY2VSZW1vdmUnLCAoKSA9PiB7XG4gICAgICBpdCgncmVtb3ZlcyBhIGNob2ljZScsICgpID0+IHtcbiAgICAgICAgd3JhcHBlcigpLmluc3RhbmNlKCkub25DaG9pY2VSZW1vdmUoJzEnKTtcblxuICAgICAgICBleHBlY3Qob25DaGFuZ2UpLnRvQmVDYWxsZWRXaXRoKFtcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj42PC9kaXY+JywgaWQ6ICcwJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjEyPC9kaXY+JywgaWQ6ICcyJyB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29uQ2hvaWNlUmVtb3ZlICYgb25BZGRDaG9pY2UnLCAoKSA9PiB7XG4gICAgICBpdCgncHJldmVudHMgZHVwbGljYXRlIElEcyB3aGVuIGFkZGluZyBjaG9pY2VzIGFmdGVyIHJlbW92aW5nIHNvbWUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxXcmFwcGVyID0gd3JhcHBlcigpO1xuXG4gICAgICAgIGluaXRpYWxXcmFwcGVyLmluc3RhbmNlKCkub25DaG9pY2VSZW1vdmUoJzEnKTtcblxuICAgICAgICBleHBlY3Qob25DaGFuZ2UpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFtcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj42PC9kaXY+JywgaWQ6ICcwJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjEyPC9kaXY+JywgaWQ6ICcyJyB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdCB1cGRhdGVkQ2hvaWNlcyA9IFtcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj42PC9kaXY+JywgaWQ6ICcwJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjEyPC9kaXY+JywgaWQ6ICcyJyB9LFxuICAgICAgICBdO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgd3JhcHBlcldpdGhVcGRhdGVkU3RhdGUgPSB3cmFwcGVyKHtcbiAgICAgICAgICBtb2RlbDogeyAuLi5tb2RlbCwgY2hvaWNlczogdXBkYXRlZENob2ljZXMgfVxuICAgICAgICB9KTtcblxuICAgICAgICB3cmFwcGVyV2l0aFVwZGF0ZWRTdGF0ZS5pbnN0YW5jZSgpLm9uQWRkQ2hvaWNlKCk7XG5cbiAgICAgICAgZXhwZWN0KG9uQ2hhbmdlKS50b0hhdmVCZWVuTGFzdENhbGxlZFdpdGgoW1xuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjY8L2Rpdj4nLCBpZDogJzAnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+MTI8L2Rpdj4nLCBpZDogJzInIH0sXG4gICAgICAgICAgeyBpZDogJzMnLCB2YWx1ZTogJycgfVxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dldFZpc2libGVDaG9pY2VzJywgKCkgPT4ge1xuICAgICAgaXQoJ2Nob2ljZXMgYXJlIG51bGwgPT4gcmV0dXJucyBbXScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdmlzaWJsZUNob2ljZXMgPSB3cmFwcGVyKHsgbW9kZWw6IHsgY2hvaWNlczogbnVsbCB9IH0pXG4gICAgICAgICAgLmluc3RhbmNlKClcbiAgICAgICAgICAuZ2V0VmlzaWJsZUNob2ljZXMoKTtcblxuICAgICAgICBleHBlY3QodmlzaWJsZUNob2ljZXMpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkdXBsaWNhdGVzID0gdHJ1ZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IFtcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj42PC9kaXY+JywgaWQ6ICcwJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2Pjk8L2Rpdj4nLCBpZDogJzEnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+MTI8L2Rpdj4nLCBpZDogJzInIH0sXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IHZpc2libGVDaG9pY2VzID0gd3JhcHBlcih7XG4gICAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAgIGR1cGxpY2F0ZXM6IHRydWUsXG4gICAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzLFxuICAgICAgICAgICAgY29ycmVjdFJlc3BvbnNlOiB7XG4gICAgICAgICAgICAgIDA6ICcwJyxcbiAgICAgICAgICAgICAgMTogJzEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAgIC5pbnN0YW5jZSgpXG4gICAgICAgICAgLmdldFZpc2libGVDaG9pY2VzKCk7XG5cbiAgICAgICAgZXhwZWN0KHZpc2libGVDaG9pY2VzKS50b0VxdWFsKGNob2ljZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkdXBsaWNhdGVzID0gZmFsc2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBbXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+NjwvZGl2PicsIGlkOiAnMCcgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj45PC9kaXY+JywgaWQ6ICcxJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2PjEyPC9kaXY+JywgaWQ6ICcyJyB9LFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCB2aXNpYmxlQ2hvaWNlcyA9IHdyYXBwZXIoe1xuICAgICAgICAgIGR1cGxpY2F0ZXM6IGZhbHNlLFxuICAgICAgICAgIG1vZGVsOiB7XG4gICAgICAgICAgICBjaG9pY2VzOiBjaG9pY2VzLFxuICAgICAgICAgICAgY29ycmVjdFJlc3BvbnNlOiB7XG4gICAgICAgICAgICAgIDA6ICcwJyxcbiAgICAgICAgICAgICAgMTogJzEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAgIC5pbnN0YW5jZSgpXG4gICAgICAgICAgLmdldFZpc2libGVDaG9pY2VzKCk7XG5cbiAgICAgICAgZXhwZWN0KHZpc2libGVDaG9pY2VzKS50b0VxdWFsKFt7IHZhbHVlOiAnPGRpdj4xMjwvZGl2PicsIGlkOiAnMicgfV0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdkdXBsaWNhdGVzID0gZmFsc2UsIGVtcHR5IGNvcnJlY3RSZXNwb25zZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IFtcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj42PC9kaXY+JywgaWQ6ICcwJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2Pjk8L2Rpdj4nLCBpZDogJzEnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+MTI8L2Rpdj4nLCBpZDogJzInIH0sXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IHZpc2libGVDaG9pY2VzID0gd3JhcHBlcih7XG4gICAgICAgICAgZHVwbGljYXRlczogZmFsc2UsXG4gICAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAgIGNob2ljZXM6IGNob2ljZXMsXG4gICAgICAgICAgICBjb3JyZWN0UmVzcG9uc2U6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgICAgLmluc3RhbmNlKClcbiAgICAgICAgICAuZ2V0VmlzaWJsZUNob2ljZXMoKTtcblxuICAgICAgICBleHBlY3QodmlzaWJsZUNob2ljZXMpLnRvRXF1YWwoY2hvaWNlcyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2R1cGxpY2F0ZXMgPSBmYWxzZSwgY29ycmVjdFJlc3BvbnNlID0gbnVsbCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IFtcbiAgICAgICAgICB7IHZhbHVlOiAnPGRpdj42PC9kaXY+JywgaWQ6ICcwJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc8ZGl2Pjk8L2Rpdj4nLCBpZDogJzEnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJzxkaXY+MTI8L2Rpdj4nLCBpZDogJzInIH0sXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IHZpc2libGVDaG9pY2VzID0gd3JhcHBlcih7XG4gICAgICAgICAgZHVwbGljYXRlczogZmFsc2UsXG4gICAgICAgICAgbW9kZWw6IHtcbiAgICAgICAgICAgIGNob2ljZXM6IGNob2ljZXMsXG4gICAgICAgICAgICBjb3JyZWN0UmVzcG9uc2U6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAuaW5zdGFuY2UoKVxuICAgICAgICAgIC5nZXRWaXNpYmxlQ2hvaWNlcygpO1xuXG4gICAgICAgIGV4cGVjdCh2aXNpYmxlQ2hvaWNlcykudG9FcXVhbChjaG9pY2VzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxTQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxZQUFBLEdBQUFMLE9BQUE7QUFFQU0sSUFBSSxDQUFDQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsT0FBTztFQUNyQ0MsV0FBVyxFQUFFO0lBQ1hDLG1CQUFtQixFQUFFSCxJQUFJLENBQUNJLEVBQUUsQ0FBQztFQUMvQixDQUFDO0VBQ0RDLFFBQVEsRUFBRTtJQUNSQyxLQUFLLEVBQUdDLEtBQUssaUJBQUtaLE1BQUEsQ0FBQWEsT0FBQSxDQUFBQyxhQUFBLFFBQVNGLEtBQVEsQ0FBQztJQUNwQ0csTUFBTSxFQUFFVixJQUFJLENBQUNJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pCTyxLQUFLLEVBQUVYLElBQUksQ0FBQ0ksRUFBRSxDQUFDLENBQUM7SUFDaEJRLFFBQVEsRUFBRVosSUFBSSxDQUFDSSxFQUFFLENBQUM7RUFDcEIsQ0FBQztFQUNEUyxNQUFNLEVBQUU7SUFDTkMsWUFBWSxFQUFHUCxLQUFLLGlCQUFLWixNQUFBLENBQUFhLE9BQUEsQ0FBQUMsYUFBQSxjQUFNRixLQUFLLENBQUNRLFFBQWM7RUFDckQ7QUFDRixDQUFDLENBQUMsQ0FBQztBQUVILE1BQU1DLEtBQUssR0FBRztFQUNa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