effect-start 0.23.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/dist/ChildProcess.js +32 -20
  2. package/dist/Commander.js +377 -293
  3. package/dist/ContentNegotiation.js +424 -318
  4. package/dist/Cookies.js +340 -271
  5. package/dist/Development.js +85 -49
  6. package/dist/Effectify.js +22 -14
  7. package/dist/Entity.js +260 -195
  8. package/dist/Fetch.js +192 -0
  9. package/dist/FilePathPattern.js +88 -77
  10. package/dist/FileRouter.js +192 -136
  11. package/dist/FileRouterCodegen.js +262 -191
  12. package/dist/FileSystem.js +126 -64
  13. package/dist/Http.js +96 -77
  14. package/dist/PathPattern.js +311 -273
  15. package/dist/PlatformError.js +36 -21
  16. package/dist/PlatformRuntime.js +65 -40
  17. package/dist/Route.js +122 -79
  18. package/dist/RouteBody.js +83 -58
  19. package/dist/RouteError.js +46 -25
  20. package/dist/RouteHook.js +58 -34
  21. package/dist/RouteHttp.js +346 -237
  22. package/dist/RouteHttpTracer.js +86 -58
  23. package/dist/RouteMount.js +81 -58
  24. package/dist/RouteSchema.js +253 -170
  25. package/dist/RouteSse.js +87 -72
  26. package/dist/RouteTree.js +99 -73
  27. package/dist/RouteTrie.js +160 -133
  28. package/dist/SchemaExtra.js +87 -62
  29. package/dist/Socket.js +32 -21
  30. package/dist/SqlIntrospect.js +317 -268
  31. package/dist/Start.js +55 -25
  32. package/dist/StartApp.js +3 -21
  33. package/dist/StreamExtra.js +109 -74
  34. package/dist/System.js +37 -21
  35. package/dist/TuplePathPattern.js +64 -58
  36. package/dist/Unique.js +159 -120
  37. package/dist/Values.js +48 -32
  38. package/dist/bun/BunBundle.js +158 -109
  39. package/dist/bun/BunChildProcessSpawner.js +121 -82
  40. package/dist/bun/BunImportTrackerPlugin.js +85 -63
  41. package/dist/bun/BunRoute.js +135 -99
  42. package/dist/bun/BunRuntime.js +39 -29
  43. package/dist/bun/BunServer.js +268 -140
  44. package/dist/bun/BunVirtualFilesPlugin.js +47 -33
  45. package/dist/bun/_BunEnhancedResolve.js +107 -82
  46. package/dist/bun/index.js +5 -5
  47. package/dist/bundler/Bundle.js +82 -38
  48. package/dist/bundler/BundleFiles.js +140 -82
  49. package/dist/bundler/BundleRoute.js +49 -38
  50. package/dist/client/Overlay.js +29 -28
  51. package/dist/client/ScrollState.js +94 -82
  52. package/dist/client/index.js +79 -61
  53. package/dist/console/Console.js +40 -24
  54. package/dist/console/ConsoleErrors.js +189 -178
  55. package/dist/console/ConsoleLogger.js +52 -43
  56. package/dist/console/ConsoleMetrics.js +69 -58
  57. package/dist/console/ConsoleProcess.js +57 -47
  58. package/dist/console/ConsoleStore.js +56 -45
  59. package/dist/console/ConsoleTracer.js +101 -88
  60. package/dist/console/Simulation.js +714 -563
  61. package/dist/console/index.js +3 -3
  62. package/dist/console/routes/tree.js +29 -28
  63. package/dist/datastar/actions/fetch.js +514 -381
  64. package/dist/datastar/actions/peek.js +12 -12
  65. package/dist/datastar/actions/setAll.js +18 -11
  66. package/dist/datastar/actions/toggleAll.js +18 -11
  67. package/dist/datastar/attributes/attr.js +48 -47
  68. package/dist/datastar/attributes/bind.js +186 -167
  69. package/dist/datastar/attributes/class.js +51 -44
  70. package/dist/datastar/attributes/computed.js +23 -24
  71. package/dist/datastar/attributes/effect.js +9 -8
  72. package/dist/datastar/attributes/indicator.js +32 -29
  73. package/dist/datastar/attributes/init.js +26 -25
  74. package/dist/datastar/attributes/jsonSignals.js +32 -29
  75. package/dist/datastar/attributes/on.js +76 -73
  76. package/dist/datastar/attributes/onIntersect.js +51 -51
  77. package/dist/datastar/attributes/onInterval.js +30 -29
  78. package/dist/datastar/attributes/onSignalPatch.js +49 -40
  79. package/dist/datastar/attributes/ref.js +10 -9
  80. package/dist/datastar/attributes/show.js +31 -30
  81. package/dist/datastar/attributes/signals.js +17 -16
  82. package/dist/datastar/attributes/style.js +56 -49
  83. package/dist/datastar/attributes/text.js +28 -25
  84. package/dist/datastar/engine.js +1079 -933
  85. package/dist/datastar/index.js +25 -24
  86. package/dist/datastar/utils.js +203 -155
  87. package/dist/datastar/watchers/patchElements.js +459 -372
  88. package/dist/datastar/watchers/patchSignals.js +13 -13
  89. package/dist/experimental/EncryptedCookies.js +305 -189
  90. package/dist/experimental/index.js +1 -1
  91. package/dist/hyper/Hyper.js +22 -17
  92. package/dist/hyper/HyperHtml.js +138 -123
  93. package/dist/hyper/HyperNode.js +11 -9
  94. package/dist/hyper/HyperRoute.js +41 -28
  95. package/dist/hyper/html.js +27 -27
  96. package/dist/hyper/index.js +5 -5
  97. package/dist/hyper/jsx-runtime.js +11 -5
  98. package/dist/index.js +8 -8
  99. package/dist/node/NodeFileSystem.js +606 -341
  100. package/dist/node/NodeUtils.js +21 -18
  101. package/dist/sql/Sql.js +8 -0
  102. package/dist/sql/bun/index.js +134 -67
  103. package/dist/sql/index.js +1 -0
  104. package/dist/sql/libsql/index.js +156 -0
  105. package/dist/sql/mssql/docker.js +103 -60
  106. package/dist/sql/mssql/index.js +182 -101
  107. package/dist/testing/TestLogger.js +39 -29
  108. package/dist/testing/index.js +2 -2
  109. package/dist/testing/utils.js +45 -23
  110. package/dist/x/cloudflare/CloudflareTunnel.js +61 -28
  111. package/dist/x/cloudflare/index.js +1 -1
  112. package/dist/x/tailscale/TailscaleTunnel.js +86 -60
  113. package/dist/x/tailscale/index.js +1 -1
  114. package/dist/x/tailwind/TailwindPlugin.js +280 -205
  115. package/dist/x/tailwind/compile.js +185 -129
  116. package/dist/x/tailwind/plugin.js +13 -11
  117. package/package.json +1 -1
  118. package/src/Development.ts +3 -1
  119. package/src/Entity.ts +17 -0
  120. package/src/Fetch.ts +271 -0
  121. package/src/SqlIntrospect.ts +64 -70
  122. package/src/Start.ts +24 -22
  123. package/src/StartApp.ts +11 -0
  124. package/src/bun/BunServer.ts +89 -16
  125. package/src/hyper/HyperHtml.ts +0 -1
  126. package/src/sql/bun/index.ts +1 -1
  127. package/src/sql/index.ts +1 -0
  128. package/src/sql/libsql/index.ts +173 -0
  129. package/src/sql/libsql/libsql.d.ts +39 -0
  130. package/src/sql/mssql/index.ts +1 -1
  131. package/src/x/tailscale/TailscaleTunnel.ts +7 -5
  132. package/dist/BlobStore.d.ts +0 -80
  133. package/dist/BlobStore.js +0 -19
  134. package/dist/ChildProcess.d.ts +0 -60
  135. package/dist/Commander.d.ts +0 -100
  136. package/dist/ContentNegotiation.d.ts +0 -12
  137. package/dist/Cookies.d.ts +0 -47
  138. package/dist/Development.d.ts +0 -39
  139. package/dist/Effectify.d.ts +0 -209
  140. package/dist/Entity.d.ts +0 -47
  141. package/dist/FilePathPattern.d.ts +0 -29
  142. package/dist/FileRouter.d.ts +0 -56
  143. package/dist/FileRouterCodegen.d.ts +0 -18
  144. package/dist/FileRouterPattern.d.ts +0 -9
  145. package/dist/FileRouterPattern.js +0 -35
  146. package/dist/FileSystem.d.ts +0 -158
  147. package/dist/Http.d.ts +0 -37
  148. package/dist/HttpAppExtra.d.ts +0 -7
  149. package/dist/HttpAppExtra.js +0 -320
  150. package/dist/HttpUtils.d.ts +0 -3
  151. package/dist/HttpUtils.js +0 -11
  152. package/dist/PathPattern.d.ts +0 -134
  153. package/dist/PlatformError.d.ts +0 -38
  154. package/dist/PlatformRuntime.d.ts +0 -27
  155. package/dist/Route.d.ts +0 -97
  156. package/dist/RouteBody.d.ts +0 -47
  157. package/dist/RouteError.d.ts +0 -98
  158. package/dist/RouteHook.d.ts +0 -12
  159. package/dist/RouteHttp.d.ts +0 -21
  160. package/dist/RouteHttpTracer.d.ts +0 -10
  161. package/dist/RouteMount.d.ts +0 -86
  162. package/dist/RouteSchema.d.ts +0 -86
  163. package/dist/RouteSse.d.ts +0 -21
  164. package/dist/RouteTree.d.ts +0 -57
  165. package/dist/RouteTrie.d.ts +0 -20
  166. package/dist/RouterPattern.d.ts +0 -118
  167. package/dist/RouterPattern.js +0 -269
  168. package/dist/SchemaExtra.d.ts +0 -7
  169. package/dist/Socket.d.ts +0 -27
  170. package/dist/Sql.d.ts +0 -34
  171. package/dist/Sql.js +0 -5
  172. package/dist/SqlIntrospect.d.ts +0 -91
  173. package/dist/Start.d.ts +0 -44
  174. package/dist/StartApp.d.ts +0 -19
  175. package/dist/StreamExtra.d.ts +0 -28
  176. package/dist/System.d.ts +0 -7
  177. package/dist/TuplePathPattern.d.ts +0 -9
  178. package/dist/Unique.d.ts +0 -50
  179. package/dist/Values.d.ts +0 -27
  180. package/dist/bun/BunBlobStoreDisk.d.ts +0 -6
  181. package/dist/bun/BunBlobStoreDisk.js +0 -116
  182. package/dist/bun/BunBlobStoreS3.d.ts +0 -11
  183. package/dist/bun/BunBlobStoreS3.js +0 -89
  184. package/dist/bun/BunBlobWatcherDisk.d.ts +0 -6
  185. package/dist/bun/BunBlobWatcherDisk.js +0 -60
  186. package/dist/bun/BunBlobWatcherQueue.d.ts +0 -6
  187. package/dist/bun/BunBlobWatcherQueue.js +0 -17
  188. package/dist/bun/BunBundle.d.ts +0 -11
  189. package/dist/bun/BunChildProcessSpawner.d.ts +0 -3
  190. package/dist/bun/BunHttpServer.d.ts +0 -44
  191. package/dist/bun/BunHttpServer.js +0 -186
  192. package/dist/bun/BunHttpServer_web.d.ts +0 -60
  193. package/dist/bun/BunHttpServer_web.js +0 -252
  194. package/dist/bun/BunImportTrackerPlugin.d.ts +0 -13
  195. package/dist/bun/BunPlatformHttpServer.d.ts +0 -10
  196. package/dist/bun/BunPlatformHttpServer.js +0 -53
  197. package/dist/bun/BunRoute.d.ts +0 -48
  198. package/dist/bun/BunRuntime.d.ts +0 -2
  199. package/dist/bun/BunServer.d.ts +0 -40
  200. package/dist/bun/BunServerRequest.d.ts +0 -60
  201. package/dist/bun/BunServerRequest.js +0 -252
  202. package/dist/bun/BunSql.d.ts +0 -4
  203. package/dist/bun/BunSql.js +0 -81
  204. package/dist/bun/BunVirtualFilesPlugin.d.ts +0 -4
  205. package/dist/bun/_BunEnhancedResolve.d.ts +0 -45
  206. package/dist/bun/index.d.ts +0 -5
  207. package/dist/bundler/Bundle.d.ts +0 -61
  208. package/dist/bundler/BundleFiles.d.ts +0 -13
  209. package/dist/bundler/BundleHttp.d.ts +0 -45
  210. package/dist/bundler/BundleHttp.js +0 -176
  211. package/dist/bundler/BundleRoute.d.ts +0 -27
  212. package/dist/client/Overlay.d.ts +0 -2
  213. package/dist/client/ScrollState.d.ts +0 -6
  214. package/dist/client/index.d.ts +0 -6
  215. package/dist/console/Console.d.ts +0 -6
  216. package/dist/console/ConsoleErrors.d.ts +0 -3
  217. package/dist/console/ConsoleLogger.d.ts +0 -3
  218. package/dist/console/ConsoleMetrics.d.ts +0 -3
  219. package/dist/console/ConsoleProcess.d.ts +0 -3
  220. package/dist/console/ConsoleStore.d.ts +0 -144
  221. package/dist/console/ConsoleTracer.d.ts +0 -3
  222. package/dist/console/Simulation.d.ts +0 -2
  223. package/dist/console/index.d.ts +0 -3
  224. package/dist/console/routes/errors/route.d.ts +0 -10
  225. package/dist/console/routes/errors/route.js +0 -47
  226. package/dist/console/routes/fiberDetail.d.ts +0 -16
  227. package/dist/console/routes/fiberDetail.js +0 -38
  228. package/dist/console/routes/fibers/route.d.ts +0 -10
  229. package/dist/console/routes/fibers/route.js +0 -19
  230. package/dist/console/routes/git/route.d.ts +0 -11
  231. package/dist/console/routes/git/route.js +0 -33
  232. package/dist/console/routes/layout.d.ts +0 -9
  233. package/dist/console/routes/layout.js +0 -3
  234. package/dist/console/routes/logs/route.d.ts +0 -10
  235. package/dist/console/routes/logs/route.js +0 -32
  236. package/dist/console/routes/metrics/route.d.ts +0 -10
  237. package/dist/console/routes/metrics/route.js +0 -17
  238. package/dist/console/routes/route.d.ts +0 -6
  239. package/dist/console/routes/route.js +0 -5
  240. package/dist/console/routes/routes/route.d.ts +0 -6
  241. package/dist/console/routes/routes/route.js +0 -20
  242. package/dist/console/routes/services/route.d.ts +0 -6
  243. package/dist/console/routes/services/route.js +0 -12
  244. package/dist/console/routes/system/route.d.ts +0 -10
  245. package/dist/console/routes/system/route.js +0 -18
  246. package/dist/console/routes/traceDetail.d.ts +0 -16
  247. package/dist/console/routes/traceDetail.js +0 -14
  248. package/dist/console/routes/traces/route.d.ts +0 -10
  249. package/dist/console/routes/traces/route.js +0 -39
  250. package/dist/console/routes/tree.d.ts +0 -153
  251. package/dist/console/ui/Errors.d.ts +0 -4
  252. package/dist/console/ui/Errors.js +0 -15
  253. package/dist/console/ui/Fibers.d.ts +0 -24
  254. package/dist/console/ui/Fibers.js +0 -121
  255. package/dist/console/ui/Git.d.ts +0 -20
  256. package/dist/console/ui/Git.js +0 -95
  257. package/dist/console/ui/Logs.d.ts +0 -4
  258. package/dist/console/ui/Logs.js +0 -25
  259. package/dist/console/ui/Metrics.d.ts +0 -4
  260. package/dist/console/ui/Metrics.js +0 -26
  261. package/dist/console/ui/Routes.d.ts +0 -8
  262. package/dist/console/ui/Routes.js +0 -70
  263. package/dist/console/ui/Services.d.ts +0 -10
  264. package/dist/console/ui/Services.js +0 -246
  265. package/dist/console/ui/Shell.d.ts +0 -10
  266. package/dist/console/ui/Shell.js +0 -7
  267. package/dist/console/ui/System.d.ts +0 -4
  268. package/dist/console/ui/System.js +0 -35
  269. package/dist/console/ui/Traces.d.ts +0 -12
  270. package/dist/console/ui/Traces.js +0 -179
  271. package/dist/datastar/actions/fetch.d.ts +0 -30
  272. package/dist/datastar/actions/peek.d.ts +0 -1
  273. package/dist/datastar/actions/setAll.d.ts +0 -1
  274. package/dist/datastar/actions/toggleAll.d.ts +0 -1
  275. package/dist/datastar/attributes/attr.d.ts +0 -1
  276. package/dist/datastar/attributes/bind.d.ts +0 -1
  277. package/dist/datastar/attributes/class.d.ts +0 -1
  278. package/dist/datastar/attributes/computed.d.ts +0 -1
  279. package/dist/datastar/attributes/effect.d.ts +0 -1
  280. package/dist/datastar/attributes/indicator.d.ts +0 -1
  281. package/dist/datastar/attributes/init.d.ts +0 -1
  282. package/dist/datastar/attributes/jsonSignals.d.ts +0 -1
  283. package/dist/datastar/attributes/on.d.ts +0 -1
  284. package/dist/datastar/attributes/onIntersect.d.ts +0 -1
  285. package/dist/datastar/attributes/onInterval.d.ts +0 -1
  286. package/dist/datastar/attributes/onSignalPatch.d.ts +0 -1
  287. package/dist/datastar/attributes/ref.d.ts +0 -1
  288. package/dist/datastar/attributes/show.d.ts +0 -1
  289. package/dist/datastar/attributes/signals.d.ts +0 -1
  290. package/dist/datastar/attributes/style.d.ts +0 -1
  291. package/dist/datastar/attributes/text.d.ts +0 -1
  292. package/dist/datastar/engine.d.ts +0 -162
  293. package/dist/datastar/happydom.d.ts +0 -1
  294. package/dist/datastar/happydom.js +0 -8
  295. package/dist/datastar/index.d.ts +0 -24
  296. package/dist/datastar/load.d.ts +0 -24
  297. package/dist/datastar/load.js +0 -24
  298. package/dist/datastar/utils.d.ts +0 -51
  299. package/dist/datastar/watchers/patchElements.d.ts +0 -1
  300. package/dist/datastar/watchers/patchSignals.d.ts +0 -1
  301. package/dist/experimental/EncryptedCookies.d.ts +0 -48
  302. package/dist/experimental/SseHttpResponse.d.ts +0 -7
  303. package/dist/experimental/SseHttpResponse.js +0 -28
  304. package/dist/experimental/index.d.ts +0 -1
  305. package/dist/hyper/Hyper.d.ts +0 -25
  306. package/dist/hyper/HyperHtml.d.ts +0 -23
  307. package/dist/hyper/HyperHtml.test.d.ts +0 -1
  308. package/dist/hyper/HyperHtml.test.js +0 -197
  309. package/dist/hyper/HyperNode.d.ts +0 -14
  310. package/dist/hyper/HyperRoute.d.ts +0 -8
  311. package/dist/hyper/HyperRoute.test.d.ts +0 -1
  312. package/dist/hyper/HyperRoute.test.js +0 -83
  313. package/dist/hyper/html.d.ts +0 -11
  314. package/dist/hyper/index.d.ts +0 -6
  315. package/dist/hyper/jsx-runtime.d.ts +0 -7
  316. package/dist/index.d.ts +0 -8
  317. package/dist/inference_check.d.ts +0 -1
  318. package/dist/inference_check.js +0 -15
  319. package/dist/lint/plugin.d.ts +0 -86
  320. package/dist/lint/plugin.js +0 -341
  321. package/dist/middlewares/BasicAuthMiddleware.d.ts +0 -8
  322. package/dist/middlewares/BasicAuthMiddleware.js +0 -22
  323. package/dist/middlewares/index.d.ts +0 -1
  324. package/dist/middlewares/index.js +0 -1
  325. package/dist/node/Effectify.d.ts +0 -209
  326. package/dist/node/Effectify.js +0 -19
  327. package/dist/node/FileSystem.d.ts +0 -7
  328. package/dist/node/FileSystem.js +0 -420
  329. package/dist/node/NodeFileSystem.d.ts +0 -7
  330. package/dist/node/NodeUtils.d.ts +0 -2
  331. package/dist/node/PlatformError.d.ts +0 -46
  332. package/dist/node/PlatformError.js +0 -43
  333. package/dist/node/Utils.d.ts +0 -1
  334. package/dist/node/Utils.js +0 -19
  335. package/dist/repro_fail.d.ts +0 -1
  336. package/dist/repro_fail.js +0 -14
  337. package/dist/sql/bun/index.d.ts +0 -3
  338. package/dist/sql/mssql/docker.d.ts +0 -2
  339. package/dist/sql/mssql/index.d.ts +0 -21
  340. package/dist/testing/TestHttpClient.d.ts +0 -13
  341. package/dist/testing/TestHttpClient.js +0 -68
  342. package/dist/testing/TestLogger.d.ts +0 -13
  343. package/dist/testing/index.d.ts +0 -2
  344. package/dist/testing/utils.d.ts +0 -9
  345. package/dist/x/cloudflare/CloudflareTunnel.d.ts +0 -10
  346. package/dist/x/cloudflare/index.d.ts +0 -1
  347. package/dist/x/datastar/Datastar.d.ts +0 -6
  348. package/dist/x/datastar/Datastar.js +0 -47
  349. package/dist/x/datastar/index.d.ts +0 -1
  350. package/dist/x/datastar/index.js +0 -1
  351. package/dist/x/tailscale/TailscaleTunnel.d.ts +0 -15
  352. package/dist/x/tailscale/index.d.ts +0 -1
  353. package/dist/x/tailwind/TailwindPlugin.d.ts +0 -23
  354. package/dist/x/tailwind/compile.d.ts +0 -19
  355. package/dist/x/tailwind/plugin.d.ts +0 -2
  356. /package/src/{Sql.ts → sql/Sql.ts} +0 -0
