@pie-lib/editable-html-tip-tap 1.2.0-next.2 → 1.2.0-next.20

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 (126) hide show
  1. package/CHANGELOG.md +109 -21
  2. package/LICENSE.md +5 -0
  3. package/lib/components/CharacterPicker.js +2 -1
  4. package/lib/components/CharacterPicker.js.map +1 -1
  5. package/lib/components/EditableHtml.js +34 -17
  6. package/lib/components/EditableHtml.js.map +1 -1
  7. package/lib/components/MenuBar.js +77 -45
  8. package/lib/components/MenuBar.js.map +1 -1
  9. package/lib/components/TiptapContainer.js +15 -9
  10. package/lib/components/TiptapContainer.js.map +1 -1
  11. package/lib/components/characters/characterUtils.js +1 -1
  12. package/lib/components/characters/custom-popper.js +1 -1
  13. package/lib/components/common/done-button.js +1 -1
  14. package/lib/components/common/toolbar-buttons.js +1 -1
  15. package/lib/components/icons/CssIcon.js +1 -1
  16. package/lib/components/icons/RespArea.js +1 -1
  17. package/lib/components/icons/TableIcons.js +1 -1
  18. package/lib/components/icons/TextAlign.js +3 -3
  19. package/lib/components/icons/TextAlign.js.map +1 -1
  20. package/lib/components/image/AltDialog.js +1 -1
  21. package/lib/components/image/ImageToolbar.js +1 -1
  22. package/lib/components/image/InsertImageHandler.js +1 -1
  23. package/lib/components/media/MediaDialog.js +1 -1
  24. package/lib/components/media/MediaToolbar.js +1 -1
  25. package/lib/components/media/MediaWrapper.js +1 -1
  26. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +7 -2
  27. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +1 -1
  28. package/lib/components/respArea/DragInTheBlank/choice.js +16 -8
  29. package/lib/components/respArea/DragInTheBlank/choice.js.map +1 -1
  30. package/lib/components/respArea/ExplicitConstructedResponse.js +2 -2
  31. package/lib/components/respArea/ExplicitConstructedResponse.js.map +1 -1
  32. package/lib/components/respArea/InlineDropdown.js +11 -4
  33. package/lib/components/respArea/InlineDropdown.js.map +1 -1
  34. package/lib/components/respArea/MathTemplated.js +130 -0
  35. package/lib/components/respArea/MathTemplated.js.map +1 -0
  36. package/lib/components/respArea/ToolbarIcon.js +1 -1
  37. package/lib/constants.js +1 -1
  38. package/lib/extensions/css.js +1 -1
  39. package/lib/extensions/custom-toolbar-wrapper.js +1 -1
  40. package/lib/extensions/div-node.js +39 -0
  41. package/lib/extensions/div-node.js.map +1 -0
  42. package/lib/extensions/extended-table.js +1 -1
  43. package/lib/extensions/image-component.js +1 -1
  44. package/lib/extensions/image-component.js.map +1 -1
  45. package/lib/extensions/image.js +1 -1
  46. package/lib/extensions/index.js +4 -2
  47. package/lib/extensions/index.js.map +1 -1
  48. package/lib/extensions/math.js +2 -1
  49. package/lib/extensions/math.js.map +1 -1
  50. package/lib/extensions/media.js +15 -12
  51. package/lib/extensions/media.js.map +1 -1
  52. package/lib/extensions/responseArea.js +13 -10
  53. package/lib/extensions/responseArea.js.map +1 -1
  54. package/lib/index.js +1 -1
  55. package/lib/styles/editorContainerStyles.js +6 -5
  56. package/lib/styles/editorContainerStyles.js.map +1 -1
  57. package/lib/theme.js +1 -1
  58. package/lib/utils/helper.js +17 -0
  59. package/lib/utils/helper.js.map +1 -0
  60. package/lib/utils/size.js +1 -1
  61. package/package.json +11 -11
  62. package/src/__tests__/EditableHtml.test.jsx +41 -1
  63. package/src/__tests__/index.test.jsx +4 -1
  64. package/src/components/CharacterPicker.jsx +1 -0
  65. package/src/components/EditableHtml.jsx +40 -16
  66. package/src/components/MenuBar.jsx +66 -25
  67. package/src/components/TiptapContainer.jsx +10 -7
  68. package/src/components/__tests__/CharacterPicker.test.jsx +22 -0
  69. package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +1 -1
  70. package/src/components/__tests__/InlineDropdown.test.jsx +150 -1
  71. package/src/components/__tests__/MenuBar.test.jsx +32 -0
  72. package/src/components/icons/TextAlign.jsx +1 -1
  73. package/src/components/respArea/DragInTheBlank/DragInTheBlank.jsx +6 -1
  74. package/src/components/respArea/DragInTheBlank/choice.jsx +32 -4
  75. package/src/components/respArea/ExplicitConstructedResponse.jsx +1 -1
  76. package/src/components/respArea/InlineDropdown.jsx +12 -2
  77. package/src/components/respArea/MathTemplated.jsx +124 -0
  78. package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
  79. package/src/extensions/__tests__/divNode.test.js +87 -0
  80. package/src/extensions/__tests__/math.test.js +327 -0
  81. package/src/extensions/__tests__/media-node-view.test.jsx +296 -0
  82. package/src/extensions/__tests__/media.test.js +1 -0
  83. package/src/extensions/__tests__/responseArea.test.js +157 -0
  84. package/src/extensions/div-node.js +36 -0
  85. package/src/extensions/index.js +2 -0
  86. package/src/extensions/math.js +1 -0
  87. package/src/extensions/media.js +17 -14
  88. package/src/extensions/responseArea.js +4 -8
  89. package/src/styles/editorContainerStyles.js +5 -4
  90. package/src/utils/helper.js +17 -0
  91. package/lib/__tests__/EditableHtml.test.js +0 -377
  92. package/lib/__tests__/constants.test.js +0 -21
  93. package/lib/__tests__/extensions.test.js +0 -209
  94. package/lib/__tests__/index.test.js +0 -235
  95. package/lib/__tests__/size-utils.test.js +0 -57
  96. package/lib/__tests__/theme.test.js +0 -17
  97. package/lib/components/__tests__/AltDialog.test.js +0 -201
  98. package/lib/components/__tests__/CharacterPicker.test.js +0 -305
  99. package/lib/components/__tests__/CssIcon.test.js +0 -58
  100. package/lib/components/__tests__/DragInTheBlank.test.js +0 -295
  101. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +0 -253
  102. package/lib/components/__tests__/ImageToolbar.test.js +0 -185
  103. package/lib/components/__tests__/InlineDropdown.test.js +0 -287
  104. package/lib/components/__tests__/InsertImageHandler.test.js +0 -162
  105. package/lib/components/__tests__/MediaDialog.test.js +0 -433
  106. package/lib/components/__tests__/MediaToolbar.test.js +0 -126
  107. package/lib/components/__tests__/MediaWrapper.test.js +0 -96
  108. package/lib/components/__tests__/MenuBar.test.js +0 -459
  109. package/lib/components/__tests__/RespArea.test.js +0 -171
  110. package/lib/components/__tests__/TableIcons.test.js +0 -153
  111. package/lib/components/__tests__/TextAlign.test.js +0 -209
  112. package/lib/components/__tests__/TiptapContainer.test.js +0 -196
  113. package/lib/components/__tests__/characterUtils.test.js +0 -178
  114. package/lib/components/__tests__/choice.test.js +0 -213
  115. package/lib/components/__tests__/custom-popper.test.js +0 -108
  116. package/lib/components/__tests__/done-button.test.js +0 -72
  117. package/lib/components/__tests__/toolbar-buttons.test.js +0 -277
  118. package/lib/extensions/__tests__/component.test.js +0 -314
  119. package/lib/extensions/__tests__/css.test.js +0 -214
  120. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +0 -175
  121. package/lib/extensions/__tests__/extended-table.test.js +0 -92
  122. package/lib/extensions/__tests__/image-component.test.js +0 -305
  123. package/lib/extensions/__tests__/image.test.js +0 -164
  124. package/lib/extensions/__tests__/media.test.js +0 -292
  125. package/lib/extensions/__tests__/responseArea.test.js +0 -330
  126. package/lib/extensions/component.js +0 -305
