pi-cursor-sdk 0.1.49 → 0.1.51

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 (278) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/README.md +2 -2
  3. package/docs/cursor-live-smoke-checklist.md +4 -4
  4. package/docs/cursor-model-ux-spec.md +5 -5
  5. package/docs/cursor-native-tool-replay.md +2 -2
  6. package/docs/cursor-native-tool-visual-audit.md +1 -1
  7. package/docs/cursor-testing-lessons.md +1 -1
  8. package/package.json +6 -15
  9. package/src/cursor-fallback-models.generated.ts +536 -302
  10. package/src/cursor-provider-errors.ts +29 -0
  11. package/src/cursor-provider-overflow.ts +96 -0
  12. package/src/cursor-tool-manifest.ts +1 -1
  13. package/src/index.ts +4 -1
  14. package/node_modules/@connectrpc/connect-node/README.md +0 -141
  15. package/node_modules/@connectrpc/connect-node/dist/cjs/compression.d.ts +0 -15
  16. package/node_modules/@connectrpc/connect-node/dist/cjs/compression.js +0 -89
  17. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-node-adapter.d.ts +0 -42
  18. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-node-adapter.js +0 -61
  19. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-transport.d.ts +0 -100
  20. package/node_modules/@connectrpc/connect-node/dist/cjs/connect-transport.js +0 -25
  21. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-transport.d.ts +0 -96
  22. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-transport.js +0 -25
  23. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-web-transport.d.ts +0 -96
  24. package/node_modules/@connectrpc/connect-node/dist/cjs/grpc-web-transport.js +0 -25
  25. package/node_modules/@connectrpc/connect-node/dist/cjs/http2-session-manager.d.ts +0 -146
  26. package/node_modules/@connectrpc/connect-node/dist/cjs/http2-session-manager.js +0 -536
  27. package/node_modules/@connectrpc/connect-node/dist/cjs/index.d.ts +0 -15
  28. package/node_modules/@connectrpc/connect-node/dist/cjs/index.js +0 -36
  29. package/node_modules/@connectrpc/connect-node/dist/cjs/node-error.d.ts +0 -45
  30. package/node_modules/@connectrpc/connect-node/dist/cjs/node-error.js +0 -154
  31. package/node_modules/@connectrpc/connect-node/dist/cjs/node-headers-polyfill.d.ts +0 -1
  32. package/node_modules/@connectrpc/connect-node/dist/cjs/node-headers-polyfill.js +0 -29
  33. package/node_modules/@connectrpc/connect-node/dist/cjs/node-transport-options.d.ts +0 -89
  34. package/node_modules/@connectrpc/connect-node/dist/cjs/node-transport-options.js +0 -58
  35. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-client.d.ts +0 -54
  36. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-client.js +0 -326
  37. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-handler.d.ts +0 -41
  38. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-handler.js +0 -234
  39. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-header.d.ts +0 -19
  40. package/node_modules/@connectrpc/connect-node/dist/cjs/node-universal-header.js +0 -97
  41. package/node_modules/@connectrpc/connect-node/dist/cjs/package.json +0 -1
  42. package/node_modules/@connectrpc/connect-node/dist/esm/compression.d.ts +0 -15
  43. package/node_modules/@connectrpc/connect-node/dist/esm/compression.js +0 -86
  44. package/node_modules/@connectrpc/connect-node/dist/esm/connect-node-adapter.d.ts +0 -42
  45. package/node_modules/@connectrpc/connect-node/dist/esm/connect-node-adapter.js +0 -58
  46. package/node_modules/@connectrpc/connect-node/dist/esm/connect-transport.d.ts +0 -100
  47. package/node_modules/@connectrpc/connect-node/dist/esm/connect-transport.js +0 -22
  48. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-transport.d.ts +0 -96
  49. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-transport.js +0 -22
  50. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-web-transport.d.ts +0 -96
  51. package/node_modules/@connectrpc/connect-node/dist/esm/grpc-web-transport.js +0 -22
  52. package/node_modules/@connectrpc/connect-node/dist/esm/http2-session-manager.d.ts +0 -146
  53. package/node_modules/@connectrpc/connect-node/dist/esm/http2-session-manager.js +0 -532
  54. package/node_modules/@connectrpc/connect-node/dist/esm/index.d.ts +0 -15
  55. package/node_modules/@connectrpc/connect-node/dist/esm/index.js +0 -23
  56. package/node_modules/@connectrpc/connect-node/dist/esm/node-error.d.ts +0 -45
  57. package/node_modules/@connectrpc/connect-node/dist/esm/node-error.js +0 -147
  58. package/node_modules/@connectrpc/connect-node/dist/esm/node-headers-polyfill.d.ts +0 -1
  59. package/node_modules/@connectrpc/connect-node/dist/esm/node-headers-polyfill.js +0 -27
  60. package/node_modules/@connectrpc/connect-node/dist/esm/node-transport-options.d.ts +0 -89
  61. package/node_modules/@connectrpc/connect-node/dist/esm/node-transport-options.js +0 -58
  62. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-client.d.ts +0 -54
  63. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-client.js +0 -324
  64. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-handler.d.ts +0 -41
  65. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-handler.js +0 -230
  66. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-header.d.ts +0 -19
  67. package/node_modules/@connectrpc/connect-node/dist/esm/node-universal-header.js +0 -93
  68. package/node_modules/@connectrpc/connect-node/package.json +0 -46
  69. package/node_modules/undici/LICENSE +0 -21
  70. package/node_modules/undici/README.md +0 -741
  71. package/node_modules/undici/docs/docs/api/Agent.md +0 -84
  72. package/node_modules/undici/docs/docs/api/BalancedPool.md +0 -99
  73. package/node_modules/undici/docs/docs/api/CacheStorage.md +0 -30
  74. package/node_modules/undici/docs/docs/api/CacheStore.md +0 -164
  75. package/node_modules/undici/docs/docs/api/Client.md +0 -288
  76. package/node_modules/undici/docs/docs/api/ClientStats.md +0 -27
  77. package/node_modules/undici/docs/docs/api/Connector.md +0 -115
  78. package/node_modules/undici/docs/docs/api/ContentType.md +0 -57
  79. package/node_modules/undici/docs/docs/api/Cookies.md +0 -128
  80. package/node_modules/undici/docs/docs/api/Debug.md +0 -62
  81. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +0 -315
  82. package/node_modules/undici/docs/docs/api/Dispatcher.md +0 -1392
  83. package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +0 -159
  84. package/node_modules/undici/docs/docs/api/Errors.md +0 -49
  85. package/node_modules/undici/docs/docs/api/EventSource.md +0 -45
  86. package/node_modules/undici/docs/docs/api/Fetch.md +0 -60
  87. package/node_modules/undici/docs/docs/api/GlobalInstallation.md +0 -139
  88. package/node_modules/undici/docs/docs/api/H2CClient.md +0 -263
  89. package/node_modules/undici/docs/docs/api/MockAgent.md +0 -603
  90. package/node_modules/undici/docs/docs/api/MockCallHistory.md +0 -197
  91. package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +0 -43
  92. package/node_modules/undici/docs/docs/api/MockClient.md +0 -81
  93. package/node_modules/undici/docs/docs/api/MockErrors.md +0 -12
  94. package/node_modules/undici/docs/docs/api/MockPool.md +0 -555
  95. package/node_modules/undici/docs/docs/api/Pool.md +0 -84
  96. package/node_modules/undici/docs/docs/api/PoolStats.md +0 -35
  97. package/node_modules/undici/docs/docs/api/ProxyAgent.md +0 -229
  98. package/node_modules/undici/docs/docs/api/RedirectHandler.md +0 -93
  99. package/node_modules/undici/docs/docs/api/RetryAgent.md +0 -50
  100. package/node_modules/undici/docs/docs/api/RetryHandler.md +0 -118
  101. package/node_modules/undici/docs/docs/api/RoundRobinPool.md +0 -145
  102. package/node_modules/undici/docs/docs/api/SnapshotAgent.md +0 -616
  103. package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +0 -275
  104. package/node_modules/undici/docs/docs/api/Util.md +0 -25
  105. package/node_modules/undici/docs/docs/api/WebSocket.md +0 -141
  106. package/node_modules/undici/docs/docs/api/api-lifecycle.md +0 -91
  107. package/node_modules/undici/docs/docs/best-practices/client-certificate.md +0 -64
  108. package/node_modules/undici/docs/docs/best-practices/crawling.md +0 -58
  109. package/node_modules/undici/docs/docs/best-practices/mocking-request.md +0 -190
  110. package/node_modules/undici/docs/docs/best-practices/proxy.md +0 -127
  111. package/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +0 -224
  112. package/node_modules/undici/docs/docs/best-practices/writing-tests.md +0 -63
  113. package/node_modules/undici/index-fetch.js +0 -65
  114. package/node_modules/undici/index.d.ts +0 -3
  115. package/node_modules/undici/index.js +0 -234
  116. package/node_modules/undici/lib/api/abort-signal.js +0 -59
  117. package/node_modules/undici/lib/api/api-connect.js +0 -110
  118. package/node_modules/undici/lib/api/api-pipeline.js +0 -252
  119. package/node_modules/undici/lib/api/api-request.js +0 -214
  120. package/node_modules/undici/lib/api/api-stream.js +0 -209
  121. package/node_modules/undici/lib/api/api-upgrade.js +0 -111
  122. package/node_modules/undici/lib/api/index.js +0 -7
  123. package/node_modules/undici/lib/api/readable.js +0 -580
  124. package/node_modules/undici/lib/cache/memory-cache-store.js +0 -234
  125. package/node_modules/undici/lib/cache/sqlite-cache-store.js +0 -461
  126. package/node_modules/undici/lib/core/connect.js +0 -153
  127. package/node_modules/undici/lib/core/constants.js +0 -143
  128. package/node_modules/undici/lib/core/diagnostics.js +0 -227
  129. package/node_modules/undici/lib/core/errors.js +0 -477
  130. package/node_modules/undici/lib/core/request.js +0 -453
  131. package/node_modules/undici/lib/core/socks5-client.js +0 -422
  132. package/node_modules/undici/lib/core/socks5-utils.js +0 -212
  133. package/node_modules/undici/lib/core/symbols.js +0 -75
  134. package/node_modules/undici/lib/core/tree.js +0 -160
  135. package/node_modules/undici/lib/core/util.js +0 -992
  136. package/node_modules/undici/lib/dispatcher/agent.js +0 -158
  137. package/node_modules/undici/lib/dispatcher/balanced-pool.js +0 -219
  138. package/node_modules/undici/lib/dispatcher/client-h1.js +0 -1722
  139. package/node_modules/undici/lib/dispatcher/client-h2.js +0 -995
  140. package/node_modules/undici/lib/dispatcher/client.js +0 -664
  141. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +0 -184
  142. package/node_modules/undici/lib/dispatcher/dispatcher.js +0 -48
  143. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +0 -146
  144. package/node_modules/undici/lib/dispatcher/fixed-queue.js +0 -135
  145. package/node_modules/undici/lib/dispatcher/h2c-client.js +0 -51
  146. package/node_modules/undici/lib/dispatcher/pool-base.js +0 -214
  147. package/node_modules/undici/lib/dispatcher/pool.js +0 -118
  148. package/node_modules/undici/lib/dispatcher/proxy-agent.js +0 -319
  149. package/node_modules/undici/lib/dispatcher/retry-agent.js +0 -35
  150. package/node_modules/undici/lib/dispatcher/round-robin-pool.js +0 -137
  151. package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +0 -260
  152. package/node_modules/undici/lib/encoding/index.js +0 -33
  153. package/node_modules/undici/lib/global.js +0 -59
  154. package/node_modules/undici/lib/handler/cache-handler.js +0 -578
  155. package/node_modules/undici/lib/handler/cache-revalidation-handler.js +0 -124
  156. package/node_modules/undici/lib/handler/decorator-handler.js +0 -67
  157. package/node_modules/undici/lib/handler/deduplication-handler.js +0 -460
  158. package/node_modules/undici/lib/handler/redirect-handler.js +0 -238
  159. package/node_modules/undici/lib/handler/retry-handler.js +0 -394
  160. package/node_modules/undici/lib/handler/unwrap-handler.js +0 -106
  161. package/node_modules/undici/lib/handler/wrap-handler.js +0 -105
  162. package/node_modules/undici/lib/interceptor/cache.js +0 -495
  163. package/node_modules/undici/lib/interceptor/decompress.js +0 -259
  164. package/node_modules/undici/lib/interceptor/deduplicate.js +0 -117
  165. package/node_modules/undici/lib/interceptor/dns.js +0 -571
  166. package/node_modules/undici/lib/interceptor/dump.js +0 -112
  167. package/node_modules/undici/lib/interceptor/redirect.js +0 -21
  168. package/node_modules/undici/lib/interceptor/response-error.js +0 -95
  169. package/node_modules/undici/lib/interceptor/retry.js +0 -19
  170. package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  171. package/node_modules/undici/lib/llhttp/constants.d.ts +0 -195
  172. package/node_modules/undici/lib/llhttp/constants.js +0 -531
  173. package/node_modules/undici/lib/llhttp/llhttp-wasm.js +0 -15
  174. package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +0 -15
  175. package/node_modules/undici/lib/llhttp/utils.d.ts +0 -2
  176. package/node_modules/undici/lib/llhttp/utils.js +0 -12
  177. package/node_modules/undici/lib/mock/mock-agent.js +0 -232
  178. package/node_modules/undici/lib/mock/mock-call-history.js +0 -248
  179. package/node_modules/undici/lib/mock/mock-client.js +0 -68
  180. package/node_modules/undici/lib/mock/mock-errors.js +0 -29
  181. package/node_modules/undici/lib/mock/mock-interceptor.js +0 -209
  182. package/node_modules/undici/lib/mock/mock-pool.js +0 -68
  183. package/node_modules/undici/lib/mock/mock-symbols.js +0 -32
  184. package/node_modules/undici/lib/mock/mock-utils.js +0 -486
  185. package/node_modules/undici/lib/mock/pending-interceptors-formatter.js +0 -43
  186. package/node_modules/undici/lib/mock/snapshot-agent.js +0 -353
  187. package/node_modules/undici/lib/mock/snapshot-recorder.js +0 -588
  188. package/node_modules/undici/lib/mock/snapshot-utils.js +0 -158
  189. package/node_modules/undici/lib/util/cache.js +0 -414
  190. package/node_modules/undici/lib/util/date.js +0 -653
  191. package/node_modules/undici/lib/util/promise.js +0 -28
  192. package/node_modules/undici/lib/util/runtime-features.js +0 -124
  193. package/node_modules/undici/lib/util/stats.js +0 -32
  194. package/node_modules/undici/lib/util/timers.js +0 -425
  195. package/node_modules/undici/lib/web/cache/cache.js +0 -864
  196. package/node_modules/undici/lib/web/cache/cachestorage.js +0 -152
  197. package/node_modules/undici/lib/web/cache/util.js +0 -45
  198. package/node_modules/undici/lib/web/cookies/constants.js +0 -12
  199. package/node_modules/undici/lib/web/cookies/index.js +0 -199
  200. package/node_modules/undici/lib/web/cookies/parse.js +0 -314
  201. package/node_modules/undici/lib/web/cookies/util.js +0 -282
  202. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +0 -399
  203. package/node_modules/undici/lib/web/eventsource/eventsource.js +0 -501
  204. package/node_modules/undici/lib/web/eventsource/util.js +0 -29
  205. package/node_modules/undici/lib/web/fetch/LICENSE +0 -21
  206. package/node_modules/undici/lib/web/fetch/body.js +0 -509
  207. package/node_modules/undici/lib/web/fetch/constants.js +0 -131
  208. package/node_modules/undici/lib/web/fetch/data-url.js +0 -596
  209. package/node_modules/undici/lib/web/fetch/formdata-parser.js +0 -586
  210. package/node_modules/undici/lib/web/fetch/formdata.js +0 -259
  211. package/node_modules/undici/lib/web/fetch/global.js +0 -40
  212. package/node_modules/undici/lib/web/fetch/headers.js +0 -719
  213. package/node_modules/undici/lib/web/fetch/index.js +0 -2413
  214. package/node_modules/undici/lib/web/fetch/request.js +0 -1115
  215. package/node_modules/undici/lib/web/fetch/response.js +0 -641
  216. package/node_modules/undici/lib/web/fetch/util.js +0 -1522
  217. package/node_modules/undici/lib/web/infra/index.js +0 -229
  218. package/node_modules/undici/lib/web/subresource-integrity/Readme.md +0 -9
  219. package/node_modules/undici/lib/web/subresource-integrity/subresource-integrity.js +0 -307
  220. package/node_modules/undici/lib/web/webidl/index.js +0 -1006
  221. package/node_modules/undici/lib/web/websocket/connection.js +0 -329
  222. package/node_modules/undici/lib/web/websocket/constants.js +0 -126
  223. package/node_modules/undici/lib/web/websocket/events.js +0 -331
  224. package/node_modules/undici/lib/web/websocket/frame.js +0 -133
  225. package/node_modules/undici/lib/web/websocket/permessage-deflate.js +0 -100
  226. package/node_modules/undici/lib/web/websocket/receiver.js +0 -507
  227. package/node_modules/undici/lib/web/websocket/sender.js +0 -109
  228. package/node_modules/undici/lib/web/websocket/stream/websocketerror.js +0 -104
  229. package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +0 -498
  230. package/node_modules/undici/lib/web/websocket/util.js +0 -347
  231. package/node_modules/undici/lib/web/websocket/websocket.js +0 -758
  232. package/node_modules/undici/package.json +0 -152
  233. package/node_modules/undici/scripts/strip-comments.js +0 -10
  234. package/node_modules/undici/types/README.md +0 -6
  235. package/node_modules/undici/types/agent.d.ts +0 -32
  236. package/node_modules/undici/types/api.d.ts +0 -43
  237. package/node_modules/undici/types/balanced-pool.d.ts +0 -30
  238. package/node_modules/undici/types/cache-interceptor.d.ts +0 -179
  239. package/node_modules/undici/types/cache.d.ts +0 -36
  240. package/node_modules/undici/types/client-stats.d.ts +0 -15
  241. package/node_modules/undici/types/client.d.ts +0 -139
  242. package/node_modules/undici/types/connector.d.ts +0 -36
  243. package/node_modules/undici/types/content-type.d.ts +0 -21
  244. package/node_modules/undici/types/cookies.d.ts +0 -30
  245. package/node_modules/undici/types/diagnostics-channel.d.ts +0 -74
  246. package/node_modules/undici/types/dispatcher.d.ts +0 -275
  247. package/node_modules/undici/types/env-http-proxy-agent.d.ts +0 -22
  248. package/node_modules/undici/types/errors.d.ts +0 -177
  249. package/node_modules/undici/types/eventsource.d.ts +0 -66
  250. package/node_modules/undici/types/fetch.d.ts +0 -231
  251. package/node_modules/undici/types/formdata.d.ts +0 -114
  252. package/node_modules/undici/types/global-dispatcher.d.ts +0 -9
  253. package/node_modules/undici/types/global-origin.d.ts +0 -7
  254. package/node_modules/undici/types/h2c-client.d.ts +0 -73
  255. package/node_modules/undici/types/handlers.d.ts +0 -14
  256. package/node_modules/undici/types/header.d.ts +0 -160
  257. package/node_modules/undici/types/index.d.ts +0 -91
  258. package/node_modules/undici/types/interceptors.d.ts +0 -80
  259. package/node_modules/undici/types/mock-agent.d.ts +0 -68
  260. package/node_modules/undici/types/mock-call-history.d.ts +0 -111
  261. package/node_modules/undici/types/mock-client.d.ts +0 -27
  262. package/node_modules/undici/types/mock-errors.d.ts +0 -12
  263. package/node_modules/undici/types/mock-interceptor.d.ts +0 -94
  264. package/node_modules/undici/types/mock-pool.d.ts +0 -27
  265. package/node_modules/undici/types/patch.d.ts +0 -29
  266. package/node_modules/undici/types/pool-stats.d.ts +0 -19
  267. package/node_modules/undici/types/pool.d.ts +0 -41
  268. package/node_modules/undici/types/proxy-agent.d.ts +0 -29
  269. package/node_modules/undici/types/readable.d.ts +0 -68
  270. package/node_modules/undici/types/retry-agent.d.ts +0 -8
  271. package/node_modules/undici/types/retry-handler.d.ts +0 -125
  272. package/node_modules/undici/types/round-robin-pool.d.ts +0 -41
  273. package/node_modules/undici/types/snapshot-agent.d.ts +0 -109
  274. package/node_modules/undici/types/socks5-proxy-agent.d.ts +0 -25
  275. package/node_modules/undici/types/util.d.ts +0 -18
  276. package/node_modules/undici/types/utility.d.ts +0 -7
  277. package/node_modules/undici/types/webidl.d.ts +0 -347
  278. package/node_modules/undici/types/websocket.d.ts +0 -188
@@ -1,596 +0,0 @@
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
- }