@caretcms/core 0.1.0 → 0.1.2

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 (243) hide show
  1. package/README.md +182 -6
  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 +42 -23
  5. package/dist/browser-runtime.js.map +1 -1
  6. package/dist/contracts.d.ts +14 -0
  7. package/dist/contracts.d.ts.map +1 -0
  8. package/dist/contracts.js +14 -0
  9. package/dist/contracts.js.map +1 -0
  10. package/dist/editable.d.ts +28 -0
  11. package/dist/editable.d.ts.map +1 -0
  12. package/dist/editable.js +122 -0
  13. package/dist/editable.js.map +1 -0
  14. package/dist/index.d.ts +53 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +274 -4
  17. package/dist/index.js.map +1 -1
  18. package/dist/loader.d.ts.map +1 -1
  19. package/dist/loader.js +45 -3
  20. package/dist/loader.js.map +1 -1
  21. package/dist/providers/storage/markdown.d.ts +7 -0
  22. package/dist/providers/storage/markdown.d.ts.map +1 -0
  23. package/dist/providers/storage/markdown.js +6 -0
  24. package/dist/providers/storage/markdown.js.map +1 -0
  25. package/dist/runtime/auth/cookie-utils.d.ts +1 -0
  26. package/dist/runtime/auth/cookie-utils.d.ts.map +1 -1
  27. package/dist/runtime/auth/cookie-utils.js +1 -1
  28. package/dist/runtime/auth/cookie-utils.js.map +1 -1
  29. package/dist/runtime/auth/rate-limiter.d.ts.map +1 -1
  30. package/dist/runtime/auth/rate-limiter.js +19 -13
  31. package/dist/runtime/auth/rate-limiter.js.map +1 -1
  32. package/dist/runtime/auth/session.d.ts +8 -0
  33. package/dist/runtime/auth/session.d.ts.map +1 -1
  34. package/dist/runtime/auth/session.js +72 -11
  35. package/dist/runtime/auth/session.js.map +1 -1
  36. package/dist/runtime/config.d.ts +1 -0
  37. package/dist/runtime/config.d.ts.map +1 -1
  38. package/dist/runtime/config.js +2 -1
  39. package/dist/runtime/config.js.map +1 -1
  40. package/dist/runtime/git-journal.d.ts +19 -0
  41. package/dist/runtime/git-journal.d.ts.map +1 -0
  42. package/dist/runtime/git-journal.js +64 -0
  43. package/dist/runtime/git-journal.js.map +1 -0
  44. package/dist/runtime/index.d.ts +1 -1
  45. package/dist/runtime/index.d.ts.map +1 -1
  46. package/dist/runtime/index.js +1 -1
  47. package/dist/runtime/index.js.map +1 -1
  48. package/dist/runtime/middleware.d.ts.map +1 -1
  49. package/dist/runtime/middleware.js +125 -8
  50. package/dist/runtime/middleware.js.map +1 -1
  51. package/dist/runtime/mutations/contracts.d.ts.map +1 -1
  52. package/dist/runtime/mutations/contracts.js +7 -4
  53. package/dist/runtime/mutations/contracts.js.map +1 -1
  54. package/dist/runtime/mutations/engine.d.ts +7 -0
  55. package/dist/runtime/mutations/engine.d.ts.map +1 -1
  56. package/dist/runtime/mutations/engine.js +30 -17
  57. package/dist/runtime/mutations/engine.js.map +1 -1
  58. package/dist/runtime/providers.d.ts +16 -0
  59. package/dist/runtime/providers.d.ts.map +1 -1
  60. package/dist/runtime/providers.js +16 -0
  61. package/dist/runtime/providers.js.map +1 -1
  62. package/dist/runtime/publish.d.ts +40 -0
  63. package/dist/runtime/publish.d.ts.map +1 -0
  64. package/dist/runtime/publish.js +75 -0
  65. package/dist/runtime/publish.js.map +1 -0
  66. package/dist/runtime/rebuild-webhook.d.ts +29 -0
  67. package/dist/runtime/rebuild-webhook.d.ts.map +1 -0
  68. package/dist/runtime/rebuild-webhook.js +37 -0
  69. package/dist/runtime/rebuild-webhook.js.map +1 -0
  70. package/dist/runtime/request-context.d.ts +19 -0
  71. package/dist/runtime/request-context.d.ts.map +1 -1
  72. package/dist/runtime/request-context.js.map +1 -1
  73. package/dist/runtime/rewrite.d.ts +29 -1
  74. package/dist/runtime/rewrite.d.ts.map +1 -1
  75. package/dist/runtime/rewrite.js +30 -16
  76. package/dist/runtime/rewrite.js.map +1 -1
  77. package/dist/runtime/rich-allowlist.d.ts +29 -0
  78. package/dist/runtime/rich-allowlist.d.ts.map +1 -0
  79. package/dist/runtime/rich-allowlist.js +49 -0
  80. package/dist/runtime/rich-allowlist.js.map +1 -0
  81. package/dist/runtime/routes/_helpers.d.ts +33 -0
  82. package/dist/runtime/routes/_helpers.d.ts.map +1 -1
  83. package/dist/runtime/routes/_helpers.js +117 -1
  84. package/dist/runtime/routes/_helpers.js.map +1 -1
  85. package/dist/runtime/routes/admin-entry.d.ts +1 -0
  86. package/dist/runtime/routes/admin-entry.d.ts.map +1 -1
  87. package/dist/runtime/routes/admin-entry.js +3 -2
  88. package/dist/runtime/routes/admin-entry.js.map +1 -1
  89. package/dist/runtime/routes/admin.d.ts +1 -0
  90. package/dist/runtime/routes/admin.d.ts.map +1 -1
  91. package/dist/runtime/routes/admin.js +61 -9
  92. package/dist/runtime/routes/admin.js.map +1 -1
  93. package/dist/runtime/routes/auth-login.d.ts +1 -0
  94. package/dist/runtime/routes/auth-login.d.ts.map +1 -1
  95. package/dist/runtime/routes/auth-login.js +26 -8
  96. package/dist/runtime/routes/auth-login.js.map +1 -1
  97. package/dist/runtime/routes/auth-logout.d.ts +1 -0
  98. package/dist/runtime/routes/auth-logout.d.ts.map +1 -1
  99. package/dist/runtime/routes/auth-logout.js +5 -0
  100. package/dist/runtime/routes/auth-logout.js.map +1 -1
  101. package/dist/runtime/routes/auth-session.d.ts +1 -0
  102. package/dist/runtime/routes/auth-session.d.ts.map +1 -1
  103. package/dist/runtime/routes/auth-session.js +1 -0
  104. package/dist/runtime/routes/auth-session.js.map +1 -1
  105. package/dist/runtime/routes/collection-list.d.ts +1 -0
  106. package/dist/runtime/routes/collection-list.d.ts.map +1 -1
  107. package/dist/runtime/routes/collection-list.js +3 -2
  108. package/dist/runtime/routes/collection-list.js.map +1 -1
  109. package/dist/runtime/routes/collections-metadata.d.ts +1 -0
  110. package/dist/runtime/routes/collections-metadata.d.ts.map +1 -1
  111. package/dist/runtime/routes/collections-metadata.js +7 -4
  112. package/dist/runtime/routes/collections-metadata.js.map +1 -1
  113. package/dist/runtime/routes/draft.d.ts +13 -0
  114. package/dist/runtime/routes/draft.d.ts.map +1 -0
  115. package/dist/runtime/routes/draft.js +55 -0
  116. package/dist/runtime/routes/draft.js.map +1 -0
  117. package/dist/runtime/routes/editor-assets.d.ts +1 -0
  118. package/dist/runtime/routes/editor-assets.d.ts.map +1 -1
  119. package/dist/runtime/routes/editor-assets.js +1 -0
  120. package/dist/runtime/routes/editor-assets.js.map +1 -1
  121. package/dist/runtime/routes/entries.d.ts +1 -0
  122. package/dist/runtime/routes/entries.d.ts.map +1 -1
  123. package/dist/runtime/routes/entries.js +3 -2
  124. package/dist/runtime/routes/entries.js.map +1 -1
  125. package/dist/runtime/routes/history.d.ts +1 -0
  126. package/dist/runtime/routes/history.d.ts.map +1 -1
  127. package/dist/runtime/routes/history.js +24 -10
  128. package/dist/runtime/routes/history.js.map +1 -1
  129. package/dist/runtime/routes/mutate.d.ts +1 -0
  130. package/dist/runtime/routes/mutate.d.ts.map +1 -1
  131. package/dist/runtime/routes/mutate.js +7 -10
  132. package/dist/runtime/routes/mutate.js.map +1 -1
  133. package/dist/runtime/routes/publish.d.ts +10 -0
  134. package/dist/runtime/routes/publish.d.ts.map +1 -0
  135. package/dist/runtime/routes/publish.js +75 -0
  136. package/dist/runtime/routes/publish.js.map +1 -0
  137. package/dist/runtime/routes/schema.d.ts +1 -0
  138. package/dist/runtime/routes/schema.d.ts.map +1 -1
  139. package/dist/runtime/routes/schema.js +7 -4
  140. package/dist/runtime/routes/schema.js.map +1 -1
  141. package/dist/runtime/routes/studio-home.d.ts +1 -0
  142. package/dist/runtime/routes/studio-home.d.ts.map +1 -1
  143. package/dist/runtime/routes/studio-home.js +10 -9
  144. package/dist/runtime/routes/studio-home.js.map +1 -1
  145. package/dist/runtime/routes/theme-stylesheet.d.ts +1 -0
  146. package/dist/runtime/routes/theme-stylesheet.d.ts.map +1 -1
  147. package/dist/runtime/routes/theme-stylesheet.js +1 -0
  148. package/dist/runtime/routes/theme-stylesheet.js.map +1 -1
  149. package/dist/runtime/routes/upload.d.ts +1 -0
  150. package/dist/runtime/routes/upload.d.ts.map +1 -1
  151. package/dist/runtime/routes/upload.js +17 -3
  152. package/dist/runtime/routes/upload.js.map +1 -1
  153. package/dist/runtime/sanitize-html.d.ts +8 -2
  154. package/dist/runtime/sanitize-html.d.ts.map +1 -1
  155. package/dist/runtime/sanitize-html.js +57 -38
  156. package/dist/runtime/sanitize-html.js.map +1 -1
  157. package/dist/runtime/static-bake.d.ts +20 -0
  158. package/dist/runtime/static-bake.d.ts.map +1 -0
  159. package/dist/runtime/static-bake.js +58 -0
  160. package/dist/runtime/static-bake.js.map +1 -0
  161. package/dist/runtime/stega.d.ts +38 -0
  162. package/dist/runtime/stega.d.ts.map +1 -0
  163. package/dist/runtime/stega.js +98 -0
  164. package/dist/runtime/stega.js.map +1 -0
  165. package/dist/runtime/storage/atomic-write.d.ts +22 -0
  166. package/dist/runtime/storage/atomic-write.d.ts.map +1 -0
  167. package/dist/runtime/storage/atomic-write.js +44 -0
  168. package/dist/runtime/storage/atomic-write.js.map +1 -0
  169. package/dist/runtime/storage/filesystem-adapter.d.ts +14 -11
  170. package/dist/runtime/storage/filesystem-adapter.d.ts.map +1 -1
  171. package/dist/runtime/storage/filesystem-adapter.js +71 -201
  172. package/dist/runtime/storage/filesystem-adapter.js.map +1 -1
  173. package/dist/runtime/storage/frontmatter-codec.d.ts +47 -0
  174. package/dist/runtime/storage/frontmatter-codec.d.ts.map +1 -0
  175. package/dist/runtime/storage/frontmatter-codec.js +523 -0
  176. package/dist/runtime/storage/frontmatter-codec.js.map +1 -0
  177. package/dist/runtime/storage/fs-runtime.d.ts +8 -0
  178. package/dist/runtime/storage/fs-runtime.d.ts.map +1 -0
  179. package/dist/runtime/storage/fs-runtime.js +40 -0
  180. package/dist/runtime/storage/fs-runtime.js.map +1 -0
  181. package/dist/runtime/storage/id-contracts.d.ts +22 -0
  182. package/dist/runtime/storage/id-contracts.d.ts.map +1 -0
  183. package/dist/runtime/storage/id-contracts.js +27 -0
  184. package/dist/runtime/storage/id-contracts.js.map +1 -0
  185. package/dist/runtime/storage/image-validation.d.ts +10 -0
  186. package/dist/runtime/storage/image-validation.d.ts.map +1 -1
  187. package/dist/runtime/storage/image-validation.js +17 -4
  188. package/dist/runtime/storage/image-validation.js.map +1 -1
  189. package/dist/runtime/storage/in-memory-adapter.d.ts +4 -0
  190. package/dist/runtime/storage/in-memory-adapter.d.ts.map +1 -1
  191. package/dist/runtime/storage/in-memory-adapter.js +11 -0
  192. package/dist/runtime/storage/in-memory-adapter.js.map +1 -1
  193. package/dist/runtime/storage/markdown-adapter.d.ts +63 -0
  194. package/dist/runtime/storage/markdown-adapter.d.ts.map +1 -0
  195. package/dist/runtime/storage/markdown-adapter.js +227 -0
  196. package/dist/runtime/storage/markdown-adapter.js.map +1 -0
  197. package/dist/runtime/storage/quota-upload-handler.d.ts +2 -0
  198. package/dist/runtime/storage/quota-upload-handler.d.ts.map +1 -1
  199. package/dist/runtime/storage/quota-upload-handler.js +34 -8
  200. package/dist/runtime/storage/quota-upload-handler.js.map +1 -1
  201. package/dist/runtime/storage/session-overlay-adapter.d.ts +3 -0
  202. package/dist/runtime/storage/session-overlay-adapter.d.ts.map +1 -1
  203. package/dist/runtime/storage/session-overlay-adapter.js +3 -1
  204. package/dist/runtime/storage/session-overlay-adapter.js.map +1 -1
  205. package/dist/runtime/storage/sidecar-meta-store.d.ts +51 -0
  206. package/dist/runtime/storage/sidecar-meta-store.d.ts.map +1 -0
  207. package/dist/runtime/storage/sidecar-meta-store.js +209 -0
  208. package/dist/runtime/storage/sidecar-meta-store.js.map +1 -0
  209. package/dist/runtime/themes/preset-tokens.d.ts +0 -1
  210. package/dist/runtime/themes/preset-tokens.d.ts.map +1 -1
  211. package/dist/runtime/themes/preset-tokens.js +1 -1
  212. package/dist/runtime/themes/preset-tokens.js.map +1 -1
  213. package/dist/runtime/utils.d.ts +9 -1
  214. package/dist/runtime/utils.d.ts.map +1 -1
  215. package/dist/runtime/utils.js +21 -1
  216. package/dist/runtime/utils.js.map +1 -1
  217. package/dist/runtime/views/studio-layout.d.ts.map +1 -1
  218. package/dist/runtime/views/studio-layout.js +11 -10
  219. package/dist/runtime/views/studio-layout.js.map +1 -1
  220. package/dist/schema-utils.d.ts.map +1 -1
  221. package/dist/schema-utils.js +1 -0
  222. package/dist/schema-utils.js.map +1 -1
  223. package/dist/types.d.ts +17 -0
  224. package/dist/types.d.ts.map +1 -1
  225. package/package.json +9 -1
  226. package/static/cms/dev-toolbar/app.js +265 -0
  227. package/static/cms/editor/config.js +10 -0
  228. package/static/cms/editor/helpers.js +5 -1
  229. package/static/cms/editor/highlight.js +44 -0
  230. package/static/cms/editor/sanitize.js +56 -9
  231. package/static/cms/editor/stega-hydrate.js +80 -0
  232. package/static/cms/editor/text-edit.js +22 -0
  233. package/static/cms/editor/tokens-and-text.css +1 -1
  234. package/static/cms/editor/toolbar.css +101 -4
  235. package/static/cms/editor/toolbar.js +171 -21
  236. package/static/cms/editor.js +18 -1
  237. package/static/cms/signin-hint.css +74 -0
  238. package/static/cms/studio-login.css +70 -0
  239. package/static/cms/studio.css +80 -13
  240. package/dist/runtime/schema/template.d.ts +0 -15
  241. package/dist/runtime/schema/template.d.ts.map +0 -1
  242. package/dist/runtime/schema/template.js +0 -38
  243. package/dist/runtime/schema/template.js.map +0 -1
