@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.
- package/lib/__tests__/EditableHtml.test.js +387 -0
- package/lib/__tests__/constants.test.js +28 -0
- package/lib/__tests__/extensions.test.js +214 -0
- package/lib/__tests__/index.test.js +246 -0
- package/lib/__tests__/size-utils.test.js +57 -0
- package/lib/__tests__/theme.test.js +17 -0
- package/lib/components/CharacterPicker.js +8 -3
- package/lib/components/EditableHtml.js +6 -6
- package/lib/components/EditableHtml.js.map +1 -1
- package/lib/components/MenuBar.js +1 -1
- package/lib/components/TiptapContainer.js +4 -1
- package/lib/components/__tests__/AltDialog.test.js +201 -0
- package/lib/components/__tests__/CharacterPicker.test.js +313 -0
- package/lib/components/__tests__/CssIcon.test.js +58 -0
- package/lib/components/__tests__/DragInTheBlank.test.js +309 -0
- package/lib/components/__tests__/ExplicitConstructedResponse.test.js +263 -0
- package/lib/components/__tests__/ImageToolbar.test.js +195 -0
- package/lib/components/__tests__/InlineDropdown.test.js +297 -0
- package/lib/components/__tests__/InsertImageHandler.test.js +162 -0
- package/lib/components/__tests__/MediaDialog.test.js +435 -0
- package/lib/components/__tests__/MediaToolbar.test.js +126 -0
- package/lib/components/__tests__/MediaWrapper.test.js +96 -0
- package/lib/components/__tests__/MenuBar.test.js +459 -0
- package/lib/components/__tests__/RespArea.test.js +171 -0
- package/lib/components/__tests__/TableIcons.test.js +153 -0
- package/lib/components/__tests__/TextAlign.test.js +216 -0
- package/lib/components/__tests__/TiptapContainer.test.js +196 -0
- package/lib/components/__tests__/characterUtils.test.js +189 -0
- package/lib/components/__tests__/choice.test.js +213 -0
- package/lib/components/__tests__/custom-popper.test.js +108 -0
- package/lib/components/__tests__/done-button.test.js +72 -0
- package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
- package/lib/components/characters/characterUtils.js +1 -1
- package/lib/components/characters/custom-popper.js +1 -1
- package/lib/components/common/done-button.js +1 -1
- package/lib/components/common/toolbar-buttons.js +1 -1
- package/lib/components/icons/CssIcon.js +1 -1
- package/lib/components/icons/RespArea.js +1 -1
- package/lib/components/icons/TableIcons.js +1 -1
- package/lib/components/icons/TextAlign.js +1 -1
- package/lib/components/image/AltDialog.js +1 -1
- package/lib/components/image/ImageToolbar.js +1 -1
- package/lib/components/image/InsertImageHandler.js +1 -1
- package/lib/components/media/MediaDialog.js +1 -1
- package/lib/components/media/MediaToolbar.js +1 -1
- package/lib/components/media/MediaWrapper.js +1 -1
- package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +1 -1
- package/lib/components/respArea/DragInTheBlank/choice.js +1 -1
- package/lib/components/respArea/ExplicitConstructedResponse.js +1 -1
- package/lib/components/respArea/InlineDropdown.js +1 -1
- package/lib/components/respArea/ToolbarIcon.js +1 -1
- package/lib/constants.js +1 -1
- package/lib/extensions/__tests__/component.test.js +314 -0
- package/lib/extensions/__tests__/css.test.js +218 -0
- package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +185 -0
- package/lib/extensions/__tests__/extended-table.test.js +114 -0
- package/lib/extensions/__tests__/image-component.test.js +315 -0
- package/lib/extensions/__tests__/image.test.js +178 -0
- package/lib/extensions/__tests__/media.test.js +296 -0
- package/lib/extensions/__tests__/responseArea.test.js +332 -0
- package/lib/extensions/component.js +1 -1
- package/lib/extensions/css.js +1 -1
- package/lib/extensions/custom-toolbar-wrapper.js +1 -1
- package/lib/extensions/extended-table.js +2 -2
- package/lib/extensions/image-component.js +314 -0
- package/lib/extensions/image-component.js.map +1 -0
- package/lib/extensions/image.js +3 -3
- package/lib/extensions/image.js.map +1 -1
- package/lib/extensions/index.js +6 -3
- package/lib/extensions/index.js.map +1 -1
- package/lib/extensions/math.js +1 -1
- package/lib/extensions/media.js +1 -1
- package/lib/extensions/responseArea.js +1 -1
- package/lib/index.js +1 -1
- package/lib/styles/editorContainerStyles.js +1 -1
- package/lib/theme.js +1 -1
- package/lib/utils/size.js +1 -1
- package/package.json +1 -1
- package/src/__tests__/EditableHtml.test.jsx +1 -0
- package/src/__tests__/extensions.test.js +2 -2
- package/src/components/CharacterPicker.jsx +9 -2
- package/src/components/EditableHtml.jsx +8 -6
- package/src/components/TiptapContainer.jsx +3 -0
- package/src/extensions/__tests__/{component.test.jsx → image-component.test.jsx} +2 -1
- package/src/extensions/__tests__/image.test.js +1 -1
- package/src/extensions/extended-table.js +1 -6
- package/src/extensions/{component.jsx → image-component.jsx} +11 -1
- package/src/extensions/image.js +8 -6
- package/src/extensions/index.js +5 -1
- package/LICENSE.md +0 -5
- package/NEXT.CHANGELOG.json +0 -1
- 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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
|