@rivi-software/agentic-seo-check 0.1.0 → 0.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 (144) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +124 -18
  3. package/dist/brand.d.ts +11 -0
  4. package/dist/brand.js +22 -0
  5. package/dist/brand.js.map +1 -0
  6. package/dist/cli.js +174 -86
  7. package/dist/cli.js.map +1 -1
  8. package/dist/core/aeo/audit.d.ts +44 -0
  9. package/dist/core/aeo/audit.js +310 -0
  10. package/dist/core/aeo/audit.js.map +1 -0
  11. package/dist/core/aeo/bots.d.ts +30 -0
  12. package/dist/core/aeo/bots.js +299 -0
  13. package/dist/core/aeo/bots.js.map +1 -0
  14. package/dist/core/aeo/llms-txt.d.ts +8 -0
  15. package/dist/core/aeo/llms-txt.js +88 -0
  16. package/dist/core/aeo/llms-txt.js.map +1 -0
  17. package/dist/core/aeo/page.d.ts +53 -0
  18. package/dist/core/aeo/page.js +312 -0
  19. package/dist/core/aeo/page.js.map +1 -0
  20. package/dist/core/aeo/probe.d.ts +10 -0
  21. package/dist/core/aeo/probe.js +53 -0
  22. package/dist/core/aeo/probe.js.map +1 -0
  23. package/dist/core/aeo/site-rules.d.ts +13 -0
  24. package/dist/core/aeo/site-rules.js +178 -0
  25. package/dist/core/aeo/site-rules.js.map +1 -0
  26. package/dist/core/audit.d.ts +37 -16
  27. package/dist/core/audit.js +389 -249
  28. package/dist/core/audit.js.map +1 -1
  29. package/dist/core/concurrency.d.ts +4 -4
  30. package/dist/core/concurrency.js +33 -23
  31. package/dist/core/concurrency.js.map +1 -1
  32. package/dist/core/crawl.d.ts +9 -5
  33. package/dist/core/crawl.js +271 -123
  34. package/dist/core/crawl.js.map +1 -1
  35. package/dist/core/fetch.d.ts +5 -5
  36. package/dist/core/fetch.js +151 -100
  37. package/dist/core/fetch.js.map +1 -1
  38. package/dist/core/html/answer.d.ts +4 -0
  39. package/dist/core/html/answer.js +198 -0
  40. package/dist/core/html/answer.js.map +1 -0
  41. package/dist/core/html/dom.d.ts +17 -0
  42. package/dist/core/html/dom.js +83 -0
  43. package/dist/core/html/dom.js.map +1 -0
  44. package/dist/core/html/extract.d.ts +2 -2
  45. package/dist/core/html/extract.js +102 -111
  46. package/dist/core/html/extract.js.map +1 -1
  47. package/dist/core/html/structured-data.d.ts +16 -6
  48. package/dist/core/html/structured-data.js +180 -145
  49. package/dist/core/html/structured-data.js.map +1 -1
  50. package/dist/core/html/text.d.ts +14 -14
  51. package/dist/core/html/text.js +110 -107
  52. package/dist/core/html/text.js.map +1 -1
  53. package/dist/core/lighthouse.d.ts +26 -25
  54. package/dist/core/lighthouse.js +181 -105
  55. package/dist/core/lighthouse.js.map +1 -1
  56. package/dist/core/performance-rules.d.ts +2 -2
  57. package/dist/core/performance-rules.js +105 -33
  58. package/dist/core/performance-rules.js.map +1 -1
  59. package/dist/core/render-rules.d.ts +5 -4
  60. package/dist/core/render-rules.js +129 -62
  61. package/dist/core/render-rules.js.map +1 -1
  62. package/dist/core/render.d.ts +2 -2
  63. package/dist/core/render.js +29 -23
  64. package/dist/core/render.js.map +1 -1
  65. package/dist/core/report/markdown.d.ts +4 -2
  66. package/dist/core/report/markdown.js +210 -129
  67. package/dist/core/report/markdown.js.map +1 -1
  68. package/dist/core/robots.d.ts +12 -5
  69. package/dist/core/robots.js +43 -17
  70. package/dist/core/robots.js.map +1 -1
  71. package/dist/core/rules/aeo.d.ts +11 -0
  72. package/dist/core/rules/aeo.js +423 -0
  73. package/dist/core/rules/aeo.js.map +1 -0
  74. package/dist/core/rules/canonical.d.ts +1 -1
  75. package/dist/core/rules/canonical.js +93 -57
  76. package/dist/core/rules/canonical.js.map +1 -1
  77. package/dist/core/rules/content.js +40 -26
  78. package/dist/core/rules/content.js.map +1 -1
  79. package/dist/core/rules/document.js +64 -41
  80. package/dist/core/rules/document.js.map +1 -1
  81. package/dist/core/rules/headings.js +58 -38
  82. package/dist/core/rules/headings.js.map +1 -1
  83. package/dist/core/rules/hreflang.js +70 -38
  84. package/dist/core/rules/hreflang.js.map +1 -1
  85. package/dist/core/rules/images.js +44 -26
  86. package/dist/core/rules/images.js.map +1 -1
  87. package/dist/core/rules/index.d.ts +10 -6
  88. package/dist/core/rules/index.js +43 -36
  89. package/dist/core/rules/index.js.map +1 -1
  90. package/dist/core/rules/indexing.d.ts +2 -2
  91. package/dist/core/rules/indexing.js +48 -26
  92. package/dist/core/rules/indexing.js.map +1 -1
  93. package/dist/core/rules/keyword.js +84 -47
  94. package/dist/core/rules/keyword.js.map +1 -1
  95. package/dist/core/rules/links.js +72 -37
  96. package/dist/core/rules/links.js.map +1 -1
  97. package/dist/core/rules/meta.js +55 -34
  98. package/dist/core/rules/meta.js.map +1 -1
  99. package/dist/core/rules/response.js +75 -41
  100. package/dist/core/rules/response.js.map +1 -1
  101. package/dist/core/rules/rule.d.ts +6 -6
  102. package/dist/core/rules/rule.js +36 -36
  103. package/dist/core/rules/rule.js.map +1 -1
  104. package/dist/core/rules/social.js +86 -45
  105. package/dist/core/rules/social.js.map +1 -1
  106. package/dist/core/rules/structured-data.d.ts +6 -4
  107. package/dist/core/rules/structured-data.js +314 -102
  108. package/dist/core/rules/structured-data.js.map +1 -1
  109. package/dist/core/rules/title.js +48 -33
  110. package/dist/core/rules/title.js.map +1 -1
  111. package/dist/core/score.d.ts +5 -3
  112. package/dist/core/score.js +11 -9
  113. package/dist/core/score.js.map +1 -1
  114. package/dist/core/site-rules.d.ts +3 -3
  115. package/dist/core/site-rules.js +409 -198
  116. package/dist/core/site-rules.js.map +1 -1
  117. package/dist/core/sitemap.d.ts +5 -5
  118. package/dist/core/sitemap.js +109 -64
  119. package/dist/core/sitemap.js.map +1 -1
  120. package/dist/core/static.d.ts +2 -2
  121. package/dist/core/static.js +210 -112
  122. package/dist/core/static.js.map +1 -1
  123. package/dist/core/summary.d.ts +2 -2
  124. package/dist/core/summary.js +11 -6
  125. package/dist/core/summary.js.map +1 -1
  126. package/dist/core/types.d.ts +189 -14
  127. package/dist/core/types.js +15 -8
  128. package/dist/core/types.js.map +1 -1
  129. package/dist/core/url.d.ts +11 -11
  130. package/dist/core/url.js +122 -70
  131. package/dist/core/url.js.map +1 -1
  132. package/dist/index.d.ts +15 -11
  133. package/dist/index.js +11 -9
  134. package/dist/index.js.map +1 -1
  135. package/dist/mcp-bin.js +7 -4
  136. package/dist/mcp-bin.js.map +1 -1
  137. package/dist/mcp.d.ts +3 -3
  138. package/dist/mcp.js +437 -121
  139. package/dist/mcp.js.map +1 -1
  140. package/dist/version.d.ts +0 -1
  141. package/dist/version.js +4 -2
  142. package/dist/version.js.map +1 -1
  143. package/package.json +32 -10
  144. package/skills/seo-audit/SKILL.md +8 -2
