@demiurgejs/core 0.2.0-beta.2 → 0.2.0-beta.4

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 (232) hide show
  1. package/README.md +13 -11
  2. package/bin/demiurge.mjs +30 -12
  3. package/dist/adapter/testing.js.map +1 -1
  4. package/dist/browser/file-router.d.ts +388 -5
  5. package/dist/browser/file-router.d.ts.map +1 -1
  6. package/dist/browser/focus.d.ts +20 -0
  7. package/dist/browser/focus.d.ts.map +1 -0
  8. package/dist/browser/index.d.ts +7 -1
  9. package/dist/browser/index.d.ts.map +1 -1
  10. package/dist/browser/mutation-action.d.ts +81 -0
  11. package/dist/browser/mutation-action.d.ts.map +1 -0
  12. package/dist/chunks/document-shell-CpJnFtSC.js +36 -0
  13. package/dist/chunks/document-shell-CpJnFtSC.js.map +1 -0
  14. package/dist/chunks/env-startup-DOBYWlZD.js +257 -0
  15. package/dist/chunks/env-startup-DOBYWlZD.js.map +1 -0
  16. package/dist/chunks/{image-codec-BGTx_t5K.js → image-codec-BmzWnH6W.js} +2 -2
  17. package/dist/chunks/{image-codec-BGTx_t5K.js.map → image-codec-BmzWnH6W.js.map} +1 -1
  18. package/dist/chunks/{images-B9MqcjSA.js → images-BQ80950B.js} +99 -91
  19. package/dist/chunks/images-BQ80950B.js.map +1 -0
  20. package/dist/chunks/index-BVk9zWbe.js +832 -0
  21. package/dist/chunks/index-BVk9zWbe.js.map +1 -0
  22. package/dist/chunks/manifest-vO6c0G0W.js +19 -0
  23. package/dist/chunks/manifest-vO6c0G0W.js.map +1 -0
  24. package/dist/chunks/plugin-BQgMiHxa.js +1827 -0
  25. package/dist/chunks/plugin-BQgMiHxa.js.map +1 -0
  26. package/dist/chunks/session-store-ChModVcq.js +92 -0
  27. package/dist/chunks/session-store-ChModVcq.js.map +1 -0
  28. package/dist/chunks/static-files-ehaD1kE7.js +51 -0
  29. package/dist/chunks/static-files-ehaD1kE7.js.map +1 -0
  30. package/dist/chunks/{streaming-BQ1bykDo.js → streaming-BEbPN7Uk.js} +163 -163
  31. package/dist/chunks/streaming-BEbPN7Uk.js.map +1 -0
  32. package/dist/chunks/testing-DueXbMo4.js +4167 -0
  33. package/dist/chunks/testing-DueXbMo4.js.map +1 -0
  34. package/dist/chunks/vite-DO70kZA6.js +259 -0
  35. package/dist/chunks/vite-DO70kZA6.js.map +1 -0
  36. package/dist/cli.d.ts +17 -25
  37. package/dist/cli.d.ts.map +1 -1
  38. package/dist/cli.js +159 -124
  39. package/dist/cli.js.map +1 -1
  40. package/dist/config/define.d.ts +3 -0
  41. package/dist/config/define.d.ts.map +1 -0
  42. package/dist/config/index.d.ts +7 -0
  43. package/dist/config/index.d.ts.map +1 -0
  44. package/dist/config/index.js +78 -0
  45. package/dist/config/index.js.map +1 -0
  46. package/dist/config/load.d.ts +12 -0
  47. package/dist/config/load.d.ts.map +1 -0
  48. package/dist/config/types.d.ts +64 -0
  49. package/dist/config/types.d.ts.map +1 -0
  50. package/dist/config/validate.d.ts +9 -0
  51. package/dist/config/validate.d.ts.map +1 -0
  52. package/dist/config/vite.d.ts +12 -0
  53. package/dist/config/vite.d.ts.map +1 -0
  54. package/dist/data/cache.d.ts +10 -0
  55. package/dist/data/cache.d.ts.map +1 -1
  56. package/dist/data/idempotency.d.ts.map +1 -1
  57. package/dist/data/index.d.ts +3 -1
  58. package/dist/data/index.d.ts.map +1 -1
  59. package/dist/data/testing.d.ts.map +1 -1
  60. package/dist/data/testing.js +94 -72
  61. package/dist/data/testing.js.map +1 -1
  62. package/dist/data/tiered.d.ts +7 -0
  63. package/dist/data/tiered.d.ts.map +1 -0
  64. package/dist/deployment/testing.d.ts +25 -0
  65. package/dist/deployment/testing.d.ts.map +1 -0
  66. package/dist/deployment/testing.js +171 -0
  67. package/dist/deployment/testing.js.map +1 -0
  68. package/dist/document/deferred-scripts.d.ts.map +1 -1
  69. package/dist/document/hydration.d.ts +9 -0
  70. package/dist/document/hydration.d.ts.map +1 -1
  71. package/dist/document/index.d.ts +5 -2
  72. package/dist/document/index.d.ts.map +1 -1
  73. package/dist/document/metadata.d.ts +8 -0
  74. package/dist/document/metadata.d.ts.map +1 -1
  75. package/dist/document/navigation.d.ts +28 -0
  76. package/dist/document/navigation.d.ts.map +1 -0
  77. package/dist/document/render.d.ts +3 -1
  78. package/dist/document/render.d.ts.map +1 -1
  79. package/dist/document/seo.d.ts.map +1 -1
  80. package/dist/document/trusted-types.d.ts +10 -0
  81. package/dist/document/trusted-types.d.ts.map +1 -0
  82. package/dist/edge/assets.d.ts.map +1 -1
  83. package/dist/edge/index.js +55 -73
  84. package/dist/edge/index.js.map +1 -1
  85. package/dist/index.d.ts +15 -13
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +2078 -573
  88. package/dist/index.js.map +1 -1
  89. package/dist/internal/testing.js +11 -11
  90. package/dist/kv/index.d.ts +4 -0
  91. package/dist/kv/index.d.ts.map +1 -1
  92. package/dist/kv/index.js +180 -60
  93. package/dist/kv/index.js.map +1 -1
  94. package/dist/kv/rate-limit-store.d.ts +8 -0
  95. package/dist/kv/rate-limit-store.d.ts.map +1 -0
  96. package/dist/kv/session-store.d.ts +20 -0
  97. package/dist/kv/session-store.d.ts.map +1 -0
  98. package/dist/kv/store.d.ts.map +1 -1
  99. package/dist/manifest.d.ts +10 -0
  100. package/dist/manifest.d.ts.map +1 -0
  101. package/dist/node/http.d.ts.map +1 -1
  102. package/dist/node/image.d.ts.map +1 -1
  103. package/dist/node/index.d.ts +3 -0
  104. package/dist/node/index.d.ts.map +1 -1
  105. package/dist/node/index.js +251 -178
  106. package/dist/node/index.js.map +1 -1
  107. package/dist/node/serve.d.ts +47 -0
  108. package/dist/node/serve.d.ts.map +1 -0
  109. package/dist/node/static.d.ts.map +1 -1
  110. package/dist/node/streaming.d.ts.map +1 -1
  111. package/dist/platform/fonts.d.ts.map +1 -1
  112. package/dist/platform/image-url.d.ts.map +1 -1
  113. package/dist/platform/images.d.ts.map +1 -1
  114. package/dist/platform/index.d.ts +5 -1
  115. package/dist/platform/index.d.ts.map +1 -1
  116. package/dist/platform/observability.d.ts +2 -1
  117. package/dist/platform/observability.d.ts.map +1 -1
  118. package/dist/platform/url.d.ts +19 -0
  119. package/dist/platform/url.d.ts.map +1 -0
  120. package/dist/platform/web-vitals-client.d.ts +32 -0
  121. package/dist/platform/web-vitals-client.d.ts.map +1 -0
  122. package/dist/platform/web-vitals.d.ts +78 -0
  123. package/dist/platform/web-vitals.d.ts.map +1 -0
  124. package/dist/redis/index.d.ts +4 -0
  125. package/dist/redis/index.d.ts.map +1 -1
  126. package/dist/redis/index.js +209 -54
  127. package/dist/redis/index.js.map +1 -1
  128. package/dist/redis/rate-limit-store.d.ts +8 -0
  129. package/dist/redis/rate-limit-store.d.ts.map +1 -0
  130. package/dist/redis/session-store.d.ts +9 -0
  131. package/dist/redis/session-store.d.ts.map +1 -0
  132. package/dist/redis/store.d.ts.map +1 -1
  133. package/dist/route/index.d.ts +2 -2
  134. package/dist/route/index.d.ts.map +1 -1
  135. package/dist/route/middleware.d.ts.map +1 -1
  136. package/dist/route/mutation.d.ts +97 -0
  137. package/dist/route/mutation.d.ts.map +1 -0
  138. package/dist/route/response.d.ts.map +1 -1
  139. package/dist/route/types.d.ts +6 -1
  140. package/dist/route/types.d.ts.map +1 -1
  141. package/dist/router/index.d.ts +1 -1
  142. package/dist/router/index.d.ts.map +1 -1
  143. package/dist/router/manifest.d.ts +9 -0
  144. package/dist/router/manifest.d.ts.map +1 -1
  145. package/dist/router/navigation-data.d.ts +9 -1
  146. package/dist/router/navigation-data.d.ts.map +1 -1
  147. package/dist/routing/generate.d.ts +3 -0
  148. package/dist/routing/generate.d.ts.map +1 -1
  149. package/dist/routing/index.d.ts +3 -1
  150. package/dist/routing/index.d.ts.map +1 -1
  151. package/dist/routing/locale.d.ts +43 -0
  152. package/dist/routing/locale.d.ts.map +1 -0
  153. package/dist/routing/types.d.ts +12 -0
  154. package/dist/routing/types.d.ts.map +1 -1
  155. package/dist/security/cookie-session.d.ts +43 -0
  156. package/dist/security/cookie-session.d.ts.map +1 -0
  157. package/dist/security/cookies.d.ts +26 -0
  158. package/dist/security/cookies.d.ts.map +1 -0
  159. package/dist/security/csrf.d.ts +1 -1
  160. package/dist/security/csrf.d.ts.map +1 -1
  161. package/dist/security/env-startup.d.ts +15 -0
  162. package/dist/security/env-startup.d.ts.map +1 -0
  163. package/dist/security/env.d.ts +25 -6
  164. package/dist/security/env.d.ts.map +1 -1
  165. package/dist/security/fetch-metadata.d.ts +29 -0
  166. package/dist/security/fetch-metadata.d.ts.map +1 -0
  167. package/dist/security/index.d.ts +14 -2
  168. package/dist/security/index.d.ts.map +1 -1
  169. package/dist/security/policy.d.ts.map +1 -1
  170. package/dist/security/rate-limit.d.ts +6 -3
  171. package/dist/security/rate-limit.d.ts.map +1 -1
  172. package/dist/security/report.d.ts.map +1 -1
  173. package/dist/security/request.d.ts.map +1 -1
  174. package/dist/security/session-manager.d.ts +32 -0
  175. package/dist/security/session-manager.d.ts.map +1 -0
  176. package/dist/security/session-store.d.ts +51 -0
  177. package/dist/security/session-store.d.ts.map +1 -0
  178. package/dist/security/testing.d.ts +10 -0
  179. package/dist/security/testing.d.ts.map +1 -0
  180. package/dist/security/testing.js +145 -0
  181. package/dist/security/testing.js.map +1 -0
  182. package/dist/security/types.d.ts +73 -3
  183. package/dist/security/types.d.ts.map +1 -1
  184. package/dist/server/document-shell.d.ts.map +1 -1
  185. package/dist/server/errors.d.ts +1 -0
  186. package/dist/server/errors.d.ts.map +1 -1
  187. package/dist/server/index.d.ts +2 -1
  188. package/dist/server/index.d.ts.map +1 -1
  189. package/dist/server/not-found.d.ts +1 -0
  190. package/dist/server/not-found.d.ts.map +1 -1
  191. package/dist/server/render-tree.d.ts.map +1 -1
  192. package/dist/server/request-handler.d.ts +10 -2
  193. package/dist/server/request-handler.d.ts.map +1 -1
  194. package/dist/server/request-metadata.d.ts +1 -0
  195. package/dist/server/request-metadata.d.ts.map +1 -1
  196. package/dist/server/ssr.d.ts +2 -0
  197. package/dist/server/ssr.d.ts.map +1 -1
  198. package/dist/static/index.d.ts +2 -0
  199. package/dist/static/index.d.ts.map +1 -1
  200. package/dist/static/index.js +380 -363
  201. package/dist/static/index.js.map +1 -1
  202. package/dist/static/preview.d.ts.map +1 -1
  203. package/dist/static/vercel.d.ts +11 -2
  204. package/dist/static/vercel.d.ts.map +1 -1
  205. package/dist/static-files.d.ts +12 -0
  206. package/dist/static-files.d.ts.map +1 -1
  207. package/dist/type-guards.d.ts +19 -0
  208. package/dist/type-guards.d.ts.map +1 -0
  209. package/dist/vite/env-boundary.d.ts +14 -0
  210. package/dist/vite/env-boundary.d.ts.map +1 -0
  211. package/dist/vite/index.d.ts +8 -3
  212. package/dist/vite/index.d.ts.map +1 -1
  213. package/dist/vite/index.js +22 -1196
  214. package/dist/vite/index.js.map +1 -1
  215. package/dist/vite/plugin.d.ts +8 -1
  216. package/dist/vite/plugin.d.ts.map +1 -1
  217. package/dist/vite/policy-verification.d.ts.map +1 -1
  218. package/dist/vite/route-audit.d.ts +50 -0
  219. package/dist/vite/route-audit.d.ts.map +1 -0
  220. package/package.json +19 -6
  221. package/dist/chunks/document-shell-D1xo6cEA.js +0 -35
  222. package/dist/chunks/document-shell-D1xo6cEA.js.map +0 -1
  223. package/dist/chunks/images-B9MqcjSA.js.map +0 -1
  224. package/dist/chunks/request-metadata-D5NrT8ks.js +0 -642
  225. package/dist/chunks/request-metadata-D5NrT8ks.js.map +0 -1
  226. package/dist/chunks/static-files-DUjHw-4H.js +0 -11
  227. package/dist/chunks/static-files-DUjHw-4H.js.map +0 -1
  228. package/dist/chunks/streaming-BQ1bykDo.js.map +0 -1
  229. package/dist/chunks/testing-B_iMFYz_.js +0 -3321
  230. package/dist/chunks/testing-B_iMFYz_.js.map +0 -1
  231. package/dist/route/action.d.ts +0 -33
  232. package/dist/route/action.d.ts.map +0 -1
