aeoptimize 0.6.2 → 0.7.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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +13 -0
- package/CONTRIBUTING.md +6 -0
- package/README.md +103 -6
- package/dist/cli/index.js +162 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/audit.d.ts +15 -0
- package/dist/core/audit.js +301 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/scanner.d.ts +22 -0
- package/dist/core/scanner.js +108 -28
- package/dist/core/scanner.js.map +1 -1
- package/dist/core/site-audit.d.ts +21 -0
- package/dist/core/site-audit.js +605 -0
- package/dist/core/site-audit.js.map +1 -0
- package/dist/core/static-audit.d.ts +30 -0
- package/dist/core/static-audit.js +202 -0
- package/dist/core/static-audit.js.map +1 -0
- package/dist/core/types.d.ts +84 -0
- package/docs/methodology.md +21 -0
- package/docs/release-v0.7.md +42 -0
- package/examples/github-action-sample/.github/workflows/aeoptimize.yml +1 -1
- package/examples/github-action-sample/README.md +1 -1
- package/package.json +2 -1
- package/scripts/verify-release-candidate.sh +17 -0
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
import * as cheerio from 'cheerio';
|
|
2
|
+
import { fetchUrlResource, parseHtml } from './scanner.js';
|
|
3
|
+
const SITE_AUDIT_CONTRACT_VERSION = '1.0';
|
|
4
|
+
const DEFAULT_MAX_PAGES = 20;
|
|
5
|
+
const MAX_ALLOWED_PAGES = 200;
|
|
6
|
+
const MAX_SITEMAPS = 5;
|
|
7
|
+
const REQUEST_TIMEOUT_MS = 15_000;
|
|
8
|
+
const SITE_AUDIT_USER_AGENT = 'aeoptimize-site-audit';
|
|
9
|
+
function normalizeUrl(value, base) {
|
|
10
|
+
const url = base ? new URL(value, base) : new URL(value);
|
|
11
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
12
|
+
throw new Error(`Unsupported scheme: ${url.protocol}`);
|
|
13
|
+
}
|
|
14
|
+
url.hash = '';
|
|
15
|
+
return url.toString();
|
|
16
|
+
}
|
|
17
|
+
function escapeRegExp(value) {
|
|
18
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
19
|
+
}
|
|
20
|
+
function ruleMatches(rule, pathAndQuery) {
|
|
21
|
+
if (!rule.pattern)
|
|
22
|
+
return false;
|
|
23
|
+
const anchored = rule.pattern.endsWith('$');
|
|
24
|
+
const body = anchored ? rule.pattern.slice(0, -1) : rule.pattern;
|
|
25
|
+
const expression = body.split('*').map(escapeRegExp).join('.*');
|
|
26
|
+
return new RegExp(`^${expression}${anchored ? '$' : ''}`).test(pathAndQuery);
|
|
27
|
+
}
|
|
28
|
+
export function robotsAllows(urlValue, policy) {
|
|
29
|
+
const url = new URL(urlValue);
|
|
30
|
+
const pathAndQuery = `${url.pathname}${url.search}`;
|
|
31
|
+
const matches = policy.rules
|
|
32
|
+
.filter((rule) => ruleMatches(rule, pathAndQuery))
|
|
33
|
+
.sort((left, right) => {
|
|
34
|
+
const specificity = (rule) => rule.pattern.replace(/[\*$]/g, '').length;
|
|
35
|
+
const difference = specificity(right) - specificity(left);
|
|
36
|
+
if (difference !== 0)
|
|
37
|
+
return difference;
|
|
38
|
+
return left.directive === 'allow' ? -1 : 1;
|
|
39
|
+
});
|
|
40
|
+
if (matches.length === 0)
|
|
41
|
+
return true;
|
|
42
|
+
return matches[0].directive === 'allow';
|
|
43
|
+
}
|
|
44
|
+
export function parseRobotsTxt(text, userAgent = SITE_AUDIT_USER_AGENT) {
|
|
45
|
+
const groups = [];
|
|
46
|
+
const sitemapUrls = [];
|
|
47
|
+
let current = null;
|
|
48
|
+
for (const rawLine of text.split(/\r?\n/)) {
|
|
49
|
+
const line = rawLine.replace(/#.*$/, '').trim();
|
|
50
|
+
if (!line)
|
|
51
|
+
continue;
|
|
52
|
+
const separator = line.indexOf(':');
|
|
53
|
+
if (separator < 0)
|
|
54
|
+
continue;
|
|
55
|
+
const field = line.slice(0, separator).trim().toLowerCase();
|
|
56
|
+
const value = line.slice(separator + 1).trim();
|
|
57
|
+
if (field === 'sitemap') {
|
|
58
|
+
if (value)
|
|
59
|
+
sitemapUrls.push(value);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (field === 'user-agent') {
|
|
63
|
+
if (!current || current.rules.length > 0) {
|
|
64
|
+
current = { agents: [], rules: [] };
|
|
65
|
+
groups.push(current);
|
|
66
|
+
}
|
|
67
|
+
if (value)
|
|
68
|
+
current.agents.push(value.toLowerCase());
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if ((field === 'allow' || field === 'disallow') && current) {
|
|
72
|
+
if (field === 'disallow' && value === '')
|
|
73
|
+
continue;
|
|
74
|
+
current.rules.push({ directive: field, pattern: value });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const normalizedAgent = userAgent.toLowerCase();
|
|
78
|
+
const specificGroups = groups.filter((group) => group.agents.some((agent) => agent !== '*' && normalizedAgent.includes(agent)));
|
|
79
|
+
let selectedGroups;
|
|
80
|
+
if (specificGroups.length > 0) {
|
|
81
|
+
const longestMatch = Math.max(...specificGroups.flatMap((group) => group.agents
|
|
82
|
+
.filter((agent) => agent !== '*' && normalizedAgent.includes(agent))
|
|
83
|
+
.map((agent) => agent.length)));
|
|
84
|
+
selectedGroups = specificGroups.filter((group) => group.agents.some((agent) => agent !== '*' && normalizedAgent.includes(agent) && agent.length === longestMatch));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
selectedGroups = groups.filter((group) => group.agents.includes('*'));
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
rules: selectedGroups.flatMap((group) => group.rules),
|
|
91
|
+
sitemapUrls: [...new Set(sitemapUrls)],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function parseSitemapDocument(xml) {
|
|
95
|
+
const $ = cheerio.load(xml, { xmlMode: true });
|
|
96
|
+
if ($('sitemapindex').length > 0) {
|
|
97
|
+
return {
|
|
98
|
+
kind: 'index',
|
|
99
|
+
urls: $('sitemap > loc').map((_, element) => $(element).text().trim()).get().filter(Boolean),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if ($('urlset').length > 0) {
|
|
103
|
+
return {
|
|
104
|
+
kind: 'urlset',
|
|
105
|
+
urls: $('url > loc').map((_, element) => $(element).text().trim()).get().filter(Boolean),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return { kind: 'unknown', urls: [] };
|
|
109
|
+
}
|
|
110
|
+
function observed(source, values) {
|
|
111
|
+
return { source, observed: values };
|
|
112
|
+
}
|
|
113
|
+
function check(id, label, status, values, explanation, remediation, validation, source = 'derived') {
|
|
114
|
+
return {
|
|
115
|
+
id,
|
|
116
|
+
label,
|
|
117
|
+
status,
|
|
118
|
+
evidence: [observed(source, values)],
|
|
119
|
+
explanation,
|
|
120
|
+
remediation,
|
|
121
|
+
validation,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function isHtmlResource(resource) {
|
|
125
|
+
return resource.contentType?.toLowerCase().includes('html') === true ||
|
|
126
|
+
/^\s*(?:<!doctype\s+html|<html\b)/i.test(resource.html);
|
|
127
|
+
}
|
|
128
|
+
function blocksIndexing(document, xRobotsTag) {
|
|
129
|
+
const metaValues = document.metaTagValues;
|
|
130
|
+
const directives = [
|
|
131
|
+
...(metaValues?.robots ?? (document.metaTags.robots ? [document.metaTags.robots] : [])),
|
|
132
|
+
...(metaValues?.googlebot ?? (document.metaTags.googlebot ? [document.metaTags.googlebot] : [])),
|
|
133
|
+
xRobotsTag,
|
|
134
|
+
]
|
|
135
|
+
.filter(Boolean)
|
|
136
|
+
.join(', ');
|
|
137
|
+
return /(?:^|[,\s])(?:noindex|none)(?:$|[,\s])/i.test(directives);
|
|
138
|
+
}
|
|
139
|
+
function internalUrl(href, baseUrl, origin) {
|
|
140
|
+
try {
|
|
141
|
+
const resolved = normalizeUrl(href, baseUrl);
|
|
142
|
+
return new URL(resolved).origin === origin ? resolved : null;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async function fetchForSite(url, allowedOrigin) {
|
|
149
|
+
return fetchUrlResource(url, {
|
|
150
|
+
render: false,
|
|
151
|
+
init: {
|
|
152
|
+
headers: { 'user-agent': SITE_AUDIT_USER_AGENT },
|
|
153
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
154
|
+
},
|
|
155
|
+
allowedOrigin,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
async function loadRobots(origin) {
|
|
159
|
+
const url = `${origin}/robots.txt`;
|
|
160
|
+
try {
|
|
161
|
+
const resource = await fetchForSite(url, origin);
|
|
162
|
+
if (resource.status === 200) {
|
|
163
|
+
return { url, status: 200, policy: parseRobotsTxt(resource.html, SITE_AUDIT_USER_AGENT) };
|
|
164
|
+
}
|
|
165
|
+
if (resource.status === 401 || resource.status === 403 || resource.status === 429 || resource.status >= 500) {
|
|
166
|
+
return {
|
|
167
|
+
url,
|
|
168
|
+
status: resource.status,
|
|
169
|
+
policy: { rules: [{ directive: 'disallow', pattern: '/' }], sitemapUrls: [] },
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return { url, status: resource.status, policy: { rules: [], sitemapUrls: [] } };
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return {
|
|
176
|
+
url,
|
|
177
|
+
status: 0,
|
|
178
|
+
policy: { rules: [{ directive: 'disallow', pattern: '/' }], sitemapUrls: [] },
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async function loadSitemaps(origin, initialUrls) {
|
|
183
|
+
const reports = [];
|
|
184
|
+
const pageUrls = [];
|
|
185
|
+
const queue = initialUrls.length > 0 ? [...initialUrls] : [`${origin}/sitemap.xml`];
|
|
186
|
+
const visited = new Set();
|
|
187
|
+
while (queue.length > 0 && visited.size < MAX_SITEMAPS) {
|
|
188
|
+
const rawUrl = queue.shift();
|
|
189
|
+
let url;
|
|
190
|
+
try {
|
|
191
|
+
url = normalizeUrl(rawUrl, `${origin}/`);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (new URL(url).origin !== origin || visited.has(url))
|
|
197
|
+
continue;
|
|
198
|
+
visited.add(url);
|
|
199
|
+
try {
|
|
200
|
+
const resource = await fetchForSite(url, origin);
|
|
201
|
+
if (resource.status !== 200) {
|
|
202
|
+
reports.push({ url, status: resource.status, kind: 'unknown', urlCount: 0 });
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
const parsed = parseSitemapDocument(resource.html);
|
|
206
|
+
reports.push({ url, status: resource.status, kind: parsed.kind, urlCount: parsed.urls.length });
|
|
207
|
+
for (const location of parsed.urls) {
|
|
208
|
+
try {
|
|
209
|
+
const normalized = normalizeUrl(location, url);
|
|
210
|
+
if (new URL(normalized).origin !== origin)
|
|
211
|
+
continue;
|
|
212
|
+
if (parsed.kind === 'index')
|
|
213
|
+
queue.push(normalized);
|
|
214
|
+
if (parsed.kind === 'urlset')
|
|
215
|
+
pageUrls.push(normalized);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Invalid sitemap locations are ignored and surfaced through the unknown/missing coverage checks.
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
reports.push({ url, status: 0, kind: 'unknown', urlCount: 0 });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return { reports, pageUrls: [...new Set(pageUrls)] };
|
|
227
|
+
}
|
|
228
|
+
function validateMaxPages(value) {
|
|
229
|
+
const maxPages = value ?? DEFAULT_MAX_PAGES;
|
|
230
|
+
if (!Number.isInteger(maxPages) || maxPages < 1 || maxPages > MAX_ALLOWED_PAGES) {
|
|
231
|
+
throw new Error(`--max-pages must be an integer from 1 to ${MAX_ALLOWED_PAGES}.`);
|
|
232
|
+
}
|
|
233
|
+
return maxPages;
|
|
234
|
+
}
|
|
235
|
+
export async function auditSite(startUrl, options = {}) {
|
|
236
|
+
const maxPages = validateMaxPages(options.maxPages);
|
|
237
|
+
const requestedStartUrl = normalizeUrl(startUrl);
|
|
238
|
+
const startResource = await fetchForSite(requestedStartUrl);
|
|
239
|
+
const origin = new URL(startResource.finalUrl).origin;
|
|
240
|
+
const normalizedStartUrl = normalizeUrl(startResource.finalUrl);
|
|
241
|
+
const robotsResult = await loadRobots(origin);
|
|
242
|
+
const sitemapResult = await loadSitemaps(origin, robotsResult.policy.sitemapUrls);
|
|
243
|
+
const sitemapUrls = new Set(sitemapResult.pageUrls);
|
|
244
|
+
const discoverySources = new Map();
|
|
245
|
+
const inlinks = new Map();
|
|
246
|
+
const allInternalTargets = new Set();
|
|
247
|
+
const robotsSkipped = new Set();
|
|
248
|
+
const visited = new Set();
|
|
249
|
+
const linkQueue = [];
|
|
250
|
+
const sitemapQueue = [...sitemapUrls];
|
|
251
|
+
const linkScheduled = new Set();
|
|
252
|
+
const pages = [];
|
|
253
|
+
const addSource = (url, source) => {
|
|
254
|
+
const sources = discoverySources.get(url) ?? new Set();
|
|
255
|
+
sources.add(source);
|
|
256
|
+
discoverySources.set(url, sources);
|
|
257
|
+
};
|
|
258
|
+
addSource(normalizedStartUrl, 'start');
|
|
259
|
+
for (const url of sitemapUrls)
|
|
260
|
+
addSource(url, 'sitemap');
|
|
261
|
+
const scheduleLink = (url, from) => {
|
|
262
|
+
addSource(url, `link:${from}`);
|
|
263
|
+
const sources = inlinks.get(url) ?? new Set();
|
|
264
|
+
sources.add(from);
|
|
265
|
+
inlinks.set(url, sources);
|
|
266
|
+
allInternalTargets.add(url);
|
|
267
|
+
if (!visited.has(url) && !linkScheduled.has(url)) {
|
|
268
|
+
linkScheduled.add(url);
|
|
269
|
+
linkQueue.push(url);
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
const processResource = (requestedUrl, resource) => {
|
|
273
|
+
visited.add(requestedUrl);
|
|
274
|
+
visited.add(normalizeUrl(resource.finalUrl));
|
|
275
|
+
const htmlDocument = resource.status >= 200 && resource.status < 300 && isHtmlResource(resource)
|
|
276
|
+
? parseHtml(resource.html, resource.finalUrl)
|
|
277
|
+
: null;
|
|
278
|
+
const internalTargets = [];
|
|
279
|
+
let externalLinkCount = 0;
|
|
280
|
+
if (htmlDocument) {
|
|
281
|
+
for (const link of htmlDocument.links) {
|
|
282
|
+
const internal = internalUrl(link.href, resource.finalUrl, origin);
|
|
283
|
+
if (internal) {
|
|
284
|
+
internalTargets.push(internal);
|
|
285
|
+
scheduleLink(internal, normalizeUrl(resource.finalUrl));
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
try {
|
|
289
|
+
const target = new URL(link.href, resource.finalUrl);
|
|
290
|
+
if (target.protocol === 'http:' || target.protocol === 'https:')
|
|
291
|
+
externalLinkCount += 1;
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// Non-URL link targets are omitted from the external count.
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const combinedSources = new Set([
|
|
300
|
+
...(discoverySources.get(requestedUrl) ?? []),
|
|
301
|
+
...(discoverySources.get(normalizeUrl(resource.finalUrl)) ?? []),
|
|
302
|
+
]);
|
|
303
|
+
pages.push({
|
|
304
|
+
output: {
|
|
305
|
+
requestedUrl,
|
|
306
|
+
finalUrl: resource.finalUrl,
|
|
307
|
+
status: resource.status,
|
|
308
|
+
statusText: resource.statusText,
|
|
309
|
+
redirects: resource.redirects.map((hop) => `${hop.status} ${hop.from} -> ${hop.to}`),
|
|
310
|
+
contentType: resource.contentType,
|
|
311
|
+
title: htmlDocument?.documentTitle || null,
|
|
312
|
+
language: htmlDocument?.language || null,
|
|
313
|
+
canonicalLinks: htmlDocument?.canonicalLinks ?? [],
|
|
314
|
+
internalLinkCount: internalTargets.length,
|
|
315
|
+
externalLinkCount,
|
|
316
|
+
discoveredFrom: [...combinedSources].sort(),
|
|
317
|
+
},
|
|
318
|
+
document: htmlDocument,
|
|
319
|
+
internalTargets,
|
|
320
|
+
blocksIndexing: htmlDocument ? blocksIndexing(htmlDocument, resource.xRobotsTag) : false,
|
|
321
|
+
});
|
|
322
|
+
};
|
|
323
|
+
if (robotsAllows(normalizedStartUrl, robotsResult.policy)) {
|
|
324
|
+
processResource(normalizedStartUrl, startResource);
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
robotsSkipped.add(normalizedStartUrl);
|
|
328
|
+
}
|
|
329
|
+
while (pages.length < maxPages) {
|
|
330
|
+
let nextUrl;
|
|
331
|
+
while (linkQueue.length > 0 && !nextUrl) {
|
|
332
|
+
const candidate = linkQueue.shift();
|
|
333
|
+
if (!visited.has(candidate))
|
|
334
|
+
nextUrl = candidate;
|
|
335
|
+
}
|
|
336
|
+
while (!nextUrl && sitemapQueue.length > 0) {
|
|
337
|
+
const candidate = sitemapQueue.shift();
|
|
338
|
+
if (!visited.has(candidate))
|
|
339
|
+
nextUrl = candidate;
|
|
340
|
+
}
|
|
341
|
+
if (!nextUrl)
|
|
342
|
+
break;
|
|
343
|
+
if (!robotsAllows(nextUrl, robotsResult.policy)) {
|
|
344
|
+
robotsSkipped.add(nextUrl);
|
|
345
|
+
visited.add(nextUrl);
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
try {
|
|
349
|
+
const resource = await fetchForSite(nextUrl, origin);
|
|
350
|
+
processResource(nextUrl, resource);
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
visited.add(nextUrl);
|
|
354
|
+
pages.push({
|
|
355
|
+
output: {
|
|
356
|
+
requestedUrl: nextUrl,
|
|
357
|
+
finalUrl: nextUrl,
|
|
358
|
+
status: 0,
|
|
359
|
+
statusText: error instanceof Error ? error.message : 'Request failed',
|
|
360
|
+
redirects: [],
|
|
361
|
+
contentType: null,
|
|
362
|
+
title: null,
|
|
363
|
+
language: null,
|
|
364
|
+
canonicalLinks: [],
|
|
365
|
+
internalLinkCount: 0,
|
|
366
|
+
externalLinkCount: 0,
|
|
367
|
+
discoveredFrom: [...(discoverySources.get(nextUrl) ?? [])].sort(),
|
|
368
|
+
},
|
|
369
|
+
document: null,
|
|
370
|
+
internalTargets: [],
|
|
371
|
+
blocksIndexing: false,
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
for (const page of pages) {
|
|
376
|
+
const sources = new Set([
|
|
377
|
+
...(discoverySources.get(page.output.requestedUrl) ?? []),
|
|
378
|
+
...(discoverySources.get(normalizeUrl(page.output.finalUrl)) ?? []),
|
|
379
|
+
]);
|
|
380
|
+
page.output.discoveredFrom = [...sources].sort();
|
|
381
|
+
}
|
|
382
|
+
const remainingUrls = [...linkQueue, ...sitemapQueue]
|
|
383
|
+
.filter((url) => !visited.has(url) && robotsAllows(url, robotsResult.policy));
|
|
384
|
+
const truncated = remainingUrls.length > 0;
|
|
385
|
+
const pageLookup = new Map();
|
|
386
|
+
for (const page of pages) {
|
|
387
|
+
pageLookup.set(page.output.requestedUrl, page);
|
|
388
|
+
pageLookup.set(normalizeUrl(page.output.finalUrl), page);
|
|
389
|
+
}
|
|
390
|
+
const failedPages = pages.filter((page) => page.output.status >= 400);
|
|
391
|
+
const unavailablePages = pages.filter((page) => page.output.status === 0);
|
|
392
|
+
const longRedirectChains = pages.filter((page) => page.output.redirects.length > 1);
|
|
393
|
+
const brokenInternalTargets = [...allInternalTargets].filter((url) => {
|
|
394
|
+
const page = pageLookup.get(url);
|
|
395
|
+
return page ? page.output.status >= 400 : false;
|
|
396
|
+
});
|
|
397
|
+
const uncheckedInternalTargets = [...allInternalTargets].filter((url) => (!pageLookup.has(url) || pageLookup.get(url)?.output.status === 0) && !robotsSkipped.has(url));
|
|
398
|
+
const htmlPages = pages.filter((page) => page.document !== null);
|
|
399
|
+
const missingCanonicals = [];
|
|
400
|
+
const malformedCanonicals = [];
|
|
401
|
+
const nonSelfCanonicals = [];
|
|
402
|
+
const canonicalOwners = new Map();
|
|
403
|
+
for (const page of htmlPages) {
|
|
404
|
+
const canonicals = page.document.canonicalLinks ?? [];
|
|
405
|
+
if (canonicals.length === 0) {
|
|
406
|
+
missingCanonicals.push(page.output.finalUrl);
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
if (canonicals.length > 1)
|
|
410
|
+
malformedCanonicals.push(page.output.finalUrl);
|
|
411
|
+
for (const value of canonicals) {
|
|
412
|
+
try {
|
|
413
|
+
const resolved = normalizeUrl(value, page.output.finalUrl);
|
|
414
|
+
const owners = canonicalOwners.get(resolved) ?? [];
|
|
415
|
+
owners.push(page.output.finalUrl);
|
|
416
|
+
canonicalOwners.set(resolved, owners);
|
|
417
|
+
if (resolved !== normalizeUrl(page.output.finalUrl)) {
|
|
418
|
+
nonSelfCanonicals.push(`${page.output.finalUrl} -> ${resolved}`);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
catch {
|
|
422
|
+
malformedCanonicals.push(`${page.output.finalUrl} -> ${value}`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
const duplicateCanonicals = [...canonicalOwners.entries()]
|
|
427
|
+
.filter(([, owners]) => new Set(owners).size > 1)
|
|
428
|
+
.map(([canonical, owners]) => `${canonical} <= ${[...new Set(owners)].join(', ')}`);
|
|
429
|
+
const titleOwners = new Map();
|
|
430
|
+
for (const page of htmlPages) {
|
|
431
|
+
const title = page.output.title?.trim();
|
|
432
|
+
if (!title)
|
|
433
|
+
continue;
|
|
434
|
+
const owners = titleOwners.get(title.toLocaleLowerCase()) ?? [];
|
|
435
|
+
owners.push(page.output.finalUrl);
|
|
436
|
+
titleOwners.set(title.toLocaleLowerCase(), owners);
|
|
437
|
+
}
|
|
438
|
+
const duplicateTitles = [...titleOwners.entries()]
|
|
439
|
+
.filter(([, owners]) => new Set(owners).size > 1)
|
|
440
|
+
.map(([title, owners]) => `${title} <= ${[...new Set(owners)].join(', ')}`);
|
|
441
|
+
const brokenSitemapPages = [...sitemapUrls].filter((url) => {
|
|
442
|
+
const page = pageLookup.get(url);
|
|
443
|
+
return page ? page.output.status >= 400 : false;
|
|
444
|
+
});
|
|
445
|
+
const unavailableSitemapPages = [...sitemapUrls].filter((url) => pageLookup.get(url)?.output.status === 0);
|
|
446
|
+
const failedSitemaps = sitemapResult.reports.filter((sitemap) => sitemap.status !== 0 && sitemap.status !== 200 && sitemap.status !== 404);
|
|
447
|
+
const unavailableSitemaps = sitemapResult.reports.filter((sitemap) => sitemap.status === 0);
|
|
448
|
+
const invalidSitemaps = sitemapResult.reports.filter((sitemap) => sitemap.status === 200 && sitemap.kind === 'unknown');
|
|
449
|
+
const indexableCrawledUrls = pages
|
|
450
|
+
.filter((page) => page.document && page.output.status >= 200 && page.output.status < 300 && !page.blocksIndexing)
|
|
451
|
+
.map((page) => normalizeUrl(page.output.finalUrl));
|
|
452
|
+
const missingFromSitemap = sitemapUrls.size > 0
|
|
453
|
+
? indexableCrawledUrls.filter((url) => !sitemapUrls.has(url))
|
|
454
|
+
: [];
|
|
455
|
+
const orphanCandidates = [...sitemapUrls].filter((url) => {
|
|
456
|
+
if (url === normalizedStartUrl || robotsSkipped.has(url))
|
|
457
|
+
return false;
|
|
458
|
+
const sources = [...(inlinks.get(url) ?? [])].filter((source) => source !== url);
|
|
459
|
+
return sources.length === 0;
|
|
460
|
+
});
|
|
461
|
+
const robotsStatus = robotsResult.status === 200
|
|
462
|
+
? 'PASS'
|
|
463
|
+
: robotsResult.status === 404
|
|
464
|
+
? 'N/A'
|
|
465
|
+
: 'WARNING';
|
|
466
|
+
const canonicalStatus = htmlPages.length === 0
|
|
467
|
+
? 'N/A'
|
|
468
|
+
: malformedCanonicals.length > 0
|
|
469
|
+
? 'FAIL'
|
|
470
|
+
: missingCanonicals.length > 0 || nonSelfCanonicals.length > 0 || duplicateCanonicals.length > 0
|
|
471
|
+
? 'WARNING'
|
|
472
|
+
: 'PASS';
|
|
473
|
+
const sitemapStatus = failedSitemaps.length > 0 || invalidSitemaps.length > 0 || brokenSitemapPages.length > 0
|
|
474
|
+
? 'FAIL'
|
|
475
|
+
: unavailableSitemaps.length > 0 || unavailableSitemapPages.length > 0 || missingFromSitemap.length > 0
|
|
476
|
+
? 'WARNING'
|
|
477
|
+
: sitemapUrls.size === 0
|
|
478
|
+
? 'N/A'
|
|
479
|
+
: 'PASS';
|
|
480
|
+
const checks = [
|
|
481
|
+
check('crawl-coverage', 'Bounded crawl coverage', pages.length === 0 ? 'FAIL' : truncated ? 'WARNING' : 'PASS', { crawledPages: pages.length, maxPages, queuedButUnchecked: remainingUrls.slice(0, 20), truncated }, truncated
|
|
482
|
+
? 'The page limit was reached while same-origin URLs remained in the deterministic queue.'
|
|
483
|
+
: 'The deterministic queue completed within the configured page limit.', truncated ? 'Increase --max-pages only after reviewing the queued URL patterns and crawl cost.' : null, 'Repeat the audit with the same start URL and limit, then compare the queue and page count.'),
|
|
484
|
+
check('robots-policy', 'robots.txt policy', robotsStatus, {
|
|
485
|
+
url: robotsResult.url,
|
|
486
|
+
status: robotsResult.status,
|
|
487
|
+
applicableRules: robotsResult.policy.rules.map((rule) => `${rule.directive}: ${rule.pattern}`),
|
|
488
|
+
skippedUrls: [...robotsSkipped].slice(0, 20),
|
|
489
|
+
}, robotsResult.status === 200
|
|
490
|
+
? 'Applicable aeoptimize or wildcard rules were evaluated before subsequent page requests.'
|
|
491
|
+
: robotsResult.status === 404
|
|
492
|
+
? 'No robots.txt file was found. Absence is not an error.'
|
|
493
|
+
: 'robots.txt could not be used reliably, so the crawler conservatively avoided matching subsequent URLs.', robotsStatus === 'WARNING' ? 'Restore a readable robots.txt response and review the intended crawler policy.' : null, 'Fetch robots.txt directly and compare the applicable user-agent group with the skipped URL sample.', 'http'),
|
|
494
|
+
check('site-http-status', 'Page HTTP status', failedPages.length > 0 ? 'FAIL' : unavailablePages.length > 0 ? 'WARNING' : pages.length > 0 ? 'PASS' : 'N/A', {
|
|
495
|
+
failedCount: failedPages.length,
|
|
496
|
+
failedPages: failedPages.slice(0, 20).map((page) => `${page.output.status} ${page.output.requestedUrl}`),
|
|
497
|
+
unavailableCount: unavailablePages.length,
|
|
498
|
+
unavailablePages: unavailablePages.slice(0, 20).map((page) => page.output.requestedUrl),
|
|
499
|
+
}, failedPages.length > 0
|
|
500
|
+
? 'One or more crawled URLs failed to return a successful final response.'
|
|
501
|
+
: unavailablePages.length > 0
|
|
502
|
+
? 'One or more page requests did not yield an HTTP response, so their status is unavailable.'
|
|
503
|
+
: 'Every crawled page returned a successful final response.', failedPages.length > 0
|
|
504
|
+
? 'Repair, remove, or intentionally retire failed URLs and update links or sitemap entries that reference them.'
|
|
505
|
+
: unavailablePages.length > 0
|
|
506
|
+
? 'Retry unavailable URLs and diagnose request or redirect-policy failures before classifying them.'
|
|
507
|
+
: null, 'Request each failed URL with redirects disabled and confirm the intended final status.', 'http'),
|
|
508
|
+
check('redirect-chains', 'Redirect chains', pages.length === 0 ? 'N/A' : longRedirectChains.length > 0 ? 'WARNING' : 'PASS', {
|
|
509
|
+
longChainCount: longRedirectChains.length,
|
|
510
|
+
samples: longRedirectChains.slice(0, 20).map((page) => page.output.redirects.join(' | ')),
|
|
511
|
+
}, longRedirectChains.length > 0
|
|
512
|
+
? 'One or more requested URLs required multiple redirect hops.'
|
|
513
|
+
: 'No multi-hop redirect chain was observed among crawled pages.', longRedirectChains.length > 0 ? 'Update internal links and redirect rules to target the final URL directly where appropriate.' : null, 'Request each sample with redirects disabled and verify every hop plus the final destination.', 'http'),
|
|
514
|
+
check('internal-link-targets', 'Internal link targets', brokenInternalTargets.length > 0
|
|
515
|
+
? 'FAIL'
|
|
516
|
+
: uncheckedInternalTargets.length > 0
|
|
517
|
+
? 'WARNING'
|
|
518
|
+
: allInternalTargets.size > 0
|
|
519
|
+
? 'PASS'
|
|
520
|
+
: 'N/A', {
|
|
521
|
+
discoveredTargetCount: allInternalTargets.size,
|
|
522
|
+
brokenTargets: brokenInternalTargets.slice(0, 20),
|
|
523
|
+
uncheckedTargets: uncheckedInternalTargets.slice(0, 20),
|
|
524
|
+
}, brokenInternalTargets.length > 0
|
|
525
|
+
? 'Confirmed internal link targets returned a failed response.'
|
|
526
|
+
: uncheckedInternalTargets.length > 0
|
|
527
|
+
? 'Some discovered internal targets were not fetched within the current crawl boundary.'
|
|
528
|
+
: 'Every discovered internal target within the crawl boundary returned a successful response.', brokenInternalTargets.length > 0
|
|
529
|
+
? 'Update links to a valid destination or restore the intended page.'
|
|
530
|
+
: uncheckedInternalTargets.length > 0
|
|
531
|
+
? 'Review the unchecked URL patterns before increasing the page limit.'
|
|
532
|
+
: null, 'Re-run the bounded crawl and request each reported target independently.'),
|
|
533
|
+
check('canonical-consistency', 'Canonical consistency', canonicalStatus, {
|
|
534
|
+
htmlPageCount: htmlPages.length,
|
|
535
|
+
missingCanonicals: missingCanonicals.slice(0, 20),
|
|
536
|
+
malformedCanonicals: malformedCanonicals.slice(0, 20),
|
|
537
|
+
nonSelfCanonicals: nonSelfCanonicals.slice(0, 20),
|
|
538
|
+
duplicateCanonicals: duplicateCanonicals.slice(0, 20),
|
|
539
|
+
}, canonicalStatus === 'PASS'
|
|
540
|
+
? 'Each inspected HTML page exposes one valid self-referencing canonical.'
|
|
541
|
+
: canonicalStatus === 'N/A'
|
|
542
|
+
? 'No successful HTML page was available for canonical inspection.'
|
|
543
|
+
: 'Canonical observations require repair or contextual review. A non-self canonical can be intentional.', canonicalStatus === 'FAIL'
|
|
544
|
+
? 'Emit one valid canonical URL per page.'
|
|
545
|
+
: canonicalStatus === 'WARNING'
|
|
546
|
+
? 'Review missing, shared, and non-self canonicals against the intended URL strategy.'
|
|
547
|
+
: null, 'Fetch each affected final URL and compare its rendered canonical with the intended indexable URL.', 'html'),
|
|
548
|
+
check('sitemap-consistency', 'Sitemap consistency', sitemapStatus, {
|
|
549
|
+
sitemapCount: sitemapResult.reports.length,
|
|
550
|
+
sitemapUrlCount: sitemapUrls.size,
|
|
551
|
+
failedSitemaps: failedSitemaps.map((sitemap) => `${sitemap.status} ${sitemap.url}`).slice(0, 20),
|
|
552
|
+
invalidSitemaps: invalidSitemaps.map((sitemap) => sitemap.url).slice(0, 20),
|
|
553
|
+
unavailableSitemaps: unavailableSitemaps.map((sitemap) => sitemap.url).slice(0, 20),
|
|
554
|
+
brokenSitemapPages: brokenSitemapPages.slice(0, 20),
|
|
555
|
+
unavailableSitemapPages: unavailableSitemapPages.slice(0, 20),
|
|
556
|
+
crawledButMissing: missingFromSitemap.slice(0, 20),
|
|
557
|
+
}, sitemapStatus === 'N/A'
|
|
558
|
+
? 'No readable sitemap URL set was discovered. A sitemap is optional for small sites.'
|
|
559
|
+
: sitemapStatus === 'PASS'
|
|
560
|
+
? 'No failed sitemap page or crawled indexable URL omission was observed within this bounded sample.'
|
|
561
|
+
: 'Sitemap fetches, listed pages, or bounded crawl coverage contain discrepancies.', sitemapStatus === 'FAIL'
|
|
562
|
+
? 'Repair unreadable sitemap files and remove or restore failed listed URLs.'
|
|
563
|
+
: sitemapStatus === 'WARNING'
|
|
564
|
+
? 'Retry unavailable URLs, review omissions, and keep canonical URL forms consistent.'
|
|
565
|
+
: null, 'Fetch every reported sitemap, validate its XML, and request affected page URLs independently.', 'http'),
|
|
566
|
+
check('orphan-candidates', 'Sitemap-only orphan candidates', sitemapUrls.size === 0 ? 'N/A' : orphanCandidates.length > 0 ? 'WARNING' : 'PASS', { candidateCount: orphanCandidates.length, candidates: orphanCandidates.slice(0, 20) }, sitemapUrls.size === 0
|
|
567
|
+
? 'A sitemap/link comparison was unavailable.'
|
|
568
|
+
: orphanCandidates.length > 0
|
|
569
|
+
? 'These sitemap URLs received no internal inlink in the bounded crawl. They are candidates, not confirmed orphan pages.'
|
|
570
|
+
: 'Every sitemap URL in the bounded sample received an internal inlink or was the start URL.', orphanCandidates.length > 0 ? 'Confirm the intended page value and add a relevant crawlable link, merge it, or remove it from the sitemap.' : null, 'Run a larger crawl and compare sitemap, rendered navigation, and server-log discovery before confirming orphan status.'),
|
|
571
|
+
check('duplicate-titles', 'Duplicate document titles', htmlPages.length === 0 ? 'N/A' : duplicateTitles.length > 0 ? 'WARNING' : 'PASS', { duplicateGroupCount: duplicateTitles.length, groups: duplicateTitles.slice(0, 20) }, duplicateTitles.length > 0
|
|
572
|
+
? 'Multiple crawled pages expose the same non-empty document title. Shared titles need intent and template review.'
|
|
573
|
+
: 'No duplicate non-empty document title was found in the bounded HTML sample.', duplicateTitles.length > 0 ? 'Give pages distinct titles when they serve different content or consolidate pages that serve the same purpose.' : null, 'Inspect the affected pages and verify their rendered titles after the template build.', 'html'),
|
|
574
|
+
];
|
|
575
|
+
const summary = { PASS: 0, WARNING: 0, FAIL: 0, 'N/A': 0 };
|
|
576
|
+
for (const item of checks)
|
|
577
|
+
summary[item.status] += 1;
|
|
578
|
+
return {
|
|
579
|
+
contractVersion: SITE_AUDIT_CONTRACT_VERSION,
|
|
580
|
+
startUrl: requestedStartUrl,
|
|
581
|
+
origin,
|
|
582
|
+
maxPages,
|
|
583
|
+
crawledPages: pages.length,
|
|
584
|
+
truncated,
|
|
585
|
+
robots: {
|
|
586
|
+
url: robotsResult.url,
|
|
587
|
+
status: robotsResult.status,
|
|
588
|
+
applicableRules: robotsResult.policy.rules.map((rule) => `${rule.directive}: ${rule.pattern}`),
|
|
589
|
+
sitemapUrls: robotsResult.policy.sitemapUrls,
|
|
590
|
+
skippedUrls: [...robotsSkipped].sort(),
|
|
591
|
+
},
|
|
592
|
+
sitemaps: sitemapResult.reports,
|
|
593
|
+
pages: pages.map((page) => page.output),
|
|
594
|
+
checks,
|
|
595
|
+
summary,
|
|
596
|
+
limitations: [
|
|
597
|
+
'The crawl is same-origin, sequential, response-HTML only, and bounded by --max-pages. JavaScript-inserted links are not discovered.',
|
|
598
|
+
'robots.txt matching supports applicable user-agent groups, Allow, Disallow, * wildcards, and $ endings. Review unusual policies manually.',
|
|
599
|
+
'Sitemap-only pages are orphan candidates until a sufficiently complete crawl or server-log evidence confirms their link discovery state.',
|
|
600
|
+
'The report does not claim actual search-engine crawl, index state, ranking, traffic, conversion, or AI citation outcomes.',
|
|
601
|
+
],
|
|
602
|
+
timestamp: new Date().toISOString(),
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
//# sourceMappingURL=site-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-audit.js","sourceRoot":"","sources":["../../src/core/site-audit.ts"],"names":[],"mappings":"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"}
|