@rivi-software/agentic-seo-check 0.2.0 → 0.4.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 (80) hide show
  1. package/README.md +9 -5
  2. package/dist/core/aeo/page.d.ts +0 -10
  3. package/dist/core/aeo/page.js +1 -29
  4. package/dist/core/aeo/page.js.map +1 -1
  5. package/dist/core/audit.js +3 -0
  6. package/dist/core/audit.js.map +1 -1
  7. package/dist/core/crawl.d.ts +2 -0
  8. package/dist/core/crawl.js +61 -4
  9. package/dist/core/crawl.js.map +1 -1
  10. package/dist/core/fetch.d.ts +9 -0
  11. package/dist/core/fetch.js +28 -12
  12. package/dist/core/fetch.js.map +1 -1
  13. package/dist/core/html/dom.d.ts +2 -0
  14. package/dist/core/html/dom.js +26 -1
  15. package/dist/core/html/dom.js.map +1 -1
  16. package/dist/core/html/extract.js +18 -3
  17. package/dist/core/html/extract.js.map +1 -1
  18. package/dist/core/html/head.d.ts +10 -0
  19. package/dist/core/html/head.js +206 -0
  20. package/dist/core/html/head.js.map +1 -0
  21. package/dist/core/html/resources.d.ts +17 -0
  22. package/dist/core/html/resources.js +172 -0
  23. package/dist/core/html/resources.js.map +1 -0
  24. package/dist/core/html/structured-data.d.ts +2 -0
  25. package/dist/core/html/structured-data.js +2 -0
  26. package/dist/core/html/structured-data.js.map +1 -1
  27. package/dist/core/robots.js +1 -0
  28. package/dist/core/robots.js.map +1 -1
  29. package/dist/core/rules/aeo.js +2 -2
  30. package/dist/core/rules/aeo.js.map +1 -1
  31. package/dist/core/rules/canonical.d.ts +3 -0
  32. package/dist/core/rules/canonical.js +54 -2
  33. package/dist/core/rules/canonical.js.map +1 -1
  34. package/dist/core/rules/document.js +4 -2
  35. package/dist/core/rules/document.js.map +1 -1
  36. package/dist/core/rules/head.d.ts +1 -0
  37. package/dist/core/rules/head.js +116 -0
  38. package/dist/core/rules/head.js.map +1 -0
  39. package/dist/core/rules/index.js +8 -0
  40. package/dist/core/rules/index.js.map +1 -1
  41. package/dist/core/rules/indexing.d.ts +10 -0
  42. package/dist/core/rules/indexing.js +171 -9
  43. package/dist/core/rules/indexing.js.map +1 -1
  44. package/dist/core/rules/keyword.js +1 -1
  45. package/dist/core/rules/keyword.js.map +1 -1
  46. package/dist/core/rules/loading.d.ts +1 -0
  47. package/dist/core/rules/loading.js +138 -0
  48. package/dist/core/rules/loading.js.map +1 -0
  49. package/dist/core/rules/meta.js +4 -1
  50. package/dist/core/rules/meta.js.map +1 -1
  51. package/dist/core/rules/rule.d.ts +2 -0
  52. package/dist/core/rules/rule.js +2 -0
  53. package/dist/core/rules/rule.js.map +1 -1
  54. package/dist/core/rules/structured-data-values.d.ts +3 -0
  55. package/dist/core/rules/structured-data-values.js +316 -0
  56. package/dist/core/rules/structured-data-values.js.map +1 -0
  57. package/dist/core/rules/structured-data.js +50 -20
  58. package/dist/core/rules/structured-data.js.map +1 -1
  59. package/dist/core/rules/urls.d.ts +1 -0
  60. package/dist/core/rules/urls.js +293 -0
  61. package/dist/core/rules/urls.js.map +1 -0
  62. package/dist/core/site-probes.d.ts +33 -0
  63. package/dist/core/site-probes.js +144 -0
  64. package/dist/core/site-probes.js.map +1 -0
  65. package/dist/core/site-rules.d.ts +18 -0
  66. package/dist/core/site-rules.js +487 -7
  67. package/dist/core/site-rules.js.map +1 -1
  68. package/dist/core/sitemap.d.ts +38 -1
  69. package/dist/core/sitemap.js +177 -43
  70. package/dist/core/sitemap.js.map +1 -1
  71. package/dist/core/static.d.ts +6 -0
  72. package/dist/core/static.js +121 -12
  73. package/dist/core/static.js.map +1 -1
  74. package/dist/core/types.d.ts +91 -0
  75. package/dist/core/types.js.map +1 -1
  76. package/dist/core/url.d.ts +2 -0
  77. package/dist/core/url.js +8 -0
  78. package/dist/core/url.js.map +1 -1
  79. package/package.json +1 -1
  80. package/skills/seo-audit/SKILL.md +14 -0
