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,148 +1,204 @@
1
- import * as FileSystem from "./FileSystem.js";
2
- import * as Data from "effect/Data";
3
- import * as Effect from "effect/Effect";
4
- import * as Either from "effect/Either";
5
- import * as Function from "effect/Function";
6
- import * as Layer from "effect/Layer";
7
- import * as Stream from "effect/Stream";
8
- import * as NPath from "node:path";
9
- import * as NUrl from "node:url";
10
- import * as Development from "./Development.js";
11
- import * as FilePathPattern from "./FilePathPattern.js";
12
- import * as FileRouterCodegen from "./FileRouterCodegen.js";
13
- import * as NodeUtils from "./node/NodeUtils.js";
14
- import * as Route from "./Route.js";
15
- import * as RouteTree from "./RouteTree.js";
16
- export class FileRouterError extends Data.TaggedError("FileRouterError") {
17
- }
18
- const ROUTE_PATH_REGEX = /^\/?(.*\/?)(?:route|layer)\.(jsx?|tsx?)$/;
1
+ import * as FileSystem from "./FileSystem.js"
2
+ import * as Data from "effect/Data"
3
+ import * as Effect from "effect/Effect"
4
+ import * as Either from "effect/Either"
5
+ import * as Function from "effect/Function"
6
+ import * as Layer from "effect/Layer"
7
+ import * as Stream from "effect/Stream"
8
+ import * as NPath from "node:path"
9
+ import * as NUrl from "node:url"
10
+ import * as Development from "./Development.js"
11
+ import * as FilePathPattern from "./FilePathPattern.js"
12
+ import * as FileRouterCodegen from "./FileRouterCodegen.js"
13
+ import * as NodeUtils from "./node/NodeUtils.js"
14
+ import * as Route from "./Route.js"
15
+ import * as RouteTree from "./RouteTree.js"
16
+
17
+ export class FileRouterError extends Data.TaggedError("FileRouterError") {}
18
+
19
+ /**
20
+ * Routes sorted by depth, with rest parameters at the end.
21
+ * - layer.tsx
22
+ * - users/route.tsx
23
+ * - users/[userId]/route.tsx
24
+ * - [[rest]]/route.tsx
25
+ */
26
+
27
+ const ROUTE_PATH_REGEX = /^\/?(.*\/?)(?:route|layer)\.(jsx?|tsx?)$/
28
+
19
29
  export function parseRoute(path) {
20
- const segs = FilePathPattern.segments(path);
21
- const lastSeg = segs.at(-1);
22
- const handleMatch = lastSeg?._tag === "LiteralSegment" && lastSeg.value.match(/^(route|layer)\.(tsx?|jsx?)$/);
23
- const handle = handleMatch ? handleMatch[1] : null;
24
- if (!handle) {
25
- return null;
26
- }
27
- const pathSegments = segs.slice(0, -1);
28
- const validated = FilePathPattern.validate(FilePathPattern.format(pathSegments));
29
- if (Either.isLeft(validated)) {
30
- return null;
31
- }
32
- const restIndex = pathSegments.findIndex((seg) => seg._tag === "RestSegment");
33
- if (restIndex !== -1 && restIndex !== pathSegments.length - 1) {
34
- return null;
35
- }
36
- const routePathSegments = pathSegments.filter((seg) => seg._tag !== "GroupSegment");
37
- const routePath = FilePathPattern.format(routePathSegments);
38
- return {
39
- handle,
40
- modulePath: `/${path}`,
41
- routePath,
42
- segments: pathSegments,
43
- };
30
+ const segs = FilePathPattern.segments(path)
31
+
32
+ const lastSeg = segs.at(-1)
33
+ const handleMatch =
34
+ lastSeg?._tag === "LiteralSegment" && lastSeg.value.match(/^(route|layer)\.(tsx?|jsx?)$/)
35
+ const handle = handleMatch ? (handleMatch[1]) : null
36
+
37
+ if (!handle) {
38
+ return null
39
+ }
40
+
41
+ const pathSegments = segs.slice(0, -1)
42
+
43
+ const validated = FilePathPattern.validate(FilePathPattern.format(pathSegments))
44
+ if (Either.isLeft(validated)) {
45
+ return null
46
+ }
47
+
48
+ const restIndex = pathSegments.findIndex((seg) => seg._tag === "RestSegment")
49
+ if (restIndex !== -1 && restIndex !== pathSegments.length - 1) {
50
+ return null
51
+ }
52
+
53
+ const routePathSegments = pathSegments.filter((seg) => seg._tag !== "GroupSegment")
54
+ const routePath = FilePathPattern.format(routePathSegments)
55
+
56
+ return {
57
+ handle,
58
+ modulePath: `/${path}`,
59
+ routePath,
60
+ segments: pathSegments,
61
+ }
44
62
  }
