@payloadcms/richtext-lexical 0.1.16 → 0.1.17
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/dist/field/features/Blocks/component/BlockContent.d.ts.map +1 -1
- package/dist/field/features/Blocks/component/BlockContent.js +19 -1
- package/dist/field/features/converters/html/field/index.d.ts +10 -0
- package/dist/field/features/converters/html/field/index.d.ts.map +1 -1
- package/dist/field/features/converters/html/field/index.js +27 -14
- package/dist/field/features/debug/TestRecorder/index.d.ts +3 -0
- package/dist/field/features/debug/TestRecorder/index.d.ts.map +1 -0
- package/dist/field/features/debug/TestRecorder/index.js +29 -0
- package/dist/field/features/debug/TestRecorder/plugin/index.d.ts +5 -0
- package/dist/field/features/debug/TestRecorder/plugin/index.d.ts.map +1 -0
- package/dist/field/features/debug/TestRecorder/plugin/index.js +497 -0
- package/dist/field/features/debug/TestRecorder/plugin/index.scss +51 -0
- package/dist/field/features/debug/TreeView/index.js +2 -2
- package/dist/field/features/types.d.ts +9 -0
- package/dist/field/features/types.d.ts.map +1 -1
- package/dist/field/lexical/LexicalEditor.d.ts.map +1 -1
- package/dist/field/lexical/LexicalEditor.js +7 -1
- package/dist/field/lexical/plugins/FloatingSelectToolbar/index.d.ts.map +1 -1
- package/dist/field/lexical/plugins/FloatingSelectToolbar/index.js +2 -2
- package/dist/field/lexical/utils/environment.d.ts +18 -0
- package/dist/field/lexical/utils/environment.d.ts.map +1 -0
- package/dist/field/lexical/utils/environment.js +58 -0
- package/dist/field/lexical/utils/setFloatingElemPosition.d.ts +1 -1
- package/dist/field/lexical/utils/setFloatingElemPosition.d.ts.map +1 -1
- package/dist/field/lexical/utils/setFloatingElemPosition.js +10 -3
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/package.json +2 -2
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
isSelectAll: function() {
|
|
13
|
+
return isSelectAll;
|
|
14
|
+
},
|
|
15
|
+
TestRecorderPlugin: function() {
|
|
16
|
+
return TestRecorderPlugin;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const _LexicalComposerContext = require("@lexical/react/LexicalComposerContext");
|
|
20
|
+
const _lexical = require("lexical");
|
|
21
|
+
const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
|
|
22
|
+
const _environment = require("../../../../lexical/utils/environment");
|
|
23
|
+
require("./index.scss");
|
|
24
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
25
|
+
if (typeof WeakMap !== "function") return null;
|
|
26
|
+
var cacheBabelInterop = new WeakMap();
|
|
27
|
+
var cacheNodeInterop = new WeakMap();
|
|
28
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
29
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
30
|
+
})(nodeInterop);
|
|
31
|
+
}
|
|
32
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
33
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
34
|
+
return obj;
|
|
35
|
+
}
|
|
36
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
37
|
+
return {
|
|
38
|
+
default: obj
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
42
|
+
if (cache && cache.has(obj)) {
|
|
43
|
+
return cache.get(obj);
|
|
44
|
+
}
|
|
45
|
+
var newObj = {};
|
|
46
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
47
|
+
for(var key in obj){
|
|
48
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
49
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
50
|
+
if (desc && (desc.get || desc.set)) {
|
|
51
|
+
Object.defineProperty(newObj, key, desc);
|
|
52
|
+
} else {
|
|
53
|
+
newObj[key] = obj[key];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
newObj.default = obj;
|
|
58
|
+
if (cache) {
|
|
59
|
+
cache.set(obj, newObj);
|
|
60
|
+
}
|
|
61
|
+
return newObj;
|
|
62
|
+
}
|
|
63
|
+
const copy = (text)=>{
|
|
64
|
+
const textArea = document.createElement('textarea');
|
|
65
|
+
textArea.value = text || '';
|
|
66
|
+
textArea.style.position = 'absolute';
|
|
67
|
+
textArea.style.opacity = '0';
|
|
68
|
+
document.body?.appendChild(textArea);
|
|
69
|
+
textArea.focus();
|
|
70
|
+
textArea.select();
|
|
71
|
+
try {
|
|
72
|
+
const result = document.execCommand('copy');
|
|
73
|
+
// eslint-disable-next-line no-console
|
|
74
|
+
console.log(result);
|
|
75
|
+
} catch (error) {
|
|
76
|
+
console.error(error);
|
|
77
|
+
}
|
|
78
|
+
document.body?.removeChild(textArea);
|
|
79
|
+
};
|
|
80
|
+
const download = (filename, text)=>{
|
|
81
|
+
const a = document.createElement('a');
|
|
82
|
+
a.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text || ''));
|
|
83
|
+
a.setAttribute('download', filename);
|
|
84
|
+
a.style.display = 'none';
|
|
85
|
+
document.body?.appendChild(a);
|
|
86
|
+
a.click();
|
|
87
|
+
document.body?.removeChild(a);
|
|
88
|
+
};
|
|
89
|
+
const formatStep = (step)=>{
|
|
90
|
+
const formatOneStep = (name, value)=>{
|
|
91
|
+
switch(name){
|
|
92
|
+
case 'click':
|
|
93
|
+
{
|
|
94
|
+
return ` await page.mouse.click(${value.x}, ${value.y});`;
|
|
95
|
+
}
|
|
96
|
+
case 'press':
|
|
97
|
+
{
|
|
98
|
+
return ` await page.keyboard.press('${value}');`;
|
|
99
|
+
}
|
|
100
|
+
case 'keydown':
|
|
101
|
+
{
|
|
102
|
+
return ` await page.keyboard.keydown('${value}');`;
|
|
103
|
+
}
|
|
104
|
+
case 'keyup':
|
|
105
|
+
{
|
|
106
|
+
return ` await page.keyboard.keyup('${value}');`;
|
|
107
|
+
}
|
|
108
|
+
case 'type':
|
|
109
|
+
{
|
|
110
|
+
return ` await page.keyboard.type('${value}');`;
|
|
111
|
+
}
|
|
112
|
+
case 'selectAll':
|
|
113
|
+
{
|
|
114
|
+
return ` await selectAll(page);`;
|
|
115
|
+
}
|
|
116
|
+
case 'snapshot':
|
|
117
|
+
{
|
|
118
|
+
return ` await assertHTMLSnapshot(page);
|
|
119
|
+
await assertSelection(page, {
|
|
120
|
+
anchorPath: [${value.anchorPath.toString()}],
|
|
121
|
+
anchorOffset: ${value.anchorOffset},
|
|
122
|
+
focusPath: [${value.focusPath.toString()}],
|
|
123
|
+
focusOffset: ${value.focusOffset},
|
|
124
|
+
});
|
|
125
|
+
`;
|
|
126
|
+
}
|
|
127
|
+
default:
|
|
128
|
+
return ``;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const formattedStep = formatOneStep(step.name, step.value);
|
|
132
|
+
switch(step.count){
|
|
133
|
+
case 1:
|
|
134
|
+
return formattedStep;
|
|
135
|
+
case 2:
|
|
136
|
+
return [
|
|
137
|
+
formattedStep,
|
|
138
|
+
formattedStep
|
|
139
|
+
].join(`\n`);
|
|
140
|
+
default:
|
|
141
|
+
return ` await repeat(${step.count}, async () => {
|
|
142
|
+
${formattedStep}
|
|
143
|
+
);`;
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
function isSelectAll(event) {
|
|
147
|
+
return event.keyCode === 65 && (_environment.IS_APPLE ? event.metaKey : event.ctrlKey);
|
|
148
|
+
}
|
|
149
|
+
// stolen from LexicalSelection-test
|
|
150
|
+
function sanitizeSelection(selection) {
|
|
151
|
+
const { anchorNode, focusNode } = selection;
|
|
152
|
+
let { anchorOffset, focusOffset } = selection;
|
|
153
|
+
if (anchorOffset !== 0) {
|
|
154
|
+
anchorOffset--;
|
|
155
|
+
}
|
|
156
|
+
if (focusOffset !== 0) {
|
|
157
|
+
focusOffset--;
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
anchorNode,
|
|
161
|
+
anchorOffset,
|
|
162
|
+
focusNode,
|
|
163
|
+
focusOffset
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function getPathFromNodeToEditor(node, rootElement) {
|
|
167
|
+
let currentNode = node;
|
|
168
|
+
const path = [];
|
|
169
|
+
while(currentNode !== rootElement){
|
|
170
|
+
if (currentNode !== null && currentNode !== undefined) {
|
|
171
|
+
path.unshift(Array.from(currentNode?.parentNode?.childNodes ?? []).indexOf(currentNode));
|
|
172
|
+
}
|
|
173
|
+
currentNode = currentNode?.parentNode;
|
|
174
|
+
}
|
|
175
|
+
return path;
|
|
176
|
+
}
|
|
177
|
+
const keyPresses = new Set([
|
|
178
|
+
'Enter',
|
|
179
|
+
'Backspace',
|
|
180
|
+
'Delete',
|
|
181
|
+
'Escape',
|
|
182
|
+
'ArrowLeft',
|
|
183
|
+
'ArrowRight',
|
|
184
|
+
'ArrowUp',
|
|
185
|
+
'ArrowDown'
|
|
186
|
+
]);
|
|
187
|
+
function useTestRecorder(editor) {
|
|
188
|
+
const [steps, setSteps] = (0, _react.useState)([]);
|
|
189
|
+
const [isRecording, setIsRecording] = (0, _react.useState)(false);
|
|
190
|
+
const [, setCurrentInnerHTML] = (0, _react.useState)('');
|
|
191
|
+
const [templatedTest, setTemplatedTest] = (0, _react.useState)('');
|
|
192
|
+
const previousSelectionRef = (0, _react.useRef)(null);
|
|
193
|
+
const skipNextSelectionChangeRef = (0, _react.useRef)(false);
|
|
194
|
+
const preRef = (0, _react.useRef)(null);
|
|
195
|
+
const getCurrentEditor = (0, _react.useCallback)(()=>{
|
|
196
|
+
return editor;
|
|
197
|
+
}, [
|
|
198
|
+
editor
|
|
199
|
+
]);
|
|
200
|
+
const generateTestContent = (0, _react.useCallback)(()=>{
|
|
201
|
+
const rootElement = editor.getRootElement();
|
|
202
|
+
const browserSelection = window.getSelection();
|
|
203
|
+
if (rootElement == null || browserSelection == null || browserSelection.anchorNode == null || browserSelection.focusNode == null || !rootElement.contains(browserSelection.anchorNode) || !rootElement.contains(browserSelection.focusNode)) {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
return `
|
|
207
|
+
import {
|
|
208
|
+
initializeE2E,
|
|
209
|
+
assertHTMLSnapshot,
|
|
210
|
+
assertSelection,
|
|
211
|
+
repeat,
|
|
212
|
+
} from '../utils';
|
|
213
|
+
import {selectAll} from '../keyboardShortcuts';
|
|
214
|
+
import { RangeSelection } from 'lexical';
|
|
215
|
+
import { NodeSelection } from 'lexical';
|
|
216
|
+
|
|
217
|
+
describe('Test case', () => {
|
|
218
|
+
initializeE2E((e2e) => {
|
|
219
|
+
it('Should pass this test', async () => {
|
|
220
|
+
const {page} = e2e;
|
|
221
|
+
|
|
222
|
+
await page.focus('div[contenteditable="true"]');
|
|
223
|
+
${steps.map(formatStep).join(`\n`)}
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
`;
|
|
227
|
+
}, [
|
|
228
|
+
editor,
|
|
229
|
+
steps
|
|
230
|
+
]);
|
|
231
|
+
// just a wrapper around inserting new actions so that we can
|
|
232
|
+
// coalesce some actions like insertText/moveNativeSelection
|
|
233
|
+
const pushStep = (0, _react.useCallback)((name, value)=>{
|
|
234
|
+
setSteps((currentSteps)=>{
|
|
235
|
+
// trying to group steps
|
|
236
|
+
const currentIndex = steps.length - 1;
|
|
237
|
+
const lastStep = steps[currentIndex];
|
|
238
|
+
if (lastStep) {
|
|
239
|
+
if (lastStep.name === name) {
|
|
240
|
+
if (name === 'type') {
|
|
241
|
+
// for typing events we just append the text
|
|
242
|
+
return [
|
|
243
|
+
...steps.slice(0, currentIndex),
|
|
244
|
+
{
|
|
245
|
+
...lastStep,
|
|
246
|
+
value: lastStep.value + value
|
|
247
|
+
}
|
|
248
|
+
];
|
|
249
|
+
} else {
|
|
250
|
+
// for other events we bump the counter if their values are the same
|
|
251
|
+
if (lastStep.value === value) {
|
|
252
|
+
return [
|
|
253
|
+
...steps.slice(0, currentIndex),
|
|
254
|
+
{
|
|
255
|
+
...lastStep,
|
|
256
|
+
count: lastStep.count + 1
|
|
257
|
+
}
|
|
258
|
+
];
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// could not group, just append a new one
|
|
264
|
+
return [
|
|
265
|
+
...currentSteps,
|
|
266
|
+
{
|
|
267
|
+
name,
|
|
268
|
+
count: 1,
|
|
269
|
+
value
|
|
270
|
+
}
|
|
271
|
+
];
|
|
272
|
+
});
|
|
273
|
+
}, [
|
|
274
|
+
steps,
|
|
275
|
+
setSteps
|
|
276
|
+
]);
|
|
277
|
+
(0, _react.useLayoutEffect)(()=>{
|
|
278
|
+
const onKeyDown = (event)=>{
|
|
279
|
+
if (!isRecording) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const key = event.key;
|
|
283
|
+
if (isSelectAll(event)) {
|
|
284
|
+
pushStep('selectAll', '');
|
|
285
|
+
} else if (keyPresses.has(key)) {
|
|
286
|
+
pushStep('press', event.key);
|
|
287
|
+
} else if ([
|
|
288
|
+
...key
|
|
289
|
+
].length > 1) {
|
|
290
|
+
pushStep('keydown', event.key);
|
|
291
|
+
} else {
|
|
292
|
+
pushStep('type', event.key);
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
const onKeyUp = (event)=>{
|
|
296
|
+
if (!isRecording) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
const key = event.key;
|
|
300
|
+
if (!keyPresses.has(key) && [
|
|
301
|
+
...key
|
|
302
|
+
].length > 1) {
|
|
303
|
+
pushStep('keyup', event.key);
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
return editor.registerRootListener((rootElement, prevRootElement)=>{
|
|
307
|
+
if (prevRootElement !== null) {
|
|
308
|
+
prevRootElement.removeEventListener('keydown', onKeyDown);
|
|
309
|
+
prevRootElement.removeEventListener('keyup', onKeyUp);
|
|
310
|
+
}
|
|
311
|
+
if (rootElement !== null) {
|
|
312
|
+
rootElement.addEventListener('keydown', onKeyDown);
|
|
313
|
+
rootElement.addEventListener('keyup', onKeyUp);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
}, [
|
|
317
|
+
editor,
|
|
318
|
+
isRecording,
|
|
319
|
+
pushStep
|
|
320
|
+
]);
|
|
321
|
+
(0, _react.useLayoutEffect)(()=>{
|
|
322
|
+
if (preRef.current) {
|
|
323
|
+
preRef.current.scrollTo(0, preRef.current.scrollHeight);
|
|
324
|
+
}
|
|
325
|
+
}, [
|
|
326
|
+
generateTestContent
|
|
327
|
+
]);
|
|
328
|
+
(0, _react.useEffect)(()=>{
|
|
329
|
+
if (steps) {
|
|
330
|
+
const testContent = generateTestContent();
|
|
331
|
+
if (testContent !== null) {
|
|
332
|
+
setTemplatedTest(testContent);
|
|
333
|
+
}
|
|
334
|
+
if (preRef.current) {
|
|
335
|
+
preRef.current.scrollTo(0, preRef.current.scrollHeight);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}, [
|
|
339
|
+
generateTestContent,
|
|
340
|
+
steps
|
|
341
|
+
]);
|
|
342
|
+
(0, _react.useEffect)(()=>{
|
|
343
|
+
const removeUpdateListener = editor.registerUpdateListener(({ dirtyElements, dirtyLeaves, editorState })=>{
|
|
344
|
+
if (!isRecording) {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
const currentSelection = editorState._selection;
|
|
348
|
+
const previousSelection = previousSelectionRef.current;
|
|
349
|
+
const skipNextSelectionChange = skipNextSelectionChangeRef.current;
|
|
350
|
+
if (previousSelection !== currentSelection) {
|
|
351
|
+
if (dirtyLeaves.size === 0 && dirtyElements.size === 0 && !skipNextSelectionChange) {
|
|
352
|
+
const browserSelection = window.getSelection();
|
|
353
|
+
if (browserSelection && (browserSelection.anchorNode == null || browserSelection.focusNode == null)) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
previousSelectionRef.current = currentSelection;
|
|
358
|
+
}
|
|
359
|
+
skipNextSelectionChangeRef.current = false;
|
|
360
|
+
const testContent = generateTestContent();
|
|
361
|
+
if (testContent !== null) {
|
|
362
|
+
setTemplatedTest(testContent);
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
return removeUpdateListener;
|
|
366
|
+
}, [
|
|
367
|
+
editor,
|
|
368
|
+
generateTestContent,
|
|
369
|
+
isRecording,
|
|
370
|
+
pushStep
|
|
371
|
+
]);
|
|
372
|
+
// save innerHTML
|
|
373
|
+
(0, _react.useEffect)(()=>{
|
|
374
|
+
if (!isRecording) {
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
const removeUpdateListener = editor.registerUpdateListener(()=>{
|
|
378
|
+
const rootElement = editor.getRootElement();
|
|
379
|
+
if (rootElement !== null) {
|
|
380
|
+
setCurrentInnerHTML(rootElement?.innerHTML);
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
return removeUpdateListener;
|
|
384
|
+
}, [
|
|
385
|
+
editor,
|
|
386
|
+
isRecording
|
|
387
|
+
]);
|
|
388
|
+
// clear editor and start recording
|
|
389
|
+
const toggleEditorSelection = (0, _react.useCallback)((currentEditor)=>{
|
|
390
|
+
if (!isRecording) {
|
|
391
|
+
currentEditor.update(()=>{
|
|
392
|
+
const root = (0, _lexical.$getRoot)();
|
|
393
|
+
root.clear();
|
|
394
|
+
const text = (0, _lexical.$createTextNode)();
|
|
395
|
+
root.append((0, _lexical.$createParagraphNode)().append(text));
|
|
396
|
+
text.select();
|
|
397
|
+
});
|
|
398
|
+
setSteps([]);
|
|
399
|
+
}
|
|
400
|
+
setIsRecording((currentIsRecording)=>!currentIsRecording);
|
|
401
|
+
}, [
|
|
402
|
+
isRecording
|
|
403
|
+
]);
|
|
404
|
+
const onSnapshotClick = (0, _react.useCallback)(()=>{
|
|
405
|
+
if (!isRecording) {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
const browserSelection = window.getSelection();
|
|
409
|
+
if (browserSelection === null || browserSelection.anchorNode == null || browserSelection.focusNode == null) {
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
const { anchorNode, anchorOffset, focusNode, focusOffset } = sanitizeSelection(browserSelection);
|
|
413
|
+
const rootElement = getCurrentEditor().getRootElement();
|
|
414
|
+
let anchorPath;
|
|
415
|
+
if (anchorNode !== null) {
|
|
416
|
+
anchorPath = getPathFromNodeToEditor(anchorNode, rootElement);
|
|
417
|
+
}
|
|
418
|
+
let focusPath;
|
|
419
|
+
if (focusNode !== null) {
|
|
420
|
+
focusPath = getPathFromNodeToEditor(focusNode, rootElement);
|
|
421
|
+
}
|
|
422
|
+
pushStep('snapshot', {
|
|
423
|
+
anchorNode,
|
|
424
|
+
anchorOffset,
|
|
425
|
+
anchorPath,
|
|
426
|
+
focusNode,
|
|
427
|
+
focusOffset,
|
|
428
|
+
focusPath
|
|
429
|
+
});
|
|
430
|
+
}, [
|
|
431
|
+
pushStep,
|
|
432
|
+
isRecording,
|
|
433
|
+
getCurrentEditor
|
|
434
|
+
]);
|
|
435
|
+
const onCopyClick = (0, _react.useCallback)(()=>{
|
|
436
|
+
copy(generateTestContent());
|
|
437
|
+
}, [
|
|
438
|
+
generateTestContent
|
|
439
|
+
]);
|
|
440
|
+
const onDownloadClick = (0, _react.useCallback)(()=>{
|
|
441
|
+
download('test.js', generateTestContent());
|
|
442
|
+
}, [
|
|
443
|
+
generateTestContent
|
|
444
|
+
]);
|
|
445
|
+
const button = /*#__PURE__*/ _react.createElement("button", {
|
|
446
|
+
className: `editor-dev-button ${isRecording ? 'active' : ''}`,
|
|
447
|
+
id: "test-recorder-button",
|
|
448
|
+
onClick: (e)=>{
|
|
449
|
+
toggleEditorSelection(getCurrentEditor());
|
|
450
|
+
e.preventDefault();
|
|
451
|
+
},
|
|
452
|
+
title: isRecording ? 'Disable test recorder' : 'Enable test recorder'
|
|
453
|
+
}, isRecording ? 'Disable test recorder' : 'Enable test recorder');
|
|
454
|
+
const output = isRecording ? /*#__PURE__*/ _react.createElement("div", {
|
|
455
|
+
className: "test-recorder-output"
|
|
456
|
+
}, /*#__PURE__*/ _react.createElement("div", {
|
|
457
|
+
className: "test-recorder-toolbar"
|
|
458
|
+
}, /*#__PURE__*/ _react.createElement("button", {
|
|
459
|
+
className: "test-recorder-button",
|
|
460
|
+
id: "test-recorder-button-snapshot",
|
|
461
|
+
onClick: (e)=>{
|
|
462
|
+
onSnapshotClick();
|
|
463
|
+
e.preventDefault();
|
|
464
|
+
},
|
|
465
|
+
title: "Insert snapshot"
|
|
466
|
+
}, "Insert Snapshot"), /*#__PURE__*/ _react.createElement("button", {
|
|
467
|
+
className: "test-recorder-button",
|
|
468
|
+
id: "test-recorder-button-copy",
|
|
469
|
+
onClick: (e)=>{
|
|
470
|
+
onCopyClick();
|
|
471
|
+
e.preventDefault();
|
|
472
|
+
},
|
|
473
|
+
title: "Copy to clipboard"
|
|
474
|
+
}, "Copy"), /*#__PURE__*/ _react.createElement("button", {
|
|
475
|
+
className: "test-recorder-button",
|
|
476
|
+
id: "test-recorder-button-download",
|
|
477
|
+
onClick: (e)=>{
|
|
478
|
+
onDownloadClick();
|
|
479
|
+
e.preventDefault();
|
|
480
|
+
},
|
|
481
|
+
title: "Download as a file"
|
|
482
|
+
}, "Download")), /*#__PURE__*/ _react.createElement("pre", {
|
|
483
|
+
id: "test-recorder",
|
|
484
|
+
ref: preRef
|
|
485
|
+
}, templatedTest)) : null;
|
|
486
|
+
return [
|
|
487
|
+
button,
|
|
488
|
+
output
|
|
489
|
+
];
|
|
490
|
+
}
|
|
491
|
+
const TestRecorderPlugin = ()=>{
|
|
492
|
+
const [editor] = (0, _LexicalComposerContext.useLexicalComposerContext)();
|
|
493
|
+
const [testRecorderButton, testRecorderOutput] = useTestRecorder(editor);
|
|
494
|
+
return /*#__PURE__*/ _react.createElement(_react.Fragment, null, /*#__PURE__*/ _react.createElement("p", null, "HI"), testRecorderButton, testRecorderOutput, /*#__PURE__*/ _react.createElement("p", null, "DONE"));
|
|
495
|
+
};
|
|
496
|
+
|
|
497
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9maWVsZC9mZWF0dXJlcy9kZWJ1Zy9UZXN0UmVjb3JkZXIvcGx1Z2luL2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEdyaWRTZWxlY3Rpb24sIExleGljYWxFZGl0b3IsIE5vZGVTZWxlY3Rpb24sIFJhbmdlU2VsZWN0aW9uIH0gZnJvbSAnbGV4aWNhbCdcblxuaW1wb3J0IHsgdXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCB9IGZyb20gJ0BsZXhpY2FsL3JlYWN0L0xleGljYWxDb21wb3NlckNvbnRleHQnXG5pbXBvcnQgeyAkY3JlYXRlUGFyYWdyYXBoTm9kZSwgJGNyZWF0ZVRleHROb2RlLCAkZ2V0Um9vdCB9IGZyb20gJ2xleGljYWwnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgeyBJU19BUFBMRSB9IGZyb20gJy4uLy4uLy4uLy4uL2xleGljYWwvdXRpbHMvZW52aXJvbm1lbnQnXG5pbXBvcnQgJy4vaW5kZXguc2NzcydcblxuY29uc3QgY29weSA9ICh0ZXh0OiBudWxsIHwgc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKVxuICB0ZXh0QXJlYS52YWx1ZSA9IHRleHQgfHwgJydcbiAgdGV4dEFyZWEuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gIHRleHRBcmVhLnN0eWxlLm9wYWNpdHkgPSAnMCdcbiAgZG9jdW1lbnQuYm9keT8uYXBwZW5kQ2hpbGQodGV4dEFyZWEpXG4gIHRleHRBcmVhLmZvY3VzKClcbiAgdGV4dEFyZWEuc2VsZWN0KClcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyhyZXN1bHQpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgfVxuICBkb2N1bWVudC5ib2R5Py5yZW1vdmVDaGlsZCh0ZXh0QXJlYSlcbn1cblxuY29uc3QgZG93bmxvYWQgPSAoZmlsZW5hbWU6IHN0cmluZywgdGV4dDogbnVsbCB8IHN0cmluZykgPT4ge1xuICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gIGEuc2V0QXR0cmlidXRlKCdocmVmJywgJ2RhdGE6dGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04LCcgKyBlbmNvZGVVUklDb21wb25lbnQodGV4dCB8fCAnJykpXG4gIGEuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVuYW1lKVxuICBhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgZG9jdW1lbnQuYm9keT8uYXBwZW5kQ2hpbGQoYSlcbiAgYS5jbGljaygpXG4gIGRvY3VtZW50LmJvZHk/LnJlbW92ZUNoaWxkKGEpXG59XG5cbmNvbnN0IGZvcm1hdFN0ZXAgPSAoc3RlcDogU3RlcCkgPT4ge1xuICBjb25zdCBmb3JtYXRPbmVTdGVwID0gKG5hbWU6IHN0cmluZywgdmFsdWU6IFN0ZXBbJ3ZhbHVlJ10pID0+IHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsaWNrJzoge1xuICAgICAgICByZXR1cm4gYCAgICAgIGF3YWl0IHBhZ2UubW91c2UuY2xpY2soJHt2YWx1ZS54fSwgJHt2YWx1ZS55fSk7YFxuICAgICAgfVxuICAgICAgY2FzZSAncHJlc3MnOiB7XG4gICAgICAgIHJldHVybiBgICAgICAgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnJHt2YWx1ZX0nKTtgXG4gICAgICB9XG4gICAgICBjYXNlICdrZXlkb3duJzoge1xuICAgICAgICByZXR1cm4gYCAgICAgIGF3YWl0IHBhZ2Uua2V5Ym9hcmQua2V5ZG93bignJHt2YWx1ZX0nKTtgXG4gICAgICB9XG4gICAgICBjYXNlICdrZXl1cCc6IHtcbiAgICAgICAgcmV0dXJuIGAgICAgICBhd2FpdCBwYWdlLmtleWJvYXJkLmtleXVwKCcke3ZhbHVlfScpO2BcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3R5cGUnOiB7XG4gICAgICAgIHJldHVybiBgICAgICAgYXdhaXQgcGFnZS5rZXlib2FyZC50eXBlKCcke3ZhbHVlfScpO2BcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3NlbGVjdEFsbCc6IHtcbiAgICAgICAgcmV0dXJuIGAgICAgICBhd2FpdCBzZWxlY3RBbGwocGFnZSk7YFxuICAgICAgfVxuICAgICAgY2FzZSAnc25hcHNob3QnOiB7XG4gICAgICAgIHJldHVybiBgICAgICAgYXdhaXQgYXNzZXJ0SFRNTFNuYXBzaG90KHBhZ2UpO1xuICAgICAgYXdhaXQgYXNzZXJ0U2VsZWN0aW9uKHBhZ2UsIHtcbiAgICAgICAgYW5jaG9yUGF0aDogWyR7dmFsdWUuYW5jaG9yUGF0aC50b1N0cmluZygpfV0sXG4gICAgICAgIGFuY2hvck9mZnNldDogJHt2YWx1ZS5hbmNob3JPZmZzZXR9LFxuICAgICAgICBmb2N1c1BhdGg6IFske3ZhbHVlLmZvY3VzUGF0aC50b1N0cmluZygpfV0sXG4gICAgICAgIGZvY3VzT2Zmc2V0OiAke3ZhbHVlLmZvY3VzT2Zmc2V0fSxcbiAgICAgIH0pO1xuYFxuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGBgXG4gICAgfVxuICB9XG4gIGNvbnN0IGZvcm1hdHRlZFN0ZXAgPSBmb3JtYXRPbmVTdGVwKHN0ZXAubmFtZSwgc3RlcC52YWx1ZSlcbiAgc3dpdGNoIChzdGVwLmNvdW50KSB7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGZvcm1hdHRlZFN0ZXBcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gW2Zvcm1hdHRlZFN0ZXAsIGZvcm1hdHRlZFN0ZXBdLmpvaW4oYFxcbmApXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgICAgICAgYXdhaXQgcmVwZWF0KCR7c3RlcC5jb3VudH0sIGFzeW5jICgpID0+IHtcbiAgJHtmb3JtYXR0ZWRTdGVwfVxuICAgICAgKTtgXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2VsZWN0QWxsKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiBldmVudC5rZXlDb2RlID09PSA2NSAmJiAoSVNfQVBQTEUgPyBldmVudC5tZXRhS2V5IDogZXZlbnQuY3RybEtleSlcbn1cblxuLy8gc3RvbGVuIGZyb20gTGV4aWNhbFNlbGVjdGlvbi10ZXN0XG5mdW5jdGlvbiBzYW5pdGl6ZVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbikge1xuICBjb25zdCB7IGFuY2hvck5vZGUsIGZvY3VzTm9kZSB9ID0gc2VsZWN0aW9uXG4gIGxldCB7IGFuY2hvck9mZnNldCwgZm9jdXNPZmZzZXQgfSA9IHNlbGVjdGlvblxuICBpZiAoYW5jaG9yT2Zmc2V0ICE9PSAwKSB7XG4gICAgYW5jaG9yT2Zmc2V0LS1cbiAgfVxuICBpZiAoZm9jdXNPZmZzZXQgIT09IDApIHtcbiAgICBmb2N1c09mZnNldC0tXG4gIH1cbiAgcmV0dXJuIHsgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0IH1cbn1cblxuZnVuY3Rpb24gZ2V0UGF0aEZyb21Ob2RlVG9FZGl0b3Iobm9kZTogTm9kZSwgcm9vdEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCkge1xuICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbm9kZVxuICBjb25zdCBwYXRoID0gW11cbiAgd2hpbGUgKGN1cnJlbnROb2RlICE9PSByb290RWxlbWVudCkge1xuICAgIGlmIChjdXJyZW50Tm9kZSAhPT0gbnVsbCAmJiBjdXJyZW50Tm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXRoLnVuc2hpZnQoXG4gICAgICAgIEFycmF5LmZyb20oY3VycmVudE5vZGU/LnBhcmVudE5vZGU/LmNoaWxkTm9kZXMgPz8gW10pLmluZGV4T2YoY3VycmVudE5vZGUgYXMgQ2hpbGROb2RlKSxcbiAgICAgIClcbiAgICB9XG4gICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZT8ucGFyZW50Tm9kZVxuICB9XG4gIHJldHVybiBwYXRoXG59XG5cbmNvbnN0IGtleVByZXNzZXMgPSBuZXcgU2V0KFtcbiAgJ0VudGVyJyxcbiAgJ0JhY2tzcGFjZScsXG4gICdEZWxldGUnLFxuICAnRXNjYXBlJyxcbiAgJ0Fycm93TGVmdCcsXG4gICdBcnJvd1JpZ2h0JyxcbiAgJ0Fycm93VXAnLFxuICAnQXJyb3dEb3duJyxcbl0pXG5cbnR5cGUgU3RlcCA9IHtcbiAgY291bnQ6IG51bWJlclxuICBuYW1lOiBzdHJpbmdcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgdmFsdWU6IGFueVxufVxuXG50eXBlIFN0ZXBzID0gU3RlcFtdXG5cbmZ1bmN0aW9uIHVzZVRlc3RSZWNvcmRlcihlZGl0b3I6IExleGljYWxFZGl0b3IpOiBbSlNYLkVsZW1lbnQsIEpTWC5FbGVtZW50IHwgbnVsbF0ge1xuICBjb25zdCBbc3RlcHMsIHNldFN0ZXBzXSA9IHVzZVN0YXRlPFN0ZXBzPihbXSlcbiAgY29uc3QgW2lzUmVjb3JkaW5nLCBzZXRJc1JlY29yZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgWywgc2V0Q3VycmVudElubmVySFRNTF0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3QgW3RlbXBsYXRlZFRlc3QsIHNldFRlbXBsYXRlZFRlc3RdID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IHByZXZpb3VzU2VsZWN0aW9uUmVmID0gdXNlUmVmPEdyaWRTZWxlY3Rpb24gfCBOb2RlU2VsZWN0aW9uIHwgUmFuZ2VTZWxlY3Rpb24gfCBudWxsPihudWxsKVxuICBjb25zdCBza2lwTmV4dFNlbGVjdGlvbkNoYW5nZVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgcHJlUmVmID0gdXNlUmVmPEhUTUxQcmVFbGVtZW50PihudWxsKVxuXG4gIGNvbnN0IGdldEN1cnJlbnRFZGl0b3IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgcmV0dXJuIGVkaXRvclxuICB9LCBbZWRpdG9yXSlcblxuICBjb25zdCBnZW5lcmF0ZVRlc3RDb250ZW50ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gZWRpdG9yLmdldFJvb3RFbGVtZW50KClcbiAgICBjb25zdCBicm93c2VyU2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG5cbiAgICBpZiAoXG4gICAgICByb290RWxlbWVudCA9PSBudWxsIHx8XG4gICAgICBicm93c2VyU2VsZWN0aW9uID09IG51bGwgfHxcbiAgICAgIGJyb3dzZXJTZWxlY3Rpb24uYW5jaG9yTm9kZSA9PSBudWxsIHx8XG4gICAgICBicm93c2VyU2VsZWN0aW9uLmZvY3VzTm9kZSA9PSBudWxsIHx8XG4gICAgICAhcm9vdEVsZW1lbnQuY29udGFpbnMoYnJvd3NlclNlbGVjdGlvbi5hbmNob3JOb2RlKSB8fFxuICAgICAgIXJvb3RFbGVtZW50LmNvbnRhaW5zKGJyb3dzZXJTZWxlY3Rpb24uZm9jdXNOb2RlKVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gYFxuaW1wb3J0IHtcbiAgaW5pdGlhbGl6ZUUyRSxcbiAgYXNzZXJ0SFRNTFNuYXBzaG90LFxuICBhc3NlcnRTZWxlY3Rpb24sXG4gIHJlcGVhdCxcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtzZWxlY3RBbGx9IGZyb20gJy4uL2tleWJvYXJkU2hvcnRjdXRzJztcbmltcG9ydCB7IFJhbmdlU2VsZWN0aW9uIH0gZnJvbSAnbGV4aWNhbCc7XG5pbXBvcnQgeyBOb2RlU2VsZWN0aW9uIH0gZnJvbSAnbGV4aWNhbCc7XG5cbmRlc2NyaWJlKCdUZXN0IGNhc2UnLCAoKSA9PiB7XG4gIGluaXRpYWxpemVFMkUoKGUyZSkgPT4ge1xuICAgIGl0KCdTaG91bGQgcGFzcyB0aGlzIHRlc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7cGFnZX0gPSBlMmU7XG5cbiAgICAgIGF3YWl0IHBhZ2UuZm9jdXMoJ2Rpdltjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJyk7XG4ke3N0ZXBzLm1hcChmb3JtYXRTdGVwKS5qb2luKGBcXG5gKX1cbiAgICB9KTtcbn0pO1xuICAgIGBcbiAgfSwgW2VkaXRvciwgc3RlcHNdKVxuXG4gIC8vIGp1c3QgYSB3cmFwcGVyIGFyb3VuZCBpbnNlcnRpbmcgbmV3IGFjdGlvbnMgc28gdGhhdCB3ZSBjYW5cbiAgLy8gY29hbGVzY2Ugc29tZSBhY3Rpb25zIGxpa2UgaW5zZXJ0VGV4dC9tb3ZlTmF0aXZlU2VsZWN0aW9uXG4gIGNvbnN0IHB1c2hTdGVwID0gdXNlQ2FsbGJhY2soXG4gICAgKG5hbWU6IHN0cmluZywgdmFsdWU6IFN0ZXBbJ3ZhbHVlJ10pID0+IHtcbiAgICAgIHNldFN0ZXBzKChjdXJyZW50U3RlcHMpID0+IHtcbiAgICAgICAgLy8gdHJ5aW5nIHRvIGdyb3VwIHN0ZXBzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHN0ZXBzLmxlbmd0aCAtIDFcbiAgICAgICAgY29uc3QgbGFzdFN0ZXAgPSBzdGVwc1tjdXJyZW50SW5kZXhdXG4gICAgICAgIGlmIChsYXN0U3RlcCkge1xuICAgICAgICAgIGlmIChsYXN0U3RlcC5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ3R5cGUnKSB7XG4gICAgICAgICAgICAgIC8vIGZvciB0eXBpbmcgZXZlbnRzIHdlIGp1c3QgYXBwZW5kIHRoZSB0ZXh0XG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgLi4uc3RlcHMuc2xpY2UoMCwgY3VycmVudEluZGV4KSxcbiAgICAgICAgICAgICAgICB7IC4uLmxhc3RTdGVwLCB2YWx1ZTogbGFzdFN0ZXAudmFsdWUgKyB2YWx1ZSB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBmb3Igb3RoZXIgZXZlbnRzIHdlIGJ1bXAgdGhlIGNvdW50ZXIgaWYgdGhlaXIgdmFsdWVzIGFyZSB0aGUgc2FtZVxuICAgICAgICAgICAgICBpZiAobGFzdFN0ZXAudmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5zdGVwcy5zbGljZSgwLCBjdXJyZW50SW5kZXgpLCB7IC4uLmxhc3RTdGVwLCBjb3VudDogbGFzdFN0ZXAuY291bnQgKyAxIH1dXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY291bGQgbm90IGdyb3VwLCBqdXN0IGFwcGVuZCBhIG5ldyBvbmVcbiAgICAgICAgcmV0dXJuIFsuLi5jdXJyZW50U3RlcHMsIHsgbmFtZSwgY291bnQ6IDEsIHZhbHVlIH1dXG4gICAgICB9KVxuICAgIH0sXG4gICAgW3N0ZXBzLCBzZXRTdGVwc10sXG4gIClcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uS2V5RG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc1JlY29yZGluZykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleVxuICAgICAgaWYgKGlzU2VsZWN0QWxsKGV2ZW50KSkge1xuICAgICAgICBwdXNoU3RlcCgnc2VsZWN0QWxsJywgJycpXG4gICAgICB9IGVsc2UgaWYgKGtleVByZXNzZXMuaGFzKGtleSkpIHtcbiAgICAgICAgcHVzaFN0ZXAoJ3ByZXNzJywgZXZlbnQua2V5KVxuICAgICAgfSBlbHNlIGlmIChbLi4ua2V5XS5sZW5ndGggPiAxKSB7XG4gICAgICAgIHB1c2hTdGVwKCdrZXlkb3duJywgZXZlbnQua2V5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaFN0ZXAoJ3R5cGUnLCBldmVudC5rZXkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb25LZXlVcCA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc1JlY29yZGluZykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleVxuICAgICAgaWYgKCFrZXlQcmVzc2VzLmhhcyhrZXkpICYmIFsuLi5rZXldLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcHVzaFN0ZXAoJ2tleXVwJywgZXZlbnQua2V5KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlZGl0b3IucmVnaXN0ZXJSb290TGlzdGVuZXIoXG4gICAgICAocm9vdEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCwgcHJldlJvb3RFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHByZXZSb290RWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHByZXZSb290RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duKVxuICAgICAgICAgIHByZXZSb290RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIG9uS2V5VXApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvb3RFbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgcm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93bilcbiAgICAgICAgICByb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIG9uS2V5VXApXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKVxuICB9LCBbZWRpdG9yLCBpc1JlY29yZGluZywgcHVzaFN0ZXBdKVxuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHByZVJlZi5jdXJyZW50KSB7XG4gICAgICBwcmVSZWYuY3VycmVudC5zY3JvbGxUbygwLCBwcmVSZWYuY3VycmVudC5zY3JvbGxIZWlnaHQpXG4gICAgfVxuICB9LCBbZ2VuZXJhdGVUZXN0Q29udGVudF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc3RlcHMpIHtcbiAgICAgIGNvbnN0IHRlc3RDb250ZW50ID0gZ2VuZXJhdGVUZXN0Q29udGVudCgpXG4gICAgICBpZiAodGVzdENvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc2V0VGVtcGxhdGVkVGVzdCh0ZXN0Q29udGVudClcbiAgICAgIH1cbiAgICAgIGlmIChwcmVSZWYuY3VycmVudCkge1xuICAgICAgICBwcmVSZWYuY3VycmVudC5zY3JvbGxUbygwLCBwcmVSZWYuY3VycmVudC5zY3JvbGxIZWlnaHQpXG4gICAgICB9XG4gICAgfVxuICB9LCBbZ2VuZXJhdGVUZXN0Q29udGVudCwgc3RlcHNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcmVtb3ZlVXBkYXRlTGlzdGVuZXIgPSBlZGl0b3IucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcihcbiAgICAgICh7IGRpcnR5RWxlbWVudHMsIGRpcnR5TGVhdmVzLCBlZGl0b3JTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGlmICghaXNSZWNvcmRpbmcpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gZWRpdG9yU3RhdGUuX3NlbGVjdGlvblxuICAgICAgICBjb25zdCBwcmV2aW91c1NlbGVjdGlvbiA9IHByZXZpb3VzU2VsZWN0aW9uUmVmLmN1cnJlbnRcbiAgICAgICAgY29uc3Qgc2tpcE5leHRTZWxlY3Rpb25DaGFuZ2UgPSBza2lwTmV4dFNlbGVjdGlvbkNoYW5nZVJlZi5jdXJyZW50XG4gICAgICAgIGlmIChwcmV2aW91c1NlbGVjdGlvbiAhPT0gY3VycmVudFNlbGVjdGlvbikge1xuICAgICAgICAgIGlmIChkaXJ0eUxlYXZlcy5zaXplID09PSAwICYmIGRpcnR5RWxlbWVudHMuc2l6ZSA9PT0gMCAmJiAhc2tpcE5leHRTZWxlY3Rpb25DaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGJyb3dzZXJTZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgYnJvd3NlclNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgICAoYnJvd3NlclNlbGVjdGlvbi5hbmNob3JOb2RlID09IG51bGwgfHwgYnJvd3NlclNlbGVjdGlvbi5mb2N1c05vZGUgPT0gbnVsbClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcHJldmlvdXNTZWxlY3Rpb25SZWYuY3VycmVudCA9IGN1cnJlbnRTZWxlY3Rpb25cbiAgICAgICAgfVxuICAgICAgICBza2lwTmV4dFNlbGVjdGlvbkNoYW5nZVJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgY29uc3QgdGVzdENvbnRlbnQgPSBnZW5lcmF0ZVRlc3RDb250ZW50KClcbiAgICAgICAgaWYgKHRlc3RDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgc2V0VGVtcGxhdGVkVGVzdCh0ZXN0Q29udGVudClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApXG4gICAgcmV0dXJuIHJlbW92ZVVwZGF0ZUxpc3RlbmVyXG4gIH0sIFtlZGl0b3IsIGdlbmVyYXRlVGVzdENvbnRlbnQsIGlzUmVjb3JkaW5nLCBwdXNoU3RlcF0pXG5cbiAgLy8gc2F2ZSBpbm5lckhUTUxcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzUmVjb3JkaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlVXBkYXRlTGlzdGVuZXIgPSBlZGl0b3IucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcigoKSA9PiB7XG4gICAgICBjb25zdCByb290RWxlbWVudCA9IGVkaXRvci5nZXRSb290RWxlbWVudCgpXG4gICAgICBpZiAocm9vdEVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgc2V0Q3VycmVudElubmVySFRNTChyb290RWxlbWVudD8uaW5uZXJIVE1MKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHJlbW92ZVVwZGF0ZUxpc3RlbmVyXG4gIH0sIFtlZGl0b3IsIGlzUmVjb3JkaW5nXSlcblxuICAvLyBjbGVhciBlZGl0b3IgYW5kIHN0YXJ0IHJlY29yZGluZ1xuICBjb25zdCB0b2dnbGVFZGl0b3JTZWxlY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICAoY3VycmVudEVkaXRvcjogTGV4aWNhbEVkaXRvcikgPT4ge1xuICAgICAgaWYgKCFpc1JlY29yZGluZykge1xuICAgICAgICBjdXJyZW50RWRpdG9yLnVwZGF0ZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgcm9vdCA9ICRnZXRSb290KClcbiAgICAgICAgICByb290LmNsZWFyKClcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gJGNyZWF0ZVRleHROb2RlKClcbiAgICAgICAgICByb290LmFwcGVuZCgkY3JlYXRlUGFyYWdyYXBoTm9kZSgpLmFwcGVuZCh0ZXh0KSlcbiAgICAgICAgICB0ZXh0LnNlbGVjdCgpXG4gICAgICAgIH0pXG4gICAgICAgIHNldFN0ZXBzKFtdKVxuICAgICAgfVxuICAgICAgc2V0SXNSZWNvcmRpbmcoKGN1cnJlbnRJc1JlY29yZGluZykgPT4gIWN1cnJlbnRJc1JlY29yZGluZylcbiAgICB9LFxuICAgIFtpc1JlY29yZGluZ10sXG4gIClcblxuICBjb25zdCBvblNuYXBzaG90Q2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCFpc1JlY29yZGluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGJyb3dzZXJTZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICBpZiAoXG4gICAgICBicm93c2VyU2VsZWN0aW9uID09PSBudWxsIHx8XG4gICAgICBicm93c2VyU2VsZWN0aW9uLmFuY2hvck5vZGUgPT0gbnVsbCB8fFxuICAgICAgYnJvd3NlclNlbGVjdGlvbi5mb2N1c05vZGUgPT0gbnVsbFxuICAgICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHsgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0IH0gPSBzYW5pdGl6ZVNlbGVjdGlvbihicm93c2VyU2VsZWN0aW9uKVxuICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gZ2V0Q3VycmVudEVkaXRvcigpLmdldFJvb3RFbGVtZW50KClcbiAgICBsZXQgYW5jaG9yUGF0aFxuICAgIGlmIChhbmNob3JOb2RlICE9PSBudWxsKSB7XG4gICAgICBhbmNob3JQYXRoID0gZ2V0UGF0aEZyb21Ob2RlVG9FZGl0b3IoYW5jaG9yTm9kZSwgcm9vdEVsZW1lbnQpXG4gICAgfVxuICAgIGxldCBmb2N1c1BhdGhcbiAgICBpZiAoZm9jdXNOb2RlICE9PSBudWxsKSB7XG4gICAgICBmb2N1c1BhdGggPSBnZXRQYXRoRnJvbU5vZGVUb0VkaXRvcihmb2N1c05vZGUsIHJvb3RFbGVtZW50KVxuICAgIH1cbiAgICBwdXNoU3RlcCgnc25hcHNob3QnLCB7XG4gICAgICBhbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0LFxuICAgICAgYW5jaG9yUGF0aCxcbiAgICAgIGZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0LFxuICAgICAgZm9jdXNQYXRoLFxuICAgIH0pXG4gIH0sIFtwdXNoU3RlcCwgaXNSZWNvcmRpbmcsIGdldEN1cnJlbnRFZGl0b3JdKVxuXG4gIGNvbnN0IG9uQ29weUNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvcHkoZ2VuZXJhdGVUZXN0Q29udGVudCgpKVxuICB9LCBbZ2VuZXJhdGVUZXN0Q29udGVudF0pXG5cbiAgY29uc3Qgb25Eb3dubG9hZENsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGRvd25sb2FkKCd0ZXN0LmpzJywgZ2VuZXJhdGVUZXN0Q29udGVudCgpKVxuICB9LCBbZ2VuZXJhdGVUZXN0Q29udGVudF0pXG5cbiAgY29uc3QgYnV0dG9uID0gKFxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzTmFtZT17YGVkaXRvci1kZXYtYnV0dG9uICR7aXNSZWNvcmRpbmcgPyAnYWN0aXZlJyA6ICcnfWB9XG4gICAgICBpZD1cInRlc3QtcmVjb3JkZXItYnV0dG9uXCJcbiAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgIHRvZ2dsZUVkaXRvclNlbGVjdGlvbihnZXRDdXJyZW50RWRpdG9yKCkpXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgfX1cbiAgICAgIHRpdGxlPXtpc1JlY29yZGluZyA/ICdEaXNhYmxlIHRlc3QgcmVjb3JkZXInIDogJ0VuYWJsZSB0ZXN0IHJlY29yZGVyJ31cbiAgICA+XG4gICAgICB7aXNSZWNvcmRpbmcgPyAnRGlzYWJsZSB0ZXN0IHJlY29yZGVyJyA6ICdFbmFibGUgdGVzdCByZWNvcmRlcid9XG4gICAgPC9idXR0b24+XG4gIClcbiAgY29uc3Qgb3V0cHV0ID0gaXNSZWNvcmRpbmcgPyAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXN0LXJlY29yZGVyLW91dHB1dFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXN0LXJlY29yZGVyLXRvb2xiYXJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzTmFtZT1cInRlc3QtcmVjb3JkZXItYnV0dG9uXCJcbiAgICAgICAgICBpZD1cInRlc3QtcmVjb3JkZXItYnV0dG9uLXNuYXBzaG90XCJcbiAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgb25TbmFwc2hvdENsaWNrKClcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIH19XG4gICAgICAgICAgdGl0bGU9XCJJbnNlcnQgc25hcHNob3RcIlxuICAgICAgICA+XG4gICAgICAgICAgSW5zZXJ0IFNuYXBzaG90XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPVwidGVzdC1yZWNvcmRlci1idXR0b25cIlxuICAgICAgICAgIGlkPVwidGVzdC1yZWNvcmRlci1idXR0b24tY29weVwiXG4gICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgIG9uQ29weUNsaWNrKClcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIH19XG4gICAgICAgICAgdGl0bGU9XCJDb3B5IHRvIGNsaXBib2FyZFwiXG4gICAgICAgID5cbiAgICAgICAgICBDb3B5XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPVwidGVzdC1yZWNvcmRlci1idXR0b25cIlxuICAgICAgICAgIGlkPVwidGVzdC1yZWNvcmRlci1idXR0b24tZG93bmxvYWRcIlxuICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICBvbkRvd25sb2FkQ2xpY2soKVxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgfX1cbiAgICAgICAgICB0aXRsZT1cIkRvd25sb2FkIGFzIGEgZmlsZVwiXG4gICAgICAgID5cbiAgICAgICAgICBEb3dubG9hZFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHByZSBpZD1cInRlc3QtcmVjb3JkZXJcIiByZWY9e3ByZVJlZn0+XG4gICAgICAgIHt0ZW1wbGF0ZWRUZXN0fVxuICAgICAgPC9wcmU+XG4gICAgPC9kaXY+XG4gICkgOiBudWxsXG5cbiAgcmV0dXJuIFtidXR0b24sIG91dHB1dF1cbn1cbmV4cG9ydCBjb25zdCBUZXN0UmVjb3JkZXJQbHVnaW46IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCBbZWRpdG9yXSA9IHVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKVxuICBjb25zdCBbdGVzdFJlY29yZGVyQnV0dG9uLCB0ZXN0UmVjb3JkZXJPdXRwdXRdID0gdXNlVGVzdFJlY29yZGVyKGVkaXRvcilcblxuICByZXR1cm4gKFxuICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgIDxwPkhJPC9wPlxuICAgICAge3Rlc3RSZWNvcmRlckJ1dHRvbn1cbiAgICAgIHt0ZXN0UmVjb3JkZXJPdXRwdXR9XG4gICAgICA8cD5ET05FPC9wPlxuICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gIClcbn1cbiJdLCJuYW1lcyI6WyJpc1NlbGVjdEFsbCIsIlRlc3RSZWNvcmRlclBsdWdpbiIsImNvcHkiLCJ0ZXh0IiwidGV4dEFyZWEiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ2YWx1ZSIsInN0eWxlIiwicG9zaXRpb24iLCJvcGFjaXR5IiwiYm9keSIsImFwcGVuZENoaWxkIiwiZm9jdXMiLCJzZWxlY3QiLCJyZXN1bHQiLCJleGVjQ29tbWFuZCIsImNvbnNvbGUiLCJsb2ciLCJlcnJvciIsInJlbW92ZUNoaWxkIiwiZG93bmxvYWQiLCJmaWxlbmFtZSIsImEiLCJzZXRBdHRyaWJ1dGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJkaXNwbGF5IiwiY2xpY2siLCJmb3JtYXRTdGVwIiwic3RlcCIsImZvcm1hdE9uZVN0ZXAiLCJuYW1lIiwieCIsInkiLCJhbmNob3JQYXRoIiwidG9TdHJpbmciLCJhbmNob3JPZmZzZXQiLCJmb2N1c1BhdGgiLCJmb2N1c09mZnNldCIsImZvcm1hdHRlZFN0ZXAiLCJjb3VudCIsImpvaW4iLCJldmVudCIsImtleUNvZGUiLCJJU19BUFBMRSIsIm1ldGFLZXkiLCJjdHJsS2V5Iiwic2FuaXRpemVTZWxlY3Rpb24iLCJzZWxlY3Rpb24iLCJhbmNob3JOb2RlIiwiZm9jdXNOb2RlIiwiZ2V0UGF0aEZyb21Ob2RlVG9FZGl0b3IiLCJub2RlIiwicm9vdEVsZW1lbnQiLCJjdXJyZW50Tm9kZSIsInBhdGgiLCJ1bmRlZmluZWQiLCJ1bnNoaWZ0IiwiQXJyYXkiLCJmcm9tIiwicGFyZW50Tm9kZSIsImNoaWxkTm9kZXMiLCJpbmRleE9mIiwia2V5UHJlc3NlcyIsIlNldCIsInVzZVRlc3RSZWNvcmRlciIsImVkaXRvciIsInN0ZXBzIiwic2V0U3RlcHMiLCJ1c2VTdGF0ZSIsImlzUmVjb3JkaW5nIiwic2V0SXNSZWNvcmRpbmciLCJzZXRDdXJyZW50SW5uZXJIVE1MIiwidGVtcGxhdGVkVGVzdCIsInNldFRlbXBsYXRlZFRlc3QiLCJwcmV2aW91c1NlbGVjdGlvblJlZiIsInVzZVJlZiIsInNraXBOZXh0U2VsZWN0aW9uQ2hhbmdlUmVmIiwicHJlUmVmIiwiZ2V0Q3VycmVudEVkaXRvciIsInVzZUNhbGxiYWNrIiwiZ2VuZXJhdGVUZXN0Q29udGVudCIsImdldFJvb3RFbGVtZW50IiwiYnJvd3NlclNlbGVjdGlvbiIsIndpbmRvdyIsImdldFNlbGVjdGlvbiIsImNvbnRhaW5zIiwibWFwIiwicHVzaFN0ZXAiLCJjdXJyZW50U3RlcHMiLCJjdXJyZW50SW5kZXgiLCJsZW5ndGgiLCJsYXN0U3RlcCIsInNsaWNlIiwidXNlTGF5b3V0RWZmZWN0Iiwib25LZXlEb3duIiwia2V5IiwiaGFzIiwib25LZXlVcCIsInJlZ2lzdGVyUm9vdExpc3RlbmVyIiwicHJldlJvb3RFbGVtZW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJjdXJyZW50Iiwic2Nyb2xsVG8iLCJzY3JvbGxIZWlnaHQiLCJ1c2VFZmZlY3QiLCJ0ZXN0Q29udGVudCIsInJlbW92ZVVwZGF0ZUxpc3RlbmVyIiwicmVnaXN0ZXJVcGRhdGVMaXN0ZW5lciIsImRpcnR5RWxlbWVudHMiLCJkaXJ0eUxlYXZlcyIsImVkaXRvclN0YXRlIiwiY3VycmVudFNlbGVjdGlvbiIsIl9zZWxlY3Rpb24iLCJwcmV2aW91c1NlbGVjdGlvbiIsInNraXBOZXh0U2VsZWN0aW9uQ2hhbmdlIiwic2l6ZSIsImlubmVySFRNTCIsInRvZ2dsZUVkaXRvclNlbGVjdGlvbiIsImN1cnJlbnRFZGl0b3IiLCJ1cGRhdGUiLCJyb290IiwiJGdldFJvb3QiLCJjbGVhciIsIiRjcmVhdGVUZXh0Tm9kZSIsImFwcGVuZCIsIiRjcmVhdGVQYXJhZ3JhcGhOb2RlIiwiY3VycmVudElzUmVjb3JkaW5nIiwib25TbmFwc2hvdENsaWNrIiwib25Db3B5Q2xpY2siLCJvbkRvd25sb2FkQ2xpY2siLCJidXR0b24iLCJjbGFzc05hbWUiLCJpZCIsIm9uQ2xpY2siLCJlIiwicHJldmVudERlZmF1bHQiLCJ0aXRsZSIsIm91dHB1dCIsImRpdiIsInByZSIsInJlZiIsInVzZUxleGljYWxDb21wb3NlckNvbnRleHQiLCJ0ZXN0UmVjb3JkZXJCdXR0b24iLCJ0ZXN0UmVjb3JkZXJPdXRwdXQiLCJSZWFjdCIsIkZyYWdtZW50IiwicCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUFzRmdCQSxXQUFXO2VBQVhBOztJQWlXSEMsa0JBQWtCO2VBQWxCQTs7O3dDQXJiNkI7eUJBQ3NCOytEQUN6Qzs2QkFHRTtRQUNsQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVQLE1BQU1DLE9BQU8sQ0FBQ0M7SUFDWixNQUFNQyxXQUFXQyxTQUFTQyxhQUFhLENBQUM7SUFDeENGLFNBQVNHLEtBQUssR0FBR0osUUFBUTtJQUN6QkMsU0FBU0ksS0FBSyxDQUFDQyxRQUFRLEdBQUc7SUFDMUJMLFNBQVNJLEtBQUssQ0FBQ0UsT0FBTyxHQUFHO0lBQ3pCTCxTQUFTTSxJQUFJLEVBQUVDLFlBQVlSO0lBQzNCQSxTQUFTUyxLQUFLO0lBQ2RULFNBQVNVLE1BQU07SUFDZixJQUFJO1FBQ0YsTUFBTUMsU0FBU1YsU0FBU1csV0FBVyxDQUFDO1FBQ3BDLHNDQUFzQztRQUN0Q0MsUUFBUUMsR0FBRyxDQUFDSDtJQUNkLEVBQUUsT0FBT0ksT0FBTztRQUNkRixRQUFRRSxLQUFLLENBQUNBO0lBQ2hCO0lBQ0FkLFNBQVNNLElBQUksRUFBRVMs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
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
.test-recorder-output {
|
|
2
|
+
margin: 20px auto 20px auto;
|
|
3
|
+
width: 100%;
|
|
4
|
+
}
|
|
5
|
+
.test-recorder-toolbar {
|
|
6
|
+
display: flex;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.test-recorder-button {
|
|
10
|
+
position: relative;
|
|
11
|
+
display: block;
|
|
12
|
+
font-size: 10px;
|
|
13
|
+
padding: 6px 6px;
|
|
14
|
+
border-radius: 4px;
|
|
15
|
+
border: none;
|
|
16
|
+
cursor: pointer;
|
|
17
|
+
outline: none;
|
|
18
|
+
box-shadow: 1px 2px 2px rgba(0, 0, 0, 0.4);
|
|
19
|
+
background-color: #222;
|
|
20
|
+
color: white;
|
|
21
|
+
transition: box-shadow 50ms ease-out;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.test-recorder-button:active {
|
|
25
|
+
box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.4);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.test-recorder-button + .test-recorder-button {
|
|
29
|
+
margin-left: 4px;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.test-recorder-button::after {
|
|
33
|
+
content: '';
|
|
34
|
+
position: absolute;
|
|
35
|
+
top: 8px;
|
|
36
|
+
right: 8px;
|
|
37
|
+
bottom: 8px;
|
|
38
|
+
left: 8px;
|
|
39
|
+
display: block;
|
|
40
|
+
background-size: contain;
|
|
41
|
+
filter: invert(1);
|
|
42
|
+
}
|
|
43
|
+
#test-recorder-button {
|
|
44
|
+
position: relative;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#test-recorder-button-snapshot {
|
|
48
|
+
margin-right: auto;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
@@ -17,7 +17,7 @@ const TreeviewFeature = ()=>{
|
|
|
17
17
|
plugins: [
|
|
18
18
|
{
|
|
19
19
|
Component: _plugin.TreeViewPlugin,
|
|
20
|
-
position: '
|
|
20
|
+
position: 'bottom'
|
|
21
21
|
}
|
|
22
22
|
],
|
|
23
23
|
props: null
|
|
@@ -27,4 +27,4 @@ const TreeviewFeature = ()=>{
|
|
|
27
27
|
};
|
|
28
28
|
};
|
|
29
29
|
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9maWVsZC9mZWF0dXJlcy9kZWJ1Zy9UcmVlVmlldy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZlYXR1cmVQcm92aWRlciB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuXG5pbXBvcnQgJy4vaW5kZXguc2NzcydcbmltcG9ydCB7IFRyZWVWaWV3UGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4nXG5cbmV4cG9ydCBjb25zdCBUcmVldmlld0ZlYXR1cmUgPSAoKTogRmVhdHVyZVByb3ZpZGVyID0+
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9maWVsZC9mZWF0dXJlcy9kZWJ1Zy9UcmVlVmlldy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZlYXR1cmVQcm92aWRlciB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuXG5pbXBvcnQgJy4vaW5kZXguc2NzcydcbmltcG9ydCB7IFRyZWVWaWV3UGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4nXG5cbmV4cG9ydCBjb25zdCBUcmVldmlld0ZlYXR1cmUgPSAoKTogRmVhdHVyZVByb3ZpZGVyID0+IHtcbiAgcmV0dXJuIHtcbiAgICBmZWF0dXJlOiAoeyByZXNvbHZlZEZlYXR1cmVzLCB1bnNhbml0aXplZEVkaXRvckNvbmZpZyB9KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgQ29tcG9uZW50OiBUcmVlVmlld1BsdWdpbixcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYm90dG9tJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgIH1cbiAgICB9LFxuICAgIGtleTogJ2RlYnVnLXRyZWV2aWV3JyxcbiAgfVxufVxuIl0sIm5hbWVzIjpbIlRyZWV2aWV3RmVhdHVyZSIsImZlYXR1cmUiLCJyZXNvbHZlZEZlYXR1cmVzIiwidW5zYW5pdGl6ZWRFZGl0b3JDb25maWciLCJwbHVnaW5zIiwiQ29tcG9uZW50IiwiVHJlZVZpZXdQbHVnaW4iLCJwb3NpdGlvbiIsInByb3BzIiwia2V5Il0sIm1hcHBpbmdzIjoiOzs7OytCQUthQTs7O2VBQUFBOzs7UUFITjt3QkFDd0I7QUFFeEIsTUFBTUEsa0JBQWtCO0lBQzdCLE9BQU87UUFDTEMsU0FBUyxDQUFDLEVBQUVDLGdCQUFnQixFQUFFQyx1QkFBdUIsRUFBRTtZQUNyRCxPQUFPO2dCQUNMQyxTQUFTO29CQUNQO3dCQUNFQyxXQUFXQyxzQkFBYzt3QkFDekJDLFVBQVU7b0JBQ1o7aUJBQ0Q7Z0JBQ0RDLE9BQU87WUFDVDtRQUNGO1FBQ0FDLEtBQUs7SUFDUDtBQUNGIn0=
|
|
@@ -59,6 +59,11 @@ export type Feature = {
|
|
|
59
59
|
plugins?: Array<{
|
|
60
60
|
Component: React.FC;
|
|
61
61
|
position: 'normal';
|
|
62
|
+
} | {
|
|
63
|
+
Component: React.FC<{
|
|
64
|
+
anchorElem: HTMLElement;
|
|
65
|
+
}>;
|
|
66
|
+
position: 'bottom';
|
|
62
67
|
} | {
|
|
63
68
|
Component: React.FC<{
|
|
64
69
|
anchorElem: HTMLElement;
|
|
@@ -127,6 +132,10 @@ export type SanitizedFeatures = Required<Pick<ResolvedFeature, 'markdownTransfor
|
|
|
127
132
|
desktopOnly?: boolean;
|
|
128
133
|
key: string;
|
|
129
134
|
position: 'floatingAnchorElem';
|
|
135
|
+
} | {
|
|
136
|
+
Component: React.FC;
|
|
137
|
+
key: string;
|
|
138
|
+
position: 'bottom';
|
|
130
139
|
}>;
|
|
131
140
|
/** The node types mapped to their populationPromises */
|
|
132
141
|
populationPromises: Map<string, Array<PopulationPromise>>;
|