effect-start 0.23.1 → 0.25.0

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 (355) hide show
  1. package/dist/ChildProcess.js +32 -20
  2. package/dist/Commander.js +377 -293
  3. package/dist/ContentNegotiation.js +424 -318
  4. package/dist/Cookies.js +340 -271
  5. package/dist/Development.js +85 -49
  6. package/dist/Effectify.js +22 -14
  7. package/dist/Entity.js +260 -195
  8. package/dist/Fetch.js +192 -0
  9. package/dist/FilePathPattern.js +88 -77
  10. package/dist/FileRouter.js +192 -136
  11. package/dist/FileRouterCodegen.js +262 -191
  12. package/dist/FileSystem.js +126 -64
  13. package/dist/Http.js +96 -77
  14. package/dist/PathPattern.js +311 -273
  15. package/dist/PlatformError.js +36 -21
  16. package/dist/PlatformRuntime.js +65 -40
  17. package/dist/Route.js +122 -79
  18. package/dist/RouteBody.js +83 -58
  19. package/dist/RouteError.js +46 -25
  20. package/dist/RouteHook.js +58 -34
  21. package/dist/RouteHttp.js +346 -237
  22. package/dist/RouteHttpTracer.js +86 -58
  23. package/dist/RouteMount.js +81 -58
  24. package/dist/RouteSchema.js +253 -170
  25. package/dist/RouteSse.js +87 -72
  26. package/dist/RouteTree.js +99 -73
  27. package/dist/RouteTrie.js +160 -133
  28. package/dist/SchemaExtra.js +87 -62
  29. package/dist/Socket.js +32 -21
  30. package/dist/SqlIntrospect.js +317 -268
  31. package/dist/Start.js +55 -25
  32. package/dist/StartApp.js +3 -21
  33. package/dist/StreamExtra.js +109 -74
  34. package/dist/System.js +37 -21
  35. package/dist/TuplePathPattern.js +64 -58
  36. package/dist/Unique.js +159 -120
  37. package/dist/Values.js +48 -32
  38. package/dist/bun/BunBundle.js +158 -109
  39. package/dist/bun/BunChildProcessSpawner.js +121 -82
  40. package/dist/bun/BunImportTrackerPlugin.js +85 -63
  41. package/dist/bun/BunRoute.js +135 -99
  42. package/dist/bun/BunRuntime.js +39 -29
  43. package/dist/bun/BunServer.js +268 -140
  44. package/dist/bun/BunVirtualFilesPlugin.js +47 -33
  45. package/dist/bun/_BunEnhancedResolve.js +107 -82
  46. package/dist/bun/index.js +5 -5
  47. package/dist/bundler/Bundle.js +82 -38
  48. package/dist/bundler/BundleFiles.js +140 -82
  49. package/dist/bundler/BundleRoute.js +49 -38
  50. package/dist/client/Overlay.js +29 -28
  51. package/dist/client/ScrollState.js +94 -82
  52. package/dist/client/index.js +79 -61
  53. package/dist/console/Console.js +40 -24
  54. package/dist/console/ConsoleErrors.js +189 -178
  55. package/dist/console/ConsoleLogger.js +52 -43
  56. package/dist/console/ConsoleMetrics.js +69 -58
  57. package/dist/console/ConsoleProcess.js +57 -47
  58. package/dist/console/ConsoleStore.js +56 -45
  59. package/dist/console/ConsoleTracer.js +101 -88
  60. package/dist/console/Simulation.js +714 -563
  61. package/dist/console/index.js +3 -3
  62. package/dist/console/routes/tree.js +29 -28
  63. package/dist/datastar/actions/fetch.js +514 -381
  64. package/dist/datastar/actions/peek.js +12 -12
  65. package/dist/datastar/actions/setAll.js +18 -11
  66. package/dist/datastar/actions/toggleAll.js +18 -11
  67. package/dist/datastar/attributes/attr.js +48 -47
  68. package/dist/datastar/attributes/bind.js +186 -167
  69. package/dist/datastar/attributes/class.js +51 -44
  70. package/dist/datastar/attributes/computed.js +23 -24
  71. package/dist/datastar/attributes/effect.js +9 -8
  72. package/dist/datastar/attributes/indicator.js +32 -29
  73. package/dist/datastar/attributes/init.js +26 -25
  74. package/dist/datastar/attributes/jsonSignals.js +32 -29
  75. package/dist/datastar/attributes/on.js +76 -73
  76. package/dist/datastar/attributes/onIntersect.js +51 -51
  77. package/dist/datastar/attributes/onInterval.js +30 -29
  78. package/dist/datastar/attributes/onSignalPatch.js +49 -40
  79. package/dist/datastar/attributes/ref.js +10 -9
  80. package/dist/datastar/attributes/show.js +31 -30
  81. package/dist/datastar/attributes/signals.js +17 -16
  82. package/dist/datastar/attributes/style.js +56 -49
  83. package/dist/datastar/attributes/text.js +28 -25
  84. package/dist/datastar/engine.js +1079 -933
  85. package/dist/datastar/index.js +25 -24
  86. package/dist/datastar/utils.js +203 -155
  87. package/dist/datastar/watchers/patchElements.js +459 -372
  88. package/dist/datastar/watchers/patchSignals.js +13 -13
  89. package/dist/experimental/EncryptedCookies.js +305 -189
  90. package/dist/experimental/index.js +1 -1
  91. package/dist/hyper/Hyper.js +22 -17
  92. package/dist/hyper/HyperHtml.js +138 -123
  93. package/dist/hyper/HyperNode.js +11 -9
  94. package/dist/hyper/HyperRoute.js +41 -28
  95. package/dist/hyper/html.js +27 -27
  96. package/dist/hyper/index.js +5 -5
  97. package/dist/hyper/jsx-runtime.js +11 -5
  98. package/dist/index.js +8 -8
  99. package/dist/node/NodeFileSystem.js +606 -341
  100. package/dist/node/NodeUtils.js +21 -18
  101. package/dist/sql/Sql.js +8 -0
  102. package/dist/sql/bun/index.js +134 -67
  103. package/dist/sql/index.js +1 -0
  104. package/dist/sql/libsql/index.js +156 -0
  105. package/dist/sql/mssql/docker.js +103 -60
  106. package/dist/sql/mssql/index.js +182 -101
  107. package/dist/testing/TestLogger.js +39 -29
  108. package/dist/testing/index.js +2 -2
  109. package/dist/testing/utils.js +45 -23
  110. package/dist/x/cloudflare/CloudflareTunnel.js +61 -28
  111. package/dist/x/cloudflare/index.js +1 -1
  112. package/dist/x/tailscale/TailscaleTunnel.js +86 -60
  113. package/dist/x/tailscale/index.js +1 -1
  114. package/dist/x/tailwind/TailwindPlugin.js +280 -205
  115. package/dist/x/tailwind/compile.js +185 -129
  116. package/dist/x/tailwind/plugin.js +13 -11
  117. package/package.json +1 -1
  118. package/src/Development.ts +3 -1
  119. package/src/Entity.ts +17 -0
  120. package/src/Fetch.ts +271 -0
  121. package/src/SqlIntrospect.ts +64 -70
  122. package/src/Start.ts +21 -24
  123. package/src/StartApp.ts +1 -1
  124. package/src/bun/BunServer.ts +42 -10
  125. package/src/hyper/HyperHtml.ts +0 -1
  126. package/src/sql/bun/index.ts +1 -1
  127. package/src/sql/index.ts +1 -0
  128. package/src/sql/libsql/index.ts +173 -0
  129. package/src/sql/libsql/libsql.d.ts +39 -0
  130. package/src/sql/mssql/index.ts +1 -1
  131. package/dist/BlobStore.d.ts +0 -80
  132. package/dist/BlobStore.js +0 -19
  133. package/dist/ChildProcess.d.ts +0 -60
  134. package/dist/Commander.d.ts +0 -100
  135. package/dist/ContentNegotiation.d.ts +0 -12
  136. package/dist/Cookies.d.ts +0 -47
  137. package/dist/Development.d.ts +0 -39
  138. package/dist/Effectify.d.ts +0 -209
  139. package/dist/Entity.d.ts +0 -47
  140. package/dist/FilePathPattern.d.ts +0 -29
  141. package/dist/FileRouter.d.ts +0 -56
  142. package/dist/FileRouterCodegen.d.ts +0 -18
  143. package/dist/FileRouterPattern.d.ts +0 -9
  144. package/dist/FileRouterPattern.js +0 -35
  145. package/dist/FileSystem.d.ts +0 -158
  146. package/dist/Http.d.ts +0 -37
  147. package/dist/HttpAppExtra.d.ts +0 -7
  148. package/dist/HttpAppExtra.js +0 -320
  149. package/dist/HttpUtils.d.ts +0 -3
  150. package/dist/HttpUtils.js +0 -11
  151. package/dist/PathPattern.d.ts +0 -134
  152. package/dist/PlatformError.d.ts +0 -38
  153. package/dist/PlatformRuntime.d.ts +0 -27
  154. package/dist/Route.d.ts +0 -97
  155. package/dist/RouteBody.d.ts +0 -47
  156. package/dist/RouteError.d.ts +0 -98
  157. package/dist/RouteHook.d.ts +0 -12
  158. package/dist/RouteHttp.d.ts +0 -21
  159. package/dist/RouteHttpTracer.d.ts +0 -10
  160. package/dist/RouteMount.d.ts +0 -86
  161. package/dist/RouteSchema.d.ts +0 -86
  162. package/dist/RouteSse.d.ts +0 -21
  163. package/dist/RouteTree.d.ts +0 -57
  164. package/dist/RouteTrie.d.ts +0 -20
  165. package/dist/RouterPattern.d.ts +0 -118
  166. package/dist/RouterPattern.js +0 -269
  167. package/dist/SchemaExtra.d.ts +0 -7
  168. package/dist/Socket.d.ts +0 -27
  169. package/dist/Sql.d.ts +0 -34
  170. package/dist/Sql.js +0 -5
  171. package/dist/SqlIntrospect.d.ts +0 -91
  172. package/dist/Start.d.ts +0 -44
  173. package/dist/StartApp.d.ts +0 -19
  174. package/dist/StreamExtra.d.ts +0 -28
  175. package/dist/System.d.ts +0 -7
  176. package/dist/TuplePathPattern.d.ts +0 -9
  177. package/dist/Unique.d.ts +0 -50
  178. package/dist/Values.d.ts +0 -27
  179. package/dist/bun/BunBlobStoreDisk.d.ts +0 -6
  180. package/dist/bun/BunBlobStoreDisk.js +0 -116
  181. package/dist/bun/BunBlobStoreS3.d.ts +0 -11
  182. package/dist/bun/BunBlobStoreS3.js +0 -89
  183. package/dist/bun/BunBlobWatcherDisk.d.ts +0 -6
  184. package/dist/bun/BunBlobWatcherDisk.js +0 -60
  185. package/dist/bun/BunBlobWatcherQueue.d.ts +0 -6
  186. package/dist/bun/BunBlobWatcherQueue.js +0 -17
  187. package/dist/bun/BunBundle.d.ts +0 -11
  188. package/dist/bun/BunChildProcessSpawner.d.ts +0 -3
  189. package/dist/bun/BunHttpServer.d.ts +0 -44
  190. package/dist/bun/BunHttpServer.js +0 -186
  191. package/dist/bun/BunHttpServer_web.d.ts +0 -60
  192. package/dist/bun/BunHttpServer_web.js +0 -252
  193. package/dist/bun/BunImportTrackerPlugin.d.ts +0 -13
  194. package/dist/bun/BunPlatformHttpServer.d.ts +0 -10
  195. package/dist/bun/BunPlatformHttpServer.js +0 -53
  196. package/dist/bun/BunRoute.d.ts +0 -48
  197. package/dist/bun/BunRuntime.d.ts +0 -2
  198. package/dist/bun/BunServer.d.ts +0 -40
  199. package/dist/bun/BunServerRequest.d.ts +0 -60
  200. package/dist/bun/BunServerRequest.js +0 -252
  201. package/dist/bun/BunSql.d.ts +0 -4
  202. package/dist/bun/BunSql.js +0 -81
  203. package/dist/bun/BunVirtualFilesPlugin.d.ts +0 -4
  204. package/dist/bun/_BunEnhancedResolve.d.ts +0 -45
  205. package/dist/bun/index.d.ts +0 -5
  206. package/dist/bundler/Bundle.d.ts +0 -61
  207. package/dist/bundler/BundleFiles.d.ts +0 -13
  208. package/dist/bundler/BundleHttp.d.ts +0 -45
  209. package/dist/bundler/BundleHttp.js +0 -176
  210. package/dist/bundler/BundleRoute.d.ts +0 -27
  211. package/dist/client/Overlay.d.ts +0 -2
  212. package/dist/client/ScrollState.d.ts +0 -6
  213. package/dist/client/index.d.ts +0 -6
  214. package/dist/console/Console.d.ts +0 -6
  215. package/dist/console/ConsoleErrors.d.ts +0 -3
  216. package/dist/console/ConsoleLogger.d.ts +0 -3
  217. package/dist/console/ConsoleMetrics.d.ts +0 -3
  218. package/dist/console/ConsoleProcess.d.ts +0 -3
  219. package/dist/console/ConsoleStore.d.ts +0 -144
  220. package/dist/console/ConsoleTracer.d.ts +0 -3
  221. package/dist/console/Simulation.d.ts +0 -2
  222. package/dist/console/index.d.ts +0 -3
  223. package/dist/console/routes/errors/route.d.ts +0 -10
  224. package/dist/console/routes/errors/route.js +0 -47
  225. package/dist/console/routes/fiberDetail.d.ts +0 -16
  226. package/dist/console/routes/fiberDetail.js +0 -38
  227. package/dist/console/routes/fibers/route.d.ts +0 -10
  228. package/dist/console/routes/fibers/route.js +0 -19
  229. package/dist/console/routes/git/route.d.ts +0 -11
  230. package/dist/console/routes/git/route.js +0 -33
  231. package/dist/console/routes/layout.d.ts +0 -9
  232. package/dist/console/routes/layout.js +0 -3
  233. package/dist/console/routes/logs/route.d.ts +0 -10
  234. package/dist/console/routes/logs/route.js +0 -32
  235. package/dist/console/routes/metrics/route.d.ts +0 -10
  236. package/dist/console/routes/metrics/route.js +0 -17
  237. package/dist/console/routes/route.d.ts +0 -6
  238. package/dist/console/routes/route.js +0 -5
  239. package/dist/console/routes/routes/route.d.ts +0 -6
  240. package/dist/console/routes/routes/route.js +0 -20
  241. package/dist/console/routes/services/route.d.ts +0 -6
  242. package/dist/console/routes/services/route.js +0 -12
  243. package/dist/console/routes/system/route.d.ts +0 -10
  244. package/dist/console/routes/system/route.js +0 -18
  245. package/dist/console/routes/traceDetail.d.ts +0 -16
  246. package/dist/console/routes/traceDetail.js +0 -14
  247. package/dist/console/routes/traces/route.d.ts +0 -10
  248. package/dist/console/routes/traces/route.js +0 -39
  249. package/dist/console/routes/tree.d.ts +0 -153
  250. package/dist/console/ui/Errors.d.ts +0 -4
  251. package/dist/console/ui/Errors.js +0 -15
  252. package/dist/console/ui/Fibers.d.ts +0 -24
  253. package/dist/console/ui/Fibers.js +0 -121
  254. package/dist/console/ui/Git.d.ts +0 -20
  255. package/dist/console/ui/Git.js +0 -95
  256. package/dist/console/ui/Logs.d.ts +0 -4
  257. package/dist/console/ui/Logs.js +0 -25
  258. package/dist/console/ui/Metrics.d.ts +0 -4
  259. package/dist/console/ui/Metrics.js +0 -26
  260. package/dist/console/ui/Routes.d.ts +0 -8
  261. package/dist/console/ui/Routes.js +0 -70
  262. package/dist/console/ui/Services.d.ts +0 -10
  263. package/dist/console/ui/Services.js +0 -246
  264. package/dist/console/ui/Shell.d.ts +0 -10
  265. package/dist/console/ui/Shell.js +0 -7
  266. package/dist/console/ui/System.d.ts +0 -4
  267. package/dist/console/ui/System.js +0 -35
  268. package/dist/console/ui/Traces.d.ts +0 -12
  269. package/dist/console/ui/Traces.js +0 -179
  270. package/dist/datastar/actions/fetch.d.ts +0 -30
  271. package/dist/datastar/actions/peek.d.ts +0 -1
  272. package/dist/datastar/actions/setAll.d.ts +0 -1
  273. package/dist/datastar/actions/toggleAll.d.ts +0 -1
  274. package/dist/datastar/attributes/attr.d.ts +0 -1
  275. package/dist/datastar/attributes/bind.d.ts +0 -1
  276. package/dist/datastar/attributes/class.d.ts +0 -1
  277. package/dist/datastar/attributes/computed.d.ts +0 -1
  278. package/dist/datastar/attributes/effect.d.ts +0 -1
  279. package/dist/datastar/attributes/indicator.d.ts +0 -1
  280. package/dist/datastar/attributes/init.d.ts +0 -1
  281. package/dist/datastar/attributes/jsonSignals.d.ts +0 -1
  282. package/dist/datastar/attributes/on.d.ts +0 -1
  283. package/dist/datastar/attributes/onIntersect.d.ts +0 -1
  284. package/dist/datastar/attributes/onInterval.d.ts +0 -1
  285. package/dist/datastar/attributes/onSignalPatch.d.ts +0 -1
  286. package/dist/datastar/attributes/ref.d.ts +0 -1
  287. package/dist/datastar/attributes/show.d.ts +0 -1
  288. package/dist/datastar/attributes/signals.d.ts +0 -1
  289. package/dist/datastar/attributes/style.d.ts +0 -1
  290. package/dist/datastar/attributes/text.d.ts +0 -1
  291. package/dist/datastar/engine.d.ts +0 -162
  292. package/dist/datastar/happydom.d.ts +0 -1
  293. package/dist/datastar/happydom.js +0 -8
  294. package/dist/datastar/index.d.ts +0 -24
  295. package/dist/datastar/load.d.ts +0 -24
  296. package/dist/datastar/load.js +0 -24
  297. package/dist/datastar/utils.d.ts +0 -51
  298. package/dist/datastar/watchers/patchElements.d.ts +0 -1
  299. package/dist/datastar/watchers/patchSignals.d.ts +0 -1
  300. package/dist/experimental/EncryptedCookies.d.ts +0 -48
  301. package/dist/experimental/SseHttpResponse.d.ts +0 -7
  302. package/dist/experimental/SseHttpResponse.js +0 -28
  303. package/dist/experimental/index.d.ts +0 -1
  304. package/dist/hyper/Hyper.d.ts +0 -25
  305. package/dist/hyper/HyperHtml.d.ts +0 -23
  306. package/dist/hyper/HyperHtml.test.d.ts +0 -1
  307. package/dist/hyper/HyperHtml.test.js +0 -197
  308. package/dist/hyper/HyperNode.d.ts +0 -14
  309. package/dist/hyper/HyperRoute.d.ts +0 -8
  310. package/dist/hyper/HyperRoute.test.d.ts +0 -1
  311. package/dist/hyper/HyperRoute.test.js +0 -83
  312. package/dist/hyper/html.d.ts +0 -11
  313. package/dist/hyper/index.d.ts +0 -6
  314. package/dist/hyper/jsx-runtime.d.ts +0 -7
  315. package/dist/index.d.ts +0 -8
  316. package/dist/inference_check.d.ts +0 -1
  317. package/dist/inference_check.js +0 -15
  318. package/dist/lint/plugin.d.ts +0 -86
  319. package/dist/lint/plugin.js +0 -341
  320. package/dist/middlewares/BasicAuthMiddleware.d.ts +0 -8
  321. package/dist/middlewares/BasicAuthMiddleware.js +0 -22
  322. package/dist/middlewares/index.d.ts +0 -1
  323. package/dist/middlewares/index.js +0 -1
  324. package/dist/node/Effectify.d.ts +0 -209
  325. package/dist/node/Effectify.js +0 -19
  326. package/dist/node/FileSystem.d.ts +0 -7
  327. package/dist/node/FileSystem.js +0 -420
  328. package/dist/node/NodeFileSystem.d.ts +0 -7
  329. package/dist/node/NodeUtils.d.ts +0 -2
  330. package/dist/node/PlatformError.d.ts +0 -46
  331. package/dist/node/PlatformError.js +0 -43
  332. package/dist/node/Utils.d.ts +0 -1
  333. package/dist/node/Utils.js +0 -19
  334. package/dist/repro_fail.d.ts +0 -1
  335. package/dist/repro_fail.js +0 -14
  336. package/dist/sql/bun/index.d.ts +0 -3
  337. package/dist/sql/mssql/docker.d.ts +0 -2
  338. package/dist/sql/mssql/index.d.ts +0 -21
  339. package/dist/testing/TestHttpClient.d.ts +0 -13
  340. package/dist/testing/TestHttpClient.js +0 -68
  341. package/dist/testing/TestLogger.d.ts +0 -13
  342. package/dist/testing/index.d.ts +0 -2
  343. package/dist/testing/utils.d.ts +0 -9
  344. package/dist/x/cloudflare/CloudflareTunnel.d.ts +0 -10
  345. package/dist/x/cloudflare/index.d.ts +0 -1
  346. package/dist/x/datastar/Datastar.d.ts +0 -6
  347. package/dist/x/datastar/Datastar.js +0 -47
  348. package/dist/x/datastar/index.d.ts +0 -1
  349. package/dist/x/datastar/index.js +0 -1
  350. package/dist/x/tailscale/TailscaleTunnel.d.ts +0 -15
  351. package/dist/x/tailscale/index.d.ts +0 -1
  352. package/dist/x/tailwind/TailwindPlugin.d.ts +0 -23
  353. package/dist/x/tailwind/compile.d.ts +0 -19
  354. package/dist/x/tailwind/plugin.d.ts +0 -2
  355. /package/src/{Sql.ts → sql/Sql.ts} +0 -0
