@pie-lib/editable-html-tip-tap 1.1.1-next.0 → 1.1.1-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/lib/__tests__/EditableHtml.test.js +387 -0
  2. package/lib/__tests__/constants.test.js +28 -0
  3. package/lib/__tests__/extensions.test.js +214 -0
  4. package/lib/__tests__/index.test.js +246 -0
  5. package/lib/__tests__/size-utils.test.js +57 -0
  6. package/lib/__tests__/theme.test.js +17 -0
  7. package/lib/components/CharacterPicker.js +8 -3
  8. package/lib/components/EditableHtml.js +6 -6
  9. package/lib/components/EditableHtml.js.map +1 -1
  10. package/lib/components/MenuBar.js +1 -1
  11. package/lib/components/TiptapContainer.js +4 -1
  12. package/lib/components/__tests__/AltDialog.test.js +201 -0
  13. package/lib/components/__tests__/CharacterPicker.test.js +313 -0
  14. package/lib/components/__tests__/CssIcon.test.js +58 -0
  15. package/lib/components/__tests__/DragInTheBlank.test.js +309 -0
  16. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +263 -0
  17. package/lib/components/__tests__/ImageToolbar.test.js +195 -0
  18. package/lib/components/__tests__/InlineDropdown.test.js +297 -0
  19. package/lib/components/__tests__/InsertImageHandler.test.js +162 -0
  20. package/lib/components/__tests__/MediaDialog.test.js +435 -0
  21. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  22. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  23. package/lib/components/__tests__/MenuBar.test.js +459 -0
  24. package/lib/components/__tests__/RespArea.test.js +171 -0
  25. package/lib/components/__tests__/TableIcons.test.js +153 -0
  26. package/lib/components/__tests__/TextAlign.test.js +216 -0
  27. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  28. package/lib/components/__tests__/characterUtils.test.js +189 -0
  29. package/lib/components/__tests__/choice.test.js +213 -0
  30. package/lib/components/__tests__/custom-popper.test.js +108 -0
  31. package/lib/components/__tests__/done-button.test.js +72 -0
  32. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  33. package/lib/components/characters/characterUtils.js +1 -1
  34. package/lib/components/characters/custom-popper.js +1 -1
  35. package/lib/components/common/done-button.js +1 -1
  36. package/lib/components/common/toolbar-buttons.js +1 -1
  37. package/lib/components/icons/CssIcon.js +1 -1
  38. package/lib/components/icons/RespArea.js +1 -1
  39. package/lib/components/icons/TableIcons.js +1 -1
  40. package/lib/components/icons/TextAlign.js +1 -1
  41. package/lib/components/image/AltDialog.js +1 -1
  42. package/lib/components/image/ImageToolbar.js +1 -1
  43. package/lib/components/image/InsertImageHandler.js +1 -1
  44. package/lib/components/media/MediaDialog.js +1 -1
  45. package/lib/components/media/MediaToolbar.js +1 -1
  46. package/lib/components/media/MediaWrapper.js +1 -1
  47. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +1 -1
  48. package/lib/components/respArea/DragInTheBlank/choice.js +1 -1
  49. package/lib/components/respArea/ExplicitConstructedResponse.js +1 -1
  50. package/lib/components/respArea/InlineDropdown.js +1 -1
  51. package/lib/components/respArea/ToolbarIcon.js +1 -1
  52. package/lib/constants.js +1 -1
  53. package/lib/extensions/__tests__/component.test.js +314 -0
  54. package/lib/extensions/__tests__/css.test.js +218 -0
  55. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +185 -0
  56. package/lib/extensions/__tests__/extended-table.test.js +114 -0
  57. package/lib/extensions/__tests__/image-component.test.js +315 -0
  58. package/lib/extensions/__tests__/image.test.js +178 -0
  59. package/lib/extensions/__tests__/media.test.js +296 -0
  60. package/lib/extensions/__tests__/responseArea.test.js +332 -0
  61. package/lib/extensions/component.js +1 -1
  62. package/lib/extensions/css.js +1 -1
  63. package/lib/extensions/custom-toolbar-wrapper.js +1 -1
  64. package/lib/extensions/extended-table.js +2 -2
  65. package/lib/extensions/image-component.js +314 -0
  66. package/lib/extensions/image-component.js.map +1 -0
  67. package/lib/extensions/image.js +3 -3
  68. package/lib/extensions/image.js.map +1 -1
  69. package/lib/extensions/index.js +6 -3
  70. package/lib/extensions/index.js.map +1 -1
  71. package/lib/extensions/math.js +1 -1
  72. package/lib/extensions/media.js +1 -1
  73. package/lib/extensions/responseArea.js +1 -1
  74. package/lib/index.js +1 -1
  75. package/lib/styles/editorContainerStyles.js +1 -1
  76. package/lib/theme.js +1 -1
  77. package/lib/utils/size.js +1 -1
  78. package/package.json +1 -1
  79. package/src/__tests__/EditableHtml.test.jsx +1 -0
  80. package/src/__tests__/extensions.test.js +2 -2
  81. package/src/components/CharacterPicker.jsx +9 -2
  82. package/src/components/EditableHtml.jsx +8 -6
  83. package/src/components/TiptapContainer.jsx +3 -0
  84. package/src/extensions/__tests__/{component.test.jsx → image-component.test.jsx} +2 -1
  85. package/src/extensions/__tests__/image.test.js +1 -1
  86. package/src/extensions/extended-table.js +1 -6
  87. package/src/extensions/{component.jsx → image-component.jsx} +11 -1
  88. package/src/extensions/image.js +8 -6
  89. package/src/extensions/index.js +5 -1
  90. package/LICENSE.md +0 -5
  91. package/NEXT.CHANGELOG.json +0 -1
  92. package/lib/extensions/component.js.map +0 -1
