@caretcms/core 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/README.md +101 -18
  2. package/dist/browser-runtime.d.ts +16 -0
  3. package/dist/browser-runtime.d.ts.map +1 -1
  4. package/dist/browser-runtime.js +8 -3
  5. package/dist/browser-runtime.js.map +1 -1
  6. package/dist/contracts.d.ts +1 -0
  7. package/dist/contracts.d.ts.map +1 -1
  8. package/dist/contracts.js +1 -0
  9. package/dist/contracts.js.map +1 -1
  10. package/dist/index.d.ts +34 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +239 -13
  13. package/dist/index.js.map +1 -1
  14. package/dist/loader.d.ts +17 -6
  15. package/dist/loader.d.ts.map +1 -1
  16. package/dist/loader.js +33 -14
  17. package/dist/loader.js.map +1 -1
  18. package/dist/markdown/block-context.d.ts +21 -0
  19. package/dist/markdown/block-context.d.ts.map +1 -0
  20. package/dist/markdown/block-context.js +27 -0
  21. package/dist/markdown/block-context.js.map +1 -0
  22. package/dist/markdown/canonical-body.d.ts +30 -0
  23. package/dist/markdown/canonical-body.d.ts.map +1 -0
  24. package/dist/markdown/canonical-body.js +54 -0
  25. package/dist/markdown/canonical-body.js.map +1 -0
  26. package/dist/markdown/contracts.d.ts +66 -0
  27. package/dist/markdown/contracts.d.ts.map +1 -0
  28. package/dist/markdown/contracts.js +102 -0
  29. package/dist/markdown/contracts.js.map +1 -0
  30. package/dist/markdown/html-to-snodes.d.ts +26 -0
  31. package/dist/markdown/html-to-snodes.d.ts.map +1 -0
  32. package/dist/markdown/html-to-snodes.js +118 -0
  33. package/dist/markdown/html-to-snodes.js.map +1 -0
  34. package/dist/markdown/remark.d.ts +35 -0
  35. package/dist/markdown/remark.d.ts.map +1 -0
  36. package/dist/markdown/remark.js +66 -0
  37. package/dist/markdown/remark.js.map +1 -0
  38. package/dist/markdown/satteri.d.ts +19 -0
  39. package/dist/markdown/satteri.d.ts.map +1 -0
  40. package/dist/markdown/satteri.js +120 -0
  41. package/dist/markdown/satteri.js.map +1 -0
  42. package/dist/markdown/serialize.d.ts +60 -0
  43. package/dist/markdown/serialize.d.ts.map +1 -0
  44. package/dist/markdown/serialize.js +264 -0
  45. package/dist/markdown/serialize.js.map +1 -0
  46. package/dist/markdown/splice.d.ts +32 -0
  47. package/dist/markdown/splice.d.ts.map +1 -0
  48. package/dist/markdown/splice.js +44 -0
  49. package/dist/markdown/splice.js.map +1 -0
  50. package/dist/markdown/stamp.d.ts +68 -0
  51. package/dist/markdown/stamp.d.ts.map +1 -0
  52. package/dist/markdown/stamp.js +131 -0
  53. package/dist/markdown/stamp.js.map +1 -0
  54. package/dist/runtime/auth/rate-limiter.d.ts.map +1 -1
  55. package/dist/runtime/auth/rate-limiter.js +5 -0
  56. package/dist/runtime/auth/rate-limiter.js.map +1 -1
  57. package/dist/runtime/auth/session.d.ts +2 -3
  58. package/dist/runtime/auth/session.d.ts.map +1 -1
  59. package/dist/runtime/auth/session.js +52 -21
  60. package/dist/runtime/auth/session.js.map +1 -1
  61. package/dist/runtime/content.d.ts.map +1 -1
  62. package/dist/runtime/content.js +4 -2
  63. package/dist/runtime/content.js.map +1 -1
  64. package/dist/runtime/middleware.d.ts.map +1 -1
  65. package/dist/runtime/middleware.js +21 -4
  66. package/dist/runtime/middleware.js.map +1 -1
  67. package/dist/runtime/mutations/contracts.d.ts +25 -1
  68. package/dist/runtime/mutations/contracts.d.ts.map +1 -1
  69. package/dist/runtime/mutations/contracts.js +67 -0
  70. package/dist/runtime/mutations/contracts.js.map +1 -1
  71. package/dist/runtime/mutations/engine.d.ts +6 -1
  72. package/dist/runtime/mutations/engine.d.ts.map +1 -1
  73. package/dist/runtime/mutations/engine.js +151 -42
  74. package/dist/runtime/mutations/engine.js.map +1 -1
  75. package/dist/runtime/providers.d.ts +9 -0
  76. package/dist/runtime/providers.d.ts.map +1 -1
  77. package/dist/runtime/providers.js +6 -0
  78. package/dist/runtime/providers.js.map +1 -1
  79. package/dist/runtime/publish.d.ts +15 -1
  80. package/dist/runtime/publish.d.ts.map +1 -1
  81. package/dist/runtime/publish.js +79 -4
  82. package/dist/runtime/publish.js.map +1 -1
  83. package/dist/runtime/rebuild-webhook.d.ts +29 -0
  84. package/dist/runtime/rebuild-webhook.d.ts.map +1 -0
  85. package/dist/runtime/rebuild-webhook.js +37 -0
  86. package/dist/runtime/rebuild-webhook.js.map +1 -0
  87. package/dist/runtime/request-context.d.ts +9 -1
  88. package/dist/runtime/request-context.d.ts.map +1 -1
  89. package/dist/runtime/request-context.js.map +1 -1
  90. package/dist/runtime/rewrite.d.ts +18 -0
  91. package/dist/runtime/rewrite.d.ts.map +1 -1
  92. package/dist/runtime/rewrite.js +118 -4
  93. package/dist/runtime/rewrite.js.map +1 -1
  94. package/dist/runtime/rich-allowlist.d.ts +3 -2
  95. package/dist/runtime/rich-allowlist.d.ts.map +1 -1
  96. package/dist/runtime/rich-allowlist.js +14 -4
  97. package/dist/runtime/rich-allowlist.js.map +1 -1
  98. package/dist/runtime/routes/_helpers.d.ts +7 -0
  99. package/dist/runtime/routes/_helpers.d.ts.map +1 -1
  100. package/dist/runtime/routes/_helpers.js +34 -1
  101. package/dist/runtime/routes/_helpers.js.map +1 -1
  102. package/dist/runtime/routes/admin-entry.d.ts +1 -0
  103. package/dist/runtime/routes/admin-entry.d.ts.map +1 -1
  104. package/dist/runtime/routes/admin-entry.js +3 -2
  105. package/dist/runtime/routes/admin-entry.js.map +1 -1
  106. package/dist/runtime/routes/admin.d.ts +1 -0
  107. package/dist/runtime/routes/admin.d.ts.map +1 -1
  108. package/dist/runtime/routes/admin.js +20 -13
  109. package/dist/runtime/routes/admin.js.map +1 -1
  110. package/dist/runtime/routes/auth-login.d.ts +1 -0
  111. package/dist/runtime/routes/auth-login.d.ts.map +1 -1
  112. package/dist/runtime/routes/auth-login.js +1 -0
  113. package/dist/runtime/routes/auth-login.js.map +1 -1
  114. package/dist/runtime/routes/auth-logout.d.ts +1 -0
  115. package/dist/runtime/routes/auth-logout.d.ts.map +1 -1
  116. package/dist/runtime/routes/auth-logout.js +1 -0
  117. package/dist/runtime/routes/auth-logout.js.map +1 -1
  118. package/dist/runtime/routes/auth-session.d.ts +1 -0
  119. package/dist/runtime/routes/auth-session.d.ts.map +1 -1
  120. package/dist/runtime/routes/auth-session.js +1 -0
  121. package/dist/runtime/routes/auth-session.js.map +1 -1
  122. package/dist/runtime/routes/collection-list.d.ts +1 -0
  123. package/dist/runtime/routes/collection-list.d.ts.map +1 -1
  124. package/dist/runtime/routes/collection-list.js +3 -2
  125. package/dist/runtime/routes/collection-list.js.map +1 -1
  126. package/dist/runtime/routes/collections-metadata.d.ts +1 -0
  127. package/dist/runtime/routes/collections-metadata.d.ts.map +1 -1
  128. package/dist/runtime/routes/collections-metadata.js +3 -2
  129. package/dist/runtime/routes/collections-metadata.js.map +1 -1
  130. package/dist/runtime/routes/draft.d.ts +5 -0
  131. package/dist/runtime/routes/draft.d.ts.map +1 -1
  132. package/dist/runtime/routes/draft.js +18 -1
  133. package/dist/runtime/routes/draft.js.map +1 -1
  134. package/dist/runtime/routes/editor-assets.d.ts +1 -0
  135. package/dist/runtime/routes/editor-assets.d.ts.map +1 -1
  136. package/dist/runtime/routes/editor-assets.js +1 -0
  137. package/dist/runtime/routes/editor-assets.js.map +1 -1
  138. package/dist/runtime/routes/entries.d.ts +1 -0
  139. package/dist/runtime/routes/entries.d.ts.map +1 -1
  140. package/dist/runtime/routes/entries.js +6 -4
  141. package/dist/runtime/routes/entries.js.map +1 -1
  142. package/dist/runtime/routes/history.d.ts +1 -0
  143. package/dist/runtime/routes/history.d.ts.map +1 -1
  144. package/dist/runtime/routes/history.js +50 -24
  145. package/dist/runtime/routes/history.js.map +1 -1
  146. package/dist/runtime/routes/mutate.d.ts +1 -0
  147. package/dist/runtime/routes/mutate.d.ts.map +1 -1
  148. package/dist/runtime/routes/mutate.js +42 -7
  149. package/dist/runtime/routes/mutate.js.map +1 -1
  150. package/dist/runtime/routes/publish.d.ts +1 -0
  151. package/dist/runtime/routes/publish.d.ts.map +1 -1
  152. package/dist/runtime/routes/publish.js +15 -3
  153. package/dist/runtime/routes/publish.js.map +1 -1
  154. package/dist/runtime/routes/schema.d.ts +1 -0
  155. package/dist/runtime/routes/schema.d.ts.map +1 -1
  156. package/dist/runtime/routes/schema.js +7 -3
  157. package/dist/runtime/routes/schema.js.map +1 -1
  158. package/dist/runtime/routes/studio-home.d.ts +1 -0
  159. package/dist/runtime/routes/studio-home.d.ts.map +1 -1
  160. package/dist/runtime/routes/studio-home.js +10 -9
  161. package/dist/runtime/routes/studio-home.js.map +1 -1
  162. package/dist/runtime/routes/theme-stylesheet.d.ts +1 -0
  163. package/dist/runtime/routes/theme-stylesheet.d.ts.map +1 -1
  164. package/dist/runtime/routes/theme-stylesheet.js +12 -1
  165. package/dist/runtime/routes/theme-stylesheet.js.map +1 -1
  166. package/dist/runtime/routes/upload.d.ts +1 -0
  167. package/dist/runtime/routes/upload.d.ts.map +1 -1
  168. package/dist/runtime/routes/upload.js +1 -0
  169. package/dist/runtime/routes/upload.js.map +1 -1
  170. package/dist/runtime/static-bake.d.ts +20 -0
  171. package/dist/runtime/static-bake.d.ts.map +1 -0
  172. package/dist/runtime/static-bake.js +58 -0
  173. package/dist/runtime/static-bake.js.map +1 -0
  174. package/dist/runtime/storage/atomic-write.d.ts.map +1 -1
  175. package/dist/runtime/storage/atomic-write.js +8 -3
  176. package/dist/runtime/storage/atomic-write.js.map +1 -1
  177. package/dist/runtime/storage/frontmatter-codec.d.ts.map +1 -1
  178. package/dist/runtime/storage/frontmatter-codec.js +8 -0
  179. package/dist/runtime/storage/frontmatter-codec.js.map +1 -1
  180. package/dist/runtime/storage/markdown-adapter.d.ts +19 -0
  181. package/dist/runtime/storage/markdown-adapter.d.ts.map +1 -1
  182. package/dist/runtime/storage/markdown-adapter.js +41 -0
  183. package/dist/runtime/storage/markdown-adapter.js.map +1 -1
  184. package/dist/runtime/storage/session-overlay-adapter.d.ts +8 -0
  185. package/dist/runtime/storage/session-overlay-adapter.d.ts.map +1 -1
  186. package/dist/runtime/storage/session-overlay-adapter.js +24 -2
  187. package/dist/runtime/storage/session-overlay-adapter.js.map +1 -1
  188. package/dist/runtime/utils.d.ts +10 -0
  189. package/dist/runtime/utils.d.ts.map +1 -1
  190. package/dist/runtime/utils.js +16 -0
  191. package/dist/runtime/utils.js.map +1 -1
  192. package/dist/runtime/views/studio-layout.d.ts.map +1 -1
  193. package/dist/runtime/views/studio-layout.js +11 -10
  194. package/dist/runtime/views/studio-layout.js.map +1 -1
  195. package/dist/types.d.ts +40 -0
  196. package/dist/types.d.ts.map +1 -1
  197. package/package.json +2 -2
  198. package/static/cms/admin-entry.js +36 -2
  199. package/static/cms/dev-toolbar/app.js +3 -1
  200. package/static/cms/editor/config.js +10 -0
  201. package/static/cms/editor/guards.js +1 -1
  202. package/static/cms/editor/helpers.js +5 -1
  203. package/static/cms/editor/highlight.js +4 -6
  204. package/static/cms/editor/image-edit.js +41 -11
  205. package/static/cms/editor/image.css +7 -1
  206. package/static/cms/editor/md-block-edit.js +176 -0
  207. package/static/cms/editor/md-serialize.js +301 -0
  208. package/static/cms/editor/panel.css +69 -25
  209. package/static/cms/editor/panel.js +39 -0
  210. package/static/cms/editor/rich-toolbar.js +4 -3
  211. package/static/cms/editor/sanitize.js +10 -5
  212. package/static/cms/editor/sync.js +1 -1
  213. package/static/cms/editor/text-edit.js +68 -17
  214. package/static/cms/editor/text-link-interactions.js +4 -4
  215. package/static/cms/editor/toast.css +114 -2
  216. package/static/cms/editor/toast.js +121 -22
  217. package/static/cms/editor/tokens-and-text.css +64 -3
  218. package/static/cms/editor/toolbar.css +76 -8
  219. package/static/cms/editor/toolbar.js +173 -64
  220. package/static/cms/editor.js +16 -3
  221. package/static/cms/studio-login.css +70 -0
  222. package/static/cms/studio.css +80 -13
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Shared, pipeline-independent logic for stamping `data-caret-md` bindings.
3
+ *
4
+ * Two frontends drive this — a Sätteri mdast plugin (Astro 7) and a remark
5
+ * plugin (Astro 6) — walking their own trees but calling the SAME pure
6
+ * functions here so both emit byte-identical attributes (a parity test holds
7
+ * them together). Nothing in this module touches a tree or a pipeline type; it
8
+ * takes already-extracted node facts and returns attributes or `null`.
9
+ */
10
+ import { COLLECTION_NAME_RE, ENTRY_ID_RE } from "../runtime/storage/id-contracts.js";
11
+ import { CARET_MD_ATTR, CARET_MD_SRC_ATTR, fnv1a32, formatBlockPath, formatMdBinding, formatMdSrc, } from "./contracts.js";
12
+ /**
13
+ * mdast node types that make their subtree non-editable: their inner text is
14
+ * either structured (tables), reference plumbing (footnote definitions), or
15
+ * raw/JSX passthrough that markdown block editing can't safely round-trip.
16
+ */
17
+ export const ISLAND_TYPES = new Set([
18
+ "table",
19
+ "tableRow",
20
+ "tableCell",
21
+ "footnoteDefinition",
22
+ "html",
23
+ "mdxJsxFlowElement",
24
+ "mdxJsxTextElement",
25
+ "code",
26
+ ]);
27
+ /** Normalize a file URL or path to a forward-slash filesystem path. */
28
+ function toPath(fileURL) {
29
+ if (fileURL == null)
30
+ return null;
31
+ let p = typeof fileURL === "string" ? fileURL : (fileURL.pathname ?? String(fileURL));
32
+ if (p.startsWith("file://")) {
33
+ try {
34
+ p = new URL(p).pathname;
35
+ }
36
+ catch {
37
+ /* keep p */
38
+ }
39
+ }
40
+ try {
41
+ p = decodeURIComponent(p);
42
+ }
43
+ catch {
44
+ /* keep p */
45
+ }
46
+ return p.replace(/\\/g, "/");
47
+ }
48
+ function normalizeRoot(contentRoot) {
49
+ return contentRoot.replace(/\\/g, "/").replace(/\/+$/, "");
50
+ }
51
+ /**
52
+ * Resolve a source file to its `{collection, id}` under the content root, or
53
+ * `null`. v1 scope: flat `<contentRoot>/<collection>/<id>.md` only — `.mdx`,
54
+ * nested slugs, and identifiers failing the id grammar are intentionally
55
+ * unmatched (and so never stamped).
56
+ */
57
+ export function resolveEntry(fileURL, contentRoot) {
58
+ const path = toPath(fileURL);
59
+ if (path === null)
60
+ return null;
61
+ const root = normalizeRoot(contentRoot);
62
+ if (!path.startsWith(`${root}/`))
63
+ return null;
64
+ const rel = path.slice(root.length + 1);
65
+ const segments = rel.split("/");
66
+ if (segments.length !== 2)
67
+ return null; // nested slugs are out of scope in v1
68
+ const [collection, filename] = segments;
69
+ if (!filename.endsWith(".md"))
70
+ return null; // .mdx stamped in a later version
71
+ const id = filename.slice(0, -".md".length);
72
+ if (!COLLECTION_NAME_RE.test(collection) || !ENTRY_ID_RE.test(id))
73
+ return null;
74
+ return { collection, id };
75
+ }
76
+ /**
77
+ * Decide how a paragraph maps to a bound element. A list item renders its text
78
+ * on the `<li>` (a tight list drops the `<p>` entirely), so we bind the item —
79
+ * via its FIRST paragraph, using that paragraph's marker-free offsets. Other
80
+ * paragraphs bind themselves; `nested` marks those inside a container.
81
+ */
82
+ export function planParagraph(parentType, indexInParent) {
83
+ if (parentType === "listItem") {
84
+ return indexInParent === 0 ? { action: "parent" } : { action: "skip" };
85
+ }
86
+ return { action: "self", nested: parentType !== "root" };
87
+ }
88
+ /**
89
+ * Compute the `{data-caret-md, data-caret-md-src}` attributes for one block, or
90
+ * `null` to leave it unstamped. Offsets are normalized to the canonical body
91
+ * base (frontmatter-stripped, trimmed) so a `.md` import, a content-collection
92
+ * entry, and Astro 6 remark all yield the same numbers.
93
+ */
94
+ export function computeStamp(input) {
95
+ const { source, start, end, blockPath, ancestorTypes, nested } = input;
96
+ if (start == null || end == null || start >= end || end > source.length)
97
+ return null;
98
+ const entry = resolveEntry(input.fileURL, input.contentRoot);
99
+ if (!entry)
100
+ return null;
101
+ if (ancestorTypes.some((t) => ISLAND_TYPES.has(t)))
102
+ return null;
103
+ const slice = source.slice(start, end);
104
+ // A container-nested block whose source spans lines embeds `> `/indent
105
+ // prefixes inside its range; splicing prefix-free text would corrupt it.
106
+ if (nested && slice.includes("\n"))
107
+ return null;
108
+ // Setext headings (`Title\n====`) are not editable in v1: the write path
109
+ // derives block context from the slice and only understands ATX markers, so
110
+ // an edit would silently demote the heading to a paragraph. Skip stamping.
111
+ if (input.blockType === "heading" && !slice.startsWith("#"))
112
+ return null;
113
+ const delta = source.length - source.trimStart().length;
114
+ const canonicalStart = start - delta;
115
+ const canonicalEnd = end - delta;
116
+ if (canonicalStart < 0)
117
+ return null;
118
+ return {
119
+ [CARET_MD_ATTR]: formatMdBinding({
120
+ collection: entry.collection,
121
+ id: entry.id,
122
+ blockPath: formatBlockPath(blockPath),
123
+ }),
124
+ [CARET_MD_SRC_ATTR]: formatMdSrc({
125
+ start: canonicalStart,
126
+ end: canonicalEnd,
127
+ hash: fnv1a32(slice),
128
+ }),
129
+ };
130
+ }
131
+ //# sourceMappingURL=stamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamp.js","sourceRoot":"","sources":["../../src/markdown/stamp.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,MAAM,MAAM,eAAe,GACvB;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACtE,eAAe,CAcjB;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,IAAI,CAWN;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,sCAAsC;AACtC,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAoB5D"}
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,MAAM,MAAM,eAAe,GACvB;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACtE,eAAe,CAcjB;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,IAAI,CAWN;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,sCAAsC;AACtC,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAyB5D"}
@@ -54,6 +54,11 @@ export function extractRateLimitKey(request) {
54
54
  // X-Forwarded-For per request to mint unlimited fresh buckets and bypass the
55
55
  // brute-force limit entirely. When the proxy isn't trusted we fall back to a
56
56
  // single shared "unknown" bucket — a coarser limit, but not spoofable.
57
+ //
58
+ // Tradeoff (C5): the shared bucket means one attacker's failed attempts also
59
+ // rate-limit legitimate logins during the window (a login DoS). Set
60
+ // CARET_TRUST_PROXY behind a proxy that sets a trustworthy client-IP header to
61
+ // get per-client buckets; leave it unset only when no such proxy exists.
57
62
  if (isProxyTrusted()) {
58
63
  const headers = request.headers;
59
64
  const candidates = [
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/runtime/auth/rate-limiter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/runtime/auth/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -13,9 +13,8 @@ type CookieBagLike = {
13
13
  export declare function isEditorAuthenticated(context: CookieBagLike): boolean;
14
14
  /**
15
15
  * The per-editor id carried by the session cookie, used to key a draft overlay.
16
- * Returns null when the request has no valid editor session, or when the session
17
- * predates editor ids (a legacy token). Does NOT consider demo sessions — those
18
- * are keyed by their own `sessionId`.
16
+ * Returns null when the request has no valid editor session. Does NOT consider
17
+ * demo sessions those are keyed by their own `sessionId`.
19
18
  */
20
19
  export declare function getEditorId(context: CookieBagLike): string | null;
21
20
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/session.ts"],"names":[],"mappings":"AAmDA,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AA0HD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAWhE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,SAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAS9E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,SAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAE9E;AAED,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAED,KAAK,aAAa,GAAG;IACnB,OAAO,CAAC,EAAE;QACR,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAC;KACtD,CAAC;CACH,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAarE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAIjE"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/session.ts"],"names":[],"mappings":"AAoFA,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAgID,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAWhE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,SAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAS9E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,SAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAE9E;AAED,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAED,KAAK,aAAa,GAAG;IACnB,OAAO,CAAC,EAAE;QACR,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAC;KACtD,CAAC;CACH,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAarE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAIjE"}
@@ -1,12 +1,38 @@
1
1
  import { createHmac, randomUUID, timingSafeEqual } from "crypto";
2
2
  import { shouldUseSecureCookies } from "./cookie-utils.js";
3
3
  import { getRequestContext } from "../request-context.js";
4
+ /**
5
+ * Read an env var from any available source. Node hosts populate `process.env`;
6
+ * Cloudflare Workers inject bindings via `context.locals.runtime.env`, which the
7
+ * middleware exposes on the request context. Process env wins when both are set.
8
+ */
9
+ function readEnv(key) {
10
+ const fromProcess = typeof process !== "undefined" ? process.env?.[key] : undefined;
11
+ if (typeof fromProcess === "string" && fromProcess.length > 0)
12
+ return fromProcess;
13
+ const runtimeEnv = getRequestContext()?.runtimeEnv;
14
+ const fromRuntime = runtimeEnv?.[key];
15
+ return typeof fromRuntime === "string" ? fromRuntime : undefined;
16
+ }
17
+ /**
18
+ * True in a dev context, where the public fallback session secret is acceptable
19
+ * (zero-config `astro dev`). The build-time define is authoritative; when it is
20
+ * absent (unit tests, direct imports) we fall back to NODE_ENV, defaulting to
21
+ * dev unless it is explicitly "production". A production build bakes the define
22
+ * to `false`, so the fallback secret is refused regardless of NODE_ENV.
23
+ */
24
+ function isDevContext() {
25
+ if (typeof __ASTRO_CARET_DEV__ === "boolean")
26
+ return __ASTRO_CARET_DEV__;
27
+ const nodeEnv = typeof process !== "undefined" ? process.env?.NODE_ENV : undefined;
28
+ return nodeEnv !== "production";
29
+ }
4
30
  const SESSION_COOKIE_NAME = "caret_session";
5
31
  const SESSION_TTL_SECONDS = 60 * 60 * 12;
6
32
  const DEV_SECRET_FALLBACK = "caretcms-dev-secret";
7
33
  let devSecretWarned = false;
8
34
  function getConfiguredEditorPassword() {
9
- const value = process.env.CARET_EDIT_PASSWORD ?? process.env.EDIT_PASSWORD ?? "";
35
+ const value = readEnv("CARET_EDIT_PASSWORD") ?? readEnv("EDIT_PASSWORD") ?? "";
10
36
  return value.trim().length > 0 ? value : null;
11
37
  }
12
38
  // During `astro dev`, the integration generates a throwaway password and exposes
@@ -30,25 +56,30 @@ export function isDevEditorPasswordActive() {
30
56
  return getConfiguredEditorPassword() === null && getDevFallbackPassword() !== null;
31
57
  }
32
58
  function getSessionSecret() {
33
- const configured = process.env.CARET_SESSION_SECRET;
59
+ const configured = readEnv("CARET_SESSION_SECRET");
34
60
  if (configured && configured.trim().length > 0)
35
61
  return configured;
36
- // No secret configured. Safe to fall back when no real password is set — that
37
- // includes the dev-only throwaway password, which is itself dev-gated. Once a
38
- // real password is configured the dev fallback is a known string that lets
39
- // anyone forge a session refuse it in production and warn loudly in dev.
40
- if (getConfiguredEditorPassword() === null)
62
+ // No secret configured. The public fallback is a known constant, so any token
63
+ // signed with it is forgeable it is ONLY safe in a dev context. A production
64
+ // build refuses it and fails closed, regardless of whether a password is set:
65
+ // - no password → the editor is meant to be locked; minting a session signed
66
+ // with a public secret would make that "locked" state fully writable (S1).
67
+ // - password set → the operator must supply a real secret.
68
+ // In both cases we throw here; `trySignPayload` catches it so verification just
69
+ // returns "not an editor" rather than 500-ing every request.
70
+ if (isDevContext()) {
71
+ // Warn only once, and only when a real password is configured — that's the
72
+ // "you set a password, now set a secret" nudge. Zero-config dev (no password)
73
+ // stays silent.
74
+ if (getConfiguredEditorPassword() !== null && !devSecretWarned) {
75
+ devSecretWarned = true;
76
+ console.warn("[caretcms] CARET_SESSION_SECRET is unset; using a public dev fallback. " +
77
+ "Set CARET_SESSION_SECRET before exposing this site to the network.");
78
+ }
41
79
  return DEV_SECRET_FALLBACK;
42
- if (process.env.NODE_ENV === "production") {
43
- throw new Error("[caretcms] CARET_SESSION_SECRET is required in production when CARET_EDIT_PASSWORD is set. " +
44
- "Generate one with `openssl rand -base64 32` and set it in your environment.");
45
- }
46
- if (!devSecretWarned) {
47
- devSecretWarned = true;
48
- console.warn("[caretcms] CARET_SESSION_SECRET is unset; using a public dev fallback. " +
49
- "Set CARET_SESSION_SECRET before exposing this site to the network.");
50
80
  }
51
- return DEV_SECRET_FALLBACK;
81
+ throw new Error("[caretcms] CARET_SESSION_SECRET is required in production. " +
82
+ "Generate one with `openssl rand -base64 32` and set it in your environment.");
52
83
  }
53
84
  function signPayload(payloadB64) {
54
85
  return createHmac("sha256", getSessionSecret()).update(payloadB64).digest("base64url");
@@ -126,8 +157,9 @@ function parseToken(token) {
126
157
  return null;
127
158
  if (payload.exp <= Date.now())
128
159
  return null;
129
- // editorId is optional (legacy tokens lack it), but reject a malformed one.
130
- if (payload.editorId !== undefined && typeof payload.editorId !== "string")
160
+ // Every editor session carries an id (keys the draft overlay). Reject a
161
+ // token that lacks a valid one — this also rejects any pre-editorId token.
162
+ if (typeof payload.editorId !== "string" || payload.editorId === "")
131
163
  return null;
132
164
  return payload;
133
165
  }
@@ -176,9 +208,8 @@ export function isEditorAuthenticated(context) {
176
208
  }
177
209
  /**
178
210
  * The per-editor id carried by the session cookie, used to key a draft overlay.
179
- * Returns null when the request has no valid editor session, or when the session
180
- * predates editor ids (a legacy token). Does NOT consider demo sessions — those
181
- * are keyed by their own `sessionId`.
211
+ * Returns null when the request has no valid editor session. Does NOT consider
212
+ * demo sessions those are keyed by their own `sessionId`.
182
213
  */
183
214
  export function getEditorId(context) {
184
215
  const token = context.cookies?.get(SESSION_COOKIE_NAME)?.value;
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/runtime/auth/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAO1D,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAC5C,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAczC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAClD,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,SAAS,2BAA2B;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;IACjF,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,SAAS,sBAAsB;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,GAAG,GACP,OAAO,4BAA4B,KAAK,QAAQ;QAC9C,CAAC,CAAC,4BAA4B;QAC9B,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,2BAA2B,EAAE,IAAI,sBAAsB,EAAE,CAAC;AACnE,CAAC;AAED,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,UAAU,yBAAyB;IACvC,OAAO,2BAA2B,EAAE,KAAK,IAAI,IAAI,sBAAsB,EAAE,KAAK,IAAI,CAAC;AACrF,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACpD,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAElE,8EAA8E;IAC9E,8EAA8E;IAC9E,2EAA2E;IAC3E,2EAA2E;IAC3E,IAAI,2BAA2B,EAAE,KAAK,IAAI;QAAE,OAAO,mBAAmB,CAAC;IAEvE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,6FAA6F;YAC3F,6EAA6E,CAChF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,IAAI,CACV,yEAAyE;YACvE,oEAAoE,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB;IACrC,OAAO,UAAU,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACzF,CAAC;AAED,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAE9B;;;;;;;GAOG;AACH,SAAS,cAAc,CAAC,UAAkB;IACxC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,iBAAiB,GAAG,IAAI,CAAC;YACzB,OAAO,CAAC,KAAK,CACX,GAAI,GAAa,CAAC,OAAO,gDAAgD,CAC1E,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CACnC,KAAa,EACb,IAAY,EACZ,MAAc,EACd,OAAiB;IAEjB,MAAM,KAAK,GAAG;QACZ,GAAG,mBAAmB,IAAI,KAAK,EAAE;QACjC,QAAQ,IAAI,EAAE;QACd,UAAU;QACV,cAAc;QACd,WAAW,MAAM,EAAE;KACpB,CAAC;IAEF,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CAAC,OAAuB;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtF,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACpC,OAAO,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;IACtC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE3C,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,MAAc,CAAC;IACnB,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC7C,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC7E,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC3C,CAAC;QACb,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhF,MAAM,OAAO,GAAG,MAAiC,CAAC;QAClD,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACzC,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClF,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;YAAE,OAAO,IAAI,CAAC;QAC3C,4EAA4E;QAC5E,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAExF,OAAO,OAAyB,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE7B,wEAAwE;IACxE,uEAAuE;IACvE,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;IAChF,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9E,OAAO,eAAe,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAI,GAAG,GAAG,EAAE,OAAiB;IACpE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,GAAG,IAAI,CAAC;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACxE,OAAO,4BAA4B,CACjC,kBAAkB,CAAC,KAAK,CAAC,EACzB,IAAI,EACJ,mBAAmB,EACnB,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAI,GAAG,GAAG,EAAE,OAAiB;IACpE,OAAO,4BAA4B,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO,iBAAiB,EAAE,KAAK,IAAI,CAAC;AACtC,CAAC;AAQD,MAAM,UAAU,qBAAqB,CAAC,OAAsB;IAC1D,yEAAyE;IACzE,yEAAyE;IACzE,oEAAoE;IACpE,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,IAAI,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAErE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,OAAsB;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,UAAU,CAAC,KAAK,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/runtime/auth/session.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/runtime/content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAIzC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAG7E;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAGzD"}
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/runtime/content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAIzC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAI7E;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAGzD"}
@@ -9,6 +9,7 @@
9
9
  * const posts = await loadCollection('posts')
10
10
  */
11
11
  import { requireRequestContext } from "./request-context.js";
12
+ import { stripBodyOverlay } from "./utils.js";
12
13
  /**
13
14
  * Load a single entry by collection and id.
14
15
  * Returns the entry data, or null if not found.
@@ -16,7 +17,7 @@ import { requireRequestContext } from "./request-context.js";
16
17
  export async function loadEntry(collection, id) {
17
18
  const { adapter } = requireRequestContext();
18
19
  const entry = await adapter.getEntry(collection, id);
19
- return entry?.data ?? null;
20
+ return entry ? stripBodyOverlay(entry.data) : null;
20
21
  }
21
22
  /**
22
23
  * Load all entries in a collection.
@@ -24,7 +25,8 @@ export async function loadEntry(collection, id) {
24
25
  */
25
26
  export async function loadCollection(collection) {
26
27
  const { adapter } = requireRequestContext();
27
- return adapter.listEntries(collection);
28
+ const entries = await adapter.listEntries(collection);
29
+ return entries.map((entry) => ({ ...entry, data: stripBodyOverlay(entry.data) }));
28
30
  }
29
31
  /**
30
32
  * Discover all collection names.
@@ -1 +1 @@
1
- {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/runtime/content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAI7D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,UAAkB,EAClB,EAAU;IAEV,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAC5C,OAAO,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAC5C,OAAO,OAAO,CAAC,mBAAmB,EAAE,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/runtime/content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI9C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,UAAkB,EAClB,EAAU;IAEV,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACpF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAC;IAC5C,OAAO,OAAO,CAAC,mBAAmB,EAAE,CAAC;AACvC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/runtime/middleware.ts"],"names":[],"mappings":"AAUA,OAAO,0BAA0B,CAAC;AAElC,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE;QACR,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAC;KACtD,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAqFF,KAAK,cAAc,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE9C,wBAAsB,SAAS,CAC7B,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,QAAQ,CAAC,CAgInB"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/runtime/middleware.ts"],"names":[],"mappings":"AAUA,OAAO,0BAA0B,CAAC;AAElC,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE;QACR,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAC;KACtD,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAqFF,KAAK,cAAc,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE9C,wBAAsB,SAAS,CAC7B,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,QAAQ,CAAC,CAoJnB"}
@@ -107,9 +107,9 @@ export async function onRequest(context, next) {
107
107
  else if (isPreviewRequest(context) && services.adapter.makeEditorOverlay) {
108
108
  // Draft/preview mode: an authenticated editor opting into preview reads and
109
109
  // writes through their per-editor overlay (the public site keeps seeing the
110
- // base). Keyed by the editor id from the session cookie; absent that, there's
111
- // no editor session so we leave the base adapter in place. Publish later
112
- // flushes the overlay back to the base.
110
+ // base). Keyed by the editor id from the session cookie; absent that (an
111
+ // unauthenticated preview request), there's no editor session so we leave the
112
+ // base adapter in place. Publish later flushes the overlay back to the base.
113
113
  const id = getEditorId(context);
114
114
  if (id) {
115
115
  const overlay = await services.adapter.makeEditorOverlay(id);
@@ -125,6 +125,7 @@ export async function onRequest(context, next) {
125
125
  editorId,
126
126
  demoMode,
127
127
  overlayActive,
128
+ runtimeEnv,
128
129
  editor: false,
129
130
  };
130
131
  return runWithRequestContext(requestContext, async () => {
@@ -156,7 +157,23 @@ export async function onRequest(context, next) {
156
157
  // so the two valued forms cover every binding the engine can act on.
157
158
  const hasBindings = BINDING_PROBE_RE.test(html);
158
159
  if (hasBindings) {
159
- html = await rewriteCaretAttributes(html, adapter, {
160
+ // An authenticated editor in server delivery reads live base content
161
+ // (field edits save straight through), but their inline BODY-block
162
+ // edits are always deferred drafts. Preview those on the editor's own
163
+ // requests so a reload shows staged prose instead of silently
164
+ // reverting to the source. ONLY the rewrite needs the overlay — it
165
+ // injects the drafted `__body` HTML into stamped blocks — so loaders
166
+ // and field writes keep using the base adapter and "changes save
167
+ // directly" still holds. Demo/preview already overlay everything via
168
+ // `adapter`; the public (editor === false) always reads the base.
169
+ let rewriteAdapter = adapter;
170
+ if (!overlayActive && requestContext.editor && services.adapter.makeEditorOverlay) {
171
+ const id = editorId ?? getEditorId(context);
172
+ if (id) {
173
+ rewriteAdapter = new SessionOverlayAdapter(services.adapter, await services.adapter.makeEditorOverlay(id));
174
+ }
175
+ }
176
+ html = await rewriteCaretAttributes(html, rewriteAdapter, {
160
177
  allowedClasses: services.allowedClasses,
161
178
  });
162
179
  rewritten = true;
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/runtime/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/runtime/middleware.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,12 @@
1
1
  import type { StorageAdapter } from "../../types.js";
2
+ import { type MdSrc } from "../../markdown/contracts.js";
3
+ /**
4
+ * Upper bound on an `md_block` HTML payload (UTF-16 code units). A block is a
5
+ * single paragraph/heading/list item; even generous prose stays far below this.
6
+ * A dedicated cap (vs the blanket 1MB JSON body cap) keeps one block edit from
7
+ * dragging megabytes into the draft overlay and every subsequent publish.
8
+ */
9
+ export declare const MAX_MD_BLOCK_HTML_LENGTH: number;
2
10
  export type MutationIssue = {
3
11
  path: string;
4
12
  code: string;
@@ -66,7 +74,23 @@ export type DeleteCollectionCommand = {
66
74
  type: "delete_collection";
67
75
  id: string;
68
76
  };
69
- export type CmsMutationCommand = SaveFieldCommand | PutEntryCommand | DeleteEntryCommand | ReorderEntriesCommand | UpdatePageLayoutCommand | CreateCollectionCommand | DeleteCollectionCommand;
77
+ export type MdBlockCommand = {
78
+ type: "md_block";
79
+ collection: string;
80
+ id: string;
81
+ /** Block identity within the entry body (`data-caret-md` blockPath segment). */
82
+ blockPath: string;
83
+ /** Verified source hint (`data-caret-md-src` value, parsed). */
84
+ src: MdSrc;
85
+ /**
86
+ * The edited block's inline HTML. The ONLY content field — markdown is
87
+ * derived server-side after sanitization, never accepted from the client
88
+ * (client markdown would be spliced into source files verbatim on publish).
89
+ */
90
+ html: string;
91
+ expectedRevision?: number;
92
+ };
93
+ export type CmsMutationCommand = SaveFieldCommand | PutEntryCommand | DeleteEntryCommand | ReorderEntriesCommand | UpdatePageLayoutCommand | CreateCollectionCommand | DeleteCollectionCommand | MdBlockCommand;
70
94
  export declare function isRecord(value: unknown): value is Record<string, unknown>;
71
95
  /**
72
96
  * Validate a collection name's *format* (not its existence). A well-formed
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../src/runtime/mutations/contracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../src/runtime/mutations/contracts.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,12 @@
1
1
  import { COLLECTION_NAME_RE, ENTRY_ID_RE } from "../storage/id-contracts.js";
2
+ import { BLOCK_PATH_RE, BODY_OVERLAY_KEY, parseMdSrc, } from "../../markdown/contracts.js";
3
+ /**
4
+ * Upper bound on an `md_block` HTML payload (UTF-16 code units). A block is a
5
+ * single paragraph/heading/list item; even generous prose stays far below this.
6
+ * A dedicated cap (vs the blanket 1MB JSON body cap) keeps one block edit from
7
+ * dragging megabytes into the draft overlay and every subsequent publish.
8
+ */
9
+ export const MAX_MD_BLOCK_HTML_LENGTH = 64 * 1024;
2
10
  export function isRecord(value) {
3
11
  return typeof value === "object" && value !== null && !Array.isArray(value);
4
12
  }
@@ -62,6 +70,12 @@ async function parseSaveFieldCommand(adapter, input) {
62
70
  if (expectedRevision === null) {
63
71
  issues.push(issue("expectedRevision", "invalid_type", "expectedRevision must be a non-negative integer"));
64
72
  }
73
+ // The body-draft map is written ONLY by md_block (whose markdown is derived
74
+ // server-side). A save_field into it would smuggle unvalidated markdown that
75
+ // publish later splices into a source file.
76
+ if (field && (field === BODY_OVERLAY_KEY || field.startsWith(`${BODY_OVERLAY_KEY}.`))) {
77
+ issues.push(issue("field", "reserved_field", `"${BODY_OVERLAY_KEY}" is reserved`));
78
+ }
65
79
  if (issues.length > 0 || !collection || !id || !field || typeof value !== "string") {
66
80
  return { ok: false, issues };
67
81
  }
@@ -92,6 +106,10 @@ async function parsePutEntryCommand(adapter, input) {
92
106
  if (expectedRevision === null) {
93
107
  issues.push(issue("expectedRevision", "invalid_type", "expectedRevision must be a non-negative integer"));
94
108
  }
109
+ // See parseSaveFieldCommand: only md_block may write the body-draft map.
110
+ if (isRecord(data) && Object.prototype.hasOwnProperty.call(data, BODY_OVERLAY_KEY)) {
111
+ issues.push(issue(`data.${BODY_OVERLAY_KEY}`, "reserved_field", `"${BODY_OVERLAY_KEY}" is reserved`));
112
+ }
95
113
  if (issues.length > 0 || !collection || !id || !isRecord(data))
96
114
  return { ok: false, issues };
97
115
  return {
@@ -228,6 +246,53 @@ async function parseUpdatePageLayoutCommand(adapter, input) {
228
246
  },
229
247
  };
230
248
  }
249
+ async function parseMdBlockCommand(adapter, input) {
250
+ const issues = [];
251
+ const collection = await parseCollection(adapter, input.collection);
252
+ const id = parseEntryId(input.id);
253
+ const blockPath = typeof input.blockPath === "string" ? input.blockPath : null;
254
+ const src = typeof input.src === "string" ? parseMdSrc(input.src) : null;
255
+ const html = input.html;
256
+ const expectedRevision = asOptionalExpectedRevision(input.expectedRevision);
257
+ if (!collection)
258
+ issues.push(issue("collection", "invalid_type", "Invalid collection"));
259
+ if (!id)
260
+ issues.push(issue("id", "invalid_type", "Invalid id"));
261
+ if (!blockPath || !BLOCK_PATH_RE.test(blockPath)) {
262
+ issues.push(issue("blockPath", "invalid_type", "Invalid block path"));
263
+ }
264
+ if (!src)
265
+ issues.push(issue("src", "invalid_type", "Invalid source hint"));
266
+ if (typeof html !== "string") {
267
+ issues.push(issue("html", "invalid_type", "html must be a string"));
268
+ }
269
+ else if (html.length > MAX_MD_BLOCK_HTML_LENGTH) {
270
+ issues.push(issue("html", "too_long", `html exceeds ${MAX_MD_BLOCK_HTML_LENGTH} characters`));
271
+ }
272
+ if (expectedRevision === null) {
273
+ issues.push(issue("expectedRevision", "invalid_type", "expectedRevision must be a non-negative integer"));
274
+ }
275
+ if (issues.length > 0 ||
276
+ !collection ||
277
+ !id ||
278
+ !blockPath ||
279
+ !src ||
280
+ typeof html !== "string") {
281
+ return { ok: false, issues };
282
+ }
283
+ return {
284
+ ok: true,
285
+ command: {
286
+ type: "md_block",
287
+ collection,
288
+ id,
289
+ blockPath,
290
+ src,
291
+ html,
292
+ expectedRevision: expectedRevision ?? undefined,
293
+ },
294
+ };
295
+ }
231
296
  export async function parseMutationCommand(adapter, input) {
232
297
  if (!isRecord(input)) {
233
298
  return {
@@ -257,6 +322,8 @@ export async function parseMutationCommand(adapter, input) {
257
322
  return parseCreateCollectionCommand(adapter, input);
258
323
  case "delete_collection":
259
324
  return parseDeleteCollectionCommand(adapter, input);
325
+ case "md_block":
326
+ return parseMdBlockCommand(adapter, input);
260
327
  default:
261
328
  return {
262
329
  ok: false,