@actuate-media/cms-core 0.7.0 → 0.9.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 (82) hide show
  1. package/dist/api/handlers.d.ts.map +1 -1
  2. package/dist/api/handlers.js +530 -0
  3. package/dist/api/handlers.js.map +1 -1
  4. package/dist/config/types.d.ts +3 -0
  5. package/dist/config/types.d.ts.map +1 -1
  6. package/dist/config/types.js +0 -1
  7. package/dist/config/types.js.map +1 -1
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +2 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/page-builder/__tests__/a11y-fix.test.d.ts +2 -0
  13. package/dist/page-builder/__tests__/a11y-fix.test.d.ts.map +1 -0
  14. package/dist/page-builder/__tests__/a11y-fix.test.js +246 -0
  15. package/dist/page-builder/__tests__/a11y-fix.test.js.map +1 -0
  16. package/dist/page-builder/__tests__/blocks.test.d.ts +2 -0
  17. package/dist/page-builder/__tests__/blocks.test.d.ts.map +1 -0
  18. package/dist/page-builder/__tests__/blocks.test.js +87 -0
  19. package/dist/page-builder/__tests__/blocks.test.js.map +1 -0
  20. package/dist/page-builder/__tests__/design-scorer.test.d.ts +2 -0
  21. package/dist/page-builder/__tests__/design-scorer.test.d.ts.map +1 -0
  22. package/dist/page-builder/__tests__/design-scorer.test.js +268 -0
  23. package/dist/page-builder/__tests__/design-scorer.test.js.map +1 -0
  24. package/dist/page-builder/__tests__/schema.test.d.ts +2 -0
  25. package/dist/page-builder/__tests__/schema.test.d.ts.map +1 -0
  26. package/dist/page-builder/__tests__/schema.test.js +191 -0
  27. package/dist/page-builder/__tests__/schema.test.js.map +1 -0
  28. package/dist/page-builder/__tests__/seo-analyzer.test.d.ts +2 -0
  29. package/dist/page-builder/__tests__/seo-analyzer.test.d.ts.map +1 -0
  30. package/dist/page-builder/__tests__/seo-analyzer.test.js +332 -0
  31. package/dist/page-builder/__tests__/seo-analyzer.test.js.map +1 -0
  32. package/dist/page-builder/__tests__/tree.test.d.ts +2 -0
  33. package/dist/page-builder/__tests__/tree.test.d.ts.map +1 -0
  34. package/dist/page-builder/__tests__/tree.test.js +257 -0
  35. package/dist/page-builder/__tests__/tree.test.js.map +1 -0
  36. package/dist/page-builder/a11y-fix.d.ts +20 -0
  37. package/dist/page-builder/a11y-fix.d.ts.map +1 -0
  38. package/dist/page-builder/a11y-fix.js +182 -0
  39. package/dist/page-builder/a11y-fix.js.map +1 -0
  40. package/dist/page-builder/ai-pipeline.d.ts +43 -0
  41. package/dist/page-builder/ai-pipeline.d.ts.map +1 -0
  42. package/dist/page-builder/ai-pipeline.js +167 -0
  43. package/dist/page-builder/ai-pipeline.js.map +1 -0
  44. package/dist/page-builder/blocks.d.ts +10 -0
  45. package/dist/page-builder/blocks.d.ts.map +1 -0
  46. package/dist/page-builder/blocks.js +252 -0
  47. package/dist/page-builder/blocks.js.map +1 -0
  48. package/dist/page-builder/design-scorer.d.ts +27 -0
  49. package/dist/page-builder/design-scorer.d.ts.map +1 -0
  50. package/dist/page-builder/design-scorer.js +404 -0
  51. package/dist/page-builder/design-scorer.js.map +1 -0
  52. package/dist/page-builder/index.d.ts +18 -0
  53. package/dist/page-builder/index.d.ts.map +1 -0
  54. package/dist/page-builder/index.js +20 -0
  55. package/dist/page-builder/index.js.map +1 -0
  56. package/dist/page-builder/schema.d.ts +107 -0
  57. package/dist/page-builder/schema.d.ts.map +1 -0
  58. package/dist/page-builder/schema.js +90 -0
  59. package/dist/page-builder/schema.js.map +1 -0
  60. package/dist/page-builder/seo-analyzer.d.ts +61 -0
  61. package/dist/page-builder/seo-analyzer.d.ts.map +1 -0
  62. package/dist/page-builder/seo-analyzer.js +582 -0
  63. package/dist/page-builder/seo-analyzer.js.map +1 -0
  64. package/dist/page-builder/templates.d.ts +9 -0
  65. package/dist/page-builder/templates.d.ts.map +1 -0
  66. package/dist/page-builder/templates.js +401 -0
  67. package/dist/page-builder/templates.js.map +1 -0
  68. package/dist/page-builder/tree.d.ts +17 -0
  69. package/dist/page-builder/tree.d.ts.map +1 -0
  70. package/dist/page-builder/tree.js +160 -0
  71. package/dist/page-builder/tree.js.map +1 -0
  72. package/dist/page-builder/types.d.ts +112 -0
  73. package/dist/page-builder/types.d.ts.map +1 -0
  74. package/dist/page-builder/types.js +4 -0
  75. package/dist/page-builder/types.js.map +1 -0
  76. package/dist/page-builder/validate.d.ts +6 -0
  77. package/dist/page-builder/validate.d.ts.map +1 -0
  78. package/dist/page-builder/validate.js +87 -0
  79. package/dist/page-builder/validate.js.map +1 -0
  80. package/package.json +6 -1
  81. package/prisma/migrations/0006_page_builder/migration.sql +38 -0
  82. package/prisma/schema.prisma +31 -0
