@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,58 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// It is not possible to create a real FileList programmatically.
|
|
4
|
+
// Therefore assigning `files` property with a programmatically created FileList results in an error.
|
|
5
|
+
// Just assigning the property (as per fireEvent) breaks the interweaving with the `value` property.
|
|
6
|
+
const fakeFiles = Symbol('files and value properties are mocked');
|
|
7
|
+
function restoreProperty(obj, prop, descriptor) {
|
|
8
|
+
if (descriptor) {
|
|
9
|
+
Object.defineProperty(obj, prop, descriptor);
|
|
10
|
+
} else {
|
|
11
|
+
delete obj[prop];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function setFiles(el, files) {
|
|
15
|
+
var _el_fakeFiles;
|
|
16
|
+
(_el_fakeFiles = el[fakeFiles]) === null || _el_fakeFiles === void 0 ? void 0 : _el_fakeFiles.restore();
|
|
17
|
+
const typeDescr = Object.getOwnPropertyDescriptor(el, 'type');
|
|
18
|
+
const valueDescr = Object.getOwnPropertyDescriptor(el, 'value');
|
|
19
|
+
const filesDescr = Object.getOwnPropertyDescriptor(el, 'files');
|
|
20
|
+
function restore() {
|
|
21
|
+
restoreProperty(el, 'type', typeDescr);
|
|
22
|
+
restoreProperty(el, 'value', valueDescr);
|
|
23
|
+
restoreProperty(el, 'files', filesDescr);
|
|
24
|
+
}
|
|
25
|
+
el[fakeFiles] = {
|
|
26
|
+
restore
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperties(el, {
|
|
29
|
+
files: {
|
|
30
|
+
configurable: true,
|
|
31
|
+
get: ()=>files
|
|
32
|
+
},
|
|
33
|
+
value: {
|
|
34
|
+
configurable: true,
|
|
35
|
+
get: ()=>files.length ? `C:\\fakepath\\${files[0].name}` : '',
|
|
36
|
+
set (v) {
|
|
37
|
+
if (v === '') {
|
|
38
|
+
restore();
|
|
39
|
+
} else {
|
|
40
|
+
var _valueDescr_set;
|
|
41
|
+
valueDescr === null || valueDescr === void 0 ? void 0 : (_valueDescr_set = valueDescr.set) === null || _valueDescr_set === void 0 ? void 0 : _valueDescr_set.call(el, v);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
type: {
|
|
46
|
+
configurable: true,
|
|
47
|
+
get: ()=>'file',
|
|
48
|
+
set (v) {
|
|
49
|
+
if (v !== 'file') {
|
|
50
|
+
restore();
|
|
51
|
+
el.type = v;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
exports.setFiles = setFiles;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const parseInt = globalThis.parseInt;
|
|
4
|
+
function buildTimeValue(value) {
|
|
5
|
+
const onlyDigitsValue = value.replace(/\D/g, '');
|
|
6
|
+
if (onlyDigitsValue.length < 2) {
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
const firstDigit = parseInt(onlyDigitsValue[0], 10);
|
|
10
|
+
const secondDigit = parseInt(onlyDigitsValue[1], 10);
|
|
11
|
+
if (firstDigit >= 3 || firstDigit === 2 && secondDigit >= 4) {
|
|
12
|
+
let index;
|
|
13
|
+
if (firstDigit >= 3) {
|
|
14
|
+
index = 1;
|
|
15
|
+
} else {
|
|
16
|
+
index = 2;
|
|
17
|
+
}
|
|
18
|
+
return build(onlyDigitsValue, index);
|
|
19
|
+
}
|
|
20
|
+
if (value.length === 2) {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
return build(onlyDigitsValue, 2);
|
|
24
|
+
}
|
|
25
|
+
function build(onlyDigitsValue, index) {
|
|
26
|
+
const hours = onlyDigitsValue.slice(0, index);
|
|
27
|
+
const validHours = Math.min(parseInt(hours, 10), 23);
|
|
28
|
+
const minuteCharacters = onlyDigitsValue.slice(index);
|
|
29
|
+
const parsedMinutes = parseInt(minuteCharacters, 10);
|
|
30
|
+
const validMinutes = Math.min(parsedMinutes, 59);
|
|
31
|
+
return `${validHours.toString().padStart(2, '0')}:${validMinutes.toString().padStart(2, '0')}`;
|
|
32
|
+
}
|
|
33
|
+
function isValidDateOrTimeValue(element, value) {
|
|
34
|
+
const clone = element.cloneNode();
|
|
35
|
+
clone.value = value;
|
|
36
|
+
return clone.value === value;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
exports.buildTimeValue = buildTimeValue;
|
|
40
|
+
exports.isValidDateOrTimeValue = isValidDateOrTimeValue;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var isContentEditable = require('../edit/isContentEditable.js');
|
|
4
|
+
var isElementType = require('../misc/isElementType.js');
|
|
5
|
+
|
|
6
|
+
function getNextCursorPosition(node, offset, direction, inputType) {
|
|
7
|
+
// The behavior at text node zero offset is inconsistent.
|
|
8
|
+
// When walking backwards:
|
|
9
|
+
// Firefox always moves to zero offset and jumps over last offset.
|
|
10
|
+
// Chrome jumps over zero offset per default but over last offset when Shift is pressed.
|
|
11
|
+
// The cursor always moves to zero offset if the focus area (contenteditable or body) ends there.
|
|
12
|
+
// When walking forward both ignore zero offset.
|
|
13
|
+
// When walking over input elements the cursor moves before or after that element.
|
|
14
|
+
// When walking over line breaks the cursor moves inside any following text node.
|
|
15
|
+
if (isTextNode(node) && offset + direction >= 0 && offset + direction <= node.nodeValue.length) {
|
|
16
|
+
return {
|
|
17
|
+
node,
|
|
18
|
+
offset: offset + direction
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const nextNode = getNextCharacterContentNode(node, offset, direction);
|
|
22
|
+
if (nextNode) {
|
|
23
|
+
if (isTextNode(nextNode)) {
|
|
24
|
+
return {
|
|
25
|
+
node: nextNode,
|
|
26
|
+
offset: direction > 0 ? Math.min(1, nextNode.nodeValue.length) : Math.max(nextNode.nodeValue.length - 1, 0)
|
|
27
|
+
};
|
|
28
|
+
} else if (isElementType.isElementType(nextNode, 'br')) {
|
|
29
|
+
const nextPlusOne = getNextCharacterContentNode(nextNode, undefined, direction);
|
|
30
|
+
if (!nextPlusOne) {
|
|
31
|
+
// The behavior when there is no possible cursor position beyond the line break is inconsistent.
|
|
32
|
+
// In Chrome outside of contenteditable moving before a leading line break is possible.
|
|
33
|
+
// A leading line break can still be removed per deleteContentBackward.
|
|
34
|
+
// A trailing line break on the other hand is not removed by deleteContentForward.
|
|
35
|
+
if (direction < 0 && inputType === 'deleteContentBackward') {
|
|
36
|
+
return {
|
|
37
|
+
node: nextNode.parentNode,
|
|
38
|
+
offset: getOffset(nextNode)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
} else if (isTextNode(nextPlusOne)) {
|
|
43
|
+
return {
|
|
44
|
+
node: nextPlusOne,
|
|
45
|
+
offset: direction > 0 ? 0 : nextPlusOne.nodeValue.length
|
|
46
|
+
};
|
|
47
|
+
} else if (direction < 0 && isElementType.isElementType(nextPlusOne, 'br')) {
|
|
48
|
+
return {
|
|
49
|
+
node: nextNode.parentNode,
|
|
50
|
+
offset: getOffset(nextNode)
|
|
51
|
+
};
|
|
52
|
+
} else {
|
|
53
|
+
return {
|
|
54
|
+
node: nextPlusOne.parentNode,
|
|
55
|
+
offset: getOffset(nextPlusOne) + (direction > 0 ? 0 : 1)
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
return {
|
|
60
|
+
node: nextNode.parentNode,
|
|
61
|
+
offset: getOffset(nextNode) + (direction > 0 ? 1 : 0)
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function getNextCharacterContentNode(node, offset, direction) {
|
|
67
|
+
const nextOffset = Number(offset) + (direction < 0 ? -1 : 0);
|
|
68
|
+
if (offset !== undefined && isElement(node) && nextOffset >= 0 && nextOffset < node.children.length) {
|
|
69
|
+
node = node.children[nextOffset];
|
|
70
|
+
}
|
|
71
|
+
return walkNodes(node, direction === 1 ? 'next' : 'previous', isTreatedAsCharacterContent);
|
|
72
|
+
}
|
|
73
|
+
function isTreatedAsCharacterContent(node) {
|
|
74
|
+
if (isTextNode(node)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
if (isElement(node)) {
|
|
78
|
+
if (isElementType.isElementType(node, [
|
|
79
|
+
'input',
|
|
80
|
+
'textarea'
|
|
81
|
+
])) {
|
|
82
|
+
return node.type !== 'hidden';
|
|
83
|
+
} else if (isElementType.isElementType(node, 'br')) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
function getOffset(node) {
|
|
90
|
+
let i = 0;
|
|
91
|
+
while(node.previousSibling){
|
|
92
|
+
i++;
|
|
93
|
+
node = node.previousSibling;
|
|
94
|
+
}
|
|
95
|
+
return i;
|
|
96
|
+
}
|
|
97
|
+
function isElement(node) {
|
|
98
|
+
return node.nodeType === 1;
|
|
99
|
+
}
|
|
100
|
+
function isTextNode(node) {
|
|
101
|
+
return node.nodeType === 3;
|
|
102
|
+
}
|
|
103
|
+
function walkNodes(node, direction, callback) {
|
|
104
|
+
for(;;){
|
|
105
|
+
var _node_ownerDocument;
|
|
106
|
+
const sibling = node[`${direction}Sibling`];
|
|
107
|
+
if (sibling) {
|
|
108
|
+
node = getDescendant(sibling, direction === 'next' ? 'first' : 'last');
|
|
109
|
+
if (callback(node)) {
|
|
110
|
+
return node;
|
|
111
|
+
}
|
|
112
|
+
} else if (node.parentNode && (!isElement(node.parentNode) || !isContentEditable.isContentEditable(node.parentNode) && node.parentNode !== ((_node_ownerDocument = node.ownerDocument) === null || _node_ownerDocument === void 0 ? void 0 : _node_ownerDocument.body))) {
|
|
113
|
+
node = node.parentNode;
|
|
114
|
+
} else {
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function getDescendant(node, direction) {
|
|
120
|
+
while(node.hasChildNodes()){
|
|
121
|
+
node = node[`${direction}Child`];
|
|
122
|
+
}
|
|
123
|
+
return node;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
exports.getNextCursorPosition = getNextCursorPosition;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var isDisabled = require('../misc/isDisabled.js');
|
|
4
|
+
|
|
5
|
+
function getActiveElement(document) {
|
|
6
|
+
const activeElement = document.activeElement;
|
|
7
|
+
if (activeElement === null || activeElement === void 0 ? void 0 : activeElement.shadowRoot) {
|
|
8
|
+
const activeElementInShadowTree = getActiveElement(activeElement.shadowRoot);
|
|
9
|
+
if (activeElementInShadowTree) {
|
|
10
|
+
return activeElementInShadowTree;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
// Browser does not yield disabled elements as document.activeElement - jsdom does
|
|
14
|
+
if (isDisabled.isDisabled(activeElement)) {
|
|
15
|
+
return document.ownerDocument ? /* istanbul ignore next */ document.ownerDocument.body : document.body;
|
|
16
|
+
}
|
|
17
|
+
return activeElement;
|
|
18
|
+
}
|
|
19
|
+
function getActiveElementOrBody(document) {
|
|
20
|
+
var _getActiveElement;
|
|
21
|
+
return (_getActiveElement = getActiveElement(document)) !== null && _getActiveElement !== void 0 ? _getActiveElement : /* istanbul ignore next */ document.body;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
exports.getActiveElement = getActiveElement;
|
|
25
|
+
exports.getActiveElementOrBody = getActiveElementOrBody;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var isDisabled = require('../misc/isDisabled.js');
|
|
4
|
+
var isElementType = require('../misc/isElementType.js');
|
|
5
|
+
var isVisible = require('../misc/isVisible.js');
|
|
6
|
+
var selector = require('./selector.js');
|
|
7
|
+
|
|
8
|
+
function getTabDestination(activeElement, shift) {
|
|
9
|
+
const document = activeElement.ownerDocument;
|
|
10
|
+
const focusableElements = document.querySelectorAll(selector.FOCUSABLE_SELECTOR);
|
|
11
|
+
const enabledElements = Array.from(focusableElements).filter((el)=>el === activeElement || !(Number(el.getAttribute('tabindex')) < 0 || isDisabled.isDisabled(el)));
|
|
12
|
+
// tabindex has no effect if the active element has negative tabindex
|
|
13
|
+
if (Number(activeElement.getAttribute('tabindex')) >= 0) {
|
|
14
|
+
enabledElements.sort((a, b)=>{
|
|
15
|
+
const i = Number(a.getAttribute('tabindex'));
|
|
16
|
+
const j = Number(b.getAttribute('tabindex'));
|
|
17
|
+
if (i === j) {
|
|
18
|
+
return 0;
|
|
19
|
+
} else if (i === 0) {
|
|
20
|
+
return 1;
|
|
21
|
+
} else if (j === 0) {
|
|
22
|
+
return -1;
|
|
23
|
+
}
|
|
24
|
+
return i - j;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const checkedRadio = {};
|
|
28
|
+
let prunedElements = [
|
|
29
|
+
document.body
|
|
30
|
+
];
|
|
31
|
+
const activeRadioGroup = isElementType.isElementType(activeElement, 'input', {
|
|
32
|
+
type: 'radio'
|
|
33
|
+
}) ? activeElement.name : undefined;
|
|
34
|
+
enabledElements.forEach((currentElement)=>{
|
|
35
|
+
const el = currentElement;
|
|
36
|
+
// For radio groups keep only the active radio
|
|
37
|
+
// If there is no active radio, keep only the checked radio
|
|
38
|
+
// If there is no checked radio, treat like everything else
|
|
39
|
+
if (isElementType.isElementType(el, 'input', {
|
|
40
|
+
type: 'radio'
|
|
41
|
+
}) && el.name) {
|
|
42
|
+
// If the active element is part of the group, add only that
|
|
43
|
+
if (el === activeElement) {
|
|
44
|
+
prunedElements.push(el);
|
|
45
|
+
return;
|
|
46
|
+
} else if (el.name === activeRadioGroup) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// If we stumble upon a checked radio, remove the others
|
|
50
|
+
if (el.checked) {
|
|
51
|
+
prunedElements = prunedElements.filter((e)=>!isElementType.isElementType(e, 'input', {
|
|
52
|
+
type: 'radio',
|
|
53
|
+
name: el.name
|
|
54
|
+
}));
|
|
55
|
+
prunedElements.push(el);
|
|
56
|
+
checkedRadio[el.name] = el;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// If we already found the checked one, skip
|
|
60
|
+
if (typeof checkedRadio[el.name] !== 'undefined') {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
prunedElements.push(el);
|
|
65
|
+
});
|
|
66
|
+
for(let index = prunedElements.findIndex((el)=>el === activeElement);;){
|
|
67
|
+
index += shift ? -1 : 1;
|
|
68
|
+
// loop at overflow
|
|
69
|
+
if (index === prunedElements.length) {
|
|
70
|
+
index = 0;
|
|
71
|
+
} else if (index === -1) {
|
|
72
|
+
index = prunedElements.length - 1;
|
|
73
|
+
}
|
|
74
|
+
if (prunedElements[index] === activeElement || prunedElements[index] === document.body || isVisible.isVisible(prunedElements[index])) {
|
|
75
|
+
return prunedElements[index];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
exports.getTabDestination = getTabDestination;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var isClickableInput = require('../click/isClickableInput.js');
|
|
4
|
+
var isEditable = require('../edit/isEditable.js');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Determine if the element has its own selection implementation
|
|
8
|
+
* and does not interact with the Document Selection API.
|
|
9
|
+
*/ function hasOwnSelection(node) {
|
|
10
|
+
return isElement(node) && isEditable.isEditableInputOrTextArea(node);
|
|
11
|
+
}
|
|
12
|
+
function hasNoSelection(node) {
|
|
13
|
+
return isElement(node) && isClickableInput.isClickableInput(node);
|
|
14
|
+
}
|
|
15
|
+
function isElement(node) {
|
|
16
|
+
return node.nodeType === 1;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
exports.hasNoSelection = hasNoSelection;
|
|
20
|
+
exports.hasOwnSelection = hasOwnSelection;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const FOCUSABLE_SELECTOR = [
|
|
4
|
+
'input:not([type=hidden]):not([disabled])',
|
|
5
|
+
'button:not([disabled])',
|
|
6
|
+
'select:not([disabled])',
|
|
7
|
+
'textarea:not([disabled])',
|
|
8
|
+
'[contenteditable=""]',
|
|
9
|
+
'[contenteditable="true"]',
|
|
10
|
+
'a[href]',
|
|
11
|
+
'[tabindex]:not([disabled])',
|
|
12
|
+
'details > summary'
|
|
13
|
+
].join(', ');
|
|
14
|
+
|
|
15
|
+
exports.FOCUSABLE_SELECTOR = FOCUSABLE_SELECTOR;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var isClickableInput = require('./click/isClickableInput.js');
|
|
4
|
+
var Blob = require('./dataTransfer/Blob.js');
|
|
5
|
+
var DataTransfer = require('./dataTransfer/DataTransfer.js');
|
|
6
|
+
var FileList = require('./dataTransfer/FileList.js');
|
|
7
|
+
var Clipboard = require('./dataTransfer/Clipboard.js');
|
|
8
|
+
var timeValue = require('./edit/timeValue.js');
|
|
9
|
+
var isContentEditable = require('./edit/isContentEditable.js');
|
|
10
|
+
var isEditable = require('./edit/isEditable.js');
|
|
11
|
+
var maxLength = require('./edit/maxLength.js');
|
|
12
|
+
var setFiles = require('./edit/setFiles.js');
|
|
13
|
+
var cursor = require('./focus/cursor.js');
|
|
14
|
+
var getActiveElement = require('./focus/getActiveElement.js');
|
|
15
|
+
var getTabDestination = require('./focus/getTabDestination.js');
|
|
16
|
+
var isFocusable = require('./focus/isFocusable.js');
|
|
17
|
+
var selection = require('./focus/selection.js');
|
|
18
|
+
var selector = require('./focus/selector.js');
|
|
19
|
+
var readNextDescriptor = require('./keyDef/readNextDescriptor.js');
|
|
20
|
+
var cloneEvent = require('./misc/cloneEvent.js');
|
|
21
|
+
var findClosest = require('./misc/findClosest.js');
|
|
22
|
+
var getDocumentFromNode = require('./misc/getDocumentFromNode.js');
|
|
23
|
+
var getTreeDiff = require('./misc/getTreeDiff.js');
|
|
24
|
+
var getWindow = require('./misc/getWindow.js');
|
|
25
|
+
var isDescendantOrSelf = require('./misc/isDescendantOrSelf.js');
|
|
26
|
+
var isElementType = require('./misc/isElementType.js');
|
|
27
|
+
var isVisible = require('./misc/isVisible.js');
|
|
28
|
+
var isDisabled = require('./misc/isDisabled.js');
|
|
29
|
+
var level = require('./misc/level.js');
|
|
30
|
+
var wait = require('./misc/wait.js');
|
|
31
|
+
var cssPointerEvents = require('./pointer/cssPointerEvents.js');
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
exports.isClickableInput = isClickableInput.isClickableInput;
|
|
36
|
+
exports.readBlobText = Blob.readBlobText;
|
|
37
|
+
exports.createDataTransfer = DataTransfer.createDataTransfer;
|
|
38
|
+
exports.getBlobFromDataTransferItem = DataTransfer.getBlobFromDataTransferItem;
|
|
39
|
+
exports.createFileList = FileList.createFileList;
|
|
40
|
+
exports.attachClipboardStubToView = Clipboard.attachClipboardStubToView;
|
|
41
|
+
exports.createClipboardItem = Clipboard.createClipboardItem;
|
|
42
|
+
exports.detachClipboardStubFromView = Clipboard.detachClipboardStubFromView;
|
|
43
|
+
exports.readDataTransferFromClipboard = Clipboard.readDataTransferFromClipboard;
|
|
44
|
+
exports.resetClipboardStubOnView = Clipboard.resetClipboardStubOnView;
|
|
45
|
+
exports.writeDataTransferToClipboard = Clipboard.writeDataTransferToClipboard;
|
|
46
|
+
exports.buildTimeValue = timeValue.buildTimeValue;
|
|
47
|
+
exports.isValidDateOrTimeValue = timeValue.isValidDateOrTimeValue;
|
|
48
|
+
exports.getContentEditable = isContentEditable.getContentEditable;
|
|
49
|
+
exports.isContentEditable = isContentEditable.isContentEditable;
|
|
50
|
+
exports.isEditable = isEditable.isEditable;
|
|
51
|
+
exports.isEditableInputOrTextArea = isEditable.isEditableInputOrTextArea;
|
|
52
|
+
exports.getMaxLength = maxLength.getMaxLength;
|
|
53
|
+
exports.supportsMaxLength = maxLength.supportsMaxLength;
|
|
54
|
+
exports.setFiles = setFiles.setFiles;
|
|
55
|
+
exports.getNextCursorPosition = cursor.getNextCursorPosition;
|
|
56
|
+
exports.getActiveElement = getActiveElement.getActiveElement;
|
|
57
|
+
exports.getActiveElementOrBody = getActiveElement.getActiveElementOrBody;
|
|
58
|
+
exports.getTabDestination = getTabDestination.getTabDestination;
|
|
59
|
+
exports.isFocusable = isFocusable.isFocusable;
|
|
60
|
+
exports.hasNoSelection = selection.hasNoSelection;
|
|
61
|
+
exports.hasOwnSelection = selection.hasOwnSelection;
|
|
62
|
+
exports.FOCUSABLE_SELECTOR = selector.FOCUSABLE_SELECTOR;
|
|
63
|
+
exports.readNextDescriptor = readNextDescriptor.readNextDescriptor;
|
|
64
|
+
exports.cloneEvent = cloneEvent.cloneEvent;
|
|
65
|
+
exports.findClosest = findClosest.findClosest;
|
|
66
|
+
exports.getDocumentFromNode = getDocumentFromNode.getDocumentFromNode;
|
|
67
|
+
exports.getTreeDiff = getTreeDiff.getTreeDiff;
|
|
68
|
+
exports.getWindow = getWindow.getWindow;
|
|
69
|
+
exports.isDescendantOrSelf = isDescendantOrSelf.isDescendantOrSelf;
|
|
70
|
+
exports.isElementType = isElementType.isElementType;
|
|
71
|
+
exports.isVisible = isVisible.isVisible;
|
|
72
|
+
exports.isDisabled = isDisabled.isDisabled;
|
|
73
|
+
exports.ApiLevel = level.ApiLevel;
|
|
74
|
+
exports.getLevelRef = level.getLevelRef;
|
|
75
|
+
exports.setLevelRef = level.setLevelRef;
|
|
76
|
+
exports.wait = wait.wait;
|
|
77
|
+
exports.assertPointerEvents = cssPointerEvents.assertPointerEvents;
|
|
78
|
+
exports.hasPointerEvents = cssPointerEvents.hasPointerEvents;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const bracketDict = {
|
|
4
|
+
'{': '}',
|
|
5
|
+
'[': ']'
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Read the next key definition from user input
|
|
9
|
+
*
|
|
10
|
+
* Describe key per `{descriptor}` or `[descriptor]`.
|
|
11
|
+
* Everything else will be interpreted as a single character as descriptor - e.g. `a`.
|
|
12
|
+
* Brackets `{` and `[` can be escaped by doubling - e.g. `foo[[bar` translates to `foo[bar`.
|
|
13
|
+
* A previously pressed key can be released per `{/descriptor}`.
|
|
14
|
+
* Keeping the key pressed can be written as `{descriptor>}`.
|
|
15
|
+
* When keeping the key pressed you can choose how long the key is pressed `{descriptor>3}`.
|
|
16
|
+
* You can then release the key per `{descriptor>3/}` or keep it pressed and continue with the next key.
|
|
17
|
+
*/ function readNextDescriptor(text, context) {
|
|
18
|
+
let pos = 0;
|
|
19
|
+
const startBracket = text[pos] in bracketDict ? text[pos] : '';
|
|
20
|
+
pos += startBracket.length;
|
|
21
|
+
const isEscapedChar = new RegExp(`^\\${startBracket}{2}`).test(text);
|
|
22
|
+
const type = isEscapedChar ? '' : startBracket;
|
|
23
|
+
return {
|
|
24
|
+
type,
|
|
25
|
+
...type === '' ? readPrintableChar(text, pos, context) : readTag(text, pos, type, context)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function readPrintableChar(text, pos, context) {
|
|
29
|
+
const descriptor = text[pos];
|
|
30
|
+
assertDescriptor(descriptor, text, pos, context);
|
|
31
|
+
pos += descriptor.length;
|
|
32
|
+
return {
|
|
33
|
+
consumedLength: pos,
|
|
34
|
+
descriptor,
|
|
35
|
+
releasePrevious: false,
|
|
36
|
+
releaseSelf: true,
|
|
37
|
+
repeat: 1
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function readTag(text, pos, startBracket, context) {
|
|
41
|
+
var _ref;
|
|
42
|
+
var _text_slice_match, _text_slice_match1;
|
|
43
|
+
const releasePreviousModifier = text[pos] === '/' ? '/' : '';
|
|
44
|
+
pos += releasePreviousModifier.length;
|
|
45
|
+
const escapedDescriptor = startBracket === '{' && text[pos] === '\\';
|
|
46
|
+
pos += Number(escapedDescriptor);
|
|
47
|
+
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];
|
|
48
|
+
assertDescriptor(descriptor, text, pos, context);
|
|
49
|
+
pos += descriptor.length;
|
|
50
|
+
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 : '';
|
|
51
|
+
pos += repeatModifier.length;
|
|
52
|
+
const releaseSelfModifier = text[pos] === '/' || !repeatModifier && text[pos] === '>' ? text[pos] : '';
|
|
53
|
+
pos += releaseSelfModifier.length;
|
|
54
|
+
const expectedEndBracket = bracketDict[startBracket];
|
|
55
|
+
const endBracket = text[pos] === expectedEndBracket ? expectedEndBracket : '';
|
|
56
|
+
if (!endBracket) {
|
|
57
|
+
throw new Error(getErrorMessage([
|
|
58
|
+
!repeatModifier && 'repeat modifier',
|
|
59
|
+
!releaseSelfModifier && 'release modifier',
|
|
60
|
+
`"${expectedEndBracket}"`
|
|
61
|
+
].filter(Boolean).join(' or '), text[pos], text, context));
|
|
62
|
+
}
|
|
63
|
+
pos += endBracket.length;
|
|
64
|
+
return {
|
|
65
|
+
consumedLength: pos,
|
|
66
|
+
descriptor,
|
|
67
|
+
releasePrevious: !!releasePreviousModifier,
|
|
68
|
+
repeat: repeatModifier ? Math.max(Number(repeatModifier.substr(1)), 1) : 1,
|
|
69
|
+
releaseSelf: hasReleaseSelf(releaseSelfModifier, repeatModifier)
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function assertDescriptor(descriptor, text, pos, context) {
|
|
73
|
+
if (!descriptor) {
|
|
74
|
+
throw new Error(getErrorMessage('key descriptor', text[pos], text, context));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function hasReleaseSelf(releaseSelfModifier, repeatModifier) {
|
|
78
|
+
if (releaseSelfModifier) {
|
|
79
|
+
return releaseSelfModifier === '/';
|
|
80
|
+
}
|
|
81
|
+
if (repeatModifier) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function getErrorMessage(expected, found, text, context) {
|
|
86
|
+
return `Expected ${expected} but found "${found !== null && found !== void 0 ? found : ''}" in "${text}"
|
|
87
|
+
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`}
|
|
88
|
+
for more information about how userEvent parses your input.`;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
exports.readNextDescriptor = readNextDescriptor;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function findClosest(element, callback) {
|
|
4
|
+
let el = element;
|
|
5
|
+
do {
|
|
6
|
+
if (callback(el)) {
|
|
7
|
+
return el;
|
|
8
|
+
}
|
|
9
|
+
el = el.parentElement;
|
|
10
|
+
}while (el && el !== element.ownerDocument.body)
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
exports.findClosest = findClosest;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function getTreeDiff(a, b) {
|
|
4
|
+
const treeA = [];
|
|
5
|
+
for(let el = a; el; el = el.parentElement){
|
|
6
|
+
treeA.push(el);
|
|
7
|
+
}
|
|
8
|
+
const treeB = [];
|
|
9
|
+
for(let el = b; el; el = el.parentElement){
|
|
10
|
+
treeB.push(el);
|
|
11
|
+
}
|
|
12
|
+
let i = 0;
|
|
13
|
+
for(;; i++){
|
|
14
|
+
if (i >= treeA.length || i >= treeB.length || treeA[treeA.length - 1 - i] !== treeB[treeB.length - 1 - i]) {
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return [
|
|
19
|
+
treeA.slice(0, treeA.length - i),
|
|
20
|
+
treeB.slice(0, treeB.length - i),
|
|
21
|
+
treeB.slice(treeB.length - i)
|
|
22
|
+
];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
exports.getTreeDiff = getTreeDiff;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function getWindow(node) {
|
|
4
|
+
var _node_ownerDocument;
|
|
5
|
+
if (isDocument(node) && node.defaultView) {
|
|
6
|
+
return node.defaultView;
|
|
7
|
+
} else if ((_node_ownerDocument = node.ownerDocument) === null || _node_ownerDocument === void 0 ? void 0 : _node_ownerDocument.defaultView) {
|
|
8
|
+
return node.ownerDocument.defaultView;
|
|
9
|
+
}
|
|
10
|
+
throw new Error(`Could not determine window of node. Node was ${describe(node)}`);
|
|
11
|
+
}
|
|
12
|
+
function isDocument(node) {
|
|
13
|
+
return node.nodeType === 9;
|
|
14
|
+
}
|
|
15
|
+
function describe(val) {
|
|
16
|
+
return typeof val === 'function' ? `function ${val.name}` : val === null ? 'null' : String(val);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
exports.getWindow = getWindow;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function isDescendantOrSelf(potentialDescendant, potentialAncestor) {
|
|
4
|
+
let el = potentialDescendant;
|
|
5
|
+
do {
|
|
6
|
+
if (el === potentialAncestor) {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
el = el.parentElement;
|
|
10
|
+
}while (el)
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
exports.isDescendantOrSelf = isDescendantOrSelf;
|