@se-studio/site-check 1.0.77 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/screaming-frog/audit.d.ts +9 -0
  3. package/dist/screaming-frog/audit.d.ts.map +1 -0
  4. package/dist/screaming-frog/audit.js +254 -0
  5. package/dist/screaming-frog/audit.js.map +1 -0
  6. package/dist/screaming-frog/compare-report.d.ts +22 -0
  7. package/dist/screaming-frog/compare-report.d.ts.map +1 -0
  8. package/dist/screaming-frog/compare-report.js +142 -0
  9. package/dist/screaming-frog/compare-report.js.map +1 -0
  10. package/dist/screaming-frog/compare.d.ts +5 -0
  11. package/dist/screaming-frog/compare.d.ts.map +1 -0
  12. package/dist/screaming-frog/compare.js +42 -0
  13. package/dist/screaming-frog/compare.js.map +1 -0
  14. package/dist/screaming-frog/crawl-state.d.ts +19 -0
  15. package/dist/screaming-frog/crawl-state.d.ts.map +1 -0
  16. package/dist/screaming-frog/crawl-state.js +30 -0
  17. package/dist/screaming-frog/crawl-state.js.map +1 -0
  18. package/dist/screaming-frog/crawl.d.ts +6 -0
  19. package/dist/screaming-frog/crawl.d.ts.map +1 -0
  20. package/dist/screaming-frog/crawl.js +76 -0
  21. package/dist/screaming-frog/crawl.js.map +1 -0
  22. package/dist/screaming-frog/csv.d.ts +6 -0
  23. package/dist/screaming-frog/csv.d.ts.map +1 -0
  24. package/dist/screaming-frog/csv.js +71 -0
  25. package/dist/screaming-frog/csv.js.map +1 -0
  26. package/dist/screaming-frog/env.d.ts +4 -0
  27. package/dist/screaming-frog/env.d.ts.map +1 -0
  28. package/dist/screaming-frog/env.js +53 -0
  29. package/dist/screaming-frog/env.js.map +1 -0
  30. package/dist/screaming-frog/index.d.ts +15 -0
  31. package/dist/screaming-frog/index.d.ts.map +1 -0
  32. package/dist/screaming-frog/index.js +15 -0
  33. package/dist/screaming-frog/index.js.map +1 -0
  34. package/dist/screaming-frog/list-crawls.d.ts +22 -0
  35. package/dist/screaming-frog/list-crawls.d.ts.map +1 -0
  36. package/dist/screaming-frog/list-crawls.js +107 -0
  37. package/dist/screaming-frog/list-crawls.js.map +1 -0
  38. package/dist/screaming-frog/load-config.d.ts +9 -0
  39. package/dist/screaming-frog/load-config.d.ts.map +1 -0
  40. package/dist/screaming-frog/load-config.js +86 -0
  41. package/dist/screaming-frog/load-config.js.map +1 -0
  42. package/dist/screaming-frog/load-profile.d.ts +9 -0
  43. package/dist/screaming-frog/load-profile.d.ts.map +1 -0
  44. package/dist/screaming-frog/load-profile.js +32 -0
  45. package/dist/screaming-frog/load-profile.js.map +1 -0
  46. package/dist/screaming-frog/paths.d.ts +5 -0
  47. package/dist/screaming-frog/paths.d.ts.map +1 -0
  48. package/dist/screaming-frog/paths.js +34 -0
  49. package/dist/screaming-frog/paths.js.map +1 -0
  50. package/dist/screaming-frog/rules.d.ts +14 -0
  51. package/dist/screaming-frog/rules.d.ts.map +1 -0
  52. package/dist/screaming-frog/rules.js +211 -0
  53. package/dist/screaming-frog/rules.js.map +1 -0
  54. package/dist/screaming-frog/sf-runner.d.ts +12 -0
  55. package/dist/screaming-frog/sf-runner.d.ts.map +1 -0
  56. package/dist/screaming-frog/sf-runner.js +37 -0
  57. package/dist/screaming-frog/sf-runner.js.map +1 -0
  58. package/dist/screaming-frog/types.d.ts +136 -0
  59. package/dist/screaming-frog/types.d.ts.map +1 -0
  60. package/dist/screaming-frog/types.js +2 -0
  61. package/dist/screaming-frog/types.js.map +1 -0
  62. package/dist/screaming-frog-cli.d.ts +4 -0
  63. package/dist/screaming-frog-cli.d.ts.map +1 -0
  64. package/dist/screaming-frog-cli.js +326 -0
  65. package/dist/screaming-frog-cli.js.map +1 -0
  66. package/package.json +1 -1
