effect-start 0.23.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/dist/ChildProcess.js +32 -20
  2. package/dist/Commander.js +377 -293
  3. package/dist/ContentNegotiation.js +424 -318
  4. package/dist/Cookies.js +340 -271
  5. package/dist/Development.js +85 -49
  6. package/dist/Effectify.js +22 -14
  7. package/dist/Entity.js +260 -195
  8. package/dist/Fetch.js +192 -0
  9. package/dist/FilePathPattern.js +88 -77
  10. package/dist/FileRouter.js +192 -136
  11. package/dist/FileRouterCodegen.js +262 -191
  12. package/dist/FileSystem.js +126 -64
  13. package/dist/Http.js +96 -77
  14. package/dist/PathPattern.js +311 -273
  15. package/dist/PlatformError.js +36 -21
  16. package/dist/PlatformRuntime.js +65 -40
  17. package/dist/Route.js +122 -79
  18. package/dist/RouteBody.js +83 -58
  19. package/dist/RouteError.js +46 -25
  20. package/dist/RouteHook.js +58 -34
  21. package/dist/RouteHttp.js +346 -237
  22. package/dist/RouteHttpTracer.js +86 -58
  23. package/dist/RouteMount.js +81 -58
  24. package/dist/RouteSchema.js +253 -170
  25. package/dist/RouteSse.js +87 -72
  26. package/dist/RouteTree.js +99 -73
  27. package/dist/RouteTrie.js +160 -133
  28. package/dist/SchemaExtra.js +87 -62
  29. package/dist/Socket.js +32 -21
  30. package/dist/SqlIntrospect.js +317 -268
  31. package/dist/Start.js +55 -25
  32. package/dist/StartApp.js +3 -21
  33. package/dist/StreamExtra.js +109 -74
  34. package/dist/System.js +37 -21
  35. package/dist/TuplePathPattern.js +64 -58
  36. package/dist/Unique.js +159 -120
  37. package/dist/Values.js +48 -32
  38. package/dist/bun/BunBundle.js +158 -109
  39. package/dist/bun/BunChildProcessSpawner.js +121 -82
  40. package/dist/bun/BunImportTrackerPlugin.js +85 -63
  41. package/dist/bun/BunRoute.js +135 -99
  42. package/dist/bun/BunRuntime.js +39 -29
  43. package/dist/bun/BunServer.js +268 -140
  44. package/dist/bun/BunVirtualFilesPlugin.js +47 -33
  45. package/dist/bun/_BunEnhancedResolve.js +107 -82
  46. package/dist/bun/index.js +5 -5
  47. package/dist/bundler/Bundle.js +82 -38
  48. package/dist/bundler/BundleFiles.js +140 -82
  49. package/dist/bundler/BundleRoute.js +49 -38
  50. package/dist/client/Overlay.js +29 -28
  51. package/dist/client/ScrollState.js +94 -82
  52. package/dist/client/index.js +79 -61
  53. package/dist/console/Console.js +40 -24
  54. package/dist/console/ConsoleErrors.js +189 -178
  55. package/dist/console/ConsoleLogger.js +52 -43
  56. package/dist/console/ConsoleMetrics.js +69 -58
  57. package/dist/console/ConsoleProcess.js +57 -47
  58. package/dist/console/ConsoleStore.js +56 -45
  59. package/dist/console/ConsoleTracer.js +101 -88
  60. package/dist/console/Simulation.js +714 -563
  61. package/dist/console/index.js +3 -3
  62. package/dist/console/routes/tree.js +29 -28
  63. package/dist/datastar/actions/fetch.js +514 -381
  64. package/dist/datastar/actions/peek.js +12 -12
  65. package/dist/datastar/actions/setAll.js +18 -11
  66. package/dist/datastar/actions/toggleAll.js +18 -11
  67. package/dist/datastar/attributes/attr.js +48 -47
  68. package/dist/datastar/attributes/bind.js +186 -167
  69. package/dist/datastar/attributes/class.js +51 -44
  70. package/dist/datastar/attributes/computed.js +23 -24
  71. package/dist/datastar/attributes/effect.js +9 -8
  72. package/dist/datastar/attributes/indicator.js +32 -29
  73. package/dist/datastar/attributes/init.js +26 -25
  74. package/dist/datastar/attributes/jsonSignals.js +32 -29
  75. package/dist/datastar/attributes/on.js +76 -73
  76. package/dist/datastar/attributes/onIntersect.js +51 -51
  77. package/dist/datastar/attributes/onInterval.js +30 -29
  78. package/dist/datastar/attributes/onSignalPatch.js +49 -40
  79. package/dist/datastar/attributes/ref.js +10 -9
  80. package/dist/datastar/attributes/show.js +31 -30
  81. package/dist/datastar/attributes/signals.js +17 -16
  82. package/dist/datastar/attributes/style.js +56 -49
  83. package/dist/datastar/attributes/text.js +28 -25
  84. package/dist/datastar/engine.js +1079 -933
  85. package/dist/datastar/index.js +25 -24
  86. package/dist/datastar/utils.js +203 -155
  87. package/dist/datastar/watchers/patchElements.js +459 -372
  88. package/dist/datastar/watchers/patchSignals.js +13 -13
  89. package/dist/experimental/EncryptedCookies.js +305 -189
  90. package/dist/experimental/index.js +1 -1
  91. package/dist/hyper/Hyper.js +22 -17
  92. package/dist/hyper/HyperHtml.js +138 -123
  93. package/dist/hyper/HyperNode.js +11 -9
  94. package/dist/hyper/HyperRoute.js +41 -28
  95. package/dist/hyper/html.js +27 -27
  96. package/dist/hyper/index.js +5 -5
  97. package/dist/hyper/jsx-runtime.js +11 -5
  98. package/dist/index.js +8 -8
  99. package/dist/node/NodeFileSystem.js +606 -341
  100. package/dist/node/NodeUtils.js +21 -18
  101. package/dist/sql/Sql.js +8 -0
  102. package/dist/sql/bun/index.js +134 -67
  103. package/dist/sql/index.js +1 -0
  104. package/dist/sql/libsql/index.js +156 -0
  105. package/dist/sql/mssql/docker.js +103 -60
  106. package/dist/sql/mssql/index.js +182 -101
  107. package/dist/testing/TestLogger.js +39 -29
  108. package/dist/testing/index.js +2 -2
  109. package/dist/testing/utils.js +45 -23
  110. package/dist/x/cloudflare/CloudflareTunnel.js +61 -28
  111. package/dist/x/cloudflare/index.js +1 -1
  112. package/dist/x/tailscale/TailscaleTunnel.js +86 -60
  113. package/dist/x/tailscale/index.js +1 -1
  114. package/dist/x/tailwind/TailwindPlugin.js +280 -205
  115. package/dist/x/tailwind/compile.js +185 -129
  116. package/dist/x/tailwind/plugin.js +13 -11
  117. package/package.json +1 -1
  118. package/src/Development.ts +3 -1
  119. package/src/Entity.ts +17 -0
  120. package/src/Fetch.ts +271 -0
  121. package/src/SqlIntrospect.ts +64 -70
  122. package/src/Start.ts +24 -22
  123. package/src/StartApp.ts +11 -0
  124. package/src/bun/BunServer.ts +89 -16
  125. package/src/hyper/HyperHtml.ts +0 -1
  126. package/src/sql/bun/index.ts +1 -1
  127. package/src/sql/index.ts +1 -0
  128. package/src/sql/libsql/index.ts +173 -0
  129. package/src/sql/libsql/libsql.d.ts +39 -0
  130. package/src/sql/mssql/index.ts +1 -1
  131. package/src/x/tailscale/TailscaleTunnel.ts +7 -5
  132. package/dist/BlobStore.d.ts +0 -80
  133. package/dist/BlobStore.js +0 -19
  134. package/dist/ChildProcess.d.ts +0 -60
  135. package/dist/Commander.d.ts +0 -100
  136. package/dist/ContentNegotiation.d.ts +0 -12
  137. package/dist/Cookies.d.ts +0 -47
  138. package/dist/Development.d.ts +0 -39
  139. package/dist/Effectify.d.ts +0 -209
  140. package/dist/Entity.d.ts +0 -47
  141. package/dist/FilePathPattern.d.ts +0 -29
  142. package/dist/FileRouter.d.ts +0 -56
  143. package/dist/FileRouterCodegen.d.ts +0 -18
  144. package/dist/FileRouterPattern.d.ts +0 -9
  145. package/dist/FileRouterPattern.js +0 -35
  146. package/dist/FileSystem.d.ts +0 -158
  147. package/dist/Http.d.ts +0 -37
  148. package/dist/HttpAppExtra.d.ts +0 -7
  149. package/dist/HttpAppExtra.js +0 -320
  150. package/dist/HttpUtils.d.ts +0 -3
  151. package/dist/HttpUtils.js +0 -11
  152. package/dist/PathPattern.d.ts +0 -134
  153. package/dist/PlatformError.d.ts +0 -38
  154. package/dist/PlatformRuntime.d.ts +0 -27
  155. package/dist/Route.d.ts +0 -97
  156. package/dist/RouteBody.d.ts +0 -47
  157. package/dist/RouteError.d.ts +0 -98
  158. package/dist/RouteHook.d.ts +0 -12
  159. package/dist/RouteHttp.d.ts +0 -21
  160. package/dist/RouteHttpTracer.d.ts +0 -10
  161. package/dist/RouteMount.d.ts +0 -86
  162. package/dist/RouteSchema.d.ts +0 -86
  163. package/dist/RouteSse.d.ts +0 -21
  164. package/dist/RouteTree.d.ts +0 -57
  165. package/dist/RouteTrie.d.ts +0 -20
  166. package/dist/RouterPattern.d.ts +0 -118
  167. package/dist/RouterPattern.js +0 -269
  168. package/dist/SchemaExtra.d.ts +0 -7
  169. package/dist/Socket.d.ts +0 -27
  170. package/dist/Sql.d.ts +0 -34
  171. package/dist/Sql.js +0 -5
  172. package/dist/SqlIntrospect.d.ts +0 -91
  173. package/dist/Start.d.ts +0 -44
  174. package/dist/StartApp.d.ts +0 -19
  175. package/dist/StreamExtra.d.ts +0 -28
  176. package/dist/System.d.ts +0 -7
  177. package/dist/TuplePathPattern.d.ts +0 -9
  178. package/dist/Unique.d.ts +0 -50
  179. package/dist/Values.d.ts +0 -27
  180. package/dist/bun/BunBlobStoreDisk.d.ts +0 -6
  181. package/dist/bun/BunBlobStoreDisk.js +0 -116
  182. package/dist/bun/BunBlobStoreS3.d.ts +0 -11
  183. package/dist/bun/BunBlobStoreS3.js +0 -89
  184. package/dist/bun/BunBlobWatcherDisk.d.ts +0 -6
  185. package/dist/bun/BunBlobWatcherDisk.js +0 -60
  186. package/dist/bun/BunBlobWatcherQueue.d.ts +0 -6
  187. package/dist/bun/BunBlobWatcherQueue.js +0 -17
  188. package/dist/bun/BunBundle.d.ts +0 -11
  189. package/dist/bun/BunChildProcessSpawner.d.ts +0 -3
  190. package/dist/bun/BunHttpServer.d.ts +0 -44
  191. package/dist/bun/BunHttpServer.js +0 -186
  192. package/dist/bun/BunHttpServer_web.d.ts +0 -60
  193. package/dist/bun/BunHttpServer_web.js +0 -252
  194. package/dist/bun/BunImportTrackerPlugin.d.ts +0 -13
  195. package/dist/bun/BunPlatformHttpServer.d.ts +0 -10
  196. package/dist/bun/BunPlatformHttpServer.js +0 -53
  197. package/dist/bun/BunRoute.d.ts +0 -48
  198. package/dist/bun/BunRuntime.d.ts +0 -2
  199. package/dist/bun/BunServer.d.ts +0 -40
  200. package/dist/bun/BunServerRequest.d.ts +0 -60
  201. package/dist/bun/BunServerRequest.js +0 -252
  202. package/dist/bun/BunSql.d.ts +0 -4
  203. package/dist/bun/BunSql.js +0 -81
  204. package/dist/bun/BunVirtualFilesPlugin.d.ts +0 -4
  205. package/dist/bun/_BunEnhancedResolve.d.ts +0 -45
  206. package/dist/bun/index.d.ts +0 -5
  207. package/dist/bundler/Bundle.d.ts +0 -61
  208. package/dist/bundler/BundleFiles.d.ts +0 -13
  209. package/dist/bundler/BundleHttp.d.ts +0 -45
  210. package/dist/bundler/BundleHttp.js +0 -176
  211. package/dist/bundler/BundleRoute.d.ts +0 -27
  212. package/dist/client/Overlay.d.ts +0 -2
  213. package/dist/client/ScrollState.d.ts +0 -6
  214. package/dist/client/index.d.ts +0 -6
  215. package/dist/console/Console.d.ts +0 -6
  216. package/dist/console/ConsoleErrors.d.ts +0 -3
  217. package/dist/console/ConsoleLogger.d.ts +0 -3
  218. package/dist/console/ConsoleMetrics.d.ts +0 -3
  219. package/dist/console/ConsoleProcess.d.ts +0 -3
  220. package/dist/console/ConsoleStore.d.ts +0 -144
  221. package/dist/console/ConsoleTracer.d.ts +0 -3
  222. package/dist/console/Simulation.d.ts +0 -2
  223. package/dist/console/index.d.ts +0 -3
  224. package/dist/console/routes/errors/route.d.ts +0 -10
  225. package/dist/console/routes/errors/route.js +0 -47
  226. package/dist/console/routes/fiberDetail.d.ts +0 -16
  227. package/dist/console/routes/fiberDetail.js +0 -38
  228. package/dist/console/routes/fibers/route.d.ts +0 -10
  229. package/dist/console/routes/fibers/route.js +0 -19
  230. package/dist/console/routes/git/route.d.ts +0 -11
  231. package/dist/console/routes/git/route.js +0 -33
  232. package/dist/console/routes/layout.d.ts +0 -9
  233. package/dist/console/routes/layout.js +0 -3
  234. package/dist/console/routes/logs/route.d.ts +0 -10
  235. package/dist/console/routes/logs/route.js +0 -32
  236. package/dist/console/routes/metrics/route.d.ts +0 -10
  237. package/dist/console/routes/metrics/route.js +0 -17
  238. package/dist/console/routes/route.d.ts +0 -6
  239. package/dist/console/routes/route.js +0 -5
  240. package/dist/console/routes/routes/route.d.ts +0 -6
  241. package/dist/console/routes/routes/route.js +0 -20
  242. package/dist/console/routes/services/route.d.ts +0 -6
  243. package/dist/console/routes/services/route.js +0 -12
  244. package/dist/console/routes/system/route.d.ts +0 -10
  245. package/dist/console/routes/system/route.js +0 -18
  246. package/dist/console/routes/traceDetail.d.ts +0 -16
  247. package/dist/console/routes/traceDetail.js +0 -14
  248. package/dist/console/routes/traces/route.d.ts +0 -10
  249. package/dist/console/routes/traces/route.js +0 -39
  250. package/dist/console/routes/tree.d.ts +0 -153
  251. package/dist/console/ui/Errors.d.ts +0 -4
  252. package/dist/console/ui/Errors.js +0 -15
  253. package/dist/console/ui/Fibers.d.ts +0 -24
  254. package/dist/console/ui/Fibers.js +0 -121
  255. package/dist/console/ui/Git.d.ts +0 -20
  256. package/dist/console/ui/Git.js +0 -95
  257. package/dist/console/ui/Logs.d.ts +0 -4
  258. package/dist/console/ui/Logs.js +0 -25
  259. package/dist/console/ui/Metrics.d.ts +0 -4
  260. package/dist/console/ui/Metrics.js +0 -26
  261. package/dist/console/ui/Routes.d.ts +0 -8
  262. package/dist/console/ui/Routes.js +0 -70
  263. package/dist/console/ui/Services.d.ts +0 -10
  264. package/dist/console/ui/Services.js +0 -246
  265. package/dist/console/ui/Shell.d.ts +0 -10
  266. package/dist/console/ui/Shell.js +0 -7
  267. package/dist/console/ui/System.d.ts +0 -4
  268. package/dist/console/ui/System.js +0 -35
  269. package/dist/console/ui/Traces.d.ts +0 -12
  270. package/dist/console/ui/Traces.js +0 -179
  271. package/dist/datastar/actions/fetch.d.ts +0 -30
  272. package/dist/datastar/actions/peek.d.ts +0 -1
  273. package/dist/datastar/actions/setAll.d.ts +0 -1
  274. package/dist/datastar/actions/toggleAll.d.ts +0 -1
  275. package/dist/datastar/attributes/attr.d.ts +0 -1
  276. package/dist/datastar/attributes/bind.d.ts +0 -1
  277. package/dist/datastar/attributes/class.d.ts +0 -1
  278. package/dist/datastar/attributes/computed.d.ts +0 -1
  279. package/dist/datastar/attributes/effect.d.ts +0 -1
  280. package/dist/datastar/attributes/indicator.d.ts +0 -1
  281. package/dist/datastar/attributes/init.d.ts +0 -1
  282. package/dist/datastar/attributes/jsonSignals.d.ts +0 -1
  283. package/dist/datastar/attributes/on.d.ts +0 -1
  284. package/dist/datastar/attributes/onIntersect.d.ts +0 -1
  285. package/dist/datastar/attributes/onInterval.d.ts +0 -1
  286. package/dist/datastar/attributes/onSignalPatch.d.ts +0 -1
  287. package/dist/datastar/attributes/ref.d.ts +0 -1
  288. package/dist/datastar/attributes/show.d.ts +0 -1
  289. package/dist/datastar/attributes/signals.d.ts +0 -1
  290. package/dist/datastar/attributes/style.d.ts +0 -1
  291. package/dist/datastar/attributes/text.d.ts +0 -1
  292. package/dist/datastar/engine.d.ts +0 -162
  293. package/dist/datastar/happydom.d.ts +0 -1
  294. package/dist/datastar/happydom.js +0 -8
  295. package/dist/datastar/index.d.ts +0 -24
  296. package/dist/datastar/load.d.ts +0 -24
  297. package/dist/datastar/load.js +0 -24
  298. package/dist/datastar/utils.d.ts +0 -51
  299. package/dist/datastar/watchers/patchElements.d.ts +0 -1
  300. package/dist/datastar/watchers/patchSignals.d.ts +0 -1
  301. package/dist/experimental/EncryptedCookies.d.ts +0 -48
  302. package/dist/experimental/SseHttpResponse.d.ts +0 -7
  303. package/dist/experimental/SseHttpResponse.js +0 -28
  304. package/dist/experimental/index.d.ts +0 -1
  305. package/dist/hyper/Hyper.d.ts +0 -25
  306. package/dist/hyper/HyperHtml.d.ts +0 -23
  307. package/dist/hyper/HyperHtml.test.d.ts +0 -1
  308. package/dist/hyper/HyperHtml.test.js +0 -197
  309. package/dist/hyper/HyperNode.d.ts +0 -14
  310. package/dist/hyper/HyperRoute.d.ts +0 -8
  311. package/dist/hyper/HyperRoute.test.d.ts +0 -1
  312. package/dist/hyper/HyperRoute.test.js +0 -83
  313. package/dist/hyper/html.d.ts +0 -11
  314. package/dist/hyper/index.d.ts +0 -6
  315. package/dist/hyper/jsx-runtime.d.ts +0 -7
  316. package/dist/index.d.ts +0 -8
  317. package/dist/inference_check.d.ts +0 -1
  318. package/dist/inference_check.js +0 -15
  319. package/dist/lint/plugin.d.ts +0 -86
  320. package/dist/lint/plugin.js +0 -341
  321. package/dist/middlewares/BasicAuthMiddleware.d.ts +0 -8
  322. package/dist/middlewares/BasicAuthMiddleware.js +0 -22
  323. package/dist/middlewares/index.d.ts +0 -1
  324. package/dist/middlewares/index.js +0 -1
  325. package/dist/node/Effectify.d.ts +0 -209
  326. package/dist/node/Effectify.js +0 -19
  327. package/dist/node/FileSystem.d.ts +0 -7
  328. package/dist/node/FileSystem.js +0 -420
  329. package/dist/node/NodeFileSystem.d.ts +0 -7
  330. package/dist/node/NodeUtils.d.ts +0 -2
  331. package/dist/node/PlatformError.d.ts +0 -46
  332. package/dist/node/PlatformError.js +0 -43
  333. package/dist/node/Utils.d.ts +0 -1
  334. package/dist/node/Utils.js +0 -19
  335. package/dist/repro_fail.d.ts +0 -1
  336. package/dist/repro_fail.js +0 -14
  337. package/dist/sql/bun/index.d.ts +0 -3
  338. package/dist/sql/mssql/docker.d.ts +0 -2
  339. package/dist/sql/mssql/index.d.ts +0 -21
  340. package/dist/testing/TestHttpClient.d.ts +0 -13
  341. package/dist/testing/TestHttpClient.js +0 -68
  342. package/dist/testing/TestLogger.d.ts +0 -13
  343. package/dist/testing/index.d.ts +0 -2
  344. package/dist/testing/utils.d.ts +0 -9
  345. package/dist/x/cloudflare/CloudflareTunnel.d.ts +0 -10
  346. package/dist/x/cloudflare/index.d.ts +0 -1
  347. package/dist/x/datastar/Datastar.d.ts +0 -6
  348. package/dist/x/datastar/Datastar.js +0 -47
  349. package/dist/x/datastar/index.d.ts +0 -1
  350. package/dist/x/datastar/index.js +0 -1
  351. package/dist/x/tailscale/TailscaleTunnel.d.ts +0 -15
  352. package/dist/x/tailscale/index.d.ts +0 -1
  353. package/dist/x/tailwind/TailwindPlugin.d.ts +0 -23
  354. package/dist/x/tailwind/compile.d.ts +0 -19
  355. package/dist/x/tailwind/plugin.d.ts +0 -2
  356. /package/src/{Sql.ts → sql/Sql.ts} +0 -0
