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
@@ -1,157 +1,285 @@
1
- import * as Socket from "../Socket.js";
2
- import * as Config from "effect/Config";
3
- import * as Context from "effect/Context";
4
- import * as Deferred from "effect/Deferred";
5
- import * as Effect from "effect/Effect";
6
- import * as Exit from "effect/Exit";
7
- import * as Layer from "effect/Layer";
8
- import * as Option from "effect/Option";
9
- import * as Runtime from "effect/Runtime";
10
- import * as NOs from "node:os";
11
- import * as NPath from "node:path";
12
- import * as PathPattern from "../PathPattern.js";
13
- import * as PlataformRuntime from "../PlatformRuntime.js";
14
- import * as Route from "../Route.js";
15
- import * as RouteHttp from "../RouteHttp.js";
16
- import * as RouteTree from "../RouteTree.js";
17
- import * as BunRoute from "./BunRoute.js";
18
- export const BunServer = Context.GenericTag("effect-start/BunServer");
19
- export const make = (options) => Effect.gen(function* () {
20
- const routes = yield* Effect.serviceOption(Route.Routes).pipe(Effect.andThen(Option.getOrUndefined));
21
- const port = yield* Config.number("PORT").pipe(Effect.catchTag("ConfigError", () => {
1
+ import * as Socket from "../Socket.js"
2
+ import * as Bun from "bun"
3
+ import * as Config from "effect/Config"
4
+ import * as Context from "effect/Context"
5
+ import * as Deferred from "effect/Deferred"
6
+ import * as Effect from "effect/Effect"
7
+ import * as Exit from "effect/Exit"
8
+ import * as Layer from "effect/Layer"
9
+ import * as Option from "effect/Option"
10
+ import * as Runtime from "effect/Runtime"
11
+ import * as NOs from "node:os"
12
+ import * as NPath from "node:path"
13
+ import * as PathPattern from "../PathPattern.js"
14
+ import * as PlataformRuntime from "../PlatformRuntime.js"
15
+ import * as Route from "../Route.js"
16
+ import * as RouteHttp from "../RouteHttp.js"
17
+ import * as StartApp from "../StartApp.js"
18
+ import * as RouteTree from "../RouteTree.js"
19
+ import * as BunRoute from "./BunRoute.js"
20
+
21
+ /**
22
+ * Basically `Omit<Bun.Serve.Options, "fetch" | "error" | "websocket">`
23
+ * TypeScript 5.9 cannot verify discriminated union types used in
24
+ * {@link Bun.serve} so we need to define them explicitly.
25
+ */
26
+
27
+ export const BunServer = Context.GenericTag("effect-start/BunServer")
28
+
29
+ export const make = (
30
+ options,
31
+ tree,
32
+ ) =>
33
+ Effect.gen(function* () {
34
+ const port = yield* Config.number("PORT").pipe(
35
+ Effect.catchTag("ConfigError", () => {
22
36
  return PlataformRuntime.isAgentHarness()
23
- ? Effect.succeed(0) // random port
24
- : Effect.succeed(3000);
25
- }));
26
- const hostFlag = process.argv.includes("--host");
27
- const hostname = yield* Config.string("HOSTNAME").pipe(Effect.catchTag("ConfigError", () => Effect.succeed(hostFlag ? "0.0.0.0" : undefined)));
37
+ ? Effect.succeed(0) // random port
38
+ : Effect.succeed(3000)
39
+ }),
40
+ )
41
+ const hostFlag = process.argv.includes("--host")
42
+ const hostname = yield* Config.string("HOST").pipe(
43
+ Effect.catchTag("ConfigError", () => Effect.succeed(hostFlag ? "0.0.0.0" : undefined)),
44
+ )
45
+
28
46
  const handlerStack = [
29
- function (_request, _server) {
30
- return new Response("not found", { status: 404 });
31
- },
32
- ];
47
+ function (_request, _server) {
48
+ return new Response("not found", { status: 404 })
49
+ },
50
+ ]
51
+
33
52
  const service = BunServer.of({
34
- // During the construction we need to create a service imlpementation
35
- // first so we can provide it in the runtime that will be used in web
36
- // handlers. After we create the runtime, we set it below so it's always
37
- // available at runtime.
38
- // An alternative approach would be to use Bun.Server.reload but I prefer
39
- // to avoid it since it's badly documented and has bunch of bugs.
40
- server: undefined,
41
- pushHandler(fetch) {
42
- handlerStack.push(fetch);
43
- reload();
44
- },
45
- popHandler() {
46
- handlerStack.pop();
47
- reload();
48
- },
49
- });
50
- const runtime = yield* Effect.runtime().pipe(Effect.andThen(Runtime.provideService(BunServer, service)));
51
- let currentRoutes = routes ? yield* walkBunRoutes(runtime, routes) : {};
53
+ // During the construction we need to create a service imlpementation
54
+ // first so we can provide it in the runtime that will be used in web
55
+ // handlers. After we create the runtime, we set it below so it's always
56
+ // available at runtime.
57
+ // An alternative approach would be to use Bun.Server.reload but I prefer
58
+ // to avoid it since it's badly documented and has bunch of bugs.
59
+ server: undefined,
60
+ pushHandler(fetch) {
61
+ handlerStack.push(fetch)
62
+ reload()
63
+ },
64
+ popHandler() {
65
+ handlerStack.pop()
66
+ reload()
67
+ },
68
+ })
69
+
70
+ const runtime = yield* Effect.runtime().pipe(
71
+ Effect.andThen(Runtime.provideService(BunServer, service)),
72
+ )
73
+
74
+ let currentRoutes = tree ? yield* walkBunRoutes(runtime, tree) : {}
75
+
52
76
  const websocket = {
53
- open(ws) {
54
- Deferred.unsafeDone(ws.data.deferred, Exit.succeed(ws));
55
- },
56
- message(ws, message) {
57
- ws.data.run(message);
58
- },
59
- close(ws, code, closeReason) {
60
- Deferred.unsafeDone(ws.data.closeDeferred, Socket.defaultCloseCodeIsError(code)
61
- ? Exit.fail(new Socket.SocketCloseError({
62
- reason: "Close",
63
- code,
64
- closeReason,
65
- }))
66
- : Exit.void);
67
- },
68
- };
69
- const server = Bun?.serve({
70
- port,
71
- hostname,
72
- ...options,
73
- routes: currentRoutes,
74
- fetch: handlerStack[0],
75
- websocket,
76
- });
77
+ open(ws) {
78
+ Deferred.unsafeDone(ws.data.deferred, Exit.succeed(ws))
79
+ },
80
+ message(ws, message) {
81
+ ws.data.run(message)
82
+ },
83
+ close(ws, code, closeReason) {
84
+ Deferred.unsafeDone(
85
+ ws.data.closeDeferred,
86
+ Socket.defaultCloseCodeIsError(code)
87
+ ? Exit.fail(
88
+ new Socket.SocketCloseError({
89
+ reason: "Close",
90
+ code,
91
+ closeReason,
92
+ }),
93
+ )
94
+ : Exit.void,
95
+ )
96
+ },
97
+ }
98
+
99
+ const server = Bun.serve({
100
+ port,
101
+ hostname,
102
+ ...options,
103
+ routes: currentRoutes,
104
+ fetch: handlerStack[0],
105
+ websocket,
106
+ })
107
+
77
108
  // @ts-expect-error
