gazetta 0.4.0 → 0.5.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 (58) hide show
  1. package/admin-dist/assets/{index-DjGNi6yy.js → index-BZAFKsUp.js} +22 -22
  2. package/admin-dist/assets/index-BpRotMuK.css +1 -0
  3. package/admin-dist/index.html +2 -2
  4. package/dist/admin-api/index.d.ts +8 -2
  5. package/dist/admin-api/index.d.ts.map +1 -1
  6. package/dist/admin-api/index.js +31 -5
  7. package/dist/admin-api/index.js.map +1 -1
  8. package/dist/admin-api/routes/compare.d.ts +2 -1
  9. package/dist/admin-api/routes/compare.d.ts.map +1 -1
  10. package/dist/admin-api/routes/compare.js +2 -1
  11. package/dist/admin-api/routes/compare.js.map +1 -1
  12. package/dist/admin-api/routes/fragments.d.ts +2 -1
  13. package/dist/admin-api/routes/fragments.d.ts.map +1 -1
  14. package/dist/admin-api/routes/fragments.js +3 -1
  15. package/dist/admin-api/routes/fragments.js.map +1 -1
  16. package/dist/admin-api/routes/pages.d.ts +2 -1
  17. package/dist/admin-api/routes/pages.d.ts.map +1 -1
  18. package/dist/admin-api/routes/pages.js +3 -1
  19. package/dist/admin-api/routes/pages.js.map +1 -1
  20. package/dist/admin-api/routes/publish.d.ts +2 -1
  21. package/dist/admin-api/routes/publish.d.ts.map +1 -1
  22. package/dist/admin-api/routes/publish.js +121 -27
  23. package/dist/admin-api/routes/publish.js.map +1 -1
  24. package/dist/cli/index.js +75 -12
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/compare.d.ts +7 -0
  27. package/dist/compare.d.ts.map +1 -1
  28. package/dist/compare.js +39 -40
  29. package/dist/compare.js.map +1 -1
  30. package/dist/concurrency.d.ts +63 -0
  31. package/dist/concurrency.d.ts.map +1 -0
  32. package/dist/concurrency.js +134 -0
  33. package/dist/concurrency.js.map +1 -0
  34. package/dist/hash.d.ts +15 -0
  35. package/dist/hash.d.ts.map +1 -1
  36. package/dist/hash.js +47 -7
  37. package/dist/hash.js.map +1 -1
  38. package/dist/publish-rendered.d.ts +6 -5
  39. package/dist/publish-rendered.d.ts.map +1 -1
  40. package/dist/publish-rendered.js +39 -44
  41. package/dist/publish-rendered.js.map +1 -1
  42. package/dist/publish.d.ts +38 -0
  43. package/dist/publish.d.ts.map +1 -1
  44. package/dist/publish.js +154 -14
  45. package/dist/publish.js.map +1 -1
  46. package/dist/sidecars.d.ts +56 -0
  47. package/dist/sidecars.d.ts.map +1 -0
  48. package/dist/sidecars.js +141 -0
  49. package/dist/sidecars.js.map +1 -0
  50. package/dist/site-loader.d.ts.map +1 -1
  51. package/dist/site-loader.js +13 -10
  52. package/dist/site-loader.js.map +1 -1
  53. package/dist/source-sidecars.d.ts +13 -0
  54. package/dist/source-sidecars.d.ts.map +1 -0
  55. package/dist/source-sidecars.js +52 -0
  56. package/dist/source-sidecars.js.map +1 -0
  57. package/package.json +1 -1
  58. package/admin-dist/assets/index-Bh_y1d_l.css +0 -1
