@rivi-software/agentic-seo-check 0.4.0 → 0.5.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 (128) hide show
  1. package/README.md +29 -5
  2. package/dist/cli.js +20 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/aeo/audit.d.ts +8 -0
  5. package/dist/core/aeo/audit.js +101 -17
  6. package/dist/core/aeo/audit.js.map +1 -1
  7. package/dist/core/aeo/bots.d.ts +48 -0
  8. package/dist/core/aeo/bots.js +151 -5
  9. package/dist/core/aeo/bots.js.map +1 -1
  10. package/dist/core/aeo/fixes.d.ts +38 -0
  11. package/dist/core/aeo/fixes.js +111 -0
  12. package/dist/core/aeo/fixes.js.map +1 -0
  13. package/dist/core/aeo/site-rules.d.ts +5 -0
  14. package/dist/core/aeo/site-rules.js +293 -10
  15. package/dist/core/aeo/site-rules.js.map +1 -1
  16. package/dist/core/audit.d.ts +8 -0
  17. package/dist/core/audit.js +144 -25
  18. package/dist/core/audit.js.map +1 -1
  19. package/dist/core/crawl.js +43 -4
  20. package/dist/core/crawl.js.map +1 -1
  21. package/dist/core/html/answer.d.ts +5 -2
  22. package/dist/core/html/answer.js +25 -7
  23. package/dist/core/html/answer.js.map +1 -1
  24. package/dist/core/html/dom.d.ts +13 -1
  25. package/dist/core/html/dom.js +30 -2
  26. package/dist/core/html/dom.js.map +1 -1
  27. package/dist/core/html/extract.js +122 -30
  28. package/dist/core/html/extract.js.map +1 -1
  29. package/dist/core/html/head.js +114 -19
  30. package/dist/core/html/head.js.map +1 -1
  31. package/dist/core/html/resources.js +15 -7
  32. package/dist/core/html/resources.js.map +1 -1
  33. package/dist/core/html/structured-data.js +21 -5
  34. package/dist/core/html/structured-data.js.map +1 -1
  35. package/dist/core/lighthouse.d.ts +2 -5
  36. package/dist/core/lighthouse.js +290 -5
  37. package/dist/core/lighthouse.js.map +1 -1
  38. package/dist/core/performance-fixes.d.ts +25 -0
  39. package/dist/core/performance-fixes.js +446 -0
  40. package/dist/core/performance-fixes.js.map +1 -0
  41. package/dist/core/performance-rules.js +56 -8
  42. package/dist/core/performance-rules.js.map +1 -1
  43. package/dist/core/recheck.d.ts +68 -0
  44. package/dist/core/recheck.js +247 -0
  45. package/dist/core/recheck.js.map +1 -0
  46. package/dist/core/render-fixes.d.ts +27 -0
  47. package/dist/core/render-fixes.js +164 -0
  48. package/dist/core/render-fixes.js.map +1 -0
  49. package/dist/core/render-rules.js +60 -21
  50. package/dist/core/render-rules.js.map +1 -1
  51. package/dist/core/report/markdown.js +68 -1
  52. package/dist/core/report/markdown.js.map +1 -1
  53. package/dist/core/robots.d.ts +5 -0
  54. package/dist/core/robots.js +8 -0
  55. package/dist/core/robots.js.map +1 -1
  56. package/dist/core/rules/aeo.js +339 -25
  57. package/dist/core/rules/aeo.js.map +1 -1
  58. package/dist/core/rules/canonical.js +107 -11
  59. package/dist/core/rules/canonical.js.map +1 -1
  60. package/dist/core/rules/content.js +65 -7
  61. package/dist/core/rules/content.js.map +1 -1
  62. package/dist/core/rules/document.js +73 -8
  63. package/dist/core/rules/document.js.map +1 -1
  64. package/dist/core/rules/fix.d.ts +55 -0
  65. package/dist/core/rules/fix.js +159 -0
  66. package/dist/core/rules/fix.js.map +1 -0
  67. package/dist/core/rules/head.js +81 -4
  68. package/dist/core/rules/head.js.map +1 -1
  69. package/dist/core/rules/headings.js +92 -9
  70. package/dist/core/rules/headings.js.map +1 -1
  71. package/dist/core/rules/hreflang.js +79 -9
  72. package/dist/core/rules/hreflang.js.map +1 -1
  73. package/dist/core/rules/images.js +49 -0
  74. package/dist/core/rules/images.js.map +1 -1
  75. package/dist/core/rules/index.d.ts +11 -0
  76. package/dist/core/rules/index.js +21 -1
  77. package/dist/core/rules/index.js.map +1 -1
  78. package/dist/core/rules/indexing.js +108 -1
  79. package/dist/core/rules/indexing.js.map +1 -1
  80. package/dist/core/rules/keyword.js +91 -1
  81. package/dist/core/rules/keyword.js.map +1 -1
  82. package/dist/core/rules/links.js +42 -0
  83. package/dist/core/rules/links.js.map +1 -1
  84. package/dist/core/rules/loading.js +54 -1
  85. package/dist/core/rules/loading.js.map +1 -1
  86. package/dist/core/rules/meta.js +36 -5
  87. package/dist/core/rules/meta.js.map +1 -1
  88. package/dist/core/rules/page-fixes.d.ts +39 -0
  89. package/dist/core/rules/page-fixes.js +107 -0
  90. package/dist/core/rules/page-fixes.js.map +1 -0
  91. package/dist/core/rules/quoted-tags.d.ts +23 -0
  92. package/dist/core/rules/quoted-tags.js +79 -0
  93. package/dist/core/rules/quoted-tags.js.map +1 -0
  94. package/dist/core/rules/response.js +71 -7
  95. package/dist/core/rules/response.js.map +1 -1
  96. package/dist/core/rules/rule.d.ts +17 -4
  97. package/dist/core/rules/rule.js +11 -2
  98. package/dist/core/rules/rule.js.map +1 -1
  99. package/dist/core/rules/social.js +101 -10
  100. package/dist/core/rules/social.js.map +1 -1
  101. package/dist/core/rules/structured-data-fixes.d.ts +33 -0
  102. package/dist/core/rules/structured-data-fixes.js +469 -0
  103. package/dist/core/rules/structured-data-fixes.js.map +1 -0
  104. package/dist/core/rules/structured-data-values.js +242 -31
  105. package/dist/core/rules/structured-data-values.js.map +1 -1
  106. package/dist/core/rules/structured-data.js +171 -4
  107. package/dist/core/rules/structured-data.js.map +1 -1
  108. package/dist/core/rules/title.js +39 -5
  109. package/dist/core/rules/title.js.map +1 -1
  110. package/dist/core/rules/urls.js +166 -0
  111. package/dist/core/rules/urls.js.map +1 -1
  112. package/dist/core/site-fixes.d.ts +111 -0
  113. package/dist/core/site-fixes.js +650 -0
  114. package/dist/core/site-fixes.js.map +1 -0
  115. package/dist/core/site-rules.js +474 -53
  116. package/dist/core/site-rules.js.map +1 -1
  117. package/dist/core/sitemap.d.ts +16 -0
  118. package/dist/core/sitemap.js +34 -0
  119. package/dist/core/sitemap.js.map +1 -1
  120. package/dist/core/types.d.ts +223 -3
  121. package/dist/core/types.js.map +1 -1
  122. package/dist/index.d.ts +2 -0
  123. package/dist/index.js +1 -0
  124. package/dist/index.js.map +1 -1
  125. package/dist/mcp.js +16 -2
  126. package/dist/mcp.js.map +1 -1
  127. package/package.json +1 -1
  128. package/skills/seo-audit/SKILL.md +22 -5
