ssrwire 0.1.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 (74) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/CONTRIBUTING.md +49 -0
  3. package/LICENSE +21 -0
  4. package/PUBLISHING.md +134 -0
  5. package/README.md +403 -0
  6. package/SECURITY.md +26 -0
  7. package/dist/agents.d.ts +14 -0
  8. package/dist/agents.d.ts.map +1 -0
  9. package/dist/agents.js +100 -0
  10. package/dist/agents.js.map +1 -0
  11. package/dist/analyze.d.ts +4 -0
  12. package/dist/analyze.d.ts.map +1 -0
  13. package/dist/analyze.js +494 -0
  14. package/dist/analyze.js.map +1 -0
  15. package/dist/audit.d.ts +3 -0
  16. package/dist/audit.d.ts.map +1 -0
  17. package/dist/audit.js +69 -0
  18. package/dist/audit.js.map +1 -0
  19. package/dist/bin.d.ts +3 -0
  20. package/dist/bin.d.ts.map +1 -0
  21. package/dist/bin.js +4 -0
  22. package/dist/bin.js.map +1 -0
  23. package/dist/cli.d.ts +2 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +173 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/config.d.ts +17 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +262 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/http-probe.d.ts +7 -0
  32. package/dist/http-probe.d.ts.map +1 -0
  33. package/dist/http-probe.js +406 -0
  34. package/dist/http-probe.js.map +1 -0
  35. package/dist/index.d.ts +11 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +10 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/redact.d.ts +10 -0
  40. package/dist/redact.d.ts.map +1 -0
  41. package/dist/redact.js +154 -0
  42. package/dist/redact.js.map +1 -0
  43. package/dist/reporters.d.ts +9 -0
  44. package/dist/reporters.d.ts.map +1 -0
  45. package/dist/reporters.js +220 -0
  46. package/dist/reporters.js.map +1 -0
  47. package/dist/stream-parser.d.ts +9 -0
  48. package/dist/stream-parser.d.ts.map +1 -0
  49. package/dist/stream-parser.js +366 -0
  50. package/dist/stream-parser.js.map +1 -0
  51. package/dist/types.d.ts +134 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/version.d.ts +2 -0
  56. package/dist/version.d.ts.map +1 -0
  57. package/dist/version.js +14 -0
  58. package/dist/version.js.map +1 -0
  59. package/examples/github-actions.yml +73 -0
  60. package/examples/ssrwire.config.yml +37 -0
  61. package/package.json +91 -0
  62. package/src/agents.ts +129 -0
  63. package/src/analyze.ts +628 -0
  64. package/src/audit.ts +89 -0
  65. package/src/bin.ts +5 -0
  66. package/src/cli.ts +207 -0
  67. package/src/config.ts +313 -0
  68. package/src/http-probe.ts +461 -0
  69. package/src/index.ts +34 -0
  70. package/src/redact.ts +173 -0
  71. package/src/reporters.ts +274 -0
  72. package/src/stream-parser.ts +424 -0
  73. package/src/types.ts +160 -0
  74. package/src/version.ts +19 -0
