@actuate-media/cms-core 0.57.0 → 0.57.1

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 (118) hide show
  1. package/dist/__tests__/api/stats-seo-cache.test.js +1 -1
  2. package/dist/__tests__/api/stats-seo-cache.test.js.map +1 -1
  3. package/dist/api/guarded-db.d.ts +13 -0
  4. package/dist/api/guarded-db.d.ts.map +1 -0
  5. package/dist/api/guarded-db.js +58 -0
  6. package/dist/api/guarded-db.js.map +1 -0
  7. package/dist/api/handler-factory.d.ts.map +1 -1
  8. package/dist/api/handler-factory.js +2 -1
  9. package/dist/api/handler-factory.js.map +1 -1
  10. package/dist/api/handlers.d.ts +5 -3
  11. package/dist/api/handlers.d.ts.map +1 -1
  12. package/dist/api/handlers.js +54 -13068
  13. package/dist/api/handlers.js.map +1 -1
  14. package/dist/api/route-helpers.d.ts +320 -0
  15. package/dist/api/route-helpers.d.ts.map +1 -0
  16. package/dist/api/route-helpers.js +1307 -0
  17. package/dist/api/route-helpers.js.map +1 -0
  18. package/dist/api/routes/ai-seo.d.ts +3 -0
  19. package/dist/api/routes/ai-seo.d.ts.map +1 -0
  20. package/dist/api/routes/ai-seo.js +377 -0
  21. package/dist/api/routes/ai-seo.js.map +1 -0
  22. package/dist/api/routes/ai-settings.d.ts +3 -0
  23. package/dist/api/routes/ai-settings.d.ts.map +1 -0
  24. package/dist/api/routes/ai-settings.js +764 -0
  25. package/dist/api/routes/ai-settings.js.map +1 -0
  26. package/dist/api/routes/auth.d.ts +3 -0
  27. package/dist/api/routes/auth.d.ts.map +1 -0
  28. package/dist/api/routes/auth.js +787 -0
  29. package/dist/api/routes/auth.js.map +1 -0
  30. package/dist/api/routes/collab.d.ts +3 -0
  31. package/dist/api/routes/collab.d.ts.map +1 -0
  32. package/dist/api/routes/collab.js +426 -0
  33. package/dist/api/routes/collab.js.map +1 -0
  34. package/dist/api/routes/dashboard.d.ts +7 -0
  35. package/dist/api/routes/dashboard.d.ts.map +1 -0
  36. package/dist/api/routes/dashboard.js +540 -0
  37. package/dist/api/routes/dashboard.js.map +1 -0
  38. package/dist/api/routes/documents.d.ts +3 -0
  39. package/dist/api/routes/documents.d.ts.map +1 -0
  40. package/dist/api/routes/documents.js +180 -0
  41. package/dist/api/routes/documents.js.map +1 -0
  42. package/dist/api/routes/folders.d.ts +3 -0
  43. package/dist/api/routes/folders.d.ts.map +1 -0
  44. package/dist/api/routes/folders.js +195 -0
  45. package/dist/api/routes/folders.js.map +1 -0
  46. package/dist/api/routes/forms.d.ts +3 -0
  47. package/dist/api/routes/forms.d.ts.map +1 -0
  48. package/dist/api/routes/forms.js +661 -0
  49. package/dist/api/routes/forms.js.map +1 -0
  50. package/dist/api/routes/globals.d.ts +3 -0
  51. package/dist/api/routes/globals.d.ts.map +1 -0
  52. package/dist/api/routes/globals.js +131 -0
  53. package/dist/api/routes/globals.js.map +1 -0
  54. package/dist/api/routes/media.d.ts +3 -0
  55. package/dist/api/routes/media.d.ts.map +1 -0
  56. package/dist/api/routes/media.js +521 -0
  57. package/dist/api/routes/media.js.map +1 -0
  58. package/dist/api/routes/meta.d.ts +3 -0
  59. package/dist/api/routes/meta.d.ts.map +1 -0
  60. package/dist/api/routes/meta.js +96 -0
  61. package/dist/api/routes/meta.js.map +1 -0
  62. package/dist/api/routes/page-templates.d.ts +3 -0
  63. package/dist/api/routes/page-templates.d.ts.map +1 -0
  64. package/dist/api/routes/page-templates.js +265 -0
  65. package/dist/api/routes/page-templates.js.map +1 -0
  66. package/dist/api/routes/presence.d.ts +3 -0
  67. package/dist/api/routes/presence.d.ts.map +1 -0
  68. package/dist/api/routes/presence.js +35 -0
  69. package/dist/api/routes/presence.js.map +1 -0
  70. package/dist/api/routes/preview.d.ts +3 -0
  71. package/dist/api/routes/preview.d.ts.map +1 -0
  72. package/dist/api/routes/preview.js +111 -0
  73. package/dist/api/routes/preview.js.map +1 -0
  74. package/dist/api/routes/redirects.d.ts +3 -0
  75. package/dist/api/routes/redirects.d.ts.map +1 -0
  76. package/dist/api/routes/redirects.js +790 -0
  77. package/dist/api/routes/redirects.js.map +1 -0
  78. package/dist/api/routes/saved-sections.d.ts +3 -0
  79. package/dist/api/routes/saved-sections.d.ts.map +1 -0
  80. package/dist/api/routes/saved-sections.js +1036 -0
  81. package/dist/api/routes/saved-sections.js.map +1 -0
  82. package/dist/api/routes/scheduling.d.ts +3 -0
  83. package/dist/api/routes/scheduling.d.ts.map +1 -0
  84. package/dist/api/routes/scheduling.js +373 -0
  85. package/dist/api/routes/scheduling.js.map +1 -0
  86. package/dist/api/routes/sections.d.ts +3 -0
  87. package/dist/api/routes/sections.d.ts.map +1 -0
  88. package/dist/api/routes/sections.js +500 -0
  89. package/dist/api/routes/sections.js.map +1 -0
  90. package/dist/api/routes/security-center.d.ts +3 -0
  91. package/dist/api/routes/security-center.d.ts.map +1 -0
  92. package/dist/api/routes/security-center.js +71 -0
  93. package/dist/api/routes/security-center.js.map +1 -0
  94. package/dist/api/routes/seo-public.d.ts +14 -0
  95. package/dist/api/routes/seo-public.d.ts.map +1 -0
  96. package/dist/api/routes/seo-public.js +930 -0
  97. package/dist/api/routes/seo-public.js.map +1 -0
  98. package/dist/api/routes/seo.d.ts +8 -0
  99. package/dist/api/routes/seo.d.ts.map +1 -0
  100. package/dist/api/routes/seo.js +848 -0
  101. package/dist/api/routes/seo.js.map +1 -0
  102. package/dist/api/routes/system.d.ts +3 -0
  103. package/dist/api/routes/system.d.ts.map +1 -0
  104. package/dist/api/routes/system.js +340 -0
  105. package/dist/api/routes/system.js.map +1 -0
  106. package/dist/api/routes/url-resolution.d.ts +3 -0
  107. package/dist/api/routes/url-resolution.d.ts.map +1 -0
  108. package/dist/api/routes/url-resolution.js +457 -0
  109. package/dist/api/routes/url-resolution.js.map +1 -0
  110. package/dist/api/routes/users.d.ts +3 -0
  111. package/dist/api/routes/users.d.ts.map +1 -0
  112. package/dist/api/routes/users.js +1162 -0
  113. package/dist/api/routes/users.js.map +1 -0
  114. package/dist/api/routes/webhooks.d.ts +3 -0
  115. package/dist/api/routes/webhooks.d.ts.map +1 -0
  116. package/dist/api/routes/webhooks.js +338 -0
  117. package/dist/api/routes/webhooks.js.map +1 -0
  118. package/package.json +1 -1
