@nocobase/plugin-idp-oauth 2.1.0-alpha.16 → 2.1.0-alpha.18

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 (217) hide show
  1. package/build.config.ts +1 -1
  2. package/dist/externalVersion.js +4 -4
  3. package/dist/node_modules/light-my-request/package.json +1 -1
  4. package/dist/node_modules/undici/LICENSE +21 -0
  5. package/dist/node_modules/undici/README.md +741 -0
  6. package/dist/node_modules/undici/docs/docs/api/Agent.md +84 -0
  7. package/dist/node_modules/undici/docs/docs/api/BalancedPool.md +99 -0
  8. package/dist/node_modules/undici/docs/docs/api/CacheStorage.md +30 -0
  9. package/dist/node_modules/undici/docs/docs/api/CacheStore.md +164 -0
  10. package/dist/node_modules/undici/docs/docs/api/Client.md +285 -0
  11. package/dist/node_modules/undici/docs/docs/api/ClientStats.md +27 -0
  12. package/dist/node_modules/undici/docs/docs/api/Connector.md +115 -0
  13. package/dist/node_modules/undici/docs/docs/api/ContentType.md +57 -0
  14. package/dist/node_modules/undici/docs/docs/api/Cookies.md +101 -0
  15. package/dist/node_modules/undici/docs/docs/api/Debug.md +62 -0
  16. package/dist/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +315 -0
  17. package/dist/node_modules/undici/docs/docs/api/Dispatcher.md +1392 -0
  18. package/dist/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +159 -0
  19. package/dist/node_modules/undici/docs/docs/api/Errors.md +49 -0
  20. package/dist/node_modules/undici/docs/docs/api/EventSource.md +45 -0
  21. package/dist/node_modules/undici/docs/docs/api/Fetch.md +60 -0
  22. package/dist/node_modules/undici/docs/docs/api/GlobalInstallation.md +139 -0
  23. package/dist/node_modules/undici/docs/docs/api/H2CClient.md +263 -0
  24. package/dist/node_modules/undici/docs/docs/api/MockAgent.md +603 -0
  25. package/dist/node_modules/undici/docs/docs/api/MockCallHistory.md +197 -0
  26. package/dist/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +43 -0
  27. package/dist/node_modules/undici/docs/docs/api/MockClient.md +81 -0
  28. package/dist/node_modules/undici/docs/docs/api/MockErrors.md +12 -0
  29. package/dist/node_modules/undici/docs/docs/api/MockPool.md +555 -0
  30. package/dist/node_modules/undici/docs/docs/api/Pool.md +84 -0
  31. package/dist/node_modules/undici/docs/docs/api/PoolStats.md +35 -0
  32. package/dist/node_modules/undici/docs/docs/api/ProxyAgent.md +229 -0
  33. package/dist/node_modules/undici/docs/docs/api/RedirectHandler.md +93 -0
  34. package/dist/node_modules/undici/docs/docs/api/RetryAgent.md +50 -0
  35. package/dist/node_modules/undici/docs/docs/api/RetryHandler.md +118 -0
  36. package/dist/node_modules/undici/docs/docs/api/RoundRobinPool.md +145 -0
  37. package/dist/node_modules/undici/docs/docs/api/SnapshotAgent.md +616 -0
  38. package/dist/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +274 -0
  39. package/dist/node_modules/undici/docs/docs/api/Util.md +25 -0
  40. package/dist/node_modules/undici/docs/docs/api/WebSocket.md +141 -0
  41. package/dist/node_modules/undici/docs/docs/api/api-lifecycle.md +91 -0
  42. package/dist/node_modules/undici/docs/docs/best-practices/client-certificate.md +64 -0
  43. package/dist/node_modules/undici/docs/docs/best-practices/crawling.md +58 -0
  44. package/dist/node_modules/undici/docs/docs/best-practices/mocking-request.md +190 -0
  45. package/dist/node_modules/undici/docs/docs/best-practices/proxy.md +127 -0
  46. package/dist/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +224 -0
  47. package/dist/node_modules/undici/docs/docs/best-practices/writing-tests.md +63 -0
  48. package/dist/node_modules/undici/index-fetch.js +65 -0
  49. package/dist/node_modules/undici/index.d.ts +3 -0
  50. package/dist/node_modules/undici/index.js +234 -0
  51. package/dist/node_modules/undici/lib/api/abort-signal.js +59 -0
  52. package/dist/node_modules/undici/lib/api/api-connect.js +110 -0
  53. package/dist/node_modules/undici/lib/api/api-pipeline.js +252 -0
  54. package/dist/node_modules/undici/lib/api/api-request.js +214 -0
  55. package/dist/node_modules/undici/lib/api/api-stream.js +209 -0
  56. package/dist/node_modules/undici/lib/api/api-upgrade.js +111 -0
  57. package/dist/node_modules/undici/lib/api/index.js +7 -0
  58. package/dist/node_modules/undici/lib/api/readable.js +580 -0
  59. package/dist/node_modules/undici/lib/cache/memory-cache-store.js +234 -0
  60. package/dist/node_modules/undici/lib/cache/sqlite-cache-store.js +461 -0
  61. package/dist/node_modules/undici/lib/core/connect.js +137 -0
  62. package/dist/node_modules/undici/lib/core/constants.js +143 -0
  63. package/dist/node_modules/undici/lib/core/diagnostics.js +227 -0
  64. package/dist/node_modules/undici/lib/core/errors.js +477 -0
  65. package/dist/node_modules/undici/lib/core/request.js +438 -0
  66. package/dist/node_modules/undici/lib/core/socks5-client.js +407 -0
  67. package/dist/node_modules/undici/lib/core/socks5-utils.js +203 -0
  68. package/dist/node_modules/undici/lib/core/symbols.js +75 -0
  69. package/dist/node_modules/undici/lib/core/tree.js +160 -0
  70. package/dist/node_modules/undici/lib/core/util.js +992 -0
  71. package/dist/node_modules/undici/lib/dispatcher/agent.js +158 -0
  72. package/dist/node_modules/undici/lib/dispatcher/balanced-pool.js +219 -0
  73. package/dist/node_modules/undici/lib/dispatcher/client-h1.js +1610 -0
  74. package/dist/node_modules/undici/lib/dispatcher/client-h2.js +995 -0
  75. package/dist/node_modules/undici/lib/dispatcher/client.js +659 -0
  76. package/dist/node_modules/undici/lib/dispatcher/dispatcher-base.js +165 -0
  77. package/dist/node_modules/undici/lib/dispatcher/dispatcher.js +48 -0
  78. package/dist/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +146 -0
  79. package/dist/node_modules/undici/lib/dispatcher/fixed-queue.js +135 -0
  80. package/dist/node_modules/undici/lib/dispatcher/h2c-client.js +51 -0
  81. package/dist/node_modules/undici/lib/dispatcher/pool-base.js +214 -0
  82. package/dist/node_modules/undici/lib/dispatcher/pool.js +118 -0
  83. package/dist/node_modules/undici/lib/dispatcher/proxy-agent.js +318 -0
  84. package/dist/node_modules/undici/lib/dispatcher/retry-agent.js +35 -0
  85. package/dist/node_modules/undici/lib/dispatcher/round-robin-pool.js +137 -0
  86. package/dist/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +249 -0
  87. package/dist/node_modules/undici/lib/encoding/index.js +33 -0
  88. package/dist/node_modules/undici/lib/global.js +50 -0
  89. package/dist/node_modules/undici/lib/handler/cache-handler.js +578 -0
  90. package/dist/node_modules/undici/lib/handler/cache-revalidation-handler.js +124 -0
  91. package/dist/node_modules/undici/lib/handler/decorator-handler.js +67 -0
  92. package/dist/node_modules/undici/lib/handler/deduplication-handler.js +460 -0
  93. package/dist/node_modules/undici/lib/handler/redirect-handler.js +238 -0
  94. package/dist/node_modules/undici/lib/handler/retry-handler.js +394 -0
  95. package/dist/node_modules/undici/lib/handler/unwrap-handler.js +100 -0
  96. package/dist/node_modules/undici/lib/handler/wrap-handler.js +105 -0
  97. package/dist/node_modules/undici/lib/interceptor/cache.js +495 -0
  98. package/dist/node_modules/undici/lib/interceptor/decompress.js +259 -0
  99. package/dist/node_modules/undici/lib/interceptor/deduplicate.js +117 -0
  100. package/dist/node_modules/undici/lib/interceptor/dns.js +571 -0
  101. package/dist/node_modules/undici/lib/interceptor/dump.js +112 -0
  102. package/dist/node_modules/undici/lib/interceptor/redirect.js +21 -0
  103. package/dist/node_modules/undici/lib/interceptor/response-error.js +95 -0
  104. package/dist/node_modules/undici/lib/interceptor/retry.js +19 -0
  105. package/dist/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  106. package/dist/node_modules/undici/lib/llhttp/constants.d.ts +195 -0
  107. package/dist/node_modules/undici/lib/llhttp/constants.js +531 -0
  108. package/dist/node_modules/undici/lib/llhttp/llhttp-wasm.js +15 -0
  109. package/dist/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +15 -0
  110. package/dist/node_modules/undici/lib/llhttp/utils.d.ts +2 -0
  111. package/dist/node_modules/undici/lib/llhttp/utils.js +12 -0
  112. package/dist/node_modules/undici/lib/mock/mock-agent.js +232 -0
  113. package/dist/node_modules/undici/lib/mock/mock-call-history.js +248 -0
  114. package/dist/node_modules/undici/lib/mock/mock-client.js +68 -0
  115. package/dist/node_modules/undici/lib/mock/mock-errors.js +29 -0
  116. package/dist/node_modules/undici/lib/mock/mock-interceptor.js +209 -0
  117. package/dist/node_modules/undici/lib/mock/mock-pool.js +68 -0
  118. package/dist/node_modules/undici/lib/mock/mock-symbols.js +32 -0
  119. package/dist/node_modules/undici/lib/mock/mock-utils.js +486 -0
  120. package/dist/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
  121. package/dist/node_modules/undici/lib/mock/snapshot-agent.js +353 -0
  122. package/dist/node_modules/undici/lib/mock/snapshot-recorder.js +588 -0
  123. package/dist/node_modules/undici/lib/mock/snapshot-utils.js +158 -0
  124. package/dist/node_modules/undici/lib/util/cache.js +407 -0
  125. package/dist/node_modules/undici/lib/util/date.js +653 -0
  126. package/dist/node_modules/undici/lib/util/promise.js +28 -0
  127. package/dist/node_modules/undici/lib/util/runtime-features.js +124 -0
  128. package/dist/node_modules/undici/lib/util/stats.js +32 -0
  129. package/dist/node_modules/undici/lib/util/timers.js +425 -0
  130. package/dist/node_modules/undici/lib/web/cache/cache.js +864 -0
  131. package/dist/node_modules/undici/lib/web/cache/cachestorage.js +152 -0
  132. package/dist/node_modules/undici/lib/web/cache/util.js +45 -0
  133. package/dist/node_modules/undici/lib/web/cookies/constants.js +12 -0
  134. package/dist/node_modules/undici/lib/web/cookies/index.js +199 -0
  135. package/dist/node_modules/undici/lib/web/cookies/parse.js +322 -0
  136. package/dist/node_modules/undici/lib/web/cookies/util.js +282 -0
  137. package/dist/node_modules/undici/lib/web/eventsource/eventsource-stream.js +399 -0
  138. package/dist/node_modules/undici/lib/web/eventsource/eventsource.js +501 -0
  139. package/dist/node_modules/undici/lib/web/eventsource/util.js +29 -0
  140. package/dist/node_modules/undici/lib/web/fetch/LICENSE +21 -0
  141. package/dist/node_modules/undici/lib/web/fetch/body.js +509 -0
  142. package/dist/node_modules/undici/lib/web/fetch/constants.js +131 -0
  143. package/dist/node_modules/undici/lib/web/fetch/data-url.js +596 -0
  144. package/dist/node_modules/undici/lib/web/fetch/formdata-parser.js +575 -0
  145. package/dist/node_modules/undici/lib/web/fetch/formdata.js +259 -0
  146. package/dist/node_modules/undici/lib/web/fetch/global.js +40 -0
  147. package/dist/node_modules/undici/lib/web/fetch/headers.js +719 -0
  148. package/dist/node_modules/undici/lib/web/fetch/index.js +2397 -0
  149. package/dist/node_modules/undici/lib/web/fetch/request.js +1115 -0
  150. package/dist/node_modules/undici/lib/web/fetch/response.js +641 -0
  151. package/dist/node_modules/undici/lib/web/fetch/util.js +1520 -0
  152. package/dist/node_modules/undici/lib/web/infra/index.js +229 -0
  153. package/dist/node_modules/undici/lib/web/subresource-integrity/Readme.md +9 -0
  154. package/dist/node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js +307 -0
  155. package/dist/node_modules/undici/lib/web/webidl/index.js +1006 -0
  156. package/dist/node_modules/undici/lib/web/websocket/connection.js +329 -0
  157. package/dist/node_modules/undici/lib/web/websocket/constants.js +126 -0
  158. package/dist/node_modules/undici/lib/web/websocket/events.js +331 -0
  159. package/dist/node_modules/undici/lib/web/websocket/frame.js +133 -0
  160. package/dist/node_modules/undici/lib/web/websocket/permessage-deflate.js +118 -0
  161. package/dist/node_modules/undici/lib/web/websocket/receiver.js +450 -0
  162. package/dist/node_modules/undici/lib/web/websocket/sender.js +109 -0
  163. package/dist/node_modules/undici/lib/web/websocket/stream/websocketerror.js +104 -0
  164. package/dist/node_modules/undici/lib/web/websocket/stream/websocketstream.js +497 -0
  165. package/dist/node_modules/undici/lib/web/websocket/util.js +347 -0
  166. package/dist/node_modules/undici/lib/web/websocket/websocket.js +751 -0
  167. package/dist/node_modules/undici/package.json +152 -0
  168. package/dist/node_modules/undici/scripts/strip-comments.js +10 -0
  169. package/dist/node_modules/undici/types/README.md +6 -0
  170. package/dist/node_modules/undici/types/agent.d.ts +32 -0
  171. package/dist/node_modules/undici/types/api.d.ts +43 -0
  172. package/dist/node_modules/undici/types/balanced-pool.d.ts +30 -0
  173. package/dist/node_modules/undici/types/cache-interceptor.d.ts +179 -0
  174. package/dist/node_modules/undici/types/cache.d.ts +36 -0
  175. package/dist/node_modules/undici/types/client-stats.d.ts +15 -0
  176. package/dist/node_modules/undici/types/client.d.ts +123 -0
  177. package/dist/node_modules/undici/types/connector.d.ts +36 -0
  178. package/dist/node_modules/undici/types/content-type.d.ts +21 -0
  179. package/dist/node_modules/undici/types/cookies.d.ts +30 -0
  180. package/dist/node_modules/undici/types/diagnostics-channel.d.ts +74 -0
  181. package/dist/node_modules/undici/types/dispatcher.d.ts +273 -0
  182. package/dist/node_modules/undici/types/env-http-proxy-agent.d.ts +22 -0
  183. package/dist/node_modules/undici/types/errors.d.ts +177 -0
  184. package/dist/node_modules/undici/types/eventsource.d.ts +66 -0
  185. package/dist/node_modules/undici/types/fetch.d.ts +231 -0
  186. package/dist/node_modules/undici/types/formdata.d.ts +114 -0
  187. package/dist/node_modules/undici/types/global-dispatcher.d.ts +9 -0
  188. package/dist/node_modules/undici/types/global-origin.d.ts +7 -0
  189. package/dist/node_modules/undici/types/h2c-client.d.ts +73 -0
  190. package/dist/node_modules/undici/types/handlers.d.ts +14 -0
  191. package/dist/node_modules/undici/types/header.d.ts +160 -0
  192. package/dist/node_modules/undici/types/index.d.ts +91 -0
  193. package/dist/node_modules/undici/types/interceptors.d.ts +80 -0
  194. package/dist/node_modules/undici/types/mock-agent.d.ts +68 -0
  195. package/dist/node_modules/undici/types/mock-call-history.d.ts +111 -0
  196. package/dist/node_modules/undici/types/mock-client.d.ts +27 -0
  197. package/dist/node_modules/undici/types/mock-errors.d.ts +12 -0
  198. package/dist/node_modules/undici/types/mock-interceptor.d.ts +94 -0
  199. package/dist/node_modules/undici/types/mock-pool.d.ts +27 -0
  200. package/dist/node_modules/undici/types/patch.d.ts +29 -0
  201. package/dist/node_modules/undici/types/pool-stats.d.ts +19 -0
  202. package/dist/node_modules/undici/types/pool.d.ts +41 -0
  203. package/dist/node_modules/undici/types/proxy-agent.d.ts +29 -0
  204. package/dist/node_modules/undici/types/readable.d.ts +68 -0
  205. package/dist/node_modules/undici/types/retry-agent.d.ts +8 -0
  206. package/dist/node_modules/undici/types/retry-handler.d.ts +125 -0
  207. package/dist/node_modules/undici/types/round-robin-pool.d.ts +41 -0
  208. package/dist/node_modules/undici/types/snapshot-agent.d.ts +109 -0
  209. package/dist/node_modules/undici/types/socks5-proxy-agent.d.ts +25 -0
  210. package/dist/node_modules/undici/types/util.d.ts +18 -0
  211. package/dist/node_modules/undici/types/utility.d.ts +7 -0
  212. package/dist/node_modules/undici/types/webidl.d.ts +347 -0
  213. package/dist/node_modules/undici/types/websocket.d.ts +188 -0
  214. package/dist/server/plugin.d.ts +1 -0
  215. package/dist/server/plugin.js +13 -0
  216. package/dist/server/service.js +11 -3
  217. package/package.json +2 -2