@@ -1,4 +1,5 @@
1
- const o = "demiurge:cache:", g = `
1
+ import { s as f, p as m } from "../chunks/session-store-ChModVcq.js";
2
+ const S = "demiurge:cache:", g = `
2
3
  local old = redis.call("GET", KEYS[1])
3
4
  if old then
4
5
  local oldTags = cjson.decode(old).tags
@@ -16,7 +17,7 @@ for i = 1, #newTags do
16
17
  end
17
18
  redis.call("DEL", KEYS[2])
18
19
  return 1
19
- `, f = `
20
+ `, R = `
20
21
  local old = redis.call("GET", KEYS[1])
21
22
  redis.call("DEL", KEYS[2])
22
23
  if not old then
@@ -28,7 +29,7 @@ for i = 1, #oldTags do
28
29
  end
29
30
  redis.call("DEL", KEYS[1])
30
31
  return 1
31
- `, u = `
32
+ `, E = `
32
33
  local tags = cjson.decode(ARGV[1])
33
34
  local seen = {}
34
35
  local deleted = 0
@@ -57,7 +58,7 @@ for i = 1, #tags do
57
58
  redis.call("DEL", tagSetKey)
58
59
  end
59
60
  return deleted
60
- `, R = `
61
+ `, h = `
61
62
  local owner = redis.call("GET", KEYS[2])
62
63
  if not owner or owner ~= ARGV[1] then
63
64
  return 0
@@ -79,93 +80,247 @@ for i = 1, #newTags do
79
80
  end
80
81
  redis.call("DEL", KEYS[2])
81
82
  return 1
82
- `, h = `
83
+ `, K = `
83
84
  local owner = redis.call("GET", KEYS[1])
84
85
  if owner == ARGV[1] then
85
86
  redis.call("DEL", KEYS[1])
86
87
  end
87
88
  return 0