@@ -0,0 +1 @@
1
+ .publish-content[data-v-b2bbbbf3]{flex-direction:column;gap:1rem;display:flex}.publish-item[data-v-b2bbbbf3]{align-items:center;gap:.5rem;font-size:1rem;font-weight:600;display:flex}.publish-empty[data-v-b2bbbbf3]{color:var(--color-muted);font-size:.875rem}.publish-label[data-v-b2bbbbf3]{text-transform:uppercase;color:var(--color-muted);letter-spacing:.03em;align-items:center;gap:.5rem;font-size:.75rem;display:flex}.publish-label-hint[data-v-b2bbbbf3]{text-transform:none;letter-spacing:0;color:var(--color-muted);font-size:.75rem;font-weight:400}.publish-select-all[data-v-b2bbbbf3]{color:var(--color-primary);cursor:pointer;border-radius:var(--p-border-radius-sm);text-transform:none;letter-spacing:0;background:0 0;border:0;margin-left:auto;padding:.125rem .25rem;font-size:.75rem;font-weight:400}.publish-select-all[data-v-b2bbbbf3]:hover{background:var(--color-hover-bg)}.publish-targets[data-v-b2bbbbf3]{flex-direction:column;gap:.5rem;display:flex}.publish-target[data-v-b2bbbbf3]{align-items:center;gap:.5rem;display:flex}.publish-target label[data-v-b2bbbbf3]{cursor:pointer}.publish-warning[data-v-b2bbbbf3]{border-radius:var(--p-border-radius-md);background:var(--color-danger-bg);color:var(--color-danger-fg);align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.875rem;display:flex}.publish-firstpublish[data-v-b2bbbbf3]{border-radius:var(--p-border-radius-md);background:var(--color-info-bg);color:var(--color-info-fg);align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.875rem;display:flex}.publish-confirm-banner[data-v-b2bbbbf3]{border-radius:var(--p-border-radius-md);background:var(--color-danger-bg);color:var(--color-danger-fg);align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.875rem;display:flex}.publish-impact[data-v-b2bbbbf3]{border-radius:var(--p-border-radius-md);background:var(--color-info-bg);color:var(--color-info-fg);gap:.5rem;padding:.5rem .75rem;font-size:.875rem;display:flex}.publish-impact-body[data-v-b2bbbbf3]{flex-direction:column;flex:1;gap:.25rem;display:flex}.publish-impact-body p[data-v-b2bbbbf3]{margin:0}.publish-impact-note[data-v-b2bbbbf3]{opacity:.85;font-size:.75rem}.publish-invalid-body[data-v-b2bbbbf3]{flex-direction:column;flex:1;gap:.375rem;display:flex}.publish-invalid-body p[data-v-b2bbbbf3]{margin:0}.publish-invalid-list[data-v-b2bbbbf3]{flex-direction:column;gap:.25rem;margin:0;padding:0;list-style:none;display:flex}.publish-invalid-list li[data-v-b2bbbbf3]{flex-direction:column;gap:.125rem;font-size:.8125rem;display:flex}.publish-invalid-name[data-v-b2bbbbf3]{font-family:monospace;font-weight:600}.publish-invalid-error[data-v-b2bbbbf3]{opacity:.85;font-size:.75rem}.publish-target-label[data-v-b2bbbbf3]{cursor:pointer;align-items:center;gap:.5rem;display:inline-flex}.publish-env-badge[data-v-b2bbbbf3]{text-transform:uppercase;letter-spacing:.03em;border-radius:var(--p-border-radius-sm);padding:.125rem .375rem;font-size:.6875rem;font-weight:600}.publish-env-prod[data-v-b2bbbbf3]{background:var(--color-env-prod-bg);color:var(--color-env-prod-fg)}.publish-env-staging[data-v-b2bbbbf3]{background:var(--color-env-staging-bg);color:var(--color-env-staging-fg)}.publish-changes[data-v-b2bbbbf3]{flex-direction:column;gap:.5rem;display:flex}.publish-nochanges[data-v-b2bbbbf3]{color:var(--color-muted);font-size:.875rem}.publish-changes-group[data-v-b2bbbbf3]{flex-direction:column;gap:.25rem;display:flex}.publish-changes-group+.publish-changes-group[data-v-b2bbbbf3]{margin-top:.5rem}.publish-group-label[data-v-b2bbbbf3]{text-transform:uppercase;color:var(--color-muted);letter-spacing:.05em;margin:0 0 .125rem .25rem;font-size:.6875rem;font-weight:600}.publish-changes-list[data-v-b2bbbbf3]{flex-direction:column;gap:.125rem;max-height:240px;display:flex;overflow-y:auto}.publish-change-row[data-v-b2bbbbf3]{border-radius:var(--p-border-radius-sm);cursor:pointer;align-items:center;gap:.5rem;padding:.375rem .5rem;display:flex}.publish-change-row[data-v-b2bbbbf3]:hover{background:var(--color-hover-bg)}.publish-change-row-deleted[data-v-b2bbbbf3]{cursor:default;opacity:.55}.publish-change-row-deleted[data-v-b2bbbbf3]:hover{background:0 0}.publish-change-nocheckbox[data-v-b2bbbbf3]{flex-shrink:0;width:20px;display:inline-block}.publish-change-mark[data-v-b2bbbbf3]{text-align:center;width:10px;font-family:monospace;font-weight:700}.publish-change-mark.added[data-v-b2bbbbf3]{color:var(--color-change-added)}.publish-change-mark.modified[data-v-b2bbbbf3]{color:var(--color-change-modified)}.publish-change-mark.deleted[data-v-b2bbbbf3]{color:var(--color-change-deleted)}.publish-change-icon[data-v-b2bbbbf3]{color:var(--color-muted);font-size:.8rem}.publish-change-label[data-v-b2bbbbf3]{font-size:.875rem}.publish-progress[data-v-b2bbbbf3]{flex-direction:column;gap:.75rem;display:flex}.publish-progress-row[data-v-b2bbbbf3]{flex-direction:column;gap:.25rem;display:flex}.publish-progress-header[data-v-b2bbbbf3]{justify-content:space-between;align-items:baseline;font-size:.8125rem;display:flex}.publish-progress-target[data-v-b2bbbbf3]{font-weight:600}.publish-progress-count[data-v-b2bbbbf3]{color:var(--color-muted);font-variant-numeric:tabular-nums;font-size:.75rem}.publish-progress-bar[data-v-b2bbbbf3]{background:var(--color-hover-bg);border-radius:2px;height:4px;overflow:hidden}.publish-progress-fill[data-v-b2bbbbf3]{background:var(--color-primary);height:100%;transition:width .2s}.publish-progress-label[data-v-b2bbbbf3]{color:var(--color-muted);text-overflow:ellipsis;white-space:nowrap;font-family:monospace;font-size:.75rem;overflow:hidden}.publish-results[data-v-b2bbbbf3]{flex-direction:column;gap:.5rem;display:flex}.publish-result[data-v-b2bbbbf3]{border-radius:var(--p-border-radius-md);align-items:center;gap:.5rem;padding:.5rem;display:flex}.publish-result.success[data-v-b2bbbbf3]{background:var(--color-success-bg);color:var(--color-success-fg)}.publish-result.error[data-v-b2bbbbf3]{background:var(--color-danger-bg);color:var(--color-danger-fg)}.result-target[data-v-b2bbbbf3]{font-weight:600}.result-detail[data-v-b2bbbbf3]{opacity:.8;margin-left:auto;font-size:.875rem}.fetch-content[data-v-28aee561]{flex-direction:column;gap:1rem;display:flex}.fetch-empty[data-v-28aee561]{color:var(--color-muted);font-size:.875rem}.fetch-label[data-v-28aee561]{color:var(--color-muted);margin-bottom:.5rem;font-size:.875rem}.fetch-list[data-v-28aee561]{width:100%}.fetch-result[data-v-28aee561]{border-radius:var(--p-border-radius-md);align-items:flex-start;gap:.75rem;padding:.75rem;display:flex}.fetch-result.success[data-v-28aee561]{background:var(--color-success-bg);color:var(--color-success-fg)}.fetch-result.error[data-v-28aee561]{background:var(--color-danger-bg);color:var(--color-danger-fg)}.fetch-items[data-v-28aee561]{opacity:.7;margin-top:.25rem;font-size:.75rem}.changes-header[data-v-8918ea89]{justify-content:space-between;align-items:center;gap:.5rem;width:100%;display:flex}.changes-title[data-v-8918ea89]{font-size:1rem;font-weight:600}.changes-body[data-v-8918ea89]{flex-direction:column;gap:1rem;padding-top:.25rem;display:flex}.changes-empty[data-v-8918ea89]{color:var(--color-muted);font-size:.875rem}.changes-target-row[data-v-8918ea89]{align-items:center;gap:.75rem;display:flex}.changes-target[data-v-8918ea89]{flex:1;min-width:0}.changes-lastchecked[data-v-8918ea89]{color:var(--color-muted);white-space:nowrap;font-size:.75rem}.changes-loading[data-v-8918ea89]{color:var(--color-muted);align-items:center;gap:.5rem;font-size:.875rem;display:flex}.changes-warning[data-v-8918ea89]{border-radius:var(--p-border-radius-md);background:var(--color-danger-bg);color:var(--color-danger-fg);gap:.5rem;padding:.75rem;font-size:.875rem;display:flex}.changes-warning-body[data-v-8918ea89]{flex-direction:column;flex:1;gap:.375rem;display:flex}.changes-warning-body p[data-v-8918ea89]{margin:0}.changes-warning-detail[data-v-8918ea89]{opacity:.8;font-size:.8125rem}.changes-state[data-v-8918ea89]{border-radius:var(--p-border-radius-md);background:var(--color-info-bg);color:var(--color-info-fg);align-items:center;gap:.5rem;padding:.75rem;font-size:.875rem;display:flex}.changes-state-sync[data-v-8918ea89]{background:var(--color-success-bg);color:var(--color-success-fg)}.changes-summary[data-v-8918ea89]{color:var(--color-muted);margin:0;font-size:.8125rem}.changes-list-wrapper[data-v-8918ea89]{flex-direction:column;gap:.75rem;display:flex}.changes-group[data-v-8918ea89]{flex-direction:column;gap:.25rem;display:flex}.changes-group-label[data-v-8918ea89]{text-transform:uppercase;color:var(--color-muted);letter-spacing:.05em;margin:0 0 .125rem .25rem;font-size:.6875rem;font-weight:600}.changes-rows[data-v-8918ea89]{flex-direction:column;gap:.125rem;display:flex}.changes-row[data-v-8918ea89]{border-radius:var(--p-border-radius-sm);color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:.5rem;width:100%;padding:.375rem .5rem;display:flex}.changes-row[data-v-8918ea89]:hover{background:var(--color-hover-bg)}.changes-row-deleted[data-v-8918ea89]{cursor:default;opacity:.55}.changes-row-deleted[data-v-8918ea89]:hover{background:0 0}.changes-row-unchanged[data-v-8918ea89]{opacity:.75}.changes-mark[data-v-8918ea89]{text-align:center;flex-shrink:0;width:10px;font-family:monospace;font-weight:700}.changes-mark.added[data-v-8918ea89]{color:var(--color-change-added)}.changes-mark.modified[data-v-8918ea89]{color:var(--color-change-modified)}.changes-mark.deleted[data-v-8918ea89]{color:var(--color-change-deleted)}.changes-mark.unchanged[data-v-8918ea89]{color:var(--color-muted);font-weight:400}.changes-icon[data-v-8918ea89]{color:var(--color-muted);flex-shrink:0;font-size:.8rem}.changes-label[data-v-8918ea89]{text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;overflow:hidden}.changes-unchanged[data-v-8918ea89]{border-top:1px solid var(--color-border);flex-direction:column;gap:.5rem;padding-top:.5rem;display:flex}.changes-unchanged-toggle[data-v-8918ea89]{color:var(--color-muted);cursor:pointer;border-radius:var(--p-border-radius-sm);background:0 0;border:0;align-items:center;gap:.5rem;padding:.25rem .5rem;font-size:.8125rem;display:flex}.changes-unchanged-toggle[data-v-8918ea89]:hover{background:var(--color-hover-bg);color:inherit}.changes-unchanged-body[data-v-8918ea89]{flex-direction:column;gap:.5rem;display:flex}.cms-toolbar[data-v-d907b333]{border-top:0;border-left:0;border-right:0;border-radius:0}.cms-logo[data-v-d907b333]{align-items:center;gap:.5rem;font-size:1.125rem;font-weight:700;display:flex}.cms-site-name[data-v-d907b333]{color:var(--color-muted);margin-left:1rem;font-size:.875rem}.cms-btn[data-v-d907b333]{margin-left:.5rem}.cms-toast[data-v-d907b333]{align-items:center;gap:.375rem;font-size:.8125rem;display:flex}.cms-toast-error[data-v-d907b333]{color:var(--color-danger-fg)}.fade-enter-active[data-v-d907b333],.fade-leave-active[data-v-d907b333]{transition:opacity .2s}.fade-enter-from[data-v-d907b333],.fade-leave-to[data-v-d907b333]{opacity:0}.unsaved-message[data-v-70fd0516]{color:#374151;margin:0;font-size:.875rem;line-height:1.5}.unsaved-actions[data-v-70fd0516]{justify-content:flex-end;gap:.5rem;width:100%;display:flex}*{box-sizing:border-box;margin:0;padding:0}html,body,#app,.cms-app{height:100%}body{color:var(--color-fg);background:var(--color-bg);font-family:system-ui,-apple-system,sans-serif}.cms-error{color:var(--color-danger-fg);padding:2rem}.cms-loading{color:var(--color-muted);padding:2rem}.global-toast{z-index:1001;background:var(--color-bg);color:var(--color-fg);border:1px solid var(--color-border);border-top:none;border-radius:0 0 8px 8px;align-items:center;gap:8px;max-width:400px;padding:8px 20px;font-size:13px;font-weight:500;display:flex;position:fixed;top:0;left:50%;transform:translate(-50%);box-shadow:0 4px 12px #00000026}.toast-success{color:var(--color-success-fg)}.toast-error{color:var(--color-danger-fg)}.toast-link{color:inherit;text-decoration:underline}.toast-dismiss{color:inherit;cursor:pointer;opacity:.7;background:0 0;border:0;align-items:center;margin-left:4px;padding:2px 4px;display:flex}.toast-dismiss:hover{opacity:1}.toast-dismiss .pi{font-size:11px}.toast-enter-active{transition:transform .2s ease-out,opacity .2s ease-out}.toast-leave-active{transition:transform .15s ease-in,opacity .15s ease-in}.toast-enter-from,.toast-leave-to{opacity:0;transform:translate(-50%)translateY(-100%)}.create-content[data-v-b4d1c25e]{flex-direction:column;gap:1rem;display:flex}.create-field[data-v-b4d1c25e]{flex-direction:column;gap:.375rem;display:flex}.create-field label[data-v-b4d1c25e]{text-transform:uppercase;color:#888;letter-spacing:.03em;font-size:.75rem}.create-input[data-v-b4d1c25e],.create-list[data-v-b4d1c25e]{width:100%}.create-hint[data-v-b4d1c25e]{color:#666;font-size:.75rem}.create-error[data-v-b4d1c25e]{color:#f87171;font-size:.875rem}.create-content[data-v-0b98775c]{flex-direction:column;gap:1rem;display:flex}.create-field[data-v-0b98775c]{flex-direction:column;gap:.375rem;display:flex}.create-field label[data-v-0b98775c]{text-transform:uppercase;color:#888;letter-spacing:.03em;font-size:.75rem}.create-input[data-v-0b98775c],.create-list[data-v-0b98775c]{width:100%}.create-error[data-v-0b98775c]{color:#f87171;font-size:.875rem}.site-tree[data-v-6b0b06db]{font-size:13px;line-height:22px}.section-label[data-v-6b0b06db]{text-transform:uppercase;letter-spacing:.05em;color:#9ca3af;padding:4px 8px;font-size:11px;font-weight:600}.section-divider[data-v-6b0b06db]{border-top:1px solid #80808026;margin:4px 8px}.node-item[data-v-6b0b06db]{cursor:pointer;border-radius:3px;align-items:center;gap:4px;height:22px;margin:0 2px;padding:0 6px;display:flex}.node-item[data-v-6b0b06db]:hover{background:#80808014}.node-item.selected[data-v-6b0b06db]{background:#a78bfa26;box-shadow:inset 2px 0 #a78bfa}.node-icon[data-v-6b0b06db]{text-align:center;color:#999;flex-shrink:0;width:16px;font-size:10px}.node-label[data-v-6b0b06db]{white-space:nowrap;text-overflow:ellipsis;color:#6b7280;flex:1;overflow:hidden}.node-item.selected .node-label[data-v-6b0b06db],.node-item:hover .node-label[data-v-6b0b06db]{color:#374151}.dark{color:#e4e4e7;background:#ffffff0d;border-top-color:#27272a}.node-dirty-dot[data-v-6b0b06db]{background:var(--color-warning-fg);border-radius:50%;flex-shrink:0;width:6px;height:6px;margin-right:2px}.node-delete[data-v-6b0b06db]{opacity:0;flex-shrink:0;transition:opacity .1s}.node-item:hover .node-delete[data-v-6b0b06db]{opacity:1}.new-btns[data-v-6b0b06db]{gap:.5rem;margin-top:8px;padding:0 6px;display:flex}.add-content[data-v-de3d43d5]{flex-direction:column;gap:1rem;display:flex}.add-field[data-v-de3d43d5]{flex-direction:column;gap:.375rem;display:flex}.add-field label[data-v-de3d43d5]{text-transform:uppercase;color:#888;letter-spacing:.03em;font-size:.75rem}.add-input[data-v-de3d43d5],.add-list[data-v-de3d43d5]{width:100%}.add-error[data-v-de3d43d5]{color:#f87171;font-size:.875rem}.component-tree[data-v-b1b905e2]{font-size:13px;line-height:22px}.empty[data-v-b1b905e2]{color:var(--color-muted)}.node-item[data-v-b1b905e2]{cursor:pointer;border-radius:3px;align-items:center;gap:4px;height:22px;margin:0 2px;padding:0 6px;display:flex}.node-item[data-v-b1b905e2]:hover,.node-item.hovered[data-v-b1b905e2]{background:var(--color-hover-bg)}.node-item.selected[data-v-b1b905e2]{box-shadow:inset 2px 0 0 var(--p-violet-400);background:#a78bfa26}.node-root[data-v-b1b905e2]{border-bottom:1px solid var(--color-border);border-radius:0;height:26px;margin:0 0 2px;padding:0 6px;font-weight:600;line-height:26px}.node-root.selected[data-v-b1b905e2]{box-shadow:none;border-bottom-color:var(--p-violet-400);background:#a78bfa1a}.node-icon[data-v-b1b905e2]{text-align:center;width:16px;color:var(--color-muted);flex-shrink:0;font-size:10px}.node-label[data-v-b1b905e2]{white-space:nowrap;text-overflow:ellipsis;color:var(--color-muted);flex:1;overflow:hidden}.node-item.selected .node-label[data-v-b1b905e2],.node-item:hover .node-label[data-v-b1b905e2],.node-item.hovered .node-label[data-v-b1b905e2],.node-root .node-label[data-v-b1b905e2]{color:var(--color-fg)}.node-error-icon[data-v-b1b905e2]{color:var(--color-danger-fg)}.node-dirty-dot[data-v-b1b905e2]{background:var(--color-warning-fg);border-radius:50%;flex-shrink:0;width:6px;height:6px}.node-revert[data-v-b1b905e2]{opacity:0;flex-shrink:0;width:18px;height:18px;transition:opacity .1s}.node-item:hover .node-revert[data-v-b1b905e2]{opacity:1}.node-actions[data-v-b1b905e2]{opacity:0;flex-shrink:0;gap:0;transition:opacity .1s;display:flex}.node-item:hover .node-actions[data-v-b1b905e2]{opacity:1}.add-btn[data-v-b1b905e2]{margin-top:6px}.editor-panel h3[data-v-1e2cf67e]{text-transform:uppercase;color:var(--color-muted);letter-spacing:.05em;margin-bottom:1rem;font-size:.75rem}.editor-error[data-v-1e2cf67e]{color:var(--color-danger-fg);text-align:center;flex-direction:column;align-items:center;gap:.5rem;padding-top:3rem;font-size:.875rem;display:flex}.editor-error .pi[data-v-1e2cf67e]{font-size:2rem}.editor-error p[data-v-1e2cf67e]{max-width:300px;line-height:1.5}.editor-empty[data-v-1e2cf67e]{color:var(--color-muted);flex-direction:column;align-items:center;padding-top:3rem;font-size:.875rem;display:flex}.editor-container[data-v-1e2cf67e]{font-size:.875rem}.editor-no-schema[data-v-1e2cf67e]{color:var(--color-muted);font-size:.875rem}.preview-panel[data-v-4aacb015]{flex-direction:column;height:100%;display:flex}.preview-panel.fullscreen[data-v-4aacb015]{z-index:1000;background:#f8f8fa;position:fixed;inset:0}.preview-empty[data-v-4aacb015]{color:#aaa;flex-direction:column;align-items:center;padding:3rem 1rem 1rem;font-size:.875rem;display:flex}.preview-toolbar[data-v-4aacb015]{border-bottom:1px solid #e5e7eb;justify-content:space-between;align-items:center;padding:.375rem .5rem;display:flex}.preview-devices[data-v-4aacb015],.preview-actions[data-v-4aacb015]{align-items:center;gap:.25rem;display:flex}.device-btn[data-v-4aacb015]{color:#9ca3af;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;padding:.25rem .5rem;font-size:.875rem}.device-btn[data-v-4aacb015]:hover{color:#374151;border-color:#d1d5db}.device-btn.active[data-v-4aacb015]{color:#a78bfa;border-color:#a78bfa}.host-page-select[data-v-4aacb015]{color:#374151;cursor:pointer;background:#f3f4f6;border:1px solid #d1d5db;border-radius:4px;padding:.2rem .4rem;font-size:.75rem}.preview-separator[data-v-4aacb015]{background:#d1d5db;width:1px;height:14px;margin-left:8px;margin-right:8px}.preview-route[data-v-4aacb015]{color:#6b7280;background:#f3f4f6;border:1px solid #e5e7eb;border-radius:9999px;align-items:center;gap:6px;height:24px;padding:2px 10px;font-family:ui-monospace,monospace;font-size:12px;display:inline-flex}.preview-route .pi[data-v-4aacb015]{color:#9ca3af;font-size:10px}.preview-frame-wrapper[data-v-4aacb015]{background:#e5e7eb;flex:1;justify-content:center;display:flex;overflow:auto}.preview-iframe[data-v-4aacb015]{background:#fff;border:0;flex:none;height:100%;transition:width .2s}.dark .preview-panel.fullscreen{background:#09090b}.dark .preview-toolbar{border-bottom-color:#27272a}.dark .device-btn{color:#71717a}.dark .device-btn:hover{color:#e4e4e7;border-color:#3f3f46}.dark .host-page-select{color:#e0e0e0;background:#1e1e2e;border-color:#3f3f46}.dark .preview-separator{background:#3f3f46}.dark .preview-route{color:#a1a1aa;background:#18181b;border-color:#27272a}.dark .preview-route .pi{color:#52525b}.dark .preview-frame-wrapper{background:#1a1a2e}.cms-editor[data-v-f9c0172b]{height:calc(100% - 60px);display:flex}.cms-left[data-v-f9c0172b]{border-right:1px solid #27272a;flex-shrink:0;width:250px;overflow:auto}.cms-left-wide[data-v-f9c0172b]{width:55%;max-width:900px;overflow:hidden}.cms-splitter[data-v-f9c0172b]{border:0;border-radius:0;height:100%}.cms-preview[data-v-f9c0172b]{flex:1;min-width:0;overflow:hidden}.cms-panel[data-v-f9c0172b]{overflow:auto}.cms-panel-content[data-v-f9c0172b]{padding:1rem}.playground[data-v-073d12d3]{height:calc(100% - 60px);display:flex}.playground-sidebar[data-v-073d12d3]{border-right:1px solid #e5e7eb;flex-shrink:0;width:220px;padding:.75rem 0;overflow-y:auto}.sidebar-header[data-v-073d12d3]{text-transform:uppercase;letter-spacing:.05em;color:#6b7280;margin-bottom:.75rem;padding:0 1rem;font-size:.75rem;font-weight:700}.sidebar-loading[data-v-073d12d3]{color:#9ca3af;padding:1rem;font-size:.8125rem}.sidebar-section[data-v-073d12d3]{margin-bottom:.5rem}.section-label[data-v-073d12d3]{text-transform:uppercase;letter-spacing:.05em;color:#9ca3af;padding:.375rem 1rem;font-size:.625rem;font-weight:600}.section-label-toggle[data-v-073d12d3]{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:.375rem;display:flex}.section-label-toggle[data-v-073d12d3]:hover{color:#6b7280}.toggle-icon[data-v-073d12d3]{font-size:.5rem}.sidebar-item[data-v-073d12d3]{cursor:pointer;color:#6b7280;align-items:center;gap:.5rem;padding:.3125rem 1rem;font-size:.8125rem;display:flex}.sidebar-item[data-v-073d12d3]:hover{color:#374151;background:#80808014}.sidebar-item.active[data-v-073d12d3]{color:#667eea;background:#667eea1a}.item-icon[data-v-073d12d3]{text-align:center;flex-shrink:0;width:14px;font-size:.6875rem}.item-name[data-v-073d12d3]{white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.sidebar-empty[data-v-073d12d3]{color:#9ca3af;padding:1.5rem 1rem;font-size:.8125rem;line-height:1.6}.sidebar-empty .hint[data-v-073d12d3]{margin-top:.75rem}.sidebar-empty code[data-v-073d12d3]{background:#8080801a;border-radius:3px;padding:1px 4px;font-family:monospace;font-size:.75rem}.playground-main[data-v-073d12d3]{flex-direction:column;flex:1;display:flex;overflow:hidden}.main-empty[data-v-073d12d3]{color:#9ca3af;flex-direction:column;justify-content:center;align-items:center;height:100%;font-size:.875rem;display:flex}.main-toolbar[data-v-073d12d3]{border-bottom:1px solid #e5e7eb;flex-shrink:0;align-items:center;gap:.75rem;padding:.5rem 1rem;font-size:.8125rem;display:flex}.toolbar-label[data-v-073d12d3]{color:#6b7280;flex:1;align-items:baseline;gap:.5rem;display:flex}.toolbar-type[data-v-073d12d3]{text-transform:uppercase;letter-spacing:.03em;font-size:.6875rem}.toolbar-label strong[data-v-073d12d3]{color:#374151;font-size:.875rem}.toolbar-hint[data-v-073d12d3]{color:#9ca3af;font-size:.6875rem;font-style:italic}.toolbar-btn[data-v-073d12d3]{color:#6b7280;cursor:pointer;white-space:nowrap;background:0 0;border:1px solid #e5e7eb;border-radius:6px;align-items:center;gap:.375rem;padding:.25rem .625rem;font-size:.75rem;display:flex}.toolbar-btn[data-v-073d12d3]:hover{color:#374151;background:#80808014}.main-body[data-v-073d12d3]{flex:1;display:flex;overflow:hidden}.main-content[data-v-073d12d3]{flex:1;min-width:0;padding:1.5rem;overflow-y:auto}.mount-container[data-v-073d12d3]{max-width:600px}.mount-error[data-v-073d12d3]{color:#dc2626;background:#dc262614;border-radius:6px;margin-bottom:1rem;padding:.75rem;font-size:.8125rem}.value-inspector[data-v-073d12d3]{border-left:1px solid #e5e7eb;flex-direction:column;flex:1;min-width:0;display:flex;overflow-y:auto}.inspector-header[data-v-073d12d3]{text-transform:uppercase;letter-spacing:.05em;color:#9ca3af;border-bottom:1px solid #e5e7eb;flex-shrink:0;padding:.5rem .75rem;font-size:.625rem;font-weight:600}.inspector-value[data-v-073d12d3]{color:#374151;white-space:pre-wrap;word-break:break-word;flex:1;margin:0;padding:.75rem;font-family:JetBrains Mono,Fira Code,monospace;font-size:.75rem;line-height:1.7}.inspector-value .jv-key[data-v-073d12d3]{color:#6b7280}.inspector-value .jv-str[data-v-073d12d3]{color:#16a34a}.inspector-value .jv-num[data-v-073d12d3]{color:#d97706}.inspector-value .jv-bool[data-v-073d12d3]{color:#7c3aed}.inspector-value .jv-null[data-v-073d12d3]{color:#9ca3af}.dark .playground-sidebar{border-right-color:#27272a}.dark .sidebar-header{color:#666}.dark .section-label{color:#555}.dark .section-label-toggle:hover{color:#999}.dark .sidebar-item{color:#bbb}.dark .sidebar-item:hover{color:#e4e4e7;background:#ffffff0d}.dark .sidebar-item.active{color:#667eea;background:#667eea26}.dark .main-toolbar{border-bottom-color:#27272a}.dark .toolbar-label{color:#999}.dark .toolbar-label strong{color:#e4e4e7}.dark .toolbar-hint{color:#555}.dark .toolbar-btn{color:#999;border-color:#333}.dark .toolbar-btn:hover{color:#e4e4e7;background:#ffffff0d}.dark .mount-error{color:#f87171;background:#f8717114}.dark .value-inspector{background:#0c0c14;border-left-color:#27272a}.dark .inspector-header{color:#666;border-bottom-color:#27272a}.dark .inspector-value{color:#e4e4e7}.dark .inspector-value .jv-key{color:#8888a0}.dark .inspector-value .jv-str{color:#4ade80}.dark .inspector-value .jv-num{color:#fbbf24}.dark .inspector-value .jv-bool{color:#a78bfa}.dark .inspector-value .jv-null{color:#52525b}:root{--color-bg:var(--p-content-background);--color-fg:var(--p-text-color);--color-muted:var(--p-text-muted-color);--color-border:var(--p-content-border-color);--color-hover-bg:var(--p-content-hover-background);--color-input-bg:var(--p-form-field-background);--color-input-border:var(--p-form-field-border-color);--color-primary:var(--p-primary-color);--color-danger-bg:var(--p-red-50);--color-danger-fg:var(--p-red-700);--color-success-bg:var(--p-green-50);--color-success-fg:var(--p-green-700);--color-warning-bg:var(--p-amber-50);--color-warning-fg:var(--p-amber-900);--color-info-bg:var(--p-blue-50);--color-info-fg:var(--p-blue-900);--color-env-prod-bg:var(--p-red-100);--color-env-prod-fg:var(--p-red-800);--color-env-staging-bg:var(--p-amber-100);--color-env-staging-fg:var(--p-amber-800);--color-change-added:var(--p-green-700);--color-change-modified:var(--p-amber-700);--color-change-deleted:var(--p-gray-500);--color-bg-code:var(--p-surface-100);--color-bg-chip:var(--p-content-hover-background)}.dark{--color-danger-bg:var(--p-red-950);--color-danger-fg:var(--p-red-300);--color-success-bg:var(--p-green-950);--color-success-fg:var(--p-green-400);--color-warning-bg:var(--p-amber-950);--color-warning-fg:var(--p-amber-300);--color-info-bg:var(--p-blue-950);--color-info-fg:var(--p-blue-300);--color-env-prod-bg:var(--p-red-950);--color-env-prod-fg:var(--p-red-300);--color-env-staging-bg:var(--p-amber-950);--color-env-staging-fg:var(--p-amber-300);--color-change-added:var(--p-green-400);--color-change-modified:var(--p-amber-400);--color-change-deleted:var(--p-gray-400);--color-bg-code:var(--p-surface-900)}
@@ -6,14 +6,14 @@
6
6
  <title>Gazetta CMS</title>
7
7
  <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='8' fill='%238b5cf6'/%3E%3Crect x='7' y='7' width='8' height='8' rx='2' fill='white'/%3E%3Crect x='17' y='7' width='8' height='8' rx='2' fill='white' opacity='.6'/%3E%3Crect x='7' y='17' width='8' height='8' rx='2' fill='white' opacity='.6'/%3E%3Crect x='17' y='17' width='8' height='8' rx='2' fill='white' opacity='.3'/%3E%3C/svg%3E">
8
8
  <link rel="stylesheet" href="https://unpkg.com/primeicons/primeicons.css">
9
- <script type="module" crossorigin src="/admin/assets/index-DjGNi6yy.js"></script>
9
+ <script type="module" crossorigin src="/admin/assets/index-BZAFKsUp.js"></script>
10
10
  <link rel="modulepreload" crossorigin href="/admin/assets/rolldown-runtime-COnpUsM8.js">
11
11
  <link rel="modulepreload" crossorigin href="/admin/assets/vendor-react-BipDVGow.js">
12
12
  <link rel="modulepreload" crossorigin href="/admin/assets/vendor-tiptap-IyO99U4R.js">
13
13
  <link rel="modulepreload" crossorigin href="/admin/assets/vendor-primevue-BnR1c_bQ.js">
14
14
  <link rel="modulepreload" crossorigin href="/admin/assets/vendor-rjsf-HKBAjOmQ.js">
15
15
  <link rel="modulepreload" crossorigin href="/admin/assets/vendor-vue-DSjyxCX6.js">
16
- <link rel="stylesheet" crossorigin href="/admin/assets/index-Bh_y1d_l.css">
16
+ <link rel="stylesheet" crossorigin href="/admin/assets/index-BpRotMuK.css">
17
17
  </head>
18
18
  <body>
19
19
  <div id="app"></div>
@@ -14,6 +14,12 @@ export interface AdminAppOptions {
14
14
  /** Raw target configs — targets will be initialized lazily on first publish/fetch */
15
15
  targetConfigs?: Record<string, TargetConfig>;
16
16
  }
17
- export declare function createAdminApp(opts: AdminAppOptions): Hono;
18
- export declare function createAdminApp(siteDir: string, storage: StorageProvider, targets?: Map<string, StorageProvider>): Hono;
17
+ type AdminApp = Hono & {
18
+ invalidateTemplatesCache(): void;
19
+ invalidateSourceSidecars(): void;
20
+ writeSourceSidecar(kind: 'page' | 'fragment', name: string): Promise<void>;
21
+ };
22
+ export declare function createAdminApp(opts: AdminAppOptions): AdminApp;
23
+ export declare function createAdminApp(siteDir: string, storage: StorageProvider, targets?: Map<string, StorageProvider>): AdminApp;
24
+ export {};
19
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAWhE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,eAAe,CAAA;IACxB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,uCAAuC;IACvC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACtC,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CAC7C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAA;AAC3D,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAchE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,eAAe,CAAA;IACxB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,uCAAuC;IACvC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACtC,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CAC7C;AAED,KAAK,QAAQ,GAAG,IAAI,GAAG;IACrB,wBAAwB,IAAI,IAAI,CAAA;IAChC,wBAAwB,IAAI,IAAI,CAAA;IAChC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3E,CAAA;AACD,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,QAAQ,CAAA;AAC/D,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAA"}
@@ -1,6 +1,9 @@
1
1
  import { Hono } from 'hono';
2
2
  import { join } from 'node:path';
3
3
  import { logger } from 'hono/logger';
4
+ import { scanTemplates } from '../templates-scan.js';
5
+ import { memoizeAsync } from '../concurrency.js';
6
+ import { createSourceSidecarWriter } from '../source-sidecars.js';
4
7
  import { authMiddleware } from './middleware/auth.js';
5
8
  import { siteRoutes } from './routes/site.js';
6
9
  import { pageRoutes } from './routes/pages.js';
@@ -19,14 +22,37 @@ export function createAdminApp(siteDirOrOpts, storage, targets) {
19
22
  app.use('/api/*', authMiddleware());
20
23
  const templatesDir = opts.templatesDir ?? join(opts.siteDir, 'templates');
21
24
  const adminDir = opts.adminDir ?? join(opts.siteDir, 'admin');
25
+ // scanTemplates spawns a worker thread per template (jiti import + graph
26
+ // hash). On a 50-template project that's ~5s of CPU on every publish +
27
+ // compare. Memoize at the server lifetime — the CLI's file watcher calls
28
+ // invalidateTemplatesCache() below on any template change.
29
+ //
30
+ // Keyed by (dir, root) as a string; different sites on one server would
31
+ // each get their own cache entry. For now there's only one site per
32
+ // server so a single memoize is enough; swap for a Map<key, Memoized> if
33
+ // we go multi-site per process.
34
+ const cachedScan = memoizeAsync(async () => scanTemplates(templatesDir, opts.siteDir.replace(/[\\/]sites[\\/][^\\/]+$/, '')));
35
+ const scan = (tDir, root) => tDir === templatesDir ? cachedScan.get() : scanTemplates(tDir, root);
36
+ const sidecarWriter = createSourceSidecarWriter({
37
+ storage: opts.storage,
38
+ siteDir: opts.siteDir,
39
+ scanTemplates: () => cachedScan.get(),
40
+ });
22
41
  app.route('/', siteRoutes(opts.siteDir, opts.storage));
23
- app.route('/', pageRoutes(opts.siteDir, opts.storage));
24
- app.route('/', fragmentRoutes(opts.siteDir, opts.storage));
42
+ app.route('/', pageRoutes(opts.siteDir, opts.storage, sidecarWriter));
43
+ app.route('/', fragmentRoutes(opts.siteDir, opts.storage, sidecarWriter));
25
44
  app.route('/', templateRoutes(opts.siteDir, opts.storage, templatesDir, adminDir, opts.production));
26
45
  app.route('/', previewRoutes(opts.siteDir, opts.storage, templatesDir));
27
- app.route('/', publishRoutes(opts.siteDir, opts.storage, opts.targets, opts.targetConfigs, templatesDir));
28
- app.route('/', compareRoutes(opts.siteDir, opts.storage, opts.targets, opts.targetConfigs, templatesDir));
46
+ app.route('/', publishRoutes(opts.siteDir, opts.storage, opts.targets, opts.targetConfigs, templatesDir, scan));
47
+ app.route('/', compareRoutes(opts.siteDir, opts.storage, opts.targets, opts.targetConfigs, templatesDir, scan));
29
48
  app.route('/', fieldRoutes(opts.siteDir, opts.storage, adminDir));
30
- return app;
49
+ // Exposed for the CLI's template file watcher: clears the memoized scan
50
+ // so the next publish/compare picks up template edits. Not part of the
51
+ // Hono Request interface — the CLI casts the return.
52
+ const appWithInvalidate = app;
53
+ appWithInvalidate.invalidateTemplatesCache = () => cachedScan.invalidate();
54
+ appWithInvalidate.invalidateSourceSidecars = () => sidecarWriter.invalidate();
55
+ appWithInvalidate.writeSourceSidecar = (kind, name) => sidecarWriter.writeFor(kind, name);
56
+ return appWithInvalidate;
31
57
  }
32
58
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAmBhD,MAAM,UAAU,cAAc,CAC5B,aAAuC,EACvC,OAAyB,EACzB,OAAsC;IAEtC,MAAM,IAAI,GAAoB,OAAO,aAAa,KAAK,QAAQ;QAC7D,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAQ,EAAE,OAAO,EAAE;QACxD,CAAC,CAAC,aAAa,CAAA;IAEjB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IAEtB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IACjB,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAA;IAEnC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAE7D,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACtD,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACtD,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1D,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;IACnG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;IACvE,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAA;IACzG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAA;IACzG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEjE,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin-api/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Hono } from 'hono';
2
2
  import type { StorageProvider, TargetConfig } from '../../types.js';