@@ -1,196 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
5
- var _react = _interopRequireDefault(require("react"));
6
- var _react2 = require("@testing-library/react");
7
- var _TiptapContainer = _interopRequireDefault(require("../TiptapContainer"));
8
- jest.mock('../MenuBar', function () {
9
- return {
10
- __esModule: true,
11
- "default": function _default(_ref) {
12
- var editor = _ref.editor,
13
- toolbarOpts = _ref.toolbarOpts;
14
- return /*#__PURE__*/_react["default"].createElement("div", {
15
- "data-testid": "styled-menu-bar"
16
- }, "MenuBar for editor");
17
- }
18
- };
19
- });
20
- describe('TiptapContainer', function () {
21
- var mockEditor = {
22
- commands: {
23
- focus: jest.fn()
24
- }
25
- };
26
- var defaultProps = {
27
- editor: mockEditor,
28
- disabled: false,
29
- children: /*#__PURE__*/_react["default"].createElement("div", {
30
- "data-testid": "editor-content"
31
- }, "Editor content"),
32
- activePlugins: ['bold', 'italic'],
33
- toolbarOpts: {},
34
- responseAreaProps: {}
35
- };
36
- beforeEach(function () {
37
- jest.clearAllMocks();
38
- });
39
- it('renders without crashing', function () {
40
- var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], defaultProps)),
41
- container = _render.container;
42
- expect(container).toBeInTheDocument();
43
- });
44
- it('renders children', function () {
45
- var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], defaultProps)),
46
- getByTestId = _render2.getByTestId;
47
- expect(getByTestId('editor-content')).toBeInTheDocument();
48
- });
49
- it('renders MenuBar when editor is provided', function () {
50
- var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], defaultProps)),
51
- getByTestId = _render3.getByTestId;
52
- expect(getByTestId('styled-menu-bar')).toBeInTheDocument();
53
- });
54
- it('does not render MenuBar when editor is not provided', function () {
55
- var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
56
- editor: null
57
- }))),
58
- queryByTestId = _render4.queryByTestId;
59
- expect(queryByTestId('styled-menu-bar')).not.toBeInTheDocument();
60
- });
61
- it('applies noBorder style when toolbarOpts.noBorder is true', function () {
62
- var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
63
- toolbarOpts: {
64
- noBorder: true
65
- }
66
- }))),
67
- container = _render5.container;
68
- var root = container.firstChild;
69
- expect(root).toHaveStyle({
70
- border: 'none'
71
- });
72
- });
73
- it('applies error style when toolbarOpts.error is true', function () {
74
- var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
75
- toolbarOpts: {
76
- error: true
77
- }
78
- }))),
79
- container = _render6.container;
80
- expect(container.firstChild).toBeInTheDocument();
81
- });
82
- it('applies noPadding style when toolbarOpts.noPadding is true', function () {
83
- var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
84
- toolbarOpts: {
85
- noPadding: true
86
- }
87
- }))),
88
- container = _render7.container;
89
- var children = container.querySelector('div > div > div');
90
- expect(children).toHaveStyle({
91
- padding: '0'
92
- });
93
- });
94
- it('disables scrollbar when disableScrollbar is true', function () {
95
- var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
96
- disableScrollbar: true
97
- }))),
98
- container = _render8.container;
99
- expect(container).toBeInTheDocument();
100
- });
101
- it('applies width from props', function () {
102
- var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
103
- width: 500
104
- }))),
105
- container = _render9.container;
106
- var root = container.firstChild;
107
- expect(root).toHaveStyle({
108
- width: '500px'
109
- });
110
- });
111
- it('applies minWidth from props', function () {
112
- var _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
113
- minWidth: 300
114
- }))),
115
- container = _render0.container;
116
- var root = container.firstChild;
117
- expect(root).toHaveStyle({
118
- minWidth: '300px'
119
- });
120
- });
121
- it('applies maxWidth from props', function () {
122
- var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
123
- maxWidth: 800
124
- }))),
125
- container = _render1.container;
126
- var root = container.firstChild;
127
- expect(root).toHaveStyle({
128
- maxWidth: '800px'
129
- });
130
- });
131
- it('applies height from props', function () {
132
- var _render10 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
133
- height: 400
134
- }))),
135
- container = _render10.container;
136
- var root = container.firstChild;
137
- expect(root).toBeInTheDocument();
138
- });
139
- it('applies minHeight from props', function () {
140
- var _render11 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
141
- minHeight: 200
142
- }))),
143
- container = _render11.container;
144
- var root = container.firstChild;
145
- expect(root).toBeInTheDocument();
146
- });
147
- it('applies maxHeight from props', function () {
148
- var _render12 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
149
- maxHeight: 600
150
- }))),
151
- container = _render12.container;
152
- var root = container.firstChild;
153
- expect(root).toBeInTheDocument();
154
- });
155
- it('focuses editor on mount when autoFocus is true', function () {
156
- jest.useFakeTimers();
157
- var _render13 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
158
- autoFocus: true
159
- }))),
160
- container = _render13.container;
161
- jest.runAllTimers();
162
- // Just verify the component rendered with autoFocus
163
- expect(container).toBeInTheDocument();
164
- jest.useRealTimers();
165
- });
166
- it('does not focus editor when autoFocus is false', function () {
167
- (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
168
- autoFocus: false
169
- })));
170
- expect(mockEditor.commands.focus).not.toHaveBeenCalled();
171
- });
172
- it('passes className to root element', function () {
173
- var _render14 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
174
- className: "custom-class"
175
- }))),
176
- container = _render14.container;
177
- expect(container.firstChild).toHaveClass('custom-class');
178
- });
179
- it('handles width as string with units', function () {
180
- var _render15 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
181
- width: "50%"
182
- }))),
183
- container = _render15.container;
184
- // Width is applied via styled component, just verify it rendered
185
- expect(container).toBeInTheDocument();
186
- });
187
- it('passes onChange to MenuBar', function () {
188
- var onChange = jest.fn();
189
- var _render16 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_TiptapContainer["default"], (0, _extends2["default"])({}, defaultProps, {
190
- onChange: onChange
191
- }))),
192
- getByTestId = _render16.getByTestId;
193
- expect(getByTestId('styled-menu-bar')).toBeInTheDocument();
194
- });
195
- });
196
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfVGlwdGFwQ29udGFpbmVyIiwiamVzdCIsIm1vY2siLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIl9yZWYiLCJlZGl0b3IiLCJ0b29sYmFyT3B0cyIsImNyZWF0ZUVsZW1lbnQiLCJkZXNjcmliZSIsIm1vY2tFZGl0b3IiLCJjb21tYW5kcyIsImZvY3VzIiwiZm4iLCJkZWZhdWx0UHJvcHMiLCJkaXNhYmxlZCIsImNoaWxkcmVuIiwiYWN0aXZlUGx1Z2lucyIsInJlc3BvbnNlQXJlYVByb3BzIiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjb250YWluZXIiLCJleHBlY3QiLCJ0b0JlSW5UaGVEb2N1bWVudCIsIl9yZW5kZXIyIiwiZ2V0QnlUZXN0SWQiLCJfcmVuZGVyMyIsIl9yZW5kZXI0IiwiX2V4dGVuZHMyIiwicXVlcnlCeVRlc3RJZCIsIm5vdCIsIl9yZW5kZXI1Iiwibm9Cb3JkZXIiLCJyb290IiwiZmlyc3RDaGlsZCIsInRvSGF2ZVN0eWxlIiwiYm9yZGVyIiwiX3JlbmRlcjYiLCJlcnJvciIsIl9yZW5kZXI3Iiwibm9QYWRkaW5nIiwicXVlcnlTZWxlY3RvciIsInBhZGRpbmciLCJfcmVuZGVyOCIsImRpc2FibGVTY3JvbGxiYXIiLCJfcmVuZGVyOSIsIndpZHRoIiwiX3JlbmRlcjAiLCJtaW5XaWR0aCIsIl9yZW5kZXIxIiwibWF4V2lkdGgiLCJfcmVuZGVyMTAiLCJoZWlnaHQiLCJfcmVuZGVyMTEiLCJtaW5IZWlnaHQiLCJfcmVuZGVyMTIiLCJtYXhIZWlnaHQiLCJ1c2VGYWtlVGltZXJzIiwiX3JlbmRlcjEzIiwiYXV0b0ZvY3VzIiwicnVuQWxsVGltZXJzIiwidXNlUmVhbFRpbWVycyIsInRvSGF2ZUJlZW5DYWxsZWQiLCJfcmVuZGVyMTQiLCJjbGFzc05hbWUiLCJ0b0hhdmVDbGFzcyIsIl9yZW5kZXIxNSIsIm9uQ2hhbmdlIiwiX3JlbmRlcjE2Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvX190ZXN0c19fL1RpcHRhcENvbnRhaW5lci50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgVGlwdGFwQ29udGFpbmVyIGZyb20gJy4uL1RpcHRhcENvbnRhaW5lcic7XG5cbmplc3QubW9jaygnLi4vTWVudUJhcicsICgpID0+ICh7XG4gIF9fZXNNb2R1bGU6IHRydWUsXG4gIGRlZmF1bHQ6ICh7IGVkaXRvciwgdG9vbGJhck9wdHMgfSkgPT4gPGRpdiBkYXRhLXRlc3RpZD1cInN0eWxlZC1tZW51LWJhclwiPk1lbnVCYXIgZm9yIGVkaXRvcjwvZGl2Pixcbn0pKTtcblxuZGVzY3JpYmUoJ1RpcHRhcENvbnRhaW5lcicsICgpID0+IHtcbiAgY29uc3QgbW9ja0VkaXRvciA9IHtcbiAgICBjb21tYW5kczoge1xuICAgICAgZm9jdXM6IGplc3QuZm4oKSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICBlZGl0b3I6IG1vY2tFZGl0b3IsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIGNoaWxkcmVuOiA8ZGl2IGRhdGEtdGVzdGlkPVwiZWRpdG9yLWNvbnRlbnRcIj5FZGl0b3IgY29udGVudDwvZGl2PixcbiAgICBhY3RpdmVQbHVnaW5zOiBbJ2JvbGQnLCAnaXRhbGljJ10sXG4gICAgdG9vbGJhck9wdHM6IHt9LFxuICAgIHJlc3BvbnNlQXJlYVByb3BzOiB7fSxcbiAgfTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjcmFzaGluZycsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxUaXB0YXBDb250YWluZXIgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGNoaWxkcmVuJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlcig8VGlwdGFwQ29udGFpbmVyIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2VkaXRvci1jb250ZW50JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIE1lbnVCYXIgd2hlbiBlZGl0b3IgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxUaXB0YXBDb250YWluZXIgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnc3R5bGVkLW1lbnUtYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCByZW5kZXIgTWVudUJhciB3aGVuIGVkaXRvciBpcyBub3QgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoPFRpcHRhcENvbnRhaW5lciB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e251bGx9IC8+KTtcbiAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnc3R5bGVkLW1lbnUtYmFyJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnYXBwbGllcyBub0JvcmRlciBzdHlsZSB3aGVuIHRvb2xiYXJPcHRzLm5vQm9yZGVyIGlzIHRydWUnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8VGlwdGFwQ29udGFpbmVyIHsuLi5kZWZhdWx0UHJvcHN9IHRvb2xiYXJPcHRzPXt7IG5vQm9yZGVyOiB0cnVlIH19IC8+KTtcbiAgICBjb25zdCByb290ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgZXhwZWN0KHJvb3QpLnRvSGF2ZVN0eWxlKHsgYm9yZGVyOiAnbm9uZScgfSk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGVycm9yIHN0eWxlIHdoZW4gdG9vbGJhck9wdHMuZXJyb3IgaXMgdHJ1ZScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxUaXB0YXBDb250YWluZXIgey4uLmRlZmF1bHRQcm9wc30gdG9vbGJhck9wdHM9e3sgZXJyb3I6IHRydWUgfX0gLz4pO1xuICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ2FwcGxpZXMgbm9QYWRkaW5nIHN0eWxlIHdoZW4gdG9vbGJhck9wdHMubm9QYWRkaW5nIGlzIHRydWUnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8VGlwdGFwQ29udGFpbmVyIHsuLi5kZWZhdWx0UHJvcHN9IHRvb2xiYXJPcHRzPXt7IG5vUGFkZGluZzogdHJ1ZSB9fSAvPik7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZGl2ID4gZGl2ID4gZGl2Jyk7XG4gICAgZXhwZWN0KGNoaWxkcmVuKS50b0hhdmVTdHlsZSh7IHBhZGRpbmc6ICcwJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2Rpc2FibGVzIHNjcm9sbGJhciB3aGVuIGRpc2FibGVTY3JvbGxiYXIgaXMgdHJ1ZScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxUaXB0YXBDb250YWluZXIgey4uLmRlZmF1bHRQcm9wc30gZGlzYWJsZVNjcm9sbGJhcj17dHJ1ZX0gLz4pO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIHdpZHRoIGZyb20gcHJvcHMnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8VGlwdGFwQ29udGFpbmVyIHsuLi5kZWZhdWx0UHJvcHN9IHdpZHRoPXs1MDB9IC8+KTtcbiAgICBjb25zdCByb290ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgZXhwZWN0KHJvb3QpLnRvSGF2ZVN0eWxlKHsgd2lkdGg6ICc1MDBweCcgfSk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIG1pbldpZHRoIGZyb20gcHJvcHMnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8VGlwdGFwQ29udGFpbmVyIHsuLi5kZWZhdWx0UHJvcHN9IG1pbldpZHRoPXszMDB9IC8+KTtcbiAgICBjb25zdCByb290ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgZXhwZWN0KHJvb3QpLnRvSGF2ZVN0eWxlKHsgbWluV2lkdGg6ICczMDBweCcgfSk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIG1heFdpZHRoIGZyb20gcHJvcHMnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8VGlwdGFwQ29udGFpbmVyIHsuLi5kZWZhdWx0UHJvcHN9IG1heFdpZHRoPXs4MDB9IC8+KTtcbiAgICBjb25zdCByb290ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgZXhwZWN0KHJvb3QpLnRvSGF2ZVN0eWxlKHsgbWF4V2lkdGg6ICc4MDBweCcgfSk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGhlaWdodCBmcm9tIHByb3BzJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPFRpcHRhcENvbnRhaW5lciB7Li4uZGVmYXVsdFByb3BzfSBoZWlnaHQ9ezQwMH0gLz4pO1xuICAgIGNvbnN0IHJvb3QgPSBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICBleHBlY3Qocm9vdCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ2FwcGxpZXMgbWluSGVpZ2h0IGZyb20gcHJvcHMnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8VGlwdGFwQ29udGFpbmVyIHsuLi5kZWZhdWx0UHJvcHN9IG1pbkhlaWdodD17MjAwfSAvPik7XG4gICAgY29uc3Qgcm9vdCA9IGNvbnRhaW5lci5maXJzdENoaWxkO1xuICAgIGV4cGVjdChyb290KS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnYXBwbGllcyBtYXhIZWlnaHQgZnJvbSBwcm9wcycsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxUaXB0YXBDb250YWluZXIgey4uLmRlZmF1bHRQcm9wc30gbWF4SGVpZ2h0PXs2MDB9IC8+KTtcbiAgICBjb25zdCByb290ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgZXhwZWN0KHJvb3QpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdmb2N1c2VzIGVkaXRvciBvbiBtb3VudCB3aGVuIGF1dG9Gb2N1cyBpcyB0cnVlJywgKCkgPT4ge1xuICAgIGplc3QudXNlRmFrZVRpbWVycygpO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPFRpcHRhcENvbnRhaW5lciB7Li4uZGVmYXVsdFByb3BzfSBhdXRvRm9jdXM9e3RydWV9IC8+KTtcbiAgICBqZXN0LnJ1bkFsbFRpbWVycygpO1xuICAgIC8vIEp1c3QgdmVyaWZ5IHRoZSBjb21wb25lbnQgcmVuZGVyZWQgd2l0aCBhdXRvRm9jdXNcbiAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIGplc3QudXNlUmVhbFRpbWVycygpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgZm9jdXMgZWRpdG9yIHdoZW4gYXV0b0ZvY3VzIGlzIGZhbHNlJywgKCkgPT4ge1xuICAgIHJlbmRlcig8VGlwdGFwQ29udGFpbmVyIHsuLi5kZWZhdWx0UHJvcHN9IGF1dG9Gb2N1cz17ZmFsc2V9IC8+KTtcbiAgICBleHBlY3QobW9ja0VkaXRvci5jb21tYW5kcy5mb2N1cykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Bhc3NlcyBjbGFzc05hbWUgdG8gcm9vdCBlbGVtZW50JywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPFRpcHRhcENvbnRhaW5lciB7Li4uZGVmYXVsdFByb3BzfSBjbGFzc05hbWU9XCJjdXN0b20tY2xhc3NcIiAvPik7XG4gICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0hhdmVDbGFzcygnY3VzdG9tLWNsYXNzJyk7XG4gIH0pO1xuXG4gIGl0KCdoYW5kbGVzIHdpZHRoIGFzIHN0cmluZyB3aXRoIHVuaXRzJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPFRpcHRhcENvbnRhaW5lciB7Li4uZGVmYXVsdFByb3BzfSB3aWR0aD1cIjUwJVwiIC8+KTtcbiAgICAvLyBXaWR0aCBpcyBhcHBsaWVkIHZpYSBzdHlsZWQgY29tcG9uZW50LCBqdXN0IHZlcmlmeSBpdCByZW5kZXJlZFxuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdwYXNzZXMgb25DaGFuZ2UgdG8gTWVudUJhcicsICgpID0+IHtcbiAgICBjb25zdCBvbkNoYW5nZSA9IGplc3QuZm4oKTtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPFRpcHRhcENvbnRhaW5lciB7Li4uZGVmYXVsdFByb3BzfSBvbkNoYW5nZT17b25DaGFuZ2V9IC8+KTtcbiAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ3N0eWxlZC1tZW51LWJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxP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
@@ -1,178 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
- var _characterUtils = require("../characters/characterUtils");
6
- describe('characterUtils', function () {
7
- describe('spanishConfig', function () {
8
- it('exports spanishConfig object', function () {
9
- expect(_characterUtils.spanishConfig).toBeDefined();
10
- expect((0, _typeof2["default"])(_characterUtils.spanishConfig)).toBe('object');
11
- });
12
- it('has characters array', function () {
13
- expect(_characterUtils.spanishConfig).toHaveProperty('characters');
14
- expect(Array.isArray(_characterUtils.spanishConfig.characters)).toBe(true);
15
- });
16
- it('has correct character structure', function () {
17
- expect(_characterUtils.spanishConfig.characters.length).toBeGreaterThan(0);
18
- _characterUtils.spanishConfig.characters.forEach(function (row) {
19
- expect(Array.isArray(row)).toBe(true);
20
- });
21
- });
22
- it('includes Spanish characters', function () {
23
- var allChars = _characterUtils.spanishConfig.characters.flat();
24
- expect(allChars).toContain('á');
25
- expect(allChars).toContain('é');
26
- expect(allChars).toContain('í');
27
- expect(allChars).toContain('ó');
28
- expect(allChars).toContain('ú');
29
- expect(allChars).toContain('ñ');
30
- expect(allChars).toContain('Ñ');
31
- });
32
- it('includes accented uppercase letters', function () {
33
- var allChars = _characterUtils.spanishConfig.characters.flat();
34
- expect(allChars).toContain('Á');
35
- expect(allChars).toContain('É');
36
- expect(allChars).toContain('Í');
37
- expect(allChars).toContain('Ó');
38
- expect(allChars).toContain('Ú');
39
- });
40
- it('includes special punctuation', function () {
41
- var allChars = _characterUtils.spanishConfig.characters.flat();
42
- expect(allChars).toContain('¿');
43
- expect(allChars).toContain('¡');
44
- expect(allChars).toContain('«');
45
- expect(allChars).toContain('»');
46
- });
47
- });
48
- describe('specialConfig', function () {
49
- it('exports specialConfig object', function () {
50
- expect(_characterUtils.specialConfig).toBeDefined();
51
- expect((0, _typeof2["default"])(_characterUtils.specialConfig)).toBe('object');
52
- });
53
- it('has hasPreview property set to true', function () {
54
- expect(_characterUtils.specialConfig).toHaveProperty('hasPreview', true);
55
- });
56
- it('has characters array', function () {
57
- expect(_characterUtils.specialConfig).toHaveProperty('characters');
58
- expect(Array.isArray(_characterUtils.specialConfig.characters)).toBe(true);
59
- });
60
- it('has correct character structure with metadata', function () {
61
- expect(_characterUtils.specialConfig.characters.length).toBeGreaterThan(0);
62
- _characterUtils.specialConfig.characters.forEach(function (row) {
63
- expect(Array.isArray(row)).toBe(true);
64
- row.forEach(function (_char) {
65
- expect(_char).toHaveProperty('unicode');
66
- expect(_char).toHaveProperty('description');
67
- expect(_char).toHaveProperty('write');
68
- expect(_char).toHaveProperty('label');
69
- });
70
- });
71
- });
72
- it('includes currency symbols', function () {
73
- var allChars = _characterUtils.specialConfig.characters.flat();
74
- var euroChar = allChars.find(function (c) {
75
- return c.write === '€';
76
- });
77
- expect(euroChar).toBeDefined();
78
- expect(euroChar.unicode).toBe('U+20AC');
79
- expect(euroChar.description).toBe('EURO SIGN');
80
- var centChar = allChars.find(function (c) {
81
- return c.write === '¢';
82
- });
83
- expect(centChar).toBeDefined();
84
- var poundChar = allChars.find(function (c) {
85
- return c.write === '£';
86
- });
87
- expect(poundChar).toBeDefined();
88
- var yenChar = allChars.find(function (c) {
89
- return c.write === '¥';
90
- });
91
- expect(yenChar).toBeDefined();
92
- });
93
- it('includes accented characters', function () {
94
- var allChars = _characterUtils.specialConfig.characters.flat();
95
- var chars = ['á', 'é', 'í', 'ó', 'ú', 'ñ'];
96
- chars.forEach(function (_char2) {
97
- var found = allChars.find(function (c) {
98
- return c.write === _char2;
99
- });
100
- expect(found).toBeDefined();
101
- });
102
- });
103
- it('includes space characters', function () {
104
- var allChars = _characterUtils.specialConfig.characters.flat();
105
- var descriptions = allChars.map(function (c) {
106
- return c.description;
107
- });
108
- expect(descriptions).toContain('NO-BREAK SPACE');
109
- expect(descriptions).toContain('HAIR SPACE');
110
- expect(descriptions).toContain('THIN SPACE');
111
- expect(descriptions).toContain('EM SPACE');
112
- });
113
- it('includes diacritics', function () {
114
- var allChars = _characterUtils.specialConfig.characters.flat();
115
- var acuteAccent = allChars.find(function (c) {
116
- return c.description === 'ACUTE ACCENT';
117
- });
118
- expect(acuteAccent).toBeDefined();
119
- var circumflex = allChars.find(function (c) {
120
- return c.description === 'CIRCUMFLEX ACCENT';
121
- });
122
- expect(circumflex).toBeDefined();
123
- var grave = allChars.find(function (c) {
124
- return c.description === 'GRAVE ACCENT';
125
- });
126
- expect(grave).toBeDefined();
127
- var diaeresis = allChars.find(function (c) {
128
- return c.description === 'DIAERESIS';
129
- });
130
- expect(diaeresis).toBeDefined();
131
- });
132
- it('includes punctuation marks', function () {
133
- var allChars = _characterUtils.specialConfig.characters.flat();
134
- var descriptions = allChars.map(function (c) {
135
- return c.description;
136
- });
137
- expect(descriptions).toContain('INVERTED QUESTION MARK');
138
- expect(descriptions).toContain('INVERTED EXCLAMATION MARK');
139
- expect(descriptions).toContain('SECTION SIGN');
140
- expect(descriptions).toContain('BULLET');
141
- expect(descriptions).toContain('HORIZONTAL ELLIPSIS');
142
- });
143
- it('includes quotation marks', function () {
144
- var allChars = _characterUtils.specialConfig.characters.flat();
145
- var leftQuote = allChars.find(function (c) {
146
- return c.description === 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK';
147
- });
148
- expect(leftQuote).toBeDefined();
149
- var rightQuote = allChars.find(function (c) {
150
- return c.description === 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK';
151
- });
152
- expect(rightQuote).toBeDefined();
153
- });
154
- it('includes dashes', function () {
155
- var allChars = _characterUtils.specialConfig.characters.flat();
156
- var enDash = allChars.find(function (c) {
157
- return c.description === 'EN DASH';
158
- });
159
- expect(enDash).toBeDefined();
160
- var emDash = allChars.find(function (c) {
161
- return c.description === 'EM DASH';
162
- });
163
- expect(emDash).toBeDefined();
164
- var minus = allChars.find(function (c) {
165
- return c.description === 'MINUS SIGN';
166
- });
167
- expect(minus).toBeDefined();
168
- });
169
- it('some characters have extraProps', function () {
170
- var allChars = _characterUtils.specialConfig.characters.flat();
171
- var charsWithExtraProps = allChars.filter(function (c) {
172
- return c.extraProps;
173
- });
174
- expect(charsWithExtraProps.length).toBeGreaterThan(0);
175
- });
176
- });
177
- });
178
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2hhcmFjdGVyVXRpbHMiLCJyZXF1aXJlIiwiZGVzY3JpYmUiLCJpdCIsImV4cGVjdCIsInNwYW5pc2hDb25maWciLCJ0b0JlRGVmaW5lZCIsIl90eXBlb2YyIiwidG9CZSIsInRvSGF2ZVByb3BlcnR5IiwiQXJyYXkiLCJpc0FycmF5IiwiY2hhcmFjdGVycyIsImxlbmd0aCIsInRvQmVHcmVhdGVyVGhhbiIsImZvckVhY2giLCJyb3ciLCJhbGxDaGFycyIsImZsYXQiLCJ0b0NvbnRhaW4iLCJzcGVjaWFsQ29uZmlnIiwiY2hhciIsImV1cm9DaGFyIiwiZmluZCIsImMiLCJ3cml0ZSIsInVuaWNvZGUiLCJkZXNjcmlwdGlvbiIsImNlbnRDaGFyIiwicG91bmRDaGFyIiwieWVuQ2hhciIsImNoYXJzIiwiZm91bmQiLCJkZXNjcmlwdGlvbnMiLCJtYXAiLCJhY3V0ZUFjY2VudCIsImNpcmN1bWZsZXgiLCJncmF2ZSIsImRpYWVyZXNpcyIsImxlZnRRdW90ZSIsInJpZ2h0UXVvdGUiLCJlbkRhc2giLCJlbURhc2giLCJtaW51cyIsImNoYXJzV2l0aEV4dHJhUHJvcHMiLCJmaWx0ZXIiLCJleHRyYVByb3BzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvX190ZXN0c19fL2NoYXJhY3RlclV0aWxzLnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3BhbmlzaENvbmZpZywgc3BlY2lhbENvbmZpZyB9IGZyb20gJy4uL2NoYXJhY3RlcnMvY2hhcmFjdGVyVXRpbHMnO1xuXG5kZXNjcmliZSgnY2hhcmFjdGVyVXRpbHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdzcGFuaXNoQ29uZmlnJywgKCkgPT4ge1xuICAgIGl0KCdleHBvcnRzIHNwYW5pc2hDb25maWcgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNwYW5pc2hDb25maWcpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QodHlwZW9mIHNwYW5pc2hDb25maWcpLnRvQmUoJ29iamVjdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBjaGFyYWN0ZXJzIGFycmF5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNwYW5pc2hDb25maWcpLnRvSGF2ZVByb3BlcnR5KCdjaGFyYWN0ZXJzJyk7XG4gICAgICBleHBlY3QoQXJyYXkuaXNBcnJheShzcGFuaXNoQ29uZmlnLmNoYXJhY3RlcnMpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBjb3JyZWN0IGNoYXJhY3RlciBzdHJ1Y3R1cmUnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc3BhbmlzaENvbmZpZy5jaGFyYWN0ZXJzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgc3BhbmlzaENvbmZpZy5jaGFyYWN0ZXJzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBleHBlY3QoQXJyYXkuaXNBcnJheShyb3cpKS50b0JlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgU3BhbmlzaCBjaGFyYWN0ZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWxsQ2hhcnMgPSBzcGFuaXNoQ29uZmlnLmNoYXJhY3RlcnMuZmxhdCgpO1xuICAgICAgZXhwZWN0KGFsbENoYXJzKS50b0NvbnRhaW4oJ8OhJyk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignw6knKTtcbiAgICAgIGV4cGVjdChhbGxDaGFycykudG9Db250YWluKCfDrScpO1xuICAgICAgZXhwZWN0KGFsbENoYXJzKS50b0NvbnRhaW4oJ8OzJyk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignw7onKTtcbiAgICAgIGV4cGVjdChhbGxDaGFycykudG9Db250YWluKCfDsScpO1xuICAgICAgZXhwZWN0KGFsbENoYXJzKS50b0NvbnRhaW4oJ8ORJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgYWNjZW50ZWQgdXBwZXJjYXNlIGxldHRlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhbGxDaGFycyA9IHNwYW5pc2hDb25maWcuY2hhcmFjdGVycy5mbGF0KCk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignw4EnKTtcbiAgICAgIGV4cGVjdChhbGxDaGFycykudG9Db250YWluKCfDiScpO1xuICAgICAgZXhwZWN0KGFsbENoYXJzKS50b0NvbnRhaW4oJ8ONJyk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignw5MnKTtcbiAgICAgIGV4cGVjdChhbGxDaGFycykudG9Db250YWluKCfDmicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2luY2x1ZGVzIHNwZWNpYWwgcHVuY3R1YXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCBhbGxDaGFycyA9IHNwYW5pc2hDb25maWcuY2hhcmFjdGVycy5mbGF0KCk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignwr8nKTtcbiAgICAgIGV4cGVjdChhbGxDaGFycykudG9Db250YWluKCfCoScpO1xuICAgICAgZXhwZWN0KGFsbENoYXJzKS50b0NvbnRhaW4oJ8KrJyk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignwrsnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NwZWNpYWxDb25maWcnLCAoKSA9PiB7XG4gICAgaXQoJ2V4cG9ydHMgc3BlY2lhbENvbmZpZyBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc3BlY2lhbENvbmZpZykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdCh0eXBlb2Ygc3BlY2lhbENvbmZpZykudG9CZSgnb2JqZWN0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFzIGhhc1ByZXZpZXcgcHJvcGVydHkgc2V0IHRvIHRydWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc3BlY2lhbENvbmZpZykudG9IYXZlUHJvcGVydHkoJ2hhc1ByZXZpZXcnLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgY2hhcmFjdGVycyBhcnJheScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzcGVjaWFsQ29uZmlnKS50b0hhdmVQcm9wZXJ0eSgnY2hhcmFjdGVycycpO1xuICAgICAgZXhwZWN0KEFycmF5LmlzQXJyYXkoc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgY29ycmVjdCBjaGFyYWN0ZXIgc3RydWN0dXJlIHdpdGggbWV0YWRhdGEnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBleHBlY3QoQXJyYXkuaXNBcnJheShyb3cpKS50b0JlKHRydWUpO1xuICAgICAgICByb3cuZm9yRWFjaCgoY2hhcikgPT4ge1xuICAgICAgICAgIGV4cGVjdChjaGFyKS50b0hhdmVQcm9wZXJ0eSgndW5pY29kZScpO1xuICAgICAgICAgIGV4cGVjdChjaGFyKS50b0hhdmVQcm9wZXJ0eSgnZGVzY3JpcHRpb24nKTtcbiAgICAgICAgICBleHBlY3QoY2hhcikudG9IYXZlUHJvcGVydHkoJ3dyaXRlJyk7XG4gICAgICAgICAgZXhwZWN0KGNoYXIpLnRvSGF2ZVByb3BlcnR5KCdsYWJlbCcpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2luY2x1ZGVzIGN1cnJlbmN5IHN5bWJvbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhbGxDaGFycyA9IHNwZWNpYWxDb25maWcuY2hhcmFjdGVycy5mbGF0KCk7XG4gICAgICBjb25zdCBldXJvQ2hhciA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMud3JpdGUgPT09ICfigqwnKTtcbiAgICAgIGV4cGVjdChldXJvQ2hhcikudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChldXJvQ2hhci51bmljb2RlKS50b0JlKCdVKzIwQUMnKTtcbiAgICAgIGV4cGVjdChldXJvQ2hhci5kZXNjcmlwdGlvbikudG9CZSgnRVVSTyBTSUdOJyk7XG5cbiAgICAgIGNvbnN0IGNlbnRDaGFyID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy53cml0ZSA9PT0gJ8KiJyk7XG4gICAgICBleHBlY3QoY2VudENoYXIpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIGNvbnN0IHBvdW5kQ2hhciA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMud3JpdGUgPT09ICfCoycpO1xuICAgICAgZXhwZWN0KHBvdW5kQ2hhcikudG9CZURlZmluZWQoKTtcblxuICAgICAgY29uc3QgeWVuQ2hhciA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMud3JpdGUgPT09ICfCpScpO1xuICAgICAgZXhwZWN0KHllbkNoYXIpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgYWNjZW50ZWQgY2hhcmFjdGVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IGFsbENoYXJzID0gc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzLmZsYXQoKTtcbiAgICAgIGNvbnN0IGNoYXJzID0gWyfDoScsICfDqScsICfDrScsICfDsycsICfDuicsICfDsSddO1xuICAgICAgY2hhcnMuZm9yRWFjaCgoY2hhcikgPT4ge1xuICAgICAgICBjb25zdCBmb3VuZCA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMud3JpdGUgPT09IGNoYXIpO1xuICAgICAgICBleHBlY3QoZm91bmQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdpbmNsdWRlcyBzcGFjZSBjaGFyYWN0ZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWxsQ2hhcnMgPSBzcGVjaWFsQ29uZmlnLmNoYXJhY3RlcnMuZmxhdCgpO1xuICAgICAgY29uc3QgZGVzY3JpcHRpb25zID0gYWxsQ2hhcnMubWFwKChjKSA9PiBjLmRlc2NyaXB0aW9uKTtcbiAgICAgIGV4cGVjdChkZXNjcmlwdGlvbnMpLnRvQ29udGFpbignTk8tQlJFQUsgU1BBQ0UnKTtcbiAgICAgIGV4cGVjdChkZXNjcmlwdGlvbnMpLnRvQ29udGFpbignSEFJUiBTUEFDRScpO1xuICAgICAgZXhwZWN0KGRlc2NyaXB0aW9ucykudG9Db250YWluKCdUSElOIFNQQUNFJyk7XG4gICAgICBleHBlY3QoZGVzY3JpcHRpb25zKS50b0NvbnRhaW4oJ0VNIFNQQUNFJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgZGlhY3JpdGljcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGFsbENoYXJzID0gc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzLmZsYXQoKTtcbiAgICAgIGNvbnN0IGFjdXRlQWNjZW50ID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy5kZXNjcmlwdGlvbiA9PT0gJ0FDVVRFIEFDQ0VOVCcpO1xuICAgICAgZXhwZWN0KGFjdXRlQWNjZW50KS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICBjb25zdCBjaXJjdW1mbGV4ID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy5kZXNjcmlwdGlvbiA9PT0gJ0NJUkNVTUZMRVggQUNDRU5UJyk7XG4gICAgICBleHBlY3QoY2lyY3VtZmxleCkudG9CZURlZmluZWQoKTtcblxuICAgICAgY29uc3QgZ3JhdmUgPSBhbGxDaGFycy5maW5kKChjKSA9PiBjLmRlc2NyaXB0aW9uID09PSAnR1JBVkUgQUNDRU5UJyk7XG4gICAgICBleHBlY3QoZ3JhdmUpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIGNvbnN0IGRpYWVyZXNpcyA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMuZGVzY3JpcHRpb24gPT09ICdESUFFUkVTSVMnKTtcbiAgICAgIGV4cGVjdChkaWFlcmVzaXMpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgcHVuY3R1YXRpb24gbWFya3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhbGxDaGFycyA9IHNwZWNpYWxDb25maWcuY2hhcmFjdGVycy5mbGF0KCk7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbnMgPSBhbGxDaGFycy5tYXAoKGMpID0+IGMuZGVzY3JpcHRpb24pO1xuICAgICAgZXhwZWN0KGRlc2NyaXB0aW9ucykudG9Db250YWluKCdJTlZFUlRFRCBRVUVTVElPTiBNQVJLJyk7XG4gICAgICBleHBlY3QoZGVzY3JpcHRpb25zKS50b0NvbnRhaW4oJ0lOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksnKTtcbiAgICAgIGV4cGVjdChkZXNjcmlwdGlvbnMpLnRvQ29udGFpbignU0VDVElPTiBTSUdOJyk7XG4gICAgICBleHBlY3QoZGVzY3JpcHRpb25zKS50b0NvbnRhaW4oJ0JVTExFVCcpO1xuICAgICAgZXhwZWN0KGRlc2NyaXB0aW9ucykudG9Db250YWluKCdIT1JJWk9OVEFMIEVMTElQU0lTJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgcXVvdGF0aW9uIG1hcmtzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWxsQ2hhcnMgPSBzcGVjaWFsQ29uZmlnLmNoYXJhY3RlcnMuZmxhdCgpO1xuICAgICAgY29uc3QgbGVmdFF1b3RlID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy5kZXNjcmlwdGlvbiA9PT0gJ0xFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLJyk7XG4gICAgICBleHBlY3QobGVmdFF1b3RlKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICBjb25zdCByaWdodFF1b3RlID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy5kZXNjcmlwdGlvbiA9PT0gJ1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSycpO1xuICAgICAgZXhwZWN0KHJpZ2h0UXVvdGUpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgZGFzaGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWxsQ2hhcnMgPSBzcGVjaWFsQ29uZmlnLmNoYXJhY3RlcnMuZmxhdCgpO1xuICAgICAgY29uc3QgZW5EYXNoID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy5kZXNjcmlwdGlvbiA9PT0gJ0VOIERBU0gnKTtcbiAgICAgIGV4cGVjdChlbkRhc2gpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIGNvbnN0IGVtRGFzaCA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMuZGVzY3JpcHRpb24gPT09ICdFTSBEQVNIJyk7XG4gICAgICBleHBlY3QoZW1EYXNoKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICBjb25zdCBtaW51cyA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMuZGVzY3JpcHRpb24gPT09ICdNSU5VUyBTSUdOJyk7XG4gICAgICBleHBlY3QobWludXMpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc29tZSBjaGFyYWN0ZXJzIGhhdmUgZXh0cmFQcm9wcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGFsbENoYXJzID0gc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzLmZsYXQoKTtcbiAgICAgIGNvbnN0IGNoYXJzV2l0aEV4dHJhUHJvcHMgPSBhbGxDaGFycy5maWx0ZXIoKGMpID0+IGMuZXh0cmFQcm9wcyk7XG4gICAgICBleHBlY3QoY2hhcnNXaXRoRXh0cmFQcm9wcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLGVBQUEsR0FBQUMsT0FBQTtBQUVBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsWUFBTTtFQUMvQkEsUUFBUSxDQUFDLGVBQWUsRUFBRSxZQUFNO0lBQzlCQyxFQUFFLENBQUMsOEJBQThCLEVBQUUsWUFBTTtNQUN2Q0MsTUFBTSxDQUFDQyw2QkFBYSxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDO01BQ25DRixNQUFNLEtBQUFHLFFBQUEsYUFBUUYsNkJBQWEsRUFBQyxDQUFDRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzdDLENBQUMsQ0FBQztJQUVGTCxFQUFFLENBQUMs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