@@ -1,113 +1,194 @@
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 * as Sql from "../../Sql.js";
8
- const wrapError = (error) => new Sql.SqlError({
9
- code: error?.code ??
10
- (error?.number != null ? String(error.number) : "UNKNOWN"),
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 * as Sql from "../Sql.js"
8
+
9
+ const wrapError = (error) =>
10
+ new Sql.SqlError({
11
+ code:
12
+ (error)?.code ??
13
+ ((error)?.number != null ? String((error).number) : "UNKNOWN"),
11
14
  message: error instanceof Error ? error.message : String(error),
12
15
  cause: error,
13
- });
16
+ })
17
+
14
18
  const makeValues = (obj, ...columns) => {
15
- const items = Array.isArray(obj) ? obj : [obj];
16
- const cols = columns.length > 0 ? columns : Object.keys(items[0]);
17
- return { value: items, columns: cols };
18
- };
19
+ const items = Array.isArray(obj) ? obj : [obj]
20
+ const cols = columns.length > 0 ? columns : Object.keys(items[0])
21
+ return { value: items, columns: cols }
22
+ }
23
+
19
24
  const buildQuery = (strings, values) => {
20
- let text = strings[0];
21
- for (let i = 0; i < values.length; i++)
22
- text += `@p${i + 1}` + strings[i + 1];
23
- return { text, values };
24
- };
25
+ let text = strings[0]
26
+ for (let i = 0; i < values.length; i++) text += `@p${i + 1}` + strings[i + 1]
27
+ return { text, values }
28
+ }
29
+
25
30
  const addInputs = (request, values) => {
26
- for (let i = 0; i < values.length; i++) {
27
- request.input(`p${i + 1}`, values[i]);
28
- }
29
- };
30
- const loadMssql = () => import("mssql");
31
- const currentTransaction = GlobalValue.globalValue(Symbol.for("effect-start/sql/mssql/currentTransaction"), () => FiberRef.unsafeMake(Option.none()));
32
- const executeQuery = (pool, text, values) => Effect.flatMap(FiberRef.get(currentTransaction), (txOpt) => {
33
- const request = Option.isSome(txOpt) ? txOpt.value.transaction.request() : pool.request();
34
- addInputs(request, values);
31
+ for (let i = 0; i < values.length; i++) {
32
+ request.input(`p${i + 1}`, values[i])
33
+ }
34
+ }
35
+
36
+ const loadMssql = () => import("mssql")
37
+
38
+ const currentTransaction = GlobalValue.globalValue(
39
+ Symbol.for("effect-start/sql/mssql/currentTransaction"),
40
+ () => FiberRef.unsafeMake(Option.none()),
41
+ )
42
+
43
+ const executeQuery = (
44
+ pool,
45
+ text,
46
+ values,
47
+ ) =>
48
+ Effect.flatMap(FiberRef.get(currentTransaction), (txOpt) => {
49
+ const request = Option.isSome(txOpt) ? txOpt.value.transaction.request() : pool.request()
50
+ addInputs(request, values)
35
51
  return Effect.tryPromise({
36
- try: () => request.query(text),
37
- catch: wrapError,
38
- }).pipe(Effect.map((result) => result.recordset ?? []));
39
- });
40
- const runQuery = (pool, strings, values) => {
41
- const { text, values: params } = buildQuery(strings, values);
42
- return executeQuery(pool, text, params);
43
- };
44
- const runUnsafe = (pool, query, values) => Effect.flatMap(FiberRef.get(currentTransaction), (txOpt) => {
45
- const request = Option.isSome(txOpt) ? txOpt.value.transaction.request() : pool.request();
46
- if (values)
47
- addInputs(request, values);
52
+ try: () => request.query(text),
53
+ catch: wrapError,
54
+ }).pipe(Effect.map((result) => result.recordset ?? []))
55
+ })
56
+
57
+ const runQuery = (
58
+ pool,
59
+ strings,
60
+ values,
61
+ ) => {
62
+ const { text, values: params } = buildQuery(strings, values)
63
+ return executeQuery(pool, text, params)
64
+ }
65
+
66
+ const runUnsafe = (
67
+ pool,
68
+ query,
69
+ values,
70
+ ) =>
71
+ Effect.flatMap(FiberRef.get(currentTransaction), (txOpt) => {
72
+ const request = Option.isSome(txOpt) ? txOpt.value.transaction.request() : pool.request()
73
+ if (values) addInputs(request, values)
48
74
  return Effect.tryPromise({
49
- try: () => request.query(query),
50
- catch: wrapError,
51
- }).pipe(Effect.map((result) => result.recordset ?? []));
52
- });
53
- const makeWithTransaction = (pool) => (self) => Effect.uninterruptibleMask((restore) => Effect.flatMap(FiberRef.get(currentTransaction), (txOpt) => {
54
- if (Option.isSome(txOpt)) {
55
- const { transaction, depth } = txOpt.value;
56
- const name = `sp_${depth}`;
57
- return Effect.gen(function* () {
58
- const req = transaction.request();
75
+ try: () => request.query(query),
76
+ catch: wrapError,
77
+ }).pipe(Effect.map((result) => result.recordset ?? []))
78
+ })
79
+
80
+ const makeWithTransaction =
81
+ (pool) =>
82
+ (self) =>
83
+ Effect.uninterruptibleMask((restore) =>
84
+ Effect.flatMap(FiberRef.get(currentTransaction), (txOpt) => {
85
+ if (Option.isSome(txOpt)) {
86
+ const { transaction, depth } = txOpt.value
87
+ const name = `sp_${depth}`
88
+ return Effect.gen(function* () {
89
+ const req = transaction.request()
59
90
  yield* Effect.tryPromise({
60
- try: () => req.query(`SAVE TRANSACTION ${name}`),
61
- catch: wrapError,
62
- });
63
- const exit = yield* Effect.exit(restore(Effect.locally(self, currentTransaction, Option.some({ transaction, depth: depth + 1 }))));
91
+ try: () => req.query(`SAVE TRANSACTION ${name}`),
92
+ catch: wrapError,
93
+ })
94
+ const exit = yield* Effect.exit(
95
+ restore(
96
+ Effect.locally(
97
+ self,
98
+ currentTransaction,
99
+ Option.some({ transaction, depth: depth + 1 }),
100
+ ),
101
+ ),
102
+ )
64
103
  if (Exit.isSuccess(exit)) {
65
- return exit.value;
104
+ return exit.value
66
105
  }
67
- const rbReq = transaction.request();
106
+ const rbReq = transaction.request()
68
107
  yield* Effect.tryPromise({
69
- try: () => rbReq.query(`ROLLBACK TRANSACTION ${name}`),
70
- catch: wrapError,
71
- }).pipe(Effect.orDie);
72
- return yield* exit;
73
- });
74
- }
75
- return Effect.gen(function* () {
76
- const transaction = pool.transaction();
77
- yield* Effect.tryPromise({ try: () => transaction.begin(), catch: wrapError });
78
- const exit = yield* Effect.exit(restore(Effect.locally(self, currentTransaction, Option.some({ transaction, depth: 1 }))));
79
- if (Exit.isSuccess(exit)) {
80
- yield* Effect.tryPromise({ try: () => transaction.commit(), catch: wrapError });
81
- return exit.value;
108
+ try: () => rbReq.query(`ROLLBACK TRANSACTION ${name}`),
109
+ catch: wrapError,
110
+ }).pipe(Effect.orDie)
111
+ return yield* exit
112
+ })
82
113
  }
83
- yield* Effect.tryPromise({ try: () => transaction.rollback(), catch: wrapError }).pipe(Effect.orDie);
84
- return yield* exit;
85
- });
86
- }));
87
- export const layer = (config) => Layer.scoped(Sql.SqlClient, Effect.acquireRelease(Effect.tryPromise({
88
- try: async () => {
89
- const mssql = await loadMssql();
90
- const pool = await new mssql.ConnectionPool(config).connect();
91
- return { mssql, pool };
92
- },
93
- catch: wrapError,
94
- }).pipe(Effect.map(({ mssql, pool }) => {
95
- const use = (fn) => Effect.tryPromise({ try: () => Promise.resolve(fn(pool)), catch: wrapError });
96
- return Object.assign((strings, ...values) => runQuery(pool, strings, values), {
97
- unsafe: (query, values) => runUnsafe(pool, query, values),
98
- values: makeValues,
99
- withTransaction: makeWithTransaction(pool),
100
- reserve: Effect.acquireRelease(Effect.tryPromise({
101
- try: () => new mssql.ConnectionPool({
102
- ...config,
103
- pool: { max: 1, min: 1 },
104
- }).connect(),
105
- catch: wrapError,
106
- }), (reserved) => Effect.tryPromise({ try: () => reserved.close(), catch: () => void 0 }).pipe(Effect.asVoid, Effect.orDie)).pipe(Effect.map((reserved) => Object.assign((strings, ...values) => runQuery(reserved, strings, values), {
107
- unsafe: (query, values) => runUnsafe(reserved, query, values),
108
- values: makeValues,
109
- }))),
110
- close: () => use((pool) => pool.close()),
111
- use,
112
- });
113
- })), (client) => client.close().pipe(Effect.orDie)));
114
+
115
+ return Effect.gen(function* () {
116
+ const transaction = pool.transaction()
117
+ yield* Effect.tryPromise({ try: () => transaction.begin(), catch: wrapError })
118
+ const exit = yield* Effect.exit(
119
+ restore(
120
+ Effect.locally(self, currentTransaction, Option.some({ transaction, depth: 1 })),
121
+ ),
122
+ )
123
+ if (Exit.isSuccess(exit)) {
124
+ yield* Effect.tryPromise({ try: () => transaction.commit(), catch: wrapError })
125
+ return exit.value
126
+ }
127
+ yield* Effect.tryPromise({ try: () => transaction.rollback(), catch: wrapError }).pipe(
128
+ Effect.orDie,
129
+ )
130
+ return yield* exit
131
+ })
132
+ }),
133
+ )
134
+
135
+ export const layer = (config) =>
136
+ Layer.scoped(
137
+ Sql.SqlClient,
138
+ Effect.acquireRelease(
139
+ Effect.tryPromise({
140
+ try: async () => {
141
+ const mssql = await loadMssql()
142
+ const pool = await new mssql.ConnectionPool(config).connect()
143
+ return { mssql, pool }
144
+ },
145
+ catch: wrapError,
146
+ }).pipe(
147
+ Effect.map(({ mssql, pool }) => {
148
+ const use = (fn) =>
149
+ Effect.tryPromise({ try: () => Promise.resolve(fn(pool)), catch: wrapError })
150
+ return Object.assign(
151
+ (strings, ...values) =>
152
+ runQuery(pool, strings, values),
153
+ {
154
+ unsafe: (query, values) =>
155
+ runUnsafe(pool, query, values),
156
+ values: makeValues,
157
+ withTransaction: makeWithTransaction(pool),
158
+ reserve: Effect.acquireRelease(
159
+ Effect.tryPromise({
160
+ try: () =>
161
+ new mssql.ConnectionPool({
162
+ ...config,
163
+ pool: { max: 1, min: 1 },
164
+ }).connect(),
165
+ catch: wrapError,
166
+ }),
167
+ (reserved) =>
168
+ Effect.tryPromise({ try: () => reserved.close(), catch: () => void 0 }).pipe(
169
+ Effect.asVoid,
170
+ Effect.orDie,
171
+ ),
172
+ ).pipe(
173
+ Effect.map(
174
+ (reserved) =>
175
+ Object.assign(
176
+ (strings, ...values) =>
177
+ runQuery(reserved, strings, values),
178
+ {
179
+ unsafe: (query, values) =>
180
+ runUnsafe(reserved, query, values),
181
+ values: makeValues,
182
+ },
183
+ ),
184
+ ),
185
+ ),
186
+ close: () => use((pool) => pool.close()),
187
+ use,
188
+ },
189
+ )
190
+ }),
191
+ ),
192
+ (client) => client.close().pipe(Effect.orDie),
193
+ ),
194
+ )
@@ -1,32 +1,42 @@
1
- import * as Cause from "effect/Cause";
2
- import * as Context from "effect/Context";
3
- import * as Effect from "effect/Effect";
4
- import * as FiberRef from "effect/FiberRef";
5
- import * as HashSet from "effect/HashSet";
6
- import * as Layer from "effect/Layer";
7
- import * as Logger from "effect/Logger";
8
- import * as MutableRef from "effect/MutableRef";
9
- import * as Ref from "effect/Ref";
10
- export class TestLogger extends Context.Tag("effect-start/TestLogger")() {
11
- }
1
+ import * as Cause from "effect/Cause"
2
+ import * as Context from "effect/Context"
3
+ import * as Effect from "effect/Effect"
4
+ import * as FiberRef from "effect/FiberRef"
5
+ import * as HashSet from "effect/HashSet"
6
+ import * as Layer from "effect/Layer"
7
+ import * as Logger from "effect/Logger"
8
+ import * as MutableRef from "effect/MutableRef"
9
+ import * as Ref from "effect/Ref"
10
+
11
+ export class TestLogger extends Context.Tag("effect-start/TestLogger")() {}
12
+
12
13
  export function layer() {
13
- return Layer.effect(TestLogger, Effect.gen(function* () {
14
- const messages = yield* Ref.make([]);
15
- const mutableRef = messages.ref;
16
- const customLogger = Logger.make(({ message, logLevel, cause }) => {
17
- const causeStr = !Cause.isEmpty(cause)
18
- ? ` ${Cause.pretty(cause, { renderErrorCause: true })}`
19
- : "";
20
- MutableRef.update(mutableRef, (msgs) => [
21
- ...msgs,
22
- `[${logLevel._tag}] ${String(message)}${causeStr}`,
23
- ]);
24
- });
25
- yield* FiberRef.update(FiberRef.currentLoggers, (loggers) => HashSet.add(HashSet.remove(loggers, Logger.defaultLogger), customLogger));
26
- return { messages };
27
- }));
14
+ return Layer.effect(
15
+ TestLogger,
16
+ Effect.gen(function* () {
17
+ const messages = yield* Ref.make([])
18
+ const mutableRef = (messages).ref
19
+
20
+ const customLogger = Logger.make(({ message, logLevel, cause }) => {
21
+ const causeStr = !Cause.isEmpty(cause)
22
+ ? ` ${Cause.pretty(cause, { renderErrorCause: true })}`
23
+ : ""
24
+ MutableRef.update(mutableRef, (msgs) => [
25
+ ...msgs,
26
+ `[${logLevel._tag}] ${String(message)}${causeStr}`,
27
+ ])
28
+ })
29
+
30
+ yield* FiberRef.update(FiberRef.currentLoggers, (loggers) =>
31
+ HashSet.add(HashSet.remove(loggers, Logger.defaultLogger), customLogger),
32
+ )
33
+
34
+ return { messages }
35
+ }),
36
+ )
28
37
  }