@@ -0,0 +1,582 @@
1
+ import { hasChildren } from './types.js';
2
+ // ─── Helpers ───────────────────────────────────────────────────────────────
3
+ export function stripHtml(html) {
4
+ return html.replace(/<[^>]*>/g, '').trim();
5
+ }
6
+ export function countWords(text) {
7
+ const trimmed = text.trim();
8
+ if (trimmed.length === 0)
9
+ return 0;
10
+ return trimmed.split(/\s+/).length;
11
+ }
12
+ export function countSentences(text) {
13
+ const matches = text.match(/[.!?]+/g);
14
+ return matches ? matches.length : 1;
15
+ }
16
+ export function countSyllables(word) {
17
+ const w = word.toLowerCase().replace(/[^a-z]/g, '');
18
+ if (w.length <= 2)
19
+ return 1;
20
+ let count = 0;
21
+ let prevVowel = false;
22
+ for (let i = 0; i < w.length; i++) {
23
+ const char = w[i];
24
+ const isVowel = /[aeiouy]/.test(char);
25
+ if (isVowel && !prevVowel) {
26
+ count++;
27
+ }
28
+ prevVowel = isVowel;
29
+ }
30
+ if (w.endsWith('e') && count > 1) {
31
+ count--;
32
+ }
33
+ return Math.max(count, 1);
34
+ }
35
+ function isInternalLink(url) {
36
+ return url.startsWith('/') || url.startsWith('#');
37
+ }
38
+ function extractStringValues(data) {
39
+ const parts = [];
40
+ for (const value of Object.values(data)) {
41
+ if (typeof value === 'string') {
42
+ parts.push(stripHtml(value));
43
+ }
44
+ else if (Array.isArray(value)) {
45
+ for (const item of value) {
46
+ if (typeof item === 'string') {
47
+ parts.push(stripHtml(item));
48
+ }
49
+ else if (item && typeof item === 'object') {
50
+ parts.push(extractStringValues(item));
51
+ }
52
+ }
53
+ }
54
+ else if (value && typeof value === 'object') {
55
+ parts.push(extractStringValues(value));
56
+ }
57
+ }
58
+ return parts.filter(Boolean).join(' ');
59
+ }
60
+ // ─── Content Extractor ─────────────────────────────────────────────────────
61
+ function extractBlockContent(block, content) {
62
+ const { blockType } = block.settings;
63
+ const data = block.data;
64
+ const texts = [];
65
+ switch (blockType) {
66
+ case 'hero': {
67
+ const title = typeof data.title === 'string' ? data.title : '';
68
+ const subtitle = typeof data.subtitle === 'string' ? data.subtitle : '';
69
+ const ctaText = typeof data.ctaText === 'string' ? data.ctaText : '';
70
+ if (title)
71
+ texts.push(title);
72
+ if (subtitle)
73
+ texts.push(subtitle);
74
+ if (ctaText)
75
+ texts.push(ctaText);
76
+ if (title) {
77
+ content.headings.push({ level: 1, text: title, blockId: block.id });
78
+ }
79
+ if (typeof data.image === 'string' && data.image) {
80
+ content.images.push({
81
+ src: data.image,
82
+ alt: typeof data.alt === 'string' ? data.alt : '',
83
+ blockId: block.id,
84
+ });
85
+ }
86
+ if (typeof data.ctaLink === 'string' && data.ctaLink) {
87
+ content.links.push({
88
+ url: data.ctaLink,
89
+ text: ctaText || 'CTA',
90
+ internal: isInternalLink(data.ctaLink),
91
+ blockId: block.id,
92
+ });
93
+ }
94
+ break;
95
+ }
96
+ case 'text': {
97
+ const heading = typeof data.heading === 'string' ? data.heading : '';
98
+ const body = typeof data.body === 'string' ? stripHtml(data.body) : '';
99
+ if (heading)
100
+ texts.push(heading);
101
+ if (body)
102
+ texts.push(body);
103
+ if (heading) {
104
+ const level = typeof data.headingLevel === 'number' ? data.headingLevel : 2;
105
+ content.headings.push({ level, text: heading, blockId: block.id });
106
+ }
107
+ break;
108
+ }
109
+ case 'image': {
110
+ const alt = typeof data.alt === 'string' ? data.alt : '';
111
+ const caption = typeof data.caption === 'string' ? data.caption : '';
112
+ if (alt)
113
+ texts.push(alt);
114
+ if (caption)
115
+ texts.push(caption);
116
+ content.images.push({
117
+ src: typeof data.src === 'string' ? data.src : '',
118
+ alt,
119
+ blockId: block.id,
120
+ });
121
+ if (typeof data.link === 'string' && data.link) {
122
+ content.links.push({
123
+ url: data.link,
124
+ text: alt || caption || 'Image link',
125
+ internal: isInternalLink(data.link),
126
+ blockId: block.id,
127
+ });
128
+ }
129
+ break;
130
+ }
131
+ case 'cards': {
132
+ const items = Array.isArray(data.items) ? data.items : [];
133
+ for (const item of items) {
134
+ if (item && typeof item === 'object') {
135
+ const cardItem = item;
136
+ const title = typeof cardItem.title === 'string' ? cardItem.title : '';
137
+ const desc = typeof cardItem.description === 'string' ? cardItem.description : '';
138
+ if (title)
139
+ texts.push(title);
140
+ if (desc)
141
+ texts.push(stripHtml(desc));
142
+ if (typeof cardItem.link === 'string' && cardItem.link) {
143
+ content.links.push({
144
+ url: cardItem.link,
145
+ text: title || 'Card link',
146
+ internal: isInternalLink(cardItem.link),
147
+ blockId: block.id,
148
+ });
149
+ }
150
+ }
151
+ }
152
+ break;
153
+ }
154
+ case 'cta': {
155
+ const heading = typeof data.heading === 'string' ? data.heading : '';
156
+ const body = typeof data.body === 'string' ? stripHtml(data.body) : '';
157
+ const buttonText = typeof data.buttonText === 'string' ? data.buttonText : '';
158
+ if (heading)
159
+ texts.push(heading);
160
+ if (body)
161
+ texts.push(body);
162
+ if (buttonText)
163
+ texts.push(buttonText);
164
+ if (typeof data.buttonLink === 'string' && data.buttonLink) {
165
+ content.links.push({
166
+ url: data.buttonLink,
167
+ text: buttonText || 'Button',
168
+ internal: isInternalLink(data.buttonLink),
169
+ blockId: block.id,
170
+ });
171
+ }
172
+ break;
173
+ }
174
+ case 'video': {
175
+ for (const value of Object.values(data)) {
176
+ if (typeof value === 'string' && value) {
177
+ texts.push(value);
178
+ }
179
+ }
180
+ break;
181
+ }
182
+ case 'gallery': {
183
+ const images = Array.isArray(data.images) ? data.images : [];
184
+ for (const img of images) {
185
+ if (img && typeof img === 'object') {
186
+ const imgItem = img;
187
+ const alt = typeof imgItem.alt === 'string' ? imgItem.alt : '';
188
+ const caption = typeof imgItem.caption === 'string' ? imgItem.caption : '';
189
+ if (alt)
190
+ texts.push(alt);
191
+ if (caption)
192
+ texts.push(caption);
193
+ content.images.push({
194
+ src: typeof imgItem.src === 'string' ? imgItem.src : '',
195
+ alt,
196
+ blockId: block.id,
197
+ });
198
+ }
199
+ }
200
+ break;
201
+ }
202
+ case 'faq': {
203
+ const items = Array.isArray(data.items) ? data.items : [];
204
+ for (const item of items) {
205
+ if (item && typeof item === 'object') {
206
+ const faqItem = item;
207
+ const question = typeof faqItem.question === 'string' ? faqItem.question : '';
208
+ const answer = typeof faqItem.answer === 'string' ? stripHtml(faqItem.answer) : '';
209
+ if (question)
210
+ texts.push(question);
211
+ if (answer)
212
+ texts.push(answer);
213
+ }
214
+ }
215
+ break;
216
+ }
217
+ case 'form': {
218
+ const msg = typeof data.successMessage === 'string' ? data.successMessage : '';
219
+ if (msg)
220
+ texts.push(msg);
221
+ break;
222
+ }
223
+ case 'code':
224
+ break;
225
+ default: {
226
+ texts.push(extractStringValues(data));
227
+ break;
228
+ }
229
+ }
230
+ const blockText = texts.filter(Boolean).join(' ');
231
+ if (blockText) {
232
+ content.blockTexts.set(block.id, blockText);
233
+ }
234
+ }
235
+ function traverseTree(node, content) {
236
+ if (node.type === 'block') {
237
+ extractBlockContent(node, content);
238
+ return;
239
+ }
240
+ if (hasChildren(node)) {
241
+ for (const child of node.children) {
242
+ traverseTree(child, content);
243
+ }
244
+ }
245
+ }
246
+ export function extractContent(tree) {
247
+ const content = {
248
+ plainText: '',
249
+ wordCount: 0,
250
+ headings: [],
251
+ images: [],
252
+ links: [],
253
+ blockTexts: new Map(),
254
+ };
255
+ traverseTree(tree, content);
256
+ const allTexts = [];
257
+ for (const text of content.blockTexts.values()) {
258
+ allTexts.push(text);
259
+ }
260
+ content.plainText = allTexts.join(' ');
261
+ content.wordCount = countWords(content.plainText);
262
+ return content;
263
+ }
264
+ // ─── Readability Analyzer ──────────────────────────────────────────────────
265
+ export function analyzeReadability(text) {
266
+ const words = text.trim().split(/\s+/).filter(Boolean);
267
+ const wordCount = words.length;
268
+ if (wordCount === 0) {
269
+ return {
270
+ fleschScore: 0,
271
+ avgSentenceLength: 0,
272
+ wordCount: 0,
273
+ readingTime: 0,
274
+ passiveEstimate: 0,
275
+ };
276
+ }
277
+ const sentenceCount = countSentences(text);
278
+ const avgSentenceLength = wordCount / sentenceCount;
279
+ let totalSyllables = 0;
280
+ for (const word of words) {
281
+ totalSyllables += countSyllables(word);
282
+ }
283
+ const fleschScore = Math.max(0, Math.min(100, 206.835 - 1.015 * avgSentenceLength - 84.6 * (totalSyllables / wordCount)));
284
+ const readingTime = Math.ceil(wordCount / 200);
285
+ const passivePattern = /\b(is|are|was|were|been|being|be)\s+\w+ed\b/gi;
286
+ const passiveMatches = text.match(passivePattern);
287
+ const passiveCount = passiveMatches ? passiveMatches.length : 0;
288
+ const passiveEstimate = sentenceCount > 0
289
+ ? Math.round((passiveCount / sentenceCount) * 100)
290
+ : 0;
291
+ return {
292
+ fleschScore: Math.round(fleschScore * 10) / 10,
293
+ avgSentenceLength: Math.round(avgSentenceLength * 10) / 10,
294
+ wordCount,
295
+ readingTime,
296
+ passiveEstimate: Math.min(passiveEstimate, 100),
297
+ };
298
+ }
299
+ // ─── SEO Checker ───────────────────────────────────────────────────────────
300
+ function keyphraseInText(text, keyphrase) {
301
+ return text.toLowerCase().includes(keyphrase.toLowerCase());
302
+ }
303
+ function keyphraseCount(text, keyphrase) {
304
+ const lower = text.toLowerCase();
305
+ const kp = keyphrase.toLowerCase();
306
+ let count = 0;
307
+ let idx = 0;
308
+ while ((idx = lower.indexOf(kp, idx)) !== -1) {
309
+ count++;
310
+ idx += kp.length;
311
+ }
312
+ return count;
313
+ }
314
+ function getFirstParagraph(content) {
315
+ for (const text of content.blockTexts.values()) {
316
+ if (text.trim().length > 0)
317
+ return text;
318
+ }
319
+ return '';
320
+ }
321
+ export function analyzeSEO(tree, pageSettings) {
322
+ const content = extractContent(tree);
323
+ const readability = analyzeReadability(content.plainText);
324
+ const checks = [];
325
+ const perBlockHints = new Map();
326
+ const kp = pageSettings.focusKeyphrase || '';
327
+ const metaTitle = pageSettings.metaTitle || pageSettings.title || '';
328
+ const metaDesc = pageSettings.metaDescription || '';
329
+ // ── Page-level checks ───────────────────────────────────────────────────
330
+ if (metaTitle.length === 0) {
331
+ checks.push({ id: 'meta-title-exists', label: 'Meta title', status: 'error', detail: 'Meta title is missing' });
332
+ }
333
+ else if (metaTitle.length < 30 || metaTitle.length > 60) {
334
+ checks.push({ id: 'meta-title-length', label: 'Meta title length', status: 'warning', detail: `Meta title is ${metaTitle.length} chars (recommended: 30-60)` });
335
+ }
336
+ else {
337
+ checks.push({ id: 'meta-title-length', label: 'Meta title length', status: 'good', detail: `Meta title is ${metaTitle.length} chars` });
338
+ }
339
+ if (metaDesc.length === 0) {
340
+ checks.push({ id: 'meta-desc-exists', label: 'Meta description', status: 'error', detail: 'Meta description is missing' });
341
+ }
342
+ else if (metaDesc.length < 120 || metaDesc.length > 160) {
343
+ checks.push({ id: 'meta-desc-length', label: 'Meta description length', status: 'warning', detail: `Meta description is ${metaDesc.length} chars (recommended: 120-160)` });
344
+ }
345
+ else {
346
+ checks.push({ id: 'meta-desc-length', label: 'Meta description length', status: 'good', detail: `Meta description is ${metaDesc.length} chars` });
347
+ }
348
+ if (!kp) {
349
+ checks.push({ id: 'keyphrase-set', label: 'Focus keyphrase', status: 'warning', detail: 'No focus keyphrase set' });
350
+ }
351
+ else {
352
+ checks.push({ id: 'keyphrase-set', label: 'Focus keyphrase', status: 'good', detail: `Focus keyphrase: "${kp}"` });
353
+ if (keyphraseInText(metaTitle, kp)) {
354
+ checks.push({ id: 'keyphrase-in-title', label: 'Keyphrase in title', status: 'good', detail: 'Focus keyphrase found in meta title' });
355
+ }
356
+ else {
357
+ checks.push({ id: 'keyphrase-in-title', label: 'Keyphrase in title', status: 'warning', detail: 'Focus keyphrase not found in meta title' });
358
+ }
359
+ if (keyphraseInText(metaDesc, kp)) {
360
+ checks.push({ id: 'keyphrase-in-desc', label: 'Keyphrase in description', status: 'good', detail: 'Focus keyphrase found in meta description' });
361
+ }
362
+ else {
363
+ checks.push({ id: 'keyphrase-in-desc', label: 'Keyphrase in description', status: 'warning', detail: 'Focus keyphrase not found in meta description' });
364
+ }
365
+ if (keyphraseInText(pageSettings.slug, kp)) {
366
+ checks.push({ id: 'keyphrase-in-slug', label: 'Keyphrase in slug', status: 'good', detail: 'Focus keyphrase found in URL slug' });
367
+ }
368
+ else {
369
+ checks.push({ id: 'keyphrase-in-slug', label: 'Keyphrase in slug', status: 'warning', detail: 'Focus keyphrase not found in URL slug' });
370
+ }
371
+ const firstPara = getFirstParagraph(content);
372
+ if (keyphraseInText(firstPara, kp)) {
373
+ checks.push({ id: 'keyphrase-in-intro', label: 'Keyphrase in introduction', status: 'good', detail: 'Focus keyphrase found in first paragraph' });
374
+ }
375
+ else {
376
+ checks.push({ id: 'keyphrase-in-intro', label: 'Keyphrase in introduction', status: 'warning', detail: 'Focus keyphrase not found in first paragraph' });
377
+ }
378
+ const kpCount = keyphraseCount(content.plainText, kp);
379
+ const density = content.wordCount > 0
380
+ ? (kpCount * countWords(kp)) / content.wordCount * 100
381
+ : 0;
382
+ if (density >= 0.5 && density <= 3) {
383
+ checks.push({ id: 'keyphrase-density', label: 'Keyphrase density', status: 'good', detail: `Keyphrase density is ${density.toFixed(1)}%` });
384
+ }
385
+ else if (density === 0) {
386
+ checks.push({ id: 'keyphrase-density', label: 'Keyphrase density', status: 'error', detail: 'Keyphrase not found in content' });
387
+ }
388
+ else {
389
+ checks.push({ id: 'keyphrase-density', label: 'Keyphrase density', status: 'warning', detail: `Keyphrase density is ${density.toFixed(1)}% (recommended: 0.5-3%)` });
390
+ }
391
+ }
392
+ if (content.wordCount >= 300) {
393
+ checks.push({ id: 'content-length', label: 'Content length', status: 'good', detail: `${content.wordCount} words` });
394
+ }
395
+ else {
396
+ checks.push({ id: 'content-length', label: 'Content length', status: 'warning', detail: `Only ${content.wordCount} words (recommended: 300+)` });
397
+ }
398
+ if (pageSettings.ogImage) {
399
+ checks.push({ id: 'og-image', label: 'Open Graph image', status: 'good', detail: 'OG image is set' });
400
+ }
401
+ else {
402
+ checks.push({ id: 'og-image', label: 'Open Graph image', status: 'warning', detail: 'No OG image set' });
403
+ }
404
+ if (pageSettings.schemaType) {
405
+ checks.push({ id: 'schema-type', label: 'Schema type', status: 'good', detail: `Schema type: ${pageSettings.schemaType}` });
406
+ }
407
+ else {
408
+ checks.push({ id: 'schema-type', label: 'Schema type', status: 'warning', detail: 'No schema type set' });
409
+ }
410
+ // ── Heading structure ───────────────────────────────────────────────────
411
+ const h1Count = content.headings.filter(h => h.level === 1).length;
412
+ if (h1Count === 0) {
413
+ checks.push({ id: 'h1-exists', label: 'H1 heading', status: 'error', detail: 'No H1 heading found' });
414
+ }
415
+ else if (h1Count === 1) {
416
+ checks.push({ id: 'h1-exists', label: 'H1 heading', status: 'good', detail: 'Single H1 heading found' });
417
+ }
418
+ else {
419
+ checks.push({ id: 'h1-exists', label: 'H1 heading', status: 'warning', detail: `Multiple H1 headings found (${h1Count})` });
420
+ }
421
+ let hierarchyGood = true;
422
+ const sortedHeadings = [...content.headings];
423
+ for (let i = 1; i < sortedHeadings.length; i++) {
424
+ const prev = sortedHeadings[i - 1];
425
+ const curr = sortedHeadings[i];
426
+ if (prev && curr && curr.level > prev.level + 1) {
427
+ hierarchyGood = false;
428
+ break;
429
+ }
430
+ }
431
+ if (hierarchyGood) {
432
+ checks.push({ id: 'heading-hierarchy', label: 'Heading hierarchy', status: 'good', detail: 'Heading levels follow a logical order' });
433
+ }
434
+ else {
435
+ checks.push({ id: 'heading-hierarchy', label: 'Heading hierarchy', status: 'warning', detail: 'Heading hierarchy skips levels' });
436
+ }
437
+ if (kp && content.headings.some(h => keyphraseInText(h.text, kp))) {
438
+ checks.push({ id: 'keyphrase-in-heading', label: 'Keyphrase in heading', status: 'good', detail: 'Focus keyphrase found in a heading' });
439
+ }
440
+ else if (kp) {
441
+ checks.push({ id: 'keyphrase-in-heading', label: 'Keyphrase in heading', status: 'warning', detail: 'Focus keyphrase not found in any heading' });
442
+ }
443
+ // ── Image checks ────────────────────────────────────────────────────────
444
+ const imagesWithoutAlt = content.images.filter(img => !img.alt);
445
+ if (imagesWithoutAlt.length === 0 && content.images.length > 0) {
446
+ checks.push({ id: 'images-alt', label: 'Image alt text', status: 'good', detail: 'All images have alt text' });
447
+ }
448
+ else if (imagesWithoutAlt.length > 0) {
449
+ checks.push({ id: 'images-alt', label: 'Image alt text', status: 'error', detail: `${imagesWithoutAlt.length} image(s) missing alt text` });
450
+ }
451
+ if (kp && content.images.some(img => keyphraseInText(img.alt, kp))) {
452
+ checks.push({ id: 'keyphrase-in-alt', label: 'Keyphrase in image alt', status: 'good', detail: 'Focus keyphrase found in at least one image alt text' });
453
+ }
454
+ else if (kp && content.images.length > 0) {
455
+ checks.push({ id: 'keyphrase-in-alt', label: 'Keyphrase in image alt', status: 'warning', detail: 'Focus keyphrase not found in any image alt text' });
456
+ }
457
+ // ── Link checks ─────────────────────────────────────────────────────────
458
+ const internalLinks = content.links.filter(l => l.internal);
459
+ const externalLinks = content.links.filter(l => !l.internal);
460
+ if (internalLinks.length > 0) {
461
+ checks.push({ id: 'internal-links', label: 'Internal links', status: 'good', detail: `${internalLinks.length} internal link(s)` });
462
+ }
463
+ else {
464
+ checks.push({ id: 'internal-links', label: 'Internal links', status: 'warning', detail: 'No internal links found' });
465
+ }
466
+ if (externalLinks.length > 0) {
467
+ checks.push({ id: 'external-links', label: 'External links', status: 'good', detail: `${externalLinks.length} external link(s)` });
468
+ }
469
+ else {
470
+ checks.push({ id: 'external-links', label: 'External links', status: 'warning', detail: 'No external links found' });
471
+ }
472
+ // ── Per-block hints ─────────────────────────────────────────────────────
473
+ for (const img of content.images) {
474
+ if (!img.alt) {
475
+ addBlockHint(perBlockHints, img.blockId, {
476
+ id: 'block-missing-alt',
477
+ label: 'Missing alt text',
478
+ status: 'error',
479
+ detail: 'Missing alt text',
480
+ blockId: img.blockId,
481
+ });
482
+ }
483
+ else if (kp && !keyphraseInText(img.alt, kp)) {
484
+ addBlockHint(perBlockHints, img.blockId, {
485
+ id: 'block-alt-no-keyphrase',
486
+ label: 'Alt text keyphrase',
487
+ status: 'warning',
488
+ detail: "Alt text doesn't contain focus keyphrase",
489
+ blockId: img.blockId,
490
+ });
491
+ }
492
+ }
493
+ for (const [blockId, blockText] of content.blockTexts) {
494
+ if (kp) {
495
+ const heading = content.headings.find(h => h.blockId === blockId && h.level === 1);
496
+ if (heading && !keyphraseInText(heading.text, kp)) {
497
+ addBlockHint(perBlockHints, blockId, {
498
+ id: 'block-hero-no-keyphrase',
499
+ label: 'Title keyphrase',
500
+ status: 'warning',
501
+ detail: "Title doesn't contain focus keyphrase",
502
+ blockId,
503
+ });
504
+ }
505
+ }
506
+ if (countWords(blockText) > 300) {
507
+ addBlockHint(perBlockHints, blockId, {
508
+ id: 'block-paragraph-long',
509
+ label: 'Paragraph length',
510
+ status: 'warning',
511
+ detail: 'Paragraph too long',
512
+ blockId,
513
+ });
514
+ }
515
+ }
516
+ // Check for text blocks without headings
517
+ traverseForTextBlockHints(tree, content, perBlockHints);
518
+ // Check for video blocks without poster
519
+ traverseForVideoHints(tree, perBlockHints);
520
+ // ── Score calculation ───────────────────────────────────────────────────
521
+ let totalScore = 0;
522
+ for (const check of checks) {
523
+ if (check.status === 'good')
524
+ totalScore += 100;
525
+ else if (check.status === 'warning')
526
+ totalScore += 50;
527
+ }
528
+ const score = checks.length > 0 ? Math.round(totalScore / checks.length) : 0;
529
+ return { score, checks, readability, content, perBlockHints };
530
+ }
531
+ // ─── Internal Utilities ────────────────────────────────────────────────────
532
+ function addBlockHint(map, blockId, hint) {
533
+ const existing = map.get(blockId);
534
+ if (existing) {
535
+ existing.push(hint);
536
+ }
537
+ else {
538
+ map.set(blockId, [hint]);
539
+ }
540
+ }
541
+ function traverseForTextBlockHints(node, content, perBlockHints) {
542
+ if (node.type === 'block') {
543
+ if (node.settings.blockType === 'text') {
544
+ const hasHeading = content.headings.some(h => h.blockId === node.id);
545
+ if (!hasHeading) {
546
+ addBlockHint(perBlockHints, node.id, {
547
+ id: 'block-no-heading',
548
+ label: 'Section heading',
549
+ status: 'warning',
550
+ detail: 'No heading in this section',
551
+ blockId: node.id,
552
+ });
553
+ }
554
+ }
555
+ return;
556
+ }
557
+ if (hasChildren(node)) {
558
+ for (const child of node.children) {
559
+ traverseForTextBlockHints(child, content, perBlockHints);
560
+ }
561
+ }
562
+ }
563
+ function traverseForVideoHints(node, perBlockHints) {
564
+ if (node.type === 'block') {
565
+ if (node.settings.blockType === 'video' && !node.data.poster) {
566
+ addBlockHint(perBlockHints, node.id, {
567
+ id: 'block-video-no-poster',
568
+ label: 'Video poster',
569
+ status: 'warning',
570
+ detail: 'No poster image set',
571
+ blockId: node.id,
572
+ });
573
+ }
574
+ return;
575
+ }
576
+ if (hasChildren(node)) {
577
+ for (const child of node.children) {
578
+ traverseForVideoHints(child, perBlockHints);
579
+ }
580
+ }
581
+ }
582
+ //# sourceMappingURL=seo-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-analyzer.js","sourceRoot":"","sources":["../../src/page-builder/seo-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { PageNode } from './types.js';
2
+ export interface BuiltInTemplate {
3
+ name: string;
4
+ description: string;
5
+ category: 'landing' | 'content' | 'utility';
6
+ tree: PageNode;
7
+ }
8
+ export declare const BUILT_IN_TEMPLATES: Record<string, BuiltInTemplate>;
9
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/page-builder/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA8D,MAAM,YAAY,CAAA;AAEtG,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;IAC3C,IAAI,EAAE,QAAQ,CAAA;CACf;AA8XD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAqC9D,CAAA"}