@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,169 +1,381 @@
1
- import { typesOf } from '../html/structured-data.js';
2
- import { cap, defineRule, GOOGLE_DOCS } from './rule.js';
3
- const G = 'https://developers.google.com/search/docs/appearance/structured-data/';
4
- const ARTICLE = { required: [], recommended: ['headline', 'image', 'datePublished', 'dateModified', 'author'], docs: `${G}article` };
1
+ import { isJsonObject, isString, typesOf } from "../html/structured-data.js";
2
+ import { cap, defineRule, GOOGLE_DOCS } from "./rule.js";
3
+ const G = "https://developers.google.com/search/docs/appearance/structured-data/";
4
+ const ARTICLE = {
5
+ required: [],
6
+ recommended: ["headline", "image", "datePublished", "dateModified", "author"],
7
+ docs: `${G}article`,
8
+ };
9
+ // oxlint-disable-next-line anti-slop/no-known-value-widening -- the table is read with whatever @type a page names, so it needs an index type that lets a lookup miss
5
10
  export const SCHEMA_SPECS = {
6
11
  Article: ARTICLE,
7
12
  NewsArticle: ARTICLE,
8
13
  BlogPosting: ARTICLE,
9
14
  TechArticle: ARTICLE,
10
- Product: { required: ['name'], recommended: ['image', 'description', 'brand', 'sku', 'offers'], oneOf: [['offers', 'review', 'aggregateRating']], docs: `${G}product` },
11
- Offer: { required: ['price', 'priceCurrency'], recommended: ['availability', 'url', 'priceValidUntil'], docs: `${G}product` },
12
- AggregateOffer: { required: ['lowPrice', 'priceCurrency'], recommended: ['highPrice', 'offerCount'], docs: `${G}product` },
13
- Organization: { required: ['name'], recommended: ['url', 'logo', 'sameAs'], docs: `${G}organization` },
14
- WebSite: { required: ['name', 'url'], recommended: [], docs: `${G}sitelinks-searchbox` },
15
- WebPage: { required: [], recommended: ['name'] },
16
- BreadcrumbList: { required: ['itemListElement'], recommended: [], docs: `${G}breadcrumb` },
17
- ListItem: { required: ['position'], recommended: ['name', 'item'], docs: `${G}breadcrumb` },
18
- ItemList: { required: ['itemListElement'], recommended: [], docs: `${G}carousel` },
19
- FAQPage: { required: ['mainEntity'], recommended: [], docs: `${G}faqpage` },
20
- Question: { required: ['name', 'acceptedAnswer'], recommended: [], docs: `${G}faqpage` },
21
- Answer: { required: ['text'], recommended: [], docs: `${G}faqpage` },
22
- LocalBusiness: { required: ['name', 'address'], recommended: ['telephone', 'url', 'image', 'openingHoursSpecification', 'priceRange', 'geo'], docs: `${G}local-business` },
23
- Event: { required: ['name', 'startDate', 'location'], recommended: ['endDate', 'description', 'image', 'offers', 'performer', 'organizer', 'eventStatus', 'eventAttendanceMode'], docs: `${G}event` },
24
- Recipe: { required: ['name', 'image'], recommended: ['author', 'datePublished', 'description', 'prepTime', 'cookTime', 'totalTime', 'recipeYield', 'recipeIngredient', 'recipeInstructions', 'aggregateRating'], docs: `${G}recipe` },
25
- VideoObject: { required: ['name', 'thumbnailUrl', 'uploadDate'], recommended: ['description', 'duration', 'contentUrl', 'embedUrl'], docs: `${G}video` },
26
- Person: { required: ['name'], recommended: ['url', 'sameAs', 'jobTitle'] },
27
- JobPosting: { required: ['title', 'description', 'datePosted', 'hiringOrganization', 'jobLocation'], recommended: ['validThrough', 'employmentType', 'baseSalary', 'identifier'], docs: `${G}job-posting` },
28
- HowTo: { required: ['name', 'step'], recommended: ['image', 'totalTime', 'estimatedCost', 'supply', 'tool'], docs: `${G}how-to` },
29
- Review: { required: ['itemReviewed', 'reviewRating', 'author'], recommended: ['datePublished', 'reviewBody'], docs: `${G}review-snippet` },
30
- Rating: { required: ['ratingValue'], recommended: ['bestRating', 'worstRating'], docs: `${G}review-snippet` },
31
- AggregateRating: { required: ['ratingValue'], recommended: ['bestRating'], oneOf: [['ratingCount', 'reviewCount']], docs: `${G}review-snippet` },
32
- SoftwareApplication: { required: ['name'], recommended: ['applicationCategory', 'operatingSystem', 'offers', 'aggregateRating'], oneOf: [['offers', 'aggregateRating']], docs: `${G}software-app` },
33
- Course: { required: ['name', 'description', 'provider'], recommended: [], docs: `${G}course` },
34
- Dataset: { required: ['name', 'description'], recommended: ['url', 'creator', 'license', 'distribution'], docs: `${G}dataset` },
35
- ImageObject: { required: [], recommended: ['contentUrl', 'license', 'creator'], oneOf: [['contentUrl', 'url']], docs: `${G}image-license-metadata` },
36
- PostalAddress: { required: [], recommended: ['streetAddress', 'addressLocality', 'postalCode', 'addressCountry'] },
15
+ Product: {
16
+ required: ["name"],
17
+ recommended: ["image", "description", "brand", "sku", "offers"],
18
+ oneOf: [["offers", "review", "aggregateRating"]],
19
+ docs: `${G}product`,
20
+ },
21
+ Offer: {
22
+ required: ["price", "priceCurrency"],
23
+ recommended: ["availability", "url", "priceValidUntil"],
24
+ docs: `${G}product`,
25
+ },
26
+ AggregateOffer: {
27
+ required: ["lowPrice", "priceCurrency"],
28
+ recommended: ["highPrice", "offerCount"],
29
+ docs: `${G}product`,
30
+ },
31
+ Organization: {
32
+ required: ["name"],
33
+ recommended: ["url", "logo", "sameAs"],
34
+ docs: `${G}organization`,
35
+ },
36
+ WebSite: {
37
+ required: ["name", "url"],
38
+ recommended: [],
39
+ docs: `${G}sitelinks-searchbox`,
40
+ },
41
+ WebPage: { required: [], recommended: ["name"] },
42
+ BreadcrumbList: {
43
+ required: ["itemListElement"],
44
+ recommended: [],
45
+ docs: `${G}breadcrumb`,
46
+ },
47
+ ListItem: {
48
+ required: ["position"],
49
+ recommended: ["name", "item"],
50
+ docs: `${G}breadcrumb`,
51
+ },
52
+ ItemList: {
53
+ required: ["itemListElement"],
54
+ recommended: [],
55
+ docs: `${G}carousel`,
56
+ },
57
+ FAQPage: { required: ["mainEntity"], recommended: [], docs: `${G}faqpage` },
58
+ Question: {
59
+ required: ["name", "acceptedAnswer"],
60
+ recommended: [],
61
+ docs: `${G}faqpage`,
62
+ },
63
+ Answer: { required: ["text"], recommended: [], docs: `${G}faqpage` },
64
+ LocalBusiness: {
65
+ required: ["name", "address"],
66
+ recommended: [
67
+ "telephone",
68
+ "url",
69
+ "image",
70
+ "openingHoursSpecification",
71
+ "priceRange",
72
+ "geo",
73
+ ],
74
+ docs: `${G}local-business`,
75
+ },
76
+ Event: {
77
+ required: ["name", "startDate", "location"],
78
+ recommended: [
79
+ "endDate",
80
+ "description",
81
+ "image",
82
+ "offers",
83
+ "performer",
84
+ "organizer",
85
+ "eventStatus",
86
+ "eventAttendanceMode",
87
+ ],
88
+ docs: `${G}event`,
89
+ },
90
+ Recipe: {
91
+ required: ["name", "image"],
92
+ recommended: [
93
+ "author",
94
+ "datePublished",
95
+ "description",
96
+ "prepTime",
97
+ "cookTime",
98
+ "totalTime",
99
+ "recipeYield",
100
+ "recipeIngredient",
101
+ "recipeInstructions",
102
+ "aggregateRating",
103
+ ],
104
+ docs: `${G}recipe`,
105
+ },
106
+ VideoObject: {
107
+ required: ["name", "thumbnailUrl", "uploadDate"],
108
+ recommended: ["description", "duration", "contentUrl", "embedUrl"],
109
+ docs: `${G}video`,
110
+ },
111
+ Person: { required: ["name"], recommended: ["url", "sameAs", "jobTitle"] },
112
+ JobPosting: {
113
+ required: [
114
+ "title",
115
+ "description",
116
+ "datePosted",
117
+ "hiringOrganization",
118
+ "jobLocation",
119
+ ],
120
+ recommended: ["validThrough", "employmentType", "baseSalary", "identifier"],
121
+ docs: `${G}job-posting`,
122
+ },
123
+ HowTo: {
124
+ required: ["name", "step"],
125
+ recommended: ["image", "totalTime", "estimatedCost", "supply", "tool"],
126
+ docs: `${G}how-to`,
127
+ },
128
+ Review: {
129
+ required: ["itemReviewed", "reviewRating", "author"],
130
+ recommended: ["datePublished", "reviewBody"],
131
+ docs: `${G}review-snippet`,
132
+ },
133
+ Rating: {
134
+ required: ["ratingValue"],
135
+ recommended: ["bestRating", "worstRating"],
136
+ docs: `${G}review-snippet`,
137
+ },
138
+ AggregateRating: {
139
+ required: ["ratingValue"],
140
+ recommended: ["bestRating"],
141
+ oneOf: [["ratingCount", "reviewCount"]],
142
+ docs: `${G}review-snippet`,
143
+ },
144
+ SoftwareApplication: {
145
+ required: ["name"],
146
+ recommended: [
147
+ "applicationCategory",
148
+ "operatingSystem",
149
+ "offers",
150
+ "aggregateRating",
151
+ ],
152
+ oneOf: [["offers", "aggregateRating"]],
153
+ docs: `${G}software-app`,
154
+ },
155
+ Course: {
156
+ required: ["name", "description", "provider"],
157
+ recommended: [],
158
+ docs: `${G}course`,
159
+ },
160
+ Dataset: {
161
+ required: ["name", "description"],
162
+ recommended: ["url", "creator", "license", "distribution"],
163
+ docs: `${G}dataset`,
164
+ },
165
+ ImageObject: {
166
+ required: [],
167
+ recommended: ["contentUrl", "license", "creator"],
168
+ oneOf: [["contentUrl", "url"]],
169
+ docs: `${G}image-license-metadata`,
170
+ },
171
+ PostalAddress: {
172
+ required: [],
173
+ recommended: [
174
+ "streetAddress",
175
+ "addressLocality",
176
+ "postalCode",
177
+ "addressCountry",
178
+ ],
179
+ },
37
180
  };