78
- service.server = server;
79
- yield* Effect.addFinalizer(() => Effect.sync(() => {
80
- server.stop();
81
- }));
109
+ service.server = server
110
+
111
+ yield* Effect.addFinalizer(() =>
112
+ Effect.sync(() => {
113
+ server.stop()
114
+ }),
115
+ )
116
+
82
117
  const reload = () => {
83
- server.reload({
84
- fetch: handlerStack[handlerStack.length - 1],
85
- routes: currentRoutes,
86
- websocket,
87
- });
88
- };
118
+ server.reload({
119
+ fetch: handlerStack[handlerStack.length - 1],
120
+ routes: currentRoutes,
121
+ websocket,
122
+ })
123
+ }
124
+
89
125
  const bunServer = BunServer.of({
90
- server,
91
- pushHandler(fetch) {
92
- handlerStack.push(fetch);
93
- reload();
94
- },
95
- popHandler() {
96
- handlerStack.pop();
97
- reload();
98
- },
99
- });
100
- return bunServer;
101
- });
126
+ server,
127
+ pushHandler(fetch) {
128
+ handlerStack.push(fetch)
129
+ reload()
130
+ },
131
+ popHandler() {
132
+ handlerStack.pop()
133
+ reload()
134
+ },
135
+ })
136
+
137
+ return bunServer
138
+ })
139
+
102
140
  /**
103
141
  * Provides HttpServer using BunServer under the hood.
104
142
  */
