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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "effect-start",
3
- "version": "0.23.1",
3
+ "version": "0.26.0",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "src/",
@@ -12,92 +12,24 @@
12
12
  ],
13
13
  "type": "module",
14
14
  "exports": {
15
- ".": {
16
- "types": "./dist/index.d.ts",
17
- "bun": "./src/index.ts",
18
- "default": "./dist/index.js"
19
- },
20
- "./bun": {
21
- "types": "./dist/bun/index.d.ts",
22
- "bun": "./src/bun/index.ts",
23
- "default": "./dist/bun/index.js"
24
- },
25
- "./client": {
26
- "types": "./dist/client/index.d.ts",
27
- "bun": "./src/client/index.ts",
28
- "default": "./dist/client/index.js"
29
- },
30
- "./testing": {
31
- "types": "./dist/testing/index.d.ts",
32
- "bun": "./src/testing/index.ts",
33
- "default": "./dist/testing/index.js"
34
- },
35
- "./console": {
36
- "types": "./dist/console/index.d.ts",
37
- "bun": "./src/console/index.ts",
38
- "default": "./dist/console/index.js"
39
- },
40
- "./sql/*": {
41
- "types": "./dist/sql/*/index.d.ts",
42
- "bun": "./src/sql/*/index.ts",
43
- "default": "./dist/sql/*/index.js"
44
- },
45
- "./x/*": {
46
- "types": "./dist/x/*/index.d.ts",
47
- "bun": "./src/x/*/index.ts",
48
- "default": "./dist/x/*/index.js"
49
- },
50
- "./x/tailwind/plugin": {
51
- "types": "./dist/x/tailwind/plugin.d.ts",
52
- "bun": "./src/x/tailwind/plugin.ts",
53
- "default": "./dist/x/tailwind/plugin.js"
54
- },
55
- "./System": {
56
- "types": "./dist/System.d.ts",
57
- "bun": "./src/System.ts",
58
- "default": "./dist/System.js"
59
- },
60
- "./Unique": {
61
- "types": "./dist/Unique.d.ts",
62
- "bun": "./src/Unique.ts",
63
- "default": "./dist/Unique.js"
64
- },
65
- "./FileRouter": {
66
- "types": "./dist/FileRouter.d.ts",
67
- "bun": "./src/FileRouter.ts",
68
- "default": "./dist/FileRouter.js"
69
- },
70
- "./FileSystem": {
71
- "types": "./dist/FileSystem.d.ts",
72
- "bun": "./src/FileSystem.ts",
73
- "default": "./dist/FileSystem.js"
74
- },
75
- "./experimental": {
76
- "types": "./dist/experimental/index.d.ts",
77
- "bun": "./src/experimental/index.ts",
78
- "default": "./dist/experimental/index.js"
79
- },
15
+ ".": "./src/index.ts",
16
+ "./bun": "./src/bun/index.ts",
17
+ "./client": "./src/client/index.ts",
18
+ "./testing": "./src/testing/index.ts",
19
+ "./console": "./src/console/index.ts",
20
+ "./sql/*": "./src/sql/*/index.ts",
21
+ "./x/*": "./src/x/*/index.ts",
22
+ "./x/tailwind/plugin": "./src/x/tailwind/plugin.ts",
23
+ "./System": "./src/System.ts",
24
+ "./Unique": "./src/Unique.ts",
25
+ "./FileRouter": "./src/FileRouter.ts",
26
+ "./FileSystem": "./src/FileSystem.ts",
27
+ "./experimental": "./src/experimental/index.ts",
80
28
  "./client/assets.d.ts": "./src/assets.d.ts",
81
- "./hyper": {
82
- "types": "./dist/hyper/index.d.ts",
83
- "bun": "./src/hyper/index.ts",
84
- "default": "./dist/hyper/index.js"
85
- },
86
- "./jsx-runtime": {
87
- "types": "./src/hyper/jsx-runtime.ts",
88
- "bun": "./src/hyper/jsx-runtime.ts",
89
- "default": "./dist/hyper/jsx-runtime.js"
90
- },
91
- "./jsx-dev-runtime": {
92
- "types": "./src/hyper/jsx-runtime.ts",
93
- "bun": "./src/hyper/jsx-runtime.ts",
94
- "default": "./dist/hyper/jsx-runtime.js"
95
- },
96
- "./datastar": {
97
- "types": "./dist/datastar/index.d.ts",
98
- "bun": "./src/datastar/index.ts",
99
- "default": "./dist/datastar/index.js"
100
- },
29
+ "./hyper": "./src/hyper/index.ts",
30
+ "./jsx-runtime": "./src/hyper/jsx-runtime.ts",
31
+ "./jsx-dev-runtime": "./src/hyper/jsx-runtime.ts",
32
+ "./datastar": "./src/datastar/index.ts",
101
33
  "./lint/plugin": "./src/lint/plugin.js",
102
34
  "./package.json": "./package.json"
103
35
  },
