@prenta/core 0.123.0 → 1.0.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 (58) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/api/routes/seo-public.d.ts.map +1 -1
  3. package/dist/api/routes/seo-public.js +2 -0
  4. package/dist/api/routes/seo-public.js.map +1 -1
  5. package/dist/api/routes/seo.d.ts.map +1 -1
  6. package/dist/api/routes/seo.js +13 -1
  7. package/dist/api/routes/seo.js.map +1 -1
  8. package/dist/index.d.ts +2 -2
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/page-builder/index.d.ts +0 -2
  13. package/dist/page-builder/index.d.ts.map +1 -1
  14. package/dist/page-builder/index.js +0 -2
  15. package/dist/page-builder/index.js.map +1 -1
  16. package/dist/sections/bridge.d.ts.map +1 -1
  17. package/dist/sections/bridge.js +11 -0
  18. package/dist/sections/bridge.js.map +1 -1
  19. package/dist/security/safe-fetch.d.ts.map +1 -1
  20. package/dist/security/safe-fetch.js +4 -3
  21. package/dist/security/safe-fetch.js.map +1 -1
  22. package/dist/seo/audit-engine.d.ts +3 -0
  23. package/dist/seo/audit-engine.d.ts.map +1 -1
  24. package/dist/seo/audit-engine.js +91 -23
  25. package/dist/seo/audit-engine.js.map +1 -1
  26. package/dist/seo/audit-runner.d.ts +9 -2
  27. package/dist/seo/audit-runner.d.ts.map +1 -1
  28. package/dist/seo/audit-runner.js +82 -22
  29. package/dist/seo/audit-runner.js.map +1 -1
  30. package/dist/seo/config-store.d.ts +1 -0
  31. package/dist/seo/config-store.d.ts.map +1 -1
  32. package/dist/seo/config-store.js +1 -0
  33. package/dist/seo/config-store.js.map +1 -1
  34. package/dist/seo/public-site-url.d.ts +4 -1
  35. package/dist/seo/public-site-url.d.ts.map +1 -1
  36. package/dist/seo/public-site-url.js +15 -12
  37. package/dist/seo/public-site-url.js.map +1 -1
  38. package/dist/seo/rendered-fetch.d.ts +60 -0
  39. package/dist/seo/rendered-fetch.d.ts.map +1 -0
  40. package/dist/seo/rendered-fetch.js +246 -0
  41. package/dist/seo/rendered-fetch.js.map +1 -0
  42. package/dist/seo/rendered-html.d.ts +8 -0
  43. package/dist/seo/rendered-html.d.ts.map +1 -0
  44. package/dist/seo/rendered-html.js +86 -0
  45. package/dist/seo/rendered-html.js.map +1 -0
  46. package/dist/seo/score.d.ts +6 -1
  47. package/dist/seo/score.d.ts.map +1 -1
  48. package/dist/seo/score.js +9 -4
  49. package/dist/seo/score.js.map +1 -1
  50. package/dist/upgrade/update-server.d.ts +15 -3
  51. package/dist/upgrade/update-server.d.ts.map +1 -1
  52. package/dist/upgrade/update-server.js +15 -3
  53. package/dist/upgrade/update-server.js.map +1 -1
  54. package/package.json +1 -1
  55. package/dist/page-builder/seo-analyzer.d.ts +0 -61
  56. package/dist/page-builder/seo-analyzer.d.ts.map +0 -1
  57. package/dist/page-builder/seo-analyzer.js +0 -778
  58. package/dist/page-builder/seo-analyzer.js.map +0 -1
