@growth-labs/cms 0.8.38 → 0.8.40

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 (87) hide show
  1. package/dist/engine/fronts-publish.d.ts +29 -0
  2. package/dist/engine/fronts-publish.d.ts.map +1 -1
  3. package/dist/engine/fronts-publish.js +58 -0
  4. package/dist/engine/fronts-publish.js.map +1 -1
  5. package/dist/engine/publication-current-guard.d.ts +19 -0
  6. package/dist/engine/publication-current-guard.d.ts.map +1 -1
  7. package/dist/engine/publication-current-guard.js +75 -0
  8. package/dist/engine/publication-current-guard.js.map +1 -1
  9. package/dist/engine/publisher.d.ts +3 -0
  10. package/dist/engine/publisher.d.ts.map +1 -1
  11. package/dist/engine/publisher.js +15 -2
  12. package/dist/engine/publisher.js.map +1 -1
  13. package/dist/foundry-emit.d.ts +59 -6
  14. package/dist/foundry-emit.d.ts.map +1 -1
  15. package/dist/foundry-emit.js +16 -1
  16. package/dist/foundry-emit.js.map +1 -1
  17. package/dist/routes/content-insights.d.ts.map +1 -1
  18. package/dist/routes/content-insights.js +6 -0
  19. package/dist/routes/content-insights.js.map +1 -1
  20. package/dist/routes/content.d.ts +3 -0
  21. package/dist/routes/content.d.ts.map +1 -1
  22. package/dist/routes/content.js +1 -0
  23. package/dist/routes/content.js.map +1 -1
  24. package/dist/routes/foundry-publish.d.ts.map +1 -1
  25. package/dist/routes/foundry-publish.js +101 -12
  26. package/dist/routes/foundry-publish.js.map +1 -1
  27. package/dist/routes/fronts-publish.d.ts +2 -0
  28. package/dist/routes/fronts-publish.d.ts.map +1 -1
  29. package/dist/routes/fronts-publish.js +47 -1
  30. package/dist/routes/fronts-publish.js.map +1 -1
  31. package/dist/routes/media-lib.d.ts +2 -0
  32. package/dist/routes/media-lib.d.ts.map +1 -1
  33. package/dist/routes/media-lib.js +6 -0
  34. package/dist/routes/media-lib.js.map +1 -1
  35. package/dist/schema/insights-ingest.d.ts +88 -88
  36. package/dist/ui/api/fronts/publish-callback.d.ts +1 -0
  37. package/dist/ui/api/fronts/publish-callback.d.ts.map +1 -1
  38. package/dist/ui/api/fronts/publish-callback.js +1 -0
  39. package/dist/ui/api/fronts/publish-callback.js.map +1 -1
  40. package/dist/ui/editor/extensions.d.ts +1 -1
  41. package/dist/ui/editor/extensions.d.ts.map +1 -1
  42. package/dist/ui/editor/extensions.js +15 -1
  43. package/dist/ui/editor/extensions.js.map +1 -1
  44. package/dist/ui/editor/heading-level.d.ts +4 -0
  45. package/dist/ui/editor/heading-level.d.ts.map +1 -0
  46. package/dist/ui/editor/heading-level.js +13 -0
  47. package/dist/ui/editor/heading-level.js.map +1 -0
  48. package/dist/ui/editor/portable-text.d.ts.map +1 -1
  49. package/dist/ui/editor/portable-text.js +3 -2
  50. package/dist/ui/editor/portable-text.js.map +1 -1
  51. package/dist/ui/editor/serialize.d.ts.map +1 -1
  52. package/dist/ui/editor/serialize.js +4 -3
  53. package/dist/ui/editor/serialize.js.map +1 -1
  54. package/dist/ui/preview/SitePreviewFrame.d.ts +11 -0
  55. package/dist/ui/preview/SitePreviewFrame.d.ts.map +1 -0
  56. package/dist/ui/preview/SitePreviewFrame.js +86 -0
  57. package/dist/ui/preview/SitePreviewFrame.js.map +1 -0
  58. package/dist/ui/preview/preview-layout.d.ts +6 -0
  59. package/dist/ui/preview/preview-layout.d.ts.map +1 -1
  60. package/dist/ui/preview/preview-layout.js +15 -0
  61. package/dist/ui/preview/preview-layout.js.map +1 -1
  62. package/dist/ui/screens/EditorScreen.d.ts.map +1 -1
  63. package/dist/ui/screens/EditorScreen.js +61 -25
  64. package/dist/ui/screens/EditorScreen.js.map +1 -1
  65. package/dist/ui/screens/public-url.d.ts +12 -0
  66. package/dist/ui/screens/public-url.d.ts.map +1 -1
  67. package/dist/ui/screens/public-url.js +30 -0
  68. package/dist/ui/screens/public-url.js.map +1 -1
  69. package/package.json +1 -1
  70. package/src/engine/fronts-publish.ts +88 -0
  71. package/src/engine/publication-current-guard.ts +103 -0
  72. package/src/engine/publisher.ts +22 -3
  73. package/src/foundry-emit.ts +17 -0
  74. package/src/routes/content-insights.ts +6 -0
  75. package/src/routes/content.ts +4 -0
  76. package/src/routes/foundry-publish.ts +134 -12
  77. package/src/routes/fronts-publish.ts +57 -0
  78. package/src/routes/media-lib.ts +6 -0
  79. package/src/ui/api/fronts/publish-callback.ts +3 -0
  80. package/src/ui/editor/extensions.ts +16 -1
  81. package/src/ui/editor/heading-level.ts +14 -0
  82. package/src/ui/editor/portable-text.ts +3 -2
  83. package/src/ui/editor/serialize.ts +4 -3
  84. package/src/ui/preview/SitePreviewFrame.tsx +111 -0
  85. package/src/ui/preview/preview-layout.ts +17 -0
  86. package/src/ui/screens/EditorScreen.tsx +76 -27
  87. package/src/ui/screens/public-url.ts +36 -0