88
89
  `;
89
- function S(r) {
90
- const a = r;
91
- return a.demiurgeCacheSet || r.defineCommand("demiurgeCacheSet", { lua: g, numberOfKeys: 2 }), a.demiurgeCacheDelete || r.defineCommand("demiurgeCacheDelete", {
92
- lua: f,
93
- numberOfKeys: 2
94
- }), a.demiurgeCacheInvalidateTags || r.defineCommand("demiurgeCacheInvalidateTags", {
95
- lua: u,
96
- numberOfKeys: 0
97
- }), a.demiurgeCachePublishRefresh || r.defineCommand("demiurgeCachePublishRefresh", {
90
+ function y(e) {
91
+ const t = e;
92
+ return t.demiurgeCacheSet || e.defineCommand("demiurgeCacheSet", { lua: g, numberOfKeys: 2 }), t.demiurgeCacheDelete || e.defineCommand("demiurgeCacheDelete", {
98
93
  lua: R,
99
94
  numberOfKeys: 2
100
- }), a.demiurgeCacheReleaseRefreshLease || r.defineCommand("demiurgeCacheReleaseRefreshLease", {
95
+ }), t.demiurgeCacheInvalidateTags || e.defineCommand("demiurgeCacheInvalidateTags", {
96
+ lua: E,
97
+ numberOfKeys: 0
98
+ }), t.demiurgeCachePublishRefresh || e.defineCommand("demiurgeCachePublishRefresh", {
101
99
  lua: h,
100
+ numberOfKeys: 2
101
+ }), t.demiurgeCacheReleaseRefreshLease || e.defineCommand("demiurgeCacheReleaseRefreshLease", {
102
+ lua: K,
102
103
  numberOfKeys: 1
103
- }), a;
104
+ }), t;
104
105
  }
105
- function m(r) {
106
- if (!r.client || typeof r.client.defineCommand != "function")
106
+ function L(e) {
107
+ if (!e.client || typeof e.client.defineCommand != "function")
107
108
  throw new Error(
108
109
  "Demiurge Redis cache store requires an ioredis client. Pass a connected ioredis Redis instance as `client`."
109
110
  );
110
- const a = S(r.client), t = r.keyPrefix ?? o, d = `${t}entry:`, i = `${t}tag:`, s = `${t}lease:`;
111
+ const t = y(e.client), l = e.keyPrefix ?? S, d = `${l}entry:`, i = `${l}tag:`, a = `${l}lease:`;
111
112
  return {
112
- async acquireRefreshLease(e, l, n) {
113
- return await a.call(
113
+ async acquireRefreshLease(r, n, s) {
114
+ return await t.call(
114
115
  "SET",
115
- s + e,
116
- l,
116
+ a + r,
117
+ n,
117
118
  "NX",
118
119
  "PXAT",
119
- String(n)
120
+ String(s)
120
121
  ) === "OK";
121
122
  },
122
- async delete(e) {
123
- return await a.demiurgeCacheDelete(
124
- d + e,
125
- s + e,
123
+ async delete(r) {
124
+ return await t.demiurgeCacheDelete(
125
+ d + r,
126
+ a + r,
126
127
  i,
127
- e
128
+ r
128
129
  ) === 1;
129
130
  },
130
- async get(e) {
131
- const l = await a.get(d + e);
132
- return l ? JSON.parse(l) : void 0;
131
+ async get(r) {
132
+ const n = await t.get(d + r);
133
+ return n ? JSON.parse(n) : void 0;
133
134
  },
134
- async invalidateTags(e) {
135
- return e.length === 0 ? 0 : await a.demiurgeCacheInvalidateTags(
136
- JSON.stringify(e),
135
+ async invalidateTags(r) {
136
+ return r.length === 0 ? 0 : await t.demiurgeCacheInvalidateTags(
137
+ JSON.stringify(r),
137
138
  i,
138
139
  d,
139
- s
140
+ a
140
141
  );
141
142
  },
142
- async publishRefresh(e, l, n) {
143
- return await a.demiurgeCachePublishRefresh(
144
- d + e,
145
- s + e,
146
- l,
147
- JSON.stringify(n),
148
- n.staleUntil === null ? "" : String(n.staleUntil),
143
+ async publishRefresh(r, n, s) {
144
+ return await t.demiurgeCachePublishRefresh(
145
+ d + r,
146
+ a + r,
147
+ n,
148
+ JSON.stringify(s),
149
+ s.staleUntil === null ? "" : String(s.staleUntil),
149
150
  i,
150
- e
151
+ r
151
152
  ) === 1;
152
153
  },
153
- async releaseRefreshLease(e, l) {
154
- await a.demiurgeCacheReleaseRefreshLease(s + e, l);
154
+ async releaseRefreshLease(r, n) {
155
+ await t.demiurgeCacheReleaseRefreshLease(a + r, n);
155
156
  },
156
- async set(e, l) {
157
- await a.demiurgeCacheSet(
158
- d + e,
159
- s + e,
160
- JSON.stringify(l),
161
- l.staleUntil === null ? "" : String(l.staleUntil),
157
+ async set(r, n) {
158
+ await t.demiurgeCacheSet(
159
+ d + r,
160
+ a + r,
161
+ JSON.stringify(n),
162
+ n.staleUntil === null ? "" : String(n.staleUntil),
162
163
  i,
163
- e
164
+ r
164
165
  );
165
166
  }
166
167
  };
167
168
  }
169
+ const A = "demiurge:ratelimit:", T = `
170
+ local count = redis.call("INCR", KEYS[1])
171
+ if count == 1 then
172
+ redis.call("PEXPIRE", KEYS[1], ARGV[1])
173
+ end
174
+ local ttl = redis.call("PTTL", KEYS[1])
175
+ if ttl < 0 then
176
+ redis.call("PEXPIRE", KEYS[1], ARGV[1])
177
+ ttl = tonumber(ARGV[1])
178
+ end
179
+ local time = redis.call("TIME")
180
+ local nowMs = math.floor(tonumber(time[1]) * 1000 + tonumber(time[2]) / 1000)
181
+ return { count, nowMs + ttl }
182
+ `;
183
+ function w(e) {
184
+ const t = e;
185
+ return t.demiurgeRateLimitIncrement || e.defineCommand("demiurgeRateLimitIncrement", {
186
+ lua: T,
187
+ numberOfKeys: 1
188
+ }), t;
189
+ }
190
+ function D(e) {
191
+ if (!e.client || typeof e.client.defineCommand != "function")
192
+ throw new Error(
193
+ "Demiurge Redis rate limit store requires an ioredis client. Pass a connected ioredis Redis instance as `client`."
194
+ );
195
+ const t = w(e.client), l = e.keyPrefix ?? A;
196
+ return {
197
+ async increment(d, i) {
198
+ const [a, r] = await t.demiurgeRateLimitIncrement(
199
+ l + d,
200
+ String(i)
201
+ );
202
+ return { count: a, resetAt: r };
203
+ }
204
+ };
205
+ }
206
+ const G = "demiurge:session:", C = `
207
+ if redis.call("EXISTS", KEYS[1]) == 1 then
208
+ return 0
209
+ end
210
+ redis.call("SET", KEYS[1], ARGV[1], "PXAT", ARGV[2])
211
+ return 1
212
+ `, V = `
213
+ local current = redis.call("GET", KEYS[1])
214
+ if not current or cjson.decode(current).version ~= tonumber(ARGV[1]) then
215
+ return 0
216
+ end
217
+ redis.call("SET", KEYS[1], ARGV[2], "PXAT", ARGV[3])
218
+ return 1
219
+ `, P = `
220
+ local current = redis.call("GET", KEYS[1])
221
+ if not current or cjson.decode(current).version ~= tonumber(ARGV[1]) then
222
+ return 0
223
+ end
224
+ if KEYS[1] ~= KEYS[2] and redis.call("EXISTS", KEYS[2]) == 1 then
225
+ return 0
226
+ end
227
+ redis.call("DEL", KEYS[1])
228
+ redis.call("SET", KEYS[2], ARGV[2], "PXAT", ARGV[3])
229
+ return 1
230
+ `;
231
+ function Y(e) {
232
+ const t = e;
233
+ return t.demiurgeSessionCreate || e.defineCommand("demiurgeSessionCreate", {
234
+ lua: C,
235
+ numberOfKeys: 1
236
+ }), t.demiurgeSessionUpdate || e.defineCommand("demiurgeSessionUpdate", {
237
+ lua: V,
238
+ numberOfKeys: 1
239
+ }), t.demiurgeSessionRotate || e.defineCommand("demiurgeSessionRotate", {
240
+ lua: P,
241
+ numberOfKeys: 2
242
+ }), t;
243
+ }
244
+ function O(e) {
245
+ if (!e.client || typeof e.client.defineCommand != "function")
246
+ throw new Error(
247
+ "Demiurge Redis session store requires an ioredis client. Pass a connected ioredis Redis instance as `client`."
248
+ );
249
+ const t = Y(e.client), l = f(e.namespace), d = `${e.keyPrefix ?? G}${l}:`, i = (a) => d + a;
250
+ return {
251
+ async create(a) {
252
+ const r = o(a, 0);
253
+ try {
254
+ return await t.demiurgeSessionCreate(
255
+ i(r.id),
256
+ JSON.stringify(r),
257
+ String(c(r))
258
+ ) === 1 ? { record: r, status: "stored" } : { status: "conflict" };
259
+ } catch {
260
+ return { status: "unavailable" };
261
+ }
262
+ },
263
+ async destroy(a) {
264
+ return await t.del(i(a)) === 1;
265
+ },
266
+ async read(a, r) {
267
+ const n = await t.get(i(a));
268
+ if (!n)
269
+ return;
270
+ const s = b(n);
271
+ if (s) {
272
+ if (c(s) <= r) {
273
+ await t.del(i(a));
274
+ return;
275
+ }
276
+ return s;
277
+ }
278
+ },
279
+ async rotate(a, r, n) {
280
+ const s = o(r, n + 1);
281
+ try {
282
+ return await t.demiurgeSessionRotate(
283
+ i(a),
284
+ i(s.id),
285
+ String(n),
286
+ JSON.stringify(s),
287
+ String(c(s))
288
+ ) === 1 ? { record: s, status: "stored" } : { status: "conflict" };
289
+ } catch {
290
+ return { status: "unavailable" };
291
+ }
292
+ },
293
+ async update(a, r) {
294
+ const n = o(a, r + 1);
295
+ try {
296
+ return await t.demiurgeSessionUpdate(
297
+ i(n.id),
298
+ String(r),
299
+ JSON.stringify(n),
300
+ String(c(n))
301
+ ) === 1 ? { record: n, status: "stored" } : { status: "conflict" };
302
+ } catch {
303
+ return { status: "unavailable" };
304
+ }
305
+ }
306
+ };
307
+ }
308
+ function b(e) {
309
+ try {
310
+ return m(JSON.parse(e));
311
+ } catch {
312
+ return;
313
+ }
314
+ }
315
+ function o(e, t) {
316
+ return structuredClone({ ...e, version: t });
317
+ }
318
+ function c(e) {
319
+ return Math.min(e.expiresAt, e.idleExpiresAt ?? e.expiresAt);
320
+ }
168
321
  export {
169
- m as createRedisCacheStore
322
+ L as createRedisCacheStore,
323
+ D as createRedisRateLimitStore,
324
+ O as createRedisSessionStore
170
325
  };
171
326
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/redis/store.ts"],"sourcesContent":["import type { Redis } from \"ioredis\";\nimport type { CacheStore, CacheStoreEntry } from \"../data/cache\";\n\nexport type RedisCacheStoreOptions = {\n // Every consumer of one Redis database shares one keyspace. This prefix\n // scopes the store's entry, tag, and lease keys away from an application's\n // other Redis use. Two Demiurge deployments that share a database still\n // need distinct prefixes, the same way they need distinct cache namespaces.\n keyPrefix?: string;\n // The store issues commands on a client the application already\n // constructed and connected. Connection options, TLS, Sentinel, and retry\n // policy are the application's decision, not this store's.\n client: Redis;\n};\n\nconst defaultKeyPrefix = \"demiurge:cache:\";\n\n// Tag sets hold the raw, unprefixed cache key as each member, never the\n// prefixed entry key. invalidateTags() only knows a tag's members. It\n// rebuilds both the entry key and the lease key by applying their prefixes.\n// Every script below adds and removes the same raw-key member, so the two\n// stay in agreement.\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] entry JSON, ARGV[2] staleUntil epoch ms or \"\".\n// ARGV[3] tag key prefix, ARGV[4] raw key.\nconst setScript = `\nlocal old = redis.call(\"GET\", KEYS[1])\nif old then\n local oldTags = cjson.decode(old).tags\n for i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[3] .. oldTags[i], ARGV[4])\n end\nend\nredis.call(\"SET\", KEYS[1], ARGV[1])\nif ARGV[2] ~= \"\" then\n redis.call(\"PEXPIREAT\", KEYS[1], ARGV[2])\nend\nlocal newTags = cjson.decode(ARGV[1]).tags\nfor i = 1, #newTags do\n redis.call(\"SADD\", ARGV[3] .. newTags[i], ARGV[4])\nend\nredis.call(\"DEL\", KEYS[2])\nreturn 1\n`;\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] tag key prefix, ARGV[2] raw key.\nconst deleteScript = `\nlocal old = redis.call(\"GET\", KEYS[1])\nredis.call(\"DEL\", KEYS[2])\nif not old then\n return 0\nend\nlocal oldTags = cjson.decode(old).tags\nfor i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[1] .. oldTags[i], ARGV[2])\nend\nredis.call(\"DEL\", KEYS[1])\nreturn 1\n`;\n\n// No declared KEYS. Tags name a variable number of sets, so the script reads\n// their redis keys from ARGV instead.\n// ARGV[1] tags JSON array, ARGV[2] tag key prefix, ARGV[3] entry key prefix,\n// ARGV[4] lease key prefix\nconst invalidateTagsScript = `\nlocal tags = cjson.decode(ARGV[1])\nlocal seen = {}\nlocal deleted = 0\nfor i = 1, #tags do\n local tagSetKey = ARGV[2] .. tags[i]\n local members = redis.call(\"SMEMBERS\", tagSetKey)\n for j = 1, #members do\n local rawKey = members[j]\n if not seen[rawKey] then\n seen[rawKey] = true\n local entryKey = ARGV[3] .. rawKey\n local old = redis.call(\"GET\", entryKey)\n if old then\n local oldTags = cjson.decode(old).tags\n for t = 1, #oldTags do\n redis.call(\"SREM\", ARGV[2] .. oldTags[t], rawKey)\n end\n redis.call(\"DEL\", entryKey)\n redis.call(\"DEL\", ARGV[4] .. rawKey)\n deleted = deleted + 1\n else\n redis.call(\"SREM\", tagSetKey, rawKey)\n end\n end\n end\n redis.call(\"DEL\", tagSetKey)\nend\nreturn deleted\n`;\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] token, ARGV[2] entry JSON, ARGV[3] staleUntil epoch ms or \"\".\n// ARGV[4] tag key prefix, ARGV[5] raw key.\nconst publishRefreshScript = `\nlocal owner = redis.call(\"GET\", KEYS[2])\nif not owner or owner ~= ARGV[1] then\n return 0\nend\nlocal old = redis.call(\"GET\", KEYS[1])\nif old then\n local oldTags = cjson.decode(old).tags\n for i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[4] .. oldTags[i], ARGV[5])\n end\nend\nredis.call(\"SET\", KEYS[1], ARGV[2])\nif ARGV[3] ~= \"\" then\n redis.call(\"PEXPIREAT\", KEYS[1], ARGV[3])\nend\nlocal newTags = cjson.decode(ARGV[2]).tags\nfor i = 1, #newTags do\n redis.call(\"SADD\", ARGV[4] .. newTags[i], ARGV[5])\nend\nredis.call(\"DEL\", KEYS[2])\nreturn 1\n`;\n\n// KEYS[1] lease key, ARGV[1] token\nconst releaseRefreshLeaseScript = `\nlocal owner = redis.call(\"GET\", KEYS[1])\nif owner == ARGV[1] then\n redis.call(\"DEL\", KEYS[1])\nend\nreturn 0\n`;\n\ntype RedisCacheCommands = {\n demiurgeCacheSet: (\n entryKey: string,\n leaseKey: string,\n entryJson: string,\n staleUntil: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheDelete: (\n entryKey: string,\n leaseKey: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheInvalidateTags: (\n tagsJson: string,\n tagPrefix: string,\n entryPrefix: string,\n leasePrefix: string,\n ) => Promise<number>;\n demiurgeCachePublishRefresh: (\n entryKey: string,\n leaseKey: string,\n token: string,\n entryJson: string,\n staleUntil: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheReleaseRefreshLease: (\n leaseKey: string,\n token: string,\n ) => Promise<number>;\n};\n\n// The application already owns one ioredis client. Attaching the store's\n// commands is idempotent, so building several stores on the same client, or\n// rebuilding one after a reconnect, never redefines a command twice.\nfunction commands(client: Redis): Redis & RedisCacheCommands {\n const withCommands = client as Redis & Partial<RedisCacheCommands>;\n\n if (!withCommands.demiurgeCacheSet) {\n client.defineCommand(\"demiurgeCacheSet\", { lua: setScript, numberOfKeys: 2 });\n }\n\n if (!withCommands.demiurgeCacheDelete) {\n client.defineCommand(\"demiurgeCacheDelete\", {\n lua: deleteScript,\n numberOfKeys: 2,\n });\n }\n\n if (!withCommands.demiurgeCacheInvalidateTags) {\n client.defineCommand(\"demiurgeCacheInvalidateTags\", {\n lua: invalidateTagsScript,\n numberOfKeys: 0,\n });\n }\n\n if (!withCommands.demiurgeCachePublishRefresh) {\n client.defineCommand(\"demiurgeCachePublishRefresh\", {\n lua: publishRefreshScript,\n numberOfKeys: 2,\n });\n }\n\n if (!withCommands.demiurgeCacheReleaseRefreshLease) {\n client.defineCommand(\"demiurgeCacheReleaseRefreshLease\", {\n lua: releaseRefreshLeaseScript,\n numberOfKeys: 1,\n });\n }\n\n return withCommands as Redis & RedisCacheCommands;\n}\n\n// Redis holds the entry, its tag memberships, and its refresh lease as\n// independent keys. Every process talking to the same database must see\n// these three stay coordinated. Each write path therefore runs as one Lua\n// script rather than several round trips a concurrent writer could\n// interleave with.\nexport function createRedisCacheStore(\n options: RedisCacheStoreOptions,\n): CacheStore {\n if (!options.client || typeof options.client.defineCommand !== \"function\") {\n throw new Error(\n \"Demiurge Redis cache store requires an ioredis client. Pass a connected ioredis Redis instance as `client`.\",\n );\n }\n\n const client = commands(options.client);\n const prefix = options.keyPrefix ?? defaultKeyPrefix;\n const entryPrefix = `${prefix}entry:`;\n const tagPrefix = `${prefix}tag:`;\n const leasePrefix = `${prefix}lease:`;\n\n return {\n async acquireRefreshLease(key, token, expiresAt) {\n // ioredis's typed SET overloads do not cover every flag order the\n // Redis SET command accepts, so this issues the raw command instead.\n const result = await client.call(\n \"SET\",\n leasePrefix + key,\n token,\n \"NX\",\n \"PXAT\",\n String(expiresAt),\n );\n\n return result === \"OK\";\n },\n async delete(key) {\n const deleted = await client.demiurgeCacheDelete(\n entryPrefix + key,\n leasePrefix + key,\n tagPrefix,\n key,\n );\n\n return deleted === 1;\n },\n async get(key) {\n const raw = await client.get(entryPrefix + key);\n return raw ? (JSON.parse(raw) as CacheStoreEntry) : undefined;\n },\n async invalidateTags(tags) {\n if (tags.length === 0) {\n return 0;\n }\n\n return await client.demiurgeCacheInvalidateTags(\n JSON.stringify(tags),\n tagPrefix,\n entryPrefix,\n leasePrefix,\n );\n },\n async publishRefresh(key, token, entry) {\n const result = await client.demiurgeCachePublishRefresh(\n entryPrefix + key,\n leasePrefix + key,\n token,\n JSON.stringify(entry),\n entry.staleUntil === null ? \"\" : String(entry.staleUntil),\n tagPrefix,\n key,\n );\n\n return result === 1;\n },\n async releaseRefreshLease(key, token) {\n await client.demiurgeCacheReleaseRefreshLease(leasePrefix + key, token);\n },\n async set(key, entry) {\n await client.demiurgeCacheSet(\n entryPrefix + key,\n leasePrefix + key,\n JSON.stringify(entry),\n entry.staleUntil === null ? \"\" : String(entry.staleUntil),\n tagPrefix,\n key,\n );\n },\n };\n}\n"],"names":["defaultKeyPrefix","setScript","deleteScript","invalidateTagsScript","publishRefreshScript","releaseRefreshLeaseScript","commands","client","withCommands","createRedisCacheStore","options","prefix","entryPrefix","tagPrefix","leasePrefix","key","token","expiresAt","raw","tags","entry"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/redis/store.ts","../../src/redis/rate-limit-store.ts","../../src/redis/session-store.ts"],"sourcesContent":["import type { Redis } from \"ioredis\";\nimport type { CacheStore, CacheStoreEntry } from \"../data/cache\";\n\nexport type RedisCacheStoreOptions = {\n // Every consumer of one Redis database shares one keyspace. This prefix\n // scopes the store's entry, tag, and lease keys away from an application's\n // other Redis use. Two Demiurge deployments that share a database still\n // need distinct prefixes, the same way they need distinct cache namespaces.\n keyPrefix?: string;\n // The store issues commands on a client the application already\n // constructed and connected. Connection options, TLS, Sentinel, and retry\n // policy are the application's decision, not this store's.\n client: Redis;\n};\n\nconst defaultKeyPrefix = \"demiurge:cache:\";\n\n// Tag sets hold the raw, unprefixed cache key as each member, never the\n// prefixed entry key. invalidateTags() only knows a tag's members. It\n// rebuilds both the entry key and the lease key by applying their prefixes.\n// Every script below adds and removes the same raw-key member, so the two\n// stay in agreement.\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] entry JSON, ARGV[2] staleUntil epoch ms or \"\".\n// ARGV[3] tag key prefix, ARGV[4] raw key.\nconst setScript = `\nlocal old = redis.call(\"GET\", KEYS[1])\nif old then\n local oldTags = cjson.decode(old).tags\n for i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[3] .. oldTags[i], ARGV[4])\n end\nend\nredis.call(\"SET\", KEYS[1], ARGV[1])\nif ARGV[2] ~= \"\" then\n redis.call(\"PEXPIREAT\", KEYS[1], ARGV[2])\nend\nlocal newTags = cjson.decode(ARGV[1]).tags\nfor i = 1, #newTags do\n redis.call(\"SADD\", ARGV[3] .. newTags[i], ARGV[4])\nend\nredis.call(\"DEL\", KEYS[2])\nreturn 1\n`;\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] tag key prefix, ARGV[2] raw key.\nconst deleteScript = `\nlocal old = redis.call(\"GET\", KEYS[1])\nredis.call(\"DEL\", KEYS[2])\nif not old then\n return 0\nend\nlocal oldTags = cjson.decode(old).tags\nfor i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[1] .. oldTags[i], ARGV[2])\nend\nredis.call(\"DEL\", KEYS[1])\nreturn 1\n`;\n\n// No declared KEYS. Tags name a variable number of sets, so the script reads\n// their redis keys from ARGV instead.\n// ARGV[1] tags JSON array, ARGV[2] tag key prefix, ARGV[3] entry key prefix,\n// ARGV[4] lease key prefix\nconst invalidateTagsScript = `\nlocal tags = cjson.decode(ARGV[1])\nlocal seen = {}\nlocal deleted = 0\nfor i = 1, #tags do\n local tagSetKey = ARGV[2] .. tags[i]\n local members = redis.call(\"SMEMBERS\", tagSetKey)\n for j = 1, #members do\n local rawKey = members[j]\n if not seen[rawKey] then\n seen[rawKey] = true\n local entryKey = ARGV[3] .. rawKey\n local old = redis.call(\"GET\", entryKey)\n if old then\n local oldTags = cjson.decode(old).tags\n for t = 1, #oldTags do\n redis.call(\"SREM\", ARGV[2] .. oldTags[t], rawKey)\n end\n redis.call(\"DEL\", entryKey)\n redis.call(\"DEL\", ARGV[4] .. rawKey)\n deleted = deleted + 1\n else\n redis.call(\"SREM\", tagSetKey, rawKey)\n end\n end\n end\n redis.call(\"DEL\", tagSetKey)\nend\nreturn deleted\n`;\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] token, ARGV[2] entry JSON, ARGV[3] staleUntil epoch ms or \"\".\n// ARGV[4] tag key prefix, ARGV[5] raw key.\nconst publishRefreshScript = `\nlocal owner = redis.call(\"GET\", KEYS[2])\nif not owner or owner ~= ARGV[1] then\n return 0\nend\nlocal old = redis.call(\"GET\", KEYS[1])\nif old then\n local oldTags = cjson.decode(old).tags\n for i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[4] .. oldTags[i], ARGV[5])\n end\nend\nredis.call(\"SET\", KEYS[1], ARGV[2])\nif ARGV[3] ~= \"\" then\n redis.call(\"PEXPIREAT\", KEYS[1], ARGV[3])\nend\nlocal newTags = cjson.decode(ARGV[2]).tags\nfor i = 1, #newTags do\n redis.call(\"SADD\", ARGV[4] .. newTags[i], ARGV[5])\nend\nredis.call(\"DEL\", KEYS[2])\nreturn 1\n`;\n\n// KEYS[1] lease key, ARGV[1] token\nconst releaseRefreshLeaseScript = `\nlocal owner = redis.call(\"GET\", KEYS[1])\nif owner == ARGV[1] then\n redis.call(\"DEL\", KEYS[1])\nend\nreturn 0\n`;\n\ntype RedisCacheCommands = {\n demiurgeCacheSet: (\n entryKey: string,\n leaseKey: string,\n entryJson: string,\n staleUntil: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheDelete: (\n entryKey: string,\n leaseKey: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheInvalidateTags: (\n tagsJson: string,\n tagPrefix: string,\n entryPrefix: string,\n leasePrefix: string,\n ) => Promise<number>;\n demiurgeCachePublishRefresh: (\n entryKey: string,\n leaseKey: string,\n token: string,\n entryJson: string,\n staleUntil: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheReleaseRefreshLease: (\n leaseKey: string,\n token: string,\n ) => Promise<number>;\n};\n\n// The application already owns one ioredis client. Attaching the store's\n// commands is idempotent, so building several stores on the same client, or\n// rebuilding one after a reconnect, never redefines a command twice.\nfunction commands(client: Redis): Redis & RedisCacheCommands {\n // TYPE-EVIDENCE: the cast adds the optional custom command methods before the runtime checks install them.\n const withCommands = client as Redis & Partial<RedisCacheCommands>;\n\n if (!withCommands.demiurgeCacheSet) {\n client.defineCommand(\"demiurgeCacheSet\", { lua: setScript, numberOfKeys: 2 });\n }\n\n if (!withCommands.demiurgeCacheDelete) {\n client.defineCommand(\"demiurgeCacheDelete\", {\n lua: deleteScript,\n numberOfKeys: 2,\n });\n }\n\n if (!withCommands.demiurgeCacheInvalidateTags) {\n client.defineCommand(\"demiurgeCacheInvalidateTags\", {\n lua: invalidateTagsScript,\n numberOfKeys: 0,\n });\n }\n\n if (!withCommands.demiurgeCachePublishRefresh) {\n client.defineCommand(\"demiurgeCachePublishRefresh\", {\n lua: publishRefreshScript,\n numberOfKeys: 2,\n });\n }\n\n if (!withCommands.demiurgeCacheReleaseRefreshLease) {\n client.defineCommand(\"demiurgeCacheReleaseRefreshLease\", {\n lua: releaseRefreshLeaseScript,\n numberOfKeys: 1,\n });\n }\n\n // TYPE-EVIDENCE: the defineCommand calls above install each custom command. The cast reflects that the methods now exist.\n return withCommands as Redis & RedisCacheCommands;\n}\n\n// Redis holds the entry, its tag memberships, and its refresh lease as\n// independent keys. Every process talking to the same database must see\n// these three stay coordinated. Each write path therefore runs as one Lua\n// script rather than several round trips a concurrent writer could\n// interleave with.\nexport function createRedisCacheStore(\n options: RedisCacheStoreOptions,\n): CacheStore {\n if (!options.client || typeof options.client.defineCommand !== \"function\") {\n throw new Error(\n \"Demiurge Redis cache store requires an ioredis client. Pass a connected ioredis Redis instance as `client`.\",\n );\n }\n\n const client = commands(options.client);\n const prefix = options.keyPrefix ?? defaultKeyPrefix;\n const entryPrefix = `${prefix}entry:`;\n const tagPrefix = `${prefix}tag:`;\n const leasePrefix = `${prefix}lease:`;\n\n return {\n async acquireRefreshLease(key, token, expiresAt) {\n // ioredis's typed SET overloads do not cover every flag order the\n // Redis SET command accepts, so this issues the raw command instead.\n const result = await client.call(\n \"SET\",\n leasePrefix + key,\n token,\n \"NX\",\n \"PXAT\",\n String(expiresAt),\n );\n\n return result === \"OK\";\n },\n async delete(key) {\n const deleted = await client.demiurgeCacheDelete(\n entryPrefix + key,\n leasePrefix + key,\n tagPrefix,\n key,\n );\n\n return deleted === 1;\n },\n async get(key) {\n const raw = await client.get(entryPrefix + key);\n // TYPE-EVIDENCE: the stored raw value is JSON that the store serialized from a cache entry. The cast restores that shape.\n return raw ? (JSON.parse(raw) as CacheStoreEntry) : undefined;\n },\n async invalidateTags(tags) {\n if (tags.length === 0) {\n return 0;\n }\n\n return await client.demiurgeCacheInvalidateTags(\n JSON.stringify(tags),\n tagPrefix,\n entryPrefix,\n leasePrefix,\n );\n },\n async publishRefresh(key, token, entry) {\n const result = await client.demiurgeCachePublishRefresh(\n entryPrefix + key,\n leasePrefix + key,\n token,\n JSON.stringify(entry),\n entry.staleUntil === null ? \"\" : String(entry.staleUntil),\n tagPrefix,\n key,\n );\n\n return result === 1;\n },\n async releaseRefreshLease(key, token) {\n await client.demiurgeCacheReleaseRefreshLease(leasePrefix + key, token);\n },\n async set(key, entry) {\n await client.demiurgeCacheSet(\n entryPrefix + key,\n leasePrefix + key,\n JSON.stringify(entry),\n entry.staleUntil === null ? \"\" : String(entry.staleUntil),\n tagPrefix,\n key,\n );\n },\n };\n}\n","import type { Redis } from \"ioredis\";\nimport type { RateLimitResult, RateLimitStore } from \"../security/types\";\n\nexport type RedisRateLimitStoreOptions = {\n // Every consumer of one Redis database shares one keyspace. This prefix\n // scopes the store's counter keys away from an application's other Redis\n // use, the same way RedisCacheStoreOptions.keyPrefix does for the cache\n // store. Two Demiurge deployments that share a database still need\n // distinct prefixes.\n keyPrefix?: string;\n // The store issues commands on a client the application already\n // constructed and connected. Connection options, TLS, Sentinel, and retry\n // policy are the application's decision, not this store's.\n client: Redis;\n};\n\nconst defaultKeyPrefix = \"demiurge:ratelimit:\";\n\n// KEYS[1] counter key. ARGV[1] window in ms.\n//\n// INCR and PEXPIRE run inside one script. Redis executes the whole script\n// as a single atomic step, so two instances racing to increment the same\n// key never both observe count 1. The window's reset time comes from\n// Redis's own clock (TIME), not the caller-supplied `now`. The counter's\n// TTL is authoritative once several processes share it, and a\n// client-supplied timestamp could disagree with the server that expires the\n// key. TIME is deterministic across replication because Redis rewrites the\n// script's effects rather than replaying non-deterministic commands.\nconst incrementScript = `\nlocal count = redis.call(\"INCR\", KEYS[1])\nif count == 1 then\n redis.call(\"PEXPIRE\", KEYS[1], ARGV[1])\nend\nlocal ttl = redis.call(\"PTTL\", KEYS[1])\nif ttl < 0 then\n redis.call(\"PEXPIRE\", KEYS[1], ARGV[1])\n ttl = tonumber(ARGV[1])\nend\nlocal time = redis.call(\"TIME\")\nlocal nowMs = math.floor(tonumber(time[1]) * 1000 + tonumber(time[2]) / 1000)\nreturn { count, nowMs + ttl }\n`;\n\ntype RedisRateLimitCommands = {\n demiurgeRateLimitIncrement: (\n counterKey: string,\n windowMs: string,\n ) => Promise<[number, number]>;\n};\n\n// The application already owns one ioredis client. Attaching the store's\n// command is idempotent, so building several stores on the same client, or\n// rebuilding one after a reconnect, never redefines the command twice.\nfunction commands(client: Redis): Redis & RedisRateLimitCommands {\n // TYPE-EVIDENCE: the cast adds the optional custom command methods before the runtime check installs them.\n const withCommands = client as Redis & Partial<RedisRateLimitCommands>;\n\n if (!withCommands.demiurgeRateLimitIncrement) {\n client.defineCommand(\"demiurgeRateLimitIncrement\", {\n lua: incrementScript,\n numberOfKeys: 1,\n });\n }\n\n // TYPE-EVIDENCE: the defineCommand call above installs the custom command. The cast reflects that the method now exists.\n return withCommands as Redis & RedisRateLimitCommands;\n}\n\nexport function createRedisRateLimitStore(\n options: RedisRateLimitStoreOptions,\n): RateLimitStore {\n if (!options.client || typeof options.client.defineCommand !== \"function\") {\n throw new Error(\n \"Demiurge Redis rate limit store requires an ioredis client. Pass a connected ioredis Redis instance as `client`.\",\n );\n }\n\n const client = commands(options.client);\n const prefix = options.keyPrefix ?? defaultKeyPrefix;\n\n return {\n async increment(key, windowMs): Promise<RateLimitResult> {\n const [count, resetAt] = await client.demiurgeRateLimitIncrement(\n prefix + key,\n String(windowMs),\n );\n\n return { count, resetAt };\n },\n };\n}\n","import type { Redis } from \"ioredis\";\nimport {\n parseSessionRecord,\n serializeSessionNamespace,\n type SessionData,\n type SessionNamespace,\n type SessionRecord,\n type SessionStore,\n type SessionStoreCandidate,\n} from \"../security/session-store\";\n\nexport type RedisSessionStoreOptions = {\n client: Redis;\n keyPrefix?: string;\n namespace: SessionNamespace;\n};\n\nconst defaultKeyPrefix = \"demiurge:session:\";\n\nconst createScript = `\nif redis.call(\"EXISTS\", KEYS[1]) == 1 then\n return 0\nend\nredis.call(\"SET\", KEYS[1], ARGV[1], \"PXAT\", ARGV[2])\nreturn 1\n`;\n\nconst updateScript = `\nlocal current = redis.call(\"GET\", KEYS[1])\nif not current or cjson.decode(current).version ~= tonumber(ARGV[1]) then\n return 0\nend\nredis.call(\"SET\", KEYS[1], ARGV[2], \"PXAT\", ARGV[3])\nreturn 1\n`;\n\nconst rotateScript = `\nlocal current = redis.call(\"GET\", KEYS[1])\nif not current or cjson.decode(current).version ~= tonumber(ARGV[1]) then\n return 0\nend\nif KEYS[1] ~= KEYS[2] and redis.call(\"EXISTS\", KEYS[2]) == 1 then\n return 0\nend\nredis.call(\"DEL\", KEYS[1])\nredis.call(\"SET\", KEYS[2], ARGV[2], \"PXAT\", ARGV[3])\nreturn 1\n`;\n\ntype RedisSessionCommands = {\n demiurgeSessionCreate: (\n key: string,\n record: string,\n expiresAt: string,\n ) => Promise<number>;\n demiurgeSessionRotate: (\n currentKey: string,\n nextKey: string,\n expectedVersion: string,\n record: string,\n expiresAt: string,\n ) => Promise<number>;\n demiurgeSessionUpdate: (\n key: string,\n expectedVersion: string,\n record: string,\n expiresAt: string,\n ) => Promise<number>;\n};\n\nfunction commands(client: Redis): Redis & RedisSessionCommands {\n // TYPE-EVIDENCE: the cast adds optional custom commands before the runtime checks install them.\n const withCommands = client as Redis & Partial<RedisSessionCommands>;\n\n if (!withCommands.demiurgeSessionCreate) {\n client.defineCommand(\"demiurgeSessionCreate\", {\n lua: createScript,\n numberOfKeys: 1,\n });\n }\n\n if (!withCommands.demiurgeSessionUpdate) {\n client.defineCommand(\"demiurgeSessionUpdate\", {\n lua: updateScript,\n numberOfKeys: 1,\n });\n }\n\n if (!withCommands.demiurgeSessionRotate) {\n client.defineCommand(\"demiurgeSessionRotate\", {\n lua: rotateScript,\n numberOfKeys: 2,\n });\n }\n\n // TYPE-EVIDENCE: the defineCommand calls install each command. The cast reflects the resulting client shape.\n return withCommands as Redis & RedisSessionCommands;\n}\n\nexport function createRedisSessionStore<\n TData extends SessionData = SessionData,\n>(options: RedisSessionStoreOptions): SessionStore<TData> {\n if (!options.client || typeof options.client.defineCommand !== \"function\") {\n throw new Error(\n \"Demiurge Redis session store requires an ioredis client. Pass a connected ioredis Redis instance as `client`.\",\n );\n }\n\n const client = commands(options.client);\n const namespace = serializeSessionNamespace(options.namespace);\n const prefix = `${options.keyPrefix ?? defaultKeyPrefix}${namespace}:`;\n const key = (id: string) => prefix + id;\n\n return {\n async create(candidate) {\n const record = toRecord(candidate, 0);\n\n try {\n const stored = await client.demiurgeSessionCreate(\n key(record.id),\n JSON.stringify(record),\n String(storeExpiration(record)),\n );\n return stored === 1\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n async destroy(id) {\n return await client.del(key(id)) === 1;\n },\n async read(id, now) {\n const raw = await client.get(key(id));\n\n if (!raw) {\n return undefined;\n }\n\n const record = parseRecord<TData>(raw);\n\n if (!record) {\n return undefined;\n }\n\n if (storeExpiration(record) <= now) {\n await client.del(key(id));\n return undefined;\n }\n\n return record;\n },\n async rotate(currentId, candidate, expectedVersion) {\n const record = toRecord(candidate, expectedVersion + 1);\n\n try {\n const stored = await client.demiurgeSessionRotate(\n key(currentId),\n key(record.id),\n String(expectedVersion),\n JSON.stringify(record),\n String(storeExpiration(record)),\n );\n return stored === 1\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n async update(candidate, expectedVersion) {\n const record = toRecord(candidate, expectedVersion + 1);\n\n try {\n const stored = await client.demiurgeSessionUpdate(\n key(record.id),\n String(expectedVersion),\n JSON.stringify(record),\n String(storeExpiration(record)),\n );\n return stored === 1\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n };\n}\n\nfunction parseRecord<TData extends SessionData>(\n raw: string,\n): SessionRecord<TData> | undefined {\n try {\n return parseSessionRecord<TData>(JSON.parse(raw));\n } catch {\n return undefined;\n }\n}\n\nfunction toRecord<TData extends SessionData>(\n candidate: SessionStoreCandidate<TData>,\n version: number,\n): SessionRecord<TData> {\n return structuredClone({ ...candidate, version });\n}\n\nfunction storeExpiration(record: SessionRecord) {\n return Math.min(record.expiresAt, record.idleExpiresAt ?? record.expiresAt);\n}\n"],"names":["defaultKeyPrefix","setScript","deleteScript","invalidateTagsScript","publishRefreshScript","releaseRefreshLeaseScript","commands","client","withCommands","createRedisCacheStore","options","prefix","entryPrefix","tagPrefix","leasePrefix","key","token","expiresAt","raw","tags","entry","incrementScript","createRedisRateLimitStore","windowMs","count","resetAt","createScript","updateScript","rotateScript","createRedisSessionStore","namespace","serializeSessionNamespace","id","candidate","record","toRecord","storeExpiration","now","parseRecord","currentId","expectedVersion","parseSessionRecord","version"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Redis } from "ioredis";
2
+ import type { RateLimitStore } from "../security/types";
3
+ export type RedisRateLimitStoreOptions = {
4
+ keyPrefix?: string;
5
+ client: Redis;
6
+ };
7
+ export declare function createRedisRateLimitStore(options: RedisRateLimitStoreOptions): RateLimitStore;
8
+ //# sourceMappingURL=rate-limit-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-store.d.ts","sourceRoot":"","sources":["../../src/redis/rate-limit-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,MAAM,0BAA0B,GAAG;IAMvC,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,MAAM,EAAE,KAAK,CAAC;CACf,CAAC;AAsDF,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,GAClC,cAAc,CAoBhB"}
@@ -0,0 +1,9 @@
1
+ import type { Redis } from "ioredis";
2
+ import { type SessionData, type SessionNamespace, type SessionStore } from "../security/session-store";
3
+ export type RedisSessionStoreOptions = {
4
+ client: Redis;
5
+ keyPrefix?: string;
6
+ namespace: SessionNamespace;
7
+ };
8
+ export declare function createRedisSessionStore<TData extends SessionData = SessionData>(options: RedisSessionStoreOptions): SessionStore<TData>;
9
+ //# sourceMappingURL=session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/redis/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAErB,KAAK,YAAY,EAElB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAoFF,wBAAgB,uBAAuB,CACrC,KAAK,SAAS,WAAW,GAAG,WAAW,EACvC,OAAO,EAAE,wBAAwB,GAAG,YAAY,CAAC,KAAK,CAAC,CAwFxD"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/redis/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAC;AAEjE,MAAM,MAAM,sBAAsB,GAAG;IAKnC,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,MAAM,EAAE,KAAK,CAAC;CACf,CAAC;AA0MF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,GAC9B,UAAU,CAiFZ"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/redis/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAC;AAEjE,MAAM,MAAM,sBAAsB,GAAG;IAKnC,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,MAAM,EAAE,KAAK,CAAC;CACf,CAAC;AA4MF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,GAC9B,UAAU,CAkFZ"}
@@ -1,10 +1,10 @@
1
- export { action, actionInput, } from "./action";
1
+ export { mutation, mutationInput, MutationValidationError, MUTATION_REQUEST_HEADER, MUTATION_REQUEST_VALUE, MUTATION_RESPONSE_MEDIA_TYPE, } from "./mutation";
2
2
  export { page } from "./page";