@@ -0,0 +1,14 @@
1
+ import type { ScreamingFrogIssueRule, ScreamingFrogIssueTier } from './types.js';
2
+ export declare const TIER_ORDER: ScreamingFrogIssueTier[];
3
+ export declare const TIER_LABELS: Record<ScreamingFrogIssueTier, string>;
4
+ /** Shared marketing-site rules (site-specific notes can be added via overrides). */
5
+ export declare const BASE_SCREAMING_FROG_ISSUE_RULES: ScreamingFrogIssueRule[];
6
+ export declare function mergeIssueRules(base: ScreamingFrogIssueRule[], overrides?: ScreamingFrogIssueRule[]): ScreamingFrogIssueRule[];
7
+ export declare function getIssueRulesForSite(overrides?: ScreamingFrogIssueRule[]): ScreamingFrogIssueRule[];
8
+ export declare function normalizeIssueKey(value: string): string;
9
+ export declare function classifyScreamingFrogIssue(issueName: string, rules: ScreamingFrogIssueRule[]): {
10
+ tier: ScreamingFrogIssueTier;
11
+ category: string;
12
+ note?: string;
13
+ } | null;
14
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/screaming-frog/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEjF,eAAO,MAAM,UAAU,EAAE,sBAAsB,EAAsC,CAAC;AAEtF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAM9D,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,+BAA+B,EAAE,sBAAsB,EAwKnE,CAAC;AAEF,wBAAgB,eAAe,CAC7B,IAAI,EAAE,sBAAsB,EAAE,EAC9B,SAAS,GAAE,sBAAsB,EAAO,GACvC,sBAAsB,EAAE,CAU1B;AAED,wBAAgB,oBAAoB,CAClC,SAAS,CAAC,EAAE,sBAAsB,EAAE,GACnC,sBAAsB,EAAE,CAE1B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,sBAAsB,EAAE,GAC9B;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQ1E"}
@@ -0,0 +1,211 @@
1
+ export const TIER_ORDER = ['p0', 'p1', 'p2', 'p3', 'noise'];
2
+ export const TIER_LABELS = {
3
+ p0: 'P0 — Indexing blockers',
4
+ p1: 'P1 — Should fix',
5
+ p2: 'P2 — Backlog / opportunities',
6
+ p3: 'P3 — Review (often benign)',
7
+ noise: 'Deprioritized / platform noise',
8
+ };
9
+ /** Shared marketing-site rules (site-specific notes can be added via overrides). */
10
+ export const BASE_SCREAMING_FROG_ISSUE_RULES = [
11
+ {
12
+ match: 'response_codes_internal_client_error',
13
+ tier: 'p0',
14
+ category: 'response',
15
+ note: 'Broken internal pages (404/410). Fix routes, redirects, or CMS publish state.',
16
+ },
17
+ {
18
+ match: 'response_codes_internal_server_error',
19
+ tier: 'p0',
20
+ category: 'response',
21
+ },
22
+ {
23
+ match: 'response_codes_internal_blocked_by_robots',
24
+ tier: 'p2',
25
+ category: 'indexing',
26
+ note: 'Often expected on preview/staging when robots.txt blocks crawlers. Use Ignore robots.txt in SF profile if auditing full site.',
27
+ },
28
+ {
29
+ match: 'directives_noindex',
30
+ tier: 'p1',
31
+ category: 'indexing',
32
+ note: 'Confirm intentional. Preview deployments are sitewide noindex by design.',
33
+ },
34
+ {
35
+ match: 'directives_nofollow',
36
+ tier: 'p2',
37
+ category: 'indexing',
38
+ note: 'Often paired with noindex on preview/staging.',
39
+ },
40
+ {
41
+ match: 'non_indexable_urls_in_sitemap',
42
+ tier: 'p1',
43
+ category: 'sitemap',
44
+ note: 'Sitemap lists URLs that are noindex or otherwise non-indexable.',
45
+ },
46
+ {
47
+ match: 'sitemaps_orphan_urls',
48
+ tier: 'p2',
49
+ category: 'sitemap',
50
+ },
51
+ {
52
+ match: 'sitemaps_urls_not_in_sitemap',
53
+ tier: 'p2',
54
+ category: 'sitemap',
55
+ },
56
+ {
57
+ match: 'canonicals_missing',
58
+ tier: 'p2',
59
+ category: 'canonical',
60
+ },
61
+ {
62
+ match: 'canonicals_conflicting',
63
+ tier: 'p1',
64
+ category: 'canonical',
65
+ },
66
+ {
67
+ match: 'meta_description_missing',
68
+ tier: 'p1',
69
+ category: 'metadata',
70
+ },
71
+ {
72
+ match: 'meta_description_duplicate',
73
+ tier: 'p2',
74
+ category: 'metadata',
75
+ },
76
+ {
77
+ match: 'page_titles_missing',
78
+ tier: 'p1',
79
+ category: 'metadata',
80
+ },
81
+ {
82
+ match: 'page_titles_duplicate',
83
+ tier: 'p2',
84
+ category: 'metadata',
85
+ },
86
+ {
87
+ match: 'structured_data_parse_errors',
88
+ tier: 'p1',
89
+ category: 'structured_data',
90
+ note: 'JSON-LD syntax or nested @graph issues. Cross-check rendered HTML.',
91
+ },
92
+ {
93
+ match: 'structured_data_missing',
94
+ tier: 'p1',
95
+ category: 'structured_data',
96
+ },
97
+ {
98
+ match: 'structured_data_validation_errors',
99
+ tier: 'p1',
100
+ category: 'structured_data',
101
+ note: 'Schema.org required-field failures (e.g. MedicalOrganization address, BreadcrumbList item).',
102
+ },
103
+ {
104
+ match: 'structured_data_rich_result_validation_errors',
105
+ tier: 'p1',
106
+ category: 'structured_data',
107
+ },
108
+ {
109
+ match: 'structured_data_rich_result_validation_warnings',
110
+ tier: 'p3',
111
+ category: 'structured_data',
112
+ note: 'Recommended properties only; triage after required fields are correct.',
113
+ },
114
+ {
115
+ match: 'response_codes_external_client_error',
116
+ tier: 'p2',
117
+ category: 'links',
118
+ },
119
+ {
120
+ match: 'response_codes_external_server_error',
121
+ tier: 'p2',
122
+ category: 'links',
123
+ },
124
+ {
125
+ match: 'redirects_to_error',
126
+ tier: 'p1',
127
+ category: 'redirects',
128
+ note: 'Internal links that redirect to 4xx/5xx destinations.',
129
+ },
130
+ {
131
+ match: 'redirect_chains',
132
+ tier: 'p2',
133
+ category: 'redirects',
134
+ },
135
+ {
136
+ match: 'images_missing_alt_text',
137
+ tier: 'p2',
138
+ category: 'accessibility',
139
+ note: 'Often inflated by /_next/image URLs — exclude those in SF profile.',
140
+ },
141
+ {
142
+ match: 'h1_missing',
143
+ tier: 'p2',
144
+ category: 'headings',
145
+ },
146
+ {
147
+ match: 'h1_duplicate',
148
+ tier: 'p2',
149
+ category: 'headings',
150
+ },
151
+ {
152
+ match: 'content_lorem_ipsum',
153
+ tier: 'p1',
154
+ category: 'content',
155
+ },
156
+ {
157
+ match: 'security_missing',
158
+ tier: 'noise',
159
+ category: 'security',
160
+ note: 'Platform/CDN response headers — track with infra, not page templates.',
161
+ },
162
+ {
163
+ match: 'links_internal_outlinks_with_no_anchor_text',
164
+ tier: 'noise',
165
+ category: 'links',
166
+ note: 'Icon-only nav/footer links; low SEO impact.',
167
+ },
168
+ {
169
+ match: 'url_over_115_characters',
170
+ tier: 'p3',
171
+ category: 'url',
172
+ },
173
+ {
174
+ match: 'images_over_100',
175
+ tier: 'p3',
176
+ category: 'performance',
177
+ },
178
+ ];
179
+ export function mergeIssueRules(base, overrides = []) {
180
+ if (overrides.length === 0)
181
+ return base;
182
+ const merged = [...base];
183
+ for (const override of overrides) {
184
+ const index = merged.findIndex((rule) => rule.match === override.match);
185
+ if (index >= 0)
186
+ merged[index] = { ...merged[index], ...override };
187
+ else
188
+ merged.push(override);
189
+ }
190
+ return merged;
191
+ }
192
+ export function getIssueRulesForSite(overrides) {
193
+ return mergeIssueRules(BASE_SCREAMING_FROG_ISSUE_RULES, overrides);
194
+ }
195
+ export function normalizeIssueKey(value) {
196
+ return value
197
+ .toLowerCase()
198
+ .replace(/\([^)]*\)/g, '')
199
+ .replace(/[^a-z0-9]+/g, '_')
200
+ .replace(/^_|_$/g, '');
201
+ }
202
+ export function classifyScreamingFrogIssue(issueName, rules) {
203
+ const key = normalizeIssueKey(issueName);
204
+ for (const rule of rules) {
205
+ if (key.includes(rule.match)) {
206
+ return { tier: rule.tier, category: rule.category, note: rule.note };
207
+ }
208
+ }
209
+ return null;
210
+ }
211
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/screaming-frog/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface ScreamingFrogRunResult {
2
+ stdout: string;
3
+ stderr: string;
4
+ exitCode: number;
5
+ }
6
+ export declare function runScreamingFrog(args: string[], options?: {
7
+ inherit?: boolean;
8
+ }): Promise<ScreamingFrogRunResult>;
9
+ export declare function runScreamingFrogOrThrow(args: string[], options?: {
10
+ inherit?: boolean;
11
+ }): Promise<ScreamingFrogRunResult>;
12
+ //# sourceMappingURL=sf-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sf-runner.d.ts","sourceRoot":"","sources":["../../src/screaming-frog/sf-runner.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,sBAAsB,CAAC,CA4BjC;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,sBAAsB,CAAC,CAOjC"}
@@ -0,0 +1,37 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { resolveScreamingFrogCli } from './paths.js';
3
+ export function runScreamingFrog(args, options = {}) {
4
+ const cli = resolveScreamingFrogCli();
5
+ return new Promise((resolve, reject) => {
6
+ const child = spawn(cli, args, {
7
+ stdio: options.inherit ? 'inherit' : ['ignore', 'pipe', 'pipe'],
8
+ });
9
+ let stdout = '';
10
+ let stderr = '';
11
+ if (!options.inherit) {
12
+ child.stdout?.on('data', (chunk) => {
13
+ stdout += chunk.toString();
14
+ });
15
+ child.stderr?.on('data', (chunk) => {
16
+ stderr += chunk.toString();
17
+ });
18
+ }
19
+ child.on('error', reject);
20
+ child.on('close', (code) => {
21
+ resolve({
22
+ stdout,
23
+ stderr,
24
+ exitCode: code ?? 1,
25
+ });
26
+ });
27
+ });
28
+ }
29
+ export async function runScreamingFrogOrThrow(args, options = {}) {
30
+ const result = await runScreamingFrog(args, options);
31
+ if (result.exitCode !== 0) {
32
+ const fatal = `${result.stdout}\n${result.stderr}`.match(/FATAL[^\n]*/)?.[0];
33
+ throw new Error(fatal ?? `Screaming Frog exited with code ${result.exitCode}`);
34
+ }
35
+ return result;
36
+ }
37
+ //# sourceMappingURL=sf-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sf-runner.js","sourceRoot":"","sources":["../../src/screaming-frog/sf-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAQrD,MAAM,UAAU,gBAAgB,CAC9B,IAAc,EACd,UAAiC,EAAE;IAEnC,MAAM,GAAG,GAAG,uBAAuB,EAAE,CAAC;IACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAC7B,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAChE,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACzC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACzC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,OAAO,CAAC;gBACN,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,IAAI,IAAI,CAAC;aACpB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAc,EACd,UAAiC,EAAE;IAEnC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,mCAAmC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,136 @@
1
+ export type ScreamingFrogIssueTier = 'p0' | 'p1' | 'p2' | 'p3' | 'noise';
2
+ export interface ScreamingFrogCrawlProfile {
3
+ label: string;
4
+ startUrl: string;
5
+ /** Path to .seospiderconfig (supports ~) */
6
+ configFile: string;
7
+ /** Optional env var that overrides startUrl when set in .env.local */
8
+ urlEnv?: string;
9
+ }
10
+ /** Site config loaded from the repo manifest (seo/screaming-frog.json). */
11
+ export interface ScreamingFrogSiteConfig {
12
+ site: string;
13
+ siteLabel: string;
14
+ defaultSiteUrl: string;
15
+ /** Host substring used to filter internal redirect samples */
16
+ siteHost: string;
17
+ outputMdName: string;
18
+ compareMdName?: string;
19
+ productionAuditDoc?: string;
20
+ defaultProfile?: string;
21
+ profiles: Record<string, ScreamingFrogCrawlProfile>;
22
+ /** Optional per-site issue rule overrides (merged over base rules) */
23
+ issueRuleOverrides?: ScreamingFrogIssueRule[];
24
+ }
25
+ export interface ScreamingFrogIssueRule {
26
+ /** Substring match on normalized Screaming Frog issue name */
27
+ match: string;
28
+ tier: ScreamingFrogIssueTier;
29
+ category: string;
30
+ note?: string;
31
+ }
32
+ export interface ScreamingFrogAuditConfig {
33
+ exportDir: string;
34
+ site?: ScreamingFrogSiteConfig;
35
+ siteUrl?: string;
36
+ outputMdName?: string;
37
+ /** Max sample URLs per issue in the report */
38
+ sampleLimit?: number;
39
+ issueRules?: ScreamingFrogIssueRule[];
40
+ }
41
+ export interface ScreamingFrogIssueRow {
42
+ name: string;
43
+ sfType: string;
44
+ sfPriority: string;
45
+ urlCount: number;
46
+ pctOfHtml: string;
47
+ tier: ScreamingFrogIssueTier;
48
+ category: string;
49
+ note?: string;
50
+ samples: string[];
51
+ }
52
+ export interface ScreamingFrogAuditResult {
53
+ exportDir: string;
54
+ exportDirLabel: string;
55
+ siteLabel: string;
56
+ siteUrl: string;
57
+ productionAuditDoc?: string;
58
+ crawlStarted?: string;
59
+ htmlPages: number;
60
+ internalIndexable: number;
61
+ issues: ScreamingFrogIssueRow[];
62
+ tierCounts: Record<ScreamingFrogIssueTier, number>;
63
+ tierUrlCounts: Record<ScreamingFrogIssueTier, number>;
64
+ }
65
+ export interface ScreamingFrogAuditCliOptions {
66
+ exportDir: string;
67
+ site: ScreamingFrogSiteConfig;
68
+ outDir?: string;
69
+ siteUrl?: string;
70
+ sampleLimit?: number;
71
+ }
72
+ export interface ScreamingFrogCrawlTarget {
73
+ name: string;
74
+ url: string;
75
+ configFile: string;
76
+ label?: string;
77
+ }
78
+ /** Raw JSON shape in seo/screaming-frog.json */
79
+ export interface ScreamingFrogProfileManifest {
80
+ site: string;
81
+ siteLabel: string;
82
+ siteHost: string;
83
+ defaultSiteUrl: string;
84
+ outputMdName: string;
85
+ productionAuditDoc?: string;
86
+ defaultProfile?: string;
87
+ issueRuleOverrides?: ScreamingFrogIssueRule[];
88
+ compareMdName?: string;
89
+ profiles: Record<string, {
90
+ configFile: string;
91
+ url?: string;
92
+ urlEnv?: string;
93
+ label?: string;
94
+ }>;
95
+ }
96
+ export interface ScreamingFrogCrawlResult {
97
+ exportDir: string;
98
+ crawlUrl: string;
99
+ configFile: string;
100
+ profileName: string;
101
+ siteLabel: string;
102
+ databaseId?: string;
103
+ }
104
+ export interface ScreamingFrogCompareResult {
105
+ exportDir: string;
106
+ currentDatabaseId: string;
107
+ previousDatabaseId: string;
108
+ siteLabel: string;
109
+ currentCrawl?: import('./list-crawls.js').StoredScreamingFrogCrawl;
110
+ previousCrawl?: import('./list-crawls.js').StoredScreamingFrogCrawl;
111
+ }
112
+ export interface ScreamingFrogCompareCliOptions {
113
+ currentDatabaseId: string;
114
+ previousDatabaseId: string;
115
+ siteLabel: string;
116
+ exportRoot?: string;
117
+ exportDir?: string;
118
+ exportTabs?: string[];
119
+ currentCrawl?: import('./list-crawls.js').StoredScreamingFrogCrawl;
120
+ previousCrawl?: import('./list-crawls.js').StoredScreamingFrogCrawl;
121
+ }
122
+ export interface ScreamingFrogCrawlCliOptions {
123
+ site: ScreamingFrogSiteConfig;
124
+ profile: string;
125
+ workspaceRoot: string;
126
+ exportRoot?: string;
127
+ envFile?: string;
128
+ skipCrawl?: boolean;
129
+ exportDir?: string;
130
+ }
131
+ export interface ResolvedSiteConfig {
132
+ config: ScreamingFrogSiteConfig;
133
+ workspaceRoot: string;
134
+ manifestPath: string;
135
+ }
136
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/screaming-frog/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/screaming-frog/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ /** biome-ignore-all lint/suspicious/noConsole: CLI output is intentional */
3
+ export {};
4
+ //# sourceMappingURL=screaming-frog-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screaming-frog-cli.d.ts","sourceRoot":"","sources":["../src/screaming-frog-cli.ts"],"names":[],"mappings":";AAEA,4EAA4E"}