@depup/testing-library__user-event 14.6.3-depup.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/LICENSE +20 -0
- package/README.md +25 -0
- package/changes.json +5 -0
- package/dist/cjs/clipboard/copy.js +22 -0
- package/dist/cjs/clipboard/cut.js +22 -0
- package/dist/cjs/clipboard/index.js +11 -0
- package/dist/cjs/clipboard/paste.js +24 -0
- package/dist/cjs/convenience/click.js +35 -0
- package/dist/cjs/convenience/hover.js +19 -0
- package/dist/cjs/convenience/index.js +14 -0
- package/dist/cjs/convenience/tab.js +7 -0
- package/dist/cjs/document/UI.js +90 -0
- package/dist/cjs/document/copySelection.js +29 -0
- package/dist/cjs/document/getValueOrTextContent.js +18 -0
- package/dist/cjs/document/index.js +17 -0
- package/dist/cjs/document/interceptor.js +104 -0
- package/dist/cjs/document/patchFocus.js +106 -0
- package/dist/cjs/document/prepareDocument.js +58 -0
- package/dist/cjs/document/trackValue.js +57 -0
- package/dist/cjs/event/behavior/click.js +32 -0
- package/dist/cjs/event/behavior/cut.js +14 -0
- package/dist/cjs/event/behavior/index.js +13 -0
- package/dist/cjs/event/behavior/keydown.js +128 -0
- package/dist/cjs/event/behavior/keypress.js +51 -0
- package/dist/cjs/event/behavior/keyup.js +17 -0
- package/dist/cjs/event/behavior/paste.js +18 -0
- package/dist/cjs/event/behavior/registry.js +5 -0
- package/dist/cjs/event/createEvent.js +193 -0
- package/dist/cjs/event/dispatchEvent.js +54 -0
- package/dist/cjs/event/eventMap.js +281 -0
- package/dist/cjs/event/focus.js +34 -0
- package/dist/cjs/event/index.js +22 -0
- package/dist/cjs/event/input.js +158 -0
- package/dist/cjs/event/radio.js +27 -0
- package/dist/cjs/event/selection/getInputRange.js +18 -0
- package/dist/cjs/event/selection/getTargetTypeAndSelection.js +31 -0
- package/dist/cjs/event/selection/index.js +24 -0
- package/dist/cjs/event/selection/modifySelection.js +21 -0
- package/dist/cjs/event/selection/modifySelectionPerMouse.js +40 -0
- package/dist/cjs/event/selection/moveSelection.js +38 -0
- package/dist/cjs/event/selection/resolveCaretPosition.js +60 -0
- package/dist/cjs/event/selection/selectAll.js +38 -0
- package/dist/cjs/event/selection/setSelection.js +21 -0
- package/dist/cjs/event/selection/setSelectionPerMouse.js +79 -0
- package/dist/cjs/event/selection/setSelectionRange.js +31 -0
- package/dist/cjs/event/selection/updateSelectionOnFocus.js +40 -0
- package/dist/cjs/event/types.js +2 -0
- package/dist/cjs/event/wrapEvent.js +10 -0
- package/dist/cjs/index.js +12 -0
- package/dist/cjs/keyboard/index.js +40 -0
- package/dist/cjs/keyboard/keyMap.js +178 -0
- package/dist/cjs/keyboard/parseKeyDef.js +45 -0
- package/dist/cjs/options.js +14 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/pointer/index.js +74 -0
- package/dist/cjs/pointer/keyMap.js +33 -0
- package/dist/cjs/pointer/parseKeyDef.js +23 -0
- package/dist/cjs/setup/api.js +35 -0
- package/dist/cjs/setup/directApi.js +75 -0
- package/dist/cjs/setup/index.js +11 -0
- package/dist/cjs/setup/setup.js +125 -0
- package/dist/cjs/setup/wrapAsync.js +11 -0
- package/dist/cjs/system/index.js +42 -0
- package/dist/cjs/system/keyboard.js +165 -0
- package/dist/cjs/system/pointer/buttons.js +80 -0
- package/dist/cjs/system/pointer/device.js +32 -0
- package/dist/cjs/system/pointer/index.js +156 -0
- package/dist/cjs/system/pointer/mouse.js +204 -0
- package/dist/cjs/system/pointer/pointer.js +129 -0
- package/dist/cjs/system/pointer/shared.js +8 -0
- package/dist/cjs/utility/clear.js +32 -0
- package/dist/cjs/utility/index.js +14 -0
- package/dist/cjs/utility/selectOptions.js +114 -0
- package/dist/cjs/utility/type.js +23 -0
- package/dist/cjs/utility/upload.js +62 -0
- package/dist/cjs/utils/click/isClickableInput.js +20 -0
- package/dist/cjs/utils/dataTransfer/Blob.js +16 -0
- package/dist/cjs/utils/dataTransfer/Clipboard.js +174 -0
- package/dist/cjs/utils/dataTransfer/DataTransfer.js +134 -0
- package/dist/cjs/utils/dataTransfer/FileList.js +24 -0
- package/dist/cjs/utils/edit/isContentEditable.js +18 -0
- package/dist/cjs/utils/edit/isEditable.js +29 -0
- package/dist/cjs/utils/edit/maxLength.js +26 -0
- package/dist/cjs/utils/edit/setFiles.js +58 -0
- package/dist/cjs/utils/edit/timeValue.js +40 -0
- package/dist/cjs/utils/focus/cursor.js +126 -0
- package/dist/cjs/utils/focus/getActiveElement.js +25 -0
- package/dist/cjs/utils/focus/getTabDestination.js +80 -0
- package/dist/cjs/utils/focus/isFocusable.js +9 -0
- package/dist/cjs/utils/focus/selection.js +20 -0
- package/dist/cjs/utils/focus/selector.js +15 -0
- package/dist/cjs/utils/index.js +78 -0
- package/dist/cjs/utils/keyDef/readNextDescriptor.js +91 -0
- package/dist/cjs/utils/misc/cloneEvent.js +7 -0
- package/dist/cjs/utils/misc/findClosest.js +14 -0
- package/dist/cjs/utils/misc/getDocumentFromNode.js +10 -0
- package/dist/cjs/utils/misc/getTreeDiff.js +25 -0
- package/dist/cjs/utils/misc/getWindow.js +19 -0
- package/dist/cjs/utils/misc/isDescendantOrSelf.js +14 -0
- package/dist/cjs/utils/misc/isDisabled.js +33 -0
- package/dist/cjs/utils/misc/isElementType.js +20 -0
- package/dist/cjs/utils/misc/isVisible.js +19 -0
- package/dist/cjs/utils/misc/level.js +17 -0
- package/dist/cjs/utils/misc/wait.js +14 -0
- package/dist/cjs/utils/pointer/cssPointerEvents.js +102 -0
- package/dist/esm/clipboard/copy.js +20 -0
- package/dist/esm/clipboard/cut.js +20 -0
- package/dist/esm/clipboard/index.js +3 -0
- package/dist/esm/clipboard/paste.js +22 -0
- package/dist/esm/convenience/click.js +31 -0
- package/dist/esm/convenience/hover.js +16 -0
- package/dist/esm/convenience/index.js +3 -0
- package/dist/esm/convenience/tab.js +5 -0
- package/dist/esm/document/UI.js +77 -0
- package/dist/esm/document/copySelection.js +27 -0
- package/dist/esm/document/getValueOrTextContent.js +16 -0
- package/dist/esm/document/index.js +4 -0
- package/dist/esm/document/interceptor.js +99 -0
- package/dist/esm/document/patchFocus.js +103 -0
- package/dist/esm/document/prepareDocument.js +56 -0
- package/dist/esm/document/trackValue.js +53 -0
- package/dist/esm/event/behavior/click.js +30 -0
- package/dist/esm/event/behavior/cut.js +12 -0
- package/dist/esm/event/behavior/index.js +7 -0
- package/dist/esm/event/behavior/keydown.js +126 -0
- package/dist/esm/event/behavior/keypress.js +49 -0
- package/dist/esm/event/behavior/keyup.js +15 -0
- package/dist/esm/event/behavior/paste.js +16 -0
- package/dist/esm/event/behavior/registry.js +3 -0
- package/dist/esm/event/createEvent.js +191 -0
- package/dist/esm/event/dispatchEvent.js +50 -0
- package/dist/esm/event/eventMap.js +277 -0
- package/dist/esm/event/focus.js +31 -0
- package/dist/esm/event/index.js +7 -0
- package/dist/esm/event/input.js +156 -0
- package/dist/esm/event/radio.js +25 -0
- package/dist/esm/event/selection/getInputRange.js +16 -0
- package/dist/esm/event/selection/getTargetTypeAndSelection.js +29 -0
- package/dist/esm/event/selection/index.js +9 -0
- package/dist/esm/event/selection/modifySelection.js +19 -0
- package/dist/esm/event/selection/modifySelectionPerMouse.js +38 -0
- package/dist/esm/event/selection/moveSelection.js +36 -0
- package/dist/esm/event/selection/resolveCaretPosition.js +58 -0
- package/dist/esm/event/selection/selectAll.js +35 -0
- package/dist/esm/event/selection/setSelection.js +19 -0
- package/dist/esm/event/selection/setSelectionPerMouse.js +77 -0
- package/dist/esm/event/selection/setSelectionRange.js +29 -0
- package/dist/esm/event/selection/updateSelectionOnFocus.js +38 -0
- package/dist/esm/event/types.js +1 -0
- package/dist/esm/event/wrapEvent.js +8 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/keyboard/index.js +37 -0
- package/dist/esm/keyboard/keyMap.js +176 -0
- package/dist/esm/keyboard/parseKeyDef.js +43 -0
- package/dist/esm/options.js +12 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/pointer/index.js +72 -0
- package/dist/esm/pointer/keyMap.js +31 -0
- package/dist/esm/pointer/parseKeyDef.js +21 -0
- package/dist/esm/setup/api.js +33 -0
- package/dist/esm/setup/directApi.js +58 -0
- package/dist/esm/setup/index.js +9 -0
- package/dist/esm/setup/setup.js +119 -0
- package/dist/esm/setup/wrapAsync.js +9 -0
- package/dist/esm/system/index.js +40 -0
- package/dist/esm/system/keyboard.js +162 -0
- package/dist/esm/system/pointer/buttons.js +74 -0
- package/dist/esm/system/pointer/device.js +30 -0
- package/dist/esm/system/pointer/index.js +154 -0
- package/dist/esm/system/pointer/mouse.js +202 -0
- package/dist/esm/system/pointer/pointer.js +127 -0
- package/dist/esm/system/pointer/shared.js +6 -0
- package/dist/esm/utility/clear.js +30 -0
- package/dist/esm/utility/index.js +4 -0
- package/dist/esm/utility/selectOptions.js +111 -0
- package/dist/esm/utility/type.js +21 -0
- package/dist/esm/utility/upload.js +60 -0
- package/dist/esm/utils/click/isClickableInput.js +18 -0
- package/dist/esm/utils/dataTransfer/Blob.js +14 -0
- package/dist/esm/utils/dataTransfer/Clipboard.js +167 -0
- package/dist/esm/utils/dataTransfer/DataTransfer.js +131 -0
- package/dist/esm/utils/dataTransfer/FileList.js +22 -0
- package/dist/esm/utils/edit/isContentEditable.js +15 -0
- package/dist/esm/utils/edit/isEditable.js +26 -0
- package/dist/esm/utils/edit/maxLength.js +23 -0
- package/dist/esm/utils/edit/setFiles.js +56 -0
- package/dist/esm/utils/edit/timeValue.js +37 -0
- package/dist/esm/utils/focus/cursor.js +124 -0
- package/dist/esm/utils/focus/getActiveElement.js +22 -0
- package/dist/esm/utils/focus/getTabDestination.js +78 -0
- package/dist/esm/utils/focus/isFocusable.js +7 -0
- package/dist/esm/utils/focus/selection.js +17 -0
- package/dist/esm/utils/focus/selector.js +13 -0
- package/dist/esm/utils/index.js +29 -0
- package/dist/esm/utils/keyDef/readNextDescriptor.js +89 -0
- package/dist/esm/utils/misc/cloneEvent.js +5 -0
- package/dist/esm/utils/misc/findClosest.js +12 -0
- package/dist/esm/utils/misc/getDocumentFromNode.js +8 -0
- package/dist/esm/utils/misc/getTreeDiff.js +23 -0
- package/dist/esm/utils/misc/getWindow.js +17 -0
- package/dist/esm/utils/misc/isDescendantOrSelf.js +12 -0
- package/dist/esm/utils/misc/isDisabled.js +31 -0
- package/dist/esm/utils/misc/isElementType.js +18 -0
- package/dist/esm/utils/misc/isVisible.js +17 -0
- package/dist/esm/utils/misc/level.js +13 -0
- package/dist/esm/utils/misc/wait.js +12 -0
- package/dist/esm/utils/pointer/cssPointerEvents.js +99 -0
- package/dist/types/clipboard/copy.d.ts +2 -0
- package/dist/types/clipboard/cut.d.ts +2 -0
- package/dist/types/clipboard/index.d.ts +3 -0
- package/dist/types/clipboard/paste.d.ts +2 -0
- package/dist/types/convenience/click.d.ts +4 -0
- package/dist/types/convenience/hover.d.ts +3 -0
- package/dist/types/convenience/index.d.ts +3 -0
- package/dist/types/convenience/tab.d.ts +4 -0
- package/dist/types/document/UI.d.ts +42 -0
- package/dist/types/document/copySelection.d.ts +1 -0
- package/dist/types/document/getValueOrTextContent.d.ts +1 -0
- package/dist/types/document/index.d.ts +5 -0
- package/dist/types/document/interceptor.d.ts +19 -0
- package/dist/types/document/patchFocus.d.ts +9 -0
- package/dist/types/document/prepareDocument.d.ts +8 -0
- package/dist/types/document/trackValue.d.ts +17 -0
- package/dist/types/event/behavior/click.d.ts +1 -0
- package/dist/types/event/behavior/cut.d.ts +1 -0
- package/dist/types/event/behavior/index.d.ts +8 -0
- package/dist/types/event/behavior/keydown.d.ts +1 -0
- package/dist/types/event/behavior/keypress.d.ts +1 -0
- package/dist/types/event/behavior/keyup.d.ts +1 -0
- package/dist/types/event/behavior/paste.d.ts +1 -0
- package/dist/types/event/behavior/registry.d.ts +8 -0
- package/dist/types/event/createEvent.d.ts +2 -0
- package/dist/types/event/dispatchEvent.d.ts +5 -0
- package/dist/types/event/eventMap.d.ts +265 -0
- package/dist/types/event/focus.d.ts +5 -0
- package/dist/types/event/index.d.ts +7 -0
- package/dist/types/event/input.d.ts +2 -0
- package/dist/types/event/radio.d.ts +4 -0
- package/dist/types/event/selection/getInputRange.d.ts +5 -0
- package/dist/types/event/selection/getTargetTypeAndSelection.d.ts +10 -0
- package/dist/types/event/selection/index.d.ts +15 -0
- package/dist/types/event/selection/modifySelection.d.ts +8 -0
- package/dist/types/event/selection/modifySelectionPerMouse.d.ts +7 -0
- package/dist/types/event/selection/moveSelection.d.ts +4 -0
- package/dist/types/event/selection/resolveCaretPosition.d.ts +8 -0
- package/dist/types/event/selection/selectAll.d.ts +5 -0
- package/dist/types/event/selection/setSelection.d.ts +10 -0
- package/dist/types/event/selection/setSelectionPerMouse.d.ts +8 -0
- package/dist/types/event/selection/setSelectionRange.d.ts +6 -0
- package/dist/types/event/selection/updateSelectionOnFocus.d.ts +5 -0
- package/dist/types/event/types.d.ts +20 -0
- package/dist/types/event/wrapEvent.d.ts +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/keyboard/index.d.ts +3 -0
- package/dist/types/keyboard/keyMap.d.ts +5 -0
- package/dist/types/keyboard/parseKeyDef.d.ts +17 -0
- package/dist/types/options.d.ts +115 -0
- package/dist/types/pointer/index.d.ts +28 -0
- package/dist/types/pointer/keyMap.d.ts +2 -0
- package/dist/types/pointer/parseKeyDef.d.ts +6 -0
- package/dist/types/setup/api.d.ts +23 -0
- package/dist/types/setup/directApi.d.ts +24 -0
- package/dist/types/setup/index.d.ts +22 -0
- package/dist/types/setup/setup.d.ts +44 -0
- package/dist/types/setup/wrapAsync.d.ts +4 -0
- package/dist/types/system/index.d.ts +10 -0
- package/dist/types/system/keyboard.d.ts +50 -0
- package/dist/types/system/pointer/buttons.d.ts +23 -0
- package/dist/types/system/pointer/device.d.ts +8 -0
- package/dist/types/system/pointer/index.d.ts +21 -0
- package/dist/types/system/pointer/mouse.d.ts +31 -0
- package/dist/types/system/pointer/pointer.d.ts +32 -0
- package/dist/types/system/pointer/shared.d.ts +20 -0
- package/dist/types/utility/clear.d.ts +2 -0
- package/dist/types/utility/index.d.ts +4 -0
- package/dist/types/utility/selectOptions.d.ts +3 -0
- package/dist/types/utility/type.d.ts +9 -0
- package/dist/types/utility/upload.d.ts +5 -0
- package/dist/types/utils/click/isClickableInput.d.ts +15 -0
- package/dist/types/utils/dataTransfer/Blob.d.ts +3 -0
- package/dist/types/utils/dataTransfer/Clipboard.d.ts +11 -0
- package/dist/types/utils/dataTransfer/DataTransfer.d.ts +2 -0
- package/dist/types/utils/dataTransfer/FileList.d.ts +1 -0
- package/dist/types/utils/edit/isContentEditable.d.ts +7 -0
- package/dist/types/utils/edit/isEditable.d.ts +24 -0
- package/dist/types/utils/edit/maxLength.d.ts +14 -0
- package/dist/types/utils/edit/setFiles.d.ts +12 -0
- package/dist/types/utils/edit/timeValue.d.ts +4 -0
- package/dist/types/utils/focus/cursor.d.ts +9 -0
- package/dist/types/utils/focus/getActiveElement.d.ts +2 -0
- package/dist/types/utils/focus/getTabDestination.d.ts +1 -0
- package/dist/types/utils/focus/isFocusable.d.ts +1 -0
- package/dist/types/utils/focus/selection.d.ts +8 -0
- package/dist/types/utils/focus/selector.d.ts +1 -0
- package/dist/types/utils/index.d.ts +29 -0
- package/dist/types/utils/keyDef/readNextDescriptor.d.ts +21 -0
- package/dist/types/utils/misc/cloneEvent.d.ts +1 -0
- package/dist/types/utils/misc/findClosest.d.ts +1 -0
- package/dist/types/utils/misc/getDocumentFromNode.d.ts +1 -0
- package/dist/types/utils/misc/getTreeDiff.d.ts +1 -0
- package/dist/types/utils/misc/getWindow.d.ts +1 -0
- package/dist/types/utils/misc/isDescendantOrSelf.d.ts +1 -0
- package/dist/types/utils/misc/isDisabled.d.ts +1 -0
- package/dist/types/utils/misc/isElementType.d.ts +5 -0
- package/dist/types/utils/misc/isVisible.d.ts +1 -0
- package/dist/types/utils/misc/level.d.ts +8 -0
- package/dist/types/utils/misc/wait.d.ts +2 -0
- package/dist/types/utils/pointer/cssPointerEvents.d.ts +19 -0
- package/package.json +131 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { isContentEditable } from '../edit/isContentEditable.js';
|
|
2
|
+
import { isElementType } from '../misc/isElementType.js';
|
|
3
|
+
|
|
4
|
+
function getNextCursorPosition(node, offset, direction, inputType) {
|
|
5
|
+
// The behavior at text node zero offset is inconsistent.
|
|
6
|
+
// When walking backwards:
|
|
7
|
+
// Firefox always moves to zero offset and jumps over last offset.
|
|
8
|
+
// Chrome jumps over zero offset per default but over last offset when Shift is pressed.
|
|
9
|
+
// The cursor always moves to zero offset if the focus area (contenteditable or body) ends there.
|
|
10
|
+
// When walking forward both ignore zero offset.
|
|
11
|
+
// When walking over input elements the cursor moves before or after that element.
|
|
12
|
+
// When walking over line breaks the cursor moves inside any following text node.
|
|
13
|
+
if (isTextNode(node) && offset + direction >= 0 && offset + direction <= node.nodeValue.length) {
|
|
14
|
+
return {
|
|
15
|
+
node,
|
|
16
|
+
offset: offset + direction
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const nextNode = getNextCharacterContentNode(node, offset, direction);
|
|
20
|
+
if (nextNode) {
|
|
21
|
+
if (isTextNode(nextNode)) {
|
|
22
|
+
return {
|
|
23
|
+
node: nextNode,
|
|
24
|
+
offset: direction > 0 ? Math.min(1, nextNode.nodeValue.length) : Math.max(nextNode.nodeValue.length - 1, 0)
|
|
25
|
+
};
|
|
26
|
+
} else if (isElementType(nextNode, 'br')) {
|
|
27
|
+
const nextPlusOne = getNextCharacterContentNode(nextNode, undefined, direction);
|
|
28
|
+
if (!nextPlusOne) {
|
|
29
|
+
// The behavior when there is no possible cursor position beyond the line break is inconsistent.
|
|
30
|
+
// In Chrome outside of contenteditable moving before a leading line break is possible.
|
|
31
|
+
// A leading line break can still be removed per deleteContentBackward.
|
|
32
|
+
// A trailing line break on the other hand is not removed by deleteContentForward.
|
|
33
|
+
if (direction < 0 && inputType === 'deleteContentBackward') {
|
|
34
|
+
return {
|
|
35
|
+
node: nextNode.parentNode,
|
|
36
|
+
offset: getOffset(nextNode)
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
} else if (isTextNode(nextPlusOne)) {
|
|
41
|
+
return {
|
|
42
|
+
node: nextPlusOne,
|
|
43
|
+
offset: direction > 0 ? 0 : nextPlusOne.nodeValue.length
|
|
44
|
+
};
|
|
45
|
+
} else if (direction < 0 && isElementType(nextPlusOne, 'br')) {
|
|
46
|
+
return {
|
|
47
|
+
node: nextNode.parentNode,
|
|
48
|
+
offset: getOffset(nextNode)
|
|
49
|
+
};
|
|
50
|
+
} else {
|
|
51
|
+
return {
|
|
52
|
+
node: nextPlusOne.parentNode,
|
|
53
|
+
offset: getOffset(nextPlusOne) + (direction > 0 ? 0 : 1)
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
} else {
|
|
57
|
+
return {
|
|
58
|
+
node: nextNode.parentNode,
|
|
59
|
+
offset: getOffset(nextNode) + (direction > 0 ? 1 : 0)
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function getNextCharacterContentNode(node, offset, direction) {
|
|
65
|
+
const nextOffset = Number(offset) + (direction < 0 ? -1 : 0);
|
|
66
|
+
if (offset !== undefined && isElement(node) && nextOffset >= 0 && nextOffset < node.children.length) {
|
|
67
|
+
node = node.children[nextOffset];
|
|
68
|
+
}
|
|
69
|
+
return walkNodes(node, direction === 1 ? 'next' : 'previous', isTreatedAsCharacterContent);
|
|
70
|
+
}
|
|
71
|
+
function isTreatedAsCharacterContent(node) {
|
|
72
|
+
if (isTextNode(node)) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
if (isElement(node)) {
|
|
76
|
+
if (isElementType(node, [
|
|
77
|
+
'input',
|
|
78
|
+
'textarea'
|
|
79
|
+
])) {
|
|
80
|
+
return node.type !== 'hidden';
|
|
81
|
+
} else if (isElementType(node, 'br')) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
function getOffset(node) {
|
|
88
|
+
let i = 0;
|
|
89
|
+
while(node.previousSibling){
|
|
90
|
+
i++;
|
|
91
|
+
node = node.previousSibling;
|
|
92
|
+
}
|
|
93
|
+
return i;
|
|
94
|
+
}
|
|
95
|
+
function isElement(node) {
|
|
96
|
+
return node.nodeType === 1;
|
|
97
|
+
}
|
|
98
|
+
function isTextNode(node) {
|
|
99
|
+
return node.nodeType === 3;
|
|
100
|
+
}
|
|
101
|
+
function walkNodes(node, direction, callback) {
|
|
102
|
+
for(;;){
|
|
103
|
+
var _node_ownerDocument;
|
|
104
|
+
const sibling = node[`${direction}Sibling`];
|
|
105
|
+
if (sibling) {
|
|
106
|
+
node = getDescendant(sibling, direction === 'next' ? 'first' : 'last');
|
|
107
|
+
if (callback(node)) {
|
|
108
|
+
return node;
|
|
109
|
+
}
|
|
110
|
+
} else if (node.parentNode && (!isElement(node.parentNode) || !isContentEditable(node.parentNode) && node.parentNode !== ((_node_ownerDocument = node.ownerDocument) === null || _node_ownerDocument === void 0 ? void 0 : _node_ownerDocument.body))) {
|
|
111
|
+
node = node.parentNode;
|
|
112
|
+
} else {
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function getDescendant(node, direction) {
|
|
118
|
+
while(node.hasChildNodes()){
|
|
119
|
+
node = node[`${direction}Child`];
|
|
120
|
+
}
|
|
121
|
+
return node;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export { getNextCursorPosition };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { isDisabled } from '../misc/isDisabled.js';
|
|
2
|
+
|
|
3
|
+
function getActiveElement(document) {
|
|
4
|
+
const activeElement = document.activeElement;
|
|
5
|
+
if (activeElement === null || activeElement === void 0 ? void 0 : activeElement.shadowRoot) {
|
|
6
|
+
const activeElementInShadowTree = getActiveElement(activeElement.shadowRoot);
|
|
7
|
+
if (activeElementInShadowTree) {
|
|
8
|
+
return activeElementInShadowTree;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
// Browser does not yield disabled elements as document.activeElement - jsdom does
|
|
12
|
+
if (isDisabled(activeElement)) {
|
|
13
|
+
return document.ownerDocument ? /* istanbul ignore next */ document.ownerDocument.body : document.body;
|
|
14
|
+
}
|
|
15
|
+
return activeElement;
|
|
16
|
+
}
|
|
17
|
+
function getActiveElementOrBody(document) {
|
|
18
|
+
var _getActiveElement;
|
|
19
|
+
return (_getActiveElement = getActiveElement(document)) !== null && _getActiveElement !== void 0 ? _getActiveElement : /* istanbul ignore next */ document.body;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { getActiveElement, getActiveElementOrBody };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { isDisabled } from '../misc/isDisabled.js';
|
|
2
|
+
import { isElementType } from '../misc/isElementType.js';
|
|
3
|
+
import { isVisible } from '../misc/isVisible.js';
|
|
4
|
+
import { FOCUSABLE_SELECTOR } from './selector.js';
|
|
5
|
+
|
|
6
|
+
function getTabDestination(activeElement, shift) {
|
|
7
|
+
const document = activeElement.ownerDocument;
|
|
8
|
+
const focusableElements = document.querySelectorAll(FOCUSABLE_SELECTOR);
|
|
9
|
+
const enabledElements = Array.from(focusableElements).filter((el)=>el === activeElement || !(Number(el.getAttribute('tabindex')) < 0 || isDisabled(el)));
|
|
10
|
+
// tabindex has no effect if the active element has negative tabindex
|
|
11
|
+
if (Number(activeElement.getAttribute('tabindex')) >= 0) {
|
|
12
|
+
enabledElements.sort((a, b)=>{
|
|
13
|
+
const i = Number(a.getAttribute('tabindex'));
|
|
14
|
+
const j = Number(b.getAttribute('tabindex'));
|
|
15
|
+
if (i === j) {
|
|
16
|
+
return 0;
|
|
17
|
+
} else if (i === 0) {
|
|
18
|
+
return 1;
|
|
19
|
+
} else if (j === 0) {
|
|
20
|
+
return -1;
|
|
21
|
+
}
|
|
22
|
+
return i - j;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const checkedRadio = {};
|
|
26
|
+
let prunedElements = [
|
|
27
|
+
document.body
|
|
28
|
+
];
|
|
29
|
+
const activeRadioGroup = isElementType(activeElement, 'input', {
|
|
30
|
+
type: 'radio'
|
|
31
|
+
}) ? activeElement.name : undefined;
|
|
32
|
+
enabledElements.forEach((currentElement)=>{
|
|
33
|
+
const el = currentElement;
|
|
34
|
+
// For radio groups keep only the active radio
|
|
35
|
+
// If there is no active radio, keep only the checked radio
|
|
36
|
+
// If there is no checked radio, treat like everything else
|
|
37
|
+
if (isElementType(el, 'input', {
|
|
38
|
+
type: 'radio'
|
|
39
|
+
}) && el.name) {
|
|
40
|
+
// If the active element is part of the group, add only that
|
|
41
|
+
if (el === activeElement) {
|
|
42
|
+
prunedElements.push(el);
|
|
43
|
+
return;
|
|
44
|
+
} else if (el.name === activeRadioGroup) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// If we stumble upon a checked radio, remove the others
|
|
48
|
+
if (el.checked) {
|
|
49
|
+
prunedElements = prunedElements.filter((e)=>!isElementType(e, 'input', {
|
|
50
|
+
type: 'radio',
|
|
51
|
+
name: el.name
|
|
52
|
+
}));
|
|
53
|
+
prunedElements.push(el);
|
|
54
|
+
checkedRadio[el.name] = el;
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// If we already found the checked one, skip
|
|
58
|
+
if (typeof checkedRadio[el.name] !== 'undefined') {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
prunedElements.push(el);
|
|
63
|
+
});
|
|
64
|
+
for(let index = prunedElements.findIndex((el)=>el === activeElement);;){
|
|
65
|
+
index += shift ? -1 : 1;
|
|
66
|
+
// loop at overflow
|
|
67
|
+
if (index === prunedElements.length) {
|
|
68
|
+
index = 0;
|
|
69
|
+
} else if (index === -1) {
|
|
70
|
+
index = prunedElements.length - 1;
|
|
71
|
+
}
|
|
72
|
+
if (prunedElements[index] === activeElement || prunedElements[index] === document.body || isVisible(prunedElements[index])) {
|
|
73
|
+
return prunedElements[index];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { getTabDestination };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { isClickableInput } from '../click/isClickableInput.js';
|
|
2
|
+
import { isEditableInputOrTextArea } from '../edit/isEditable.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Determine if the element has its own selection implementation
|
|
6
|
+
* and does not interact with the Document Selection API.
|
|
7
|
+
*/ function hasOwnSelection(node) {
|
|
8
|
+
return isElement(node) && isEditableInputOrTextArea(node);
|
|
9
|
+
}
|
|
10
|
+
function hasNoSelection(node) {
|
|
11
|
+
return isElement(node) && isClickableInput(node);
|
|
12
|
+
}
|
|
13
|
+
function isElement(node) {
|
|
14
|
+
return node.nodeType === 1;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { hasNoSelection, hasOwnSelection };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const FOCUSABLE_SELECTOR = [
|
|
2
|
+
'input:not([type=hidden]):not([disabled])',
|
|
3
|
+
'button:not([disabled])',
|
|
4
|
+
'select:not([disabled])',
|
|
5
|
+
'textarea:not([disabled])',
|
|
6
|
+
'[contenteditable=""]',
|
|
7
|
+
'[contenteditable="true"]',
|
|
8
|
+
'a[href]',
|
|
9
|
+
'[tabindex]:not([disabled])',
|
|
10
|
+
'details > summary'
|
|
11
|
+
].join(', ');
|
|
12
|
+
|
|
13
|
+
export { FOCUSABLE_SELECTOR };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export { isClickableInput } from './click/isClickableInput.js';
|
|
2
|
+
export { readBlobText } from './dataTransfer/Blob.js';
|
|
3
|
+
export { createDataTransfer, getBlobFromDataTransferItem } from './dataTransfer/DataTransfer.js';
|
|
4
|
+
export { createFileList } from './dataTransfer/FileList.js';
|
|
5
|
+
export { attachClipboardStubToView, createClipboardItem, detachClipboardStubFromView, readDataTransferFromClipboard, resetClipboardStubOnView, writeDataTransferToClipboard } from './dataTransfer/Clipboard.js';
|
|
6
|
+
export { buildTimeValue, isValidDateOrTimeValue } from './edit/timeValue.js';
|
|
7
|
+
export { getContentEditable, isContentEditable } from './edit/isContentEditable.js';
|
|
8
|
+
export { isEditable, isEditableInputOrTextArea } from './edit/isEditable.js';
|
|
9
|
+
export { getMaxLength, supportsMaxLength } from './edit/maxLength.js';
|
|
10
|
+
export { setFiles } from './edit/setFiles.js';
|
|
11
|
+
export { getNextCursorPosition } from './focus/cursor.js';
|
|
12
|
+
export { getActiveElement, getActiveElementOrBody } from './focus/getActiveElement.js';
|
|
13
|
+
export { getTabDestination } from './focus/getTabDestination.js';
|
|
14
|
+
export { isFocusable } from './focus/isFocusable.js';
|
|
15
|
+
export { hasNoSelection, hasOwnSelection } from './focus/selection.js';
|
|
16
|
+
export { FOCUSABLE_SELECTOR } from './focus/selector.js';
|
|
17
|
+
export { readNextDescriptor } from './keyDef/readNextDescriptor.js';
|
|
18
|
+
export { cloneEvent } from './misc/cloneEvent.js';
|
|
19
|
+
export { findClosest } from './misc/findClosest.js';
|
|
20
|
+
export { getDocumentFromNode } from './misc/getDocumentFromNode.js';
|
|
21
|
+
export { getTreeDiff } from './misc/getTreeDiff.js';
|
|
22
|
+
export { getWindow } from './misc/getWindow.js';
|
|
23
|
+
export { isDescendantOrSelf } from './misc/isDescendantOrSelf.js';
|
|
24
|
+
export { isElementType } from './misc/isElementType.js';
|
|
25
|
+
export { isVisible } from './misc/isVisible.js';
|
|
26
|
+
export { isDisabled } from './misc/isDisabled.js';
|
|
27
|
+
export { ApiLevel, getLevelRef, setLevelRef } from './misc/level.js';
|
|
28
|
+
export { wait } from './misc/wait.js';
|
|
29
|
+
export { assertPointerEvents, hasPointerEvents } from './pointer/cssPointerEvents.js';
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
const bracketDict = {
|
|
2
|
+
'{': '}',
|
|
3
|
+
'[': ']'
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Read the next key definition from user input
|
|
7
|
+
*
|
|
8
|
+
* Describe key per `{descriptor}` or `[descriptor]`.
|
|
9
|
+
* Everything else will be interpreted as a single character as descriptor - e.g. `a`.
|
|
10
|
+
* Brackets `{` and `[` can be escaped by doubling - e.g. `foo[[bar` translates to `foo[bar`.
|
|
11
|
+
* A previously pressed key can be released per `{/descriptor}`.
|
|
12
|
+
* Keeping the key pressed can be written as `{descriptor>}`.
|
|
13
|
+
* When keeping the key pressed you can choose how long the key is pressed `{descriptor>3}`.
|
|
14
|
+
* You can then release the key per `{descriptor>3/}` or keep it pressed and continue with the next key.
|
|
15
|
+
*/ function readNextDescriptor(text, context) {
|
|
16
|
+
let pos = 0;
|
|
17
|
+
const startBracket = text[pos] in bracketDict ? text[pos] : '';
|
|
18
|
+
pos += startBracket.length;
|
|
19
|
+
const isEscapedChar = new RegExp(`^\\${startBracket}{2}`).test(text);
|
|
20
|
+
const type = isEscapedChar ? '' : startBracket;
|
|
21
|
+
return {
|
|
22
|
+
type,
|
|
23
|
+
...type === '' ? readPrintableChar(text, pos, context) : readTag(text, pos, type, context)
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function readPrintableChar(text, pos, context) {
|
|
27
|
+
const descriptor = text[pos];
|
|
28
|
+
assertDescriptor(descriptor, text, pos, context);
|
|
29
|
+
pos += descriptor.length;
|
|
30
|
+
return {
|
|
31
|
+
consumedLength: pos,
|
|
32
|
+
descriptor,
|
|
33
|
+
releasePrevious: false,
|
|
34
|
+
releaseSelf: true,
|
|
35
|
+
repeat: 1
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function readTag(text, pos, startBracket, context) {
|
|
39
|
+
var _ref;
|
|
40
|
+
var _text_slice_match, _text_slice_match1;
|
|
41
|
+
const releasePreviousModifier = text[pos] === '/' ? '/' : '';
|
|
42
|
+
pos += releasePreviousModifier.length;
|
|
43
|
+
const escapedDescriptor = startBracket === '{' && text[pos] === '\\';
|
|
44
|
+
pos += Number(escapedDescriptor);
|
|
45
|
+
const descriptor = escapedDescriptor ? text[pos] : (_text_slice_match = text.slice(pos).match(startBracket === '{' ? /^\w+|^[^}>/]/ : /^\w+/)) === null || _text_slice_match === void 0 ? void 0 : _text_slice_match[0];
|
|
46
|
+
assertDescriptor(descriptor, text, pos, context);
|
|
47
|
+
pos += descriptor.length;
|
|
48
|
+
const repeatModifier = (_ref = (_text_slice_match1 = text.slice(pos).match(/^>\d+/)) === null || _text_slice_match1 === void 0 ? void 0 : _text_slice_match1[0]) !== null && _ref !== void 0 ? _ref : '';
|
|
49
|
+
pos += repeatModifier.length;
|
|
50
|
+
const releaseSelfModifier = text[pos] === '/' || !repeatModifier && text[pos] === '>' ? text[pos] : '';
|
|
51
|
+
pos += releaseSelfModifier.length;
|
|
52
|
+
const expectedEndBracket = bracketDict[startBracket];
|
|
53
|
+
const endBracket = text[pos] === expectedEndBracket ? expectedEndBracket : '';
|
|
54
|
+
if (!endBracket) {
|
|
55
|
+
throw new Error(getErrorMessage([
|
|
56
|
+
!repeatModifier && 'repeat modifier',
|
|
57
|
+
!releaseSelfModifier && 'release modifier',
|
|
58
|
+
`"${expectedEndBracket}"`
|
|
59
|
+
].filter(Boolean).join(' or '), text[pos], text, context));
|
|
60
|
+
}
|
|
61
|
+
pos += endBracket.length;
|
|
62
|
+
return {
|
|
63
|
+
consumedLength: pos,
|
|
64
|
+
descriptor,
|
|
65
|
+
releasePrevious: !!releasePreviousModifier,
|
|
66
|
+
repeat: repeatModifier ? Math.max(Number(repeatModifier.substr(1)), 1) : 1,
|
|
67
|
+
releaseSelf: hasReleaseSelf(releaseSelfModifier, repeatModifier)
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function assertDescriptor(descriptor, text, pos, context) {
|
|
71
|
+
if (!descriptor) {
|
|
72
|
+
throw new Error(getErrorMessage('key descriptor', text[pos], text, context));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function hasReleaseSelf(releaseSelfModifier, repeatModifier) {
|
|
76
|
+
if (releaseSelfModifier) {
|
|
77
|
+
return releaseSelfModifier === '/';
|
|
78
|
+
}
|
|
79
|
+
if (repeatModifier) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function getErrorMessage(expected, found, text, context) {
|
|
84
|
+
return `Expected ${expected} but found "${found !== null && found !== void 0 ? found : ''}" in "${text}"
|
|
85
|
+
See ${context === 'pointer' ? `https://testing-library.com/docs/user-event/pointer#pressing-a-button-or-touching-the-screen` : `https://testing-library.com/docs/user-event/keyboard`}
|
|
86
|
+
for more information about how userEvent parses your input.`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export { readNextDescriptor };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function getTreeDiff(a, b) {
|
|
2
|
+
const treeA = [];
|
|
3
|
+
for(let el = a; el; el = el.parentElement){
|
|
4
|
+
treeA.push(el);
|
|
5
|
+
}
|
|
6
|
+
const treeB = [];
|
|
7
|
+
for(let el = b; el; el = el.parentElement){
|
|
8
|
+
treeB.push(el);
|
|
9
|
+
}
|
|
10
|
+
let i = 0;
|
|
11
|
+
for(;; i++){
|
|
12
|
+
if (i >= treeA.length || i >= treeB.length || treeA[treeA.length - 1 - i] !== treeB[treeB.length - 1 - i]) {
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return [
|
|
17
|
+
treeA.slice(0, treeA.length - i),
|
|
18
|
+
treeB.slice(0, treeB.length - i),
|
|
19
|
+
treeB.slice(treeB.length - i)
|
|
20
|
+
];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { getTreeDiff };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function getWindow(node) {
|
|
2
|
+
var _node_ownerDocument;
|
|
3
|
+
if (isDocument(node) && node.defaultView) {
|
|
4
|
+
return node.defaultView;
|
|
5
|
+
} else if ((_node_ownerDocument = node.ownerDocument) === null || _node_ownerDocument === void 0 ? void 0 : _node_ownerDocument.defaultView) {
|
|
6
|
+
return node.ownerDocument.defaultView;
|
|
7
|
+
}
|
|
8
|
+
throw new Error(`Could not determine window of node. Node was ${describe(node)}`);
|
|
9
|
+
}
|
|
10
|
+
function isDocument(node) {
|
|
11
|
+
return node.nodeType === 9;
|
|
12
|
+
}
|
|
13
|
+
function describe(val) {
|
|
14
|
+
return typeof val === 'function' ? `function ${val.name}` : val === null ? 'null' : String(val);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { getWindow };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
function isDescendantOrSelf(potentialDescendant, potentialAncestor) {
|
|
2
|
+
let el = potentialDescendant;
|
|
3
|
+
do {
|
|
4
|
+
if (el === potentialAncestor) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
el = el.parentElement;
|
|
8
|
+
}while (el)
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { isDescendantOrSelf };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { isElementType } from './isElementType.js';
|
|
2
|
+
|
|
3
|
+
// This should probably just rely on the :disabled pseudo-class, but JSDOM doesn't implement it properly.
|
|
4
|
+
function isDisabled(element) {
|
|
5
|
+
for(let el = element; el; el = el.parentElement){
|
|
6
|
+
if (isElementType(el, [
|
|
7
|
+
'button',
|
|
8
|
+
'input',
|
|
9
|
+
'select',
|
|
10
|
+
'textarea',
|
|
11
|
+
'optgroup',
|
|
12
|
+
'option'
|
|
13
|
+
])) {
|
|
14
|
+
if (el.hasAttribute('disabled')) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
} else if (isElementType(el, 'fieldset')) {
|
|
18
|
+
var _el_querySelector;
|
|
19
|
+
if (el.hasAttribute('disabled') && !((_el_querySelector = el.querySelector(':scope > legend')) === null || _el_querySelector === void 0 ? void 0 : _el_querySelector.contains(element))) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
} else if (el.tagName.includes('-')) {
|
|
23
|
+
if (el.constructor.formAssociated && el.hasAttribute('disabled')) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { isDisabled };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
function isElementType(element, tag, props) {
|
|
2
|
+
if (element.namespaceURI && element.namespaceURI !== 'http://www.w3.org/1999/xhtml') {
|
|
3
|
+
return false;
|
|
4
|
+
}
|
|
5
|
+
tag = Array.isArray(tag) ? tag : [
|
|
6
|
+
tag
|
|
7
|
+
];
|
|
8
|
+
// tagName is uppercase in HTMLDocument and lowercase in XMLDocument
|
|
9
|
+
if (!tag.includes(element.tagName.toLowerCase())) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (props) {
|
|
13
|
+
return Object.entries(props).every(([k, v])=>element[k] === v);
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { isElementType };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getWindow } from './getWindow.js';
|
|
2
|
+
|
|
3
|
+
function isVisible(element) {
|
|
4
|
+
const window = getWindow(element);
|
|
5
|
+
for(let el = element; el === null || el === void 0 ? void 0 : el.ownerDocument; el = el.parentElement){
|
|
6
|
+
const { display, visibility } = window.getComputedStyle(el);
|
|
7
|
+
if (display === 'none') {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
if (visibility === 'hidden') {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { isVisible };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
var ApiLevel = /*#__PURE__*/ function(ApiLevel) {
|
|
2
|
+
ApiLevel[ApiLevel["Trigger"] = 2] = "Trigger";
|
|
3
|
+
ApiLevel[ApiLevel["Call"] = 1] = "Call";
|
|
4
|
+
return ApiLevel;
|
|
5
|
+
}({});
|
|
6
|
+
function setLevelRef(instance, level) {
|
|
7
|
+
instance.levelRefs[level] = {};
|
|
8
|
+
}
|
|
9
|
+
function getLevelRef(instance, level) {
|
|
10
|
+
return instance.levelRefs[level];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { ApiLevel, getLevelRef, setLevelRef };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
function wait(config) {
|
|
2
|
+
const delay = config.delay;
|
|
3
|
+
if (typeof delay !== 'number') {
|
|
4
|
+
return;
|
|
5
|
+
}
|
|
6
|
+
return Promise.all([
|
|
7
|
+
new Promise((resolve)=>globalThis.setTimeout(()=>resolve(), delay)),
|
|
8
|
+
config.advanceTimers(delay)
|
|
9
|
+
]);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { wait };
|