@actuate-media/cms-core 0.65.0 → 0.67.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 (155) hide show
  1. package/CHANGELOG.md +143 -0
  2. package/dist/__tests__/api/ai-quality.test.js +73 -0
  3. package/dist/__tests__/api/ai-quality.test.js.map +1 -1
  4. package/dist/__tests__/api/llms-txt.test.js +59 -0
  5. package/dist/__tests__/api/llms-txt.test.js.map +1 -1
  6. package/dist/__tests__/api/public-seo.test.js +402 -4
  7. package/dist/__tests__/api/public-seo.test.js.map +1 -1
  8. package/dist/__tests__/api/route-contracts.test.js +7 -0
  9. package/dist/__tests__/api/route-contracts.test.js.map +1 -1
  10. package/dist/__tests__/content/slug.test.d.ts +2 -0
  11. package/dist/__tests__/content/slug.test.d.ts.map +1 -0
  12. package/dist/__tests__/content/slug.test.js +68 -0
  13. package/dist/__tests__/content/slug.test.js.map +1 -0
  14. package/dist/__tests__/middleware.test.js +47 -0
  15. package/dist/__tests__/middleware.test.js.map +1 -1
  16. package/dist/__tests__/redirects/auto-301.test.d.ts +2 -0
  17. package/dist/__tests__/redirects/auto-301.test.d.ts.map +1 -0
  18. package/dist/__tests__/redirects/auto-301.test.js +172 -0
  19. package/dist/__tests__/redirects/auto-301.test.js.map +1 -0
  20. package/dist/__tests__/seo/ai-bots.test.d.ts +2 -0
  21. package/dist/__tests__/seo/ai-bots.test.d.ts.map +1 -0
  22. package/dist/__tests__/seo/ai-bots.test.js +53 -0
  23. package/dist/__tests__/seo/ai-bots.test.js.map +1 -0
  24. package/dist/__tests__/seo/alt-text.test.d.ts +2 -0
  25. package/dist/__tests__/seo/alt-text.test.d.ts.map +1 -0
  26. package/dist/__tests__/seo/alt-text.test.js +47 -0
  27. package/dist/__tests__/seo/alt-text.test.js.map +1 -0
  28. package/dist/__tests__/seo/feeds.test.d.ts +2 -0
  29. package/dist/__tests__/seo/feeds.test.d.ts.map +1 -0
  30. package/dist/__tests__/seo/feeds.test.js +61 -0
  31. package/dist/__tests__/seo/feeds.test.js.map +1 -0
  32. package/dist/__tests__/seo/freshness.test.d.ts +2 -0
  33. package/dist/__tests__/seo/freshness.test.d.ts.map +1 -0
  34. package/dist/__tests__/seo/freshness.test.js +89 -0
  35. package/dist/__tests__/seo/freshness.test.js.map +1 -0
  36. package/dist/__tests__/seo/meta-tags-alternates.test.d.ts +2 -0
  37. package/dist/__tests__/seo/meta-tags-alternates.test.d.ts.map +1 -0
  38. package/dist/__tests__/seo/meta-tags-alternates.test.js +52 -0
  39. package/dist/__tests__/seo/meta-tags-alternates.test.js.map +1 -0
  40. package/dist/__tests__/seo/page-meta.test.js +230 -14
  41. package/dist/__tests__/seo/page-meta.test.js.map +1 -1
  42. package/dist/__tests__/seo/sitemap-notify.test.js +77 -1
  43. package/dist/__tests__/seo/sitemap-notify.test.js.map +1 -1
  44. package/dist/__tests__/validation/publish.test.d.ts +2 -0
  45. package/dist/__tests__/validation/publish.test.d.ts.map +1 -0
  46. package/dist/__tests__/validation/publish.test.js +164 -0
  47. package/dist/__tests__/validation/publish.test.js.map +1 -0
  48. package/dist/actions.d.ts.map +1 -1
  49. package/dist/actions.js +172 -8
  50. package/dist/actions.js.map +1 -1
  51. package/dist/api/route-helpers.d.ts +8 -0
  52. package/dist/api/route-helpers.d.ts.map +1 -1
  53. package/dist/api/route-helpers.js +20 -0
  54. package/dist/api/route-helpers.js.map +1 -1
  55. package/dist/api/routes/ai-seo.d.ts.map +1 -1
  56. package/dist/api/routes/ai-seo.js +32 -1
  57. package/dist/api/routes/ai-seo.js.map +1 -1
  58. package/dist/api/routes/auth.d.ts.map +1 -1
  59. package/dist/api/routes/auth.js +2 -1
  60. package/dist/api/routes/auth.js.map +1 -1
  61. package/dist/api/routes/documents.d.ts.map +1 -1
  62. package/dist/api/routes/documents.js +3 -3
  63. package/dist/api/routes/documents.js.map +1 -1
  64. package/dist/api/routes/seo-public.d.ts.map +1 -1
  65. package/dist/api/routes/seo-public.js +371 -62
  66. package/dist/api/routes/seo-public.js.map +1 -1
  67. package/dist/api/routes/seo.d.ts.map +1 -1
  68. package/dist/api/routes/seo.js +21 -10
  69. package/dist/api/routes/seo.js.map +1 -1
  70. package/dist/api/routes/url-resolution.d.ts.map +1 -1
  71. package/dist/api/routes/url-resolution.js +40 -1
  72. package/dist/api/routes/url-resolution.js.map +1 -1
  73. package/dist/api/routes/users.d.ts.map +1 -1
  74. package/dist/api/routes/users.js +6 -3
  75. package/dist/api/routes/users.js.map +1 -1
  76. package/dist/client.d.ts +1 -0
  77. package/dist/client.d.ts.map +1 -1
  78. package/dist/client.js +3 -0
  79. package/dist/client.js.map +1 -1
  80. package/dist/config/types.d.ts +35 -1
  81. package/dist/config/types.d.ts.map +1 -1
  82. package/dist/content/index.d.ts +1 -0
  83. package/dist/content/index.d.ts.map +1 -1
  84. package/dist/content/index.js +1 -0
  85. package/dist/content/index.js.map +1 -1
  86. package/dist/content/slug.d.ts +40 -0
  87. package/dist/content/slug.d.ts.map +1 -0
  88. package/dist/content/slug.js +78 -0
  89. package/dist/content/slug.js.map +1 -0
  90. package/dist/content/structured-data.d.ts +6 -0
  91. package/dist/content/structured-data.d.ts.map +1 -1
  92. package/dist/content/structured-data.js +6 -0
  93. package/dist/content/structured-data.js.map +1 -1
  94. package/dist/content-health/scanner.d.ts +4 -3
  95. package/dist/content-health/scanner.d.ts.map +1 -1
  96. package/dist/content-health/scanner.js +6 -12
  97. package/dist/content-health/scanner.js.map +1 -1
  98. package/dist/middleware.d.ts +1 -0
  99. package/dist/middleware.d.ts.map +1 -1
  100. package/dist/middleware.js +11 -2
  101. package/dist/middleware.js.map +1 -1
  102. package/dist/redirects/auto.d.ts +45 -0
  103. package/dist/redirects/auto.d.ts.map +1 -0
  104. package/dist/redirects/auto.js +55 -0
  105. package/dist/redirects/auto.js.map +1 -0
  106. package/dist/redirects/index.d.ts +2 -0
  107. package/dist/redirects/index.d.ts.map +1 -1
  108. package/dist/redirects/index.js +1 -0
  109. package/dist/redirects/index.js.map +1 -1
  110. package/dist/seo/ai-bots.d.ts +42 -0
  111. package/dist/seo/ai-bots.d.ts.map +1 -0
  112. package/dist/seo/ai-bots.js +104 -0
  113. package/dist/seo/ai-bots.js.map +1 -0
  114. package/dist/seo/alt-text.d.ts +39 -0
  115. package/dist/seo/alt-text.d.ts.map +1 -0
  116. package/dist/seo/alt-text.js +67 -0
  117. package/dist/seo/alt-text.js.map +1 -0
  118. package/dist/seo/analysis.d.ts.map +1 -1
  119. package/dist/seo/analysis.js +7 -11
  120. package/dist/seo/analysis.js.map +1 -1
  121. package/dist/seo/audit-engine.d.ts +1 -0
  122. package/dist/seo/audit-engine.d.ts.map +1 -1
  123. package/dist/seo/audit-engine.js +4 -4
  124. package/dist/seo/audit-engine.js.map +1 -1
  125. package/dist/seo/audit-runner.d.ts.map +1 -1
  126. package/dist/seo/audit-runner.js +1 -0
  127. package/dist/seo/audit-runner.js.map +1 -1
  128. package/dist/seo/feeds.d.ts +36 -0
  129. package/dist/seo/feeds.d.ts.map +1 -0
  130. package/dist/seo/feeds.js +71 -0
  131. package/dist/seo/feeds.js.map +1 -0
  132. package/dist/seo/index.d.ts +9 -3
  133. package/dist/seo/index.d.ts.map +1 -1
  134. package/dist/seo/index.js +5 -2
  135. package/dist/seo/index.js.map +1 -1
  136. package/dist/seo/llms-txt.d.ts.map +1 -1
  137. package/dist/seo/llms-txt.js +13 -2
  138. package/dist/seo/llms-txt.js.map +1 -1
  139. package/dist/seo/meta-tags.d.ts +14 -0
  140. package/dist/seo/meta-tags.d.ts.map +1 -1
  141. package/dist/seo/meta-tags.js +21 -2
  142. package/dist/seo/meta-tags.js.map +1 -1
  143. package/dist/seo/page-meta.d.ts +47 -0
  144. package/dist/seo/page-meta.d.ts.map +1 -1
  145. package/dist/seo/page-meta.js +280 -70
  146. package/dist/seo/page-meta.js.map +1 -1
  147. package/dist/seo/sitemap-notify.d.ts +30 -0
  148. package/dist/seo/sitemap-notify.d.ts.map +1 -1
  149. package/dist/seo/sitemap-notify.js +87 -0
  150. package/dist/seo/sitemap-notify.js.map +1 -1
  151. package/dist/validation/publish.d.ts +53 -0
  152. package/dist/validation/publish.d.ts.map +1 -0
  153. package/dist/validation/publish.js +75 -0
  154. package/dist/validation/publish.js.map +1 -0
  155. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap-notify.test.js","sourceRoot":"","sources":["../../../src/__tests__/seo/sitemap-notify.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sitemap-notify.test.js","sourceRoot":"","sources":["../../../src/__tests__/seo/sitemap-notify.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=publish.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/validation/publish.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,164 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { validatePublishableDocument, resolvePublishValidationMode, isGatedContentCollection, enforcePublishValidation, } from '../../validation/publish.js';