@@ -1,4 +1,108 @@
1
- import { defineRule, GOOGLE_DOCS } from "./rule.js";
1
+ import { cap, defineRule, GOOGLE_DOCS } from "./rule.js";
2
+ /** Directives that carry a value after a colon, which is not a user agent prefix. */
3
+ const VALUE_DIRECTIVES = new Set([
4
+ "max-snippet",
5
+ "max-image-preview",
6
+ "max-video-preview",
7
+ "unavailable_after",
8
+ ]);
9
+ /**
10
+ * X-Robots-Tag values. "googlebot: nosnippet, noarchive" scopes every directive after the prefix
11
+ * to googlebot, up to the next prefix.
12
+ */
13
+ export const parseRobotsHeader = (value) => {
14
+ const out = [];
15
+ let agent = null;
16
+ let scoped = new Set();
17
+ for (const piece of value.toLowerCase().split(",")) {
18
+ let directive = piece.trim();
19
+ const match = /^(?<name>[a-z0-9_-]+)\s*:\s*(?<rest>.*)$/u.exec(directive);
20
+ const name = match?.groups?.name;
21
+ if (name && !VALUE_DIRECTIVES.has(name)) {
22
+ agent = name;
23
+ scoped = new Set();
24
+ directive = match.groups?.rest?.trim() ?? "";
25
+ }
26
+ directive = directive.replaceAll(/\s+/gu, "");
27
+ /*
28
+ * Two X-Robots-Tag headers arrive joined with ", ", so "GPTBot: noindex" and a plain "noindex"
29
+ * read as "gptbot: noindex, noindex". A directive that repeats under one agent cannot belong to
30
+ * it twice: it starts a header for every crawler.
31
+ */
32
+ if (agent !== null && scoped.has(directive)) {
33
+ agent = null;
34
+ }
35
+ if (directive) {
36
+ scoped.add(directive);
37
+ out.push({ agent, directive });
38
+ }
39
+ }
40
+ return out;
41
+ };
42
+ /** Robots directives Google or Bing document, which take no value. */
43
+ const KNOWN_DIRECTIVES = new Set([
44
+ "all",
45
+ "index",
46
+ "follow",
47
+ "noindex",
48
+ "nofollow",
49
+ "none",
50
+ "noarchive",
51
+ "nocache",
52
+ "nosnippet",
53
+ "notranslate",
54
+ "noimageindex",
55
+ "indexifembedded",
56
+ "nositelinkssearchbox",
57
+ ]);
58
+ /** Directives Google applies: meta robots and googlebot, and X-Robots-Tag for every crawler or Googlebot. */
59
+ const googleDirectives = (page, response) => {
60
+ const out = [];
61
+ for (const meta of page.answer.robotsMeta) {
62
+ if (meta.name === "robots" || meta.name === "googlebot") {
63
+ for (const d of meta.content.split(",")) {
64
+ const directive = d.trim();
65
+ if (directive) {
66
+ out.push({ source: `<meta name="${meta.name}">`, directive });
67
+ }
68
+ }
69
+ }
70
+ }
71
+ const header = response?.headers["x-robots-tag"];
72
+ if (header) {
73
+ for (const d of parseRobotsHeader(header)) {
74
+ if (d.agent === null || d.agent === "googlebot") {
75
+ out.push({ source: "X-Robots-Tag", directive: d.directive });
76
+ }
77
+ }
78
+ }
79
+ return out;
80
+ };
81
+ /**
82
+ * How a directive Google would not read was meant: "no-index" was meant as noindex, and
83
+ * "noindex nofollow" as two directives. Null for directives Google reads, and for names it does not
84
+ * document, which other crawlers may read.
85
+ */
86
+ const misreadDirective = (directive) => {
87
+ if (KNOWN_DIRECTIVES.has(directive) ||
88
+ VALUE_DIRECTIVES.has(directive.split(":")[0]?.trim() ?? "")) {
89
+ return null;
90
+ }
91
+ const squashed = directive.replaceAll(/[\s_-]+/gu, "");
92
+ if (KNOWN_DIRECTIVES.has(squashed)) {
93
+ return { meant: [squashed], kind: "misspelled" };
94
+ }
95
+ const parts = directive.split(/[\s;]+/u).filter(Boolean);
96
+ return parts.length > 1 && parts.every((p) => KNOWN_DIRECTIVES.has(p))
97
+ ? { meant: parts, kind: "not-comma-separated" }
98
+ : null;
99
+ };
100
+ /** User agents whose robots directives count for search: the same ones the meta tags are read for. */
101
+ const SEARCH_ENGINE_AGENTS = new Set([
102
+ "googlebot",
103
+ "googlebot-news",
104
+ "bingbot",
105
+ ]);
2
106
  /** Combine <meta name="robots"> / googlebot and the X-Robots-Tag header. */
