@actuate-media/cms-core 0.19.0 → 0.20.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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ai-quality.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-quality.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/api/ai-quality.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,470 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ // vi.mock is hoisted. Mock @actuate-media/plugin-ai so handlers.ts'
3
+ // dynamic import resolves to deterministic stubs — we want to verify the
4
+ // HTTP wiring (auth, validation, branching, response shape) without
5
+ // pulling in the real scoring pipeline (covered by plugin-ai's own tests).
6
+ vi.mock('@actuate-media/plugin-ai', () => ({
7
+ rewrite: vi.fn(async (text, style, tone) => `[rewrite style=${style ?? ''} tone=${tone ?? ''}] ${text}`),
8
+ expand: vi.fn(async (text, instructions) => `[expand ${instructions ?? ''}] ${text} (more detail)`),
9
+ compress: vi.fn(async (text, target) => `[compress target=${target ?? ''}] ${text.slice(0, Math.min(text.length, target ?? 40))}`),
10
+ proofread: vi.fn(async (text) => ({
11
+ corrected: text.replace(/teh/g, 'the'),
12
+ changes: text.includes('teh') ? [{ original: 'teh', corrected: 'the', type: 'spelling' }] : [],
13
+ })),
14
+ auditDocument: vi.fn((input) => ({
15
+ composite: { overall: 78, grade: 'C', breakdown: {} },
16
+ scores: { seo: 80, readability: 75, accessibility: 90 },
17
+ readability: { averageGradeLevel: 9.2, difficulty: 'moderate' },
18
+ issues: [
19
+ {
20
+ severity: 'warning',
21
+ category: 'structure',
22
+ rule: 'missing-meta-description',
23
+ message: 'Document is missing a meta description.',
24
+ field: 'metaDescription',
25
+ },
26
+ ],
27
+ diagnostics: {
28
+ seoBreakdown: [{ criterion: 'Title length', score: 15, maxScore: 15 }],
29
+ accessibilityIssues: [],
30
+ },
31
+ __echo: input,
32
+ })),
33
+ suggestInternalLinks: vi.fn(async (content, pages) => {
34
+ // Return one fake suggestion per page so the test can verify candidate
35
+ // assembly worked.
36
+ return pages.map((p, i) => ({
37
+ anchorText: p.title,
38
+ targetPage: p,
39
+ confidence: 0.9 - i * 0.1,
40
+ position: { start: 0, end: p.title.length },
41
+ }));
42
+ }),
43
+ }));
44
+ import { handleActuateAPI } from '../../api/index.js';
45
+ import { initDB } from '../../db.js';
46
+ import { generateApiKey } from '../../security/api-key-enhanced.js';
47
+ const VALID_SECRET = 'a'.repeat(48);
48
+ function createMockDB(opts) {
49
+ const apiKey = opts.apiKey;
50
+ const documents = opts.documents ?? [];
51
+ const dbMock = {
52
+ apiKey: {
53
+ findMany: async () => (apiKey ? [apiKey] : []),
54
+ findUnique: async ({ where }) => {
55
+ if (!apiKey)
56
+ return null;
57
+ if (apiKey.keyHash !== where.keyHash)
58
+ return null;
59
+ return apiKey;
60
+ },
61
+ update: async () => apiKey,
62
+ },
63
+ document: {
64
+ findMany: async ({ where }) => {
65
+ if (!where)
66
+ return documents;
67
+ return documents.filter((d) => {
68
+ if (where.collection && d.collection !== where.collection)
69
+ return false;
70
+ if (where.status && d.status !== where.status)
71
+ return false;
72
+ if (where.deletedAt === null && d.deletedAt)
73
+ return false;
74
+ return true;
75
+ });
76
+ },
77
+ findFirst: async ({ where }) => {
78
+ return (documents.find((d) => {
79
+ if (where.id && d.id !== where.id)
80
+ return false;
81
+ if (where.collection && d.collection !== where.collection)
82
+ return false;
83
+ if (where.deletedAt === null && d.deletedAt)
84
+ return false;
85
+ return true;
86
+ }) ?? null);
87
+ },
88
+ count: async () => documents.length,
89
+ },
90
+ auditLog: { create: async () => ({}) },
91
+ };
92
+ dbMock.$transaction = async (arg) => {
93
+ if (typeof arg === 'function')
94
+ return await arg(dbMock);
95
+ if (Array.isArray(arg))
96
+ return Promise.all(arg);
97
+ return arg;
98
+ };
99
+ return dbMock;
100
+ }
101
+ async function makeKey(scopes) {
102
+ const { key, keyHash, keyPrefix } = await generateApiKey({ prefix: 'act_sk', scopes });
103
+ return {
104
+ key,
105
+ record: {
106
+ id: 'apikey-ai-quality',
107
+ keyHash,
108
+ keyPrefix,
109
+ userId: 'user-1',
110
+ scopes,
111
+ ipRestrictions: null,
112
+ expiresAt: null,
113
+ lastUsedAt: null,
114
+ revokedAt: null,
115
+ },
116
+ };
117
+ }
118
+ const postsCollection = {
119
+ slug: 'posts',
120
+ labels: { singular: 'Post', plural: 'Posts' },
121
+ type: 'post',
122
+ fields: {
123
+ title: { type: 'text', label: 'Title', required: true },
124
+ slug: { type: 'slug', label: 'Slug', required: true },
125
+ body: { type: 'richText', label: 'Body' },
126
+ metaDescription: { type: 'text', label: 'Meta description' },
127
+ },
128
+ };
129
+ describe('POST /ai/audit-document', () => {
130
+ beforeEach(() => {
131
+ delete globalThis.__actuateConfig;
132
+ process.env.CMS_SECRET = VALID_SECRET;
133
+ });
134
+ it('audits ad-hoc content when title+body are supplied', async () => {
135
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
136
+ const db = createMockDB({ apiKey: record });
137
+ initDB(db);
138
+ const handler = handleActuateAPI({
139
+ prismaClient: db,
140
+ config: { collections: { posts: postsCollection } },
141
+ });
142
+ const response = await handler(new Request('https://example.com/api/cms/ai/audit-document', {
143
+ method: 'POST',
144
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
145
+ body: JSON.stringify({
146
+ title: 'How to brew pour-over coffee',
147
+ body: 'Pour-over coffee is one of the cleanest ways to extract flavor from beans. Start with fresh roasted whole beans, grind them medium-fine right before brewing, and use water just off the boil.',
148
+ metaDescription: 'Learn the essentials of pour-over coffee: bean selection, grind size, and water temperature.',
149
+ targetKeyword: 'pour-over coffee',
150
+ }),
151
+ }));
152
+ expect(response.status).toBe(200);
153
+ const body = await response.json();
154
+ expect(body.data.composite.grade).toBe('C');
155
+ expect(body.data.scores.seo).toBe(80);
156
+ expect(body.data.issues[0].rule).toBe('missing-meta-description');
157
+ });
158
+ it('audits a stored document when { collection, id } is supplied', async () => {
159
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
160
+ const db = createMockDB({
161
+ apiKey: record,
162
+ documents: [
163
+ {
164
+ id: 'doc-1',
165
+ collection: 'posts',
166
+ title: 'Stored doc',
167
+ slug: 'stored-doc',
168
+ status: 'PUBLISHED',
169
+ deletedAt: null,
170
+ data: {
171
+ title: 'Stored doc',
172
+ body: 'Stored body content from the database.',
173
+ metaDescription: 'Stored meta',
174
+ },
175
+ publishedAt: new Date('2026-01-01'),
176
+ updatedAt: new Date('2026-02-01'),
177
+ },
178
+ ],
179
+ });
180
+ initDB(db);
181
+ const handler = handleActuateAPI({
182
+ prismaClient: db,
183
+ config: { collections: { posts: postsCollection } },
184
+ });
185
+ const response = await handler(new Request('https://example.com/api/cms/ai/audit-document', {
186
+ method: 'POST',
187
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
188
+ body: JSON.stringify({ collection: 'posts', id: 'doc-1' }),
189
+ }));
190
+ expect(response.status).toBe(200);
191
+ const body = await response.json();
192
+ // The mocked auditor echoes its input back so we can verify the
193
+ // handler extracted the right fields from the persisted document.
194
+ expect(body.data.__echo.title).toBe('Stored doc');
195
+ expect(body.data.__echo.body).toBe('Stored body content from the database.');
196
+ expect(body.data.__echo.metaDescription).toBe('Stored meta');
197
+ });
198
+ it('returns 404 when the referenced document does not exist', async () => {
199
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
200
+ const db = createMockDB({ apiKey: record, documents: [] });
201
+ initDB(db);
202
+ const handler = handleActuateAPI({
203
+ prismaClient: db,
204
+ config: { collections: { posts: postsCollection } },
205
+ });
206
+ const response = await handler(new Request('https://example.com/api/cms/ai/audit-document', {
207
+ method: 'POST',
208
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
209
+ body: JSON.stringify({ collection: 'posts', id: 'nope' }),
210
+ }));
211
+ expect(response.status).toBe(404);
212
+ });
213
+ it('returns 400 when neither id+collection nor content is supplied', async () => {
214
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
215
+ const db = createMockDB({ apiKey: record });
216
+ initDB(db);
217
+ const handler = handleActuateAPI({
218
+ prismaClient: db,
219
+ config: { collections: { posts: postsCollection } },
220
+ });
221
+ const response = await handler(new Request('https://example.com/api/cms/ai/audit-document', {
222
+ method: 'POST',
223
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
224
+ body: JSON.stringify({}),
225
+ }));
226
+ expect(response.status).toBe(400);
227
+ });
228
+ it('requires authentication', async () => {
229
+ const db = createMockDB({});
230
+ initDB(db);
231
+ const handler = handleActuateAPI({
232
+ prismaClient: db,
233
+ config: { collections: { posts: postsCollection } },
234
+ });
235
+ const response = await handler(new Request('https://example.com/api/cms/ai/audit-document', {
236
+ method: 'POST',
237
+ headers: { 'Content-Type': 'application/json' },
238
+ body: JSON.stringify({ title: 'x', body: 'y' }),
239
+ }));
240
+ expect(response.status).toBeGreaterThanOrEqual(401);
241
+ expect(response.status).toBeLessThan(500);
242
+ });
243
+ });
244
+ describe('POST /ai/suggest-internal-links', () => {
245
+ beforeEach(() => {
246
+ delete globalThis.__actuateConfig;
247
+ process.env.CMS_SECRET = VALID_SECRET;
248
+ });
249
+ it('suggests links based on published documents in the requested collection', async () => {
250
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
251
+ const db = createMockDB({
252
+ apiKey: record,
253
+ documents: [
254
+ {
255
+ id: 'doc-1',
256
+ collection: 'posts',
257
+ title: 'Coffee grinders explained',
258
+ slug: 'coffee-grinders',
259
+ status: 'PUBLISHED',
260
+ deletedAt: null,
261
+ data: { title: 'Coffee grinders explained', tags: ['grinder', 'brewing'] },
262
+ },
263
+ {
264
+ id: 'doc-2',
265
+ collection: 'posts',
266
+ title: 'Pour-over basics',
267
+ slug: 'pour-over-basics',
268
+ status: 'PUBLISHED',
269
+ deletedAt: null,
270
+ data: { title: 'Pour-over basics' },
271
+ },
272
+ {
273
+ id: 'doc-3',
274
+ collection: 'posts',
275
+ title: 'Draft post',
276
+ slug: 'draft',
277
+ status: 'DRAFT',
278
+ deletedAt: null,
279
+ data: { title: 'Draft post' },
280
+ },
281
+ ],
282
+ });
283
+ initDB(db);
284
+ const handler = handleActuateAPI({
285
+ prismaClient: db,
286
+ config: { collections: { posts: postsCollection } },
287
+ });
288
+ const response = await handler(new Request('https://example.com/api/cms/ai/suggest-internal-links', {
289
+ method: 'POST',
290
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
291
+ body: JSON.stringify({
292
+ content: 'A great brew starts with the right grind. See coffee grinders explained for more.',
293
+ collection: 'posts',
294
+ }),
295
+ }));
296
+ expect(response.status).toBe(200);
297
+ const body = await response.json();
298
+ // Only PUBLISHED docs are passed to the suggester — the DRAFT post is filtered.
299
+ expect(body.data.candidatesScanned).toBe(2);
300
+ expect(body.data.suggestions).toHaveLength(2);
301
+ expect(body.data.suggestions[0].targetPage.title).toBe('Coffee grinders explained');
302
+ });
303
+ it('honors the excludeId option to skip the doc being edited', async () => {
304
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
305
+ const db = createMockDB({
306
+ apiKey: record,
307
+ documents: [
308
+ {
309
+ id: 'doc-1',
310
+ collection: 'posts',
311
+ title: 'First',
312
+ slug: 'first',
313
+ status: 'PUBLISHED',
314
+ deletedAt: null,
315
+ data: { title: 'First' },
316
+ },
317
+ {
318
+ id: 'doc-2',
319
+ collection: 'posts',
320
+ title: 'Second',
321
+ slug: 'second',
322
+ status: 'PUBLISHED',
323
+ deletedAt: null,
324
+ data: { title: 'Second' },
325
+ },
326
+ ],
327
+ });
328
+ initDB(db);
329
+ const handler = handleActuateAPI({
330
+ prismaClient: db,
331
+ config: { collections: { posts: postsCollection } },
332
+ });
333
+ const response = await handler(new Request('https://example.com/api/cms/ai/suggest-internal-links', {
334
+ method: 'POST',
335
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
336
+ body: JSON.stringify({
337
+ content: 'Some content.',
338
+ collection: 'posts',
339
+ excludeId: 'doc-1',
340
+ }),
341
+ }));
342
+ expect(response.status).toBe(200);
343
+ const body = await response.json();
344
+ expect(body.data.candidatesScanned).toBe(1);
345
+ expect(body.data.suggestions[0].targetPage.id).toBe('doc-2');
346
+ });
347
+ it('returns 400 when content is missing', async () => {
348
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
349
+ const db = createMockDB({ apiKey: record });
350
+ initDB(db);
351
+ const handler = handleActuateAPI({
352
+ prismaClient: db,
353
+ config: { collections: { posts: postsCollection } },
354
+ });
355
+ const response = await handler(new Request('https://example.com/api/cms/ai/suggest-internal-links', {
356
+ method: 'POST',
357
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
358
+ body: JSON.stringify({}),
359
+ }));
360
+ expect(response.status).toBe(400);
361
+ });
362
+ });
363
+ describe('POST /ai/coauthor', () => {
364
+ beforeEach(() => {
365
+ delete globalThis.__actuateConfig;
366
+ process.env.CMS_SECRET = VALID_SECRET;
367
+ process.env.ACTUATE_DISABLE_RATE_LIMIT = '1';
368
+ });
369
+ it('rewrites text with style + tone hints', async () => {
370
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
371
+ const db = createMockDB({ apiKey: record });
372
+ initDB(db);
373
+ const handler = handleActuateAPI({
374
+ prismaClient: db,
375
+ config: { collections: { posts: postsCollection } },
376
+ });
377
+ const response = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
378
+ method: 'POST',
379
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
380
+ body: JSON.stringify({
381
+ action: 'rewrite',
382
+ text: 'Original content here.',
383
+ style: 'casual',
384
+ tone: 'friendly',
385
+ }),
386
+ }));
387
+ expect(response.status).toBe(200);
388
+ const body = await response.json();
389
+ expect(body.data.action).toBe('rewrite');
390
+ expect(body.data.text).toContain('Original content here.');
391
+ expect(body.data.text).toContain('casual');
392
+ expect(body.data.text).toContain('friendly');
393
+ });
394
+ it('expands and compresses text', async () => {
395
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
396
+ const db = createMockDB({ apiKey: record });
397
+ initDB(db);
398
+ const handler = handleActuateAPI({
399
+ prismaClient: db,
400
+ config: { collections: { posts: postsCollection } },
401
+ });
402
+ const expandRes = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
403
+ method: 'POST',
404
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
405
+ body: JSON.stringify({ action: 'expand', text: 'Short.', instructions: 'add detail' }),
406
+ }));
407
+ expect(expandRes.status).toBe(200);
408
+ expect((await expandRes.json()).data.text).toContain('more detail');
409
+ const compressRes = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
410
+ method: 'POST',
411
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
412
+ body: JSON.stringify({
413
+ action: 'compress',
414
+ text: 'Lorem ipsum dolor sit amet consectetur adipiscing elit.',
415
+ targetLength: 20,
416
+ }),
417
+ }));
418
+ expect(compressRes.status).toBe(200);
419
+ expect((await compressRes.json()).data.text.length).toBeLessThanOrEqual(60);
420
+ });
421
+ it('proofreads and surfaces structured changes', async () => {
422
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
423
+ const db = createMockDB({ apiKey: record });
424
+ initDB(db);
425
+ const handler = handleActuateAPI({
426
+ prismaClient: db,
427
+ config: { collections: { posts: postsCollection } },
428
+ });
429
+ const response = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
430
+ method: 'POST',
431
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
432
+ body: JSON.stringify({ action: 'proofread', text: 'teh quick brown fox' }),
433
+ }));
434
+ expect(response.status).toBe(200);
435
+ const body = await response.json();
436
+ expect(body.data.text).toBe('the quick brown fox');
437
+ expect(body.data.changes).toEqual([{ original: 'teh', corrected: 'the', type: 'spelling' }]);
438
+ });
439
+ it('returns 400 when text is missing', async () => {
440
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
441
+ const db = createMockDB({ apiKey: record });
442
+ initDB(db);
443
+ const handler = handleActuateAPI({
444
+ prismaClient: db,
445
+ config: { collections: { posts: postsCollection } },
446
+ });
447
+ const response = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
448
+ method: 'POST',
449
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
450
+ body: JSON.stringify({ action: 'rewrite' }),
451
+ }));
452
+ expect(response.status).toBe(400);
453
+ });
454
+ it('returns 400 for unknown action', async () => {
455
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
456
+ const db = createMockDB({ apiKey: record });
457
+ initDB(db);
458
+ const handler = handleActuateAPI({
459
+ prismaClient: db,
460
+ config: { collections: { posts: postsCollection } },
461
+ });
462
+ const response = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
463
+ method: 'POST',
464
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
465
+ body: JSON.stringify({ action: 'translate', text: 'x' }),
466
+ }));
467
+ expect(response.status).toBe(400);
468
+ });
469
+ });
470
+ //# sourceMappingURL=ai-quality.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-quality.test.js","sourceRoot":"","sources":["../../../src/__tests__/api/ai-quality.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/seo/config-store.test.ts"],"names":[],"mappings":""}