@@ -1,3 +1,5 @@
1
+ import { cacheHtmlEdit, clsEdits, describedEdit, failedAuditEdits, lcpEdits, lcpFallbackEdit, opportunityEdits, renderBlockingEdits, scriptEdits, uniqueEdits, } from "./performance-fixes.js";
2
+ import { addHtml, slot } from "./rules/fix.js";
1
3
  import { finding, GOOGLE_DOCS } from "./rules/rule.js";
2
4
  const meta = (id, severity, description, recommendation, docs = GOOGLE_DOCS.cwv) => ({
3
5
  id,
@@ -27,29 +29,59 @@ const m = (id) => {
27
29
  }
28
30
  return rule;
29
31
  };
32
+ const pageOf = (result) => result.finalUrl || result.requestedUrl;
33
+ /** `edits`, or `fallback` when Lighthouse named nothing to change. */
34
+ const orElse = (edits, fallback) => edits.length ? uniqueEdits(edits) : [fallback()];
35
+ const UNSIZED_FALLBACK = () => addHtml("img:not([width])", `width="${slot("width in px")}" height="${slot("height in px")}"`, "Lighthouse named no element. Give every image width and height (its pixel size, or any size with its aspect ratio) so the browser reserves its space, and keep height: auto in the CSS; reserve the space of banners, ads and embeds a script inserts.");
36
+ /** `defer` on the head's blocking scripts, when Lighthouse named no file. */
37
+ const DEFER_FALLBACK = () => addHtml('head > script[src]:not([async]):not([defer]):not([type="module"])', "defer", "Lighthouse named no file. defer runs these scripts after the HTML is parsed; leave one blocking only if an inline script calls it before the page has loaded.");
38
+ const lcpFix = (result) => orElse(lcpEdits(result, pageOf(result)), lcpFallbackEdit);
39
+ const tbtFix = (result) => orElse(scriptEdits(result.scripts ?? [], pageOf(result)), DEFER_FALLBACK);
40
+ const fcpFix = (result) => {
41
+ const blocking = renderBlockingEdits(result.renderBlocking ?? [], pageOf(result));
42
+ const slowServer = (result.metrics.ttfbMs ?? 0) > 600;
43
+ return orElse([
44
+ ...blocking,
45
+ ...(slowServer ? [cacheHtmlEdit(result.metrics.ttfbMs)] : []),
46
+ ], DEFER_FALLBACK);
47
+ };
48
+ /** The edits of the opportunities with the largest savings: where a low score comes from. */
49
+ const scoreFix = (result) => orElse(result.opportunities
50
+ .slice(0, 3)
51
+ .flatMap((o) => opportunityEdits(o, result, pageOf(result))), () => lcpFix(result)[0] ?? lcpFallbackEdit());
30
52
  /** LCP, CLS and TBT against the Core Web Vitals thresholds. */
31
53
  const vitalsFindings = (result) => {
32
54
  const out = [];
33
55
  const add = (f) => out.push(f);
34
56
  const { metrics } = result;
57
+ const lcp = result.lcpElement;
35
58
  if (metrics.lcpMs !== null && metrics.lcpMs > 2500) {
59
+ const evidence = {
60
+ lcpMs: Math.round(metrics.lcpMs),
61
+ formFactor: result.formFactor,
62
+ };
63
+ if (lcp) {
64
+ evidence["element"] = lcp.node.snippet;
65
+ evidence["phases"] = lcp.phases;
66
+ }
36
67
  add(finding(m("perf.lcp-slow"), `LCP is ${(metrics.lcpMs / 1000).toFixed(1)} s (${metrics.lcpMs > 4000 ? "poor" : "needs improvement"}).`, {
37
68
  severity: metrics.lcpMs > 4000 ? "error" : "warning",
38
- evidence: {
39
- lcpMs: Math.round(metrics.lcpMs),
40
- formFactor: result.formFactor,
41
- },
69
+ fix: lcpFix(result),
70
+ selector: lcp?.node.selector,
71
+ evidence,
42
72
  }));
43
73
  }
44
74
  if (metrics.cls !== null && metrics.cls > 0.1) {
45
75
  add(finding(m("perf.cls-high"), `CLS is ${metrics.cls.toFixed(3)} (${metrics.cls > 0.25 ? "poor" : "needs improvement"}).`, {
46
76
  severity: metrics.cls > 0.25 ? "error" : "warning",
77
+ fix: orElse(clsEdits(result), UNSIZED_FALLBACK),
47
78
  evidence: { cls: Number(metrics.cls.toFixed(3)) },
48
79
  }));
49
80
  }
50
81
  if (metrics.tbtMs !== null && metrics.tbtMs > 200) {
51
82
  add(finding(m("perf.tbt-high"), `TBT is ${Math.round(metrics.tbtMs)} ms (${metrics.tbtMs > 600 ? "poor" : "needs improvement"}).`, {
52
83
  severity: metrics.tbtMs > 600 ? "error" : "warning",
84
+ fix: tbtFix(result),
53
85
  evidence: { tbtMs: Math.round(metrics.tbtMs) },
54
86
  }));
55
87
  }
@@ -63,14 +95,19 @@ const timingFindings = (result) => {
63
95
  if (metrics.fcpMs !== null && metrics.fcpMs > 1800) {
64
96
  add(finding(m("perf.fcp-slow"), `FCP is ${(metrics.fcpMs / 1000).toFixed(1)} s.`, {
65
97
  severity: metrics.fcpMs > 3000 ? "warning" : "info",
98
+ fix: fcpFix(result),
66
99
  evidence: { fcpMs: Math.round(metrics.fcpMs) },
67
100
  }));
68
101
  }
69
102
  if (metrics.ttfbMs !== null && metrics.ttfbMs > 800) {
70
- add(finding(m("perf.ttfb-slow"), `Server response time is ${Math.round(metrics.ttfbMs)} ms.`, { evidence: { ttfbMs: Math.round(metrics.ttfbMs) } }));
103
+ add(finding(m("perf.ttfb-slow"), `Server response time is ${Math.round(metrics.ttfbMs)} ms.`, {
104
+ fix: [cacheHtmlEdit(metrics.ttfbMs)],
105
+ evidence: { ttfbMs: Math.round(metrics.ttfbMs) },
106
+ }));
71
107
  }
72
108
  if (metrics.performanceScore !== null && metrics.performanceScore < 50) {
73
109
  add(finding(m("perf.score-low"), `Lighthouse performance score is ${metrics.performanceScore}/100.`, {
110
+ fix: scoreFix(result),
74
111
  evidence: {
75
112
  performanceScore: metrics.performanceScore,
76
113
  formFactor: result.formFactor,
@@ -92,6 +129,8 @@ const auditFindings = (result) => {
92
129
  .join(", ");
93
130
  add(finding(m("perf.opportunity"), `${opp.title}${savings ? ` (est. savings ${savings})` : ""}.`, {
94
131
  recommendation: opp.description,
132
+ fix: orElse(opportunityEdits(opp, result, pageOf(result)), () => describedEdit(opp.title, opp.description)),
133
+ key: opp.id,
95
134
  evidence: {
96
135
  auditId: opp.id,
97
136
  savingsMs: opp.savingsMs,
@@ -103,23 +142,32 @@ const auditFindings = (result) => {
103
142
  for (const audit of result.failedSeoAudits) {
104
143
  add(finding(m("lighthouse.seo-audit-failed"), `Lighthouse SEO audit "${audit.title}" failed${audit.displayValue ? `: ${audit.displayValue}` : ""}.`, {
105
144
  recommendation: audit.description,
145
+ fix: orElse(failedAuditEdits(audit, result), () => describedEdit(audit.title, audit.description)),
146
+ key: audit.id,
106
147
  evidence: { auditId: audit.id, score: audit.score },
107
148
  }));
108
149
  }
109
150
  for (const audit of result.agenticBrowsingAudits) {
110
151
  add(finding(m("lighthouse.agentic-audit-failed"), `Lighthouse agentic-browsing audit "${audit.title}" failed${audit.displayValue ? `: ${audit.displayValue}` : ""}.`, {
111
152
  recommendation: audit.description,
153
+ fix: orElse(failedAuditEdits(audit, result), () => describedEdit(audit.title, audit.description)),
154
+ key: audit.id,
112
155
  evidence: { auditId: audit.id, score: audit.score },
113
156
  }));
114
157
  }
115
158
  return out;
116
159
  };
117
160
  export const performanceFindings = (result) => {
118
- const url = result.finalUrl || result.requestedUrl;
119
- return [
161
+ const url = pageOf(result);
162
+ const findings = [
120
163
  ...vitalsFindings(result),
121
164
  ...timingFindings(result),
122
165
  ...auditFindings(result),
123
- ].map((f) => ({ ...f, url }));
166
+ ];
167
+ // Set in place: a copy would lose the key a finding's id is made from.
168
+ for (const f of findings) {
169
+ f.url = url;
170
+ }
171
+ return findings;
124
172
  };
125
173
  //# sourceMappingURL=performance-rules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"performance-rules.js","sourceRoot":"","sources":["../../src/core/performance-rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"performance-rules.js","sourceRoot":"","sources":["../../src/core/performance-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { PageRecord } from "./site-rules.js";
2
+ import type { BaselineComparison, Finding, Requirement, RuleMeta, Severity } from "./types.js";
3
+ /** One finding of an earlier audit. Only `id` is required: an MCP client may have nothing else. */
4
+ export interface BaselineEntry {
5
+ id: string;
6
+ rule?: string;
7
+ severity?: Severity;
8
+ url?: string;
9
+ message?: string;
10
+ }
11
+ /** What an earlier audit reported, for a re-check. */
12
+ export type Baseline = readonly BaselineEntry[];
13
+ /**
14
+ * Gives each finding an id that stays the same while the problem does: `rule@<URL hash>`, plus
15
+ * `:<key hash>` when the rule reports more than one finding per page and says which one this is.
16
+ * Findings that would still share an id are numbered in order (`~1`, `~2`): which is which can
17
+ * change between audits, so a re-check never calls one of them fixed.
18
+ */
19
+ export declare const assignIds: (findings: readonly Finding[]) => void;
20
+ /** Baseline entries for finding ids, such as an MCP client passes back. */
21
+ export declare const baselineFromIds: (ids: readonly string[]) => BaselineEntry[];
22
+ /** What the re-check ran: which rules, on which pages. */
23
+ export interface RecheckScope {
24
+ /**
25
+ * URLs this audit checked page rules on, in every form a finding may carry (requested, final,
26
+ * file URL).
27
+ */
28
+ urls: Iterable<string>;
29
+ /** The audit ran site rules (a crawl, a directory, an AEO audit with a site): site-wide findings count. */
30
+ site: boolean;
31
+ /** Whether a rule ran this time; the caller knows the options. */
32
+ ruleRan: (rule: string) => boolean;
33
+ /**
34
+ * Findings this audit made but left out of its output (info, with `includeInfo: false`): still
35
+ * on the page, so never fixed, and not listed as open or new either.
36
+ */
37
+ hidden?: readonly Finding[];
38
+ }
39
+ /**
40
+ * Compares this audit's findings with an earlier audit's. An earlier finding counts as fixed only
41
+ * when this audit could have reported it again: its rule ran, on its page. Everything else is
42
+ * `notChecked`, so a narrower re-check (`rules`, one page of a crawl, `includeInfo: false`) never
43
+ * reports a fix it did not see.
44
+ */
45
+ export declare const compareWithBaseline: (findings: readonly Finding[], baseline: Baseline, scope: RecheckScope) => BaselineComparison;
46
+ /** The rule options of an audit, for `ruleRanWith`. */
47
+ export interface RuleSelection {
48
+ /** Run only these rule ids. */
49
+ onlyRules?: readonly string[];
50
+ disableRules?: readonly string[];
51
+ /** The capabilities the audit had: render, lighthouse, crawl, keyword, ai-bots. */
52
+ active: ReadonlySet<Requirement>;
53
+ }
54
+ /**
55
+ * Whether a rule ran in an audit with these options. `rules` are the rules the audit evaluates
56
+ * (SEO or AEO); a rule outside them, or one that needs a capability the audit did not have, did
57
+ * not run.
58
+ */
59
+ export declare const ruleRanWith: (selection: RuleSelection, rules: readonly RuleMeta[]) => ((rule: string) => boolean);
60
+ /**
61
+ * The findings of an audit the CLI or the library wrote as JSON, for `--baseline`. A site audit
62
+ * written with `--page-detail summary` has no page findings to compare with, so it is refused.
63
+ */
64
+ export declare const baselineFromAudit: (json: string) => BaselineEntry[];
65
+ /** `obj` with `key` set to `value` just before `before`, so the JSON reads in that order. */
66
+ export declare const insertBefore: <T extends object, K extends keyof T>(obj: T, before: keyof T, key: K, value: T[K]) => T;
67
+ /** Every form a crawled or scanned page's URL takes in findings. */
68
+ export declare const recordUrls: (records: PageRecord[]) => string[];
@@ -0,0 +1,247 @@
1
+ import { createHash } from "node:crypto";
2
+ import { z } from "zod";
3
+ import { findingKey } from "./rules/rule.js";
4
+ const hash = (text, length) => createHash("sha256").update(text).digest("hex").slice(0, length);
5
+ /** The part of an id that names the page: a hash of the finding's URL, or of "" for a site-wide finding. */
6
+ const urlPart = (url) => hash(url ?? "", 8);
7
+ /** A finding's id before any numbering: its rule, page and, when it has one, its key. */
8
+ const baseId = (f) => {
9
+ const key = findingKey(f);
10
+ return `${f.rule}@${urlPart(f.url)}${key ? `:${hash(key, 4)}` : ""}`;
11
+ };
12
+ /**
13
+ * Gives each finding an id that stays the same while the problem does: `rule@<URL hash>`, plus
14
+ * `:<key hash>` when the rule reports more than one finding per page and says which one this is.
15
+ * Findings that would still share an id are numbered in order (`~1`, `~2`): which is which can
16
+ * change between audits, so a re-check never calls one of them fixed.
17
+ */
18
+ export const assignIds = (findings) => {
19
+ const count = new Map();
20
+ for (const f of findings) {
21
+ count.set(baseId(f), (count.get(baseId(f)) ?? 0) + 1);
22
+ }
23
+ const seen = new Map();
24
+ for (const f of findings) {
25
+ const id = baseId(f);
26
+ if ((count.get(id) ?? 0) > 1) {
27
+ const n = (seen.get(id) ?? 0) + 1;
28
+ seen.set(id, n);
29
+ f.id = `${id}~${n}`;
30
+ }
31
+ else {
32
+ f.id = id;
33
+ }
34
+ }
35
+ };
36
+ const ID = /^(?<base>(?<rule>[^@]+)@(?<url>[\da-f]{8})(?::[\da-f]{4})?)(?<numbered>~\d+)?$/u;
37
+ /** An id without its number: `rule@<URL hash>[:<key hash>]`. */
38
+ const baseOf = (id) => ID.exec(id)?.groups?.base;
39
+ /** Baseline entries for finding ids, such as an MCP client passes back. */
40
+ export const baselineFromIds = (ids) => ids.map((id) => ({ id }));
41
+ const idsOf = (findings) => new Set(findings.flatMap((f) => (f.id ? [f.id] : [])));
42
+ /**
43
+ * The fixed finding an earlier entry stands for, or null when this audit could not have reported
44
+ * it again: its rule did not run on its page, it is only hidden (`includeInfo: false`), or its id
45
+ * was numbered and may now belong to another finding.
46
+ */
47
+ const fixedEntry = (entry, c) => {
48
+ const parts = ID.exec(entry.id)?.groups;
49
+ const rule = entry.rule ?? parts?.rule;
50
+ if (!parts?.url ||
51
+ !parts.base ||
52
+ !rule ||
53
+ parts.numbered ||
54
+ c.numbered.has(parts.base) ||
55
+ c.hiddenIds.has(entry.id) ||
56
+ !c.scope.ruleRan(rule)) {
57
+ return null;
58
+ }
59
+ const onPage = parts.url === urlPart(undefined) ? c.scope.site : c.urls.has(parts.url);
60
+ if (!onPage) {
61
+ return null;
62
+ }
63
+ const out = { id: entry.id, rule };
64
+ if (entry.url) {
65
+ out.url = entry.url;
66
+ }
67
+ if (entry.message) {
68
+ out.message = entry.message;
69
+ }
70
+ return out;
71
+ };
72
+ /**
73
+ * Compares this audit's findings with an earlier audit's. An earlier finding counts as fixed only
74
+ * when this audit could have reported it again: its rule ran, on its page. Everything else is
75
+ * `notChecked`, so a narrower re-check (`rules`, one page of a crawl, `includeInfo: false`) never
76
+ * reports a fix it did not see.
77
+ */
78
+ export const compareWithBaseline = (findings, baseline, scope) => {
79
+ const urls = new Set();
80
+ for (const u of scope.urls) {
81
+ urls.add(urlPart(u));
82
+ }
83
+ for (const f of findings) {
84
+ if (f.url) {
85
+ urls.add(urlPart(f.url));
86
+ }
87
+ }
88
+ const shownIds = idsOf(findings);
89
+ const hiddenIds = idsOf(scope.hidden ?? []);
90
+ const numbered = new Set([...shownIds, ...hiddenIds].flatMap((id) => {
91
+ const groups = ID.exec(id)?.groups;
92
+ return groups?.numbered && groups.base ? [groups.base] : [];
93
+ }));
94
+ const checked = { urls, shownIds, hiddenIds, numbered, scope };
95
+ const fixed = [];
96
+ let notChecked = 0;
97
+ for (const entry of baseline) {
98
+ if (!shownIds.has(entry.id)) {
99
+ const out = fixedEntry(entry, checked);
100
+ if (out) {
101
+ fixed.push(out);
102
+ }
103
+ else {
104
+ notChecked += 1;
105
+ }
106
+ }
107
+ }
108
+ const beforeIds = new Set(baseline.map((b) => b.id));
109
+ // A finding numbered before or now matches no earlier id by its number, which may have moved:
110
+ // one whose base id the earlier audit had is still open, not new.
111
+ const beforeBases = new Set(baseline.flatMap((b) => {
112
+ const base = baseOf(b.id);
113
+ return base ? [base] : [];
114
+ }));
115
+ const open = [];
116
+ const added = [];
117
+ for (const f of findings) {
118
+ if (f.id) {
119
+ const base = baseOf(f.id);
120
+ const before = beforeIds.has(f.id) || (base !== undefined && beforeBases.has(base));
121
+ (before ? open : added).push(f.id);
122
+ }
123
+ }
124
+ return { fixed, open, new: added, notChecked };
125
+ };
126
+ /**
127
+ * Whether a rule ran in an audit with these options. `rules` are the rules the audit evaluates
128
+ * (SEO or AEO); a rule outside them, or one that needs a capability the audit did not have, did
129
+ * not run.
130
+ */
131
+ export const ruleRanWith = (selection, rules) => {
132
+ const only = selection.onlyRules ? new Set(selection.onlyRules) : null;
133
+ const disabled = new Set(selection.disableRules);
134
+ const byId = new Map(rules.map((r) => [r.id, r]));
135
+ return (rule) => {
136
+ if ((only && !only.has(rule)) || disabled.has(rule)) {
137
+ return false;
138
+ }
139
+ // Findings of the tool itself: whether their check ran follows from the option they belong to.
140
+ if (rule === "tool.render-unavailable") {
141
+ return selection.active.has("render");
142
+ }
143
+ if (rule === "tool.lighthouse-unavailable") {
144
+ return selection.active.has("lighthouse");
145
+ }
146
+ if (rule === "tool.rule-error" || rule === "response.fetch-failed") {
147
+ return true;
148
+ }
149
+ const meta = byId.get(rule);
150
+ return (meta !== undefined &&
151
+ (!meta.requires || selection.active.has(meta.requires)));
152
+ };
153
+ };
154
+ const savedFinding = z.object({
155
+ id: z.string(),
156
+ rule: z.string(),
157
+ severity: z.enum(["error", "warning", "info"]).optional(),
158
+ url: z.string().optional(),
159
+ message: z.string().optional(),
160
+ });
161
+ const savedCounts = z.object({
162
+ error: z.number(),
163
+ warning: z.number(),
164
+ info: z.number(),
165
+ });
166
+ const total = (counts) => counts.error + counts.warning + counts.info;
167
+ // Findings saved before ids existed have none; they are left out rather than failing the parse.
168
+ const savedFindings = z
169
+ .array(z.unknown())
170
+ .default([])
171
+ .transform((items) => items.flatMap((item) => {
172
+ const parsed = savedFinding.safeParse(item);
173
+ return parsed.success ? [parsed.data] : [];
174
+ }));
175
+ const savedAudit = z.discriminatedUnion("kind", [
176
+ z.object({ kind: z.literal("page"), findings: savedFindings }),
177
+ // `counts` covers every finding, also those a crawl with `--page-detail summary` leaves out.
178
+ z.object({
179
+ kind: z.literal("aeo"),
180
+ findings: savedFindings,
181
+ counts: savedCounts.optional(),
182
+ }),
183
+ z.object({
184
+ kind: z.literal("site"),
185
+ siteFindings: savedFindings,
186
+ pages: z
187
+ .array(z.object({ findings: savedFindings, counts: savedCounts.optional() }))
188
+ .default([]),
189
+ }),
190
+ ]);
191
+ /**
192
+ * The findings of an audit the CLI or the library wrote as JSON, for `--baseline`. A site audit
193
+ * written with `--page-detail summary` has no page findings to compare with, so it is refused.
194
+ */
195
+ export const baselineFromAudit = (json) => {
196
+ let data;
197
+ try {
198
+ data = JSON.parse(json);
199
+ }
200
+ catch {
201
+ throw new Error("The baseline is not JSON. Save the first audit with --format json.");
202
+ }
203
+ const parsed = savedAudit.safeParse(data);
204
+ if (!parsed.success) {
205
+ throw new Error('The baseline is not an audit: expected the JSON of an earlier run ("kind": "page", "site" or "aeo").');
206
+ }
207
+ const audit = parsed.data;
208
+ if (audit.kind === "page") {
209
+ return audit.findings;
210
+ }
211
+ // A crawl saved with `--page-detail summary` drops page findings; comparing with it would call
212
+ // every page finding new.
213
+ const summarised = audit.kind === "site"
214
+ ? audit.pages.some((p) => p.counts !== undefined && p.findings.length < total(p.counts))
215
+ : audit.counts !== undefined &&
216
+ audit.findings.length < total(audit.counts);
217
+ if (summarised) {
218
+ throw new Error("The baseline audit lists no page findings (it ran with --page-detail summary). Run it again with --page-detail full.");
219
+ }
220
+ return audit.kind === "site"
221
+ ? [...audit.siteFindings, ...audit.pages.flatMap((p) => p.findings)]
222
+ : audit.findings;
223
+ };
224
+ /** `obj` with `key` set to `value` just before `before`, so the JSON reads in that order. */
225
+ export const insertBefore = (obj, before, key, value) => {
226
+ const out = {};
227
+ // SAFETY: Object.keys of a T lists keys of T.
228
+ for (const k of Object.keys(obj)) {
229
+ if (k === before) {
230
+ out[key] = value;
231
+ }
232
+ if (k !== key) {
233
+ out[k] = obj[k];
234
+ }
235
+ }
236
+ // SAFETY: `out` has every key `obj` has, plus `key`.
237
+ return out;
238
+ };
239
+ /** Every form a crawled or scanned page's URL takes in findings. */
240
+ export const recordUrls = (records) => records.flatMap((r) => [
241
+ r.url,
242
+ r.requestedUrl,
243
+ r.page.url,
244
+ ...(r.response ? [r.response.finalUrl] : []),
245
+ ...(r.file ? [r.file] : []),
246
+ ]);
247
+ //# sourceMappingURL=recheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recheck.js","sourceRoot":"","sources":["../../src/core/recheck.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ExtractedPage, FixEdit, ResponseInfo } from "./types.js";
2
+ /** The server HTML (`raw`) and the rendered DOM of one page. */
3
+ export interface RenderPages {
4
+ raw: ExtractedPage;
5
+ rendered: ExtractedPage;
6
+ response?: ResponseInfo;
7
+ }
8
+ export declare const titleFix: (s: RenderPages, title: string) => FixEdit[];
9
+ export declare const titleChangedFix: (s: RenderPages, serverTitle: string, finalTitle: string) => FixEdit[];
10
+ export declare const descriptionFix: (s: RenderPages, description: string) => FixEdit[];
11
+ /**
12
+ * The canonical JavaScript sets, in the server HTML: added when the server sends none, in place of
13
+ * the server's when it sends another.
14
+ */
15
+ export declare const canonicalFix: (s: RenderPages, serverCanonical: string | null, finalCanonical: string) => FixEdit[];
16
+ /** noindex that only JavaScript adds: the tag to take out of the component that renders it. */
17
+ export declare const noindexAddedFix: (s: RenderPages) => FixEdit[];
18
+ /** noindex the server sends and JavaScript removes: Google keeps the server's, so remove it there. */
19
+ export declare const noindexRemovedFix: (s: RenderPages) => FixEdit[];
20
+ export declare const h1Fix: (s: RenderPages) => FixEdit[];
21
+ export declare const contentFix: (s: RenderPages, words: number) => FixEdit[];
22
+ /** Internal links only the rendered DOM has, quoted as JavaScript writes them (the first 10). */
23
+ export declare const linksFix: (s: RenderPages, missing: number) => FixEdit[];
24
+ /** The JSON-LD JavaScript adds, as script elements for the server HTML. */
25
+ export declare const structuredDataFix: (s: RenderPages) => FixEdit[];
26
+ /** The scripts that throw while the page renders, from the messages they log (the first 5). */
27
+ export declare const consoleErrorFix: (errors: string[]) => FixEdit[];