@@ -2,358 +2,464 @@
2
2
  * RFC 7231 Content Negotiation compatible with Express/Node.js ecosystem.
3
3
  * Based on {@link https://github.com/jshttp/negotiator}
4
4
  */
5
- const simpleMediaTypeRegExp = /^\s*([^\s/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;
6
- const simpleLanguageRegExp = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/;
7
- const simpleEncodingRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/;
8
- const simpleCharsetRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/;
5
+
6
+ const simpleMediaTypeRegExp = /^\s*([^\s/;]+)\/([^;\s]+)\s*(?:;(.*))?$/
7
+ const simpleLanguageRegExp = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/
8
+ const simpleEncodingRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/
9
+ const simpleCharsetRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/
10
+
9
11
  function parseQuality(params) {
10
- if (!params)
11
- return 1;
12
- const match = params.match(/q\s*=\s*([0-9.]+)/);
13
- if (!match)
14
- return 1;
15
- const q = parseFloat(match[1]);
16
- return isNaN(q) ? 1 : Math.min(Math.max(q, 0), 1);
12
+ if (!params) return 1
13
+ const match = params.match(/q\s*=\s*([0-9.]+)/)
14
+ if (!match) return 1
15
+ const q = parseFloat(match[1])
16
+ return isNaN(q) ? 1 : Math.min(Math.max(q, 0), 1)
17
17
  }
18
+
18
19
  function splitMediaTypeParams(params) {
19
- const result = {};
20
- let q = 1;
21
- const parts = params.split(";");
22
- for (const part of parts) {
23
- const trimmed = part.trim();
24
- const eqIndex = trimmed.indexOf("=");
25
- if (eqIndex === -1)
26
- continue;
27
- const key = trimmed.slice(0, eqIndex).trim().toLowerCase();
28
- let value = trimmed.slice(eqIndex + 1).trim();
29
- if (value.startsWith('"') && value.endsWith('"')) {
30
- value = value.slice(1, -1);
31
- }
32
- if (key === "q") {
33
- q = parseFloat(value);
34
- if (isNaN(q))
35
- q = 1;
36
- q = Math.min(Math.max(q, 0), 1);
37
- }
38
- else {
39
- result[key] = value;
40
- }
41
- }
42
- return { params: result, q };
20
+ const result = {}
21
+ let q = 1
22
+
23
+ const parts = params.split(";")
24
+ for (const part of parts) {
25
+ const trimmed = part.trim()
26
+ const eqIndex = trimmed.indexOf("=")
27
+ if (eqIndex === -1) continue
28
+
29
+ const key = trimmed.slice(0, eqIndex).trim().toLowerCase()
30
+ let value = trimmed.slice(eqIndex + 1).trim()
31
+
32
+ if (value.startsWith('"') && value.endsWith('"')) {
33
+ value = value.slice(1, -1)
34
+ }
35
+
36
+ if (key === "q") {
37
+ q = parseFloat(value)
38
+ if (isNaN(q)) q = 1
39
+ q = Math.min(Math.max(q, 0), 1)
40
+ } else {
41
+ result[key] = value
42
+ }
43
+ }
44
+
45
+ return { params: result, q }
43
46
  }
47
+
44
48
  function parseAccept(accept) {
45
- const specs = [];
46
- const parts = accept.split(",");
47
- for (let o = 0; o < parts.length; o++) {
48
- const part = parts[o].trim();
49
- if (!part)
50
- continue;
51
- const match = simpleMediaTypeRegExp.exec(part);
52
- if (!match)
53
- continue;
54
- const type = match[1].toLowerCase();
55
- const subtype = match[2].toLowerCase();
56
- const { params, q } = match[3] ? splitMediaTypeParams(match[3]) : { params: {}, q: 1 };
57
- if (q > 0) {
58
- specs.push({ type, subtype, params, q, o });
59
- }
60
- }
61
- return specs;
49
+ const specs = []
50
+ const parts = accept.split(",")
51
+
52
+ for (let o = 0; o < parts.length; o++) {
53
+ const part = parts[o].trim()
54
+ if (!part) continue
55
+
56
+ const match = simpleMediaTypeRegExp.exec(part)
57
+ if (!match) continue
58
+
59
+ const type = match[1].toLowerCase()
60
+ const subtype = match[2].toLowerCase()
61
+ const { params, q } = match[3] ? splitMediaTypeParams(match[3]) : { params: {}, q: 1 }
62
+
63
+ if (q > 0) {
64
+ specs.push({ type, subtype, params, q, o })
65
+ }
66
+ }
67
+
68
+ return specs
62
69
  }
63
- function specifyMediaType(type, subtype, params, spec) {
64
- let s = 0;
65
- if (spec.type === type) {
66
- s |= 4; // exact match: highest specificity
67
- }
68
- else if (type === "*") {
69
- s |= 0; // server offers wildcard (e.g. */*): matches any client type
70
- }
71
- else if (spec.type !== "*") {
72
- // client is NOT requesting wildcard: no match
73
- return null;
74
- }
75
- // client requests wildcard (e.g. Accept: */*)
76
- if (spec.subtype === subtype) {
77
- s |= 2; // // exact match: highest specificity
78
- }
79
- else if (subtype === "*") {
80
- s |= 1; // server offers wildcard (e.g. text/*)
81
- }
82
- else if (spec.subtype !== "*") {
83
- return null; // client is NOT requesting wildcard
84
- }
85
- // client requests wildcard (e.g. Accept: text/*): matches any server subtype
86
- const specParams = Object.keys(spec.params);
87
- if (specParams.length > 0) {
88
- if (specParams.every((key) => spec.params[key].toLowerCase() === (params[key] || "").toLowerCase())) {
89
- s |= 1;
90
- }
91
- else {
92
- return null;
93
- }
94
- }
95
- return { q: spec.q, s, o: spec.o };
70
+
71
+ function specifyMediaType(
72
+ type,
73
+ subtype,
74
+ params,
75
+ spec,
76
+ ) {
77
+ let s = 0
78
+
79
+ if (spec.type === type) {
80
+ s |= 4 // exact match: highest specificity
81
+ } else if (type === "*") {
82
+ s |= 0 // server offers wildcard (e.g. */*): matches any client type
83
+ } else if (spec.type !== "*") {
84
+ // client is NOT requesting wildcard: no match
85
+ return null
86
+ }
87
+
88
+ // client requests wildcard (e.g. Accept: */*)
89
+ if (spec.subtype === subtype) {
90
+ s |= 2 // // exact match: highest specificity
91
+ } else if (subtype === "*") {
92
+ s |= 1 // server offers wildcard (e.g. text/*)
93
+ } else if (spec.subtype !== "*") {
94
+ return null // client is NOT requesting wildcard
95
+ }
96
+
97
+ // client requests wildcard (e.g. Accept: text/*): matches any server subtype
98
+ const specParams = Object.keys(spec.params)
99
+ if (specParams.length > 0) {
100
+ if (
101
+ specParams.every(
102
+ (key) => spec.params[key].toLowerCase() === (params[key] || "").toLowerCase(),
103
+ )
104
+ ) {
105
+ s |= 1
106
+ } else {
107
+ return null
108
+ }
109
+ }
110
+
111
+ return { q: spec.q, s, o: spec.o }
96
112
  }
97
- function getMediaTypePriority(mediaType, accepted, index) {
98
- let best = null;
99
- const match = simpleMediaTypeRegExp.exec(mediaType);
100
- if (!match) {
101
- return { value: mediaType, q: 0, s: 0, o: -1, i: index };
102
- }
103
- const type = match[1].toLowerCase();
104
- const subtype = match[2].toLowerCase();
105
- const { params } = match[3] ? splitMediaTypeParams(match[3]) : { params: {} };
106
- for (const spec of accepted) {
107
- const result = specifyMediaType(type, subtype, params, spec);
108
- if (result &&
109
- (best === null ||
110
- result.s > best.s ||
111
- (result.s === best.s && result.q > best.q) ||
112
- (result.s === best.s && result.q === best.q && result.o < best.o))) {
113
- best = result;
114
- }
115
- }
116
- return {
117
- value: mediaType,
118
- q: best?.q ?? 0,
119
- s: best?.s ?? 0,
120
- o: best?.o ?? -1,
121
- i: index,
122
- };
113
+
114
+ function getMediaTypePriority(
115
+ mediaType,
116
+ accepted,
117
+ index,
118
+ ) {
119
+ let best = null
120
+
121
+ const match = simpleMediaTypeRegExp.exec(mediaType)
122
+ if (!match) {
123
+ return { value: mediaType, q: 0, s: 0, o: -1, i: index }
124
+ }
125
+
126
+ const type = match[1].toLowerCase()
127
+ const subtype = match[2].toLowerCase()
128
+ const { params } = match[3] ? splitMediaTypeParams(match[3]) : { params: {} }
129
+
130
+ for (const spec of accepted) {
131
+ const result = specifyMediaType(type, subtype, params, spec)
132
+ if (
133
+ result &&
134
+ (best === null ||
135
+ result.s > best.s ||
136
+ (result.s === best.s && result.q > best.q) ||
137
+ (result.s === best.s && result.q === best.q && result.o < best.o))
138
+ ) {
139
+ best = result
140
+ }
141
+ }
142
+
143
+ return {
144
+ value: mediaType,
145
+ q: best?.q ?? 0,
146
+ s: best?.s ?? 0,
147
+ o: best?.o ?? -1,
148
+ i: index,
149
+ }
123
150
  }
124
- function parseAcceptLanguage(accept) {
125
- const specs = [];
126
- const parts = accept.split(",");
127
- for (let o = 0; o < parts.length; o++) {
128
- const part = parts[o].trim();
129
- if (!part)
130
- continue;
131
- const match = simpleLanguageRegExp.exec(part);
132
- if (!match)
133
- continue;
134
- const prefix = match[1].toLowerCase();
135
- const suffix = match[2]?.toLowerCase();
136
- const q = parseQuality(match[3]);
137
- if (q > 0) {
138
- specs.push({ prefix, suffix, q, o });
139
- }
140
- }
141
- return specs;
151
+
152
+ function parseAcceptLanguage(
153
+ accept,
154
+ ) {
155
+ const specs = []
156
+ const parts = accept.split(",")
157
+
158
+ for (let o = 0; o < parts.length; o++) {
159
+ const part = parts[o].trim()
160
+ if (!part) continue
161
+
162
+ const match = simpleLanguageRegExp.exec(part)
163
+ if (!match) continue
164
+
165
+ const prefix = match[1].toLowerCase()
166
+ const suffix = match[2]?.toLowerCase()
167
+ const q = parseQuality(match[3])
168
+
169
+ if (q > 0) {
170
+ specs.push({ prefix, suffix, q, o })
171
+ }
172
+ }
173
+
174
+ return specs
142
175
  }
143
- function specifyLanguage(language, spec) {
144
- const match = simpleLanguageRegExp.exec(language);
145
- if (!match)
146
- return null;
147
- const prefix = match[1].toLowerCase();
148
- const suffix = match[2]?.toLowerCase();
149
- if (spec.prefix === "*") {
150
- return { q: spec.q, s: 0, o: spec.o };
151
- }
152
- if (spec.prefix !== prefix) {
153
- return null;
154
- }
155
- if (spec.suffix === undefined) {
156
- return { q: spec.q, s: suffix ? 2 : 4, o: spec.o };
157
- }
158
- if (spec.suffix === suffix) {
159
- return { q: spec.q, s: 4, o: spec.o };
160
- }
161
- return null;
176
+
177
+ function specifyLanguage(
178
+ language,
179
+ spec,
180
+ ) {
181
+ const match = simpleLanguageRegExp.exec(language)
182
+ if (!match) return null
183
+
184
+ const prefix = match[1].toLowerCase()
185
+ const suffix = match[2]?.toLowerCase()
186
+
187
+ if (spec.prefix === "*") {
188
+ return { q: spec.q, s: 0, o: spec.o }
189
+ }
190
+
191
+ if (spec.prefix !== prefix) {
192
+ return null
193
+ }
194
+
195
+ if (spec.suffix === undefined) {
196
+ return { q: spec.q, s: suffix ? 2 : 4, o: spec.o }
197
+ }
198
+
199
+ if (spec.suffix === suffix) {
200
+ return { q: spec.q, s: 4, o: spec.o }
201
+ }
202
+
203
+ return null
162
204
  }
163
- function getLanguagePriority(language, accepted, index) {
164
- let best = null;
165
- for (const spec of accepted) {
166
- const result = specifyLanguage(language, spec);
167
- if (result &&
168
- (best === null ||
169
- result.s > best.s ||
170
- (result.s === best.s && result.q > best.q) ||
171
- (result.s === best.s && result.q === best.q && result.o < best.o))) {
172
- best = result;
173
- }
174
- }
175
- return {
176
- value: language,
177
- q: best?.q ?? 0,
178
- s: best?.s ?? 0,
179
- o: best?.o ?? -1,
180
- i: index,
181
- };
205
+
206
+ function getLanguagePriority(
207
+ language,
208
+ accepted,
209
+ index,
210
+ ) {
211
+ let best = null
212
+
213
+ for (const spec of accepted) {
214
+ const result = specifyLanguage(language, spec)
215
+ if (
216
+ result &&
217
+ (best === null ||
218
+ result.s > best.s ||
219
+ (result.s === best.s && result.q > best.q) ||
220
+ (result.s === best.s && result.q === best.q && result.o < best.o))
221
+ ) {
222
+ best = result
223
+ }
224
+ }
225
+
226
+ return {
227
+ value: language,
228
+ q: best?.q ?? 0,
229
+ s: best?.s ?? 0,
230
+ o: best?.o ?? -1,
231
+ i: index,
232
+ }
182
233
  }
234
+
183
235
  function parseAcceptEncoding(accept) {
184
- const specs = [];
185
- const parts = accept.split(",");
186
- let hasIdentity = false;
187
- for (let o = 0; o < parts.length; o++) {
188
- const part = parts[o].trim();
189
- if (!part)
190
- continue;
191
- const match = simpleEncodingRegExp.exec(part);
192
- if (!match)
193
- continue;
194
- const encoding = match[1].toLowerCase();
195
- const q = parseQuality(match[2]);
196
- if (encoding === "identity")
197
- hasIdentity = true;
198
- if (encoding === "*")
199
- hasIdentity = true;
200
- if (q > 0) {
201
- specs.push({ encoding, q, o });
202
- }
203
- }
204
- if (!hasIdentity) {
205
- specs.push({ encoding: "identity", q: 0.0001, o: specs.length });
206
- }
207
- return specs;
236
+ const specs = []
237
+ const parts = accept.split(",")
238
+ let hasIdentity = false
239
+
240
+ for (let o = 0; o < parts.length; o++) {
241
+ const part = parts[o].trim()
242
+ if (!part) continue
243
+
244
+ const match = simpleEncodingRegExp.exec(part)
245
+ if (!match) continue
246
+
247
+ const encoding = match[1].toLowerCase()
248
+ const q = parseQuality(match[2])
249
+
250
+ if (encoding === "identity") hasIdentity = true
251
+ if (encoding === "*") hasIdentity = true
252
+
253
+ if (q > 0) {
254
+ specs.push({ encoding, q, o })
255
+ }
256
+ }
257
+
258
+ if (!hasIdentity) {
259
+ specs.push({ encoding: "identity", q: 0.0001, o: specs.length })
260
+ }
261
+
262
+ return specs
208
263
  }
209
- function specifyEncoding(encoding, spec) {
210
- const e = encoding.toLowerCase();
211
- const s = spec.encoding;
212
- if (s === "*" || s === e) {
213
- return { q: spec.q, s: s === e ? 1 : 0, o: spec.o };
214
- }
215
- return null;
264
+
265
+ function specifyEncoding(
266
+ encoding,
267
+ spec,
268
+ ) {
269
+ const e = encoding.toLowerCase()
270
+ const s = spec.encoding
271
+
272
+ if (s === "*" || s === e) {
273
+ return { q: spec.q, s: s === e ? 1 : 0, o: spec.o }
274
+ }
275
+
276
+ return null
216
277
  }
217
- function getEncodingPriority(encoding, accepted, index) {
218
- let best = null;
219
- for (const spec of accepted) {
220
- const result = specifyEncoding(encoding, spec);
221
- if (result &&
222
- (best === null ||
223
- result.s > best.s ||
224
- (result.s === best.s && result.q > best.q) ||
225
- (result.s === best.s && result.q === best.q && result.o < best.o))) {
226
- best = result;
227
- }
228
- }
229
- return {
230
- value: encoding,
231
- q: best?.q ?? 0,
232
- s: best?.s ?? 0,
233
- o: best?.o ?? -1,
234
- i: index,
235
- };
278
+
279
+ function getEncodingPriority(
280
+ encoding,
281
+ accepted,
282
+ index,
283
+ ) {
284
+ let best = null
285
+
286
+ for (const spec of accepted) {
287
+ const result = specifyEncoding(encoding, spec)
288
+ if (
289
+ result &&
290
+ (best === null ||
291
+ result.s > best.s ||
292
+ (result.s === best.s && result.q > best.q) ||
293
+ (result.s === best.s && result.q === best.q && result.o < best.o))
294
+ ) {
295
+ best = result
296
+ }
297
+ }
298
+
299
+ return {
300
+ value: encoding,
301
+ q: best?.q ?? 0,
302
+ s: best?.s ?? 0,
303
+ o: best?.o ?? -1,
304
+ i: index,
305
+ }
236
306
  }
307
+
237
308
  function parseAcceptCharset(accept) {
238
- const specs = [];
239
- const parts = accept.split(",");
240
- for (let o = 0; o < parts.length; o++) {
241
- const part = parts[o].trim();
242
- if (!part)
243
- continue;
244
- const match = simpleCharsetRegExp.exec(part);
245
- if (!match)
246
- continue;
247
- const charset = match[1].toLowerCase();
248
- const q = parseQuality(match[2]);
249
- if (q > 0) {
250
- specs.push({ charset, q, o });
251
- }
252
- }
253
- return specs;
309
+ const specs = []
310
+ const parts = accept.split(",")
311
+
312
+ for (let o = 0; o < parts.length; o++) {
313
+ const part = parts[o].trim()
314
+ if (!part) continue
315
+
316
+ const match = simpleCharsetRegExp.exec(part)
317
+ if (!match) continue
318
+
319
+ const charset = match[1].toLowerCase()
320
+ const q = parseQuality(match[2])
321
+
322
+ if (q > 0) {
323
+ specs.push({ charset, q, o })
324
+ }
325
+ }
326
+
327
+ return specs
254
328
  }
255
- function specifyCharset(charset, spec) {
256
- const c = charset.toLowerCase();
257
- const s = spec.charset;
258
- if (s === "*" || s === c) {
259
- return { q: spec.q, s: s === c ? 1 : 0, o: spec.o };
260
- }
261
- return null;
329
+
330
+ function specifyCharset(
331
+ charset,
332
+ spec,
333
+ ) {
334
+ const c = charset.toLowerCase()
335
+ const s = spec.charset
336
+
337
+ if (s === "*" || s === c) {
338
+ return { q: spec.q, s: s === c ? 1 : 0, o: spec.o }
339
+ }
340
+
341
+ return null
262
342
  }
263
- function getCharsetPriority(charset, accepted, index) {
264
- let best = null;
265
- for (const spec of accepted) {
266
- const result = specifyCharset(charset, spec);
267
- if (result &&
268
- (best === null ||
269
- result.s > best.s ||
270
- (result.s === best.s && result.q > best.q) ||
271
- (result.s === best.s && result.q === best.q && result.o < best.o))) {
272
- best = result;
273
- }
274
- }
275
- return {
276
- value: charset,
277
- q: best?.q ?? 0,
278
- s: best?.s ?? 0,
279
- o: best?.o ?? -1,
280
- i: index,
281
- };
343
+
344
+ function getCharsetPriority(
345
+ charset,
346
+ accepted,
347
+ index,
348
+ ) {
349
+ let best = null
350
+
351
+ for (const spec of accepted) {
352
+ const result = specifyCharset(charset, spec)
353
+ if (
354
+ result &&
355
+ (best === null ||
356
+ result.s > best.s ||
357
+ (result.s === best.s && result.q > best.q) ||
358
+ (result.s === best.s && result.q === best.q && result.o < best.o))
359
+ ) {
360
+ best = result
361
+ }
362
+ }
363
+
364
+ return {
365
+ value: charset,
366
+ q: best?.q ?? 0,
367
+ s: best?.s ?? 0,
368
+ o: best?.o ?? -1,
369
+ i: index,
370
+ }
282
371
  }
372
+
283
373
  function compareSpecs(a, b) {
284
- return b.q - a.q || b.s - a.s || a.o - b.o || a.i - b.i;
374
+ return b.q - a.q || b.s - a.s || a.o - b.o || a.i - b.i
285
375
  }
376
+
286
377
  export function media(accept, available) {
287
- const parsed = parseAccept(accept);
288
- if (parsed.length === 0) {
289
- return [];
290
- }
291
- if (!available) {
292
- return parsed.sort((a, b) => b.q - a.q || a.o - b.o).map((p) => `${p.type}/${p.subtype}`);
293
- }
294
- const priorities = available.map((t, i) => getMediaTypePriority(t, parsed, i));
295
- const sorted = priorities.filter((p) => p.q > 0).sort(compareSpecs);
296
- return sorted.map((p) => p.value);
378
+ const parsed = parseAccept(accept)
379
+ if (parsed.length === 0) {
380
+ return []
381
+ }
382
+
383
+ if (!available) {
384
+ return parsed.sort((a, b) => b.q - a.q || a.o - b.o).map((p) => `${p.type}/${p.subtype}`)
385
+ }
386
+
387
+ const priorities = available.map((t, i) => getMediaTypePriority(t, parsed, i))
388
+ const sorted = priorities.filter((p) => p.q > 0).sort(compareSpecs)
389
+
390
+ return sorted.map((p) => p.value)
297
391
  }
392
+
298
393
  export function language(accept, available) {
299
- const parsed = parseAcceptLanguage(accept);
300
- if (parsed.length === 0) {
301
- return [];
302
- }
303
- if (!available) {
304
- return parsed
305
- .sort((a, b) => b.q - a.q || a.o - b.o)
306
- .map((p) => (p.suffix ? `${p.prefix}-${p.suffix}` : p.prefix));
307
- }
308
- const priorities = available.map((l, i) => getLanguagePriority(l, parsed, i));
309
- const sorted = priorities.filter((p) => p.q > 0).sort(compareSpecs);
310
- return sorted.map((p) => p.value);
394
+ const parsed = parseAcceptLanguage(accept)
395
+ if (parsed.length === 0) {
396
+ return []
397
+ }
398
+
399
+ if (!available) {
400
+ return parsed
401
+ .sort((a, b) => b.q - a.q || a.o - b.o)
402
+ .map((p) => (p.suffix ? `${p.prefix}-${p.suffix}` : p.prefix))
403
+ }
404
+
405
+ const priorities = available.map((l, i) => getLanguagePriority(l, parsed, i))
406
+ const sorted = priorities.filter((p) => p.q > 0).sort(compareSpecs)
407
+
408
+ return sorted.map((p) => p.value)
311
409
  }
410
+
312
411
  export function encoding(accept, available) {
313
- const parsed = parseAcceptEncoding(accept);
314
- if (parsed.length === 0) {
315
- return [];
316
- }
317
- if (!available) {
318
- return parsed.sort((a, b) => b.q - a.q || a.o - b.o).map((p) => p.encoding);
319
- }
320
- const priorities = available.map((e, i) => getEncodingPriority(e, parsed, i));
321
- const sorted = priorities.filter((p) => p.q > 0).sort(compareSpecs);
322
- return sorted.map((p) => p.value);
412
+ const parsed = parseAcceptEncoding(accept)
413
+ if (parsed.length === 0) {
414
+ return []
415
+ }
416
+
417
+ if (!available) {
418
+ return parsed.sort((a, b) => b.q - a.q || a.o - b.o).map((p) => p.encoding)
419
+ }
420
+
421
+ const priorities = available.map((e, i) => getEncodingPriority(e, parsed, i))
422
+ const sorted = priorities.filter((p) => p.q > 0).sort(compareSpecs)
423
+
424
+ return sorted.map((p) => p.value)
323
425
  }
426
+
324
427
  export function charset(accept, available) {
325
- const parsed = parseAcceptCharset(accept);
326
- if (parsed.length === 0) {
327
- return [];
328
- }
329
- if (!available) {
330
- return parsed.sort((a, b) => b.q - a.q || a.o - b.o).map((p) => p.charset);
331
- }
332
- const priorities = available.map((c, i) => getCharsetPriority(c, parsed, i));
333
- const sorted = priorities.filter((p) => p.q > 0).sort(compareSpecs);
334
- return sorted.map((p) => p.value);
428
+ const parsed = parseAcceptCharset(accept)
429
+ if (parsed.length === 0) {
430
+ return []
431
+ }
432
+
433
+ if (!available) {
434
+ return parsed.sort((a, b) => b.q - a.q || a.o - b.o).map((p) => p.charset)
435
+ }
436
+
437
+ const priorities = available.map((c, i) => getCharsetPriority(c, parsed, i))
438
+ const sorted = priorities.filter((p) => p.q > 0).sort(compareSpecs)
439
+
440
+ return sorted.map((p) => p.value)
335
441
  }
442
+
336
443
  export function headerMedia(headers, available) {
337
- const accept = headers.get("accept");
338
- if (!accept)
339
- return [];
340
- return media(accept, available);
444
+ const accept = headers.get("accept")
445
+ if (!accept) return []
446
+ return media(accept, available)
341
447
  }
448
+
342
449
  export function headerLanguage(headers, available) {
343
- const accept = headers.get("accept-language");
344
- if (!accept)
345
- return [];
346
- return language(accept, available);
450
+ const accept = headers.get("accept-language")
451
+ if (!accept) return []
452
+ return language(accept, available)
347
453
  }
454
+
348
455
  export function headerEncoding(headers, available) {
349
- const accept = headers.get("accept-encoding");
350
- if (!accept)
351
- return [];
352
- return encoding(accept, available);
456
+ const accept = headers.get("accept-encoding")
457
+ if (!accept) return []
458
+ return encoding(accept, available)
353
459
  }
460
+
354
461
  export function headerCharset(headers, available) {
355
- const accept = headers.get("accept-charset");
356
- if (!accept)
357
- return [];
358
- return charset(accept, available);
462
+ const accept = headers.get("accept-charset")
463
+ if (!accept) return []
464
+ return charset(accept, available)
359
465
  }