@@ -1,77 +1,144 @@
1
- import { robotsDirectives } from './rules/indexing.js';
2
- import { finding, GOOGLE_DOCS } from './rules/rule.js';
1
+ import { robotsDirectives } from "./rules/indexing.js";
2
+ import { finding, GOOGLE_DOCS } from "./rules/rule.js";
3
3
  const meta = (id, severity, description, recommendation) => ({
4
4
  id,
5
- category: 'rendering',
5
+ category: "rendering",
6
6
  severity,
7
7
  description,
8
8
  recommendation,
9
9
  docs: GOOGLE_DOCS.javascript,
10
- requires: 'render',
10
+ requires: "render",
11
11
  });
12
- const SSR_FIX = 'Render this in the server HTML (SSR/SSG/prerender). Googlebot queues JavaScript rendering separately and other crawlers and link previews never run it.';
12
+ const SSR_FIX = "Render this in the server HTML (SSR/SSG/prerender). Googlebot queues JavaScript rendering separately and other crawlers and link previews never run it.";
13
13
  export const RENDER_RULES = [
14
- meta('rendering.title-client-only', 'warning', 'The <title> only exists after JavaScript runs.', SSR_FIX),
15
- meta('rendering.title-changed', 'info', 'JavaScript changes the <title> after load.', 'Make the server HTML title match the final title so both agree.'),
16
- meta('rendering.description-client-only', 'warning', 'The meta description only exists after JavaScript runs.', SSR_FIX),
17
- meta('rendering.canonical-client-only', 'warning', 'The canonical link only exists after JavaScript runs.', SSR_FIX),
18
- meta('rendering.canonical-changed', 'warning', 'JavaScript changes the canonical URL after load, sending conflicting signals.', 'Emit the final canonical in the server HTML and do not modify it client-side.'),
19
- meta('rendering.noindex-client-only', 'error', 'A noindex directive is injected by JavaScript. Google applies it when it renders the page, which removes the page from the index.', 'Remove the client-side noindex (often a framework/head-manager default or an auth guard) or move the decision to the server.'),
20
- meta('rendering.noindex-removed-by-js', 'warning', 'The server HTML says noindex but JavaScript removes it. Google honours the server noindex and skips rendering, so the page stays out of the index.', 'Remove noindex from the server HTML if the page should be indexed.'),
21
- meta('rendering.h1-client-only', 'warning', 'The <h1> only exists after JavaScript runs.', SSR_FIX),
22
- meta('rendering.content-client-only', 'warning', 'Most of the body text only exists after JavaScript runs.', SSR_FIX),
23
- meta('rendering.links-client-only', 'warning', 'Most internal links only exist after JavaScript runs, delaying discovery of the linked pages.', `${SSR_FIX} At minimum, render the main navigation and content links server-side.`),
24
- meta('rendering.structured-data-client-only', 'info', 'Structured data is only added by JavaScript.', 'Google processes JSON-LD injected by JavaScript, but other consumers do not. Prefer emitting it in the server HTML.'),
25
- meta('rendering.console-errors', 'info', 'The page logged JavaScript errors while rendering.', 'Fix runtime errors; a failing script can leave crawlers with an incomplete page.'),
14
+ meta("rendering.title-client-only", "warning", "The <title> only exists after JavaScript runs.", SSR_FIX),
15
+ meta("rendering.title-changed", "info", "JavaScript changes the <title> after load.", "Make the server HTML title match the final title so both agree."),
16
+ meta("rendering.description-client-only", "warning", "The meta description only exists after JavaScript runs.", SSR_FIX),
17
+ meta("rendering.canonical-client-only", "warning", "The canonical link only exists after JavaScript runs.", SSR_FIX),
18
+ meta("rendering.canonical-changed", "warning", "JavaScript changes the canonical URL after load, sending conflicting signals.", "Emit the final canonical in the server HTML and do not modify it client-side."),
19
+ meta("rendering.noindex-client-only", "error", "A noindex directive is injected by JavaScript. Google applies it when it renders the page, which removes the page from the index.", "Remove the client-side noindex (often a framework/head-manager default or an auth guard) or move the decision to the server."),
20
+ meta("rendering.noindex-removed-by-js", "warning", "The server HTML says noindex but JavaScript removes it. Google honours the server noindex and skips rendering, so the page stays out of the index.", "Remove noindex from the server HTML if the page should be indexed."),
21
+ meta("rendering.h1-client-only", "warning", "The <h1> only exists after JavaScript runs.", SSR_FIX),
22
+ meta("rendering.content-client-only", "warning", "Most of the body text only exists after JavaScript runs.", SSR_FIX),
23
+ meta("rendering.links-client-only", "warning", "Most internal links only exist after JavaScript runs, delaying discovery of the linked pages.", `${SSR_FIX} At minimum, render the main navigation and content links server-side.`),
24
+ meta("rendering.structured-data-client-only", "info", "Structured data is only added by JavaScript.", "Google processes JSON-LD injected by JavaScript, but other consumers do not. Prefer emitting it in the server HTML."),
25
+ meta("rendering.console-errors", "info", "The page logged JavaScript errors while rendering.", "Fix runtime errors; a failing script can leave crawlers with an incomplete page."),
26
26
  ];