package/README.md CHANGED
@@ -2,25 +2,91 @@
2
2
 
3
3
  Inline editing and live content collections for Astro. Add one HTML attribute to make any element editable, and use Astro's live loaders to query CMS data with `getLiveEntry` / `getLiveCollection` (stable on Astro 6, experimental on Astro 5.10+).
4
4
 
5
+ ![CaretCMS inline editor demo](https://caretcms.com/preview/caretcms-editor-demo.gif)
6
+
5
7
  ## Install
6
8
 
7
9
  ```bash
8
10
  npm install @caretcms/core
9
11
  ```
10
12
 
13
+ **Static Astro site?** Use static delivery — no SSR adapter:
14
+
15
+ ```js
16
+ integrations: [caret({ delivery: 'static' })],
17
+ ```
18
+
19
+ **Server-rendered site?** Add an adapter and server output:
20
+
21
+ ```bash
22
+ npm install @astrojs/node
23
+ ```
24
+
25
+ ```js
26
+ output: 'server',
27
+ adapter: node({ mode: 'standalone' }),
28
+ integrations: [caret()],
29
+ ```
30
+
31
+ See [Static delivery](../../docs/static-delivery.md) and [Rendering & output](#rendering--output) below.
32
+
11
33
  ## Setup
12
34
 
35
+ ### Static delivery (default path for static Astro sites)
36
+
37
+ ```js
38
+ // astro.config.mjs
39
+ import { defineConfig } from 'astro/config';
40
+ import caret from '@caretcms/core';
41
+
42
+ export default defineConfig({
43
+ integrations: [caret({ delivery: 'static' })],
44
+ });
45
+ ```
46
+
47
+ - **`astro dev`** — full authoring: `/admin`, `/api/cms`, inline editor.
48
+ - **`astro build`** — bakes stored overrides into generated HTML; authoring routes stay out of production output.
49
+ - **Public updates** — after Publish, run CI/build/deploy (optionally via `delivery.publish.webhookUrl`).
50
+
51
+ ### Server delivery (per-request rewriting)
52
+
13
53
  ```js
14
54
  // astro.config.mjs
15
55
  import { defineConfig } from 'astro/config';
56
+ import node from '@astrojs/node';
16
57
  import caret from '@caretcms/core';
17
58
 
18
59
  export default defineConfig({
19
60
  output: 'server',
61
+ adapter: node({ mode: 'standalone' }),
20
62
  integrations: [caret()],
21
63
  });
22
64
  ```
23
65
 
66
+ Edits are visible to visitors immediately — middleware rewrites HTML on each request.
67
+
68
+ **Already have Astro content collections?** If your project has collections under
69
+ `src/content/` and you haven't set `storage`, CaretCMS auto-selects
70
+ `markdownStorage()` so the Studio lists those collections immediately (instead of
71
+ "No collections yet") and edits write back to your `.md` frontmatter. Pass an
72
+ explicit `storage` to override — `storage: filesystemStorage()` opts back out.
73
+
74
+ ## Choose your path
75
+
76
+ CaretCMS gives you two ways to make content editable. They share one storage layer and one login — you can mix them on the same site — but they answer different questions. Start at the top; reach for the next row only when you need it.
77
+
78
+ | Start here if… | Use | What you write |
79
+ |---|---|---|
80
+ | You have static markup (a hero, an about page) and just want to click words/images and change them | **Inline editing** | `data-caret` attributes on the elements |
81
+ | The same fields repeat or you want short attribute names | **Scoped inline editing** | a `data-caret-scope` wrapper + short `data-caret` names |
82
+ | Your content is dynamic data you query in frontmatter (a blog index, a list of products) | **Live collections** | `caretLoader` in `src/caret.config.ts`, then `getLiveEntry` / `getLiveCollection` |
83
+
84
+ **The binding model in one line:** every edit is addressed as `collection::id::field`. Inline editing lets you spell that out in pieces — `data-caret-scope="pages::home"` sets `collection::id`, and `data-caret="headline"` fills in the `field`, so the element above resolves to `pages::home::headline`. Live collections address the same `collection` + `id` from frontmatter instead. Same content, same storage — two ways to reach it.
85
+
86
+ > Adding `data-caret` to an existing site by hand? `npx @caretcms/caretize` scans your Astro
87
+ > project and interactively annotates your templates for you. The attributes below are all you
88
+ > need either way — caretize just writes them.
89
+
24
90
  ## Inline editing
25
91
 
26
92
  Add `data-caret` attributes to your templates:
@@ -33,18 +99,28 @@ Add `data-caret` attributes to your templates:
33
99
  </main>
34
100
  ```
35
101
 
36
- Set a password and start the dev server:
102
+ Start the dev server:
37
103
 
38
104
  ```bash
39
- CARET_EDIT_PASSWORD=devpass npm run dev
105
+ npm run dev
40
106
  ```
41
107
 
42
- Log in at `/admin`, then click any annotated element on the page to edit it.
108
+ With no password configured, a **temporary dev password is printed in the terminal** (dev only
109
+ production stays locked). To set a permanent one, add `CARET_EDIT_PASSWORD=<your-password>` to a
110
+ `.env` file.
111
+
112
+ Log in at `/admin`, then click any annotated element on the page to edit it. The content Studio
113
+ lives at `/admin/cms`.
43
114
 
44
115
  The inline editor only bootstraps on pages that contain `data-caret` bindings and only after
45
116
  `GET /api/cms/auth/session` confirms an authenticated editor session. Session cookies are issued
46
117
  as `HttpOnly`, `SameSite=Lax`, and automatically add `Secure` on HTTPS requests.
47
118
 
119
+ When you're signed in and land on a live page that has **no** `data-caret` bindings yet, CaretCMS
120
+ shows a small "signed in · no editable fields on this page" hint pointing you at the next step —
121
+ so a page that isn't annotated yet reads as "nothing to edit here" rather than "is this broken?".
122
+ The hint is editor-only (anonymous visitors never see it) and never appears inside the Studio.
123
+
48
124
  ## Live content collections
49
125
 
50
126
  You can also wire collections into Astro's native content layer using `caretLoader`. This lets you query CMS data with `getLiveEntry` and `getLiveCollection` from `astro:content` — the same API you use for any Astro live collection.
@@ -116,14 +192,31 @@ export default defineConfig({
116
192
 
117
193
  When provided, Studio uses these for field names, types, and editor widgets instead of guessing from the first entry.
118
194
 
195
+ **Already describe your collections with Zod?** If you have a `content.config.ts` Zod schema,
196
+ don't write it twice — `@caretcms/zod` derives the Studio schema from that single source:
197
+
198
+ ```js
199
+ // astro.config.mjs
200
+ import { schemaFromZod } from '@caretcms/zod';
201
+ import { blogSchema } from './src/schemas.mjs'; // the same object content.config.ts uses
202
+
203
+ caret({ schemas: { blog: schemaFromZod(blogSchema) } });
204
+ ```
205
+
206
+ (Keep your Zod schemas in a plain module that imports only `zod` — not `astro:content` — so both
207
+ `content.config.ts` and `astro.config` can import them.) Schemas remain optional: with
208
+ auto-detected `markdownStorage` the Studio already shows each collection with fields inferred from
209
+ existing entries; deriving from Zod just adds proper labels, types, and widget hints.
210
+
119
211
  ## What you get
120
212
 
121
213
  - **Inline editing** on any `data-caret` element (text and images)
122
214
  - **Live content collections** via `caretLoader` for `getLiveEntry` / `getLiveCollection` (Astro 6 stable, Astro 5.10+ behind `experimental.liveContentCollections`)
123
215
  - **Content Studio** at `/admin/cms` for structured CRUD
124
216
  - **Section composer** for reordering and spacing page sections
125
- - **Response rewriting** middleware stored edits replace template defaults at render time
217
+ - **Response rewriting** middleware (server delivery) or **build-time HTML bake** (static delivery)
126
218
  - **Scoped bindings** via `data-caret-scope` to reduce repetition
219
+ - **Dev Toolbar app** — in `astro dev`, inspect and highlight every binding on the page (no login required), grouped by entry with deep-links into Studio
127
220
  - **Revision safety** with optimistic locking and restore from history
128
221
  - **Storage adapters** — filesystem (default), in-memory, or custom via `StorageAdapter` interface
129
222
 
@@ -174,17 +267,100 @@ caret({
174
267
  apiBasePath: '/api/cms', // API route prefix (default: /api/cms)
175
268
  enableAdmin: true, // Inject admin pages (default: true)
176
269
  enableInlineEditor: true, // Inject inline editor (default: true)
177
- storage: filesystemStorage(), // Storage adapter (default: filesystem)
270
+ delivery: 'static', // 'static' | 'server' | { mode, bake, publish }
271
+ storage: filesystemStorage(), // Storage adapter (default: markdownStorage when
272
+ // src/content collections exist, else filesystem)
178
273
  uploads: localUploads(), // Upload handler (default: local filesystem)
179
274
  schemas: {}, // Optional JSON Schema map for Studio (default: inferred)
180
275
  })
181
276
  ```
182
277
 
278
+ ## Rendering & output
279
+
280
+ CaretCMS supports two delivery modes via `delivery`:
281
+
282
+ | | **Static delivery** | **Server delivery** (default) |
283
+ |---|---|---|
284
+ | Config | `caret({ delivery: 'static' })` | `caret()` on `output: 'server'` + adapter |
285
+ | Public HTML | Baked at `astro build` | Rewritten per request in middleware |
286
+ | Production CMS routes | Not shipped in static output | `/admin`, `/api/cms` live on the server |
287
+ | Visitor sees edits | After publish + rebuild | Immediately after save |
288
+ | SSR adapter | Not required | Required |
289
+
290
+ ### Static delivery
291
+
292
+ Use when your site stays `output: 'static'`. Local authoring works in `astro dev`; production
293
+ is plain static files with content baked in.
294
+
295
+ ```js
296
+ caret({
297
+ delivery: {
298
+ mode: 'static',
299
+ bake: true,
300
+ publish: {
301
+ webhookUrl: 'https://ci.example.com/hooks/rebuild',
302
+ },
303
+ },
304
+ })
305
+ ```
306
+
307
+ Full guide: [docs/static-delivery.md](../../docs/static-delivery.md).
308
+
309
+ ### Server delivery
310
+
311
+ Middleware injects stored edits at request time. Requires `output: 'server'` (or compatible
312
+ adapter host). Mostly-static site? Under server output you can keep individual pages static
313
+ with `export const prerender = true`; pages with editable content should stay server-rendered.
314
+
315
+ > **Migrating a static site to server delivery:** switching to `output: 'server'` changes
316
+ > how `getStaticPaths` pages receive props. Add `export const prerender = true` to keep a
317
+ > page static, or fetch at request time. This is standard Astro behavior, not CaretCMS-specific.
318
+
319
+ ## What gets written to disk
320
+
321
+ The default (embedded) providers write inside your project:
322
+
323
+ | Path | What | Written by |
324
+ |---|---|---|
325
+ | `.caret/data/` | entry JSON | `filesystemStorage()` (default) |
326
+ | `.caret/drafts/` | per-editor draft overlays | `filesystemStorage()` |
327
+ | `.caretcms/` | revisions + history sidecar | both filesystem and markdown storage |
328
+ | `src/content/**.md` | frontmatter edits | `markdownStorage()` (auto-selected when you have content collections) |
329
+ | `public/uploads/` | uploaded images | `localUploads()` (default) |
330
+
331
+ Recommended `.gitignore` for the transient state (keep `.caret/data/` or your
332
+ `src/content` edits if git IS your content store — see the commit-on-publish
333
+ workflow in [docs/deployment.md](../../docs/deployment.md)):
334
+
335
+ ```gitignore
336
+ .caretcms/
337
+ .caret/drafts/
338
+ public/uploads/
339
+ ```
340
+
341
+ ## Production checklist
342
+
343
+ - `CARET_EDIT_PASSWORD` — the editor password. Without it, production is locked (no dev fallback).
344
+ - `CARET_SESSION_SECRET` — **required in production** when a password is set; sessions are
345
+ HMAC-signed with it. Generate one with `openssl rand -base64 32`. If it's missing, logins
346
+ return a configuration error and existing sessions are treated as signed out.
347
+ - `markdownStorage()` edits `src/content/*.md` **at request time** — a dev/git workflow. In
348
+ production, pair it with commit-on-publish + a CI rebuild (fields rendered through
349
+ `getCollection()` are baked at build time and only refresh on rebuild), or use a server-side
350
+ adapter like [`@caretcms/cloudflare`](https://www.npmjs.com/package/@caretcms/cloudflare).
351
+ - `localUploads()` writes to `public/uploads`, which built sites serve from `dist/client` —
352
+ files uploaded *after* the build won't be served. Treat it as dev-only and use R2 (or your
353
+ own `UploadHandler`) in production.
354
+ - Defaults resolve paths from the **server process's working directory**; run the built server
355
+ from your project root, or pass explicit paths (`filesystemStorage({ dataRoot })`,
356
+ `markdownStorage({ contentRoot })`, `localUploads({ uploadsDir })`).
357
+
183
358
  ## Requirements
184
359
 
185
360
  - Astro 5 or 6
186
361
  - Node 20.19.1+ or 22.12.0+
187
- - Server output mode (for embedded editing routes)
362
+ - **Static delivery:** default Astro static output (no adapter)
363
+ - **Server delivery:** `output: 'server'` plus an SSR adapter
188
364
 
189
365
  ## License
190
366
 
@@ -6,7 +6,23 @@ export interface CloudCmsClientConfig {
6
6
  sessionToken?: string;
7
7
  environment?: string;
8
8
  }
9
+ type Scope = {
10
+ collection: string;
11
+ id: string;
12
+ };
13
+ type Binding = {
14
+ element: Element;
15
+ collection: string;
16
+ id: string;
17
+ field: string;
18
+ isImage: boolean;
19
+ isRich: boolean;
20
+ hasChildMarkup: boolean;
21
+ };
22
+ export declare function getNearestScope(element: Element): Scope | null;
23
+ export declare function resolveBindingValue(value: string, scope: Scope | null): Omit<Binding, "element" | "isImage" | "isRich" | "hasChildMarkup"> | null;
9
24
  export declare function bootstrapCloudCms(config: CloudCmsClientConfig, root?: ParentNode): Promise<void>;
10
25
  export declare function hasCloudCmsSession(config: CloudCmsClientConfig): boolean;
11
26
  export declare function redirectToCloudCmsLogin(config: CloudCmsClientConfig, redirectTo?: string): void;
27
+ export {};
12
28
  //# sourceMappingURL=browser-runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-runtime.d.ts","sourceRoot":"","sources":["../src/browser-runtime.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA8UD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,IAAI,GAAE,UAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAGxE;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAMN"}
1
+ {"version":3,"file":"browser-runtime.d.ts","sourceRoot":"","sources":["../src/browser-runtime.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,KAAK,GAAG;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAgGF,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG,IAAI,CAS9D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,gBAAgB,CAAC,GAAG,IAAI,CAmBjJ;AA+MD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,IAAI,GAAE,UAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAGxE;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAMN"}
@@ -1,3 +1,5 @@
1
+ import { RICH_ALLOWED_TAGS, RICH_ALLOWED_ATTRS, SAFE_HREF_RE, classAllowed, } from "./runtime/rich-allowlist.js";
2
+ import { getNestedValue } from "./runtime/utils.js";
1
3
  function getSessionStorageKey(config) {
2
4
  return `caretcms:cloud-session:${config.endpoint}:${config.projectId}`;
3
5
  }
@@ -90,13 +92,18 @@ function parseScopeValue(value) {
90
92
  return null;
91
93
  return { collection, id };
92
94
  }
93
- function getNearestScope(element) {
94
- const scopeElement = element.closest("[data-caret-scope]");
95
+ export function getNearestScope(element) {
96
+ // ANCESTORS only — never the element itself. The server's rewrite engine
97
+ // processes scope frames for tags opened BEFORE the bound element, so an
98
+ // element carrying both data-caret-scope and data-caret does not scope its
99
+ // own binding; a bare `closest()` here (which matches self) silently
100
+ // resolved such bindings differently from the published render.
101
+ const scopeElement = element.parentElement?.closest("[data-caret-scope]") ?? null;
95
102
  if (!scopeElement)
96
103
  return null;
97
104
  return parseScopeValue(scopeElement.getAttribute("data-caret-scope"));
98
105
  }
99
- function resolveBindingValue(value, scope) {
106
+ export function resolveBindingValue(value, scope) {
100
107
  const parts = value.split("::");
101
108
  if (parts.length === 3) {
102
109
  return {
@@ -140,21 +147,20 @@ function collectBindings(root = document) {
140
147
  return bindings;
141
148
  }
142
149
  // --- Browser-side HTML sanitizer for rich text ---
143
- const RICH_ALLOWED_TAGS = new Set([
144
- "b", "strong", "i", "em", "u", "s", "a", "br", "sub", "sup",
145
- ]);
146
- const RICH_ALLOWED_ATTRS = {
147
- a: new Set(["href", "target", "rel"]),
148
- };
149
- const SAFE_HREF_RE = /^(?:https?:|mailto:|tel:|\/)/i;
150
+ // Allowlist + matcher come from runtime/rich-allowlist.ts (shared with the
151
+ // server sanitizer); static/cms/editor/sanitize.js mirrors them by hand.
150
152
  function sanitizeHtmlBrowser(html) {
151
153
  if (!html)
152
154
  return "";
155
+ const allowedClasses = (typeof window !== "undefined"
156
+ ? window.__CARET__
157
+ ?.allowedClasses
158
+ : undefined) ?? null;
153
159
  const doc = new DOMParser().parseFromString(`<body>${html}</body>`, "text/html");
154
- sanitizeNode(doc.body);
160
+ sanitizeNode(doc.body, allowedClasses);
155
161
  return doc.body.innerHTML;
156
162
  }
157
- function sanitizeNode(parent) {
163
+ function sanitizeNode(parent, allowedClasses) {
158
164
  const children = Array.from(parent.childNodes);
159
165
  for (const node of children) {
160
166
  if (node.nodeType === Node.TEXT_NODE)
@@ -170,12 +176,29 @@ function sanitizeNode(parent) {
170
176
  while (el.firstChild)
171
177
  frag.appendChild(el.firstChild);
172
178
  parent.replaceChild(frag, el);
173
- sanitizeNode(parent);
179
+ sanitizeNode(parent, allowedClasses);
174
180
  return;
175
181
  }
176
182
  const allowed = RICH_ALLOWED_ATTRS[tag];
183
+ const classPatterns = allowedClasses ? allowedClasses[tag] : undefined;
177
184
  const attrs = Array.from(el.attributes);
178
185
  for (const attr of attrs) {
186
+ // class is gated by the per-tag allowlist, not RICH_ALLOWED_ATTRS
187
+ if (attr.name === "class") {
188
+ if (!classPatterns) {
189
+ el.removeAttribute("class");
190
+ continue;
191
+ }
192
+ const kept = attr.value
193
+ .split(/\s+/)
194
+ .filter((c) => c !== "" && classAllowed(c, classPatterns))
195
+ .join(" ");
196
+ if (kept)
197
+ el.setAttribute("class", kept);
198
+ else
199
+ el.removeAttribute("class");
200
+ continue;
201
+ }
179
202
  if (!allowed || !allowed.has(attr.name)) {
180
203
  el.removeAttribute(attr.name);
181
204
  }
@@ -190,19 +213,15 @@ function sanitizeNode(parent) {
190
213
  el.setAttribute("rel", "noopener noreferrer");
191
214
  }
192
215
  }
193
- sanitizeNode(el);
216
+ sanitizeNode(el, allowedClasses);
194
217
  }
195
218
  }
196
219
  function getNestedString(data, path) {
197
- const keys = path.split(".");
198
- let current = data;
199
- for (const key of keys) {
200
- if (!current || typeof current !== "object" || Array.isArray(current)) {
201
- return undefined;
202
- }
203
- current = current[key];
204
- }
205
- return typeof current === "string" ? current : undefined;
220
+ // Shared dot-path semantics: arrays traverse by numeric index. The previous
221
+ // local copy bailed on arrays, so `items.0.title` resolved server-side (the
222
+ // rewrite engine) but silently failed here in the cloud live-sync path.
223
+ const value = getNestedValue(data, path);
224
+ return typeof value === "string" ? value : undefined;
206
225
  }
207
226
  function applyBindingValue(binding, value) {
208
227
  if (binding.isImage) {
@@ -1 +1 @@
1
- {"version":3,"file":"browser-runtime.js","sourceRoot":"","sources":["../src/browser-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser-runtime.js","sourceRoot":"","sources":["../src/browser-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Public contract surface for tooling that interoperates with the runtime
3
+ * without importing it (caretize mirrors these; adapters import them).
4
+ *
5
+ * Everything re-exported here is a compatibility promise: the identifier
6
+ * grammar gates what storage keys exist, the tag list gates what the rewrite
7
+ * engine can render, and the rich allowlist gates what survives sanitization.
8
+ * Mirror copies in other packages are held to these by the parity test
9
+ * (`tests/unit/contracts-parity.test.ts`).
10
+ */
11
+ export { COLLECTION_NAME_RE, ENTRY_ID_RE, EDITOR_ID_RE, assertSafeEditorId, } from "./runtime/storage/id-contracts.js";
12
+ export { REWRITABLE_TEXT_TAGS } from "./runtime/rewrite.js";
13
+ export { RICH_ALLOWED_TAGS, RICH_ALLOWED_ATTRS, SAFE_HREF_RE, } from "./runtime/rich-allowlist.js";
14
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,GACb,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Public contract surface for tooling that interoperates with the runtime
3
+ * without importing it (caretize mirrors these; adapters import them).
4
+ *
5
+ * Everything re-exported here is a compatibility promise: the identifier
6
+ * grammar gates what storage keys exist, the tag list gates what the rewrite
7
+ * engine can render, and the rich allowlist gates what survives sanitization.
8
+ * Mirror copies in other packages are held to these by the parity test
9
+ * (`tests/unit/contracts-parity.test.ts`).
10
+ */
11
+ export { COLLECTION_NAME_RE, ENTRY_ID_RE, EDITOR_ID_RE, assertSafeEditorId, } from "./runtime/storage/id-contracts.js";
12
+ export { REWRITABLE_TEXT_TAGS } from "./runtime/rewrite.js";
13
+ export { RICH_ALLOWED_TAGS, RICH_ALLOWED_ATTRS, SAFE_HREF_RE, } from "./runtime/rich-allowlist.js";
14
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,GACb,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * editable() — make an inline value editable in place.
3
+ *
4
+ * The stega twin of `bindEntry` / `data-caret`: instead of putting the binding
5
+ * key on an element (which props/loops break), it hides the key INSIDE the value
6
+ * via stega, so the content stays click-to-edit even when passed through
7
+ * component props, slots, and `.map()` loops — with no attribute and no live
8
+ * collection.
9
+ *
10
+ * Usage in a `.astro` frontmatter:
11
+ *
12
+ * const features = await editable('pages::home::features.items', [
13
+ * { title: 'Fast', description: '…' },
14
+ * { title: 'SEO', description: '…' },
15
+ * ]);
16
+ * <Features items={features} />
17
+ *
18
+ * `key` is `collection::id` or `collection::id::field-prefix`. The value you pass
19
+ * is the DEFAULT — your code stays the source of truth; any saved edits in the
20
+ * store overlay it. In editor mode each string leaf is stega-encoded with its
21
+ * binding key (`collection::id::<dot.path>`), matching the mutation engine's
22
+ * nested-path writes, so edits round-trip to the same store as data-caret.
23
+ *
24
+ * Safe outside a request context (e.g. static build / plain import): returns the
25
+ * value untouched.
26
+ */
27
+ export declare function editable<T>(key: string, value: T): Promise<T>;
28
+ //# sourceMappingURL=editable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../src/editable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAiFH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA6BnE"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * editable() — make an inline value editable in place.
3
+ *
4
+ * The stega twin of `bindEntry` / `data-caret`: instead of putting the binding
5
+ * key on an element (which props/loops break), it hides the key INSIDE the value
6
+ * via stega, so the content stays click-to-edit even when passed through
7
+ * component props, slots, and `.map()` loops — with no attribute and no live
8
+ * collection.
9
+ *
10
+ * Usage in a `.astro` frontmatter:
11
+ *
12
+ * const features = await editable('pages::home::features.items', [
13
+ * { title: 'Fast', description: '…' },
14
+ * { title: 'SEO', description: '…' },
15
+ * ]);
16
+ * <Features items={features} />
17
+ *
18
+ * `key` is `collection::id` or `collection::id::field-prefix`. The value you pass
19
+ * is the DEFAULT — your code stays the source of truth; any saved edits in the
20
+ * store overlay it. In editor mode each string leaf is stega-encoded with its
21
+ * binding key (`collection::id::<dot.path>`), matching the mutation engine's
22
+ * nested-path writes, so edits round-trip to the same store as data-caret.
23
+ *
24
+ * Safe outside a request context (e.g. static build / plain import): returns the
25
+ * value untouched.
26
+ */
27
+ import { getRequestContext } from "./runtime/request-context.js";
28
+ import { stegaCombine } from "./runtime/stega.js";
29
+ import { getNestedValue as getByPath } from "./runtime/utils.js";
30
+ /**
31
+ * Overlay `override` onto `base` (override wins where defined). Objects merge by
32
+ * key, arrays merge by index — so a single saved item field overlays only that
33
+ * leaf and untouched defaults survive. Scalars: override replaces base.
34
+ */
35
+ function deepMerge(base, override) {
36
+ if (override === undefined)
37
+ return base;
38
+ if (Array.isArray(base) && Array.isArray(override)) {
39
+ return base.map((item, i) => deepMerge(item, override[i]));
40
+ }
41
+ if (base !== null &&
42
+ typeof base === "object" &&
43
+ !Array.isArray(base) &&
44
+ override !== null &&
45
+ typeof override === "object" &&
46
+ !Array.isArray(override)) {
47
+ const out = { ...base };
48
+ for (const [k, v] of Object.entries(override)) {
49
+ out[k] = deepMerge(base[k], v);
50
+ }
51
+ return out;
52
+ }
53
+ return override;
54
+ }
55
+ /**
56
+ * An imported asset (Astro `ImageMetadata`): `{ src, width, height, format }`.
57
+ * Its strings are machine identifiers (URL, format token) consumed by the image
58
+ * pipeline — NOT human-readable text. Stega-encoding them corrupts the value
59
+ * (e.g. `format: "jpg"` → `"jpg<invisible>"`, which `astro:assets` rejects), so
60
+ * these objects must pass through `encodeLeaves` untouched.
61
+ */
62
+ function isAssetLike(value) {
63
+ if (value === null || typeof value !== "object")
64
+ return false;
65
+ const v = value;
66
+ return (typeof v.src === "string" &&
67
+ typeof v.width === "number" &&
68
+ typeof v.height === "number" &&
69
+ typeof v.format === "string");
70
+ }
71
+ /** Stega-encode every string leaf with its full `collection::id::field` key. */
72
+ function encodeLeaves(value, collection, id, fieldPath) {
73
+ if (typeof value === "string") {
74
+ return stegaCombine(value, `${collection}::${id}::${fieldPath}`);
75
+ }
76
+ // Asset descriptors (ImageMetadata) carry identifiers, not editable text —
77
+ // leave them intact so the image pipeline receives a clean src/format.
78
+ if (isAssetLike(value)) {
79
+ return value;
80
+ }
81
+ if (Array.isArray(value)) {
82
+ return value.map((v, i) => encodeLeaves(v, collection, id, fieldPath ? `${fieldPath}.${i}` : `${i}`));
83
+ }
84
+ if (value !== null && typeof value === "object") {
85
+ const out = {};
86
+ for (const [k, v] of Object.entries(value)) {
87
+ out[k] = encodeLeaves(v, collection, id, fieldPath ? `${fieldPath}.${k}` : k);
88
+ }
89
+ return out;
90
+ }
91
+ return value;
92
+ }
93
+ export async function editable(key, value) {
94
+ const ctx = getRequestContext();
95
+ if (!ctx)
96
+ return value;
97
+ const parts = key.split("::");
98
+ const collection = parts[0];
99
+ const id = parts[1];
100
+ const fieldPrefix = parts.slice(2).join("::");
101
+ if (!collection || !id)
102
+ return value;
103
+ // 1. Overlay: merge any saved values over the inline default.
104
+ let result = value;
105
+ try {
106
+ const stored = await ctx.adapter.getEntry(collection, id);
107
+ if (stored && stored.data) {
108
+ const override = fieldPrefix ? getByPath(stored.data, fieldPrefix) : stored.data;
109
+ result = deepMerge(value, override);
110
+ }
111
+ }
112
+ catch {
113
+ // store unavailable → keep the inline default
114
+ }
115
+ // 2. Stega: editor only — embed binding keys so it's click-to-edit through
116
+ // whatever props/loops the value flows through.
117
+ if (ctx.editor) {
118
+ result = encodeLeaves(result, collection, id, fieldPrefix);
119
+ }
120
+ return result;
121
+ }
122
+ //# sourceMappingURL=editable.js.map