38
+
29
39
  export const messages = Effect.gen(function* () {
30
- const logger = yield* TestLogger;
31
- return yield* Ref.get(logger.messages);
32
- });
40
+ const logger = yield* TestLogger
41
+ return yield* Ref.get(logger.messages)
42
+ })
@@ -1,2 +1,2 @@
1
- export * as TestLogger from "./TestLogger.js";
2
- export * from "./utils.js";
1
+ export * as TestLogger from "./TestLogger.js"
2
+ export * from "./utils.js"
@@ -1,15 +1,28 @@
1
- import * as Array from "effect/Array";
2
- import * as Effect from "effect/Effect";
3
- import * as Function from "effect/Function";
4
- import * as Layer from "effect/Layer";
5
- import * as Logger from "effect/Logger";
1
+ import * as Array from "effect/Array"
2
+ import * as Effect from "effect/Effect"
3
+ import * as Function from "effect/Function"
4
+ import * as Layer from "effect/Layer"
5
+ import * as Logger from "effect/Logger"
6
+
6
7
  /**
7
8
  * Creates a scoped Effects and runs is asynchronously.
8
9
  * Useful for testing.
9
10
  */
10
- export const effectFn = (layer) => (f) => Function.pipe(Effect.gen(f), Effect.scoped, Effect.provide(Logger.pretty), Effect.provide(layer ?? Layer.empty),
11
- // @ts-expect-error will have to figure out how to clear deps
12
- Effect.runPromise, (v) => v.then(() => { }, clearStackTraces));
11
+ export const effectFn =
12
+ (layer) =>
13
+ (
14
+ f,
15
+ ) =>
16
+ Function.pipe(
17
+ Effect.gen(f),
18
+ Effect.scoped,
19
+ Effect.provide(Logger.pretty),
20
+ Effect.provide(layer ?? Layer.empty),
21
+ // @ts-expect-error will have to figure out how to clear deps
22
+ Effect.runPromise,
23
+ (v) => v.then(() => {}, clearStackTraces),
24
+ )
25
+
13
26
  /*
14
27
  * When effect fails, instead of throwing FiberFailure,
15
28
  * throw a plain Error with the strack trace and hides
@@ -22,18 +35,27 @@ Effect.runPromise, (v) => v.then(() => { }, clearStackTraces));
22
35
  * files that are then loaded into a runtime.
23
36
  */
