-
Notifications
You must be signed in to change notification settings - Fork 240
/
isEditable.ts
45 lines (41 loc) 路 1.13 KB
/
isEditable.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import {isElementType} from '../misc/isElementType'
import {isContentEditable} from './isContentEditable'
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type GuardedType<T> = T extends (x: any) => x is infer R ? R : never
export function isEditable(
element: Element,
): element is
| GuardedType<typeof isContentEditable>
| GuardedType<typeof isEditableInput>
| (HTMLTextAreaElement & {readOnly: false}) {
return (
isEditableInput(element) ||
isElementType(element, 'textarea', {readOnly: false}) ||
isContentEditable(element)
)
}
export enum editableInputTypes {
'text' = 'text',
'date' = 'date',
'datetime-local' = 'datetime-local',
'email' = 'email',
'month' = 'month',
'number' = 'number',
'password' = 'password',
'search' = 'search',
'tel' = 'tel',
'time' = 'time',
'url' = 'url',
'week' = 'week',
}
export function isEditableInput(
element: Element,
): element is HTMLInputElement & {
readOnly: false
type: editableInputTypes
} {
return (
isElementType(element, 'input', {readOnly: false}) &&
Boolean(editableInputTypes[element.type as editableInputTypes])
)
}