open-local-audit 0.1.1 → 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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,22 @@ All notable changes to Open Local Audit will be documented here.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## v0.3.0 - 2026-05-09
8
+
9
+ - Added standalone HTML report rendering.
10
+ - Added `--format html`.
11
+ - Expanded `--format all` to write JSON, Markdown, and HTML reports.
12
+ - Added `--input <path>` for batch audits from text files.
13
+ - Added safe per-site output folders for batch reports.
14
+
15
+ ## v0.2.0 - 2026-05-08
16
+
17
+ - Added optional same-origin internal link scanning with `--check-links` and `--max-pages`.
18
+ - Added a high-severity finding for broken internal links.
19
+ - Added `--fail-on none|high|medium|low` for CI-friendly exit codes.
20
+ - Added compact terminal summaries when reports are written to files.
21
+ - Added integration tests for link scanning and CLI behavior helpers.
22
+
7
23
  ## v0.1.1 - 2026-05-08
8
24
 
9
25
  - Added `robots.txt`, `sitemap.xml`, Open Graph, and invalid JSON-LD checks.
package/README.md CHANGED
@@ -4,7 +4,7 @@ Open Local Audit is an open-source website and local presence auditor for small
4
4
 
5
5
  ## Current stage
6
6
 
7
- Initial published CLI. The project can run a single URL audit and produce JSON, Markdown, or both report formats.
7
+ Published CLI. The project can run a single URL audit or batch URL list, optionally check same-origin links, and produce JSON, Markdown, HTML, or all report formats.
8
8
 
9
9
  ## Business purpose
10
10
 
@@ -78,15 +78,38 @@ Write both report formats to a directory:
78
78
  open-local-audit https://example.com --format all --out-dir reports
