@caretcms/core 0.3.0 → 0.4.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 (223) hide show
  1. package/README.md +116 -11
  2. package/dist/index.d.ts +15 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +78 -5
  5. package/dist/index.js.map +1 -1
  6. package/dist/loader.d.ts.map +1 -1
  7. package/dist/loader.js +8 -0
  8. package/dist/loader.js.map +1 -1
  9. package/dist/markdown/paragraphs.d.ts +14 -0
  10. package/dist/markdown/paragraphs.d.ts.map +1 -0
  11. package/dist/markdown/paragraphs.js +61 -0
  12. package/dist/markdown/paragraphs.js.map +1 -0
  13. package/dist/markdown/remark.d.ts.map +1 -1
  14. package/dist/markdown/remark.js +1 -0
  15. package/dist/markdown/remark.js.map +1 -1
  16. package/dist/markdown/satteri.d.ts.map +1 -1
  17. package/dist/markdown/satteri.js +3 -1
  18. package/dist/markdown/satteri.js.map +1 -1
  19. package/dist/markdown/stamp.d.ts +0 -9
  20. package/dist/markdown/stamp.d.ts.map +1 -1
  21. package/dist/markdown/stamp.js +6 -0
  22. package/dist/markdown/stamp.js.map +1 -1
  23. package/dist/providers/deployment/github.d.ts +27 -0
  24. package/dist/providers/deployment/github.d.ts.map +1 -0
  25. package/dist/providers/deployment/github.js +180 -0
  26. package/dist/providers/deployment/github.js.map +1 -0
  27. package/dist/providers/deployment/simulated.d.ts +10 -0
  28. package/dist/providers/deployment/simulated.d.ts.map +1 -0
  29. package/dist/providers/deployment/simulated.js +29 -0
  30. package/dist/providers/deployment/simulated.js.map +1 -0
  31. package/dist/runtime/authorization.d.ts +11 -0
  32. package/dist/runtime/authorization.d.ts.map +1 -0
  33. package/dist/runtime/authorization.js +29 -0
  34. package/dist/runtime/authorization.js.map +1 -0
  35. package/dist/runtime/collection-policy.d.ts +11 -0
  36. package/dist/runtime/collection-policy.d.ts.map +1 -0
  37. package/dist/runtime/collection-policy.js +44 -0
  38. package/dist/runtime/collection-policy.js.map +1 -0
  39. package/dist/runtime/content-errors.d.ts +9 -0
  40. package/dist/runtime/content-errors.d.ts.map +1 -0
  41. package/dist/runtime/content-errors.js +17 -0
  42. package/dist/runtime/content-errors.js.map +1 -0
  43. package/dist/runtime/content.d.ts.map +1 -1
  44. package/dist/runtime/content.js +13 -4
  45. package/dist/runtime/content.js.map +1 -1
  46. package/dist/runtime/deployment-status.d.ts +14 -0
  47. package/dist/runtime/deployment-status.d.ts.map +1 -0
  48. package/dist/runtime/deployment-status.js +57 -0
  49. package/dist/runtime/deployment-status.js.map +1 -0
  50. package/dist/runtime/draft-state.d.ts +16 -0
  51. package/dist/runtime/draft-state.d.ts.map +1 -0
  52. package/dist/runtime/draft-state.js +29 -0
  53. package/dist/runtime/draft-state.js.map +1 -0
  54. package/dist/runtime/i18n.d.ts +13 -2
  55. package/dist/runtime/i18n.d.ts.map +1 -1
  56. package/dist/runtime/i18n.js +26 -4
  57. package/dist/runtime/i18n.js.map +1 -1
  58. package/dist/runtime/index.d.ts +1 -0
  59. package/dist/runtime/index.d.ts.map +1 -1
  60. package/dist/runtime/index.js +1 -0
  61. package/dist/runtime/index.js.map +1 -1
  62. package/dist/runtime/middleware.d.ts.map +1 -1
  63. package/dist/runtime/middleware.js +21 -2
  64. package/dist/runtime/middleware.js.map +1 -1
  65. package/dist/runtime/mutations/contracts.d.ts +9 -0
  66. package/dist/runtime/mutations/contracts.d.ts.map +1 -1
  67. package/dist/runtime/mutations/contracts.js +45 -4
  68. package/dist/runtime/mutations/contracts.js.map +1 -1
  69. package/dist/runtime/mutations/engine.d.ts +2 -0
  70. package/dist/runtime/mutations/engine.d.ts.map +1 -1
  71. package/dist/runtime/mutations/engine.js +115 -63
  72. package/dist/runtime/mutations/engine.js.map +1 -1
  73. package/dist/runtime/providers.d.ts +3 -1
  74. package/dist/runtime/providers.d.ts.map +1 -1
  75. package/dist/runtime/providers.js +12 -1
  76. package/dist/runtime/providers.js.map +1 -1
  77. package/dist/runtime/publish-recovery.d.ts +32 -0
  78. package/dist/runtime/publish-recovery.d.ts.map +1 -0
  79. package/dist/runtime/publish-recovery.js +98 -0
  80. package/dist/runtime/publish-recovery.js.map +1 -0
  81. package/dist/runtime/publish.d.ts +10 -4
  82. package/dist/runtime/publish.d.ts.map +1 -1
  83. package/dist/runtime/publish.js +104 -67
  84. package/dist/runtime/publish.js.map +1 -1
  85. package/dist/runtime/rebuild-webhook.d.ts +4 -0
  86. package/dist/runtime/rebuild-webhook.d.ts.map +1 -1
  87. package/dist/runtime/rebuild-webhook.js +12 -2
  88. package/dist/runtime/rebuild-webhook.js.map +1 -1
  89. package/dist/runtime/request-context.d.ts +3 -1
  90. package/dist/runtime/request-context.d.ts.map +1 -1
  91. package/dist/runtime/request-context.js.map +1 -1
  92. package/dist/runtime/rewrite.d.ts.map +1 -1
  93. package/dist/runtime/rewrite.js +28 -2
  94. package/dist/runtime/rewrite.js.map +1 -1
  95. package/dist/runtime/rich-allowlist.js +1 -1
  96. package/dist/runtime/rich-allowlist.js.map +1 -1
  97. package/dist/runtime/routes/admin-entry.d.ts.map +1 -1
  98. package/dist/runtime/routes/admin-entry.js +24 -12
  99. package/dist/runtime/routes/admin-entry.js.map +1 -1
  100. package/dist/runtime/routes/auth-session.d.ts.map +1 -1
  101. package/dist/runtime/routes/auth-session.js +6 -0
  102. package/dist/runtime/routes/auth-session.js.map +1 -1
  103. package/dist/runtime/routes/collection-list.d.ts.map +1 -1
  104. package/dist/runtime/routes/collection-list.js +164 -40
  105. package/dist/runtime/routes/collection-list.js.map +1 -1
  106. package/dist/runtime/routes/deployment.d.ts +5 -0
  107. package/dist/runtime/routes/deployment.d.ts.map +1 -0
  108. package/dist/runtime/routes/deployment.js +38 -0
  109. package/dist/runtime/routes/deployment.js.map +1 -0
  110. package/dist/runtime/routes/draft.d.ts.map +1 -1
  111. package/dist/runtime/routes/draft.js +10 -3
  112. package/dist/runtime/routes/draft.js.map +1 -1
  113. package/dist/runtime/routes/entries.d.ts.map +1 -1
  114. package/dist/runtime/routes/entries.js +74 -39
  115. package/dist/runtime/routes/entries.js.map +1 -1
  116. package/dist/runtime/routes/history.d.ts.map +1 -1
  117. package/dist/runtime/routes/history.js +37 -21
  118. package/dist/runtime/routes/history.js.map +1 -1
  119. package/dist/runtime/routes/mutate.d.ts.map +1 -1
  120. package/dist/runtime/routes/mutate.js +4 -1
  121. package/dist/runtime/routes/mutate.js.map +1 -1
  122. package/dist/runtime/routes/publish.d.ts.map +1 -1
  123. package/dist/runtime/routes/publish.js +127 -33
  124. package/dist/runtime/routes/publish.js.map +1 -1
  125. package/dist/runtime/routes/schema.d.ts.map +1 -1
  126. package/dist/runtime/routes/schema.js +4 -0
  127. package/dist/runtime/routes/schema.js.map +1 -1
  128. package/dist/runtime/routes/studio-home.d.ts.map +1 -1
  129. package/dist/runtime/routes/studio-home.js +3 -1
  130. package/dist/runtime/routes/studio-home.js.map +1 -1
  131. package/dist/runtime/routes/upload.d.ts.map +1 -1
  132. package/dist/runtime/routes/upload.js +3 -0
  133. package/dist/runtime/routes/upload.js.map +1 -1
  134. package/dist/runtime/schema-registry.d.ts.map +1 -1
  135. package/dist/runtime/schema-registry.js +2 -0
  136. package/dist/runtime/schema-registry.js.map +1 -1
  137. package/dist/runtime/storage/entry-commit.d.ts +8 -0
  138. package/dist/runtime/storage/entry-commit.d.ts.map +1 -0
  139. package/dist/runtime/storage/entry-commit.js +45 -0
  140. package/dist/runtime/storage/entry-commit.js.map +1 -0
  141. package/dist/runtime/storage/filesystem-adapter.d.ts +5 -0
  142. package/dist/runtime/storage/filesystem-adapter.d.ts.map +1 -1
  143. package/dist/runtime/storage/filesystem-adapter.js +12 -3
  144. package/dist/runtime/storage/filesystem-adapter.js.map +1 -1
  145. package/dist/runtime/storage/frontmatter-codec.d.ts +5 -23
  146. package/dist/runtime/storage/frontmatter-codec.d.ts.map +1 -1
  147. package/dist/runtime/storage/frontmatter-codec.js +156 -13
  148. package/dist/runtime/storage/frontmatter-codec.js.map +1 -1
  149. package/dist/runtime/storage/in-memory-adapter.d.ts +7 -0
  150. package/dist/runtime/storage/in-memory-adapter.d.ts.map +1 -1
  151. package/dist/runtime/storage/in-memory-adapter.js +6 -0
  152. package/dist/runtime/storage/in-memory-adapter.js.map +1 -1
  153. package/dist/runtime/storage/markdown-adapter.d.ts.map +1 -1
  154. package/dist/runtime/storage/markdown-adapter.js +18 -20
  155. package/dist/runtime/storage/markdown-adapter.js.map +1 -1
  156. package/dist/runtime/storage/session-overlay-adapter.d.ts +12 -4
  157. package/dist/runtime/storage/session-overlay-adapter.d.ts.map +1 -1
  158. package/dist/runtime/storage/session-overlay-adapter.js +100 -13
  159. package/dist/runtime/storage/session-overlay-adapter.js.map +1 -1
  160. package/dist/runtime/storage/sidecar-meta-store.d.ts +5 -0
  161. package/dist/runtime/storage/sidecar-meta-store.d.ts.map +1 -1
  162. package/dist/runtime/storage/sidecar-meta-store.js +48 -5
  163. package/dist/runtime/storage/sidecar-meta-store.js.map +1 -1
  164. package/dist/runtime/utils.d.ts.map +1 -1
  165. package/dist/runtime/utils.js +3 -4
  166. package/dist/runtime/utils.js.map +1 -1
  167. package/dist/types.d.ts +123 -1
  168. package/dist/types.d.ts.map +1 -1
  169. package/package.json +12 -3
  170. package/static/cms/admin-entry.css +9 -0
  171. package/static/cms/admin-entry.js +251 -687
  172. package/static/cms/dev-toolbar/app.js +78 -19
  173. package/static/cms/editor/config.js +35 -15
  174. package/static/cms/editor/content-map.css +8 -1
  175. package/static/cms/editor/content-map.js +62 -23
  176. package/static/cms/editor/deployment-status.js +66 -0
  177. package/static/cms/editor/draft-client.js +87 -0
  178. package/static/cms/editor/guards.js +20 -0
  179. package/static/cms/editor/helpers.js +30 -1
  180. package/static/cms/editor/highlight.js +1 -0
  181. package/static/cms/editor/image-edit.js +43 -1
  182. package/static/cms/editor/image-utils.js +23 -7
  183. package/static/cms/editor/link-follow.js +122 -41
  184. package/static/cms/editor/link-ui.css +10 -1
  185. package/static/cms/editor/linkify.js +2 -0
  186. package/static/cms/editor/md-block-edit.js +140 -37
  187. package/static/cms/editor/md-paragraphs.js +98 -0
  188. package/static/cms/editor/md-serialize.js +1 -1
  189. package/static/cms/editor/panel.js +43 -15
  190. package/static/cms/editor/preview-mode.js +44 -0
  191. package/static/cms/editor/publish-result.js +100 -0
  192. package/static/cms/editor/rich-toolbar.js +58 -15
  193. package/static/cms/editor/sanitize.js +6 -2
  194. package/static/cms/editor/save-queue.js +75 -17
  195. package/static/cms/editor/section-controls/activation.js +3 -0
  196. package/static/cms/editor/section-controls/api.js +25 -7
  197. package/static/cms/editor/section-controls/index.js +60 -8
  198. package/static/cms/editor/section-controls/model.js +39 -4
  199. package/static/cms/editor/section-controls/mutations.js +15 -0
  200. package/static/cms/editor/section-controls/page-context.js +9 -0
  201. package/static/cms/editor/section-controls/pickers.js +53 -2
  202. package/static/cms/editor/section-controls/reorder.js +23 -0
  203. package/static/cms/editor/section-controls/selection.js +6 -0
  204. package/static/cms/editor/section-controls/spacing-drag.js +16 -0
  205. package/static/cms/editor/section-controls/ui-elements.js +7 -0
  206. package/static/cms/editor/section-controls/utils.js +7 -0
  207. package/static/cms/editor/section-controls.css +18 -3
  208. package/static/cms/editor/security.js +13 -2
  209. package/static/cms/editor/stega-hydrate.js +17 -4
  210. package/static/cms/editor/sync.js +208 -10
  211. package/static/cms/editor/text-edit.js +37 -3
  212. package/static/cms/editor/text-link-interactions.js +59 -17
  213. package/static/cms/editor/toast.js +23 -9
  214. package/static/cms/editor/toolbar.css +5 -0
  215. package/static/cms/editor/toolbar.js +91 -101
  216. package/static/cms/editor.js +2 -1
  217. package/static/cms/studio/entry-loader.js +102 -0
  218. package/static/cms/studio/field-model.js +110 -0
  219. package/static/cms/studio/fields.js +319 -0
  220. package/static/cms/studio/history-client.js +74 -0
  221. package/static/cms/studio/mutation-client.js +74 -0
  222. package/static/cms/studio/sync-client.js +107 -0
  223. package/static/cms/studio/upload-client.js +109 -0
