effect-start 0.23.1 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/package.json +18 -86
  2. package/src/Development.ts +3 -1
  3. package/src/Entity.ts +17 -0
  4. package/src/Fetch.ts +271 -0
  5. package/src/SqlIntrospect.ts +64 -70
  6. package/src/Start.ts +21 -24
  7. package/src/StartApp.ts +1 -1
  8. package/src/bun/BunServer.ts +42 -10
  9. package/src/hyper/HyperHtml.ts +0 -1
  10. package/src/sql/bun/index.ts +1 -1
  11. package/src/sql/index.ts +1 -0
  12. package/src/sql/libsql/index.ts +173 -0
  13. package/src/sql/libsql/libsql.d.ts +39 -0
  14. package/src/sql/mssql/index.ts +1 -1
  15. package/dist/BlobStore.d.ts +0 -80
  16. package/dist/BlobStore.js +0 -19
  17. package/dist/ChildProcess.d.ts +0 -60
  18. package/dist/ChildProcess.js +0 -30
  19. package/dist/Commander.d.ts +0 -100
  20. package/dist/Commander.js +0 -326
  21. package/dist/ContentNegotiation.d.ts +0 -12
  22. package/dist/ContentNegotiation.js +0 -359
  23. package/dist/Cookies.d.ts +0 -47
  24. package/dist/Cookies.js +0 -302
  25. package/dist/Development.d.ts +0 -39
  26. package/dist/Development.js +0 -58
  27. package/dist/Effectify.d.ts +0 -209
  28. package/dist/Effectify.js +0 -19
  29. package/dist/Entity.d.ts +0 -47
  30. package/dist/Entity.js +0 -224
  31. package/dist/FilePathPattern.d.ts +0 -29
  32. package/dist/FilePathPattern.js +0 -86
  33. package/dist/FileRouter.d.ts +0 -56
  34. package/dist/FileRouter.js +0 -148
  35. package/dist/FileRouterCodegen.d.ts +0 -18
  36. package/dist/FileRouterCodegen.js +0 -227
  37. package/dist/FileRouterPattern.d.ts +0 -9
  38. package/dist/FileRouterPattern.js +0 -35
  39. package/dist/FileSystem.d.ts +0 -158
  40. package/dist/FileSystem.js +0 -70
  41. package/dist/Http.d.ts +0 -37
  42. package/dist/Http.js +0 -88
  43. package/dist/HttpAppExtra.d.ts +0 -7
  44. package/dist/HttpAppExtra.js +0 -320
  45. package/dist/HttpUtils.d.ts +0 -3
  46. package/dist/HttpUtils.js +0 -11
  47. package/dist/PathPattern.d.ts +0 -134
  48. package/dist/PathPattern.js +0 -413
  49. package/dist/PlatformError.d.ts +0 -38
  50. package/dist/PlatformError.js +0 -25
  51. package/dist/PlatformRuntime.d.ts +0 -27
  52. package/dist/PlatformRuntime.js +0 -46
  53. package/dist/Route.d.ts +0 -97
  54. package/dist/Route.js +0 -100
  55. package/dist/RouteBody.d.ts +0 -47
  56. package/dist/RouteBody.js +0 -67
  57. package/dist/RouteError.d.ts +0 -98
  58. package/dist/RouteError.js +0 -55
  59. package/dist/RouteHook.d.ts +0 -12
  60. package/dist/RouteHook.js +0 -40
  61. package/dist/RouteHttp.d.ts +0 -21
  62. package/dist/RouteHttp.js +0 -258
  63. package/dist/RouteHttpTracer.d.ts +0 -10
  64. package/dist/RouteHttpTracer.js +0 -62
  65. package/dist/RouteMount.d.ts +0 -86
  66. package/dist/RouteMount.js +0 -63
  67. package/dist/RouteSchema.d.ts +0 -86
  68. package/dist/RouteSchema.js +0 -188
  69. package/dist/RouteSse.d.ts +0 -21
  70. package/dist/RouteSse.js +0 -79
  71. package/dist/RouteTree.d.ts +0 -57
  72. package/dist/RouteTree.js +0 -93
  73. package/dist/RouteTrie.d.ts +0 -20
  74. package/dist/RouteTrie.js +0 -152
  75. package/dist/RouterPattern.d.ts +0 -118
  76. package/dist/RouterPattern.js +0 -269
  77. package/dist/SchemaExtra.d.ts +0 -7
  78. package/dist/SchemaExtra.js +0 -74
  79. package/dist/Socket.d.ts +0 -27
  80. package/dist/Socket.js +0 -29
  81. package/dist/Sql.d.ts +0 -34
  82. package/dist/Sql.js +0 -5
  83. package/dist/SqlIntrospect.d.ts +0 -91
  84. package/dist/SqlIntrospect.js +0 -466
  85. package/dist/Start.d.ts +0 -44
  86. package/dist/Start.js +0 -49
  87. package/dist/StartApp.d.ts +0 -19
  88. package/dist/StartApp.js +0 -21
  89. package/dist/StreamExtra.d.ts +0 -28
  90. package/dist/StreamExtra.js +0 -100
  91. package/dist/System.d.ts +0 -7
  92. package/dist/System.js +0 -22
  93. package/dist/TuplePathPattern.d.ts +0 -9
  94. package/dist/TuplePathPattern.js +0 -68
  95. package/dist/Unique.d.ts +0 -50
  96. package/dist/Unique.js +0 -187
  97. package/dist/Values.d.ts +0 -27
  98. package/dist/Values.js +0 -36
  99. package/dist/bun/BunBlobStoreDisk.d.ts +0 -6
  100. package/dist/bun/BunBlobStoreDisk.js +0 -116
  101. package/dist/bun/BunBlobStoreS3.d.ts +0 -11
  102. package/dist/bun/BunBlobStoreS3.js +0 -89
  103. package/dist/bun/BunBlobWatcherDisk.d.ts +0 -6
  104. package/dist/bun/BunBlobWatcherDisk.js +0 -60
  105. package/dist/bun/BunBlobWatcherQueue.d.ts +0 -6
  106. package/dist/bun/BunBlobWatcherQueue.js +0 -17
  107. package/dist/bun/BunBundle.d.ts +0 -11
  108. package/dist/bun/BunBundle.js +0 -137
  109. package/dist/bun/BunChildProcessSpawner.d.ts +0 -3
  110. package/dist/bun/BunChildProcessSpawner.js +0 -103
  111. package/dist/bun/BunHttpServer.d.ts +0 -44
  112. package/dist/bun/BunHttpServer.js +0 -186
  113. package/dist/bun/BunHttpServer_web.d.ts +0 -60
  114. package/dist/bun/BunHttpServer_web.js +0 -252
  115. package/dist/bun/BunImportTrackerPlugin.d.ts +0 -13
  116. package/dist/bun/BunImportTrackerPlugin.js +0 -69
  117. package/dist/bun/BunPlatformHttpServer.d.ts +0 -10
  118. package/dist/bun/BunPlatformHttpServer.js +0 -53
  119. package/dist/bun/BunRoute.d.ts +0 -48
  120. package/dist/bun/BunRoute.js +0 -121
  121. package/dist/bun/BunRuntime.d.ts +0 -2
  122. package/dist/bun/BunRuntime.js +0 -31
  123. package/dist/bun/BunServer.d.ts +0 -40
  124. package/dist/bun/BunServer.js +0 -157
  125. package/dist/bun/BunServerRequest.d.ts +0 -60
  126. package/dist/bun/BunServerRequest.js +0 -252
  127. package/dist/bun/BunSql.d.ts +0 -4
  128. package/dist/bun/BunSql.js +0 -81
  129. package/dist/bun/BunVirtualFilesPlugin.d.ts +0 -4
  130. package/dist/bun/BunVirtualFilesPlugin.js +0 -40
  131. package/dist/bun/_BunEnhancedResolve.d.ts +0 -45
  132. package/dist/bun/_BunEnhancedResolve.js +0 -102
  133. package/dist/bun/index.d.ts +0 -5
  134. package/dist/bun/index.js +0 -5
  135. package/dist/bundler/Bundle.d.ts +0 -61
  136. package/dist/bundler/Bundle.js +0 -48
  137. package/dist/bundler/BundleFiles.d.ts +0 -13
  138. package/dist/bundler/BundleFiles.js +0 -96
  139. package/dist/bundler/BundleHttp.d.ts +0 -45
  140. package/dist/bundler/BundleHttp.js +0 -176
  141. package/dist/bundler/BundleRoute.d.ts +0 -27
  142. package/dist/bundler/BundleRoute.js +0 -51
  143. package/dist/client/Overlay.d.ts +0 -2
  144. package/dist/client/Overlay.js +0 -32
  145. package/dist/client/ScrollState.d.ts +0 -6
  146. package/dist/client/ScrollState.js +0 -94
  147. package/dist/client/index.d.ts +0 -6
  148. package/dist/client/index.js +0 -79
  149. package/dist/console/Console.d.ts +0 -6
  150. package/dist/console/Console.js +0 -26
  151. package/dist/console/ConsoleErrors.d.ts +0 -3
  152. package/dist/console/ConsoleErrors.js +0 -200
  153. package/dist/console/ConsoleLogger.d.ts +0 -3
  154. package/dist/console/ConsoleLogger.js +0 -47
  155. package/dist/console/ConsoleMetrics.d.ts +0 -3
  156. package/dist/console/ConsoleMetrics.js +0 -61
  157. package/dist/console/ConsoleProcess.d.ts +0 -3
  158. package/dist/console/ConsoleProcess.js +0 -49
  159. package/dist/console/ConsoleStore.d.ts +0 -144
  160. package/dist/console/ConsoleStore.js +0 -61
  161. package/dist/console/ConsoleTracer.d.ts +0 -3
  162. package/dist/console/ConsoleTracer.js +0 -94
  163. package/dist/console/Simulation.d.ts +0 -2
  164. package/dist/console/Simulation.js +0 -633
  165. package/dist/console/index.d.ts +0 -3
  166. package/dist/console/index.js +0 -3
  167. package/dist/console/routes/errors/route.d.ts +0 -10
  168. package/dist/console/routes/errors/route.js +0 -47
  169. package/dist/console/routes/fiberDetail.d.ts +0 -16
  170. package/dist/console/routes/fiberDetail.js +0 -38
  171. package/dist/console/routes/fibers/route.d.ts +0 -10
  172. package/dist/console/routes/fibers/route.js +0 -19
  173. package/dist/console/routes/git/route.d.ts +0 -11
  174. package/dist/console/routes/git/route.js +0 -33
  175. package/dist/console/routes/layout.d.ts +0 -9
  176. package/dist/console/routes/layout.js +0 -3
  177. package/dist/console/routes/logs/route.d.ts +0 -10
  178. package/dist/console/routes/logs/route.js +0 -32
  179. package/dist/console/routes/metrics/route.d.ts +0 -10
  180. package/dist/console/routes/metrics/route.js +0 -17
  181. package/dist/console/routes/route.d.ts +0 -6
  182. package/dist/console/routes/route.js +0 -5
  183. package/dist/console/routes/routes/route.d.ts +0 -6
  184. package/dist/console/routes/routes/route.js +0 -20
  185. package/dist/console/routes/services/route.d.ts +0 -6
  186. package/dist/console/routes/services/route.js +0 -12
  187. package/dist/console/routes/system/route.d.ts +0 -10
  188. package/dist/console/routes/system/route.js +0 -18
  189. package/dist/console/routes/traceDetail.d.ts +0 -16
  190. package/dist/console/routes/traceDetail.js +0 -14
  191. package/dist/console/routes/traces/route.d.ts +0 -10
  192. package/dist/console/routes/traces/route.js +0 -39
  193. package/dist/console/routes/tree.d.ts +0 -153
  194. package/dist/console/routes/tree.js +0 -29
  195. package/dist/console/ui/Errors.d.ts +0 -4
  196. package/dist/console/ui/Errors.js +0 -15
  197. package/dist/console/ui/Fibers.d.ts +0 -24
  198. package/dist/console/ui/Fibers.js +0 -121
  199. package/dist/console/ui/Git.d.ts +0 -20
  200. package/dist/console/ui/Git.js +0 -95
  201. package/dist/console/ui/Logs.d.ts +0 -4
  202. package/dist/console/ui/Logs.js +0 -25
  203. package/dist/console/ui/Metrics.d.ts +0 -4
  204. package/dist/console/ui/Metrics.js +0 -26
  205. package/dist/console/ui/Routes.d.ts +0 -8
  206. package/dist/console/ui/Routes.js +0 -70
  207. package/dist/console/ui/Services.d.ts +0 -10
  208. package/dist/console/ui/Services.js +0 -246
  209. package/dist/console/ui/Shell.d.ts +0 -10
  210. package/dist/console/ui/Shell.js +0 -7
  211. package/dist/console/ui/System.d.ts +0 -4
  212. package/dist/console/ui/System.js +0 -35
  213. package/dist/console/ui/Traces.d.ts +0 -12
  214. package/dist/console/ui/Traces.js +0 -179
  215. package/dist/datastar/actions/fetch.d.ts +0 -30
  216. package/dist/datastar/actions/fetch.js +0 -403
  217. package/dist/datastar/actions/peek.d.ts +0 -1
  218. package/dist/datastar/actions/peek.js +0 -13
  219. package/dist/datastar/actions/setAll.d.ts +0 -1
  220. package/dist/datastar/actions/setAll.js +0 -12
  221. package/dist/datastar/actions/toggleAll.d.ts +0 -1
  222. package/dist/datastar/actions/toggleAll.js +0 -12
  223. package/dist/datastar/attributes/attr.d.ts +0 -1
  224. package/dist/datastar/attributes/attr.js +0 -48
  225. package/dist/datastar/attributes/bind.d.ts +0 -1
  226. package/dist/datastar/attributes/bind.js +0 -175
  227. package/dist/datastar/attributes/class.d.ts +0 -1
  228. package/dist/datastar/attributes/class.js +0 -47
  229. package/dist/datastar/attributes/computed.d.ts +0 -1
  230. package/dist/datastar/attributes/computed.js +0 -26
  231. package/dist/datastar/attributes/effect.d.ts +0 -1
  232. package/dist/datastar/attributes/effect.js +0 -9
  233. package/dist/datastar/attributes/indicator.d.ts +0 -1
  234. package/dist/datastar/attributes/indicator.js +0 -30
  235. package/dist/datastar/attributes/init.d.ts +0 -1
  236. package/dist/datastar/attributes/init.js +0 -26
  237. package/dist/datastar/attributes/jsonSignals.d.ts +0 -1
  238. package/dist/datastar/attributes/jsonSignals.js +0 -30
  239. package/dist/datastar/attributes/on.d.ts +0 -1
  240. package/dist/datastar/attributes/on.js +0 -78
  241. package/dist/datastar/attributes/onIntersect.d.ts +0 -1
  242. package/dist/datastar/attributes/onIntersect.js +0 -53
  243. package/dist/datastar/attributes/onInterval.d.ts +0 -1
  244. package/dist/datastar/attributes/onInterval.js +0 -30
  245. package/dist/datastar/attributes/onSignalPatch.d.ts +0 -1
  246. package/dist/datastar/attributes/onSignalPatch.js +0 -42
  247. package/dist/datastar/attributes/ref.d.ts +0 -1
  248. package/dist/datastar/attributes/ref.js +0 -10
  249. package/dist/datastar/attributes/show.d.ts +0 -1
  250. package/dist/datastar/attributes/show.js +0 -31
  251. package/dist/datastar/attributes/signals.d.ts +0 -1
  252. package/dist/datastar/attributes/signals.js +0 -17
  253. package/dist/datastar/attributes/style.d.ts +0 -1
  254. package/dist/datastar/attributes/style.js +0 -50
  255. package/dist/datastar/attributes/text.d.ts +0 -1
  256. package/dist/datastar/attributes/text.js +0 -26
  257. package/dist/datastar/engine.d.ts +0 -162
  258. package/dist/datastar/engine.js +0 -999
  259. package/dist/datastar/happydom.d.ts +0 -1
  260. package/dist/datastar/happydom.js +0 -8
  261. package/dist/datastar/index.d.ts +0 -24
  262. package/dist/datastar/index.js +0 -24
  263. package/dist/datastar/load.d.ts +0 -24
  264. package/dist/datastar/load.js +0 -24
  265. package/dist/datastar/utils.d.ts +0 -51
  266. package/dist/datastar/utils.js +0 -202
  267. package/dist/datastar/watchers/patchElements.d.ts +0 -1
  268. package/dist/datastar/watchers/patchElements.js +0 -399
  269. package/dist/datastar/watchers/patchSignals.d.ts +0 -1
  270. package/dist/datastar/watchers/patchSignals.js +0 -14
  271. package/dist/experimental/EncryptedCookies.d.ts +0 -48
  272. package/dist/experimental/EncryptedCookies.js +0 -212
  273. package/dist/experimental/SseHttpResponse.d.ts +0 -7
  274. package/dist/experimental/SseHttpResponse.js +0 -28
  275. package/dist/experimental/index.d.ts +0 -1
  276. package/dist/experimental/index.js +0 -1
  277. package/dist/hyper/Hyper.d.ts +0 -25
  278. package/dist/hyper/Hyper.js +0 -23
  279. package/dist/hyper/HyperHtml.d.ts +0 -23
  280. package/dist/hyper/HyperHtml.js +0 -150
  281. package/dist/hyper/HyperHtml.test.d.ts +0 -1
  282. package/dist/hyper/HyperHtml.test.js +0 -197
  283. package/dist/hyper/HyperNode.d.ts +0 -14
  284. package/dist/hyper/HyperNode.js +0 -11
  285. package/dist/hyper/HyperRoute.d.ts +0 -8
  286. package/dist/hyper/HyperRoute.js +0 -32
  287. package/dist/hyper/HyperRoute.test.d.ts +0 -1
  288. package/dist/hyper/HyperRoute.test.js +0 -83
  289. package/dist/hyper/html.d.ts +0 -11
  290. package/dist/hyper/html.js +0 -30
  291. package/dist/hyper/index.d.ts +0 -6
  292. package/dist/hyper/index.js +0 -5
  293. package/dist/hyper/jsx-runtime.d.ts +0 -7
  294. package/dist/hyper/jsx-runtime.js +0 -8
  295. package/dist/index.d.ts +0 -8
  296. package/dist/index.js +0 -8
  297. package/dist/inference_check.d.ts +0 -1
  298. package/dist/inference_check.js +0 -15
  299. package/dist/lint/plugin.d.ts +0 -86
  300. package/dist/lint/plugin.js +0 -341
  301. package/dist/middlewares/BasicAuthMiddleware.d.ts +0 -8
  302. package/dist/middlewares/BasicAuthMiddleware.js +0 -22
  303. package/dist/middlewares/index.d.ts +0 -1
  304. package/dist/middlewares/index.js +0 -1
  305. package/dist/node/Effectify.d.ts +0 -209
  306. package/dist/node/Effectify.js +0 -19
  307. package/dist/node/FileSystem.d.ts +0 -7
  308. package/dist/node/FileSystem.js +0 -420
  309. package/dist/node/NodeFileSystem.d.ts +0 -7
  310. package/dist/node/NodeFileSystem.js +0 -410
  311. package/dist/node/NodeUtils.d.ts +0 -2
  312. package/dist/node/NodeUtils.js +0 -20
  313. package/dist/node/PlatformError.d.ts +0 -46
  314. package/dist/node/PlatformError.js +0 -43
  315. package/dist/node/Utils.d.ts +0 -1
  316. package/dist/node/Utils.js +0 -19
  317. package/dist/repro_fail.d.ts +0 -1
  318. package/dist/repro_fail.js +0 -14
  319. package/dist/sql/bun/index.d.ts +0 -3
  320. package/dist/sql/bun/index.js +0 -75
  321. package/dist/sql/mssql/docker.d.ts +0 -2
  322. package/dist/sql/mssql/docker.js +0 -67
  323. package/dist/sql/mssql/index.d.ts +0 -21
  324. package/dist/sql/mssql/index.js +0 -113
  325. package/dist/testing/TestHttpClient.d.ts +0 -13
  326. package/dist/testing/TestHttpClient.js +0 -68
  327. package/dist/testing/TestLogger.d.ts +0 -13
  328. package/dist/testing/TestLogger.js +0 -32
  329. package/dist/testing/index.d.ts +0 -2
  330. package/dist/testing/index.js +0 -2
  331. package/dist/testing/utils.d.ts +0 -9
  332. package/dist/testing/utils.js +0 -39
  333. package/dist/x/cloudflare/CloudflareTunnel.d.ts +0 -10
  334. package/dist/x/cloudflare/CloudflareTunnel.js +0 -30
  335. package/dist/x/cloudflare/index.d.ts +0 -1
  336. package/dist/x/cloudflare/index.js +0 -1
  337. package/dist/x/datastar/Datastar.d.ts +0 -6
  338. package/dist/x/datastar/Datastar.js +0 -47
  339. package/dist/x/datastar/index.d.ts +0 -1
  340. package/dist/x/datastar/index.js +0 -1
  341. package/dist/x/tailscale/TailscaleTunnel.d.ts +0 -15
  342. package/dist/x/tailscale/TailscaleTunnel.js +0 -68
  343. package/dist/x/tailscale/index.d.ts +0 -1
  344. package/dist/x/tailscale/index.js +0 -1
  345. package/dist/x/tailwind/TailwindPlugin.d.ts +0 -23
  346. package/dist/x/tailwind/TailwindPlugin.js +0 -219
  347. package/dist/x/tailwind/compile.d.ts +0 -19
  348. package/dist/x/tailwind/compile.js +0 -154
  349. package/dist/x/tailwind/plugin.d.ts +0 -2
  350. package/dist/x/tailwind/plugin.js +0 -15
  351. /package/src/{Sql.ts → sql/Sql.ts} +0 -0