@@ -104,10 +104,12 @@ export const layerWatch = (opts?: {
104
104
  filter?: (event: FileSystem.WatchEvent) => boolean
105
105
  }) => Layer.scoped(Development, watch(opts))
106
106
 
107
+ export const option = Effect.serviceOption(Development)
108
+
107
109
  export const stream = (): Stream.Stream<DevelopmentEvent> =>
108
110
  Stream.unwrap(
109
111
  Function.pipe(
110
- Effect.serviceOption(Development),
112
+ option,
111
113
  Effect.map(
112
114
  Option.match({
113
115
  onNone: () => Stream.empty,
package/src/Entity.ts CHANGED
@@ -325,6 +325,23 @@ export function length(self: Entity): number | undefined {
325
325
  return undefined
326
326
  }
327
327
 
328
+ export function fromResponse(
329
+ response: Response,
330
+ request?: Request,
331
+ ): Entity<Effect.Effect<Uint8Array, Error, never>, Error> {
332
+ return make(
333
+ Effect.tryPromise({
334
+ try: () => response.arrayBuffer().then((buf) => new Uint8Array(buf)),
335
+ catch: (e) => (e instanceof Error ? e : new Error(String(e))),
336
+ }),
337
+ {
338
+ headers: Object.fromEntries(response.headers.entries()),
339
+ status: response.status,
340
+ url: response.url || request?.url,
341
+ },
342
+ )
343
+ }
344
+
328
345
  function mismatch(expected: Schema.Schema.Any, actual: unknown): ParseResult.ParseError {
329
346
  return new ParseResult.ParseError({
330
347
  issue: new ParseResult.Type(expected.ast, actual),
package/src/Fetch.ts ADDED
@@ -0,0 +1,271 @@
1
+ import * as Data from "effect/Data"
2
+ import * as Effect from "effect/Effect"
3
+ import * as Schedule from "effect/Schedule"
4
+ import * as Entity from "./Entity.ts"
5
+
6
+ const TypeId: unique symbol = Symbol.for("effect-start/FetchClient")
7
+ type TypeId = typeof TypeId
8
+
9
+ export type FetchEntity = Entity.Entity<Effect.Effect<Uint8Array, FetchError, never>, FetchError>
10
+
11
+ export class FetchError extends Data.TaggedError("FetchError")<{
12
+ readonly reason: "Network" | "Status"
13
+ readonly cause?: unknown
14
+ readonly request?: Request
15
+ readonly response?: FetchEntity
16
+ }> {}
17
+
18
+ type Next = (request: Request) => Effect.Effect<FetchEntity, FetchError, never>
19
+
20
+ export type Middleware<E = never, R = never> = (
21
+ request: Request,
22
+ next: Next,
23
+ ) => Effect.Effect<FetchEntity, FetchError | E, R>
24
+
25
+ const tryFetch: Middleware = (request) =>
26
+ Effect.map(
27
+ Effect.tryPromise({
28
+ try: () => globalThis.fetch(request),
29
+ catch: (e) => new FetchError({ reason: "Network", cause: e, request }),
30
+ }),
31
+ (response) => Entity.fromResponse(response, request) as FetchEntity,
32
+ )
33
+
34
+ const defaultMiddleware: ReadonlyArray<Middleware> = [tryFetch]
35
+ const noopNext: Next = () => Effect.die("no middleware")
36
+
37
+ function withTrace<E, R>(
38
+ request: Request,
39
+ effect: Effect.Effect<FetchEntity, E, R>,
40
+ ): Effect.Effect<FetchEntity, E, R> {
41
+ const url = new URL(request.url)
42
+
43
+ return Effect.useSpan(
44
+ `http.client ${request.method}`,
45
+ { kind: "client", captureStackTrace: false },
46
+ (span) => {
47
+ span.attribute("http.request.method", request.method)
48
+ span.attribute("url.full", url.toString())
49
+ span.attribute("url.path", url.pathname)
50
+ const query = url.search.slice(1)
51
+ if (query !== "") {
52
+ span.attribute("url.query", query)
53
+ }
54
+ span.attribute("url.scheme", url.protocol.slice(0, -1))
55
+
56
+ return Effect.flatMap(Effect.exit(Effect.withParentSpan(effect, span)), (exit) => {
57
+ if (exit._tag === "Success") {
58
+ span.attribute("http.response.status_code", exit.value.status ?? 0)
59
+ }
60
+ return exit
61
+ })
62
+ },
63
+ )
64
+ }
65
+
66
+ export interface FetchClient<E = never, R = never> {
67
+ readonly [TypeId]: TypeId
68
+ readonly middleware: ReadonlyArray<Middleware<any, any>>
69
+ readonly fetch: (
70
+ input: string | URL | Request,
71
+ init?: RequestInit,
72
+ ) => Effect.Effect<FetchEntity, FetchError | E, R>
73
+ readonly get: (
74
+ input: string | URL | Request,
75
+ init?: Omit<RequestInit, "method">,
76
+ ) => Effect.Effect<FetchEntity, FetchError | E, R>
77
+ readonly post: (
78
+ input: string | URL | Request,
79
+ init?: Omit<RequestInit, "method">,
80
+ ) => Effect.Effect<FetchEntity, FetchError | E, R>
81
+ readonly use: <E2, R2>(
82
+ ...middleware: ReadonlyArray<Middleware<E2, R2>>
83
+ ) => FetchClient<E | E2, R | R2>
84
+ }
85
+
86
+ export function fetch(
87
+ input: string | URL | Request,
88
+ init?: RequestInit,
89
+ ): Effect.Effect<FetchEntity, FetchError>
90
+ export function fetch<E, R>(
91
+ this: FetchClient<E, R>,
92
+ input: string | URL | Request,
93
+ init?: RequestInit,
94
+ ): Effect.Effect<FetchEntity, FetchError | E, R>
95
+ export function fetch(
96
+ this: void | FetchClient<any, any>,
97
+ input: string | URL | Request,
98
+ init?: RequestInit,
99
+ ): Effect.Effect<FetchEntity, any, any> {
100
+ const middleware: ReadonlyArray<Middleware<any, any>> =
101
+ (this as any)?.middleware ?? defaultMiddleware
102
+ return Effect.gen(function* () {
103
+ const request = new Request(input, init)
104
+
105
+ let handler: Next = noopNext as Next
106
+ for (let i = middleware.length - 1; i >= 0; i--) {
107
+ const nextHandler = handler
108
+ handler = ((req: Request) => middleware[i](req, nextHandler)) as Next
109
+ }
110
+
111
+ return yield* withTrace(request, handler(request))
112
+ }) as any
113
+ }
114
+
115
+ export function get(
116
+ input: string | URL | Request,
117
+ init?: Omit<RequestInit, "method">,
118
+ ): Effect.Effect<FetchEntity, FetchError>
119
+ export function get<E, R>(
120
+ this: FetchClient<E, R>,
121
+ input: string | URL | Request,
122
+ init?: Omit<RequestInit, "method">,
123
+ ): Effect.Effect<FetchEntity, FetchError | E, R>
124
+ export function get(
125
+ this: void | FetchClient<any, any>,
126
+ input: string | URL | Request,
127
+ init?: Omit<RequestInit, "method">,
128
+ ): Effect.Effect<FetchEntity, any, any> {
129
+ return fetch.call(this as any, input, { ...init, method: "GET" }) as any
130
+ }
131
+
132
+ export function post(
133
+ input: string | URL | Request,
134
+ init?: Omit<RequestInit, "method">,
135
+ ): Effect.Effect<FetchEntity, FetchError>
136
+ export function post<E, R>(
137
+ this: FetchClient<E, R>,
138
+ input: string | URL | Request,
139
+ init?: Omit<RequestInit, "method">,
140
+ ): Effect.Effect<FetchEntity, FetchError | E, R>
141
+ export function post(
142
+ this: void | FetchClient<any, any>,
143
+ input: string | URL | Request,
144
+ init?: Omit<RequestInit, "method">,
145
+ ): Effect.Effect<FetchEntity, any, any> {
146
+ return fetch.call(this as any, input, { ...init, method: "POST" }) as any
147
+ }
148
+
149
+ export function use<E2, R2>(...middleware: ReadonlyArray<Middleware<E2, R2>>): FetchClient<E2, R2>
150
+ export function use<E, R, E2, R2>(
151
+ this: FetchClient<E, R>,
152
+ ...middleware: ReadonlyArray<Middleware<E2, R2>>
153
+ ): FetchClient<E | E2, R | R2>
154
+ export function use(
155
+ this: void | FetchClient<any, any>,
156
+ ...middleware: ReadonlyArray<Middleware<any, any>>
157
+ ): FetchClient<any, any> {
158
+ const base = (this as any)?.middleware ?? defaultMiddleware
159
+ const transport = base[base.length - 1]
160
+ const existing = base.slice(0, -1)
161
+ return Object.create(ClientProto, {
162
+ middleware: { value: [...existing, ...middleware, transport] },
163
+ }) as FetchClient<any, any>
164
+ }
165
+
166
+ const ClientProto: any = {
167
+ [TypeId]: TypeId,
168
+ middleware: defaultMiddleware,
169
+ fetch,
170
+ get,
171
+ post,
172
+ use,
173
+ }
174
+
175
+ export function filterStatus(
176
+ predicate: (status: number) => boolean,
177
+ options?: {
178
+ readonly orElse?: (entity: FetchEntity) => Effect.Effect<FetchEntity, any, any>
179
+ },
180
+ ): Middleware<FetchError> {
181
+ return ((_request: Request, next: Next) =>
182
+ Effect.gen(function* () {
183
+ const entity = yield* next(_request)
184
+ const status = entity.status ?? 0
185
+ if (predicate(status)) {
186
+ return entity
187
+ }
188
+ if (options?.orElse) {
189
+ return yield* options.orElse(entity)
190
+ }
191
+ return yield* Effect.fail(new FetchError({ reason: "Status", response: entity }))
192
+ })) as Middleware<FetchError>
193
+ }
194
+
195
+ export function filterStatusOk(options?: {
196
+ readonly orElse?: (entity: FetchEntity) => Effect.Effect<FetchEntity, any, any>
197
+ }): Middleware<FetchError> {
198
+ return filterStatus((status) => status >= 200 && status < 300, options)
199
+ }
200
+
201
+ export function followRedirects(options?: { readonly maxRedirects?: number }): Middleware {
202
+ const maxRedirects = options?.maxRedirects ?? 10
203
+
204
+ return (request: Request, next: Next) =>
205
+ Effect.gen(function* () {
206
+ let currentRequest = new Request(request.url, {
207
+ ...request,
208
+ redirect: "manual",
209
+ })
210
+ let redirectCount = 0
211
+
212
+ while (true) {
213
+ const entity = yield* next(currentRequest)
214
+ const status = entity.status ?? 0
215
+
216
+ if (status >= 300 && status < 400) {
217
+ if (redirectCount >= maxRedirects) {
218
+ return entity
219
+ }
220
+
221
+ const location = entity.headers["location"]
222
+ if (!location) {
223
+ return entity
224
+ }
225
+
226
+ redirectCount++
227
+ const nextUrl = new URL(location, currentRequest.url)
228
+
229
+ if (status === 303) {
230
+ currentRequest = new Request(nextUrl.toString(), {
231
+ method: "GET",
232
+ headers: currentRequest.headers,
233
+ redirect: "manual",
234
+ })
235
+ } else {
236
+ currentRequest = new Request(nextUrl.toString(), {
237
+ method: currentRequest.method,
238
+ headers: currentRequest.headers,
239
+ body: currentRequest.body,
240
+ redirect: "manual",
241
+ })
242
+ }
243
+ } else {
244
+ return entity
245
+ }
246
+ }
247
+ })
248
+ }
249
+
250
+ export function retry(options: {
251
+ readonly times?: number
252
+ readonly delay?: number
253
+ readonly schedule?: Schedule.Schedule<any, any, any>
254
+ }): Middleware {
255
+ return ((request: Request, next: Next) => {
256
+ if (options.schedule) {
257
+ return Effect.retry(
258
+ Effect.suspend(() => next(request)),
259
+ options.schedule,
260
+ )
261
+ }
262
+
263
+ const times = options.times ?? 3
264
+ const delay = options.delay ?? 1000
265
+
266
+ return Effect.retry(
267
+ Effect.suspend(() => next(request)),
268
+ Schedule.intersect(Schedule.recurs(times), Schedule.exponential(delay)),
269
+ )
270
+ }) as Middleware
271
+ }
@@ -1,10 +1,6 @@
1
1
  import * as Effect from "effect/Effect"
2
2
  import * as Schema from "effect/Schema"
3
- import * as Sql from "./Sql.ts"
4
-
5
- // ---------------------------------------------------------------------------
6
- // Types
7
- // ---------------------------------------------------------------------------
3
+ import * as Sql from "./sql/Sql.ts"
8
4
 
9
5
  export interface Column {
10
6
  readonly tableSchema: string
@@ -58,10 +54,6 @@ export interface IntrospectOptions {
58
54
  readonly indexes?: boolean
59
55
  }
60
56
 
61
- // ---------------------------------------------------------------------------
62
- // SQLite
63
- // ---------------------------------------------------------------------------
64
-
65
57
  const sqliteColumns = `
66
58
  SELECT
67
59
  '' as tableSchema,
@@ -115,10 +107,6 @@ const sqliteIndexes = `
115
107
  ORDER BY m.name, il.name, ii.seqno
116
108
  `
117
109
 
118
- // ---------------------------------------------------------------------------
119
- // PostgreSQL
120
- // ---------------------------------------------------------------------------
121
-
122
110
  const postgresColumns = `
123
111
  SELECT
124
112
  c.table_schema as "tableSchema",
@@ -191,10 +179,6 @@ const postgresIndexes = `
191
179
  ORDER BY n.nspname, t.relname, i.relname, array_position(ix.indkey, a.attnum)
192
180
  `
193
181
 
194
- // ---------------------------------------------------------------------------
195
- // SQL Server (MSSQL)
196
- // ---------------------------------------------------------------------------
197
-
198
182
  const mssqlColumns = `
199
183
  SELECT
200
184
  s.name as tableSchema,
@@ -265,10 +249,6 @@ const mssqlIndexes = `
265
249
  ORDER BY s.name, t.name, i.name, ic.key_ordinal
266
250
  `
267
251
 
268
- // ---------------------------------------------------------------------------
269
- // Dialect resolution
270
- // ---------------------------------------------------------------------------
271
-
272
252
  export type Dialect = "sqlite" | "postgres" | "mssql"
273
253
 
274
254
  const dialectQueries: Record<Dialect, { columns: string; foreignKeys: string; indexes: string }> = {
@@ -281,10 +261,6 @@ const dialectQueries: Record<Dialect, { columns: string; foreignKeys: string; in
281
261
  mssql: { columns: mssqlColumns, foreignKeys: mssqlForeignKeys, indexes: mssqlIndexes },
282
262
  }
283
263
 
284
- // ---------------------------------------------------------------------------
285
- // Introspect
286
- // ---------------------------------------------------------------------------
287
-
288
264
  const singleColumnIndexes = (indexes: ReadonlyArray<Index>): Set<string> => {
289
265
  const countByIndex = new Map<string, { count: number; columnName: string }>()
290
266
  for (const idx of indexes) {
@@ -377,10 +353,6 @@ export const introspect = (
377
353
  return { tables: groupByTable(columns, foreignKeys, indexes) }
378
354
  })
379
355
 
380
- // ---------------------------------------------------------------------------
381
- // Column → Schema mapping
382
- // ---------------------------------------------------------------------------
383
-
384
356
  const dataTypeToSchema = (dataType: string): Schema.Schema.Any | null => {
385
357
  const t = dataType.toLowerCase()
386
358
  if (
@@ -452,10 +424,6 @@ const columnToSchema = (col: Column): Schema.Schema.Any | Schema.PropertySignatu
452
424
  return base
453
425
  }
454
426
 
455
- // ---------------------------------------------------------------------------
456
- // Table → Schema.Struct
457
- // ---------------------------------------------------------------------------
458
-
459
427
  export interface TableSchema {
460
428
  readonly tableName: string
461
429
  readonly tableSchema: string
@@ -487,10 +455,6 @@ export const toSchemas = (db: DatabaseSchema): ReadonlyArray<TableSchema> =>
487
455
  return s ? [s] : []
488
456
  })
489
457
 
490
- // ---------------------------------------------------------------------------
491
- // Read-only table access
492
- // ---------------------------------------------------------------------------
493
-
494
458
  export interface SortOrder {
495
459
  readonly column: string
496
460
  readonly reverse?: boolean
@@ -531,28 +495,51 @@ export interface DatabaseReader {
531
495
 
532
496
  const escapeIdentifier = (id: string): string => `"${id.replace(/"/g, '""')}"`
533
497
 
534
- const buildWhereClause = (
498
+ const concatSql = (
499
+ sql: Sql.SqlQuery,
500
+ fragments: Array<{ strings: ReadonlyArray<string>; values: Array<unknown> }>,
501
+ ): Effect.Effect<ReadonlyArray<unknown>, Sql.SqlError> => {
502
+ const strings: Array<string> = []
503
+ const values: Array<unknown> = []
504
+ for (let i = 0; i < fragments.length; i++) {
505
+ const frag = fragments[i]
506
+ for (let j = 0; j < frag.strings.length; j++) {
507
+ if (j === 0 && strings.length > 0) {
508
+ strings[strings.length - 1] += frag.strings[j]
509
+ } else {
510
+ strings.push(frag.strings[j])
511
+ }
512
+ if (j < frag.values.length) values.push(frag.values[j])
513
+ }
514
+ }
515
+ const tsa = Object.assign([...strings], { raw: strings }) as unknown as TemplateStringsArray
516
+ return sql(tsa, ...values)
517
+ }
518
+
519
+ const literal = (text: string) => ({ strings: [text], values: [] as Array<unknown> })
520
+
521
+ const param = (value: unknown) => ({ strings: ["", ""], values: [value] })
522
+
523
+ const buildWhereFragments = (
535
524
  filters: ReadonlyArray<Filter>,
536
525
  columnSet: Set<string>,
537
- paramOffset: number,
538
- ): { clause: string; values: Array<unknown> } => {
539
- const conditions: Array<string> = []
540
- const values: Array<unknown> = []
541
- for (const f of filters) {
542
- if (!columnSet.has(f.column)) continue
526
+ ): Array<{ strings: ReadonlyArray<string>; values: Array<unknown> }> => {
527
+ const parts: Array<{ strings: ReadonlyArray<string>; values: Array<unknown> }> = []
528
+ const valid = filters.filter((f) => columnSet.has(f.column))
529
+ if (valid.length === 0) return parts
530
+ parts.push(literal(" WHERE "))
531
+ for (let i = 0; i < valid.length; i++) {
532
+ if (i > 0) parts.push(literal(" AND "))
533
+ const f = valid[i]
543
534
  const col = escapeIdentifier(f.column)
544
- const paramIndex = paramOffset + values.length + 1
545
535
  if (f.value === null) {
546
- conditions.push(f.op === "eq" ? `${col} IS NULL` : `${col} IS NOT NULL`)
536
+ parts.push(literal(f.op === "eq" ? `${col} IS NULL` : `${col} IS NOT NULL`))
547
537
  } else {
548
- conditions.push(`${col} ${f.op === "eq" ? "=" : "!="} $${paramIndex}`)
549
- values.push(f.value)
538
+ parts.push(literal(`${col} ${f.op === "eq" ? "=" : "!="} `))
539
+ parts.push(param(f.value))
550
540
  }
551
541
  }
552
- return {
553
- clause: conditions.length > 0 ? ` WHERE ${conditions.join(" AND ")}` : "",
554
- values,
555
- }
542
+ return parts
556
543
  }
557
544
 
558
545
  const makeTableReader = (ts: TableSchema): TableReader => {
@@ -573,39 +560,46 @@ const makeTableReader = (ts: TableSchema): TableReader => {
573
560
  findAll: (options) =>
574
561
  Effect.gen(function* () {
575
562
  const sql = yield* Sql.SqlClient
576
- let query = `SELECT ${selectCols} FROM ${qualifiedName}`
577
- const where = options?.filters
578
- ? buildWhereClause(options.filters, columnSet, 0)
579
- : { clause: "", values: [] }
580
- query += where.clause
563
+ const fragments: Array<{ strings: ReadonlyArray<string>; values: Array<unknown> }> = [
564
+ literal(`SELECT ${selectCols} FROM ${qualifiedName}`),
565
+ ]
566
+ if (options?.filters) {
567
+ fragments.push(...buildWhereFragments(options.filters, columnSet))
568
+ }
581
569
  if (options?.sort && options.sort.length > 0) {
582
570
  const sortClauses = options.sort
583
571
  .filter((s) => sortableSet.has(s.column))
584
572
  .map((s) => `${escapeIdentifier(s.column)} ${s.reverse ? "DESC" : "ASC"}`)
585
- if (sortClauses.length > 0) query += ` ORDER BY ${sortClauses.join(", ")}`
573
+ if (sortClauses.length > 0) fragments.push(literal(` ORDER BY ${sortClauses.join(", ")}`))
586
574
  }
587
- if (options?.limit !== undefined) query += ` LIMIT ${Number(options.limit)}`
588
- if (options?.offset !== undefined) query += ` OFFSET ${Number(options.offset)}`
589
- return yield* sql.unsafe(query, where.values)
575
+ if (options?.limit !== undefined)
576
+ fragments.push(literal(` LIMIT ${Math.trunc(Number(options.limit))}`))
577
+ if (options?.offset !== undefined)
578
+ fragments.push(literal(` OFFSET ${Math.trunc(Number(options.offset))}`))
579
+ return yield* concatSql(sql, fragments)
590
580
  }),
591
581
  findById: (id) =>
592
582
  Effect.gen(function* () {
593
583
  if (!primaryKey) return null
594
584
  const sql = yield* Sql.SqlClient
595
- const query = `SELECT ${selectCols} FROM ${qualifiedName} WHERE ${escapeIdentifier(primaryKey.columnName)} = $1`
596
- const rows = yield* sql.unsafe(query, [id])
585
+ const pkCol = escapeIdentifier(primaryKey.columnName)
586
+ const rows = yield* concatSql(sql, [
587
+ literal(`SELECT ${selectCols} FROM ${qualifiedName} WHERE ${pkCol} = `),
588
+ param(id),
589
+ ])
597
590
  return rows[0] ?? null
598
591
  }),
599
592
  count: (options) =>
600
593
  Effect.gen(function* () {
601
594
  const sql = yield* Sql.SqlClient
602
- let query = `SELECT COUNT(*) as count FROM ${qualifiedName}`
603
- const where = options?.filters
604
- ? buildWhereClause(options.filters, columnSet, 0)
605
- : { clause: "", values: [] }
606
- query += where.clause
607
- const rows = yield* sql.unsafe<{ count: number }>(query, where.values)
608
- return Number(rows[0].count)
595
+ const fragments: Array<{ strings: ReadonlyArray<string>; values: Array<unknown> }> = [
596
+ literal(`SELECT COUNT(*) as count FROM ${qualifiedName}`),
597
+ ]
598
+ if (options?.filters) {
599
+ fragments.push(...buildWhereFragments(options.filters, columnSet))
600
+ }
601
+ const rows = yield* concatSql(sql, fragments)
602
+ return Number((rows[0] as any).count)
609
603
  }),
610
604
  }
611
605
  }