@@ -1,14 +1,14 @@
1
- import { mergePatch, watcher } from "../engine.js";
2
- import { jsStrToObject } from "../utils.js";
1
+ import { mergePatch, watcher } from "../engine.js"
2
+ import { jsStrToObject } from "../utils.js"
3
+
3
4
  watcher({
4
- name: "datastar-patch-signals",
5
- apply({ error }, { signals, onlyIfMissing }) {
6
- if (signals) {
7
- const ifMissing = onlyIfMissing?.trim() === "true";
8
- mergePatch(jsStrToObject(signals), { ifMissing });
9
- }
10
- else {
11
- throw error("PatchSignalsExpectedSignals");
12
- }
13
- },
14
- });
5
+ name: "datastar-patch-signals",
6
+ apply({ error }, { signals, onlyIfMissing }) {
7
+ if (signals) {
8
+ const ifMissing = onlyIfMissing?.trim() === "true"
9
+ mergePatch(jsStrToObject(signals), { ifMissing })
10
+ } else {
11
+ throw error("PatchSignalsExpectedSignals")
12
+ }
13
+ },
14
+ })
@@ -1,212 +1,328 @@
1
- import * as Cookies from "../Cookies.js";
2
- import * as Config from "effect/Config";
3
- import * as Context from "effect/Context";
4
- import * as Data from "effect/Data";
5
- import * as Effect from "effect/Effect";
6
- import * as Layer from "effect/Layer";
7
- export class EncryptedCookiesError extends Data.TaggedError("EncryptedCookiesError") {
8
- }
9
- export class EncryptedCookies extends Context.Tag("EncryptedCookies")() {
10
- }
1
+ import * as Cookies from "../Cookies.js"
2
+ import * as Config from "effect/Config"
3
+ import * as Context from "effect/Context"
4
+ import * as Data from "effect/Data"
5
+ import * as Effect from "effect/Effect"
6
+ import * as Layer from "effect/Layer"
7
+
8
+ export class EncryptedCookiesError extends Data.TaggedError("EncryptedCookiesError") {}
9
+
10
+ export class EncryptedCookies extends Context.Tag("EncryptedCookies")() {}
11
+
11
12
  export function layer(options) {
12
- return Layer.effect(EncryptedCookies, Effect.gen(function* () {
13
- const keyMaterial = yield* deriveKeyMaterial(options.secret);
14
- // Pre-derive both keys once
15
- const encryptKey = yield* deriveKey(keyMaterial, ["encrypt"]);
16
- const decryptKey = yield* deriveKey(keyMaterial, ["decrypt"]);
17
- return EncryptedCookies.of({
18
- encrypt: (value) => encryptWithDerivedKey(value, encryptKey),
19
- decrypt: (encryptedValue) => decryptWithDerivedKey(encryptedValue, decryptKey),
20
- encryptCookie: (cookie) => encryptCookieWithDerivedKey(cookie, encryptKey),
21
- decryptCookie: (cookie) => decryptCookieWithDerivedKey(cookie, decryptKey),
22
- });
23
- }));
13
+ return Layer.effect(
14
+ EncryptedCookies,
15
+ Effect.gen(function* () {
16
+ const keyMaterial = yield* deriveKeyMaterial(options.secret)
17
+
18
+ // Pre-derive both keys once
19
+ const encryptKey = yield* deriveKey(keyMaterial, ["encrypt"])
20
+ const decryptKey = yield* deriveKey(keyMaterial, ["decrypt"])
21
+
22
+ return EncryptedCookies.of({
23
+ encrypt: (value) => encryptWithDerivedKey(value, encryptKey),
24
+ decrypt: (encryptedValue) => decryptWithDerivedKey(encryptedValue, decryptKey),
25
+ encryptCookie: (cookie) => encryptCookieWithDerivedKey(cookie, encryptKey),
26
+ decryptCookie: (cookie) => decryptCookieWithDerivedKey(cookie, decryptKey),
27
+ })
28
+ }),
29
+ )
24
30
  }