3
107
  export const robotsDirectives = (page, response) => {
4
108
  const directives = [];
@@ -14,14 +118,12 @@ export const robotsDirectives = (page, response) => {
14
118
  }
15
119
  const header = response?.headers["x-robots-tag"];
16
120
  if (header) {
17
- for (const d of header
18
- .toLowerCase()
19
- .split(",")
20
- .map((s) => s.trim())
21
- .filter(Boolean)) {
22
- // "googlebot: noindex" form
23
- directives.push(d.includes(":") ? (d.split(":").pop() ?? d).trim() : d);
24
- sources.push("header");
121
+ // "gptbot: noindex" keeps one AI crawler out; it says nothing about search engines.
122
+ for (const d of parseRobotsHeader(header)) {
123
+ if (d.agent === null || SEARCH_ENGINE_AGENTS.has(d.agent)) {
124
+ directives.push(d.directive);
125
+ sources.push("header");
126
+ }
25
127
  }
26
128
  }
27
129
  const noindex = directives.some((d) => d === "noindex" || d === "none");
@@ -71,5 +173,65 @@ export const indexingRules = [
71
173
  })
72
174
  : null;
73
175
  }),
176
+ defineRule({
177
+ id: "robots.conflicting",
178
+ category: "indexing",
179
+ severity: "info",
180
+ description: "The page's robots directives contradict each other (index and noindex, or follow and nofollow); Google applies the more restrictive one.",
181
+ recommendation: "Keep one directive for indexing and one for following, in one place. A platform or CDN often adds X-Robots-Tag on top of the page's own meta robots; remove the one you did not mean.",
182
+ docs: GOOGLE_DOCS.robotsMeta,
183
+ }, ({ page, response }, make) => {
184
+ const directives = googleDirectives(page, response);
185
+ const where = (names) => [
186
+ ...new Set(directives
187
+ .filter((d) => names.includes(d.directive.toLowerCase()))
188
+ .map((d) => `${d.directive.toLowerCase()} (${d.source})`)),
189
+ ];
190
+ const pairs = [
191
+ { allow: ["index", "all"], deny: ["noindex", "none"], wins: "noindex" },
192
+ {
193
+ allow: ["follow", "all"],
194
+ deny: ["nofollow", "none"],
195
+ wins: "nofollow",
196
+ },
197
+ ];
198
+ return pairs.flatMap(({ allow, deny, wins }) => {
199
+ const allowed = where(allow);
200
+ const denied = where(deny);
201
+ return allowed.length > 0 && denied.length > 0
202
+ ? [
203
+ make(`The page says ${allowed.join(" and ")} but also ${denied.join(" and ")}; Google applies ${wins}.`, { evidence: { allow: allowed, deny: denied, applied: wins } }),
204
+ ]
205
+ : [];
206
+ });
207
+ }),
208
+ defineRule({
209
+ id: "robots.malformed-directive",
210
+ category: "indexing",
211
+ severity: "warning",
212
+ description: 'A robots directive is written in a form Google does not document, such as "no-index" for noindex (warning) or "noindex nofollow" without a comma (info).',
213
+ recommendation: 'Write each directive the way Google documents it, separated by commas: content="noindex, nofollow". A misspelled noindex is ignored, so the page stays indexable.',
214
+ docs: GOOGLE_DOCS.robotsMeta,
215
+ }, ({ page, response }, make) => {
216
+ const misread = googleDirectives(page, response).flatMap((d) => {
217
+ const how = misreadDirective(d.directive.toLowerCase());
218
+ return how ? [{ ...d, ...how }] : [];
219
+ });
220
+ if (misread.length === 0) {
221
+ return null;
222
+ }
223
+ const misspelled = misread.some((m) => m.kind === "misspelled");
224
+ const listed = misread.map((m) => `"${m.directive}" (${m.source}, meant as ${m.meant.join(", ")})`);
225
+ return make(`${misread.length === 1 ? "A robots directive is" : `${misread.length} robots directives are`} not written the way Google documents: ${cap(listed, 5).join("; ")}.`, {
226
+ severity: misspelled ? "warning" : "info",
227
+ evidence: {
228
+ directives: cap(misread.map((m) => ({
229
+ written: m.directive,
230
+ source: m.source,
231
+ meant: m.meant,
232
+ }))),
233
+ },
234
+ });
235
+ }),
74
236
  ];
