@prenta/core 1.1.1 → 2.2.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 (109) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/api/handlers.d.ts.map +1 -1
  3. package/dist/api/handlers.js +0 -2
  4. package/dist/api/handlers.js.map +1 -1
  5. package/dist/api/routes/media.d.ts.map +1 -1
  6. package/dist/api/routes/media.js +73 -104
  7. package/dist/api/routes/media.js.map +1 -1
  8. package/dist/api/routes/saved-sections.d.ts.map +1 -1
  9. package/dist/api/routes/saved-sections.js +20 -300
  10. package/dist/api/routes/saved-sections.js.map +1 -1
  11. package/dist/appearance/resolve.js +1 -1
  12. package/dist/appearance/resolve.js.map +1 -1
  13. package/dist/collections/presets.d.ts +2 -2
  14. package/dist/collections/presets.js +2 -2
  15. package/dist/config/runtime.d.ts +1 -2
  16. package/dist/config/runtime.d.ts.map +1 -1
  17. package/dist/config/runtime.js.map +1 -1
  18. package/dist/config/types.d.ts +0 -3
  19. package/dist/config/types.d.ts.map +1 -1
  20. package/dist/db/model-types.d.ts +67 -26
  21. package/dist/db/model-types.d.ts.map +1 -1
  22. package/dist/generated/browser.d.ts +16 -0
  23. package/dist/generated/client.d.ts +16 -0
  24. package/dist/generated/commonInputTypes.d.ts +30 -0
  25. package/dist/generated/internal/class.d.ts +33 -0
  26. package/dist/generated/internal/class.js +4 -4
  27. package/dist/generated/internal/prismaNamespace.d.ts +294 -1
  28. package/dist/generated/internal/prismaNamespace.js +55 -1
  29. package/dist/generated/internal/prismaNamespaceBrowser.d.ts +60 -0
  30. package/dist/generated/internal/prismaNamespaceBrowser.js +55 -1
  31. package/dist/generated/models/DocumentCRDT.d.ts +1110 -0
  32. package/dist/generated/models/DocumentCRDT.js +1 -0
  33. package/dist/generated/models/DocumentComment.d.ts +1722 -0
  34. package/dist/generated/models/DocumentComment.js +1 -0
  35. package/dist/generated/models/DocumentNotification.d.ts +1289 -0
  36. package/dist/generated/models/DocumentNotification.js +1 -0
  37. package/dist/generated/models/User.d.ts +552 -0
  38. package/dist/generated/models.d.ts +3 -0
  39. package/dist/index.d.ts +4 -2
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +3 -2
  42. package/dist/index.js.map +1 -1
  43. package/dist/media/index.d.ts +2 -0
  44. package/dist/media/index.d.ts.map +1 -1
  45. package/dist/media/index.js +1 -0
  46. package/dist/media/index.js.map +1 -1
  47. package/dist/media/optimize.d.ts.map +1 -1
  48. package/dist/media/optimize.js +19 -12
  49. package/dist/media/optimize.js.map +1 -1
  50. package/dist/media/reoptimize.d.ts +61 -0
  51. package/dist/media/reoptimize.d.ts.map +1 -0
  52. package/dist/media/reoptimize.js +371 -0
  53. package/dist/media/reoptimize.js.map +1 -0
  54. package/dist/sections/index.d.ts +1 -2
  55. package/dist/sections/index.d.ts.map +1 -1
  56. package/dist/sections/index.js +1 -2
  57. package/dist/sections/index.js.map +1 -1
  58. package/dist/sections/types.d.ts +2 -3
  59. package/dist/sections/types.d.ts.map +1 -1
  60. package/dist/sections/types.js +2 -3
  61. package/dist/sections/types.js.map +1 -1
  62. package/dist/security/api-key-enhanced.d.ts +2 -2
  63. package/package.json +1 -6
  64. package/prisma/migrations/0013_document_collab_models/migration.sql +68 -0
  65. package/prisma/schema.prisma +66 -5
  66. package/dist/api/routes/page-templates.d.ts +0 -3
  67. package/dist/api/routes/page-templates.d.ts.map +0 -1
  68. package/dist/api/routes/page-templates.js +0 -265
  69. package/dist/api/routes/page-templates.js.map +0 -1
  70. package/dist/page-builder/a11y-fix.d.ts +0 -20
  71. package/dist/page-builder/a11y-fix.d.ts.map +0 -1
  72. package/dist/page-builder/a11y-fix.js +0 -182
  73. package/dist/page-builder/a11y-fix.js.map +0 -1
  74. package/dist/page-builder/ai-pipeline.d.ts +0 -43
  75. package/dist/page-builder/ai-pipeline.d.ts.map +0 -1
  76. package/dist/page-builder/ai-pipeline.js +0 -165
  77. package/dist/page-builder/ai-pipeline.js.map +0 -1
  78. package/dist/page-builder/blocks.d.ts +0 -27
  79. package/dist/page-builder/blocks.d.ts.map +0 -1
  80. package/dist/page-builder/blocks.js +0 -313
  81. package/dist/page-builder/blocks.js.map +0 -1
  82. package/dist/page-builder/design-scorer.d.ts +0 -27
  83. package/dist/page-builder/design-scorer.d.ts.map +0 -1
  84. package/dist/page-builder/design-scorer.js +0 -612
  85. package/dist/page-builder/design-scorer.js.map +0 -1
  86. package/dist/page-builder/index.d.ts +0 -16
  87. package/dist/page-builder/index.d.ts.map +0 -1
  88. package/dist/page-builder/index.js +0 -18
  89. package/dist/page-builder/index.js.map +0 -1
  90. package/dist/page-builder/schema.d.ts +0 -107
  91. package/dist/page-builder/schema.d.ts.map +0 -1
  92. package/dist/page-builder/schema.js +0 -90
  93. package/dist/page-builder/schema.js.map +0 -1
  94. package/dist/page-builder/templates.d.ts +0 -9
  95. package/dist/page-builder/templates.d.ts.map +0 -1
  96. package/dist/page-builder/templates.js +0 -742
  97. package/dist/page-builder/templates.js.map +0 -1
  98. package/dist/page-builder/tree.d.ts +0 -17
  99. package/dist/page-builder/tree.d.ts.map +0 -1
  100. package/dist/page-builder/tree.js +0 -160
  101. package/dist/page-builder/tree.js.map +0 -1
  102. package/dist/page-builder/types.d.ts +0 -112
  103. package/dist/page-builder/types.d.ts.map +0 -1
  104. package/dist/page-builder/types.js +0 -4
  105. package/dist/page-builder/types.js.map +0 -1
  106. package/dist/page-builder/validate.d.ts +0 -6
  107. package/dist/page-builder/validate.d.ts.map +0 -1
  108. package/dist/page-builder/validate.js +0 -87
  109. package/dist/page-builder/validate.js.map +0 -1