package/dist/agents.js ADDED
@@ -0,0 +1,100 @@
1
+ export const BUILTIN_AGENTS = Object.freeze({
2
+ browser: Object.freeze({
3
+ key: "browser",
4
+ label: "Browser",
5
+ userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
6
+ requiresHeadMetadata: false,
7
+ }),
8
+ googlebot: Object.freeze({
9
+ key: "googlebot",
10
+ label: "Googlebot",
11
+ userAgent: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
12
+ requiresHeadMetadata: false,
13
+ }),
14
+ bingbot: Object.freeze({
15
+ key: "bingbot",
16
+ label: "Bingbot",
17
+ userAgent: "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)",
18
+ requiresHeadMetadata: true,
19
+ }),
20
+ twitterbot: Object.freeze({
21
+ key: "twitterbot",
22
+ label: "Twitterbot",
23
+ userAgent: "Twitterbot/1.0",
24
+ requiresHeadMetadata: true,
25
+ }),
26
+ facebook: Object.freeze({
27
+ key: "facebook",
28
+ label: "Facebook crawler",
29
+ userAgent: "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)",
30
+ requiresHeadMetadata: true,
31
+ }),
32
+ });
33
+ const ALIASES = Object.freeze({
34
+ browser: "browser",
35
+ chrome: "browser",
36
+ google: "googlebot",
37
+ googlebot: "googlebot",
38
+ bing: "bingbot",
39
+ bingbot: "bingbot",
40
+ twitter: "twitterbot",
41
+ twitterbot: "twitterbot",
42
+ x: "twitterbot",
43
+ facebook: "facebook",
44
+ facebookbot: "facebook",
45
+ facebookexternalhit: "facebook",
46
+ });
47
+ function isCustomAgent(value) {
48
+ if (typeof value !== "object" || value === null)
49
+ return false;
50
+ const candidate = value;
51
+ return (typeof candidate.key === "string" &&
52
+ candidate.key.trim().length > 0 &&
53
+ typeof candidate.userAgent === "string" &&
54
+ candidate.userAgent.trim().length > 0 &&
55
+ (candidate.label === undefined ||
56
+ (typeof candidate.label === "string" && candidate.label.trim().length > 0)) &&
57
+ (candidate.requiresHeadMetadata === undefined ||
58
+ typeof candidate.requiresHeadMetadata === "boolean"));
59
+ }
60
+ /** Resolve a built-in key/alias or validate a complete custom agent profile. */
61
+ export function resolveAgent(input) {
62
+ if (typeof input === "string") {
63
+ const normalized = input.trim().toLowerCase();
64
+ const key = ALIASES[normalized];
65
+ if (key === undefined) {
66
+ throw new Error(`Unknown agent "${input}". Use browser, googlebot, bingbot, twitterbot, facebook, or a custom agent object.`);
67
+ }
68
+ const agent = BUILTIN_AGENTS[key];
69
+ if (agent === undefined) {
70
+ throw new Error(`Built-in agent "${key}" is unavailable.`);
71
+ }
72
+ return agent;
73
+ }
74
+ if (!isCustomAgent(input)) {
75
+ throw new TypeError("Custom agents require non-empty key and userAgent strings; label and requiresHeadMetadata are optional.");
76
+ }
77
+ if (/[\r\n]/u.test(input.userAgent)) {
78
+ throw new TypeError("Custom agent userAgent cannot contain a line break.");
79
+ }
80
+ return Object.freeze({
81
+ key: input.key.trim(),
82
+ label: input.label?.trim() ?? input.key.trim(),
83
+ userAgent: input.userAgent.trim(),
84
+ requiresHeadMetadata: input.requiresHeadMetadata ?? false,
85
+ });
86
+ }
87
+ /** Resolve an ordered list and reject duplicate keys, which would make reports ambiguous. */
88
+ export function resolveAgents(inputs) {
89
+ const resolved = inputs.map(resolveAgent);
90
+ const seen = new Set();
91
+ for (const agent of resolved) {
92
+ const normalized = agent.key.toLowerCase();
93
+ if (seen.has(normalized)) {
94
+ throw new Error(`Duplicate agent key "${agent.key}".`);
95
+ }
96
+ seen.add(normalized);
97
+ }
98
+ return resolved;
99
+ }
100
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AuditSummary, AuditTarget, Finding, ProbeResult, TargetAuditResult } from "./types.js";
2
+ export declare function analyzeTarget(target: AuditTarget, probes: readonly ProbeResult[]): readonly Finding[];
3
+ export declare function summarizeAudit(results: readonly TargetAuditResult[]): AuditSummary;
4
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAEX,OAAO,EACP,WAAW,EAIX,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAgepB,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,SAAS,WAAW,EAAE,GAC7B,SAAS,OAAO,EAAE,CAuGpB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,YAAY,CA6BlF"}
@@ -0,0 +1,494 @@
1
+ const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
2
+ const ROBOTS_OPPOSITES = [
3
+ ["index", "noindex"],
4
+ ["follow", "nofollow"],
5
+ ["archive", "noarchive"],
6
+ ["snippet", "nosnippet"],
7
+ ["translate", "notranslate"],
8
+ ["imageindex", "noimageindex"],
9
+ ];
10
+ function normalizeText(value) {
11
+ return value.trim().replace(/\s+/g, " ");
12
+ }
13
+ function normalizeCanonical(value, baseUrl) {
14
+ const trimmed = normalizeText(value);
15
+ if (trimmed.length === 0) {
16
+ return "";
17
+ }
18
+ try {
19
+ const url = new URL(trimmed, baseUrl);
20
+ url.hash = "";
21
+ return url.href;
22
+ }
23
+ catch {
24
+ return trimmed;
25
+ }
26
+ }
27
+ function normalizeFinalUrl(value) {
28
+ try {
29
+ const url = new URL(value);
30
+ url.hash = "";
31
+ return url.href;
32
+ }
33
+ catch {
34
+ return value;
35
+ }
36
+ }
37
+ function normalizeRobots(value) {
38
+ return normalizeText(value)
39
+ .toLowerCase()
40
+ .split(/[;,]/)
41
+ .map((directive) => directive.trim())
42
+ .filter((directive) => directive.length > 0)
43
+ .sort()
44
+ .join(",");
45
+ }
46
+ function normalizedValues(kind, signals, baseUrl) {
47
+ return signals
48
+ .map((signal) => {
49
+ if (kind === "canonical") {
50
+ return normalizeCanonical(signal.value, baseUrl);
51
+ }
52
+ if (kind === "robots") {
53
+ return normalizeRobots(signal.value);
54
+ }
55
+ return normalizeText(signal.value);
56
+ })
57
+ .filter((value) => value.length > 0);
58
+ }
59
+ function robotsAudienceForAgent(probe) {
60
+ const key = probe.agent.key.trim().toLowerCase();
61
+ if (key === "googlebot" || key === "bingbot")
62
+ return key;
63
+ return "robots";
64
+ }
65
+ function effectiveRobotsSignals(probe) {
66
+ const audience = robotsAudienceForAgent(probe);
67
+ const generic = probe.signals.robots.filter((signal) => signal.audience === "robots");
68
+ if (audience === "robots")
69
+ return generic;
70
+ const specific = probe.signals.robots.filter((signal) => signal.audience === audience && normalizeRobots(signal.value).length > 0);
71
+ return [...generic, ...specific];
72
+ }
73
+ function normalizedRobotsDirectives(signals) {
74
+ const directives = new Set(signals
75
+ .flatMap((signal) => normalizeRobots(signal.value).split(","))
76
+ .filter((directive) => directive.length > 0));
77
+ if (directives.delete("none")) {
78
+ directives.add("noindex");
79
+ directives.add("nofollow");
80
+ }
81
+ if (directives.delete("all")) {
82
+ directives.add("index");
83
+ directives.add("follow");
84
+ }
85
+ for (const [permissive, restrictive] of ROBOTS_OPPOSITES) {
86
+ if (directives.has(restrictive))
87
+ directives.delete(permissive);
88
+ }
89
+ return directives;
90
+ }
91
+ function effectiveRobotsValue(probe) {
92
+ return ([...normalizedRobotsDirectives(effectiveRobotsSignals(probe))].sort().join(",") || "<missing>");
93
+ }
94
+ function addFinding(findings, url, input) {
95
+ findings.push({
96
+ code: input.code,
97
+ severity: input.severity,
98
+ message: input.message,
99
+ url,
100
+ ...(input.agent === undefined ? {} : { agent: input.agent }),
101
+ ...(input.evidence === undefined ? {} : { evidence: input.evidence }),
102
+ });
103
+ }
104
+ function checkRepeatedMetadata(findings, targetUrl, probe, kind, signals) {
105
+ const values = normalizedValues(kind, signals, probe.finalUrl);
106
+ if (values.length < 2) {
107
+ return;
108
+ }
109
+ const distinct = new Set(values);
110
+ const conflicting = distinct.size > 1;
111
+ const label = kind === "robots" ? "meta robots directives" : `${kind} elements`;
112
+ addFinding(findings, targetUrl, {
113
+ code: conflicting ? `conflicting-${kind}` : `duplicate-${kind}`,
114
+ severity: "warning",
115
+ message: conflicting
116
+ ? `${probe.agent.label} received conflicting ${label}.`
117
+ : `${probe.agent.label} received duplicate ${label}.`,
118
+ agent: probe.agent.key,
119
+ evidence: {
120
+ count: values.length,
121
+ distinctValues: distinct.size,
122
+ values: [...distinct].join(" | "),
123
+ },
124
+ });
125
+ }
126
+ function checkRepeatedRobots(findings, targetUrl, probe) {
127
+ const audience = robotsAudienceForAgent(probe);
128
+ const relevantAudiences = audience === "robots" ? ["robots"] : ["robots", audience];
129
+ let conflictReported = false;
130
+ for (const currentAudience of relevantAudiences) {
131
+ const signals = probe.signals.robots.filter((signal) => signal.audience === currentAudience && normalizeRobots(signal.value).length > 0);
132
+ if (signals.length < 2)
133
+ continue;
134
+ const values = signals.map((signal) => normalizeRobots(signal.value));
135
+ const distinct = new Set(values);
136
+ const rawDirectives = new Set(values.flatMap((value) => value.split(",")));
137
+ if (rawDirectives.has("none")) {
138
+ rawDirectives.add("noindex");
139
+ rawDirectives.add("nofollow");
140
+ }
141
+ if (rawDirectives.has("all")) {
142
+ rawDirectives.add("index");
143
+ rawDirectives.add("follow");
144
+ }
145
+ const conflicting = ROBOTS_OPPOSITES.some(([left, right]) => rawDirectives.has(left) && rawDirectives.has(right));
146
+ if (conflicting)
147
+ conflictReported = true;
148
+ const code = conflicting
149
+ ? "conflicting-robots"
150
+ : distinct.size === 1
151
+ ? "duplicate-robots"
152
+ : "multiple-robots";
153
+ addFinding(findings, targetUrl, {
154
+ code,
155
+ severity: "warning",
156
+ message: conflicting
157
+ ? `${probe.agent.label} received contradictory ${currentAudience} directives.`
158
+ : `${probe.agent.label} received multiple ${currentAudience} meta directives.`,
159
+ agent: probe.agent.key,
160
+ evidence: {
161
+ audience: currentAudience,
162
+ count: values.length,
163
+ distinctValues: distinct.size,
164
+ values: [...distinct].join(" | "),
165
+ },
166
+ });
167
+ }
168
+ const effectiveSignals = effectiveRobotsSignals(probe);
169
+ const genericDirectives = new Set(probe.signals.robots
170
+ .filter((signal) => signal.audience === "robots")
171
+ .flatMap((signal) => normalizeRobots(signal.value).split(",")));
172
+ const specificAudience = robotsAudienceForAgent(probe);
173
+ const specificDirectives = new Set(specificAudience === "robots"
174
+ ? []
175
+ : probe.signals.robots
176
+ .filter((signal) => signal.audience === specificAudience)
177
+ .flatMap((signal) => normalizeRobots(signal.value).split(",")));
178
+ if (genericDirectives.has("none")) {
179
+ genericDirectives.add("noindex");
180
+ genericDirectives.add("nofollow");
181
+ }
182
+ if (specificDirectives.has("all")) {
183
+ specificDirectives.add("index");
184
+ specificDirectives.add("follow");
185
+ }
186
+ // A crawler-specific restriction can intentionally tighten a generic rule. The inverse cannot
187
+ // relax an already-applicable generic restriction and is therefore worth flagging.
188
+ const effectiveConflict = ROBOTS_OPPOSITES.some(([permissive, restrictive]) => genericDirectives.has(restrictive) && specificDirectives.has(permissive));
189
+ if (effectiveConflict && !conflictReported) {
190
+ addFinding(findings, targetUrl, {
191
+ code: "conflicting-robots",
192
+ severity: "warning",
193
+ message: `${probe.agent.label} received contradictory effective robots directives.`,
194
+ agent: probe.agent.key,
195
+ evidence: {
196
+ audience: "effective",
197
+ count: effectiveSignals.length,
198
+ distinctValues: new Set([...genericDirectives, ...specificDirectives]).size,
199
+ values: [...new Set([...genericDirectives, ...specificDirectives])].sort().join(","),
200
+ },
201
+ });
202
+ }
203
+ }
204
+ function criticalArrivalMs(target, probe) {
205
+ const marks = [];
206
+ const { expectations } = target;
207
+ if (expectations.requireTitle && normalizeText(probe.signals.title?.value ?? "").length > 0) {
208
+ marks.push(probe.signals.title?.atMs ?? 0);
209
+ }
210
+ if (expectations.requireDescription) {
211
+ const description = probe.signals.descriptions.find((signal) => normalizeText(signal.value).length > 0);
212
+ if (description !== undefined) {
213
+ marks.push(description.atMs);
214
+ }
215
+ }
216
+ if (expectations.requireCanonical) {
217
+ const canonical = probe.signals.canonicals.find((signal) => normalizeCanonical(signal.value, probe.finalUrl).length > 0);
218
+ if (canonical !== undefined) {
219
+ marks.push(canonical.atMs);
220
+ }
221
+ }
222
+ if (expectations.requireH1) {
223
+ const h1 = probe.signals.h1s.find((signal) => normalizeText(signal.value).length > 0);
224
+ if (h1 !== undefined) {
225
+ marks.push(h1.atMs);
226
+ }
227
+ }
228
+ if (expectations.requireMainText &&
229
+ normalizeText(probe.signals.firstMainText?.value ?? "").length > 0) {
230
+ marks.push(probe.signals.firstMainText?.atMs ?? 0);
231
+ }
232
+ return marks.length === 0 ? undefined : Math.max(...marks);
233
+ }
234
+ function checkRequiredSignals(findings, target, probe) {
235
+ // An interrupted or deliberately truncated stream cannot prove that an element is absent.
236
+ if (probe.completion !== "complete") {
237
+ return;
238
+ }
239
+ const { expectations } = target;
240
+ const agent = probe.agent.key;
241
+ if (expectations.requireTitle && normalizeText(probe.signals.title?.value ?? "").length === 0) {
242
+ addFinding(findings, target.url, {
243
+ code: "missing-title",
244
+ severity: "error",
245
+ message: `${probe.agent.label} received no non-empty title.`,
246
+ agent,
247
+ });
248
+ }
249
+ if (expectations.requireDescription &&
250
+ normalizedValues("description", probe.signals.descriptions, probe.finalUrl).length === 0) {
251
+ addFinding(findings, target.url, {
252
+ code: "missing-description",
253
+ severity: "warning",
254
+ message: `${probe.agent.label} received no non-empty meta description.`,
255
+ agent,
256
+ });
257
+ }
258
+ if (expectations.requireCanonical &&
259
+ normalizedValues("canonical", probe.signals.canonicals, probe.finalUrl).length === 0) {
260
+ addFinding(findings, target.url, {
261
+ code: "missing-canonical",
262
+ severity: "warning",
263
+ message: `${probe.agent.label} received no non-empty canonical link.`,
264
+ agent,
265
+ });
266
+ }
267
+ if (expectations.requireH1 &&
268
+ !probe.signals.h1s.some((signal) => normalizeText(signal.value).length > 0)) {
269
+ addFinding(findings, target.url, {
270
+ code: "missing-h1",
271
+ severity: "warning",
272
+ message: `${probe.agent.label} received no non-empty H1.`,
273
+ agent,
274
+ });
275
+ }
276
+ if (expectations.requireMainText &&
277
+ normalizeText(probe.signals.firstMainText?.value ?? "").length === 0) {
278
+ addFinding(findings, target.url, {
279
+ code: "missing-main-text",
280
+ severity: "warning",
281
+ message: `${probe.agent.label} received no main-content text.`,
282
+ agent,
283
+ });
284
+ }
285
+ }
286
+ function checkHeadRequirements(findings, targetUrl, probe) {
287
+ if (!probe.agent.requiresHeadMetadata) {
288
+ return;
289
+ }
290
+ const bodyFields = new Set();
291
+ const titles = probe.signals.titles ?? (probe.signals.title ? [probe.signals.title] : []);
292
+ if (titles.some((signal) => signal.location === "body")) {
293
+ bodyFields.add("title");
294
+ }
295
+ if (probe.signals.descriptions.some((signal) => signal.location === "body")) {
296
+ bodyFields.add("description");
297
+ }
298
+ if (probe.signals.canonicals.some((signal) => signal.location === "body")) {
299
+ bodyFields.add("canonical");
300
+ }
301
+ if (effectiveRobotsSignals(probe).some((signal) => signal.location === "body")) {
302
+ bodyFields.add("robots");
303
+ }
304
+ if (bodyFields.size === 0) {
305
+ return;
306
+ }
307
+ addFinding(findings, targetUrl, {
308
+ code: "head-metadata-in-body",
309
+ severity: "error",
310
+ message: `${probe.agent.label} requires head metadata but received ${[...bodyFields].join(", ")} in the body.`,
311
+ agent: probe.agent.key,
312
+ evidence: { fields: [...bodyFields].join(", ") },
313
+ });
314
+ }
315
+ function checkTimings(findings, target, probe) {
316
+ const { expectations } = target;
317
+ const firstByteMs = probe.timings.firstByteMs;
318
+ if (expectations.maxFirstByteMs !== undefined &&
319
+ firstByteMs !== undefined &&
320
+ firstByteMs > expectations.maxFirstByteMs) {
321
+ addFinding(findings, target.url, {
322
+ code: "slow-first-byte",
323
+ severity: "warning",
324
+ message: `${probe.agent.label} first byte arrived after the configured limit.`,
325
+ agent: probe.agent.key,
326
+ evidence: { observedMs: firstByteMs, limitMs: expectations.maxFirstByteMs },
327
+ });
328
+ }
329
+ const arrivalMs = criticalArrivalMs(target, probe);
330
+ if (expectations.maxCriticalMs !== undefined &&
331
+ arrivalMs !== undefined &&
332
+ arrivalMs > expectations.maxCriticalMs) {
333
+ addFinding(findings, target.url, {
334
+ code: "slow-critical-signals",
335
+ severity: "warning",
336
+ message: `${probe.agent.label} required signals arrived after the configured limit.`,
337
+ agent: probe.agent.key,
338
+ evidence: { observedMs: arrivalMs, limitMs: expectations.maxCriticalMs },
339
+ });
340
+ }
341
+ }
342
+ function agentValueSummary(probes, valueFor) {
343
+ return probes.map((probe) => `${probe.agent.key}=${valueFor(probe)}`).join("; ");
344
+ }
345
+ function checkAgentDrift(findings, targetUrl, probes) {
346
+ const complete = probes.filter((probe) => probe.completion === "complete");
347
+ if (complete.length < 2) {
348
+ return;
349
+ }
350
+ const comparisons = [
351
+ { field: "status", valueFor: (probe) => String(probe.status ?? "missing") },
352
+ { field: "final-url", valueFor: (probe) => normalizeFinalUrl(probe.finalUrl) },
353
+ {
354
+ field: "title",
355
+ valueFor: (probe) => normalizeText(probe.signals.title?.value ?? "<missing>"),
356
+ },
357
+ {
358
+ field: "canonical",
359
+ valueFor: (probe) => [...new Set(normalizedValues("canonical", probe.signals.canonicals, probe.finalUrl))]
360
+ .sort()
361
+ .join(" | ") || "<missing>",
362
+ },
363
+ {
364
+ field: "robots",
365
+ valueFor: effectiveRobotsValue,
366
+ },
367
+ ];
368
+ for (const comparison of comparisons) {
369
+ const values = complete.map(comparison.valueFor);
370
+ if (new Set(values).size < 2) {
371
+ continue;
372
+ }
373
+ addFinding(findings, targetUrl, {
374
+ code: `agent-${comparison.field}-drift`,
375
+ severity: "warning",
376
+ message: `Crawler profiles received different ${comparison.field.replace("-", " ")} values.`,
377
+ evidence: { values: agentValueSummary(complete, comparison.valueFor) },
378
+ });
379
+ }
380
+ }
381
+ export function analyzeTarget(target, probes) {
382
+ const findings = [];
383
+ for (const probe of probes) {
384
+ // A status retained from the previous redirect is not evidence that a final response arrived.
385
+ const hasFinalResponse = probe.status !== undefined && !REDIRECT_STATUSES.has(probe.status);
386
+ if (probe.completion !== "complete") {
387
+ addFinding(findings, target.url, {
388
+ code: "incomplete-probe",
389
+ severity: "error",
390
+ message: `${probe.agent.label} probe did not complete (${probe.completion}).`,
391
+ agent: probe.agent.key,
392
+ evidence: {
393
+ completion: probe.completion,
394
+ bytesRead: probe.bytesRead,
395
+ ...(probe.error === undefined ? {} : { error: probe.error }),
396
+ },
397
+ });
398
+ }
399
+ if (probe.status !== undefined &&
400
+ !REDIRECT_STATUSES.has(probe.status) &&
401
+ !target.expectations.statuses.includes(probe.status)) {
402
+ addFinding(findings, target.url, {
403
+ code: "status-mismatch",
404
+ severity: "error",
405
+ message: `${probe.agent.label} returned unexpected HTTP status ${probe.status}.`,
406
+ agent: probe.agent.key,
407
+ evidence: {
408
+ actual: probe.status,
409
+ expected: target.expectations.statuses.join(", "),
410
+ },
411
+ });
412
+ }
413
+ if (hasFinalResponse &&
414
+ target.expectations.finalUrl !== undefined &&
415
+ normalizeFinalUrl(probe.finalUrl) !== normalizeFinalUrl(target.expectations.finalUrl)) {
416
+ addFinding(findings, target.url, {
417
+ code: "final-url-mismatch",
418
+ severity: "error",
419
+ message: `${probe.agent.label} finished at an unexpected URL.`,
420
+ agent: probe.agent.key,
421
+ evidence: {
422
+ actual: probe.finalUrl,
423
+ expected: target.expectations.finalUrl,
424
+ },
425
+ });
426
+ }
427
+ checkRequiredSignals(findings, target, probe);
428
+ checkRepeatedMetadata(findings, target.url, probe, "title", probe.signals.titles ?? (probe.signals.title ? [probe.signals.title] : []));
429
+ checkRepeatedMetadata(findings, target.url, probe, "description", probe.signals.descriptions);
430
+ checkRepeatedMetadata(findings, target.url, probe, "canonical", probe.signals.canonicals);
431
+ checkRepeatedRobots(findings, target.url, probe);
432
+ const invalidJsonLd = probe.signals.jsonLd.filter((signal) => signal.valid === false);
433
+ if (probe.completion === "complete" && invalidJsonLd.length > 0) {
434
+ addFinding(findings, target.url, {
435
+ code: "invalid-json-ld",
436
+ severity: "warning",
437
+ message: `${probe.agent.label} received invalid JSON-LD.`,
438
+ agent: probe.agent.key,
439
+ evidence: {
440
+ invalidBlocks: invalidJsonLd.length,
441
+ errors: invalidJsonLd.map((signal) => signal.error ?? "invalid JSON").join(" | "),
442
+ },
443
+ });
444
+ }
445
+ const limitedJsonLd = probe.signals.jsonLd.filter((signal) => signal.valid === undefined && signal.analysisLimit !== undefined);
446
+ if (limitedJsonLd.length > 0) {
447
+ addFinding(findings, target.url, {
448
+ code: "json-ld-analysis-limit",
449
+ severity: "warning",
450
+ message: `${probe.agent.label} exceeded an SSRWire JSON-LD analysis limit.`,
451
+ agent: probe.agent.key,
452
+ evidence: {
453
+ blocks: limitedJsonLd.length,
454
+ reasons: limitedJsonLd.map((signal) => signal.analysisLimit).join(" | "),
455
+ },
456
+ });
457
+ }
458
+ checkHeadRequirements(findings, target.url, probe);
459
+ checkTimings(findings, target, probe);
460
+ }
461
+ checkAgentDrift(findings, target.url, probes);
462
+ return findings;
463
+ }
464
+ export function summarizeAudit(results) {
465
+ let errors = 0;
466
+ let warnings = 0;
467
+ let info = 0;
468
+ let probes = 0;
469
+ let incomplete = 0;
470
+ for (const result of results) {
471
+ probes += result.probes.length;
472
+ incomplete += result.probes.filter((probe) => probe.completion !== "complete").length;
473
+ for (const finding of result.findings) {
474
+ if (finding.severity === "error") {
475
+ errors += 1;
476
+ }
477
+ else if (finding.severity === "warning") {
478
+ warnings += 1;
479
+ }
480
+ else {
481
+ info += 1;
482
+ }
483
+ }
484
+ }
485
+ return {
486
+ targets: results.length,
487
+ probes,
488
+ errors,
489
+ warnings,
490
+ info,
491
+ incomplete,
492
+ };
493
+ }
494
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AuditResult, SsrWireConfig } from "./types.js";
2
+ export declare function runAudit(config: SsrWireConfig): Promise<AuditResult>;
3
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAgB,aAAa,EAAqB,MAAM,YAAY,CAAC;AAoC9F,wBAAsB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAiD1E"}