@@ -1,86 +0,0 @@
1
- import * as Either from "effect/Either";
2
- export function segments(pattern) {
3
- const parts = pattern.split("/").filter(Boolean);
4
- const result = [];
5
- for (const part of parts) {
6
- if (/^\(\w+\)$/.test(part)) {
7
- result.push({ _tag: "GroupSegment", name: part.slice(1, -1) });
8
- }
9
- else if (part.startsWith("[[") && part.endsWith("]]")) {
10
- result.push({ _tag: "RestSegment", name: part.slice(2, -2) });
11
- }
12
- else if (part.startsWith("[") && part.endsWith("]")) {
13
- result.push({ _tag: "ParamSegment", name: part.slice(1, -1) });
14
- }
15
- else if (/^[\p{L}\p{N}._~-]+$/u.test(part)) {
16
- result.push({ _tag: "LiteralSegment", value: part });
17
- }
18
- else {
19
- result.push({ _tag: "InvalidSegment", value: part });
20
- }
21
- }
22
- return result;
23
- }
24
- export function validate(pattern) {
25
- const segs = segments(pattern);
26
- const invalid = segs.find((s) => s._tag === "InvalidSegment");
27
- if (invalid) {
28
- return Either.left({
29
- _tag: "FilePathPatternError",
30
- pattern,
31
- message: `Invalid segment: "${invalid.value}"`,
32
- });
33
- }
34
- const restIndex = segs.findIndex((s) => s._tag === "RestSegment");
35
- if (restIndex !== -1 && restIndex !== segs.length - 1) {
36
- return Either.left({
37
- _tag: "FilePathPatternError",
38
- pattern,
39
- message: "Rest segment must be the last segment",
40
- });
41
- }
42
- return Either.right(segs);
43
- }
44
- export function format(segs) {
45
- const parts = segs.map((seg) => {
46
- switch (seg._tag) {
47
- case "GroupSegment":
48
- return `(${seg.name})`;
49
- case "RestSegment":
50
- return `[[${seg.name}]]`;
51
- case "ParamSegment":
52
- return `[${seg.name}]`;
53
- case "LiteralSegment":
54
- return seg.value;
55
- case "InvalidSegment":
56
- return seg.value;
57
- }
58
- });
59
- const joined = parts.join("/");
60
- return (joined ? `/${joined}` : "/");
61
- }
62
- export function toPathPattern(pattern) {
63
- const result = validate(pattern);
64
- if (Either.isLeft(result)) {
65
- return Either.left(result.left);
66
- }
67
- const segs = result.right;
68
- const pathParts = [];
69
- for (const seg of segs) {
70
- switch (seg._tag) {
71
- case "GroupSegment":
72
- continue;
73
- case "RestSegment":
74
- pathParts.push(`:${seg.name}*`);
75
- break;
76
- case "ParamSegment":
77
- pathParts.push(`:${seg.name}`);
78
- break;
79
- case "LiteralSegment":
80
- pathParts.push(seg.value);
81
- break;
82
- }
83
- }
84
- const joined = pathParts.join("/");
85
- return Either.right((joined ? `/${joined}` : "/"));
86
- }
@@ -1,56 +0,0 @@
1
- import * as FileSystem from "./FileSystem.ts";
2
- import * as Effect from "effect/Effect";
3
- import * as Layer from "effect/Layer";
4
- import * as FilePathPattern from "./FilePathPattern.ts";
5
- import type * as PathPattern from "./PathPattern.ts";
6
- import type * as PlatformError from "./PlatformError.ts";
7
- import * as Route from "./Route.ts";
8
- import * as RouteTree from "./RouteTree.ts";
9
- declare const FileRouterError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
10
- readonly _tag: "FileRouterError";
11
- } & Readonly<A>;
12
- export declare class FileRouterError extends FileRouterError_base<{
13
- reason: "Import" | "Conflict" | "FileSystem";
14
- cause?: unknown;
15
- path?: string;
16
- }> {
17
- }
18
- export type RouteModule = {
19
- default: Route.RouteSet.Any;
20
- };
21
- export type LazyRouteModule = () => Promise<RouteModule>;
22
- export type FileRoutes = {
23
- [path: PathPattern.PathPattern]: [LazyRouteModule, ...LazyRouteModule[]];
24
- };
25
- export type Segment = FilePathPattern.Segment;
26
- export type FileRoute = {
27
- handle: "route" | "layer";
28
- modulePath: `/${string}`;
29
- routePath: `/${string}`;
30
- segments: Array<Segment>;
31
- };
32
- /**
33
- * Routes sorted by depth, with rest parameters at the end.
34
- * - layer.tsx
35
- * - users/route.tsx
36
- * - users/[userId]/route.tsx
37
- * - [[rest]]/route.tsx
38
- */
39
- export type OrderedFileRoutes = Array<FileRoute>;
40
- export declare function parseRoute(path: string): FileRoute | null;
41
- /**
42
- * Generates a tree file that references all routes.
43
- */
44
- export declare function layer(load: () => Promise<{
45
- default: FileRoutes;
46
- }>): Layer.Layer<Route.Routes, FileRouterError, FileSystem.FileSystem>;
47
- export declare function layer(options: {
48
- load: () => Promise<{
49
- default: FileRoutes;
50
- }>;
51
- path: string;
52
- }): Layer.Layer<Route.Routes, FileRouterError, FileSystem.FileSystem>;
53
- export declare function fromFileRoutes(fileRoutes: FileRoutes): Effect.Effect<RouteTree.RouteTree>;
54
- export declare function walkRoutesDirectory(dir: string): Effect.Effect<OrderedFileRoutes, PlatformError.PlatformError | FileRouterError, FileSystem.FileSystem>;
55
- export declare function getFileRoutes(paths: Array<string>): Effect.Effect<OrderedFileRoutes, FileRouterError>;
56
- export {};
@@ -1,148 +0,0 @@
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?)$/;
19
- 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
- };
44
- }
45
- function importModule(load) {
46
- return Effect.tryPromise({
47
- try: () => load(),
48
- catch: (cause) => new FileRouterError({ reason: "Import", cause }),
49
- });
50
- }
51
- export function layer(loadOrOptions) {
52
- const options = typeof loadOrOptions === "function"
53
- ? {
54
- load: loadOrOptions,
55
- path: NPath.join(NodeUtils.getEntrypoint(), "routes"),
56
- }
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
- }));
78
- }
79
- 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;
94
- }
95
- return RouteTree.make(mounts);
96
- });
97
- }
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
- });
104
- }
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
- }
145
- }
146
- return routes;
147
- });
148
- }
@@ -1,18 +0,0 @@
1
- import * as FileSystem from "./FileSystem.ts";
2
- import * as Effect from "effect/Effect";
3
- import * as Schema from "effect/Schema";
4
- import * as FilePathPattern from "./FilePathPattern.ts";
5
- import * as FileRouter from "./FileRouter.ts";
6
- export declare function validateRouteModule(module: unknown): module is FileRouter.RouteModule;
7
- export declare function generatePathParamsSchema(segments: ReadonlyArray<FilePathPattern.Segment>): Schema.Struct<any> | null;
8
- /**
9
- * Validates all route modules in the given route handles.
10
- */
11
- export declare function validateRouteModules(path: string, routes: FileRouter.OrderedFileRoutes): Effect.Effect<void, FileRouter.FileRouterError, FileSystem.FileSystem>;
12
- export declare function generateCode(fileRoutes: FileRouter.OrderedFileRoutes): string | null;
13
- /**
14
- * Updates the tree file only if the generated content differs from the existing file.
15
- * This prevents infinite loops when watching for file changes.
16
- */
17
- export declare function update(routesPath: string, treePath?: string): Effect.Effect<void, FileRouter.FileRouterError, FileSystem.FileSystem>;
18
- export declare function dump(routesPath: string, treePath?: string): Effect.Effect<void, FileRouter.FileRouterError, FileSystem.FileSystem>;
@@ -1,227 +0,0 @@
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";
17
- 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;
26
- }
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;
39
- }
40
- return Schema.Struct(fields);
41
- }
42
- /**
43
- * Validates all route modules in the given route handles.
44
- */
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
- });
79
- }
80
- 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);
92
- }
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 });
131
- }
132
- // No routes found - don't create file
133
- if (entries.length === 0) {
134
- return null;
135
- }
136
- const routeEntries = entries
137
- .map(({ path, loaders }) => {
138
- const loadersCode = loaders.join(",\n ");
139
- return ` "${path}": [\n ${loadersCode},\n ]`;
140
- })
141
- .join(",\n");
142
- return `/**
143
- * Auto-generated by effect-start.
144
- */
145
-
146
- export default {
147
- ${routeEntries},
148
- } satisfies import("effect-start/FileRouter").FileRoutes
149
- `;
150
- }
151
- /**
152
- * Updates the tree file only if the generated content differs from the existing file.
153
- * This prevents infinite loops when watching for file changes.
154
- */
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({
160
- reason: "FileSystem",
161
- cause,
162
- 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}`);
199
- }
200
- });
201
- }
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({
207
- reason: "FileSystem",
208
- cause,
209
- 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({
222
- reason: "FileSystem",
223
- cause,
224
- path: treePath,
225
- })));
226
- });
227
- }
@@ -1,9 +0,0 @@
1
- import * as RouterPattern from "./RouterPattern.ts";
2
- export type GroupSegment<Name extends string = string> = {
3
- _tag: "GroupSegment";
4
- name: Name;
5
- };
6
- export type Segment = RouterPattern.Segment | GroupSegment;
7
- export declare function parse(pattern: string): Segment[];
8
- export declare function formatSegment(seg: Segment): string;
9
- export declare function format(segments: Segment[]): `/${string}`;
@@ -1,35 +0,0 @@
1
- import * as RouterPattern from "./RouterPattern.js";
2
- export function parse(pattern) {
3
- const trimmedPath = pattern.replace(/(^\/)|(\/$)/g, "");
4
- if (trimmedPath === "") {
5
- return [];
6
- }
7
- const segmentStrings = trimmedPath
8
- .split("/")
9
- .filter(s => s !== "");
10
- if (segmentStrings.length === 0) {
11
- return [];
12
- }
13
- const segments = segmentStrings.map((s) => {
14
- // (group) - Groups (FileRouter-specific)
15
- const groupMatch = s.match(/^\((\w+)\)$/);
16
- if (groupMatch) {
17
- return { _tag: "GroupSegment", name: groupMatch[1] };
18
- }
19
- // Delegate to RouterPattern for all other segment types
20
- return RouterPattern.parseSegment(s);
21
- });
22
- if (segments.some((seg) => seg === null)) {
23
- throw new Error(`Invalid path segment in "${pattern}": contains invalid characters or format`);
24
- }
25
- return segments;
26
- }
27
- export function formatSegment(seg) {
28
- if (seg._tag === "GroupSegment")
29
- return `(${seg.name})`;
30
- return RouterPattern.formatSegment(seg);
31
- }
32
- export function format(segments) {
33
- const joined = segments.map(formatSegment).join("/");
34
- return (joined ? `/${joined}` : "/");
35
- }