@@ -1,8 +1,10 @@
1
+ import { canPerform } from "../authorization.js";
1
2
  export const prerender = false;
2
3
  import { isEditorAuthenticated } from "../auth/session.js";
3
4
  import { getRuntimeConfig } from "../config.js";
4
5
  import { resolveAdapter } from "./_helpers.js";
5
6
  import { isKnownStudioCollection, resolveCollectionStudioConfig, } from "../schema-registry.js";
7
+ import { publicationField } from "../collection-policy.js";
6
8
  import { escapeHtml, htmlResponse, redirectResponse, renderStudioPage, serializeJsonForScript, } from "../views/studio-layout.js";
7
9
  function humanize(name) {
8
10
  return name.replace(/[-_]+/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
@@ -27,8 +29,9 @@ export async function GET(context) {
27
29
  }
28
30
  const label = collectionConfig.label || humanize(collection);
29
31
  const messages = runtime.messages;
30
- const creatable = collectionConfig.creatable !== false;
31
- const orderable = collectionConfig.orderable !== false;
32
+ const creatable = collectionConfig.creatable !== false && await canPerform("edit", collection);
33
+ const orderable = collectionConfig.orderable !== false && await canPerform("edit", collection);
34
+ const publicationFieldName = publicationField(collectionConfig);
32
35
  const safeCollection = escapeHtml(collection);
33
36
  const extraStyles = `
34
37
  .entry-card {
@@ -67,6 +70,8 @@ export async function GET(context) {
67
70
  .reorder-handle { color: var(--studio-text-dim); font-size: 16px; line-height: 1; flex-shrink: 0; }
68
71
  .reorder-label { flex: 1; font-size: 14px; color: var(--studio-text); }
69
72
  .reorder-order { font-size: 11px; color: var(--studio-text-dim); font-variant-numeric: tabular-nums; min-width: 24px; text-align: right; }
73
+ .reorder-controls { display: flex; gap: 0.35rem; flex-shrink: 0; }
74
+ .reorder-move { min-width: 32px; padding: 4px 8px; }
70
75
  .modal-backdrop {
71
76
  position: fixed;
72
77
  inset: 0;
@@ -107,7 +112,7 @@ export async function GET(context) {
107
112
  <div style="display:flex;align-items:center;gap:0.75rem;flex-wrap:wrap;">
108
113
  <label for="search-input" style="font-size:0.7rem;color:var(--studio-text-dim);">${escapeHtml(messages["collection.search"])}</label>
109
114
  <input id="search-input" name="search" type="search" placeholder="${escapeHtml(messages["collection.searchPlaceholder"])}" class="studio-input" style="max-width:240px;" />
110
- ${orderable ? `<button id="btn-reorder" class="studio-btn-ghost">${escapeHtml(messages["collection.reorder"])}</button>` : ""}
115
+ ${orderable ? `<button id="btn-reorder" type="button" class="studio-btn-ghost" aria-controls="reorder-container" aria-expanded="false">${escapeHtml(messages["collection.reorder"])}</button>` : ""}
111
116
  ${creatable ? `<button id="btn-new" class="studio-btn-primary">${escapeHtml(messages["collection.new"])}</button>` : ""}
112
117
  </div>
113
118
  </div>
@@ -128,30 +133,37 @@ export async function GET(context) {
128
133
 
129
134
  <div id="entries-grid" hidden style="display:grid;gap:1rem;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));"></div>
130
135
 
131
- <div id="reorder-container" hidden>
132
- <div id="reorder-list" style="display:flex;flex-direction:column;gap:0.25rem;"></div>
136
+ <nav id="pagination" aria-label="${escapeHtml(messages["collection.pagination"])}" hidden style="display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-top:1rem;">
137
+ <button id="page-prev" type="button" class="studio-btn-ghost">${escapeHtml(messages["collection.previous"])}</button>
138
+ <span id="page-range" role="status" aria-live="polite"></span>
139
+ <button id="page-next" type="button" class="studio-btn-ghost">${escapeHtml(messages["collection.next"])}</button>
140
+ </nav>
141
+ <p id="reorder-scope" hidden style="font-size:0.8rem;color:var(--studio-text-dim);">${escapeHtml(messages["collection.reorderScope"])}</p>
142
+
143
+ <div id="reorder-container" role="region" aria-label="${escapeHtml(messages["collection.reorder"])}" hidden>
144
+ <div id="reorder-list" role="list" style="display:flex;flex-direction:column;gap:0.25rem;"></div>
133
145
  <div style="display:flex;justify-content:flex-end;gap:0.75rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--studio-border);">
134
- <button id="btn-reorder-cancel" class="studio-btn-ghost">${escapeHtml(messages["common.cancel"])}</button>
135
- <button id="btn-reorder-save" class="studio-btn-primary">${escapeHtml(messages["collection.saveOrder"])}</button>
146
+ <button id="btn-reorder-cancel" type="button" class="studio-btn-ghost">${escapeHtml(messages["common.cancel"])}</button>
147
+ <button id="btn-reorder-save" type="button" class="studio-btn-primary">${escapeHtml(messages["collection.saveOrder"])}</button>
136
148
  </div>
137
149
  </div>
138
150
  </div>
139
151
 
140
- <div id="create-dialog" class="modal-backdrop" hidden>
152
+ <div id="create-dialog" class="modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="create-dialog-title" aria-describedby="create-hint" hidden>
141
153
  <div class="modal-card">
142
154
  <div class="modal-header">
143
- <span>${escapeHtml(messages["collection.newEntry"])}</span>
144
- <button id="btn-create-close" class="studio-btn-ghost" style="padding:4px 10px;">${escapeHtml(messages["common.close"])}</button>
155
+ <h2 id="create-dialog-title" style="font:inherit;letter-spacing:inherit;text-transform:inherit;margin:0;">${escapeHtml(messages["collection.newEntry"])}</h2>
156
+ <button id="btn-create-close" type="button" class="studio-btn-ghost" style="padding:4px 10px;">${escapeHtml(messages["common.close"])}</button>
145
157
  </div>
146
158
  <div class="modal-body">
147
159
  <label for="create-id-input" class="studio-label">${escapeHtml(messages["collection.entryId"])}</label>
148
160
  <input id="create-id-input" type="text" class="studio-input" placeholder="${escapeHtml(messages["collection.entryIdPlaceholder"])}" autocomplete="off" spellcheck="false" />
149
161
  <p id="create-hint" style="font-size:10px;margin:0.5rem 0 0.35rem;color:var(--studio-text-dim);">${escapeHtml(messages["collection.idHint"])}</p>
150
- <p style="font-size:10px;margin:0 0 1rem;color:var(--studio-text-dim);">${escapeHtml(messages["collection.publishHint"])}</p>
162
+ ${publicationFieldName ? `<p style="font-size:10px;margin:0 0 1rem;color:var(--studio-text-dim);">${escapeHtml(messages["collection.publishHint"])}</p>` : ""}
151
163
  <p id="create-error" class="studio-error-text" hidden></p>
152
164
  <div style="display:flex;justify-content:flex-end;gap:0.75rem;">
153
- <button id="btn-create-cancel" class="studio-btn-ghost">${escapeHtml(messages["common.cancel"])}</button>
154
- <button id="btn-create-confirm" class="studio-btn-primary" disabled>${escapeHtml(messages["collection.create"])}</button>
165
+ <button id="btn-create-cancel" type="button" class="studio-btn-ghost">${escapeHtml(messages["common.cancel"])}</button>
166
+ <button id="btn-create-confirm" type="button" class="studio-btn-primary" disabled>${escapeHtml(messages["collection.create"])}</button>
155
167
  </div>
156
168
  </div>
157
169
  </div>
@@ -161,8 +173,18 @@ export async function GET(context) {
161
173
  var API = ${serializeJsonForScript(runtime.apiBasePath)};
162
174
  var MOUNT = ${serializeJsonForScript(runtime.mountPath)};
163
175
  var MSG = ${serializeJsonForScript(messages)};
176
+ var PUBLICATION_FIELD = ${serializeJsonForScript(publicationFieldName)};
164
177
  var ID_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
165
178
  var allEntries = [];
179
+ var currentPage = 1;
180
+ var query = '';
181
+ var requestVersion = 0;
182
+ var searchTimer;
183
+ var pagination = document.getElementById('pagination');
184
+ var previousPage = document.getElementById('page-prev');
185
+ var nextPage = document.getElementById('page-next');
186
+ var pageRange = document.getElementById('page-range');
187
+ var reorderScope = document.getElementById('reorder-scope');
166
188
 
167
189
  var grid = document.getElementById('entries-grid');
168
190
  var loading = document.getElementById('loading');
@@ -182,6 +204,10 @@ export async function GET(context) {
182
204
  var idInput = document.getElementById('create-id-input');
183
205
  var errorEl = document.getElementById('create-error');
184
206
  var confirmBtn = document.getElementById('btn-create-confirm');
207
+ var createCloseBtn = document.getElementById('btn-create-close');
208
+ var createCancelBtn = document.getElementById('btn-create-cancel');
209
+ var dialogTrigger = null;
210
+ var knownDuplicateIds = new Set();
185
211
 
186
212
  function htmlEsc(s) { return String(s).replace(/[&<>"']/g, function (c) {
187
213
  return { '&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;' }[c]; });
@@ -226,11 +252,11 @@ export async function GET(context) {
226
252
  grid.hidden = false;
227
253
  for (var i = 0; i < entries.length; i++) {
228
254
  var entry = entries[i];
229
- var title = getTitle(entry.data);
255
+ var title = entry.readError ? entry.id : getTitle(entry.data);
230
256
  var thumb = getThumb(entry.data);
231
257
  var subtitle = getSubtitle(entry.data);
232
- var publication = entry.data && typeof entry.data.published === 'boolean'
233
- ? (entry.data.published
258
+ var publication = PUBLICATION_FIELD && entry.data && typeof entry.data[PUBLICATION_FIELD] === 'boolean'
259
+ ? (entry.data[PUBLICATION_FIELD]
234
260
  ? '<span style="font-size:0.62rem;color:var(--studio-green);">' + htmlEsc(MSG['collection.published']) + '</span>'
235
261
  : '<span style="font-size:0.62rem;color:var(--studio-text-dim);">' + htmlEsc(MSG['collection.unpublished']) + '</span>')
236
262
  : '';
@@ -248,7 +274,7 @@ export async function GET(context) {
248
274
  '<div style="padding:1rem;">' +
249
275
  '<h2 style="font-size:0.875rem;font-weight:500;margin:0 0 0.25rem;color:var(--studio-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">' + htmlEsc(title) + '</h2>' +
250
276
  (subtitle ? '<p style="font-size:0.7rem;margin:0 0 0.25rem;color:var(--studio-text-dim);text-transform:capitalize;">' + htmlEsc(subtitle) + '</p>' : '') +
251
- invalid +
277
+ (entry.readError ? '<p role="note">' + htmlEsc(MSG['collection.unreadable']) + '</p>' : invalid) +
252
278
  publication +
253
279
  '<p style="font-size:0.65rem;margin:0;color:var(--studio-text-dim);font-family:var(--studio-font-mono);">' + htmlEsc(entry.id) + '</p>' +
254
280
  '</div>';
@@ -257,11 +283,14 @@ export async function GET(context) {
257
283
  }
258
284
 
259
285
  function loadEntries() {
286
+ var version = ++requestVersion;
287
+ pagination.hidden = true;
288
+ if (reorderBtn) reorderBtn.disabled = true;
260
289
  loading.hidden = false;
261
290
  errorState.hidden = true;
262
291
  empty.hidden = true;
263
292
  grid.hidden = true;
264
- fetch(API + '/entries?collection=' + encodeURIComponent(COLLECTION))
293
+ return fetch(API + '/entries?collection=' + encodeURIComponent(COLLECTION) + '&page=' + currentPage + '&q=' + encodeURIComponent(query))
265
294
  .then(function (res) {
266
295
  if (res.status === 401) {
267
296
  window.location.href = MOUNT + '?redirect=' + encodeURIComponent(window.location.pathname);
@@ -271,15 +300,27 @@ export async function GET(context) {
271
300
  return res.json();
272
301
  })
273
302
  .then(function (json) {
274
- if (!json) return;
303
+ if (!json || version !== requestVersion) return;
275
304
  allEntries = Array.isArray(json.entries) ? json.entries : [];
276
305
  loading.hidden = true;
277
- countEl.textContent = allEntries.length + ' ' + (allEntries.length === 1 ? MSG['count.entry'] : MSG['count.entries']);
306
+ var paging = json.pagination;
307
+ currentPage = paging.page;
308
+ countEl.textContent = paging.total + ' ' + (paging.total === 1 ? MSG['count.entry'] : MSG['count.entries']);
309
+ previousPage.disabled = !paging.hasPrev;
310
+ nextPage.disabled = !paging.hasNext;
311
+ pageRange.textContent = MSG['collection.range'].replace('{start}', paging.total ? (paging.page - 1) * paging.pageSize + 1 : 0).replace('{end}', Math.min(paging.page * paging.pageSize, paging.total)).replace('{total}', paging.total);
312
+ pagination.hidden = paging.total === 0;
313
+ empty.querySelector('p').textContent = query ? MSG['collection.noResults'] : MSG['collection.noEntries'];
314
+ if (emptyCreateBtn) emptyCreateBtn.hidden = Boolean(query);
315
+ var limited = Boolean(query) || paging.totalPages > 1 || allEntries.some(function (entry) { return entry.readError; });
316
+ if (reorderBtn) { reorderBtn.disabled = limited; reorderScope.hidden = !limited; }
317
+
278
318
  renderEntries(allEntries);
279
319
  })
280
320
  .catch(function () {
321
+ if (version !== requestVersion) return;
281
322
  loading.hidden = true;
282
- countEl.textContent = 'Error';
323
+ countEl.textContent = MSG['common.error'];
283
324
  errorState.hidden = false;
284
325
  });
285
326
  }
@@ -287,30 +328,39 @@ export async function GET(context) {
287
328
  loadEntries();
288
329
  retryBtn.addEventListener('click', loadEntries);
289
330
 
331
+ previousPage.addEventListener('click', function () { currentPage--; loadEntries(); });
332
+ nextPage.addEventListener('click', function () { currentPage++; loadEntries(); });
290
333
  searchInput.addEventListener('input', function () {
291
- var q = searchInput.value.toLowerCase();
292
- if (!q) { renderEntries(allEntries); return; }
293
- var filtered = allEntries.filter(function (e) {
294
- var t = getTitle(e.data).toLowerCase();
295
- return t.indexOf(q) >= 0 || e.id.toLowerCase().indexOf(q) >= 0;
296
- });
297
- renderEntries(filtered);
334
+ clearTimeout(searchTimer);
335
+ ++requestVersion; // ignore older responses immediately, including during debounce
336
+ if (reorderBtn) reorderBtn.disabled = true;
337
+ previousPage.disabled = true; nextPage.disabled = true;
338
+ searchTimer = setTimeout(function () {
339
+ query = searchInput.value.trim(); currentPage = 1; loadEntries();
340
+ }, 180);
298
341
  });
299
342
 
300
343
  /* ─── Create dialog ─────────────────────────────────────────────── */
301
344
  function openDialog() {
345
+ dialogTrigger = document.activeElement instanceof HTMLElement ? document.activeElement : null;
302
346
  dialog.hidden = false;
303
347
  idInput.value = '';
304
348
  errorEl.hidden = true;
305
349
  confirmBtn.disabled = true;
306
350
  idInput.focus();
307
351
  }
308
- function closeDialog() { dialog.hidden = true; }
352
+ function closeDialog() {
353
+ if (dialog.hidden) return;
354
+ dialog.hidden = true;
355
+ var trigger = dialogTrigger;
356
+ dialogTrigger = null;
357
+ if (trigger && trigger.isConnected) trigger.focus();
358
+ }
309
359
  function validate() {
310
360
  var v = idInput.value.trim();
311
361
  if (!v) { confirmBtn.disabled = true; errorEl.hidden = true; return; }
312
362
  if (!ID_RE.test(v)) { errorEl.textContent = MSG['collection.invalidId']; errorEl.hidden = false; confirmBtn.disabled = true; return; }
313
- if (allEntries.some(function (e) { return e.id === v; })) { errorEl.textContent = MSG['collection.duplicateId']; errorEl.hidden = false; confirmBtn.disabled = true; return; }
363
+ if (knownDuplicateIds.has(v) || allEntries.some(function (e) { return e.id === v; })) { errorEl.textContent = MSG['collection.duplicateId']; errorEl.hidden = false; confirmBtn.disabled = true; return; }
314
364
  errorEl.hidden = true; confirmBtn.disabled = false;
315
365
  }
316
366
  function createEntry() {
@@ -328,12 +378,22 @@ export async function GET(context) {
328
378
  method: 'POST',
329
379
  headers: { 'Content-Type': 'application/json', 'x-caret-request': '1' },
330
380
  credentials: 'same-origin',
331
- body: JSON.stringify({ type: 'put_entry', collection: COLLECTION, id: entryId, data: template }),
381
+ body: JSON.stringify({ type: 'put_entry', collection: COLLECTION, id: entryId, data: template, createOnly: true }),
332
382
  });
333
383
  })
334
384
  .then(function (res) {
335
385
  if (!res) return;
336
386
  if (res.status === 401) { window.location.href = MOUNT + '?redirect=' + encodeURIComponent(window.location.pathname); return; }
387
+ if (res.status === 409) {
388
+ knownDuplicateIds.add(entryId);
389
+ errorEl.textContent = MSG['collection.duplicateId'];
390
+ errorEl.hidden = false;
391
+ confirmBtn.disabled = true;
392
+ confirmBtn.textContent = MSG['collection.create'];
393
+ idInput.focus();
394
+ idInput.select();
395
+ return;
396
+ }
337
397
  if (!res.ok) throw new Error('mutate failed');
338
398
  window.location.href = MOUNT + '/cms/' + encodeURIComponent(COLLECTION) + '/' + encodeURIComponent(entryId) + '?new=1';
339
399
  })
@@ -346,18 +406,50 @@ export async function GET(context) {
346
406
  }
347
407
  if (newBtn) newBtn.addEventListener('click', openDialog);
348
408
  if (emptyCreateBtn) emptyCreateBtn.addEventListener('click', openDialog);
349
- document.getElementById('btn-create-close').addEventListener('click', closeDialog);
350
- document.getElementById('btn-create-cancel').addEventListener('click', closeDialog);
409
+ createCloseBtn.addEventListener('click', closeDialog);
410
+ createCancelBtn.addEventListener('click', closeDialog);
351
411
  confirmBtn.addEventListener('click', createEntry);
352
412
  idInput.addEventListener('input', validate);
353
413
  idInput.addEventListener('keydown', function (e) { if (e.key === 'Enter' && !confirmBtn.disabled) createEntry(); });
354
414
  dialog.addEventListener('click', function (e) { if (e.target === dialog) closeDialog(); });
355
- document.addEventListener('keydown', function (e) { if (e.key === 'Escape' && !dialog.hidden) closeDialog(); });
415
+ document.addEventListener('keydown', function (e) {
416
+ if (!dialog.hidden) {
417
+ if (e.key === 'Escape') {
418
+ e.preventDefault();
419
+ e.stopPropagation();
420
+ closeDialog();
421
+ return;
422
+ }
423
+ if (e.key !== 'Tab') return;
424
+ var focusable = [createCloseBtn, idInput, createCancelBtn, confirmBtn].filter(function (element) {
425
+ return !element.disabled && !element.hidden;
426
+ });
427
+ var first = focusable[0];
428
+ var last = focusable[focusable.length - 1];
429
+ if (e.shiftKey && document.activeElement === first) {
430
+ e.preventDefault();
431
+ last.focus();
432
+ } else if (!e.shiftKey && document.activeElement === last) {
433
+ e.preventDefault();
434
+ first.focus();
435
+ }
436
+ return;
437
+ }
438
+ if (e.key === 'Escape' && reorderMode) {
439
+ e.preventDefault();
440
+ e.stopPropagation();
441
+ exitReorder();
442
+ }
443
+ }, true);
356
444
 
357
445
  /* ─── Reorder mode ──────────────────────────────────────────────── */
358
446
  var reorderMode = false;
359
447
  var ordered = [];
448
+ var reorderTrigger = null;
360
449
  function enterReorder() {
450
+ if (reorderBtn.disabled) return;
451
+ reorderTrigger = document.activeElement instanceof HTMLElement ? document.activeElement : reorderBtn;
452
+ pagination.hidden = true;
361
453
  reorderMode = true;
362
454
  ordered = allEntries.slice().sort(function (a, b) {
363
455
  var ao = (a.data && typeof a.data.order === 'number') ? a.data.order : 0;
@@ -365,17 +457,38 @@ export async function GET(context) {
365
457
  return ao - bo;
366
458
  });
367
459
  grid.hidden = true; empty.hidden = true;
368
- searchInput.style.display = 'none'; newBtn.style.display = 'none';
460
+ searchInput.style.display = 'none'; if (newBtn) newBtn.style.display = 'none';
369
461
  reorderBtn.textContent = MSG['collection.reordering']; reorderBtn.disabled = true;
462
+ reorderBtn.setAttribute('aria-expanded', 'true');
370
463
  reorderContainer.hidden = false;
371
464
  renderReorderList();
465
+ var firstMove = reorderList.querySelector('button:not(:disabled)');
466
+ (firstMove || reorderCancel).focus();
372
467
  }
373
468
  function exitReorder() {
374
469
  reorderMode = false;
375
470
  reorderContainer.hidden = true;
376
- searchInput.style.display = ''; newBtn.style.display = '';
471
+ searchInput.style.display = ''; if (newBtn) newBtn.style.display = '';
377
472
  reorderBtn.textContent = MSG['collection.reorder']; reorderBtn.disabled = false;
378
- renderEntries(allEntries);
473
+ reorderBtn.setAttribute('aria-expanded', 'false');
474
+ var trigger = reorderTrigger;
475
+ reorderTrigger = null;
476
+ loadEntries().then(function () {
477
+ if (trigger && trigger.isConnected) trigger.focus();
478
+ });
479
+ }
480
+ function moveReorderEntry(index, direction) {
481
+ var target = index + direction;
482
+ if (target < 0 || target >= ordered.length) return;
483
+ var moved = ordered.splice(index, 1)[0];
484
+ if (!moved) return;
485
+ ordered.splice(target, 0, moved);
486
+ renderReorderList();
487
+ var nextItem = reorderList.children[target];
488
+ var sameDirection = nextItem && nextItem.querySelector('[data-move="' + direction + '"]');
489
+ var oppositeDirection = nextItem && nextItem.querySelector('[data-move="' + (-direction) + '"]');
490
+ var focusTarget = sameDirection && !sameDirection.disabled ? sameDirection : oppositeDirection;
491
+ if (focusTarget) focusTarget.focus();
379
492
  }
380
493
  function renderReorderList() {
381
494
  reorderList.innerHTML = '';
@@ -383,12 +496,23 @@ export async function GET(context) {
383
496
  ordered.forEach(function (entry, idx) {
384
497
  var item = document.createElement('div');
385
498
  item.className = 'reorder-item';
499
+ item.setAttribute('role', 'listitem');
386
500
  item.draggable = true;
387
501
  item.dataset.idx = String(idx);
502
+ var title = getTitle(entry.data);
388
503
  item.innerHTML =
389
- '<span class="reorder-handle">&#9776;</span>' +
390
- '<span class="reorder-label">' + htmlEsc(getTitle(entry.data)) + '</span>' +
391
- '<span class="reorder-order">' + (idx + 1) + '</span>';
504
+ '<span class="reorder-handle" aria-hidden="true">&#9776;</span>' +
505
+ '<span class="reorder-label">' + htmlEsc(title) + '</span>' +
506
+ '<span class="reorder-order">' + (idx + 1) + '</span>' +
507
+ '<span class="reorder-controls">' +
508
+ '<button type="button" class="studio-btn-ghost reorder-move" data-move="-1" aria-label="' + htmlEsc(MSG['field.moveUp'] + ' ' + title) + '"' + (idx === 0 ? ' disabled' : '') + '>&uarr;</button>' +
509
+ '<button type="button" class="studio-btn-ghost reorder-move" data-move="1" aria-label="' + htmlEsc(MSG['field.moveDown'] + ' ' + title) + '"' + (idx === ordered.length - 1 ? ' disabled' : '') + '>&darr;</button>' +
510
+ '</span>';
511
+ item.querySelectorAll('[data-move]').forEach(function (button) {
512
+ button.addEventListener('click', function () {
513
+ moveReorderEntry(idx, Number(button.dataset.move));
514
+ });
515
+ });
392
516
  item.addEventListener('dragstart', function () { dragIdx = idx; item.classList.add('dragging'); });
393
517
  item.addEventListener('dragend', function () {
394
518
  dragIdx = null; item.classList.remove('dragging');
@@ -1 +1 @@
1
- {"version":3,"file":"collection-list.js","sourceRoot":"","sources":["../../../src/runtime/routes/collection-list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collection-list.js","sourceRoot":"","sources":["../../../src/runtime/routes/collection-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC;AAG/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EACL,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AAEnC,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAmB;IAC3C,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChE,MAAM,aAAa,GAAG,GAAG,OAAO,CAAC,SAAS,aAAa,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IAElG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,OAAO,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,gBAAgB,CAAC,GAAG,OAAO,CAAC,SAAS,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;IACvC,IAAI,CAAC,CAAC,MAAM,uBAAuB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,gBAAgB,CAAC,GAAG,OAAO,CAAC,SAAS,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,6BAA6B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAClF,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC;QACjC,OAAO,gBAAgB,CACrB,GAAG,OAAO,CAAC,SAAS,QAAQ,kBAAkB,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CACjH,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,KAAK,KAAK,IAAI,MAAM,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/F,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,KAAK,KAAK,IAAI,MAAM,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/F,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAE9C,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEnB,CAAC;IAEF,MAAM,IAAI,GAAG,4GAA4G,cAAc;;;kHAGvB,UAAU,CAAC,KAAK,CAAC;wGAC3B,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;;;2FAGnD,UAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;4EACxD,UAAU,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;UACtH,SAAS,CAAC,CAAC,CAAC,2HAA2H,UAAU,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;UACjM,SAAS,CAAC,CAAC,CAAC,mDAAmD,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;;;;;;;;;0DASrE,UAAU,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QAC9F,SAAS,CAAC,CAAC,CAAC,4DAA4D,UAAU,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;;;;kFAI5D,UAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;wDACnE,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;;;;;uCAKrD,UAAU,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;sEACd,UAAU,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;;sEAE3C,UAAU,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;;0FAEnB,UAAU,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;;4DAE7E,UAAU,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;;;iFAGrB,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;iFACrC,UAAU,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;;;;;;;;oHAQT,UAAU,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;yGACtD,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;;;4DAGjF,UAAU,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;oFAClB,UAAU,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC;2GAC9B,UAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;UAC1I,oBAAoB,CAAC,CAAC,CAAC,2EAA2E,UAAU,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;;;kFAGnF,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;8FACzB,UAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;;;;SAI9H,CAAC;IAER,MAAM,YAAY,GAAG;uBACA,sBAAsB,CAAC,UAAU,CAAC;gBACzC,sBAAsB,CAAC,OAAO,CAAC,WAAW,CAAC;kBACzC,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC;gBAC3C,sBAAsB,CAAC,QAAQ,CAAC;8BAClB,sBAAsB,CAAC,oBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA8XlE,CAAC;IAEP,OAAO,YAAY,CACjB,gBAAgB,CAAC;QACf,OAAO;QACP,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;QACvB,IAAI;QACJ,WAAW;QACX,YAAY;KACb,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const prerender = false;
2
+ import type { APIContext } from "astro";
3
+ /** GET /api/cms/deployment — provider-backed status for the editor's latest deploy. */
4
+ export declare function GET(context: APIContext): Promise<Response>;
5
+ //# sourceMappingURL=deployment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.d.ts","sourceRoot":"","sources":["../../../src/runtime/routes/deployment.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,QAAQ,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAMxC,uFAAuF;AACvF,wBAAsB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6BhE"}
@@ -0,0 +1,38 @@
1
+ export const prerender = false;
2
+ import { getEditorId, isEditorAuthenticated } from "../auth/session.js";
3
+ import { normalizeDeploymentEvidence } from "../deployment-status.js";
4
+ import { getRuntimeServices } from "../providers.js";
5
+ import { json } from "./_helpers.js";
6
+ /** GET /api/cms/deployment — provider-backed status for the editor's latest deploy. */
7
+ export async function GET(context) {
8
+ if (!isEditorAuthenticated(context))
9
+ return json({ error: "Unauthorized" }, 401);
10
+ const editorId = getEditorId(context);
11
+ const services = await getRuntimeServices();
12
+ const provider = services.deploymentStatusProvider;
13
+ if (!provider)
14
+ return json({ configured: false, state: "unknown" });
15
+ if (!editorId || !services.adapter.makeEditorOverlay) {
16
+ return json({ configured: true, state: "unknown", target: null });
17
+ }
18
+ const overlay = await services.adapter.makeEditorOverlay(editorId);
19
+ const target = await overlay.getDeploymentTarget?.() ?? null;
20
+ if (!target)
21
+ return json({ configured: true, state: "unknown", target: null });
22
+ try {
23
+ const evidence = await provider.getDeploymentStatus({ target, request: context.request });
24
+ return json(normalizeDeploymentEvidence(target, evidence));
25
+ }
26
+ catch (error) {
27
+ console.error("[caretcms] Deployment status provider failed:", error);
28
+ return json({
29
+ configured: true,
30
+ state: "unknown",
31
+ buildId: null,
32
+ target,
33
+ checkedAt: Date.now(),
34
+ message: "Deployment status is temporarily unavailable",
35
+ });
36
+ }
37
+ }
38
+ //# sourceMappingURL=deployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../../src/runtime/routes/deployment.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC;AAG/B,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAmB;IAC3C,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;IAEjF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,wBAAwB,CAAC;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,EAAE,IAAI,IAAI,CAAC;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;YACV,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,IAAI;YACb,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,8CAA8C;SACxD,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../../src/runtime/routes/draft.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,QAAQ,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAMxC;;GAEG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAYhE;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyBnE"}
1
+ {"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../../src/runtime/routes/draft.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,QAAQ,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAMxC;;GAEG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAYhE;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6BnE"}
@@ -1,3 +1,5 @@
1
+ import { getRequestContext } from "../request-context.js";
2
+ import { canPublishOverlay } from "../publish.js";
1
3
  export const prerender = false;
2
4
  import { isEditorAuthenticated, getEditorId } from "../auth/session.js";
3
5
  import { getRuntimeServices } from "../providers.js";
@@ -17,7 +19,7 @@ export async function GET(context) {
17
19
  return json({ hasDrafts: false, count: 0 });
18
20
  const overlay = await base.makeEditorOverlay(editorId);
19
21
  const count = await countOverlayDrafts(overlay);
20
- return json({ hasDrafts: count > 0, count });
22
+ return json({ ...(getRequestContext()?.authorize ? { canPublish: await canPublishOverlay(overlay) } : {}), hasDrafts: count > 0, count, retryRebuild: Boolean(await overlay.getRebuildReceipt?.()) });
21
23
  }
22
24
  /**
23
25
  * DELETE /api/cms/draft — discard the current editor's draft(s) without
@@ -49,7 +51,12 @@ export async function DELETE(context) {
49
51
  return json({ error: "Drafts are not supported by the configured storage adapter" }, 400);
50
52
  }
51
53
  const overlay = await base.makeEditorOverlay(editorId);
52
- const cleared = await discardOverlay(overlay, scope);
53
- return json({ ok: true, cleared });
54
+ try {
55
+ const cleared = await discardOverlay(overlay, scope);
56
+ return json({ ok: true, cleared });
57
+ }
58
+ catch {
59
+ return json({ error: "Some drafts require publish recovery. Retry Publish before discarding them." }, 409);
60
+ }
54
61
  }
55
62
  //# sourceMappingURL=draft.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"draft.js","sourceRoot":"","sources":["../../../src/runtime/routes/draft.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"draft.js","sourceRoot":"","sources":["../../../src/runtime/routes/draft.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../src/runtime/routes/entries.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,QAAQ,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAkFxC,wBAAsB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyEhE"}
1
+ {"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../src/runtime/routes/entries.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,QAAQ,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAoFxC,wBAAsB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4FhE"}