effect-start 0.23.0 → 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 (356) 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 +24 -22
  123. package/src/StartApp.ts +11 -0
  124. package/src/bun/BunServer.ts +89 -16
  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/src/x/tailscale/TailscaleTunnel.ts +7 -5
  132. package/dist/BlobStore.d.ts +0 -80
  133. package/dist/BlobStore.js +0 -19
  134. package/dist/ChildProcess.d.ts +0 -60
  135. package/dist/Commander.d.ts +0 -100
  136. package/dist/ContentNegotiation.d.ts +0 -12
  137. package/dist/Cookies.d.ts +0 -47
  138. package/dist/Development.d.ts +0 -39
  139. package/dist/Effectify.d.ts +0 -209
  140. package/dist/Entity.d.ts +0 -47
  141. package/dist/FilePathPattern.d.ts +0 -29
  142. package/dist/FileRouter.d.ts +0 -56
  143. package/dist/FileRouterCodegen.d.ts +0 -18
  144. package/dist/FileRouterPattern.d.ts +0 -9
  145. package/dist/FileRouterPattern.js +0 -35
  146. package/dist/FileSystem.d.ts +0 -158
  147. package/dist/Http.d.ts +0 -37
  148. package/dist/HttpAppExtra.d.ts +0 -7
  149. package/dist/HttpAppExtra.js +0 -320
  150. package/dist/HttpUtils.d.ts +0 -3
  151. package/dist/HttpUtils.js +0 -11
  152. package/dist/PathPattern.d.ts +0 -134
  153. package/dist/PlatformError.d.ts +0 -38
  154. package/dist/PlatformRuntime.d.ts +0 -27
  155. package/dist/Route.d.ts +0 -97
  156. package/dist/RouteBody.d.ts +0 -47
  157. package/dist/RouteError.d.ts +0 -98
  158. package/dist/RouteHook.d.ts +0 -12
  159. package/dist/RouteHttp.d.ts +0 -21
  160. package/dist/RouteHttpTracer.d.ts +0 -10
  161. package/dist/RouteMount.d.ts +0 -86
  162. package/dist/RouteSchema.d.ts +0 -86
  163. package/dist/RouteSse.d.ts +0 -21
  164. package/dist/RouteTree.d.ts +0 -57
  165. package/dist/RouteTrie.d.ts +0 -20
  166. package/dist/RouterPattern.d.ts +0 -118
  167. package/dist/RouterPattern.js +0 -269
  168. package/dist/SchemaExtra.d.ts +0 -7
  169. package/dist/Socket.d.ts +0 -27
  170. package/dist/Sql.d.ts +0 -34
  171. package/dist/Sql.js +0 -5
  172. package/dist/SqlIntrospect.d.ts +0 -91
  173. package/dist/Start.d.ts +0 -44
  174. package/dist/StartApp.d.ts +0 -19
  175. package/dist/StreamExtra.d.ts +0 -28
  176. package/dist/System.d.ts +0 -7
  177. package/dist/TuplePathPattern.d.ts +0 -9
  178. package/dist/Unique.d.ts +0 -50
  179. package/dist/Values.d.ts +0 -27
  180. package/dist/bun/BunBlobStoreDisk.d.ts +0 -6
  181. package/dist/bun/BunBlobStoreDisk.js +0 -116
  182. package/dist/bun/BunBlobStoreS3.d.ts +0 -11
  183. package/dist/bun/BunBlobStoreS3.js +0 -89
  184. package/dist/bun/BunBlobWatcherDisk.d.ts +0 -6
  185. package/dist/bun/BunBlobWatcherDisk.js +0 -60
  186. package/dist/bun/BunBlobWatcherQueue.d.ts +0 -6
  187. package/dist/bun/BunBlobWatcherQueue.js +0 -17
  188. package/dist/bun/BunBundle.d.ts +0 -11
  189. package/dist/bun/BunChildProcessSpawner.d.ts +0 -3
  190. package/dist/bun/BunHttpServer.d.ts +0 -44
  191. package/dist/bun/BunHttpServer.js +0 -186
  192. package/dist/bun/BunHttpServer_web.d.ts +0 -60
  193. package/dist/bun/BunHttpServer_web.js +0 -252
  194. package/dist/bun/BunImportTrackerPlugin.d.ts +0 -13
  195. package/dist/bun/BunPlatformHttpServer.d.ts +0 -10
  196. package/dist/bun/BunPlatformHttpServer.js +0 -53
  197. package/dist/bun/BunRoute.d.ts +0 -48
  198. package/dist/bun/BunRuntime.d.ts +0 -2
  199. package/dist/bun/BunServer.d.ts +0 -40
  200. package/dist/bun/BunServerRequest.d.ts +0 -60
  201. package/dist/bun/BunServerRequest.js +0 -252
  202. package/dist/bun/BunSql.d.ts +0 -4
  203. package/dist/bun/BunSql.js +0 -81
  204. package/dist/bun/BunVirtualFilesPlugin.d.ts +0 -4
  205. package/dist/bun/_BunEnhancedResolve.d.ts +0 -45
  206. package/dist/bun/index.d.ts +0 -5
  207. package/dist/bundler/Bundle.d.ts +0 -61
  208. package/dist/bundler/BundleFiles.d.ts +0 -13
  209. package/dist/bundler/BundleHttp.d.ts +0 -45
  210. package/dist/bundler/BundleHttp.js +0 -176
  211. package/dist/bundler/BundleRoute.d.ts +0 -27
  212. package/dist/client/Overlay.d.ts +0 -2
  213. package/dist/client/ScrollState.d.ts +0 -6
  214. package/dist/client/index.d.ts +0 -6
  215. package/dist/console/Console.d.ts +0 -6
  216. package/dist/console/ConsoleErrors.d.ts +0 -3
  217. package/dist/console/ConsoleLogger.d.ts +0 -3
  218. package/dist/console/ConsoleMetrics.d.ts +0 -3
  219. package/dist/console/ConsoleProcess.d.ts +0 -3
  220. package/dist/console/ConsoleStore.d.ts +0 -144
  221. package/dist/console/ConsoleTracer.d.ts +0 -3
  222. package/dist/console/Simulation.d.ts +0 -2
  223. package/dist/console/index.d.ts +0 -3
  224. package/dist/console/routes/errors/route.d.ts +0 -10
  225. package/dist/console/routes/errors/route.js +0 -47
  226. package/dist/console/routes/fiberDetail.d.ts +0 -16
  227. package/dist/console/routes/fiberDetail.js +0 -38
  228. package/dist/console/routes/fibers/route.d.ts +0 -10
  229. package/dist/console/routes/fibers/route.js +0 -19
  230. package/dist/console/routes/git/route.d.ts +0 -11
  231. package/dist/console/routes/git/route.js +0 -33
  232. package/dist/console/routes/layout.d.ts +0 -9
  233. package/dist/console/routes/layout.js +0 -3
  234. package/dist/console/routes/logs/route.d.ts +0 -10
  235. package/dist/console/routes/logs/route.js +0 -32
  236. package/dist/console/routes/metrics/route.d.ts +0 -10
  237. package/dist/console/routes/metrics/route.js +0 -17
  238. package/dist/console/routes/route.d.ts +0 -6
  239. package/dist/console/routes/route.js +0 -5
  240. package/dist/console/routes/routes/route.d.ts +0 -6
  241. package/dist/console/routes/routes/route.js +0 -20
  242. package/dist/console/routes/services/route.d.ts +0 -6
  243. package/dist/console/routes/services/route.js +0 -12
  244. package/dist/console/routes/system/route.d.ts +0 -10
  245. package/dist/console/routes/system/route.js +0 -18
  246. package/dist/console/routes/traceDetail.d.ts +0 -16
  247. package/dist/console/routes/traceDetail.js +0 -14
  248. package/dist/console/routes/traces/route.d.ts +0 -10
  249. package/dist/console/routes/traces/route.js +0 -39
  250. package/dist/console/routes/tree.d.ts +0 -153
  251. package/dist/console/ui/Errors.d.ts +0 -4
  252. package/dist/console/ui/Errors.js +0 -15
  253. package/dist/console/ui/Fibers.d.ts +0 -24
  254. package/dist/console/ui/Fibers.js +0 -121
  255. package/dist/console/ui/Git.d.ts +0 -20
  256. package/dist/console/ui/Git.js +0 -95
  257. package/dist/console/ui/Logs.d.ts +0 -4
  258. package/dist/console/ui/Logs.js +0 -25
  259. package/dist/console/ui/Metrics.d.ts +0 -4
  260. package/dist/console/ui/Metrics.js +0 -26
  261. package/dist/console/ui/Routes.d.ts +0 -8
  262. package/dist/console/ui/Routes.js +0 -70
  263. package/dist/console/ui/Services.d.ts +0 -10
  264. package/dist/console/ui/Services.js +0 -246
  265. package/dist/console/ui/Shell.d.ts +0 -10
  266. package/dist/console/ui/Shell.js +0 -7
  267. package/dist/console/ui/System.d.ts +0 -4
  268. package/dist/console/ui/System.js +0 -35
  269. package/dist/console/ui/Traces.d.ts +0 -12
  270. package/dist/console/ui/Traces.js +0 -179
  271. package/dist/datastar/actions/fetch.d.ts +0 -30
  272. package/dist/datastar/actions/peek.d.ts +0 -1
  273. package/dist/datastar/actions/setAll.d.ts +0 -1
  274. package/dist/datastar/actions/toggleAll.d.ts +0 -1
  275. package/dist/datastar/attributes/attr.d.ts +0 -1
  276. package/dist/datastar/attributes/bind.d.ts +0 -1
  277. package/dist/datastar/attributes/class.d.ts +0 -1
  278. package/dist/datastar/attributes/computed.d.ts +0 -1
  279. package/dist/datastar/attributes/effect.d.ts +0 -1
  280. package/dist/datastar/attributes/indicator.d.ts +0 -1
  281. package/dist/datastar/attributes/init.d.ts +0 -1
  282. package/dist/datastar/attributes/jsonSignals.d.ts +0 -1
  283. package/dist/datastar/attributes/on.d.ts +0 -1
  284. package/dist/datastar/attributes/onIntersect.d.ts +0 -1
  285. package/dist/datastar/attributes/onInterval.d.ts +0 -1
  286. package/dist/datastar/attributes/onSignalPatch.d.ts +0 -1
  287. package/dist/datastar/attributes/ref.d.ts +0 -1
  288. package/dist/datastar/attributes/show.d.ts +0 -1
  289. package/dist/datastar/attributes/signals.d.ts +0 -1
  290. package/dist/datastar/attributes/style.d.ts +0 -1
  291. package/dist/datastar/attributes/text.d.ts +0 -1
  292. package/dist/datastar/engine.d.ts +0 -162
  293. package/dist/datastar/happydom.d.ts +0 -1
  294. package/dist/datastar/happydom.js +0 -8
  295. package/dist/datastar/index.d.ts +0 -24
  296. package/dist/datastar/load.d.ts +0 -24
  297. package/dist/datastar/load.js +0 -24
  298. package/dist/datastar/utils.d.ts +0 -51
  299. package/dist/datastar/watchers/patchElements.d.ts +0 -1
  300. package/dist/datastar/watchers/patchSignals.d.ts +0 -1
  301. package/dist/experimental/EncryptedCookies.d.ts +0 -48
  302. package/dist/experimental/SseHttpResponse.d.ts +0 -7
  303. package/dist/experimental/SseHttpResponse.js +0 -28
  304. package/dist/experimental/index.d.ts +0 -1
  305. package/dist/hyper/Hyper.d.ts +0 -25
  306. package/dist/hyper/HyperHtml.d.ts +0 -23
  307. package/dist/hyper/HyperHtml.test.d.ts +0 -1
  308. package/dist/hyper/HyperHtml.test.js +0 -197
  309. package/dist/hyper/HyperNode.d.ts +0 -14
  310. package/dist/hyper/HyperRoute.d.ts +0 -8
  311. package/dist/hyper/HyperRoute.test.d.ts +0 -1
  312. package/dist/hyper/HyperRoute.test.js +0 -83
  313. package/dist/hyper/html.d.ts +0 -11
  314. package/dist/hyper/index.d.ts +0 -6
  315. package/dist/hyper/jsx-runtime.d.ts +0 -7
  316. package/dist/index.d.ts +0 -8
  317. package/dist/inference_check.d.ts +0 -1
  318. package/dist/inference_check.js +0 -15
  319. package/dist/lint/plugin.d.ts +0 -86
  320. package/dist/lint/plugin.js +0 -341
  321. package/dist/middlewares/BasicAuthMiddleware.d.ts +0 -8
  322. package/dist/middlewares/BasicAuthMiddleware.js +0 -22
  323. package/dist/middlewares/index.d.ts +0 -1
  324. package/dist/middlewares/index.js +0 -1
  325. package/dist/node/Effectify.d.ts +0 -209
  326. package/dist/node/Effectify.js +0 -19
  327. package/dist/node/FileSystem.d.ts +0 -7
  328. package/dist/node/FileSystem.js +0 -420
  329. package/dist/node/NodeFileSystem.d.ts +0 -7
  330. package/dist/node/NodeUtils.d.ts +0 -2
  331. package/dist/node/PlatformError.d.ts +0 -46
  332. package/dist/node/PlatformError.js +0 -43
  333. package/dist/node/Utils.d.ts +0 -1
  334. package/dist/node/Utils.js +0 -19
  335. package/dist/repro_fail.d.ts +0 -1
  336. package/dist/repro_fail.js +0 -14
  337. package/dist/sql/bun/index.d.ts +0 -3
  338. package/dist/sql/mssql/docker.d.ts +0 -2
  339. package/dist/sql/mssql/index.d.ts +0 -21
  340. package/dist/testing/TestHttpClient.d.ts +0 -13
  341. package/dist/testing/TestHttpClient.js +0 -68
  342. package/dist/testing/TestLogger.d.ts +0 -13
  343. package/dist/testing/index.d.ts +0 -2
  344. package/dist/testing/utils.d.ts +0 -9
  345. package/dist/x/cloudflare/CloudflareTunnel.d.ts +0 -10
  346. package/dist/x/cloudflare/index.d.ts +0 -1
  347. package/dist/x/datastar/Datastar.d.ts +0 -6
  348. package/dist/x/datastar/Datastar.js +0 -47
  349. package/dist/x/datastar/index.d.ts +0 -1
  350. package/dist/x/datastar/index.js +0 -1
  351. package/dist/x/tailscale/TailscaleTunnel.d.ts +0 -15
  352. package/dist/x/tailscale/index.d.ts +0 -1
  353. package/dist/x/tailwind/TailwindPlugin.d.ts +0 -23
  354. package/dist/x/tailwind/compile.d.ts +0 -19
  355. package/dist/x/tailwind/plugin.d.ts +0 -2
  356. /package/src/{Sql.ts → sql/Sql.ts} +0 -0