38
- const DATE_PROPS = new Set(['datePublished', 'dateModified', 'startDate', 'endDate', 'uploadDate', 'datePosted', 'validThrough', 'dateCreated', 'expires']);
39
- const ISO_DATE = /^\d{4}-\d{2}-\d{2}([T ]\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:?\d{2})?)?$/;
40
- function isPresent(value) {
41
- if (value === null || value === undefined)
181
+ const DATE_PROPS = new Set([
182
+ "datePublished",
183
+ "dateModified",
184
+ "startDate",
185
+ "endDate",
186
+ "uploadDate",
187
+ "datePosted",
188
+ "validThrough",
189
+ "dateCreated",
190
+ "expires",
191
+ ]);
192
+ const ISO_DATE = /^\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$/u;
193
+ const isPresent = (value) => {
194
+ if (value === null || value === undefined) {
42
195
  return false;
43
- if (typeof value === 'string')
196
+ }
197
+ if (isString(value)) {
44
198
  return value.trim().length > 0;
45
- if (Array.isArray(value))
199
+ }
200
+ if (Array.isArray(value)) {
46
201
  return value.length > 0;
202
+ }
47
203
  return true;
48
- }
204
+ };
205
+ /** The properties a typed object lacks: required ones (and oneOf groups it fills none of), then recommended ones. */
206
+ const missingProperties = (obj, spec) => {
207
+ const required = spec.required.filter((p) => !isPresent(obj[p]));
208
+ for (const group of spec.oneOf ?? []) {
209
+ if (!group.some((p) => isPresent(obj[p]))) {
210
+ required.push(`one of: ${group.join(" | ")}`);
211
+ }
212
+ }
213
+ const recommended = spec.recommended.filter((p) => !isPresent(obj[p]));
214
+ return { required, recommended };
215
+ };
49
216
  /** Walk one structured-data item (and nested typed objects) collecting spec violations. */
