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,227 +1,298 @@
1
- var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
- if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
- return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
- return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
- });
6
- }
7
- return path;
8
- };
9
- import * as FileSystem from "./FileSystem.js";
10
- import * as Effect from "effect/Effect";
11
- import * as Either from "effect/Either";
12
- import * as Schema from "effect/Schema";
13
- import * as NPath from "node:path";
14
- import * as FilePathPattern from "./FilePathPattern.js";
15
- import * as FileRouter from "./FileRouter.js";
16
- import * as SchemaExtra from "./SchemaExtra.js";
1
+ import * as FileSystem from "./FileSystem.js"
2
+ import * as Effect from "effect/Effect"
3
+ import * as Either from "effect/Either"
4
+ import * as Schema from "effect/Schema"
5
+ import * as NPath from "node:path"
6
+ import * as FilePathPattern from "./FilePathPattern.js"
7
+ import * as FileRouter from "./FileRouter.js"
8
+ import * as SchemaExtra from "./SchemaExtra.js"
9
+
17
10
  export function validateRouteModule(module) {
18
- if (typeof module !== "object" || module === null) {
19
- return false;
20
- }
21
- if (!("default" in module)) {
22
- return false;
23
- }
24
- // TODO: verify we're exporting a proper shape
25
- return true;
11
+ if (typeof module !== "object" || module === null) {
12
+ return false
13
+ }
14
+
15
+ if (!("default" in module)) {
16
+ return false
17
+ }
18
+
19
+ // TODO: verify we're exporting a proper shape
20
+ return true
26
21
  }
