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
package/dist/RouteTree.js CHANGED
@@ -1,93 +1,119 @@
1
- import * as Predicate from "effect/Predicate";
2
- import * as PathPattern from "./PathPattern.js";
3
- import * as Route from "./Route.js";
4
- const TypeId = Symbol.for("effect-start/RouteTree");
5
- const RouteTreeRoutes = Symbol();
6
- const LayerKey = "*";
1
+ import * as Predicate from "effect/Predicate"
2
+ import * as PathPattern from "./PathPattern.js"
3
+ import * as Route from "./Route.js"
4
+
5
+ const TypeId = Symbol.for("effect-start/RouteTree")
6
+ const RouteTreeRoutes = Symbol()
7
+
8
+ const LayerKey = "*"
9
+
7
10
  function routes(tree) {
8
- return tree[RouteTreeRoutes];
11
+ return tree[RouteTreeRoutes]
9
12
  }
13
+
10
14
  // segment priority: static (0) < :param (1) < :param? (2) < :param+ (3) < :param* (4)
11
15
  function sortScore(path) {
12
- const segments = path.split("/");
13
- const greedyIdx = segments.findIndex((s) => s.endsWith("*") || s.endsWith("+"));
14
- const maxPriority = Math.max(...segments.map((s) => !s.startsWith(":") ? 0 : s.endsWith("*") ? 4 : s.endsWith("+") ? 3 : s.endsWith("?") ? 2 : 1), 0);
15
- return greedyIdx === -1
16
- ? // non-greedy: sort by depth, then by max segment priority
17
- (segments.length << 16) + (maxPriority << 8)
18
- : // greedy: sort after non-greedy, by greedy position (later = first), then priority
19
- (1 << 24) + ((16 - greedyIdx) << 16) + (maxPriority << 8);
16
+ const segments = path.split("/")
17
+ const greedyIdx = segments.findIndex((s) => s.endsWith("*") || s.endsWith("+"))
18
+ const maxPriority = Math.max(
19
+ ...segments.map((s) =>
20
+ !s.startsWith(":") ? 0 : s.endsWith("*") ? 4 : s.endsWith("+") ? 3 : s.endsWith("?") ? 2 : 1,
21
+ ),
22
+ 0,
23
+ )
24
+
25
+ return greedyIdx === -1
26
+ ? // non-greedy: sort by depth, then by max segment priority
27
+ (segments.length << 16) + (maxPriority << 8)
28
+ : // greedy: sort after non-greedy, by greedy position (later = first), then priority
29
+ (1 << 24) + ((16 - greedyIdx) << 16) + (maxPriority << 8)
20
30
  }
31
+
21
32
  function sortRoutes(input) {
22
- const keys = Object.keys(input).sort((a, b) => sortScore(a) - sortScore(b) || a.localeCompare(b));
23
- const sorted = {};
24
- for (const key of keys) {
25
- sorted[key] = input[key];
26
- }
27
- return sorted;
33
+ const keys = Object.keys(input).sort((a, b) => sortScore(a) - sortScore(b) || a.localeCompare(b))
34
+ const sorted = {}
35
+ for (const key of keys) {
36
+ sorted[key] = input[key]
37
+ }
38
+ return sorted
28
39
  }