@@ -0,0 +1,246 @@
1
+ import { safeFetch, SsrfBlockedError } from '../security/safe-fetch.js';
2
+ import { extractRenderedPageFacts } from './rendered-html.js';
3
+ export const RENDERED_AUDIT_CONCURRENCY = 6;
4
+ export const RENDERED_AUDIT_REQUEST_TIMEOUT_MS = 10_000;
5
+ export const RENDERED_AUDIT_RUN_DEADLINE_MS = 120_000;
6
+ export const RENDERED_AUDIT_PAGE_BYTES = 2 * 1024 * 1024;
7
+ export const RENDERED_AUDIT_RUN_BYTES = 64 * 1024 * 1024;
8
+ export const RENDERED_AUDIT_MAX_REASONS = 25;
9
+ const DEFAULT_LIMITS = {
10
+ concurrency: RENDERED_AUDIT_CONCURRENCY,
11
+ requestTimeoutMs: RENDERED_AUDIT_REQUEST_TIMEOUT_MS,
12
+ runDeadlineMs: RENDERED_AUDIT_RUN_DEADLINE_MS,
13
+ pageBytes: RENDERED_AUDIT_PAGE_BYTES,
14
+ runBytes: RENDERED_AUDIT_RUN_BYTES,
15
+ maxReasons: RENDERED_AUDIT_MAX_REASONS,
16
+ };
17
+ class RenderedFetchLimitError extends Error {
18
+ reason;
19
+ constructor(reason) {
20
+ super(reason);
21
+ this.reason = reason;
22
+ }
23
+ }
24
+ function isSupportedHtml(headers) {
25
+ const mediaType = headers.get('content-type')?.split(';', 1)[0]?.trim().toLowerCase();
26
+ return mediaType === 'text/html' || mediaType === 'application/xhtml+xml';
27
+ }
28
+ function contentLength(headers) {
29
+ const value = headers.get('content-length');
30
+ if (value === null || value.trim() === '')
31
+ return null;
32
+ const parsed = Number(value);
33
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;
34
+ }
35
+ function cancelBody(response) {
36
+ void response.body?.cancel().catch(() => undefined);
37
+ }
38
+ function abortError(signal) {
39
+ return signal.reason ?? new DOMException('The operation was aborted', 'AbortError');
40
+ }
41
+ async function raceWithAbort(operation, signal) {
42
+ if (signal.aborted)
43
+ throw abortError(signal);
44
+ let removeListener;
45
+ const aborted = new Promise((_resolve, reject) => {
46
+ const onAbort = () => reject(abortError(signal));
47
+ signal.addEventListener('abort', onAbort, { once: true });
48
+ removeListener = () => signal.removeEventListener('abort', onAbort);
49
+ });
50
+ try {
51
+ return await Promise.race([operation, aborted]);
52
+ }
53
+ finally {
54
+ removeListener?.();
55
+ }
56
+ }
57
+ function isAbortError(error) {
58
+ return ((error instanceof DOMException && error.name === 'AbortError') ||
59
+ (error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError')));
60
+ }
61
+ export async function fetchRenderedEvidence(targets, options) {
62
+ const limits = { ...DEFAULT_LIMITS, ...options.limits };
63
+ const fetchFn = options.fetchFn ?? safeFetch;
64
+ const now = options.now ?? Date.now;
65
+ const startedAt = now();
66
+ const deadlineAt = startedAt + limits.runDeadlineMs;
67
+ const evidence = new Array(targets.length);
68
+ let cursor = 0;
69
+ let runBytesRead = 0;
70
+ let configuredOrigin;
71
+ try {
72
+ configuredOrigin = new URL(options.origin);
73
+ if (!['http:', 'https:'].includes(configuredOrigin.protocol))
74
+ configuredOrigin = null;
75
+ }
76
+ catch {
77
+ configuredOrigin = null;
78
+ }
79
+ async function fetchTarget(target) {
80
+ if (configuredOrigin === null)
81
+ return { state: 'unverified', reason: 'invalid-url' };
82
+ let targetUrl;
83
+ try {
84
+ targetUrl = new URL(target.url, configuredOrigin);
85
+ }
86
+ catch {
87
+ return { state: 'unverified', reason: 'invalid-url' };
88
+ }
89
+ if (!['http:', 'https:'].includes(targetUrl.protocol) ||
90
+ targetUrl.origin !== configuredOrigin.origin) {
91
+ return { state: 'unverified', reason: 'invalid-url' };
92
+ }
93
+ const remainingDeadlineMs = deadlineAt - now();
94
+ if (remainingDeadlineMs <= 0)
95
+ return { state: 'unverified', reason: 'run-deadline' };
96
+ const requestSignal = AbortSignal.timeout(Math.max(1, limits.requestTimeoutMs));
97
+ const deadlineSignal = AbortSignal.timeout(Math.max(1, remainingDeadlineMs));
98
+ const signal = AbortSignal.any([requestSignal, deadlineSignal]);
99
+ let response;
100
+ try {
101
+ response = await raceWithAbort(fetchFn(targetUrl.toString(), {
102
+ method: 'GET',
103
+ followRedirects: true,
104
+ maxRedirects: 5,
105
+ timeoutMs: Math.min(limits.requestTimeoutMs, remainingDeadlineMs),
106
+ signal,
107
+ }), signal);
108
+ }
109
+ catch (error) {
110
+ if (error instanceof SsrfBlockedError) {
111
+ return { state: 'unverified', reason: 'ssrf-blocked' };
112
+ }
113
+ if (isAbortError(error)) {
114
+ return {
115
+ state: 'unverified',
116
+ reason: deadlineSignal.aborted ? 'run-deadline' : 'timeout',
117
+ };
118
+ }
119
+ return { state: 'unverified', reason: 'network' };
120
+ }
121
+ if (response.status < 200 || response.status >= 300) {
122
+ cancelBody(response);
123
+ return { state: 'unverified', reason: 'http-status', status: response.status };
124
+ }
125
+ if (!isSupportedHtml(response.headers)) {
126
+ cancelBody(response);
127
+ return {
128
+ state: 'unverified',
129
+ reason: 'unsupported-content-type',
130
+ status: response.status,
131
+ };
132
+ }
133
+ const declaredBytes = contentLength(response.headers);
134
+ if (declaredBytes !== null && declaredBytes > limits.pageBytes) {
135
+ cancelBody(response);
136
+ return { state: 'unverified', reason: 'page-byte-limit', status: response.status };
137
+ }
138
+ if (declaredBytes !== null && declaredBytes > limits.runBytes - runBytesRead) {
139
+ cancelBody(response);
140
+ return { state: 'unverified', reason: 'run-byte-limit', status: response.status };
141
+ }
142
+ if (response.body === null) {
143
+ return {
144
+ state: 'verified',
145
+ status: response.status,
146
+ bytesRead: 0,
147
+ facts: extractRenderedPageFacts(''),
148
+ };
149
+ }
150
+ const reader = response.body.getReader();
151
+ const decoder = new TextDecoder();
152
+ let html = '';
153
+ let pageBytesRead = 0;
154
+ try {
155
+ while (true) {
156
+ const { done, value } = await raceWithAbort(reader.read(), signal);
157
+ if (done)
158
+ break;
159
+ if (pageBytesRead + value.byteLength > limits.pageBytes) {
160
+ throw new RenderedFetchLimitError('page-byte-limit');
161
+ }
162
+ if (runBytesRead + value.byteLength > limits.runBytes) {
163
+ throw new RenderedFetchLimitError('run-byte-limit');
164
+ }
165
+ pageBytesRead += value.byteLength;
166
+ runBytesRead += value.byteLength;
167
+ html += decoder.decode(value, { stream: true });
168
+ }
169
+ html += decoder.decode();
170
+ return {
171
+ state: 'verified',
172
+ status: response.status,
173
+ bytesRead: pageBytesRead,
174
+ facts: extractRenderedPageFacts(html),
175
+ };
176
+ }
177
+ catch (error) {
178
+ if (error instanceof RenderedFetchLimitError) {
179
+ return { state: 'unverified', reason: error.reason, status: response.status };
180
+ }
181
+ if (isAbortError(error)) {
182
+ return {
183
+ state: 'unverified',
184
+ reason: deadlineSignal.aborted ? 'run-deadline' : 'timeout',
185
+ status: response.status,
186
+ };
187
+ }
188
+ return { state: 'unverified', reason: 'network', status: response.status };
189
+ }
190
+ finally {
191
+ void reader.cancel().catch(() => undefined);
192
+ }
193
+ }
194
+ async function runWorker() {
195
+ while (cursor < targets.length) {
196
+ const index = cursor++;
197
+ if (now() >= deadlineAt) {
198
+ evidence[index] = { state: 'unverified', reason: 'run-deadline' };
199
+ continue;
200
+ }
201
+ if (runBytesRead >= limits.runBytes) {
202
+ evidence[index] = { state: 'unverified', reason: 'run-byte-limit' };
203
+ continue;
204
+ }
205
+ evidence[index] = await fetchTarget(targets[index]);
206
+ }
207
+ }
208
+ const workerCount = Math.min(Math.max(1, Math.floor(limits.concurrency)), Math.max(1, targets.length));
209
+ await Promise.all(Array.from({ length: workerCount }, () => runWorker()));
210
+ let verified = 0;
211
+ let unverified = 0;
212
+ let notAttempted = 0;
213
+ const reasonCounts = new Map();
214
+ for (const item of evidence) {
215
+ if (item.state === 'verified') {
216
+ verified += 1;
217
+ }
218
+ else if (item.state === 'unverified') {
219
+ unverified += 1;
220
+ reasonCounts.set(item.reason, (reasonCounts.get(item.reason) ?? 0) + 1);
221
+ }
222
+ else {
223
+ notAttempted += 1;
224
+ }
225
+ }
226
+ return {
227
+ evidence,
228
+ summary: {
229
+ enabled: true,
230
+ originSource: options.originSource,
231
+ verified,
232
+ unverified,
233
+ notAttempted,
234
+ partial: unverified > 0,
235
+ bytesRead: runBytesRead,
236
+ durationMs: Math.max(0, now() - startedAt),
237
+ reasons: [...reasonCounts]
238
+ .slice(0, Math.max(0, limits.maxReasons))
239
+ .map(([reason, count]) => ({
240
+ reason,
241
+ count,
242
+ })),
243
+ },
244
+ };
245
+ }
246
+ //# sourceMappingURL=rendered-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rendered-fetch.js","sourceRoot":"","sources":["../../src/seo/rendered-fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface RenderedPageFacts {
2
+ title: string | null;
3
+ metaDescription: string | null;
4
+ h1Count: number;
5
+ visibleWordCount: number;
6
+ }
7
+ export declare function extractRenderedPageFacts(html: string): RenderedPageFacts;
8
+ //# sourceMappingURL=rendered-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rendered-html.d.ts","sourceRoot":"","sources":["../../src/seo/rendered-html.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAMD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CA0ExE"}
@@ -0,0 +1,86 @@
1
+ import sanitizeHtml from 'sanitize-html';
2
+ const NON_VISIBLE_TAGS = [
3
+ 'head',
4
+ 'script',
5
+ 'style',
6
+ 'template',
7
+ 'noscript',
8
+ 'textarea',
9
+ 'select',
10
+ 'option',
11
+ 'input',
12
+ 'button',
13
+ ];
14
+ const HIDDEN_SUBTREE_ATTRIBUTE = 'data-prenta-hidden-subtree';
15
+ function normalizeText(value) {
16
+ return value.replace(/\s+/g, ' ').trim();
17
+ }
18
+ export function extractRenderedPageFacts(html) {
19
+ let title = null;
20
+ let metaDescription = null;
21
+ let h1Count = 0;
22
+ sanitizeHtml(html, {
23
+ allowedTags: ['title', 'meta', 'h1'],
24
+ allowedAttributes: {
25
+ meta: ['name', 'content'],
26
+ },
27
+ transformTags: {
28
+ meta(tagName, attributes) {
29
+ if (metaDescription === null &&
30
+ attributes.name?.toLowerCase() === 'description' &&
31
+ typeof attributes.content === 'string') {
32
+ metaDescription = normalizeText(attributes.content) || null;
33
+ }
34
+ return { tagName, attribs: attributes };
35
+ },
36
+ },
37
+ exclusiveFilter(frame) {
38
+ if (frame.tag === 'title' && title === null) {
39
+ title = normalizeText(frame.text) || null;
40
+ }
41
+ return false;
42
+ },
43
+ });
44
+ const visibleHtml = sanitizeHtml(html, {
45
+ allowedTags: false,
46
+ allowVulnerableTags: true,
47
+ allowedAttributes: {
48
+ '*': [HIDDEN_SUBTREE_ATTRIBUTE],
49
+ },
50
+ transformTags: {
51
+ '*': (tagName, attributes) => {
52
+ const attribs = {};
53
+ if (Object.hasOwn(attributes, 'hidden')) {
54
+ attribs[HIDDEN_SUBTREE_ATTRIBUTE] = 'true';
55
+ }
56
+ return { tagName, attribs };
57
+ },
58
+ },
59
+ exclusiveFilter(frame) {
60
+ return (frame.attribs[HIDDEN_SUBTREE_ATTRIBUTE] === 'true' ||
61
+ NON_VISIBLE_TAGS.includes(frame.tag));
62
+ },
63
+ });
64
+ const visibleTextParts = [];
65
+ sanitizeHtml(visibleHtml, {
66
+ allowedTags: ['h1'],
67
+ allowedAttributes: {},
68
+ exclusiveFilter(frame) {
69
+ if (frame.tag === 'h1')
70
+ h1Count += 1;
71
+ return false;
72
+ },
73
+ textFilter(text) {
74
+ visibleTextParts.push(text);
75
+ return '';
76
+ },
77
+ });
78
+ const visibleText = normalizeText(visibleTextParts.join(' '));
79
+ return {
80
+ title,
81
+ metaDescription,
82
+ h1Count,
83
+ visibleWordCount: visibleText === '' ? 0 : visibleText.split(' ').length,
84
+ };
85
+ }
86
+ //# sourceMappingURL=rendered-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rendered-html.js","sourceRoot":"","sources":["../../src/seo/rendered-html.ts"],"names":[],"mappings":"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"}
@@ -14,9 +14,10 @@
14
14
  */
15
15
  export type SeoGrade = 'good' | 'fair' | 'poor' | 'critical';
16
16
  export type SeoCheckStatus = 'pass' | 'warn' | 'fail';
17
+ export type PageSeoCheckId = 'meta-title' | 'meta-title-length' | 'meta-description' | 'meta-description-length' | 'focus-keyword' | 'canonical' | 'h1' | 'content-length' | 'og-image' | 'og-title-desc' | 'structured-data' | 'internal-links' | 'indexable';
17
18
  /** One explainable line item in a page score. */
18
19
  export interface SeoScoreCheck {
19
- id: string;
20
+ id: PageSeoCheckId;
20
21
  label: string;
21
22
  /** Points earned (0..max). */
22
23
  points: number;
@@ -52,6 +53,10 @@ export interface PageSeoScoreInput {
52
53
  brokenInternalLinks?: number;
53
54
  /** Pre-computed word count; falls back to counting `content`. */
54
55
  wordCount?: number | null;
56
+ /** Explicit rendered H1 count, when known. */
57
+ h1Count?: number;
58
+ /** Checks omitted because their underlying evidence is unavailable. */
59
+ unavailableChecks?: readonly PageSeoCheckId[];
55
60
  }
56
61
  /** Page score weights. Must sum to 100. */
57
62
  export declare const PAGE_SEO_WEIGHTS: {
@@ -1 +1 @@
1
- {"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/seo/score.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/seo/score.ts"],"names":[],"mappings":"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"}
package/dist/seo/score.js CHANGED
@@ -74,7 +74,10 @@ function wordCountOf(content) {
74
74
  */
75
75
  export function calculatePageSeoScore(input) {
76
76
  const checks = [];
77
+ const unavailable = new Set(input.unavailableChecks ?? []);
77
78
  const push = (id, label, max, status, message) => {
79
+ if (unavailable.has(id))
80
+ return;
78
81
  const points = status === 'pass' ? max : status === 'warn' ? Math.round(max * 0.5) : 0;
79
82
  checks.push({ id, label, points, max, status, message });
80
83
  };
@@ -116,12 +119,13 @@ export function calculatePageSeoScore(input) {
116
119
  push('canonical', 'Canonical URL', PAGE_SEO_WEIGHTS.canonical, present(input.canonicalUrl) ? 'pass' : 'warn', present(input.canonicalUrl) ? 'Canonical URL is set.' : 'No canonical URL set.');
117
120
  // -- H1 -------------------------------------------------------------------
118
121
  const content = input.content ?? '';
119
- const h1Count = countH1(content);
122
+ const hasExplicitH1Count = typeof input.h1Count === 'number';
123
+ const h1Count = typeof input.h1Count === 'number' ? input.h1Count : countH1(content);
120
124
  if (h1Count === 1) {
121
125
  push('h1', 'H1 heading', PAGE_SEO_WEIGHTS.h1, 'pass', 'Exactly one H1 heading.');
122
126
  }
123
127
  else if (h1Count === 0) {
124
- push('h1', 'H1 heading', PAGE_SEO_WEIGHTS.h1, content.length === 0 ? 'warn' : 'fail', 'No H1 heading found.');
128
+ push('h1', 'H1 heading', PAGE_SEO_WEIGHTS.h1, !hasExplicitH1Count && content.length === 0 ? 'warn' : 'fail', 'No H1 heading found.');
125
129
  }
126
130
  else {
127
131
  push('h1', 'H1 heading', PAGE_SEO_WEIGHTS.h1, 'warn', `Found ${h1Count} H1 headings. Use exactly one.`);
@@ -156,8 +160,9 @@ export function calculatePageSeoScore(input) {
156
160
  push('indexable', 'Indexability', PAGE_SEO_WEIGHTS.indexable, accidentalNoindex ? 'fail' : 'pass', accidentalNoindex
157
161
  ? 'Page is set to noindex but should be indexable.'
158
162
  : 'Indexability is correct.');
159
- const earned = checks.reduce((sum, c) => sum + c.points, 0);
160
- const score = Math.max(0, Math.min(100, Math.round(earned)));
163
+ const earned = checks.reduce((sum, check) => sum + check.points, 0);
164
+ const knownMaximum = checks.reduce((sum, check) => sum + check.max, 0);
165
+ const score = knownMaximum === 0 ? 100 : Math.max(0, Math.min(100, Math.round((earned / knownMaximum) * 100)));
161
166
  return { score, grade: gradeForSeoScore(score), checks };
162
167
  }
163
168
  function clampScore(n) {
@@ -1 +1 @@
1
- {"version":3,"file":"score.js","sourceRoot":"","sources":["../../src/seo/score.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"score.js","sourceRoot":"","sources":["../../src/seo/score.ts"],"names":[],"mappings":"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"}
@@ -28,9 +28,21 @@ export declare const DEFAULT_UPDATE_SERVER = "https://updates.prenta.io";
28
28
  /**
29
29
  * Hostnames earlier releases were shipped with, newest first.
30
30
  *
31
- * Kept as a record rather than deleted: each one is a population of deployed
32
- * sites that will call it forever. Every entry here needs to keep pointing at
33
- * the update server for those sites to receive anything at all.
31
+ * Each entry is a population of deployed sites that will call it forever,
32
+ * because the host is compiled in. Kept as a record rather than deleted so the
33
+ * cost of retiring one stays legible.
34
+ *
35
+ * **`updates.prentacms.com` is deliberately NOT served.** The domain is being
36
+ * retired in favour of prenta.io, so every install published before this
37
+ * change falls back to the direct npm registry check: it still learns that a
38
+ * newer version exists, but not `breakingChanges`, not `hasMigrations`, and
39
+ * not real release notes — just "Update to x.y.z". Those sites recover only by
40
+ * being upgraded by hand to a release built after this one.
41
+ *
42
+ * That was an accepted trade at a small installed base. It stops being one as
43
+ * the base grows: if you ever retire another hostname, point it at the update
44
+ * server first, because a redirect cannot reach a site that cannot resolve the
45
+ * host that would issue it.
34
46
  */
35
47
  export declare const LEGACY_UPDATE_SERVERS: readonly ["https://updates.prentacms.com"];
36
48
  /** The configured update server, trailing slashes trimmed. */
@@ -1 +1 @@
1
- {"version":3,"file":"update-server.d.ts","sourceRoot":"","sources":["../../src/upgrade/update-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,qBAAqB,8BAA8B,CAAA;AAEhE;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,4CAA6C,CAAA;AAE/E,8DAA8D;AAC9D,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
1
+ {"version":3,"file":"update-server.d.ts","sourceRoot":"","sources":["../../src/upgrade/update-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,qBAAqB,8BAA8B,CAAA;AAEhE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,qBAAqB,4CAA6C,CAAA;AAE/E,8DAA8D;AAC9D,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
@@ -28,9 +28,21 @@ export const DEFAULT_UPDATE_SERVER = 'https://updates.prenta.io';
28
28
  /**
29
29
  * Hostnames earlier releases were shipped with, newest first.
30
30
  *
31
- * Kept as a record rather than deleted: each one is a population of deployed
32
- * sites that will call it forever. Every entry here needs to keep pointing at
33
- * the update server for those sites to receive anything at all.
31
+ * Each entry is a population of deployed sites that will call it forever,
32
+ * because the host is compiled in. Kept as a record rather than deleted so the
33
+ * cost of retiring one stays legible.
34
+ *
35
+ * **`updates.prentacms.com` is deliberately NOT served.** The domain is being
36
+ * retired in favour of prenta.io, so every install published before this
37
+ * change falls back to the direct npm registry check: it still learns that a
38
+ * newer version exists, but not `breakingChanges`, not `hasMigrations`, and
39
+ * not real release notes — just "Update to x.y.z". Those sites recover only by
40
+ * being upgraded by hand to a release built after this one.
41
+ *
42
+ * That was an accepted trade at a small installed base. It stops being one as
43
+ * the base grows: if you ever retire another hostname, point it at the update
44
+ * server first, because a redirect cannot reach a site that cannot resolve the
45
+ * host that would issue it.
34
46
  */
35
47
  export const LEGACY_UPDATE_SERVERS = ['https://updates.prentacms.com'];
36
48
  /** The configured update server, trailing slashes trimmed. */
@@ -1 +1 @@
1
- {"version":3,"file":"update-server.js","sourceRoot":"","sources":["../../src/upgrade/update-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAA;AAEhE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,+BAA+B,CAAU,CAAA;AAE/E,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,qBAAqB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AAC5F,CAAC"}
1
+ {"version":3,"file":"update-server.js","sourceRoot":"","sources":["../../src/upgrade/update-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAA;AAEhE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,+BAA+B,CAAU,CAAA;AAE/E,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,qBAAqB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AAC5F,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prenta/core",
3
- "version": "0.123.0",
3
+ "version": "1.0.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,61 +0,0 @@
1
- import type { PageNode } from './types.js';
2
- export interface ExtractedContent {
3
- plainText: string;
4
- wordCount: number;
5
- headings: {
6
- level: number;
7
- text: string;
8
- blockId: string;
9
- }[];
10
- images: {
11
- src: string;
12
- alt: string;
13
- blockId: string;
14
- }[];
15
- links: {
16
- url: string;
17
- text: string;
18
- internal: boolean;
19
- blockId: string;
20
- }[];
21
- blockTexts: Map<string, string>;
22
- }
23
- export interface ReadabilityResult {
24
- fleschScore: number;
25
- avgSentenceLength: number;
26
- wordCount: number;
27
- readingTime: number;
28
- passiveEstimate: number;
29
- }
30
- export interface SEOCheck {
31
- id: string;
32
- label: string;
33
- status: 'good' | 'warning' | 'error';
34
- detail: string;
35
- blockId?: string;
36
- }
37
- export interface SEOAnalysis {
38
- score: number;
39
- checks: SEOCheck[];
40
- readability: ReadabilityResult;
41
- content: ExtractedContent;
42
- perBlockHints: Map<string, SEOCheck[]>;
43
- }
44
- export interface PageSettings {
45
- title: string;
46
- slug: string;
47
- metaTitle?: string;
48
- metaDescription?: string;
49
- focusKeyphrase?: string;
50
- ogImage?: string;
51
- schemaType?: string;
52
- template?: string;
53
- }
54
- export declare function stripHtml(html: string): string;
55
- export declare function countWords(text: string): number;
56
- export declare function countSentences(text: string): number;
57
- export declare function countSyllables(word: string): number;
58
- export declare function extractContent(tree: PageNode): ExtractedContent;
59
- export declare function analyzeReadability(text: string): ReadabilityResult;
60
- export declare function analyzeSEO(tree: PageNode, pageSettings: PageSettings): SEOAnalysis;
61
- //# sourceMappingURL=seo-analyzer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"seo-analyzer.d.ts","sourceRoot":"","sources":["../../src/page-builder/seo-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA0B,MAAM,YAAY,CAAA;AAKlE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC5D,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACvD,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC1E,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,QAAQ,EAAE,CAAA;IAClB,WAAW,EAAE,iBAAiB,CAAA;IAC9B,OAAO,EAAE,gBAAgB,CAAA;IACzB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBnD;AAsND,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,CAoB/D;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAyClE;AA2BD,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,GAAG,WAAW,CAgalF"}