@@ -3,25 +3,27 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  //
4
4
  // Ported from editor.jsx:
5
5
  // - Header: back-to-Content, type icon, status pill, autosaved indicator,
6
- // preview-position segment (right/bottom/off), Preview (open signed URL),
7
- // Publish action
6
+ // preview-position segment (right/bottom/off), Preview (real-site draft in
7
+ // a new tab), Publish action
8
8
  // - Work area: <ContentForm/> in the main column + 340px empty P3 inspector slot
9
- // - Live-preview pane: <DraftPage doc={...} device={...} /> with device toggle
10
- // (desktop/tablet/mobile)
11
- // - "Open in new tab" mints a HMAC preview token via POST /content/:id/preview-token
12
- // and opens the signed URL
9
+ // - Live-preview pane: the real site's draft render (<SitePreviewFrame/>,
10
+ // `previewUrlFor`) at true device widths, reloaded after every save; types
11
+ // the site cannot render as a draft keep the approximate <DraftPage/>
12
+ // - "Preview" saves, then opens the same real-site draft render in a new tab
13
13
  // - New docs (docRef.id === null) create on first save via ContentForm; the
14
14
  // onDocCreated callback swaps to update mode
15
15
  //
16
16
  // Compile-gated (tsc, jsx: react-jsx). No vitest tests needed for this file —
17
17
  // ContentForm/DraftPage/preview-layout are tested separately; the Tiptap Rte
18
18
  // is Playwright-smoked only.
19
- import { useCallback, useState } from 'react';
19
+ import { useCallback, useEffect, useRef, useState } from 'react';
20
20
  import { buildSharePrefill, ShareModal } from '../components/ShareModal.js';
21
21
  import { ContentForm, } from '../editor/ContentForm.js';
22
22
  import { Icon } from '../icons.js';
23
23
  import { Inspector } from '../inspector/Inspector.js';
24
24
  import { DraftPage } from '../preview/draft-page.js';