50
- export function validateItem(item) {
217
+ export const validateItem = (item) => {
51
218
  const required = [];
52
219
  const recommended = [];
53
220
  const badDates = [];
54
221
  const unknownTypes = [];
55
222
  const visited = new Set();
56
223
  const walk = (node, path, depth) => {
57
- if (depth > 6 || !node || typeof node !== 'object' || visited.has(node))
224
+ if (depth > 6 ||
225
+ !(Array.isArray(node) || isJsonObject(node)) ||
226
+ visited.has(node)) {
58
227
  return;
228
+ }
59
229
  visited.add(node);
60
230
  if (Array.isArray(node)) {
61
- node.forEach((n, i) => walk(n, `${path}[${i}]`, depth));
231
+ for (const [i, n] of node.entries()) {
232
+ walk(n, `${path}[${i}]`, depth);
233
+ }
62
234
  return;
63
235
  }
64
- const obj = node;
65
- const types = typesOf(obj['@type']);
66
- for (const type of types) {
236
+ for (const type of typesOf(node["@type"])) {
67
237
  const spec = SCHEMA_SPECS[type];
68
238
  if (!spec) {
69
239
  unknownTypes.push(type);
70
240
  continue;
71
241
  }
72
- const missingReq = spec.required.filter((p) => !isPresent(obj[p]));
73
- for (const group of spec.oneOf ?? []) {
74
- if (!group.some((p) => isPresent(obj[p])))
75
- missingReq.push(`one of: ${group.join(' | ')}`);
242
+ const missing = missingProperties(node, spec);
243
+ if (missing.required.length) {
244
+ required.push({ type, missing: missing.required, path });
245
+ }
246
+ if (missing.recommended.length) {
247
+ recommended.push({ type, missing: missing.recommended, path });
76
248
  }
77
- if (missingReq.length)
78
- required.push({ type, missing: missingReq, path });
79
- const missingRec = spec.recommended.filter((p) => !isPresent(obj[p]));
80
- if (missingRec.length)
81
- recommended.push({ type, missing: missingRec, path });
82
249
  }
83
- for (const [key, value] of Object.entries(obj)) {
84
- if (DATE_PROPS.has(key) && typeof value === 'string' && !ISO_DATE.test(value.trim()))
85
- badDates.push(`${path ? `${path}.` : ''}${key}="${value}"`);
86
- if (value && typeof value === 'object')
250
+ for (const [key, value] of Object.entries(node)) {
251
+ if (DATE_PROPS.has(key) &&
252
+ isString(value) &&
253
+ !ISO_DATE.test(value.trim())) {
254
+ badDates.push(`${path ? `${path}.` : ""}${key}="${value}"`);
255
+ }
256
+ if (Array.isArray(value) || isJsonObject(value)) {
87
257
  walk(value, path ? `${path}.${key}` : key, depth + 1);
258
+ }
88
259
  }
89
260
  };
90
- walk(item.data, '', 0);
261
+ // SAFETY: extractStructuredData builds every item's data from JSON.parse or from microdata, and both hold JSON values alone.
262
+ walk(item.data, "", 0);
91
263
  return { required, recommended, badDates, unknownTypes };
92
- }
264
+ };
93
265
  export const structuredDataRules = [
94
266
  defineRule({
95
- id: 'structured-data.invalid-json',
96
- category: 'structured-data',
97
- severity: 'error',
98
- description: 'A JSON-LD <script> block contains invalid JSON and will be ignored entirely.',
99
- recommendation: 'Fix the JSON syntax (trailing commas, unescaped quotes, HTML comments inside the script). Serialise with JSON.stringify instead of hand-writing it.',
267
+ id: "structured-data.invalid-json",
268
+ category: "structured-data",
269
+ severity: "error",
270
+ description: "A JSON-LD <script> block contains invalid JSON and will be ignored entirely.",
271
+ recommendation: "Fix the JSON syntax (trailing commas, unescaped quotes, HTML comments inside the script). Serialise with JSON.stringify instead of hand-writing it.",
100
272
  docs: GOOGLE_DOCS.structuredData,
101
- }, ({ page }, make) => page.structuredDataErrors.map((e) => make(`Invalid JSON-LD: ${e.message}`, { selector: 'script[type="application/ld+json"]', evidence: { snippet: e.snippet } }))),
273
+ }, ({ page }, make) => page.structuredDataErrors.map((e) => make(`Invalid JSON-LD: ${e.message}`, {
274
+ selector: 'script[type="application/ld+json"]',
275
+ evidence: { snippet: e.snippet },
276
+ }))),
102
277
  defineRule({
103
- id: 'structured-data.missing',
104
- category: 'structured-data',
105
- severity: 'info',
106
- description: 'The page has no structured data (JSON-LD or microdata).',
107
- recommendation: 'Add JSON-LD for the page type (Article, Product, Organization, BreadcrumbList, FAQPage, ...) to qualify for rich results.',
278
+ id: "structured-data.missing",
279
+ category: "structured-data",
280
+ severity: "info",
281
+ description: "The page has no structured data (JSON-LD or microdata).",
282
+ recommendation: "Add JSON-LD for the page type (Article, Product, Organization, BreadcrumbList, FAQPage, ...) to qualify for rich results.",
108
283
  docs: GOOGLE_DOCS.structuredData,
109
- }, ({ page }, make) => (page.structuredData.length === 0 && page.structuredDataErrors.length === 0 ? make('Page has no structured data.') : null)),
284
+ }, ({ page }, make) => page.structuredData.length === 0 && page.structuredDataErrors.length === 0
285
+ ? make("Page has no structured data.")
286
+ : null),
110
287
  defineRule({
111
- id: 'structured-data.missing-context',
112
- category: 'structured-data',
113
- severity: 'warning',
114
- description: 'A JSON-LD item has no @context or a context other than schema.org.',
288
+ id: "structured-data.missing-context",
289
+ category: "structured-data",
290
+ severity: "warning",
291
+ description: "A JSON-LD item has no @context or a context other than schema.org.",
115
292
  recommendation: 'Set "@context": "https://schema.org" on every top-level JSON-LD object.',
116
293
  docs: GOOGLE_DOCS.structuredData,
117
294
  }, ({ page }, make) => {
118
- const bad = page.structuredData.filter((i) => i.source === 'json-ld' && !(i.context ?? '').toLowerCase().includes('schema.org'));
119
- return bad.length ? make(`${bad.length} JSON-LD item(s) lack a schema.org @context.`, { selector: 'script[type="application/ld+json"]', evidence: { contexts: cap(bad.map((i) => i.context)), types: cap(bad.flatMap((i) => i.types)) } }) : null;
295
+ const bad = page.structuredData.filter((i) => i.source === "json-ld" &&
296
+ !(i.context ?? "").toLowerCase().includes("schema.org"));
297
+ return bad.length
298
+ ? make(`${bad.length} JSON-LD item(s) lack a schema.org @context.`, {
299
+ selector: 'script[type="application/ld+json"]',
300
+ evidence: {
301
+ contexts: cap(bad.map((i) => i.context)),
302
+ types: cap(bad.flatMap((i) => i.types)),
303
+ },
304
+ })
305
+ : null;
120
306
  }),