@@ -125,11 +125,13 @@ model User {
125
125
  updatedDocuments Document[] @relation("UpdatedDocuments")
126
126
  versions Version[]
127
127
  media Media[]
128
- contentLocks ContentLock[]
129
- notifications InAppNotification[]
130
- contentTemplates ContentTemplate[]
131
- workflowAssigned WorkflowState[]
132
- passwordResetTokens PasswordResetToken[]
128
+ contentLocks ContentLock[]
129
+ notifications InAppNotification[]
130
+ contentTemplates ContentTemplate[]
131
+ workflowAssigned WorkflowState[]
132
+ passwordResetTokens PasswordResetToken[]
133
+ documentComments DocumentComment[]
134
+ documentNotifications DocumentNotification[]
133
135
 
134
136
  @@map("prenta_users")
135
137
  }
@@ -993,3 +995,62 @@ model ContentIssue {
993
995
  @@index([documentId])
994
996
  @@map("prenta_content_issues")
995
997
  }
998
+
999
+ /// Persisted Yjs state for a document (`@prenta/realtime`). Optional: empty
1000
+ /// when collaboration is unused. Cms-core queries this from `/realtime/sync`.
1001
+ model DocumentCRDT {
1002
+ documentId String @id
1003
+ state Bytes
1004
+ stateVector Bytes
1005
+ version Int @default(0)
1006
+ lastUpdatedAt DateTime @default(now()) @updatedAt
1007
+ lastUpdatedById String?
1008
+ createdAt DateTime @default(now())
1009
+
1010
+ @@index([lastUpdatedAt])
1011
+ @@map("prenta_document_crdts")
1012
+ }
1013
+
1014
+ /// Threaded inline comment. Soft-deletes keep replies attached. Optional.
1015
+ model DocumentComment {
1016
+ id String @id @default(cuid())
1017
+ documentId String
1018
+ parentId String?
1019
+ parent DocumentComment? @relation("CommentThread", fields: [parentId], references: [id], onDelete: Cascade)
1020
+ replies DocumentComment[] @relation("CommentThread")
1021
+ userId String?
1022
+ user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
1023
+ body String @db.Text
1024
+ anchor Json?
1025
+ resolvedAt DateTime?
1026
+ resolvedById String?
1027
+ deletedAt DateTime?
1028
+ createdAt DateTime @default(now())
1029
+ updatedAt DateTime @updatedAt
1030
+
1031
+ @@index([documentId])
1032
+ @@index([documentId, resolvedAt])
1033
+ @@index([parentId])
1034
+ @@index([userId])
1035
+ @@index([createdAt])
1036
+ @@map("prenta_document_comments")
1037
+ }
1038
+
1039
+ /// Per-user notification feed for collaboration events.
1040
+ model DocumentNotification {
1041
+ id String @id @default(cuid())
1042
+ userId String
1043
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
1044
+ kind String
1045
+ documentId String?
1046
+ commentId String?
1047
+ payload Json
1048
+ readAt DateTime?
1049
+ createdAt DateTime @default(now())
1050
+
1051
+ @@index([userId, readAt])
1052
+ @@index([userId, createdAt])
1053
+ @@index([documentId])
1054
+ @@index([commentId])
1055
+ @@map("prenta_document_notifications")
1056
+ }
@@ -1,3 +0,0 @@
1
- import type { ApiRouter } from '../router.js';
2
- export declare function registerPageTemplateRoutes(router: ApiRouter): void;
3
- //# sourceMappingURL=page-templates.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-templates.d.ts","sourceRoot":"","sources":["../../../src/api/routes/page-templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAiB7C,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwQlE"}
@@ -1,265 +0,0 @@
1
- import { logEvent } from '../../security/audit.js';
2
- import { BUILT_IN_TEMPLATES } from '../../page-builder/templates.js';
3
- import { validateTree } from '../../page-builder/validate.js';
4
- import { guardedDb } from '../guarded-db.js';
5
- import { json, errorResponse, internalError, hasModel, modelNotAvailable, safeCount, requireAuth, ADMIN_ROLES, requireRole, } from '../route-helpers.js';
6
- export function registerPageTemplateRoutes(router) {
7
- const db = guardedDb;
8
- // ---------------------------------------------------------------------------
9
- // Page Templates
10
- // ---------------------------------------------------------------------------
11
- async function seedBuiltInTemplates(d) {
12
- for (const [key, template] of Object.entries(BUILT_IN_TEMPLATES)) {
13
- await d.pageTemplate.upsert({
14
- where: { id: `builtin-${key}` },
15
- create: {
16
- id: `builtin-${key}`,
17
- name: template.name,
18
- description: template.description,
19
- category: template.category,
20
- tree: template.tree,
21
- builtIn: true,
22
- },
23
- update: {
24
- name: template.name,
25
- description: template.description,
26
- category: template.category,
27
- tree: template.tree,
28
- },
29
- });
30
- }
31
- }
32
- router.get('/page-templates', async (request) => {
33
- try {
34
- const auth = await requireAuth(request);
35
- if (auth.error)
36
- return auth.error;
37
- const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
38
- if (roleErr)
39
- return roleErr;
40
- const d = db();
41
- if (!hasModel(d, 'pageTemplate'))
42
- return modelNotAvailable('PageTemplate');
43
- const url = new URL(request.url, 'http://localhost');
44
- const category = url.searchParams.get('category');
45
- const collection = url.searchParams.get('collection');
46
- const builtInCount = await safeCount(d.pageTemplate, { builtIn: true });
47
- if (builtInCount === 0) {
48
- await seedBuiltInTemplates(d);
49
- }
50
- const where = {};
51
- if (category)
52
- where.category = category;
53
- const templates = await d.pageTemplate.findMany({
54
- where,
55
- orderBy: [{ builtIn: 'desc' }, { updatedAt: 'desc' }],
56
- });
57
- // When a `collection` filter is supplied, reorder the response so the
58
- // suggested templates for that collection bubble to the top. The admin
59
- // "Create new" picker uses this so blog posts default to `blog-post`,
60
- // case studies to `case-study`, etc., without forcing the user to scan
61
- // every template alphabetically.
62
- if (collection) {
63
- const { getTemplatesForCollection } = await import('../../collections/presets.js');
64
- const { primary, alternates } = getTemplatesForCollection(collection);
65
- const suggestionOrder = new Map();
66
- if (primary)
67
- suggestionOrder.set(`builtin-${primary}`, 0);
68
- alternates.forEach((alt, i) => suggestionOrder.set(`builtin-${alt}`, i + 1));
69
- templates.sort((a, b) => {
70
- const ai = suggestionOrder.has(a.id) ? suggestionOrder.get(a.id) : 100;
71
- const bi = suggestionOrder.has(b.id) ? suggestionOrder.get(b.id) : 100;
72
- return ai - bi;
73
- });
74
- const annotated = templates.map((t) => ({
75
- ...t,
76
- suggested: suggestionOrder.has(t.id),
77
- suggestionRank: suggestionOrder.get(t.id) ?? null,
78
- }));
79
- return json({
80
- data: annotated,
81
- suggestion: {
82
- collection,
83
- primary: primary ? `builtin-${primary}` : null,
84
- alternates: alternates.map((a) => `builtin-${a}`),
85
- },
86
- });
87
- }
88
- return json({ data: templates });
89
- }
90
- catch (err) {
91
- return internalError(err, 'page-templates list');
92
- }
93
- });
94
- router.get('/page-templates/:id', async (request, params) => {
95
- try {
96
- const auth = await requireAuth(request);
97
- if (auth.error)
98
- return auth.error;
99
- const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
100
- if (roleErr)
101
- return roleErr;
102
- const d = db();
103
- if (!hasModel(d, 'pageTemplate'))
104
- return modelNotAvailable('PageTemplate');
105
- const template = await d.pageTemplate.findUnique({ where: { id: params.id } });
106
- if (!template)
107
- return errorResponse('Template not found', 404);
108
- return json({ data: template });
109
- }
110
- catch (err) {
111
- return internalError(err, 'page-templates get');
112
- }
113
- });
114
- router.post('/page-templates', async (request) => {
115
- try {
116
- const auth = await requireAuth(request);
117
- if (auth.error)
118
- return auth.error;
119
- const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
120
- if (roleErr)
121
- return roleErr;
122
- const d = db();
123
- if (!hasModel(d, 'pageTemplate'))
124
- return modelNotAvailable('PageTemplate');
125
- const body = (await request.json());
126
- if (!body.name)
127
- return errorResponse('name is required', 400);
128
- if (!body.tree)
129
- return errorResponse('tree is required', 400);
130
- const validation = validateTree(body.tree);
131
- if (!validation.valid) {
132
- return errorResponse(`Invalid tree: ${validation.errors.join('; ')}`, 400);
133
- }
134
- const validCategories = ['landing', 'content', 'utility'];
135
- const category = body.category || 'content';
136
- if (!validCategories.includes(category)) {
137
- return errorResponse('category must be landing, content, or utility', 400);
138
- }
139
- const template = await d.pageTemplate.create({
140
- data: {
141
- name: body.name,
142
- description: body.description || null,
143
- category,
144
- tree: body.tree,
145
- thumbnail: body.thumbnail || null,
146
- builtIn: false,
147
- },
148
- });
149
- await logEvent({
150
- event: 'settings_changed',
151
- userId: auth.session.userId,
152
- details: { action: 'page_template_created', templateId: template.id, name: template.name },
153
- });
154
- return json({ data: template }, 201);
155
- }
156
- catch (err) {
157
- return internalError(err, 'page-templates create');
158
- }
159
- });
160
- router.put('/page-templates/:id', async (request, params) => {
161
- try {
162
- const auth = await requireAuth(request);
163
- if (auth.error)
164
- return auth.error;
165
- const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
166
- if (roleErr)
167
- return roleErr;
168
- const d = db();
169
- if (!hasModel(d, 'pageTemplate'))
170
- return modelNotAvailable('PageTemplate');
171
- const existing = await d.pageTemplate.findUnique({ where: { id: params.id } });
172
- if (!existing)
173
- return errorResponse('Template not found', 404);
174
- if (existing.builtIn)
175
- return errorResponse('Cannot update built-in templates', 403);
176
- const body = (await request.json());
177
- const update = {};
178
- if (body.name !== undefined)
179
- update.name = body.name;
180
- if (body.description !== undefined)
181
- update.description = body.description;
182
- if (body.thumbnail !== undefined)
183
- update.thumbnail = body.thumbnail;
184
- if (body.category !== undefined) {
185
- const validCategories = ['landing', 'content', 'utility'];
186
- if (!validCategories.includes(body.category)) {
187
- return errorResponse('category must be landing, content, or utility', 400);
188
- }
189
- update.category = body.category;
190
- }
191
- if (body.tree !== undefined) {
192
- const validation = validateTree(body.tree);
193
- if (!validation.valid) {
194
- return errorResponse(`Invalid tree: ${validation.errors.join('; ')}`, 400);
195
- }
196
- update.tree = body.tree;
197
- }
198
- const template = await d.pageTemplate.update({
199
- where: { id: params.id },
200
- data: update,
201
- });
202
- await logEvent({
203
- event: 'settings_changed',
204
- userId: auth.session.userId,
205
- details: { action: 'page_template_updated', templateId: template.id, name: template.name },
206
- });
207
- return json({ data: template });
208
- }
209
- catch (err) {
210
- return internalError(err, 'page-templates update');
211
- }
212
- });
213
- router.delete('/page-templates/:id', async (request, params) => {
214
- try {
215
- const auth = await requireAuth(request);
216
- if (auth.error)
217
- return auth.error;
218
- const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
219
- if (roleErr)
220
- return roleErr;
221
- const d = db();
222
- if (!hasModel(d, 'pageTemplate'))
223
- return modelNotAvailable('PageTemplate');
224
- const existing = await d.pageTemplate.findUnique({ where: { id: params.id } });
225
- if (!existing)
226
- return errorResponse('Template not found', 404);
227
- if (existing.builtIn)
228
- return errorResponse('Cannot delete built-in templates', 403);
229
- await d.pageTemplate.delete({ where: { id: params.id } });
230
- await logEvent({
231
- event: 'settings_changed',
232
- userId: auth.session.userId,
233
- details: { action: 'page_template_deleted', templateId: existing.id, name: existing.name },
234
- });
235
- return json({ data: { deleted: true } });
236
- }
237
- catch (err) {
238
- return internalError(err, 'page-templates delete');
239
- }
240
- });
241
- router.post('/page-templates/seed', async (request) => {
242
- try {
243
- const auth = await requireAuth(request);
244
- if (auth.error)
245
- return auth.error;
246
- const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
247
- if (roleErr)
248
- return roleErr;
249
- const d = db();
250
- if (!hasModel(d, 'pageTemplate'))
251
- return modelNotAvailable('PageTemplate');
252
- await seedBuiltInTemplates(d);
253
- await logEvent({
254
- event: 'settings_changed',
255
- userId: auth.session.userId,
256
- details: { action: 'page_templates_seeded' },
257
- });
258
- return json({ data: { seeded: Object.keys(BUILT_IN_TEMPLATES).length } });
259
- }
260
- catch (err) {
261
- return internalError(err, 'page-templates seed');
262
- }
263
- });
264
- }
265
- //# sourceMappingURL=page-templates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-templates.js","sourceRoot":"","sources":["../../../src/api/routes/page-templates.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import type { PageNode } from './types.js';
2
- export interface A11yIssue {
3
- id: string;
4
- blockId: string;
5
- type: 'missing-alt' | 'heading-skip' | 'missing-label' | 'missing-aria' | 'small-touch-target';
6
- severity: 'error' | 'warning';
7
- message: string;
8
- autoFixable: boolean;
9
- }
10
- export interface A11yReport {
11
- issues: A11yIssue[];
12
- fixedCount: number;
13
- remainingCount: number;
14
- }
15
- export declare function auditAccessibility(tree: PageNode): A11yIssue[];
16
- export declare function fixAccessibility(tree: PageNode): {
17
- tree: PageNode;
18
- report: A11yReport;
19
- };
20
- //# sourceMappingURL=a11y-fix.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"a11y-fix.d.ts","sourceRoot":"","sources":["../../src/page-builder/a11y-fix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA0B,MAAM,YAAY,CAAA;AAKlE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,eAAe,GAAG,cAAc,GAAG,oBAAoB,CAAA;IAC9F,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,EAAE,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;CACvB;AAgCD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,CAqG9D;AAQD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAiEvF"}
@@ -1,182 +0,0 @@
1
- import { hasChildren } from './types.js';
2
- // ─── Internal Helpers ────────────────────────────────────────────────
3
- let issueCounter = 0;
4
- function nextIssueId() {
5
- return `a11y_${++issueCounter}`;
6
- }
7
- function collectBlocks(node, blocks) {
8
- if (node.type === 'block') {
9
- blocks.push(node);
10
- return;
11
- }
12
- if (hasChildren(node)) {
13
- for (const child of node.children) {
14
- collectBlocks(child, blocks);
15
- }
16
- }
17
- }
18
- function getHeadingLevel(block) {
19
- if (block.settings.blockType !== 'text')
20
- return null;
21
- const level = block.data.headingLevel;
22
- if (!level)
23
- return null;
24
- const match = /^h(\d)$/.exec(level);
25
- return match ? parseInt(match[1], 10) : null;
26
- }
27
- // ─── Audit ───────────────────────────────────────────────────────────
28
- export function auditAccessibility(tree) {
29
- issueCounter = 0;
30
- const blocks = [];
31
- collectBlocks(tree, blocks);
32
- const issues = [];
33
- let lastHeadingLevel = 1;
34
- for (const block of blocks) {
35
- const blockType = block.settings.blockType;
36
- if (blockType === 'image') {
37
- if (!block.data.alt) {
38
- issues.push({
39
- id: nextIssueId(),
40
- blockId: block.id,
41
- type: 'missing-alt',
42
- severity: 'error',
43
- message: 'Image block is missing alt text',
44
- autoFixable: false,
45
- });
46
- }
47
- }
48
- if (blockType === 'hero') {
49
- if (block.data.image && !block.data.imageAlt && !block.data.alt) {
50
- issues.push({
51
- id: nextIssueId(),
52
- blockId: block.id,
53
- type: 'missing-alt',
54
- severity: 'error',
55
- message: 'Hero block image is missing alt text',
56
- autoFixable: false,
57
- });
58
- }
59
- }
60
- if (blockType === 'gallery') {
61
- const images = block.data.images;
62
- if (images) {
63
- for (const img of images) {
64
- if (!img.alt) {
65
- issues.push({
66
- id: nextIssueId(),
67
- blockId: block.id,
68
- type: 'missing-alt',
69
- severity: 'error',
70
- message: 'Gallery image is missing alt text',
71
- autoFixable: false,
72
- });
73
- }
74
- }
75
- }
76
- }
77
- if (blockType === 'text') {
78
- const level = getHeadingLevel(block);
79
- if (level !== null) {
80
- if (level > lastHeadingLevel + 1) {
81
- issues.push({
82
- id: nextIssueId(),
83
- blockId: block.id,
84
- type: 'heading-skip',
85
- severity: 'warning',
86
- message: `Heading level skips from h${lastHeadingLevel} to h${level}`,
87
- autoFixable: true,
88
- });
89
- }
90
- lastHeadingLevel = level;
91
- }
92
- }
93
- if (blockType === 'form') {
94
- if (!block.data.formId) {
95
- issues.push({
96
- id: nextIssueId(),
97
- blockId: block.id,
98
- type: 'missing-label',
99
- severity: 'warning',
100
- message: 'Form block is missing a linked form with field labels',
101
- autoFixable: false,
102
- });
103
- }
104
- }
105
- if (blockType === 'cta') {
106
- const buttonText = block.data.buttonText;
107
- if (!buttonText) {
108
- issues.push({
109
- id: nextIssueId(),
110
- blockId: block.id,
111
- type: 'missing-aria',
112
- severity: 'warning',
113
- message: 'CTA block is missing button text for aria-label',
114
- autoFixable: true,
115
- });
116
- }
117
- }
118
- }
119
- return issues;
120
- }
121
- // ─── Fix ─────────────────────────────────────────────────────────────
122
- function deepClone(obj) {
123
- return JSON.parse(JSON.stringify(obj));
124
- }
125
- export function fixAccessibility(tree) {
126
- const fixedTree = deepClone(tree);
127
- const blocks = [];
128
- collectBlocks(fixedTree, blocks);
129
- const issues = auditAccessibility(tree);
130
- let fixedCount = 0;
131
- let lastHeadingLevel = 1;
132
- for (const block of blocks) {
133
- const blockType = block.settings.blockType;
134
- if (blockType === 'image' && !block.data.alt) {
135
- block.data.alt = `Image in ${blockType} section`;
136
- fixedCount++;
137
- }
138
- if (blockType === 'hero' && block.data.image && !block.data.imageAlt && !block.data.alt) {
139
- block.data.alt = 'Image in hero section';
140
- fixedCount++;
141
- }
142
- if (blockType === 'gallery') {
143
- const images = block.data.images;
144
- if (images) {
145
- for (const img of images) {
146
- if (!img.alt) {
147
- img.alt = 'Image in gallery section';
148
- fixedCount++;
149
- }
150
- }
151
- }
152
- }
153
- if (blockType === 'text') {
154
- const level = getHeadingLevel(block);
155
- if (level !== null) {
156
- if (level > lastHeadingLevel + 1) {
157
- const corrected = lastHeadingLevel + 1;
158
- block.data.headingLevel = `h${corrected}`;
159
- lastHeadingLevel = corrected;
160
- fixedCount++;
161
- }
162
- else {
163
- lastHeadingLevel = level;
164
- }
165
- }
166
- }
167
- if (blockType === 'cta' && !block.data.buttonText) {
168
- block.data.ariaLabel = block.data.heading || 'Call to action';
169
- fixedCount++;
170
- }
171
- }
172
- const remainingCount = issues.length - fixedCount;
173
- return {
174
- tree: fixedTree,
175
- report: {
176
- issues,
177
- fixedCount,
178
- remainingCount: remainingCount < 0 ? 0 : remainingCount,
179
- },
180
- };
181
- }
182
- //# sourceMappingURL=a11y-fix.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"a11y-fix.js","sourceRoot":"","sources":["../../src/page-builder/a11y-fix.ts"],"names":[],"mappings":"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"}
@@ -1,43 +0,0 @@
1
- import type { PageNode } from './types.js';
2
- export type GenerationStep = 'structure' | 'content' | 'seo' | 'accessibility';
3
- export interface GenerationContext {
4
- prompt: string;
5
- template?: string;
6
- context?: {
7
- businessName?: string;
8
- phone?: string;
9
- address?: string;
10
- services?: string[];
11
- industry?: string;
12
- [key: string]: unknown;
13
- };
14
- steps: GenerationStep[];
15
- tone?: 'professional' | 'casual' | 'friendly' | 'technical' | 'luxury';
16
- }
17
- export interface StepResult {
18
- step: GenerationStep;
19
- tree: PageNode;
20
- metadata: {
21
- tokensUsed: number;
22
- durationMs: number;
23
- changes: string[];
24
- };
25
- }
26
- export interface GenerationResult {
27
- tree: PageNode;
28
- steps: StepResult[];
29
- totalTokensUsed: number;
30
- totalDurationMs: number;
31
- }
32
- export interface GenerationProgress {
33
- currentStep: GenerationStep;
34
- completedSteps: GenerationStep[];
35
- totalSteps: number;
36
- message: string;
37
- }
38
- export declare const PAGE_TREE_SCHEMA_REFERENCE: string;
39
- export declare function buildStructurePrompt(ctx: GenerationContext, templateTree?: PageNode): string;
40
- export declare function buildContentPrompt(ctx: GenerationContext, tree: PageNode): string;
41
- export declare function buildSEOPrompt(ctx: GenerationContext, tree: PageNode): string;
42
- export declare function buildAccessibilityPrompt(tree: PageNode): string;
43
- //# sourceMappingURL=ai-pipeline.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-pipeline.d.ts","sourceRoot":"","sources":["../../src/page-builder/ai-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAI1C,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,eAAe,CAAA;AAE9E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;IACD,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,IAAI,CAAC,EAAE,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAA;CACvE;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAA;IACpB,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,EAAE,CAAA;KAClB,CAAA;CACF;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,cAAc,CAAA;IAC3B,cAAc,EAAE,cAAc,EAAE,CAAA;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;CAChB;AAID,eAAO,MAAM,0BAA0B,QA4C/B,CAAA;AAuBR,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,QAAQ,GAAG,MAAM,CAyB5F;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAuBjF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAyB7E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAmB/D"}