@pie-lib/math-input-mathlive 1.0.9-next.6630 → 1.0.9
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/README.md +15 -6
- package/lib/__tests__/composites.test.js +255 -0
- package/lib/__tests__/composites.test.js.map +1 -0
- package/lib/__tests__/drop-in-compat.test.js +133 -0
- package/lib/__tests__/drop-in-compat.test.js.map +1 -0
- package/lib/__tests__/index.test.js +118 -0
- package/lib/__tests__/index.test.js.map +1 -0
- package/lib/__tests__/input-imperative.test.js +155 -0
- package/lib/__tests__/input-imperative.test.js.map +1 -0
- package/lib/__tests__/keypad-label.test.js +44 -0
- package/lib/__tests__/keypad-label.test.js.map +1 -0
- package/lib/__tests__/keypad-render.test.js +206 -0
- package/lib/__tests__/keypad-render.test.js.map +1 -0
- package/lib/__tests__/latex-bridge.test.js +251 -0
- package/lib/__tests__/latex-bridge.test.js.map +1 -0
- package/lib/__tests__/mathlive-instance.test.js +237 -0
- package/lib/__tests__/mathlive-instance.test.js.map +1 -0
- package/lib/__tests__/mount-race.test.js +194 -0
- package/lib/__tests__/mount-race.test.js.map +1 -0
- package/lib/__tests__/static-prompts.test.js +282 -0
- package/lib/__tests__/static-prompts.test.js.map +1 -0
- package/lib/mathlive-instance.js +47 -10
- package/lib/mathlive-instance.js.map +1 -1
- package/lib/mf/input.js +18 -5
- package/lib/mf/input.js.map +1 -1
- package/lib/mf/static.js +17 -4
- package/lib/mf/static.js.map +1 -1
- package/package.json +3 -4
- package/src/__tests__/composites.test.jsx +220 -0
- package/src/__tests__/keypad-label.test.jsx +5 -13
- package/src/__tests__/keypad-render.test.jsx +123 -0
- package/src/__tests__/mathlive-instance.test.js +40 -0
- package/src/__tests__/mount-race.test.jsx +129 -0
- package/src/__tests__/static-prompts.test.jsx +251 -0
- package/src/mathlive-instance.js +50 -11
- package/src/mf/input.jsx +19 -5
- package/src/mf/static.jsx +20 -4
- package/LICENSE.md +0 -5
package/README.md
CHANGED
|
@@ -75,7 +75,7 @@ widget do not port and need a redesign (`mf.getElementInfo()` exposes per-elemen
|
|
|
75
75
|
- **Stylesheets: import both, once, in the host app.**
|
|
76
76
|
|
|
77
77
|
```js
|
|
78
|
-
import 'mathlive/fonts.css';
|
|
78
|
+
import 'mathlive/fonts.css'; // KaTeX @font-face rules
|
|
79
79
|
import 'mathlive/static.css'; // REQUIRED for convertLatexToMarkup output
|
|
80
80
|
```
|
|
81
81
|
|
|
@@ -108,19 +108,28 @@ widget do not port and need a redesign (`mf.getElementInfo()` exposes per-elemen
|
|
|
108
108
|
corrupt these fonts (it emits a JS module under a `.woff2` name). Exclude
|
|
109
109
|
mathlive from such rules - see `packages/demo/next.config.js`.
|
|
110
110
|
|
|
111
|
+
**Fonts are required, not cosmetic.** Some symbols are composed from Private
|
|
112
|
+
Use Area glyphs that exist only in the KaTeX fonts: `\neq` is U+E020 (a
|
|
113
|
+
negation slash) overlapped on `=`, and `\nsim` / `\ncong` are the same. With
|
|
114
|
+
no fonts the browser substitutes an arbitrary glyph for U+E020, so those keys
|
|
115
|
+
render as garbage rather than in a plainer face.
|
|
116
|
+
|
|
111
117
|
**Alternative** - serve the fonts yourself (a static path, or a CDN):
|
|
112
118
|
|
|
113
119
|
```js
|
|
114
120
|
import { configureFonts } from '@pie-lib/math-input-mathlive';
|
|
115
121
|
|
|
116
122
|
configureFonts('/mathlive-fonts'); // before loadMathLive()
|
|
117
|
-
configureFonts('https://unpkg.com/mathlive@0.110.0/
|
|
118
|
-
configureFonts(null); //
|
|
123
|
+
configureFonts('https://unpkg.com/mathlive@0.110.0/fonts'); // note: /fonts, /dist/fonts 404s
|
|
124
|
+
configureFonts(null); // opt out; \neq and friends will render incorrectly
|
|
119
125
|
```
|
|
120
126
|
|
|
121
|
-
Paths are resolved to absolute URLs against `document.baseURI`.
|
|
122
|
-
|
|
123
|
-
|
|
127
|
+
Paths are resolved to absolute URLs against `document.baseURI`.
|
|
128
|
+
|
|
129
|
+
If you neither import the stylesheet nor call `configureFonts`, the package
|
|
130
|
+
falls back to a **version-pinned CDN** - `https://unpkg.com/mathlive@<engine
|
|
131
|
+
version>/fonts` - so those glyph-dependent symbols still render. Serve the
|
|
132
|
+
fonts yourself to avoid the third-party request.
|
|
124
133
|
|
|
125
134
|
- **Custom macros.** `PIE_MACROS` covers the pie-specific commands the MathQuill
|
|
126
135
|
fork understood (`\parallelogram`, `\longdiv`, `\napprox`, …) and is kept in
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _react = _interopRequireDefault(require("react"));
|
|
5
|
+
var _react2 = require("@testing-library/react");
|
|
6
|
+
var _mathInput = _interopRequireDefault(require("../math-input"));
|
|
7
|
+
var _horizontalKeypad = _interopRequireDefault(require("../horizontal-keypad"));
|
|
8
|
+
var _input = _interopRequireDefault(require("../mf/input"));
|
|
9
|
+
/**
|
|
10
|
+
* The pieces that sit between the keypad and the field: how a pressed key is
|
|
11
|
+
* routed into the field, and the legacy `{value,type}` shape math-toolbar
|
|
12
|
+
* consumes.
|
|
13
|
+
*/
|
|
14
|
+
describe('MathInput.keypadPress routing', function () {
|
|
15
|
+
var withInput = function withInput() {
|
|
16
|
+
var mi = new _mathInput["default"]({});
|
|
17
|
+
var calls = {
|
|
18
|
+
write: [],
|
|
19
|
+
keystroke: []
|
|
20
|
+
};
|
|
21
|
+
mi.input = {
|
|
22
|
+
write: function write(v) {
|
|
23
|
+
return calls.write.push(v);
|
|
24
|
+
},
|
|
25
|
+
keystroke: function keystroke(v) {
|
|
26
|
+
return calls.keystroke.push(v);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
mi: mi,
|
|
31
|
+
calls: calls
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
it('routes an insert action to write()', function () {
|
|
35
|
+
var _withInput = withInput(),
|
|
36
|
+
mi = _withInput.mi,
|
|
37
|
+
calls = _withInput.calls;
|
|
38
|
+
mi.keypadPress({
|
|
39
|
+
latex: '\\pi'
|
|
40
|
+
});
|
|
41
|
+
expect(calls.write).toEqual(['\\pi']);
|
|
42
|
+
expect(calls.keystroke).toEqual([]);
|
|
43
|
+
});
|
|
44
|
+
it('expands an argument-taking command before writing', function () {
|
|
45
|
+
var _withInput2 = withInput(),
|
|
46
|
+
mi = _withInput2.mi,
|
|
47
|
+
calls = _withInput2.calls;
|
|
48
|
+
mi.keypadPress({
|
|
49
|
+
command: '\\frac'
|
|
50
|
+
});
|
|
51
|
+
expect(calls.write).toEqual(['\\frac{#?}{#?}']);
|
|
52
|
+
});
|
|
53
|
+
it('routes a cursor keystroke to keystroke()', function () {
|
|
54
|
+
var _withInput3 = withInput(),
|
|
55
|
+
mi = _withInput3.mi,
|
|
56
|
+
calls = _withInput3.calls;
|
|
57
|
+
mi.keypadPress({
|
|
58
|
+
keystroke: 'Left'
|
|
59
|
+
});
|
|
60
|
+
expect(calls.keystroke).toEqual(['moveToPreviousChar']);
|
|
61
|
+
expect(calls.write).toEqual([]);
|
|
62
|
+
});
|
|
63
|
+
it('ignores keys with no action', function () {
|
|
64
|
+
var _withInput4 = withInput(),
|
|
65
|
+
mi = _withInput4.mi,
|
|
66
|
+
calls = _withInput4.calls;
|
|
67
|
+
mi.keypadPress({});
|
|
68
|
+
mi.keypadPress({
|
|
69
|
+
keystroke: 'Nonsense'
|
|
70
|
+
});
|
|
71
|
+
expect(calls.write).toEqual([]);
|
|
72
|
+
expect(calls.keystroke).toEqual([]);
|
|
73
|
+
});
|
|
74
|
+
it('is a no-op before the field ref exists', function () {
|
|
75
|
+
var mi = new _mathInput["default"]({});
|
|
76
|
+
expect(function () {
|
|
77
|
+
return mi.keypadPress({
|
|
78
|
+
latex: '\\pi'
|
|
79
|
+
});
|
|
80
|
+
}).not.toThrow();
|
|
81
|
+
});
|
|
82
|
+
it('changeLatex only fires onChange when the value differs', function () {
|
|
83
|
+
var onChange = jest.fn();
|
|
84
|
+
var mi = new _mathInput["default"]({
|
|
85
|
+
latex: 'x',
|
|
86
|
+
onChange: onChange
|
|
87
|
+
});
|
|
88
|
+
mi.changeLatex('x');
|
|
89
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
90
|
+
mi.changeLatex('y');
|
|
91
|
+
expect(onChange).toHaveBeenCalledWith('y');
|
|
92
|
+
});
|
|
93
|
+
it('tracks focus state', function () {
|
|
94
|
+
var mi = new _mathInput["default"]({});
|
|
95
|
+
mi.setState = function (s) {
|
|
96
|
+
return Object.assign(mi.state, s);
|
|
97
|
+
};
|
|
98
|
+
mi.inputFocus();
|
|
99
|
+
expect(mi.state.focused).toBe(true);
|
|
100
|
+
mi.inputBlur();
|
|
101
|
+
expect(mi.state.focused).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('HorizontalKeypad legacy {value,type} model', function () {
|
|
105
|
+
var pressed = function pressed(key) {
|
|
106
|
+
var onClick = jest.fn();
|
|
107
|
+
var hk = new _horizontalKeypad["default"]({
|
|
108
|
+
onClick: onClick
|
|
109
|
+
});
|
|
110
|
+
hk.keypadPress(key);
|
|
111
|
+
return onClick.mock.calls[0][0];
|
|
112
|
+
};
|
|
113
|
+
it('maps a command to {value, type: command}', function () {
|
|
114
|
+
expect(pressed({
|
|
115
|
+
command: '\\frac'
|
|
116
|
+
})).toEqual({
|
|
117
|
+
value: '\\frac',
|
|
118
|
+
type: 'command'
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
it('maps a write to {value}', function () {
|
|
122
|
+
expect(pressed({
|
|
123
|
+
write: 'x'
|
|
124
|
+
})).toEqual({
|
|
125
|
+
value: 'x'
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
it('maps a keystroke to {type: cursor}', function () {
|
|
129
|
+
expect(pressed({
|
|
130
|
+
keystroke: 'Left'
|
|
131
|
+
})).toEqual({
|
|
132
|
+
type: 'cursor',
|
|
133
|
+
value: 'Left'
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
it('renders without throwing', function () {
|
|
137
|
+
expect(function () {
|
|
138
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_horizontalKeypad["default"], {
|
|
139
|
+
onClick: function onClick() {}
|
|
140
|
+
}));
|
|
141
|
+
}).not.toThrow();
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('Input: controlled-value sync and events', function () {
|
|
145
|
+
var withField = function withField() {
|
|
146
|
+
var input = new _input["default"]({});
|
|
147
|
+
input.mathField = {
|
|
148
|
+
value: '',
|
|
149
|
+
getValue: function getValue() {
|
|
150
|
+
return input.mathField.value;
|
|
151
|
+
},
|
|
152
|
+
insert: function insert(v) {
|
|
153
|
+
input.mathField.value += v;
|
|
154
|
+
},
|
|
155
|
+
executeCommand: function executeCommand() {},
|
|
156
|
+
focus: function focus() {},
|
|
157
|
+
blur: function blur() {},
|
|
158
|
+
addEventListener: function addEventListener() {},
|
|
159
|
+
removeEventListener: function removeEventListener() {},
|
|
160
|
+
remove: function remove() {}
|
|
161
|
+
};
|
|
162
|
+
return input;
|
|
163
|
+
};
|
|
164
|
+
it('emits stored-form latex on edit', function () {
|
|
165
|
+
var onChange = jest.fn();
|
|
166
|
+
var input = withField();
|
|
167
|
+
input.props = {
|
|
168
|
+
onChange: onChange
|
|
169
|
+
};
|
|
170
|
+
input.mathField.value = '\\longdiv{\\placeholder{}}';
|
|
171
|
+
input.onInputEdit();
|
|
172
|
+
|
|
173
|
+
// \placeholder is MathLive-internal and must not reach the model
|
|
174
|
+
expect(onChange).toHaveBeenCalledWith('\\longdiv{}');
|
|
175
|
+
expect(input.lastEmitted).toEqual('\\longdiv{}');
|
|
176
|
+
});
|
|
177
|
+
it('does not push a prop echo back into the field', function () {
|
|
178
|
+
var input = withField();
|
|
179
|
+
input.mathField.value = 'x';
|
|
180
|
+
input.lastEmitted = 'x';
|
|
181
|
+
input.props = {
|
|
182
|
+
latex: 'x'
|
|
183
|
+
};
|
|
184
|
+
input.componentDidUpdate({
|
|
185
|
+
latex: ''
|
|
186
|
+
});
|
|
187
|
+
expect(input.mathField.value).toEqual('x');
|
|
188
|
+
});
|
|
189
|
+
it('pushes a genuinely new latex prop into the field', function () {
|
|
190
|
+
var input = withField();
|
|
191
|
+
input.mathField.value = 'x';
|
|
192
|
+
input.lastEmitted = 'x';
|
|
193
|
+
input.props = {
|
|
194
|
+
latex: 'y'
|
|
195
|
+
};
|
|
196
|
+
input.componentDidUpdate({
|
|
197
|
+
latex: 'x'
|
|
198
|
+
});
|
|
199
|
+
expect(input.mathField.value).toEqual('y');
|
|
200
|
+
});
|
|
201
|
+
it('bridges stored latex on the way in', function () {
|
|
202
|
+
var input = withField();
|
|
203
|
+
input.props = {
|
|
204
|
+
latex: '\\longdiv{5}'
|
|
205
|
+
};
|
|
206
|
+
input.componentDidUpdate({
|
|
207
|
+
latex: ''
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// must become native \enclose so the content stays editable
|
|
211
|
+
expect(input.mathField.value).toEqual('\\enclose{longdiv}{5}');
|
|
212
|
+
});
|
|
213
|
+
it('toggles readOnly', function () {
|
|
214
|
+
var input = withField();
|
|
215
|
+
input.props = {
|
|
216
|
+
readOnly: true
|
|
217
|
+
};
|
|
218
|
+
input.componentDidUpdate({
|
|
219
|
+
readOnly: false
|
|
220
|
+
});
|
|
221
|
+
expect(input.mathField.readOnly).toBe(true);
|
|
222
|
+
});
|
|
223
|
+
it('clear() empties the field', function () {
|
|
224
|
+
var input = withField();
|
|
225
|
+
input.mathField.value = 'abc';
|
|
226
|
+
expect(input.clear()).toEqual('');
|
|
227
|
+
expect(input.mathField.value).toEqual('');
|
|
228
|
+
});
|
|
229
|
+
it('suppresses Enter so it cannot insert a line break', function () {
|
|
230
|
+
var input = withField();
|
|
231
|
+
var preventDefault = jest.fn();
|
|
232
|
+
input.onKeyDown({
|
|
233
|
+
key: 'Enter',
|
|
234
|
+
preventDefault: preventDefault
|
|
235
|
+
});
|
|
236
|
+
expect(preventDefault).toHaveBeenCalled();
|
|
237
|
+
preventDefault.mockClear();
|
|
238
|
+
input.onKeyDown({
|
|
239
|
+
key: 'a',
|
|
240
|
+
preventDefault: preventDefault
|
|
241
|
+
});
|
|
242
|
+
expect(preventDefault).not.toHaveBeenCalled();
|
|
243
|
+
});
|
|
244
|
+
it('componentDidUpdate is safe before the field exists', function () {
|
|
245
|
+
var input = new _input["default"]({
|
|
246
|
+
latex: 'x'
|
|
247
|
+
});
|
|
248
|
+
expect(function () {
|
|
249
|
+
return input.componentDidUpdate({
|
|
250
|
+
latex: ''
|
|
251
|
+
});
|
|
252
|
+
}).not.toThrow();
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
//# sourceMappingURL=composites.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composites.test.js","names":["_react","_interopRequireDefault","require","_react2","_mathInput","_horizontalKeypad","_input","describe","withInput","mi","MathInput","calls","write","keystroke","input","v","push","it","_withInput","keypadPress","latex","expect","toEqual","_withInput2","command","_withInput3","_withInput4","not","toThrow","onChange","jest","fn","changeLatex","toHaveBeenCalled","toHaveBeenCalledWith","setState","s","Object","assign","state","inputFocus","focused","toBe","inputBlur","pressed","key","onClick","hk","HorizontalKeypad","mock","value","type","render","createElement","withField","Input","mathField","getValue","insert","executeCommand","focus","blur","addEventListener","removeEventListener","remove","props","onInputEdit","lastEmitted","componentDidUpdate","readOnly","clear","preventDefault","onKeyDown","mockClear"],"sources":["../../src/__tests__/composites.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport MathInput from '../math-input';\nimport HorizontalKeypad from '../horizontal-keypad';\nimport Input from '../mf/input';\n\n/**\n * The pieces that sit between the keypad and the field: how a pressed key is\n * routed into the field, and the legacy `{value,type}` shape math-toolbar\n * consumes.\n */\ndescribe('MathInput.keypadPress routing', () => {\n const withInput = () => {\n const mi = new MathInput({});\n const calls = { write: [], keystroke: [] };\n\n mi.input = {\n write: (v) => calls.write.push(v),\n keystroke: (v) => calls.keystroke.push(v),\n };\n\n return { mi, calls };\n };\n\n it('routes an insert action to write()', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({ latex: '\\\\pi' });\n\n expect(calls.write).toEqual(['\\\\pi']);\n expect(calls.keystroke).toEqual([]);\n });\n\n it('expands an argument-taking command before writing', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({ command: '\\\\frac' });\n\n expect(calls.write).toEqual(['\\\\frac{#?}{#?}']);\n });\n\n it('routes a cursor keystroke to keystroke()', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({ keystroke: 'Left' });\n\n expect(calls.keystroke).toEqual(['moveToPreviousChar']);\n expect(calls.write).toEqual([]);\n });\n\n it('ignores keys with no action', () => {\n const { mi, calls } = withInput();\n\n mi.keypadPress({});\n mi.keypadPress({ keystroke: 'Nonsense' });\n\n expect(calls.write).toEqual([]);\n expect(calls.keystroke).toEqual([]);\n });\n\n it('is a no-op before the field ref exists', () => {\n const mi = new MathInput({});\n\n expect(() => mi.keypadPress({ latex: '\\\\pi' })).not.toThrow();\n });\n\n it('changeLatex only fires onChange when the value differs', () => {\n const onChange = jest.fn();\n const mi = new MathInput({ latex: 'x', onChange });\n\n mi.changeLatex('x');\n expect(onChange).not.toHaveBeenCalled();\n\n mi.changeLatex('y');\n expect(onChange).toHaveBeenCalledWith('y');\n });\n\n it('tracks focus state', () => {\n const mi = new MathInput({});\n\n mi.setState = (s) => Object.assign(mi.state, s);\n mi.inputFocus();\n expect(mi.state.focused).toBe(true);\n\n mi.inputBlur();\n expect(mi.state.focused).toBe(false);\n });\n});\n\ndescribe('HorizontalKeypad legacy {value,type} model', () => {\n const pressed = (key) => {\n const onClick = jest.fn();\n const hk = new HorizontalKeypad({ onClick });\n\n hk.keypadPress(key);\n\n return onClick.mock.calls[0][0];\n };\n\n it('maps a command to {value, type: command}', () => {\n expect(pressed({ command: '\\\\frac' })).toEqual({ value: '\\\\frac', type: 'command' });\n });\n\n it('maps a write to {value}', () => {\n expect(pressed({ write: 'x' })).toEqual({ value: 'x' });\n });\n\n it('maps a keystroke to {type: cursor}', () => {\n expect(pressed({ keystroke: 'Left' })).toEqual({ type: 'cursor', value: 'Left' });\n });\n\n it('renders without throwing', () => {\n expect(() => render(<HorizontalKeypad onClick={() => {}} />)).not.toThrow();\n });\n});\n\ndescribe('Input: controlled-value sync and events', () => {\n const withField = () => {\n const input = new Input({});\n\n input.mathField = {\n value: '',\n getValue: () => input.mathField.value,\n insert(v) {\n input.mathField.value += v;\n },\n executeCommand() {},\n focus() {},\n blur() {},\n addEventListener() {},\n removeEventListener() {},\n remove() {},\n };\n\n return input;\n };\n\n it('emits stored-form latex on edit', () => {\n const onChange = jest.fn();\n const input = withField();\n\n input.props = { onChange };\n input.mathField.value = '\\\\longdiv{\\\\placeholder{}}';\n input.onInputEdit();\n\n // \\placeholder is MathLive-internal and must not reach the model\n expect(onChange).toHaveBeenCalledWith('\\\\longdiv{}');\n expect(input.lastEmitted).toEqual('\\\\longdiv{}');\n });\n\n it('does not push a prop echo back into the field', () => {\n const input = withField();\n\n input.mathField.value = 'x';\n input.lastEmitted = 'x';\n input.props = { latex: 'x' };\n\n input.componentDidUpdate({ latex: '' });\n\n expect(input.mathField.value).toEqual('x');\n });\n\n it('pushes a genuinely new latex prop into the field', () => {\n const input = withField();\n\n input.mathField.value = 'x';\n input.lastEmitted = 'x';\n input.props = { latex: 'y' };\n\n input.componentDidUpdate({ latex: 'x' });\n\n expect(input.mathField.value).toEqual('y');\n });\n\n it('bridges stored latex on the way in', () => {\n const input = withField();\n\n input.props = { latex: '\\\\longdiv{5}' };\n input.componentDidUpdate({ latex: '' });\n\n // must become native \\enclose so the content stays editable\n expect(input.mathField.value).toEqual('\\\\enclose{longdiv}{5}');\n });\n\n it('toggles readOnly', () => {\n const input = withField();\n\n input.props = { readOnly: true };\n input.componentDidUpdate({ readOnly: false });\n\n expect(input.mathField.readOnly).toBe(true);\n });\n\n it('clear() empties the field', () => {\n const input = withField();\n\n input.mathField.value = 'abc';\n expect(input.clear()).toEqual('');\n expect(input.mathField.value).toEqual('');\n });\n\n it('suppresses Enter so it cannot insert a line break', () => {\n const input = withField();\n const preventDefault = jest.fn();\n\n input.onKeyDown({ key: 'Enter', preventDefault });\n expect(preventDefault).toHaveBeenCalled();\n\n preventDefault.mockClear();\n input.onKeyDown({ key: 'a', preventDefault });\n expect(preventDefault).not.toHaveBeenCalled();\n });\n\n it('componentDidUpdate is safe before the field exists', () => {\n const input = new Input({ latex: 'x' });\n\n expect(() => input.componentDidUpdate({ latex: '' })).not.toThrow();\n });\n});\n"],"mappings":";;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,iBAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,MAAA,GAAAL,sBAAA,CAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACAK,QAAQ,CAAC,+BAA+B,EAAE,YAAM;EAC9C,IAAMC,SAAS,GAAG,SAAZA,SAASA,CAAA,EAAS;IACtB,IAAMC,EAAE,GAAG,IAAIC,qBAAS,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAMC,KAAK,GAAG;MAAEC,KAAK,EAAE,EAAE;MAAEC,SAAS,EAAE;IAAG,CAAC;IAE1CJ,EAAE,CAACK,KAAK,GAAG;MACTF,KAAK,EAAE,SAAPA,KAAKA,CAAGG,CAAC;QAAA,OAAKJ,KAAK,CAACC,KAAK,CAACI,IAAI,CAACD,CAAC,CAAC;MAAA;MACjCF,SAAS,EAAE,SAAXA,SAASA,CAAGE,CAAC;QAAA,OAAKJ,KAAK,CAACE,SAAS,CAACG,IAAI,CAACD,CAAC,CAAC;MAAA;IAC3C,CAAC;IAED,OAAO;MAAEN,EAAE,EAAFA,EAAE;MAAEE,KAAK,EAALA;IAAM,CAAC;EACtB,CAAC;EAEDM,EAAE,CAAC,oCAAoC,EAAE,YAAM;IAC7C,IAAAC,UAAA,GAAsBV,SAAS,CAAC,CAAC;MAAzBC,EAAE,GAAAS,UAAA,CAAFT,EAAE;MAAEE,KAAK,GAAAO,UAAA,CAALP,KAAK;IAEjBF,EAAE,CAACU,WAAW,CAAC;MAAEC,KAAK,EAAE;IAAO,CAAC,CAAC;IAEjCC,MAAM,CAACV,KAAK,CAACC,KAAK,CAAC,CAACU,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;IACrCD,MAAM,CAACV,KAAK,CAACE,SAAS,CAAC,CAACS,OAAO,CAAC,EAAE,CAAC;EACrC,CAAC,CAAC;EAEFL,EAAE,CAAC,mDAAmD,EAAE,YAAM;IAC5D,IAAAM,WAAA,GAAsBf,SAAS,CAAC,CAAC;MAAzBC,EAAE,GAAAc,WAAA,CAAFd,EAAE;MAAEE,KAAK,GAAAY,WAAA,CAALZ,KAAK;IAEjBF,EAAE,CAACU,WAAW,CAAC;MAAEK,OAAO,EAAE;IAAS,CAAC,CAAC;IAErCH,MAAM,CAACV,KAAK,CAACC,KAAK,CAAC,CAACU,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAAC;EACjD,CAAC,CAAC;EAEFL,EAAE,CAAC,0CAA0C,EAAE,YAAM;IACnD,IAAAQ,WAAA,GAAsBjB,SAAS,CAAC,CAAC;MAAzBC,EAAE,GAAAgB,WAAA,CAAFhB,EAAE;MAAEE,KAAK,GAAAc,WAAA,CAALd,KAAK;IAEjBF,EAAE,CAACU,WAAW,CAAC;MAAEN,SAAS,EAAE;IAAO,CAAC,CAAC;IAErCQ,MAAM,CAACV,KAAK,CAACE,SAAS,CAAC,CAACS,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACvDD,MAAM,CAACV,KAAK,CAACC,KAAK,CAAC,CAACU,OAAO,CAAC,EAAE,CAAC;EACjC,CAAC,CAAC;EAEFL,EAAE,CAAC,6BAA6B,EAAE,YAAM;IACtC,IAAAS,WAAA,GAAsBlB,SAAS,CAAC,CAAC;MAAzBC,EAAE,GAAAiB,WAAA,CAAFjB,EAAE;MAAEE,KAAK,GAAAe,WAAA,CAALf,KAAK;IAEjBF,EAAE,CAACU,WAAW,CAAC,CAAC,CAAC,CAAC;IAClBV,EAAE,CAACU,WAAW,CAAC;MAAEN,SAAS,EAAE;IAAW,CAAC,CAAC;IAEzCQ,MAAM,CAACV,KAAK,CAACC,KAAK,CAAC,CAACU,OAAO,CAAC,EAAE,CAAC;IAC/BD,MAAM,CAACV,KAAK,CAACE,SAAS,CAAC,CAACS,OAAO,CAAC,EAAE,CAAC;EACrC,CAAC,CAAC;EAEFL,EAAE,CAAC,wCAAwC,EAAE,YAAM;IACjD,IAAMR,EAAE,GAAG,IAAIC,qBAAS,CAAC,CAAC,CAAC,CAAC;IAE5BW,MAAM,CAAC;MAAA,OAAMZ,EAAE,CAACU,WAAW,CAAC;QAAEC,KAAK,EAAE;MAAO,CAAC,CAAC;IAAA,EAAC,CAACO,GAAG,CAACC,OAAO,CAAC,CAAC;EAC/D,CAAC,CAAC;EAEFX,EAAE,CAAC,wDAAwD,EAAE,YAAM;IACjE,IAAMY,QAAQ,GAAGC,IAAI,CAACC,EAAE,CAAC,CAAC;IAC1B,IAAMtB,EAAE,GAAG,IAAIC,qBAAS,CAAC;MAAEU,KAAK,EAAE,GAAG;MAAES,QAAQ,EAARA;IAAS,CAAC,CAAC;IAElDpB,EAAE,CAACuB,WAAW,CAAC,GAAG,CAAC;IACnBX,MAAM,CAACQ,QAAQ,CAAC,CAACF,GAAG,CAACM,gBAAgB,CAAC,CAAC;IAEvCxB,EAAE,CAACuB,WAAW,CAAC,GAAG,CAAC;IACnBX,MAAM,CAACQ,QAAQ,CAAC,CAACK,oBAAoB,CAAC,GAAG,CAAC;EAC5C,CAAC,CAAC;EAEFjB,EAAE,CAAC,oBAAoB,EAAE,YAAM;IAC7B,IAAMR,EAAE,GAAG,IAAIC,qBAAS,CAAC,CAAC,CAAC,CAAC;IAE5BD,EAAE,CAAC0B,QAAQ,GAAG,UAACC,CAAC;MAAA,OAAKC,MAAM,CAACC,MAAM,CAAC7B,EAAE,CAAC8B,KAAK,EAAEH,CAAC,CAAC;IAAA;IAC/C3B,EAAE,CAAC+B,UAAU,CAAC,CAAC;IACfnB,MAAM,CAACZ,EAAE,CAAC8B,KAAK,CAACE,OAAO,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;IAEnCjC,EAAE,CAACkC,SAAS,CAAC,CAAC;IACdtB,MAAM,CAACZ,EAAE,CAAC8B,KAAK,CAACE,OAAO,CAAC,CAACC,IAAI,CAAC,KAAK,CAAC;EACtC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFnC,QAAQ,CAAC,4CAA4C,EAAE,YAAM;EAC3D,IAAMqC,OAAO,GAAG,SAAVA,OAAOA,CAAIC,GAAG,EAAK;IACvB,IAAMC,OAAO,GAAGhB,IAAI,CAACC,EAAE,CAAC,CAAC;IACzB,IAAMgB,EAAE,GAAG,IAAIC,4BAAgB,CAAC;MAAEF,OAAO,EAAPA;IAAQ,CAAC,CAAC;IAE5CC,EAAE,CAAC5B,WAAW,CAAC0B,GAAG,CAAC;IAEnB,OAAOC,OAAO,CAACG,IAAI,CAACtC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EACjC,CAAC;EAEDM,EAAE,CAAC,0CAA0C,EAAE,YAAM;IACnDI,MAAM,CAACuB,OAAO,CAAC;MAAEpB,OAAO,EAAE;IAAS,CAAC,CAAC,CAAC,CAACF,OAAO,CAAC;MAAE4B,KAAK,EAAE,QAAQ;MAAEC,IAAI,EAAE;IAAU,CAAC,CAAC;EACtF,CAAC,CAAC;EAEFlC,EAAE,CAAC,yBAAyB,EAAE,YAAM;IAClCI,MAAM,CAACuB,OAAO,CAAC;MAAEhC,KAAK,EAAE;IAAI,CAAC,CAAC,CAAC,CAACU,OAAO,CAAC;MAAE4B,KAAK,EAAE;IAAI,CAAC,CAAC;EACzD,CAAC,CAAC;EAEFjC,EAAE,CAAC,oCAAoC,EAAE,YAAM;IAC7CI,MAAM,CAACuB,OAAO,CAAC;MAAE/B,SAAS,EAAE;IAAO,CAAC,CAAC,CAAC,CAACS,OAAO,CAAC;MAAE6B,IAAI,EAAE,QAAQ;MAAED,KAAK,EAAE;IAAO,CAAC,CAAC;EACnF,CAAC,CAAC;EAEFjC,EAAE,CAAC,0BAA0B,EAAE,YAAM;IACnCI,MAAM,CAAC;MAAA,OAAM,IAAA+B,cAAM,eAACpD,MAAA,YAAAqD,aAAA,CAAChD,iBAAA,WAAgB;QAACyC,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC;MAAE,CAAE,CAAC,CAAC;IAAA,EAAC,CAACnB,GAAG,CAACC,OAAO,CAAC,CAAC;EAC7E,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFrB,QAAQ,CAAC,yCAAyC,EAAE,YAAM;EACxD,IAAM+C,SAAS,GAAG,SAAZA,SAASA,CAAA,EAAS;IACtB,IAAMxC,KAAK,GAAG,IAAIyC,iBAAK,CAAC,CAAC,CAAC,CAAC;IAE3BzC,KAAK,CAAC0C,SAAS,GAAG;MAChBN,KAAK,EAAE,EAAE;MACTO,QAAQ,EAAE,SAAVA,QAAQA,CAAA;QAAA,OAAQ3C,KAAK,CAAC0C,SAAS,CAACN,KAAK;MAAA;MACrCQ,MAAM,WAANA,MAAMA,CAAC3C,CAAC,EAAE;QACRD,KAAK,CAAC0C,SAAS,CAACN,KAAK,IAAInC,CAAC;MAC5B,CAAC;MACD4C,cAAc,WAAdA,cAAcA,CAAA,EAAG,CAAC,CAAC;MACnBC,KAAK,WAALA,KAAKA,CAAA,EAAG,CAAC,CAAC;MACVC,IAAI,WAAJA,IAAIA,CAAA,EAAG,CAAC,CAAC;MACTC,gBAAgB,WAAhBA,gBAAgBA,CAAA,EAAG,CAAC,CAAC;MACrBC,mBAAmB,WAAnBA,mBAAmBA,CAAA,EAAG,CAAC,CAAC;MACxBC,MAAM,WAANA,MAAMA,CAAA,EAAG,CAAC;IACZ,CAAC;IAED,OAAOlD,KAAK;EACd,CAAC;EAEDG,EAAE,CAAC,iCAAiC,EAAE,YAAM;IAC1C,IAAMY,QAAQ,GAAGC,IAAI,CAACC,EAAE,CAAC,CAAC;IAC1B,IAAMjB,KAAK,GAAGwC,SAAS,CAAC,CAAC;IAEzBxC,KAAK,CAACmD,KAAK,GAAG;MAAEpC,QAAQ,EAARA;IAAS,CAAC;IAC1Bf,KAAK,CAAC0C,SAAS,CAACN,KAAK,GAAG,4BAA4B;IACpDpC,KAAK,CAACoD,WAAW,CAAC,CAAC;;IAEnB;IACA7C,MAAM,CAACQ,QAAQ,CAAC,CAACK,oBAAoB,CAAC,aAAa,CAAC;IACpDb,MAAM,CAACP,KAAK,CAACqD,WAAW,CAAC,CAAC7C,OAAO,CAAC,aAAa,CAAC;EAClD,CAAC,CAAC;EAEFL,EAAE,CAAC,+CAA+C,EAAE,YAAM;IACxD,IAAMH,KAAK,GAAGwC,SAAS,CAAC,CAAC;IAEzBxC,KAAK,CAAC0C,SAAS,CAACN,KAAK,GAAG,GAAG;IAC3BpC,KAAK,CAACqD,WAAW,GAAG,GAAG;IACvBrD,KAAK,CAACmD,KAAK,GAAG;MAAE7C,KAAK,EAAE;IAAI,CAAC;IAE5BN,KAAK,CAACsD,kBAAkB,CAAC;MAAEhD,KAAK,EAAE;IAAG,CAAC,CAAC;IAEvCC,MAAM,CAACP,KAAK,CAAC0C,SAAS,CAACN,KAAK,CAAC,CAAC5B,OAAO,CAAC,GAAG,CAAC;EAC5C,CAAC,CAAC;EAEFL,EAAE,CAAC,kDAAkD,EAAE,YAAM;IAC3D,IAAMH,KAAK,GAAGwC,SAAS,CAAC,CAAC;IAEzBxC,KAAK,CAAC0C,SAAS,CAACN,KAAK,GAAG,GAAG;IAC3BpC,KAAK,CAACqD,WAAW,GAAG,GAAG;IACvBrD,KAAK,CAACmD,KAAK,GAAG;MAAE7C,KAAK,EAAE;IAAI,CAAC;IAE5BN,KAAK,CAACsD,kBAAkB,CAAC;MAAEhD,KAAK,EAAE;IAAI,CAAC,CAAC;IAExCC,MAAM,CAACP,KAAK,CAAC0C,SAAS,CAACN,KAAK,CAAC,CAAC5B,OAAO,CAAC,GAAG,CAAC;EAC5C,CAAC,CAAC;EAEFL,EAAE,CAAC,oCAAoC,EAAE,YAAM;IAC7C,IAAMH,KAAK,GAAGwC,SAAS,CAAC,CAAC;IAEzBxC,KAAK,CAACmD,KAAK,GAAG;MAAE7C,KAAK,EAAE;IAAe,CAAC;IACvCN,KAAK,CAACsD,kBAAkB,CAAC;MAAEhD,KAAK,EAAE;IAAG,CAAC,CAAC;;IAEvC;IACAC,MAAM,CAACP,KAAK,CAAC0C,SAAS,CAACN,KAAK,CAAC,CAAC5B,OAAO,CAAC,uBAAuB,CAAC;EAChE,CAAC,CAAC;EAEFL,EAAE,CAAC,kBAAkB,EAAE,YAAM;IAC3B,IAAMH,KAAK,GAAGwC,SAAS,CAAC,CAAC;IAEzBxC,KAAK,CAACmD,KAAK,GAAG;MAAEI,QAAQ,EAAE;IAAK,CAAC;IAChCvD,KAAK,CAACsD,kBAAkB,CAAC;MAAEC,QAAQ,EAAE;IAAM,CAAC,CAAC;IAE7ChD,MAAM,CAACP,KAAK,CAAC0C,SAAS,CAACa,QAAQ,CAAC,CAAC3B,IAAI,CAAC,IAAI,CAAC;EAC7C,CAAC,CAAC;EAEFzB,EAAE,CAAC,2BAA2B,EAAE,YAAM;IACpC,IAAMH,KAAK,GAAGwC,SAAS,CAAC,CAAC;IAEzBxC,KAAK,CAAC0C,SAAS,CAACN,KAAK,GAAG,KAAK;IAC7B7B,MAAM,CAACP,KAAK,CAACwD,KAAK,CAAC,CAAC,CAAC,CAAChD,OAAO,CAAC,EAAE,CAAC;IACjCD,MAAM,CAACP,KAAK,CAAC0C,SAAS,CAACN,KAAK,CAAC,CAAC5B,OAAO,CAAC,EAAE,CAAC;EAC3C,CAAC,CAAC;EAEFL,EAAE,CAAC,mDAAmD,EAAE,YAAM;IAC5D,IAAMH,KAAK,GAAGwC,SAAS,CAAC,CAAC;IACzB,IAAMiB,cAAc,GAAGzC,IAAI,CAACC,EAAE,CAAC,CAAC;IAEhCjB,KAAK,CAAC0D,SAAS,CAAC;MAAE3B,GAAG,EAAE,OAAO;MAAE0B,cAAc,EAAdA;IAAe,CAAC,CAAC;IACjDlD,MAAM,CAACkD,cAAc,CAAC,CAACtC,gBAAgB,CAAC,CAAC;IAEzCsC,cAAc,CAACE,SAAS,CAAC,CAAC;IAC1B3D,KAAK,CAAC0D,SAAS,CAAC;MAAE3B,GAAG,EAAE,GAAG;MAAE0B,cAAc,EAAdA;IAAe,CAAC,CAAC;IAC7ClD,MAAM,CAACkD,cAAc,CAAC,CAAC5C,GAAG,CAACM,gBAAgB,CAAC,CAAC;EAC/C,CAAC,CAAC;EAEFhB,EAAE,CAAC,oDAAoD,EAAE,YAAM;IAC7D,IAAMH,KAAK,GAAG,IAAIyC,iBAAK,CAAC;MAAEnC,KAAK,EAAE;IAAI,CAAC,CAAC;IAEvCC,MAAM,CAAC;MAAA,OAAMP,KAAK,CAACsD,kBAAkB,CAAC;QAAEhD,KAAK,EAAE;MAAG,CAAC,CAAC;IAAA,EAAC,CAACO,GAAG,CAACC,OAAO,CAAC,CAAC;EACrE,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
|
+
var _react = _interopRequireDefault(require("react"));
|
|
6
|
+
var _react2 = require("@testing-library/react");
|
|
7
|
+
var _styles = require("@mui/material/styles");
|
|
8
|
+
var _index = require("../index");
|
|
9
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
10
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
11
|
+
/**
|
|
12
|
+
* Exercises the exact call patterns real consumers use against
|
|
13
|
+
* @pie-lib/math-input, to catch drop-in incompatibilities.
|
|
14
|
+
*
|
|
15
|
+
* Sources:
|
|
16
|
+
* - packages/math-toolbar/src/editor-and-pad.jsx:16,185
|
|
17
|
+
* - packages/math-toolbar/src/math-preview.jsx:8,156
|
|
18
|
+
* - packages/editable-html/src/plugins/respArea/math-templated/index.jsx:92
|
|
19
|
+
* - packages/editable-html-tip-tap/src/components/respArea/MathTemplated.jsx:111
|
|
20
|
+
*/
|
|
21
|
+
describe('drop-in compatibility with @pie-lib/math-input consumers', function () {
|
|
22
|
+
describe('mq.CommonMqStyles destructuring', function () {
|
|
23
|
+
it('math-preview.jsx: { commonMqFontStyles, longdivStyles, supsubStyles }', function () {
|
|
24
|
+
var _mq$CommonMqStyles = _index.mq.CommonMqStyles,
|
|
25
|
+
commonMqFontStyles = _mq$CommonMqStyles.commonMqFontStyles,
|
|
26
|
+
longdivStyles = _mq$CommonMqStyles.longdivStyles,
|
|
27
|
+
supsubStyles = _mq$CommonMqStyles.supsubStyles;
|
|
28
|
+
expect(commonMqFontStyles).toBeDefined();
|
|
29
|
+
expect(longdivStyles).toBeDefined();
|
|
30
|
+
expect(supsubStyles).toBeDefined();
|
|
31
|
+
});
|
|
32
|
+
it('editor-and-pad.jsx: also { commonMqKeyboardStyles }', function () {
|
|
33
|
+
var _mq$CommonMqStyles2 = _index.mq.CommonMqStyles,
|
|
34
|
+
commonMqFontStyles = _mq$CommonMqStyles2.commonMqFontStyles,
|
|
35
|
+
commonMqKeyboardStyles = _mq$CommonMqStyles2.commonMqKeyboardStyles,
|
|
36
|
+
longdivStyles = _mq$CommonMqStyles2.longdivStyles,
|
|
37
|
+
supsubStyles = _mq$CommonMqStyles2.supsubStyles;
|
|
38
|
+
expect(commonMqKeyboardStyles).toBeDefined();
|
|
39
|
+
// All four must be spreadable into an emotion style object.
|
|
40
|
+
expect(function () {
|
|
41
|
+
return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, commonMqFontStyles), commonMqKeyboardStyles), longdivStyles), supsubStyles);
|
|
42
|
+
}).not.toThrow();
|
|
43
|
+
});
|
|
44
|
+
it('the destructured groups survive being spread into a styled component', function () {
|
|
45
|
+
var _mq$CommonMqStyles3 = _index.mq.CommonMqStyles,
|
|
46
|
+
commonMqFontStyles = _mq$CommonMqStyles3.commonMqFontStyles,
|
|
47
|
+
longdivStyles = _mq$CommonMqStyles3.longdivStyles,
|
|
48
|
+
supsubStyles = _mq$CommonMqStyles3.supsubStyles;
|
|
49
|
+
var Styled = (0, _styles.styled)('div')(_objectSpread(_objectSpread(_objectSpread({}, commonMqFontStyles), longdivStyles), supsubStyles));
|
|
50
|
+
expect(function () {
|
|
51
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(Styled, null));
|
|
52
|
+
}).not.toThrow();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('mq.Input', function () {
|
|
56
|
+
it('editor-and-pad.jsx: styled(mq.Input) renders', function () {
|
|
57
|
+
var MathEditor = (0, _styles.styled)(_index.mq.Input)(function () {
|
|
58
|
+
return {
|
|
59
|
+
width: '100%'
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
expect(function () {
|
|
63
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(MathEditor, {
|
|
64
|
+
latex: "\\\\frac{1}{2}",
|
|
65
|
+
onChange: function onChange() {}
|
|
66
|
+
}));
|
|
67
|
+
}).not.toThrow();
|
|
68
|
+
});
|
|
69
|
+
it('accepts the className that styled() injects', function () {
|
|
70
|
+
var Styled = (0, _styles.styled)(_index.mq.Input)({
|
|
71
|
+
padding: 4
|
|
72
|
+
});
|
|
73
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(Styled, {
|
|
74
|
+
latex: "x",
|
|
75
|
+
onChange: function onChange() {}
|
|
76
|
+
})),
|
|
77
|
+
container = _render.container;
|
|
78
|
+
expect(container.firstChild).toBeTruthy();
|
|
79
|
+
expect(container.firstChild.className).toBeTruthy();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('mq.Static', function () {
|
|
83
|
+
it('math-preview.jsx: <mq.Static latex onFocus onBlur />', function () {
|
|
84
|
+
expect(function () {
|
|
85
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mq.Static, {
|
|
86
|
+
latex: '\\frac{1}{2}',
|
|
87
|
+
onFocus: function onFocus() {},
|
|
88
|
+
onBlur: function onBlur() {}
|
|
89
|
+
}));
|
|
90
|
+
}).not.toThrow();
|
|
91
|
+
});
|
|
92
|
+
it('math-templated respArea: <mq.Static latex={value} />', function () {
|
|
93
|
+
expect(function () {
|
|
94
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mq.Static, {
|
|
95
|
+
latex: 'x=1'
|
|
96
|
+
}));
|
|
97
|
+
}).not.toThrow();
|
|
98
|
+
});
|
|
99
|
+
it('renders answer-block latex (the templated-math case) without throwing', function () {
|
|
100
|
+
expect(function () {
|
|
101
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mq.Static, {
|
|
102
|
+
latex: 'x=\\MathQuillMathField[r1]{}',
|
|
103
|
+
onSubFieldChange: function onSubFieldChange() {}
|
|
104
|
+
}));
|
|
105
|
+
}).not.toThrow();
|
|
106
|
+
});
|
|
107
|
+
it('is styleable, as keypad labels were in math-input', function () {
|
|
108
|
+
var Styled = (0, _styles.styled)(_index.mq.Static)({
|
|
109
|
+
pointerEvents: 'none'
|
|
110
|
+
});
|
|
111
|
+
expect(function () {
|
|
112
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(Styled, {
|
|
113
|
+
latex: '\\pi'
|
|
114
|
+
}));
|
|
115
|
+
}).not.toThrow();
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('surface parity', function () {
|
|
119
|
+
it('exposes exactly the names math-input exported', function () {
|
|
120
|
+
// eslint-disable-next-line global-require
|
|
121
|
+
var pkg = require('../index');
|
|
122
|
+
['keysForGrade', 'addBrackets', 'removeBrackets', 'keys', 'HorizontalKeypad', 'mq', 'updateSpans', 'registerEmbed', 'applyStaticMath'].forEach(function (name) {
|
|
123
|
+
expect(pkg[name]).toBeDefined();
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
it('mq exposes Input, Static and CommonMqStyles', function () {
|
|
127
|
+
['Input', 'Static', 'CommonMqStyles'].forEach(function (name) {
|
|
128
|
+
expect(_index.mq[name]).toBeDefined();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=drop-in-compat.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drop-in-compat.test.js","names":["_react","_interopRequireDefault","require","_react2","_styles","_index","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","describe","it","_mq$CommonMqStyles","mq","CommonMqStyles","commonMqFontStyles","longdivStyles","supsubStyles","expect","toBeDefined","_mq$CommonMqStyles2","commonMqKeyboardStyles","not","toThrow","_mq$CommonMqStyles3","Styled","styled","render","createElement","MathEditor","Input","width","latex","onChange","padding","_render","container","firstChild","toBeTruthy","className","Static","onFocus","onBlur","onSubFieldChange","pointerEvents","pkg","name"],"sources":["../../src/__tests__/drop-in-compat.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\nimport { styled } from '@mui/material/styles';\n\nimport { mq } from '../index';\n\n/**\n * Exercises the exact call patterns real consumers use against\n * @pie-lib/math-input, to catch drop-in incompatibilities.\n *\n * Sources:\n * - packages/math-toolbar/src/editor-and-pad.jsx:16,185\n * - packages/math-toolbar/src/math-preview.jsx:8,156\n * - packages/editable-html/src/plugins/respArea/math-templated/index.jsx:92\n * - packages/editable-html-tip-tap/src/components/respArea/MathTemplated.jsx:111\n */\ndescribe('drop-in compatibility with @pie-lib/math-input consumers', () => {\n describe('mq.CommonMqStyles destructuring', () => {\n it('math-preview.jsx: { commonMqFontStyles, longdivStyles, supsubStyles }', () => {\n const { commonMqFontStyles, longdivStyles, supsubStyles } = mq.CommonMqStyles;\n\n expect(commonMqFontStyles).toBeDefined();\n expect(longdivStyles).toBeDefined();\n expect(supsubStyles).toBeDefined();\n });\n\n it('editor-and-pad.jsx: also { commonMqKeyboardStyles }', () => {\n const { commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles } = mq.CommonMqStyles;\n\n expect(commonMqKeyboardStyles).toBeDefined();\n // All four must be spreadable into an emotion style object.\n expect(() => ({\n ...commonMqFontStyles,\n ...commonMqKeyboardStyles,\n ...longdivStyles,\n ...supsubStyles,\n })).not.toThrow();\n });\n\n it('the destructured groups survive being spread into a styled component', () => {\n const { commonMqFontStyles, longdivStyles, supsubStyles } = mq.CommonMqStyles;\n const Styled = styled('div')({ ...commonMqFontStyles, ...longdivStyles, ...supsubStyles });\n\n expect(() => render(<Styled />)).not.toThrow();\n });\n });\n\n describe('mq.Input', () => {\n it('editor-and-pad.jsx: styled(mq.Input) renders', () => {\n const MathEditor = styled(mq.Input)(() => ({ width: '100%' }));\n\n expect(() => render(<MathEditor latex=\"\\\\frac{1}{2}\" onChange={() => {}} />)).not.toThrow();\n });\n\n it('accepts the className that styled() injects', () => {\n const Styled = styled(mq.Input)({ padding: 4 });\n const { container } = render(<Styled latex=\"x\" onChange={() => {}} />);\n\n expect(container.firstChild).toBeTruthy();\n expect(container.firstChild.className).toBeTruthy();\n });\n });\n\n describe('mq.Static', () => {\n it('math-preview.jsx: <mq.Static latex onFocus onBlur />', () => {\n expect(() => render(<mq.Static latex={'\\\\frac{1}{2}'} onFocus={() => {}} onBlur={() => {}} />)).not.toThrow();\n });\n\n it('math-templated respArea: <mq.Static latex={value} />', () => {\n expect(() => render(<mq.Static latex={'x=1'} />)).not.toThrow();\n });\n\n it('renders answer-block latex (the templated-math case) without throwing', () => {\n expect(() =>\n render(<mq.Static latex={'x=\\\\MathQuillMathField[r1]{}'} onSubFieldChange={() => {}} />),\n ).not.toThrow();\n });\n\n it('is styleable, as keypad labels were in math-input', () => {\n const Styled = styled(mq.Static)({ pointerEvents: 'none' });\n\n expect(() => render(<Styled latex={'\\\\pi'} />)).not.toThrow();\n });\n });\n\n describe('surface parity', () => {\n it('exposes exactly the names math-input exported', () => {\n // eslint-disable-next-line global-require\n const pkg = require('../index');\n\n [\n 'keysForGrade',\n 'addBrackets',\n 'removeBrackets',\n 'keys',\n 'HorizontalKeypad',\n 'mq',\n 'updateSpans',\n 'registerEmbed',\n 'applyStaticMath',\n ].forEach((name) => {\n expect(pkg[name]).toBeDefined();\n });\n });\n\n it('mq exposes Input, Static and CommonMqStyles', () => {\n ['Input', 'Static', 'CommonMqStyles'].forEach((name) => {\n expect(mq[name]).toBeDefined();\n });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
5
|
+
var _react = _interopRequireDefault(require("react"));
|
|
6
|
+
var _react2 = require("@testing-library/react");
|
|
7
|
+
var _index = require("../index");
|
|
8
|
+
describe('math-input-mathlive public API', function () {
|
|
9
|
+
it('mirrors the @pie-lib/math-input export surface', function () {
|
|
10
|
+
expect((0, _typeof2["default"])(_index.keysForGrade)).toBe('function');
|
|
11
|
+
expect((0, _typeof2["default"])(_index.addBrackets)).toBe('function');
|
|
12
|
+
expect((0, _typeof2["default"])(_index.removeBrackets)).toBe('function');
|
|
13
|
+
expect((0, _typeof2["default"])(_index.registerEmbed)).toBe('function');
|
|
14
|
+
expect((0, _typeof2["default"])(_index.applyStaticMath)).toBe('function');
|
|
15
|
+
expect((0, _typeof2["default"])(_index.updateSpans)).toBe('function');
|
|
16
|
+
expect(_index.keys).toBeDefined();
|
|
17
|
+
expect(_index.keys.baseSet).toBeDefined();
|
|
18
|
+
});
|
|
19
|
+
it('exports the field wrappers under both mf and mq', function () {
|
|
20
|
+
expect(_index.mf.Input).toBeDefined();
|
|
21
|
+
expect(_index.mf.Static).toBeDefined();
|
|
22
|
+
// `mq` alias lets a consumer swap packages by changing only the import.
|
|
23
|
+
expect(_index.mq).toBe(_index.mf);
|
|
24
|
+
});
|
|
25
|
+
it('updateSpans is a safe no-op', function () {
|
|
26
|
+
expect(function () {
|
|
27
|
+
return (0, _index.updateSpans)();
|
|
28
|
+
}).not.toThrow();
|
|
29
|
+
});
|
|
30
|
+
it('CommonMqStyles keeps the shape consumers destructure', function () {
|
|
31
|
+
// math-toolbar does:
|
|
32
|
+
// const { commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles }
|
|
33
|
+
// = mq.CommonMqStyles;
|
|
34
|
+
var _mf$CommonMqStyles = _index.mf.CommonMqStyles,
|
|
35
|
+
commonMqFontStyles = _mf$CommonMqStyles.commonMqFontStyles,
|
|
36
|
+
commonMqKeyboardStyles = _mf$CommonMqStyles.commonMqKeyboardStyles,
|
|
37
|
+
longdivStyles = _mf$CommonMqStyles.longdivStyles,
|
|
38
|
+
supsubStyles = _mf$CommonMqStyles.supsubStyles;
|
|
39
|
+
[commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles].forEach(function (s) {
|
|
40
|
+
expect(s).toBeDefined();
|
|
41
|
+
expect((0, _typeof2["default"])(s)).toBe('object');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it('bracket helpers round-trip', function () {
|
|
45
|
+
expect((0, _index.addBrackets)('x')).toEqual('\\(x\\)');
|
|
46
|
+
expect((0, _index.removeBrackets)('\\(x\\)')).toEqual('x');
|
|
47
|
+
expect((0, _index.removeBrackets)((0, _index.addBrackets)('\\frac{1}{2}'))).toEqual('\\frac{1}{2}');
|
|
48
|
+
});
|
|
49
|
+
it('keysForGrade returns a 5-row keyset', function () {
|
|
50
|
+
var set = (0, _index.keysForGrade)('geometry');
|
|
51
|
+
expect(Array.isArray(set)).toBe(true);
|
|
52
|
+
expect(set.length).toBe(5);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('rendering', function () {
|
|
56
|
+
// MathLive is a browser-only custom element; loadMathLive() resolves async and
|
|
57
|
+
// is a no-op-ish under jsdom. These assert the components mount without
|
|
58
|
+
// throwing, which is what regressed most often in the MathQuill version.
|
|
59
|
+
it('KeyPad renders without a live MathLive instance', function () {
|
|
60
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.KeyPad, {
|
|
61
|
+
onPress: function onPress() {}
|
|
62
|
+
})),
|
|
63
|
+
container = _render.container;
|
|
64
|
+
expect(container.querySelectorAll('button').length).toBeGreaterThan(0);
|
|
65
|
+
});
|
|
66
|
+
it('KeyPad falls back to raw latex for labels before MathLive loads', function () {
|
|
67
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.KeyPad, {
|
|
68
|
+
onPress: function onPress() {},
|
|
69
|
+
baseSet: [[{
|
|
70
|
+
name: 'pi',
|
|
71
|
+
latex: '\\pi',
|
|
72
|
+
category: 'constants'
|
|
73
|
+
}]]
|
|
74
|
+
})),
|
|
75
|
+
container = _render2.container;
|
|
76
|
+
expect(container.textContent).toContain('\\pi');
|
|
77
|
+
});
|
|
78
|
+
it('KeyPad fires onPress with the key definition', function () {
|
|
79
|
+
var onPress = jest.fn();
|
|
80
|
+
var key = {
|
|
81
|
+
name: 'x',
|
|
82
|
+
label: 'x',
|
|
83
|
+
write: 'x',
|
|
84
|
+
category: 'vars'
|
|
85
|
+
};
|
|
86
|
+
var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.KeyPad, {
|
|
87
|
+
onPress: onPress,
|
|
88
|
+
baseSet: [[key]]
|
|
89
|
+
})),
|
|
90
|
+
container = _render3.container;
|
|
91
|
+
container.querySelector('button').click();
|
|
92
|
+
expect(onPress).toHaveBeenCalledWith(key);
|
|
93
|
+
});
|
|
94
|
+
it('MathInput mounts', function () {
|
|
95
|
+
expect(function () {
|
|
96
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.MathInput, {
|
|
97
|
+
latex: "\\\\frac{1}{2}",
|
|
98
|
+
onChange: function onChange() {}
|
|
99
|
+
}));
|
|
100
|
+
}).not.toThrow();
|
|
101
|
+
});
|
|
102
|
+
it('HorizontalKeypad mounts and reports the legacy {value,type} model', function () {
|
|
103
|
+
var onClick = jest.fn();
|
|
104
|
+
expect(function () {
|
|
105
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.HorizontalKeypad, {
|
|
106
|
+
onClick: onClick
|
|
107
|
+
}));
|
|
108
|
+
}).not.toThrow();
|
|
109
|
+
});
|
|
110
|
+
it('Static renders display-mode latex without a mathfield', function () {
|
|
111
|
+
expect(function () {
|
|
112
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_index.mf.Static, {
|
|
113
|
+
latex: "\\\\frac{1}{2}"
|
|
114
|
+
}));
|
|
115
|
+
}).not.toThrow();
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","names":["_react","_interopRequireDefault","require","_react2","_index","describe","it","expect","_typeof2","keysForGrade","toBe","addBrackets","removeBrackets","registerEmbed","applyStaticMath","updateSpans","keys","toBeDefined","baseSet","mf","Input","Static","mq","not","toThrow","_mf$CommonMqStyles","CommonMqStyles","commonMqFontStyles","commonMqKeyboardStyles","longdivStyles","supsubStyles","forEach","s","toEqual","set","Array","isArray","length","_render","render","createElement","KeyPad","onPress","container","querySelectorAll","toBeGreaterThan","_render2","name","latex","category","textContent","toContain","jest","fn","key","label","write","_render3","querySelector","click","toHaveBeenCalledWith","MathInput","onChange","onClick","HorizontalKeypad"],"sources":["../../src/__tests__/index.test.jsx"],"sourcesContent":["import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport {\n keys,\n keysForGrade,\n addBrackets,\n removeBrackets,\n registerEmbed,\n applyStaticMath,\n updateSpans,\n mf,\n mq,\n MathInput,\n HorizontalKeypad,\n KeyPad,\n} from '../index';\n\ndescribe('math-input-mathlive public API', () => {\n it('mirrors the @pie-lib/math-input export surface', () => {\n expect(typeof keysForGrade).toBe('function');\n expect(typeof addBrackets).toBe('function');\n expect(typeof removeBrackets).toBe('function');\n expect(typeof registerEmbed).toBe('function');\n expect(typeof applyStaticMath).toBe('function');\n expect(typeof updateSpans).toBe('function');\n expect(keys).toBeDefined();\n expect(keys.baseSet).toBeDefined();\n });\n\n it('exports the field wrappers under both mf and mq', () => {\n expect(mf.Input).toBeDefined();\n expect(mf.Static).toBeDefined();\n // `mq` alias lets a consumer swap packages by changing only the import.\n expect(mq).toBe(mf);\n });\n\n it('updateSpans is a safe no-op', () => {\n expect(() => updateSpans()).not.toThrow();\n });\n\n it('CommonMqStyles keeps the shape consumers destructure', () => {\n // math-toolbar does:\n // const { commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles }\n // = mq.CommonMqStyles;\n const { commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles } = mf.CommonMqStyles;\n\n [commonMqFontStyles, commonMqKeyboardStyles, longdivStyles, supsubStyles].forEach((s) => {\n expect(s).toBeDefined();\n expect(typeof s).toBe('object');\n });\n });\n\n it('bracket helpers round-trip', () => {\n expect(addBrackets('x')).toEqual('\\\\(x\\\\)');\n expect(removeBrackets('\\\\(x\\\\)')).toEqual('x');\n expect(removeBrackets(addBrackets('\\\\frac{1}{2}'))).toEqual('\\\\frac{1}{2}');\n });\n\n it('keysForGrade returns a 5-row keyset', () => {\n const set = keysForGrade('geometry');\n\n expect(Array.isArray(set)).toBe(true);\n expect(set.length).toBe(5);\n });\n});\n\ndescribe('rendering', () => {\n // MathLive is a browser-only custom element; loadMathLive() resolves async and\n // is a no-op-ish under jsdom. These assert the components mount without\n // throwing, which is what regressed most often in the MathQuill version.\n it('KeyPad renders without a live MathLive instance', () => {\n const { container } = render(<KeyPad onPress={() => {}} />);\n\n expect(container.querySelectorAll('button').length).toBeGreaterThan(0);\n });\n\n it('KeyPad falls back to raw latex for labels before MathLive loads', () => {\n const { container } = render(\n <KeyPad onPress={() => {}} baseSet={[[{ name: 'pi', latex: '\\\\pi', category: 'constants' }]]} />,\n );\n\n expect(container.textContent).toContain('\\\\pi');\n });\n\n it('KeyPad fires onPress with the key definition', () => {\n const onPress = jest.fn();\n const key = { name: 'x', label: 'x', write: 'x', category: 'vars' };\n const { container } = render(<KeyPad onPress={onPress} baseSet={[[key]]} />);\n\n container.querySelector('button').click();\n\n expect(onPress).toHaveBeenCalledWith(key);\n });\n\n it('MathInput mounts', () => {\n expect(() => render(<MathInput latex=\"\\\\frac{1}{2}\" onChange={() => {}} />)).not.toThrow();\n });\n\n it('HorizontalKeypad mounts and reports the legacy {value,type} model', () => {\n const onClick = jest.fn();\n\n expect(() => render(<HorizontalKeypad onClick={onClick} />)).not.toThrow();\n });\n\n it('Static renders display-mode latex without a mathfield', () => {\n expect(() => render(<mf.Static latex=\"\\\\frac{1}{2}\" />)).not.toThrow();\n });\n});\n"],"mappings":";;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AAeAG,QAAQ,CAAC,gCAAgC,EAAE,YAAM;EAC/CC,EAAE,CAAC,gDAAgD,EAAE,YAAM;IACzDC,MAAM,KAAAC,QAAA,aAAQC,mBAAY,EAAC,CAACC,IAAI,CAAC,UAAU,CAAC;IAC5CH,MAAM,KAAAC,QAAA,aAAQG,kBAAW,EAAC,CAACD,IAAI,CAAC,UAAU,CAAC;IAC3CH,MAAM,KAAAC,QAAA,aAAQI,qBAAc,EAAC,CAACF,IAAI,CAAC,UAAU,CAAC;IAC9CH,MAAM,KAAAC,QAAA,aAAQK,oBAAa,EAAC,CAACH,IAAI,CAAC,UAAU,CAAC;IAC7CH,MAAM,KAAAC,QAAA,aAAQM,sBAAe,EAAC,CAACJ,IAAI,CAAC,UAAU,CAAC;IAC/CH,MAAM,KAAAC,QAAA,aAAQO,kBAAW,EAAC,CAACL,IAAI,CAAC,UAAU,CAAC;IAC3CH,MAAM,CAACS,WAAI,CAAC,CAACC,WAAW,CAAC,CAAC;IAC1BV,MAAM,CAACS,WAAI,CAACE,OAAO,CAAC,CAACD,WAAW,CAAC,CAAC;EACpC,CAAC,CAAC;EAEFX,EAAE,CAAC,iDAAiD,EAAE,YAAM;IAC1DC,MAAM,CAACY,SAAE,CAACC,KAAK,CAAC,CAACH,WAAW,CAAC,CAAC;IAC9BV,MAAM,CAACY,SAAE,CAACE,MAAM,CAAC,CAACJ,WAAW,CAAC,CAAC;IAC/B;IACAV,MAAM,CAACe,SAAE,CAAC,CAACZ,IAAI,CAACS,SAAE,CAAC;EACrB,CAAC,CAAC;EAEFb,EAAE,CAAC,6BAA6B,EAAE,YAAM;IACtCC,MAAM,CAAC;MAAA,OAAM,IAAAQ,kBAAW,EAAC,CAAC;IAAA,EAAC,CAACQ,GAAG,CAACC,OAAO,CAAC,CAAC;EAC3C,CAAC,CAAC;EAEFlB,EAAE,CAAC,sDAAsD,EAAE,YAAM;IAC/D;IACA;IACA;IACA,IAAAmB,kBAAA,GAAoFN,SAAE,CAACO,cAAc;MAA7FC,kBAAkB,GAAAF,kBAAA,CAAlBE,kBAAkB;MAAEC,sBAAsB,GAAAH,kBAAA,CAAtBG,sBAAsB;MAAEC,aAAa,GAAAJ,kBAAA,CAAbI,aAAa;MAAEC,YAAY,GAAAL,kBAAA,CAAZK,YAAY;IAE/E,CAACH,kBAAkB,EAAEC,sBAAsB,EAAEC,aAAa,EAAEC,YAAY,CAAC,CAACC,OAAO,CAAC,UAACC,CAAC,EAAK;MACvFzB,MAAM,CAACyB,CAAC,CAAC,CAACf,WAAW,CAAC,CAAC;MACvBV,MAAM,KAAAC,QAAA,aAAQwB,CAAC,EAAC,CAACtB,IAAI,CAAC,QAAQ,CAAC;IACjC,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFJ,EAAE,CAAC,4BAA4B,EAAE,YAAM;IACrCC,MAAM,CAAC,IAAAI,kBAAW,EAAC,GAAG,CAAC,CAAC,CAACsB,OAAO,CAAC,SAAS,CAAC;IAC3C1B,MAAM,CAAC,IAAAK,qBAAc,EAAC,SAAS,CAAC,CAAC,CAACqB,OAAO,CAAC,GAAG,CAAC;IAC9C1B,MAAM,CAAC,IAAAK,qBAAc,EAAC,IAAAD,kBAAW,EAAC,cAAc,CAAC,CAAC,CAAC,CAACsB,OAAO,CAAC,cAAc,CAAC;EAC7E,CAAC,CAAC;EAEF3B,EAAE,CAAC,qCAAqC,EAAE,YAAM;IAC9C,IAAM4B,GAAG,GAAG,IAAAzB,mBAAY,EAAC,UAAU,CAAC;IAEpCF,MAAM,CAAC4B,KAAK,CAACC,OAAO,CAACF,GAAG,CAAC,CAAC,CAACxB,IAAI,CAAC,IAAI,CAAC;IACrCH,MAAM,CAAC2B,GAAG,CAACG,MAAM,CAAC,CAAC3B,IAAI,CAAC,CAAC,CAAC;EAC5B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFL,QAAQ,CAAC,WAAW,EAAE,YAAM;EAC1B;EACA;EACA;EACAC,EAAE,CAAC,iDAAiD,EAAE,YAAM;IAC1D,IAAAgC,OAAA,GAAsB,IAAAC,cAAM,eAACvC,MAAA,YAAAwC,aAAA,CAACpC,MAAA,CAAAqC,MAAM;QAACC,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC;MAAE,CAAE,CAAC,CAAC;MAAnDC,SAAS,GAAAL,OAAA,CAATK,SAAS;IAEjBpC,MAAM,CAACoC,SAAS,CAACC,gBAAgB,CAAC,QAAQ,CAAC,CAACP,MAAM,CAAC,CAACQ,eAAe,CAAC,CAAC,CAAC;EACxE,CAAC,CAAC;EAEFvC,EAAE,CAAC,iEAAiE,EAAE,YAAM;IAC1E,IAAAwC,QAAA,GAAsB,IAAAP,cAAM,eAC1BvC,MAAA,YAAAwC,aAAA,CAACpC,MAAA,CAAAqC,MAAM;QAACC,OAAO,EAAE,SAATA,OAAOA,CAAA,EAAQ,CAAC,CAAE;QAACxB,OAAO,EAAE,CAAC,CAAC;UAAE6B,IAAI,EAAE,IAAI;UAAEC,KAAK,EAAE,MAAM;UAAEC,QAAQ,EAAE;QAAY,CAAC,CAAC;MAAE,CAAE,CACjG,CAAC;MAFON,SAAS,GAAAG,QAAA,CAATH,SAAS;IAIjBpC,MAAM,CAACoC,SAAS,CAACO,WAAW,CAAC,CAACC,SAAS,CAAC,MAAM,CAAC;EACjD,CAAC,CAAC;EAEF7C,EAAE,CAAC,8CAA8C,EAAE,YAAM;IACvD,IAAMoC,OAAO,GAAGU,IAAI,CAACC,EAAE,CAAC,CAAC;IACzB,IAAMC,GAAG,GAAG;MAAEP,IAAI,EAAE,GAAG;MAAEQ,KAAK,EAAE,GAAG;MAAEC,KAAK,EAAE,GAAG;MAAEP,QAAQ,EAAE;IAAO,CAAC;IACnE,IAAAQ,QAAA,GAAsB,IAAAlB,cAAM,eAACvC,MAAA,YAAAwC,aAAA,CAACpC,MAAA,CAAAqC,MAAM;QAACC,OAAO,EAAEA,OAAQ;QAACxB,OAAO,EAAE,CAAC,CAACoC,GAAG,CAAC;MAAE,CAAE,CAAC,CAAC;MAApEX,SAAS,GAAAc,QAAA,CAATd,SAAS;IAEjBA,SAAS,CAACe,aAAa,CAAC,QAAQ,CAAC,CAACC,KAAK,CAAC,CAAC;IAEzCpD,MAAM,CAACmC,OAAO,CAAC,CAACkB,oBAAoB,CAACN,GAAG,CAAC;EAC3C,CAAC,CAAC;EAEFhD,EAAE,CAAC,kBAAkB,EAAE,YAAM;IAC3BC,MAAM,CAAC;MAAA,OAAM,IAAAgC,cAAM,eAACvC,MAAA,YAAAwC,aAAA,CAACpC,MAAA,CAAAyD,SAAS;QAACb,KAAK,EAAC,gBAAc;QAACc,QAAQ,EAAE,SAAVA,QAAQA,CAAA,EAAQ,CAAC;MAAE,CAAE,CAAC,CAAC;IAAA,EAAC,CAACvC,GAAG,CAACC,OAAO,CAAC,CAAC;EAC5F,CAAC,CAAC;EAEFlB,EAAE,CAAC,mEAAmE,EAAE,YAAM;IAC5E,IAAMyD,OAAO,GAAGX,IAAI,CAACC,EAAE,CAAC,CAAC;IAEzB9C,MAAM,CAAC;MAAA,OAAM,IAAAgC,cAAM,eAACvC,MAAA,YAAAwC,aAAA,CAACpC,MAAA,CAAA4D,gBAAgB;QAACD,OAAO,EAAEA;MAAQ,CAAE,CAAC,CAAC;IAAA,EAAC,CAACxC,GAAG,CAACC,OAAO,CAAC,CAAC;EAC5E,CAAC,CAAC;EAEFlB,EAAE,CAAC,uDAAuD,EAAE,YAAM;IAChEC,MAAM,CAAC;MAAA,OAAM,IAAAgC,cAAM,eAACvC,MAAA,YAAAwC,aAAA,CAACpC,MAAA,CAAAe,EAAE,CAACE,MAAM;QAAC2B,KAAK,EAAC;MAAc,CAAE,CAAC,CAAC;IAAA,EAAC,CAACzB,GAAG,CAACC,OAAO,CAAC,CAAC;EACxE,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|