27
27
  const byId = new Map(RENDER_RULES.map((r) => [r.id, r]));
28
- const m = (id) => byId.get(id);
29
- export function snapshot(page, response) {
30
- return {
31
- title: page.title,
32
- metaDescription: page.metaDescription,
33
- canonical: page.canonical,
34
- robots: robotsDirectives(page, response).directives,
35
- h1Count: page.h1s.filter(Boolean).length,
36
- wordCount: page.wordCount,
37
- internalLinks: page.links.filter((l) => l.internal).length,
38
- structuredDataCount: page.structuredData.length,
39
- };
40
- }
41
- export function compareRender(raw, rendered, renderedUrl, consoleErrors, rawResponse) {
42
- const a = snapshot(raw, rawResponse);
43
- const b = snapshot(rendered);
28
+ const m = (id) => {
29
+ const rule = byId.get(id);
30
+ if (!rule) {
31
+ throw new Error(`Unknown rendering rule: ${id}`);
32
+ }
33
+ return rule;
34
+ };
35
+ export const snapshot = (page, response) => ({
36
+ title: page.title,
37
+ metaDescription: page.metaDescription,
38
+ canonical: page.canonical,
39
+ robots: robotsDirectives(page, response).directives,
40
+ h1Count: page.h1s.filter(Boolean).length,
41
+ wordCount: page.wordCount,
42
+ internalLinks: page.links.filter((l) => l.internal).length,
43
+ structuredDataCount: page.structuredData.length,
44
+ });
45
+ /** Title, description, canonical and robots: what the head says before and after JavaScript runs. */
46
+ const headFindings = (a, b) => {
44
47
  const findings = [];
45
- const url = rawResponse?.finalUrl ?? raw.url;
46
- const add = (f) => findings.push({ ...f, url });
47
- if (!a.title && b.title)
48
- add(finding(m('rendering.title-client-only'), `Title "${b.title}" is only present after rendering.`, { selector: 'head > title', evidence: { raw: a.title, rendered: b.title } }));
49
- else if (a.title && b.title && a.title !== b.title)
50
- add(finding(m('rendering.title-changed'), 'Title differs between server HTML and rendered DOM.', { selector: 'head > title', evidence: { raw: a.title, rendered: b.title } }));
51
- if (!a.metaDescription && b.metaDescription)
52
- add(finding(m('rendering.description-client-only'), 'Meta description is only present after rendering.', { selector: 'head > meta[name="description"]', evidence: { rendered: b.metaDescription } }));
53
- if (!a.canonical && b.canonical)
54
- add(finding(m('rendering.canonical-client-only'), `Canonical ${b.canonical} is only present after rendering.`, { selector: 'head > link[rel="canonical"]', evidence: { rendered: b.canonical } }));
55
- else if (a.canonical && b.canonical && a.canonical !== b.canonical)
56
- add(finding(m('rendering.canonical-changed'), 'Canonical differs between server HTML and rendered DOM.', { selector: 'head > link[rel="canonical"]', evidence: { raw: a.canonical, rendered: b.canonical } }));
57
- const rawNoindex = a.robots.some((d) => d === 'noindex' || d === 'none');
58
- const renderedNoindex = b.robots.some((d) => d === 'noindex' || d === 'none');
59
- if (!rawNoindex && renderedNoindex)
60
- add(finding(m('rendering.noindex-client-only'), 'noindex is added by JavaScript.', { selector: 'head > meta[name="robots"]', evidence: { raw: a.robots, rendered: b.robots } }));
61
- if (rawNoindex && !renderedNoindex)
62
- add(finding(m('rendering.noindex-removed-by-js'), 'Server HTML contains noindex; JavaScript removes it.', { selector: 'head > meta[name="robots"]', evidence: { raw: a.robots, rendered: b.robots } }));
63
- if (a.h1Count === 0 && b.h1Count > 0)
64
- add(finding(m('rendering.h1-client-only'), 'The <h1> is only present after rendering.', { selector: 'h1', evidence: { rawH1Count: a.h1Count, renderedH1Count: b.h1Count } }));
48
+ const add = (f) => findings.push(f);
49
+ if (!a.title && b.title) {
50
+ add(finding(m("rendering.title-client-only"), `Title "${b.title}" is only present after rendering.`, {
51
+ selector: "head > title",
52
+ evidence: { raw: a.title, rendered: b.title },
53
+ }));
54
+ }
55
+ else if (a.title && b.title && a.title !== b.title) {
56
+ add(finding(m("rendering.title-changed"), "Title differs between server HTML and rendered DOM.", {
57
+ selector: "head > title",
58
+ evidence: { raw: a.title, rendered: b.title },
59
+ }));
60
+ }
61
+ if (!a.metaDescription && b.metaDescription) {
62
+ add(finding(m("rendering.description-client-only"), "Meta description is only present after rendering.", {
63
+ selector: 'head > meta[name="description"]',
64
+ evidence: { rendered: b.metaDescription },
65
+ }));
66
+ }
67
+ if (!a.canonical && b.canonical) {
68
+ add(finding(m("rendering.canonical-client-only"), `Canonical ${b.canonical} is only present after rendering.`, {
69
+ selector: 'head > link[rel="canonical"]',
70
+ evidence: { rendered: b.canonical },
71
+ }));
72
+ }
73
+ else if (a.canonical && b.canonical && a.canonical !== b.canonical) {
74
+ add(finding(m("rendering.canonical-changed"), "Canonical differs between server HTML and rendered DOM.", {
75
+ selector: 'head > link[rel="canonical"]',
76
+ evidence: { raw: a.canonical, rendered: b.canonical },
77
+ }));
78
+ }
79
+ const rawNoindex = a.robots.some((d) => d === "noindex" || d === "none");
80
+ const renderedNoindex = b.robots.some((d) => d === "noindex" || d === "none");
81
+ if (!rawNoindex && renderedNoindex) {
82
+ add(finding(m("rendering.noindex-client-only"), "noindex is added by JavaScript.", {
83
+ selector: 'head > meta[name="robots"]',
84
+ evidence: { raw: a.robots, rendered: b.robots },
85
+ }));
86
+ }
87
+ if (rawNoindex && !renderedNoindex) {
88
+ add(finding(m("rendering.noindex-removed-by-js"), "Server HTML contains noindex; JavaScript removes it.", {
89
+ selector: 'head > meta[name="robots"]',
90
+ evidence: { raw: a.robots, rendered: b.robots },
91
+ }));
92
+ }
93
+ return findings;
94
+ };
95
+ /** H1, words, links, structured data and script errors: what only the rendered body has. */
96
+ const bodyFindings = (a, b, consoleErrors) => {
97
+ const findings = [];
98
+ const add = (f) => findings.push(f);
99
+ if (a.h1Count === 0 && b.h1Count > 0) {
100
+ add(finding(m("rendering.h1-client-only"), "The <h1> is only present after rendering.", {
101
+ selector: "h1",
102
+ evidence: { rawH1Count: a.h1Count, renderedH1Count: b.h1Count },
103
+ }));
104
+ }
65
105
  if (b.wordCount - a.wordCount >= 100 && a.wordCount < b.wordCount * 0.5) {
66
- add(finding(m('rendering.content-client-only'), `Server HTML has ${a.wordCount} words; rendered DOM has ${b.wordCount}.`, { evidence: { rawWords: a.wordCount, renderedWords: b.wordCount } }));
106
+ add(finding(m("rendering.content-client-only"), `Server HTML has ${a.wordCount} words; rendered DOM has ${b.wordCount}.`, { evidence: { rawWords: a.wordCount, renderedWords: b.wordCount } }));
107
+ }
108
+ if (b.internalLinks - a.internalLinks >= 10 &&
109
+ a.internalLinks < b.internalLinks * 0.5) {
110
+ add(finding(m("rendering.links-client-only"), `Server HTML has ${a.internalLinks} internal links; rendered DOM has ${b.internalLinks}.`, {
111
+ evidence: {
112
+ rawLinks: a.internalLinks,
113
+ renderedLinks: b.internalLinks,
114
+ },
115
+ }));
116
+ }
117
+ if (a.structuredDataCount === 0 && b.structuredDataCount > 0) {
118
+ add(finding(m("rendering.structured-data-client-only"), `${b.structuredDataCount} structured data item(s) are only present after rendering.`, { evidence: { renderedCount: b.structuredDataCount } }));
67
119
  }
68
- if (b.internalLinks - a.internalLinks >= 10 && a.internalLinks < b.internalLinks * 0.5) {
69
- add(finding(m('rendering.links-client-only'), `Server HTML has ${a.internalLinks} internal links; rendered DOM has ${b.internalLinks}.`, { evidence: { rawLinks: a.internalLinks, renderedLinks: b.internalLinks } }));
120
+ if (consoleErrors.length) {
121
+ add(finding(m("rendering.console-errors"), `${consoleErrors.length} JavaScript error(s) logged during render.`, { evidence: { errors: consoleErrors.slice(0, 5) } }));
70
122
  }
71
- if (a.structuredDataCount === 0 && b.structuredDataCount > 0)
72
- add(finding(m('rendering.structured-data-client-only'), `${b.structuredDataCount} structured data item(s) are only present after rendering.`, { evidence: { renderedCount: b.structuredDataCount } }));
73
- if (consoleErrors.length)
74
- add(finding(m('rendering.console-errors'), `${consoleErrors.length} JavaScript error(s) logged during render.`, { evidence: { errors: consoleErrors.slice(0, 5) } }));
75
- return { comparison: { tool: 'playwright', renderedUrl, consoleErrors: consoleErrors.slice(0, 20), raw: a, rendered: b }, findings };
76
- }
123
+ return findings;
124
+ };
125
+ export const compareRender = (raw, rendered, renderedUrl, consoleErrors, rawResponse) => {
126
+ const a = snapshot(raw, rawResponse);
127
+ const b = snapshot(rendered);
128
+ const url = rawResponse?.finalUrl ?? raw.url;
129
+ const findings = [
130
+ ...headFindings(a, b),
131
+ ...bodyFindings(a, b, consoleErrors),
132
+ ].map((f) => ({ ...f, url }));
133
+ return {
134
+ comparison: {
135
+ tool: "playwright",
136
+ renderedUrl,
137
+ consoleErrors: consoleErrors.slice(0, 20),
138
+ raw: a,
139
+ rendered: b,
140
+ },
141
+ findings,
142
+ };
143
+ };
77
144
  //# sourceMappingURL=render-rules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-rules.js","sourceRoot":"","sources":["../../src/core/render-rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render-rules.js","sourceRoot":"","sources":["../../src/core/render-rules.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ export interface RenderOptions {
10
10
  height: number;
11
11
  };