75
237
  //# sourceMappingURL=indexing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"indexing.js","sourceRoot":"","sources":["../../../src/core/rules/indexing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indexing.js","sourceRoot":"","sources":["../../../src/core/rules/indexing.ts"],"names":[],"mappings":"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"}
@@ -41,7 +41,7 @@ export const keywordRules = [
41
41
  !includesKeyword(page.metaDescription, keyword)
42
42
  ? make(`Meta description does not contain "${keyword}".`, {
43
43
  selector: 'head > meta[name="description"]',
44
- evidence: { keyword },
44
+ evidence: { description: page.metaDescription, keyword },
45
45
  })
46
46
  : null),
47
47
  defineRule({
@@ -1 +1 @@
1
- {"version":3,"file":"keyword.js","sourceRoot":"","sources":["../../../src/core/rules/keyword.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyword.js","sourceRoot":"","sources":["../../../src/core/rules/keyword.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const loadingRules: import("./rule.js").Rule[];
@@ -0,0 +1,138 @@
1
+ import { isHomePage } from "../aeo/page.js";
2
+ import { isLocalHost } from "./canonical.js";
3
+ import { cap, defineRule } from "./rule.js";
4
+ /** Below this size compression saves less than the request costs (Lighthouse's own cut-off). */
5
+ const MIN_COMPRESSIBLE_BYTES = 1400;
6
+ /** An image shown before this many words of text is likely in the first screen. */
7
+ const ABOVE_FOLD_WORDS = 100;
8
+ /** Images narrower than this (by their width attribute) gain little from other sizes. */
9
+ const SRCSET_MIN_WIDTH = 640;
10
+ /** A width or height attribute in pixels; pages also write "800px", which browsers read as 800. */
11
+ const pixels = (value) => {
12
+ const digits = value === null ? undefined : /^\s*\d+(?:\.\d+)?/u.exec(value)?.[0];
13
+ return digits === undefined ? null : Number(digits);
14
+ };
15
+ /** Icons, logos, spacers and tracking pixels: not the image a visitor waits for. */
16
+ const isSmall = (image) => {
17
+ const width = pixels(image.width);
18
+ const height = pixels(image.height);
19
+ return (width !== null && width < 200) || (height !== null && height < 100);
20
+ };
21
+ /** A vector file: in the first screen it is nearly always a logo or an icon. */
22
+ const isVector = (src) => /\.svg(?:[?#]|$)/iu.test(src) || /^data:image\/svg/iu.test(src);
23
+ const isLazy = (image) => image.loading?.trim().toLowerCase() === "lazy";
24
+ /** Vector, animated and inline images, which one file serves at every size. */
25
+ const isFixedFormat = (src) => /^data:/iu.test(src) || /\.(?:svg|gif)(?:[?#]|$)/iu.test(src);
26
+ export const loadingRules = [
27
+ defineRule({
28
+ id: "loading.render-blocking-script",
29
+ category: "performance",
30
+ severity: "info",
31
+ description: 'Scripts in <head> load without async, defer or type="module", so the browser stops building the page until each one has downloaded and run.',
32
+ recommendation: 'Add defer to scripts the page needs once it is parsed, or async to independent ones such as analytics; type="module" scripts are deferred already. A script that must run before anything renders (a consent manager, an A/B test) can stay, but keep it small.',
33
+ docs: "https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources",
34
+ }, ({ page }, make) => {
35
+ const scripts = page.head.blockingScripts;
36
+ return scripts.length > 0
37
+ ? make(`${scripts.length} script(s) in <head> block rendering: ${cap(scripts, 3).join(", ")}.`, {
38
+ selector: "head > script[src]:not([async]):not([defer])",
39
+ evidence: { count: scripts.length, scripts: cap(scripts) },
40
+ })
41
+ : null;
42
+ }),
43
+ defineRule({
44
+ id: "loading.no-compression",
45
+ category: "performance",
46
+ severity: "warning",
47
+ description: "The HTML is sent uncompressed although the request accepted gzip, so every visitor and crawler downloads several times more bytes than needed.",
48
+ recommendation: "Turn on gzip or Brotli compression for text/html (and CSS, JavaScript, JSON, SVG) in the web server, CDN or hosting settings: gzip on in nginx, mod_deflate in Apache, compression() middleware in Express.",
49
+ docs: "https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression",
50
+ }, ({ page, source, response }, make) => {
51
+ if (source !== "url" ||
52
+ !response ||
53
+ response.status !== 200 ||
54
+ isLocalHost(response.finalUrl) ||
55
+ page.htmlBytes < MIN_COMPRESSIBLE_BYTES) {
56
+ return null;
57
+ }
58
+ const encoding = (response.headers["content-encoding"] ?? "")
59
+ .trim()
60
+ .toLowerCase();
61
+ return encoding === "" || encoding === "identity"
62
+ ? make(`The ${Math.round(page.htmlBytes / 1024)} KB of HTML arrived without Content-Encoding.`, { evidence: { bytes: page.htmlBytes, contentEncoding: null } })
63
+ : null;
64
+ }),
65
+ defineRule({
66
+ id: "img.lazy-above-fold",
67
+ category: "images",
68
+ severity: "info",
69
+ description: 'The first large image on the page, likely in the first screen and often the Largest Contentful Paint, has loading="lazy", which delays it (info). An image with both fetchpriority="high" and loading="lazy" contradicts itself (warning).',
70
+ recommendation: 'Remove loading="lazy" from images in the first screen, and give the main one fetchpriority="high". Keep lazy loading for images further down the page. In Next.js, set priority (or preload) on that <Image>.',
71
+ docs: "https://web.dev/articles/browser-level-image-lazy-loading",
72
+ }, ({ page }, make) => {
73
+ const contradicting = page.images.filter((i) => isLazy(i) && i.fetchpriority === "high");
74
+ if (contradicting.length > 0) {
75
+ return make(`${contradicting.length} image(s) have both fetchpriority="high" and loading="lazy".`, {
76
+ severity: "warning",
77
+ selector: 'img[loading="lazy"][fetchpriority="high"]',
78
+ evidence: { images: cap(contradicting.map((i) => i.src)) },
79
+ });
80
+ }
81
+ // An image in a <template> is not on the page until a script stamps it out.
82
+ const first = page.images.find((i) => i.src && i.wordsBefore !== null && !isVector(i.src) && !isSmall(i));
83
+ const wordsBefore = first?.wordsBefore ?? null;
84
+ return first &&
85
+ wordsBefore !== null &&
86
+ isLazy(first) &&
87
+ wordsBefore < ABOVE_FOLD_WORDS
88
+ ? make(`The first image (${first.src}) comes after ${wordsBefore} words of text and has loading="lazy".`, {
89
+ selector: 'img[loading="lazy"]',
90
+ evidence: { src: first.src, wordsBefore },
91
+ })
92
+ : null;
93
+ }),
94
+ defineRule({
95
+ id: "img.srcset-missing",
96
+ category: "images",
97
+ severity: "info",
98
+ description: `Images ${SRCSET_MIN_WIDTH} pixels wide or more (by their width attribute) have no srcset or <picture>, so phones download the full-size file.`,
99
+ recommendation: 'Offer smaller versions with srcset and sizes (srcset="hero-480.jpg 480w, hero-960.jpg 960w" sizes="100vw"), or use the framework\'s image component (next/image, astro:assets, NuxtImg), which generates them.',
100
+ docs: "https://web.dev/articles/serve-responsive-images",
101
+ }, ({ page }, make) => {
102
+ const large = page.images.filter((i) => {
103
+ const width = pixels(i.width);
104
+ return (i.src !== null &&
105
+ !isFixedFormat(i.src) &&
106
+ !i.srcset &&
107
+ !i.inPicture &&
108
+ width !== null &&
109
+ width >= SRCSET_MIN_WIDTH);
110
+ });
111
+ return large.length > 0
112
+ ? make(`${large.length} image(s) at least ${SRCSET_MIN_WIDTH} pixels wide have no srcset.`, {
113
+ evidence: {
114
+ count: large.length,
115
+ examples: cap(large.map((i) => ({ src: i.src, width: i.width }))),
116
+ },
117
+ })
118
+ : null;
119
+ }),
120
+ defineRule({
121
+ id: "favicon.missing",
122
+ category: "document",
123
+ severity: "info",
124
+ description: 'The home page has no <link rel="icon"> (or apple-touch-icon). Google takes the icon it shows next to the site in search results from the home page.',
125
+ recommendation: 'Add <link rel="icon" href="/favicon.svg"> (or a square PNG larger than 48x48 pixels) to the home page\'s <head>, and keep the file crawlable. Google documents only the link, not a /favicon.ico fallback.',
126
+ docs: "https://developers.google.com/search/docs/appearance/favicon-in-search",
127
+ },
128
+ // An error or a bot challenge is not the home page the site serves.
129
+ ({ page, source, response }, make) => source !== "html" &&
130
+ (response?.status ?? 200) < 400 &&
131
+ isHomePage(page.url) &&
132
+ page.head.icons.length === 0
133
+ ? make("The home page links to no icon.", {
134
+ selector: 'head > link[rel="icon"]',
135
+ })
136
+ : null),
137
+ ];
138
+ //# sourceMappingURL=loading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading.js","sourceRoot":"","sources":["../../../src/core/rules/loading.ts"],"names":[],"mappings":"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"}
@@ -74,7 +74,10 @@ export const metaRules = [
74
74
  normalizeForComparison(page.title)
75
75
  ? make("Meta description repeats the title verbatim.", {
76
76
  selector: SELECTOR,
77
- evidence: { title: page.title },
77
+ evidence: {
78
+ title: page.title,
79
+ description: page.metaDescription,
80
+ },
78
81
  })
79
82
  : null),
80
83
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/core/rules/meta.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/core/rules/meta.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,8 @@ export declare const GOOGLE_DOCS: {
31
31
  readonly hreflang: "https://developers.google.com/search/docs/specialty/international/localized-versions";
32
32
  readonly images: "https://developers.google.com/search/docs/appearance/google-images";
33
33
  readonly links: "https://developers.google.com/search/docs/crawling-indexing/links-crawlable";
34
+ readonly urlStructure: "https://developers.google.com/search/docs/crawling-indexing/url-structure";
35
+ readonly validMetadata: "https://developers.google.com/search/docs/crawling-indexing/valid-page-metadata";
34
36
  readonly structuredData: "https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data";
35
37
  readonly javascript: "https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics";
36
38
  readonly cwv: "https://web.dev/articles/vitals";
@@ -39,6 +39,8 @@ export const GOOGLE_DOCS = {
39
39
  hreflang: "https://developers.google.com/search/docs/specialty/international/localized-versions",
40
40
  images: "https://developers.google.com/search/docs/appearance/google-images",
41
41
  links: "https://developers.google.com/search/docs/crawling-indexing/links-crawlable",
42
+ urlStructure: "https://developers.google.com/search/docs/crawling-indexing/url-structure",
43
+ validMetadata: "https://developers.google.com/search/docs/crawling-indexing/valid-page-metadata",
42
44
  structuredData: "https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data",
43
45
  javascript: "https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics",
44
46
  cwv: "https://web.dev/articles/vitals",
@@ -1 +1 @@
1
- {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/core/rules/rule.ts"],"names":[],"mappings":"AA+BA,0FAA0F;AAC1F,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,IAAc,EACd,OAAe,EACf,MAAM,GAAkB,EAAE,EACjB,EAAE;IACX,MAAM,CAAC,GAAY;QACjB,IAAI,EAAE,IAAI,CAAC,EAAE;QACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;QAC1C,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO;QACP,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc;KAC7D,CAAC;IAEF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,IAAc,EACd,KAG2C,EACrC,EAAE,CAAC,CAAC;IACV,IAAI;IACJ,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAC5C,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAC/B,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAI,KAAU,EAAE,GAAG,GAAG,EAAE,EAAO,EAAE,CAClD,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAEnD,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,iEAAiE;IACzE,QAAQ,EAAE,8DAA8D;IACxE,SAAS,EACP,wFAAwF;IAC1F,UAAU,EACR,6EAA6E;IAC/E,SAAS,EACP,0EAA0E;IAC5E,QAAQ,EACN,+EAA+E;IACjF,QAAQ,EACN,sFAAsF;IACxF,MAAM,EAAE,oEAAoE;IAC5E,KAAK,EACH,6EAA6E;IAC/E,cAAc,EACZ,4FAA4F;IAC9F,UAAU,EACR,8FAA8F;IAChG,GAAG,EAAE,iCAAiC;IACtC,MAAM,EACJ,uGAAuG;IACzG,SAAS,EACP,2EAA2E;IAC7E,QAAQ,EACN,iGAAiG;IACnG,EAAE,EAAE,iBAAiB;IACrB,OAAO,EACL,sEAAsE;CAChE,CAAC"}
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/core/rules/rule.ts"],"names":[],"mappings":"AA+BA,0FAA0F;AAC1F,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,IAAc,EACd,OAAe,EACf,MAAM,GAAkB,EAAE,EACjB,EAAE;IACX,MAAM,CAAC,GAAY;QACjB,IAAI,EAAE,IAAI,CAAC,EAAE;QACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;QAC1C,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO;QACP,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc;KAC7D,CAAC;IAEF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,IAAc,EACd,KAG2C,EACrC,EAAE,CAAC,CAAC;IACV,IAAI;IACJ,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAC5C,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAC/B,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAI,KAAU,EAAE,GAAG,GAAG,EAAE,EAAO,EAAE,CAClD,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAEnD,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,iEAAiE;IACzE,QAAQ,EAAE,8DAA8D;IACxE,SAAS,EACP,wFAAwF;IAC1F,UAAU,EACR,6EAA6E;IAC/E,SAAS,EACP,0EAA0E;IAC5E,QAAQ,EACN,+EAA+E;IACjF,QAAQ,EACN,sFAAsF;IACxF,MAAM,EAAE,oEAAoE;IAC5E,KAAK,EACH,6EAA6E;IAC/E,YAAY,EACV,2EAA2E;IAC7E,aAAa,EACX,iFAAiF;IACnF,cAAc,EACZ,4FAA4F;IAC9F,UAAU,EACR,8FAA8F;IAChG,GAAG,EAAE,iCAAiC;IACtC,MAAM,EACJ,uGAAuG;IACzG,SAAS,EACP,2EAA2E;IAC7E,QAAQ,EACN,iGAAiG;IACnG,EAAE,EAAE,iBAAiB;IACrB,OAAO,EACL,sEAAsE;CAChE,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Rich results Google no longer shows, keyed by the schema.org type that asked for them. */
2
+ export declare const RETIRED_RICH_RESULTS: ReadonlyMap<string, string>;
3
+ export declare const structuredDataValueRules: import("./rule.js").Rule[];