@demiurgejs/core 0.2.0-beta.3 → 0.2.0-beta.5

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 (237) hide show
  1. package/README.md +36 -11
  2. package/bin/demiurge.mjs +47 -13
  3. package/dist/adapter/index.d.ts +1 -1
  4. package/dist/adapter/index.d.ts.map +1 -1
  5. package/dist/browser/file-router.d.ts +388 -5
  6. package/dist/browser/file-router.d.ts.map +1 -1
  7. package/dist/browser/focus.d.ts +20 -0
  8. package/dist/browser/focus.d.ts.map +1 -0
  9. package/dist/browser/index.d.ts +7 -1
  10. package/dist/browser/index.d.ts.map +1 -1
  11. package/dist/browser/mutation-action.d.ts +81 -0
  12. package/dist/browser/mutation-action.d.ts.map +1 -0
  13. package/dist/chunks/document-shell-9GPwtcTt.js +36 -0
  14. package/dist/chunks/document-shell-9GPwtcTt.js.map +1 -0
  15. package/dist/chunks/{image-codec-Di53WpcH.js → image-codec-Dh1POFhE.js} +2 -2
  16. package/dist/chunks/{image-codec-Di53WpcH.js.map → image-codec-Dh1POFhE.js.map} +1 -1
  17. package/dist/chunks/{images-Edar3eU1.js → images-CG7ZzayG.js} +99 -91
  18. package/dist/chunks/images-CG7ZzayG.js.map +1 -0
  19. package/dist/chunks/index-0MNiR_wo.js +833 -0
  20. package/dist/chunks/index-0MNiR_wo.js.map +1 -0
  21. package/dist/chunks/manifest-vO6c0G0W.js +19 -0
  22. package/dist/chunks/manifest-vO6c0G0W.js.map +1 -0
  23. package/dist/chunks/plugin-BZauDxRY.js +2310 -0
  24. package/dist/chunks/plugin-BZauDxRY.js.map +1 -0
  25. package/dist/chunks/session-store-ChModVcq.js +92 -0
  26. package/dist/chunks/session-store-ChModVcq.js.map +1 -0
  27. package/dist/chunks/static-files-ehaD1kE7.js +51 -0
  28. package/dist/chunks/static-files-ehaD1kE7.js.map +1 -0
  29. package/dist/chunks/streaming-GYIsVTQH.js +560 -0
  30. package/dist/chunks/streaming-GYIsVTQH.js.map +1 -0
  31. package/dist/chunks/testing-CUwGj2ie.js +4751 -0
  32. package/dist/chunks/testing-CUwGj2ie.js.map +1 -0
  33. package/dist/chunks/vite-QoqrGl6f.js +259 -0
  34. package/dist/chunks/vite-QoqrGl6f.js.map +1 -0
  35. package/dist/cli.d.ts +19 -25
  36. package/dist/cli.d.ts.map +1 -1
  37. package/dist/cli.js +289 -128
  38. package/dist/cli.js.map +1 -1
  39. package/dist/config/define.d.ts +3 -0
  40. package/dist/config/define.d.ts.map +1 -0
  41. package/dist/config/index.d.ts +7 -0
  42. package/dist/config/index.d.ts.map +1 -0
  43. package/dist/config/index.js +78 -0
  44. package/dist/config/index.js.map +1 -0
  45. package/dist/config/load.d.ts +12 -0
  46. package/dist/config/load.d.ts.map +1 -0
  47. package/dist/config/types.d.ts +74 -0
  48. package/dist/config/types.d.ts.map +1 -0
  49. package/dist/config/validate.d.ts +9 -0
  50. package/dist/config/validate.d.ts.map +1 -0
  51. package/dist/config/vite.d.ts +12 -0
  52. package/dist/config/vite.d.ts.map +1 -0
  53. package/dist/data/cache.d.ts +2 -0
  54. package/dist/data/cache.d.ts.map +1 -1
  55. package/dist/data/idempotency.d.ts.map +1 -1
  56. package/dist/deployment/testing.d.ts +25 -0
  57. package/dist/deployment/testing.d.ts.map +1 -0
  58. package/dist/deployment/testing.js +171 -0
  59. package/dist/deployment/testing.js.map +1 -0
  60. package/dist/document/hydration.d.ts +9 -0
  61. package/dist/document/hydration.d.ts.map +1 -1
  62. package/dist/document/index.d.ts +4 -2
  63. package/dist/document/index.d.ts.map +1 -1
  64. package/dist/document/metadata.d.ts +8 -0
  65. package/dist/document/metadata.d.ts.map +1 -1
  66. package/dist/document/navigation.d.ts +28 -0
  67. package/dist/document/navigation.d.ts.map +1 -0
  68. package/dist/document/render.d.ts +3 -1
  69. package/dist/document/render.d.ts.map +1 -1
  70. package/dist/document/seo.d.ts.map +1 -1
  71. package/dist/edge/assets.d.ts.map +1 -1
  72. package/dist/edge/index.js +55 -73
  73. package/dist/edge/index.js.map +1 -1
  74. package/dist/index.d.ts +12 -10
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +1883 -692
  77. package/dist/index.js.map +1 -1
  78. package/dist/inspect/command.d.ts +28 -0
  79. package/dist/inspect/command.d.ts.map +1 -0
  80. package/dist/inspect/index.d.ts +9 -0
  81. package/dist/inspect/index.d.ts.map +1 -0
  82. package/dist/inspect/redact.d.ts +35 -0
  83. package/dist/inspect/redact.d.ts.map +1 -0
  84. package/dist/inspect/report.d.ts +24 -0
  85. package/dist/inspect/report.d.ts.map +1 -0
  86. package/dist/inspect/types.d.ts +102 -0
  87. package/dist/inspect/types.d.ts.map +1 -0
  88. package/dist/internal/testing.js +5 -5
  89. package/dist/kv/index.d.ts +2 -0
  90. package/dist/kv/index.d.ts.map +1 -1
  91. package/dist/kv/index.js +170 -73
  92. package/dist/kv/index.js.map +1 -1
  93. package/dist/kv/session-store.d.ts +20 -0
  94. package/dist/kv/session-store.d.ts.map +1 -0
  95. package/dist/manifest.d.ts +10 -0
  96. package/dist/manifest.d.ts.map +1 -0
  97. package/dist/node/http.d.ts +5 -0
  98. package/dist/node/http.d.ts.map +1 -1
  99. package/dist/node/image.d.ts.map +1 -1
  100. package/dist/node/index.d.ts +4 -1
  101. package/dist/node/index.d.ts.map +1 -1
  102. package/dist/node/index.js +257 -182
  103. package/dist/node/index.js.map +1 -1
  104. package/dist/node/serve.d.ts +47 -0
  105. package/dist/node/serve.d.ts.map +1 -0
  106. package/dist/node/static.d.ts.map +1 -1
  107. package/dist/platform/fonts.d.ts.map +1 -1
  108. package/dist/platform/image-url.d.ts.map +1 -1
  109. package/dist/platform/url.d.ts +19 -0
  110. package/dist/platform/url.d.ts.map +1 -0
  111. package/dist/platform/web-vitals.d.ts.map +1 -1
  112. package/dist/redis/index.d.ts +2 -0
  113. package/dist/redis/index.d.ts.map +1 -1
  114. package/dist/redis/index.js +186 -69
  115. package/dist/redis/index.js.map +1 -1
  116. package/dist/redis/session-store.d.ts +9 -0
  117. package/dist/redis/session-store.d.ts.map +1 -0
  118. package/dist/route/index.d.ts +3 -2
  119. package/dist/route/index.d.ts.map +1 -1
  120. package/dist/route/mutation.d.ts +97 -0
  121. package/dist/route/mutation.d.ts.map +1 -0
  122. package/dist/route/serialization.d.ts +24 -0
  123. package/dist/route/serialization.d.ts.map +1 -0
  124. package/dist/route/types.d.ts +6 -1
  125. package/dist/route/types.d.ts.map +1 -1
  126. package/dist/route/webhook.d.ts +6 -1
  127. package/dist/route/webhook.d.ts.map +1 -1
  128. package/dist/router/manifest.d.ts +8 -0
  129. package/dist/router/manifest.d.ts.map +1 -1
  130. package/dist/router/navigation-data.d.ts +9 -1
  131. package/dist/router/navigation-data.d.ts.map +1 -1
  132. package/dist/routing/generate.d.ts +3 -0
  133. package/dist/routing/generate.d.ts.map +1 -1
  134. package/dist/routing/index.d.ts +3 -1
  135. package/dist/routing/index.d.ts.map +1 -1
  136. package/dist/routing/locale.d.ts +43 -0
  137. package/dist/routing/locale.d.ts.map +1 -0
  138. package/dist/routing/types.d.ts +12 -0
  139. package/dist/routing/types.d.ts.map +1 -1
  140. package/dist/security/audit.d.ts +2 -1
  141. package/dist/security/audit.d.ts.map +1 -1
  142. package/dist/security/authorization.d.ts +36 -0
  143. package/dist/security/authorization.d.ts.map +1 -0
  144. package/dist/security/cookie-session.d.ts +43 -0
  145. package/dist/security/cookie-session.d.ts.map +1 -0
  146. package/dist/security/csrf.d.ts +1 -1
  147. package/dist/security/csrf.d.ts.map +1 -1
  148. package/dist/security/env-startup.d.ts +13 -0
  149. package/dist/security/env-startup.d.ts.map +1 -0
  150. package/dist/security/env.d.ts +49 -11
  151. package/dist/security/env.d.ts.map +1 -1
  152. package/dist/security/exceptions.d.ts +29 -0
  153. package/dist/security/exceptions.d.ts.map +1 -0
  154. package/dist/security/finding-codes.d.ts +56 -0
  155. package/dist/security/finding-codes.d.ts.map +1 -0
  156. package/dist/security/index.d.ts +14 -3
  157. package/dist/security/index.d.ts.map +1 -1
  158. package/dist/security/policy.d.ts +2 -5
  159. package/dist/security/policy.d.ts.map +1 -1
  160. package/dist/security/report.d.ts +2 -1
  161. package/dist/security/report.d.ts.map +1 -1
  162. package/dist/security/request.d.ts +1 -0
  163. package/dist/security/request.d.ts.map +1 -1
  164. package/dist/security/session-manager.d.ts +32 -0
  165. package/dist/security/session-manager.d.ts.map +1 -0
  166. package/dist/security/session-store.d.ts +51 -0
  167. package/dist/security/session-store.d.ts.map +1 -0
  168. package/dist/security/testing.d.ts +10 -0
  169. package/dist/security/testing.d.ts.map +1 -0
  170. package/dist/security/testing.js +145 -0
  171. package/dist/security/testing.js.map +1 -0
  172. package/dist/security/types.d.ts +139 -5
  173. package/dist/security/types.d.ts.map +1 -1
  174. package/dist/security/upload.d.ts +3 -3
  175. package/dist/security/upload.d.ts.map +1 -1
  176. package/dist/security/verification.d.ts.map +1 -1
  177. package/dist/server/document-shell.d.ts.map +1 -1
  178. package/dist/server/errors.d.ts +1 -0
  179. package/dist/server/errors.d.ts.map +1 -1
  180. package/dist/server/index.d.ts +1 -0
  181. package/dist/server/index.d.ts.map +1 -1
  182. package/dist/server/not-found.d.ts +1 -0
  183. package/dist/server/not-found.d.ts.map +1 -1
  184. package/dist/server/render-tree.d.ts.map +1 -1
  185. package/dist/server/request-handler.d.ts +7 -2
  186. package/dist/server/request-handler.d.ts.map +1 -1
  187. package/dist/server/request-metadata.d.ts +1 -0
  188. package/dist/server/request-metadata.d.ts.map +1 -1
  189. package/dist/server/ssr.d.ts +2 -0
  190. package/dist/server/ssr.d.ts.map +1 -1
  191. package/dist/server-only/browser.d.ts +2 -0
  192. package/dist/server-only/browser.d.ts.map +1 -0
  193. package/dist/server-only/browser.js +4 -0
  194. package/dist/server-only/browser.js.map +1 -0
  195. package/dist/server-only/index.d.ts +2 -0
  196. package/dist/server-only/index.d.ts.map +1 -0
  197. package/dist/server-only/index.js +2 -0
  198. package/dist/server-only/index.js.map +1 -0
  199. package/dist/static/index.d.ts +2 -0
  200. package/dist/static/index.d.ts.map +1 -1
  201. package/dist/static/index.js +380 -363
  202. package/dist/static/index.js.map +1 -1
  203. package/dist/static/preview.d.ts.map +1 -1
  204. package/dist/static/vercel.d.ts +11 -2
  205. package/dist/static/vercel.d.ts.map +1 -1
  206. package/dist/static-files.d.ts +12 -0
  207. package/dist/static-files.d.ts.map +1 -1
  208. package/dist/type-guards.d.ts +19 -0
  209. package/dist/type-guards.d.ts.map +1 -0
  210. package/dist/vite/env-boundary.d.ts +14 -0
  211. package/dist/vite/env-boundary.d.ts.map +1 -0
  212. package/dist/vite/index.d.ts +13 -6
  213. package/dist/vite/index.d.ts.map +1 -1
  214. package/dist/vite/index.js +29 -1560
  215. package/dist/vite/index.js.map +1 -1
  216. package/dist/vite/plugin.d.ts +24 -3
  217. package/dist/vite/plugin.d.ts.map +1 -1
  218. package/dist/vite/policy-verification.d.ts +33 -2
  219. package/dist/vite/policy-verification.d.ts.map +1 -1
  220. package/dist/vite/route-audit.d.ts +14 -2
  221. package/dist/vite/route-audit.d.ts.map +1 -1
  222. package/dist/vite/server-only-boundary.d.ts +8 -0
  223. package/dist/vite/server-only-boundary.d.ts.map +1 -0
  224. package/package.json +24 -6
  225. package/dist/chunks/document-shell-WoM8yZlR.js +0 -35
  226. package/dist/chunks/document-shell-WoM8yZlR.js.map +0 -1
  227. package/dist/chunks/images-Edar3eU1.js.map +0 -1
  228. package/dist/chunks/request-metadata-DaIYq4Ea.js +0 -677
  229. package/dist/chunks/request-metadata-DaIYq4Ea.js.map +0 -1
  230. package/dist/chunks/static-files-DUjHw-4H.js +0 -11
  231. package/dist/chunks/static-files-DUjHw-4H.js.map +0 -1
  232. package/dist/chunks/streaming-D0fGAuiO.js +0 -469
  233. package/dist/chunks/streaming-D0fGAuiO.js.map +0 -1
  234. package/dist/chunks/testing-CRflAw4X.js +0 -3475
  235. package/dist/chunks/testing-CRflAw4X.js.map +0 -1
  236. package/dist/route/action.d.ts +0 -33
  237. package/dist/route/action.d.ts.map +0 -1