3
3
  export { defineMiddleware } from "./middleware";
4
4
  export { HTTP_ERROR_STATUSES, HttpError, httpError, isHttpError, } from "./http-error";
5
5
  export { html, json, jsonl, notFound, redirect, response, serverTiming, sse, stream, text, toResponse, } from "./response";
6
6
  export { webhook } from "./webhook";
7
- export type { ActionContext, ActionIdempotency, ActionInput, ActionOptions, } from "./action";
7
+ export type { MutationContext, MutationCapability, MutationIdempotency, MutationInput, MutationMethod, MutationMethodsOf, MutationOptions, MutationRevalidation, MutationRevalidationDeclaration, MutationValidation, MutationValidationIssue, } from "./mutation";
8
8
  export type { HttpErrorDetails, HttpErrorInit, HttpErrorStatus, } from "./http-error";
9
9
  export type { WebhookHmacAlgorithm, WebhookHmacContext, WebhookHmacEncoding, WebhookHmacOptions, } from "./webhook";
10
10
  export type { HtmlCapability, HttpRouteContext, HttpMethod, JsonCapability, JsonLinesCapability, JsonLinesSource, LayoutProps, MaybePromise, NotFoundCapability, NotFoundProps, PageDataContext, PageDataFunction, PageCapability, PageOptions, PageRenderMode, PageRenderOptions, PathVars, RawResponseCapability, RedirectCapability, ResponseOptions, ResponseCapability, RouteCapability, RouteContext, RouteErrorProps, RouteImporter, RouteDefaultComponent, RouteMiddleware, RouteMiddlewareNext, MiddlewareContextContribution, MiddlewareContextOf, RouteRequestContextFor, RouteRequestContexts, RequestContext, RouteModule, RoutePolicy, RouteProps, RouteValue, ServerTimingInput, ServerTimingMetric, ServerSentEvent, ServerSentEventSource, ServerSentEventsCapability, StaticPath, StaticPathsContext, StaticPathsFunction, StreamCapability, StreamChunk, StreamSource, TextCapability, } from "./types";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,WAAW,GACZ,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,GAAG,EACH,MAAM,EACN,IAAI,EACJ,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,aAAa,GACd,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,0BAA0B,EAC1B,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,GAAG,EACH,MAAM,EACN,IAAI,EACJ,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,+BAA+B,EAC/B,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,0BAA0B,EAC1B,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/route/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,6BAA6B,EAC7B,eAAe,EACf,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,SAAS,MAAM,EACrD,UAAU,EAAE,CACV,OAAO,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1C,IAAI,EAAE,mBAAmB,KACtB,YAAY,CAAC,QAAQ,CAAC,GAC1B,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAG3E"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/route/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,6BAA6B,EAC7B,eAAe,EACf,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,SAAS,MAAM,EACrD,UAAU,EAAE,CACV,OAAO,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1C,IAAI,EAAE,mBAAmB,KACtB,YAAY,CAAC,QAAQ,CAAC,GAC1B,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAI3E"}
