@actuate-media/cms-core 0.7.0 → 0.10.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 (103) hide show
  1. package/dist/__tests__/actions/document-crud.test.js +13 -1
  2. package/dist/__tests__/actions/document-crud.test.js.map +1 -1
  3. package/dist/__tests__/next.test.d.ts +2 -0
  4. package/dist/__tests__/next.test.d.ts.map +1 -0
  5. package/dist/__tests__/next.test.js +67 -0
  6. package/dist/__tests__/next.test.js.map +1 -0
  7. package/dist/__tests__/site.test.d.ts +2 -0
  8. package/dist/__tests__/site.test.d.ts.map +1 -0
  9. package/dist/__tests__/site.test.js +68 -0
  10. package/dist/__tests__/site.test.js.map +1 -0
  11. package/dist/actions.d.ts.map +1 -1
  12. package/dist/actions.js +6 -1
  13. package/dist/actions.js.map +1 -1
  14. package/dist/api/handlers.d.ts.map +1 -1
  15. package/dist/api/handlers.js +530 -0
  16. package/dist/api/handlers.js.map +1 -1
  17. package/dist/config/types.d.ts +3 -0
  18. package/dist/config/types.d.ts.map +1 -1
  19. package/dist/config/types.js +0 -1
  20. package/dist/config/types.js.map +1 -1
  21. package/dist/index.d.ts +4 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +4 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/next.d.ts +3 -1
  26. package/dist/next.d.ts.map +1 -1
  27. package/dist/next.js +2 -1
  28. package/dist/next.js.map +1 -1
  29. package/dist/page-builder/__tests__/a11y-fix.test.d.ts +2 -0
  30. package/dist/page-builder/__tests__/a11y-fix.test.d.ts.map +1 -0
  31. package/dist/page-builder/__tests__/a11y-fix.test.js +246 -0
  32. package/dist/page-builder/__tests__/a11y-fix.test.js.map +1 -0
  33. package/dist/page-builder/__tests__/blocks.test.d.ts +2 -0
  34. package/dist/page-builder/__tests__/blocks.test.d.ts.map +1 -0
  35. package/dist/page-builder/__tests__/blocks.test.js +87 -0
  36. package/dist/page-builder/__tests__/blocks.test.js.map +1 -0
  37. package/dist/page-builder/__tests__/design-scorer.test.d.ts +2 -0
  38. package/dist/page-builder/__tests__/design-scorer.test.d.ts.map +1 -0
  39. package/dist/page-builder/__tests__/design-scorer.test.js +268 -0
  40. package/dist/page-builder/__tests__/design-scorer.test.js.map +1 -0
  41. package/dist/page-builder/__tests__/schema.test.d.ts +2 -0
  42. package/dist/page-builder/__tests__/schema.test.d.ts.map +1 -0
  43. package/dist/page-builder/__tests__/schema.test.js +191 -0
  44. package/dist/page-builder/__tests__/schema.test.js.map +1 -0
  45. package/dist/page-builder/__tests__/seo-analyzer.test.d.ts +2 -0
  46. package/dist/page-builder/__tests__/seo-analyzer.test.d.ts.map +1 -0
  47. package/dist/page-builder/__tests__/seo-analyzer.test.js +332 -0
  48. package/dist/page-builder/__tests__/seo-analyzer.test.js.map +1 -0
  49. package/dist/page-builder/__tests__/tree.test.d.ts +2 -0
  50. package/dist/page-builder/__tests__/tree.test.d.ts.map +1 -0
  51. package/dist/page-builder/__tests__/tree.test.js +257 -0
  52. package/dist/page-builder/__tests__/tree.test.js.map +1 -0
  53. package/dist/page-builder/a11y-fix.d.ts +20 -0
  54. package/dist/page-builder/a11y-fix.d.ts.map +1 -0
  55. package/dist/page-builder/a11y-fix.js +182 -0
  56. package/dist/page-builder/a11y-fix.js.map +1 -0
  57. package/dist/page-builder/ai-pipeline.d.ts +43 -0
  58. package/dist/page-builder/ai-pipeline.d.ts.map +1 -0
  59. package/dist/page-builder/ai-pipeline.js +167 -0
  60. package/dist/page-builder/ai-pipeline.js.map +1 -0
  61. package/dist/page-builder/blocks.d.ts +10 -0
  62. package/dist/page-builder/blocks.d.ts.map +1 -0
  63. package/dist/page-builder/blocks.js +252 -0
  64. package/dist/page-builder/blocks.js.map +1 -0
  65. package/dist/page-builder/design-scorer.d.ts +27 -0
  66. package/dist/page-builder/design-scorer.d.ts.map +1 -0
  67. package/dist/page-builder/design-scorer.js +404 -0
  68. package/dist/page-builder/design-scorer.js.map +1 -0
  69. package/dist/page-builder/index.d.ts +18 -0
  70. package/dist/page-builder/index.d.ts.map +1 -0
  71. package/dist/page-builder/index.js +20 -0
  72. package/dist/page-builder/index.js.map +1 -0
  73. package/dist/page-builder/schema.d.ts +107 -0
  74. package/dist/page-builder/schema.d.ts.map +1 -0
  75. package/dist/page-builder/schema.js +90 -0
  76. package/dist/page-builder/schema.js.map +1 -0
  77. package/dist/page-builder/seo-analyzer.d.ts +61 -0
  78. package/dist/page-builder/seo-analyzer.d.ts.map +1 -0
  79. package/dist/page-builder/seo-analyzer.js +582 -0
  80. package/dist/page-builder/seo-analyzer.js.map +1 -0
  81. package/dist/page-builder/templates.d.ts +9 -0
  82. package/dist/page-builder/templates.d.ts.map +1 -0
  83. package/dist/page-builder/templates.js +401 -0
  84. package/dist/page-builder/templates.js.map +1 -0
  85. package/dist/page-builder/tree.d.ts +17 -0
  86. package/dist/page-builder/tree.d.ts.map +1 -0
  87. package/dist/page-builder/tree.js +160 -0
  88. package/dist/page-builder/tree.js.map +1 -0
  89. package/dist/page-builder/types.d.ts +112 -0
  90. package/dist/page-builder/types.d.ts.map +1 -0
  91. package/dist/page-builder/types.js +4 -0
  92. package/dist/page-builder/types.js.map +1 -0
  93. package/dist/page-builder/validate.d.ts +6 -0
  94. package/dist/page-builder/validate.d.ts.map +1 -0
  95. package/dist/page-builder/validate.js +87 -0
  96. package/dist/page-builder/validate.js.map +1 -0
  97. package/dist/site.d.ts +51 -0
  98. package/dist/site.d.ts.map +1 -0
  99. package/dist/site.js +101 -0
  100. package/dist/site.js.map +1 -0
  101. package/package.json +14 -4
  102. package/prisma/migrations/0006_page_builder/migration.sql +38 -0
  103. package/prisma/schema.prisma +31 -0
