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
package/src/Start.ts CHANGED
@@ -64,28 +64,30 @@ export function pack<const Layers extends readonly [Layer.Layer.Any, ...Array<La
64
64
  return result as AnyLayer
65
65
  }
66
66
 
67
- export function serve<
68
- ROut,
69
- E,
70
- RIn extends
71
- | BunServer.BunServer
72
- | FileSystem.FileSystem
73
- | ChildProcess.ChildProcessSpawner
74
- | StartApp.StartApp,
75
- >(
67
+ export type PlatformServices =
68
+ | BunServer.BunServer
69
+ | FileSystem.FileSystem
70
+ | ChildProcess.ChildProcessSpawner
71
+ | StartApp.StartApp
72
+
73
+ export const Live: Layer.Layer<
74
+ Exclude<PlatformServices, BunServer.BunServer>,
75
+ never,
76
+ never
77
+ > = Layer.mergeAll(
78
+ NodeFileSystem.layer,
79
+ BunChildProcessSpawner.layer,
80
+ Layer.effect(
81
+ StartApp.StartApp,
82
+ Deferred.make<BunServer.BunServer>().pipe(Effect.map((server) => ({ server }))),
83
+ ),
84
+ )
85
+
86
+ export function serve<ROut, E, RIn extends PlatformServices>(
76
87
  load: () => Promise<{
77
88
  default: Layer.Layer<ROut, E, RIn>
78
89
  }>,
79
90
  ) {
80
- const startAppLayer = Layer.effect(
81
- StartApp.StartApp,
82
- Deferred.make<BunServer.BunServer>().pipe(
83
- Effect.map((server) => ({
84
- server,
85
- })),
86
- ),
87
- )
88
-
89
91
  const appLayer = Function.pipe(
90
92
  Effect.tryPromise(load),
91
93
  Effect.map((v) => v.default),
@@ -93,12 +95,7 @@ export function serve<
93
95
  Layer.unwrapEffect,
94
96
  )
95
97
 
96
- const appLayerResolved = Function.pipe(
97
- appLayer,
98
- Layer.provide(NodeFileSystem.layer),
99
- Layer.provide(BunChildProcessSpawner.layer),
100
- Layer.provideMerge(startAppLayer),
101
- )
98
+ const appLayerResolved = Function.pipe(appLayer, Layer.provideMerge(Live))
102
99
 
103
100
  const composed = Function.pipe(
104
101
  BunServer.layerStart(),
package/src/StartApp.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as Context from "effect/Context"
2
- import * as Deferred from "effect/Deferred"
2
+ import type * as Deferred from "effect/Deferred"
3
3
  import type * as BunServer from "./bun/BunServer.ts"
4
4
 
5
5
  export namespace StartApp {
@@ -66,7 +66,7 @@ export const make = (
66
66
  }),
67
67
  )
68
68
  const hostFlag = process.argv.includes("--host")
69
- const hostname = yield* Config.string("HOSTNAME").pipe(
69
+ const hostname = yield* Config.string("HOST").pipe(
70
70
  Effect.catchTag("ConfigError", () => Effect.succeed(hostFlag ? "0.0.0.0" : undefined)),
71
71
  )
72
72
 
@@ -213,14 +213,13 @@ export const layerStart = (
213
213
 
214
214
  export const withLogAddress = <A, E, R>(layer: Layer.Layer<A, E, R>) =>
215
215
  Layer.effectDiscard(
216
- BunServer.pipe(
217
- Effect.andThen((server) => {
218
- const { hostname, port } = server.server
219
- const addr = hostname === "0.0.0.0" ? getLocalIp() : "localhost"
216
+ Effect.gen(function* () {
217
+ const { server } = yield* BunServer
218
+ const { hostname, port } = server
219
+ const addr = hostname === "0.0.0.0" ? getLocalIp() : "localhost"
220
220
 
221
- return Effect.log(`Listening on http://${addr}:${port}`)
222
- }),
223
- ),
221
+ yield* Effect.log(`Listening on http://${addr}:${port}`)
222
+ }),
224
223
  ).pipe(Layer.provideMerge(layer))
225
224
 
226
225
  function walkBunRoutes(runtime: Runtime.Runtime<BunServer>, tree: RouteTree.RouteTree) {
@@ -261,8 +260,10 @@ function registerPrebuiltBundle(prefix: string, bundle: any, bunRoutes: BunRoute
261
260
  const mainDir = NPath.dirname(Bun.main)
262
261
  const indexPath = NPath.resolve(mainDir, bundle.index)
263
262
 
264
- bunRoutes[`${prefix}/*`] = () =>
265
- new Response(Bun.file(indexPath), { headers: { "content-type": "text/html;charset=utf-8" } })
263
+ const htmlPromise = rewriteRelativeAssetPaths(Bun.file(indexPath).text())
264
+
265
+ bunRoutes[`${prefix}/*`] = async () =>
266
+ new Response(await htmlPromise, { headers: { "content-type": "text/html;charset=utf-8" } })
266
267
 
267
268
  for (const file of bundle.files ?? []) {
268
269
  if (file.loader === "html") continue
@@ -273,6 +274,37 @@ function registerPrebuiltBundle(prefix: string, bundle: any, bunRoutes: BunRoute
273
274
  }
274
275
  }
275
276
 
277
+ function rewriteRelativeAssetPaths(html: string | Promise<string>): Promise<string> {
278
+ const rewriter = new HTMLRewriter()
279
+ .on("link[href]", {
280
+ element(el) {
281
+ const href = el.getAttribute("href")
282
+ if (href && isRelativePath(href)) {
283
+ el.setAttribute("href", "/" + assetBasename(href))
284
+ }
285
+ },
286
+ })
287
+ .on("script[src]", {
288
+ element(el) {
289
+ const src = el.getAttribute("src")
290
+ if (src && isRelativePath(src)) {
291
+ el.setAttribute("src", "/" + assetBasename(src))
292
+ }
293
+ },
294
+ })
295
+
296
+ return Promise.resolve(html).then((h) => rewriter.transform(new Response(h)).text())
297
+ }
298
+
299
+ function isRelativePath(path: string): boolean {
300
+ return path.startsWith("./") || path.startsWith("../")
301
+ }
302
+
303
+ function assetBasename(path: string): string {
304
+ const i = path.lastIndexOf("/")
305
+ return i === -1 ? path : path.slice(i + 1)
306
+ }
307
+
276
308
  function getLocalIp(): string | undefined {
277
309
  return Object.values(NOs.networkInterfaces())
278
310
  .flatMap((addresses) => addresses ?? [])
@@ -140,7 +140,6 @@ export function renderToString(
140
140
  if (!EMPTY_TAGS.includes(type)) {
141
141
  stack.push(`</${type}>`)
142
142
 
143
- // React-specific
144
143
  const html = props.dangerouslySetInnerHTML?.__html ?? props.innerHTML
145
144
 
146
145
  if (html) {
@@ -4,7 +4,7 @@ import * as FiberRef from "effect/FiberRef"
4
4
  import * as GlobalValue from "effect/GlobalValue"
5
5
  import * as Layer from "effect/Layer"
6
6
  import * as Option from "effect/Option"
7
- import * as Sql from "../../Sql.ts"
7
+ import * as Sql from "../Sql.ts"
8
8
 
9
9
  const errorCode = (error: unknown): string => {
10
10
  const e = error as any
@@ -0,0 +1 @@
1
+ export * as Sql from "./Sql.ts"
@@ -0,0 +1,173 @@
1
+ import * as Effect from "effect/Effect"
2
+ import * as Exit from "effect/Exit"
3
+ import * as FiberRef from "effect/FiberRef"
4
+ import * as GlobalValue from "effect/GlobalValue"
5
+ import * as Layer from "effect/Layer"
6
+ import * as Option from "effect/Option"
7
+ import type * as Libsql from "@libsql/client"
8
+ import * as Sql from "../Sql.ts"
9
+
10
+ export interface LibsqlConfig {
11
+ readonly url: string
12
+ readonly authToken?: string
13
+ readonly syncUrl?: string
14
+ readonly syncInterval?: number
15
+ readonly encryptionKey?: string
16
+ }
17
+
18
+ const wrapError = (error: unknown): Sql.SqlError =>
19
+ new Sql.SqlError({
20
+ code: (error as any)?.code ?? "UNKNOWN",
21
+ message: error instanceof Error ? error.message : String(error),
22
+ cause: error,
23
+ })
24
+
25
+ const wrap = <T>(fn: () => PromiseLike<T>): Effect.Effect<T, Sql.SqlError> =>
26
+ Effect.tryPromise({ try: () => Promise.resolve(fn()), catch: wrapError })
27
+
28
+ const makeValues: Sql.SqlQuery["values"] = (obj: any, ...columns: Array<string>) => {
29
+ const items = Array.isArray(obj) ? obj : [obj]
30
+ const cols = columns.length > 0 ? columns : Object.keys(items[0])
31
+ return { value: items, columns: cols }
32
+ }
33
+
34
+ const resultSetToRows = <T>(result: Libsql.ResultSet): ReadonlyArray<T> => {
35
+ const { columns, rows } = result
36
+ return rows.map((row) => {
37
+ const obj: any = {}
38
+ for (let i = 0; i < columns.length; i++) obj[columns[i]] = row[i]
39
+ return obj
40
+ })
41
+ }
42
+
43
+ const buildQuery = (strings: TemplateStringsArray, values: Array<unknown>) => {
44
+ let sql = strings[0]
45
+ for (let i = 0; i < values.length; i++) sql += "?" + strings[i + 1]
46
+ return { sql, args: values }
47
+ }
48
+
49
+ interface TxState {
50
+ readonly depth: number
51
+ }
52
+
53
+ type LibsqlModule = {
54
+ createClient: (config: Libsql.Config) => Libsql.Client
55
+ }
56
+
57
+ const loadLibsql = () => import("@libsql/client") as Promise<LibsqlModule>
58
+
59
+ const currentTransaction = GlobalValue.globalValue(
60
+ Symbol.for("effect-start/sql/libsql/currentTransaction"),
61
+ () => FiberRef.unsafeMake<Option.Option<TxState>>(Option.none()),
62
+ )
63
+
64
+ const executeQuery = <T>(
65
+ client: Libsql.Client,
66
+ sql: string,
67
+ args: Array<unknown>,
68
+ ): Effect.Effect<ReadonlyArray<T>, Sql.SqlError> =>
69
+ wrap(() => client.execute({ sql, args })).pipe(Effect.map(resultSetToRows<T>))
70
+
71
+ const runQuery = <T>(
72
+ client: Libsql.Client,
73
+ strings: TemplateStringsArray,
74
+ values: Array<unknown>,
75
+ ): Effect.Effect<ReadonlyArray<T>, Sql.SqlError> => {
76
+ const { sql, args } = buildQuery(strings, values)
77
+ return executeQuery(client, sql, args)
78
+ }
79
+
80
+ const runUnsafe = <T>(
81
+ client: Libsql.Client,
82
+ query: string,
83
+ values?: Array<unknown>,
84
+ ): Effect.Effect<ReadonlyArray<T>, Sql.SqlError> =>
85
+ executeQuery(client, query, values ?? [])
86
+
87
+ const exec = (client: Libsql.Client, sql: string) =>
88
+ wrap(() => client.execute(sql))
89
+
90
+ const makeWithTransaction =
91
+ (client: Libsql.Client) =>
92
+ <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, Sql.SqlError | E, R> =>
93
+ Effect.uninterruptibleMask((restore) =>
94
+ Effect.flatMap(FiberRef.get(currentTransaction), (txOpt) => {
95
+ if (Option.isSome(txOpt)) {
96
+ const { depth } = txOpt.value
97
+ const name = `sp_${depth}`
98
+ return Effect.gen(function* () {
99
+ yield* exec(client, `SAVEPOINT ${name}`)
100
+ const exit = yield* Effect.exit(
101
+ restore(
102
+ Effect.locally(self, currentTransaction, Option.some({ depth: depth + 1 })),
103
+ ),
104
+ )
105
+ if (Exit.isSuccess(exit)) {
106
+ yield* exec(client, `RELEASE SAVEPOINT ${name}`)
107
+ return exit.value
108
+ }
109
+ yield* exec(client, `ROLLBACK TO SAVEPOINT ${name}`).pipe(Effect.orDie)
110
+ return yield* exit
111
+ })
112
+ }
113
+
114
+ return Effect.gen(function* () {
115
+ yield* exec(client, "BEGIN")
116
+ const exit = yield* Effect.exit(
117
+ restore(Effect.locally(self, currentTransaction, Option.some({ depth: 1 }))),
118
+ )
119
+ if (Exit.isSuccess(exit)) {
120
+ yield* exec(client, "COMMIT")
121
+ return exit.value
122
+ }
123
+ yield* exec(client, "ROLLBACK").pipe(Effect.orDie)
124
+ return yield* exit
125
+ })
126
+ }),
127
+ )
128
+
129
+ export const layer = (config: LibsqlConfig): Layer.Layer<Sql.SqlClient, Sql.SqlError> =>
130
+ Layer.scoped(
131
+ Sql.SqlClient,
132
+ Effect.acquireRelease(
133
+ wrap(() => loadLibsql()).pipe(
134
+ Effect.map((libsql) => {
135
+ const client = libsql.createClient(config)
136
+ const use: Sql.SqlClient["use"] = (fn) =>
137
+ Effect.tryPromise({ try: () => Promise.resolve(fn(client)), catch: wrapError })
138
+ return Object.assign(
139
+ <T = any>(strings: TemplateStringsArray, ...values: Array<unknown>) =>
140
+ runQuery<T>(client, strings, values),
141
+ {
142
+ unsafe: <T = any>(query: string, values?: Array<unknown>) =>
143
+ runUnsafe<T>(client, query, values),
144
+ values: makeValues,
145
+ withTransaction: makeWithTransaction(client),
146
+ reserve: Effect.acquireRelease(
147
+ wrap(() => loadLibsql()).pipe(
148
+ Effect.map((m) => m.createClient(config)),
149
+ ),
150
+ (reserved: Libsql.Client) => Effect.sync(() => reserved.close()),
151
+ ).pipe(
152
+ Effect.map(
153
+ (reserved): Sql.SqlQuery =>
154
+ Object.assign(
155
+ <T = any>(strings: TemplateStringsArray, ...values: Array<unknown>) =>
156
+ runQuery<T>(reserved, strings, values),
157
+ {
158
+ unsafe: <T = any>(query: string, values?: Array<unknown>) =>
159
+ runUnsafe<T>(reserved, query, values),
160
+ values: makeValues,
161
+ },
162
+ ),
163
+ ),
164
+ ),
165
+ close: () => Effect.sync(() => client.close()),
166
+ use,
167
+ },
168
+ ) satisfies Sql.SqlClient
169
+ }),
170
+ ),
171
+ (client) => client.close().pipe(Effect.orDie),
172
+ ),
173
+ )
@@ -0,0 +1,39 @@
1
+ declare module "@libsql/client" {
2
+ export interface Config {
3
+ readonly url: string
4
+ readonly authToken?: string
5
+ readonly syncUrl?: string
6
+ readonly syncInterval?: number
7
+ readonly encryptionKey?: string
8
+ }
9
+
10
+ export interface ResultSet {
11
+ readonly columns: ReadonlyArray<string>
12
+ readonly rows: ReadonlyArray<ReadonlyArray<unknown>>
13
+ readonly rowsAffected: number
14
+ readonly lastInsertRowid?: bigint
15
+ }
16
+
17
+ export interface InStatement {
18
+ readonly sql: string
19
+ readonly args?: ReadonlyArray<unknown> | Record<string, unknown>
20
+ }
21
+
22
+ export interface Client {
23
+ execute(stmt: InStatement | string): Promise<ResultSet>
24
+ batch(stmts: ReadonlyArray<InStatement | string>, mode?: TransactionMode): Promise<ReadonlyArray<ResultSet>>
25
+ transaction(mode?: TransactionMode): Promise<Transaction>
26
+ close(): void
27
+ }
28
+
29
+ export interface Transaction {
30
+ execute(stmt: InStatement | string): Promise<ResultSet>
31
+ commit(): Promise<void>
32
+ rollback(): Promise<void>
33
+ close(): void
34
+ }
35
+
36
+ export type TransactionMode = "write" | "read" | "deferred"
37
+
38
+ export function createClient(config: Config): Client
39
+ }
@@ -5,7 +5,7 @@ import * as GlobalValue from "effect/GlobalValue"
5
5
  import * as Layer from "effect/Layer"
6
6
  import * as Option from "effect/Option"
7
7
  import type * as Mssql from "mssql"
8
- import * as Sql from "../../Sql.ts"
8
+ import * as Sql from "../Sql.ts"
9
9
 
10
10
  export interface MssqlConfig {
11
11
  readonly server: string
@@ -1,80 +0,0 @@
1
- import * as Context from "effect/Context";
2
- import * as Effect from "effect/Effect";
3
- import type * as Option from "effect/Option";
4
- import * as Stream from "effect/Stream";
5
- import type * as PlatformError from "./PlatformError.ts";
6
- export interface BlobInfo {
7
- readonly size: number;
8
- readonly lastModified: Option.Option<Date>;
9
- readonly etag: Option.Option<string>;
10
- readonly type: Option.Option<string>;
11
- }
12
- export interface BlobRef {
13
- readonly key: string;
14
- readonly bytes: Effect.Effect<Uint8Array, PlatformError.PlatformError>;
15
- readonly text: Effect.Effect<string, PlatformError.PlatformError>;
16
- readonly json: Effect.Effect<unknown, PlatformError.PlatformError>;
17
- readonly stat: Effect.Effect<BlobInfo, PlatformError.PlatformError>;
18
- readonly exists: Effect.Effect<boolean, PlatformError.PlatformError>;
19
- readonly delete: Effect.Effect<void, PlatformError.PlatformError>;
20
- readonly stream: Stream.Stream<Uint8Array, PlatformError.PlatformError>;
21
- readonly write: (data: string | Uint8Array | ArrayBuffer) => Effect.Effect<void, PlatformError.PlatformError>;
22
- readonly slice: (begin?: number, end?: number) => BlobRef;
23
- }
24
- export interface ListEntry {
25
- readonly key: string;
26
- readonly size: Option.Option<number>;
27
- readonly lastModified: Option.Option<Date>;
28
- readonly etag: Option.Option<string>;
29
- }
30
- export interface ListOptions {
31
- readonly prefix?: string;
32
- }
33
- export interface PresignOptions {
34
- readonly expiresIn?: number;
35
- readonly method?: "GET" | "PUT" | "DELETE" | "HEAD";
36
- }
37
- declare const BlobStore_base: Context.TagClass<BlobStore, "effect-start/BlobStore", {
38
- readonly ref: (key: string) => Effect.Effect<BlobRef, PlatformError.PlatformError>;
39
- readonly list: (options?: ListOptions) => Stream.Stream<ListEntry, PlatformError.PlatformError>;
40
- readonly presign: (key: string, options?: PresignOptions) => Effect.Effect<string, PlatformError.PlatformError>;
41
- }>;
42
- export declare class BlobStore extends BlobStore_base {
43
- }
44
- declare const WatchEventCreated_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => Readonly<A> & {
45
- readonly _tag: "Created";
46
- };
47
- export declare class WatchEventCreated extends WatchEventCreated_base<{
48
- readonly key: string;
49
- }> {
50
- }
51
- declare const WatchEventUpdated_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => Readonly<A> & {
52
- readonly _tag: "Updated";
53
- };
54
- export declare class WatchEventUpdated extends WatchEventUpdated_base<{
55
- readonly key: string;
56
- }> {
57
- }
58
- declare const WatchEventDeleted_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => Readonly<A> & {
59
- readonly _tag: "Deleted";
60
- };
61
- export declare class WatchEventDeleted extends WatchEventDeleted_base<{
62
- readonly key: string;
63
- }> {
64
- }
65
- export type WatchEvent = WatchEventCreated | WatchEventUpdated | WatchEventDeleted;
66
- export interface WatchOptions {
67
- readonly prefix?: string;
68
- }
69
- declare const BlobWatcher_base: Context.TagClass<BlobWatcher, "effect-start/BlobWatcher", {
70
- readonly watch: (options?: WatchOptions) => Stream.Stream<WatchEvent, PlatformError.PlatformError>;
71
- readonly notify: (event: WatchEvent) => Effect.Effect<boolean, PlatformError.PlatformError>;
72
- }>;
73
- export declare class BlobWatcher extends BlobWatcher_base {
74
- }
75
- export declare const watch: (options?: WatchOptions) => Stream.Stream<WatchEvent, PlatformError.PlatformError, BlobWatcher>;
76
- export declare const notify: (event: WatchEvent) => Effect.Effect<boolean, PlatformError.PlatformError, BlobWatcher>;
77
- export declare const ref: (key: string) => Effect.Effect<BlobRef, PlatformError.PlatformError, BlobStore>;
78
- export declare const list: (options?: ListOptions) => Stream.Stream<ListEntry, PlatformError.PlatformError, BlobStore>;
79
- export declare const presign: (key: string, options?: PresignOptions) => Effect.Effect<string, PlatformError.PlatformError, BlobStore>;
80
- export {};
package/dist/BlobStore.js DELETED
@@ -1,19 +0,0 @@
1
- import * as Context from "effect/Context";
2
- import * as Data from "effect/Data";
3
- import * as Effect from "effect/Effect";
4
- import * as Stream from "effect/Stream";
5
- export class BlobStore extends Context.Tag("effect-start/BlobStore")() {
6
- }
7
- export class WatchEventCreated extends Data.TaggedClass("Created") {
8
- }
9
- export class WatchEventUpdated extends Data.TaggedClass("Updated") {
10
- }
11
- export class WatchEventDeleted extends Data.TaggedClass("Deleted") {
12
- }
13
- export class BlobWatcher extends Context.Tag("effect-start/BlobWatcher")() {
14
- }
15
- export const watch = (options) => Stream.unwrap(Effect.map(BlobWatcher, (watcher) => watcher.watch(options)));
16
- export const notify = (event) => Effect.flatMap(BlobWatcher, (watcher) => watcher.notify(event));
17
- export const ref = (key) => Effect.flatMap(BlobStore, (store) => store.ref(key));
18
- export const list = (options) => Stream.unwrap(Effect.map(BlobStore, (store) => store.list(options)));
19
- export const presign = (key, options) => Effect.flatMap(BlobStore, (store) => store.presign(key, options));
@@ -1,60 +0,0 @@
1
- /**
2
- * Adapted from upcomnig Effect 4 aka effect-smol.
3
- *
4
- * Kept a minimal interface without tempaltes and file descirptor
5
- * to keep it compatible if it lands in the core (ie. not in seperate platform package.)
6
- */
7
- import * as Context from "effect/Context";
8
- import * as Effect from "effect/Effect";
9
- import * as Pipeable from "effect/Pipeable";
10
- import type * as Scope from "effect/Scope";
11
- import type * as Sink from "effect/Sink";
12
- import type * as Stream from "effect/Stream";
13
- import type * as PlatformError from "./PlatformError.ts";
14
- declare const TypeId: unique symbol;
15
- type TypeId = typeof TypeId;
16
- type Stdio = "pipe" | "inherit" | "ignore";
17
- export interface Command extends Pipeable.Pipeable {
18
- readonly [TypeId]: TypeId;
19
- readonly command: string;
20
- readonly args: ReadonlyArray<string>;
21
- readonly cwd?: string;
22
- readonly env?: Record<string, string>;
23
- readonly stdin?: Stdio;
24
- readonly stdout?: Stdio;
25
- readonly stderr?: Stdio;
26
- readonly detached?: boolean;
27
- [Symbol.iterator](): Effect.EffectGenerator<Effect.Effect<ChildProcessHandle, PlatformError.PlatformError, ChildProcessSpawner | Scope.Scope>>;
28
- }
29
- export declare namespace Command {
30
- interface Options {
31
- readonly cwd?: string;
32
- readonly env?: Record<string, string>;
33
- readonly stdin?: Stdio;
34
- readonly stdout?: Stdio;
35
- readonly stderr?: Stdio;
36
- readonly detached?: boolean;
37
- }
38
- }
39
- export declare const isCommand: (u: unknown) => u is Command;
40
- export declare const make: (command: string, args?: ReadonlyArray<string>, options?: Command.Options) => Command;
41
- export type Signal = "SIGABRT" | "SIGALRM" | "SIGBUS" | "SIGCHLD" | "SIGCONT" | "SIGFPE" | "SIGHUP" | "SIGILL" | "SIGINT" | "SIGIO" | "SIGIOT" | "SIGKILL" | "SIGPIPE" | "SIGPOLL" | "SIGPROF" | "SIGPWR" | "SIGQUIT" | "SIGSEGV" | "SIGSTKFLT" | "SIGSTOP" | "SIGSYS" | "SIGTERM" | "SIGTRAP" | "SIGTSTP" | "SIGTTIN" | "SIGTTOU" | "SIGUNUSED" | "SIGURG" | "SIGUSR1" | "SIGUSR2" | "SIGVTALRM" | "SIGWINCH" | "SIGXCPU" | "SIGXFSZ" | "SIGBREAK" | "SIGLOST" | "SIGINFO";
42
- export interface KillOptions {
43
- readonly killSignal?: Signal | undefined;
44
- }
45
- export interface ChildProcessHandle {
46
- readonly pid: number;
47
- readonly exitCode: Effect.Effect<number, PlatformError.PlatformError>;
48
- readonly isRunning: Effect.Effect<boolean, PlatformError.PlatformError>;
49
- readonly kill: (options?: KillOptions) => Effect.Effect<void, PlatformError.PlatformError>;
50
- readonly stdin: Sink.Sink<void, Uint8Array, never, PlatformError.PlatformError>;
51
- readonly stdout: Stream.Stream<Uint8Array, PlatformError.PlatformError>;
52
- readonly stderr: Stream.Stream<Uint8Array, PlatformError.PlatformError>;
53
- }
54
- declare const ChildProcessSpawner_base: Context.TagClass<ChildProcessSpawner, "effect-start/ChildProcessSpawner", {
55
- readonly spawn: (command: Command) => Effect.Effect<ChildProcessHandle, PlatformError.PlatformError, Scope.Scope>;
56
- }>;
57
- export declare class ChildProcessSpawner extends ChildProcessSpawner_base {
58
- }
59
- export declare const spawn: (command: Command) => Effect.Effect<ChildProcessHandle, PlatformError.PlatformError, ChildProcessSpawner | Scope.Scope>;
60
- export {};
@@ -1,30 +0,0 @@
1
- /**
2
- * Adapted from upcomnig Effect 4 aka effect-smol.
3
- *
4
- * Kept a minimal interface without tempaltes and file descirptor
5
- * to keep it compatible if it lands in the core (ie. not in seperate platform package.)
6
- */
7
- import * as Context from "effect/Context";
8
- import * as Effect from "effect/Effect";
9
- import * as Pipeable from "effect/Pipeable";
10
- import * as Predicate from "effect/Predicate";
11
- import * as Utils from "effect/Utils";
12
- const TypeId = Symbol.for("effect-start/ChildProcess/Command");
13
- const CommandProto = {
14
- [TypeId]: TypeId,
15
- pipe() {
16
- return Pipeable.pipeArguments(this, arguments);
17
- },
18
- [Symbol.iterator]() {
19
- return new Utils.SingleShotGen(new Utils.YieldWrap(spawn(this)));
20
- },
21
- };
22
- export const isCommand = (u) => Predicate.hasProperty(u, TypeId);
23
- export const make = (command, args, options) => Object.assign(Object.create(CommandProto), {
24
- command,
25
- args: args ?? [],
26
- ...options,
27
- });
28
- export class ChildProcessSpawner extends Context.Tag("effect-start/ChildProcessSpawner")() {
29
- }
30
- export const spawn = (command) => Effect.flatMap(ChildProcessSpawner, (spawner) => spawner.spawn(command));