3
+ import { createDocument, updateDocument } from '../../actions.js';
4
+ import { setActuateConfig } from '../../config/runtime.js';
5
+ import { vi } from 'vitest';
6
+ describe('validatePublishableDocument (pure)', () => {
7
+ it('passes a page with a title and slug', () => {
8
+ const r = validatePublishableDocument({ data: { title: 'About', slug: 'about' } });
9
+ expect(r.errors).toEqual([]);
10
+ });
11
+ it('flags a missing title', () => {
12
+ const r = validatePublishableDocument({ data: { slug: 'about' } });
13
+ expect(r.errors.some((e) => /title/i.test(e))).toBe(true);
14
+ });
15
+ it('flags a missing URL (no slug and no path)', () => {
16
+ const r = validatePublishableDocument({ data: { title: 'About' } });
17
+ expect(r.errors.some((e) => /url|slug|path/i.test(e))).toBe(true);
18
+ });
19
+ it('accepts data.path in place of a slug', () => {
20
+ const r = validatePublishableDocument({ data: { title: 'Home', path: '/' } });
21
+ expect(r.errors).toEqual([]);
22
+ });
23
+ it('warns (not errors) on a missing meta description', () => {
24
+ const r = validatePublishableDocument({ data: { title: 'About', slug: 'about' } });
25
+ expect(r.errors).toEqual([]);
26
+ expect(r.warnings.some((w) => /description/i.test(w))).toBe(true);
27
+ });
28
+ it('rejects a malformed slug', () => {
29
+ const r = validatePublishableDocument({ data: { title: 'About', slug: 'About Us!' } });
30
+ expect(r.errors.some((e) => /slug/i.test(e))).toBe(true);
31
+ });
32
+ it('rejects a reserved slug', () => {
33
+ const r = validatePublishableDocument({ data: { title: 'Admin', slug: 'admin' } });
34
+ expect(r.errors.some((e) => /reserved/i.test(e))).toBe(true);
35
+ });
36
+ it('accepts a page that uses path with no slug (slug check skipped)', () => {
37
+ const r = validatePublishableDocument({ data: { title: 'Home', path: '/' } });
38
+ expect(r.errors).toEqual([]);
39
+ });
40
+ });
41
+ describe('resolvePublishValidationMode', () => {
42
+ it('defaults to block', () => {
43
+ expect(resolvePublishValidationMode(null)).toBe('block');
44
+ expect(resolvePublishValidationMode({ seo: {} })).toBe('block');
45
+ });
46
+ it('honors warn/off', () => {
47
+ expect(resolvePublishValidationMode({ seo: { publishValidation: 'warn' } })).toBe('warn');
48
+ expect(resolvePublishValidationMode({ seo: { publishValidation: 'off' } })).toBe('off');
49
+ });
50
+ });
51
+ describe('isGatedContentCollection', () => {
52
+ it('gates page/post, skips everything else', () => {
53
+ expect(isGatedContentCollection({ slug: 'p', type: 'page' })).toBe(true);
54
+ expect(isGatedContentCollection({ slug: 'b', type: 'post' })).toBe(true);
55
+ expect(isGatedContentCollection({ slug: 'x' })).toBe(false);
56
+ expect(isGatedContentCollection(null)).toBe(false);
57
+ });
58
+ });
59
+ describe('enforcePublishValidation', () => {
60
+ const pageDef = { slug: 'pages', type: 'page' };
61
+ it('throws in block mode on hard errors', () => {
62
+ expect(() => enforcePublishValidation({ collectionDef: pageDef, data: { slug: 'x' }, config: null })).toThrow(/cannot publish/i);
63
+ });
64
+ it('does not throw in warn mode', () => {
65
+ expect(() => enforcePublishValidation({
66
+ collectionDef: pageDef,
67
+ data: { slug: 'x' },
68
+ config: { seo: { publishValidation: 'warn' } },
69
+ })).not.toThrow();
70
+ });
71
+ it('skips non-gated collections', () => {
72
+ expect(() => enforcePublishValidation({
73
+ collectionDef: { slug: 'forms' },
74
+ data: {},
75
+ config: null,
76
+ })).not.toThrow();
77
+ });
78
+ });
79
+ // --- Integration through the action layer -----------------------------------
80
+ function createMockDB() {
81
+ const docs = new Map();
82
+ return {
83
+ document: {
84
+ findFirst: vi.fn(async ({ where }) => {
85
+ const d = docs.get(where.id);
86
+ if (!d)
87
+ return null;
88
+ if (where.deletedAt === null && d.deletedAt !== null)
89
+ return null;
90
+ return { ...d };
91
+ }),
92
+ },
93
+ version: { create: vi.fn(async () => ({})) },
94
+ $transaction: vi.fn(async (fn) => fn({
95
+ document: {
96
+ create: vi.fn(async ({ data }) => {
97
+ const doc = { id: `doc-${docs.size}`, ...data, deletedAt: null };
98
+ docs.set(doc.id, doc);
99
+ return doc;
100
+ }),
101
+ update: vi.fn(async ({ where, data }) => {
102
+ const doc = docs.get(where.id);
103
+ Object.assign(doc, data);
104
+ return { ...doc };
105
+ }),
106
+ },
107
+ version: { create: vi.fn(async () => ({})) },
108
+ redirect: {
109
+ findMany: vi.fn(async () => []),
110
+ upsert: vi.fn(),
111
+ update: vi.fn(),
112
+ delete: vi.fn(),
113
+ },
114
+ })),
115
+ redirect: { findMany: vi.fn(async () => []) },
116
+ _docs: docs,
117
+ _seed(doc) {
118
+ docs.set(doc.id, doc);
119
+ },
120
+ };
121
+ }
122
+ function ctx(db) {
123
+ return { userId: 'u1', role: 'ADMIN', db };
124
+ }
125
+ describe('publish gate through createDocument/updateDocument', () => {
126
+ beforeEach(() => {
127
+ setActuateConfig({
128
+ collections: { pages: { slug: 'pages', type: 'page', fields: {} } },
129
+ });
130
+ });
131
+ afterEach(() => setActuateConfig({}));
132
+ it('blocks creating a published page with no title', async () => {
133
+ const db = createMockDB();
134
+ await expect(createDocument('pages', { slug: 'no-title', status: 'PUBLISHED' }, ctx(db))).rejects.toThrow(/cannot publish/i);
135
+ });
136
+ it('allows creating a published page with title + slug', async () => {
137
+ const db = createMockDB();
138
+ await expect(createDocument('pages', { title: 'OK', slug: 'ok', status: 'PUBLISHED' }, ctx(db))).resolves.toMatchObject({ status: 'PUBLISHED' });
139
+ });
140
+ it('allows saving an untitled DRAFT (gate only fires on publish)', async () => {
141
+ const db = createMockDB();
142
+ await expect(createDocument('pages', { slug: 'draft-no-title' }, ctx(db))).resolves.toMatchObject({ status: 'DRAFT' });
143
+ });
144
+ it('blocks an update that would publish a page lacking a URL', async () => {
145
+ const db = createMockDB();
146
+ db._seed({
147
+ id: 'd1',
148
+ collection: 'pages',
149
+ status: 'DRAFT',
150
+ slug: null,
151
+ data: { title: 'Has title' },
152
+ deletedAt: null,
153
+ });
154
+ await expect(updateDocument('pages', 'd1', { status: 'PUBLISHED' }, ctx(db))).rejects.toThrow(/slug or path/i);
155
+ });
156
+ it('does not gate non page/post collections', async () => {
157
+ setActuateConfig({
158
+ collections: { widgets: { slug: 'widgets', fields: {} } },
159
+ });
160
+ const db = createMockDB();
161
+ await expect(createDocument('widgets', { status: 'PUBLISHED' }, ctx(db))).resolves.toMatchObject({ status: 'PUBLISHED' });
162
+ });
163
+ });
164
+ //# sourceMappingURL=publish.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.test.js","sourceRoot":"","sources":["../../../src/__tests__/validation/publish.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
package/dist/actions.js CHANGED
@@ -7,6 +7,10 @@ import { getActuateConfig } from './config/runtime.js';
7
7
  import { validateRelations } from './fields/relations.js';