@@ -0,0 +1,97 @@
1
+ import type { CacheDuration, CacheKey, CacheTag, IdempotencyStore } from "../data";
2
+ import type { CorsPolicy, RouteSecurityPolicy } from "../security";
3
+ import type { HttpRouteContext, MaybePromise, JsonCapability, RawResponseCapability, ResponseCapability, RouteRequestContextFor, ServerTimingInput } from "./types";
4
+ import type { StandardSchemaV1 } from "@standard-schema/spec";
5
+ declare const mutationInputFields: unique symbol;
6
+ export type MutationInput<TInput, TPath extends string = string, TValues extends object = RouteRequestContextFor<TPath>> = {
7
+ (context: HttpRouteContext<TPath, TValues>): MaybePromise<TInput>;
8
+ };
9
+ type TypedMutationInput<TInput, TPath extends string, TValues extends object, TField extends string> = MutationInput<TInput, TPath, TValues> & {
10
+ readonly [mutationInputFields]: {
11
+ field: TField;
12
+ input: TInput;
13
+ };
14
+ };
15
+ type MutationInputValue<TParser> = TParser extends {
16
+ readonly [mutationInputFields]: {
17
+ input: infer TInput;
18
+ };
19
+ } ? TInput : never;
20
+ type MutationInputField<TParser> = TParser extends {
21
+ readonly [mutationInputFields]: {
22
+ field: infer TField extends string;
23
+ };
24
+ } ? TField : never;
25
+ export declare const MUTATION_REQUEST_HEADER = "x-demiurge-mutation";
26
+ export declare const MUTATION_REQUEST_VALUE = "data;v=1";
27
+ export declare const MUTATION_RESPONSE_MEDIA_TYPE = "application/vnd.demiurge.mutation+json;v=1";
28
+ declare const mutationResultType: unique symbol;
29
+ export type MutationMethod = "POST" | "PUT" | "PATCH" | "DELETE";
30
+ export type MutationCapability<TResult = unknown, TField extends string = string, TPath extends string = string, TValues extends object = RouteRequestContextFor<TPath>> = RawResponseCapability<TPath, TValues> & {
31
+ mutation: true;
32
+ readonly [mutationResultType]: {
33
+ data: TResult;
34
+ fields: TField;
35
+ };
36
+ };
37
+ export type MutationMethodsOf<TModule> = {
38
+ [TMethod in keyof TModule as TMethod extends MutationMethod ? TModule[TMethod] extends MutationCapability ? TMethod : never : never]: TModule[TMethod] extends MutationCapability<infer TResult> ? TModule[TMethod] extends MutationCapability<TResult, infer TField> ? {
39
+ data: TResult;
40
+ fields: TField;
41
+ } : never : never;
42
+ };
43
+ type MutationResponseData<TResult> = Awaited<TResult> extends JsonCapability<infer TData, string, object> ? TData : unknown;
44
+ export type MutationValidationIssue<TField extends string = string> = {
45
+ code: string;
46
+ message: string;
47
+ path: readonly [] | readonly [TField, ...(string | number)[]];
48
+ };
49
+ export type MutationValidation<TField extends string = string> = {
50
+ issues: readonly MutationValidationIssue<TField>[];
51
+ };
52
+ export declare class MutationValidationError<TField extends string = string> extends Error {
53
+ readonly validation: MutationValidation<TField>;
54
+ constructor(validation: MutationValidation<TField>);
55
+ }
56
+ export type MutationContext<TInput, TPath extends string = string, TValues extends object = RouteRequestContextFor<TPath>> = HttpRouteContext<TPath, TValues> & {
57
+ input: TInput;
58
+ };
59
+ export type MutationIdempotency<TInput, TPath extends string = string, TValues extends object = RouteRequestContextFor<TPath>> = {
60
+ key: CacheKey | ((context: MutationContext<TInput, TPath, TValues>) => CacheKey);
61
+ store: IdempotencyStore;
62
+ ttl?: CacheDuration;
63
+ };
64
+ export type MutationRevalidation<TInput, TPath extends string = string, TValues extends object = RouteRequestContextFor<TPath>> = MutationRevalidationDeclaration | ((context: MutationContext<TInput, TPath, TValues>) => MaybePromise<MutationRevalidationDeclaration>);
65
+ export type MutationRevalidationDeclaration = {
66
+ keys?: readonly CacheKey[];
67
+ tags?: readonly CacheTag[];
68
+ };
69
+ export declare const MUTATION_REVALIDATION_HEADER = "x-demiurge-revalidate-tags";
70
+ export type MutationOptions<TInput, TPath extends string = string, TValues extends object = RouteRequestContextFor<TPath>, TResult extends Response | ResponseCapability<TPath, TValues> = Response | ResponseCapability<TPath, TValues>> = {
71
+ cors?: CorsPolicy;
72
+ handler: (context: MutationContext<NoInfer<TInput>, TPath, TValues>) => MaybePromise<TResult>;
73
+ idempotency?: MutationIdempotency<NoInfer<TInput>, TPath, TValues>;
74
+ input?: MutationInput<TInput, TPath, TValues>;
75
+ revalidateRoute?: boolean;
76
+ revalidate?: MutationRevalidation<NoInfer<TInput>, TPath, TValues>;
77
+ security?: RouteSecurityPolicy;
78
+ timing?: ServerTimingInput;
79
+ };
80
+ export declare function mutation<TParser extends TypedMutationInput<unknown, TPath, TValues, string>, TPath extends string = string, TValues extends object = RouteRequestContextFor<TPath>, TResult extends Response | ResponseCapability<TPath, TValues> = Response | ResponseCapability<TPath, TValues>>(options: Omit<MutationOptions<MutationInputValue<TParser>, TPath, TValues, TResult>, "input"> & {
81
+ input: TParser;
82
+ }): MutationCapability<MutationResponseData<TResult>, MutationInputField<TParser>, TPath, TValues>;
83
+ export declare function mutation<TInput, TPath extends string = string, TValues extends object = RouteRequestContextFor<TPath>, TResult extends Response | ResponseCapability<TPath, TValues> = Response | ResponseCapability<TPath, TValues>>(options: MutationOptions<TInput, TPath, TValues, TResult> & {
84
+ input: MutationInput<TInput, TPath, TValues>;
85
+ }): MutationCapability<MutationResponseData<TResult>, string, TPath, TValues>;
86
+ export declare function mutation<TPath extends string = string, TValues extends object = RouteRequestContextFor<TPath>, TResult extends Response | ResponseCapability<TPath, TValues> = Response | ResponseCapability<TPath, TValues>>(options: MutationOptions<undefined, TPath, TValues, TResult> & {
87
+ input?: undefined;
88
+ }): MutationCapability<MutationResponseData<TResult>, string, TPath, TValues>;
89
+ export declare const mutationInput: {
90
+ custom<TField extends string = string, TInput = unknown, TPath extends string = string, TValues extends object = RouteRequestContextFor<TPath>>(parse: (context: HttpRouteContext<TPath, TValues>) => MaybePromise<TInput>): TypedMutationInput<TInput, TPath, TValues, TField>;
91
+ form<TSchema extends StandardSchemaV1, TPath extends string = string, TValues extends object = RouteRequestContextFor<TPath>>(schema: TSchema, map: (form: FormData, context: HttpRouteContext<TPath, TValues>) => MaybePromise<StandardSchemaV1.InferInput<TSchema>>): TypedMutationInput<StandardSchemaV1.InferOutput<TSchema>, TPath, TValues, Extract<keyof StandardSchemaV1.InferOutput<TSchema>, string>>;
92
+ formData({ request }: HttpRouteContext): Promise<FormData>;
93
+ json({ request }: HttpRouteContext): Promise<unknown>;
94
+ text({ request }: HttpRouteContext): Promise<string>;
95
+ };
96
+ export {};
97
+ //# sourceMappingURL=mutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../../src/route/mutation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/route/response.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/route/response.ts"],"names":[],"mappings":"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"}