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