@actuate-media/cms-core 0.19.0 → 0.21.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/LICENSE +21 -21
- package/dist/__tests__/api/ai-quality.test.d.ts +2 -0
- package/dist/__tests__/api/ai-quality.test.d.ts.map +1 -0
- package/dist/__tests__/api/ai-quality.test.js +470 -0
- package/dist/__tests__/api/ai-quality.test.js.map +1 -0
- package/dist/__tests__/fields/component-block.test.d.ts +2 -0
- package/dist/__tests__/fields/component-block.test.d.ts.map +1 -0
- package/dist/__tests__/fields/component-block.test.js +129 -0
- package/dist/__tests__/fields/component-block.test.js.map +1 -0
- package/dist/__tests__/seo/config-store.test.d.ts +2 -0
- package/dist/__tests__/seo/config-store.test.d.ts.map +1 -0
- package/dist/__tests__/seo/config-store.test.js +167 -0
- package/dist/__tests__/seo/config-store.test.js.map +1 -0
- package/dist/api/handler-factory.d.ts.map +1 -1
- package/dist/api/handler-factory.js +4 -0
- package/dist/api/handler-factory.js.map +1 -1
- package/dist/api/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +566 -21
- package/dist/api/handlers.js.map +1 -1
- package/dist/config/types.d.ts +61 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/fields/component-block.d.ts +23 -0
- package/dist/fields/component-block.d.ts.map +1 -0
- package/dist/fields/component-block.js +137 -0
- package/dist/fields/component-block.js.map +1 -0
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +2 -0
- package/dist/fields/index.js.map +1 -1
- package/dist/seo/config-store.d.ts +61 -0
- package/dist/seo/config-store.d.ts.map +1 -0
- package/dist/seo/config-store.js +158 -0
- package/dist/seo/config-store.js.map +1 -0
- package/dist/seo/index.d.ts +2 -0
- package/dist/seo/index.d.ts.map +1 -1
- package/dist/seo/index.js +1 -0
- package/dist/seo/index.js.map +1 -1
- package/package.json +1 -1
- package/prisma/cms-schema.prisma +306 -306
- package/prisma/migrations/0001_init/migration.sql +384 -384
- package/prisma/migrations/0002_folders/migration.sql +39 -39
- package/prisma/migrations/0003_search_and_webhooks/migration.sql +50 -50
- package/prisma/migrations/0004_script_tags/migration.sql +21 -21
- package/prisma/migrations/0005_password_reset_tokens/migration.sql +20 -20
- package/prisma/migrations/0006_page_builder/migration.sql +38 -38
- package/prisma/migrations/migration_lock.toml +3 -3
- package/prisma/schema.prisma +549 -549
- package/generated/browser.ts +0 -109
- package/generated/client.ts +0 -133
- package/generated/commonInputTypes.ts +0 -709
- package/generated/enums.ts +0 -125
- package/generated/internal/class.ts +0 -376
- package/generated/internal/prismaNamespace.ts +0 -2617
- package/generated/internal/prismaNamespaceBrowser.ts +0 -611
- package/generated/models/ApiKey.ts +0 -1550
- package/generated/models/AuditLog.ts +0 -1206
- package/generated/models/BackupRecord.ts +0 -1250
- package/generated/models/ContentLock.ts +0 -1472
- package/generated/models/ContentTemplate.ts +0 -1416
- package/generated/models/Document.ts +0 -3005
- package/generated/models/Folder.ts +0 -1904
- package/generated/models/FormSubmission.ts +0 -1200
- package/generated/models/InAppNotification.ts +0 -1457
- package/generated/models/Media.ts +0 -2340
- package/generated/models/MediaUsage.ts +0 -1472
- package/generated/models/OAuthAccount.ts +0 -1463
- package/generated/models/Redirect.ts +0 -1284
- package/generated/models/Session.ts +0 -1492
- package/generated/models/Site.ts +0 -1206
- package/generated/models/User.ts +0 -3513
- package/generated/models/Version.ts +0 -1511
- package/generated/models/WorkflowState.ts +0 -1514
- package/generated/models.ts +0 -29
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Actuate Media
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Actuate Media
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"component-block.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fields/component-block.test.ts"],"names":[],"mappings":""}
|