63
+
45
64
  function importModule(load) {
46
- return Effect.tryPromise({
47
- try: () => load(),
48
- catch: (cause) => new FileRouterError({ reason: "Import", cause }),
49
- });
65
+ return Effect.tryPromise({
66
+ try: () => load(),
67
+ catch: (cause) => new FileRouterError({ reason: "Import", cause }),
68
+ })
50
69
  }
51
- export function layer(loadOrOptions) {
52
- const options = typeof loadOrOptions === "function"
53
- ? {
54
- load: loadOrOptions,
55
- path: NPath.join(NodeUtils.getEntrypoint(), "routes"),
70
+
71
+ /**
72
+ * Generates a tree file that references all routes.
73
+ */
74
+ export function layer(
75
+ loadOrOptions,
76
+ ) {
77
+ const options =
78
+ typeof loadOrOptions === "function"
79
+ ? {
80
+ load: loadOrOptions,
81
+ path: NPath.join(NodeUtils.getEntrypoint(), "routes"),
56
82
  }
57
- : loadOrOptions;
58
- let treePath = options.path;
59
- if (treePath.startsWith("file://")) {
60
- treePath = NUrl.fileURLToPath(treePath);
61
- }
62
- if (NPath.extname(treePath) === "") {
63
- treePath = NPath.join(treePath, "server.gen.ts");
64
- }
65
- const routesPath = NPath.dirname(treePath);
66
- const treeFilename = NPath.basename(treePath);
67
- const relativeRoutesPath = NPath.relative(process.cwd(), routesPath);
68
- return Layer.scoped(Route.Routes, Effect.gen(function* () {
69
- // Generate routes file before loading
70
- yield* FileRouterCodegen.update(routesPath, treeFilename);
71
- // Load and build route tree
72
- const m = yield* importModule(options.load);
73
- const routeTree = yield* fromFileRoutes(m.default);
74
- // Watch for changes (only when Development service is available)
75
- yield* Function.pipe(Development.stream(), Stream.filter((e) => e._tag !== "Reload" && e.path.startsWith(relativeRoutesPath)), Stream.runForEach(() => FileRouterCodegen.update(routesPath, treeFilename)), Effect.fork);
76
- return routeTree;
77
- }));
83
+ : loadOrOptions
84
+ let treePath = options.path
85
+ if (treePath.startsWith("file://")) {
86
+ treePath = NUrl.fileURLToPath(treePath)
87
+ }
88
+ if (NPath.extname(treePath) === "") {
89
+ treePath = NPath.join(treePath, "server.gen.ts")
90
+ }
91
+
92
+ const routesPath = NPath.dirname(treePath)
93
+ const treeFilename = NPath.basename(treePath)
94
+ const relativeRoutesPath = NPath.relative(process.cwd(), routesPath)
95
+
96
+ return Layer.scoped(
97
+ Route.Routes,
98
+ Effect.gen(function* () {
99
+ // Generate routes file before loading
100
+ yield* FileRouterCodegen.update(routesPath, treeFilename)
101
+
102
+ // Load and build route tree
103
+ const m = yield* importModule(options.load)
104
+ const routeTree = yield* fromFileRoutes(m.default)
105
+
106
+ // Watch for changes (only when Development service is available)
107
+ yield* Function.pipe(
108
+ Development.stream(),
109
+ Stream.filter((e) => e._tag !== "Reload" && e.path.startsWith(relativeRoutesPath)),
110
+ Stream.runForEach(() => FileRouterCodegen.update(routesPath, treeFilename)),
111
+ Effect.fork,
112
+ )
113
+
114
+ return routeTree
115
+ }),
116
+ )
78
117
  }
118
+
79
119
  export function fromFileRoutes(fileRoutes) {
80
- return Effect.gen(function* () {
81
- const mounts = {};
82
- for (const [path, loaders] of Object.entries(fileRoutes)) {
83
- const modules = yield* Effect.forEach(loaders, (loader) => Effect.promise(() => loader()));
84
- const allRoutes = [];
85
- for (const m of modules) {
86
- if (Route.isRouteSet(m.default)) {
87
- for (const route of m.default) {
88
- ;
89
- allRoutes.push(route);
90
- }
91
- }
92
- }
93
- mounts[path] = allRoutes;
120
+ return Effect.gen(function* () {
121
+ const mounts = {}
122
+
123
+ for (const [path, loaders] of Object.entries(fileRoutes)) {
124
+ const modules = yield* Effect.forEach(loaders, (loader) => Effect.promise(() => loader()))
125
+
126
+ const allRoutes = []
127
+
128
+ for (const m of modules) {
129
+ if (Route.isRouteSet(m.default)) {
130
+ for (const route of m.default) {
131
+ ;(allRoutes).push(route)
132
+ }
94
133
  }
95
- return RouteTree.make(mounts);
96
- });
134
+ }
135
+
136
+ mounts[path] = allRoutes
137
+ }
138
+
139
+ return RouteTree.make(mounts)
140
+ })
97
141
  }
98
- export function walkRoutesDirectory(dir) {
99
- return Effect.gen(function* () {
100
- const fs = yield* FileSystem.FileSystem;
101
- const files = yield* fs.readDirectory(dir, { recursive: true });
102
- return yield* getFileRoutes(files);
103
- });
142
+
143
+ export function walkRoutesDirectory(
144
+ dir,
145
+ ) {
146
+ return Effect.gen(function* () {
147
+ const fs = yield* FileSystem.FileSystem
148
+ const files = yield* fs.readDirectory(dir, { recursive: true })
149
+
150
+ return yield* getFileRoutes(files)
151
+ })
104
152
  }
105
- export function getFileRoutes(paths) {
106
- return Effect.gen(function* () {
107
- const routes = paths
108
- .map((f) => f.match(ROUTE_PATH_REGEX))
109
- .filter(Boolean)
110
- .map((v) => {
111
- const path = v[0];
112
- try {
113
- return parseRoute(path);
114
- }
115
- catch {
116
- return null;
117
- }
118
- })
119
- .filter((route) => route !== null)
120
- .toSorted((a, b) => {
121
- const aDepth = a.segments.length;
122
- const bDepth = b.segments.length;
123
- const aHasRest = a.segments.some((seg) => seg._tag === "RestSegment");
124
- const bHasRest = b.segments.some((seg) => seg._tag === "RestSegment");
125
- return (
126
- // rest is a dominant factor (routes with rest come last)
127
- (+aHasRest - +bHasRest) * 1000 +
128
- // depth is reversed for rest
129
- (aDepth - bDepth) * (1 - 2 * +aHasRest) +
130
- // lexicographic comparison as tiebreaker
131
- a.modulePath.localeCompare(b.modulePath) * 0.001);
132
- });
133
- // Detect conflicting routes at the same path
134
- const routesByPath = new Map();
135
- for (const route of routes) {
136
- const existing = routesByPath.get(route.routePath) || [];
137
- existing.push(route);
138
- routesByPath.set(route.routePath, existing);
139
- }
140
- for (const [path, pathRoutes] of routesByPath) {
141
- const routeHandles = pathRoutes.filter((h) => h.handle === "route");
142
- if (routeHandles.length > 1) {
143
- yield* new FileRouterError({ reason: "Conflict", path });
144
- }
153
+
154
+ export function getFileRoutes(
155
+ paths,
156
+ ) {
157
+ return Effect.gen(function* () {
158
+ const routes = paths
159
+ .map((f) => f.match(ROUTE_PATH_REGEX))
160
+ .filter(Boolean)
161
+ .map((v) => {
162
+ const path = v[0]
163
+ try {
164
+ return parseRoute(path)
165
+ } catch {
166
+ return null
145
167
  }
146
- return routes;
147
- });
168
+ })
169
+ .filter((route) => route !== null)
170
+ .toSorted((a, b) => {
171
+ const aDepth = a.segments.length
172
+ const bDepth = b.segments.length
173
+ const aHasRest = a.segments.some((seg) => seg._tag === "RestSegment")
174
+ const bHasRest = b.segments.some((seg) => seg._tag === "RestSegment")
175
+
176
+ return (
177
+ // rest is a dominant factor (routes with rest come last)
178
+ (+aHasRest - +bHasRest) * 1000 +
179
+ // depth is reversed for rest
180
+ (aDepth - bDepth) * (1 - 2 * +aHasRest) +
181
+ // lexicographic comparison as tiebreaker
182
+ a.modulePath.localeCompare(b.modulePath) * 0.001
183
+ )
184
+ })
185
+
186
+ // Detect conflicting routes at the same path
187
+ const routesByPath = new Map()
188
+ for (const route of routes) {
189
+ const existing = routesByPath.get(route.routePath) || []
190
+ existing.push(route)
191
+ routesByPath.set(route.routePath, existing)
192
+ }
193
+
194
+ for (const [path, pathRoutes] of routesByPath) {
195
+ const routeHandles = pathRoutes.filter((h) => h.handle === "route")
196
+
197
+ if (routeHandles.length > 1) {
198
+ yield* new FileRouterError({ reason: "Conflict", path })
199
+ }
200
+ }
201
+
202
+ return routes
203
+ })
148
204
  }