@kerebron/extension-server-hono 0.4.27 → 0.4.29

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.
Files changed (97) hide show
  1. package/esm/HonoYjsMemAdapter.d.ts +41 -0
  2. package/esm/HonoYjsMemAdapter.d.ts.map +1 -0
  3. package/esm/HonoYjsMemAdapter.js +204 -0
  4. package/esm/HonoYjsMemAdapter.js.map +1 -0
  5. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.d.ts +15 -0
  6. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.d.ts.map +1 -0
  7. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.js +65 -0
  8. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.js.map +1 -0
  9. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.d.ts +452 -0
  10. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.d.ts.map +1 -0
  11. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.js +411 -0
  12. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.js.map +1 -0
  13. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.d.ts +70 -0
  14. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.d.ts.map +1 -0
  15. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.js +63 -0
  16. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.js.map +1 -0
  17. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.d.ts +221 -0
  18. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.d.ts.map +1 -0
  19. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.js +392 -0
  20. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.js.map +1 -0
  21. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.d.ts +60 -0
  22. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.d.ts.map +1 -0
  23. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.js +62 -0
  24. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.js.map +1 -0
  25. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.d.ts +2 -0
  26. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.d.ts.map +1 -0
  27. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.js +2 -0
  28. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.js.map +1 -0
  29. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.d.ts +314 -0
  30. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.d.ts.map +1 -0
  31. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.js +328 -0
  32. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.js.map +1 -0
  33. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.d.ts +98 -0
  34. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.d.ts.map +1 -0
  35. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.js +26 -0
  36. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.js.map +1 -0
  37. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.d.ts +574 -0
  38. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.d.ts.map +1 -0
  39. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.js +12 -0
  40. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.js.map +1 -0
  41. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.d.ts +80 -0
  42. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.d.ts.map +1 -0
  43. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.js +112 -0
  44. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.js.map +1 -0
  45. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.d.ts +5 -0
  46. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.d.ts.map +1 -0
  47. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.js +5 -0
  48. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.js.map +1 -0
  49. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.d.ts +9 -0
  50. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.d.ts.map +1 -0
  51. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.js +6 -0
  52. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.js.map +1 -0
  53. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.d.ts +45 -0
  54. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.d.ts.map +1 -0
  55. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.js +123 -0
  56. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.js.map +1 -0
  57. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.d.ts +33 -0
  58. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.d.ts.map +1 -0
  59. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.js +6 -0
  60. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.js.map +1 -0
  61. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.d.ts +71 -0
  62. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.d.ts.map +1 -0
  63. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.js +84 -0
  64. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.js.map +1 -0
  65. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.d.ts +75 -0
  66. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.d.ts.map +1 -0
  67. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.js +6 -0
  68. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.js.map +1 -0
  69. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.d.ts +30 -0
  70. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.d.ts.map +1 -0
  71. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.js +256 -0
  72. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.js.map +1 -0
  73. package/esm/mod.d.ts +5 -0
  74. package/esm/mod.d.ts.map +1 -0
  75. package/esm/mod.js +2 -0
  76. package/esm/mod.js.map +1 -0
  77. package/esm/package.json +3 -0
  78. package/package.json +5 -2
  79. package/src/HonoYjsMemAdapter.ts +264 -0
  80. package/src/deps/jsr.io/@hono/hono/4.11.3/src/compose.ts +73 -0
  81. package/src/deps/jsr.io/@hono/hono/4.11.3/src/context.ts +770 -0
  82. package/src/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.ts +140 -0
  83. package/src/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.ts +539 -0
  84. package/src/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.ts +78 -0
  85. package/src/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.ts +1 -0
  86. package/src/deps/jsr.io/@hono/hono/4.11.3/src/request.ts +487 -0
  87. package/src/deps/jsr.io/@hono/hono/4.11.3/src/router.ts +103 -0
  88. package/src/deps/jsr.io/@hono/hono/4.11.3/src/types.ts +2489 -0
  89. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.ts +229 -0
  90. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.ts +4 -0
  91. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.ts +333 -0
  92. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.ts +182 -0
  93. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.ts +72 -0
  94. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.ts +96 -0
  95. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.ts +116 -0
  96. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.ts +310 -0
  97. package/src/mod.ts +5 -0
