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,9 +1,7 @@
1
- import * as Effect from "effect/Effect";
2
- import * as Schema from "effect/Schema";
3
- import * as Sql from "./Sql.js";
4
- // ---------------------------------------------------------------------------
5
- // SQLite
6
- // ---------------------------------------------------------------------------
1
+ import * as Effect from "effect/Effect"
2
+ import * as Schema from "effect/Schema"
3
+ import * as Sql from "./sql/Sql.js"
4
+
7
5
  const sqliteColumns = `
8
6
  SELECT
9
7
  '' as tableSchema,
@@ -21,7 +19,8 @@ const sqliteColumns = `
21
19
  WHERE m.type = 'table'
22
20
  AND m.name NOT LIKE 'sqlite_%'
23
21
  ORDER BY m.name, p.cid
24
- `;
22
+ `
23
+
25
24
  const sqliteForeignKeys = `
26
25
  SELECT
27
26
  '' as constraintName,
@@ -38,7 +37,8 @@ const sqliteForeignKeys = `
38
37
  WHERE m.type = 'table'
39
38
  AND m.name NOT LIKE 'sqlite_%'
40
39
  ORDER BY m.name, fk.seq
41
- `;
40
+ `
41
+
42
42
  const sqliteIndexes = `
43
43
  SELECT
44
44
  '' as tableSchema,
@@ -53,10 +53,8 @@ const sqliteIndexes = `
53
53
  WHERE m.type = 'table'
54
54
  AND m.name NOT LIKE 'sqlite_%'
55
55
  ORDER BY m.name, il.name, ii.seqno
56
- `;
57
- // ---------------------------------------------------------------------------
58
- // PostgreSQL
59
- // ---------------------------------------------------------------------------
56
+ `
57
+
60
58
  const postgresColumns = `
61
59
  SELECT
62
60
  c.table_schema as "tableSchema",
@@ -83,7 +81,8 @@ const postgresColumns = `
83
81
  AND c.column_name = pk.column_name
84
82
  WHERE c.table_schema NOT IN ('information_schema', 'pg_catalog')
85
83
  ORDER BY c.table_schema, c.table_name, c.ordinal_position
86
- `;
84
+ `
85
+
87
86
  const postgresForeignKeys = `
88
87
  SELECT
89
88
  tc.constraint_name as "constraintName",
@@ -108,7 +107,8 @@ const postgresForeignKeys = `
108
107
  WHERE tc.constraint_type = 'FOREIGN KEY'
109
108
  AND tc.table_schema NOT IN ('information_schema', 'pg_catalog')
110
109
  ORDER BY tc.table_schema, tc.table_name, kcu.ordinal_position
111
- `;
110
+ `
111
+
112
112
  const postgresIndexes = `
113
113
  SELECT
114
114
  n.nspname as "tableSchema",
@@ -125,10 +125,8 @@ const postgresIndexes = `
125
125
  AND a.attnum = ANY(ix.indkey)
126
126
  WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')
127
127
  ORDER BY n.nspname, t.relname, i.relname, array_position(ix.indkey, a.attnum)
128
- `;
129
- // ---------------------------------------------------------------------------
130
- // SQL Server (MSSQL)
131
- // ---------------------------------------------------------------------------
128
+ `
129
+
132
130
  const mssqlColumns = `
133
131
  SELECT
134
132
  s.name as tableSchema,
@@ -154,7 +152,8 @@ const mssqlColumns = `
154
152
  ) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id
155
153
  WHERE t.is_ms_shipped = 0
156
154
  ORDER BY s.name, t.name, c.column_id
157
- `;
155
+ `
156
+
158
157
  const mssqlForeignKeys = `
159
158
  SELECT
160
159
  fk.name as constraintName,
@@ -176,7 +175,8 @@ const mssqlForeignKeys = `
176
175
  JOIN sys.columns rc ON fkc.referenced_object_id = rc.object_id AND fkc.referenced_column_id = rc.column_id
