@qualitykit/engine 0.0.0-stage → 0.3.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.
@@ -0,0 +1,20 @@
1
+ import { summarizeFindings, type Finding, type RouteInventoryItem } from "./finding.js";
2
+ import type { SiteModel } from "./site.js";
3
+ import type { RenderedPage } from "./fetch-html.js";
4
+ export interface EngineAuditResult {
5
+ site: Omit<SiteModel, "files">;
6
+ routeInventory: RouteInventoryItem[];
7
+ findings: Finding[];
8
+ summary: ReturnType<typeof summarizeFindings>;
9
+ rendered?: {
10
+ fetched: boolean;
11
+ pages: Array<{
12
+ url: string;
13
+ ok: boolean;
14
+ error?: string;
15
+ }>;
16
+ };
17
+ }
18
+ export declare function buildAuditFindings(site: SiteModel, renderedPages?: RenderedPage[]): Finding[];
19
+ export declare function runAuditEngine(site: SiteModel, renderedPages?: RenderedPage[]): EngineAuditResult;
20
+ //# sourceMappingURL=audit-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-engine.d.ts","sourceRoot":"","sources":["../src/audit-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,iBAAiB,EACjB,KAAK,OAAO,EACZ,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/B,cAAc,EAAE,kBAAkB,EAAE,CAAC;IACrC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,OAAO,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC5D,CAAC;CACH;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,aAAa,GAAE,YAAY,EAAO,GACjC,OAAO,EAAE,CAyaX;AA8ED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,EACf,aAAa,GAAE,YAAY,EAAO,GACjC,iBAAiB,CAgBnB"}
@@ -0,0 +1,471 @@
1
+ import { buildRouteInventory, sortFindings, summarizeFindings, } from "./finding.js";
2
+ import { stripFiles } from "./site.js";
3
+ export function buildAuditFindings(site, renderedPages = []) {
4
+ const findings = [];
5
+ const pageRoutes = site.routes.filter((r) => r.kind === "page");
6
+ const staticPages = pageRoutes.filter((r) => !r.path.includes(":"));
7
+ if (site.framework === "generic") {
8
+ const staticHtml = site.router === "static-html" || site.routes.length > 0;
9
+ findings.push({
10
+ id: "unsupported-framework",
11
+ kind: "opportunity",
12
+ category: "technical-seo",
13
+ severity: "info",
14
+ title: staticHtml
15
+ ? "Static HTML site — limited deep App Router analysis"
16
+ : "Unsupported framework for deep audit",
17
+ whyItMatters: site.unsupportedReason ??
18
+ "Only Next.js receives full technical SEO analysis in this release.",
19
+ evidence: staticHtml
20
+ ? [`routes=${site.routes.length}`, `router=${site.router ?? "unknown"}`]
21
+ : [],
22
+ suggestedFix: staticHtml
23
+ ? "Use public/robots.txt + public/sitemap.xml + JSON-LD in HTML. For blog scaffolding, use a Next.js App Router project."
24
+ : "Point QualityKit at a Next.js App Router project.",
25
+ expectedImpact: "low",
26
+ confidence: "high",
27
+ effort: staticHtml ? "low" : "high",
28
+ fixSafety: "manual",
29
+ verification: staticHtml
30
+ ? "robots.txt and sitemap.xml present; routes inventoried"
31
+ : "codebase.analyze reports framework=nextjs",
32
+ });
33
+ }
34
+ if (site.robots.blocksAll) {
35
+ findings.push({
36
+ id: "robots-blocks-all",
37
+ kind: "defect",
38
+ category: "technical-seo",
39
+ severity: "critical",
40
+ title: "Robots disallows all paths",
41
+ whyItMatters: "User-agent * Disallow: / prevents search and AI crawlers from indexing the site.",
42
+ evidence: [site.robots.file ?? "robots", "Disallow: / detected"],
43
+ suggestedFix: "If this is production, replace Disallow: / with Allow: /. Confirm staging intent first.",
44
+ expectedImpact: "high",
45
+ confidence: "high",
46
+ effort: "low",
47
+ fixSafety: "approval",
48
+ verification: "robots no longer blocks all paths",
49
+ relatedIds: ["tech-robots-blocks-all"],
50
+ });
51
+ }
52
+ else if (!site.robots.present) {
53
+ const staticHtml = site.router === "static-html";
54
+ findings.push({
55
+ id: "missing-robots",
56
+ kind: "opportunity",
57
+ category: "technical-seo",
58
+ severity: "info",
59
+ title: staticHtml
60
+ ? "No robots.txt"
61
+ : "No explicit robots.ts / robots.txt",
62
+ whyItMatters: staticHtml
63
+ ? "An explicit robots.txt publishes crawl policy and a sitemap URL for static hosts."
64
+ : "Next.js defaults to allowing crawlers. An explicit robots file is useful to publish a sitemap URL and document AI crawler policy — not automatically a crawl failure.",
65
+ evidence: ["No robots.ts or robots.txt found"],
66
+ suggestedFix: staticHtml
67
+ ? "Add public/robots.txt allowing / and pointing at /sitemap.xml."
68
+ : "Add app/robots.ts allowing / and pointing at /sitemap.xml when you want an explicit policy.",
69
+ expectedImpact: "medium",
70
+ confidence: "high",
71
+ effort: "low",
72
+ fixSafety: "auto",
73
+ verification: "robots file present and does not block all paths",
74
+ relatedIds: ["tech-robots"],
75
+ });
76
+ }
77
+ for (const crawler of site.robots.aiCrawlers) {
78
+ if (crawler.status === "disallowed") {
79
+ findings.push({
80
+ id: `ai-crawler-${crawler.name}`,
81
+ kind: "defect",
82
+ category: "ai",
83
+ severity: "medium",
84
+ title: `${crawler.name} is disallowed`,
85
+ whyItMatters: "Blocking this crawler may reduce AI search discoverability. Policy should be an explicit product decision.",
86
+ evidence: [crawler.evidence ?? "disallowed", site.robots.file ?? "robots"],
87
+ suggestedFix: "Ask the site owner before changing. Only remove Disallow if AI crawling is desired.",
88
+ expectedImpact: "medium",
89
+ confidence: "high",
90
+ effort: "low",
91
+ fixSafety: "approval",
92
+ verification: `${crawler.name} is allowed or intentionally documented as blocked`,
93
+ relatedIds: ["tech-ai-crawlers"],
94
+ });
95
+ }
96
+ }
97
+ if (!site.sitemap.present) {
98
+ const multiPage = staticPages.length >= 2;
99
+ findings.push({
100
+ id: "missing-sitemap",
101
+ kind: multiPage ? "defect" : "opportunity",
102
+ category: "technical-seo",
103
+ severity: multiPage ? "medium" : "info",
104
+ title: "Missing sitemap",
105
+ whyItMatters: multiPage
106
+ ? "Multiple indexable routes without a sitemap can slow discovery of non-linked pages."
107
+ : "A sitemap helps discovery as the site grows; a single discoverable homepage is less urgent.",
108
+ evidence: [
109
+ `staticPages=${staticPages.length}`,
110
+ ...staticPages.map((p) => p.path),
111
+ ],
112
+ suggestedFix: site.router === "static-html"
113
+ ? "Add public/sitemap.xml covering static indexable HTML routes."
114
+ : "Add app/sitemap.ts covering static indexable routes (and blog posts when present).",
115
+ expectedImpact: multiPage ? "medium" : "low",
116
+ confidence: "high",
117
+ effort: "low",
118
+ fixSafety: "auto",
119
+ verification: "sitemap present and lists key routes",
120
+ relatedIds: ["tech-sitemap"],
121
+ });
122
+ }
123
+ if (!site.metadata.hasMetadataBase && site.router === "app") {
124
+ findings.push({
125
+ id: "missing-metadatabase",
126
+ kind: "defect",
127
+ category: "metadata",
128
+ severity: "medium",
129
+ title: "metadataBase not set",
130
+ whyItMatters: "Without metadataBase, App Router absolute Open Graph and canonical URLs can resolve incorrectly.",
131
+ evidence: site.metadata.layoutFile
132
+ ? [site.metadata.layoutFile]
133
+ : ["No metadataBase detected"],
134
+ suggestedFix: `Set metadataBase: new URL("${site.siteUrl ?? "https://example.com"}") on the root layout metadata export.`,
135
+ expectedImpact: "medium",
136
+ confidence: "high",
137
+ effort: "low",
138
+ fixSafety: "auto",
139
+ verification: "Root layout exports metadataBase",
140
+ relatedIds: ["tech-metadatabase", "missing-home-canonical"],
141
+ rootCauseId: "missing-metadatabase",
142
+ });
143
+ }
144
+ if (!site.metadata.hasRootTitle && site.router === "app") {
145
+ findings.push({
146
+ id: "missing-root-title",
147
+ kind: "defect",
148
+ category: "metadata",
149
+ severity: "medium",
150
+ title: "Root title missing",
151
+ whyItMatters: "Search results and browser tabs lack a clear brand/title default.",
152
+ evidence: site.metadata.layoutFile ? [site.metadata.layoutFile] : [],
153
+ suggestedFix: "Export a default title (and optional template) from the root layout.",
154
+ expectedImpact: "medium",
155
+ confidence: "high",
156
+ effort: "low",
157
+ fixSafety: "auto",
158
+ verification: "Root metadata includes title",
159
+ });
160
+ }
161
+ if (!site.metadata.hasRootDescription && site.router === "app") {
162
+ findings.push({
163
+ id: "missing-root-description",
164
+ kind: "defect",
165
+ category: "metadata",
166
+ severity: "medium",
167
+ title: "Root description missing",
168
+ whyItMatters: "A missing meta description weakens SERP snippets and entity clarity for the homepage.",
169
+ evidence: site.metadata.layoutFile ? [site.metadata.layoutFile] : [],
170
+ suggestedFix: "Add a concise business-focused description to root metadata.",
171
+ expectedImpact: "medium",
172
+ confidence: "high",
173
+ effort: "low",
174
+ fixSafety: "auto",
175
+ verification: "Root metadata includes description",
176
+ relatedIds: ["tech-root-description"],
177
+ });
178
+ }
179
+ if (site.framework === "nextjs" &&
180
+ !site.metadata.hasTitleTemplate &&
181
+ site.metadata.hasRootTitle) {
182
+ findings.push({
183
+ id: "missing-title-template",
184
+ kind: "opportunity",
185
+ category: "metadata",
186
+ severity: "info",
187
+ title: "Title template not set",
188
+ whyItMatters: "A %s | Brand template keeps titles consistent; check rendered titles before treating this as urgent.",
189
+ evidence: site.metadata.layoutFile ? [site.metadata.layoutFile] : [],
190
+ suggestedFix: `Use title: { default: "...", template: "%s | Brand" } on the root layout.`,
191
+ expectedImpact: "low",
192
+ confidence: "medium",
193
+ effort: "low",
194
+ fixSafety: "auto",
195
+ verification: "Title template present in root metadata",
196
+ relatedIds: ["tech-title-template"],
197
+ });
198
+ }
199
+ const home = pageRoutes.find((r) => r.path === "/");
200
+ const layoutHasCanonical = Boolean(site.metadata.layoutFile) &&
201
+ site.routes.some((r) => r.file === site.metadata.layoutFile && r.hasCanonical);
202
+ // Prefer reading layout file content via site.files
203
+ const layoutFile = site.files.find((f) => f.path === site.metadata.layoutFile);
204
+ const layoutCanonical = layoutHasCanonical ||
205
+ (layoutFile
206
+ ? /alternates\s*:[\s\S]*canonical|canonical\s*:/.test(layoutFile.content)
207
+ : false);
208
+ if (home && !home.hasCanonical && !layoutCanonical) {
209
+ const duplicateRisk = !site.metadata.hasMetadataBase;
210
+ findings.push({
211
+ id: "missing-home-canonical",
212
+ kind: duplicateRisk ? "defect" : "opportunity",
213
+ category: "metadata",
214
+ severity: duplicateRisk ? "medium" : "info",
215
+ title: "Homepage canonical not explicit",
216
+ whyItMatters: duplicateRisk
217
+ ? "No metadataBase and no explicit homepage canonical increases duplicate-URL ambiguity for absolute metadata."
218
+ : "An explicit homepage canonical is helpful when query params or mirrors exist; confirm intended production URL first.",
219
+ evidence: [home.file, ...(site.metadata.layoutFile ? [site.metadata.layoutFile] : [])],
220
+ suggestedFix: "Add alternates.canonical for / after confirming the production origin.",
221
+ expectedImpact: "medium",
222
+ confidence: duplicateRisk ? "medium" : "low",
223
+ effort: "low",
224
+ fixSafety: "approval",
225
+ verification: "Homepage or root layout declares canonical /",
226
+ relatedIds: ["tech-canonical-home"],
227
+ rootCauseId: duplicateRisk ? "missing-metadatabase" : undefined,
228
+ });
229
+ }
230
+ for (const route of pageRoutes) {
231
+ if (route.h1Count === 0) {
232
+ findings.push({
233
+ id: `heading-clarity-${route.path}`,
234
+ kind: "opportunity",
235
+ category: "content",
236
+ severity: "info",
237
+ title: `No clear H1 detected on ${route.path}`,
238
+ whyItMatters: "A clear primary heading helps humans and answer engines understand the page topic. Exact H1 count is not a ranking rule.",
239
+ evidence: [route.file, `h1Count=${route.h1Count}`],
240
+ suggestedFix: "Ensure the main topic is expressed in a prominent heading.",
241
+ expectedImpact: "low",
242
+ confidence: "medium",
243
+ effort: "low",
244
+ fixSafety: "manual",
245
+ verification: "Rendered page has a clear primary heading",
246
+ });
247
+ }
248
+ else if (route.h1Count > 1) {
249
+ findings.push({
250
+ id: `heading-clarity-multi-${route.path}`,
251
+ kind: "opportunity",
252
+ category: "content",
253
+ severity: "info",
254
+ title: `Multiple H1-like headings on ${route.path}`,
255
+ whyItMatters: "Several top-level headings can dilute the primary topic. Prefer clear hierarchy over a rigid single-H1 rule.",
256
+ evidence: [route.file, `h1Count=${route.h1Count}`, ...route.headings.slice(0, 5)],
257
+ suggestedFix: "Keep one primary topic heading; demote decorative headings.",
258
+ expectedImpact: "low",
259
+ confidence: "medium",
260
+ effort: "medium",
261
+ fixSafety: "manual",
262
+ verification: "Heading hierarchy is clear on the rendered page",
263
+ relatedIds: ["tech-multi-h1"],
264
+ });
265
+ }
266
+ if (route.imagesMissingAlt > 0) {
267
+ findings.push({
268
+ id: `alt-${route.path}`,
269
+ kind: "defect",
270
+ category: "content",
271
+ severity: "low",
272
+ title: `Informative images may be missing alt on ${route.path}`,
273
+ whyItMatters: "Missing alt harms accessibility and reduces image understanding for crawlers when the image conveys meaning.",
274
+ evidence: [route.file, `imagesMissingAlt≈${route.imagesMissingAlt}`],
275
+ suggestedFix: "Add meaningful alt text for informative images; use empty alt only for decorative images.",
276
+ expectedImpact: "low",
277
+ confidence: "medium",
278
+ effort: "medium",
279
+ fixSafety: "manual",
280
+ verification: "Informative images have descriptive alt attributes",
281
+ relatedIds: ["tech-image-alt"],
282
+ });
283
+ }
284
+ }
285
+ if (!site.blog.present && site.framework === "nextjs") {
286
+ findings.push({
287
+ id: "no-blog",
288
+ kind: "opportunity",
289
+ category: "content",
290
+ severity: "info",
291
+ title: "No blog architecture detected",
292
+ whyItMatters: "A blog can help answer buyer questions and build topical coverage — only if content quality is high. Not a defect.",
293
+ evidence: [`business=${site.business.name ?? "unknown"}`],
294
+ suggestedFix: "If justified, use qualitykit.plan / blog.scaffold for App Router MDX architecture (approval required).",
295
+ expectedImpact: "high",
296
+ confidence: "medium",
297
+ effort: "high",
298
+ fixSafety: "approval",
299
+ verification: "Blog routes exist with at least one verified article",
300
+ relatedIds: ["blog-scaffold-mdx"],
301
+ });
302
+ }
303
+ if (site.structuredData.types.length === 0) {
304
+ findings.push({
305
+ id: "no-jsonld",
306
+ kind: "opportunity",
307
+ category: "schema",
308
+ severity: "info",
309
+ title: "No structured data detected",
310
+ whyItMatters: "Valid Organization/WebSite (and BlogPosting on articles) can improve machine understanding. Schema does not guarantee AI citations.",
311
+ evidence: [],
312
+ suggestedFix: "Add JSON-LD that mirrors visible brand/content via schema.plan — not sitewide FAQ spam.",
313
+ expectedImpact: "medium",
314
+ confidence: "medium",
315
+ effort: "medium",
316
+ fixSafety: "approval",
317
+ verification: "JSON-LD parses and @type matches visible content",
318
+ relatedIds: ["schema-organization", "schema-blogposting"],
319
+ });
320
+ }
321
+ // Orphan-ish pages: pages with no inbound internal links from other pages
322
+ const inbound = new Set();
323
+ for (const r of pageRoutes) {
324
+ for (const href of r.internalLinks)
325
+ inbound.add(href);
326
+ }
327
+ for (const r of pageRoutes) {
328
+ if (r.path === "/")
329
+ continue;
330
+ if (!inbound.has(r.path) && !r.path.includes(":")) {
331
+ findings.push({
332
+ id: `orphan-${r.path}`,
333
+ kind: "opportunity",
334
+ category: "links",
335
+ severity: "info",
336
+ title: `Possible orphan page ${r.path}`,
337
+ whyItMatters: "No inbound internal links were detected from other scanned pages; the page may be hard to discover.",
338
+ evidence: [r.file, "No inbound links in scanned page sources"],
339
+ suggestedFix: "Add a contextual internal link from a related page.",
340
+ expectedImpact: "medium",
341
+ confidence: "low",
342
+ effort: "low",
343
+ fixSafety: "manual",
344
+ verification: "At least one relevant page links to this route",
345
+ });
346
+ }
347
+ }
348
+ if (site.router === "pages") {
349
+ findings.push({
350
+ id: "pages-router",
351
+ kind: "opportunity",
352
+ category: "technical-seo",
353
+ severity: "info",
354
+ title: "Pages Router detected",
355
+ whyItMatters: "Audit depth is limited versus App Router. Blog scaffolding requires App Router in this release.",
356
+ evidence: [],
357
+ suggestedFix: "Use App Router for new SEO features, or apply Pages-specific metadata manually.",
358
+ expectedImpact: "low",
359
+ confidence: "high",
360
+ effort: "high",
361
+ fixSafety: "manual",
362
+ verification: "N/A",
363
+ });
364
+ }
365
+ // Optional llms.txt / FAQ schema notes — assessed, never required
366
+ const hasLlms = site.files.some((f) => f.path === "public/llms.txt" || f.path === "llms.txt");
367
+ if (!hasLlms) {
368
+ findings.push({
369
+ id: "llms-txt-optional",
370
+ kind: "opportunity",
371
+ category: "ai",
372
+ severity: "info",
373
+ title: "No llms.txt (optional)",
374
+ whyItMatters: "llms.txt is optional documentation for AI agents. It is not a ranking requirement and does not guarantee citations.",
375
+ evidence: ["llms.txt not found"],
376
+ suggestedFix: "Only add if you want a human-maintained AI-oriented site summary — never as a trick.",
377
+ expectedImpact: "low",
378
+ confidence: "low",
379
+ effort: "low",
380
+ fixSafety: "manual",
381
+ verification: "N/A — optional artifact",
382
+ });
383
+ }
384
+ findings.push(...findingsFromRendered(site, renderedPages));
385
+ return sortFindings(findings);
386
+ }
387
+ function findingsFromRendered(site, pages) {
388
+ const out = [];
389
+ for (const page of pages) {
390
+ if (!page.ok || !page.html)
391
+ continue;
392
+ if (site.metadata.rootTitle && page.title) {
393
+ // soft mismatch check
394
+ const root = site.metadata.rootTitle.toLowerCase();
395
+ if (!page.title.toLowerCase().includes(root.split("|")[0].trim().slice(0, 12))) {
396
+ out.push({
397
+ id: `rendered-title-mismatch-${page.path}`,
398
+ kind: "opportunity",
399
+ category: "metadata",
400
+ severity: "info",
401
+ title: `Rendered title may diverge on ${page.path}`,
402
+ whyItMatters: "Source metadata and live HTML titles should stay consistent for entity clarity.",
403
+ evidence: [
404
+ `sourceTitle≈${site.metadata.rootTitle}`,
405
+ `renderedTitle=${page.title}`,
406
+ page.url,
407
+ ],
408
+ suggestedFix: "Align generateMetadata/title exports with the intended rendered title.",
409
+ expectedImpact: "low",
410
+ confidence: "low",
411
+ effort: "medium",
412
+ fixSafety: "manual",
413
+ verification: "Live title matches intended brand/page title",
414
+ });
415
+ }
416
+ }
417
+ if (!page.canonical && page.path === "/") {
418
+ out.push({
419
+ id: `rendered-missing-canonical-${page.path}`,
420
+ kind: "opportunity",
421
+ category: "metadata",
422
+ severity: "info",
423
+ title: "Rendered homepage has no canonical link",
424
+ whyItMatters: "Confirm on the live page before treating source-only canonical plans as complete.",
425
+ evidence: [page.url],
426
+ suggestedFix: "Ensure metadata alternates.canonical appears in rendered HTML.",
427
+ expectedImpact: "medium",
428
+ confidence: "medium",
429
+ effort: "low",
430
+ fixSafety: "manual",
431
+ verification: "link[rel=canonical] present on live homepage",
432
+ });
433
+ }
434
+ if (page.jsonLd.length === 0 && site.structuredData.types.length > 0) {
435
+ out.push({
436
+ id: `rendered-jsonld-missing-${page.path}`,
437
+ kind: "defect",
438
+ category: "schema",
439
+ severity: "medium",
440
+ title: `Structured data in source but not in rendered HTML (${page.path})`,
441
+ whyItMatters: "Crawlers and AI systems see rendered output; source-only schema does not help.",
442
+ evidence: [page.url, ...site.structuredData.types],
443
+ suggestedFix: "Ensure JSON-LD is emitted in the document body for this route.",
444
+ expectedImpact: "medium",
445
+ confidence: "high",
446
+ effort: "medium",
447
+ fixSafety: "manual",
448
+ verification: "application/ld+json present in rendered HTML",
449
+ });
450
+ }
451
+ }
452
+ return out;
453
+ }
454
+ export function runAuditEngine(site, renderedPages = []) {
455
+ const findings = buildAuditFindings(site, renderedPages);
456
+ return {
457
+ site: stripFiles(site),
458
+ routeInventory: buildRouteInventory(site.routes),
459
+ findings,
460
+ summary: summarizeFindings(findings),
461
+ rendered: {
462
+ fetched: renderedPages.length > 0,
463
+ pages: renderedPages.map((p) => ({
464
+ url: p.url,
465
+ ok: p.ok,
466
+ error: p.error,
467
+ })),
468
+ },
469
+ };
470
+ }
471
+ //# sourceMappingURL=audit-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-engine.js","sourceRoot":"","sources":["../src/audit-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface RenderedPage {
2
+ url: string;
3
+ path: string;
4
+ ok: boolean;
5
+ status?: number;
6
+ error?: string;
7
+ html?: string;
8
+ title?: string;
9
+ description?: string;
10
+ canonical?: string;
11
+ ogTitle?: string;
12
+ ogDescription?: string;
13
+ robotsMeta?: string;
14
+ headings: string[];
15
+ h1: string[];
16
+ jsonLd: unknown[];
17
+ }
18
+ export interface FetchHtmlOptions {
19
+ timeoutMs?: number;
20
+ maxBytes?: number;
21
+ paths?: string[];
22
+ /** Injected for tests */
23
+ fetchImpl?: typeof fetch;
24
+ }
25
+ export declare function parseHtmlSignals(html: string): Omit<RenderedPage, "url" | "path" | "ok" | "status" | "error" | "html">;
26
+ export declare function fetchRenderedPages(siteUrl: string, options?: FetchHtmlOptions): Promise<RenderedPage[]>;
27
+ //# sourceMappingURL=fetch-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-html.d.ts","sourceRoot":"","sources":["../src/fetch-html.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,yBAAyB;IACzB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAClD,YAAY,EACZ,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CACpD,CAkEA;AAgBD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CAkEzB"}