-
Notifications
You must be signed in to change notification settings - Fork 0
/
dom.d.ts
70 lines (65 loc) · 2.2 KB
/
dom.d.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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// credit: https://x.com/MikeRyanDev/status/1308472279010025477
type Split<
S extends string,
D extends string,
> = S extends `${infer T}${D}${infer U}` ? [T, ...Split<U, D>] : [S];
type TakeLast<V> = V extends []
? never
: V extends [string]
? V[0]
: V extends [string, ...infer R]
? TakeLast<R>
: never;
type TrimLeft<V extends string> = V extends ` ${infer R}` ? TrimLeft<R> : V;
type TrimRight<V extends string> = V extends `${infer R} ` ? TrimRight<R> : V;
type Trim<V extends string> = TrimLeft<TrimRight<V>>;
type StripModifier<
V extends string,
M extends string,
> = V extends `${infer L}${M}${infer A}` ? L : V;
type StripModifiers<V extends string> = StripModifier<
StripModifier<StripModifier<StripModifier<V, '.'>, '#'>, '['>,
':'
>;
type TakeLastAfterToken<V extends string, T extends string> = StripModifiers<
TakeLast<Split<Trim<V>, T>>
>;
type GetLastElementName<V extends string> = TakeLastAfterToken<
TakeLastAfterToken<V, ' '>,
'>'
>;
type GetEachElementName<V, L extends string[] = []> = V extends []
? L
: V extends [string]
? [...L, GetLastElementName<V[0]>]
: V extends [string, ...infer R]
? GetEachElementName<R, [...L, GetLastElementName<V[0]>]>
: [];
type GetElementNames<V extends string> = GetEachElementName<Split<V, ','>>;
type ElementByName<V extends string> = V extends keyof HTMLElementTagNameMap
? HTMLElementTagNameMap[V]
: V extends keyof SVGElementTagNameMap
? SVGElementTagNameMap[V]
: Element;
type MatchEachElement<V, L extends Element | null = null> = V extends []
? L
: V extends [string]
? L | ElementByName<V[0]>
: V extends [string, ...infer R]
? MatchEachElement<R, L | ElementByName<V[0]>>
: L;
export type QueryResult<T extends string> = MatchEachElement<
GetElementNames<T>
>;
declare function querySelector<T extends string>(query: T): QueryResult<T>;
declare function querySelectorAll<T extends string>(query: T): QueryResult<T>[];
declare global {
interface Document {
/**
* 비표준 기능을 사용합니다.
* @see https://developer.mozilla.org/docs/Web/API/Document/startViewTransition
*/
startViewTransition?: (callback: () => void) => void;
}
}
export {};