3
- export declare function compareRoutes(siteDir: string, sourceStorage: StorageProvider, preInitTargets?: Map<string, StorageProvider>, targetConfigs?: Record<string, TargetConfig>, templatesDir?: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
3
+ import type { TemplateInfo } from '../../templates-scan.js';
4
+ export declare function compareRoutes(siteDir: string, sourceStorage: StorageProvider, preInitTargets?: Map<string, StorageProvider>, targetConfigs?: Record<string, TargetConfig>, templatesDir?: string, scanTemplatesInjected?: (templatesDir: string, projectRoot: string) => Promise<TemplateInfo[]>): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
4
5
  //# sourceMappingURL=compare.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/admin-api/routes/compare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAInE,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,eAAe,EAC9B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EAC7C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC5C,YAAY,CAAC,EAAE,MAAM,8EAsDtB"}
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/admin-api/routes/compare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAGnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,eAAe,EAC9B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EAC7C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC5C,YAAY,CAAC,EAAE,MAAM,EACrB,qBAAqB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,8EAuD/F"}
@@ -2,7 +2,7 @@ import { Hono } from 'hono';
2
2
  import { join } from 'node:path';
3
3
  import { getPublishMode } from '../../types.js';
4
4
  import { compareTargets } from '../../compare.js';
5
- export function compareRoutes(siteDir, sourceStorage, preInitTargets, targetConfigs, templatesDir) {
5
+ export function compareRoutes(siteDir, sourceStorage, preInitTargets, targetConfigs, templatesDir, scanTemplatesInjected) {
6
6
  const app = new Hono();
7
7
  let targets = preInitTargets ?? null;
8
8
  const initPromise = preInitTargets
@@ -43,6 +43,7 @@ export function compareRoutes(siteDir, sourceStorage, preInitTargets, targetConf
43
43
  templatesDir: tdir,
44
44
  projectRoot,
45
45
  publishMode,
46
+ scanTemplates: scanTemplatesInjected,
46
47
  });
47
48
  return c.json(result);
48
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../src/admin-api/routes/compare.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../src/admin-api/routes/compare.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Hono } from 'hono';
2
2
  import type { StorageProvider } from '../../types.js';
3
- export declare function fragmentRoutes(siteDir: string, storage: StorageProvider): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
3
+ import type { SourceSidecarWriter } from '../../source-sidecars.js';
4
+ export declare function fragmentRoutes(siteDir: string, storage: StorageProvider, sidecarWriter?: SourceSidecarWriter): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
4
5
  //# sourceMappingURL=fragments.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fragments.d.ts","sourceRoot":"","sources":["../../../src/admin-api/routes/fragments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGrD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,8EAyEvE"}
1
+ {"version":3,"file":"fragments.d.ts","sourceRoot":"","sources":["../../../src/admin-api/routes/fragments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEnE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,mBAAmB,8EA2E5G"}
@@ -1,7 +1,7 @@
1
1
  import { Hono } from 'hono';
2
2
  import { join } from 'node:path';
3
3
  import { loadSite } from '../../site-loader.js';
4
- export function fragmentRoutes(siteDir, storage) {
4
+ export function fragmentRoutes(siteDir, storage, sidecarWriter) {
5
5
  const app = new Hono();
6
6
  app.get('/api/fragments', async (c) => {
7
7
  const site = await loadSite(siteDir, storage);
@@ -24,6 +24,7 @@ export function fragmentRoutes(siteDir, storage) {
24
24
  await storage.mkdir(fragDir);
25
25
  const manifest = { template: body.template, components: [] };
26
26
  await storage.writeFile(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
27
+ await sidecarWriter?.writeFor('fragment', body.name);
27
28
  return c.json({ ok: true, name: body.name });
28
29
  });
29
30
  app.get('/api/fragments/:name', async (c) => {
@@ -53,6 +54,7 @@ export function fragmentRoutes(siteDir, storage) {
53
54
  components: body.components ?? fragment.components,
54
55
  };
55
56
  await storage.writeFile(join(fragment.dir, 'fragment.json'), JSON.stringify(manifest, null, 2) + '\n');
57
+ await sidecarWriter?.writeFor('fragment', name);
56
58
  return c.json({ ok: true });
57
59
  });
58
60
  app.delete('/api/fragments/:name', async (c) => {
@@ -1 +1 @@
1
- {"version":3,"file":"fragments.js","sourceRoot":"","sources":["../../../src/admin-api/routes/fragments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fragments.js","sourceRoot":"","sources":["../../../src/admin-api/routes/fragments.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Hono } from 'hono';
2
2
  import type { StorageProvider } from '../../types.js';
3
- export declare function pageRoutes(siteDir: string, storage: StorageProvider): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
3
+ import type { SourceSidecarWriter } from '../../source-sidecars.js';
4
+ export declare function pageRoutes(siteDir: string, storage: StorageProvider, sidecarWriter?: SourceSidecarWriter): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
4
5
  //# sourceMappingURL=pages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../../src/admin-api/routes/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGrD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,8EA+EnE"}
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../../src/admin-api/routes/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEnE,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,mBAAmB,8EAiFxG"}
@@ -1,7 +1,7 @@
1
1
  import { Hono } from 'hono';
2
2
  import { join } from 'node:path';
3
3
  import { loadSite } from '../../site-loader.js';
4
- export function pageRoutes(siteDir, storage) {
4
+ export function pageRoutes(siteDir, storage, sidecarWriter) {
5
5
  const app = new Hono();
6
6
  app.get('/api/pages', async (c) => {
7
7
  const site = await loadSite(siteDir, storage);
@@ -29,6 +29,7 @@ export function pageRoutes(siteDir, storage) {
29
29
  components: [],
30
30
  };
31
31
  await storage.writeFile(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
32
+ await sidecarWriter?.writeFor('page', body.name);
32
33
  return c.json({ ok: true, name: body.name });
33
34
  });
34
35
  app.get('/api/pages/:name{.+}', async (c) => {
@@ -59,6 +60,7 @@ export function pageRoutes(siteDir, storage) {
59
60
  components: body.components ?? page.components,
60
61
  };
61
62
  await storage.writeFile(join(page.dir, 'page.json'), JSON.stringify(manifest, null, 2) + '\n');
63
+ await sidecarWriter?.writeFor('page', name);
62
64
  return c.json({ ok: true });
63
65
  });
64
66
  app.delete('/api/pages/:name{.+}', async (c) => {
@@ -1 +1 @@
1
- {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../../src/admin-api/routes/pages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../../src/admin-api/routes/pages.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { Hono } from 'hono';
2
2
  import type { StorageProvider, TargetConfig } from '../../types.js';
3
3
  import type { PublishResult } from '../../publish.js';
4
+ import { type TemplateInfo } from '../../templates-scan.js';
4
5
  /**
5
6
  * Progress events streamed by runPublish. Consumed both by the SSE route
6
7
  * (forwarded to the client as event-stream messages) and the legacy
@@ -34,5 +35,5 @@ export type PublishProgress = {
34
35
  errors: string[];
35
36
  }[];
36
37
  };
37
- export declare function publishRoutes(siteDir: string, sourceStorage: StorageProvider, preInitTargets?: Map<string, StorageProvider>, targetConfigs?: Record<string, TargetConfig>, templatesDir?: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
38
+ export declare function publishRoutes(siteDir: string, sourceStorage: StorageProvider, preInitTargets?: Map<string, StorageProvider>, targetConfigs?: Record<string, TargetConfig>, templatesDir?: string, scanTemplatesInjected?: (templatesDir: string, projectRoot: string) => Promise<TemplateInfo[]>): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
38
39
  //# sourceMappingURL=publish.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/admin-api/routes/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAEnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAOrD;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnF;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAA;CAAE,CAAA;AAE7F,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,eAAe,EAC9B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EAC7C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC5C,YAAY,CAAC,EAAE,MAAM,8EAuQtB"}
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/admin-api/routes/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAInE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAIrD,OAAO,EAAqC,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAG9F;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnF;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAA;CAAE,CAAA;AAE7F,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,eAAe,EAC9B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EAC7C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC5C,YAAY,CAAC,EAAE,MAAM,EAIrB,qBAAqB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,8EAmW/F"}
@@ -1,13 +1,20 @@
1
1
  import { Hono } from 'hono';
2
2
  import { streamSSE } from 'hono/streaming';
3
3
  import { getPublishMode, getEnvironment } from '../../types.js';
4
- import { publishItems, resolveDependencies } from '../../publish.js';
4
+ import { publishItems, resolveDependencies, findFragmentDependents, findDependentsFromSidecars } from '../../publish.js';
5
+ import { listSidecars } from '../../sidecars.js';
6
+ import { mapLimitStream } from '../../concurrency.js';
5
7
  import { publishPageRendered, publishPageStatic, publishFragmentRendered, publishSiteManifest, publishFragmentIndex, createCloudflarePurge, lookupCloudflareZoneId } from '../../publish-rendered.js';
6
8
  import { loadSite } from '../../site-loader.js';
7
9
  import { resolveEnvVars } from '../../targets.js';
8
10
  import { scanTemplates, templateHashesFrom } from '../../templates-scan.js';
9
11
  import { hashManifest } from '../../hash.js';
10
- export function publishRoutes(siteDir, sourceStorage, preInitTargets, targetConfigs, templatesDir) {
12
+ export function publishRoutes(siteDir, sourceStorage, preInitTargets, targetConfigs, templatesDir,
13
+ // Optional injected scanner — the admin-api server memoizes it and
14
+ // clears the cache via its template file watcher. Default: fresh scan
15
+ // on every call (used by the CLI and tests).
16
+ scanTemplatesInjected) {
17
+ const scan = scanTemplatesInjected ?? scanTemplates;
11
18
  const app = new Hono();
12
19
  // Background target initialization
13
20
  let targets = preInitTargets ?? null;
@@ -35,9 +42,64 @@ export function publishRoutes(siteDir, sourceStorage, preInitTargets, targetConf
35
42
  const t = await getTargets();
36
43
  return c.json([...t.keys()].map(name => {
37
44
  const cfg = getTargetConfig(name);
38
- return { name, environment: cfg ? getEnvironment(cfg) : 'local' };
45
+ return {
46
+ name,
47
+ environment: cfg ? getEnvironment(cfg) : 'local',
48
+ publishMode: cfg ? getPublishMode(cfg) : 'static',
49
+ };
39
50
  }));
40
51
  });
52
+ /**
53
+ * Reverse-dependency lookup for publish UI impact preview.
54
+ * GET /api/dependents?item=fragments/header[&target=staging]
55
+ * → { pages: string[], fragments: string[] }
56
+ *
57
+ * Without `target`: scans local source manifests (authoritative for the
58
+ * current draft state — what's about to be published). Slow-ish on very
59
+ * large sites since it reads every manifest.
60
+ *
61
+ * With `target`: uses published .uses-* / .tpl-* sidecars on that target.
62
+ * Listings only, no content reads — scales to 10k+ items at the cost of
63
+ * reflecting only what's been published (not unsaved local changes).
64
+ * Useful for answering "what pages would need republish if this fragment
65
+ * changed" on large sites.
66
+ */
67
+ app.get('/api/dependents', async (c) => {
68
+ const item = c.req.query('item');
69
+ if (!item || !item.startsWith('fragments/')) {
70
+ return c.json({ error: 'Missing or invalid "item" query (must be fragments/<name>)' }, 400);
71
+ }
72
+ const fragmentName = item.slice('fragments/'.length);
73
+ const targetName = c.req.query('target');
74
+ try {
75
+ if (targetName) {
76
+ const t = await getTargets();
77
+ const targetStorage = t.get(targetName);
78
+ if (!targetStorage)
79
+ return c.json({ error: `Unknown target: ${targetName}` }, 400);
80
+ const result = await findDependentsFromSidecars(targetStorage, { fragment: fragmentName });
81
+ return c.json(result);
82
+ }
83
+ // Source-side: prefer sidecars (listings only) when present. If the
84
+ // project has any source sidecars, trust them — empty means "no
85
+ // dependents," not "stale." Fall back to a full manifest scan only
86
+ // when sidecars don't exist (e.g. project was never opened in the
87
+ // admin UI).
88
+ const [pagesList, fragmentsList] = await Promise.all([
89
+ listSidecars(sourceStorage, `${siteDir}/pages`),
90
+ listSidecars(sourceStorage, `${siteDir}/fragments`),
91
+ ]);
92
+ if (pagesList.size || fragmentsList.size) {
93
+ const result = await findDependentsFromSidecars(sourceStorage, { fragment: fragmentName }, { baseDir: siteDir });
94
+ return c.json(result);
95
+ }
96
+ const result = await findFragmentDependents(sourceStorage, siteDir, fragmentName);
97
+ return c.json(result);
98
+ }
99
+ catch (err) {
100
+ return c.json({ error: err.message }, 500);
101
+ }
102
+ });
41
103
  /**
42
104
  * Run a publish, yielding progress events. Both the synchronous
43
105
  * /api/publish route and the streaming /api/publish/stream route consume
@@ -70,7 +132,7 @@ export function publishRoutes(siteDir, sourceStorage, preInitTargets, targetConf
70
132
  console.log(` Targets: ${targetNames.join(', ')}`);
71
133
  const tdir = templatesDir ?? `${siteDir}/templates`;
72
134
  const projectRoot = siteDir.replace(/\/sites\/[^/]+$/, '');
73
- const templateInfos = await scanTemplates(tdir, projectRoot);
135
+ const templateInfos = await scan(tdir, projectRoot);
74
136
  const invalidTpls = templateInfos.filter(t => !t.valid);
75
137
  if (invalidTpls.length) {
76
138
  yield {
@@ -89,47 +151,79 @@ export function publishRoutes(siteDir, sourceStorage, preInitTargets, targetConf
89
151
  const config = getTargetConfig(targetName);
90
152
  const isStatic = config ? getPublishMode(config) === 'static' : true;
91
153
  const purgeConfig = config?.cache?.purge;
154
+ // Static mode bakes fragments into pages at publish time — if the user
155
+ // picked @header, we must also republish every page that uses it.
156
+ // Expand per-target so ESI targets still get the narrow item set.
157
+ let targetItems = allItems;
158
+ if (isStatic) {
159
+ const fragmentItems = items.filter(i => i.startsWith('fragments/'));
160
+ if (fragmentItems.length) {
161
+ const expanded = new Set(allItems);
162
+ for (const frag of fragmentItems) {
163
+ const name = frag.replace('fragments/', '');
164
+ const deps = await findFragmentDependents(sourceStorage, siteDir, name);
165
+ for (const p of deps.pages)
166
+ expanded.add(`pages/${p}`);
167
+ }
168
+ targetItems = [...expanded];
169
+ }
170
+ }
92
171
  // Step count: source-copy + per-item render + manifest+index + (purge?)
93
- const total = 1 + allItems.length + 1 + (purgeConfig?.type === 'cloudflare' ? 1 : 0);
172
+ const total = 1 + targetItems.length + 1 + (purgeConfig?.type === 'cloudflare' ? 1 : 0);
94
173
  yield { kind: 'target-start', target: targetName, total };
95
174
  let current = 0;
96
175
  try {
97
176
  let totalFiles = 0;
98
177
  // 1. Source copy
99
- const { copiedFiles } = await publishItems(sourceStorage, siteDir, targetStorage, '', allItems);
178
+ const { copiedFiles } = await publishItems(sourceStorage, siteDir, targetStorage, '', targetItems);
100
179
  totalFiles += copiedFiles;
101
180
  current++;
102
181
  yield { kind: 'progress', target: targetName, current, total, label: 'source files' };
103
- // 2. Render each item
104
- for (const item of allItems) {
182
+ // 2. Render items in bounded parallel. Progress events are yielded
183
+ // in completion order the UI shows X/N + whatever finished last,
184
+ // which stays meaningful without needing input-order. Preserves the
185
+ // event contract: one 'progress' per item between 'target-start'
186
+ // and 'target-result'.
187
+ // Static-mode page hashes must include fragment hashes (a fragment
188
+ // change invalidates every page that bakes it in). Matches the
189
+ // combination used by compareTargets.
190
+ const fragmentHashes = new Map();
191
+ if (isStatic) {
192
+ for (const [fragName, frag] of site.fragments) {
193
+ fragmentHashes.set(fragName, hashManifest(frag, { templateHashes }));
194
+ }
195
+ }
196
+ const pageHashOpts = isStatic ? { templateHashes, fragmentHashes } : { templateHashes };
197
+ const renderItem = async (item) => {
105
198
  if (item.startsWith('pages/')) {
106
199
  const pageName = item.replace('pages/', '');
107
200
  const page = site.pages.get(pageName);
108
- const manifestHash = page ? hashManifest(page, { templateHashes }) : undefined;
201
+ const manifestHash = page ? hashManifest(page, pageHashOpts) : undefined;
109
202
  if (isStatic) {
110
- const { files } = await publishPageStatic(pageName, sourceStorage, siteDir, targetStorage, tdir, manifestHash);
111
- totalFiles += files;
112
- }
113
- else {
114
- const { files } = await publishPageRendered(pageName, sourceStorage, siteDir, targetStorage, config?.cache, tdir, manifestHash);
115
- totalFiles += files;
203
+ return publishPageStatic(pageName, sourceStorage, siteDir, targetStorage, tdir, manifestHash, site);
116
204
  }
205
+ const { files } = await publishPageRendered(pageName, sourceStorage, siteDir, targetStorage, config?.cache, tdir, manifestHash, site);
206
+ return { files };
117
207
  }
118
- else if (item.startsWith('fragments/')) {
119
- if (!isStatic) {
120
- const fragName = item.replace('fragments/', '');
121
- const frag = site.fragments.get(fragName);
122
- const manifestHash = frag ? hashManifest(frag, { templateHashes }) : undefined;
123
- const { files } = await publishFragmentRendered(fragName, sourceStorage, siteDir, targetStorage, tdir, manifestHash);
124
- totalFiles += files;
125
- }
208
+ if (item.startsWith('fragments/') && !isStatic) {
209
+ const fragName = item.replace('fragments/', '');
210
+ const frag = site.fragments.get(fragName);
211
+ const manifestHash = frag ? hashManifest(frag, { templateHashes }) : undefined;
212
+ const { files } = await publishFragmentRendered(fragName, sourceStorage, siteDir, targetStorage, tdir, manifestHash, site);
213
+ return { files };
126
214
  }
215
+ return { files: 0 }; // skipped (e.g. fragment on static target)
216
+ };
217
+ // Render concurrency is lower than listing concurrency — each render
218
+ // may do multiple writes, so 10 in flight is the safe default.
219
+ for await (const { item, result } of mapLimitStream(targetItems, renderItem, 10)) {
220
+ totalFiles += result.files;
127
221
  current++;
128
222
  yield { kind: 'progress', target: targetName, current, total, label: item };
129
223
  }
130
224
  // 3. Site manifest + fragment index
131
- await publishSiteManifest(sourceStorage, siteDir, targetStorage);
132
- await publishFragmentIndex(sourceStorage, siteDir, targetStorage);
225
+ await publishSiteManifest(sourceStorage, siteDir, targetStorage, site);
226
+ await publishFragmentIndex(sourceStorage, siteDir, targetStorage, site);
133
227
  totalFiles += 2;
134
228
  current++;
135
229
  yield { kind: 'progress', target: targetName, current, total, label: 'site manifest' };
@@ -139,14 +233,14 @@ export function publishRoutes(siteDir, sourceStorage, preInitTargets, targetConf
139
233
  const zoneId = resolveEnvVars(purgeConfig.zoneId) ?? (config?.siteUrl && apiToken ? await lookupCloudflareZoneId(config.siteUrl, apiToken) : null);
140
234
  if (apiToken && zoneId) {
141
235
  const purge = createCloudflarePurge(zoneId, apiToken);
142
- const hasFragments = allItems.some(i => i.startsWith('fragments/'));
236
+ const hasFragments = targetItems.some(i => i.startsWith('fragments/'));
143
237
  if (hasFragments) {
144
238
  await purge.purgeAll();
145
239
  console.log(` ${targetName}: cache purged (all)`);
146
240
  }
147
241
  else if (config?.siteUrl) {
148
242
  const siteForUrls = await loadSite({ siteDir, storage: sourceStorage, templatesDir });
149
- const urls = allItems
243
+ const urls = targetItems
150
244
  .filter(i => i.startsWith('pages/'))
151
245
  .map(i => {
152
246
  const page = siteForUrls.pages.get(i.replace('pages/', ''));