27
- export function generatePathParamsSchema(segments) {
28
- const fields = {};
29
- for (const segment of segments) {
30
- if (segment._tag === "ParamSegment") {
31
- fields[segment.name] = Schema.String;
32
- }
33
- else if (segment._tag === "RestSegment") {
34
- fields[segment.name] = Schema.optional(Schema.String);
35
- }
36
- }
37
- if (Object.keys(fields).length === 0) {
38
- return null;
22
+
23
+ export function generatePathParamsSchema(
24
+ segments,
25
+ ) {
26
+ const fields = {}
27
+
28
+ for (const segment of segments) {
29
+ if (segment._tag === "ParamSegment") {
30
+ fields[segment.name] = Schema.String
31
+ } else if (segment._tag === "RestSegment") {
32
+ fields[segment.name] = Schema.optional(Schema.String)
39
33
  }
40
- return Schema.Struct(fields);
34
+ }
35
+
36
+ if (Object.keys(fields).length === 0) {
37
+ return null
38
+ }
39
+
40
+ return Schema.Struct(fields)
41
41
  }
42
+
42
43
  /**
43
44
  * Validates all route modules in the given route handles.
44
45
  */
45
- export function validateRouteModules(path, routes) {
46
- return Effect.gen(function* () {
47
- const fs = yield* FileSystem.FileSystem;
48
- const routeHandles = routes.filter((h) => h.handle === "route");
49
- for (const handle of routeHandles) {
50
- const routeModulePath = NPath.resolve(path, handle.modulePath);
51
- const expectedSchema = generatePathParamsSchema(handle.segments);
52
- const fileExists = yield* fs
53
- .exists(routeModulePath)
54
- .pipe(Effect.catchAll(() => Effect.succeed(false)));
55
- if (!fileExists) {
56
- continue;
57
- }
58
- const module = yield* Effect.tryPromise({
59
- try: () => import(__rewriteRelativeImportExtension(routeModulePath)),
60
- catch: (cause) => new FileRouter.FileRouterError({
61
- reason: "Import",
62
- cause,
63
- path: routeModulePath,
64
- }),
65
- });
66
- if (!validateRouteModule(module)) {
67
- yield* Effect.logWarning(`Route module ${routeModulePath} should export default Route`);
68
- continue;
69
- }
70
- const routeSet = module.default;
71
- // extract user schema
72
- const userSchema = undefined;
73
- if (expectedSchema && userSchema && !SchemaExtra.schemaEqual(userSchema, expectedSchema)) {
74
- const relativeFilePath = NPath.relative(process.cwd(), routeModulePath);
75
- yield* Effect.logError(`Route '${relativeFilePath}' has incorrect PathParams schema, expected schemaPathParams(${SchemaExtra.formatSchemaCode(expectedSchema)})`);
76
- }
77
- }
78
- });
46
+
47
+ export function validateRouteModules(
48
+ path,
49
+ routes,
50
+ ) {
51
+ return Effect.gen(function* () {
52
+ const fs = yield* FileSystem.FileSystem
53
+ const routeHandles = routes.filter((h) => h.handle === "route")
54
+
55
+ for (const handle of routeHandles) {
56
+ const routeModulePath = NPath.resolve(path, handle.modulePath)
57
+ const expectedSchema = generatePathParamsSchema(handle.segments)
58
+
59
+ const fileExists = yield* fs
60
+ .exists(routeModulePath)
61
+ .pipe(Effect.catchAll(() => Effect.succeed(false)))
62
+ if (!fileExists) {
63
+ continue
64
+ }
65
+
66
+ const module = yield* Effect.tryPromise({
67
+ try: () => import(routeModulePath),
68
+ catch: (cause) =>
69
+ new FileRouter.FileRouterError({
70
+ reason: "Import",
71
+ cause,
72
+ path: routeModulePath,
73
+ }),
74
+ })
75
+
76
+ if (!validateRouteModule(module)) {
77
+ yield* Effect.logWarning(`Route module ${routeModulePath} should export default Route`)
78
+ continue
79
+ }
80
+
81
+ const routeSet = module.default
82
+ // extract user schema
83
+ const userSchema = undefined
84
+
85
+ if (expectedSchema && userSchema && !SchemaExtra.schemaEqual(userSchema, expectedSchema)) {
86
+ const relativeFilePath = NPath.relative(process.cwd(), routeModulePath)
87
+ yield* Effect.logError(
88
+ `Route '${relativeFilePath}' has incorrect PathParams schema, expected schemaPathParams(${SchemaExtra.formatSchemaCode(
89
+ expectedSchema,
90
+ )})`,
91
+ )
92
+ }
93
+ }
94
+ })
79
95
  }
96
+
80
97
  export function generateCode(fileRoutes) {
81
- // Group routes by path to find layers
82
- const routesByPath = new Map();
83
- for (const fileRoute of fileRoutes) {
84
- const existing = routesByPath.get(fileRoute.routePath) || { layers: [] };
85
- if (fileRoute.handle === "route") {
86
- existing.route = fileRoute;
87
- }
88
- else if (fileRoute.handle === "layer") {
89
- existing.layers.push(fileRoute);
90
- }
91
- routesByPath.set(fileRoute.routePath, existing);
98
+ // Group routes by path to find layers
99
+ const routesByPath = new Map()
100
+
101
+ for (const fileRoute of fileRoutes) {
102
+ const existing = routesByPath.get(fileRoute.routePath) || { layers: [] }
103
+ if (fileRoute.handle === "route") {
104
+ existing.route = fileRoute
105
+ } else if (fileRoute.handle === "layer") {
106
+ existing.layers.push(fileRoute)
92
107
  }
93
- // Helper to check if layer's path is an ancestor of route's path
94
- const layerMatchesRoute = (layer, route) => {
95
- const layerDir = layer.modulePath.replace(/\/(layer)\.(tsx?|jsx?)$/, "");
96
- if (layerDir === "/")
97
- return true;
98
- return route.modulePath.startsWith(layerDir + "/");
99
- };
100
- // Build entries for each route path
101
- const entries = [];
102
- for (const [path, { route }] of routesByPath) {
103
- if (!route)
104
- continue;
105
- // Collect all parent layers that match the route's groups
106
- const allLayers = [];
107
- let currentPath = path;
108
- while (true) {
109
- const pathData = routesByPath.get(currentPath);
110
- if (pathData?.layers) {
111
- const matchingLayers = pathData.layers.filter((layer) => layerMatchesRoute(layer, route));
112
- allLayers.unshift(...matchingLayers);
113
- }
114
- if (currentPath === "/")
115
- break;
116
- const parentPath = currentPath.substring(0, currentPath.lastIndexOf("/"));
117
- currentPath = parentPath || "/";
118
- }
119
- // Convert file-style path to colon-style PathPattern
120
- const pathPatternResult = FilePathPattern.toPathPattern(path);
121
- if (Either.isLeft(pathPatternResult)) {
122
- continue;
123
- }
124
- const pathPattern = pathPatternResult.right;
125
- // Order: route first, then layers from innermost to outermost
126
- const loaders = [
127
- `() => import(".${route.modulePath}")`,
128
- ...allLayers.reverse().map((layer) => `() => import(".${layer.modulePath}")`),
129
- ];
130
- entries.push({ path: pathPattern, loaders });
108
+ routesByPath.set(fileRoute.routePath, existing)
109
+ }
110
+
111
+ // Helper to check if layer's path is an ancestor of route's path
112
+ const layerMatchesRoute = (layer, route) => {
113
+ const layerDir = layer.modulePath.replace(/\/(layer)\.(tsx?|jsx?)$/, "")
114
+ if (layerDir === "/") return true
115
+ return route.modulePath.startsWith(layerDir + "/")
116
+ }
117
+
118
+ // Build entries for each route path
119
+ const entries = []
120
+
121
+ for (const [path, { route }] of routesByPath) {
122
+ if (!route) continue
123
+
124
+ // Collect all parent layers that match the route's groups
125
+ const allLayers = []
126
+ let currentPath = path
127
+
128
+ while (true) {
129
+ const pathData = routesByPath.get(currentPath)
130
+ if (pathData?.layers) {
131
+ const matchingLayers = pathData.layers.filter((layer) => layerMatchesRoute(layer, route))
132
+ allLayers.unshift(...matchingLayers)
133
+ }
134
+
135
+ if (currentPath === "/") break
136
+
137
+ const parentPath = currentPath.substring(0, currentPath.lastIndexOf("/"))
138
+ currentPath = parentPath || "/"
131
139
  }
132
- // No routes found - don't create file
133
- if (entries.length === 0) {
134
- return null;
140
+
141
+ // Convert file-style path to colon-style PathPattern
142
+ const pathPatternResult = FilePathPattern.toPathPattern(path)
143
+ if (Either.isLeft(pathPatternResult)) {
144
+ continue
135
145
  }
136
- const routeEntries = entries
137
- .map(({ path, loaders }) => {
138
- const loadersCode = loaders.join(",\n ");
139
- return ` "${path}": [\n ${loadersCode},\n ]`;
146
+ const pathPattern = pathPatternResult.right
147
+
148
+ // Order: route first, then layers from innermost to outermost
149
+ const loaders = [
150
+ `() => import(".${route.modulePath}")`,
151
+ ...allLayers.reverse().map((layer) => `() => import(".${layer.modulePath}")`),
152
+ ]
153
+
154
+ entries.push({ path: pathPattern, loaders })
155
+ }
156
+
157
+ // No routes found - don't create file
158
+ if (entries.length === 0) {
159
+ return null
160
+ }
161
+
162
+ const routeEntries = entries
163
+ .map(({ path, loaders }) => {
164
+ const loadersCode = loaders.join(",\n ")
165
+ return ` "${path}": [\n ${loadersCode},\n ]`
140
166
  })
141
- .join(",\n");
142
- return `/**
167
+ .join(",\n")
168
+
169
+ return `/**
143
170
  * Auto-generated by effect-start.
144
171
  */
145
172
 
146
173
  export default {
147
174
  ${routeEntries},
148
175
  } satisfies import("effect-start/FileRouter").FileRoutes
149
- `;
176
+ `
150
177
  }
178
+
151
179
  /**
152
180
  * Updates the tree file only if the generated content differs from the existing file.
153
181
  * This prevents infinite loops when watching for file changes.
154
182
  */
155
- export function update(routesPath, treePath = "server.gen.ts") {
156
- return Effect.gen(function* () {
157
- treePath = NPath.resolve(routesPath, treePath);
158
- const fs = yield* FileSystem.FileSystem;
159
- const files = yield* fs.readDirectory(routesPath, { recursive: true }).pipe(Effect.mapError((cause) => new FileRouter.FileRouterError({
183
+ export function update(
184
+ routesPath,
185
+ treePath = "server.gen.ts",
186
+ ) {
187
+ return Effect.gen(function* () {
188
+ treePath = NPath.resolve(routesPath, treePath)
189
+
190
+ const fs = yield* FileSystem.FileSystem
191
+ const files = yield* fs.readDirectory(routesPath, { recursive: true }).pipe(
192
+ Effect.mapError(
193
+ (cause) =>
194
+ new FileRouter.FileRouterError({
160
195
  reason: "FileSystem",
161
196
  cause,
162
197
  path: routesPath,
163
- })));
164
- const fileRoutes = yield* FileRouter.getFileRoutes(files);
165
- // Validate route modules
166
- yield* validateRouteModules(routesPath, fileRoutes);
167
- const newCode = generateCode(fileRoutes);
168
- // Check if file exists (ok to fail - means file doesn't exist)
169
- const existingCode = yield* fs
170
- .readFileString(treePath)
171
- .pipe(Effect.catchAll(() => Effect.succeed(null)));
172
- // No routes found
173
- if (newCode === null) {
174
- // If gen file exists, write empty export
175
- if (existingCode !== null) {
176
- const emptyCode = "export default {}\n";
177
- if (existingCode !== emptyCode) {
178
- yield* Effect.logDebug(`Clearing file routes tree: ${treePath}`);
179
- yield* fs.writeFileString(treePath, emptyCode).pipe(Effect.mapError((cause) => new FileRouter.FileRouterError({
180
- reason: "FileSystem",
181
- cause,
182
- path: treePath,
183
- })));
184
- }
185
- }
186
- return;
187
- }
188
- // Write if content differs
189
- if (existingCode !== newCode) {
190
- yield* Effect.logDebug(`Updating file routes tree: ${treePath}`);
191
- yield* fs.writeFileString(treePath, newCode).pipe(Effect.mapError((cause) => new FileRouter.FileRouterError({
192
- reason: "FileSystem",
193
- cause,
194
- path: treePath,
195
- })));
196
- }
197
- else {
198
- yield* Effect.logDebug(`File routes tree unchanged: ${treePath}`);
198
+ }),
199
+ ),
200
+ )
201
+ const fileRoutes = yield* FileRouter.getFileRoutes(files)
202
+
203
+ // Validate route modules
204
+ yield* validateRouteModules(routesPath, fileRoutes)
205
+
206
+ const newCode = generateCode(fileRoutes)
207
+
208
+ // Check if file exists (ok to fail - means file doesn't exist)
209
+ const existingCode = yield* fs
210
+ .readFileString(treePath)
211
+ .pipe(Effect.catchAll(() => Effect.succeed(null)))
212
+
213
+ // No routes found
214
+ if (newCode === null) {
215
+ // If gen file exists, write empty export
216
+ if (existingCode !== null) {
217
+ const emptyCode = "export default {}\n"
218
+ if (existingCode !== emptyCode) {
219
+ yield* Effect.logDebug(`Clearing file routes tree: ${treePath}`)
220
+ yield* fs.writeFileString(treePath, emptyCode).pipe(
221
+ Effect.mapError(
222
+ (cause) =>
223
+ new FileRouter.FileRouterError({
224
+ reason: "FileSystem",
225
+ cause,
226
+ path: treePath,
227
+ }),
228
+ ),
229
+ )
199
230
  }
200
- });
231
+ }
232
+ return
233
+ }
234
+
235
+ // Write if content differs
236
+ if (existingCode !== newCode) {
237
+ yield* Effect.logDebug(`Updating file routes tree: ${treePath}`)
238
+ yield* fs.writeFileString(treePath, newCode).pipe(
239
+ Effect.mapError(
240
+ (cause) =>
241
+ new FileRouter.FileRouterError({
242
+ reason: "FileSystem",
243
+ cause,
244
+ path: treePath,
245
+ }),
246
+ ),
247
+ )
248
+ } else {
249
+ yield* Effect.logDebug(`File routes tree unchanged: ${treePath}`)
250
+ }
251
+ })
201
252
  }
202
- export function dump(routesPath, treePath = "server.gen.ts") {
203
- return Effect.gen(function* () {
204
- treePath = NPath.resolve(routesPath, treePath);
205
- const fs = yield* FileSystem.FileSystem;
206
- const files = yield* fs.readDirectory(routesPath, { recursive: true }).pipe(Effect.mapError((cause) => new FileRouter.FileRouterError({
253
+
254
+ export function dump(
255
+ routesPath,
256
+ treePath = "server.gen.ts",
257
+ ) {
258
+ return Effect.gen(function* () {
259
+ treePath = NPath.resolve(routesPath, treePath)
260
+
261
+ const fs = yield* FileSystem.FileSystem
262
+ const files = yield* fs.readDirectory(routesPath, { recursive: true }).pipe(
263
+ Effect.mapError(
264
+ (cause) =>
265
+ new FileRouter.FileRouterError({
207
266
  reason: "FileSystem",
208
267
  cause,
209
268
  path: routesPath,
210
- })));
211
- const fileRoutes = yield* FileRouter.getFileRoutes(files);
212
- // Validate route modules
213
- yield* validateRouteModules(routesPath, fileRoutes);
214
- const code = generateCode(fileRoutes);
215
- // No routes found - don't create file
216
- if (code === null) {
217
- yield* Effect.logDebug(`No routes found, skipping: ${treePath}`);
218
- return;
219
- }
220
- yield* Effect.logDebug(`Generating file routes tree: ${treePath}`);
221
- yield* fs.writeFileString(treePath, code).pipe(Effect.mapError((cause) => new FileRouter.FileRouterError({
269
+ }),
270
+ ),
271
+ )
272
+ const fileRoutes = yield* FileRouter.getFileRoutes(files)
273
+
274
+ // Validate route modules
275
+ yield* validateRouteModules(routesPath, fileRoutes)
276
+
277
+ const code = generateCode(fileRoutes)
278
+
279
+ // No routes found - don't create file
280
+ if (code === null) {
281
+ yield* Effect.logDebug(`No routes found, skipping: ${treePath}`)
282
+ return
283
+ }
284
+
285
+ yield* Effect.logDebug(`Generating file routes tree: ${treePath}`)
286
+
287
+ yield* fs.writeFileString(treePath, code).pipe(
288
+ Effect.mapError(
289
+ (cause) =>
290
+ new FileRouter.FileRouterError({
222
291
  reason: "FileSystem",
223
292
  cause,
224
293
  path: treePath,
225
- })));
226
- });
294
+ }),
295
+ ),
296
+ )
297
+ })
227
298
  }