31
+
25
32
  export function layerConfig(name = "SECRET_KEY_BASE") {
26
- return Effect.gen(function* () {
27
- const secret = yield* Config.nonEmptyString(name).pipe(Effect.flatMap((value) => {
28
- return value.length < 40 ? Effect.fail(new Error("ba")) : Effect.succeed(value);
29
- }), Effect.catchAll((err) => {
30
- return Effect.dieMessage("SECRET_KEY_BASE must be at least 40 characters");
31
- }));
32
- return layer({ secret });
33
- }).pipe(Layer.unwrapEffect);
34
- }
35
- function encodeToBase64Segments(ciphertext, iv, authTag) {
36
- return [base64urlEncode(ciphertext), base64urlEncode(iv), base64urlEncode(authTag)].join(".");
33
+ return Effect.gen(function* () {
34
+ const secret = yield* Config.nonEmptyString(name).pipe(
35
+ Effect.flatMap((value) => {
36
+ return value.length < 40 ? Effect.fail(new Error("ba")) : Effect.succeed(value)
37
+ }),
38
+ Effect.catchAll((err) => {
39
+ return Effect.dieMessage("SECRET_KEY_BASE must be at least 40 characters")
40
+ }),
41
+ )
42
+
43
+ return layer({ secret })
44
+ }).pipe(Layer.unwrapEffect)
45
+ }
46
+
47
+ function encodeToBase64Segments(
48
+ ciphertext,
49
+ iv,
50
+ authTag,
51
+ ) {
52
+ return [base64urlEncode(ciphertext), base64urlEncode(iv), base64urlEncode(authTag)].join(".")
37
53
  }
