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