24
37
  const clearStackTraces = (err) => {
25
- const ExternalStackTraceLineRegexp = /\(.*\/node_modules\/[^.]/;
26
- const message = err instanceof Error
27
- ? err.message
28
- : typeof err === "object" && err !== null && "message" in err
29
- ? String(err.message)
30
- : String(err);
31
- const stack = err instanceof Error
32
- ? (err.stack ?? "")
33
- : typeof err === "object" && err !== null && "stack" in err
34
- ? String(err.stack)
35
- : "";
36
- const newErr = new Error(message);
37
- newErr.stack = Function.pipe(stack.split("\n"), Array.takeWhile((s) => !ExternalStackTraceLineRegexp.test(s)), Array.join("\n"));
38
- throw newErr;
39
- };
38
+ const ExternalStackTraceLineRegexp = /\(.*\/node_modules\/[^.]/
39
+
40
+ const message =
41
+ err instanceof Error
42
+ ? err.message
43
+ : typeof err === "object" && err !== null && "message" in err
44
+ ? String(err.message)
45
+ : String(err)
46
+ const stack =
47
+ err instanceof Error
48
+ ? (err.stack ?? "")
49
+ : typeof err === "object" && err !== null && "stack" in err
50
+ ? String(err.stack)
51
+ : ""
52
+
53
+ const newErr = new Error(message)
54
+ newErr.stack = Function.pipe(
55
+ stack.split("\n"),
56
+ Array.takeWhile((s) => !ExternalStackTraceLineRegexp.test(s)),
57
+ Array.join("\n"),
58
+ )
59
+
60
+ throw newErr
61
+ }
@@ -1,30 +1,63 @@
1
- import * as System from "../../System.js";
2
- import { Config, Effect, Layer, LogLevel, Option, pipe, Stream, String } from "effect";
3
- export const start = (opts) => Effect.gen(function* () {
4
- const command = opts.command ?? "cloudflared";
5
- yield* System.which(command);
6
- const logPrefix = String.isString(opts.logPrefix) ? opts.logPrefix : "CloudflareTunnel: ";
1
+ import * as System from "../../System.js"
2
+ import { Config, Effect, Layer, LogLevel, Option, pipe, Stream, String } from "effect"
3
+
4
+ export const start = (opts) =>
5
+ Effect.gen(function* () {
6
+ const command = opts.command ?? "cloudflared"
7
+ yield* System.which(command)
8
+ const logPrefix = String.isString(opts.logPrefix) ? opts.logPrefix : "CloudflareTunnel: "
7
9
  const args = [
8
- "tunnel",
9
- "run",
10
- opts.tunnelUrl ? ["--url", opts.tunnelUrl] : [],
11
- opts.tunnelName,
12
- ].flatMap((v) => v);
13
- const proc = yield* System.spawn(command, args);
14
- yield* Effect.logInfo(`Cloudflare tunnel started name=${opts.tunnelName} pid=${proc.pid} tunnelUrl=${opts.tunnelUrl ?? "<empty>"}`);
15
- yield* pipe(Stream.merge(proc.stdout, proc.stderr), Stream.decodeText("utf-8"), Stream.splitLines, (opts.cleanLogs ?? true)
10
+ "tunnel",
11
+ "run",
12
+ opts.tunnelUrl ? ["--url", opts.tunnelUrl] : [],
13
+ opts.tunnelName,
14
+ ].flatMap((v) => v)
15
+
16
+ const proc = yield* System.spawn(command, args)
17
+
18
+ yield* Effect.logInfo(
19
+ `Cloudflare tunnel started name=${opts.tunnelName} pid=${proc.pid} tunnelUrl=${
20
+ opts.tunnelUrl ?? "<empty>"
21
+ }`,
22
+ )
23
+
24
+ yield* pipe(
25
+ Stream.merge(proc.stdout, proc.stderr),
26
+ Stream.decodeText("utf-8"),
27
+ Stream.splitLines,
28
+ (opts.cleanLogs ?? true)
16
29
  ? Stream.map((v) => v.replace(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z\s\w+\s/, ""))
17
- : (s) => s, logPrefix ? Stream.map((v) => logPrefix + v) : (s) => s, Stream.runForEach((v) => Effect.logWithLevel(opts.logLevel ?? LogLevel.Debug, v)));
18
- });
19
- export const layer = () => Layer.scopedDiscard(Effect.gen(function* () {
20
- const tunnelName = yield* pipe(Config.string("CLOUDFLARE_TUNNEL_NAME"), Config.option, Effect.andThen(Option.getOrUndefined));
21
- const tunnelUrl = yield* pipe(Config.string("CLOUDFLARE_TUNNEL_URL"), Config.option, Effect.andThen(Option.getOrUndefined));
22
- if (!tunnelName) {
23
- yield* Effect.logWarning("CLOUDFLARE_TUNNEL_NAME not provided. Skipping.");
24
- return;
25
- }
26
- yield* Effect.forkScoped(start({
27
- tunnelName,
28
- tunnelUrl,
29
- }).pipe(Effect.catchAll((err) => Effect.logError("Cloudflare tunnel failed", err))));
30
- }));
30
+ : (s) => s,
31
+ logPrefix ? Stream.map((v) => logPrefix + v) : (s) => s,
32
+ Stream.runForEach((v) => Effect.logWithLevel(opts.logLevel ?? LogLevel.Debug, v)),
33
+ )
34
+ })
35
+
36
+ export const layer = () =>
37
+ Layer.scopedDiscard(
38
+ Effect.gen(function* () {
39
+ const tunnelName = yield* pipe(
40
+ Config.string("CLOUDFLARE_TUNNEL_NAME"),
41
+ Config.option,
42
+ Effect.andThen(Option.getOrUndefined),
43
+ )
44
+ const tunnelUrl = yield* pipe(
45
+ Config.string("CLOUDFLARE_TUNNEL_URL"),
46
+ Config.option,
47
+ Effect.andThen(Option.getOrUndefined),
48
+ )
49
+
50
+ if (!tunnelName) {
51
+ yield* Effect.logWarning("CLOUDFLARE_TUNNEL_NAME not provided. Skipping.")
52
+
53
+ return
54
+ }
55
+
56
+ yield* Effect.forkScoped(
57
+ start({
58
+ tunnelName,
59
+ tunnelUrl,
60
+ }).pipe(Effect.catchAll((err) => Effect.logError("Cloudflare tunnel failed", err))),
61
+ )
62
+ }),
63
+ )
@@ -1 +1 @@
1
- export * as CloudflareTunnel from "./CloudflareTunnel.js";
1
+ export * as CloudflareTunnel from "./CloudflareTunnel.js"