@@ -0,0 +1,268 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { analyzeDesign } from '../design-scorer.js';
3
+ function makeBalancedPage() {
4
+ return {
5
+ id: 'page-1',
6
+ type: 'page',
7
+ children: [
8
+ {
9
+ id: 'sec-hero',
10
+ type: 'section',
11
+ settings: { paddingTop: '64px', paddingBottom: '64px', background: '#ffffff' },
12
+ children: [
13
+ {
14
+ id: 'row-hero',
15
+ type: 'row',
16
+ settings: { gap: '24px', wrapOnMobile: true },
17
+ children: [
18
+ {
19
+ id: 'col-hero',
20
+ type: 'column',
21
+ settings: { width: 12 },
22
+ children: [
23
+ {
24
+ id: 'blk-hero',
25
+ type: 'block',
26
+ settings: { blockType: 'hero' },
27
+ data: { title: 'Welcome', subtitle: 'Great things ahead', ctaText: 'Learn More', ctaLink: '/about' },
28
+ },
29
+ ],
30
+ },
31
+ ],
32
+ },
33
+ ],
34
+ },
35
+ {
36
+ id: 'sec-content',
37
+ type: 'section',
38
+ settings: { paddingTop: '64px', paddingBottom: '64px', background: '#f5f5f5' },
39
+ children: [
40
+ {
41
+ id: 'row-content',
42
+ type: 'row',
43
+ settings: { gap: '24px', wrapOnMobile: true },
44
+ children: [
45
+ {
46
+ id: 'col-content-1',
47
+ type: 'column',
48
+ settings: { width: 6 },
49
+ children: [
50
+ {
51
+ id: 'blk-text-1',
52
+ type: 'block',
53
+ settings: { blockType: 'text' },
54
+ data: { heading: 'Our Mission', headingLevel: 2, body: '<p>We build great things.</p>' },
55
+ },
56
+ ],
57
+ },
58
+ {
59
+ id: 'col-content-2',
60
+ type: 'column',
61
+ settings: { width: 6 },
62
+ children: [
63
+ {
64
+ id: 'blk-image-1',
65
+ type: 'block',
66
+ settings: { blockType: 'image' },
67
+ data: { src: '/mission.jpg', alt: 'Our mission in action' },
68
+ },
69
+ ],
70
+ },
71
+ ],
72
+ },
73
+ ],
74
+ },
75
+ {
76
+ id: 'sec-cta',
77
+ type: 'section',
78
+ settings: { paddingTop: '64px', paddingBottom: '64px', background: '#ffffff' },
79
+ children: [
80
+ {
81
+ id: 'row-cta',
82
+ type: 'row',
83
+ settings: { gap: '24px', wrapOnMobile: true },
84
+ children: [
85
+ {
86
+ id: 'col-cta',
87
+ type: 'column',
88
+ settings: { width: 12 },
89
+ children: [
90
+ {
91
+ id: 'blk-cta',
92
+ type: 'block',
93
+ settings: { blockType: 'cta' },
94
+ data: { heading: 'Get Started', body: 'Join today', buttonText: 'Sign Up', buttonLink: '/signup' },
95
+ },
96
+ ],
97
+ },
98
+ ],
99
+ },
100
+ ],
101
+ },
102
+ ],
103
+ };
104
+ }
105
+ function makePageMissingCta() {
106
+ return {
107
+ id: 'page-1',
108
+ type: 'page',
109
+ children: [
110
+ {
111
+ id: 'sec-1',
112
+ type: 'section',
113
+ settings: { paddingTop: '64px', paddingBottom: '64px' },
114
+ children: [
115
+ {
116
+ id: 'row-1',
117
+ type: 'row',
118
+ settings: { gap: '24px' },
119
+ children: [
120
+ {
121
+ id: 'col-1',
122
+ type: 'column',
123
+ settings: { width: 12 },
124
+ children: [
125
+ {
126
+ id: 'blk-text',
127
+ type: 'block',
128
+ settings: { blockType: 'text' },
129
+ data: { heading: 'Hello', headingLevel: 2, body: '<p>Some text content here.</p>' },
130
+ },
131
+ ],
132
+ },
133
+ ],
134
+ },
135
+ ],
136
+ },
137
+ ],
138
+ };
139
+ }
140
+ function makeInconsistentSpacingPage() {
141
+ return {
142
+ id: 'page-1',
143
+ type: 'page',
144
+ children: [
145
+ {
146
+ id: 'sec-1',
147
+ type: 'section',
148
+ settings: { paddingTop: '16px', paddingBottom: '32px' },
149
+ children: [
150
+ {
151
+ id: 'row-1',
152
+ type: 'row',
153
+ settings: { gap: '8px' },
154
+ children: [
155
+ {
156
+ id: 'col-1',
157
+ type: 'column',
158
+ settings: { width: 12 },
159
+ children: [
160
+ { id: 'blk-1', type: 'block', settings: { blockType: 'text' }, data: { body: 'A' } },
161
+ ],
162
+ },
163
+ ],
164
+ },
165
+ ],
166
+ },
167
+ {
168
+ id: 'sec-2',
169
+ type: 'section',
170
+ settings: { paddingTop: '64px', paddingBottom: '48px' },
171
+ children: [
172
+ {
173
+ id: 'row-2',
174
+ type: 'row',
175
+ settings: { gap: '24px' },
176
+ children: [
177
+ {
178
+ id: 'col-2',
179
+ type: 'column',
180
+ settings: { width: 12 },
181
+ children: [
182
+ { id: 'blk-2', type: 'block', settings: { blockType: 'text' }, data: { body: 'B' } },
183
+ ],
184
+ },
185
+ ],
186
+ },
187
+ ],
188
+ },
189
+ {
190
+ id: 'sec-3',
191
+ type: 'section',
192
+ settings: { paddingTop: '80px', paddingBottom: '100px' },
193
+ children: [
194
+ {
195
+ id: 'row-3',
196
+ type: 'row',
197
+ settings: { gap: '40px' },
198
+ children: [
199
+ {
200
+ id: 'col-3',
201
+ type: 'column',
202
+ settings: { width: 12 },
203
+ children: [
204
+ { id: 'blk-3', type: 'block', settings: { blockType: 'text' }, data: { body: 'C' } },
205
+ ],
206
+ },
207
+ ],
208
+ },
209
+ ],
210
+ },
211
+ ],
212
+ };
213
+ }
214
+ describe('analyzeDesign', () => {
215
+ it('returns score between 0 and 100', () => {
216
+ const tree = makeBalancedPage();
217
+ const result = analyzeDesign(tree);
218
+ expect(result.score).toBeGreaterThanOrEqual(0);
219
+ expect(result.score).toBeLessThanOrEqual(100);
220
+ });
221
+ it('scores 6 categories', () => {
222
+ const tree = makeBalancedPage();
223
+ const result = analyzeDesign(tree);
224
+ expect(result.categories.length).toBe(6);
225
+ expect(result.categories.map(c => c.name)).toEqual([
226
+ 'visualHierarchy',
227
+ 'spacingConsistency',
228
+ 'contentDensity',
229
+ 'colorUsage',
230
+ 'imageQuality',
231
+ 'mobileReadiness',
232
+ ]);
233
+ });
234
+ it('generates suggestions for missing trust element', () => {
235
+ const tree = makeBalancedPage();
236
+ const result = analyzeDesign(tree);
237
+ const trustSuggestion = result.suggestions.find(s => s.id === 'missing-trust');
238
+ expect(trustSuggestion).toBeDefined();
239
+ expect(trustSuggestion.category).toBe('trust');
240
+ });
241
+ it('generates suggestions for missing CTA', () => {
242
+ const tree = makePageMissingCta();
243
+ const result = analyzeDesign(tree);
244
+ const ctaSuggestion = result.suggestions.find(s => s.id === 'missing-cta');
245
+ expect(ctaSuggestion).toBeDefined();
246
+ expect(ctaSuggestion.severity).toBe('important');
247
+ expect(ctaSuggestion.category).toBe('conversion');
248
+ });
249
+ it('penalizes inconsistent spacing', () => {
250
+ const tree = makeInconsistentSpacingPage();
251
+ const result = analyzeDesign(tree);
252
+ const spacingCategory = result.categories.find(c => c.name === 'spacingConsistency');
253
+ expect(spacingCategory).toBeDefined();
254
+ expect(spacingCategory.score).toBeLessThan(spacingCategory.maxScore);
255
+ });
256
+ it('gives high score to a well-structured page', () => {
257
+ const tree = makeBalancedPage();
258
+ const result = analyzeDesign(tree);
259
+ expect(result.score).toBeGreaterThan(60);
260
+ });
261
+ it('handles empty page gracefully', () => {
262
+ const tree = { id: 'page-1', type: 'page', children: [] };
263
+ const result = analyzeDesign(tree);
264
+ expect(result.score).toBeGreaterThanOrEqual(0);
265
+ expect(result.score).toBeLessThanOrEqual(100);
266
+ });
267
+ });
268
+ //# sourceMappingURL=design-scorer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-scorer.test.js","sourceRoot":"","sources":["../../../src/page-builder/__tests__/design-scorer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.test.d.ts","sourceRoot":"","sources":["../../../src/page-builder/__tests__/schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,191 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { validateTree } from '../validate.js';
3
+ // ─── Test Helpers ────────────────────────────────────────────────────
4
+ let idCounter = 0;
5
+ function uid() {
6
+ return `node-${++idCounter}`;
7
+ }
8
+ function makeBlock(overrides) {
9
+ return {
10
+ id: uid(),
11
+ type: 'block',
12
+ settings: { blockType: 'text' },
13
+ data: {},
14
+ ...overrides,
15
+ };
16
+ }
17
+ function makeColumn(width, children = [makeBlock()]) {
18
+ return {
19
+ id: uid(),
20
+ type: 'column',
21
+ settings: { width },
22
+ children: children,
23
+ };
24
+ }
25
+ function makeRow(columns) {
26
+ return {
27
+ id: uid(),
28
+ type: 'row',
29
+ settings: {},
30
+ children: columns ?? [makeColumn(12)],
31
+ };
32
+ }
33
+ function makeContainer(rows) {
34
+ return {
35
+ id: uid(),
36
+ type: 'container',
37
+ settings: {},
38
+ children: rows ?? [makeRow()],
39
+ };
40
+ }
41
+ function makeSection(children) {
42
+ return {
43
+ id: uid(),
44
+ type: 'section',
45
+ settings: {},
46
+ children: children ?? [makeContainer()],
47
+ };
48
+ }
49
+ function makeRef(refId = 'saved-1') {
50
+ return {
51
+ id: uid(),
52
+ type: 'savedSectionRef',
53
+ settings: { refId },
54
+ };
55
+ }
56
+ function makePage(children) {
57
+ return {
58
+ id: uid(),
59
+ type: 'page',
60
+ children: children ?? [makeSection()],
61
+ };
62
+ }
63
+ // ─── Tests ───────────────────────────────────────────────────────────
64
+ describe('validateTree', () => {
65
+ beforeEach(() => {
66
+ idCounter = 0;
67
+ });
68
+ it('accepts a valid minimal page', () => {
69
+ const tree = makePage([
70
+ makeSection([makeContainer([makeRow([makeColumn(12, [makeBlock()])])])]),
71
+ ]);
72
+ const result = validateTree(tree);
73
+ expect(result.valid).toBe(true);
74
+ expect(result.errors).toHaveLength(0);
75
+ });
76
+ it('accepts a page with savedSectionRef', () => {
77
+ const tree = makePage([makeSection(), makeRef('ref-abc')]);
78
+ const result = validateTree(tree);
79
+ expect(result.valid).toBe(true);
80
+ expect(result.errors).toHaveLength(0);
81
+ });
82
+ it('rejects a tree without page root', () => {
83
+ const section = makeSection();
84
+ const result = validateTree(section);
85
+ expect(result.valid).toBe(false);
86
+ expect(result.errors.some((e) => e.includes('Root node must be of type "page"'))).toBe(true);
87
+ });
88
+ it('rejects a node missing an id', () => {
89
+ const tree = { type: 'page', children: [] };
90
+ const result = validateTree(tree);
91
+ expect(result.valid).toBe(false);
92
+ expect(result.errors.some((e) => e.includes('id'))).toBe(true);
93
+ });
94
+ it('rejects columns that do not sum to 12', () => {
95
+ const tree = makePage([
96
+ makeSection([
97
+ makeContainer([makeRow([makeColumn(7), makeColumn(4)])]),
98
+ ]),
99
+ ]);
100
+ const result = validateTree(tree);
101
+ expect(result.valid).toBe(false);
102
+ expect(result.errors.some((e) => e.includes('sum to 11'))).toBe(true);
103
+ });
104
+ it('accepts columns that sum to 12', () => {
105
+ const tree = makePage([
106
+ makeSection([
107
+ makeContainer([makeRow([makeColumn(7), makeColumn(5)])]),
108
+ ]),
109
+ ]);
110
+ const result = validateTree(tree);
111
+ expect(result.valid).toBe(true);
112
+ expect(result.errors).toHaveLength(0);
113
+ });
114
+ it('rejects invalid nesting (block inside page)', () => {
115
+ const tree = {
116
+ id: 'page-1',
117
+ type: 'page',
118
+ children: [makeBlock()],
119
+ };
120
+ const result = validateTree(tree);
121
+ expect(result.valid).toBe(false);
122
+ expect(result.errors.length).toBeGreaterThan(0);
123
+ });
124
+ it('rejects column width outside 1-12 range', () => {
125
+ const tree = makePage([
126
+ makeSection([
127
+ makeContainer([
128
+ makeRow([
129
+ { id: 'col-zero', type: 'column', settings: { width: 0 }, children: [makeBlock()] },
130
+ makeColumn(12),
131
+ ]),
132
+ ]),
133
+ ]),
134
+ ]);
135
+ const result = validateTree(tree);
136
+ expect(result.valid).toBe(false);
137
+ expect(result.errors.some((e) => e.toLowerCase().includes('number') || e.toLowerCase().includes('small') || e.toLowerCase().includes('width') || e.toLowerCase().includes('1'))).toBe(true);
138
+ });
139
+ it('rejects nesting deeper than max depth', () => {
140
+ function nestContainers(depth) {
141
+ if (depth <= 1) {
142
+ return makeContainer([makeRow([makeColumn(12, [makeBlock()])])]);
143
+ }
144
+ const inner = nestContainers(depth - 1);
145
+ return makeContainer([makeRow([makeColumn(12, [inner])])]);
146
+ }
147
+ const deepContainer = nestContainers(10);
148
+ const tree = makePage([makeSection([deepContainer])]);
149
+ const result = validateTree(tree);
150
+ expect(result.valid).toBe(false);
151
+ expect(result.errors.some((e) => e.includes('depth'))).toBe(true);
152
+ });
153
+ it('accepts responsive overrides on nodes', () => {
154
+ const tree = makePage([
155
+ makeSection([
156
+ makeContainer([
157
+ makeRow([
158
+ {
159
+ ...makeColumn(12),
160
+ responsive: {
161
+ mobile: { width: 12 },
162
+ tablet: { width: 6 },
163
+ },
164
+ },
165
+ ]),
166
+ ]),
167
+ ]),
168
+ ]);
169
+ const result = validateTree(tree);
170
+ expect(result.valid).toBe(true);
171
+ expect(result.errors).toHaveLength(0);
172
+ });
173
+ it('rejects block node with children', () => {
174
+ const blockWithChildren = {
175
+ id: 'bad-block',
176
+ type: 'block',
177
+ settings: { blockType: 'text' },
178
+ data: {},
179
+ children: [makeBlock()],
180
+ };
181
+ const tree = makePage([
182
+ makeSection([
183
+ makeContainer([makeRow([makeColumn(12, [blockWithChildren])])]),
184
+ ]),
185
+ ]);
186
+ const result = validateTree(tree);
187
+ expect(result.valid).toBe(false);
188
+ expect(result.errors.some((e) => e.includes('Block node') && e.includes('children'))).toBe(true);
189
+ });
190
+ });
191
+ //# sourceMappingURL=schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../../src/page-builder/__tests__/schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAW7C,wEAAwE;AAExE,IAAI,SAAS,GAAG,CAAC,CAAA;AACjB,SAAS,GAAG;IACV,OAAO,QAAQ,EAAE,SAAS,EAAE,CAAA;AAC9B,CAAC;AAED,SAAS,SAAS,CAAC,SAA8B;IAC/C,OAAO;QACL,EAAE,EAAE,GAAG,EAAE;QACT,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;QAC/B,IAAI,EAAE,EAAE;QACR,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,WAA0C,CAAC,SAAS,EAAE,CAAC;IACxF,OAAO;QACL,EAAE,EAAE,GAAG,EAAE;QACT,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,EAAE,KAAK,EAAE;QACnB,QAAQ,EAAE,QAAyC;KACpD,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,OAAsB;IACrC,OAAO;QACL,EAAE,EAAE,GAAG,EAAE;QACT,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;KACtC,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAgB;IACrC,OAAO;QACL,EAAE,EAAE,GAAG,EAAE;QACT,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;KAC9B,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,QAAsC;IACzD,OAAO;QACL,EAAE,EAAE,GAAG,EAAE;QACT,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;KACxC,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAK,GAAG,SAAS;IAChC,OAAO;QACL,EAAE,EAAE,GAAG,EAAE;QACT,IAAI,EAAE,iBAAiB;QACvB,QAAQ,EAAE,EAAE,KAAK,EAAE;KACpB,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgD;IAChE,OAAO;QACL,EAAE,EAAE,GAAG,EAAE;QACT,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;KACtC,CAAA;AACH,CAAC;AAED,wEAAwE;AAExE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,UAAU,CAAC,GAAG,EAAE;QACd,SAAS,GAAG,CAAC,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,WAAW,CAAC,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACzE,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;QAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,WAAW,CAAC;gBACV,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACzD,CAAC;SACH,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,WAAW,CAAC;gBACV,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACzD,CAAC;SACH,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG;YACX,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,MAAe;YACrB,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;SACxB,CAAA;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,WAAW,CAAC;gBACV,aAAa,CAAC;oBACZ,OAAO,CAAC;wBACN,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,QAAiB,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE;wBAC5F,UAAU,CAAC,EAAE,CAAC;qBACf,CAAC;iBACH,CAAC;aACH,CAAC;SACH,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7L,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,SAAS,cAAc,CAAC,KAAa;YACnC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,OAAO,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAClE,CAAC;YACD,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;YACvC,OAAO,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5D,CAAC;QAED,MAAM,aAAa,GAAG,cAAc,CAAC,EAAE,CAAC,CAAA;QACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,WAAW,CAAC;gBACV,aAAa,CAAC;oBACZ,OAAO,CAAC;wBACN;4BACE,GAAG,UAAU,CAAC,EAAE,CAAC;4BACjB,UAAU,EAAE;gCACV,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;gCACrB,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;6BACrB;yBACF;qBACF,CAAC;iBACH,CAAC;aACH,CAAC;SACH,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,iBAAiB,GAAG;YACxB,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,OAAgB;YACtB,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;YAC/B,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,CAAC,SAAS,EAAE,CAAC;SACxB,CAAA;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,WAAW,CAAC;gBACV,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACxF,CAAC;SACH,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=seo-analyzer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-analyzer.test.d.ts","sourceRoot":"","sources":["../../../src/page-builder/__tests__/seo-analyzer.test.ts"],"names":[],"mappings":""}