summaryrefslogtreecommitdiff
path: root/packages/webapi/src/lib/utils.ts
blob: 61a78e97be71461c3500008a24c5e11da4a2d680 (plain) (blame)
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
import { performance } from 'node:perf_hooks'

/** Returns the function bound to the given object. */
export const __function_bind = Function.bind.bind(
	Function.call as unknown as any
) as <TArgs extends any[], TFunc extends (...args: TArgs) => any>(
	callback: TFunc,
	thisArg: unknown,
	...args: TArgs
) => TFunc

/** Returns whether the object prototype exists in another object. */
export const __object_isPrototypeOf = Function.call.bind(
	Object.prototype.isPrototypeOf
) as { <T1 extends object, T2>(p: T1, v: T2): T2 extends T1 ? true : false }

/** Current high resolution millisecond timestamp. */
export const __performance_now = performance.now as () => number

// @ts-ignore
export const INTERNALS = new WeakMap<unknown, any>()

export const internalsOf = <T extends object>(
	target: T | object,
	className: string,
	propName: string
): T => {
	const internals: T = INTERNALS.get(target)

	if (!internals)
		throw new TypeError(
			`${className}.${propName} can only be used on instances of ${className}`
		)

	return internals
}

export const allowStringTag = (value: any) =>
	(value.prototype[Symbol.toStringTag] = value.name)

/** Returns any kind of path as a posix path. */
export const pathToPosix = (pathname: any) =>
	String(pathname == null ? '' : pathname)
		.replace(
			// convert slashes
			/\\+/g,
			'/'
		)
		.replace(
			// prefix a slash to drive letters
			/^(?=[A-Za-z]:\/)/,
			'/'
		)
		.replace(
			// encode path characters
			/%/g,
			'%25'
		)
		.replace(/\n/g, '%0A')
		.replace(/\r/g, '%0D')
		.replace(/\t/g, '%09')