177
176
  WHERE t.is_ms_shipped = 0
178
177
  ORDER BY s.name, t.name, fkc.constraint_column_id
179
- `;
178
+ `
179
+
180
180
  const mssqlIndexes = `
181
181
  SELECT
182
182
  s.name as tableSchema,
@@ -195,272 +195,321 @@ const mssqlIndexes = `
195
195
  AND i.is_primary_key = 0
196
196
  AND ic.is_included_column = 0
197
197
  ORDER BY s.name, t.name, i.name, ic.key_ordinal
198
- `;
198
+ `
199
+
199
200
  const dialectQueries = {
200
- sqlite: { columns: sqliteColumns, foreignKeys: sqliteForeignKeys, indexes: sqliteIndexes },
201
- postgres: {
202
- columns: postgresColumns,
203
- foreignKeys: postgresForeignKeys,
204
- indexes: postgresIndexes,
205
- },
206
- mssql: { columns: mssqlColumns, foreignKeys: mssqlForeignKeys, indexes: mssqlIndexes },
207
- };
208
- // ---------------------------------------------------------------------------
209
- // Introspect
210
- // ---------------------------------------------------------------------------
201
+ sqlite: { columns: sqliteColumns, foreignKeys: sqliteForeignKeys, indexes: sqliteIndexes },
202
+ postgres: {
203
+ columns: postgresColumns,
204
+ foreignKeys: postgresForeignKeys,
205
+ indexes: postgresIndexes,
206
+ },
207
+ mssql: { columns: mssqlColumns, foreignKeys: mssqlForeignKeys, indexes: mssqlIndexes },
208
+ }
209
+
211
210
  const singleColumnIndexes = (indexes) => {
212
- const countByIndex = new Map();
213
- for (const idx of indexes) {
214
- const key = `${idx.tableSchema}.${idx.tableName}.${idx.indexName}`;
215
- const existing = countByIndex.get(key);
216
- if (existing) {
217
- existing.count++;
218
- }
219
- else {
220
- countByIndex.set(key, { count: 1, columnName: idx.columnName });
221
- }
211
+ const countByIndex = new Map()
212
+ for (const idx of indexes) {
213
+ const key = `${idx.tableSchema}.${idx.tableName}.${idx.indexName}`
214
+ const existing = countByIndex.get(key)
215
+ if (existing) {
216
+ existing.count++
217
+ } else {
218
+ countByIndex.set(key, { count: 1, columnName: idx.columnName })
222
219
  }
223
- const result = new Set();
224
- for (const [key, entry] of countByIndex) {
225
- if (entry.count === 1) {
226
- const tableKey = key.substring(0, key.lastIndexOf("."));
227
- result.add(`${tableKey}.${entry.columnName}`);
228
- }
220
+ }
221
+ const result = new Set()
222
+ for (const [key, entry] of countByIndex) {
223
+ if (entry.count === 1) {
224
+ const tableKey = key.substring(0, key.lastIndexOf("."))
225
+ result.add(`${tableKey}.${entry.columnName}`)
229
226
  }
230
- return result;
231
- };
232
- const groupByTable = (columns, foreignKeys, indexes) => {
233
- const sortable = singleColumnIndexes(indexes);
234
- const tableMap = new Map();
235
- for (const col of columns) {
236
- const key = `${col.tableSchema}.${col.tableName}`;
237
- const fullCol = {
238
- ...col,
239
- isSortable: col.isPrimaryKey || sortable.has(`${key}.${col.columnName}`),
240
- };
241
- const existing = tableMap.get(key);
242
- if (existing) {
243
- ;
244
- existing.columns.push(fullCol);
245
- }
246
- else {
247
- tableMap.set(key, {
248
- tableSchema: col.tableSchema,
249
- tableName: col.tableName,
250
- columns: [fullCol],
251
- foreignKeys: [],
252
- indexes: [],
253
- });
254
- }
227
+ }
228
+ return result
229
+ }
230
+
231
+ const groupByTable = (
232
+ columns,
233
+ foreignKeys,
234
+ indexes,
235
+ ) => {
236
+ const sortable = singleColumnIndexes(indexes)
237
+ const tableMap = new Map()
238
+ for (const col of columns) {
239
+ const key = `${col.tableSchema}.${col.tableName}`
240
+ const fullCol = {
241
+ ...col,
242
+ isSortable: col.isPrimaryKey || sortable.has(`${key}.${col.columnName}`),
255
243
  }
256
- for (const fk of foreignKeys) {
257
- const key = `${fk.tableSchema}.${fk.tableName}`;
258
- const table = tableMap.get(key);
259
- if (table) {
260
- ;
261
- table.foreignKeys.push(fk);
262
- }
244
+ const existing = tableMap.get(key)
245
+ if (existing) {
246
+ ;(existing.columns).push(fullCol)
247
+ } else {
248
+ tableMap.set(key, {
249
+ tableSchema: col.tableSchema,
250
+ tableName: col.tableName,
251
+ columns: [fullCol],
252
+ foreignKeys: [],
253
+ indexes: [],
254
+ })
263
255
  }
264
- for (const idx of indexes) {
265
- const key = `${idx.tableSchema}.${idx.tableName}`;
266
- const table = tableMap.get(key);
267
- if (table) {
268
- ;
269
- table.indexes.push(idx);
270
- }
256
+ }
257
+ for (const fk of foreignKeys) {
258
+ const key = `${fk.tableSchema}.${fk.tableName}`
259
+ const table = tableMap.get(key)
260
+ if (table) {
261
+ ;(table.foreignKeys).push(fk)
271
262
  }
272
- return Array.from(tableMap.values());
273
- };
274
- const normalizeBooleans = (columns) => columns.map((c) => ({
263
+ }
264
+ for (const idx of indexes) {
265
+ const key = `${idx.tableSchema}.${idx.tableName}`
266
+ const table = tableMap.get(key)
267
+ if (table) {
268
+ ;(table.indexes).push(idx)
269
+ }
270
+ }
271
+ return Array.from(tableMap.values())
272
+ }
273
+
274
+ const normalizeBooleans = (columns) =>
275
+ columns.map((c) => ({
275
276
  ...c,
276
277
  isNullable: Boolean(c.isNullable),
277
278
  isPrimaryKey: Boolean(c.isPrimaryKey),
278
279
  isAutoIncrement: Boolean(c.isAutoIncrement),
279
- }));
280
- export const introspect = (dialect, options) => Effect.gen(function* () {
281
- const sql = yield* Sql.SqlClient;
282
- const q = dialectQueries[dialect];
283
- const columns = normalizeBooleans(yield* sql.unsafe(q.columns));
284
- const foreignKeys = options?.foreignKeys !== false ? yield* sql.unsafe(q.foreignKeys) : [];
285
- const indexes = options?.indexes !== false
280
+ }))
281
+
282
+ export const introspect = (
283
+ dialect,
284
+ options,
285
+ ) =>
286
+ Effect.gen(function* () {
287
+ const sql = yield* Sql.SqlClient
288
+ const q = dialectQueries[dialect]
289
+ const columns = normalizeBooleans(yield* sql.unsafe(q.columns))
290
+ const foreignKeys =
291
+ options?.foreignKeys !== false ? yield* sql.unsafe(q.foreignKeys) : []
292
+ const indexes =
293
+ options?.indexes !== false
286
294
  ? (yield* sql.unsafe(q.indexes)).map((i) => ({
287
295
  ...i,
288
296
  isUnique: Boolean(i.isUnique),
289
- }))
290
- : [];
291
- return { tables: groupByTable(columns, foreignKeys, indexes) };
292
- });
293
- // ---------------------------------------------------------------------------
294
- // Column → Schema mapping
295
- // ---------------------------------------------------------------------------
297
+ }))
298
+ : []
299
+ return { tables: groupByTable(columns, foreignKeys, indexes) }
300
+ })
301
+
296
302
  const dataTypeToSchema = (dataType) => {
297
- const t = dataType.toLowerCase();
298
- if (t === "integer" ||
299
- t === "int" ||
300
- t === "int4" ||
301
- t === "int8" ||
302
- t === "smallint" ||
303
- t === "tinyint" ||
304
- t === "mediumint" ||
305
- t === "bigint" ||
306
- t === "int2")
307
- return Schema.Number;
308
- if (t === "real" ||
309
- t === "double" ||
310
- t === "double precision" ||
311
- t === "float" ||
312
- t === "float4" ||
313
- t === "float8" ||
314
- t === "numeric" ||
315
- t === "decimal" ||
316
- t === "money" ||
317
- t === "smallmoney")
318
- return Schema.Number;
319
- if (t === "text" ||
320
- t === "varchar" ||
321
- t === "char" ||
322
- t === "nchar" ||
323
- t === "nvarchar" ||
324
- t === "ntext" ||
325
- t === "character varying" ||
326
- t === "character" ||
327
- t === "bpchar" ||
328
- t === "uuid" ||
329
- t === "citext" ||
330
- t === "name" ||
331
- t === "xml")
332
- return Schema.String;
333
- if (t === "boolean" || t === "bool" || t === "bit")
334
- return Schema.Union(Schema.Boolean, Schema.Number);
335
- if (t === "timestamp" ||
336
- t === "timestamptz" ||
337
- t === "timestamp with time zone" ||
338
- t === "timestamp without time zone" ||
339
- t === "date" ||
340
- t === "datetime" ||
341
- t === "datetime2" ||
342
- t === "smalldatetime" ||
343
- t === "datetimeoffset" ||
344
- t === "time")
345
- return Schema.String;
346
- if (t === "json" || t === "jsonb")
347
- return Schema.Unknown;
348
- if (t === "blob" || t === "bytea" || t === "varbinary" || t === "binary" || t === "image")
349
- return null;
350
- return null;
351
- };
303
+ const t = dataType.toLowerCase()
304
+ if (
305
+ t === "integer" ||
306
+ t === "int" ||
307
+ t === "int4" ||
308
+ t === "int8" ||
309
+ t === "smallint" ||
310
+ t === "tinyint" ||
311
+ t === "mediumint" ||
312
+ t === "bigint" ||
313
+ t === "int2"
314
+ )
315
+ return Schema.Number
316
+ if (
317
+ t === "real" ||
318
+ t === "double" ||
319
+ t === "double precision" ||
320
+ t === "float" ||
321
+ t === "float4" ||
322
+ t === "float8" ||
323
+ t === "numeric" ||
324
+ t === "decimal" ||
325
+ t === "money" ||
326
+ t === "smallmoney"
327
+ )
328
+ return Schema.Number
329
+ if (
330
+ t === "text" ||
331
+ t === "varchar" ||
332
+ t === "char" ||
333
+ t === "nchar" ||
334
+ t === "nvarchar" ||
335
+ t === "ntext" ||
336
+ t === "character varying" ||
337
+ t === "character" ||
338
+ t === "bpchar" ||
339
+ t === "uuid" ||
340
+ t === "citext" ||
341
+ t === "name" ||
342
+ t === "xml"
343
+ )
344
+ return Schema.String
345
+ if (t === "boolean" || t === "bool" || t === "bit")
346
+ return Schema.Union(Schema.Boolean, Schema.Number)
347
+ if (
348
+ t === "timestamp" ||
349
+ t === "timestamptz" ||
350
+ t === "timestamp with time zone" ||
351
+ t === "timestamp without time zone" ||
352
+ t === "date" ||
353
+ t === "datetime" ||
354
+ t === "datetime2" ||
355
+ t === "smalldatetime" ||
356
+ t === "datetimeoffset" ||
357
+ t === "time"
358
+ )
359
+ return Schema.String
360
+ if (t === "json" || t === "jsonb") return Schema.Unknown
361
+ if (t === "blob" || t === "bytea" || t === "varbinary" || t === "binary" || t === "image")
362
+ return null
363
+ return null
364
+ }
365
+
352
366
  const columnToSchema = (col) => {
353
- const base = dataTypeToSchema(col.dataType);
354
- if (base === null)
355
- return null;
356
- if (col.isNullable)
357
- return Schema.NullOr(base);
358
- return base;
359
- };
367
+ const base = dataTypeToSchema(col.dataType)
368
+ if (base === null) return null
369
+ if (col.isNullable) return Schema.NullOr(base)
370
+ return base
371
+ }
372
+
360
373
  export const tableToSchema = (table) => {
361
- const fields = {};
362
- let hasFields = false;
363
- for (const col of table.columns) {
364
- const s = columnToSchema(col);
365
- if (s === null)
366
- continue;
367
- fields[col.columnName] = s;
368
- hasFields = true;
374
+ const fields = {}
375
+ let hasFields = false
376
+ for (const col of table.columns) {
377
+ const s = columnToSchema(col)
378
+ if (s === null) continue
379
+ fields[col.columnName] = s
380
+ hasFields = true
381
+ }
382
+ if (!hasFields) return null
383
+ return {
384
+ tableName: table.tableName,
385
+ tableSchema: table.tableSchema,
386
+ schema: Schema.Struct(fields),
387
+ columns: table.columns.filter((c) => columnToSchema(c) !== null),
388
+ }
389
+ }
390
+
391
+ export const toSchemas = (db) =>
392
+ db.tables.flatMap((t) => {
393
+ const s = tableToSchema(t)
394
+ return s ? [s] : []
395
+ })
396
+
397
+ const escapeIdentifier = (id) => `"${id.replace(/"/g, '""')}"`
398
+
399
+ const concatSql = (
400
+ sql,
401
+ fragments,
402
+ ) => {
403
+ const strings = []
404
+ const values = []
405
+ for (let i = 0; i < fragments.length; i++) {
406
+ const frag = fragments[i]
407
+ for (let j = 0; j < frag.strings.length; j++) {
408
+ if (j === 0 && strings.length > 0) {
409
+ strings[strings.length - 1] += frag.strings[j]
410
+ } else {
411
+ strings.push(frag.strings[j])
412
+ }
413
+ if (j < frag.values.length) values.push(frag.values[j])
369
414
  }
370
- if (!hasFields)
371
- return null;
372
- return {
373
- tableName: table.tableName,
374
- tableSchema: table.tableSchema,
375
- schema: Schema.Struct(fields),
376
- columns: table.columns.filter((c) => columnToSchema(c) !== null),
377
- };
378
- };
379
- export const toSchemas = (db) => db.tables.flatMap((t) => {
380
- const s = tableToSchema(t);
381
- return s ? [s] : [];
382
- });
383
- const escapeIdentifier = (id) => `"${id.replace(/"/g, '""')}"`;
384
- const buildWhereClause = (filters, columnSet, paramOffset) => {
385
- const conditions = [];
386
- const values = [];
387
- for (const f of filters) {
388
- if (!columnSet.has(f.column))
389
- continue;
390
- const col = escapeIdentifier(f.column);
391
- const paramIndex = paramOffset + values.length + 1;
392
- if (f.value === null) {
393
- conditions.push(f.op === "eq" ? `${col} IS NULL` : `${col} IS NOT NULL`);
394
- }
395
- else {
396
- conditions.push(`${col} ${f.op === "eq" ? "=" : "!="} $${paramIndex}`);
397
- values.push(f.value);
398
- }
415
+ }
416
+ const tsa = Object.assign([...strings], { raw: strings })
417
+ return sql(tsa, ...values)
418
+ }
419
+
420
+ const literal = (text) => ({ strings: [text], values: [] })
421
+
422
+ const param = (value) => ({ strings: ["", ""], values: [value] })
423
+
424
+ const buildWhereFragments = (
425
+ filters,
426
+ columnSet,
427
+ ) => {
428
+ const parts = []
429
+ const valid = filters.filter((f) => columnSet.has(f.column))
430
+ if (valid.length === 0) return parts
431
+ parts.push(literal(" WHERE "))
432
+ for (let i = 0; i < valid.length; i++) {
433
+ if (i > 0) parts.push(literal(" AND "))
434
+ const f = valid[i]
435
+ const col = escapeIdentifier(f.column)
436
+ if (f.value === null) {
437
+ parts.push(literal(f.op === "eq" ? `${col} IS NULL` : `${col} IS NOT NULL`))
438
+ } else {
439
+ parts.push(literal(`${col} ${f.op === "eq" ? "=" : "!="} `))
440
+ parts.push(param(f.value))
399
441
  }
400
- return {
401
- clause: conditions.length > 0 ? ` WHERE ${conditions.join(" AND ")}` : "",
402
- values,
403
- };
404
- };
442
+ }
443
+ return parts
444
+ }
445
+
405
446
  const makeTableReader = (ts) => {
406
- const qualifiedName = ts.tableSchema
407
- ? `${escapeIdentifier(ts.tableSchema)}.${escapeIdentifier(ts.tableName)}`
408
- : escapeIdentifier(ts.tableName);
409
- const primaryKey = ts.columns.find((c) => c.isPrimaryKey);
410
- const selectCols = ts.columns.map((c) => escapeIdentifier(c.columnName)).join(", ");
411
- const columnSet = new Set(ts.columns.map((c) => c.columnName));
412
- const sortableSet = new Set(ts.columns.filter((c) => c.isSortable).map((c) => c.columnName));
413
- return {
414
- tableName: ts.tableName,
415
- tableSchema: ts.tableSchema,
416
- schema: ts.schema,
417
- columns: ts.columns,
418
- sortableColumns: Array.from(sortableSet),
419
- findAll: (options) => Effect.gen(function* () {
420
- const sql = yield* Sql.SqlClient;
421
- let query = `SELECT ${selectCols} FROM ${qualifiedName}`;
422
- const where = options?.filters
423
- ? buildWhereClause(options.filters, columnSet, 0)
424
- : { clause: "", values: [] };
425
- query += where.clause;
426
- if (options?.sort && options.sort.length > 0) {
427
- const sortClauses = options.sort
428
- .filter((s) => sortableSet.has(s.column))
429
- .map((s) => `${escapeIdentifier(s.column)} ${s.reverse ? "DESC" : "ASC"}`);
430
- if (sortClauses.length > 0)
431
- query += ` ORDER BY ${sortClauses.join(", ")}`;
432
- }
433
- if (options?.limit !== undefined)
434
- query += ` LIMIT ${Number(options.limit)}`;
435
- if (options?.offset !== undefined)
436
- query += ` OFFSET ${Number(options.offset)}`;
437
- return yield* sql.unsafe(query, where.values);
438
- }),
439
- findById: (id) => Effect.gen(function* () {
440
- if (!primaryKey)
441
- return null;
442
- const sql = yield* Sql.SqlClient;
443
- const query = `SELECT ${selectCols} FROM ${qualifiedName} WHERE ${escapeIdentifier(primaryKey.columnName)} = $1`;
444
- const rows = yield* sql.unsafe(query, [id]);
445
- return rows[0] ?? null;
446
- }),
447
- count: (options) => Effect.gen(function* () {
448
- const sql = yield* Sql.SqlClient;
449
- let query = `SELECT COUNT(*) as count FROM ${qualifiedName}`;
450
- const where = options?.filters
451
- ? buildWhereClause(options.filters, columnSet, 0)
452
- : { clause: "", values: [] };
453
- query += where.clause;
454
- const rows = yield* sql.unsafe(query, where.values);
455
- return Number(rows[0].count);
456
- }),
457
- };
458
- };
447
+ const qualifiedName = ts.tableSchema
448
+ ? `${escapeIdentifier(ts.tableSchema)}.${escapeIdentifier(ts.tableName)}`
449
+ : escapeIdentifier(ts.tableName)
450
+ const primaryKey = ts.columns.find((c) => c.isPrimaryKey)
451
+ const selectCols = ts.columns.map((c) => escapeIdentifier(c.columnName)).join(", ")
452
+ const columnSet = new Set(ts.columns.map((c) => c.columnName))
453
+ const sortableSet = new Set(ts.columns.filter((c) => c.isSortable).map((c) => c.columnName))
454
+
455
+ return {
456
+ tableName: ts.tableName,
457
+ tableSchema: ts.tableSchema,
458
+ schema: ts.schema,
459
+ columns: ts.columns,
460
+ sortableColumns: Array.from(sortableSet),
461
+ findAll: (options) =>
462
+ Effect.gen(function* () {
463
+ const sql = yield* Sql.SqlClient
464
+ const fragments = [
465
+ literal(`SELECT ${selectCols} FROM ${qualifiedName}`),
466
+ ]
467
+ if (options?.filters) {
468
+ fragments.push(...buildWhereFragments(options.filters, columnSet))
469
+ }
470
+ if (options?.sort && options.sort.length > 0) {
471
+ const sortClauses = options.sort
472
+ .filter((s) => sortableSet.has(s.column))
473
+ .map((s) => `${escapeIdentifier(s.column)} ${s.reverse ? "DESC" : "ASC"}`)
474
+ if (sortClauses.length > 0) fragments.push(literal(` ORDER BY ${sortClauses.join(", ")}`))
475
+ }
476
+ if (options?.limit !== undefined)
477
+ fragments.push(literal(` LIMIT ${Math.trunc(Number(options.limit))}`))
478
+ if (options?.offset !== undefined)
479
+ fragments.push(literal(` OFFSET ${Math.trunc(Number(options.offset))}`))
480
+ return yield* concatSql(sql, fragments)
481
+ }),
482
+ findById: (id) =>
483
+ Effect.gen(function* () {
484
+ if (!primaryKey) return null
485
+ const sql = yield* Sql.SqlClient
486
+ const pkCol = escapeIdentifier(primaryKey.columnName)
487
+ const rows = yield* concatSql(sql, [
488
+ literal(`SELECT ${selectCols} FROM ${qualifiedName} WHERE ${pkCol} = `),
489
+ param(id),
490
+ ])
491
+ return rows[0] ?? null
492
+ }),
493
+ count: (options) =>
494
+ Effect.gen(function* () {
495
+ const sql = yield* Sql.SqlClient
496
+ const fragments = [
497
+ literal(`SELECT COUNT(*) as count FROM ${qualifiedName}`),
498
+ ]
499
+ if (options?.filters) {
500
+ fragments.push(...buildWhereFragments(options.filters, columnSet))
501
+ }
502
+ const rows = yield* concatSql(sql, fragments)
503
+ return Number((rows[0]).count)
504
+ }),
505
+ }
506
+ }
507
+
459
508
  export const makeDatabaseReader = (db) => {
460
- const schemas = toSchemas(db);
461
- const readers = schemas.map(makeTableReader);
462
- return {
463
- tables: readers,
464
- table: (name) => readers.find((r) => r.tableName === name),
465
- };
466
- };
509
+ const schemas = toSchemas(db)
510
+ const readers = schemas.map(makeTableReader)
511
+ return {
512
+ tables: readers,
513
+ table: (name) => readers.find((r) => r.tableName === name),
514
+ }
515
+ }