105
- export const layer = (options) => Layer.scoped(BunServer, make(options ?? {}));
106
- export const withLogAddress = (layer) => Layer.effectDiscard(BunServer.pipe(Effect.andThen((server) => {
107
- const { hostname, port } = server.server;
108
- const addr = hostname === "0.0.0.0" ? getLocalIp() : "localhost";
109
- return Effect.log(`Listening on http://${addr}:${port}`);
110
- }))).pipe(Layer.provideMerge(layer));
143
+ export const layer = (options) =>
144
+ Layer.scoped(BunServer, make(options ?? {}))
145
+
146
+ export const layerRoutes = (
147
+ options,
148
+ ) =>
149
+ Layer.scoped(
150
+ BunServer,
151
+ Effect.gen(function* () {
152
+ const routes = yield* Route.Routes
153
+ return yield* make(options ?? {}, routes)
154
+ }),
155
+ )
156
+
157
+ /**
158
+ * Resolves the Bun server in one place for Start.serve so routes are available:
159
+ * 1) Reuse a user-provided BunServer when one already exists in context.
160
+ * 2) Otherwise create the server from Route.Routes when routes are available.
161
+ * 3) Otherwise create a fallback server with the default 404 handler.
162
+ */
163
+ export const layerStart = (
164
+ options,
165
+ ) =>
166
+ Layer.scoped(
167
+ BunServer,
168
+ Effect.gen(function* () {
169
+ const app = yield* StartApp.StartApp
170
+ const existing = yield* Effect.serviceOption(BunServer)
171
+ if (Option.isSome(existing)) {
172
+ yield* Deferred.succeed(app.server, existing.value)
173
+ return existing.value
174
+ }
175
+ const routes = yield* Effect.serviceOption(Route.Routes)
176
+ if (Option.isSome(routes)) {
177
+ const server = yield* make(options ?? {}, routes.value)
178
+ yield* Deferred.succeed(app.server, server)
179
+ return server
180
+ }
181
+ const server = yield* make(options ?? {})
182
+ yield* Deferred.succeed(app.server, server)
183
+ return server
184
+ }),
185
+ )
186
+
187
+ export const withLogAddress = (layer) =>
188
+ Layer.effectDiscard(
189
+ Effect.gen(function* () {
190
+ const { server } = yield* BunServer
191
+ const { hostname, port } = server
192
+ const addr = hostname === "0.0.0.0" ? getLocalIp() : "localhost"
193
+
194
+ yield* Effect.log(`Listening on http://${addr}:${port}`)
195
+ }),
196
+ ).pipe(Layer.provideMerge(layer))
197
+
111
198
  function walkBunRoutes(runtime, tree) {
112
- return Effect.gen(function* () {
113
- const bunRoutes = {};
114
- const pathGroups = new Map();
115
- const toWebHandler = RouteHttp.toWebHandlerRuntime(runtime);
116
- for (const route of RouteTree.walk(tree)) {
117
- const bunDescriptors = BunRoute.descriptors(route);
118
- if (bunDescriptors) {
119
- const htmlBundle = yield* Effect.promise(bunDescriptors.bunLoad);
120
- if (htmlBundle.files) {
121
- registerPrebuiltBundle(bunDescriptors.bunPrefix, htmlBundle, bunRoutes);
122
- }
123
- else {
124
- bunRoutes[`${bunDescriptors.bunPrefix}/*`] = htmlBundle;
125
- }
126
- }
127
- const path = Route.descriptor(route).path;
128
- const group = pathGroups.get(path) ?? [];
129
- group.push(route);
130
- pathGroups.set(path, group);
199
+ return Effect.gen(function* () {
200
+ const bunRoutes = {}
201
+ const pathGroups = new Map()
202
+ const toWebHandler = RouteHttp.toWebHandlerRuntime(runtime)
203
+
204
+ for (const route of RouteTree.walk(tree)) {
205
+ const bunDescriptors = BunRoute.descriptors(route)
206
+ if (bunDescriptors) {
207
+ const htmlBundle = yield* Effect.promise(bunDescriptors.bunLoad)
208
+ if (htmlBundle.files) {
209
+ registerPrebuiltBundle(bunDescriptors.bunPrefix, htmlBundle, bunRoutes)
210
+ } else {
211
+ bunRoutes[`${bunDescriptors.bunPrefix}/*`] = htmlBundle
131
212
  }
132
- for (const [path, routes] of pathGroups) {
133
- const handler = toWebHandler(routes);
134
- for (const bunPath of PathPattern.toBun(path)) {
135
- bunRoutes[bunPath] = handler;
136
- }
137
- }
138
- return bunRoutes;
139
- });
213
+ }
214
+
215
+ const path = Route.descriptor(route).path
216
+ const group = pathGroups.get(path) ?? []
217
+ group.push(route)
218
+ pathGroups.set(path, group)
219
+ }
220
+
221
+ for (const [path, routes] of pathGroups) {
222
+ const handler = toWebHandler(routes)
223
+ for (const bunPath of PathPattern.toBun(path)) {
224
+ bunRoutes[bunPath] = handler
225
+ }
226
+ }
227
+
228
+ return bunRoutes
229
+ })
140
230
  }
231
+
141
232
  function registerPrebuiltBundle(prefix, bundle, bunRoutes) {
142
- const mainDir = NPath.dirname(Bun.main);
143
- const indexPath = NPath.resolve(mainDir, bundle.index);
144
- bunRoutes[`${prefix}/*`] = () => new Response(Bun.file(indexPath), { headers: { "content-type": "text/html;charset=utf-8" } });
145
- for (const file of bundle.files ?? []) {
146
- if (file.loader === "html")
147
- continue;
148
- const absPath = NPath.resolve(mainDir, file.path);
149
- const basename = NPath.basename(file.path);
150
- bunRoutes[`/${basename}`] = () => new Response(Bun.file(absPath), { headers: file.headers ?? {} });
151
- }
233
+ const mainDir = NPath.dirname(Bun.main)
234
+ const indexPath = NPath.resolve(mainDir, bundle.index)
235
+
236
+ const htmlPromise = rewriteRelativeAssetPaths(Bun.file(indexPath).text())
237
+
238
+ bunRoutes[`${prefix}/*`] = async () =>
239
+ new Response(await htmlPromise, { headers: { "content-type": "text/html;charset=utf-8" } })
240
+
241
+ for (const file of bundle.files ?? []) {
242
+ if (file.loader === "html") continue
243
+ const absPath = NPath.resolve(mainDir, file.path)
244
+ const basename = NPath.basename(file.path)
245
+ bunRoutes[`/${basename}`] = () =>
246
+ new Response(Bun.file(absPath), { headers: file.headers ?? {} })
247
+ }
248
+ }
249
+
250
+ function rewriteRelativeAssetPaths(html) {
251
+ const rewriter = new HTMLRewriter()
252
+ .on("link[href]", {
253
+ element(el) {
254
+ const href = el.getAttribute("href")
255
+ if (href && isRelativePath(href)) {
256
+ el.setAttribute("href", "/" + assetBasename(href))
257
+ }
258
+ },
259
+ })
260
+ .on("script[src]", {
261
+ element(el) {
262
+ const src = el.getAttribute("src")
263
+ if (src && isRelativePath(src)) {
264
+ el.setAttribute("src", "/" + assetBasename(src))
265
+ }
266
+ },
267
+ })
268
+
269
+ return Promise.resolve(html).then((h) => rewriter.transform(new Response(h)).text())
270
+ }
271
+
272
+ function isRelativePath(path) {
273
+ return path.startsWith("./") || path.startsWith("../")
274
+ }
275
+
276
+ function assetBasename(path) {
277
+ const i = path.lastIndexOf("/")
278
+ return i === -1 ? path : path.slice(i + 1)
152
279
  }
280
+
153
281
  function getLocalIp() {
154
- return Object.values(NOs.networkInterfaces())
155
- .flatMap((addresses) => addresses ?? [])
156
- .find((addr) => addr.family === "IPv4" && !addr.internal)?.address;
282
+ return Object.values(NOs.networkInterfaces())
283
+ .flatMap((addresses) => addresses ?? [])
284
+ .find((addr) => addr.family === "IPv4" && !addr.internal)?.address
157
285
  }
@@ -1,40 +1,54 @@
1
+
2
+
1
3
  function loaderFromPath(path) {
2
- return path.slice(path.lastIndexOf(".") + 1);
4
+ return path.slice(path.lastIndexOf(".") + 1)
3
5
  }
6
+
4
7
  export function make(files) {
5
- return {
6
- name: "virtual-fs",
7
- setup(build) {
8
- build.onResolve({
9
- // change the filter so it only works for file namespace
10
- filter: /.*/,
11
- }, (args) => {
12
- const resolved = resolvePath(args.path, args.resolveDir);
13
- const resolvedFile = files[resolved];
14
- if (resolvedFile) {
15
- return {
16
- path: resolved,
17
- namespace: "virtual-fs",
18
- };
19
- }
20
- return;
21
- });
22
- build.onLoad({
23
- filter: /.*/,
24
- namespace: "virtual-fs",
25
- }, (args) => {
26
- const contents = files[args.path];
27
- if (!contents) {
28
- return undefined;
29
- }
30
- return {
31
- contents,
32
- loader: loaderFromPath(args.path),
33
- };
34
- });
8
+ return {
9
+ name: "virtual-fs",
10
+ setup(build) {
11
+ build.onResolve(
12
+ {
13
+ // change the filter so it only works for file namespace
14
+ filter: /.*/,
35
15
  },
36
- };
16
+ (args) => {
17
+ const resolved = resolvePath(args.path, args.resolveDir)
18
+ const resolvedFile = files[resolved]
19
+
20
+ if (resolvedFile) {
21
+ return {
22
+ path: resolved,
23
+ namespace: "virtual-fs",
24
+ }
25
+ }
26
+ return
27
+ },
28
+ )
29
+
30
+ build.onLoad(
31
+ {
32
+ filter: /.*/,
33
+ namespace: "virtual-fs",
34
+ },
35
+ (args) => {
36
+ const contents = files[args.path]
37
+
38
+ if (!contents) {
39
+ return undefined
40
+ }
41
+
42
+ return {
43
+ contents,
44
+ loader: loaderFromPath(args.path),
45
+ }
46
+ },
47
+ )
48
+ },
49
+ }
37
50
  }
51
+
38
52
  function resolvePath(path, base = process.cwd()) {
39
- return Bun.resolveSync(path, base);
53
+ return Bun.resolveSync(path, base)
40
54
  }