121
307
  defineRule({
122
- id: 'structured-data.missing-type',
123
- category: 'structured-data',
124
- severity: 'warning',
125
- description: 'A structured data item has no @type (or itemtype).',
308
+ id: "structured-data.missing-type",
309
+ category: "structured-data",
310
+ severity: "warning",
311
+ description: "A structured data item has no @type (or itemtype).",
126
312
  recommendation: 'Add "@type" (e.g. "Article") to every structured data object.',
127
313
  docs: GOOGLE_DOCS.structuredData,
128
314
  }, ({ page }, make) => {
129
315
  const bad = page.structuredData.filter((i) => i.types.length === 0);
130
- return bad.length ? make(`${bad.length} structured data item(s) have no @type.`, { evidence: { sources: cap(bad.map((i) => i.source)), keys: cap(bad.map((i) => Object.keys(i.data).slice(0, 8))) } }) : null;
316
+ return bad.length
317
+ ? make(`${bad.length} structured data item(s) have no @type.`, {
318
+ evidence: {
319
+ sources: cap(bad.map((i) => i.source)),
320
+ keys: cap(bad.map((i) => Object.keys(i.data).slice(0, 8))),
321
+ },
322
+ })
323
+ : null;
131
324
  }),
132
325
  defineRule({
133
- id: 'structured-data.missing-required',
134
- category: 'structured-data',
135
- severity: 'warning',
136
- description: 'A structured data item of a known type is missing properties Google requires for rich results.',
137
- recommendation: 'Add the missing properties listed in evidence. Validate with https://search.google.com/test/rich-results after fixing.',
326
+ id: "structured-data.missing-required",
327
+ category: "structured-data",
328
+ severity: "warning",
329
+ description: "A structured data item of a known type is missing properties Google requires for rich results.",
330
+ recommendation: "Add the missing properties listed in evidence. Validate with https://search.google.com/test/rich-results after fixing.",
138
331
  docs: GOOGLE_DOCS.structuredData,
139
332
  }, ({ page }, make) => page.structuredData.flatMap((item) => {
140
333
  const { required } = validateItem(item);
141
- return required.map((iss) => make(`${iss.type} is missing required: ${iss.missing.join(', ')}.`, {
142
- selector: item.source === 'json-ld' ? 'script[type="application/ld+json"]' : `[itemtype*="${iss.type}"]`,
143
- evidence: { type: iss.type, missing: iss.missing, path: iss.path || '(root)', source: item.source, docs: SCHEMA_SPECS[iss.type]?.docs },
334
+ return required.map((iss) => make(`${iss.type} is missing required: ${iss.missing.join(", ")}.`, {
335
+ selector: item.source === "json-ld"
336
+ ? 'script[type="application/ld+json"]'
337
+ : `[itemtype*="${iss.type}"]`,
338
+ evidence: {
339
+ type: iss.type,
340
+ missing: iss.missing,
341
+ path: iss.path || "(root)",
342
+ source: item.source,
343
+ docs: SCHEMA_SPECS[iss.type]?.docs,
344
+ },
144
345
  }));
145
346
  })),
146
347
  defineRule({
147
- id: 'structured-data.missing-recommended',
148
- category: 'structured-data',
149
- severity: 'info',
150
- description: 'A structured data item is missing properties Google recommends for richer results.',
151
- recommendation: 'Add the recommended properties where the data exists; they unlock additional rich-result features.',
348
+ id: "structured-data.missing-recommended",
349
+ category: "structured-data",
350
+ severity: "info",
351
+ description: "A structured data item is missing properties Google recommends for richer results.",
352
+ recommendation: "Add the recommended properties where the data exists; they unlock additional rich-result features.",
152
353
  docs: GOOGLE_DOCS.structuredData,
153
354
  }, ({ page }, make) => page.structuredData.flatMap((item) => {
154
355
  const { recommended } = validateItem(item);
155
- return recommended.map((iss) => make(`${iss.type} is missing recommended: ${iss.missing.join(', ')}.`, { evidence: { type: iss.type, missing: iss.missing, path: iss.path || '(root)', source: item.source } }));
356
+ return recommended.map((iss) => make(`${iss.type} is missing recommended: ${iss.missing.join(", ")}.`, {
357
+ evidence: {
358
+ type: iss.type,
359
+ missing: iss.missing,
360
+ path: iss.path || "(root)",
361
+ source: item.source,
362
+ },
363
+ }));
156
364
  })),
157
365
  defineRule({
158
- id: 'structured-data.invalid-date',
159
- category: 'structured-data',
160
- severity: 'warning',
161
- description: 'Date properties in structured data that are not ISO 8601.',
162
- recommendation: 'Use ISO 8601 dates such as 2026-03-14 or 2026-03-14T09:30:00+01:00.',
366
+ id: "structured-data.invalid-date",
367
+ category: "structured-data",
368
+ severity: "warning",
369
+ description: "Date properties in structured data that are not ISO 8601.",
370
+ recommendation: "Use ISO 8601 dates such as 2026-03-14 or 2026-03-14T09:30:00+01:00.",
163
371
  docs: GOOGLE_DOCS.structuredData,
164
372
  }, ({ page }, make) => {
165
373
  const bad = page.structuredData.flatMap((i) => validateItem(i).badDates);
166
- return bad.length ? make(`${bad.length} structured data date(s) are not ISO 8601.`, { evidence: { examples: cap(bad) } }) : null;
374
+ return bad.length
375
+ ? make(`${bad.length} structured data date(s) are not ISO 8601.`, {
376
+ evidence: { examples: cap(bad) },
377
+ })
378
+ : null;
167
379
  }),
168
380
  ];
169
381
  //# sourceMappingURL=structured-data.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"structured-data.js","sourceRoot":"","sources":["../../../src/core/rules/structured-data.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"structured-data.js","sourceRoot":"","sources":["../../../src/core/rules/structured-data.ts"],"names":[],"mappings":"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"}