@@ -0,0 +1,92 @@
1
+ function N(e) {
2
+ const r = e.entries ?? /* @__PURE__ */ new Map(), f = A(e.namespace), i = (t) => `${f}:${t}`;
3
+ return {
4
+ create(t) {
5
+ const s = i(t.id);
6
+ if (r.has(s))
7
+ return { status: "conflict" };
8
+ const n = a(t, 0);
9
+ return r.set(s, n), { record: u(n), status: "stored" };
10
+ },
11
+ destroy(t) {
12
+ return r.delete(i(t));
13
+ },
14
+ read(t, s) {
15
+ const n = i(t), o = r.get(n);
16
+ if (o) {
17
+ if (S(o, s)) {
18
+ r.delete(n);
19
+ return;
20
+ }
21
+ return u(o);
22
+ }
23
+ },
24
+ rotate(t, s, n) {
25
+ const o = i(t), c = i(s.id), g = r.get(o);
26
+ if (!g || g.version !== n || c !== o && r.has(c))
27
+ return { status: "conflict" };
28
+ const y = a(s, n + 1);
29
+ return r.delete(o), r.set(c, y), { record: u(y), status: "stored" };
30
+ },
31
+ update(t, s) {
32
+ const n = i(t.id), o = r.get(n);
33
+ if (!o || o.version !== s)
34
+ return { status: "conflict" };
35
+ const c = a(t, s + 1);
36
+ return r.set(n, c), { record: u(c), status: "stored" };
37
+ }
38
+ };
39
+ }
40
+ function x(e) {
41
+ if (!(!h(e) || !d(e.createdAt) || !d(e.expiresAt) || typeof e.id != "string" || e.id.length === 0 || !b(e.version) || e.idleExpiresAt !== void 0 && !d(e.idleExpiresAt) || !p(e.data)))
42
+ return e;
43
+ }
44
+ function d(e) {
45
+ return typeof e == "number" && Number.isSafeInteger(e) && e >= 0;
46
+ }
47
+ function b(e) {
48
+ return typeof e == "number" && Number.isSafeInteger(e) && e >= 0;
49
+ }
50
+ function p(e) {
51
+ return e === null || typeof e == "boolean" || typeof e == "string" ? !0 : typeof e == "number" ? Number.isFinite(e) : Array.isArray(e) ? e.every(p) : h(e) && Object.values(e).every(p);
52
+ }
53
+ function h(e) {
54
+ return typeof e == "object" && e !== null && !Array.isArray(e);
55
+ }
56
+ function A(e) {
57
+ const r = m("app", e.app), f = m(
58
+ "environment",
59
+ e.environment
60
+ );
61
+ if (typeof e.schemaVersion == "number" && (!Number.isInteger(e.schemaVersion) || e.schemaVersion < 0))
62
+ throw new Error(
63
+ "Demiurge session namespace schemaVersion must be a non-negative integer or string."
64
+ );
65
+ const i = m(
66
+ "schemaVersion",
67
+ String(e.schemaVersion)
68
+ );
69
+ return [r, f, i].map(encodeURIComponent).join(":");
70
+ }
71
+ function m(e, r) {
72
+ if (r.length === 0 || r.trim() !== r)
73
+ throw new Error(
74
+ `Demiurge session namespace ${e} must be a non-empty value without leading or trailing whitespace.`
75
+ );
76
+ return r;
77
+ }
78
+ function S(e, r) {
79
+ return e.expiresAt <= r || e.idleExpiresAt !== void 0 && e.idleExpiresAt <= r;
80
+ }
81
+ function a(e, r) {
82
+ return u({ ...e, version: r });
83
+ }
84
+ function u(e) {
85
+ return structuredClone(e);
86
+ }
87
+ export {
88
+ N as c,
89
+ x as p,
90
+ A as s
91
+ };
92
+ //# sourceMappingURL=session-store-ChModVcq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store-ChModVcq.js","sources":["../../src/security/session-store.ts"],"sourcesContent":["export type SessionPrimitive = boolean | null | number | string;\n\nexport type SessionData =\n | SessionPrimitive\n | { readonly [key: string]: SessionData }\n | readonly SessionData[];\n\nexport type SessionNamespace = {\n app: string;\n environment: string;\n schemaVersion: number | string;\n};\n\nexport type SessionRecord<TData extends SessionData = SessionData> = {\n createdAt: number;\n data: TData;\n expiresAt: number;\n id: string;\n idleExpiresAt?: number;\n version: number;\n};\n\nexport type SessionStoreCandidate<TData extends SessionData = SessionData> =\n Omit<SessionRecord<TData>, \"version\">;\n\nexport type SessionStoreWriteResult<TData extends SessionData = SessionData> =\n | { record: SessionRecord<TData>; status: \"stored\" }\n | { status: \"conflict\" }\n | { status: \"unavailable\" };\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type SessionStore<TData extends SessionData = SessionData> = {\n create: (\n candidate: SessionStoreCandidate<TData>,\n ) => MaybePromise<SessionStoreWriteResult<TData>>;\n destroy: (id: string) => MaybePromise<boolean>;\n read: (\n id: string,\n now: number,\n ) => MaybePromise<SessionRecord<TData> | undefined>;\n rotate: (\n currentId: string,\n candidate: SessionStoreCandidate<TData>,\n expectedVersion: number,\n ) => MaybePromise<SessionStoreWriteResult<TData>>;\n update: (\n candidate: SessionStoreCandidate<TData>,\n expectedVersion: number,\n ) => MaybePromise<SessionStoreWriteResult<TData>>;\n};\n\nexport type MemorySessionStoreOptions<\n TData extends SessionData = SessionData,\n> = {\n entries?: Map<string, SessionRecord<TData>>;\n namespace: SessionNamespace;\n};\n\nexport function createMemorySessionStore<\n TData extends SessionData = SessionData,\n>(options: MemorySessionStoreOptions<TData>): SessionStore<TData> {\n const entries = options.entries ?? new Map<string, SessionRecord<TData>>();\n const namespace = serializeSessionNamespace(options.namespace);\n const key = (id: string) => `${namespace}:${id}`;\n\n return {\n create(candidate) {\n const storageKey = key(candidate.id);\n\n if (entries.has(storageKey)) {\n return { status: \"conflict\" };\n }\n\n const record = toRecord(candidate, 0);\n entries.set(storageKey, record);\n return { record: cloneRecord(record), status: \"stored\" };\n },\n destroy(id) {\n return entries.delete(key(id));\n },\n read(id, now) {\n const storageKey = key(id);\n const record = entries.get(storageKey);\n\n if (!record) {\n return undefined;\n }\n\n if (isExpired(record, now)) {\n entries.delete(storageKey);\n return undefined;\n }\n\n return cloneRecord(record);\n },\n rotate(currentId, candidate, expectedVersion) {\n const currentKey = key(currentId);\n const nextKey = key(candidate.id);\n const current = entries.get(currentKey);\n\n if (\n !current ||\n current.version !== expectedVersion ||\n (nextKey !== currentKey && entries.has(nextKey))\n ) {\n return { status: \"conflict\" };\n }\n\n const record = toRecord(candidate, expectedVersion + 1);\n entries.delete(currentKey);\n entries.set(nextKey, record);\n return { record: cloneRecord(record), status: \"stored\" };\n },\n update(candidate, expectedVersion) {\n const storageKey = key(candidate.id);\n const current = entries.get(storageKey);\n\n if (!current || current.version !== expectedVersion) {\n return { status: \"conflict\" };\n }\n\n const record = toRecord(candidate, expectedVersion + 1);\n entries.set(storageKey, record);\n return { record: cloneRecord(record), status: \"stored\" };\n },\n };\n}\n\n/**\n * Validates that an untrusted parsed value conforms to the `SessionRecord`\n * envelope before it is trusted as a session. Backend session stores read\n * raw JSON from shared infrastructure (KV, Redis) that a corrupted entry,\n * manual edit, or deployment version skew could have produced, so the shape\n * must be proven rather than assumed. Mirrors the validation cookie-session\n * applies to its own decoded payloads.\n */\nexport function parseSessionRecord<TData extends SessionData = SessionData>(\n value: unknown,\n): SessionRecord<TData> | undefined {\n if (\n !isObject(value) ||\n !isSafeTimestamp(value.createdAt) ||\n !isSafeTimestamp(value.expiresAt) ||\n typeof value.id !== \"string\" ||\n value.id.length === 0 ||\n !isNonNegativeInteger(value.version) ||\n (value.idleExpiresAt !== undefined &&\n !isSafeTimestamp(value.idleExpiresAt)) ||\n !isSessionData(value.data)\n ) {\n return undefined;\n }\n\n // TYPE-EVIDENCE: validation above proves each field and the recursive session data shape.\n return value as SessionRecord<TData>;\n}\n\nfunction isSafeTimestamp(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isSessionData(value: unknown): value is SessionData {\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return true;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value);\n }\n\n if (Array.isArray(value)) {\n return value.every(isSessionData);\n }\n\n return isObject(value) && Object.values(value).every(isSessionData);\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function serializeSessionNamespace(namespace: SessionNamespace) {\n const app = validateNamespacePart(\"app\", namespace.app);\n const environment = validateNamespacePart(\n \"environment\",\n namespace.environment,\n );\n\n if (\n typeof namespace.schemaVersion === \"number\" &&\n (!Number.isInteger(namespace.schemaVersion) || namespace.schemaVersion < 0)\n ) {\n throw new Error(\n \"Demiurge session namespace schemaVersion must be a non-negative integer or string.\",\n );\n }\n\n const schemaVersion = validateNamespacePart(\n \"schemaVersion\",\n String(namespace.schemaVersion),\n );\n\n return [app, environment, schemaVersion].map(encodeURIComponent).join(\":\");\n}\n\nfunction validateNamespacePart(name: string, value: string) {\n if (value.length === 0 || value.trim() !== value) {\n throw new Error(\n `Demiurge session namespace ${name} must be a non-empty value without leading or trailing whitespace.`,\n );\n }\n\n return value;\n}\n\nfunction isExpired(record: SessionRecord, now: number) {\n return record.expiresAt <= now ||\n (record.idleExpiresAt !== undefined && record.idleExpiresAt <= now);\n}\n\nfunction toRecord<TData extends SessionData>(\n candidate: SessionStoreCandidate<TData>,\n version: number,\n): SessionRecord<TData> {\n return cloneRecord({ ...candidate, version });\n}\n\nfunction cloneRecord<TData extends SessionData>(\n record: SessionRecord<TData>,\n): SessionRecord<TData> {\n return structuredClone(record);\n}\n"],"names":["createMemorySessionStore","options","entries","namespace","serializeSessionNamespace","key","id","candidate","storageKey","record","toRecord","cloneRecord","now","isExpired","currentId","expectedVersion","currentKey","nextKey","current","parseSessionRecord","value","isObject","isSafeTimestamp","isNonNegativeInteger","isSessionData","app","validateNamespacePart","environment","schemaVersion","name","version"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ const e = /-[A-Za-z0-9_-]{8,}\.[A-Za-z0-9]+$/, s = "public, max-age=31536000, immutable", n = "public, max-age=0, must-revalidate";
2
+ function p(t) {
3
+ return e.test(t);
4
+ }
5
+ const i = "application/octet-stream", o = {
6
+ ".avif": "image/avif",
7
+ ".css": "text/css; charset=utf-8",
8
+ ".eot": "application/vnd.ms-fontobject",
9
+ ".gif": "image/gif",
10
+ ".gz": "application/gzip",
11
+ ".html": "text/html; charset=utf-8",
12
+ ".ico": "image/x-icon",
13
+ ".jpeg": "image/jpeg",
14
+ ".jpg": "image/jpeg",
15
+ ".js": "text/javascript; charset=utf-8",
16
+ ".json": "application/json; charset=utf-8",
17
+ ".map": "application/json; charset=utf-8",
18
+ ".mjs": "text/javascript; charset=utf-8",
19
+ ".mp3": "audio/mpeg",
20
+ ".mp4": "video/mp4",
21
+ ".ogg": "audio/ogg",
22
+ ".ogv": "video/ogg",
23
+ ".otf": "font/otf",
24
+ ".pdf": "application/pdf",
25
+ ".png": "image/png",
26
+ ".svg": "image/svg+xml",
27
+ ".ttf": "font/ttf",
28
+ ".txt": "text/plain; charset=utf-8",
29
+ ".vtt": "text/vtt; charset=utf-8",
30
+ ".wasm": "application/wasm",
31
+ ".wav": "audio/wav",
32
+ ".webm": "video/webm",
33
+ ".webmanifest": "application/manifest+json",
34
+ ".webp": "image/webp",
35
+ ".woff": "font/woff",
36
+ ".woff2": "font/woff2",
37
+ ".xml": "application/xml; charset=utf-8"
38
+ };
39
+ function c(t) {
40
+ const a = t.toLowerCase();
41
+ return o[a.startsWith(".") ? a : `.${a}`] ?? i;
42
+ }
43
+ export {
44
+ e as C,
45
+ i as D,
46
+ s as I,
47
+ n as R,
48
+ c,
49
+ p as i
50
+ };
51
+ //# sourceMappingURL=static-files-ehaD1kE7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-files-ehaD1kE7.js","sources":["../../src/static-files.ts"],"sourcesContent":["export const CONTENT_HASHED_FILE_NAME_PATTERN =\n /-[A-Za-z0-9_-]{8,}\\.[A-Za-z0-9]+$/;\n\nexport const IMMUTABLE_FILE_CACHE_CONTROL =\n \"public, max-age=31536000, immutable\";\n\nexport const REVALIDATED_FILE_CACHE_CONTROL =\n \"public, max-age=0, must-revalidate\";\n\nexport function isContentHashedFileName(fileName: string) {\n return CONTENT_HASHED_FILE_NAME_PATTERN.test(fileName);\n}\n\nexport const DEFAULT_CONTENT_TYPE = \"application/octet-stream\";\n\nconst CONTENT_TYPES_BY_EXTENSION: Record<string, string> = {\n \".avif\": \"image/avif\",\n \".css\": \"text/css; charset=utf-8\",\n \".eot\": \"application/vnd.ms-fontobject\",\n \".gif\": \"image/gif\",\n \".gz\": \"application/gzip\",\n \".html\": \"text/html; charset=utf-8\",\n \".ico\": \"image/x-icon\",\n \".jpeg\": \"image/jpeg\",\n \".jpg\": \"image/jpeg\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".map\": \"application/json; charset=utf-8\",\n \".mjs\": \"text/javascript; charset=utf-8\",\n \".mp3\": \"audio/mpeg\",\n \".mp4\": \"video/mp4\",\n \".ogg\": \"audio/ogg\",\n \".ogv\": \"video/ogg\",\n \".otf\": \"font/otf\",\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".svg\": \"image/svg+xml\",\n \".ttf\": \"font/ttf\",\n \".txt\": \"text/plain; charset=utf-8\",\n \".vtt\": \"text/vtt; charset=utf-8\",\n \".wasm\": \"application/wasm\",\n \".wav\": \"audio/wav\",\n \".webm\": \"video/webm\",\n \".webmanifest\": \"application/manifest+json\",\n \".webp\": \"image/webp\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".xml\": \"application/xml; charset=utf-8\",\n};\n\n/**\n * Resolves the content type for a file extension, with or without the leading\n * dot and in any letter case.\n *\n * The table covers the common web asset extensions and is not exhaustive by\n * design. `application/octet-stream` is the correct answer for anything the\n * table does not name, so an unlisted extension is a safe result rather than a\n * defect. Responses that carry this value are served with `nosniff`, which\n * keeps an unknown body from being interpreted as an executable type.\n */\nexport function contentTypeForExtension(extension: string): string {\n const normalized = extension.toLowerCase();\n\n return (\n CONTENT_TYPES_BY_EXTENSION[\n normalized.startsWith(\".\") ? normalized : `.${normalized}`\n ] ?? DEFAULT_CONTENT_TYPE\n );\n}\n"],"names":["CONTENT_HASHED_FILE_NAME_PATTERN","IMMUTABLE_FILE_CACHE_CONTROL","REVALIDATED_FILE_CACHE_CONTROL","isContentHashedFileName","fileName","DEFAULT_CONTENT_TYPE","CONTENT_TYPES_BY_EXTENSION","contentTypeForExtension","extension","normalized"],"mappings":"AAAO,MAAMA,IACX,qCAEWC,IACX,uCAEWC,IACX;AAEK,SAASC,EAAwBC,GAAkB;AACxD,SAAOJ,EAAiC,KAAKI,CAAQ;AACvD;AAEO,MAAMC,IAAuB,4BAE9BC,IAAqD;AAAA,EACzD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AACV;AAYO,SAASC,EAAwBC,GAA2B;AACjE,QAAMC,IAAaD,EAAU,YAAA;AAE7B,SACEF,EACEG,EAAW,WAAW,GAAG,IAAIA,IAAa,IAAIA,CAAU,EAC1D,KAAKJ;AAET;"}