@@ -0,0 +1,196 @@
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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
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ require("core-js/modules/es.symbol.js");
5
+ require("core-js/modules/es.symbol.description.js");
6
+ require("core-js/modules/es.array.filter.js");
7
+ require("core-js/modules/es.array.find.js");
8
+ require("core-js/modules/es.array.flat.js");
9
+ require("core-js/modules/es.array.for-each.js");
10
+ require("core-js/modules/es.array.is-array.js");
11
+ require("core-js/modules/es.array.map.js");
12
+ require("core-js/modules/es.array.unscopables.flat.js");
13
+ require("core-js/modules/es.object.to-string.js");
14
+ require("core-js/modules/web.dom-collections.for-each.js");
15
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
16
+ var _characterUtils = require("../characters/characterUtils");
17
+ describe('characterUtils', function () {
18
+ describe('spanishConfig', function () {
19
+ it('exports spanishConfig object', function () {
20
+ expect(_characterUtils.spanishConfig).toBeDefined();
21
+ expect((0, _typeof2["default"])(_characterUtils.spanishConfig)).toBe('object');
22
+ });
23
+ it('has characters array', function () {
24
+ expect(_characterUtils.spanishConfig).toHaveProperty('characters');
25
+ expect(Array.isArray(_characterUtils.spanishConfig.characters)).toBe(true);
26
+ });
27
+ it('has correct character structure', function () {
28
+ expect(_characterUtils.spanishConfig.characters.length).toBeGreaterThan(0);
29
+ _characterUtils.spanishConfig.characters.forEach(function (row) {
30
+ expect(Array.isArray(row)).toBe(true);
31
+ });
32
+ });
33
+ it('includes Spanish characters', function () {
34
+ var allChars = _characterUtils.spanishConfig.characters.flat();
35
+ expect(allChars).toContain('á');
36
+ expect(allChars).toContain('é');
37
+ expect(allChars).toContain('í');
38
+ expect(allChars).toContain('ó');
39
+ expect(allChars).toContain('ú');
40
+ expect(allChars).toContain('ñ');
41
+ expect(allChars).toContain('Ñ');
42
+ });
43
+ it('includes accented uppercase letters', function () {
44
+ var allChars = _characterUtils.spanishConfig.characters.flat();
45
+ expect(allChars).toContain('Á');
46
+ expect(allChars).toContain('É');
47
+ expect(allChars).toContain('Í');
48
+ expect(allChars).toContain('Ó');
49
+ expect(allChars).toContain('Ú');
50
+ });
51
+ it('includes special punctuation', function () {
52
+ var allChars = _characterUtils.spanishConfig.characters.flat();
53
+ expect(allChars).toContain('¿');
54
+ expect(allChars).toContain('¡');
55
+ expect(allChars).toContain('«');
56
+ expect(allChars).toContain('»');
57
+ });
58
+ });
59
+ describe('specialConfig', function () {
60
+ it('exports specialConfig object', function () {
61
+ expect(_characterUtils.specialConfig).toBeDefined();
62
+ expect((0, _typeof2["default"])(_characterUtils.specialConfig)).toBe('object');
63
+ });
64
+ it('has hasPreview property set to true', function () {
65
+ expect(_characterUtils.specialConfig).toHaveProperty('hasPreview', true);
66
+ });
67
+ it('has characters array', function () {
68
+ expect(_characterUtils.specialConfig).toHaveProperty('characters');
69
+ expect(Array.isArray(_characterUtils.specialConfig.characters)).toBe(true);
70
+ });
71
+ it('has correct character structure with metadata', function () {
72
+ expect(_characterUtils.specialConfig.characters.length).toBeGreaterThan(0);
73
+ _characterUtils.specialConfig.characters.forEach(function (row) {
74
+ expect(Array.isArray(row)).toBe(true);
75
+ row.forEach(function (_char) {
76
+ expect(_char).toHaveProperty('unicode');
77
+ expect(_char).toHaveProperty('description');
78
+ expect(_char).toHaveProperty('write');
79
+ expect(_char).toHaveProperty('label');
80
+ });
81
+ });
82
+ });
83
+ it('includes currency symbols', function () {
84
+ var allChars = _characterUtils.specialConfig.characters.flat();
85
+ var euroChar = allChars.find(function (c) {
86
+ return c.write === '€';
87
+ });
88
+ expect(euroChar).toBeDefined();
89
+ expect(euroChar.unicode).toBe('U+20AC');
90
+ expect(euroChar.description).toBe('EURO SIGN');
91
+ var centChar = allChars.find(function (c) {
92
+ return c.write === '¢';
93
+ });
94
+ expect(centChar).toBeDefined();
95
+ var poundChar = allChars.find(function (c) {
96
+ return c.write === '£';
97
+ });
98
+ expect(poundChar).toBeDefined();
99
+ var yenChar = allChars.find(function (c) {
100
+ return c.write === '¥';
101
+ });
102
+ expect(yenChar).toBeDefined();
103
+ });
104
+ it('includes accented characters', function () {
105
+ var allChars = _characterUtils.specialConfig.characters.flat();
106
+ var chars = ['á', 'é', 'í', 'ó', 'ú', 'ñ'];
107
+ chars.forEach(function (_char2) {
108
+ var found = allChars.find(function (c) {
109
+ return c.write === _char2;
110
+ });
111
+ expect(found).toBeDefined();
112
+ });
113
+ });
114
+ it('includes space characters', function () {
115
+ var allChars = _characterUtils.specialConfig.characters.flat();
116
+ var descriptions = allChars.map(function (c) {
117
+ return c.description;
118
+ });
119
+ expect(descriptions).toContain('NO-BREAK SPACE');
120
+ expect(descriptions).toContain('HAIR SPACE');
121
+ expect(descriptions).toContain('THIN SPACE');
122
+ expect(descriptions).toContain('EM SPACE');
123
+ });
124
+ it('includes diacritics', function () {
125
+ var allChars = _characterUtils.specialConfig.characters.flat();
126
+ var acuteAccent = allChars.find(function (c) {
127
+ return c.description === 'ACUTE ACCENT';
128
+ });
129
+ expect(acuteAccent).toBeDefined();
130
+ var circumflex = allChars.find(function (c) {
131
+ return c.description === 'CIRCUMFLEX ACCENT';
132
+ });
133
+ expect(circumflex).toBeDefined();
134
+ var grave = allChars.find(function (c) {
135
+ return c.description === 'GRAVE ACCENT';
136
+ });
137
+ expect(grave).toBeDefined();
138
+ var diaeresis = allChars.find(function (c) {
139
+ return c.description === 'DIAERESIS';
140
+ });
141
+ expect(diaeresis).toBeDefined();
142
+ });
143
+ it('includes punctuation marks', function () {
144
+ var allChars = _characterUtils.specialConfig.characters.flat();
145
+ var descriptions = allChars.map(function (c) {
146
+ return c.description;
147
+ });
148
+ expect(descriptions).toContain('INVERTED QUESTION MARK');
149
+ expect(descriptions).toContain('INVERTED EXCLAMATION MARK');
150
+ expect(descriptions).toContain('SECTION SIGN');
151
+ expect(descriptions).toContain('BULLET');
152
+ expect(descriptions).toContain('HORIZONTAL ELLIPSIS');
153
+ });
154
+ it('includes quotation marks', function () {
155
+ var allChars = _characterUtils.specialConfig.characters.flat();
156
+ var leftQuote = allChars.find(function (c) {
157
+ return c.description === 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK';
158
+ });
159
+ expect(leftQuote).toBeDefined();
160
+ var rightQuote = allChars.find(function (c) {
161
+ return c.description === 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK';
162
+ });
163
+ expect(rightQuote).toBeDefined();
164
+ });
165
+ it('includes dashes', function () {
166
+ var allChars = _characterUtils.specialConfig.characters.flat();
167
+ var enDash = allChars.find(function (c) {
168
+ return c.description === 'EN DASH';
169
+ });
170
+ expect(enDash).toBeDefined();
171
+ var emDash = allChars.find(function (c) {
172
+ return c.description === 'EM DASH';
173
+ });
174
+ expect(emDash).toBeDefined();
175
+ var minus = allChars.find(function (c) {
176
+ return c.description === 'MINUS SIGN';
177
+ });
178
+ expect(minus).toBeDefined();
179
+ });
180
+ it('some characters have extraProps', function () {
181
+ var allChars = _characterUtils.specialConfig.characters.flat();
182
+ var charsWithExtraProps = allChars.filter(function (c) {
183
+ return c.extraProps;
184
+ });
185
+ expect(charsWithExtraProps.length).toBeGreaterThan(0);
186
+ });
187
+ });
188
+ });
189
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2hhcmFjdGVyVXRpbHMiLCJyZXF1aXJlIiwiZGVzY3JpYmUiLCJpdCIsImV4cGVjdCIsInNwYW5pc2hDb25maWciLCJ0b0JlRGVmaW5lZCIsIl90eXBlb2YyIiwidG9CZSIsInRvSGF2ZVByb3BlcnR5IiwiQXJyYXkiLCJpc0FycmF5IiwiY2hhcmFjdGVycyIsImxlbmd0aCIsInRvQmVHcmVhdGVyVGhhbiIsImZvckVhY2giLCJyb3ciLCJhbGxDaGFycyIsImZsYXQiLCJ0b0NvbnRhaW4iLCJzcGVjaWFsQ29uZmlnIiwiY2hhciIsImV1cm9DaGFyIiwiZmluZCIsImMiLCJ3cml0ZSIsInVuaWNvZGUiLCJkZXNjcmlwdGlvbiIsImNlbnRDaGFyIiwicG91bmRDaGFyIiwieWVuQ2hhciIsImNoYXJzIiwiZm91bmQiLCJkZXNjcmlwdGlvbnMiLCJtYXAiLCJhY3V0ZUFjY2VudCIsImNpcmN1bWZsZXgiLCJncmF2ZSIsImRpYWVyZXNpcyIsImxlZnRRdW90ZSIsInJpZ2h0UXVvdGUiLCJlbkRhc2giLCJlbURhc2giLCJtaW51cyIsImNoYXJzV2l0aEV4dHJhUHJvcHMiLCJmaWx0ZXIiLCJleHRyYVByb3BzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvX190ZXN0c19fL2NoYXJhY3RlclV0aWxzLnRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3BhbmlzaENvbmZpZywgc3BlY2lhbENvbmZpZyB9IGZyb20gJy4uL2NoYXJhY3RlcnMvY2hhcmFjdGVyVXRpbHMnO1xuXG5kZXNjcmliZSgnY2hhcmFjdGVyVXRpbHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdzcGFuaXNoQ29uZmlnJywgKCkgPT4ge1xuICAgIGl0KCdleHBvcnRzIHNwYW5pc2hDb25maWcgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNwYW5pc2hDb25maWcpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QodHlwZW9mIHNwYW5pc2hDb25maWcpLnRvQmUoJ29iamVjdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBjaGFyYWN0ZXJzIGFycmF5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNwYW5pc2hDb25maWcpLnRvSGF2ZVByb3BlcnR5KCdjaGFyYWN0ZXJzJyk7XG4gICAgICBleHBlY3QoQXJyYXkuaXNBcnJheShzcGFuaXNoQ29uZmlnLmNoYXJhY3RlcnMpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBjb3JyZWN0IGNoYXJhY3RlciBzdHJ1Y3R1cmUnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc3BhbmlzaENvbmZpZy5jaGFyYWN0ZXJzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgc3BhbmlzaENvbmZpZy5jaGFyYWN0ZXJzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBleHBlY3QoQXJyYXkuaXNBcnJheShyb3cpKS50b0JlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgU3BhbmlzaCBjaGFyYWN0ZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWxsQ2hhcnMgPSBzcGFuaXNoQ29uZmlnLmNoYXJhY3RlcnMuZmxhdCgpO1xuICAgICAgZXhwZWN0KGFsbENoYXJzKS50b0NvbnRhaW4oJ8OhJyk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignw6knKTtcbiAgICAgIGV4cGVjdChhbGxDaGFycykudG9Db250YWluKCfDrScpO1xuICAgICAgZXhwZWN0KGFsbENoYXJzKS50b0NvbnRhaW4oJ8OzJyk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignw7onKTtcbiAgICAgIGV4cGVjdChhbGxDaGFycykudG9Db250YWluKCfDsScpO1xuICAgICAgZXhwZWN0KGFsbENoYXJzKS50b0NvbnRhaW4oJ8ORJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgYWNjZW50ZWQgdXBwZXJjYXNlIGxldHRlcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhbGxDaGFycyA9IHNwYW5pc2hDb25maWcuY2hhcmFjdGVycy5mbGF0KCk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignw4EnKTtcbiAgICAgIGV4cGVjdChhbGxDaGFycykudG9Db250YWluKCfDiScpO1xuICAgICAgZXhwZWN0KGFsbENoYXJzKS50b0NvbnRhaW4oJ8ONJyk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignw5MnKTtcbiAgICAgIGV4cGVjdChhbGxDaGFycykudG9Db250YWluKCfDmicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2luY2x1ZGVzIHNwZWNpYWwgcHVuY3R1YXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCBhbGxDaGFycyA9IHNwYW5pc2hDb25maWcuY2hhcmFjdGVycy5mbGF0KCk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignwr8nKTtcbiAgICAgIGV4cGVjdChhbGxDaGFycykudG9Db250YWluKCfCoScpO1xuICAgICAgZXhwZWN0KGFsbENoYXJzKS50b0NvbnRhaW4oJ8KrJyk7XG4gICAgICBleHBlY3QoYWxsQ2hhcnMpLnRvQ29udGFpbignwrsnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NwZWNpYWxDb25maWcnLCAoKSA9PiB7XG4gICAgaXQoJ2V4cG9ydHMgc3BlY2lhbENvbmZpZyBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc3BlY2lhbENvbmZpZykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdCh0eXBlb2Ygc3BlY2lhbENvbmZpZykudG9CZSgnb2JqZWN0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFzIGhhc1ByZXZpZXcgcHJvcGVydHkgc2V0IHRvIHRydWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc3BlY2lhbENvbmZpZykudG9IYXZlUHJvcGVydHkoJ2hhc1ByZXZpZXcnLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgY2hhcmFjdGVycyBhcnJheScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzcGVjaWFsQ29uZmlnKS50b0hhdmVQcm9wZXJ0eSgnY2hhcmFjdGVycycpO1xuICAgICAgZXhwZWN0KEFycmF5LmlzQXJyYXkoc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgY29ycmVjdCBjaGFyYWN0ZXIgc3RydWN0dXJlIHdpdGggbWV0YWRhdGEnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBleHBlY3QoQXJyYXkuaXNBcnJheShyb3cpKS50b0JlKHRydWUpO1xuICAgICAgICByb3cuZm9yRWFjaCgoY2hhcikgPT4ge1xuICAgICAgICAgIGV4cGVjdChjaGFyKS50b0hhdmVQcm9wZXJ0eSgndW5pY29kZScpO1xuICAgICAgICAgIGV4cGVjdChjaGFyKS50b0hhdmVQcm9wZXJ0eSgnZGVzY3JpcHRpb24nKTtcbiAgICAgICAgICBleHBlY3QoY2hhcikudG9IYXZlUHJvcGVydHkoJ3dyaXRlJyk7XG4gICAgICAgICAgZXhwZWN0KGNoYXIpLnRvSGF2ZVByb3BlcnR5KCdsYWJlbCcpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2luY2x1ZGVzIGN1cnJlbmN5IHN5bWJvbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhbGxDaGFycyA9IHNwZWNpYWxDb25maWcuY2hhcmFjdGVycy5mbGF0KCk7XG4gICAgICBjb25zdCBldXJvQ2hhciA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMud3JpdGUgPT09ICfigqwnKTtcbiAgICAgIGV4cGVjdChldXJvQ2hhcikudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChldXJvQ2hhci51bmljb2RlKS50b0JlKCdVKzIwQUMnKTtcbiAgICAgIGV4cGVjdChldXJvQ2hhci5kZXNjcmlwdGlvbikudG9CZSgnRVVSTyBTSUdOJyk7XG5cbiAgICAgIGNvbnN0IGNlbnRDaGFyID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy53cml0ZSA9PT0gJ8KiJyk7XG4gICAgICBleHBlY3QoY2VudENoYXIpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIGNvbnN0IHBvdW5kQ2hhciA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMud3JpdGUgPT09ICfCoycpO1xuICAgICAgZXhwZWN0KHBvdW5kQ2hhcikudG9CZURlZmluZWQoKTtcblxuICAgICAgY29uc3QgeWVuQ2hhciA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMud3JpdGUgPT09ICfCpScpO1xuICAgICAgZXhwZWN0KHllbkNoYXIpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgYWNjZW50ZWQgY2hhcmFjdGVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IGFsbENoYXJzID0gc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzLmZsYXQoKTtcbiAgICAgIGNvbnN0IGNoYXJzID0gWyfDoScsICfDqScsICfDrScsICfDsycsICfDuicsICfDsSddO1xuICAgICAgY2hhcnMuZm9yRWFjaCgoY2hhcikgPT4ge1xuICAgICAgICBjb25zdCBmb3VuZCA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMud3JpdGUgPT09IGNoYXIpO1xuICAgICAgICBleHBlY3QoZm91bmQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdpbmNsdWRlcyBzcGFjZSBjaGFyYWN0ZXJzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWxsQ2hhcnMgPSBzcGVjaWFsQ29uZmlnLmNoYXJhY3RlcnMuZmxhdCgpO1xuICAgICAgY29uc3QgZGVzY3JpcHRpb25zID0gYWxsQ2hhcnMubWFwKChjKSA9PiBjLmRlc2NyaXB0aW9uKTtcbiAgICAgIGV4cGVjdChkZXNjcmlwdGlvbnMpLnRvQ29udGFpbignTk8tQlJFQUsgU1BBQ0UnKTtcbiAgICAgIGV4cGVjdChkZXNjcmlwdGlvbnMpLnRvQ29udGFpbignSEFJUiBTUEFDRScpO1xuICAgICAgZXhwZWN0KGRlc2NyaXB0aW9ucykudG9Db250YWluKCdUSElOIFNQQUNFJyk7XG4gICAgICBleHBlY3QoZGVzY3JpcHRpb25zKS50b0NvbnRhaW4oJ0VNIFNQQUNFJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgZGlhY3JpdGljcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGFsbENoYXJzID0gc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzLmZsYXQoKTtcbiAgICAgIGNvbnN0IGFjdXRlQWNjZW50ID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy5kZXNjcmlwdGlvbiA9PT0gJ0FDVVRFIEFDQ0VOVCcpO1xuICAgICAgZXhwZWN0KGFjdXRlQWNjZW50KS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICBjb25zdCBjaXJjdW1mbGV4ID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy5kZXNjcmlwdGlvbiA9PT0gJ0NJUkNVTUZMRVggQUNDRU5UJyk7XG4gICAgICBleHBlY3QoY2lyY3VtZmxleCkudG9CZURlZmluZWQoKTtcblxuICAgICAgY29uc3QgZ3JhdmUgPSBhbGxDaGFycy5maW5kKChjKSA9PiBjLmRlc2NyaXB0aW9uID09PSAnR1JBVkUgQUNDRU5UJyk7XG4gICAgICBleHBlY3QoZ3JhdmUpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIGNvbnN0IGRpYWVyZXNpcyA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMuZGVzY3JpcHRpb24gPT09ICdESUFFUkVTSVMnKTtcbiAgICAgIGV4cGVjdChkaWFlcmVzaXMpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgcHVuY3R1YXRpb24gbWFya3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhbGxDaGFycyA9IHNwZWNpYWxDb25maWcuY2hhcmFjdGVycy5mbGF0KCk7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbnMgPSBhbGxDaGFycy5tYXAoKGMpID0+IGMuZGVzY3JpcHRpb24pO1xuICAgICAgZXhwZWN0KGRlc2NyaXB0aW9ucykudG9Db250YWluKCdJTlZFUlRFRCBRVUVTVElPTiBNQVJLJyk7XG4gICAgICBleHBlY3QoZGVzY3JpcHRpb25zKS50b0NvbnRhaW4oJ0lOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksnKTtcbiAgICAgIGV4cGVjdChkZXNjcmlwdGlvbnMpLnRvQ29udGFpbignU0VDVElPTiBTSUdOJyk7XG4gICAgICBleHBlY3QoZGVzY3JpcHRpb25zKS50b0NvbnRhaW4oJ0JVTExFVCcpO1xuICAgICAgZXhwZWN0KGRlc2NyaXB0aW9ucykudG9Db250YWluKCdIT1JJWk9OVEFMIEVMTElQU0lTJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgcXVvdGF0aW9uIG1hcmtzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWxsQ2hhcnMgPSBzcGVjaWFsQ29uZmlnLmNoYXJhY3RlcnMuZmxhdCgpO1xuICAgICAgY29uc3QgbGVmdFF1b3RlID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy5kZXNjcmlwdGlvbiA9PT0gJ0xFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLJyk7XG4gICAgICBleHBlY3QobGVmdFF1b3RlKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICBjb25zdCByaWdodFF1b3RlID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy5kZXNjcmlwdGlvbiA9PT0gJ1JJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSycpO1xuICAgICAgZXhwZWN0KHJpZ2h0UXVvdGUpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5jbHVkZXMgZGFzaGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWxsQ2hhcnMgPSBzcGVjaWFsQ29uZmlnLmNoYXJhY3RlcnMuZmxhdCgpO1xuICAgICAgY29uc3QgZW5EYXNoID0gYWxsQ2hhcnMuZmluZCgoYykgPT4gYy5kZXNjcmlwdGlvbiA9PT0gJ0VOIERBU0gnKTtcbiAgICAgIGV4cGVjdChlbkRhc2gpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICAgIGNvbnN0IGVtRGFzaCA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMuZGVzY3JpcHRpb24gPT09ICdFTSBEQVNIJyk7XG4gICAgICBleHBlY3QoZW1EYXNoKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICBjb25zdCBtaW51cyA9IGFsbENoYXJzLmZpbmQoKGMpID0+IGMuZGVzY3JpcHRpb24gPT09ICdNSU5VUyBTSUdOJyk7XG4gICAgICBleHBlY3QobWludXMpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc29tZSBjaGFyYWN0ZXJzIGhhdmUgZXh0cmFQcm9wcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGFsbENoYXJzID0gc3BlY2lhbENvbmZpZy5jaGFyYWN0ZXJzLmZsYXQoKTtcbiAgICAgIGNvbnN0IGNoYXJzV2l0aEV4dHJhUHJvcHMgPSBhbGxDaGFycy5maWx0ZXIoKGMpID0+IGMuZXh0cmFQcm9wcyk7XG4gICAgICBleHBlY3QoY2hhcnNXaXRoRXh0cmFQcm9wcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsZUFBQSxHQUFBQyxPQUFBO0FBRUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFNO0VBQy9CQSxRQUFRLENBQUMsZUFBZSxFQUFFLFlBQU07SUFDOUJDLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxZQUFNO01BQ3ZDQyxNQUFNLENBQUNDLDZCQUFhLENBQUMsQ0FBQ0MsV0FBVyxDQUFDLENBQUM7TUFDbkNGLE1BQU0sS0FBQUcsUUFBQSxhQUFRRiw2QkFBYSxFQUFDLENBQUNHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0MsQ0FBQyxDQUFDO0lBRUZM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