@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,60 @@
|
|
|
1
|
+
import { isElementType } from '../utils/misc/isElementType.js';
|
|
2
|
+
import { createFileList } from '../utils/dataTransfer/FileList.js';
|
|
3
|
+
import '../utils/dataTransfer/Clipboard.js';
|
|
4
|
+
import { setFiles } from '../utils/edit/setFiles.js';
|
|
5
|
+
import { isDisabled } from '../utils/misc/isDisabled.js';
|
|
6
|
+
import { getWindow } from '../utils/misc/getWindow.js';
|
|
7
|
+
|
|
8
|
+
async function upload(element, fileOrFiles) {
|
|
9
|
+
const input = isElementType(element, 'label') ? element.control : element;
|
|
10
|
+
if (!input || !isElementType(input, 'input', {
|
|
11
|
+
type: 'file'
|
|
12
|
+
})) {
|
|
13
|
+
throw new TypeError(`The ${input === element ? 'given' : 'associated'} ${input === null || input === void 0 ? void 0 : input.tagName} element does not accept file uploads`);
|
|
14
|
+
}
|
|
15
|
+
if (isDisabled(element)) return;
|
|
16
|
+
const files = (Array.isArray(fileOrFiles) ? fileOrFiles : [
|
|
17
|
+
fileOrFiles
|
|
18
|
+
]).filter((file)=>!this.config.applyAccept || isAcceptableFile(file, input.accept)).slice(0, input.multiple ? undefined : 1);
|
|
19
|
+
const fileDialog = ()=>{
|
|
20
|
+
var _input_files;
|
|
21
|
+
// do not fire an input event if the file selection does not change
|
|
22
|
+
if (files.length === ((_input_files = input.files) === null || _input_files === void 0 ? void 0 : _input_files.length) && files.every((f, i)=>{
|
|
23
|
+
var _input_files;
|
|
24
|
+
return f === ((_input_files = input.files) === null || _input_files === void 0 ? void 0 : _input_files.item(i));
|
|
25
|
+
})) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
setFiles(input, createFileList(getWindow(element), files));
|
|
29
|
+
this.dispatchUIEvent(input, 'input');
|
|
30
|
+
this.dispatchUIEvent(input, 'change');
|
|
31
|
+
};
|
|
32
|
+
input.addEventListener('fileDialog', fileDialog);
|
|
33
|
+
await this.click(element);
|
|
34
|
+
input.removeEventListener('fileDialog', fileDialog);
|
|
35
|
+
}
|
|
36
|
+
// When matching files, browsers ignore case and consider jpeg/jpg interchangeable.
|
|
37
|
+
function normalize(nameOrType) {
|
|
38
|
+
return nameOrType.toLowerCase().replace(/(\.|\/)jpg\b/g, '$1jpeg');
|
|
39
|
+
}
|
|
40
|
+
function isAcceptableFile(file, accept) {
|
|
41
|
+
if (!accept) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
const wildcards = [
|
|
45
|
+
'audio/*',
|
|
46
|
+
'image/*',
|
|
47
|
+
'video/*'
|
|
48
|
+
];
|
|
49
|
+
return normalize(accept).trim().split(/\s*,\s*/).some((acceptToken)=>{
|
|
50
|
+
// tokens starting with a dot represent a file extension
|
|
51
|
+
if (acceptToken.startsWith('.')) {
|
|
52
|
+
return normalize(file.name).endsWith(acceptToken);
|
|
53
|
+
} else if (wildcards.includes(acceptToken)) {
|
|
54
|
+
return normalize(file.type).startsWith(acceptToken.replace('*', ''));
|
|
55
|
+
}
|
|
56
|
+
return normalize(file.type) === acceptToken;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export { upload };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { isElementType } from '../misc/isElementType.js';
|
|
2
|
+
|
|
3
|
+
var clickableInputTypes = /*#__PURE__*/ function(clickableInputTypes) {
|
|
4
|
+
clickableInputTypes["button"] = "button";
|
|
5
|
+
clickableInputTypes["color"] = "color";
|
|
6
|
+
clickableInputTypes["file"] = "file";
|
|
7
|
+
clickableInputTypes["image"] = "image";
|
|
8
|
+
clickableInputTypes["reset"] = "reset";
|
|
9
|
+
clickableInputTypes["submit"] = "submit";
|
|
10
|
+
clickableInputTypes["checkbox"] = "checkbox";
|
|
11
|
+
clickableInputTypes["radio"] = "radio";
|
|
12
|
+
return clickableInputTypes;
|
|
13
|
+
}(clickableInputTypes || {});
|
|
14
|
+
function isClickableInput(element) {
|
|
15
|
+
return isElementType(element, 'button') || isElementType(element, 'input') && element.type in clickableInputTypes;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { isClickableInput };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// jsdom does not implement Blob.text()
|
|
2
|
+
function readBlobText(blob, FileReader) {
|
|
3
|
+
return new Promise((res, rej)=>{
|
|
4
|
+
const fr = new FileReader();
|
|
5
|
+
fr.onerror = rej;
|
|
6
|
+
fr.onabort = rej;
|
|
7
|
+
fr.onload = ()=>{
|
|
8
|
+
res(String(fr.result));
|
|
9
|
+
};
|
|
10
|
+
fr.readAsText(blob);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { readBlobText };
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { getWindow } from '../misc/getWindow.js';
|
|
2
|
+
import { readBlobText } from './Blob.js';
|
|
3
|
+
import { createDataTransfer, getBlobFromDataTransferItem } from './DataTransfer.js';
|
|
4
|
+
|
|
5
|
+
function _define_property(obj, key, value) {
|
|
6
|
+
if (key in obj) {
|
|
7
|
+
Object.defineProperty(obj, key, {
|
|
8
|
+
value: value,
|
|
9
|
+
enumerable: true,
|
|
10
|
+
configurable: true,
|
|
11
|
+
writable: true
|
|
12
|
+
});
|
|
13
|
+
} else obj[key] = value;
|
|
14
|
+
return obj;
|
|
15
|
+
}
|
|
16
|
+
// MDN lists string|Blob|Promise<Blob|string> as possible types in ClipboardItemData
|
|
17
|
+
// lib.dom.d.ts lists only Promise<Blob|string>
|
|
18
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/ClipboardItem/ClipboardItem#syntax
|
|
19
|
+
function createClipboardItem(window, ...blobs) {
|
|
20
|
+
const dataMap = Object.fromEntries(blobs.map((b)=>[
|
|
21
|
+
typeof b === 'string' ? 'text/plain' : b.type,
|
|
22
|
+
Promise.resolve(b)
|
|
23
|
+
]));
|
|
24
|
+
// use real ClipboardItem if available
|
|
25
|
+
/* istanbul ignore if */ if (typeof window.ClipboardItem !== 'undefined') {
|
|
26
|
+
return new window.ClipboardItem(dataMap);
|
|
27
|
+
}
|
|
28
|
+
return new class ClipboardItem {
|
|
29
|
+
get types() {
|
|
30
|
+
return Array.from(Object.keys(this.data));
|
|
31
|
+
}
|
|
32
|
+
async getType(type) {
|
|
33
|
+
const value = await this.data[type];
|
|
34
|
+
if (!value) {
|
|
35
|
+
throw new Error(`${type} is not one of the available MIME types on this item.`);
|
|
36
|
+
}
|
|
37
|
+
return value instanceof window.Blob ? value : new window.Blob([
|
|
38
|
+
value
|
|
39
|
+
], {
|
|
40
|
+
type
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
constructor(d){
|
|
44
|
+
_define_property(this, "data", void 0);
|
|
45
|
+
this.data = d;
|
|
46
|
+
}
|
|
47
|
+
}(dataMap);
|
|
48
|
+
}
|
|
49
|
+
const ClipboardStubControl = Symbol('Manage ClipboardSub');
|
|
50
|
+
function createClipboardStub(window, control) {
|
|
51
|
+
return Object.assign(new class Clipboard extends window.EventTarget {
|
|
52
|
+
async read() {
|
|
53
|
+
return Array.from(this.items);
|
|
54
|
+
}
|
|
55
|
+
async readText() {
|
|
56
|
+
let text = '';
|
|
57
|
+
for (const item of this.items){
|
|
58
|
+
const type = item.types.includes('text/plain') ? 'text/plain' : item.types.find((t)=>t.startsWith('text/'));
|
|
59
|
+
if (type) {
|
|
60
|
+
text += await item.getType(type).then((b)=>readBlobText(b, window.FileReader));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return text;
|
|
64
|
+
}
|
|
65
|
+
async write(data) {
|
|
66
|
+
this.items = data;
|
|
67
|
+
}
|
|
68
|
+
async writeText(text) {
|
|
69
|
+
this.items = [
|
|
70
|
+
createClipboardItem(window, text)
|
|
71
|
+
];
|
|
72
|
+
}
|
|
73
|
+
constructor(...args){
|
|
74
|
+
super(...args), _define_property(this, "items", []);
|
|
75
|
+
}
|
|
76
|
+
}(), {
|
|
77
|
+
[ClipboardStubControl]: control
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function isClipboardStub(clipboard) {
|
|
81
|
+
return !!(clipboard === null || clipboard === void 0 ? void 0 : clipboard[ClipboardStubControl]);
|
|
82
|
+
}
|
|
83
|
+
function attachClipboardStubToView(window) {
|
|
84
|
+
if (isClipboardStub(window.navigator.clipboard)) {
|
|
85
|
+
return window.navigator.clipboard[ClipboardStubControl];
|
|
86
|
+
}
|
|
87
|
+
const realClipboard = Object.getOwnPropertyDescriptor(window.navigator, 'clipboard');
|
|
88
|
+
let stub;
|
|
89
|
+
const control = {
|
|
90
|
+
resetClipboardStub: ()=>{
|
|
91
|
+
stub = createClipboardStub(window, control);
|
|
92
|
+
},
|
|
93
|
+
detachClipboardStub: ()=>{
|
|
94
|
+
/* istanbul ignore if */ if (realClipboard) {
|
|
95
|
+
Object.defineProperty(window.navigator, 'clipboard', realClipboard);
|
|
96
|
+
} else {
|
|
97
|
+
Object.defineProperty(window.navigator, 'clipboard', {
|
|
98
|
+
value: undefined,
|
|
99
|
+
configurable: true
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
stub = createClipboardStub(window, control);
|
|
105
|
+
Object.defineProperty(window.navigator, 'clipboard', {
|
|
106
|
+
get: ()=>stub,
|
|
107
|
+
configurable: true
|
|
108
|
+
});
|
|
109
|
+
return stub[ClipboardStubControl];
|
|
110
|
+
}
|
|
111
|
+
function resetClipboardStubOnView(window) {
|
|
112
|
+
if (isClipboardStub(window.navigator.clipboard)) {
|
|
113
|
+
window.navigator.clipboard[ClipboardStubControl].resetClipboardStub();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function detachClipboardStubFromView(window) {
|
|
117
|
+
if (isClipboardStub(window.navigator.clipboard)) {
|
|
118
|
+
window.navigator.clipboard[ClipboardStubControl].detachClipboardStub();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function readDataTransferFromClipboard(document) {
|
|
122
|
+
const window = document.defaultView;
|
|
123
|
+
const clipboard = window === null || window === void 0 ? void 0 : window.navigator.clipboard;
|
|
124
|
+
const items = clipboard && await clipboard.read();
|
|
125
|
+
if (!items) {
|
|
126
|
+
throw new Error('The Clipboard API is unavailable.');
|
|
127
|
+
}
|
|
128
|
+
const dt = createDataTransfer(window);
|
|
129
|
+
for (const item of items){
|
|
130
|
+
for (const type of item.types){
|
|
131
|
+
dt.setData(type, await item.getType(type).then((b)=>readBlobText(b, window.FileReader)));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return dt;
|
|
135
|
+
}
|
|
136
|
+
async function writeDataTransferToClipboard(document, clipboardData) {
|
|
137
|
+
const window = getWindow(document);
|
|
138
|
+
const clipboard = window.navigator.clipboard;
|
|
139
|
+
const items = [];
|
|
140
|
+
for(let i = 0; i < clipboardData.items.length; i++){
|
|
141
|
+
const dtItem = clipboardData.items[i];
|
|
142
|
+
const blob = await getBlobFromDataTransferItem(window, dtItem);
|
|
143
|
+
items.push(createClipboardItem(window, blob));
|
|
144
|
+
}
|
|
145
|
+
const written = clipboard && await clipboard.write(items).then(()=>true, // Can happen with other implementations that e.g. require permissions
|
|
146
|
+
/* istanbul ignore next */ ()=>false);
|
|
147
|
+
if (!written) {
|
|
148
|
+
throw new Error('The Clipboard API is unavailable.');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const g = globalThis;
|
|
152
|
+
/* istanbul ignore else */ if (typeof g.afterEach === 'function') {
|
|
153
|
+
g.afterEach(()=>{
|
|
154
|
+
if (typeof globalThis.window !== 'undefined') {
|
|
155
|
+
resetClipboardStubOnView(globalThis.window);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/* istanbul ignore else */ if (typeof g.afterAll === 'function') {
|
|
160
|
+
g.afterAll(()=>{
|
|
161
|
+
if (typeof globalThis.window !== 'undefined') {
|
|
162
|
+
detachClipboardStubFromView(globalThis.window);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export { attachClipboardStubToView, createClipboardItem, detachClipboardStubFromView, readDataTransferFromClipboard, resetClipboardStubOnView, writeDataTransferToClipboard };
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { createFileList } from './FileList.js';
|
|
2
|
+
|
|
3
|
+
function _define_property(obj, key, value) {
|
|
4
|
+
if (key in obj) {
|
|
5
|
+
Object.defineProperty(obj, key, {
|
|
6
|
+
value: value,
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
writable: true
|
|
10
|
+
});
|
|
11
|
+
} else obj[key] = value;
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
// DataTransfer is not implemented in jsdom.
|
|
15
|
+
// DataTransfer with FileList is being created by the browser on certain events.
|
|
16
|
+
class DataTransferItemStub {
|
|
17
|
+
getAsFile() {
|
|
18
|
+
return this.file;
|
|
19
|
+
}
|
|
20
|
+
getAsString(callback) {
|
|
21
|
+
if (typeof this.data === 'string') {
|
|
22
|
+
callback(this.data);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/* istanbul ignore next */ webkitGetAsEntry() {
|
|
26
|
+
throw new Error('not implemented');
|
|
27
|
+
}
|
|
28
|
+
constructor(dataOrFile, type){
|
|
29
|
+
_define_property(this, "kind", void 0);
|
|
30
|
+
_define_property(this, "type", void 0);
|
|
31
|
+
_define_property(this, "file", null);
|
|
32
|
+
_define_property(this, "data", undefined);
|
|
33
|
+
if (typeof dataOrFile === 'string') {
|
|
34
|
+
this.kind = 'string';
|
|
35
|
+
this.type = String(type);
|
|
36
|
+
this.data = dataOrFile;
|
|
37
|
+
} else {
|
|
38
|
+
this.kind = 'file';
|
|
39
|
+
this.type = dataOrFile.type;
|
|
40
|
+
this.file = dataOrFile;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
class DataTransferItemListStub extends Array {
|
|
45
|
+
add(...args) {
|
|
46
|
+
const item = new DataTransferItemStub(args[0], args[1]);
|
|
47
|
+
this.push(item);
|
|
48
|
+
return item;
|
|
49
|
+
}
|
|
50
|
+
clear() {
|
|
51
|
+
this.splice(0, this.length);
|
|
52
|
+
}
|
|
53
|
+
remove(index) {
|
|
54
|
+
this.splice(index, 1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function getTypeMatcher(type, exact) {
|
|
58
|
+
const [group, sub] = type.split('/');
|
|
59
|
+
const isGroup = !sub || sub === '*';
|
|
60
|
+
return (item)=>{
|
|
61
|
+
return exact ? item.type === (isGroup ? group : type) : isGroup ? item.type.startsWith(`${group}/`) : item.type === group;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function createDataTransferStub(window) {
|
|
65
|
+
return new class DataTransferStub {
|
|
66
|
+
getData(format) {
|
|
67
|
+
var _this_items_find;
|
|
68
|
+
const match = (_this_items_find = this.items.find(getTypeMatcher(format, true))) !== null && _this_items_find !== void 0 ? _this_items_find : this.items.find(getTypeMatcher(format, false));
|
|
69
|
+
let text = '';
|
|
70
|
+
match === null || match === void 0 ? void 0 : match.getAsString((t)=>{
|
|
71
|
+
text = t;
|
|
72
|
+
});
|
|
73
|
+
return text;
|
|
74
|
+
}
|
|
75
|
+
setData(format, data) {
|
|
76
|
+
const matchIndex = this.items.findIndex(getTypeMatcher(format, true));
|
|
77
|
+
const item = new DataTransferItemStub(data, format);
|
|
78
|
+
if (matchIndex >= 0) {
|
|
79
|
+
this.items.splice(matchIndex, 1, item);
|
|
80
|
+
} else {
|
|
81
|
+
this.items.push(item);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
clearData(format) {
|
|
85
|
+
if (format) {
|
|
86
|
+
const matchIndex = this.items.findIndex(getTypeMatcher(format, true));
|
|
87
|
+
if (matchIndex >= 0) {
|
|
88
|
+
this.items.remove(matchIndex);
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
this.items.clear();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
get types() {
|
|
95
|
+
const t = [];
|
|
96
|
+
if (this.files.length) {
|
|
97
|
+
t.push('Files');
|
|
98
|
+
}
|
|
99
|
+
this.items.forEach((i)=>t.push(i.type));
|
|
100
|
+
Object.freeze(t);
|
|
101
|
+
return t;
|
|
102
|
+
}
|
|
103
|
+
/* istanbul ignore next */ setDragImage() {}
|
|
104
|
+
constructor(){
|
|
105
|
+
_define_property(this, "dropEffect", 'none');
|
|
106
|
+
_define_property(this, "effectAllowed", 'uninitialized');
|
|
107
|
+
_define_property(this, "items", new DataTransferItemListStub());
|
|
108
|
+
_define_property(this, "files", createFileList(window, []));
|
|
109
|
+
}
|
|
110
|
+
}();
|
|
111
|
+
}
|
|
112
|
+
function createDataTransfer(window, files = []) {
|
|
113
|
+
// Use real DataTransfer if available
|
|
114
|
+
const dt = typeof window.DataTransfer === 'undefined' ? createDataTransferStub(window) : /* istanbul ignore next */ new window.DataTransfer();
|
|
115
|
+
Object.defineProperty(dt, 'files', {
|
|
116
|
+
get: ()=>createFileList(window, files)
|
|
117
|
+
});
|
|
118
|
+
return dt;
|
|
119
|
+
}
|
|
120
|
+
async function getBlobFromDataTransferItem(window, item) {
|
|
121
|
+
if (item.kind === 'file') {
|
|
122
|
+
return item.getAsFile();
|
|
123
|
+
}
|
|
124
|
+
return new window.Blob([
|
|
125
|
+
await new Promise((r)=>item.getAsString(r))
|
|
126
|
+
], {
|
|
127
|
+
type: item.type
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export { createDataTransfer, getBlobFromDataTransferItem };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// FileList can not be created per constructor.
|
|
2
|
+
function createFileList(window, files) {
|
|
3
|
+
const list = {
|
|
4
|
+
...files,
|
|
5
|
+
length: files.length,
|
|
6
|
+
item: (index)=>list[index],
|
|
7
|
+
[Symbol.iterator]: function* nextFile() {
|
|
8
|
+
for(let i = 0; i < list.length; i++){
|
|
9
|
+
yield list[i];
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
list.constructor = window.FileList;
|
|
14
|
+
// guard for environments without FileList
|
|
15
|
+
/* istanbul ignore else */ if (window.FileList) {
|
|
16
|
+
Object.setPrototypeOf(list, window.FileList.prototype);
|
|
17
|
+
}
|
|
18
|
+
Object.freeze(list);
|
|
19
|
+
return list;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { createFileList };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// jsdom is not supporting isContentEditable
|
|
2
|
+
function isContentEditable(element) {
|
|
3
|
+
return element.hasAttribute('contenteditable') && (element.getAttribute('contenteditable') == 'true' || element.getAttribute('contenteditable') == '');
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* If a node is a contenteditable or inside one, return that element.
|
|
7
|
+
*/ function getContentEditable(node) {
|
|
8
|
+
const element = getElement(node);
|
|
9
|
+
return element && (element.closest('[contenteditable=""]') || element.closest('[contenteditable="true"]'));
|
|
10
|
+
}
|
|
11
|
+
function getElement(node) {
|
|
12
|
+
return node.nodeType === 1 ? node : node.parentElement;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { getContentEditable, isContentEditable };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { isElementType } from '../misc/isElementType.js';
|
|
2
|
+
import { isContentEditable } from './isContentEditable.js';
|
|
3
|
+
|
|
4
|
+
function isEditable(element) {
|
|
5
|
+
return isEditableInputOrTextArea(element) && !element.readOnly || isContentEditable(element);
|
|
6
|
+
}
|
|
7
|
+
var editableInputTypes = /*#__PURE__*/ function(editableInputTypes) {
|
|
8
|
+
editableInputTypes["text"] = "text";
|
|
9
|
+
editableInputTypes["date"] = "date";
|
|
10
|
+
editableInputTypes["datetime-local"] = "datetime-local";
|
|
11
|
+
editableInputTypes["email"] = "email";
|
|
12
|
+
editableInputTypes["month"] = "month";
|
|
13
|
+
editableInputTypes["number"] = "number";
|
|
14
|
+
editableInputTypes["password"] = "password";
|
|
15
|
+
editableInputTypes["search"] = "search";
|
|
16
|
+
editableInputTypes["tel"] = "tel";
|
|
17
|
+
editableInputTypes["time"] = "time";
|
|
18
|
+
editableInputTypes["url"] = "url";
|
|
19
|
+
editableInputTypes["week"] = "week";
|
|
20
|
+
return editableInputTypes;
|
|
21
|
+
}(editableInputTypes || {});
|
|
22
|
+
function isEditableInputOrTextArea(element) {
|
|
23
|
+
return isElementType(element, 'textarea') || isElementType(element, 'input') && element.type in editableInputTypes;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { isEditable, isEditableInputOrTextArea };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { isElementType } from '../misc/isElementType.js';
|
|
2
|
+
|
|
3
|
+
var maxLengthSupportedTypes = /*#__PURE__*/ function(maxLengthSupportedTypes) {
|
|
4
|
+
maxLengthSupportedTypes["email"] = "email";
|
|
5
|
+
maxLengthSupportedTypes["password"] = "password";
|
|
6
|
+
maxLengthSupportedTypes["search"] = "search";
|
|
7
|
+
maxLengthSupportedTypes["telephone"] = "telephone";
|
|
8
|
+
maxLengthSupportedTypes["text"] = "text";
|
|
9
|
+
maxLengthSupportedTypes["url"] = "url";
|
|
10
|
+
return maxLengthSupportedTypes;
|
|
11
|
+
}(maxLengthSupportedTypes || {});
|
|
12
|
+
// can't use .maxLength property because of a jsdom bug:
|
|
13
|
+
// https://github.com/jsdom/jsdom/issues/2927
|
|
14
|
+
function getMaxLength(element) {
|
|
15
|
+
var _element_getAttribute;
|
|
16
|
+
const attr = (_element_getAttribute = element.getAttribute('maxlength')) !== null && _element_getAttribute !== void 0 ? _element_getAttribute : '';
|
|
17
|
+
return /^\d+$/.test(attr) && Number(attr) >= 0 ? Number(attr) : undefined;
|
|
18
|
+
}
|
|
19
|
+
function supportsMaxLength(element) {
|
|
20
|
+
return isElementType(element, 'textarea') || isElementType(element, 'input') && element.type in maxLengthSupportedTypes;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { getMaxLength, supportsMaxLength };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// It is not possible to create a real FileList programmatically.
|
|
2
|
+
// Therefore assigning `files` property with a programmatically created FileList results in an error.
|
|
3
|
+
// Just assigning the property (as per fireEvent) breaks the interweaving with the `value` property.
|
|
4
|
+
const fakeFiles = Symbol('files and value properties are mocked');
|
|
5
|
+
function restoreProperty(obj, prop, descriptor) {
|
|
6
|
+
if (descriptor) {
|
|
7
|
+
Object.defineProperty(obj, prop, descriptor);
|
|
8
|
+
} else {
|
|
9
|
+
delete obj[prop];
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function setFiles(el, files) {
|
|
13
|
+
var _el_fakeFiles;
|
|
14
|
+
(_el_fakeFiles = el[fakeFiles]) === null || _el_fakeFiles === void 0 ? void 0 : _el_fakeFiles.restore();
|
|
15
|
+
const typeDescr = Object.getOwnPropertyDescriptor(el, 'type');
|
|
16
|
+
const valueDescr = Object.getOwnPropertyDescriptor(el, 'value');
|
|
17
|
+
const filesDescr = Object.getOwnPropertyDescriptor(el, 'files');
|
|
18
|
+
function restore() {
|
|
19
|
+
restoreProperty(el, 'type', typeDescr);
|
|
20
|
+
restoreProperty(el, 'value', valueDescr);
|
|
21
|
+
restoreProperty(el, 'files', filesDescr);
|
|
22
|
+
}
|
|
23
|
+
el[fakeFiles] = {
|
|
24
|
+
restore
|
|
25
|
+
};
|
|
26
|
+
Object.defineProperties(el, {
|
|
27
|
+
files: {
|
|
28
|
+
configurable: true,
|
|
29
|
+
get: ()=>files
|
|
30
|
+
},
|
|
31
|
+
value: {
|
|
32
|
+
configurable: true,
|
|
33
|
+
get: ()=>files.length ? `C:\\fakepath\\${files[0].name}` : '',
|
|
34
|
+
set (v) {
|
|
35
|
+
if (v === '') {
|
|
36
|
+
restore();
|
|
37
|
+
} else {
|
|
38
|
+
var _valueDescr_set;
|
|
39
|
+
valueDescr === null || valueDescr === void 0 ? void 0 : (_valueDescr_set = valueDescr.set) === null || _valueDescr_set === void 0 ? void 0 : _valueDescr_set.call(el, v);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
type: {
|
|
44
|
+
configurable: true,
|
|
45
|
+
get: ()=>'file',
|
|
46
|
+
set (v) {
|
|
47
|
+
if (v !== 'file') {
|
|
48
|
+
restore();
|
|
49
|
+
el.type = v;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { setFiles };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const parseInt = globalThis.parseInt;
|
|
2
|
+
function buildTimeValue(value) {
|
|
3
|
+
const onlyDigitsValue = value.replace(/\D/g, '');
|
|
4
|
+
if (onlyDigitsValue.length < 2) {
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
7
|
+
const firstDigit = parseInt(onlyDigitsValue[0], 10);
|
|
8
|
+
const secondDigit = parseInt(onlyDigitsValue[1], 10);
|
|
9
|
+
if (firstDigit >= 3 || firstDigit === 2 && secondDigit >= 4) {
|
|
10
|
+
let index;
|
|
11
|
+
if (firstDigit >= 3) {
|
|
12
|
+
index = 1;
|
|
13
|
+
} else {
|
|
14
|
+
index = 2;
|
|
15
|
+
}
|
|
16
|
+
return build(onlyDigitsValue, index);
|
|
17
|
+
}
|
|
18
|
+
if (value.length === 2) {
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
return build(onlyDigitsValue, 2);
|
|
22
|
+
}
|
|
23
|
+
function build(onlyDigitsValue, index) {
|
|
24
|
+
const hours = onlyDigitsValue.slice(0, index);
|
|
25
|
+
const validHours = Math.min(parseInt(hours, 10), 23);
|
|
26
|
+
const minuteCharacters = onlyDigitsValue.slice(index);
|
|
27
|
+
const parsedMinutes = parseInt(minuteCharacters, 10);
|
|
28
|
+
const validMinutes = Math.min(parsedMinutes, 59);
|
|
29
|
+
return `${validHours.toString().padStart(2, '0')}:${validMinutes.toString().padStart(2, '0')}`;
|
|
30
|
+
}
|
|
31
|
+
function isValidDateOrTimeValue(element, value) {
|
|
32
|
+
const clone = element.cloneNode();
|
|
33
|
+
clone.value = value;
|
|
34
|
+
return clone.value === value;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { buildTimeValue, isValidDateOrTimeValue };
|