79
79
  ```
80
80
 
81
+ Write an HTML report:
82
+
83
+ ```bash
84
+ open-local-audit https://example.com --format html --out report.html
85
+ ```
86
+
87
+ Run a batch audit from a text file:
88
+
89
+ ```bash
90
+ open-local-audit --input sites.txt --format all --out-dir reports
91
+ ```
92
+
93
+ Check same-origin links and fail CI when high-severity issues are found:
94
+
95
+ ```bash
96
+ open-local-audit https://example.com --check-links --max-pages 10 --fail-on high --format all --out-dir reports
97
+ ```
98
+
81
99
  ## First implementation milestone
82
100
 
83
101
  The first implementation milestone is a CLI that accepts one URL and outputs:
84
102
 
85
103
  - JSON report.
86
104
  - Markdown report.
87
- - Combined JSON and Markdown report output with `--format all --out-dir`.
105
+ - HTML report.
106
+ - Combined JSON, Markdown, and HTML report output with `--format all --out-dir`.
107
+ - Batch input files with per-site report folders.
88
108
  - Score summary.
89
109
  - Evidence table.
110
+ - Optional same-origin link checks.
111
+ - Terminal summary when reports are written to files.
112
+ - CI-friendly exit codes with `--fail-on`.
90
113
  - Clear owner-readable recommendations.
91
114
 
92
115
  Example target command:
package/dist/audit.js CHANGED
@@ -1,7 +1,10 @@
1
1
  import { runRules } from "./rules.js";
2
+ import { load } from "cheerio";
2
3
  const defaultOptions = {
3
4
  timeoutMs: 10000,
4
- maxRedirects: 5
5
+ maxRedirects: 5,
6
+ checkLinks: false,
7
+ maxPages: 10
5
8
  };
6
9
  const categories = [
7
10
  "technical-health",
@@ -68,6 +71,32 @@ async function fetchResource(url, options) {
68
71
  };
69
72
  }
70
73
  }
74
+ function collectInternalLinks(snapshot, maxPages) {
75
+ const $ = load(snapshot.html);
76
+ const origin = new URL(snapshot.finalUrl).origin;
77
+ const seen = new Set();
78
+ for (const element of $("a").toArray()) {
79
+ const href = $(element).attr("href")?.trim();
80
+ if (!href || /^(mailto|tel|javascript):/i.test(href)) {
81
+ continue;
82
+ }
83
+ try {
84
+ const url = new URL(href, snapshot.finalUrl);
85
+ url.hash = "";
86
+ if (url.origin !== origin) {
87
+ continue;
88
+ }
89
+ seen.add(url.toString());
90
+ }
91
+ catch {
92
+ continue;
93
+ }
94
+ if (seen.size >= maxPages) {
95
+ break;
96
+ }
97
+ }
98
+ return Array.from(seen);
99
+ }
71
100
  function summarize(reportFindings) {
72
101
  return {
73
102
  totalFindings: reportFindings.length,
@@ -147,6 +176,9 @@ export async function auditUrl(url, options = {}) {
147
176
  robotsTxt: await fetchResource(new URL("/robots.txt", origin).toString(), effectiveOptions),
148
177
  sitemapXml: await fetchResource(new URL("/sitemap.xml", origin).toString(), effectiveOptions)
149
178
  };
179
+ if (effectiveOptions.checkLinks) {
180
+ snapshot.internalLinks = await Promise.all(collectInternalLinks(snapshot, effectiveOptions.maxPages).map((link) => fetchResource(link, effectiveOptions)));
181
+ }
150
182
  return auditSnapshot(snapshot);
151
183
  }
152
184
  //# sourceMappingURL=audit.js.map
package/dist/audit.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type OutputFormat, type ReportOutput } from "./output.js";
2
+ import type { AuditReport } from "./types.js";
3
+ export interface BatchReportOptions {
4
+ format: OutputFormat;
5
+ outDir: string;
6
+ pretty?: boolean;
7
+ audit?: (url: string) => Promise<AuditReport>;
8
+ }
9
+ export interface BatchReportResult {
10
+ url: string;
11
+ slug: string;
12
+ report: AuditReport;
13
+ outputs: ReportOutput[];
14
+ }
15
+ export declare function readInputUrls(path: string): Promise<string[]>;
16
+ export declare function safeReportSlug(rawUrl: string): string;
17
+ export declare function runBatchReports(urls: string[], options: BatchReportOptions): Promise<BatchReportResult[]>;
package/dist/batch.js ADDED
@@ -0,0 +1,51 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { auditUrl } from "./audit.js";
4
+ import { writeReportOutputs } from "./output.js";
5
+ import { inputUrlSchema } from "./schema.js";
6
+ export async function readInputUrls(path) {
7
+ const content = await readFile(path, "utf8");
8
+ return content
9
+ .split(/\r?\n/)
10
+ .map((line) => line.trim())
11
+ .filter((line) => line.length > 0 && !line.startsWith("#"))
12
+ .map((line) => inputUrlSchema.parse(line));
13
+ }
14
+ export function safeReportSlug(rawUrl) {
15
+ const url = new URL(rawUrl);
16
+ const parts = [url.hostname.replace(/^www\./, ""), url.pathname.replace(/^\/|\/$/g, "")]
17
+ .filter(Boolean)
18
+ .join("-");
19
+ const slug = parts
20
+ .toLowerCase()
21
+ .replace(/[^a-z0-9]+/g, "-")
22
+ .replace(/^-+|-+$/g, "");
23
+ return slug || "site";
24
+ }
25
+ function uniqueSlug(base, used) {
26
+ const count = used.get(base) ?? 0;
27
+ used.set(base, count + 1);
28
+ return count === 0 ? base : `${base}-${count + 1}`;
29
+ }
30
+ export async function runBatchReports(urls, options) {
31
+ const usedSlugs = new Map();
32
+ const audit = options.audit ?? ((url) => auditUrl(url, {}));
33
+ const results = [];
34
+ for (const url of urls) {
35
+ const report = await audit(url);
36
+ const slug = uniqueSlug(safeReportSlug(url), usedSlugs);
37
+ const outputs = await writeReportOutputs(report, {
38
+ format: options.format,
39
+ outDir: join(options.outDir, slug),
40
+ pretty: options.pretty
41
+ });
42
+ results.push({
43
+ url,
44
+ slug,
45
+ report,
46
+ outputs
47
+ });
48
+ }
49
+ return results;
50
+ }
51
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -1,26 +1,63 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from "commander";
3
3
  import { auditUrl } from "./audit.js";
4
+ import { readInputUrls, runBatchReports } from "./batch.js";
5
+ import { shouldFailOnThreshold } from "./exit-policy.js";
4
6
  import { writeReportOutputs } from "./output.js";
5
7
  import { cliOptionsSchema, inputUrlSchema } from "./schema.js";
8
+ import { renderTerminalSummary } from "./summary.js";
6
9
  const program = new Command();
7
10
  program
8
11
  .name("open-local-audit")
9
12
  .description("Audit a public local-business website and generate an evidence-backed report.")
10
- .argument("<url>", "HTTP or HTTPS URL to audit")
11
- .option("-f, --format <format>", "output format: json, markdown, or all", "markdown")
13
+ .argument("[url]", "HTTP or HTTPS URL to audit")
14
+ .option("--input <path>", "read URLs from a text file for batch audits")
15
+ .option("-f, --format <format>", "output format: json, markdown, html, or all", "markdown")
12
16
  .option("-o, --out <path>", "write report to a file instead of stdout")
13
17
  .option("--out-dir <path>", "write generated report files to a directory")
14
18
  .option("--timeout <ms>", "request timeout in milliseconds", "10000")
15
19
  .option("--max-redirects <count>", "maximum redirects to follow", "5")
20
+ .option("--check-links", "check same-origin links found on the audited page", false)
21
+ .option("--max-pages <count>", "maximum same-origin links to check", "10")
22
+ .option("--fail-on <severity>", "exit with code 1 when findings meet severity: none, high, medium, or low", "none")
16
23
  .option("--pretty", "pretty-print JSON output", false)
17
24
  .action(async (rawUrl, rawOptions) => {
18
25
  try {
19
- const url = inputUrlSchema.parse(rawUrl);
20
26
  const options = cliOptionsSchema.parse(rawOptions);
21
- const report = await auditUrl(url, {
27
+ const auditOptions = {
22
28
  timeoutMs: options.timeout,
23
- maxRedirects: options.maxRedirects
29
+ maxRedirects: options.maxRedirects,
30
+ checkLinks: options.checkLinks,
31
+ maxPages: options.maxPages
32
+ };
33
+ if (options.input) {
34
+ if (rawUrl) {
35
+ throw new Error("Use either a URL or --input, not both");
36
+ }
37
+ if (!options.outDir) {
38
+ throw new Error("--out-dir is required when --input is used");
39
+ }
40
+ const urls = await readInputUrls(options.input);
41
+ const results = await runBatchReports(urls, {
42
+ format: options.format,
43
+ outDir: options.outDir,
44
+ pretty: options.pretty,
45
+ audit: (url) => auditUrl(url, auditOptions)
46
+ });
47
+ process.stdout.write(`Audited ${results.length} URL${results.length === 1 ? "" : "s"}\n`);
48
+ const failed = results.some((result) => shouldFailOnThreshold(result.report, options.failOn));
49
+ if (failed) {
50
+ process.stderr.write(`open-local-audit: findings met --fail-on ${options.failOn}\n`);
51
+ process.exitCode = 1;
52
+ }
53
+ return;
54
+ }
55
+ if (!rawUrl) {
56
+ throw new Error("URL is required unless --input is used");
57
+ }
58
+ const url = inputUrlSchema.parse(rawUrl);
59
+ const report = await auditUrl(url, {
60
+ ...auditOptions
24
61
  });
25
62
  const outputs = await writeReportOutputs(report, {
26
63
  format: options.format,
@@ -33,6 +70,13 @@ program
33
70
  process.stdout.write(output.content);
34
71
  }
35
72
  }
73
+ if (outputs.some((output) => output.path)) {
74
+ process.stdout.write(`${renderTerminalSummary(report)}\n`);
75
+ }
76
+ if (shouldFailOnThreshold(report, options.failOn)) {
77
+ process.stderr.write(`open-local-audit: findings met --fail-on ${options.failOn}\n`);
78
+ process.exitCode = 1;
79
+ }
36
80
  }
37
81
  catch (error) {
38
82
  const message = error instanceof Error ? error.message : "Unknown error";
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,+EAA+E,CAAC;KAC5F,QAAQ,CAAC,OAAO,EAAE,4BAA4B,CAAC;KAC/C,MAAM,CAAC,uBAAuB,EAAE,uCAAuC,EAAE,UAAU,CAAC;KACpF,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,CAAC;KACtE,MAAM,CAAC,kBAAkB,EAAE,6CAA6C,CAAC;KACzE,MAAM,CAAC,gBAAgB,EAAE,iCAAiC,EAAE,OAAO,CAAC;KACpE,MAAM,CAAC,yBAAyB,EAAE,6BAA6B,EAAE,GAAG,CAAC;KACrE,MAAM,CAAC,UAAU,EAAE,0BAA0B,EAAE,KAAK,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,UAAmB,EAAE,EAAE;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE;YACjC,SAAS,EAAE,OAAO,CAAC,OAAO;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE;YAC/C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,OAAO,IAAI,CAAC,CAAC;QACvD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AuditReport, Severity } from "./types.js";
2
+ export type FailOnThreshold = "none" | Exclude<Severity, "info">;
3
+ export declare function shouldFailOnThreshold(report: AuditReport, threshold: FailOnThreshold): boolean;
@@ -0,0 +1,17 @@
1
+ const ranks = {
2
+ high: 0,
3
+ medium: 1,
4
+ low: 2
5
+ };
6
+ export function shouldFailOnThreshold(report, threshold) {
7
+ if (threshold === "none") {
8
+ return false;
9
+ }
10
+ return report.findings.some((finding) => {
11
+ if (finding.severity === "info") {
12
+ return false;
13
+ }
14
+ return ranks[finding.severity] <= ranks[threshold];
15
+ });
16
+ }
17
+ //# sourceMappingURL=exit-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-policy.js","sourceRoot":"","sources":["../src/exit-policy.ts"],"names":[],"mappings":"AAIA,MAAM,KAAK,GAA8C;IACvD,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,MAAmB,EAAE,SAA0B;IACnF,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACtC,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  export { auditUrl, auditSnapshot } from "./audit.js";
2
+ export { readInputUrls, runBatchReports, safeReportSlug } from "./batch.js";
3
+ export { shouldFailOnThreshold } from "./exit-policy.js";
2
4
  export { writeReportOutputs } from "./output.js";
3
- export { renderJsonReport, renderMarkdownReport } from "./reporters.js";
5
+ export { renderHtmlReport, renderJsonReport, renderMarkdownReport } from "./reporters.js";
6
+ export { renderTerminalSummary } from "./summary.js";
4
7
  export type { AuditOptions, AuditReport, AuditSummary, Evidence, Finding, FindingCategory, PageSnapshot, Score, Severity } from "./types.js";
package/dist/index.js CHANGED
@@ -1,4 +1,7 @@
1
1
  export { auditUrl, auditSnapshot } from "./audit.js";
2
+ export { readInputUrls, runBatchReports, safeReportSlug } from "./batch.js";
3
+ export { shouldFailOnThreshold } from "./exit-policy.js";
2
4
  export { writeReportOutputs } from "./output.js";
3
- export { renderJsonReport, renderMarkdownReport } from "./reporters.js";
5
+ export { renderHtmlReport, renderJsonReport, renderMarkdownReport } from "./reporters.js";
6
+ export { renderTerminalSummary } from "./summary.js";
4
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
package/dist/output.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { AuditReport } from "./types.js";
2
- export type OutputFormat = "json" | "markdown" | "all";
2
+ export type OutputFormat = "json" | "markdown" | "html" | "all";
3
3
  export interface ReportOutputOptions {
4
4
  format: OutputFormat;
5
5
  out?: string;
package/dist/output.js CHANGED
@@ -1,18 +1,28 @@
1
1
  import { mkdir, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
- import { renderJsonReport, renderMarkdownReport } from "./reporters.js";
3
+ import { renderHtmlReport, renderJsonReport, renderMarkdownReport } from "./reporters.js";
4
4
  function outputFor(report, format, pretty) {
5
+ const contentByFormat = {
6
+ json: renderJsonReport(report, pretty),
7
+ markdown: renderMarkdownReport(report),
8
+ html: renderHtmlReport(report)
9
+ };
5
10
  return {
6
11
  format,
7
- content: format === "json" ? renderJsonReport(report, pretty) : renderMarkdownReport(report)
12
+ content: contentByFormat[format]
8
13
  };
9
14
  }
10
15
  function defaultReportName(format) {
11
- return `open-local-audit-report.${format === "json" ? "json" : "md"}`;
16
+ const extension = {
17
+ json: "json",
18
+ markdown: "md",
19
+ html: "html"
20
+ }[format];
21
+ return `open-local-audit-report.${extension}`;
12
22
  }
13
23
  export async function writeReportOutputs(report, options) {
14
24
  const pretty = options.pretty ?? false;
15
- const formats = options.format === "all" ? ["json", "markdown"] : [options.format];
25
+ const formats = options.format === "all" ? ["json", "markdown", "html"] : [options.format];
16
26
  const outputs = formats.map((format) => outputFor(report, format, pretty));
17
27
  if (options.outDir) {
18
28
  await mkdir(options.outDir, { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAkBxE,SAAS,SAAS,CAAC,MAAmB,EAAE,MAAoC,EAAE,MAAe;IAC3F,OAAO;QACL,MAAM;QACN,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC;KAC7F,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAoC;IAC7D,OAAO,2BAA2B,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAmB,EAAE,OAA4B;IACxF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IACvC,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAE3E,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACrE,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;QAC9B,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAkB1F,SAAS,SAAS,CAAC,MAAmB,EAAE,MAAoC,EAAE,MAAe;IAC3F,MAAM,eAAe,GAAG;QACtB,IAAI,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;QACtC,QAAQ,EAAE,oBAAoB,CAAC,MAAM,CAAC;QACtC,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC;KAC/B,CAAC;IAEF,OAAO;QACL,MAAM;QACN,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAoC;IAC7D,MAAM,SAAS,GAAG;QAChB,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,MAAM;KACb,CAAC,MAAM,CAAC,CAAC;IAEV,OAAO,2BAA2B,SAAS,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAmB,EAAE,OAA4B;IACxF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IACvC,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAE3E,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACrE,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;QAC9B,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import type { AuditReport } from "./types.js";
2
2
  export declare function renderJsonReport(report: AuditReport, pretty?: boolean): string;
3
3
  export declare function renderMarkdownReport(report: AuditReport): string;
4
+ export declare function renderHtmlReport(report: AuditReport): string;
package/dist/reporters.js CHANGED
@@ -1,6 +1,14 @@
1
1
  function escapeCell(value) {
2
2
  return value.replace(/\|/g, "\\|").replace(/\r?\n/g, " ");
3
3
  }
4
+ function escapeHtml(value) {
5
+ return value
6
+ .replace(/&/g, "&amp;")
7
+ .replace(/</g, "&lt;")
8
+ .replace(/>/g, "&gt;")
9
+ .replace(/"/g, "&quot;")
10
+ .replace(/'/g, "&#39;");
11
+ }
4
12
  function severityRank(finding) {
5
13
  const ranks = {
6
14
  high: 0,
@@ -55,4 +63,59 @@ export function renderMarkdownReport(report) {
55
63
  lines.push("");
56
64
  return `${lines.join("\n")}\n`;
57
65
  }
66
+ export function renderHtmlReport(report) {
67
+ const findings = [...report.findings].sort((left, right) => severityRank(left) - severityRank(right));
68
+ const scoreRows = Object.values(report.scores)
69
+ .map((score) => `<tr><td>${escapeHtml(score.label)}</td><td>${score.score}/${score.max}</td></tr>`)
70
+ .join("\n");
71
+ const findingRows = findings.length
72
+ ? findings
73
+ .map((finding) => {
74
+ const evidence = finding.evidence.map((item) => `${item.label}: ${item.value}`).join("; ");
75
+ return `<tr><td>${finding.severity}</td><td>${escapeHtml(finding.title)}</td><td>${escapeHtml(evidence)}</td><td>${escapeHtml(finding.recommendation)}</td></tr>`;
76
+ })
77
+ .join("\n")
78
+ : `<tr><td colspan="4">No findings were detected by the current rule set.</td></tr>`;
79
+ const recommendations = report.recommendations.length > 0
80
+ ? report.recommendations.map((recommendation) => `<li>${escapeHtml(recommendation)}</li>`).join("\n")
81
+ : "<li>Keep monitoring the page as content and templates change.</li>";
82
+ return `<!doctype html>
83
+ <html lang="en">
84
+ <head>
85
+ <meta charset="utf-8">
86
+ <meta name="viewport" content="width=device-width, initial-scale=1">
87
+ <title>Open Local Audit Report - ${escapeHtml(report.finalUrl)}</title>
88
+ <style>
89
+ body { color: #172026; font-family: Arial, sans-serif; line-height: 1.5; margin: 2rem; }
90
+ table { border-collapse: collapse; width: 100%; }
91
+ th, td { border: 1px solid #d4d9dd; padding: 0.5rem; text-align: left; vertical-align: top; }
92
+ th { background: #f3f5f7; }
93
+ .meta { color: #51606a; }
94
+ </style>
95
+ </head>
96
+ <body>
97
+ <h1>Open Local Audit Report</h1>
98
+ <p class="meta">URL: ${escapeHtml(report.url)}<br>Final URL: ${escapeHtml(report.finalUrl)}<br>Scanned at: ${escapeHtml(report.scannedAt)}<br>Status code: ${report.statusCode}</p>
99
+ <h2>Score Summary</h2>
100
+ <table>
101
+ <thead><tr><th>Category</th><th>Score</th></tr></thead>
102
+ <tbody>
103
+ ${scoreRows}
104
+ </tbody>
105
+ </table>
106
+ <h2>Findings</h2>
107
+ <table>
108
+ <thead><tr><th>Severity</th><th>Finding</th><th>Evidence</th><th>Recommendation</th></tr></thead>
109
+ <tbody>
110
+ ${findingRows}
111
+ </tbody>
112
+ </table>
113
+ <h2>Recommendations</h2>
114
+ <ul>
115
+ ${recommendations}
116
+ </ul>
117
+ </body>
118
+ </html>
119
+ `;
120
+ }
58
121
  //# sourceMappingURL=reporters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reporters.js","sourceRoot":"","sources":["../src/reporters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reporters.js","sourceRoot":"","sources":["../src/reporters.ts"],"names":[],"mappings":"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"}
package/dist/rules.js CHANGED
@@ -224,6 +224,19 @@ const rules = [
224
224
  check: ({ $ }) => hasLink($, (href) => /google\.com\/maps|maps\.app\.goo\.gl|bing\.com\/maps|directions/i.test(href)),
225
225
  evidence: () => "No map or directions link found"
226
226
  },
227
+ {
228
+ id: "broken-internal-links",
229
+ title: "Some internal links are broken",
230
+ category: "technical-health",
231
+ severity: "high",
232
+ source: "Internal links",
233
+ recommendation: "Fix or remove broken internal links so visitors and crawlers do not hit dead pages.",
234
+ check: ({ snapshot }) => !snapshot.internalLinks || snapshot.internalLinks.every((link) => link.statusCode > 0 && link.statusCode < 400),
235
+ evidence: ({ snapshot }) => {
236
+ const broken = snapshot.internalLinks?.filter((link) => link.statusCode === 0 || link.statusCode >= 400) ?? [];
237
+ return broken.map((link) => `${link.statusCode} ${link.finalUrl}`).join("; ") || "No broken links";
238
+ }
239
+ },
227
240
  {
228
241
  id: "image-alt-coverage",
229
242
  title: "Some images are missing alt text",
package/dist/rules.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -1,25 +1,38 @@
1
1
  import { z } from "zod";
2
2
  export declare const inputUrlSchema: z.ZodEffects<z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>, string, string>;
3
- export declare const outputFormatSchema: z.ZodEnum<["json", "markdown", "all"]>;
3
+ export declare const outputFormatSchema: z.ZodEnum<["json", "markdown", "html", "all"]>;
4
+ export declare const failOnSchema: z.ZodEnum<["none", "high", "medium", "low"]>;
4
5
  export declare const cliOptionsSchema: z.ZodObject<{
5
- format: z.ZodDefault<z.ZodEnum<["json", "markdown", "all"]>>;
6
+ format: z.ZodDefault<z.ZodEnum<["json", "markdown", "html", "all"]>>;
6
7
  out: z.ZodOptional<z.ZodString>;
7
8
  outDir: z.ZodOptional<z.ZodString>;
9
+ input: z.ZodOptional<z.ZodString>;
8
10
  timeout: z.ZodDefault<z.ZodNumber>;
9
11
  maxRedirects: z.ZodDefault<z.ZodNumber>;
12
+ checkLinks: z.ZodDefault<z.ZodBoolean>;
13
+ maxPages: z.ZodDefault<z.ZodNumber>;
14
+ failOn: z.ZodDefault<z.ZodEnum<["none", "high", "medium", "low"]>>;
10
15
  pretty: z.ZodDefault<z.ZodBoolean>;
11
16
  }, "strip", z.ZodTypeAny, {
12
17
  maxRedirects: number;
13
- format: "json" | "markdown" | "all";
18
+ checkLinks: boolean;
19
+ maxPages: number;
20
+ format: "html" | "json" | "markdown" | "all";
14
21
  timeout: number;
22
+ failOn: "high" | "medium" | "low" | "none";
15
23
  pretty: boolean;
16
24
  out?: string | undefined;
17
25
  outDir?: string | undefined;
26
+ input?: string | undefined;
18
27
  }, {
19
28
  maxRedirects?: number | undefined;
20
- format?: "json" | "markdown" | "all" | undefined;
29
+ checkLinks?: boolean | undefined;
30
+ maxPages?: number | undefined;
31
+ format?: "html" | "json" | "markdown" | "all" | undefined;
21
32
  out?: string | undefined;
22
33
  outDir?: string | undefined;
34
+ input?: string | undefined;
23
35
  timeout?: number | undefined;
36
+ failOn?: "high" | "medium" | "low" | "none" | undefined;
24
37
  pretty?: boolean | undefined;
25
38
  }>;
package/dist/schema.js CHANGED
@@ -13,13 +13,18 @@ export const inputUrlSchema = z
13
13
  .refine((value) => /^https?:\/\//i.test(value), {
14
14
  message: "Only HTTP and HTTPS URLs are supported"
15
15
  });
16
- export const outputFormatSchema = z.enum(["json", "markdown", "all"]);
16
+ export const outputFormatSchema = z.enum(["json", "markdown", "html", "all"]);
17
+ export const failOnSchema = z.enum(["none", "high", "medium", "low"]);
17
18
  export const cliOptionsSchema = z.object({
18
19
  format: outputFormatSchema.default("markdown"),
19
20
  out: z.string().optional(),
20
21
  outDir: z.string().optional(),
22
+ input: z.string().optional(),
21
23
  timeout: z.coerce.number().int().positive().max(60000).default(10000),
22
24
  maxRedirects: z.coerce.number().int().min(0).max(10).default(5),
25
+ checkLinks: z.boolean().default(false),
26
+ maxPages: z.coerce.number().int().positive().max(100).default(10),
27
+ failOn: failOnSchema.default("none"),
23
28
  pretty: z.boolean().default(false)
24
29
  });
25
30
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,EAAE;KACR,IAAI,EAAE;KACN,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC;KACzB,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;IACnB,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,WAAW,KAAK,EAAE,CAAC;AAC5B,CAAC,CAAC;KACD,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;KAC7D,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;IAC9C,OAAO,EAAE,wCAAwC;CAClD,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC;IAC9C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACrE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACnC,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,EAAE;KACR,IAAI,EAAE;KACN,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC;KACzB,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;IACnB,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,WAAW,KAAK,EAAE,CAAC;AAC5B,CAAC,CAAC;KACD,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;KAC7D,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;IAC9C,OAAO,EAAE,wCAAwC;CAClD,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC;IAC9C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACrE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACjE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACnC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { AuditReport } from "./types.js";
2
+ export declare function renderTerminalSummary(report: AuditReport): string;
@@ -0,0 +1,12 @@
1
+ export function renderTerminalSummary(report) {
2
+ const averageScore = Math.round(Object.values(report.scores).reduce((total, score) => total + score.score, 0) / Object.values(report.scores).length);
3
+ const topIssue = report.findings[0]?.title ?? "No findings detected";
4
+ return [
5
+ `Overall score: ${averageScore}/100`,
6
+ `High: ${report.summary.high}`,
7
+ `Medium: ${report.summary.medium}`,
8
+ `Low: ${report.summary.low}`,
9
+ `Top issue: ${topIssue}`
10
+ ].join("\n");
11
+ }
12
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,MAAmB;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CACpH,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,sBAAsB,CAAC;IAErE,OAAO;QACL,kBAAkB,YAAY,MAAM;QACpC,SAAS,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QAC9B,WAAW,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;QAClC,QAAQ,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;QAC5B,cAAc,QAAQ,EAAE;KACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
package/dist/types.d.ts CHANGED
@@ -46,10 +46,13 @@ export interface PageSnapshot {
46
46
  robotsTxt?: PageResource;
47
47
  sitemapXml?: PageResource;
48
48
  };
49
+ internalLinks?: PageResource[];
49
50
  }
50
51
  export interface AuditOptions {
51
52
  timeoutMs: number;
52
53
  maxRedirects: number;
54
+ checkLinks: boolean;
55
+ maxPages: number;
53
56
  }
54
57
  export interface PageResource {
55
58
  url: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-local-audit",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "Open-source website and local presence auditor for small businesses.",
5
5
  "license": "MIT",
6
6
  "type": "module",