effect-start 0.23.1 → 0.26.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 (351) hide show
  1. package/package.json +18 -86
  2. package/src/Development.ts +3 -1
  3. package/src/Entity.ts +17 -0
  4. package/src/Fetch.ts +271 -0
  5. package/src/SqlIntrospect.ts +64 -70
  6. package/src/Start.ts +21 -24
  7. package/src/StartApp.ts +1 -1
  8. package/src/bun/BunServer.ts +42 -10
  9. package/src/hyper/HyperHtml.ts +0 -1
  10. package/src/sql/bun/index.ts +1 -1
  11. package/src/sql/index.ts +1 -0
  12. package/src/sql/libsql/index.ts +173 -0
  13. package/src/sql/libsql/libsql.d.ts +39 -0
  14. package/src/sql/mssql/index.ts +1 -1
  15. package/dist/BlobStore.d.ts +0 -80
  16. package/dist/BlobStore.js +0 -19
  17. package/dist/ChildProcess.d.ts +0 -60
  18. package/dist/ChildProcess.js +0 -30
  19. package/dist/Commander.d.ts +0 -100
  20. package/dist/Commander.js +0 -326
  21. package/dist/ContentNegotiation.d.ts +0 -12
  22. package/dist/ContentNegotiation.js +0 -359
  23. package/dist/Cookies.d.ts +0 -47
  24. package/dist/Cookies.js +0 -302
  25. package/dist/Development.d.ts +0 -39
  26. package/dist/Development.js +0 -58
  27. package/dist/Effectify.d.ts +0 -209
  28. package/dist/Effectify.js +0 -19
  29. package/dist/Entity.d.ts +0 -47
  30. package/dist/Entity.js +0 -224
  31. package/dist/FilePathPattern.d.ts +0 -29
  32. package/dist/FilePathPattern.js +0 -86
  33. package/dist/FileRouter.d.ts +0 -56
  34. package/dist/FileRouter.js +0 -148
  35. package/dist/FileRouterCodegen.d.ts +0 -18
  36. package/dist/FileRouterCodegen.js +0 -227
  37. package/dist/FileRouterPattern.d.ts +0 -9
  38. package/dist/FileRouterPattern.js +0 -35
  39. package/dist/FileSystem.d.ts +0 -158
  40. package/dist/FileSystem.js +0 -70
  41. package/dist/Http.d.ts +0 -37
  42. package/dist/Http.js +0 -88
  43. package/dist/HttpAppExtra.d.ts +0 -7
  44. package/dist/HttpAppExtra.js +0 -320
  45. package/dist/HttpUtils.d.ts +0 -3
  46. package/dist/HttpUtils.js +0 -11
  47. package/dist/PathPattern.d.ts +0 -134
  48. package/dist/PathPattern.js +0 -413
  49. package/dist/PlatformError.d.ts +0 -38
  50. package/dist/PlatformError.js +0 -25
  51. package/dist/PlatformRuntime.d.ts +0 -27
  52. package/dist/PlatformRuntime.js +0 -46
  53. package/dist/Route.d.ts +0 -97
  54. package/dist/Route.js +0 -100
  55. package/dist/RouteBody.d.ts +0 -47
  56. package/dist/RouteBody.js +0 -67
  57. package/dist/RouteError.d.ts +0 -98
  58. package/dist/RouteError.js +0 -55
  59. package/dist/RouteHook.d.ts +0 -12
  60. package/dist/RouteHook.js +0 -40
  61. package/dist/RouteHttp.d.ts +0 -21
  62. package/dist/RouteHttp.js +0 -258
  63. package/dist/RouteHttpTracer.d.ts +0 -10
  64. package/dist/RouteHttpTracer.js +0 -62
  65. package/dist/RouteMount.d.ts +0 -86
  66. package/dist/RouteMount.js +0 -63
  67. package/dist/RouteSchema.d.ts +0 -86
  68. package/dist/RouteSchema.js +0 -188
  69. package/dist/RouteSse.d.ts +0 -21
  70. package/dist/RouteSse.js +0 -79
  71. package/dist/RouteTree.d.ts +0 -57
  72. package/dist/RouteTree.js +0 -93
  73. package/dist/RouteTrie.d.ts +0 -20
  74. package/dist/RouteTrie.js +0 -152
  75. package/dist/RouterPattern.d.ts +0 -118
  76. package/dist/RouterPattern.js +0 -269
  77. package/dist/SchemaExtra.d.ts +0 -7
  78. package/dist/SchemaExtra.js +0 -74
  79. package/dist/Socket.d.ts +0 -27
  80. package/dist/Socket.js +0 -29
  81. package/dist/Sql.d.ts +0 -34
  82. package/dist/Sql.js +0 -5
  83. package/dist/SqlIntrospect.d.ts +0 -91
  84. package/dist/SqlIntrospect.js +0 -466
  85. package/dist/Start.d.ts +0 -44
  86. package/dist/Start.js +0 -49
  87. package/dist/StartApp.d.ts +0 -19
  88. package/dist/StartApp.js +0 -21
  89. package/dist/StreamExtra.d.ts +0 -28
  90. package/dist/StreamExtra.js +0 -100
  91. package/dist/System.d.ts +0 -7
  92. package/dist/System.js +0 -22
  93. package/dist/TuplePathPattern.d.ts +0 -9
  94. package/dist/TuplePathPattern.js +0 -68
  95. package/dist/Unique.d.ts +0 -50
  96. package/dist/Unique.js +0 -187
  97. package/dist/Values.d.ts +0 -27
  98. package/dist/Values.js +0 -36
  99. package/dist/bun/BunBlobStoreDisk.d.ts +0 -6
  100. package/dist/bun/BunBlobStoreDisk.js +0 -116
  101. package/dist/bun/BunBlobStoreS3.d.ts +0 -11
  102. package/dist/bun/BunBlobStoreS3.js +0 -89
  103. package/dist/bun/BunBlobWatcherDisk.d.ts +0 -6
  104. package/dist/bun/BunBlobWatcherDisk.js +0 -60
  105. package/dist/bun/BunBlobWatcherQueue.d.ts +0 -6
  106. package/dist/bun/BunBlobWatcherQueue.js +0 -17
  107. package/dist/bun/BunBundle.d.ts +0 -11
  108. package/dist/bun/BunBundle.js +0 -137
  109. package/dist/bun/BunChildProcessSpawner.d.ts +0 -3
  110. package/dist/bun/BunChildProcessSpawner.js +0 -103
  111. package/dist/bun/BunHttpServer.d.ts +0 -44
  112. package/dist/bun/BunHttpServer.js +0 -186
  113. package/dist/bun/BunHttpServer_web.d.ts +0 -60
  114. package/dist/bun/BunHttpServer_web.js +0 -252
  115. package/dist/bun/BunImportTrackerPlugin.d.ts +0 -13
  116. package/dist/bun/BunImportTrackerPlugin.js +0 -69
  117. package/dist/bun/BunPlatformHttpServer.d.ts +0 -10
  118. package/dist/bun/BunPlatformHttpServer.js +0 -53
  119. package/dist/bun/BunRoute.d.ts +0 -48
  120. package/dist/bun/BunRoute.js +0 -121
  121. package/dist/bun/BunRuntime.d.ts +0 -2
  122. package/dist/bun/BunRuntime.js +0 -31
  123. package/dist/bun/BunServer.d.ts +0 -40
  124. package/dist/bun/BunServer.js +0 -157
  125. package/dist/bun/BunServerRequest.d.ts +0 -60
  126. package/dist/bun/BunServerRequest.js +0 -252
  127. package/dist/bun/BunSql.d.ts +0 -4
  128. package/dist/bun/BunSql.js +0 -81
  129. package/dist/bun/BunVirtualFilesPlugin.d.ts +0 -4
  130. package/dist/bun/BunVirtualFilesPlugin.js +0 -40
  131. package/dist/bun/_BunEnhancedResolve.d.ts +0 -45
  132. package/dist/bun/_BunEnhancedResolve.js +0 -102
  133. package/dist/bun/index.d.ts +0 -5
  134. package/dist/bun/index.js +0 -5
  135. package/dist/bundler/Bundle.d.ts +0 -61
  136. package/dist/bundler/Bundle.js +0 -48
  137. package/dist/bundler/BundleFiles.d.ts +0 -13
  138. package/dist/bundler/BundleFiles.js +0 -96
  139. package/dist/bundler/BundleHttp.d.ts +0 -45
  140. package/dist/bundler/BundleHttp.js +0 -176
  141. package/dist/bundler/BundleRoute.d.ts +0 -27
  142. package/dist/bundler/BundleRoute.js +0 -51
  143. package/dist/client/Overlay.d.ts +0 -2
  144. package/dist/client/Overlay.js +0 -32
  145. package/dist/client/ScrollState.d.ts +0 -6
  146. package/dist/client/ScrollState.js +0 -94
  147. package/dist/client/index.d.ts +0 -6
  148. package/dist/client/index.js +0 -79
  149. package/dist/console/Console.d.ts +0 -6
  150. package/dist/console/Console.js +0 -26
  151. package/dist/console/ConsoleErrors.d.ts +0 -3
  152. package/dist/console/ConsoleErrors.js +0 -200
  153. package/dist/console/ConsoleLogger.d.ts +0 -3
  154. package/dist/console/ConsoleLogger.js +0 -47
  155. package/dist/console/ConsoleMetrics.d.ts +0 -3
  156. package/dist/console/ConsoleMetrics.js +0 -61
  157. package/dist/console/ConsoleProcess.d.ts +0 -3
  158. package/dist/console/ConsoleProcess.js +0 -49
  159. package/dist/console/ConsoleStore.d.ts +0 -144
  160. package/dist/console/ConsoleStore.js +0 -61
  161. package/dist/console/ConsoleTracer.d.ts +0 -3
  162. package/dist/console/ConsoleTracer.js +0 -94
  163. package/dist/console/Simulation.d.ts +0 -2
  164. package/dist/console/Simulation.js +0 -633
  165. package/dist/console/index.d.ts +0 -3
  166. package/dist/console/index.js +0 -3
  167. package/dist/console/routes/errors/route.d.ts +0 -10
  168. package/dist/console/routes/errors/route.js +0 -47
  169. package/dist/console/routes/fiberDetail.d.ts +0 -16
  170. package/dist/console/routes/fiberDetail.js +0 -38
  171. package/dist/console/routes/fibers/route.d.ts +0 -10
  172. package/dist/console/routes/fibers/route.js +0 -19
  173. package/dist/console/routes/git/route.d.ts +0 -11
  174. package/dist/console/routes/git/route.js +0 -33
  175. package/dist/console/routes/layout.d.ts +0 -9
  176. package/dist/console/routes/layout.js +0 -3
  177. package/dist/console/routes/logs/route.d.ts +0 -10
  178. package/dist/console/routes/logs/route.js +0 -32
  179. package/dist/console/routes/metrics/route.d.ts +0 -10
  180. package/dist/console/routes/metrics/route.js +0 -17
  181. package/dist/console/routes/route.d.ts +0 -6
  182. package/dist/console/routes/route.js +0 -5
  183. package/dist/console/routes/routes/route.d.ts +0 -6
  184. package/dist/console/routes/routes/route.js +0 -20
  185. package/dist/console/routes/services/route.d.ts +0 -6
  186. package/dist/console/routes/services/route.js +0 -12
  187. package/dist/console/routes/system/route.d.ts +0 -10
  188. package/dist/console/routes/system/route.js +0 -18
  189. package/dist/console/routes/traceDetail.d.ts +0 -16
  190. package/dist/console/routes/traceDetail.js +0 -14
  191. package/dist/console/routes/traces/route.d.ts +0 -10
  192. package/dist/console/routes/traces/route.js +0 -39
  193. package/dist/console/routes/tree.d.ts +0 -153
  194. package/dist/console/routes/tree.js +0 -29
  195. package/dist/console/ui/Errors.d.ts +0 -4
  196. package/dist/console/ui/Errors.js +0 -15
  197. package/dist/console/ui/Fibers.d.ts +0 -24
  198. package/dist/console/ui/Fibers.js +0 -121
  199. package/dist/console/ui/Git.d.ts +0 -20
  200. package/dist/console/ui/Git.js +0 -95
  201. package/dist/console/ui/Logs.d.ts +0 -4
  202. package/dist/console/ui/Logs.js +0 -25
  203. package/dist/console/ui/Metrics.d.ts +0 -4
  204. package/dist/console/ui/Metrics.js +0 -26
  205. package/dist/console/ui/Routes.d.ts +0 -8
  206. package/dist/console/ui/Routes.js +0 -70
  207. package/dist/console/ui/Services.d.ts +0 -10
  208. package/dist/console/ui/Services.js +0 -246
  209. package/dist/console/ui/Shell.d.ts +0 -10
  210. package/dist/console/ui/Shell.js +0 -7
  211. package/dist/console/ui/System.d.ts +0 -4
  212. package/dist/console/ui/System.js +0 -35
  213. package/dist/console/ui/Traces.d.ts +0 -12
  214. package/dist/console/ui/Traces.js +0 -179
  215. package/dist/datastar/actions/fetch.d.ts +0 -30
  216. package/dist/datastar/actions/fetch.js +0 -403
  217. package/dist/datastar/actions/peek.d.ts +0 -1
  218. package/dist/datastar/actions/peek.js +0 -13
  219. package/dist/datastar/actions/setAll.d.ts +0 -1
  220. package/dist/datastar/actions/setAll.js +0 -12
  221. package/dist/datastar/actions/toggleAll.d.ts +0 -1
  222. package/dist/datastar/actions/toggleAll.js +0 -12
  223. package/dist/datastar/attributes/attr.d.ts +0 -1
  224. package/dist/datastar/attributes/attr.js +0 -48
  225. package/dist/datastar/attributes/bind.d.ts +0 -1
  226. package/dist/datastar/attributes/bind.js +0 -175
  227. package/dist/datastar/attributes/class.d.ts +0 -1
  228. package/dist/datastar/attributes/class.js +0 -47
  229. package/dist/datastar/attributes/computed.d.ts +0 -1
  230. package/dist/datastar/attributes/computed.js +0 -26
  231. package/dist/datastar/attributes/effect.d.ts +0 -1
  232. package/dist/datastar/attributes/effect.js +0 -9
  233. package/dist/datastar/attributes/indicator.d.ts +0 -1
  234. package/dist/datastar/attributes/indicator.js +0 -30
  235. package/dist/datastar/attributes/init.d.ts +0 -1
  236. package/dist/datastar/attributes/init.js +0 -26
  237. package/dist/datastar/attributes/jsonSignals.d.ts +0 -1
  238. package/dist/datastar/attributes/jsonSignals.js +0 -30
  239. package/dist/datastar/attributes/on.d.ts +0 -1
  240. package/dist/datastar/attributes/on.js +0 -78
  241. package/dist/datastar/attributes/onIntersect.d.ts +0 -1
  242. package/dist/datastar/attributes/onIntersect.js +0 -53
  243. package/dist/datastar/attributes/onInterval.d.ts +0 -1
  244. package/dist/datastar/attributes/onInterval.js +0 -30
  245. package/dist/datastar/attributes/onSignalPatch.d.ts +0 -1
  246. package/dist/datastar/attributes/onSignalPatch.js +0 -42
  247. package/dist/datastar/attributes/ref.d.ts +0 -1
  248. package/dist/datastar/attributes/ref.js +0 -10
  249. package/dist/datastar/attributes/show.d.ts +0 -1
  250. package/dist/datastar/attributes/show.js +0 -31
  251. package/dist/datastar/attributes/signals.d.ts +0 -1
  252. package/dist/datastar/attributes/signals.js +0 -17
  253. package/dist/datastar/attributes/style.d.ts +0 -1
  254. package/dist/datastar/attributes/style.js +0 -50
  255. package/dist/datastar/attributes/text.d.ts +0 -1
  256. package/dist/datastar/attributes/text.js +0 -26
  257. package/dist/datastar/engine.d.ts +0 -162
  258. package/dist/datastar/engine.js +0 -999
  259. package/dist/datastar/happydom.d.ts +0 -1
  260. package/dist/datastar/happydom.js +0 -8
  261. package/dist/datastar/index.d.ts +0 -24
  262. package/dist/datastar/index.js +0 -24
  263. package/dist/datastar/load.d.ts +0 -24
  264. package/dist/datastar/load.js +0 -24
  265. package/dist/datastar/utils.d.ts +0 -51
  266. package/dist/datastar/utils.js +0 -202
  267. package/dist/datastar/watchers/patchElements.d.ts +0 -1
  268. package/dist/datastar/watchers/patchElements.js +0 -399
  269. package/dist/datastar/watchers/patchSignals.d.ts +0 -1
  270. package/dist/datastar/watchers/patchSignals.js +0 -14
  271. package/dist/experimental/EncryptedCookies.d.ts +0 -48
  272. package/dist/experimental/EncryptedCookies.js +0 -212
  273. package/dist/experimental/SseHttpResponse.d.ts +0 -7
  274. package/dist/experimental/SseHttpResponse.js +0 -28
  275. package/dist/experimental/index.d.ts +0 -1
  276. package/dist/experimental/index.js +0 -1
  277. package/dist/hyper/Hyper.d.ts +0 -25
  278. package/dist/hyper/Hyper.js +0 -23
  279. package/dist/hyper/HyperHtml.d.ts +0 -23
  280. package/dist/hyper/HyperHtml.js +0 -150
  281. package/dist/hyper/HyperHtml.test.d.ts +0 -1
  282. package/dist/hyper/HyperHtml.test.js +0 -197
  283. package/dist/hyper/HyperNode.d.ts +0 -14
  284. package/dist/hyper/HyperNode.js +0 -11
  285. package/dist/hyper/HyperRoute.d.ts +0 -8
  286. package/dist/hyper/HyperRoute.js +0 -32
  287. package/dist/hyper/HyperRoute.test.d.ts +0 -1
  288. package/dist/hyper/HyperRoute.test.js +0 -83
  289. package/dist/hyper/html.d.ts +0 -11
  290. package/dist/hyper/html.js +0 -30
  291. package/dist/hyper/index.d.ts +0 -6
  292. package/dist/hyper/index.js +0 -5
  293. package/dist/hyper/jsx-runtime.d.ts +0 -7
  294. package/dist/hyper/jsx-runtime.js +0 -8
  295. package/dist/index.d.ts +0 -8
  296. package/dist/index.js +0 -8
  297. package/dist/inference_check.d.ts +0 -1
  298. package/dist/inference_check.js +0 -15
  299. package/dist/lint/plugin.d.ts +0 -86
  300. package/dist/lint/plugin.js +0 -341
  301. package/dist/middlewares/BasicAuthMiddleware.d.ts +0 -8
  302. package/dist/middlewares/BasicAuthMiddleware.js +0 -22
  303. package/dist/middlewares/index.d.ts +0 -1
  304. package/dist/middlewares/index.js +0 -1
  305. package/dist/node/Effectify.d.ts +0 -209
  306. package/dist/node/Effectify.js +0 -19
  307. package/dist/node/FileSystem.d.ts +0 -7
  308. package/dist/node/FileSystem.js +0 -420
  309. package/dist/node/NodeFileSystem.d.ts +0 -7
  310. package/dist/node/NodeFileSystem.js +0 -410
  311. package/dist/node/NodeUtils.d.ts +0 -2
  312. package/dist/node/NodeUtils.js +0 -20
  313. package/dist/node/PlatformError.d.ts +0 -46
  314. package/dist/node/PlatformError.js +0 -43
  315. package/dist/node/Utils.d.ts +0 -1
  316. package/dist/node/Utils.js +0 -19
  317. package/dist/repro_fail.d.ts +0 -1
  318. package/dist/repro_fail.js +0 -14
  319. package/dist/sql/bun/index.d.ts +0 -3
  320. package/dist/sql/bun/index.js +0 -75
  321. package/dist/sql/mssql/docker.d.ts +0 -2
  322. package/dist/sql/mssql/docker.js +0 -67
  323. package/dist/sql/mssql/index.d.ts +0 -21
  324. package/dist/sql/mssql/index.js +0 -113
  325. package/dist/testing/TestHttpClient.d.ts +0 -13
  326. package/dist/testing/TestHttpClient.js +0 -68
  327. package/dist/testing/TestLogger.d.ts +0 -13
  328. package/dist/testing/TestLogger.js +0 -32
  329. package/dist/testing/index.d.ts +0 -2
  330. package/dist/testing/index.js +0 -2
  331. package/dist/testing/utils.d.ts +0 -9
  332. package/dist/testing/utils.js +0 -39
  333. package/dist/x/cloudflare/CloudflareTunnel.d.ts +0 -10
  334. package/dist/x/cloudflare/CloudflareTunnel.js +0 -30
  335. package/dist/x/cloudflare/index.d.ts +0 -1
  336. package/dist/x/cloudflare/index.js +0 -1
  337. package/dist/x/datastar/Datastar.d.ts +0 -6
  338. package/dist/x/datastar/Datastar.js +0 -47
  339. package/dist/x/datastar/index.d.ts +0 -1
  340. package/dist/x/datastar/index.js +0 -1
  341. package/dist/x/tailscale/TailscaleTunnel.d.ts +0 -15
  342. package/dist/x/tailscale/TailscaleTunnel.js +0 -68
  343. package/dist/x/tailscale/index.d.ts +0 -1
  344. package/dist/x/tailscale/index.js +0 -1
  345. package/dist/x/tailwind/TailwindPlugin.d.ts +0 -23
  346. package/dist/x/tailwind/TailwindPlugin.js +0 -219
  347. package/dist/x/tailwind/compile.d.ts +0 -19
  348. package/dist/x/tailwind/compile.js +0 -154
  349. package/dist/x/tailwind/plugin.d.ts +0 -2
  350. package/dist/x/tailwind/plugin.js +0 -15
  351. /package/src/{Sql.ts → sql/Sql.ts} +0 -0