29
- export function make(input) {
30
- const layerRoutes = [...(input[LayerKey] ?? [])];
31
- const merged = {};
32
- function flatten(map, prefix, layers) {
33
- for (const key of Object.keys(map)) {
34
- if (key === LayerKey)
35
- continue;
36
- const path = key;
37
- const entry = map[path];
38
- const fullPath = `${prefix}${path}`;
39
- if (isRouteTree(entry)) {
40
- flatten(routes(entry), fullPath, layers);
41
- }
42
- else {
43
- merged[fullPath] = [...layers, ...entry];
44
- }
45
- }
40
+
41
+ export function make(
42
+ input,
43
+ ) {
44
+ const layerRoutes = [...(input[LayerKey] ?? [])]
45
+ const merged = {}
46
+
47
+ function flatten(map, prefix, layers) {
48
+ for (const key of Object.keys(map)) {
49
+ if (key === LayerKey) continue
50
+ const path = key
51
+ const entry = map[path]
52
+ const fullPath = `${prefix}${path}`
53
+
54
+ if (isRouteTree(entry)) {
55
+ flatten(routes(entry), fullPath, layers)
56
+ } else {
57
+ merged[fullPath] = [...layers, ...(entry)]
58
+ }
46
59
  }
47
- flatten(input, "", layerRoutes);
48
- return {
49
- [TypeId]: TypeId,
50
- [RouteTreeRoutes]: sortRoutes(merged),
51
- };
60
+ }
61
+
62
+ flatten(input, "", layerRoutes)
63
+
64
+ return {
65
+ [TypeId]: TypeId,
66
+ [RouteTreeRoutes]: sortRoutes(merged),
67
+ }
52
68
  }
53
- function* flattenRoutes(path, routes) {
54
- for (const route of routes) {
55
- const descriptor = {
56
- ...route[Route.RouteDescriptor],
57
- path,
58
- };
59
- yield Route.make(route.handler, descriptor);
69
+
70
+ function* flattenRoutes(
71
+ path,
72
+ routes,
73
+ ) {
74
+ for (const route of routes) {
75
+ const descriptor = {
76
+ ...route[Route.RouteDescriptor],
77
+ path,
60
78
  }
79
+ yield Route.make(route.handler, descriptor)
80
+ }
61
81
  }
82
+
62
83
  export function* walk(tree) {
63
- const _routes = routes(tree);
64
- for (const path of Object.keys(_routes)) {
65
- yield* flattenRoutes(path, _routes[path]);
66
- }
84
+ const _routes = routes(tree)
85
+
86
+ for (const path of Object.keys(_routes)) {
87
+ yield* flattenRoutes(path, _routes[path])
88
+ }
67
89
  }
90
+
68
91
  export function merge(a, b) {
69
- const combined = { ...routes(a) };
70
- for (const [path, items] of Object.entries(routes(b))) {
71
- const key = path;
72
- combined[key] = combined[key] ? [...combined[key], ...items] : items;
73
- }
74
- return {
75
- [TypeId]: TypeId,
76
- [RouteTreeRoutes]: sortRoutes(combined),
77
- };
92
+ const combined = { ...routes(a) }
93
+ for (const [path, items] of Object.entries(routes(b))) {
94
+ const key = path
95
+ combined[key] = combined[key] ? [...combined[key], ...items] : items
96
+ }
97
+ return {
98
+ [TypeId]: TypeId,
99
+ [RouteTreeRoutes]: sortRoutes(combined),
100
+ }
78
101
  }
102
+
79
103
  export function isRouteTree(input) {
80
- return Predicate.hasProperty(input, TypeId);
104
+ return Predicate.hasProperty(input, TypeId)
81
105
  }
106
+
82
107
  export function lookup(tree, method, path) {
83
- for (const route of walk(tree)) {
84
- const descriptor = Route.descriptor(route);
85
- if (descriptor.method !== "*" && descriptor.method !== method)
86
- continue;
87
- const params = PathPattern.match(descriptor.path, path);
88
- if (params !== null) {
89
- return { route, params };
90
- }
108
+ for (const route of walk(tree)) {
109
+ const descriptor = Route.descriptor(route)
110
+
111
+ if (descriptor.method !== "*" && descriptor.method !== method) continue
112
+
113
+ const params = PathPattern.match(descriptor.path, path)
114
+ if (params !== null) {
115
+ return { route, params }
91
116
  }
92
- return null;
117
+ }
118
+ return null
93
119
  }
package/dist/RouteTrie.js CHANGED
@@ -1,152 +1,179 @@
1
- import * as PathPattern from "./PathPattern.js";
2
- import * as Route from "./Route.js";
1
+ import * as PathPattern from "./PathPattern.js"
2
+ import * as Route from "./Route.js"
3
+
3
4
  function createNode() {
4
- return {
5
- children: {},
6
- paramChild: null,
7
- paramName: null,
8
- requiredWildcardChild: null,
9
- requiredWildcardName: null,
10
- optionalWildcardChild: null,
11
- optionalWildcardName: null,
12
- routes: [],
13
- };
5
+ return {
6
+ children: {},
7
+ paramChild: null,
8
+ paramName: null,
9
+ requiredWildcardChild: null,
10
+ requiredWildcardName: null,
11
+ optionalWildcardChild: null,
12
+ optionalWildcardName: null,
13
+ routes: [],
14
+ }
14
15
  }
16
+
15
17
  function insertRoute(node, segments, route) {
16
- if (segments.length === 0) {
17
- node.routes.push(route);
18
- return;
18
+ if (segments.length === 0) {
19
+ node.routes.push(route)
20
+ return
21
+ }
22
+
23
+ const segment = segments[0]
24
+ const rest = segments.slice(1)
25
+
26
+ if (segment.startsWith(":")) {
27
+ const name = segment.slice(1)
28
+
29
+ if (name.endsWith("+")) {
30
+ if (!node.requiredWildcardChild) {
31
+ node.requiredWildcardChild = createNode()
32
+ }
33
+ node.requiredWildcardChild.requiredWildcardName = name.slice(0, -1)
34
+ node.requiredWildcardChild.routes.push(route)
35
+ } else if (name.endsWith("*")) {
36
+ if (!node.optionalWildcardChild) {
37
+ node.optionalWildcardChild = createNode()
38
+ }
39
+ node.optionalWildcardChild.optionalWildcardName = name.slice(0, -1)
40
+ node.optionalWildcardChild.routes.push(route)
41
+ } else if (name.endsWith("?")) {
42
+ if (!node.paramChild) {
43
+ node.paramChild = createNode()
44
+ }
45
+ node.paramChild.paramName = name.slice(0, -1)
46
+ insertRoute(node.paramChild, rest, route)
47
+ insertRoute(node, rest, route)
48
+ } else {
49
+ if (!node.paramChild) {
50
+ node.paramChild = createNode()
51
+ }
52
+ node.paramChild.paramName = name
53
+ insertRoute(node.paramChild, rest, route)
19
54
  }
20
- const segment = segments[0];
21
- const rest = segments.slice(1);
22
- if (segment.startsWith(":")) {
23
- const name = segment.slice(1);
24
- if (name.endsWith("+")) {
25
- if (!node.requiredWildcardChild) {
26
- node.requiredWildcardChild = createNode();
27
- }
28
- node.requiredWildcardChild.requiredWildcardName = name.slice(0, -1);
29
- node.requiredWildcardChild.routes.push(route);
30
- }
31
- else if (name.endsWith("*")) {
32
- if (!node.optionalWildcardChild) {
33
- node.optionalWildcardChild = createNode();
34
- }
35
- node.optionalWildcardChild.optionalWildcardName = name.slice(0, -1);
36
- node.optionalWildcardChild.routes.push(route);
37
- }
38
- else if (name.endsWith("?")) {
39
- if (!node.paramChild) {
40
- node.paramChild = createNode();
41
- }
42
- node.paramChild.paramName = name.slice(0, -1);
43
- insertRoute(node.paramChild, rest, route);
44
- insertRoute(node, rest, route);
45
- }
46
- else {
47
- if (!node.paramChild) {
48
- node.paramChild = createNode();
49
- }
50
- node.paramChild.paramName = name;
51
- insertRoute(node.paramChild, rest, route);
52
- }
53
- }
54
- else {
55
- if (!node.children[segment]) {
56
- node.children[segment] = createNode();
57
- }
58
- insertRoute(node.children[segment], rest, route);
55
+ } else {
56
+ if (!node.children[segment]) {
57
+ node.children[segment] = createNode()
59
58
  }
59
+ insertRoute(node.children[segment], rest, route)
60
+ }
60
61
  }
61
- function collectRoutes(items, parentPath, parentMethod) {
62
- const results = [];
63
- for (const item of items) {
64
- const desc = Route.descriptor(item);
65
- const currentPath = typeof desc?.path === "string" ? parentPath + desc.path : parentPath;
66
- const currentMethod = desc?.method ?? parentMethod;
67
- if (Route.isRoute(item)) {
68
- if (currentPath !== "") {
69
- results.push({
70
- route: item,
71
- method: currentMethod,
72
- path: currentPath,
73
- });
74
- }
75
- }
76
- else {
77
- const nestedItems = Route.items(item);
78
- results.push(...collectRoutes(nestedItems, currentPath, currentMethod));
79
- }
62
+
63
+ function collectRoutes(
64
+ items,
65
+ parentPath,
66
+ parentMethod,
67
+ ) {
68
+ const results = []
69
+
70
+ for (const item of items) {
71
+ const desc = Route.descriptor(item)
72
+ const currentPath = typeof desc?.path === "string" ? parentPath + desc.path : parentPath
73
+ const currentMethod = desc?.method ?? parentMethod
74
+
75
+ if (Route.isRoute(item)) {
76
+ if (currentPath !== "") {
77
+ results.push({
78
+ route: item,
79
+ method: currentMethod,
80
+ path: currentPath,
81
+ })
82
+ }
83
+ } else {
84
+ const nestedItems = Route.items(item)
85
+ results.push(...collectRoutes(nestedItems, currentPath, currentMethod))
80
86
  }
81
- return results;
87
+ }
88
+
89
+ return results
82
90
  }
91
+
83
92
  export function make(set) {
84
- const methods = {};
85
- const collected = collectRoutes(Route.items(set), "", "*");
86
- for (const { route, method, path } of collected) {
87
- if (!methods[method]) {
88
- methods[method] = createNode();
89
- }
90
- const result = PathPattern.validate(path);
91
- if (!result.ok) {
92
- throw new Error(result.error);
93
- }
94
- insertRoute(methods[method], result.segments, route);
93
+ const methods = {}
94
+ const collected = collectRoutes(Route.items(set), "", "*")
95
+
96
+ for (const { route, method, path } of collected) {
97
+ if (!methods[method]) {
98
+ methods[method] = createNode()
99
+ }
100
+ const result = PathPattern.validate(path)
101
+ if (!result.ok) {
102
+ throw new Error(result.error)
95
103
  }
96
- return { methods };
104
+ insertRoute(methods[method], result.segments, route)
105
+ }
106
+
107
+ return { methods }
97
108
  }
98
- function lookupNode(node, segments, params) {
99
- const results = [];
100
- if (segments.length === 0) {
101
- for (const route of node.routes) {
102
- results.push({ route, params });
103
- }
104
- if (node.optionalWildcardChild && node.optionalWildcardChild.optionalWildcardName) {
105
- for (const route of node.optionalWildcardChild.routes) {
106
- results.push({ route, params });
107
- }
108
- }
109
- return results;
109
+
110
+ function lookupNode(
111
+ node,
112
+ segments,
113
+ params,
114
+ ) {
115
+ const results = []
116
+
117
+ if (segments.length === 0) {
118
+ for (const route of node.routes) {
119
+ results.push({ route, params })
110
120
  }
111
- const segment = segments[0];
112
- const rest = segments.slice(1);
113
- if (node.children[segment]) {
114
- results.push(...lookupNode(node.children[segment], rest, params));
121
+ if (node.optionalWildcardChild && node.optionalWildcardChild.optionalWildcardName) {
122
+ for (const route of node.optionalWildcardChild.routes) {
123
+ results.push({ route, params })
124
+ }
115
125
  }
116
- if (node.paramChild && node.paramChild.paramName) {
117
- const newParams = { ...params, [node.paramChild.paramName]: segment };
118
- results.push(...lookupNode(node.paramChild, rest, newParams));
126
+ return results
127
+ }
128
+
129
+ const segment = segments[0]
130
+ const rest = segments.slice(1)
131
+
132
+ if (node.children[segment]) {
133
+ results.push(...lookupNode(node.children[segment], rest, params))
134
+ }
135
+
136
+ if (node.paramChild && node.paramChild.paramName) {
137
+ const newParams = { ...params, [node.paramChild.paramName]: segment }
138
+ results.push(...lookupNode(node.paramChild, rest, newParams))
139
+ }
140
+
141
+ if (node.requiredWildcardChild && node.requiredWildcardChild.requiredWildcardName) {
142
+ const wildcardValue = segments.join("/")
143
+ const newParams = {
144
+ ...params,
145
+ [node.requiredWildcardChild.requiredWildcardName]: wildcardValue,
119
146
  }
120
- if (node.requiredWildcardChild && node.requiredWildcardChild.requiredWildcardName) {
121
- const wildcardValue = segments.join("/");
122
- const newParams = {
123
- ...params,
124
- [node.requiredWildcardChild.requiredWildcardName]: wildcardValue,
125
- };
126
- for (const route of node.requiredWildcardChild.routes) {
127
- results.push({ route, params: newParams });
128
- }
147
+ for (const route of node.requiredWildcardChild.routes) {
148
+ results.push({ route, params: newParams })
129
149
  }
130
- if (node.optionalWildcardChild && node.optionalWildcardChild.optionalWildcardName) {
131
- const wildcardValue = segments.join("/");
132
- const newParams = {
133
- ...params,
134
- [node.optionalWildcardChild.optionalWildcardName]: wildcardValue,
135
- };
136
- for (const route of node.optionalWildcardChild.routes) {
137
- results.push({ route, params: newParams });
138
- }
150
+ }
151
+
152
+ if (node.optionalWildcardChild && node.optionalWildcardChild.optionalWildcardName) {
153
+ const wildcardValue = segments.join("/")
154
+ const newParams = {
155
+ ...params,
156
+ [node.optionalWildcardChild.optionalWildcardName]: wildcardValue,
139
157
  }
140
- return results;
158
+ for (const route of node.optionalWildcardChild.routes) {
159
+ results.push({ route, params: newParams })
160
+ }
161
+ }
162
+
163
+ return results
141
164
  }
165
+
142
166
  export function lookup(trie, method, path) {
143
- const segments = path.split("/").filter(Boolean);
144
- const results = [];
145
- if (trie.methods[method]) {
146
- results.push(...lookupNode(trie.methods[method], segments, {}));
147
- }
148
- if (method !== "*" && trie.methods["*"]) {
149
- results.push(...lookupNode(trie.methods["*"], segments, {}));
150
- }
151
- return results;
167
+ const segments = path.split("/").filter(Boolean)
168
+ const results = []
169
+
170
+ if (trie.methods[method]) {
171
+ results.push(...lookupNode(trie.methods[method], segments, {}))
172
+ }
173
+
174
+ if (method !== "*" && trie.methods["*"]) {
175
+ results.push(...lookupNode(trie.methods["*"], segments, {}))
176
+ }
177
+
178
+ return results
152
179
  }
@@ -1,74 +1,99 @@
1
- import * as SchemaAST from "effect/SchemaAST";
1
+ import * as Function from "effect/Function"
2
+ import * as SchemaAST from "effect/SchemaAST"
3
+
2
4
  export function getBaseSchemaAST(schema) {
3
- let current = schema.ast;
4
- while (SchemaAST.isRefinement(current) || SchemaAST.isTransformation(current)) {
5
- current = current.from;
6
- }
7
- return current;
5
+ let current = schema.ast
6
+
7
+ while (SchemaAST.isRefinement(current) || SchemaAST.isTransformation(current)) {
8
+ current = current.from
9
+ }
10
+
11
+ return current
8
12
  }
13
+
9
14
  export function isOptional(schema) {
10
- const ast = schema.ast;
11
- if (ast._tag === "Union") {
12
- return ast.types.some((t) => t._tag === "UndefinedKeyword");
13
- }
14
- return false;
15
+ const ast = schema.ast
16
+
17
+ if (ast._tag === "Union") {
18
+ return ast.types.some((t) => t._tag === "UndefinedKeyword")
19
+ }
20
+
21
+ return false
15
22
  }
16
- export function schemaEqual(userSchema, expectedSchema) {
17
- if (!userSchema && !expectedSchema) {
18
- return true;
19
- }
20
- if (!userSchema || !expectedSchema) {
21
- return false;
23
+
24
+ export function schemaEqual(
25
+ userSchema,
26
+ expectedSchema,
27
+ ) {
28
+ if (!userSchema && !expectedSchema) {
29
+ return true
30
+ }
31
+ if (!userSchema || !expectedSchema) {
32
+ return false
33
+ }
34
+
35
+ const userFields = userSchema.fields
36
+ const expectedFields = expectedSchema.fields
37
+
38
+ const userKeys = Object.keys(userFields).sort()
39
+ const expectedKeys = Object.keys(expectedFields).sort()
40
+
41
+ if (userKeys.length !== expectedKeys.length) {
42
+ return false
43
+ }
44
+
45
+ for (let i = 0; i < userKeys.length; i++) {
46
+ if (userKeys[i] !== expectedKeys[i]) {
47
+ return false
22
48
  }
23
- const userFields = userSchema.fields;
24
- const expectedFields = expectedSchema.fields;
25
- const userKeys = Object.keys(userFields).sort();
26
- const expectedKeys = Object.keys(expectedFields).sort();
27
- if (userKeys.length !== expectedKeys.length) {
28
- return false;
49
+ }
50
+
51
+ for (const key of userKeys) {
52
+ const userFieldSchema = userFields[key]
53
+ const expectedFieldSchema = expectedFields[key]
54
+
55
+ const userOptional = isOptional(userFieldSchema)
56
+ const expectedOptional = isOptional(expectedFieldSchema)
57
+
58
+ if (userOptional !== expectedOptional) {
59
+ return false
29
60
  }
30
- for (let i = 0; i < userKeys.length; i++) {
31
- if (userKeys[i] !== expectedKeys[i]) {
32
- return false;
33
- }
61
+
62
+ const userBaseAST = getBaseSchemaAST(userFieldSchema)
63
+ const expectedBaseAST = getBaseSchemaAST(expectedFieldSchema)
64
+
65
+ if (userBaseAST._tag !== expectedBaseAST._tag) {
66
+ return false
34
67
  }
35
- for (const key of userKeys) {
36
- const userFieldSchema = userFields[key];
37
- const expectedFieldSchema = expectedFields[key];
38
- const userOptional = isOptional(userFieldSchema);
39
- const expectedOptional = isOptional(expectedFieldSchema);
40
- if (userOptional !== expectedOptional) {
41
- return false;
42
- }
43
- const userBaseAST = getBaseSchemaAST(userFieldSchema);
44
- const expectedBaseAST = getBaseSchemaAST(expectedFieldSchema);
45
- if (userBaseAST._tag !== expectedBaseAST._tag) {
46
- return false;
47
- }
48
- }
49
- return true;
68
+ }
69
+
70
+ return true
50
71
  }
72
+
51
73
  export function getSchemaTypeName(schema) {
52
- const baseAST = getBaseSchemaAST(schema);
53
- switch (baseAST._tag) {
54
- case "StringKeyword":
55
- return "Schema.String";
56
- case "NumberKeyword":
57
- return "Schema.Number";
58
- case "BooleanKeyword":
59
- return "Schema.Boolean";
60
- default:
61
- return "Schema.String";
62
- }
74
+ const baseAST = getBaseSchemaAST(schema)
75
+ switch (baseAST._tag) {
76
+ case "StringKeyword":
77
+ return "Schema.String"
78
+ case "NumberKeyword":
79
+ return "Schema.Number"
80
+ case "BooleanKeyword":
81
+ return "Schema.Boolean"
82
+ default:
83
+ return "Schema.String"
84
+ }
63
85
  }
86
+
64
87
  export function formatSchemaCode(schema) {
65
- const fields = schema.fields;
66
- const fieldStrings = [];
67
- for (const [key, fieldSchema] of Object.entries(fields)) {
68
- const optional = isOptional(fieldSchema);
69
- const typeName = getSchemaTypeName(fieldSchema);
70
- const fieldStr = optional ? `${key}?: ${typeName}` : `${key}: ${typeName}`;
71
- fieldStrings.push(fieldStr);
72
- }
73
- return `{ ${fieldStrings.join(", ")} }`;
88
+ const fields = schema.fields
89
+ const fieldStrings = []
90
+
91
+ for (const [key, fieldSchema] of Object.entries(fields)) {
92
+ const optional = isOptional(fieldSchema)
93
+ const typeName = getSchemaTypeName(fieldSchema)
94
+ const fieldStr = optional ? `${key}?: ${typeName}` : `${key}: ${typeName}`
95
+ fieldStrings.push(fieldStr)
96
+ }
97
+
98
+ return `{ ${fieldStrings.join(", ")} }`
74
99
  }