@eightmedia/flightcheck 0.0.0-stage → 1.0.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 +16 -0
- package/LICENSE +691 -0
- package/README.md +152 -2
- package/dist/analyze/fixManifest.d.ts +65 -0
- package/dist/analyze/fixManifest.d.ts.map +1 -0
- package/dist/analyze/fixManifest.js +588 -0
- package/dist/analyze/report.d.ts +283 -0
- package/dist/analyze/report.d.ts.map +1 -0
- package/dist/analyze/report.js +726 -0
- package/dist/analyze/reportTier1.d.ts +46 -0
- package/dist/analyze/reportTier1.d.ts.map +1 -0
- package/dist/analyze/reportTier1.js +251 -0
- package/dist/analyze/stack.d.ts +33 -0
- package/dist/analyze/stack.d.ts.map +1 -0
- package/dist/analyze/stack.js +188 -0
- package/dist/analyze/structuredReport.d.ts +62 -0
- package/dist/analyze/structuredReport.d.ts.map +1 -0
- package/dist/analyze/structuredReport.js +524 -0
- package/dist/analyze.d.ts +3 -0
- package/dist/analyze.d.ts.map +1 -0
- package/dist/analyze.js +40 -0
- package/dist/checks/agent-ready.d.ts +63 -0
- package/dist/checks/agent-ready.d.ts.map +1 -0
- package/dist/checks/agent-ready.js +219 -0
- package/dist/checks/analyze.d.ts +15 -0
- package/dist/checks/analyze.d.ts.map +1 -0
- package/dist/checks/analyze.js +63 -0
- package/dist/checks/crawl.d.ts +28 -0
- package/dist/checks/crawl.d.ts.map +1 -0
- package/dist/checks/crawl.js +86 -0
- package/dist/checks/dns.d.ts +25 -0
- package/dist/checks/dns.d.ts.map +1 -0
- package/dist/checks/dns.js +80 -0
- package/dist/checks/index.d.ts +24 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +12 -0
- package/dist/checks/issues.d.ts +8 -0
- package/dist/checks/issues.d.ts.map +1 -0
- package/dist/checks/issues.js +3 -0
- package/dist/checks/redirect.d.ts +38 -0
- package/dist/checks/redirect.d.ts.map +1 -0
- package/dist/checks/redirect.js +209 -0
- package/dist/checks/registry.d.ts +8 -0
- package/dist/checks/registry.d.ts.map +1 -0
- package/dist/checks/registry.js +275 -0
- package/dist/checks/robots-txt.d.ts +16 -0
- package/dist/checks/robots-txt.d.ts.map +1 -0
- package/dist/checks/robots-txt.js +99 -0
- package/dist/checks/runner.d.ts +9 -0
- package/dist/checks/runner.d.ts.map +1 -0
- package/dist/checks/runner.js +110 -0
- package/dist/checks/security-headers.d.ts +12 -0
- package/dist/checks/security-headers.d.ts.map +1 -0
- package/dist/checks/security-headers.js +53 -0
- package/dist/checks/sitemap.d.ts +36 -0
- package/dist/checks/sitemap.d.ts.map +1 -0
- package/dist/checks/sitemap.js +140 -0
- package/dist/checks/types.d.ts +72 -0
- package/dist/checks/types.d.ts.map +1 -0
- package/dist/checks/types.js +20 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +125 -0
- package/dist/crawler/checkGroups.d.ts +7 -0
- package/dist/crawler/checkGroups.d.ts.map +1 -0
- package/dist/crawler/checkGroups.js +29 -0
- package/dist/crawler/crawlState.d.ts +7 -0
- package/dist/crawler/crawlState.d.ts.map +1 -0
- package/dist/crawler/crawlState.js +6 -0
- package/dist/crawler/defaults.d.ts +11 -0
- package/dist/crawler/defaults.d.ts.map +1 -0
- package/dist/crawler/defaults.js +10 -0
- package/dist/crawler/extractors.d.ts +5 -0
- package/dist/crawler/extractors.d.ts.map +1 -0
- package/dist/crawler/extractors.js +169 -0
- package/dist/crawler/jsAssets.d.ts +2 -0
- package/dist/crawler/jsAssets.d.ts.map +1 -0
- package/dist/crawler/jsAssets.js +22 -0
- package/dist/crawler/outputPaths.d.ts +14 -0
- package/dist/crawler/outputPaths.d.ts.map +1 -0
- package/dist/crawler/outputPaths.js +51 -0
- package/dist/crawler/reporter.d.ts +3 -0
- package/dist/crawler/reporter.d.ts.map +1 -0
- package/dist/crawler/reporter.js +12 -0
- package/dist/crawler/robots.d.ts +5 -0
- package/dist/crawler/robots.d.ts.map +1 -0
- package/dist/crawler/robots.js +29 -0
- package/dist/crawler/runCrawler.d.ts +22 -0
- package/dist/crawler/runCrawler.d.ts.map +1 -0
- package/dist/crawler/runCrawler.js +172 -0
- package/dist/crawler/schema.d.ts +87 -0
- package/dist/crawler/schema.d.ts.map +1 -0
- package/dist/crawler/schema.js +44 -0
- package/dist/crawler/secrets.d.ts +4 -0
- package/dist/crawler/secrets.d.ts.map +1 -0
- package/dist/crawler/secrets.js +70 -0
- package/dist/crawler/sitemap.d.ts +8 -0
- package/dist/crawler/sitemap.d.ts.map +1 -0
- package/dist/crawler/sitemap.js +105 -0
- package/dist/crawler/stack.d.ts +3 -0
- package/dist/crawler/stack.d.ts.map +1 -0
- package/dist/crawler/stack.js +1 -0
- package/dist/crawler/stackDetect.d.ts +24 -0
- package/dist/crawler/stackDetect.d.ts.map +1 -0
- package/dist/crawler/stackDetect.js +604 -0
- package/dist/crawler/tier1Extractors.d.ts +5 -0
- package/dist/crawler/tier1Extractors.d.ts.map +1 -0
- package/dist/crawler/tier1Extractors.js +255 -0
- package/dist/crawler/tracking.d.ts +8 -0
- package/dist/crawler/tracking.d.ts.map +1 -0
- package/dist/crawler/tracking.js +50 -0
- package/dist/crawler/urlUtils.d.ts +12 -0
- package/dist/crawler/urlUtils.d.ts.map +1 -0
- package/dist/crawler/urlUtils.js +53 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/docs/agent-fixes.md +17 -0
- package/docs/agent-ready.md +44 -0
- package/docs/analyze.md +103 -0
- package/docs/check-api.md +142 -0
- package/docs/checks.md +116 -0
- package/docs/crawler.md +158 -0
- package/docs/index.md +24 -0
- package/docs/qc-checks-plan.md +796 -0
- package/docs/stack.md +99 -0
- package/package.json +86 -4
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { AgentReadyCheckResult } from "../checks/agent-ready.js";
|
|
2
|
+
import type { DnsCheckResult } from "../checks/dns.js";
|
|
3
|
+
import type { RedirectCheckResult } from "../checks/redirect.js";
|
|
4
|
+
import type { RobotsTxtCheckResult } from "../checks/robots-txt.js";
|
|
5
|
+
import type { SecurityHeadersCheckResult } from "../checks/security-headers.js";
|
|
6
|
+
import type { SitemapCheckResult } from "../checks/sitemap.js";
|
|
7
|
+
export type Tier1ReportData = {
|
|
8
|
+
redirect?: RedirectCheckResult;
|
|
9
|
+
securityHeaders?: SecurityHeadersCheckResult;
|
|
10
|
+
dns?: DnsCheckResult;
|
|
11
|
+
robotsTxt?: RobotsTxtCheckResult;
|
|
12
|
+
sitemap?: SitemapCheckResult;
|
|
13
|
+
agentReady?: AgentReadyCheckResult;
|
|
14
|
+
};
|
|
15
|
+
export type BuildMarkdownOptions = {
|
|
16
|
+
redirectOnly?: boolean;
|
|
17
|
+
stackProfile?: import("./stack.js").StackProfile;
|
|
18
|
+
};
|
|
19
|
+
export declare function buildRedirectSection(result: RedirectCheckResult): string[];
|
|
20
|
+
export declare function buildDnsSection(dns: DnsCheckResult): string[];
|
|
21
|
+
export declare function buildSecurityHeadersSection(result: SecurityHeadersCheckResult): string[];
|
|
22
|
+
export declare function buildRobotsTxtSection(result: RobotsTxtCheckResult): string[];
|
|
23
|
+
export declare function buildSitemapSection(result: SitemapCheckResult): string[];
|
|
24
|
+
export declare function buildRobotsAndSitemapSection(robotsTxt?: RobotsTxtCheckResult, sitemap?: SitemapCheckResult): string[];
|
|
25
|
+
export declare function buildAgentReadySection(result: AgentReadyCheckResult): string[];
|
|
26
|
+
export declare function countTier1InfraIssues(tier1: Tier1ReportData): number;
|
|
27
|
+
export type CrawlIssueCounts = {
|
|
28
|
+
seo: {
|
|
29
|
+
issueCount: number;
|
|
30
|
+
pageCount: number;
|
|
31
|
+
};
|
|
32
|
+
a11y: {
|
|
33
|
+
issueCount: number;
|
|
34
|
+
pageCount: number;
|
|
35
|
+
};
|
|
36
|
+
bestPractices: {
|
|
37
|
+
issueCount: number;
|
|
38
|
+
pageCount: number;
|
|
39
|
+
};
|
|
40
|
+
security: {
|
|
41
|
+
issueCount: number;
|
|
42
|
+
pageCount: number;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export declare function buildIssuesSummarySection(tier1: Tier1ReportData, crawlCounts: CrawlIssueCounts, redirectOnly: boolean, performanceChecked?: boolean, performanceIssueCount?: number, performancePageCount?: number): string[];
|
|
46
|
+
//# sourceMappingURL=reportTier1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reportTier1.d.ts","sourceRoot":"","sources":["../../src/analyze/reportTier1.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,eAAe,CAAC,EAAE,0BAA0B,CAAC;IAC7C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,YAAY,EAAE,YAAY,CAAC;CAClD,CAAC;AAUF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAuC1E;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CAkC7D;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,EAAE,CAUxF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAoB5E;AAUD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAkCxE;AAED,wBAAgB,4BAA4B,CAAC,SAAS,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAOrH;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAoD9E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CASpE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD,CAAC;AA4BF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,gBAAgB,EAC7B,YAAY,EAAE,OAAO,EACrB,kBAAkB,UAAQ,EAC1B,qBAAqB,SAAI,EACzB,oBAAoB,SAAI,GACvB,MAAM,EAAE,CA+BV"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
function severityLabel(severity) {
|
|
2
|
+
return severity.toUpperCase();
|
|
3
|
+
}
|
|
4
|
+
function issueTodo(issue) {
|
|
5
|
+
return `- [ ] **${severityLabel(issue.severity)}** ${issue.message}`;
|
|
6
|
+
}
|
|
7
|
+
export function buildRedirectSection(result) {
|
|
8
|
+
const lines = [
|
|
9
|
+
"## Domain redirect",
|
|
10
|
+
"",
|
|
11
|
+
`- URL: \`${result.url}\``,
|
|
12
|
+
`- Status: \`${result.status ?? "unreachable"}\``,
|
|
13
|
+
];
|
|
14
|
+
if (result.location) {
|
|
15
|
+
lines.push(`- Location: \`${result.location}\``);
|
|
16
|
+
}
|
|
17
|
+
if (result.resolvedTarget) {
|
|
18
|
+
lines.push(`- Resolved target: \`${result.resolvedTarget}\``);
|
|
19
|
+
}
|
|
20
|
+
if (result.targetStatus !== null) {
|
|
21
|
+
lines.push(`- Target response: \`${result.targetStatus}\``);
|
|
22
|
+
}
|
|
23
|
+
if (result.wwwAlias) {
|
|
24
|
+
lines.push("");
|
|
25
|
+
lines.push(`- Canonical host: \`${new URL(result.wwwAlias.canonicalUrl).hostname}\``);
|
|
26
|
+
lines.push(`- Alternate host: \`${result.wwwAlias.alternateUrl}\``);
|
|
27
|
+
lines.push(`- Alternate status: \`${result.wwwAlias.status ?? "unreachable"}\``);
|
|
28
|
+
if (result.wwwAlias.location) {
|
|
29
|
+
lines.push(`- Alternate Location: \`${result.wwwAlias.location}\``);
|
|
30
|
+
}
|
|
31
|
+
if (result.wwwAlias.resolvedTarget) {
|
|
32
|
+
lines.push(`- Alternate resolved target: \`${result.wwwAlias.resolvedTarget}\``);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
lines.push("");
|
|
36
|
+
if (result.issues.length === 0) {
|
|
37
|
+
lines.push("- Redirect looks correctly configured.");
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
lines.push(...result.issues.map(issueTodo));
|
|
41
|
+
}
|
|
42
|
+
lines.push("");
|
|
43
|
+
return lines;
|
|
44
|
+
}
|
|
45
|
+
export function buildDnsSection(dns) {
|
|
46
|
+
const lines = ["## DNS", "", `- Hostname: \`${dns.hostname}\``];
|
|
47
|
+
if (dns.records.a.length > 0) {
|
|
48
|
+
lines.push(`- A: ${dns.records.a.join(", ")}`);
|
|
49
|
+
}
|
|
50
|
+
if (dns.records.aaaa.length > 0) {
|
|
51
|
+
lines.push(`- AAAA: ${dns.records.aaaa.join(", ")}`);
|
|
52
|
+
}
|
|
53
|
+
if (dns.records.cname.length > 0) {
|
|
54
|
+
lines.push(`- CNAME: ${dns.records.cname.join(", ")}`);
|
|
55
|
+
}
|
|
56
|
+
if (dns.records.mx.length > 0) {
|
|
57
|
+
lines.push(`- MX: ${dns.records.mx.map((entry) => `${entry.exchange} (${entry.priority})`).join(", ")}`);
|
|
58
|
+
}
|
|
59
|
+
if (dns.records.ns.length > 0) {
|
|
60
|
+
lines.push(`- NS: ${dns.records.ns.join(", ")}`);
|
|
61
|
+
}
|
|
62
|
+
if (dns.mail.spf) {
|
|
63
|
+
lines.push(`- SPF: \`${dns.mail.spf}\``);
|
|
64
|
+
}
|
|
65
|
+
if (dns.mail.dmarc) {
|
|
66
|
+
lines.push(`- DMARC: \`${dns.mail.dmarc}\``);
|
|
67
|
+
}
|
|
68
|
+
lines.push("");
|
|
69
|
+
if (dns.issues.length === 0) {
|
|
70
|
+
lines.push("- No DNS issues found.");
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
lines.push("### Issues", "");
|
|
74
|
+
lines.push(...dns.issues.map(issueTodo));
|
|
75
|
+
}
|
|
76
|
+
lines.push("");
|
|
77
|
+
return lines;
|
|
78
|
+
}
|
|
79
|
+
export function buildSecurityHeadersSection(result) {
|
|
80
|
+
const lines = ["## Security headers", "", `- Checked: \`${result.url}\``, ""];
|
|
81
|
+
if (result.issues.length === 0) {
|
|
82
|
+
lines.push("- No security header issues found.");
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
lines.push(...result.issues.map(issueTodo));
|
|
86
|
+
}
|
|
87
|
+
lines.push("");
|
|
88
|
+
return lines;
|
|
89
|
+
}
|
|
90
|
+
export function buildRobotsTxtSection(result) {
|
|
91
|
+
const lines = [
|
|
92
|
+
"### Robots.txt",
|
|
93
|
+
"",
|
|
94
|
+
`- URL: \`${result.url}\``,
|
|
95
|
+
`- Status: \`${result.status ?? "unreachable"}\``,
|
|
96
|
+
];
|
|
97
|
+
if (result.sitemapUrls.length > 0) {
|
|
98
|
+
lines.push(`- Sitemaps: ${result.sitemapUrls.map((url) => `\`${url}\``).join(", ")}`);
|
|
99
|
+
}
|
|
100
|
+
lines.push("");
|
|
101
|
+
if (result.issues.length === 0) {
|
|
102
|
+
lines.push("- No robots.txt issues found.");
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
lines.push(...result.issues.map(issueTodo));
|
|
106
|
+
}
|
|
107
|
+
lines.push("");
|
|
108
|
+
return lines;
|
|
109
|
+
}
|
|
110
|
+
function listSampleUrls(urls, limit = 10) {
|
|
111
|
+
const lines = urls.slice(0, limit).map((url) => `- \`${url}\``);
|
|
112
|
+
if (urls.length > limit) {
|
|
113
|
+
lines.push(`- ...and ${urls.length - limit} more`);
|
|
114
|
+
}
|
|
115
|
+
return lines;
|
|
116
|
+
}
|
|
117
|
+
export function buildSitemapSection(result) {
|
|
118
|
+
const lines = ["### Sitemap", ""];
|
|
119
|
+
for (const source of result.sources) {
|
|
120
|
+
lines.push(`- \`${source.url}\`: status \`${source.status ?? "unreachable"}\`, ${source.pageUrls.length} URL(s)`);
|
|
121
|
+
}
|
|
122
|
+
lines.push(`- Compared: ${result.sitemapPageUrls.length} sitemap URL(s) vs ${result.crawledUrls.length} crawled URL(s)`);
|
|
123
|
+
lines.push(`- Mismatch: ${result.mismatchPercent.toFixed(1)}%`);
|
|
124
|
+
lines.push("");
|
|
125
|
+
if (result.inSitemapNotCrawled.length > 0) {
|
|
126
|
+
lines.push("#### In sitemap but not crawled (CRITICAL)", "");
|
|
127
|
+
lines.push(...listSampleUrls(result.inSitemapNotCrawled));
|
|
128
|
+
lines.push("");
|
|
129
|
+
}
|
|
130
|
+
if (result.crawledNotInSitemap.length > 0) {
|
|
131
|
+
lines.push("#### Crawled but missing from sitemap (CRITICAL)", "");
|
|
132
|
+
lines.push(...listSampleUrls(result.crawledNotInSitemap));
|
|
133
|
+
lines.push("");
|
|
134
|
+
}
|
|
135
|
+
if (result.issues.length === 0) {
|
|
136
|
+
lines.push("- No sitemap issues found.");
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
lines.push(...result.issues.map(issueTodo));
|
|
140
|
+
}
|
|
141
|
+
lines.push("");
|
|
142
|
+
return lines;
|
|
143
|
+
}
|
|
144
|
+
export function buildRobotsAndSitemapSection(robotsTxt, sitemap) {
|
|
145
|
+
if (!robotsTxt && !sitemap)
|
|
146
|
+
return [];
|
|
147
|
+
const lines = ["## Robots.txt & sitemap", ""];
|
|
148
|
+
if (robotsTxt)
|
|
149
|
+
lines.push(...buildRobotsTxtSection(robotsTxt));
|
|
150
|
+
if (sitemap)
|
|
151
|
+
lines.push(...buildSitemapSection(sitemap));
|
|
152
|
+
return lines;
|
|
153
|
+
}
|
|
154
|
+
export function buildAgentReadySection(result) {
|
|
155
|
+
const { findings } = result;
|
|
156
|
+
const lines = [
|
|
157
|
+
"## Agent readiness",
|
|
158
|
+
"",
|
|
159
|
+
`- Checked: \`${result.url}\``,
|
|
160
|
+
`- Content Signals: ${findings.robotsTxt.hasContentSignals ? "yes" : "no"}`,
|
|
161
|
+
];
|
|
162
|
+
if (findings.robotsTxt.contentSignals.length > 0) {
|
|
163
|
+
lines.push(`- Content-Signal values: ${findings.robotsTxt.contentSignals.map((value) => `\`${value}\``).join(", ")}`);
|
|
164
|
+
}
|
|
165
|
+
if (findings.robotsTxt.aiBotUserAgents.length > 0) {
|
|
166
|
+
lines.push(`- AI bot User-agent rules: ${findings.robotsTxt.aiBotUserAgents.map((bot) => `\`${bot}\``).join(", ")}`);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
lines.push("- AI bot User-agent rules: none");
|
|
170
|
+
}
|
|
171
|
+
lines.push(`- llms.txt: \`${findings.llmsTxt.url}\` (status \`${findings.llmsTxt.status ?? "unreachable"}\`)`, `- Markdown negotiation: ${findings.markdownNegotiation.supportsMarkdown ? "yes" : "no"}` +
|
|
172
|
+
(findings.markdownNegotiation.contentType
|
|
173
|
+
? ` (\`${findings.markdownNegotiation.contentType}\`)`
|
|
174
|
+
: ""), `- Agent Link relations: ${findings.linkHeaders.relations.length > 0
|
|
175
|
+
? findings.linkHeaders.relations.map((rel) => `\`${rel}\``).join(", ")
|
|
176
|
+
: "none"}`);
|
|
177
|
+
const wellKnownBits = [
|
|
178
|
+
findings.wellKnown.mcpServerCard ? "MCP Server Card" : null,
|
|
179
|
+
findings.wellKnown.agentSkills ? "Agent Skills" : null,
|
|
180
|
+
findings.wellKnown.apiCatalog ? "API Catalog" : null,
|
|
181
|
+
findings.wellKnown.ard ? "ARD" : null,
|
|
182
|
+
findings.wellKnown.a2aAgentCard ? "A2A Agent Card" : null,
|
|
183
|
+
].filter(Boolean);
|
|
184
|
+
lines.push(`- Protocol discovery: ${wellKnownBits.length > 0 ? wellKnownBits.join(", ") : "none"}`, "");
|
|
185
|
+
if (result.issues.length === 0) {
|
|
186
|
+
lines.push("- No agent readiness issues found.");
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
lines.push(...result.issues.map(issueTodo));
|
|
190
|
+
}
|
|
191
|
+
lines.push("");
|
|
192
|
+
return lines;
|
|
193
|
+
}
|
|
194
|
+
export function countTier1InfraIssues(tier1) {
|
|
195
|
+
return ((tier1.redirect?.issues.length ?? 0) +
|
|
196
|
+
(tier1.dns?.issues.length ?? 0) +
|
|
197
|
+
(tier1.securityHeaders?.issues.length ?? 0) +
|
|
198
|
+
(tier1.robotsTxt?.issues.length ?? 0) +
|
|
199
|
+
(tier1.sitemap?.issues.length ?? 0) +
|
|
200
|
+
(tier1.agentReady?.issues.length ?? 0));
|
|
201
|
+
}
|
|
202
|
+
function buildInfraSummaryParts(tier1, redirectOnly) {
|
|
203
|
+
const parts = [];
|
|
204
|
+
if (redirectOnly) {
|
|
205
|
+
parts.push("redirect-only mode");
|
|
206
|
+
}
|
|
207
|
+
if (tier1.redirect) {
|
|
208
|
+
parts.push(`redirect (${tier1.redirect.issues.length} issue(s))`);
|
|
209
|
+
}
|
|
210
|
+
if (tier1.dns) {
|
|
211
|
+
parts.push(`DNS (${tier1.dns.issues.length} issue(s))`);
|
|
212
|
+
}
|
|
213
|
+
if (tier1.securityHeaders) {
|
|
214
|
+
parts.push(`security headers (${tier1.securityHeaders.issues.length} issue(s))`);
|
|
215
|
+
}
|
|
216
|
+
if (tier1.robotsTxt) {
|
|
217
|
+
parts.push(`robots.txt (${tier1.robotsTxt.issues.length} issue(s))`);
|
|
218
|
+
}
|
|
219
|
+
if (tier1.sitemap) {
|
|
220
|
+
parts.push(`sitemap (${tier1.sitemap.issues.length} issue(s))`);
|
|
221
|
+
}
|
|
222
|
+
if (tier1.agentReady) {
|
|
223
|
+
parts.push(`agent readiness (${tier1.agentReady.issues.length} issue(s))`);
|
|
224
|
+
}
|
|
225
|
+
return parts;
|
|
226
|
+
}
|
|
227
|
+
export function buildIssuesSummarySection(tier1, crawlCounts, redirectOnly, performanceChecked = false, performanceIssueCount = 0, performancePageCount = 0) {
|
|
228
|
+
const lines = ["### Issues summary", ""];
|
|
229
|
+
const infraParts = buildInfraSummaryParts(tier1, redirectOnly);
|
|
230
|
+
const infraIssueCount = countTier1InfraIssues(tier1);
|
|
231
|
+
if (infraParts.length > 0) {
|
|
232
|
+
lines.push(`- **Infra:** ${infraIssueCount} issue(s) — ${infraParts.join(", ")}`);
|
|
233
|
+
}
|
|
234
|
+
if (!redirectOnly) {
|
|
235
|
+
lines.push(`- **SEO:** ${crawlCounts.seo.issueCount} issue(s) on ${crawlCounts.seo.pageCount} page(s)`, `- **A11y:** ${crawlCounts.a11y.issueCount} issue(s) on ${crawlCounts.a11y.pageCount} page(s) — image alt + static hints`, `- **Best practices:** ${crawlCounts.bestPractices.issueCount} issue(s) on ${crawlCounts.bestPractices.pageCount} page(s) — landmarks, robots, template meta`);
|
|
236
|
+
if (crawlCounts.security.issueCount > 0) {
|
|
237
|
+
lines.push(`- **Security:** ${crawlCounts.security.issueCount} finding(s) on ${crawlCounts.security.pageCount} page(s)`);
|
|
238
|
+
}
|
|
239
|
+
if (performanceChecked) {
|
|
240
|
+
lines.push(`- **Performance:** ${performanceIssueCount} issue(s) on ${performancePageCount} page(s)`);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
lines.push("- **Performance:** not checked");
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else if (infraParts.length === 0) {
|
|
247
|
+
lines.push("- No issues found.");
|
|
248
|
+
}
|
|
249
|
+
lines.push("");
|
|
250
|
+
return lines;
|
|
251
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DnsCheckResult } from "../checks/dns.js";
|
|
2
|
+
import type { RobotsTxtCheckResult } from "../checks/robots-txt.js";
|
|
3
|
+
import type { SecurityHeadersCheckResult } from "../checks/security-headers.js";
|
|
4
|
+
import { type StackDetection } from "../crawler/stack.js";
|
|
5
|
+
import type { TrackingItem } from "../crawler/schema.js";
|
|
6
|
+
export type StackRecord = {
|
|
7
|
+
url: string;
|
|
8
|
+
stack?: {
|
|
9
|
+
detections: StackDetection[];
|
|
10
|
+
};
|
|
11
|
+
tracking: {
|
|
12
|
+
tagManager: TrackingItem[];
|
|
13
|
+
analytics: TrackingItem[];
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export type AggregatedStackDetection = StackDetection & {
|
|
17
|
+
pageCount: number;
|
|
18
|
+
};
|
|
19
|
+
export type StackProfile = {
|
|
20
|
+
detections: AggregatedStackDetection[];
|
|
21
|
+
tracking: {
|
|
22
|
+
tagManager: TrackingItem[];
|
|
23
|
+
analytics: TrackingItem[];
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export declare function aggregateStackFromRecords(records: StackRecord[]): StackProfile;
|
|
27
|
+
export declare function buildStackProfile(records: StackRecord[], options?: {
|
|
28
|
+
securityHeaders?: SecurityHeadersCheckResult;
|
|
29
|
+
dns?: DnsCheckResult;
|
|
30
|
+
robotsTxt?: RobotsTxtCheckResult;
|
|
31
|
+
}): StackProfile;
|
|
32
|
+
export declare function buildStackSection(profile: StackProfile, totalPages: number): string[];
|
|
33
|
+
//# sourceMappingURL=stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../../src/analyze/stack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IACzC,QAAQ,EAAE;QACR,UAAU,EAAE,YAAY,EAAE,CAAC;QAC3B,SAAS,EAAE,YAAY,EAAE,CAAC;KAC3B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,cAAc,GAAG;IACtD,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,wBAAwB,EAAE,CAAC;IACvC,QAAQ,EAAE;QACR,UAAU,EAAE,YAAY,EAAE,CAAC;QAC3B,SAAS,EAAE,YAAY,EAAE,CAAC;KAC3B,CAAC;CACH,CAAC;AAkHF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,YAAY,CAS9E;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,0BAA0B,CAAC;IAC7C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,oBAAoB,CAAC;CAC7B,GACL,YAAY,CA2Bd;AAOD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAgErF"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { detectStackFromDns, detectStackFromHeaders, detectStackFromRobots, } from "../crawler/stack.js";
|
|
2
|
+
const TRACKING_PROVIDER_LABELS = {
|
|
3
|
+
"google-tag-manager": "Google Tag Manager",
|
|
4
|
+
"google-analytics-ga4": "Google Analytics (GA4)",
|
|
5
|
+
"google-analytics-ua": "Google Analytics (Universal)",
|
|
6
|
+
matomo: "Matomo",
|
|
7
|
+
"facebook-pixel": "Facebook Pixel",
|
|
8
|
+
plausible: "Plausible",
|
|
9
|
+
};
|
|
10
|
+
function confidenceRank(confidence) {
|
|
11
|
+
return confidence === "high" ? 2 : confidence === "medium" ? 1 : 0;
|
|
12
|
+
}
|
|
13
|
+
function mergeConfidence(a, b) {
|
|
14
|
+
return confidenceRank(a) >= confidenceRank(b) ? a : b;
|
|
15
|
+
}
|
|
16
|
+
function dedupeTracking(items) {
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
return items.filter((item) => {
|
|
19
|
+
const key = `${item.provider}:${item.id}`;
|
|
20
|
+
if (seen.has(key))
|
|
21
|
+
return false;
|
|
22
|
+
seen.add(key);
|
|
23
|
+
return true;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function aggregateTracking(records) {
|
|
27
|
+
const tagManager = [];
|
|
28
|
+
const analytics = [];
|
|
29
|
+
for (const record of records) {
|
|
30
|
+
tagManager.push(...record.tracking.tagManager);
|
|
31
|
+
analytics.push(...record.tracking.analytics);
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
tagManager: dedupeTracking(tagManager),
|
|
35
|
+
analytics: dedupeTracking(analytics),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const STACK_CATEGORY_ORDER = ["Platform", "Framework", "CMS", "Search", "Hosting", "CDN", "Other"];
|
|
39
|
+
function isCuratedStackDetection(detection) {
|
|
40
|
+
return detection.detector === "flightcheck-v1";
|
|
41
|
+
}
|
|
42
|
+
function filterCuratedDetections(detections) {
|
|
43
|
+
return detections.filter(isCuratedStackDetection);
|
|
44
|
+
}
|
|
45
|
+
function primaryCategory(detection) {
|
|
46
|
+
return detection.categories[0] ?? "Other";
|
|
47
|
+
}
|
|
48
|
+
function categorySortKey(category) {
|
|
49
|
+
const index = STACK_CATEGORY_ORDER.indexOf(category);
|
|
50
|
+
return index === -1 ? STACK_CATEGORY_ORDER.length : index;
|
|
51
|
+
}
|
|
52
|
+
function aggregateDetections(pageDetections, originDetections) {
|
|
53
|
+
const merged = new Map();
|
|
54
|
+
const add = (detection, pageUrl) => {
|
|
55
|
+
const key = detection.name;
|
|
56
|
+
const existing = merged.get(key);
|
|
57
|
+
if (!existing) {
|
|
58
|
+
merged.set(key, {
|
|
59
|
+
...detection,
|
|
60
|
+
evidence: [...detection.evidence],
|
|
61
|
+
pageCount: pageUrl ? 1 : 0,
|
|
62
|
+
pages: new Set(pageUrl ? [pageUrl] : []),
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
existing.evidence = [...new Set([...existing.evidence, ...detection.evidence])];
|
|
67
|
+
existing.confidence = mergeConfidence(existing.confidence, detection.confidence);
|
|
68
|
+
existing.categories = [...new Set([...existing.categories, ...detection.categories])];
|
|
69
|
+
if (!existing.website && detection.website)
|
|
70
|
+
existing.website = detection.website;
|
|
71
|
+
if (!existing.version && detection.version)
|
|
72
|
+
existing.version = detection.version;
|
|
73
|
+
if (pageUrl)
|
|
74
|
+
existing.pages.add(pageUrl);
|
|
75
|
+
};
|
|
76
|
+
for (const { url, detections } of pageDetections) {
|
|
77
|
+
for (const detection of filterCuratedDetections(detections)) {
|
|
78
|
+
add(detection, url);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
for (const detection of originDetections) {
|
|
82
|
+
add(detection);
|
|
83
|
+
}
|
|
84
|
+
return [...merged.values()]
|
|
85
|
+
.map(({ pages, ...detection }) => ({
|
|
86
|
+
...detection,
|
|
87
|
+
pageCount: pages.size,
|
|
88
|
+
}))
|
|
89
|
+
.sort((a, b) => {
|
|
90
|
+
const categoryDiff = categorySortKey(primaryCategory(a)) - categorySortKey(primaryCategory(b));
|
|
91
|
+
if (categoryDiff !== 0)
|
|
92
|
+
return categoryDiff;
|
|
93
|
+
return a.name.localeCompare(b.name);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
export function aggregateStackFromRecords(records) {
|
|
97
|
+
const pageDetections = records
|
|
98
|
+
.filter((record) => record.stack?.detections?.length)
|
|
99
|
+
.map((record) => ({ url: record.url, detections: record.stack.detections }));
|
|
100
|
+
return {
|
|
101
|
+
detections: aggregateDetections(pageDetections, []),
|
|
102
|
+
tracking: aggregateTracking(records),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export function buildStackProfile(records, options = {}) {
|
|
106
|
+
const pageDetections = records
|
|
107
|
+
.filter((record) => record.stack?.detections?.length)
|
|
108
|
+
.map((record) => ({ url: record.url, detections: record.stack.detections }));
|
|
109
|
+
const originDetections = [];
|
|
110
|
+
if (options.securityHeaders) {
|
|
111
|
+
originDetections.push(...detectStackFromHeaders(options.securityHeaders.headers));
|
|
112
|
+
}
|
|
113
|
+
if (options.dns) {
|
|
114
|
+
originDetections.push(...detectStackFromDns({
|
|
115
|
+
cname: options.dns.records.cname,
|
|
116
|
+
ns: options.dns.records.ns,
|
|
117
|
+
mx: options.dns.records.mx,
|
|
118
|
+
txt: options.dns.records.txt,
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
if (options.robotsTxt?.body) {
|
|
122
|
+
originDetections.push(...detectStackFromRobots(options.robotsTxt.body));
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
detections: aggregateDetections(pageDetections, originDetections),
|
|
126
|
+
tracking: aggregateTracking(records),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function formatTrackingItem(item) {
|
|
130
|
+
const label = TRACKING_PROVIDER_LABELS[item.provider] ?? item.provider;
|
|
131
|
+
return item.id ? `${label}: \`${item.id}\`` : label;
|
|
132
|
+
}
|
|
133
|
+
export function buildStackSection(profile, totalPages) {
|
|
134
|
+
const hasDetections = profile.detections.length > 0;
|
|
135
|
+
const hasTracking = profile.tracking.tagManager.length > 0 || profile.tracking.analytics.length > 0;
|
|
136
|
+
if (!hasDetections && !hasTracking) {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
const lines = ["## Stack", ""];
|
|
140
|
+
if (hasDetections) {
|
|
141
|
+
const byCategory = new Map();
|
|
142
|
+
for (const detection of profile.detections) {
|
|
143
|
+
const category = primaryCategory(detection);
|
|
144
|
+
const list = byCategory.get(category) ?? [];
|
|
145
|
+
list.push(detection);
|
|
146
|
+
byCategory.set(category, list);
|
|
147
|
+
}
|
|
148
|
+
for (const [category, items] of [...byCategory.entries()].sort(([a], [b]) => categorySortKey(a) - categorySortKey(b))) {
|
|
149
|
+
lines.push(`### ${category}`, "");
|
|
150
|
+
for (const item of items) {
|
|
151
|
+
const scope = item.pageCount > 0
|
|
152
|
+
? item.pageCount === totalPages
|
|
153
|
+
? "site-wide"
|
|
154
|
+
: `${item.pageCount}/${totalPages} page(s)`
|
|
155
|
+
: "origin";
|
|
156
|
+
const versionSuffix = item.version ? `, v${item.version}` : "";
|
|
157
|
+
lines.push(`- **${item.name}** (${item.confidence}${versionSuffix}, ${scope})`);
|
|
158
|
+
for (const evidence of item.evidence.slice(0, 3)) {
|
|
159
|
+
lines.push(` - ${evidence}`);
|
|
160
|
+
}
|
|
161
|
+
if (item.evidence.length > 3) {
|
|
162
|
+
lines.push(` - …and ${item.evidence.length - 3} more signal(s)`);
|
|
163
|
+
}
|
|
164
|
+
if (item.website) {
|
|
165
|
+
lines.push(` - website: ${item.website}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
lines.push("");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (hasTracking) {
|
|
172
|
+
lines.push("### Tracking (flightcheck crawl)", "");
|
|
173
|
+
if (profile.tracking.tagManager.length > 0) {
|
|
174
|
+
lines.push("- Tag managers:");
|
|
175
|
+
for (const item of profile.tracking.tagManager) {
|
|
176
|
+
lines.push(` - ${formatTrackingItem(item)}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (profile.tracking.analytics.length > 0) {
|
|
180
|
+
lines.push("- Analytics & pixels:");
|
|
181
|
+
for (const item of profile.tracking.analytics) {
|
|
182
|
+
lines.push(` - ${formatTrackingItem(item)}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
lines.push("");
|
|
186
|
+
}
|
|
187
|
+
return lines;
|
|
188
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { CheckIssueSeverity } from "../checks/issues.js";
|
|
2
|
+
import { type BuildMarkdownOptions, type ReportRecord, type Tier1ReportData } from "./report.js";
|
|
3
|
+
export declare const FLIGHTCHECK_REPORT_VERSION: 1;
|
|
4
|
+
export type FindingSeverity = CheckIssueSeverity;
|
|
5
|
+
export type FindingCategory = "infra" | "seo" | "a11y" | "best-practices" | "security" | "performance";
|
|
6
|
+
export type FindingScope = "site-wide" | "template" | "page" | "origin";
|
|
7
|
+
export type ReportStackEntry = {
|
|
8
|
+
name: string;
|
|
9
|
+
categories: string[];
|
|
10
|
+
confidence: string;
|
|
11
|
+
evidence: string[];
|
|
12
|
+
pageCount?: number;
|
|
13
|
+
};
|
|
14
|
+
export type ReportFinding = {
|
|
15
|
+
id: string;
|
|
16
|
+
severity: FindingSeverity;
|
|
17
|
+
category: FindingCategory;
|
|
18
|
+
scope: FindingScope;
|
|
19
|
+
title: string;
|
|
20
|
+
message: string;
|
|
21
|
+
template?: string;
|
|
22
|
+
urls?: string[];
|
|
23
|
+
count?: number;
|
|
24
|
+
};
|
|
25
|
+
export type ReportReviewPage = {
|
|
26
|
+
url: string;
|
|
27
|
+
status: number | null;
|
|
28
|
+
reason: string;
|
|
29
|
+
};
|
|
30
|
+
export type FlightcheckReportAnalysis = {
|
|
31
|
+
pagesAnalyzed: number;
|
|
32
|
+
pagesWithIssues: number;
|
|
33
|
+
findingCounts: Record<FindingSeverity, number>;
|
|
34
|
+
stack: ReportStackEntry[];
|
|
35
|
+
templates: string[];
|
|
36
|
+
dns?: {
|
|
37
|
+
hostname: string;
|
|
38
|
+
summary: string[];
|
|
39
|
+
};
|
|
40
|
+
redirect?: {
|
|
41
|
+
url: string;
|
|
42
|
+
status: number | null;
|
|
43
|
+
location: string | null;
|
|
44
|
+
issueCount: number;
|
|
45
|
+
};
|
|
46
|
+
reviewPages: ReportReviewPage[];
|
|
47
|
+
};
|
|
48
|
+
export type FlightcheckReport = {
|
|
49
|
+
version: typeof FLIGHTCHECK_REPORT_VERSION;
|
|
50
|
+
generatedAt: string;
|
|
51
|
+
source: string;
|
|
52
|
+
redirectOnly: boolean;
|
|
53
|
+
analysis: FlightcheckReportAnalysis;
|
|
54
|
+
findings: ReportFinding[];
|
|
55
|
+
};
|
|
56
|
+
export type BuildStructuredReportOptions = BuildMarkdownOptions & {
|
|
57
|
+
generatedAt?: string;
|
|
58
|
+
};
|
|
59
|
+
export declare function buildStructuredReport(sourcePath: string, records: ReportRecord[], tier1?: Tier1ReportData, options?: BuildStructuredReportOptions): Promise<FlightcheckReport>;
|
|
60
|
+
/** Human-friendly Markdown rendered from the structured report (single source of truth). */
|
|
61
|
+
export declare function renderReportMarkdown(report: FlightcheckReport): string;
|
|
62
|
+
//# sourceMappingURL=structuredReport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structuredReport.d.ts","sourceRoot":"","sources":["../../src/analyze/structuredReport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EAEL,KAAK,oBAAoB,EAEzB,KAAK,YAAY,EACjB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,0BAA0B,EAAG,CAAU,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG,kBAAkB,CAAC;AACjD,MAAM,MAAM,eAAe,GACvB,OAAO,GACP,KAAK,GACL,MAAM,GACN,gBAAgB,GAChB,UAAU,GACV,aAAa,CAAC;AAClB,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAExE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC/C,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC9C,QAAQ,CAAC,EAAE;QACT,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW,EAAE,gBAAgB,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,OAAO,0BAA0B,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B,CAAC;AAidF,MAAM,MAAM,4BAA4B,GAAG,oBAAoB,GAAG;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,YAAY,EAAE,EACvB,KAAK,GAAE,eAAoB,EAC3B,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,iBAAiB,CAAC,CAW5B;AAgCD,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAqFtE"}
|