@@ -0,0 +1,457 @@
1
+ import { buildRelationLookup } from '../../actions.js';
2
+ import { populateRelations, parsePopulateParam } from '../../fields/relations.js';
3
+ import { ACTUATE_TAG_ROOT, actuateTag, cachedRead } from '../../cache/http.js';
4
+ import { createPreviewAdapter } from '../../preview/index.js';
5
+ import { coercePostHeader, layoutTreeToSections, collectSectionImageUrls, applyMediaMeta, defaultPostHeader, } from '../../sections/index.js';
6
+ import { getActuateConfig } from '../../config/runtime.js';
7
+ import { guardedDb } from '../guarded-db.js';
8
+ import { loadEffectiveConfig, siteUrlFromRequest } from './seo-public.js';
9
+ import { json, jsonWithCache, errorResponse, internalError, getSessionSecret, } from '../route-helpers.js';
10
+ export function registerUrlResolutionRoutes(router) {
11
+ const db = guardedDb;
12
+ // ---------------------------------------------------------------------------
13
+ // URL Resolution — maps a public URL path to its document
14
+ // ---------------------------------------------------------------------------
15
+ const MAX_RESOLVE_DEPTH = 10;
16
+ async function resolveLayout(path, docData, matchedCollection) {
17
+ const config = getActuateConfig();
18
+ const layoutConfig = config?.layout;
19
+ if (!layoutConfig?.regions)
20
+ return {};
21
+ const regionNames = Object.keys(layoutConfig.regions);
22
+ if (regionNames.length === 0)
23
+ return {};
24
+ const allowedCollections = new Set();
25
+ for (const region of regionNames) {
26
+ const col = layoutConfig.regions[region]?.collection;
27
+ if (col)
28
+ allowedCollections.add(col);
29
+ }
30
+ const resolved = {};
31
+ const unresolved = new Set(regionNames);
32
+ const docLayout = (docData?._layout ?? {});
33
+ for (const region of regionNames) {
34
+ if (docLayout[region] && typeof docLayout[region] === 'string') {
35
+ resolved[region] = docLayout[region];
36
+ unresolved.delete(region);
37
+ }
38
+ }
39
+ if (unresolved.size > 0 && layoutConfig.inherit !== false) {
40
+ const segments = path
41
+ .replace(/^\/|\/$/g, '')
42
+ .split('/')
43
+ .filter(Boolean);
44
+ const walkDepth = Math.min(segments.length - 1, MAX_RESOLVE_DEPTH);
45
+ for (let i = walkDepth; i > 0 && unresolved.size > 0; i--) {
46
+ const parentSlug = segments.slice(0, i).join('/');
47
+ const parentDoc = await db().document.findFirst({
48
+ where: {
49
+ collection: matchedCollection,
50
+ deletedAt: null,
51
+ status: 'PUBLISHED',
52
+ OR: [{ data: { path: ['slug'], equals: parentSlug } }, { slug: parentSlug }],
53
+ },
54
+ select: { data: true },
55
+ });
56
+ if (!parentDoc)
57
+ continue;
58
+ const parentLayout = (parentDoc.data?._layout ?? {});
59
+ for (const region of [...unresolved]) {
60
+ if (parentLayout[region] && typeof parentLayout[region] === 'string') {
61
+ resolved[region] = parentLayout[region];
62
+ unresolved.delete(region);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ const settingsGlobal = await db().document.findFirst({
68
+ where: { collection: 'settings', deletedAt: null },
69
+ select: { data: true },
70
+ });
71
+ const settingsDefaults = (settingsGlobal?.data?.defaultLayout ?? {});
72
+ for (const region of [...unresolved]) {
73
+ const fallback = layoutConfig.defaults?.[region] ?? settingsDefaults[region];
74
+ if (fallback && typeof fallback === 'string') {
75
+ resolved[region] = fallback;
76
+ unresolved.delete(region);
77
+ }
78
+ }
79
+ if (Object.keys(resolved).length === 0)
80
+ return {};
81
+ const variantIds = [...new Set(Object.values(resolved))];
82
+ const allowedCollectionList = [...allowedCollections];
83
+ const variants = await db().document.findMany({
84
+ where: {
85
+ id: { in: variantIds },
86
+ collection: { in: allowedCollectionList },
87
+ status: 'PUBLISHED',
88
+ deletedAt: null,
89
+ },
90
+ });
91
+ const variantMap = new Map(variants.map((v) => [v.id, v]));
92
+ const result = {};
93
+ for (const [region, docId] of Object.entries(resolved)) {
94
+ const expectedCollection = layoutConfig.regions[region]?.collection;
95
+ const variant = variantMap.get(docId);
96
+ if (variant && variant.collection === expectedCollection) {
97
+ result[region] = { id: variant.id, collection: variant.collection, data: variant.data };
98
+ }
99
+ }
100
+ return result;
101
+ }
102
+ router.get('/resolve', async (request) => {
103
+ try {
104
+ const url = new URL(request.url);
105
+ const pathParam = url.searchParams.get('path');
106
+ if (!pathParam) {
107
+ return errorResponse('Missing required "path" query parameter', 400);
108
+ }
109
+ const segments = pathParam
110
+ .replace(/^\/|\/$/g, '')
111
+ .split('/')
112
+ .filter(Boolean);
113
+ const configCollections = getActuateConfig()?.collections ?? {};
114
+ const collectionDefs = Object.values(configCollections);
115
+ let matchedCollection = null;
116
+ let docSlug = null;
117
+ if (segments.length === 0) {
118
+ // Root path — find a page-type collection and look for "home" or "index"
119
+ const pageCol = collectionDefs.find((c) => c.type === 'page' && !(c.urlPrefix ?? '').replace(/^\/|\/$/g, ''));
120
+ matchedCollection = pageCol?.slug ?? 'pages';
121
+ docSlug = 'home';
122
+ }
123
+ else {
124
+ for (const col of collectionDefs) {
125
+ const prefix = (col.urlPrefix ?? col.slug ?? '').replace(/^\/|\/$/g, '');
126
+ if (prefix && segments.length >= 2) {
127
+ const prefixParts = prefix.split('/');
128
+ const pathPrefix = segments.slice(0, prefixParts.length).join('/');
129
+ if (pathPrefix === prefix) {
130
+ matchedCollection = col.slug;
131
+ docSlug = segments.slice(prefixParts.length).join('/');
132
+ break;
133
+ }
134
+ }
135
+ else if (!prefix && col.type === 'page') {
136
+ matchedCollection = col.slug;
137
+ docSlug = segments.join('/');
138
+ }
139
+ }
140
+ if (!matchedCollection && segments.length === 1) {
141
+ matchedCollection = 'pages';
142
+ docSlug = segments[0];
143
+ }
144
+ if (!matchedCollection && segments.length >= 2) {
145
+ matchedCollection = segments[0];
146
+ docSlug = segments.slice(1).join('/');
147
+ }
148
+ }
149
+ if (!matchedCollection || !docSlug) {
150
+ return errorResponse('Could not resolve path', 404);
151
+ }
152
+ // ?preview=<token> — when a valid preview token is presented we drop
153
+ // the `status: PUBLISHED` filter so admins (and clients with a signed
154
+ // share link) can render an unpublished draft at the document's real
155
+ // URL. The token is tied to a (collection, documentId) pair so we
156
+ // verify the URL actually points at the document the token was
157
+ // minted for; this prevents using one token to peek at unrelated
158
+ // drafts in the same collection.
159
+ //
160
+ // Validation happens BEFORE the runtime-cache lookup so a preview
161
+ // session can never read from (or write to) the shared cache. The
162
+ // small price is that every `/resolve?preview=` call runs a JWT
163
+ // verification even on what would otherwise be a cache hit —
164
+ // worth it; the alternative is a cache poisoned with draft data.
165
+ const previewToken = url.searchParams.get('preview');
166
+ let previewSession = null;
167
+ if (previewToken) {
168
+ try {
169
+ const preview = createPreviewAdapter(getSessionSecret(), db());
170
+ const session = await preview.validatePreviewToken(previewToken);
171
+ if (session) {
172
+ previewSession = {
173
+ collection: session.collection,
174
+ documentId: session.documentId,
175
+ expiresAt: session.expiresAt,
176
+ };
177
+ }
178
+ }
179
+ catch (err) {
180
+ console.error('[actuate][api] resolve preview token validation failed:', err);
181
+ }
182
+ }
183
+ const isRootPath = segments.length === 0;
184
+ // Heavy compute (doc lookup → populate → meta composition) lives in
185
+ // a closure so the optional runtime-cache layer can short-circuit
186
+ // it on a hit. The cache layer is bypassed entirely when a preview
187
+ // session is active — a draft must never enter the shared cache.
188
+ const buildResolveBody = async () => {
189
+ const slugFilter = {
190
+ OR: isRootPath
191
+ ? [
192
+ { data: { path: ['slug'], equals: 'home' } },
193
+ { data: { path: ['slug'], equals: 'index' } },
194
+ { slug: 'home' },
195
+ { slug: 'index' },
196
+ ]
197
+ : [{ data: { path: ['slug'], equals: docSlug } }, { slug: docSlug }],
198
+ };
199
+ const doc = previewSession
200
+ ? await db().document.findFirst({
201
+ where: {
202
+ collection: matchedCollection,
203
+ deletedAt: null,
204
+ ...slugFilter,
205
+ },
206
+ })
207
+ : await db().document.findFirst({
208
+ where: {
209
+ collection: matchedCollection,
210
+ deletedAt: null,
211
+ status: 'PUBLISHED',
212
+ ...slugFilter,
213
+ },
214
+ });
215
+ if (!doc) {
216
+ return errorResponse('Document not found', 404);
217
+ }
218
+ // Enforce the token ↔ document binding. A leaked or copied token can
219
+ // only unlock the exact document it was issued for.
220
+ if (previewSession &&
221
+ (previewSession.documentId !== doc.id || previewSession.collection !== matchedCollection)) {
222
+ return errorResponse('Preview token does not match this URL', 403);
223
+ }
224
+ let docData = doc.data && typeof doc.data === 'object' ? doc.data : {};
225
+ // Opt-in: ?populate=author,relatedPosts (or *) — expand relation IDs
226
+ // into `{ id, title, slug, status, collection }` summaries so the
227
+ // frontend renders authors / related case studies without a second
228
+ // request per reference. `resolve` is the highest-leverage place to
229
+ // do this because it's what marketing pages call from SSR.
230
+ const populateOpts = parsePopulateParam(new URL(request.url).searchParams.get('populate'));
231
+ if (populateOpts) {
232
+ const fields = getActuateConfig()?.collections?.[matchedCollection]?.fields;
233
+ if (fields) {
234
+ try {
235
+ docData = await populateRelations(fields, docData, buildRelationLookup(db()), populateOpts);
236
+ }
237
+ catch (err) {
238
+ console.error('[actuate][api] resolve populate failed:', err);
239
+ }
240
+ }
241
+ }
242
+ const layout = await resolveLayout(pathParam, docData, matchedCollection);
243
+ const { _layout: layoutTree, ...cleanData } = docData;
244
+ // LEGACY fallback (ADR 0002): builder pages now compile `_layout` to
245
+ // canonical `data.sections` on save, so this branch is a no-op for any
246
+ // document written after that change. It still fires for LEGACY pages
247
+ // authored in the tree before compile-on-save (and not yet migrated via
248
+ // `migratePageBuilderSections`): when such a doc has no flat `sections`,
249
+ // derive a best-effort PageSection[] at read time so page-builder content
250
+ // is never stranded. Non-destructive — only the response is enriched.
251
+ if ((!Array.isArray(cleanData.sections) || cleanData.sections.length === 0) &&
252
+ layoutTree &&
253
+ typeof layoutTree === 'object') {
254
+ const bridged = layoutTreeToSections(layoutTree);
255
+ if (bridged.length > 0)
256
+ cleanData.sections = bridged;
257
+ }
258
+ // WS-E E3: enrich section images with intrinsic width/height + library
259
+ // alt text from `actuate_media`, matched by the stored URL. Additive
260
+ // and best-effort — a media-lookup failure must never break resolve.
261
+ if (Array.isArray(cleanData.sections) && cleanData.sections.length > 0) {
262
+ try {
263
+ const urls = collectSectionImageUrls(cleanData.sections);
264
+ if (urls.length > 0) {
265
+ const records = await db().media.findMany({
266
+ where: {
267
+ deletedAt: null,
268
+ OR: [{ storageKey: { in: urls } }, { publicUrl: { in: urls } }],
269
+ },
270
+ select: {
271
+ storageKey: true,
272
+ publicUrl: true,
273
+ width: true,
274
+ height: true,
275
+ altText: true,
276
+ title: true,
277
+ },
278
+ });
279
+ const lookup = new Map();
280
+ for (const r of records) {
281
+ const meta = {
282
+ width: r.width,
283
+ height: r.height,
284
+ alt: r.altText,
285
+ title: r.title,
286
+ };
287
+ if (r.storageKey)
288
+ lookup.set(r.storageKey, meta);
289
+ if (r.publicUrl)
290
+ lookup.set(r.publicUrl, meta);
291
+ }
292
+ if (lookup.size > 0) {
293
+ cleanData.sections = applyMediaMeta(cleanData.sections, lookup);
294
+ }
295
+ }
296
+ }
297
+ catch (err) {
298
+ console.error('[actuate][api] resolve media enrichment failed:', err);
299
+ }
300
+ }
301
+ // Compose page meta + JSON-LD up front so client renderers (Next.js
302
+ // generateMetadata, plain SSR, MCP agents) don't have to re-derive
303
+ // schema, OG tags, and canonical URLs from raw doc data. Reads the
304
+ // collection's SEO config and the site-wide SEO defaults — with
305
+ // DB overrides from /seo/config applied on top of the static config.
306
+ const cfg = await loadEffectiveConfig();
307
+ const collectionDef = cfg?.collections?.[matchedCollection] ?? null;
308
+ // Post-type documents render a header composed from the post type's
309
+ // template (`post-templates` doc, matched by slug == the post-type
310
+ // slug). The template is the single source of truth for header design
311
+ // — editing it restyles every post of that type — so we resolve it
312
+ // here at read time rather than denormalizing onto each post. Read it
313
+ // directly (no ActionContext): the header is non-sensitive design
314
+ // metadata and resolve is a public endpoint. Falls back to the default
315
+ // header when the type has no saved template yet.
316
+ let templateHeader = null;
317
+ // Author profile (from the document's creator) + related posts (recent
318
+ // published siblings in the same collection) so the Author Bio and
319
+ // Related Posts sections render real data instead of placeholders.
320
+ // Posts have no author/relatedPosts relationship fields, so these are
321
+ // derived here rather than via ?populate.
322
+ let postAuthor = null;
323
+ let relatedPosts = [];
324
+ if (collectionDef?.type === 'post') {
325
+ try {
326
+ const tplDoc = await db().document.findFirst({
327
+ where: {
328
+ collection: 'post-templates',
329
+ deletedAt: null,
330
+ OR: [
331
+ { slug: matchedCollection },
332
+ { data: { path: ['slug'], equals: matchedCollection } },
333
+ ],
334
+ },
335
+ });
336
+ const tplData = tplDoc?.data && typeof tplDoc.data === 'object'
337
+ ? tplDoc.data
338
+ : undefined;
339
+ templateHeader = coercePostHeader(tplData?.header);
340
+ }
341
+ catch (err) {
342
+ console.error('[actuate][api] resolve post-template lookup failed:', err);
343
+ templateHeader = defaultPostHeader();
344
+ }
345
+ try {
346
+ if (doc.createdById) {
347
+ const author = await db().user.findUnique({
348
+ where: { id: doc.createdById },
349
+ select: { name: true, avatarUrl: true },
350
+ });
351
+ if (author) {
352
+ postAuthor = { name: author.name, avatarUrl: author.avatarUrl ?? undefined };
353
+ }
354
+ }
355
+ }
356
+ catch (err) {
357
+ console.error('[actuate][api] resolve post author lookup failed:', err);
358
+ }
359
+ try {
360
+ const prefix = (collectionDef.urlPrefix ?? matchedCollection ?? '').replace(/^\/|\/$/g, '');
361
+ const siblings = await db().document.findMany({
362
+ where: {
363
+ collection: matchedCollection,
364
+ status: 'PUBLISHED',
365
+ deletedAt: null,
366
+ id: { not: doc.id },
367
+ },
368
+ orderBy: { publishedAt: 'desc' },
369
+ take: 3,
370
+ });
371
+ relatedPosts = siblings.map((s) => {
372
+ const sd = s.data && typeof s.data === 'object' ? s.data : {};
373
+ const slug = s.slug ?? (typeof sd.slug === 'string' ? sd.slug : '') ?? '';
374
+ const title = (typeof sd.title === 'string' && sd.title) || s.title || 'Untitled post';
375
+ const excerpt = typeof sd.excerpt === 'string' ? sd.excerpt : undefined;
376
+ return { title, excerpt, url: slug ? `/${prefix}/${slug}` : undefined };
377
+ });
378
+ }
379
+ catch (err) {
380
+ console.error('[actuate][api] resolve related posts lookup failed:', err);
381
+ }
382
+ }
383
+ const { composePageMeta } = await import('../../seo/page-meta.js');
384
+ const composed = composePageMeta({
385
+ doc: {
386
+ id: doc.id,
387
+ collection: doc.collection,
388
+ slug: doc.slug ?? cleanData.slug ?? null,
389
+ data: cleanData,
390
+ publishedAt: doc.publishedAt,
391
+ updatedAt: doc.updatedAt,
392
+ structuredData: doc.structuredData ?? null,
393
+ pageSettings: cleanData.pageSettings ?? null,
394
+ },
395
+ collection: collectionDef,
396
+ config: cfg ?? null,
397
+ siteUrl: siteUrlFromRequest(request, cfg),
398
+ });
399
+ return {
400
+ data: {
401
+ id: doc.id,
402
+ collection: doc.collection,
403
+ data: cleanData,
404
+ status: doc.status,
405
+ publishedAt: doc.publishedAt,
406
+ structuredData: composed.jsonLd ?? doc.structuredData,
407
+ },
408
+ meta: {
409
+ title: composed.title,
410
+ description: composed.description,
411
+ canonical: composed.canonical,
412
+ url: composed.url,
413
+ tags: composed.meta,
414
+ html: composed.metaHtml,
415
+ },
416
+ // Next.js `generateMetadata()`-compatible object so the public site
417
+ // can spread it directly without re-deriving OG/Twitter/robots tags.
418
+ metadata: composed.metadata,
419
+ jsonLd: composed.jsonLd,
420
+ jsonLdHtml: composed.jsonLdHtml,
421
+ ...(templateHeader ? { template: { header: templateHeader } } : {}),
422
+ ...(collectionDef?.type === 'post' ? { post: { author: postAuthor, relatedPosts } } : {}),
423
+ ...(Object.keys(layout).length > 0 ? { layout } : {}),
424
+ ...(previewSession
425
+ ? {
426
+ preview: {
427
+ active: true,
428
+ expiresAt: previewSession.expiresAt.toISOString(),
429
+ },
430
+ }
431
+ : {}),
432
+ };
433
+ };
434
+ // Preview-token requests bypass the cache (CDN + Runtime) so a
435
+ // leaked cached preview can never show up for anonymous traffic.
436
+ // Anonymous reads flow through cachedRead — coarse tags (the
437
+ // wholesale `actuate` tag + a path tag) so every write drains
438
+ // every cached resolve entry. Per-doc tagging would require
439
+ // resolving the doc id BEFORE the cache lookup, which defeats
440
+ // the purpose of caching at all.
441
+ if (previewSession) {
442
+ const body = await buildResolveBody();
443
+ return body instanceof Response ? body : json(body);
444
+ }
445
+ return cachedRead(request, {
446
+ cache: getActuateConfig()?.cache,
447
+ tags: [ACTUATE_TAG_ROOT, actuateTag('path', pathParam)],
448
+ wrap: jsonWithCache,
449
+ build: buildResolveBody,
450
+ });
451
+ }
452
+ catch (err) {
453
+ return internalError(err);
454
+ }
455
+ });
456
+ }
457
+ //# sourceMappingURL=url-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-resolution.js","sourceRoot":"","sources":["../../../src/api/routes/url-resolution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ApiRouter } from '../router.js';
2
+ export declare function registerUserRoutes(router: ApiRouter): void;
3
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/api/routes/users.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AA0C7C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqrC1D"}