12
12
  /** Wait condition passed to Playwright. */
13
- waitUntil?: 'load' | 'domcontentloaded' | 'networkidle';
13
+ waitUntil?: "load" | "domcontentloaded" | "networkidle";
14
14
  }
15
15
  export interface RenderOutput {
16
16
  html: string;
@@ -19,4 +19,4 @@ export interface RenderOutput {
19
19
  }
20
20
  export declare const RENDER_INSTALL_HINT = "Install Playwright to enable rendering: `pnpm add -D playwright && pnpm exec playwright install chromium` (or npm/npx equivalents).";
21
21
  /** Load the page in headless Chromium and return the rendered DOM. */
22
- export declare function renderPage(url: string, options?: RenderOptions): Promise<RenderOutput>;
22
+ export declare const renderPage: (url: string, options?: RenderOptions) => Promise<RenderOutput>;
@@ -1,14 +1,15 @@
1
- import { DEFAULT_USER_AGENT } from './fetch.js';
1
+ import { DEFAULT_USER_AGENT } from "./fetch.js";
2
2
  export class RenderUnavailableError extends Error {
3
3
  constructor(message) {
4
4
  super(message);
5
- this.name = 'RenderUnavailableError';
5
+ this.name = "RenderUnavailableError";
6
6
  }
7
7
  }
8
- export const RENDER_INSTALL_HINT = 'Install Playwright to enable rendering: `pnpm add -D playwright && pnpm exec playwright install chromium` (or npm/npx equivalents).';
9
- async function launchSystemBrowser(playwright) {
10
- for (const channel of ['chrome', 'msedge']) {
8
+ export const RENDER_INSTALL_HINT = "Install Playwright to enable rendering: `pnpm add -D playwright && pnpm exec playwright install chromium` (or npm/npx equivalents).";
9
+ const launchSystemBrowser = async (playwright) => {
10
+ for (const channel of ["chrome", "msedge"]) {
11
11
  try {
12
+ // oxlint-disable-next-line eslint/no-await-in-loop -- one browser at a time, in order of preference
12
13
  return await playwright.chromium.launch({ headless: true, channel });
13
14
  }
14
15
  catch {
@@ -16,15 +17,13 @@ async function launchSystemBrowser(playwright) {
16
17
  }
17
18
  }
18
19
  return null;
19
- }
20
- function firstLine(message) {
21
- return message.split('\n')[0] ?? message;
22
- }
20
+ };
21
+ const firstLine = (message) => message.split("\n")[0] ?? message;
23
22
  /** Load the page in headless Chromium and return the rendered DOM. */
24
- export async function renderPage(url, options = {}) {
23
+ export const renderPage = async (url, options = {}) => {
25
24
  let playwright;
26
25
  try {
27
- playwright = await import('playwright');
26
+ playwright = await import("playwright");
28
27
  }
29
28
  catch {
30
29
  throw new RenderUnavailableError(`Playwright is not installed. ${RENDER_INSTALL_HINT}`);
@@ -33,11 +32,12 @@ export async function renderPage(url, options = {}) {
33
32
  try {
34
33
  browser = await playwright.chromium.launch({ headless: true });
35
34
  }
36
- catch (err) {
35
+ catch (error) {
37
36
  // No downloaded Playwright browser: fall back to an installed Google Chrome / Edge.
38
37
  const fallback = await launchSystemBrowser(playwright);
39
- if (!fallback)
40
- throw new RenderUnavailableError(`Could not launch Chromium: ${firstLine(err.message)}. ${RENDER_INSTALL_HINT}`);
38
+ if (!fallback) {
39
+ throw new RenderUnavailableError(`Could not launch Chromium: ${firstLine(error instanceof Error ? error.message : String(error))}. ${RENDER_INSTALL_HINT}`);
40
+ }
41
41
  browser = fallback;
42
42
  }
43
43
  const timeout = options.timeoutMs ?? 30_000;
@@ -49,25 +49,31 @@ export async function renderPage(url, options = {}) {
49
49
  extraHTTPHeaders: options.headers,
50
50
  });
51
51
  const page = await context.newPage();
52
- page.on('console', (msg) => {
53
- if (msg.type() === 'error')
52
+ page.on("console", (msg) => {
53
+ if (msg.type() === "error") {
54
54
  consoleErrors.push(msg.text().slice(0, 300));
55
+ }
55
56
  });
56
- page.on('pageerror', (err) => consoleErrors.push(err.message.slice(0, 300)));
57
+ page.on("pageerror", (err) => consoleErrors.push(err.message.slice(0, 300)));
57
58
  try {
58
- await page.goto(url, { waitUntil: options.waitUntil ?? 'networkidle', timeout });
59
+ await page.goto(url, {
60
+ waitUntil: options.waitUntil ?? "networkidle",
61
+ timeout,
62
+ });
59
63
  }
60
- catch (err) {
64
+ catch (error) {
61
65
  // networkidle can time out on pages with long-polling; fall back to whatever has loaded.
62
- if (!(err instanceof Error) || !/Timeout/i.test(err.message))
63
- throw err;
66
+ if (!(error instanceof Error) || !/Timeout/iu.test(error.message)) {
67
+ throw error;
68
+ }
64
69
  }
65
70
  await page.waitForTimeout(250);
66
71
  const html = await page.content();
67
72
  return { html, finalUrl: page.url(), consoleErrors };
68
73
  }
69
74
  finally {
70
- await browser.close().catch(() => undefined);
75
+ // A browser that fails to close must not replace the page's result or its error.
76
+ await browser.close().catch(() => null);
71
77
  }
72
- }
78
+ };
73
79
  //# sourceMappingURL=render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/core/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/core/render.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
- import type { Audit } from '../types.js';
2
- export declare function renderMarkdown(audit: Audit): string;
1
+ import type { AeoAudit, Audit } from "../types.js";
2
+ /** The Markdown report of an AEO audit. */
3
+ export declare const renderAeoMarkdown: (audit: AeoAudit) => string;
4
+ export declare const renderMarkdown: (audit: Audit) => string;