@@ -0,0 +1,182 @@
1
+ /**
2
+ * @module
3
+ * HTML utility.
4
+ */
5
+
6
+ export const HtmlEscapedCallbackPhase = {
7
+ Stringify: 1,
8
+ BeforeStream: 2,
9
+ Stream: 3,
10
+ } as const
11
+ type HtmlEscapedCallbackOpts = {
12
+ buffer?: [string]
13
+ phase: (typeof HtmlEscapedCallbackPhase)[keyof typeof HtmlEscapedCallbackPhase]
14
+ context: Readonly<object> // An object unique to each JSX tree. This object is used as the WeakMap key.
15
+ }
16
+ export type HtmlEscapedCallback = (opts: HtmlEscapedCallbackOpts) => Promise<string> | undefined
17
+ export type HtmlEscaped = {
18
+ isEscaped: true
19
+ callbacks?: HtmlEscapedCallback[]
20
+ }
21
+ export type HtmlEscapedString = string & HtmlEscaped
22
+
23
+ /**
24
+ * StringBuffer contains string and Promise<string> alternately
25
+ * The length of the array will be odd, the odd numbered element will be a string,
26
+ * and the even numbered element will be a Promise<string>.
27
+ * When concatenating into a single string, it must be processed from the tail.
28
+ * @example
29
+ * [
30
+ * 'framework.',
31
+ * Promise.resolve('ultra fast'),
32
+ * 'a ',
33
+ * Promise.resolve('is '),
34
+ * 'Hono',
35
+ * ]
36
+ */
37
+ export type StringBuffer = (string | Promise<string>)[]
38
+ export type StringBufferWithCallbacks = StringBuffer & { callbacks: HtmlEscapedCallback[] }
39
+
40
+ export const raw = (value: unknown, callbacks?: HtmlEscapedCallback[]): HtmlEscapedString => {
41
+ const escapedString = new String(value) as HtmlEscapedString
42
+ escapedString.isEscaped = true
43
+ escapedString.callbacks = callbacks
44
+
45
+ return escapedString
46
+ }
47
+
48
+ // The `escapeToBuffer` implementation is based on code from the MIT licensed `react-dom` package.
49
+ // https://github.com/facebook/react/blob/main/packages/react-dom-bindings/src/server/escapeTextForBrowser.js
50
+
51
+ const escapeRe = /[&<>'"]/
52
+
53
+ export const stringBufferToString = async (
54
+ buffer: StringBuffer,
55
+ callbacks: HtmlEscapedCallback[] | undefined
56
+ ): Promise<HtmlEscapedString> => {
57
+ let str = ''
58
+ callbacks ||= []
59
+ const resolvedBuffer = await Promise.all(buffer)
60
+ for (let i = resolvedBuffer.length - 1; ; i--) {
61
+ str += resolvedBuffer[i]
62
+ i--
63
+ if (i < 0) {
64
+ break
65
+ }
66
+
67
+ let r = resolvedBuffer[i]
68
+ if (typeof r === 'object') {
69
+ callbacks.push(...((r as HtmlEscapedString).callbacks || []))
70
+ }
71
+
72
+ const isEscaped = (r as HtmlEscapedString).isEscaped
73
+ r = await (typeof r === 'object' ? (r as HtmlEscapedString).toString() : r)
74
+ if (typeof r === 'object') {
75
+ callbacks.push(...((r as HtmlEscapedString).callbacks || []))
76
+ }
77
+
78
+ if ((r as HtmlEscapedString).isEscaped ?? isEscaped) {
79
+ str += r
80
+ } else {
81
+ const buf = [str]
82
+ escapeToBuffer(r, buf)
83
+ str = buf[0]
84
+ }
85
+ }
86
+
87
+ return raw(str, callbacks)
88
+ }
89
+
90
+ export const escapeToBuffer = (str: string, buffer: StringBuffer): void => {
91
+ const match = str.search(escapeRe)
92
+ if (match === -1) {
93
+ buffer[0] += str
94
+ return
95
+ }
96
+
97
+ let escape
98
+ let index
99
+ let lastIndex = 0
100
+
101
+ for (index = match; index < str.length; index++) {
102
+ switch (str.charCodeAt(index)) {
103
+ case 34: // "
104
+ escape = '&quot;'
105
+ break
106
+ case 39: // '
107
+ escape = '&#39;'
108
+ break
109
+ case 38: // &
110
+ escape = '&amp;'
111
+ break
112
+ case 60: // <
113
+ escape = '&lt;'
114
+ break
115
+ case 62: // >
116
+ escape = '&gt;'
117
+ break
118
+ default:
119
+ continue
120
+ }
121
+
122
+ buffer[0] += str.substring(lastIndex, index) + escape
123
+ lastIndex = index + 1
124
+ }
125
+
126
+ buffer[0] += str.substring(lastIndex, index)
127
+ }
128
+
129
+ export const resolveCallbackSync = (str: string | HtmlEscapedString): string => {
130
+ const callbacks = (str as HtmlEscapedString).callbacks as HtmlEscapedCallback[]
131
+ if (!callbacks?.length) {
132
+ return str
133
+ }
134
+ const buffer: [string] = [str]
135
+ const context = {}
136
+
137
+ callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context }))
138
+
139
+ return buffer[0]
140
+ }
141
+
142
+ export const resolveCallback = async (
143
+ str: string | HtmlEscapedString | Promise<string>,
144
+ phase: (typeof HtmlEscapedCallbackPhase)[keyof typeof HtmlEscapedCallbackPhase],
145
+ preserveCallbacks: boolean,
146
+ context: object,
147
+ buffer?: [string]
148
+ ): Promise<string> => {
149
+ if (typeof str === 'object' && !(str instanceof String)) {
150
+ if (!((str as unknown) instanceof Promise)) {
151
+ str = (str as unknown as string).toString() // HtmlEscapedString object to string
152
+ }
153
+ if ((str as string | Promise<string>) instanceof Promise) {
154
+ str = await (str as unknown as Promise<string>)
155
+ }
156
+ }
157
+
158
+ const callbacks = (str as HtmlEscapedString).callbacks as HtmlEscapedCallback[]
159
+ if (!callbacks?.length) {
160
+ return Promise.resolve(str)
161
+ }
162
+ if (buffer) {
163
+ buffer[0] += str
164
+ } else {
165
+ buffer = [str as string]
166
+ }
167
+
168
+ const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then((res) =>
169
+ Promise.all(
170
+ res
171
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
172
+ .filter<string>(Boolean as any)
173
+ .map((str) => resolveCallback(str, phase, false, context, buffer))
174
+ ).then(() => (buffer as [string])[0])
175
+ )
176
+
177
+ if (preserveCallbacks) {
178
+ return raw(await resStr, callbacks)
179
+ } else {
180
+ return resStr
181
+ }
182
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * @module
3
+ * HTTP Status utility.
4
+ */
5
+
6
+ export type InfoStatusCode = 100 | 101 | 102 | 103
7
+ export type SuccessStatusCode = 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 226
8
+ export type DeprecatedStatusCode = 305 | 306
9
+ export type RedirectStatusCode = 300 | 301 | 302 | 303 | 304 | DeprecatedStatusCode | 307 | 308
10
+ export type ClientErrorStatusCode =
11
+ | 400
12
+ | 401
13
+ | 402
14
+ | 403
15
+ | 404
16
+ | 405
17
+ | 406
18
+ | 407
19
+ | 408
20
+ | 409
21
+ | 410
22
+ | 411
23
+ | 412
24
+ | 413
25
+ | 414
26
+ | 415
27
+ | 416
28
+ | 417
29
+ | 418
30
+ | 421
31
+ | 422
32
+ | 423
33
+ | 424
34
+ | 425
35
+ | 426
36
+ | 428
37
+ | 429
38
+ | 431
39
+ | 451
40
+ export type ServerErrorStatusCode = 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511
41
+
42
+ /**
43
+ * `UnofficialStatusCode` can be used to specify an unofficial status code.
44
+ * @example
45
+ *
46
+ * ```ts
47
+ * app.get('/unknown', (c) => {
48
+ * return c.text("Unknown Error", 520 as UnofficialStatusCode)
49
+ * })
50
+ * ```
51
+ */
52
+ export type UnofficialStatusCode = -1
53
+
54
+ /**
55
+ * @deprecated
56
+ * Use `UnofficialStatusCode` instead.
57
+ */
58
+ export type UnOfficalStatusCode = UnofficialStatusCode
59
+
60
+ /**
61
+ * If you want to use an unofficial status, use `UnofficialStatusCode`.
62
+ */
63
+ export type StatusCode =
64
+ | InfoStatusCode
65
+ | SuccessStatusCode
66
+ | RedirectStatusCode
67
+ | ClientErrorStatusCode
68
+ | ServerErrorStatusCode
69
+ | UnofficialStatusCode
70
+
71
+ export type ContentlessStatusCode = 101 | 204 | 205 | 304
72
+ export type ContentfulStatusCode = Exclude<StatusCode, ContentlessStatusCode>
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @module
3
+ * MIME utility.
4
+ */
5
+
6
+ export const getMimeType = (
7
+ filename: string,
8
+ mimes: Record<string, string> = baseMimes
9
+ ): string | undefined => {
10
+ const regexp = /\.([a-zA-Z0-9]+?)$/
11
+ const match = filename.match(regexp)
12
+ if (!match) {
13
+ return
14
+ }
15
+ let mimeType = mimes[match[1]]
16
+ if (mimeType && mimeType.startsWith('text')) {
17
+ mimeType += '; charset=utf-8'
18
+ }
19
+ return mimeType
20
+ }
21
+
22
+ export const getExtension = (mimeType: string): string | undefined => {
23
+ for (const ext in baseMimes) {
24
+ if (baseMimes[ext] === mimeType) {
25
+ return ext
26
+ }
27
+ }
28
+ }
29
+
30
+ export { baseMimes as mimes }
31
+
32
+ /**
33
+ * Union types for BaseMime
34
+ */
35
+ export type BaseMime = (typeof _baseMimes)[keyof typeof _baseMimes]
36
+
37
+ const _baseMimes = {
38
+ aac: 'audio/aac',
39
+ avi: 'video/x-msvideo',
40
+ avif: 'image/avif',
41
+ av1: 'video/av1',
42
+ bin: 'application/octet-stream',
43
+ bmp: 'image/bmp',
44
+ css: 'text/css',
45
+ csv: 'text/csv',
46
+ eot: 'application/vnd.ms-fontobject',
47
+ epub: 'application/epub+zip',
48
+ gif: 'image/gif',
49
+ gz: 'application/gzip',
50
+ htm: 'text/html',
51
+ html: 'text/html',
52
+ ico: 'image/x-icon',
53
+ ics: 'text/calendar',
54
+ jpeg: 'image/jpeg',
55
+ jpg: 'image/jpeg',
56
+ js: 'text/javascript',
57
+ json: 'application/json',
58
+ jsonld: 'application/ld+json',
59
+ map: 'application/json',
60
+ mid: 'audio/x-midi',
61
+ midi: 'audio/x-midi',
62
+ mjs: 'text/javascript',
63
+ mp3: 'audio/mpeg',
64
+ mp4: 'video/mp4',
65
+ mpeg: 'video/mpeg',
66
+ oga: 'audio/ogg',
67
+ ogv: 'video/ogg',
68
+ ogx: 'application/ogg',
69
+ opus: 'audio/opus',
70
+ otf: 'font/otf',
71
+ pdf: 'application/pdf',
72
+ png: 'image/png',
73
+ rtf: 'application/rtf',
74
+ svg: 'image/svg+xml',
75
+ tif: 'image/tiff',
76
+ tiff: 'image/tiff',
77
+ ts: 'video/mp2t',
78
+ ttf: 'font/ttf',
79
+ txt: 'text/plain',
80
+ wasm: 'application/wasm',
81
+ webm: 'video/webm',
82
+ weba: 'audio/webm',
83
+ webmanifest: 'application/manifest+json',
84
+ webp: 'image/webp',
85
+ woff: 'font/woff',
86
+ woff2: 'font/woff2',
87
+ xhtml: 'application/xhtml+xml',
88
+ xml: 'application/xml',
89
+ zip: 'application/zip',
90
+ '3gp': 'video/3gpp',
91
+ '3g2': 'video/3gpp2',
92
+ gltf: 'model/gltf+json',
93
+ glb: 'model/gltf-binary',
94
+ } as const
95
+
96
+ const baseMimes: Record<string, BaseMime> = _baseMimes
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @module
3
+ * Types utility.
4
+ */
5
+
6
+ /* eslint-disable @typescript-eslint/no-explicit-any */
7
+ export type Expect<T extends true> = T
8
+ export type Equal<X, Y> =
9
+ (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false
10
+ export type NotEqual<X, Y> = true extends Equal<X, Y> ? false : true
11
+
12
+ export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
13
+ k: infer I
14
+ ) => void
15
+ ? I
16
+ : never
17
+
18
+ export type RemoveBlankRecord<T> =
19
+ T extends Record<infer K, unknown> ? (K extends string ? T : never) : never
20
+
21
+ export type IfAnyThenEmptyObject<T> = 0 extends 1 & T ? {} : T
22
+
23
+ export type JSONPrimitive = string | boolean | number | null
24
+ export type JSONArray = (JSONPrimitive | JSONObject | JSONArray)[]
25
+ export type JSONObject = {
26
+ [key: string]: JSONPrimitive | JSONArray | JSONObject | object | InvalidJSONValue
27
+ }
28
+ export type InvalidJSONValue = undefined | symbol | ((...args: unknown[]) => unknown)
29
+
30
+ type InvalidToNull<T> = T extends InvalidJSONValue ? null : T
31
+
32
+ type IsInvalid<T> = T extends InvalidJSONValue ? true : false
33
+
34
+ /**
35
+ * symbol keys are omitted through `JSON.stringify`
36
+ */
37
+ type OmitSymbolKeys<T> = { [K in keyof T as K extends symbol ? never : K]: T[K] }
38
+
39
+ export type JSONValue = JSONObject | JSONArray | JSONPrimitive
40
+ /**
41
+ * Convert a type to a JSON-compatible type.
42
+ *
43
+ * Non-JSON values such as `Date` implement `.toJSON()`,
44
+ * so they can be transformed to a value assignable to `JSONObject`
45
+ *
46
+ * `JSON.stringify()` throws a `TypeError` when it encounters a `bigint` value,
47
+ * unless a custom `replacer` function or `.toJSON()` method is provided.
48
+ *
49
+ * This behaviour can be controlled by the `TError` generic type parameter,
50
+ * which defaults to `bigint | ReadonlyArray<bigint>`.
51
+ * You can set it to `never` to disable this check.
52
+ */
53
+ export type JSONParsed<T, TError = bigint | ReadonlyArray<bigint>> = T extends {
54
+ toJSON(): infer J
55
+ }
56
+ ? (() => J) extends () => JSONPrimitive
57
+ ? J
58
+ : (() => J) extends () => { toJSON(): unknown }
59
+ ? {}
60
+ : JSONParsed<J, TError>
61
+ : T extends JSONPrimitive
62
+ ? T
63
+ : T extends InvalidJSONValue
64
+ ? never
65
+ : T extends ReadonlyArray<unknown>
66
+ ? { [K in keyof T]: JSONParsed<InvalidToNull<T[K]>, TError> }
67
+ : T extends Set<unknown> | Map<unknown, unknown> | Record<string, never>
68
+ ? {}
69
+ : T extends object
70
+ ? T[keyof T] extends TError
71
+ ? never
72
+ : {
73
+ [K in keyof OmitSymbolKeys<T> as IsInvalid<T[K]> extends true
74
+ ? never
75
+ : K]: boolean extends IsInvalid<T[K]>
76
+ ? JSONParsed<T[K], TError> | undefined
77
+ : JSONParsed<T[K], TError>
78
+ }
79
+ : T extends unknown
80
+ ? T extends TError
81
+ ? never
82
+ : JSONValue
83
+ : never
84
+
85
+ /**
86
+ * Useful to flatten the type output to improve type hints shown in editors. And also to transform an interface into a type to aide with assignability.
87
+ * @copyright from sindresorhus/type-fest
88
+ */
89
+ export type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {}
90
+
91
+ /**
92
+ * A simple extension of Simplify that will deeply traverse array elements.
93
+ */
94
+ export type SimplifyDeepArray<T> = T extends any[]
95
+ ? { [E in keyof T]: SimplifyDeepArray<T[E]> }
96
+ : Simplify<T>
97
+
98
+ export type InterfaceToType<T> = T extends Function ? T : { [K in keyof T]: InterfaceToType<T[K]> }
99
+
100
+ export type RequiredKeysOf<BaseType extends object> = Exclude<
101
+ {
102
+ [Key in keyof BaseType]: BaseType extends Record<Key, BaseType[Key]> ? Key : never
103
+ }[keyof BaseType],
104
+ undefined
105
+ >
106
+
107
+ export type HasRequiredKeys<BaseType extends object> =
108
+ RequiredKeysOf<BaseType> extends never ? false : true
109
+
110
+ export type IsAny<T> = boolean extends (T extends never ? true : false) ? true : false
111
+
112
+ /**
113
+ * String literal types with auto-completion
114
+ * @see https://github.com/Microsoft/TypeScript/issues/29729
115
+ */
116
+ export type StringLiteralUnion<T> = T | (string & Record<never, never>)