@@ -1,158 +0,0 @@
1
- import * as Brand from "effect/Brand";
2
- import * as Context from "effect/Context";
3
- import * as Data from "effect/Data";
4
- import * as Effect from "effect/Effect";
5
- import * as Option from "effect/Option";
6
- import * as Sink from "effect/Sink";
7
- import type * as Scope from "effect/Scope";
8
- import * as Stream from "effect/Stream";
9
- import * as PlatformError from "./PlatformError.ts";
10
- export interface FileSystem {
11
- readonly access: (path: string, options?: AccessFileOptions) => Effect.Effect<void, PlatformError.PlatformError>;
12
- readonly copy: (fromPath: string, toPath: string, options?: CopyOptions) => Effect.Effect<void, PlatformError.PlatformError>;
13
- readonly copyFile: (fromPath: string, toPath: string) => Effect.Effect<void, PlatformError.PlatformError>;
14
- readonly chmod: (path: string, mode: number) => Effect.Effect<void, PlatformError.PlatformError>;
15
- readonly chown: (path: string, uid: number, gid: number) => Effect.Effect<void, PlatformError.PlatformError>;
16
- readonly exists: (path: string) => Effect.Effect<boolean, PlatformError.PlatformError>;
17
- readonly link: (fromPath: string, toPath: string) => Effect.Effect<void, PlatformError.PlatformError>;
18
- readonly makeDirectory: (path: string, options?: MakeDirectoryOptions) => Effect.Effect<void, PlatformError.PlatformError>;
19
- readonly makeTempDirectory: (options?: MakeTempDirectoryOptions) => Effect.Effect<string, PlatformError.PlatformError>;
20
- readonly makeTempDirectoryScoped: (options?: MakeTempDirectoryOptions) => Effect.Effect<string, PlatformError.PlatformError, Scope.Scope>;
21
- readonly makeTempFile: (options?: MakeTempFileOptions) => Effect.Effect<string, PlatformError.PlatformError>;
22
- readonly makeTempFileScoped: (options?: MakeTempFileOptions) => Effect.Effect<string, PlatformError.PlatformError, Scope.Scope>;
23
- readonly open: (path: string, options?: OpenFileOptions) => Effect.Effect<File, PlatformError.PlatformError, Scope.Scope>;
24
- readonly readDirectory: (path: string, options?: ReadDirectoryOptions) => Effect.Effect<Array<string>, PlatformError.PlatformError>;
25
- readonly readFile: (path: string) => Effect.Effect<Uint8Array, PlatformError.PlatformError>;
26
- readonly readFileString: (path: string, encoding?: string) => Effect.Effect<string, PlatformError.PlatformError>;
27
- readonly readLink: (path: string) => Effect.Effect<string, PlatformError.PlatformError>;
28
- readonly realPath: (path: string) => Effect.Effect<string, PlatformError.PlatformError>;
29
- readonly remove: (path: string, options?: RemoveOptions) => Effect.Effect<void, PlatformError.PlatformError>;
30
- readonly rename: (oldPath: string, newPath: string) => Effect.Effect<void, PlatformError.PlatformError>;
31
- readonly sink: (path: string, options?: SinkOptions) => Sink.Sink<void, Uint8Array, never, PlatformError.PlatformError>;
32
- readonly stat: (path: string) => Effect.Effect<File.Info, PlatformError.PlatformError>;
33
- readonly stream: (path: string, options?: StreamOptions) => Stream.Stream<Uint8Array, PlatformError.PlatformError>;
34
- readonly symlink: (fromPath: string, toPath: string) => Effect.Effect<void, PlatformError.PlatformError>;
35
- readonly truncate: (path: string, length?: SizeInput) => Effect.Effect<void, PlatformError.PlatformError>;
36
- readonly utimes: (path: string, atime: Date | number, mtime: Date | number) => Effect.Effect<void, PlatformError.PlatformError>;
37
- readonly watch: (path: string, options?: WatchOptions) => Stream.Stream<WatchEvent, PlatformError.PlatformError>;
38
- readonly writeFile: (path: string, data: Uint8Array, options?: WriteFileOptions) => Effect.Effect<void, PlatformError.PlatformError>;
39
- readonly writeFileString: (path: string, data: string, options?: WriteFileStringOptions) => Effect.Effect<void, PlatformError.PlatformError>;
40
- }
41
- export declare const FileSystem: Context.Tag<FileSystem, FileSystem>;
42
- export type Size = Brand.Branded<bigint, "Size">;
43
- export type SizeInput = bigint | number | Size;
44
- export declare const Size: (bytes: SizeInput) => Size;
45
- export type OpenFlag = "r" | "r+" | "w" | "wx" | "w+" | "wx+" | "a" | "ax" | "a+" | "ax+";
46
- export type SeekMode = "start" | "current";
47
- export interface AccessFileOptions {
48
- readonly ok?: boolean;
49
- readonly readable?: boolean;
50
- readonly writable?: boolean;
51
- }
52
- export interface MakeDirectoryOptions {
53
- readonly recursive?: boolean;
54
- readonly mode?: number;
55
- }
56
- export interface CopyOptions {
57
- readonly overwrite?: boolean;
58
- readonly preserveTimestamps?: boolean;
59
- }
60
- export interface MakeTempDirectoryOptions {
61
- readonly directory?: string;
62
- readonly prefix?: string;
63
- }
64
- export interface MakeTempFileOptions {
65
- readonly directory?: string;
66
- readonly prefix?: string;
67
- readonly suffix?: string;
68
- }
69
- export interface OpenFileOptions {
70
- readonly flag?: OpenFlag;
71
- readonly mode?: number;
72
- }
73
- export interface ReadDirectoryOptions {
74
- readonly recursive?: boolean;
75
- }
76
- export interface RemoveOptions {
77
- readonly recursive?: boolean;
78
- readonly force?: boolean;
79
- }
80
- export interface SinkOptions extends OpenFileOptions {
81
- }
82
- export interface StreamOptions {
83
- readonly bufferSize?: number;
84
- readonly bytesToRead?: SizeInput;
85
- readonly chunkSize?: SizeInput;
86
- readonly offset?: SizeInput;
87
- }
88
- export interface WriteFileOptions {
89
- readonly flag?: OpenFlag;
90
- readonly mode?: number;
91
- }
92
- export interface WriteFileStringOptions {
93
- readonly flag?: OpenFlag;
94
- readonly mode?: number;
95
- }
96
- export interface WatchOptions {
97
- readonly recursive?: boolean;
98
- }
99
- export declare const FileTypeId: unique symbol;
100
- export type FileTypeId = typeof FileTypeId;
101
- export interface File {
102
- readonly [FileTypeId]: FileTypeId;
103
- readonly fd: File.Descriptor;
104
- readonly stat: Effect.Effect<File.Info, PlatformError.PlatformError>;
105
- readonly seek: (offset: SizeInput, from: SeekMode) => Effect.Effect<void>;
106
- readonly sync: Effect.Effect<void, PlatformError.PlatformError>;
107
- readonly read: (buffer: Uint8Array) => Effect.Effect<Size, PlatformError.PlatformError>;
108
- readonly readAlloc: (size: SizeInput) => Effect.Effect<Option.Option<Uint8Array>, PlatformError.PlatformError>;
109
- readonly truncate: (length?: SizeInput) => Effect.Effect<void, PlatformError.PlatformError>;
110
- readonly write: (buffer: Uint8Array) => Effect.Effect<Size, PlatformError.PlatformError>;
111
- readonly writeAll: (buffer: Uint8Array) => Effect.Effect<void, PlatformError.PlatformError>;
112
- }
113
- export declare namespace File {
114
- type Descriptor = Brand.Branded<number, "FileDescriptor">;
115
- type Type = "File" | "Directory" | "SymbolicLink" | "BlockDevice" | "CharacterDevice" | "FIFO" | "Socket" | "Unknown";
116
- interface Info {
117
- readonly type: Type;
118
- readonly mtime: Option.Option<Date>;
119
- readonly atime: Option.Option<Date>;
120
- readonly birthtime: Option.Option<Date>;
121
- readonly dev: number;
122
- readonly ino: Option.Option<number>;
123
- readonly mode: number;
124
- readonly nlink: Option.Option<number>;
125
- readonly uid: Option.Option<number>;
126
- readonly gid: Option.Option<number>;
127
- readonly rdev: Option.Option<number>;
128
- readonly size: Size;
129
- readonly blksize: Option.Option<Size>;
130
- readonly blocks: Option.Option<number>;
131
- }
132
- }
133
- export declare const FileDescriptor: Brand.Brand.Constructor<File.Descriptor>;
134
- export type WatchEvent = WatchEvent.Create | WatchEvent.Update | WatchEvent.Remove;
135
- export declare namespace WatchEvent {
136
- interface Create {
137
- readonly _tag: "Create";
138
- readonly path: string;
139
- }
140
- interface Update {
141
- readonly _tag: "Update";
142
- readonly path: string;
143
- }
144
- interface Remove {
145
- readonly _tag: "Remove";
146
- readonly path: string;
147
- }
148
- }
149
- export declare const WatchEventCreate: Data.Case.Constructor<WatchEvent.Create, "_tag">;
150
- export declare const WatchEventUpdate: Data.Case.Constructor<WatchEvent.Update, "_tag">;
151
- export declare const WatchEventRemove: Data.Case.Constructor<WatchEvent.Remove, "_tag">;
152
- declare const WatchBackend_base: Context.TagClass<WatchBackend, "@effect/platform/FileSystem/WatchBackend", {
153
- readonly register: (path: string, stat: File.Info, options?: WatchOptions) => Option.Option<Stream.Stream<WatchEvent, PlatformError.PlatformError>>;
154
- }>;
155
- export declare class WatchBackend extends WatchBackend_base {
156
- }
157
- export declare const make: (impl: Omit<FileSystem, "exists" | "readFileString" | "stream" | "sink" | "writeFileString">) => FileSystem;
158
- export {};
@@ -1,70 +0,0 @@
1
- /*
2
- * Adapted from @effect/platform
3
- */
4
- import * as Brand from "effect/Brand";
5
- import * as Channel from "effect/Channel";
6
- import * as Chunk from "effect/Chunk";
7
- import * as Context from "effect/Context";
8
- import * as Data from "effect/Data";
9
- import * as Effect from "effect/Effect";
10
- import * as Function from "effect/Function";
11
- import * as Option from "effect/Option";
12
- import * as Sink from "effect/Sink";
13
- import * as Stream from "effect/Stream";
14
- import * as PlatformError from "./PlatformError.js";
15
- export const FileSystem = Context.GenericTag("@effect/platform/FileSystem");
16
- export const Size = (bytes) => typeof bytes === "bigint" ? bytes : BigInt(bytes);
17
- export const FileTypeId = Symbol.for("@effect/platform/FileSystem/File");
18
- export const FileDescriptor = Brand.nominal();
19
- export const WatchEventCreate = Data.tagged("Create");
20
- export const WatchEventUpdate = Data.tagged("Update");
21
- export const WatchEventRemove = Data.tagged("Remove");
22
- export class WatchBackend extends Context.Tag("@effect/platform/FileSystem/WatchBackend")() {
23
- }
24
- export const make = (impl) => {
25
- return FileSystem.of({
26
- ...impl,
27
- exists: (path) => Function.pipe(impl.access(path), Effect.as(true), Effect.catchTag("SystemError", (e) => e.reason === "NotFound" ? Effect.succeed(false) : Effect.fail(e))),
28
- readFileString: (path, encoding) => Effect.tryMap(impl.readFile(path), {
29
- try: (_) => new TextDecoder(encoding).decode(_),
30
- catch: (cause) => new PlatformError.BadArgument({
31
- module: "FileSystem",
32
- method: "readFileString",
33
- description: "invalid encoding",
34
- cause,
35
- }),
36
- }),
37
- stream: (path, options) => Function.pipe(impl.open(path, { flag: "r" }), options?.offset
38
- ? Effect.tap((file) => file.seek(options.offset, "start"))
39
- : Function.identity, Effect.map((file) => fileStream(file, options)), Stream.unwrapScoped),
40
- sink: (path, options) => Function.pipe(impl.open(path, { flag: "w", ...options }), Effect.map((file) => Sink.forEach((_) => file.writeAll(_))), Sink.unwrapScoped),
41
- writeFileString: (path, data, options) => Effect.flatMap(Effect.try({
42
- try: () => new TextEncoder().encode(data),
43
- catch: (cause) => new PlatformError.BadArgument({
44
- module: "FileSystem",
45
- method: "writeFileString",
46
- description: "could not encode string",
47
- cause,
48
- }),
49
- }), (_) => impl.writeFile(path, _, options)),
50
- });
51
- };
52
- const fileStream = (file, { bufferSize = 16, bytesToRead: bytesToRead_, chunkSize: chunkSize_ = Size(64 * 1024), } = {}) => {
53
- const bytesToRead = bytesToRead_ !== undefined ? Size(bytesToRead_) : undefined;
54
- const chunkSize = Size(chunkSize_);
55
- function loop(totalBytesRead) {
56
- if (bytesToRead !== undefined && bytesToRead <= totalBytesRead) {
57
- return Channel.void;
58
- }
59
- const toRead = bytesToRead !== undefined && bytesToRead - totalBytesRead < chunkSize
60
- ? bytesToRead - totalBytesRead
61
- : chunkSize;
62
- return Channel.flatMap(file.readAlloc(toRead), Option.match({
63
- onNone: () => Channel.void,
64
- onSome: (buf) => Channel.flatMap(Channel.write(Chunk.of(buf)), () => loop(totalBytesRead + BigInt(buf.length))),
65
- }));
66
- }
67
- return Stream.bufferChunks(Stream.fromChannel(loop(BigInt(0))), {
68
- capacity: bufferSize,
69
- });
70
- };
package/dist/Http.d.ts DELETED
@@ -1,37 +0,0 @@
1
- export type Method = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS";
2
- type Respondable = Response | Promise<Response>;
3
- export type WebHandler = (request: Request) => Respondable;
4
- export type WebMiddleware = (request: Request, next: WebHandler) => Respondable;
5
- export declare function fetch(handler: WebHandler, init: Omit<RequestInit, "body"> & ({
6
- url: string;
7
- } | {
8
- path: `/${string}`;
9
- }) & {
10
- body?: RequestInit["body"] | Record<string, unknown>;
11
- }): Promise<Response>;
12
- export declare function createAbortableRequest(init: Omit<RequestInit, "signal"> & ({
13
- url: string;
14
- } | {
15
- path: `/${string}`;
16
- })): {
17
- request: Request;
18
- abort: () => void;
19
- };
20
- export declare function mapHeaders(headers: Headers): Record<string, string | undefined>;
21
- export declare function parseCookies(cookieHeader: string | null): Record<string, string | undefined>;
22
- export declare function mapUrlSearchParams(params: URLSearchParams): Record<string, string | ReadonlyArray<string> | undefined>;
23
- export interface FilePart {
24
- readonly _tag: "File";
25
- readonly key: string;
26
- readonly name: string;
27
- readonly contentType: string;
28
- readonly content: Uint8Array;
29
- }
30
- export interface FieldPart {
31
- readonly _tag: "Field";
32
- readonly key: string;
33
- readonly value: string;
34
- }
35
- export type MultipartPart = FilePart | FieldPart;
36
- export declare function parseFormData(request: Request): Promise<Record<string, ReadonlyArray<FilePart> | ReadonlyArray<string> | string>>;
37
- export {};
package/dist/Http.js DELETED
@@ -1,88 +0,0 @@
1
- import * as Values from "./Values.js";
2
- export function fetch(handler, init) {
3
- const url = "path" in init ? `http://localhost${init.path}` : init.url;
4
- const isPlain = Values.isPlainObject(init.body);
5
- const headers = new Headers(init.headers);
6
- if (isPlain && !headers.has("Content-Type")) {
7
- headers.set("Content-Type", "application/json");
8
- }
9
- const body = isPlain ? JSON.stringify(init.body) : init.body;
10
- const request = new Request(url, {
11
- ...init,
12
- headers,
13
- body: body,
14
- });
15
- return Promise.resolve(handler(request));
16
- }
17
- export function createAbortableRequest(init) {
18
- const url = "path" in init ? `http://localhost${init.path}` : init.url;
19
- const controller = new AbortController();
20
- const request = new Request(url, { ...init, signal: controller.signal });
21
- return { request, abort: () => controller.abort() };
22
- }
23
- export function mapHeaders(headers) {
24
- const result = {};
25
- headers.forEach((value, key) => {
26
- result[key.toLowerCase()] = value;
27
- });
28
- return result;
29
- }
30
- export function parseCookies(cookieHeader) {
31
- if (!cookieHeader)
32
- return {};
33
- const result = {};
34
- for (const part of cookieHeader.split(";")) {
35
- const idx = part.indexOf("=");
36
- if (idx === -1) {
37
- // Cookie without value (e.g., "name" or just whitespace)
38
- const key = part.trim();
39
- if (key) {
40
- result[key] = undefined;
41
- }
42
- }
43
- else {
44
- const key = part.slice(0, idx).trim();
45
- const value = part.slice(idx + 1).trim();
46
- if (key) {
47
- result[key] = value;
48
- }
49
- }
50
- }
51
- return result;
52
- }
53
- export function mapUrlSearchParams(params) {
54
- const result = {};
55
- for (const key of new Set(params.keys())) {
56
- const values = params.getAll(key);
57
- result[key] = values.length === 1 ? values[0] : values;
58
- }
59
- return result;
60
- }
61
- export async function parseFormData(request) {
62
- const formData = await request.formData();
63
- const result = {};
64
- for (const key of new Set(formData.keys())) {
65
- const values = formData.getAll(key);
66
- const first = values[0];
67
- if (typeof first === "string") {
68
- result[key] = values.length === 1 ? first : values;
69
- }
70
- else {
71
- const files = [];
72
- for (const value of values) {
73
- if (typeof value !== "string") {
74
- const content = new Uint8Array(await value.arrayBuffer());
75
- files.push({
76
- _tag: "File",
77
- key,
78
- name: value.name,
79
- contentType: value.type || "application/octet-stream",
80
- content,
81
- });
82
- }
83
- }
84
- result[key] = files;
85
- }
86
- }
87
- return result;
88
- }
@@ -1,7 +0,0 @@
1
- import { HttpServerRequest, HttpServerResponse } from "@effect/platform";
2
- import * as HttpApp from "@effect/platform/HttpApp";
3
- import { RouteNotFound } from "@effect/platform/HttpServerError";
4
- import { Effect } from "effect";
5
- export declare const renderError: (error: unknown, accept?: string) => Effect.Effect<HttpServerResponse.HttpServerResponse, never, HttpServerRequest.HttpServerRequest>;
6
- export declare function handleErrors<E, R>(app: HttpApp.Default<E, R>): HttpApp.Default<Exclude<E, RouteNotFound>, R | HttpServerRequest.HttpServerRequest>;
7
- export declare const withErrorHandled: <E, R>(app: HttpApp.Default<E, R>) => Effect.Effect<HttpServerResponse.HttpServerResponse, never, HttpServerRequest.HttpServerRequest | R>;
@@ -1,320 +0,0 @@
1
- import { HttpServerRequest, HttpServerResponse, } from "@effect/platform";
2
- import * as HttpMiddleware from "@effect/platform/HttpMiddleware";
3
- import { Cause, Effect, Option, ParseResult, Record, } from "effect";
4
- /**
5
- * Groups: function, path
6
- */
7
- const StackLinePattern = /^at (.*?) \((.*?)\)/;
8
- const ERROR_PAGE_CSS = `
9
- :root {
10
- --error-red: #c00;
11
- --error-red-dark: #a00;
12
- --bg-error: #fee;
13
- --bg-light: #f5f5f5;
14
- --bg-white: #fff;
15
- --border-color: #ddd;
16
- --text-dark: #333;
17
- --text-gray: #666;
18
- --text-mono: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
19
- }
20
-
21
- * { box-sizing: border-box; }
22
-
23
- body {
24
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
25
- margin: 0;
26
- padding: 0;
27
- color: var(--text-dark);
28
- line-height: 1.6;
29
- min-height: 100dvh;
30
- }
31
-
32
- .error-page { width: 100%; margin: 0; }
33
-
34
- .error-header {
35
- background: var(--error-red);
36
- color: white;
37
- padding: 2rem 2.5rem;
38
- margin: 0;
39
- font-family: var(--text-mono);
40
- }
41
-
42
- .error-header h1 {
43
- margin: 0 0 0.5rem 0;
44
- font-size: 2rem;
45
- font-weight: 600;
46
- font-family: var(--text-mono);
47
- }
48
-
49
- .error-message {
50
- margin: 0;
51
- font-size: 1.1rem;
52
- opacity: 0.95;
53
- font-family: var(--text-mono);
54
- }
55
-
56
- .error-content {
57
- background: var(--bg-white);
58
- padding: 2rem 2.5rem;
59
- }
60
-
61
- .stack-trace {
62
- margin: 1.5rem 0;
63
- border: 1px solid var(--border-color);
64
- border-radius: 4px;
65
- overflow: hidden;
66
- }
67
-
68
- .stack-trace-header {
69
- font-weight: 600;
70
- padding: 0.75rem 1rem;
71
- background: var(--bg-light);
72
- border-bottom: 1px solid var(--border-color);
73
- }
74
-
75
- .stack-list {
76
- list-style: none;
77
- padding: 0;
78
- margin: 0;
79
- max-height: 400px;
80
- overflow-y: auto;
81
- }
82
-
83
- .stack-list li {
84
- padding: 0.5rem 1rem;
85
- font-family: var(--text-mono);
86
- font-size: 0.875rem;
87
- border-bottom: 1px solid var(--border-color);
88
- background: var(--bg-white);
89
- }
90
-
91
- .stack-list li:last-child { border-bottom: none; }
92
-
93
- .stack-list li:hover { background: #fafafa; }
94
-
95
- .stack-list code {
96
- background: transparent;
97
- padding: 0;
98
- font-weight: 600;
99
- color: var(--error-red-dark);
100
- }
101
-
102
- .stack-list .path { color: var(--text-gray); margin-left: 0.5rem; }
103
-
104
- .request-info {
105
- margin: 1.5rem 0;
106
- border: 1px solid var(--border-color);
107
- border-radius: 4px;
108
- overflow: hidden;
109
- }
110
-
111
- .request-info-header {
112
- font-weight: 700;
113
- padding: 0.75rem 1rem;
114
- background: var(--bg-light);
115
- border-bottom: 1px solid var(--border-color);
116
- }
117
-
118
- .request-info-content {
119
- padding: 1rem;
120
- font-family: var(--text-mono);
121
- font-size: 0.875rem;
122
- white-space: pre-wrap;
123
- word-break: break-all;
124
- }
125
-
126
- @media (max-width: 768px) {
127
- .error-header, .error-content { padding: 1.5rem 1rem; }
128
- .error-header h1 { font-size: 1.5rem; }
129
- }
130
- `;
131
- function errorHtml(data) {
132
- let detailsHtml = "";
133
- if (data.details) {
134
- const detailsObj = data.details;
135
- if ("stack" in detailsObj && Array.isArray(detailsObj.stack)) {
136
- const stackFrames = detailsObj.stack;
137
- detailsHtml = renderStackTrace(stackFrames);
138
- }
139
- }
140
- const requestHtml = data.requestContext
141
- ? renderRequestContext(data.requestContext)
142
- : "";
143
- const messageHtml = data.message
144
- ? `<p class="error-message">${escapeHtml(data.message)}</p>`
145
- : "";
146
- const headerTitle = data.errorName ?? "UnexpectedError";
147
- const html = `<!DOCTYPE html>
148
- <html lang="en">
149
- <head>
150
- <meta charset="UTF-8">
151
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
152
- <title>${headerTitle} - Error ${data.status}</title>
153
- <style>${ERROR_PAGE_CSS}</style>
154
- </head>
155
- <body>
156
- <div class="error-header">
157
- <h1>${escapeHtml(headerTitle)}</h1>
158
- ${messageHtml}
159
- </div>
160
- <div class="error-content">
161
- ${detailsHtml}
162
- ${requestHtml}
163
- </div>
164
- </body>
165
- </html>`;
166
- return HttpServerResponse.text(html, {
167
- status: data.status,
168
- contentType: "text/html",
169
- });
170
- }
171
- function errorText(status, tag, details) {
172
- const text = details ? `${tag}\n${JSON.stringify(details, null, 2)}` : tag;
173
- return HttpServerResponse.text(text, { status });
174
- }
175
- function respondWithError(accept, status, tag, message, details, requestContext, errorName) {
176
- if (accept.includes("text/html")) {
177
- return errorHtml({
178
- status,
179
- tag,
180
- message,
181
- details,
182
- requestContext,
183
- errorName,
184
- });
185
- }
186
- if (accept.includes("text/plain")) {
187
- return errorText(status, tag, details);
188
- }
189
- return HttpServerResponse.unsafeJson({ error: { _tag: tag, ...details } }, { status });
190
- }
191
- export const renderError = (error, accept = "") => Effect.gen(function* () {
192
- const request = yield* HttpServerRequest.HttpServerRequest;
193
- const requestContext = {
194
- url: request.url,
195
- method: request.method,
196
- headers: filterSensitiveHeaders(request.headers),
197
- };
198
- let unwrappedError;
199
- if (Cause.isCause(error)) {
200
- const failure = Cause.failureOption(error).pipe(Option.getOrUndefined);
201
- if (failure?.["_tag"]) {
202
- unwrappedError = failure;
203
- }
204
- yield* Effect.logError(error);
205
- }
206
- switch (unwrappedError?._tag) {
207
- case "RouteNotFound":
208
- return respondWithError(accept, 404, "RouteNotFound", "The page you were looking for doesn't exist", undefined, requestContext);
209
- case "RequestError": {
210
- const message = unwrappedError.reason === "Decode"
211
- ? "Request body is invalid"
212
- : "Request could not be processed";
213
- return respondWithError(accept, 400, "RequestError", message, {
214
- reason: unwrappedError.reason,
215
- }, requestContext);
216
- }
217
- case "ParseError": {
218
- const issues = yield* ParseResult.ArrayFormatter.formatIssue(unwrappedError.issue);
219
- const cleanIssues = issues.map((v) => Record.remove(v, "_tag"));
220
- return respondWithError(accept, 400, "ParseError", "Validation failed", {
221
- issues: cleanIssues,
222
- }, requestContext);
223
- }
224
- }
225
- if (Cause.isCause(error)) {
226
- const defects = [...Cause.defects(error)];
227
- const defect = defects[0];
228
- if (defect instanceof Error) {
229
- const stackFrames = extractPrettyStack(defect.stack ?? "");
230
- return respondWithError(accept, 500, "UnexpectedError", defect.message, {
231
- name: defect.name,
232
- stack: stackFrames,
233
- }, requestContext, defect.name);
234
- }
235
- }
236
- return respondWithError(accept, 500, "UnexpectedError", "An unexpected error occurred", undefined, requestContext, "UnexpectedError");
237
- });
238
- function parseStackFrame(line) {
239
- const match = line.trim().match(StackLinePattern);
240
- if (!match)
241
- return null;
242
- const [_, fn, fullPath] = match;
243
- const relativePath = fullPath.replace(process.cwd(), ".");
244
- let type;
245
- if (relativePath.includes("node_modules")) {
246
- type = "node_modules";
247
- }
248
- else if (relativePath.startsWith("./src")
249
- || relativePath.startsWith("./examples")) {
250
- type = "application";
251
- }
252
- else {
253
- type = "framework";
254
- }
255
- return {
256
- function: fn,
257
- file: relativePath,
258
- type,
259
- };
260
- }
261
- function extractPrettyStack(stack) {
262
- return stack
263
- .split("\n")
264
- .slice(1)
265
- .map(parseStackFrame)
266
- .filter((frame) => frame !== null);
267
- }
268
- function renderStackFrames(frames) {
269
- if (frames.length === 0) {
270
- return "<li>No stack frames</li>";
271
- }
272
- return frames
273
- .map((f) => `<li><code>${f.function}</code> at <span class="path">${f.file}</span></li>`)
274
- .join("");
275
- }
276
- function renderStackTrace(frames) {
277
- return `
278
- <div class="stack-trace">
279
- <div class="stack-trace-header">Stack Trace (${frames.length})</div>
280
- <ul class="stack-list">${renderStackFrames(frames)}</ul>
281
- </div>
282
- `;
283
- }
284
- function escapeHtml(unsafe) {
285
- return unsafe
286
- .replace(/&/g, "&amp;")
287
- .replace(/</g, "&lt;")
288
- .replace(/>/g, "&gt;")
289
- .replace(/"/g, "&quot;")
290
- .replace(/'/g, "&#039;");
291
- }
292
- function filterSensitiveHeaders(headers) {
293
- const sensitive = ["authorization", "cookie", "x-api-key"];
294
- return Object.fromEntries(Object.entries(headers).filter(([key]) => !sensitive.includes(key.toLowerCase())));
295
- }
296
- function renderRequestContext(context) {
297
- const headersText = Object
298
- .entries(context.headers)
299
- .map(([key, value]) => `${key}: ${value}`)
300
- .join("\n");
301
- const requestText = `${context.method} ${context.url}\n${headersText}`;
302
- return `
303
- <div class="request-info">
304
- <div class="request-info-header">Request</div>
305
- <div class="request-info-content">${escapeHtml(requestText)}</div>
306
- </div>
307
- `;
308
- }
309
- export function handleErrors(app) {
310
- return Effect.gen(function* () {
311
- const request = yield* HttpServerRequest.HttpServerRequest;
312
- const accept = request.headers.accept ?? "";
313
- return yield* app.pipe(Effect.catchAllCause((cause) => renderError(cause, accept)));
314
- });
315
- }
316
- export const withErrorHandled = HttpMiddleware.make(app => Effect.gen(function* () {
317
- const request = yield* HttpServerRequest.HttpServerRequest;
318
- const accept = request.headers.accept ?? "";
319
- return yield* app.pipe(Effect.catchAllCause((cause) => renderError(cause, accept)));
320
- }));
@@ -1,3 +0,0 @@
1
- import * as HttpServerRequest from "@effect/platform/HttpServerRequest";
2
- export type FetchHandler = (request: Request) => Promise<Response>;
3
- export declare function makeUrlFromRequest(request: HttpServerRequest.HttpServerRequest): URL;