54
+
38
55
  function base64urlEncode(data) {
39
- const base64 = btoa(String.fromCharCode(...data));
40
- return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
41
- }
42
- function decodeFromBase64Segments(segments) {
43
- return Effect.gen(function* () {
44
- const [ciphertextB64, ivB64, authTagB64] = segments;
45
- const ciphertext = yield* Effect.try({
46
- try: () => base64urlDecode(ciphertextB64),
47
- catch: (error) => new EncryptedCookiesError({ cause: error }),
48
- });
49
- const iv = yield* Effect.try({
50
- try: () => base64urlDecode(ivB64),
51
- catch: (error) => new EncryptedCookiesError({ cause: error }),
52
- });
53
- const authTag = yield* Effect.try({
54
- try: () => base64urlDecode(authTagB64),
55
- catch: (error) => new EncryptedCookiesError({ cause: error }),
56
- });
57
- return { ciphertext, iv, authTag };
58
- });
56
+ const base64 = btoa(String.fromCharCode(...data))
57
+ return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "")
59
58
  }
59
+
60
+ function decodeFromBase64Segments(
61
+ segments,
62
+ ) {
63
+ return Effect.gen(function* () {
64
+ const [ciphertextB64, ivB64, authTagB64] = segments
65
+
66
+ const ciphertext = yield* Effect.try({
67
+ try: () => base64urlDecode(ciphertextB64),
68
+ catch: (error) => new EncryptedCookiesError({ cause: error }),
69
+ })
70
+
71
+ const iv = yield* Effect.try({
72
+ try: () => base64urlDecode(ivB64),
73
+ catch: (error) => new EncryptedCookiesError({ cause: error }),
74
+ })
75
+
76
+ const authTag = yield* Effect.try({
77
+ try: () => base64urlDecode(authTagB64),
78
+ catch: (error) => new EncryptedCookiesError({ cause: error }),
79
+ })
80
+
81
+ return { ciphertext, iv, authTag }
82
+ })
83
+ }
84
+
60
85
  function base64urlDecode(data) {
61
- // Convert base64url back to standard base64
62
- let base64 = data.replace(/-/g, "+").replace(/_/g, "/");
63
- // Add padding if needed
64
- while (base64.length % 4) {
65
- base64 += "=";
66
- }
67
- return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
86
+ // Convert base64url back to standard base64
87
+ let base64 = data.replace(/-/g, "+").replace(/_/g, "/")
88
+
89
+ // Add padding if needed
90
+ while (base64.length % 4) {
91
+ base64 += "="
92
+ }
93
+
94
+ return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0))
68
95
  }