8
8
  import { invalidationTagsForDocumentWrite, invalidationTagsForGlobalWrite } from './cache/http.js';
9
9
  import { notifySitemapOnPublish } from './seo/sitemap-notify.js';
10
+ import { resolveDocumentUrl } from './seo/page-meta.js';
11
+ import { normalizeRedirectPath } from './redirects/graph.js';
12
+ import { planSlugChangeRedirects, isEmptyPlan } from './redirects/auto.js';
13
+ import { enforcePublishValidation } from './validation/publish.js';
10
14
  import { getSeoOverrides, putSeoOverrides, resolveSeoModuleSettings, } from './seo/config-store.js';
11
15
  /**
12
16
  * Widen a typed DB row to the `Record<string, unknown>` shape the public
@@ -102,8 +106,65 @@ async function flushEffects(effects, ctx) {
102
106
  else if (effect.kind === 'cache-invalidate') {
103
107
  await fireCacheInvalidate(effect.tags);
104
108
  }
109
+ else if (effect.kind === 'auto-redirect') {
110
+ await fireAutoRedirect(ctx, effect.oldPath, effect.newPath);
111
+ }
105
112
  else {
106
- await fireSitemapNotify(ctx);
113
+ await fireSitemapNotify(ctx, effect.changed);
114
+ }
115
+ }
116
+ }
117
+ /**
118
+ * Persist the redirect mutations for a slug/path change. Reads the current
119
+ * rule set, plans loop-free 301s via {@link planSlugChangeRedirects}, and
120
+ * applies the plan in one transaction. Never throws — the content write has
121
+ * already committed, so a redirect failure must not surface to the caller.
122
+ */
123
+ async function fireAutoRedirect(ctx, oldPath, newPath) {
124
+ try {
125
+ const db = prisma(ctx);
126
+ const rows = await db.redirect.findMany({
127
+ select: { id: true, source: true, destination: true, enabled: true },
128
+ });
129
+ const existing = rows.map((r) => ({
130
+ id: r.id,
131
+ from: r.source,
132
+ to: r.destination,
133
+ enabled: r.enabled,
134
+ }));
135
+ const plan = planSlugChangeRedirects({ oldPath, newPath, existing });
136
+ if (isEmptyPlan(plan))
137
+ return;
138
+ await db.$transaction(async (tx) => {
139
+ for (const id of plan.deleteIds) {
140
+ await tx.redirect.delete({ where: { id } });
141
+ }
142
+ for (const rp of plan.repoint) {
143
+ await tx.redirect.update({ where: { id: rp.id }, data: { destination: rp.destination } });
144
+ }
145
+ if (plan.upsert) {
146
+ await tx.redirect.upsert({
147
+ where: { source: plan.upsert.source },
148
+ create: {
149
+ source: plan.upsert.source,
150
+ destination: plan.upsert.destination,
151
+ statusCode: 301,
152
+ source_kind: 'slug-change',
153
+ createdById: ctx.userId || undefined,
154
+ },
155
+ update: {
156
+ destination: plan.upsert.destination,
157
+ statusCode: 301,
158
+ enabled: true,
159
+ source_kind: 'slug-change',
160
+ },
161
+ });
162
+ }
163
+ });
164
+ }
165
+ catch (err) {
166
+ if (process.env.NODE_ENV !== 'test') {
167
+ console.error('[actuate] auto-301 failed — old URL may 404 until a redirect is added manually:', err instanceof Error ? err.message : err);
107
168
  }
108
169
  }
109
170
  }