package/dist/Fetch.js ADDED
@@ -0,0 +1,192 @@
1
+ import * as Data from "effect/Data"
2
+ import * as Effect from "effect/Effect"
3
+ import * as Schedule from "effect/Schedule"
4
+ import * as Entity from "./Entity.js"
5
+
6
+ const TypeId = Symbol.for("effect-start/FetchClient")
7
+
8
+ export class FetchError extends Data.TaggedError("FetchError") {}
9
+
10
+ const tryFetch = (request) =>
11
+ Effect.map(
12
+ Effect.tryPromise({
13
+ try: () => globalThis.fetch(request),
14
+ catch: (e) => new FetchError({ reason: "Network", cause: e, request }),
15
+ }),
16
+ (response) => Entity.fromResponse(response, request),
17
+ )
18
+
19
+ const defaultMiddleware = [tryFetch]
20
+ const noopNext = () => Effect.die("no middleware")
21
+
22
+ function withTrace(
23
+ request,
24
+ effect,
25
+ ) {
26
+ const url = new URL(request.url)
27
+
28
+ return Effect.useSpan(
29
+ `http.client ${request.method}`,
30
+ { kind: "client", captureStackTrace: false },
31
+ (span) => {
32
+ span.attribute("http.request.method", request.method)
33
+ span.attribute("url.full", url.toString())
34
+ span.attribute("url.path", url.pathname)
35
+ const query = url.search.slice(1)
36
+ if (query !== "") {
37
+ span.attribute("url.query", query)
38
+ }
39
+ span.attribute("url.scheme", url.protocol.slice(0, -1))
40
+
41
+ return Effect.flatMap(Effect.exit(Effect.withParentSpan(effect, span)), (exit) => {
42
+ if (exit._tag === "Success") {
43
+ span.attribute("http.response.status_code", exit.value.status ?? 0)
44
+ }
45
+ return exit
46
+ })
47
+ },
48
+ )
49
+ }
50
+
51
+ export function fetch(
52
+ input,
53
+ init,
54
+ ) {
55
+ const middleware =
56
+ (this)?.middleware ?? defaultMiddleware
57
+ return Effect.gen(function* () {
58
+ const request = new Request(input, init)
59
+
60
+ let handler = noopNext
61
+ for (let i = middleware.length - 1; i >= 0; i--) {
62
+ const nextHandler = handler
63
+ handler = ((req) => middleware[i](req, nextHandler))
64
+ }
65
+
66
+ return yield* withTrace(request, handler(request))
67
+ })
68
+ }
69
+
70
+ export function get(
71
+ input,
72
+ init,
73
+ ) {
74
+ return fetch.call(this, input, { ...init, method: "GET" })
75
+ }
76
+
77
+ export function post(
78
+ input,
79
+ init,
80
+ ) {
81
+ return fetch.call(this, input, { ...init, method: "POST" })
82
+ }
83
+
84
+ export function use(
85
+ ...middleware
86
+ ) {
87
+ const base = (this)?.middleware ?? defaultMiddleware
88
+ const transport = base[base.length - 1]
89
+ const existing = base.slice(0, -1)
90
+ return Object.create(ClientProto, {
91
+ middleware: { value: [...existing, ...middleware, transport] },
92
+ })
93
+ }
94
+
95
+ const ClientProto = {
96
+ [TypeId]: TypeId,
97
+ middleware: defaultMiddleware,
98
+ fetch,
99
+ get,
100
+ post,
101
+ use,
102
+ }
103
+
104
+ export function filterStatus(
105
+ predicate,
106
+ options,
107
+ ) {
108
+ return ((_request, next) =>
109
+ Effect.gen(function* () {
110
+ const entity = yield* next(_request)
111
+ const status = entity.status ?? 0
112
+ if (predicate(status)) {
113
+ return entity
114
+ }
115
+ if (options?.orElse) {
116
+ return yield* options.orElse(entity)
117
+ }
118
+ return yield* Effect.fail(new FetchError({ reason: "Status", response: entity }))
119
+ }))
120
+ }
121
+
122
+ export function filterStatusOk(options) {
123
+ return filterStatus((status) => status >= 200 && status < 300, options)
124
+ }
125
+
126
+ export function followRedirects(options) {
127
+ const maxRedirects = options?.maxRedirects ?? 10
128
+
129
+ return (request, next) =>
130
+ Effect.gen(function* () {
131
+ let currentRequest = new Request(request.url, {
132
+ ...request,
133
+ redirect: "manual",
134
+ })
135
+ let redirectCount = 0
136
+
137
+ while (true) {
138
+ const entity = yield* next(currentRequest)
139
+ const status = entity.status ?? 0
140
+
141
+ if (status >= 300 && status < 400) {
142
+ if (redirectCount >= maxRedirects) {
143
+ return entity
144
+ }
145
+
146
+ const location = entity.headers["location"]
147
+ if (!location) {
148
+ return entity
149
+ }
150
+
151
+ redirectCount++
152
+ const nextUrl = new URL(location, currentRequest.url)
153
+
154
+ if (status === 303) {
155
+ currentRequest = new Request(nextUrl.toString(), {
156
+ method: "GET",
157
+ headers: currentRequest.headers,
158
+ redirect: "manual",
159
+ })
160
+ } else {
161
+ currentRequest = new Request(nextUrl.toString(), {
162
+ method: currentRequest.method,
163
+ headers: currentRequest.headers,
164
+ body: currentRequest.body,
165
+ redirect: "manual",
166
+ })
167
+ }
168
+ } else {
169
+ return entity
170
+ }
171
+ }
172
+ })
173
+ }
174
+
175
+ export function retry(options) {
176
+ return ((request, next) => {
177
+ if (options.schedule) {
178
+ return Effect.retry(
179
+ Effect.suspend(() => next(request)),
180
+ options.schedule,
181
+ )
182
+ }
183
+
184
+ const times = options.times ?? 3
185
+ const delay = options.delay ?? 1000
186
+
187
+ return Effect.retry(
188
+ Effect.suspend(() => next(request)),
189
+ Schedule.intersect(Schedule.recurs(times), Schedule.exponential(delay)),
190
+ )
191
+ })
192
+ }
@@ -1,86 +1,97 @@
1
- import * as Either from "effect/Either";
1
+ import * as Either from "effect/Either"
2
+
2
3
  export function segments(pattern) {
3
- const parts = pattern.split("/").filter(Boolean);
4
- const result = [];
5
- for (const part of parts) {
6
- if (/^\(\w+\)$/.test(part)) {
7
- result.push({ _tag: "GroupSegment", name: part.slice(1, -1) });
8
- }
9
- else if (part.startsWith("[[") && part.endsWith("]]")) {
10
- result.push({ _tag: "RestSegment", name: part.slice(2, -2) });
11
- }
12
- else if (part.startsWith("[") && part.endsWith("]")) {
13
- result.push({ _tag: "ParamSegment", name: part.slice(1, -1) });
14
- }
15
- else if (/^[\p{L}\p{N}._~-]+$/u.test(part)) {
16
- result.push({ _tag: "LiteralSegment", value: part });
17
- }
18
- else {
19
- result.push({ _tag: "InvalidSegment", value: part });
20
- }
4
+ const parts = pattern.split("/").filter(Boolean)
5
+ const result = []
6
+
7
+ for (const part of parts) {
8
+ if (/^\(\w+\)$/.test(part)) {
9
+ result.push({ _tag: "GroupSegment", name: part.slice(1, -1) })
10
+ } else if (part.startsWith("[[") && part.endsWith("]]")) {
11
+ result.push({ _tag: "RestSegment", name: part.slice(2, -2) })
12
+ } else if (part.startsWith("[") && part.endsWith("]")) {
13
+ result.push({ _tag: "ParamSegment", name: part.slice(1, -1) })
14
+ } else if (/^[\p{L}\p{N}._~-]+$/u.test(part)) {
15
+ result.push({ _tag: "LiteralSegment", value: part })
16
+ } else {
17
+ result.push({ _tag: "InvalidSegment", value: part })
21
18
  }
22
- return result;
19
+ }
20
+
21
+ return result
23
22
  }
23
+
24
24
  export function validate(pattern) {
25
- const segs = segments(pattern);
26
- const invalid = segs.find((s) => s._tag === "InvalidSegment");
27
- if (invalid) {
28
- return Either.left({
29
- _tag: "FilePathPatternError",
30
- pattern,
31
- message: `Invalid segment: "${invalid.value}"`,
32
- });
33
- }
34
- const restIndex = segs.findIndex((s) => s._tag === "RestSegment");
35
- if (restIndex !== -1 && restIndex !== segs.length - 1) {
36
- return Either.left({
37
- _tag: "FilePathPatternError",
38
- pattern,
39
- message: "Rest segment must be the last segment",
40
- });
41
- }
42
- return Either.right(segs);
25
+ const segs = segments(pattern)
26
+
27
+ const invalid = segs.find((s) => s._tag === "InvalidSegment")
28
+ if (invalid) {
29
+ return Either.left({
30
+ _tag: "FilePathPatternError",
31
+ pattern,
32
+ message: `Invalid segment: "${invalid.value}"`,
33
+ })
34
+ }
35
+
36
+ const restIndex = segs.findIndex((s) => s._tag === "RestSegment")
37
+ if (restIndex !== -1 && restIndex !== segs.length - 1) {
38
+ return Either.left({
39
+ _tag: "FilePathPatternError",
40
+ pattern,
41
+ message: "Rest segment must be the last segment",
42
+ })
43
+ }
44
+
45
+ return Either.right(segs)
43
46
  }
47
+
44
48
  export function format(segs) {
45
- const parts = segs.map((seg) => {
46
- switch (seg._tag) {
47
- case "GroupSegment":
48
- return `(${seg.name})`;
49
- case "RestSegment":
50
- return `[[${seg.name}]]`;
51
- case "ParamSegment":
52
- return `[${seg.name}]`;
53
- case "LiteralSegment":
54
- return seg.value;
55
- case "InvalidSegment":
56
- return seg.value;
57
- }
58
- });
59
- const joined = parts.join("/");
60
- return (joined ? `/${joined}` : "/");
61
- }
62
- export function toPathPattern(pattern) {
63
- const result = validate(pattern);
64
- if (Either.isLeft(result)) {
65
- return Either.left(result.left);
49
+ const parts = segs.map((seg) => {
50
+ switch (seg._tag) {
51
+ case "GroupSegment":
52
+ return `(${seg.name})`
53
+ case "RestSegment":
54
+ return `[[${seg.name}]]`
55
+ case "ParamSegment":
56
+ return `[${seg.name}]`
57
+ case "LiteralSegment":
58
+ return seg.value
59
+ case "InvalidSegment":
60
+ return seg.value
66
61
  }
67
- const segs = result.right;
68
- const pathParts = [];
69
- for (const seg of segs) {
70
- switch (seg._tag) {
71
- case "GroupSegment":
72
- continue;
73
- case "RestSegment":
74
- pathParts.push(`:${seg.name}*`);
75
- break;
76
- case "ParamSegment":
77
- pathParts.push(`:${seg.name}`);
78
- break;
79
- case "LiteralSegment":
80
- pathParts.push(seg.value);
81
- break;
82
- }
62
+ })
63
+ const joined = parts.join("/")
64
+ return (joined ? `/${joined}` : "/")
65
+ }
66
+
67
+ export function toPathPattern(
68
+ pattern,
69
+ ) {
70
+ const result = validate(pattern)
71
+
72
+ if (Either.isLeft(result)) {
73
+ return Either.left(result.left)
74
+ }
75
+
76
+ const segs = result.right
77
+ const pathParts = []
78
+
79
+ for (const seg of segs) {
80
+ switch (seg._tag) {
81
+ case "GroupSegment":
82
+ continue
83
+ case "RestSegment":
84
+ pathParts.push(`:${seg.name}*`)
85
+ break
86
+ case "ParamSegment":
87
+ pathParts.push(`:${seg.name}`)
88
+ break
89
+ case "LiteralSegment":
90
+ pathParts.push(seg.value)
91
+ break
83
92
  }
84
- const joined = pathParts.join("/");
85
- return Either.right((joined ? `/${joined}` : "/"));
93
+ }
94
+
95
+ const joined = pathParts.join("/")
96
+ return Either.right((joined ? `/${joined}` : "/"))
86
97
  }