96
+
69
97
  /**
70
98
  * Encrypts cookie value using the SECRET_KEY_BASE.
71
99
  */
72
- function encryptWithDerivedKey(value, derivedKey) {
73
- return Effect.gen(function* () {
74
- if (value === null || value === undefined) {
75
- return yield* Effect.fail(new EncryptedCookiesError({
76
- cause: "Cannot encrypt empty value",
77
- }));
78
- }
79
- const iv = crypto.getRandomValues(new Uint8Array(12));
80
- const data = new TextEncoder().encode(JSON.stringify(value));
81
- const encrypted = yield* Effect.tryPromise({
82
- try: () => crypto.subtle.encrypt({ name: "AES-GCM", iv }, derivedKey, data),
83
- catch: (error) => new EncryptedCookiesError({ cause: error }),
84
- });
85
- const encryptedArray = new Uint8Array(encrypted);
86
- const authTagLength = 16;
87
- const ciphertext = encryptedArray.slice(0, -authTagLength);
88
- const authTag = encryptedArray.slice(-authTagLength);
89
- return encodeToBase64Segments(ciphertext, iv, authTag);
90
- });
91
- }
92
- export function encrypt(value, options) {
93
- return Effect.gen(function* () {
94
- if ("key" in options) {
95
- return yield* encryptWithDerivedKey(value, options.key);
96
- }
97
- const keyMaterial = yield* deriveKeyMaterial(options.secret);
98
- const derivedKey = yield* deriveKey(keyMaterial, ["encrypt"]);
99
- return yield* encryptWithDerivedKey(value, derivedKey);
100
- });
101
- }
102
- function decryptWithDerivedKey(encryptedValue, derivedKey) {
103
- return Effect.gen(function* () {
104
- if (!encryptedValue || encryptedValue === null || encryptedValue === undefined) {
105
- return yield* Effect.fail(new EncryptedCookiesError({
106
- cause: "Cannot decrypt null, undefined, or empty value",
107
- }));
108
- }
109
- const segments = encryptedValue.split(".");
110
- if (segments.length !== 3) {
111
- return yield* Effect.fail(new EncryptedCookiesError({
112
- cause: "Invalid encrypted cookie format",
113
- }));
114
- }
115
- const { ciphertext, iv, authTag } = yield* decodeFromBase64Segments(segments);
116
- const encryptedData = new Uint8Array(ciphertext.length + authTag.length);
117
- encryptedData.set(ciphertext);
118
- encryptedData.set(authTag, ciphertext.length);
119
- const decrypted = yield* Effect.tryPromise({
120
- try: () => crypto.subtle.decrypt({ name: "AES-GCM", iv: iv.slice(0) }, derivedKey, encryptedData),
121
- catch: (error) => new EncryptedCookiesError({ cause: error }),
122
- });
123
- const jsonString = new TextDecoder().decode(decrypted);
124
- return yield* Effect.try({
125
- try: () => JSON.parse(jsonString),
126
- catch: (error) => new EncryptedCookiesError({ cause: error }),
127
- });
128
- });
129
- }
130
- function encryptCookieWithDerivedKey(cookie, derivedKey) {
131
- return Effect.gen(function* () {
132
- const encryptedValue = yield* encryptWithDerivedKey(cookie.value, derivedKey).pipe(Effect.mapError((error) => new EncryptedCookiesError({
100
+ function encryptWithDerivedKey(
101
+ value,
102
+ derivedKey,
103
+ ) {
104
+ return Effect.gen(function* () {
105
+ if (value === null || value === undefined) {
106
+ return yield* Effect.fail(
107
+ new EncryptedCookiesError({
108
+ cause: "Cannot encrypt empty value",
109
+ }),
110
+ )
111
+ }
112
+
113
+ const iv = crypto.getRandomValues(new Uint8Array(12))
114
+ const data = new TextEncoder().encode(JSON.stringify(value))
115
+
116
+ const encrypted = yield* Effect.tryPromise({
117
+ try: () => crypto.subtle.encrypt({ name: "AES-GCM", iv }, derivedKey, data),
118
+ catch: (error) => new EncryptedCookiesError({ cause: error }),
119
+ })
120
+
121
+ const encryptedArray = new Uint8Array(encrypted)
122
+ const authTagLength = 16
123
+ const ciphertext = encryptedArray.slice(0, -authTagLength)
124
+ const authTag = encryptedArray.slice(-authTagLength)
125
+
126
+ return encodeToBase64Segments(ciphertext, iv, authTag)
127
+ })
128
+ }
129
+
130
+ export function encrypt(
131
+ value,
132
+ options,
133
+ ) {
134
+ return Effect.gen(function* () {
135
+ if ("key" in options) {
136
+ return yield* encryptWithDerivedKey(value, options.key)
137
+ }
138
+
139
+ const keyMaterial = yield* deriveKeyMaterial(options.secret)
140
+ const derivedKey = yield* deriveKey(keyMaterial, ["encrypt"])
141
+ return yield* encryptWithDerivedKey(value, derivedKey)
142
+ })
143
+ }
144
+
145
+ function decryptWithDerivedKey(
146
+ encryptedValue,
147
+ derivedKey,
148
+ ) {
149
+ return Effect.gen(function* () {
150
+ if (!encryptedValue || encryptedValue === null || encryptedValue === undefined) {
151
+ return yield* Effect.fail(
152
+ new EncryptedCookiesError({
153
+ cause: "Cannot decrypt null, undefined, or empty value",
154
+ }),
155
+ )
156
+ }
157
+
158
+ const segments = encryptedValue.split(".")
159
+ if (segments.length !== 3) {
160
+ return yield* Effect.fail(
161
+ new EncryptedCookiesError({
162
+ cause: "Invalid encrypted cookie format",
163
+ }),
164
+ )
165
+ }
166
+
167
+ const { ciphertext, iv, authTag } = yield* decodeFromBase64Segments(segments)
168
+
169
+ const encryptedData = new Uint8Array(ciphertext.length + authTag.length)
170
+ encryptedData.set(ciphertext)
171
+ encryptedData.set(authTag, ciphertext.length)
172
+
173
+ const decrypted = yield* Effect.tryPromise({
174
+ try: () =>
175
+ crypto.subtle.decrypt({ name: "AES-GCM", iv: iv.slice(0) }, derivedKey, encryptedData),
176
+ catch: (error) => new EncryptedCookiesError({ cause: error }),
177
+ })
178
+
179
+ const jsonString = new TextDecoder().decode(decrypted)
180
+
181
+ return yield* Effect.try({
182
+ try: () => JSON.parse(jsonString),
183
+ catch: (error) => new EncryptedCookiesError({ cause: error }),
184
+ })
185
+ })
186
+ }
187
+
188
+ function encryptCookieWithDerivedKey(
189
+ cookie,
190
+ derivedKey,
191
+ ) {
192
+ return Effect.gen(function* () {
193
+ const encryptedValue = yield* encryptWithDerivedKey(cookie.value, derivedKey).pipe(
194
+ Effect.mapError(
195
+ (error) =>
196
+ new EncryptedCookiesError({
133
197
  cause: error.cause,
134
198
  cookie,
135
- })));
136
- return Cookies.unsafeMakeCookie(cookie.name, encryptedValue, cookie.options);
137
- });
199
+ }),
200
+ ),
201
+ )
202
+ return Cookies.unsafeMakeCookie(cookie.name, encryptedValue, cookie.options)
203
+ })
138
204
  }
139
- function decryptCookieWithDerivedKey(cookie, derivedKey) {
140
- return Effect.gen(function* () {
141
- const decryptedValue = yield* decryptWithDerivedKey(cookie.value, derivedKey).pipe(Effect.mapError((error) => new EncryptedCookiesError({
205
+ function decryptCookieWithDerivedKey(
206
+ cookie,
207
+ derivedKey,
208
+ ) {
209
+ return Effect.gen(function* () {
210
+ const decryptedValue = yield* decryptWithDerivedKey(cookie.value, derivedKey).pipe(
211
+ Effect.mapError(
212
+ (error) =>
213
+ new EncryptedCookiesError({
142
214
  cause: error.cause,
143
215
  cookie,
144
- })));
145
- return Cookies.unsafeMakeCookie(cookie.name, JSON.stringify(decryptedValue), cookie.options);
146
- });
147
- }
148
- export function encryptCookie(cookie, options) {
149
- return Effect.gen(function* () {
150
- if ("key" in options) {
151
- return yield* encryptCookieWithDerivedKey(cookie, options.key);
152
- }
153
- const encryptedValue = yield* encrypt(cookie.value, {
154
- secret: options.secret,
155
- }).pipe(Effect.mapError((error) => new EncryptedCookiesError({
216
+ }),
217
+ ),
218
+ )
219
+ return Cookies.unsafeMakeCookie(cookie.name, JSON.stringify(decryptedValue), cookie.options)
220
+ })
221
+ }
222
+
223
+ export function encryptCookie(
224
+ cookie,
225
+ options,
226
+ ) {
227
+ return Effect.gen(function* () {
228
+ if ("key" in options) {
229
+ return yield* encryptCookieWithDerivedKey(cookie, options.key)
230
+ }
231
+
232
+ const encryptedValue = yield* encrypt(cookie.value, {
233
+ secret: options.secret,
234
+ }).pipe(
235
+ Effect.mapError(
236
+ (error) =>
237
+ new EncryptedCookiesError({
156
238
  cause: error.cause,
157
239
  cookie,
158
- })));
159
- return Cookies.unsafeMakeCookie(cookie.name, encryptedValue, cookie.options);
160
- });
161
- }
162
- export function decryptCookie(cookie, options) {
163
- return Effect.gen(function* () {
164
- if ("key" in options) {
165
- return yield* decryptCookieWithDerivedKey(cookie, options.key);
166
- }
167
- const decryptedValue = yield* decrypt(cookie.value, {
168
- secret: options.secret,
169
- }).pipe(Effect.mapError((error) => new EncryptedCookiesError({
240
+ }),
241
+ ),
242
+ )
243
+ return Cookies.unsafeMakeCookie(cookie.name, encryptedValue, cookie.options)
244
+ })
245
+ }
246
+
247
+ export function decryptCookie(
248
+ cookie,
249
+ options,
250
+ ) {
251
+ return Effect.gen(function* () {
252
+ if ("key" in options) {
253
+ return yield* decryptCookieWithDerivedKey(cookie, options.key)
254
+ }
255
+
256
+ const decryptedValue = yield* decrypt(cookie.value, {
257
+ secret: options.secret,
258
+ }).pipe(
259
+ Effect.mapError(
260
+ (error) =>
261
+ new EncryptedCookiesError({
170
262
  cause: error.cause,
171
263
  cookie,
172
- })));
173
- return Cookies.unsafeMakeCookie(cookie.name, JSON.stringify(decryptedValue), cookie.options);
174
- });
175
- }
176
- export function decrypt(encryptedValue, options) {
177
- return Effect.gen(function* () {
178
- if ("key" in options) {
179
- return yield* decryptWithDerivedKey(encryptedValue, options.key);
180
- }
181
- const keyMaterial = yield* deriveKeyMaterial(options.secret);
182
- const derivedKey = yield* deriveKey(keyMaterial, ["decrypt"]);
183
- return yield* decryptWithDerivedKey(encryptedValue, derivedKey);
184
- });
264
+ }),
265
+ ),
266
+ )
267
+ return Cookies.unsafeMakeCookie(cookie.name, JSON.stringify(decryptedValue), cookie.options)
268
+ })
269
+ }
270
+
271
+ export function decrypt(
272
+ encryptedValue,
273
+ options,
274
+ ) {
275
+ return Effect.gen(function* () {
276
+ if ("key" in options) {
277
+ return yield* decryptWithDerivedKey(encryptedValue, options.key)
278
+ }
279
+
280
+ const keyMaterial = yield* deriveKeyMaterial(options.secret)
281
+ const derivedKey = yield* deriveKey(keyMaterial, ["decrypt"])
282
+ return yield* decryptWithDerivedKey(encryptedValue, derivedKey)
283
+ })
185
284
  }
285
+
186
286
  function deriveKeyMaterial(secret) {
187
- return Effect.gen(function* () {
188
- const encoder = new TextEncoder();
189
- const keyMaterial = yield* Effect.tryPromise({
190
- try: () => crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HKDF" }, false, [
191
- "deriveKey",
192
- ]),
193
- catch: (error) => new EncryptedCookiesError({ cause: error }),
194
- });
195
- return keyMaterial;
196
- });
197
- }
198
- function deriveKey(keyMaterial, usage) {
199
- return Effect.gen(function* () {
200
- const encoder = new TextEncoder();
201
- const key = yield* Effect.tryPromise({
202
- try: () => crypto.subtle.deriveKey({
203
- name: "HKDF",
204
- salt: encoder.encode("cookie-encryption"),
205
- info: encoder.encode("aes-256-gcm"),
206
- hash: "SHA-256",
207
- }, keyMaterial, { name: "AES-GCM", length: 256 }, false, usage),
208
- catch: (error) => new EncryptedCookiesError({ cause: error }),
209
- });
210
- return key;
211
- });
287
+ return Effect.gen(function* () {
288
+ const encoder = new TextEncoder()
289
+
290
+ const keyMaterial = yield* Effect.tryPromise({
291
+ try: () =>
292
+ crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HKDF" }, false, [
293
+ "deriveKey",
294
+ ]),
295
+ catch: (error) => new EncryptedCookiesError({ cause: error }),
296
+ })
297
+
298
+ return keyMaterial
299
+ })
300
+ }
301
+
302
+ function deriveKey(
303
+ keyMaterial,
304
+ usage,
305
+ ) {
306
+ return Effect.gen(function* () {
307
+ const encoder = new TextEncoder()
308
+
309
+ const key = yield* Effect.tryPromise({
310
+ try: () =>
311
+ crypto.subtle.deriveKey(
312
+ {
313
+ name: "HKDF",
314
+ salt: encoder.encode("cookie-encryption"),
315
+ info: encoder.encode("aes-256-gcm"),
316
+ hash: "SHA-256",
317
+ },
318
+ keyMaterial,
319
+ { name: "AES-GCM", length: 256 },
320
+ false,
321
+ usage,
322
+ ),
323
+ catch: (error) => new EncryptedCookiesError({ cause: error }),
324
+ })
325
+
326
+ return key
327
+ })
212
328
  }
