@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
@@ -0,0 +1,12 @@
1
+ import type { InlineConfig, PluginOption } from "vite";
2
+ import { type DemiurgeVitePluginOptions } from "../vite/plugin";
3
+ import type { DemiurgeConfig, ResolvedDemiurgeConfig } from "./types";
4
+ export type ReactPluginLoader = () => Promise<(...args: never[]) => PluginOption>;
5
+ export type CreateDemiurgeViteConfigOptions = {
6
+ config: ResolvedDemiurgeConfig;
7
+ loadReactPlugin?: ReactPluginLoader;
8
+ overrides?: InlineConfig;
9
+ };
10
+ export declare function createDemiurgeViteConfig(options: CreateDemiurgeViteConfigOptions): Promise<InlineConfig>;
11
+ export declare function toPluginOptions(config: DemiurgeConfig): DemiurgeVitePluginOptions;
12
+ //# sourceMappingURL=vite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../../src/config/vite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAc,MAAM,MAAM,CAAC;AACnE,OAAO,EAAY,KAAK,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAGtE,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,YAAY,CAAC,CAAC;AAElF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,EAAE,sBAAsB,CAAC;IAC/B,eAAe,CAAC,EAAE,iBAAiB,CAAC;IACpC,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B,CAAC;AAIF,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,YAAY,CAAC,CAwCvB;AAID,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,GACrB,yBAAyB,CAgC3B"}
@@ -11,6 +11,8 @@ type MaybePromise<T> = T | Promise<T>;
11
11
  export type CacheRequest<TResult> = {
12
12
  fn: () => MaybePromise<TResult>;
13
13
  key: CacheKey;
14
+ locale?: "neutral";
15
+ notFoundTtl?: CacheDuration;
14
16
  scope?: CacheScope;
15
17
  staleWhileRevalidate?: CacheDuration;
16
18
  tags?: readonly CacheTag[];
@@ -19,6 +21,8 @@ export type CacheRequest<TResult> = {
19
21
  export type QueryDefinition<TArgs extends readonly unknown[], TResult> = {
20
22
  fn: (...args: TArgs) => MaybePromise<TResult>;
21
23
  key: (...args: TArgs) => CacheKey;
24
+ locale?: "neutral";
25
+ notFoundTtl?: CacheDuration;
22
26
  scope?: CacheScope;
23
27
  staleWhileRevalidate?: CacheDuration;
24
28
  tags?: (...args: TArgs) => readonly CacheTag[];
@@ -37,6 +41,7 @@ export type CacheNamespace = {
37
41
  };
38
42
  export type CacheStoreEntry = {
39
43
  expiresAt: number | null;
44
+ negative?: boolean;
40
45
  staleUntil: number | null;
41
46
  tags: readonly string[];
42
47
  value: unknown;
@@ -81,6 +86,11 @@ export type MemoryCacheStoreOptions = {
81
86
  now?: () => number;
82
87
  };
83
88
  export declare function query<TArgs extends readonly unknown[], TResult>(definition: QueryDefinition<TArgs, TResult>): Query<TArgs, TResult>;
89
+ export declare class CacheNotFoundError extends Error {
90
+ constructor(message?: string);
91
+ }
92
+ export declare function cacheNotFound(message?: string): never;
93
+ export declare function isCacheNotFoundError(error: unknown): error is CacheNotFoundError;
84
94
  export declare function tag(id: string): CacheTag;
85
95
  export declare function defineTags<TTags extends Record<string, (...args: never[]) => CacheTag>>(tags: TTags): TTags;
86
96
  export declare function createCache(options: CreateCacheOptions): Cache;
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/data/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/data/cache.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/data/idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,SAAS,CAAC;AAEjB,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,kBAAkB,CAAC,OAAO,IAAI;IACxC,EAAE,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAChC,GAAG,EAAE,QAAQ,CAAC;IACd,GAAG,CAAC,EAAE,aAAa,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,OAAO,IAAI;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,CAAC,OAAO,EACX,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,KACjC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;CAC1C,CAAC;AAQF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAKF,wBAAgB,4BAA4B,CAC1C,OAAO,GAAE,6BAAkC,GAC1C,gBAAgB,CAwElB;AAwBD,wBAAgB,qBAAqB,CAAC,OAAO,EAC3C,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,uCAGrC"}
1
+ {"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/data/idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,SAAS,CAAC;AAEjB,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,kBAAkB,CAAC,OAAO,IAAI;IACxC,EAAE,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAChC,GAAG,EAAE,QAAQ,CAAC;IACd,GAAG,CAAC,EAAE,aAAa,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,OAAO,IAAI;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,CAAC,OAAO,EACX,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,KACjC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;CAC1C,CAAC;AAQF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAKF,wBAAgB,4BAA4B,CAC1C,OAAO,GAAE,6BAAkC,GAC1C,gBAAgB,CA0ElB;AA8BD,wBAAgB,qBAAqB,CAAC,OAAO,EAC3C,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,uCAGrC"}
@@ -1,5 +1,7 @@
1
- export { createCache, createInvalidation, createMemoryCache, createMemoryCacheStore, defineTags, parseCacheDuration, query, serializeCacheKey, serializeCacheNamespace, serializeCacheTag, tag, } from "./cache";
1
+ export { cacheNotFound, CacheNotFoundError, createCache, createInvalidation, createMemoryCache, createMemoryCacheStore, defineTags, isCacheNotFoundError, parseCacheDuration, query, serializeCacheKey, serializeCacheNamespace, serializeCacheTag, tag, } from "./cache";
2
2
  export { createMemoryIdempotencyStore, runIdempotentMutation, } from "./idempotency";
3
+ export { createTieredCacheStore } from "./tiered";
3
4
  export type { Cache, CacheDuration, CacheKey, CacheKeyPart, CacheRequest, CacheScope, CacheNamespace, CacheStore, CacheStoreEntry, CacheTag, CreateCacheOptions, Invalidation, InvalidationResult, Query, QueryDefinition, MemoryCacheOptions, MemoryCacheStoreOptions, } from "./cache";
5
+ export type { TieredCacheStoreOptions } from "./tiered";
4
6
  export type { IdempotencyRequest, IdempotencyResult, IdempotencyStore, MemoryIdempotencyStoreOptions, } from "./idempotency";
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,KAAK,EACL,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,GAAG,GACJ,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,KAAK,EACL,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,EACV,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,KAAK,EACL,eAAe,EACf,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,6BAA6B,GAC9B,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,EACL,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,GAAG,GACJ,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,YAAY,EACV,KAAK,EACL,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,EACV,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,KAAK,EACL,eAAe,EACf,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACxD,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,6BAA6B,GAC9B,MAAM,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/data/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,SAAS,CAAC;AAE3D,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,iBAAiB,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;AAE/D,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,iBAAiB,iBA8E/B;AAED,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,iBAAiB,iBAwF/B"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/data/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,SAAS,CAAC;AAE3D,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,iBAAiB,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;AAE/D,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,iBAAiB,iBA2G/B;AAED,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,iBAAiB,iBAwF/B"}
@@ -1,134 +1,156 @@
1
- async function d(i) {
2
- const e = await i(), s = `demiurge-contract:${Date.now()}:${Math.random()}`, t = `${s}:alpha`, l = `${s}:beta`, o = `${s}:gamma`, n = `${s}:tag:alpha`, u = `${s}:tag:beta`, r = Date.now() + 6e4, h = {
3
- expiresAt: r,
4
- staleUntil: r + 5e3,
5
- tags: [n],
1
+ async function m(i) {
2
+ const e = await i(), s = `demiurge-contract:${Date.now()}:${Math.random()}`, a = `${s}:alpha`, o = `${s}:beta`, u = `${s}:gamma`, r = `${s}:delta`, l = `${s}:tag:alpha`, g = `${s}:tag:beta`, c = `${s}:tag:delta`, n = Date.now() + 6e4, h = {
3
+ expiresAt: n,
4
+ staleUntil: n + 5e3,
5
+ tags: [l],
6
6
  value: { id: "alpha", revision: 1 }
7
7
  };
8
8
  try {
9
- a(
10
- await e.get(t) === void 0,
9
+ t(
10
+ await e.get(a) === void 0,
11
11
  "get() must return undefined for a missing key"
12
- ), await e.set(t, h), w(await e.get(t), h, "set() then get()");
13
- const c = {
12
+ ), await e.set(a, h), d(await e.get(a), h, "set() then get()");
13
+ const f = {
14
14
  ...h,
15
15
  value: { id: "alpha", revision: 2 }
16
16
  };
17
- await e.set(t, c), w(
18
- await e.get(t),
19
- c,
17
+ await e.set(a, f), d(
18
+ await e.get(a),
19
+ f,
20
20
  "set() must replace an existing key"
21
- ), await e.set(l, {
22
- expiresAt: r + 1e4,
23
- staleUntil: r + 15e3,
24
- tags: [u],
21
+ ), await e.set(o, {
22
+ expiresAt: n + 1e4,
23
+ staleUntil: n + 15e3,
24
+ tags: [g],
25
25
  value: "beta"
26
- }), await e.set(o, {
27
- expiresAt: r + 2e4,
28
- staleUntil: r + 25e3,
29
- tags: [n, u],
26
+ }), await e.set(u, {
27
+ expiresAt: n + 2e4,
28
+ staleUntil: n + 25e3,
29
+ tags: [l, g],
30
30
  value: ["gamma"]
31
- }), a(
32
- await e.invalidateTags([n]) === 2,
31
+ }), t(
32
+ await e.invalidateTags([l]) === 2,
33
33
  "invalidateTags() must return the number of entries deleted, counting each entry once"
34
- ), a(
35
- await e.get(t) === void 0 && await e.get(o) === void 0,
34
+ ), t(
35
+ await e.get(a) === void 0 && await e.get(u) === void 0,
36
36
  "invalidateTags() must delete every entry carrying a matching tag"
37
- ), a(
38
- (await e.get(l))?.value === "beta",
37
+ ), t(
38
+ (await e.get(o))?.value === "beta",
39
39
  "invalidateTags() must preserve entries with no matching tag"
40
- ), a(
41
- await e.delete(l) === !0,
40
+ ), t(
41
+ await e.delete(o) === !0,
42
42
  "delete() must report an existing key"
43
- ), a(
44
- await e.delete(l) === !1,
43
+ ), t(
44
+ await e.delete(o) === !1,
45
45
  "delete() must report a missing key"
46
46
  );
47
+ const w = {
48
+ expiresAt: n,
49
+ negative: !0,
50
+ staleUntil: n,
51
+ tags: [c],
52
+ value: "not found"
53
+ };
54
+ await e.set(r, w), d(
55
+ await e.get(r),
56
+ w,
57
+ "set() then get() for a negative entry"
58
+ ), t(
59
+ await e.invalidateTags([c]) === 1,
60
+ "invalidateTags() must delete a negative entry carrying a matching tag"
61
+ ), t(
62
+ await e.get(r) === void 0,
63
+ "invalidateTags() must remove a negative entry the same as a positive one"
64
+ );
47
65
  } finally {
48
66
  await Promise.all([
49
- e.delete(t),
50
- e.delete(l),
51
- e.delete(o)
67
+ e.delete(a),
68
+ e.delete(o),
69
+ e.delete(u),
70
+ e.delete(r)
52
71
  ]);
53
72
  }
54
73
  }
55
- async function m(i) {
56
- const e = await i(), s = `demiurge-refresh-contract:${Date.now()}:${Math.random()}`, t = `${s}:entry`, l = `${s}:tag`, o = `${s}:first`, n = `${s}:second`, u = Date.now() + 6e4;
57
- a(
74
+ async function v(i) {
75
+ const e = await i(), s = `demiurge-refresh-contract:${Date.now()}:${Math.random()}`, a = `${s}:entry`, o = `${s}:tag`, u = `${s}:first`, r = `${s}:second`, l = Date.now() + 6e4;
76
+ t(
58
77
  !!(e.acquireRefreshLease && e.publishRefresh && e.releaseRefreshLease),
59
78
  "SWR support requires acquireRefreshLease(), publishRefresh(), and releaseRefreshLease()"
60
79
  );
61
- const r = e.acquireRefreshLease, h = e.publishRefresh, c = e.releaseRefreshLease, f = {
80
+ const g = e.acquireRefreshLease, c = e.publishRefresh, n = e.releaseRefreshLease, h = {
62
81
  expiresAt: Date.now() - 1,
63
82
  staleUntil: Date.now() + 12e4,
64
- tags: [l],
83
+ tags: [o],
65
84
  value: "original"
66
- }, g = {
67
- ...f,
85
+ }, f = {
86
+ ...h,
68
87
  expiresAt: Date.now() + 6e4,
69
88
  value: "refreshed"
70
89
  };
71
90
  try {
72
- await e.set(t, f), a(
73
- await r(t, o, u),
91
+ await e.set(a, h), t(
92
+ await g(a, u, l),
74
93
  "acquireRefreshLease() must acquire an unowned key"
75
- ), a(
76
- !await r(t, n, u),
94
+ ), t(
95
+ !await g(a, r, l),
77
96
  "acquireRefreshLease() must exclude a second owner"
78
- ), a(
79
- !await h(t, n, g),
97
+ ), t(
98
+ !await c(a, r, f),
80
99
  "publishRefresh() must reject a non-owner token"
81
- ), await c(t, n), a(
82
- !await r(t, n, u),
100
+ ), await n(a, r), t(
101
+ !await g(a, r, l),
83
102
  "releaseRefreshLease() must not release another owner's lease"
84
- ), a(
85
- await h(t, o, g),
103
+ ), t(
104
+ await c(a, u, f),
86
105
  "publishRefresh() must atomically publish for the current owner"
87
- ), w(
88
- await e.get(t),
89
- g,
106
+ ), d(
107
+ await e.get(a),
108
+ f,
90
109
  "publishRefresh() for the current owner"
91
- ), a(
92
- await r(t, n, u),
110
+ ), t(
111
+ await g(a, r, l),
93
112
  "successful publication must release the refresh lease"
94
- ), a(await e.delete(t), "delete() must remove the refreshed entry"), a(
95
- !await h(t, n, f),
113
+ ), t(await e.delete(a), "delete() must remove the refreshed entry"), t(
114
+ !await c(a, r, h),
96
115
  "delete() must cancel an in-flight refresh lease"
97
- ), await e.set(t, f), a(
98
- await r(t, o, u),
116
+ ), await e.set(a, h), t(
117
+ await g(a, u, l),
99
118
  "a lease must be reusable after deletion"
100
- ), a(
101
- await e.invalidateTags([l]) === 1,
119
+ ), t(
120
+ await e.invalidateTags([o]) === 1,
102
121
  "invalidateTags() must remove the leased entry"
103
- ), a(
104
- !await h(t, o, g),
122
+ ), t(
123
+ !await c(a, u, f),
105
124
  "tag invalidation must cancel an in-flight refresh lease"
106
125
  );
107
126
  } finally {
108
- await e.delete(t);
127
+ await e.delete(a);
109
128
  }
110
129
  }
111
- function w(i, e, s) {
112
- a(!!i, `${s} must preserve the entry`), a(
130
+ function d(i, e, s) {
131
+ t(!!i, `${s} must preserve the entry`), t(
113
132
  i?.expiresAt === e.expiresAt,
114
133
  `${s} must preserve expiresAt`
115
- ), a(
134
+ ), t(
135
+ !!i?.negative == !!e.negative,
136
+ `${s} must preserve the negative flag`
137
+ ), t(
116
138
  i?.staleUntil === e.staleUntil,
117
139
  `${s} must preserve staleUntil`
118
- ), a(
140
+ ), t(
119
141
  JSON.stringify(i?.tags) === JSON.stringify(e.tags),
120
142
  `${s} must preserve tags`
121
- ), a(
143
+ ), t(
122
144
  JSON.stringify(i?.value) === JSON.stringify(e.value),
123
145
  `${s} must preserve JSON-compatible values`
124
146
  );
125
147
  }
126
- function a(i, e) {
148
+ function t(i, e) {
127
149
  if (!i)
128
150
  throw new Error(`Cache store contract failed: ${e}.`);
129
151
  }
130
152
  export {
131
- d as verifyCacheStoreContract,
132
- m as verifyCacheStoreRefreshContract
153
+ m as verifyCacheStoreContract,
154
+ v as verifyCacheStoreRefreshContract
133
155
  };
134
156
  //# sourceMappingURL=testing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sources":["../../src/data/testing.ts"],"sourcesContent":["import type { CacheStore, CacheStoreEntry } from \"./cache\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type CacheStoreFactory = () => MaybePromise<CacheStore>;\n\nexport async function verifyCacheStoreContract(\n createStore: CacheStoreFactory,\n) {\n const store = await createStore();\n const prefix = `demiurge-contract:${Date.now()}:${Math.random()}`;\n const alphaKey = `${prefix}:alpha`;\n const betaKey = `${prefix}:beta`;\n const gammaKey = `${prefix}:gamma`;\n const alphaTag = `${prefix}:tag:alpha`;\n const betaTag = `${prefix}:tag:beta`;\n const future = Date.now() + 60_000;\n const alpha = {\n expiresAt: future,\n staleUntil: future + 5_000,\n tags: [alphaTag],\n value: { id: \"alpha\", revision: 1 },\n } satisfies CacheStoreEntry;\n\n try {\n assert(\n await store.get(alphaKey) === undefined,\n \"get() must return undefined for a missing key\",\n );\n\n await store.set(alphaKey, alpha);\n assertEntry(await store.get(alphaKey), alpha, \"set() then get()\");\n\n const updatedAlpha = {\n ...alpha,\n value: { id: \"alpha\", revision: 2 },\n } satisfies CacheStoreEntry;\n await store.set(alphaKey, updatedAlpha);\n assertEntry(\n await store.get(alphaKey),\n updatedAlpha,\n \"set() must replace an existing key\",\n );\n\n await store.set(betaKey, {\n expiresAt: future + 10_000,\n staleUntil: future + 15_000,\n tags: [betaTag],\n value: \"beta\",\n });\n await store.set(gammaKey, {\n expiresAt: future + 20_000,\n staleUntil: future + 25_000,\n tags: [alphaTag, betaTag],\n value: [\"gamma\"],\n });\n\n assert(\n await store.invalidateTags([alphaTag]) === 2,\n \"invalidateTags() must return the number of entries deleted, counting each entry once\",\n );\n assert(\n await store.get(alphaKey) === undefined &&\n await store.get(gammaKey) === undefined,\n \"invalidateTags() must delete every entry carrying a matching tag\",\n );\n assert(\n (await store.get(betaKey))?.value === \"beta\",\n \"invalidateTags() must preserve entries with no matching tag\",\n );\n assert(\n await store.delete(betaKey) === true,\n \"delete() must report an existing key\",\n );\n assert(\n await store.delete(betaKey) === false,\n \"delete() must report a missing key\",\n );\n } finally {\n await Promise.all([\n store.delete(alphaKey),\n store.delete(betaKey),\n store.delete(gammaKey),\n ]);\n }\n}\n\nexport async function verifyCacheStoreRefreshContract(\n createStore: CacheStoreFactory,\n) {\n const store = await createStore();\n const prefix = `demiurge-refresh-contract:${Date.now()}:${Math.random()}`;\n const key = `${prefix}:entry`;\n const tag = `${prefix}:tag`;\n const firstToken = `${prefix}:first`;\n const secondToken = `${prefix}:second`;\n const leaseExpiresAt = Date.now() + 60_000;\n\n assert(\n Boolean(\n store.acquireRefreshLease &&\n store.publishRefresh &&\n store.releaseRefreshLease,\n ),\n \"SWR support requires acquireRefreshLease(), publishRefresh(), and releaseRefreshLease()\",\n );\n\n const acquireRefreshLease = store.acquireRefreshLease!;\n const publishRefresh = store.publishRefresh!;\n const releaseRefreshLease = store.releaseRefreshLease!;\n const original = {\n expiresAt: Date.now() - 1,\n staleUntil: Date.now() + 120_000,\n tags: [tag],\n value: \"original\",\n } satisfies CacheStoreEntry;\n const refreshed = {\n ...original,\n expiresAt: Date.now() + 60_000,\n value: \"refreshed\",\n } satisfies CacheStoreEntry;\n\n try {\n await store.set(key, original);\n assert(\n await acquireRefreshLease(key, firstToken, leaseExpiresAt),\n \"acquireRefreshLease() must acquire an unowned key\",\n );\n assert(\n !await acquireRefreshLease(key, secondToken, leaseExpiresAt),\n \"acquireRefreshLease() must exclude a second owner\",\n );\n assert(\n !await publishRefresh(key, secondToken, refreshed),\n \"publishRefresh() must reject a non-owner token\",\n );\n await releaseRefreshLease(key, secondToken);\n assert(\n !await acquireRefreshLease(key, secondToken, leaseExpiresAt),\n \"releaseRefreshLease() must not release another owner's lease\",\n );\n assert(\n await publishRefresh(key, firstToken, refreshed),\n \"publishRefresh() must atomically publish for the current owner\",\n );\n assertEntry(\n await store.get(key),\n refreshed,\n \"publishRefresh() for the current owner\",\n );\n assert(\n await acquireRefreshLease(key, secondToken, leaseExpiresAt),\n \"successful publication must release the refresh lease\",\n );\n assert(await store.delete(key), \"delete() must remove the refreshed entry\");\n assert(\n !await publishRefresh(key, secondToken, original),\n \"delete() must cancel an in-flight refresh lease\",\n );\n\n await store.set(key, original);\n assert(\n await acquireRefreshLease(key, firstToken, leaseExpiresAt),\n \"a lease must be reusable after deletion\",\n );\n assert(\n await store.invalidateTags([tag]) === 1,\n \"invalidateTags() must remove the leased entry\",\n );\n assert(\n !await publishRefresh(key, firstToken, refreshed),\n \"tag invalidation must cancel an in-flight refresh lease\",\n );\n } finally {\n await store.delete(key);\n }\n}\n\nfunction assertEntry(\n actual: CacheStoreEntry | undefined,\n expected: CacheStoreEntry,\n operation: string,\n) {\n assert(Boolean(actual), `${operation} must preserve the entry`);\n assert(\n actual?.expiresAt === expected.expiresAt,\n `${operation} must preserve expiresAt`,\n );\n assert(\n actual?.staleUntil === expected.staleUntil,\n `${operation} must preserve staleUntil`,\n );\n assert(\n JSON.stringify(actual?.tags) === JSON.stringify(expected.tags),\n `${operation} must preserve tags`,\n );\n assert(\n JSON.stringify(actual?.value) === JSON.stringify(expected.value),\n `${operation} must preserve JSON-compatible values`,\n );\n}\n\nfunction assert(condition: boolean, requirement: string): asserts condition {\n if (!condition) {\n throw new Error(`Cache store contract failed: ${requirement}.`);\n }\n}\n"],"names":["verifyCacheStoreContract","createStore","store","prefix","alphaKey","betaKey","gammaKey","alphaTag","betaTag","future","alpha","assert","assertEntry","updatedAlpha","verifyCacheStoreRefreshContract","key","tag","firstToken","secondToken","leaseExpiresAt","acquireRefreshLease","publishRefresh","releaseRefreshLease","original","refreshed","actual","expected","operation","condition","requirement"],"mappings":"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"}
1
+ {"version":3,"file":"testing.js","sources":["../../src/data/testing.ts"],"sourcesContent":["import type { CacheStore, CacheStoreEntry } from \"./cache\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type CacheStoreFactory = () => MaybePromise<CacheStore>;\n\nexport async function verifyCacheStoreContract(\n createStore: CacheStoreFactory,\n) {\n const store = await createStore();\n const prefix = `demiurge-contract:${Date.now()}:${Math.random()}`;\n const alphaKey = `${prefix}:alpha`;\n const betaKey = `${prefix}:beta`;\n const gammaKey = `${prefix}:gamma`;\n const deltaKey = `${prefix}:delta`;\n const alphaTag = `${prefix}:tag:alpha`;\n const betaTag = `${prefix}:tag:beta`;\n const deltaTag = `${prefix}:tag:delta`;\n const future = Date.now() + 60_000;\n const alpha = {\n expiresAt: future,\n staleUntil: future + 5_000,\n tags: [alphaTag],\n value: { id: \"alpha\", revision: 1 },\n } satisfies CacheStoreEntry;\n\n try {\n assert(\n await store.get(alphaKey) === undefined,\n \"get() must return undefined for a missing key\",\n );\n\n await store.set(alphaKey, alpha);\n assertEntry(await store.get(alphaKey), alpha, \"set() then get()\");\n\n const updatedAlpha = {\n ...alpha,\n value: { id: \"alpha\", revision: 2 },\n } satisfies CacheStoreEntry;\n await store.set(alphaKey, updatedAlpha);\n assertEntry(\n await store.get(alphaKey),\n updatedAlpha,\n \"set() must replace an existing key\",\n );\n\n await store.set(betaKey, {\n expiresAt: future + 10_000,\n staleUntil: future + 15_000,\n tags: [betaTag],\n value: \"beta\",\n });\n await store.set(gammaKey, {\n expiresAt: future + 20_000,\n staleUntil: future + 25_000,\n tags: [alphaTag, betaTag],\n value: [\"gamma\"],\n });\n\n assert(\n await store.invalidateTags([alphaTag]) === 2,\n \"invalidateTags() must return the number of entries deleted, counting each entry once\",\n );\n assert(\n await store.get(alphaKey) === undefined &&\n await store.get(gammaKey) === undefined,\n \"invalidateTags() must delete every entry carrying a matching tag\",\n );\n assert(\n (await store.get(betaKey))?.value === \"beta\",\n \"invalidateTags() must preserve entries with no matching tag\",\n );\n assert(\n await store.delete(betaKey) === true,\n \"delete() must report an existing key\",\n );\n assert(\n await store.delete(betaKey) === false,\n \"delete() must report a missing key\",\n );\n\n // A negative entry (a loader's `cacheNotFound()` result) round-trips\n // like any other entry, and tag invalidation clears it the same way it\n // clears a positive result.\n const delta = {\n expiresAt: future,\n negative: true,\n staleUntil: future,\n tags: [deltaTag],\n value: \"not found\",\n } satisfies CacheStoreEntry;\n\n await store.set(deltaKey, delta);\n assertEntry(\n await store.get(deltaKey),\n delta,\n \"set() then get() for a negative entry\",\n );\n assert(\n await store.invalidateTags([deltaTag]) === 1,\n \"invalidateTags() must delete a negative entry carrying a matching tag\",\n );\n assert(\n await store.get(deltaKey) === undefined,\n \"invalidateTags() must remove a negative entry the same as a positive one\",\n );\n } finally {\n await Promise.all([\n store.delete(alphaKey),\n store.delete(betaKey),\n store.delete(gammaKey),\n store.delete(deltaKey),\n ]);\n }\n}\n\nexport async function verifyCacheStoreRefreshContract(\n createStore: CacheStoreFactory,\n) {\n const store = await createStore();\n const prefix = `demiurge-refresh-contract:${Date.now()}:${Math.random()}`;\n const key = `${prefix}:entry`;\n const tag = `${prefix}:tag`;\n const firstToken = `${prefix}:first`;\n const secondToken = `${prefix}:second`;\n const leaseExpiresAt = Date.now() + 60_000;\n\n assert(\n Boolean(\n store.acquireRefreshLease &&\n store.publishRefresh &&\n store.releaseRefreshLease,\n ),\n \"SWR support requires acquireRefreshLease(), publishRefresh(), and releaseRefreshLease()\",\n );\n\n const acquireRefreshLease = store.acquireRefreshLease!;\n const publishRefresh = store.publishRefresh!;\n const releaseRefreshLease = store.releaseRefreshLease!;\n const original = {\n expiresAt: Date.now() - 1,\n staleUntil: Date.now() + 120_000,\n tags: [tag],\n value: \"original\",\n } satisfies CacheStoreEntry;\n const refreshed = {\n ...original,\n expiresAt: Date.now() + 60_000,\n value: \"refreshed\",\n } satisfies CacheStoreEntry;\n\n try {\n await store.set(key, original);\n assert(\n await acquireRefreshLease(key, firstToken, leaseExpiresAt),\n \"acquireRefreshLease() must acquire an unowned key\",\n );\n assert(\n !await acquireRefreshLease(key, secondToken, leaseExpiresAt),\n \"acquireRefreshLease() must exclude a second owner\",\n );\n assert(\n !await publishRefresh(key, secondToken, refreshed),\n \"publishRefresh() must reject a non-owner token\",\n );\n await releaseRefreshLease(key, secondToken);\n assert(\n !await acquireRefreshLease(key, secondToken, leaseExpiresAt),\n \"releaseRefreshLease() must not release another owner's lease\",\n );\n assert(\n await publishRefresh(key, firstToken, refreshed),\n \"publishRefresh() must atomically publish for the current owner\",\n );\n assertEntry(\n await store.get(key),\n refreshed,\n \"publishRefresh() for the current owner\",\n );\n assert(\n await acquireRefreshLease(key, secondToken, leaseExpiresAt),\n \"successful publication must release the refresh lease\",\n );\n assert(await store.delete(key), \"delete() must remove the refreshed entry\");\n assert(\n !await publishRefresh(key, secondToken, original),\n \"delete() must cancel an in-flight refresh lease\",\n );\n\n await store.set(key, original);\n assert(\n await acquireRefreshLease(key, firstToken, leaseExpiresAt),\n \"a lease must be reusable after deletion\",\n );\n assert(\n await store.invalidateTags([tag]) === 1,\n \"invalidateTags() must remove the leased entry\",\n );\n assert(\n !await publishRefresh(key, firstToken, refreshed),\n \"tag invalidation must cancel an in-flight refresh lease\",\n );\n } finally {\n await store.delete(key);\n }\n}\n\nfunction assertEntry(\n actual: CacheStoreEntry | undefined,\n expected: CacheStoreEntry,\n operation: string,\n) {\n assert(Boolean(actual), `${operation} must preserve the entry`);\n assert(\n actual?.expiresAt === expected.expiresAt,\n `${operation} must preserve expiresAt`,\n );\n assert(\n Boolean(actual?.negative) === Boolean(expected.negative),\n `${operation} must preserve the negative flag`,\n );\n assert(\n actual?.staleUntil === expected.staleUntil,\n `${operation} must preserve staleUntil`,\n );\n assert(\n JSON.stringify(actual?.tags) === JSON.stringify(expected.tags),\n `${operation} must preserve tags`,\n );\n assert(\n JSON.stringify(actual?.value) === JSON.stringify(expected.value),\n `${operation} must preserve JSON-compatible values`,\n );\n}\n\nfunction assert(condition: boolean, requirement: string): asserts condition {\n if (!condition) {\n throw new Error(`Cache store contract failed: ${requirement}.`);\n }\n}\n"],"names":["verifyCacheStoreContract","createStore","store","prefix","alphaKey","betaKey","gammaKey","deltaKey","alphaTag","betaTag","deltaTag","future","alpha","assert","assertEntry","updatedAlpha","delta","verifyCacheStoreRefreshContract","key","tag","firstToken","secondToken","leaseExpiresAt","acquireRefreshLease","publishRefresh","releaseRefreshLease","original","refreshed","actual","expected","operation","condition","requirement"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CacheStore } from "./cache";
2
+ export type TieredCacheStoreOptions = {
3
+ l1: CacheStore;
4
+ l2: CacheStore;
5
+ };
6
+ export declare function createTieredCacheStore(options: TieredCacheStoreOptions): CacheStore;
7
+ //# sourceMappingURL=tiered.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiered.d.ts","sourceRoot":"","sources":["../../src/data/tiered.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,MAAM,uBAAuB,GAAG;IAGpC,EAAE,EAAE,UAAU,CAAC;IAKf,EAAE,EAAE,UAAU,CAAC;CAChB,CAAC;AAiBF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,UAAU,CAqEZ"}
@@ -0,0 +1,25 @@
1
+ type MaybePromise<T> = T | Promise<T>;
2
+ export type DeploymentCapability = "clientAddress" | "readiness" | "repeatedHeaders" | "requestUrl" | "securityHeaders" | "sharedCache" | "staticAssets" | "streaming";
3
+ export type DeploymentClaims = Record<DeploymentCapability, boolean>;
4
+ export type DeploymentReadinessHost = {
5
+ afterShutdown: () => MaybePromise<Response>;
6
+ ready: () => MaybePromise<Response>;
7
+ shutdown: () => MaybePromise<void>;
8
+ };
9
+ export type DeploymentSharedCacheHost = {
10
+ readFromPeer: (key: string) => MaybePromise<Response>;
11
+ writeFromOrigin: (key: string, value: string) => MaybePromise<Response>;
12
+ };
13
+ export type DeploymentContractProbes = {
14
+ clientAddress?: (forwardedFor: string) => MaybePromise<Response>;
15
+ readiness?: () => MaybePromise<DeploymentReadinessHost>;
16
+ repeatedHeaders?: () => MaybePromise<Response>;
17
+ requestUrl?: (pathname: string, search: string) => MaybePromise<Response>;
18
+ securityHeaders?: () => MaybePromise<Response>;
19
+ sharedCache?: () => MaybePromise<DeploymentSharedCacheHost>;
20
+ staticAssets?: () => MaybePromise<Response>;
21
+ streaming?: () => MaybePromise<Response>;
22
+ };
23
+ export declare function verifyDeploymentContract(claims: DeploymentClaims, probes: DeploymentContractProbes): Promise<void>;
24
+ export {};
25
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/deployment/testing.ts"],"names":[],"mappings":"AAcA,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,oBAAoB,GAC5B,eAAe,GACf,WAAW,GACX,iBAAiB,GACjB,YAAY,GACZ,iBAAiB,GACjB,aAAa,GACb,cAAc,GACd,WAAW,CAAC;AAEhB,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;AAErE,MAAM,MAAM,uBAAuB,GAAG;IACpC,aAAa,EAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC5C,KAAK,EAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtD,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;CACzE,CAAC;AAKF,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IACjE,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC,uBAAuB,CAAC,CAAC;IACxD,eAAe,CAAC,EAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/C,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1E,eAAe,CAAC,EAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAC5D,YAAY,CAAC,EAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;CAC1C,CAAC;AAeF,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,wBAAwB,iBAmDjC"}
@@ -0,0 +1,171 @@
1
+ const y = [
2
+ "clientAddress",
3
+ "readiness",
4
+ "repeatedHeaders",
5
+ "requestUrl",
6
+ "securityHeaders",
7
+ "sharedCache",
8
+ "staticAssets",
9
+ "streaming"
10
+ ], f = /'nonce-([^']+)'/;
11
+ async function b(a, e) {
12
+ for (const t of y) {
13
+ const n = a[t], r = e[t];
14
+ s(
15
+ typeof n == "boolean",
16
+ `a deployment must declare capability "${t}" as a boolean`
17
+ ), s(
18
+ !n || !!r,
19
+ `capability "${t}" is declared true and needs a probe that proves it`
20
+ ), s(
21
+ n || !r,
22
+ `capability "${t}" has a probe but the deployment declares it false`
23
+ );
24
+ }
25
+ e.requestUrl && await m(e.requestUrl), e.clientAddress && await w(e.clientAddress), e.streaming && await p(e.streaming), e.repeatedHeaders && await g(e.repeatedHeaders), e.staticAssets && await $(e.staticAssets), e.securityHeaders && await S(e.securityHeaders), e.sharedCache && await C(e.sharedCache), e.readiness && await v(e.readiness);
26
+ }
27
+ async function m(a) {
28
+ const e = "/deployment-contract/request-url-probe", t = `?probe=${Date.now()}`, n = await a(e, t), r = await d(n, "the request-url probe");
29
+ s(
30
+ r.pathname === e,
31
+ `the deployment must report the client's request pathname, and it reported ${JSON.stringify(r.pathname)} instead of ${JSON.stringify(e)}`
32
+ ), s(
33
+ r.search === t,
34
+ `the deployment must report the client's request query string, and it reported ${JSON.stringify(r.search)} instead of ${JSON.stringify(t)}`
35
+ );
36
+ }
37
+ async function w(a) {
38
+ const e = `203.0.113.${1 + Math.floor(Math.random() * 200)}`, t = `198.51.100.${1 + Math.floor(Math.random() * 200)}`, n = await d(await a(e), "the client-address probe"), r = await d(await a(t), "the client-address probe");
39
+ s(
40
+ n.address === e,
41
+ `the deployment must translate the forwarded client address, and it reported ${JSON.stringify(n.address)} instead of ${JSON.stringify(e)}`
42
+ ), s(
43
+ r.address === t,
44
+ `the deployment must translate the forwarded client address, and it reported ${JSON.stringify(r.address)} instead of ${JSON.stringify(t)}`
45
+ );
46
+ }
47
+ async function p(a) {
48
+ const e = await a();
49
+ s(
50
+ !!e.body,
51
+ "a streaming response must expose a readable body stream"
52
+ );
53
+ const t = e.body.getReader(), n = new TextDecoder();
54
+ let r = 0, o = "";
55
+ for (; ; ) {
56
+ const c = await t.read();
57
+ if (c.done)
58
+ break;
59
+ r += 1, o += n.decode(c.value, { stream: !0 });
60
+ }
61
+ o += n.decode(), s(o.length > 0, "a streaming response must deliver a body"), s(
62
+ r > 1,
63
+ "a streaming response must deliver its body in more than one chunk"
64
+ );
65
+ const i = await a();
66
+ try {
67
+ await i.body?.cancel();
68
+ } catch (c) {
69
+ throw u(
70
+ `a streaming response body must accept cancellation, and it failed with ${h(c)}`
71
+ );
72
+ }
73
+ }
74
+ async function g(a) {
75
+ const e = await a(), t = typeof e.headers.getSetCookie == "function" ? e.headers.getSetCookie() : [];
76
+ s(
77
+ t.length >= 2,
78
+ `a deployment must forward every Set-Cookie header as a distinct value, and it reported ${t.length}`
79
+ );
80
+ const n = t.map((r) => r.split("=")[0]);
81
+ s(
82
+ new Set(n).size === n.length,
83
+ "a deployment must forward every declared cookie without dropping or duplicating one"
84
+ );
85
+ }
86
+ async function $(a) {
87
+ const e = await a();
88
+ s(e.ok, `a static asset request must succeed, and it returned ${e.status}`);
89
+ const t = (e.headers.get("cache-control") ?? "").toLowerCase();
90
+ s(
91
+ t.includes("immutable") && t.includes("max-age"),
92
+ `a fingerprinted static asset must carry an immutable, long-lived cache-control header, and it carried ${JSON.stringify(t)}`
93
+ );
94
+ const n = await e.text(), o = await (await a()).text();
95
+ s(
96
+ n === o,
97
+ "a repeated static asset request must return the same bytes"
98
+ );
99
+ }
100
+ async function S(a) {
101
+ const e = await a(), t = await a(), n = l(e), r = l(t);
102
+ s(
103
+ !!n,
104
+ "a security-headers response must declare a content-security-policy nonce source"
105
+ ), s(
106
+ !!r && r !== n,
107
+ "every response must carry a freshly generated nonce"
108
+ );
109
+ const o = await e.text();
110
+ s(
111
+ o.includes(`nonce="${n}"`),
112
+ "the rendered document must carry the nonce its header declares"
113
+ ), await t.body?.cancel(), s(
114
+ (e.headers.get("x-content-type-options") ?? "").toLowerCase() === "nosniff",
115
+ "a security-headers response must carry x-content-type-options nosniff"
116
+ );
117
+ }
118
+ async function C(a) {
119
+ const e = await a(), t = `deployment-contract-${Date.now()}-${Math.random().toString(36).slice(2)}`, n = `shared-cache-probe-${Math.random().toString(36).slice(2)}`, r = await e.writeFromOrigin(t, n);
120
+ s(
121
+ r.ok,
122
+ `writing to the shared cache must succeed, and it returned ${r.status}`
123
+ );
124
+ const o = await e.readFromPeer(t), i = await o.text();
125
+ s(
126
+ o.ok,
127
+ `reading the shared cache from a peer instance must succeed, and it returned ${o.status}`
128
+ ), s(
129
+ i === n,
130
+ `a value written to the shared cache must be visible from another instance, and it read ${JSON.stringify(i)} instead of ${JSON.stringify(n)}`
131
+ );
132
+ }
133
+ async function v(a) {
134
+ const e = await a(), t = await e.ready();
135
+ s(
136
+ t.ok,
137
+ `the readiness probe must succeed before shutdown, and it returned ${t.status}`
138
+ ), await e.shutdown(), await e.shutdown();
139
+ const n = await e.afterShutdown();
140
+ s(
141
+ !n.ok,
142
+ `the readiness probe must stop reporting ready once shutdown starts, and it returned ${n.status}`
143
+ );
144
+ }
145
+ async function d(a, e) {
146
+ try {
147
+ return await a.json();
148
+ } catch (t) {
149
+ throw u(
150
+ `${e} must return a JSON body, and it failed with ${h(t)}`
151
+ );
152
+ }
153
+ }
154
+ function l(a) {
155
+ const e = a.headers.get("content-security-policy") ?? "";
156
+ return f.exec(e)?.[1];
157
+ }
158
+ function h(a) {
159
+ return a instanceof Error ? a.message : String(a);
160
+ }
161
+ function s(a, e) {
162
+ if (!a)
163
+ throw u(e);
164
+ }
165
+ function u(a) {
166
+ return new Error(`Deployment contract failed: ${a}.`);
167
+ }
168
+ export {
169
+ b as verifyDeploymentContract
170
+ };
171
+ //# sourceMappingURL=testing.js.map