@@ -0,0 +1,596 @@
1
+ 'use strict'
2
+
3
+ const assert = require('node:assert')
4
+ const { forgivingBase64, collectASequenceOfCodePoints, collectASequenceOfCodePointsFast, isomorphicDecode, removeASCIIWhitespace, removeChars } = require('../infra')
5
+
6
+ const encoder = new TextEncoder()
7
+
8
+ /**
9
+ * @see https://mimesniff.spec.whatwg.org/#http-token-code-point
10
+ */
11
+ const HTTP_TOKEN_CODEPOINTS = /^[-!#$%&'*+.^_|~A-Za-z0-9]+$/u
12
+ const HTTP_WHITESPACE_REGEX = /[\u000A\u000D\u0009\u0020]/u // eslint-disable-line
13
+
14
+ /**
15
+ * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point
16
+ */
17
+ const HTTP_QUOTED_STRING_TOKENS = /^[\u0009\u0020-\u007E\u0080-\u00FF]+$/u // eslint-disable-line
18
+
19
+ // https://fetch.spec.whatwg.org/#data-url-processor
20
+ /** @param {URL} dataURL */
21
+ function dataURLProcessor (dataURL) {
22
+ // 1. Assert: dataURL’s scheme is "data".
23
+ assert(dataURL.protocol === 'data:')
24
+
25
+ // 2. Let input be the result of running the URL
26
+ // serializer on dataURL with exclude fragment
27
+ // set to true.
28
+ let input = URLSerializer(dataURL, true)
29
+
30
+ // 3. Remove the leading "data:" string from input.
31
+ input = input.slice(5)
32
+
33
+ // 4. Let position point at the start of input.
34
+ const position = { position: 0 }
35
+
36
+ // 5. Let mimeType be the result of collecting a
37
+ // sequence of code points that are not equal
38
+ // to U+002C (,), given position.
39
+ let mimeType = collectASequenceOfCodePointsFast(
40
+ ',',
41
+ input,
42
+ position
43
+ )
44
+
45
+ // 6. Strip leading and trailing ASCII whitespace
46
+ // from mimeType.
47
+ // Undici implementation note: we need to store the
48
+ // length because if the mimetype has spaces removed,
49
+ // the wrong amount will be sliced from the input in
50
+ // step #9
51
+ const mimeTypeLength = mimeType.length
52
+ mimeType = removeASCIIWhitespace(mimeType, true, true)
53
+
54
+ // 7. If position is past the end of input, then
55
+ // return failure
56
+ if (position.position >= input.length) {
57
+ return 'failure'
58
+ }
59
+
60
+ // 8. Advance position by 1.
61
+ position.position++
62
+
63
+ // 9. Let encodedBody be the remainder of input.
64
+ const encodedBody = input.slice(mimeTypeLength + 1)
65
+
66
+ // 10. Let body be the percent-decoding of encodedBody.
67
+ let body = stringPercentDecode(encodedBody)
68
+
69
+ // 11. If mimeType ends with U+003B (;), followed by
70
+ // zero or more U+0020 SPACE, followed by an ASCII
71
+ // case-insensitive match for "base64", then:
72
+ if (/;(?:\u0020*)base64$/ui.test(mimeType)) {
73
+ // 1. Let stringBody be the isomorphic decode of body.
74
+ const stringBody = isomorphicDecode(body)
75
+
76
+ // 2. Set body to the forgiving-base64 decode of
77
+ // stringBody.
78
+ body = forgivingBase64(stringBody)
79
+
80
+ // 3. If body is failure, then return failure.
81
+ if (body === 'failure') {
82
+ return 'failure'
83
+ }
84
+
85
+ // 4. Remove the last 6 code points from mimeType.
86
+ mimeType = mimeType.slice(0, -6)
87
+
88
+ // 5. Remove trailing U+0020 SPACE code points from mimeType,
89
+ // if any.
90
+ mimeType = mimeType.replace(/(\u0020+)$/u, '')
91
+
92
+ // 6. Remove the last U+003B (;) code point from mimeType.
93
+ mimeType = mimeType.slice(0, -1)
94
+ }
95
+
96
+ // 12. If mimeType starts with U+003B (;), then prepend
97
+ // "text/plain" to mimeType.
98
+ if (mimeType.startsWith(';')) {
99
+ mimeType = 'text/plain' + mimeType
100
+ }
101
+
102
+ // 13. Let mimeTypeRecord be the result of parsing
103
+ // mimeType.
104
+ let mimeTypeRecord = parseMIMEType(mimeType)
105
+
106
+ // 14. If mimeTypeRecord is failure, then set
107
+ // mimeTypeRecord to text/plain;charset=US-ASCII.
108
+ if (mimeTypeRecord === 'failure') {
109
+ mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII')
110
+ }
111
+
112
+ // 15. Return a new data: URL struct whose MIME
113
+ // type is mimeTypeRecord and body is body.
114
+ // https://fetch.spec.whatwg.org/#data-url-struct
115
+ return { mimeType: mimeTypeRecord, body }
116
+ }
117
+
118
+ // https://url.spec.whatwg.org/#concept-url-serializer
119
+ /**
120
+ * @param {URL} url
121
+ * @param {boolean} excludeFragment
122
+ */
123
+ function URLSerializer (url, excludeFragment = false) {
124
+ if (!excludeFragment) {
125
+ return url.href
126
+ }
127
+
128
+ const href = url.href
129
+ const hashLength = url.hash.length
130
+
131
+ const serialized = hashLength === 0 ? href : href.substring(0, href.length - hashLength)
132
+
133
+ if (!hashLength && href.endsWith('#')) {
134
+ return serialized.slice(0, -1)
135
+ }
136
+
137
+ return serialized
138
+ }
139
+
140
+ // https://url.spec.whatwg.org/#string-percent-decode
141
+ /** @param {string} input */
142
+ function stringPercentDecode (input) {
143
+ // 1. Let bytes be the UTF-8 encoding of input.
144
+ const bytes = encoder.encode(input)
145
+
146
+ // 2. Return the percent-decoding of bytes.
147
+ return percentDecode(bytes)
148
+ }
149
+
150
+ /**
151
+ * @param {number} byte
152
+ */
153
+ function isHexCharByte (byte) {
154
+ // 0-9 A-F a-f
155
+ return (byte >= 0x30 && byte <= 0x39) || (byte >= 0x41 && byte <= 0x46) || (byte >= 0x61 && byte <= 0x66)
156
+ }
157
+
158
+ /**
159
+ * @param {number} byte
160
+ */
161
+ function hexByteToNumber (byte) {
162
+ return (
163
+ // 0-9
164
+ byte >= 0x30 && byte <= 0x39
165
+ ? (byte - 48)
166
+ // Convert to uppercase
167
+ // ((byte & 0xDF) - 65) + 10
168
+ : ((byte & 0xDF) - 55)
169
+ )
170
+ }
171
+
172
+ // https://url.spec.whatwg.org/#percent-decode
173
+ /** @param {Uint8Array} input */
174
+ function percentDecode (input) {
175
+ const length = input.length
176
+ // 1. Let output be an empty byte sequence.
177
+ /** @type {Uint8Array} */
178
+ const output = new Uint8Array(length)
179
+ let j = 0
180
+ let i = 0
181
+ // 2. For each byte byte in input:
182
+ while (i < length) {
183
+ const byte = input[i]
184
+
185
+ // 1. If byte is not 0x25 (%), then append byte to output.
186
+ if (byte !== 0x25) {
187
+ output[j++] = byte
188
+
189
+ // 2. Otherwise, if byte is 0x25 (%) and the next two bytes
190
+ // after byte in input are not in the ranges
191
+ // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F),
192
+ // and 0x61 (a) to 0x66 (f), all inclusive, append byte
193
+ // to output.
194
+ } else if (
195
+ byte === 0x25 &&
196
+ !(isHexCharByte(input[i + 1]) && isHexCharByte(input[i + 2]))
197
+ ) {
198
+ output[j++] = 0x25
199
+
200
+ // 3. Otherwise:
201
+ } else {
202
+ // 1. Let bytePoint be the two bytes after byte in input,
203
+ // decoded, and then interpreted as hexadecimal number.
204
+ // 2. Append a byte whose value is bytePoint to output.
205
+ output[j++] = (hexByteToNumber(input[i + 1]) << 4) | hexByteToNumber(input[i + 2])
206
+
207
+ // 3. Skip the next two bytes in input.
208
+ i += 2
209
+ }
210
+ ++i
211
+ }
212
+
213
+ // 3. Return output.
214
+ return length === j ? output : output.subarray(0, j)
215
+ }
216
+
217
+ // https://mimesniff.spec.whatwg.org/#parse-a-mime-type
218
+ /** @param {string} input */
219
+ function parseMIMEType (input) {
220
+ // 1. Remove any leading and trailing HTTP whitespace
221
+ // from input.
222
+ input = removeHTTPWhitespace(input, true, true)
223
+
224
+ // 2. Let position be a position variable for input,
225
+ // initially pointing at the start of input.
226
+ const position = { position: 0 }
227
+
228
+ // 3. Let type be the result of collecting a sequence
229
+ // of code points that are not U+002F (/) from
230
+ // input, given position.
231
+ const type = collectASequenceOfCodePointsFast(
232
+ '/',
233
+ input,
234
+ position
235
+ )
236
+
237
+ // 4. If type is the empty string or does not solely
238
+ // contain HTTP token code points, then return failure.
239
+ // https://mimesniff.spec.whatwg.org/#http-token-code-point
240
+ if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) {
241
+ return 'failure'
242
+ }
243
+
244
+ // 5. If position is past the end of input, then return
245
+ // failure
246
+ if (position.position >= input.length) {
247
+ return 'failure'
248
+ }
249
+
250
+ // 6. Advance position by 1. (This skips past U+002F (/).)
251
+ position.position++
252
+
253
+ // 7. Let subtype be the result of collecting a sequence of
254
+ // code points that are not U+003B (;) from input, given
255
+ // position.
256
+ let subtype = collectASequenceOfCodePointsFast(
257
+ ';',
258
+ input,
259
+ position
260
+ )
261
+
262
+ // 8. Remove any trailing HTTP whitespace from subtype.
263
+ subtype = removeHTTPWhitespace(subtype, false, true)
264
+
265
+ // 9. If subtype is the empty string or does not solely
266
+ // contain HTTP token code points, then return failure.
267
+ if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) {
268
+ return 'failure'
269
+ }
270
+
271
+ const typeLowercase = type.toLowerCase()
272
+ const subtypeLowercase = subtype.toLowerCase()
273
+
274
+ // 10. Let mimeType be a new MIME type record whose type
275
+ // is type, in ASCII lowercase, and subtype is subtype,
276
+ // in ASCII lowercase.
277
+ // https://mimesniff.spec.whatwg.org/#mime-type
278
+ const mimeType = {
279
+ type: typeLowercase,
280
+ subtype: subtypeLowercase,
281
+ /** @type {Map<string, string>} */
282
+ parameters: new Map(),
283
+ // https://mimesniff.spec.whatwg.org/#mime-type-essence
284
+ essence: `${typeLowercase}/${subtypeLowercase}`
285
+ }
286
+
287
+ // 11. While position is not past the end of input:
288
+ while (position.position < input.length) {
289
+ // 1. Advance position by 1. (This skips past U+003B (;).)
290
+ position.position++
291
+
292
+ // 2. Collect a sequence of code points that are HTTP
293
+ // whitespace from input given position.
294
+ collectASequenceOfCodePoints(
295
+ // https://fetch.spec.whatwg.org/#http-whitespace
296
+ char => HTTP_WHITESPACE_REGEX.test(char),
297
+ input,
298
+ position
299
+ )
300
+
301
+ // 3. Let parameterName be the result of collecting a
302
+ // sequence of code points that are not U+003B (;)
303
+ // or U+003D (=) from input, given position.
304
+ let parameterName = collectASequenceOfCodePoints(
305
+ (char) => char !== ';' && char !== '=',
306
+ input,
307
+ position
308
+ )
309
+
310
+ // 4. Set parameterName to parameterName, in ASCII
311
+ // lowercase.
312
+ parameterName = parameterName.toLowerCase()
313
+
314
+ // 5. If position is not past the end of input, then:
315
+ if (position.position < input.length) {
316
+ // 1. If the code point at position within input is
317
+ // U+003B (;), then continue.
318
+ if (input[position.position] === ';') {
319
+ continue
320
+ }
321
+
322
+ // 2. Advance position by 1. (This skips past U+003D (=).)
323
+ position.position++
324
+ }
325
+
326
+ // 6. If position is past the end of input, then break.
327
+ if (position.position >= input.length) {
328
+ break
329
+ }
330
+
331
+ // 7. Let parameterValue be null.
332
+ let parameterValue = null
333
+
334
+ // 8. If the code point at position within input is
335
+ // U+0022 ("), then:
336
+ if (input[position.position] === '"') {
337
+ // 1. Set parameterValue to the result of collecting
338
+ // an HTTP quoted string from input, given position
339
+ // and the extract-value flag.
340
+ parameterValue = collectAnHTTPQuotedString(input, position, true)
341
+
342
+ // 2. Collect a sequence of code points that are not
343
+ // U+003B (;) from input, given position.
344
+ collectASequenceOfCodePointsFast(
345
+ ';',
346
+ input,
347
+ position
348
+ )
349
+
350
+ // 9. Otherwise:
351
+ } else {
352
+ // 1. Set parameterValue to the result of collecting
353
+ // a sequence of code points that are not U+003B (;)
354
+ // from input, given position.
355
+ parameterValue = collectASequenceOfCodePointsFast(
356
+ ';',
357
+ input,
358
+ position
359
+ )
360
+
361
+ // 2. Remove any trailing HTTP whitespace from parameterValue.
362
+ parameterValue = removeHTTPWhitespace(parameterValue, false, true)
363
+
364
+ // 3. If parameterValue is the empty string, then continue.
365
+ if (parameterValue.length === 0) {
366
+ continue
367
+ }
368
+ }
369
+
370
+ // 10. If all of the following are true
371
+ // - parameterName is not the empty string
372
+ // - parameterName solely contains HTTP token code points
373
+ // - parameterValue solely contains HTTP quoted-string token code points
374
+ // - mimeType’s parameters[parameterName] does not exist
375
+ // then set mimeType’s parameters[parameterName] to parameterValue.
376
+ if (
377
+ parameterName.length !== 0 &&
378
+ HTTP_TOKEN_CODEPOINTS.test(parameterName) &&
379
+ (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) &&
380
+ !mimeType.parameters.has(parameterName)
381
+ ) {
382
+ mimeType.parameters.set(parameterName, parameterValue)
383
+ }
384
+ }
385
+
386
+ // 12. Return mimeType.
387
+ return mimeType
388
+ }
389
+
390
+ // https://fetch.spec.whatwg.org/#collect-an-http-quoted-string
391
+ // tests: https://fetch.spec.whatwg.org/#example-http-quoted-string
392
+ /**
393
+ * @param {string} input
394
+ * @param {{ position: number }} position
395
+ * @param {boolean} [extractValue=false]
396
+ */
397
+ function collectAnHTTPQuotedString (input, position, extractValue = false) {
398
+ // 1. Let positionStart be position.
399
+ const positionStart = position.position
400
+
401
+ // 2. Let value be the empty string.
402
+ let value = ''
403
+
404
+ // 3. Assert: the code point at position within input
405
+ // is U+0022 (").
406
+ assert(input[position.position] === '"')
407
+
408
+ // 4. Advance position by 1.
409
+ position.position++
410
+
411
+ // 5. While true:
412
+ while (true) {
413
+ // 1. Append the result of collecting a sequence of code points
414
+ // that are not U+0022 (") or U+005C (\) from input, given
415
+ // position, to value.
416
+ value += collectASequenceOfCodePoints(
417
+ (char) => char !== '"' && char !== '\\',
418
+ input,
419
+ position
420
+ )
421
+
422
+ // 2. If position is past the end of input, then break.
423
+ if (position.position >= input.length) {
424
+ break
425
+ }
426
+
427
+ // 3. Let quoteOrBackslash be the code point at position within
428
+ // input.
429
+ const quoteOrBackslash = input[position.position]
430
+
431
+ // 4. Advance position by 1.
432
+ position.position++
433
+
434
+ // 5. If quoteOrBackslash is U+005C (\), then:
435
+ if (quoteOrBackslash === '\\') {
436
+ // 1. If position is past the end of input, then append
437
+ // U+005C (\) to value and break.
438
+ if (position.position >= input.length) {
439
+ value += '\\'
440
+ break
441
+ }
442
+
443
+ // 2. Append the code point at position within input to value.
444
+ value += input[position.position]
445
+
446
+ // 3. Advance position by 1.
447
+ position.position++
448
+
449
+ // 6. Otherwise:
450
+ } else {
451
+ // 1. Assert: quoteOrBackslash is U+0022 (").
452
+ assert(quoteOrBackslash === '"')
453
+
454
+ // 2. Break.
455
+ break
456
+ }
457
+ }
458
+
459
+ // 6. If the extract-value flag is set, then return value.
460
+ if (extractValue) {
461
+ return value
462
+ }
463
+
464
+ // 7. Return the code points from positionStart to position,
465
+ // inclusive, within input.
466
+ return input.slice(positionStart, position.position)
467
+ }
468
+
469
+ /**
470
+ * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type
471
+ */
472
+ function serializeAMimeType (mimeType) {
473
+ assert(mimeType !== 'failure')
474
+ const { parameters, essence } = mimeType
475
+
476
+ // 1. Let serialization be the concatenation of mimeType’s
477
+ // type, U+002F (/), and mimeType’s subtype.
478
+ let serialization = essence
479
+
480
+ // 2. For each name → value of mimeType’s parameters:
481
+ for (let [name, value] of parameters.entries()) {
482
+ // 1. Append U+003B (;) to serialization.
483
+ serialization += ';'
484
+
485
+ // 2. Append name to serialization.
486
+ serialization += name
487
+
488
+ // 3. Append U+003D (=) to serialization.
489
+ serialization += '='
490
+
491
+ // 4. If value does not solely contain HTTP token code
492
+ // points or value is the empty string, then:
493
+ if (!HTTP_TOKEN_CODEPOINTS.test(value)) {
494
+ // 1. Precede each occurrence of U+0022 (") or
495
+ // U+005C (\) in value with U+005C (\).
496
+ value = value.replace(/[\\"]/ug, '\\$&')
497
+
498
+ // 2. Prepend U+0022 (") to value.
499
+ value = '"' + value
500
+
501
+ // 3. Append U+0022 (") to value.
502
+ value += '"'
503
+ }
504
+
505
+ // 5. Append value to serialization.
506
+ serialization += value
507
+ }
508
+
509
+ // 3. Return serialization.
510
+ return serialization
511
+ }
512
+
513
+ /**
514
+ * @see https://fetch.spec.whatwg.org/#http-whitespace
515
+ * @param {number} char
516
+ */
517
+ function isHTTPWhiteSpace (char) {
518
+ // "\r\n\t "
519
+ return char === 0x00d || char === 0x00a || char === 0x009 || char === 0x020
520
+ }
521
+
522
+ /**
523
+ * @see https://fetch.spec.whatwg.org/#http-whitespace
524
+ * @param {string} str
525
+ * @param {boolean} [leading=true]
526
+ * @param {boolean} [trailing=true]
527
+ */
528
+ function removeHTTPWhitespace (str, leading = true, trailing = true) {
529
+ return removeChars(str, leading, trailing, isHTTPWhiteSpace)
530
+ }
531
+
532
+ /**
533
+ * @see https://mimesniff.spec.whatwg.org/#minimize-a-supported-mime-type
534
+ * @param {Exclude<ReturnType<typeof parseMIMEType>, 'failure'>} mimeType
535
+ */
536
+ function minimizeSupportedMimeType (mimeType) {
537
+ switch (mimeType.essence) {
538
+ case 'application/ecmascript':
539
+ case 'application/javascript':
540
+ case 'application/x-ecmascript':
541
+ case 'application/x-javascript':
542
+ case 'text/ecmascript':
543
+ case 'text/javascript':
544
+ case 'text/javascript1.0':
545
+ case 'text/javascript1.1':
546
+ case 'text/javascript1.2':
547
+ case 'text/javascript1.3':
548
+ case 'text/javascript1.4':
549
+ case 'text/javascript1.5':
550
+ case 'text/jscript':
551
+ case 'text/livescript':
552
+ case 'text/x-ecmascript':
553
+ case 'text/x-javascript':
554
+ // 1. If mimeType is a JavaScript MIME type, then return "text/javascript".
555
+ return 'text/javascript'
556
+ case 'application/json':
557
+ case 'text/json':
558
+ // 2. If mimeType is a JSON MIME type, then return "application/json".
559
+ return 'application/json'
560
+ case 'image/svg+xml':
561
+ // 3. If mimeType’s essence is "image/svg+xml", then return "image/svg+xml".
562
+ return 'image/svg+xml'
563
+ case 'text/xml':
564
+ case 'application/xml':
565
+ // 4. If mimeType is an XML MIME type, then return "application/xml".
566
+ return 'application/xml'
567
+ }
568
+
569
+ // 2. If mimeType is a JSON MIME type, then return "application/json".
570
+ if (mimeType.subtype.endsWith('+json')) {
571
+ return 'application/json'
572
+ }
573
+
574
+ // 4. If mimeType is an XML MIME type, then return "application/xml".
575
+ if (mimeType.subtype.endsWith('+xml')) {
576
+ return 'application/xml'
577
+ }
578
+
579
+ // 5. If mimeType is supported by the user agent, then return mimeType’s essence.
580
+ // Technically, node doesn't support any mimetypes.
581
+
582
+ // 6. Return the empty string.
583
+ return ''
584
+ }
585
+
586
+ module.exports = {
587
+ dataURLProcessor,
588
+ URLSerializer,
589
+ stringPercentDecode,
590
+ parseMIMEType,
591
+ collectAnHTTPQuotedString,
592
+ serializeAMimeType,
593
+ removeHTTPWhitespace,
594
+ minimizeSupportedMimeType,
595
+ HTTP_TOKEN_CODEPOINTS
596
+ }