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,188 +0,0 @@
1
- import * as Effect from "effect/Effect";
2
- import * as Schema from "effect/Schema";
3
- import * as Entity from "./Entity.js";
4
- import * as Http from "./Http.js";
5
- import * as PathPattern from "./PathPattern.js";
6
- import * as Route from "./Route.js";
7
- import * as RouteHook from "./RouteHook.js";
8
- export const RequestBodyError = (reason, cause) => ({ _tag: "RequestBodyError", reason, cause });
9
- export const File = Schema.TaggedStruct("File", {
10
- key: Schema.String,
11
- name: Schema.String,
12
- contentType: Schema.String,
13
- content: Schema.Uint8ArrayFromSelf,
14
- });
15
- export function schemaHeaders(fields) {
16
- const decode = Schema.decodeUnknown(fields);
17
- return RouteHook.filter((ctx) => Effect.map(decode(Http.mapHeaders(ctx.request.headers)), (parsed) => ({
18
- context: {
19
- headers: {
20
- ...ctx.headers,
21
- ...parsed,
22
- },
23
- },
24
- })));
25
- }
26
- export function schemaCookies(fields) {
27
- const decode = Schema.decodeUnknown(fields);
28
- return RouteHook.filter((ctx) => Effect.map(decode(Http.parseCookies(ctx.request.headers.get("cookie"))), (parsed) => ({
29
- context: {
30
- cookies: {
31
- ...ctx.cookies,
32
- ...parsed,
33
- },
34
- },
35
- })));
36
- }
37
- export function schemaSearchParams(fields) {
38
- const decode = Schema.decodeUnknown(fields);
39
- return RouteHook.filter((ctx) => {
40
- const url = new URL(ctx.request.url);
41
- return Effect.map(decode(Http.mapUrlSearchParams(url.searchParams)), (parsed) => ({
42
- context: {
43
- searchParams: {
44
- ...ctx.searchParams,
45
- ...parsed,
46
- },
47
- },
48
- }));
49
- });
50
- }
51
- export function schemaPathParams(fields) {
52
- const decode = Schema.decodeUnknown(fields);
53
- return RouteHook.filter((ctx) => {
54
- const url = new URL(ctx.request.url);
55
- const pattern = ctx.path ?? "/";
56
- const params = PathPattern.match(pattern, url.pathname) ?? {};
57
- return Effect.map(decode(params), (parsed) => ({
58
- context: {
59
- pathParams: {
60
- ...ctx.pathParams,
61
- ...parsed,
62
- },
63
- },
64
- }));
65
- });
66
- }
67
- export function schemaBodyJson(fields) {
68
- const decode = Schema.decodeUnknown(fields);
69
- return RouteHook.filter((ctx) => Effect.gen(function* () {
70
- const json = yield* Effect.tryPromise({
71
- try: () => ctx.request.json(),
72
- catch: (error) => RequestBodyError("JsonError", error),
73
- });
74
- const parsed = yield* decode(json);
75
- return {
76
- context: {
77
- body: {
78
- ...ctx.body,
79
- ...parsed,
80
- },
81
- },
82
- };
83
- }));
84
- }
85
- export function schemaBodyUrlParams(fields) {
86
- const decode = Schema.decodeUnknown(fields);
87
- return RouteHook.filter((ctx) => Effect.gen(function* () {
88
- const text = yield* Effect.tryPromise({
89
- try: () => ctx.request.text(),
90
- catch: (error) => RequestBodyError("UrlParamsError", error),
91
- });
92
- const params = new URLSearchParams(text);
93
- const parsed = yield* decode(Http.mapUrlSearchParams(params));
94
- return {
95
- context: {
96
- body: {
97
- ...ctx.body,
98
- ...parsed,
99
- },
100
- },
101
- };
102
- }));
103
- }
104
- export function schemaBodyMultipart(fields) {
105
- const decode = Schema.decodeUnknown(fields);
106
- return RouteHook.filter((ctx) => Effect.gen(function* () {
107
- const record = yield* Effect.tryPromise({
108
- try: () => Http.parseFormData(ctx.request),
109
- catch: (error) => RequestBodyError("MultipartError", error),
110
- });
111
- const parsed = yield* decode(record);
112
- return {
113
- context: {
114
- body: {
115
- ...ctx.body,
116
- ...parsed,
117
- },
118
- },
119
- };
120
- }));
121
- }
122
- export function schemaBodyForm(fields) {
123
- const decode = Schema.decodeUnknown(fields);
124
- return RouteHook.filter((ctx) => Effect.gen(function* () {
125
- const contentType = ctx.request.headers.get("content-type") ?? "";
126
- if (contentType.includes("application/x-www-form-urlencoded")) {
127
- const text = yield* Effect.tryPromise({
128
- try: () => ctx.request.text(),
129
- catch: (error) => RequestBodyError("UrlParamsError", error),
130
- });
131
- const params = new URLSearchParams(text);
132
- const record = Http.mapUrlSearchParams(params);
133
- const parsed = yield* decode(record);
134
- return {
135
- context: {
136
- body: {
137
- ...ctx.body,
138
- ...parsed,
139
- },
140
- },
141
- };
142
- }
143
- const record = yield* Effect.tryPromise({
144
- try: () => Http.parseFormData(ctx.request),
145
- catch: (error) => RequestBodyError("FormDataError", error),
146
- });
147
- const parsed = yield* decode(record);
148
- return {
149
- context: {
150
- body: {
151
- ...ctx.body,
152
- ...parsed,
153
- },
154
- },
155
- };
156
- }));
157
- }
158
- export function schemaError(schema, options) {
159
- const status = options?.status ?? schema.status;
160
- if (typeof status !== "number") {
161
- throw new Error("schemaError: status is required either via options or as a static property on the schema");
162
- }
163
- const encode = Schema.encode(schema);
164
- const is = Schema.is(schema);
165
- return function (self) {
166
- const route = Route.make((_context, next) => Entity.resolve(next()).pipe(Effect.catchIf(is, (error) => Effect.map(Effect.orDie(encode(error)), (encoded) => Entity.make(encoded, { status })))));
167
- const items = [
168
- ...Route.items(self),
169
- route,
170
- ];
171
- return Route.set(items, Route.descriptor(self));
172
- };
173
- }
174
- export function schemaSuccess(schema) {
175
- const encode = Schema.encodeUnknown(schema);
176
- return function (self) {
177
- const route = Route.make((_context, next) => Effect.flatMap(Entity.resolve(next()), (entity) => Effect.map(encode(entity.body), (encoded) => Entity.make(encoded, {
178
- status: entity.status,
179
- headers: entity.headers,
180
- url: entity.url,
181
- }))));
182
- const items = [
183
- ...Route.items(self),
184
- route,
185
- ];
186
- return Route.set(items, Route.descriptor(self));
187
- };
188
- }
@@ -1,21 +0,0 @@
1
- import * as Effect from "effect/Effect";
2
- import * as Stream from "effect/Stream";
3
- import type * as Utils from "effect/Utils";
4
- import * as Entity from "./Entity.ts";
5
- import * as Route from "./Route.ts";
6
- import type * as Values from "./Values.ts";
7
- export interface SseEvent {
8
- data?: string | undefined;
9
- event?: string;
10
- retry?: number;
11
- }
12
- export type SseTaggedEvent = {
13
- readonly _tag: string;
14
- };
15
- export type SseEventInput = SseEvent | SseTaggedEvent;
16
- export type SseHandlerInput<B, E, R> = Stream.Stream<SseEventInput, E, R> | Effect.Effect<Stream.Stream<SseEventInput, E, R>, E, R> | ((context: Values.Simplify<B>, next: (context?: Partial<B> & Record<string, unknown>) => Entity.Entity<string>) => Stream.Stream<SseEventInput, E, R> | Effect.Effect<Stream.Stream<SseEventInput, E, R>, E, R> | Generator<Utils.YieldWrap<Effect.Effect<unknown, E, R>>, Stream.Stream<SseEventInput, E, R>, unknown>);
17
- export declare function sse<D extends Route.RouteDescriptor.Any, B extends {}, I extends Route.Route.Tuple, E = never, R = never>(handler: SseHandlerInput<NoInfer<D & B & Route.ExtractBindings<I> & {
18
- format: "text";
19
- }>, E, R>): (self: Route.RouteSet.RouteSet<D, B, I>) => Route.RouteSet.RouteSet<D, B, [...I, Route.Route.Route<{
20
- format: "text";
21
- }, {}, Stream.Stream<string, E, R>, E, R>]>;
package/dist/RouteSse.js DELETED
@@ -1,79 +0,0 @@
1
- import * as Duration from "effect/Duration";
2
- import * as Effect from "effect/Effect";
3
- import * as Schedule from "effect/Schedule";
4
- import * as Stream from "effect/Stream";
5
- import * as Entity from "./Entity.js";
6
- import * as Route from "./Route.js";
7
- import * as StreamExtra from "./StreamExtra.js";
8
- const HEARTBEAT_INTERVAL = Duration.seconds(5);
9
- const HEARTBEAT = ": <3\n\n";
10
- function isTaggedEvent(event) {
11
- return Object.hasOwn(event, "_tag") && typeof event["_tag"] === "string";
12
- }
13
- function formatSseEvent(event) {
14
- if (isTaggedEvent(event)) {
15
- const json = JSON.stringify(event);
16
- return `event: ${event._tag}\ndata: ${json}\n\n`;
17
- }
18
- const e = event;
19
- let result = "";
20
- if (e.event) {
21
- result += `event: ${e.event}\n`;
22
- }
23
- if (typeof e.data === "string") {
24
- for (const line of e.data.split("\n")) {
25
- result += `data: ${line}\n`;
26
- }
27
- }
28
- if (e.retry !== undefined) {
29
- result += `retry: ${e.retry}\n`;
30
- }
31
- if (result === "") {
32
- return "";
33
- }
34
- return result + "\n";
35
- }
36
- export function sse(handler) {
37
- return function (self) {
38
- const sseHandler = (ctx, _next) => {
39
- const getStream = () => {
40
- if (typeof handler === "function") {
41
- const result = handler(ctx, _next);
42
- if (StreamExtra.isStream(result)) {
43
- return Effect.succeed(result);
44
- }
45
- if (Effect.isEffect(result)) {
46
- return result;
47
- }
48
- return Effect.gen(function* () {
49
- return yield* result;
50
- });
51
- }
52
- if (StreamExtra.isStream(handler)) {
53
- return Effect.succeed(handler);
54
- }
55
- if (Effect.isEffect(handler)) {
56
- return handler;
57
- }
58
- return Effect.succeed(Stream.empty);
59
- };
60
- return Effect.map(getStream(), (eventStream) => {
61
- const formattedStream = Stream.map(eventStream, formatSseEvent);
62
- const heartbeat = Stream.repeat(Stream.succeed(HEARTBEAT), Schedule.spaced(HEARTBEAT_INTERVAL)).pipe(Stream.drop(1));
63
- const merged = Stream.merge(formattedStream, heartbeat, {
64
- haltStrategy: "left",
65
- });
66
- return Entity.make(merged, {
67
- headers: {
68
- "content-type": "text/event-stream",
69
- "cache-control": "no-cache",
70
- connection: "keep-alive",
71
- },
72
- });
73
- });
74
- };
75
- const route = Route.make(sseHandler, { format: "text" });
76
- const items = [...Route.items(self), route];
77
- return Route.set(items, Route.descriptor(self));
78
- };
79
- }
@@ -1,57 +0,0 @@
1
- import * as PathPattern from "./PathPattern.ts";
2
- import * as Route from "./Route.ts";
3
- import type * as RouteMount from "./RouteMount.ts";
4
- declare const TypeId: unique symbol;
5
- declare const RouteTreeRoutes: unique symbol;
6
- type MethodRoute = Route.Route.With<{
7
- method: string;
8
- }>;
9
- export type RouteTuple = Iterable<MethodRoute>;
10
- export type LayerRoute = Iterable<Route.Route.With<{
11
- method: "*";
12
- }>>;
13
- type LayerKey = "*";
14
- declare const LayerKey: LayerKey;
15
- export type InputRouteMap = {
16
- [LayerKey]?: LayerRoute;
17
- } & {
18
- [path: PathPattern.PathPattern]: RouteTuple | RouteTree;
19
- };
20
- export type RouteMap = {
21
- [path: PathPattern.PathPattern]: Route.Route.Tuple;
22
- };
23
- export type Routes<T extends RouteTree> = T[typeof RouteTreeRoutes];
24
- export interface RouteTree<Routes extends RouteMap = RouteMap> {
25
- [TypeId]: typeof TypeId;
26
- [RouteTreeRoutes]: Routes;
27
- }
28
- type PrefixKeys<T, Prefix extends string> = {
29
- [K in keyof T as K extends string ? `${Prefix}${K}` : never]: T[K];
30
- };
31
- type InferItems<T> = T extends Route.RouteSet.Data<any, any, infer M> ? M : [];
32
- type LayerItems<T extends InputRouteMap> = "*" extends keyof T ? InferItems<T["*"]> : [];
33
- type FlattenRouteMap<T extends InputRouteMap> = {
34
- [K in Exclude<keyof T, "*"> as T[K] extends RouteTree ? never : K]: [
35
- ...LayerItems<T>,
36
- ...InferItems<T[K]>
37
- ];
38
- } & UnionToIntersection<FlattenNested<T, Exclude<keyof T, "*">, LayerItems<T>>>;
39
- type FlattenNested<T, K, L extends Route.Route.Tuple> = K extends keyof T ? T[K] extends RouteTree<infer R> ? PrefixKeys<PrependLayers<R, L>, K & string> : {} : {};
40
- type PrependLayers<T extends RouteMap, L extends Route.Route.Tuple> = {
41
- [K in keyof T]: T[K] extends Route.Route.Tuple ? [...L, ...T[K]] : never;
42
- };
43
- type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
44
- export declare function make<const Routes extends InputRouteMap>(input: Routes): RouteTree<FlattenRouteMap<Routes>>;
45
- export type WalkDescriptor = {
46
- path: PathPattern.PathPattern;
47
- method: string;
48
- } & Route.RouteDescriptor.Any;
49
- export declare function walk(tree: RouteTree): Generator<RouteMount.MountedRoute>;
50
- export declare function merge(a: RouteTree, b: RouteTree): RouteTree;
51
- export declare function isRouteTree(input: unknown): input is RouteTree;
52
- export interface LookupResult {
53
- route: RouteMount.MountedRoute;
54
- params: Record<string, string>;
55
- }
56
- export declare function lookup(tree: RouteTree, method: string, path: string): LookupResult | null;
57
- export {};
package/dist/RouteTree.js DELETED
@@ -1,93 +0,0 @@
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 = "*";
7
- function routes(tree) {
8
- return tree[RouteTreeRoutes];
9
- }
10
- // segment priority: static (0) < :param (1) < :param? (2) < :param+ (3) < :param* (4)
11
- 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);
20
- }
21
- 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;
28
- }
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
- }
46
- }
47
- flatten(input, "", layerRoutes);
48
- return {
49
- [TypeId]: TypeId,
50
- [RouteTreeRoutes]: sortRoutes(merged),
51
- };
52
- }
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);
60
- }
61
- }
62
- export function* walk(tree) {
63
- const _routes = routes(tree);
64
- for (const path of Object.keys(_routes)) {
65
- yield* flattenRoutes(path, _routes[path]);
66
- }
67
- }
68
- 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
- };
78
- }
79
- export function isRouteTree(input) {
80
- return Predicate.hasProperty(input, TypeId);
81
- }
82
- 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
- }
91
- }
92
- return null;
93
- }
@@ -1,20 +0,0 @@
1
- import * as Route from "./Route.ts";
2
- export interface Node {
3
- children: Record<string, Node>;
4
- paramChild: Node | null;
5
- paramName: string | null;
6
- requiredWildcardChild: Node | null;
7
- requiredWildcardName: string | null;
8
- optionalWildcardChild: Node | null;
9
- optionalWildcardName: string | null;
10
- routes: Array<Route.Route.Route>;
11
- }
12
- export interface RouteTrie {
13
- readonly methods: Record<string, Node>;
14
- }
15
- export interface LookupResult {
16
- route: Route.Route.Route;
17
- params: Record<string, string>;
18
- }
19
- export declare function make(set: Route.RouteSet.Any): RouteTrie;
20
- export declare function lookup(trie: RouteTrie, method: string, path: string): Array<LookupResult>;
package/dist/RouteTrie.js DELETED
@@ -1,152 +0,0 @@
1
- import * as PathPattern from "./PathPattern.js";
2
- import * as Route from "./Route.js";
3
- 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
- };
14
- }
15
- function insertRoute(node, segments, route) {
16
- if (segments.length === 0) {
17
- node.routes.push(route);
18
- return;
19
- }
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);
59
- }
60
- }
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
- }
80
- }
81
- return results;
82
- }
83
- 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);
95
- }
96
- return { methods };
97
- }
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;
110
- }
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));
115
- }
116
- if (node.paramChild && node.paramChild.paramName) {
117
- const newParams = { ...params, [node.paramChild.paramName]: segment };
118
- results.push(...lookupNode(node.paramChild, rest, newParams));
119
- }
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
- }
129
- }
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
- }
139
- }
140
- return results;
141
- }
142
- 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;
152
- }