25
+ import { SitePreviewFrame } from '../preview/SitePreviewFrame.js';
26
+ import { hasSitePreview, previewUrlFor } from './public-url.js';
25
27
  const CONTENT_TYPE_LABELS = {
26
28
  article: 'Article',
27
29
  video: 'Video',
@@ -103,24 +105,51 @@ export function EditorScreen({ docRef, onClose, allowInlineAuthorCreation = true
103
105
  const [headerTitle, setHeaderTitle] = useState('');
104
106
  // Share modal — true when the Share button is clicked in the editor header
105
107
  const [shareOpen, setShareOpen] = useState(false);
106
- // Mint a preview token and open the signed URL in a new tab
107
- const handlePreviewInTab = useCallback(async () => {
108
- const id = docId;
109
- if (!id)
110
- return;
111
- try {
112
- const res = await fetch(`/admin/api/content/${id}/preview-token`, { method: 'POST' });
113
- if (!res.ok)
114
- return;
115
- const body = (await res.json());
116
- const url = body.url ?? body.token;
117
- if (url)
118
- window.open(url, '_blank');
108
+ // The real-site preview follows the slug as last SAVED, so typing a new slug
109
+ // does not point the frame at a URL the draft does not answer to yet.
110
+ const latestSlug = useRef(previewDoc.slug);
111
+ latestSlug.current = previewDoc.slug;
112
+ const [savedSlug, setSavedSlug] = useState('');
113
+ useEffect(() => {
114
+ if (!savedSlug && previewDoc.slug && saveState.lastSavedAt === null) {
115
+ setSavedSlug(previewDoc.slug);
119
116
  }
120
- catch {
121
- // non-fatal
122
- }
123
- }, [docId]);
117
+ }, [previewDoc.slug, savedSlug, saveState.lastSavedAt]);
118
+ useEffect(() => {
119
+ if (saveState.lastSavedAt !== null)
120
+ setSavedSlug(latestSlug.current);
121
+ }, [saveState.lastSavedAt]);
122
+ const sitePreviewUrl = docId
123
+ ? previewUrlFor({ type: contentType, slug: savedSlug, id: docId }, siteBase)
124
+ : null;
125
+ // Preview in a new tab: open the tab inside the click (popup blockers allow
126
+ // that), save, then point it at the real-site draft render once the save
127
+ // settles so the tab shows the latest edits.
128
+ const pendingPreviewTab = useRef(null);
129
+ const handlePreviewInTab = useCallback(() => {
130
+ if (!docId)
131
+ return;
132
+ const tab = window.open('about:blank', '_blank');
133
+ if (!tab)
134
+ return;
135
+ pendingPreviewTab.current = { tab, since: saveState.lastSavedAt };
136
+ setSaveRequest((value) => value + 1);
137
+ }, [docId, saveState.lastSavedAt]);
138
+ useEffect(() => {
139
+ const pending = pendingPreviewTab.current;
140
+ if (!pending || saveState.saving)
141
+ return;
142
+ if (saveState.lastSavedAt === pending.since && !saveState.saveError)
143
+ return;
144
+ pendingPreviewTab.current = null;
145
+ const url = docId
146
+ ? previewUrlFor({ type: contentType, slug: latestSlug.current, id: docId }, siteBase)
147
+ : null;
148
+ if (url)
149
+ pending.tab.location.href = url;
150
+ else
151
+ pending.tab.close();
152
+ }, [saveState, docId, contentType, siteBase]);
124
153
  const handleOpenAnalytics = useCallback(() => {
125
154
  if (!previewDoc.slug)
126
155
  return;
@@ -194,7 +223,7 @@ export function EditorScreen({ docRef, onClose, allowInlineAuthorCreation = true
194
223
  // -------------------------------------------------------------------------
195
224
  // Render
196
225
  // -------------------------------------------------------------------------
197
- return (_jsxs("div", { style: editorOuter, children: [_jsxs("header", { style: headerBar, children: [_jsxs("div", { style: headerLeft, children: [_jsxs("button", { type: "button", onClick: onClose, style: backBtn, "aria-label": "Back to content library", children: [_jsx(Icon, { name: "chevLeft", size: 16 }), _jsx("span", { children: "Content" })] }), _jsx("div", { style: headerDivider }), _jsx(Icon, { name: contentTypeIcon(contentType), size: 15, style: { color: 'var(--ink-muted)', flexShrink: 0 } }), _jsx("span", { style: headerTitleText, title: headerTitle || 'Untitled', children: headerTitle || 'Untitled' }), _jsx("span", { style: statusPill(status), children: status }), frontsPublishStatus != null && (_jsxs("span", { style: frontsPublishStatusPill(frontsPublishStatus), title: "Fronts publish status (Go path)", children: ["Go: ", frontsPublishStatus] }))] }), _jsxs("div", { style: headerRight, children: [_jsxs("fieldset", { style: fieldsetReset, children: [_jsx("legend", { style: legendHidden, children: "Preview position" }), _jsx("div", { style: segmentGroup, children: ['off', 'right', 'bottom'].map((pos) => (_jsx("button", { type: "button", onClick: () => setPreviewPos(pos), style: segmentBtn(previewPos === pos), "aria-pressed": previewPos === pos, title: `Preview ${pos}`, children: _jsx(Icon, { name: previewPosIcon(pos), size: 14 }) }, pos))) })] }), previewPos !== 'off' && (_jsxs("fieldset", { style: fieldsetReset, children: [_jsx("legend", { style: legendHidden, children: "Preview device" }), _jsx("div", { style: segmentGroup, children: ['desktop', 'tablet', 'mobile'].map((dev) => (_jsx("button", { type: "button", onClick: () => setDevice(dev), style: segmentBtn(device === dev), "aria-pressed": device === dev, title: `${dev} preview`, children: _jsx(Icon, { name: dev, size: 14 }) }, dev))) })] })), previewPos !== 'off' && docId && (_jsx("button", { type: "button", onClick: () => void handlePreviewInTab(), style: actionBtn, title: "Open preview in new tab", children: _jsx(Icon, { name: "globe", size: 14 }) })), contentType === 'article' && docId && previewDoc.slug && (_jsx("button", { type: "button", onClick: handleOpenAnalytics, style: actionBtn, title: "Open article analytics", children: _jsx(Icon, { name: "chart", size: 14 }) })), _jsx("button", { type: "button", onClick: () => setShareOpen(true), style: actionBtn, title: "Share", children: _jsx(Icon, { name: "share", size: 14 }) }), _jsxs("button", { type: "button", onClick: handleSaveDraft, style: saveBtn, disabled: saveState.saving, title: saveState.saving ? 'Saving draft' : 'Save draft changes', children: [_jsx(Icon, { name: "check", size: 14 }), saveState.saving ? 'Saving...' : status === 'draft' ? 'Save draft' : 'Save'] }), _jsxs("button", { type: "button", onClick: () => void handlePublish(), style: publishBtn, disabled: !docId, title: docId ? 'Publish' : 'Save first to publish', children: [_jsx(Icon, { name: "bolt", size: 14 }), "Publish"] })] })] }), _jsxs("div", { style: grid.container, children: [_jsx("div", { style: grid.formColumn, children: _jsxs("div", { style: formAndInspector, children: [_jsx("div", { style: formArea, children: _jsx(ContentForm, { docId: docId, contentType: contentType, onDocCreated: handleDocCreated, onTitleChange: handleTitleChange, onDraftChange: handleDraftChange, saveRequest: saveRequest, onStatusChange: setStatus, onFrontsPublishStatusChange: setFrontsPublishStatus, onSaveStateChange: handleSaveStateChange, primaryCategories: primaryCategories, primaryTopic: primaryTopic, contentMetadataSelects: contentMetadataSelects }) }), _jsx("aside", { style: inspectorSlot, "aria-label": "Inspector", children: _jsx(Inspector, { docId: docId, contentType: contentType, onStatusChange: setStatus, onAuthorChange: handleAuthorChange }) })] }) }), previewPos !== 'off' && (_jsx("div", { style: grid.previewPane, children: _jsx(DraftPage, { doc: previewDoc, device: device }) }))] }), shareOpen && (_jsx(ShareModal, { prefill: buildSharePrefill({
226
+ return (_jsxs("div", { style: editorOuter, children: [_jsxs("header", { style: headerBar, children: [_jsxs("div", { style: headerLeft, children: [_jsxs("button", { type: "button", onClick: onClose, style: backBtn, "aria-label": "Back to content library", children: [_jsx(Icon, { name: "chevLeft", size: 16 }), _jsx("span", { children: "Content" })] }), _jsx("div", { style: headerDivider }), _jsx(Icon, { name: contentTypeIcon(contentType), size: 15, style: { color: 'var(--ink-muted)', flexShrink: 0 } }), _jsx("span", { style: headerTitleText, title: headerTitle || 'Untitled', children: headerTitle || 'Untitled' }), _jsx("span", { style: statusPill(status), children: status }), frontsPublishStatus != null && (_jsxs("span", { style: frontsPublishStatusPill(frontsPublishStatus), title: "Fronts publish status (Go path)", children: ["Go: ", frontsPublishStatus] }))] }), _jsxs("div", { style: headerRight, children: [_jsxs("fieldset", { style: fieldsetReset, children: [_jsx("legend", { style: legendHidden, children: "Preview position" }), _jsx("div", { style: segmentGroup, children: ['off', 'right', 'bottom'].map((pos) => (_jsx("button", { type: "button", onClick: () => setPreviewPos(pos), style: segmentBtn(previewPos === pos), "aria-pressed": previewPos === pos, title: `Preview ${pos}`, children: _jsx(Icon, { name: previewPosIcon(pos), size: 14 }) }, pos))) })] }), previewPos !== 'off' && (_jsxs("fieldset", { style: fieldsetReset, children: [_jsx("legend", { style: legendHidden, children: "Preview device" }), _jsx("div", { style: segmentGroup, children: ['desktop', 'tablet', 'mobile'].map((dev) => (_jsx("button", { type: "button", onClick: () => setDevice(dev), style: segmentBtn(device === dev), "aria-pressed": device === dev, title: `${dev} preview`, children: _jsx(Icon, { name: dev, size: 14 }) }, dev))) })] })), sitePreviewUrl && (_jsxs("button", { type: "button", onClick: handlePreviewInTab, style: saveBtn, title: "Save and open this draft on the live site template in a new tab", children: [_jsx(Icon, { name: "eye", size: 14 }), "Preview"] })), contentType === 'article' && docId && previewDoc.slug && (_jsx("button", { type: "button", onClick: handleOpenAnalytics, style: actionBtn, title: "Open article analytics", children: _jsx(Icon, { name: "chart", size: 14 }) })), _jsx("button", { type: "button", onClick: () => setShareOpen(true), style: actionBtn, title: "Share", children: _jsx(Icon, { name: "share", size: 14 }) }), _jsxs("button", { type: "button", onClick: handleSaveDraft, style: saveBtn, disabled: saveState.saving, title: saveState.saving ? 'Saving draft' : 'Save draft changes', children: [_jsx(Icon, { name: "check", size: 14 }), saveState.saving ? 'Saving...' : status === 'draft' ? 'Save draft' : 'Save'] }), _jsxs("button", { type: "button", onClick: () => void handlePublish(), style: publishBtn, disabled: !docId, title: docId ? 'Publish' : 'Save first to publish', children: [_jsx(Icon, { name: "bolt", size: 14 }), "Publish"] })] })] }), _jsxs("div", { style: grid.container, children: [_jsx("div", { style: grid.formColumn, children: _jsxs("div", { style: formAndInspector, children: [_jsx("div", { style: formArea, children: _jsx(ContentForm, { docId: docId, contentType: contentType, onDocCreated: handleDocCreated, onTitleChange: handleTitleChange, onDraftChange: handleDraftChange, saveRequest: saveRequest, onStatusChange: setStatus, onFrontsPublishStatusChange: setFrontsPublishStatus, onSaveStateChange: handleSaveStateChange, primaryCategories: primaryCategories, primaryTopic: primaryTopic, contentMetadataSelects: contentMetadataSelects }) }), _jsx("aside", { style: inspectorSlot, "aria-label": "Inspector", children: _jsx(Inspector, { docId: docId, contentType: contentType, onStatusChange: setStatus, onAuthorChange: handleAuthorChange }) })] }) }), previewPos !== 'off' && (_jsx("div", { style: grid.previewPane, children: sitePreviewUrl ? (_jsx(SitePreviewFrame, { url: sitePreviewUrl, device: device, version: saveState.lastSavedAt, title: previewDoc.title })) : hasSitePreview(contentType) ? (_jsx("p", { style: previewEmptyNote, children: "Save the draft with a title to see it on the live site template." })) : (_jsx(DraftPage, { doc: previewDoc, device: device })) }))] }), shareOpen && (_jsx(ShareModal, { prefill: buildSharePrefill({
198
227
  type: previewDoc.type,
199
228
  slug: previewDoc.slug,
200
229
  authorId: previewDoc.authorId,
@@ -462,6 +491,13 @@ const fieldsetReset = {
462
491
  const legendHidden = {
463
492
  display: 'none',
464
493
  };
494
+ const previewEmptyNote = {
495
+ margin: 'auto',
496
+ padding: 24,
497
+ fontSize: 13,
498
+ color: 'var(--ink-muted)',
499
+ textAlign: 'center',
500
+ };
465
501
  // Void the unused variable warning by referencing the label map in a subtle
466
502
  // way (it's used implicitly via the type system; keep for completeness).
467
503
  void CONTENT_TYPE_LABELS;
@@ -1 +1 @@
1
- {"version":3,"file":"EditorScreen.js","sourceRoot":"","sources":["../../../src/ui/screens/EditorScreen.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EditorScreen.js","sourceRoot":"","sources":["../../../src/ui/screens/EditorScreen.tsx"],"names":[],"mappings":"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"}
@@ -21,4 +21,16 @@ export declare function publicUrlFor(row: {
21
21
  type: ContentType;
22
22
  slug: string;
23
23
  }, siteBase?: string): string;
24
+ /** Whether the site renders this content type as a draft (see SITE_PREVIEW_PATH). */
25
+ export declare function hasSitePreview(type: ContentType): boolean;
26
+ /**
27
+ * The draft preview URL on the real site: the public page for the item's
28
+ * saved slug, rendered from the current row with the live template and CSS.
29
+ * Returns `null` for a type the site cannot render as a draft.
30
+ */
31
+ export declare function previewUrlFor(row: {
32
+ type: ContentType;
33
+ slug: string;
34
+ id: string;
35
+ }, siteBase?: string): string | null;
24
36
  //# sourceMappingURL=public-url.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-url.d.ts","sourceRoot":"","sources":["../../../src/ui/screens/public-url.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AA8BxD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAUhG"}
1
+ {"version":3,"file":"public-url.d.ts","sourceRoot":"","sources":["../../../src/ui/screens/public-url.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AA8BxD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAUhG;AAiBD,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC5B,GAAG,EAAE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EACpD,QAAQ,CAAC,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAMf"}
@@ -73,4 +73,34 @@ export function publicUrlFor(row, siteBase) {
73
73
  const base = siteBase.replace(/\/+$/, '');
74
74
  return `${base}${path}`;
75
75
  }
76
+ // ---------------------------------------------------------------------------
77
+ // previewUrlFor
78
+ // ---------------------------------------------------------------------------
79
+ /**
80
+ * Public routes that render an unpublished draft for a signed-in publisher via
81
+ * `?preview=<id>` (apps/web publication-routes/article/[slug].astro and
82
+ * videos/[slug].astro). Video uses `/videos/` directly: `/video/<slug>` 301s
83
+ * there and drops the query. The other types have no draft render on the site.
84
+ */
85
+ const SITE_PREVIEW_PATH = {
86
+ article: (slug) => `/article/${slug}/`,
87
+ video: (slug) => `/videos/${slug}/`,
88
+ };
89
+ /** Whether the site renders this content type as a draft (see SITE_PREVIEW_PATH). */
90
+ export function hasSitePreview(type) {
91
+ return SITE_PREVIEW_PATH[type] !== undefined;
92
+ }
93
+ /**
94
+ * The draft preview URL on the real site: the public page for the item's
95
+ * saved slug, rendered from the current row with the live template and CSS.
96
+ * Returns `null` for a type the site cannot render as a draft.
97
+ */
98
+ export function previewUrlFor(row, siteBase) {
99
+ const path = SITE_PREVIEW_PATH[row.type];
100
+ const cleanSlug = row.slug.replace(/^\/+/, '');
101
+ if (!path || !cleanSlug || !row.id)
102
+ return null;
103
+ const base = siteBase ? siteBase.replace(/\/+$/, '') : '';
104
+ return `${base}${path(cleanSlug)}?preview=${encodeURIComponent(row.id)}`;
105
+ }
76
106
  //# sourceMappingURL=public-url.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-url.js","sourceRoot":"","sources":["../../../src/ui/screens/public-url.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,yDAAyD;AACzD,EAAE;AACF,oEAAoE;AACpE,wEAAwE;AACxE,wEAAwE;AACxE,sEAAsE;AACtE,0CAA0C;AAC1C,iFAAiF;AACjF,yBAAyB;AACzB,EAAE;AACF,yEAAyE;AACzE,0DAA0D;AAC1D,0EAA0E;AAC1E,uEAAuE;AACvE,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,2EAA2E;AAC3E,sBAAsB;AAItB,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,mBAAmB,GAAkD;IAC1E,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,EAAE;IACrC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,EAAE;IACrC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,EAAE;IACjC,kEAAkE;IAClE,yDAAyD;IACzD,0CAA0C;IAC1C,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,IAAI,EAAE;IACjD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;CAC9C,CAAA;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAAC,GAAwC,EAAE,QAAiB;IACvF,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAA;IAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACzC,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,CAAA;AACxB,CAAC"}
1
+ {"version":3,"file":"public-url.js","sourceRoot":"","sources":["../../../src/ui/screens/public-url.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,yDAAyD;AACzD,EAAE;AACF,oEAAoE;AACpE,wEAAwE;AACxE,wEAAwE;AACxE,sEAAsE;AACtE,0CAA0C;AAC1C,iFAAiF;AACjF,yBAAyB;AACzB,EAAE;AACF,yEAAyE;AACzE,0DAA0D;AAC1D,0EAA0E;AAC1E,uEAAuE;AACvE,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,2EAA2E;AAC3E,sBAAsB;AAItB,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,mBAAmB,GAAkD;IAC1E,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,EAAE;IACrC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,EAAE;IACrC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,EAAE;IACjC,kEAAkE;IAClE,yDAAyD;IACzD,0CAA0C;IAC1C,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,IAAI,EAAE;IACjD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;CAC9C,CAAA;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAAC,GAAwC,EAAE,QAAiB;IACvF,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAA;IAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACzC,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,CAAA;AACxB,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,iBAAiB,GAA2D;IACjF,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,GAAG;IACtC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,IAAI,GAAG;CACnC,CAAA;AAED,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC/C,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,SAAS,CAAA;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC5B,GAAoD,EACpD,QAAiB;IAEjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAC9C,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAA;IAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACzD,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAA;AACzE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@growth-labs/cms",
3
- "version": "0.8.38",
3
+ "version": "0.8.40",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "growth-labs-cms-migrations": "./dist/cli/migrations.js",
@@ -199,6 +199,94 @@ export interface FrontsPublishCallbackResult {
199
199
  publishedItem?: { id: string; type: ContentType; title: string } | null
200
200
  }
201
201
 
202
+ export interface FrontsPublishObservationInput {
203
+ eventId: string
204
+ intentId: string
205
+ contentId: string
206
+ version: number
207
+ publishAt: number
208
+ status: 'publishing' | 'live'
209
+ receiptSHA256: string
210
+ }
211
+
212
+ /** Read the existing receiver/commit ledgers. Missing rows remain UNKNOWN:
213
+ * events are recorded after processing, so absence never licenses replay. */
214
+ export async function readFrontsPublishObservation(
215
+ db: D1Database,
216
+ input: FrontsPublishObservationInput,
217
+ ) {
218
+ const unknown = { version: 1, state: 'unknown' as const }
219
+ const conflict = { version: 1, state: 'conflict' as const }
220
+ const row = await db
221
+ .prepare(`SELECT event_id, intent_id, content_id, version, status,
222
+ receipt_json, published, attempt_id, error FROM fronts_publish_events WHERE event_id = ? LIMIT 1`)
223
+ .bind(input.eventId)
224
+ .first<{
225
+ event_id: string
226
+ intent_id: string | null
227
+ content_id: string
228
+ version: number | null
229
+ status: string
230
+ receipt_json: string | null
231
+ published: number
232
+ attempt_id: string | null
233
+ error: string | null
234
+ }>()
235
+ if (!row) return unknown
236
+ if (
237
+ row.intent_id !== input.intentId ||
238
+ row.content_id !== input.contentId ||
239
+ row.version !== input.version ||
240
+ row.status !== input.status
241
+ )
242
+ return conflict
243
+ if (row.error) return unknown
244
+ let receipt: FrontsPublishReceipt | null = null
245
+ if (row.receipt_json) {
246
+ try {
247
+ receipt = JSON.parse(row.receipt_json) as FrontsPublishReceipt
248
+ } catch {
249
+ return unknown
250
+ }
251
+ }
252
+ if (input.status === 'live') {
253
+ if (!row.published || !row.attempt_id || !receipt || receipt.sha256 !== input.receiptSHA256)
254
+ return unknown
255
+ const committed = await db
256
+ .prepare(`SELECT a.id FROM content_publication_attempts a
257
+ JOIN content_items c ON c.id = a.content_id AND c.published_revision_id = a.revision_id
258
+ WHERE a.id = ? AND a.content_id = ? AND a.operation = 'publish' AND a.state = 'committed'
259
+ AND c.status = 'published' AND c.deleted_at IS NULL LIMIT 1`)
260
+ .bind(row.attempt_id, input.contentId)
261
+ .first<{ id: string }>()
262
+ if (!committed) return unknown
263
+ const current = await getContentSnapshot(db, input.contentId)
264
+ if (
265
+ !current ||
266
+ !(await matchesCommittedCallback(
267
+ db,
268
+ input.contentId,
269
+ current,
270
+ await hashReceiptIdentity(receipt),
271
+ input,
272
+ ))
273
+ )
274
+ return unknown
275
+ }
276
+ return {
277
+ version: 1,
278
+ state: 'confirmed' as const,
279
+ event_id: row.event_id,
280
+ intent_id: row.intent_id,
281
+ content_id: row.content_id,
282
+ content_version: row.version,
283
+ status: row.status,
284
+ published: row.published === 1,
285
+ attempt_id: row.attempt_id,
286
+ receipt,
287
+ }
288
+ }
289
+
202
290
  function hasReceipt(receipt: FrontsPublishReceipt | null | undefined): boolean {
203
291
  if (!receipt) return false
204
292
  const urls = Array.isArray(receipt.published_urls) && receipt.published_urls.length > 0
@@ -42,6 +42,109 @@ export class PublicationCurrentSnapshotError extends Error {
42
42
  }
43
43
  }
44
44
 
45
+ /** The existing native binding and exact current draft captured for preparation. */
46
+ export interface NativeArticleDraftSnapshot {
47
+ snapshot: Record<string, unknown>
48
+ binding: {
49
+ externalId: string
50
+ contentId: string
51
+ receiptId: string
52
+ requestSHA256: string
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Capture the source in History inside the native writer's D1 transaction.
58
+ * Every dependent write requires this revision, so same-version mutations of
59
+ * metadata, body, taxonomy, relations or native binding cannot pass the CAS.
60
+ */
61
+ export function nativeArticleDraftCapture(
62
+ id: string,
63
+ revisionId: string,
64
+ expected: NativeArticleDraftSnapshot,
65
+ ): { sql: string; bindings: unknown[] } {
66
+ const item = snapshotRecord(expected.snapshot.item)
67
+ const content = snapshotRecord(expected.snapshot.content)
68
+ const binding = expected.binding
69
+ const tags = expected.snapshot.tags
70
+ const labels = expected.snapshot.tagLabels
71
+ const related = expected.snapshot.related
72
+ if (
73
+ item.id !== id ||
74
+ item.type !== 'article' ||
75
+ item.status !== 'draft' ||
76
+ item.deleted_at != null ||
77
+ item.source_id !== `foundry:${binding.externalId}` ||
78
+ binding.contentId !== id ||
79
+ content.content_id !== id ||
80
+ !Array.isArray(tags) ||
81
+ !Array.isArray(labels) ||
82
+ tags.length !== labels.length ||
83
+ !Array.isArray(related)
84
+ )
85
+ throw new TypeError('Native draft capture needs its exact current article snapshot and binding')
86
+ const bindings: unknown[] = [
87
+ revisionId,
88
+ id,
89
+ JSON.stringify({ ...expected.snapshot, native_binding: binding }),
90
+ `foundry.prepare-source:${revisionId}`,
91
+ id,
92
+ ]
93
+ const rowMatches = (alias: string, row: Record<string, unknown>): string =>
94
+ Object.entries(row)
95
+ .map(([key, value]) => {
96
+ if (
97
+ !/^[a-z_][a-z0-9_]*$/.test(key) ||
98
+ (value !== null && typeof value !== 'string' && typeof value !== 'number')
99
+ )
100
+ throw new TypeError('Native draft snapshot has an invalid SQL field')
101
+ bindings.push(value)
102
+ return `${alias}."${key}" IS ?`
103
+ })
104
+ .join(' AND ')
105
+ const predicates = [
106
+ rowMatches('content_items', item),
107
+ `EXISTS (SELECT 1 FROM article_content source_body WHERE source_body.content_id=content_items.id AND ${rowMatches('source_body', content)})`,
108
+ 'EXISTS (SELECT 1 FROM cms_foundry_articles source_binding WHERE source_binding.content_id=content_items.id AND source_binding.external_id=? AND source_binding.receipt_id=? AND source_binding.request_sha256=?)',
109
+ ]
110
+ bindings.push(binding.externalId, binding.receiptId, binding.requestSHA256)
111
+ const hero = expected.snapshot.hero_asset
112
+ if (hero === null) {
113
+ predicates.push(
114
+ 'NOT EXISTS (SELECT 1 FROM media_assets source_hero WHERE source_hero.id=content_items.hero_image_id)',
115
+ )
116
+ } else {
117
+ const asset = snapshotRecord(hero)
118
+ if (!asset.id || asset.id !== item.hero_image_id)
119
+ throw new TypeError('Native draft hero snapshot has no exact selected identity')
120
+ predicates.push(
121
+ `EXISTS (SELECT 1 FROM media_assets source_hero WHERE source_hero.id=content_items.hero_image_id AND ${rowMatches('source_hero', asset)})`,
122
+ )
123
+ }
124
+ predicates.push('(SELECT count(*) FROM content_tag_links WHERE content_id=content_items.id)=?')
125
+ bindings.push(tags.length)
126
+ for (let index = 0; index < tags.length; index++) {
127
+ predicates.push(
128
+ 'EXISTS (SELECT 1 FROM content_tag_links l JOIN content_tags t ON t.id=l.tag_id WHERE l.content_id=content_items.id AND t.slug IS ? AND COALESCE(l.label,t.label) IS ?)',
129
+ )
130
+ bindings.push(tags[index], labels[index])
131
+ }
132
+ predicates.push('(SELECT count(*) FROM content_relations WHERE content_id=content_items.id)=?')
133
+ bindings.push(related.length)
134
+ for (const relation of related) {
135
+ const row = snapshotRecord(relation)
136
+ predicates.push(
137
+ 'EXISTS (SELECT 1 FROM content_relations source_relation WHERE source_relation.content_id=content_items.id AND source_relation.related_id IS ? AND source_relation.rank IS ? AND source_relation.reason IS ?)',
138
+ )
139
+ bindings.push(row.related_id, row.rank, row.reason)
140
+ }
141
+ return {
142
+ sql: `INSERT INTO content_revisions (id,content_id,payload_json,created_at,created_by,tag)
143
+ SELECT ?,?,?,unixepoch(),'foundry',? FROM content_items WHERE id=? AND ${predicates.join(' AND ')}`,
144
+ bindings,
145
+ }
146
+ }
147
+
45
148
  export function snapshotRecord(value: unknown): Record<string, unknown> {
46
149
  return value && typeof value === 'object' && !Array.isArray(value)
47
150
  ? (value as Record<string, unknown>)
@@ -22,6 +22,10 @@
22
22
  import type { ContentStatus, ContentType, FrontsPublishStatus } from '../schema/types.js'
23
23
  import { type ContentMetadata, serializeContentMetadata } from './content-metadata.js'
24
24
  import type { D1Database } from './d1.js'
25
+ import {
26
+ type NativeArticleDraftSnapshot,
27
+ nativeArticleDraftCapture,
28
+ } from './publication-current-guard.js'
25
29
  import { evaluateArticleBody, type PublishGuardOutcome } from './publish-guard.js'
26
30
  import { slugify } from './slug.js'
27
31
  import {
@@ -345,6 +349,8 @@ export interface UpdateContentOptions {
345
349
  requiredStatus?: ContentStatus
346
350
  /** Pin a machine body update to the canonical version it inspected. Requires requiredStatus. */
347
351
  expectedCanonicalVersion?: number
352
+ /** Exact native draft source; captured in History in the same mutation batch. */
353
+ expectedNativeDraftSnapshot?: NativeArticleDraftSnapshot
348
354
  /** Apply a resolved media source only while this exact source identity is still stored. */
349
355
  expectedMediaSource?: {
350
356
  sourceUrl: string | null
@@ -823,6 +829,11 @@ export async function updateContentItem(
823
829
  ) {
824
830
  throw new TypeError('Canonical-version updates require a valid version and status constraint')
825
831
  }
832
+ if (
833
+ options.expectedNativeDraftSnapshot &&
834
+ (options.requiredStatus !== 'draft' || options.expectedCanonicalVersion === undefined)
835
+ )
836
+ throw new TypeError('Native draft source requires the draft/version constraints')
826
837
  const tagPairs = input.tags === undefined ? null : validateDeclaredTagList(input.tags)
827
838
  const existing = await getContentItem(db, id)
828
839
  if (!existing) return null
@@ -1059,10 +1070,17 @@ export async function updateContentItem(
1059
1070
  // D1 batch is a transaction: the status predicate and every content-table
1060
1071
  // write linearize together, so a native publish/schedule cannot interleave
1061
1072
  // between the base row and its body row.
1073
+ const captureId = options.expectedNativeDraftSnapshot ? crypto.randomUUID() : null
1074
+ const capture =
1075
+ options.expectedNativeDraftSnapshot && captureId
1076
+ ? nativeArticleDraftCapture(id, captureId, options.expectedNativeDraftSnapshot)
1077
+ : null
1062
1078
  const versionPredicate =
1063
- options.expectedCanonicalVersion === undefined ? '' : ' AND canonical_version = ?'
1064
- const versionBindings =
1079
+ (options.expectedCanonicalVersion === undefined ? '' : ' AND canonical_version = ?') +
1080
+ (captureId ? ' AND EXISTS (SELECT 1 FROM content_revisions WHERE id=?)' : '')
1081
+ const versionBindings: unknown[] =
1065
1082
  options.expectedCanonicalVersion === undefined ? [] : [options.expectedCanonicalVersion]
1083
+ if (captureId) versionBindings.push(captureId)
1066
1084
  const statements = [
1067
1085
  db
1068
1086
  .prepare(
@@ -1217,8 +1235,9 @@ export async function updateContentItem(
1217
1235
  // D1 batch is atomic. Keep the base row's version unchanged while every
1218
1236
  // dependent body/tag write checks it; advance it only as the final write.
1219
1237
  const baseStatement = statements.shift()!
1220
- const baseResultIndex = statements.length
1238
+ const baseResultIndex = statements.length + (capture ? 1 : 0)
1221
1239
  statements.push(baseStatement)
1240
+ if (capture) statements.unshift(db.prepare(capture.sql).bind(...capture.bindings))
1222
1241
  const statusResultIndex = statements.length
1223
1242
  statements.push(
1224
1243
  db
@@ -44,6 +44,16 @@ export const FoundryArticleV2Schema = z
44
44
  .regex(/^[a-f0-9]{64}$/)
45
45
  .optional(),
46
46
  expectedCanonicalVersion: z.number().int().positive().optional(),
47
+ /** Prepare an existing native draft only from the exact authenticated snapshot read. */
48
+ expectedDraftSnapshot: z
49
+ .object({
50
+ contentId: z.string().min(1),
51
+ canonicalVersion: z.number().int().positive(),
52
+ sha256: z.string().regex(/^[a-f0-9]{64}$/),
53
+ priorRequestSHA256: z.string().regex(/^[a-f0-9]{64}$/),
54
+ })
55
+ .strict()
56
+ .optional(),
47
57
  slug: z.string().refine(isCanonicalSlug, {
48
58
  message: 'slug must already be canonical: lowercase a-z, 0-9 and single hyphens, 3-512 chars',
49
59
  }),
@@ -86,6 +96,13 @@ export const FoundryArticleV2Schema = z
86
96
  !(
87
97
  body.expectedRequestSHA256 &&
88
98
  (body.createOnly || body.expectedRevisionId || body.adoptSourceId)
99
+ ) &&
100
+ !(
101
+ body.expectedDraftSnapshot &&
102
+ (body.createOnly ||
103
+ body.expectedRevisionId ||
104
+ body.adoptSourceId ||
105
+ body.expectedRequestSHA256)
89
106
  ),
90
107
  {
91
108
  message: 'own working update requires both pins and cannot create or adopt',
@@ -68,6 +68,10 @@ const PublishedArticleSourceSchema = z
68
68
  site: z.string().min(1),
69
69
  observed_at: z.string().datetime(),
70
70
  article: PublishedArticleStateSchema.extend({
71
+ publication_receipt_identity: z
72
+ .string()
73
+ .regex(/^[a-f0-9]{64}$/)
74
+ .nullable(),
71
75
  hero_image_url: z.string().url().nullable(),
72
76
  body_markdown: z.string().min(1).max(1_000_000),
73
77
  description: z.string().nullable(),
@@ -112,6 +116,7 @@ async function publishedInputs(ctx: RouteContext, url: URL, siteId: string): Pro
112
116
  if (!content || content.type !== 'article')
113
117
  return json({ error: 'published_article_missing' }, 404)
114
118
  const item = content.payload.item
119
+ const snapshot = content.payload as unknown as Record<string, unknown>
115
120
  const heroImageUrl = await readReadyImagePublicUrl(ctx.db, item.hero_image_id)
116
121
  const result = PublishedArticleSourceSchema.safeParse({
117
122
  ok: true,
@@ -121,6 +126,7 @@ async function publishedInputs(ctx: RouteContext, url: URL, siteId: string): Pro
121
126
  article: {
122
127
  content_id: content.contentId,
123
128
  revision_id: content.revisionId,
129
+ publication_receipt_identity: snapshot.publication_receipt_identity ?? null,
124
130
  slug: content.slug,
125
131
  title: item.title,
126
132
  canonical_url: item.canonical_url ?? null,