@actuate-media/cms-core 0.66.0 → 0.68.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.
- package/CHANGELOG.md +151 -0
- package/dist/__tests__/api/ai-quality.test.js +73 -0
- package/dist/__tests__/api/ai-quality.test.js.map +1 -1
- package/dist/__tests__/api/llms-txt.test.js +284 -0
- package/dist/__tests__/api/llms-txt.test.js.map +1 -1
- package/dist/__tests__/api/public-seo.test.js +402 -4
- package/dist/__tests__/api/public-seo.test.js.map +1 -1
- package/dist/__tests__/api/route-contracts.test.js +7 -0
- package/dist/__tests__/api/route-contracts.test.js.map +1 -1
- package/dist/__tests__/content/slug.test.d.ts +2 -0
- package/dist/__tests__/content/slug.test.d.ts.map +1 -0
- package/dist/__tests__/content/slug.test.js +68 -0
- package/dist/__tests__/content/slug.test.js.map +1 -0
- package/dist/__tests__/redirects/auto-301.test.d.ts +2 -0
- package/dist/__tests__/redirects/auto-301.test.d.ts.map +1 -0
- package/dist/__tests__/redirects/auto-301.test.js +172 -0
- package/dist/__tests__/redirects/auto-301.test.js.map +1 -0
- package/dist/__tests__/seo/ai-bots.test.d.ts +2 -0
- package/dist/__tests__/seo/ai-bots.test.d.ts.map +1 -0
- package/dist/__tests__/seo/ai-bots.test.js +53 -0
- package/dist/__tests__/seo/ai-bots.test.js.map +1 -0
- package/dist/__tests__/seo/alt-text.test.d.ts +2 -0
- package/dist/__tests__/seo/alt-text.test.d.ts.map +1 -0
- package/dist/__tests__/seo/alt-text.test.js +47 -0
- package/dist/__tests__/seo/alt-text.test.js.map +1 -0
- package/dist/__tests__/seo/feeds.test.d.ts +2 -0
- package/dist/__tests__/seo/feeds.test.d.ts.map +1 -0
- package/dist/__tests__/seo/feeds.test.js +61 -0
- package/dist/__tests__/seo/feeds.test.js.map +1 -0
- package/dist/__tests__/seo/freshness.test.d.ts +2 -0
- package/dist/__tests__/seo/freshness.test.d.ts.map +1 -0
- package/dist/__tests__/seo/freshness.test.js +89 -0
- package/dist/__tests__/seo/freshness.test.js.map +1 -0
- package/dist/__tests__/seo/llms-sanitize.test.d.ts +2 -0
- package/dist/__tests__/seo/llms-sanitize.test.d.ts.map +1 -0
- package/dist/__tests__/seo/llms-sanitize.test.js +74 -0
- package/dist/__tests__/seo/llms-sanitize.test.js.map +1 -0
- package/dist/__tests__/seo/meta-tags-alternates.test.d.ts +2 -0
- package/dist/__tests__/seo/meta-tags-alternates.test.d.ts.map +1 -0
- package/dist/__tests__/seo/meta-tags-alternates.test.js +52 -0
- package/dist/__tests__/seo/meta-tags-alternates.test.js.map +1 -0
- package/dist/__tests__/seo/page-meta.test.js +230 -14
- package/dist/__tests__/seo/page-meta.test.js.map +1 -1
- package/dist/__tests__/seo/sitemap-notify.test.js +77 -1
- package/dist/__tests__/seo/sitemap-notify.test.js.map +1 -1
- package/dist/__tests__/validation/publish.test.d.ts +2 -0
- package/dist/__tests__/validation/publish.test.d.ts.map +1 -0
- package/dist/__tests__/validation/publish.test.js +164 -0
- package/dist/__tests__/validation/publish.test.js.map +1 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +172 -8
- package/dist/actions.js.map +1 -1
- package/dist/api/route-helpers.d.ts +8 -0
- package/dist/api/route-helpers.d.ts.map +1 -1
- package/dist/api/route-helpers.js +20 -0
- package/dist/api/route-helpers.js.map +1 -1
- package/dist/api/routes/ai-seo.d.ts.map +1 -1
- package/dist/api/routes/ai-seo.js +32 -1
- package/dist/api/routes/ai-seo.js.map +1 -1
- package/dist/api/routes/documents.d.ts.map +1 -1
- package/dist/api/routes/documents.js +3 -3
- package/dist/api/routes/documents.js.map +1 -1
- package/dist/api/routes/seo-public.d.ts.map +1 -1
- package/dist/api/routes/seo-public.js +371 -62
- package/dist/api/routes/seo-public.js.map +1 -1
- package/dist/api/routes/seo.d.ts.map +1 -1
- package/dist/api/routes/seo.js +124 -16
- package/dist/api/routes/seo.js.map +1 -1
- package/dist/api/routes/url-resolution.d.ts.map +1 -1
- package/dist/api/routes/url-resolution.js +40 -1
- package/dist/api/routes/url-resolution.js.map +1 -1
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -1
- package/dist/config/types.d.ts +51 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/content/index.d.ts +1 -0
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +1 -0
- package/dist/content/index.js.map +1 -1
- package/dist/content/slug.d.ts +40 -0
- package/dist/content/slug.d.ts.map +1 -0
- package/dist/content/slug.js +78 -0
- package/dist/content/slug.js.map +1 -0
- package/dist/content/structured-data.d.ts +6 -0
- package/dist/content/structured-data.d.ts.map +1 -1
- package/dist/content/structured-data.js +6 -0
- package/dist/content/structured-data.js.map +1 -1
- package/dist/content-health/scanner.d.ts +4 -3
- package/dist/content-health/scanner.d.ts.map +1 -1
- package/dist/content-health/scanner.js +6 -12
- package/dist/content-health/scanner.js.map +1 -1
- package/dist/redirects/auto.d.ts +45 -0
- package/dist/redirects/auto.d.ts.map +1 -0
- package/dist/redirects/auto.js +55 -0
- package/dist/redirects/auto.js.map +1 -0
- package/dist/redirects/index.d.ts +2 -0
- package/dist/redirects/index.d.ts.map +1 -1
- package/dist/redirects/index.js +1 -0
- package/dist/redirects/index.js.map +1 -1
- package/dist/seo/ai-bots.d.ts +42 -0
- package/dist/seo/ai-bots.d.ts.map +1 -0
- package/dist/seo/ai-bots.js +104 -0
- package/dist/seo/ai-bots.js.map +1 -0
- package/dist/seo/alt-text.d.ts +39 -0
- package/dist/seo/alt-text.d.ts.map +1 -0
- package/dist/seo/alt-text.js +67 -0
- package/dist/seo/alt-text.js.map +1 -0
- package/dist/seo/analysis.d.ts.map +1 -1
- package/dist/seo/analysis.js +7 -11
- package/dist/seo/analysis.js.map +1 -1
- package/dist/seo/audit-engine.d.ts +1 -0
- package/dist/seo/audit-engine.d.ts.map +1 -1
- package/dist/seo/audit-engine.js +4 -4
- package/dist/seo/audit-engine.js.map +1 -1
- package/dist/seo/audit-runner.d.ts.map +1 -1
- package/dist/seo/audit-runner.js +1 -0
- package/dist/seo/audit-runner.js.map +1 -1
- package/dist/seo/feeds.d.ts +36 -0
- package/dist/seo/feeds.d.ts.map +1 -0
- package/dist/seo/feeds.js +71 -0
- package/dist/seo/feeds.js.map +1 -0
- package/dist/seo/index.d.ts +10 -4
- package/dist/seo/index.d.ts.map +1 -1
- package/dist/seo/index.js +6 -3
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/llms-txt.d.ts +24 -0
- package/dist/seo/llms-txt.d.ts.map +1 -1
- package/dist/seo/llms-txt.js +109 -47
- package/dist/seo/llms-txt.js.map +1 -1
- package/dist/seo/meta-tags.d.ts +14 -0
- package/dist/seo/meta-tags.d.ts.map +1 -1
- package/dist/seo/meta-tags.js +21 -2
- package/dist/seo/meta-tags.js.map +1 -1
- package/dist/seo/page-meta.d.ts +47 -0
- package/dist/seo/page-meta.d.ts.map +1 -1
- package/dist/seo/page-meta.js +280 -70
- package/dist/seo/page-meta.js.map +1 -1
- package/dist/seo/sitemap-notify.d.ts +30 -0
- package/dist/seo/sitemap-notify.d.ts.map +1 -1
- package/dist/seo/sitemap-notify.js +87 -0
- package/dist/seo/sitemap-notify.js.map +1 -1
- package/dist/validation/publish.d.ts +53 -0
- package/dist/validation/publish.d.ts.map +1 -0
- package/dist/validation/publish.js +75 -0
- package/dist/validation/publish.js.map +1 -0
- 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 @@
|
|
|
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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"}
|
package/dist/actions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,EAAqB,KAAK,cAAc,EAAwB,MAAM,uBAAuB,CAAA;
|
|
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({
|
|
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({
|
|
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({
|
|
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
|
}
|