@@ -147,20 +208,49 @@ function readLifecycleStatus(data) {
147
208
  * the toggles in Settings > SEO / SEO Technical govern behaviour. Never throws
148
209
  * — the content write has already committed.
149
210
  */
150
- async function fireSitemapNotify(ctx) {
211
+ async function fireSitemapNotify(ctx, changed) {
151
212
  try {
152
213
  const overrides = await getSeoOverrides(ctx.db);
153
214
  const settings = resolveSeoModuleSettings(overrides);
154
215
  if (!settings.sitemapEnabled || !settings.autoRegenerateSitemapOnPublish)
155
216
  return;
217
+ // Master switch: when the public site is opted out of indexing, refresh the
218
+ // (now-empty) sitemap cache but never ping search engines or submit to
219
+ // IndexNow — we must not solicit crawling of a site the operator deindexed.
220
+ if (settings.indexEntireSite === false) {
221
+ await fireCacheInvalidate([SITEMAP_CACHE_TAG]);
222
+ return;
223
+ }
156
224
  const cfg = getActuateConfig();
157
225
  const siteUrl = process.env.NEXT_PUBLIC_SITE_URL ??
158
226
  cfg?.seo?.siteUrl ??
159
227
  null;
228
+ // Resolve the specific changed URL for IndexNow (URL-based instant
229
+ // indexing). Uses the SAME resolver as the sitemap + canonical tag so the
230
+ // submitted URL is always the page's real, canonical address.
231
+ const indexNowKey = process.env.INDEXNOW_KEY?.trim() || null;
232
+ let changedUrls = [];
233
+ let indexNowKeyLocation = null;
234
+ if (siteUrl && indexNowKey && changed) {
235
+ const base = siteUrl.replace(/\/+$/, '');
236
+ indexNowKeyLocation = `${base}/api/cms/indexnow-key.txt`;
237
+ const collectionDef = cfg?.collections?.[changed.collection];
238
+ changedUrls = [
239
+ resolveDocumentUrl({
240
+ siteUrl: base,
241
+ urlPrefix: collectionDef?.urlPrefix,
242
+ slug: changed.slug,
243
+ data: changed.path ? { path: changed.path } : {},
244
+ }),
245
+ ];
246
+ }
160
247
  const result = await notifySitemapOnPublish({
161
248
  settings,
162
249
  siteUrl,
163
250
  lastGeneratedAt: settings.sitemapLastGeneratedAt,
251
+ changedUrls,
252
+ indexNowKey,
253
+ indexNowKeyLocation,
164
254
  });
165
255
  // Cheap + un-debounced: refresh the sitemap cache on every change so the
166
256
  // next request rebuilds with the latest public content.
@@ -307,6 +397,17 @@ export async function createDocument(collection, data, ctx) {
307
397
  throw new Error('Insufficient permissions to publish — only EDITOR or ADMIN may publish.');
308
398
  }
309
399
  const status = publishingNow ? 'PUBLISHED' : 'DRAFT';
400
+ // Publish gate: enforce hard content invariants server-side so the SDK/MCP/
401
+ // API can't publish a broken page past the admin's checks. Only fires for
402
+ // publicly-routed content (page/post collections) on a publish. Throws in
403
+ // `block` mode (the default).
404
+ if (publishingNow) {
405
+ enforcePublishValidation({
406
+ collectionDef: getActuateConfig()?.collections?.[collection],
407
+ data: filteredData,
408
+ config: getActuateConfig(),
409
+ });
410
+ }
310
411
  const pendingEffects = [];
311
412
  const doc = await db.$transaction(async (tx) => {
312
413
  const created = await tx.document.create({
@@ -358,7 +459,15 @@ export async function createDocument(collection, data, ctx) {
358
459
  status: created.status,
359
460
  },
360
461
  });
361
- pendingEffects.push({ kind: 'sitemap-notify', reason: 'publish' });
462
+ pendingEffects.push({
463
+ kind: 'sitemap-notify',
464
+ reason: 'publish',
465
+ changed: {
466
+ collection,
467
+ slug: created.slug,
468
+ path: created.data?.path ?? null,
469
+ },
470
+ });
362
471
  }
363
472
  pendingEffects.push({ kind: 'plugin-hook', event: 'afterCreate', doc: asDocRecord(created) });
364
473
  pendingEffects.push({
@@ -426,6 +535,17 @@ export async function updateDocument(collection, id, data, ctx) {
426
535
  // Preserve the original publishedAt when the status was already PUBLISHED;
427
536
  // only stamp publishedAt on the transition into PUBLISHED.
428
537
  const isPublishingNow = status === 'PUBLISHED' && existing.status !== 'PUBLISHED';
538
+ // Publish gate: a document that will be published (newly or by staying
539
+ // published through this edit) must satisfy the hard content invariants.
540
+ // Enforced server-side so partial API edits can't leave a live page broken.
541
+ const willBePublished = (status ?? existing.status) === 'PUBLISHED';
542
+ if (willBePublished) {
543
+ enforcePublishValidation({
544
+ collectionDef: getActuateConfig()?.collections?.[collection],
545
+ data: filteredData,
546
+ config: getActuateConfig(),
547
+ });
548
+ }
429
549
  // Capture side-effects to fire AFTER the transaction commits so we never
430
550
  // dispatch a webhook for a rolled-back write. Reuses the module-level
431
551
  // `PendingEffect` type so newer effect kinds (e.g. cache-invalidate)
@@ -475,14 +595,41 @@ export async function updateDocument(collection, id, data, ctx) {
475
595
  // touch the public sitemap, so don't enqueue (avoids needless pings).
476
596
  const wasPublished = existing.status === 'PUBLISHED';
477
597
  const isPublished = (status ?? existing.status) === 'PUBLISHED';
598
+ const changedRef = {
599
+ collection,
600
+ slug: result.slug,
601
+ path: result.data?.path ?? null,
602
+ };
478
603
  if (isPublishingNow) {
479
- pendingEffects.push({ kind: 'sitemap-notify', reason: 'publish' });
604
+ pendingEffects.push({ kind: 'sitemap-notify', reason: 'publish', changed: changedRef });
480
605
  }
481
606
  else if (wasPublished && !isPublished) {
482
- pendingEffects.push({ kind: 'sitemap-notify', reason: 'unpublish' });
607
+ pendingEffects.push({ kind: 'sitemap-notify', reason: 'unpublish', changed: changedRef });
483
608
  }
484
609
  else if (wasPublished && isPublished) {
485
- pendingEffects.push({ kind: 'sitemap-notify', reason: 'update' });
610
+ pendingEffects.push({ kind: 'sitemap-notify', reason: 'update', changed: changedRef });
611
+ }
612
+ // Auto-301: when a document that was AND stays published changes its
613
+ // resolved URL, the old URL is already indexed/linked — keep it alive.
614
+ // Only on published→published; a draft's slug was never publicly reachable,
615
+ // and an unpublish leaves nothing to redirect to.
616
+ if (wasPublished && isPublished) {
617
+ const urlPrefix = getActuateConfig()?.collections?.[collection]?.urlPrefix;
618
+ const oldPath = resolveDocumentUrl({
619
+ siteUrl: '',
620
+ urlPrefix,
621
+ slug: existing.slug,
622
+ data: existingData,
623
+ });
624
+ const newPath = resolveDocumentUrl({
625
+ siteUrl: '',
626
+ urlPrefix,
627
+ slug: result.slug,
628
+ data: result.data,
629
+ });
630
+ if (normalizeRedirectPath(oldPath) !== normalizeRedirectPath(newPath)) {
631
+ pendingEffects.push({ kind: 'auto-redirect', oldPath, newPath });
632
+ }
486
633
  }
487
634
  return result;
488
635
  });
@@ -541,7 +688,15 @@ export async function updateDocumentSeoFields(collection, id, seoFields, ctx) {
541
688
  // SEO field edits (e.g. toggling `noindex`, changing canonical) change
542
689
  // sitemap inclusion for already-public docs, so refresh the sitemap.
543
690
  if (existing.status === 'PUBLISHED') {
544
- pendingEffects.push({ kind: 'sitemap-notify', reason: 'update' });
691
+ pendingEffects.push({
692
+ kind: 'sitemap-notify',
693
+ reason: 'update',
694
+ changed: {
695
+ collection,
696
+ slug: result.slug,
697
+ path: result.data?.path ?? null,
698
+ },
699
+ });
545
700
  }
546
701
  return result;
547
702
  });
@@ -584,8 +739,17 @@ export async function deleteDocument(collection, id, ctx) {
584
739
  },
585
740
  ];
586
741
  // Removing public content changes the sitemap; drafts were never in it.
742
+ // Submitting the now-gone URL to IndexNow prompts a recrawl → 404 → deindex.
587
743
  if (existing.status === 'PUBLISHED') {
588
- deleteEffects.push({ kind: 'sitemap-notify', reason: 'delete' });
744
+ deleteEffects.push({
745
+ kind: 'sitemap-notify',
746
+ reason: 'delete',
747
+ changed: {
748
+ collection,
749
+ slug: existing.slug,
750
+ path: existing.data?.path ?? null,
751
+ },
752
+ });
589
753
  }
590
754
  await flushEffects(deleteEffects, ctx);
591
755
  }