@@ -1 +1 @@
1
- export * as EncryptedCookies from "./EncryptedCookies.js";
1
+ export * as EncryptedCookies from "./EncryptedCookies.js"
@@ -1,23 +1,28 @@
1
- import * as Context from "effect/Context";
2
- import * as Fiber from "effect/Fiber";
3
- import * as Option from "effect/Option";
4
- export class Hyper extends Context.Tag("Hyper")() {
5
- }
6
- const NoChildren = Object.freeze([]);
1
+ import * as Context from "effect/Context"
2
+ import * as Fiber from "effect/Fiber"
3
+ import * as Option from "effect/Option"
4
+
5
+ export class Hyper extends Context.Tag("Hyper")() {}
6
+
7
+ const NoChildren = Object.freeze([])
8
+
7
9
  export function h(type, props) {
8
- return {
9
- type,
10
- props: {
11
- ...props,
12
- children: props.children ?? NoChildren,
13
- },
14
- };
10
+ return {
11
+ type,
12
+ props: {
13
+ ...props,
14
+ children: props.children ?? NoChildren,
15
+ },
16
+ }
15
17
  }
18
+
16
19
  export function unsafeUse(tag) {
17
- const currentFiber = Option.getOrThrow(Fiber.getCurrentFiber());
18
- const context = currentFiber.currentContext;
19
- return Context.unsafeGet(context, tag);
20
+ const currentFiber = Option.getOrThrow(Fiber.getCurrentFiber())
21
+ const context = currentFiber.currentContext
22
+
23
+ return Context.unsafeGet(context, tag)
20
24
  }
25
+
21
26
  export function isGenericJsxObject(value) {
22
- return typeof value === "object" && value !== null && "type" in value && "props" in value;
27
+ return typeof value === "object" && value !== null && "type" in value && "props" in value
23
28
  }