vercel-seo-audit 0.3.0 → 0.5.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/README.md +52 -15
- package/dist/cli.js +19 -3
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/utils/output.d.ts +1 -0
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +61 -0
- package/dist/utils/output.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -27,14 +27,14 @@ For a deeper dive into why Next.js sites often struggle with indexing, see:
|
|
|
27
27
|
## Quick start
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
|
-
npx vercel-seo-audit https://
|
|
30
|
+
npx vercel-seo-audit https://yusufhan.dev
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
Install globally (optional):
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
36
|
npm i -g vercel-seo-audit
|
|
37
|
-
vercel-seo-audit https://
|
|
37
|
+
vercel-seo-audit https://yusufhan.dev
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
---
|
|
@@ -67,28 +67,32 @@ SEO Audit Report for https://yusufhan.dev/
|
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
69
|
# Basic audit
|
|
70
|
-
vercel-seo-audit https://
|
|
70
|
+
vercel-seo-audit https://yusufhan.dev
|
|
71
71
|
|
|
72
72
|
# JSON output (pipe to jq, save to file, feed to CI)
|
|
73
|
-
vercel-seo-audit https://
|
|
73
|
+
vercel-seo-audit https://yusufhan.dev --json
|
|
74
74
|
|
|
75
75
|
# Verbose mode — raw HTTP details for each finding
|
|
76
|
-
vercel-seo-audit https://
|
|
76
|
+
vercel-seo-audit https://yusufhan.dev --verbose
|
|
77
77
|
|
|
78
78
|
# Custom timeout (default: 10s)
|
|
79
|
-
vercel-seo-audit https://
|
|
79
|
+
vercel-seo-audit https://yusufhan.dev --timeout 15000
|
|
80
80
|
|
|
81
81
|
# Check specific pages for redirect issues
|
|
82
|
-
vercel-seo-audit https://
|
|
82
|
+
vercel-seo-audit https://yusufhan.dev --pages /docs,/team,/careers
|
|
83
83
|
|
|
84
84
|
# Audit as Googlebot
|
|
85
|
-
vercel-seo-audit https://
|
|
85
|
+
vercel-seo-audit https://yusufhan.dev --user-agent googlebot
|
|
86
86
|
|
|
87
87
|
# Audit as Bingbot
|
|
88
|
-
vercel-seo-audit https://
|
|
88
|
+
vercel-seo-audit https://yusufhan.dev --user-agent bingbot
|
|
89
89
|
|
|
90
90
|
# Custom crawler user-agent
|
|
91
|
-
vercel-seo-audit https://
|
|
91
|
+
vercel-seo-audit https://yusufhan.dev --user-agent "Googlebot-Image/1.0"
|
|
92
|
+
|
|
93
|
+
# Write report to file (json or md)
|
|
94
|
+
vercel-seo-audit https://yusufhan.dev --report json
|
|
95
|
+
vercel-seo-audit https://yusufhan.dev --report md
|
|
92
96
|
```
|
|
93
97
|
|
|
94
98
|
---
|
|
@@ -162,12 +166,44 @@ Exit codes:
|
|
|
162
166
|
|
|
163
167
|
## CI / GitHub Actions
|
|
164
168
|
|
|
165
|
-
|
|
169
|
+
### Using the GitHub Action
|
|
170
|
+
|
|
171
|
+
```yaml
|
|
172
|
+
name: SEO Audit
|
|
173
|
+
on:
|
|
174
|
+
push:
|
|
175
|
+
branches: [main]
|
|
176
|
+
|
|
177
|
+
jobs:
|
|
178
|
+
audit:
|
|
179
|
+
runs-on: ubuntu-latest
|
|
180
|
+
steps:
|
|
181
|
+
- uses: JosephDoUrden/vercel-seo-audit@v1
|
|
182
|
+
with:
|
|
183
|
+
url: https://yusufhan.dev
|
|
184
|
+
strict: true
|
|
185
|
+
report: json
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
All inputs:
|
|
189
|
+
|
|
190
|
+
| Input | Required | Default | Description |
|
|
191
|
+
|-------|----------|---------|-------------|
|
|
192
|
+
| `url` | yes | — | URL to audit |
|
|
193
|
+
| `strict` | no | `false` | Fail on warnings too |
|
|
194
|
+
| `user-agent` | no | — | `googlebot`, `bingbot`, or custom string |
|
|
195
|
+
| `pages` | no | — | Comma-separated page paths |
|
|
196
|
+
| `report` | no | — | Write report file: `json` or `md` |
|
|
197
|
+
| `timeout` | no | `10000` | Request timeout in ms |
|
|
198
|
+
| `verbose` | no | `false` | Show detailed output |
|
|
199
|
+
|
|
200
|
+
Outputs: `exit-code`, `report-path`
|
|
201
|
+
|
|
202
|
+
### Using npx directly
|
|
166
203
|
|
|
167
204
|
```yaml
|
|
168
205
|
name: SEO Audit
|
|
169
206
|
on:
|
|
170
|
-
workflow_dispatch:
|
|
171
207
|
push:
|
|
172
208
|
branches: [main]
|
|
173
209
|
|
|
@@ -179,8 +215,9 @@ jobs:
|
|
|
179
215
|
- uses: actions/setup-node@v4
|
|
180
216
|
with:
|
|
181
217
|
node-version: 20
|
|
182
|
-
- run: npx vercel-seo-audit https://
|
|
218
|
+
- run: npx vercel-seo-audit https://yusufhan.dev --json
|
|
183
219
|
```
|
|
220
|
+
|
|
184
221
|
>[!TIP]
|
|
185
222
|
>If you want warnings to fail CI too, add a `--strict` or `-S` flag.
|
|
186
223
|
|
|
@@ -191,8 +228,8 @@ jobs:
|
|
|
191
228
|
* [x] ~~`--strict` (warnings fail with exit code 1)~~
|
|
192
229
|
* [x] ~~`--pages` to customize sampled paths (`/about,/pricing`)~~
|
|
193
230
|
* [x] ~~`--user-agent` presets (`googlebot`, `bingbot`)~~
|
|
194
|
-
* [
|
|
195
|
-
* [
|
|
231
|
+
* [x] ~~`--report` to write `report.json` / `report.md`~~
|
|
232
|
+
* [x] ~~GitHub Action marketplace wrapper~~
|
|
196
233
|
|
|
197
234
|
---
|
|
198
235
|
|
package/dist/cli.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { writeFileSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
1
3
|
import { Command } from 'commander';
|
|
2
4
|
import { runAudit } from './runner.js';
|
|
3
|
-
import { formatReport, formatJson } from './utils/output.js';
|
|
5
|
+
import { formatReport, formatJson, formatMarkdown } from './utils/output.js';
|
|
4
6
|
import { getExitCode } from './exitCode.js';
|
|
5
7
|
import { parsePagesFlag } from './utils/parsePagesFlag.js';
|
|
6
8
|
import { USER_AGENT_PRESETS } from './constants.js';
|
|
@@ -8,14 +10,15 @@ const program = new Command();
|
|
|
8
10
|
program
|
|
9
11
|
.name('vercel-seo-audit')
|
|
10
12
|
.description('Diagnose SEO and indexing issues for Next.js/Vercel websites')
|
|
11
|
-
.version('0.
|
|
12
|
-
.argument('<url>', 'URL to audit (e.g. https://
|
|
13
|
+
.version('0.5.0')
|
|
14
|
+
.argument('<url>', 'URL to audit (e.g. https://yusufhan.dev)')
|
|
13
15
|
.option('--json', 'Output results as JSON')
|
|
14
16
|
.option('--verbose', 'Show detailed information for each finding')
|
|
15
17
|
.option('-S, --strict', 'Fail on any SEO issues found, including warnings')
|
|
16
18
|
.option('--timeout <ms>', 'Request timeout in milliseconds', '10000')
|
|
17
19
|
.option('--pages <paths>', 'Comma-separated page paths to check for redirects (e.g. /about,/pricing)')
|
|
18
20
|
.option('--user-agent <preset|string>', 'User-Agent for requests: googlebot, bingbot, or a custom string')
|
|
21
|
+
.option('--report <format>', 'Write report to file: json or md')
|
|
19
22
|
.action(async (url, options) => {
|
|
20
23
|
const timeout = parseInt(options.timeout, 10);
|
|
21
24
|
if (isNaN(timeout) || timeout <= 0) {
|
|
@@ -41,6 +44,11 @@ program
|
|
|
41
44
|
process.exit(2);
|
|
42
45
|
}
|
|
43
46
|
}
|
|
47
|
+
// Validate --report format
|
|
48
|
+
if (options.report && options.report !== 'json' && options.report !== 'md') {
|
|
49
|
+
console.error('Error: --report must be "json" or "md"');
|
|
50
|
+
process.exit(2);
|
|
51
|
+
}
|
|
44
52
|
// Resolve user-agent preset or custom string
|
|
45
53
|
let userAgent;
|
|
46
54
|
if (options.userAgent) {
|
|
@@ -60,6 +68,14 @@ program
|
|
|
60
68
|
else {
|
|
61
69
|
console.log(formatReport(report, options.verbose ?? false));
|
|
62
70
|
}
|
|
71
|
+
// Write report file if requested
|
|
72
|
+
if (options.report) {
|
|
73
|
+
const fileName = options.report === 'json' ? 'report.json' : 'report.md';
|
|
74
|
+
const content = options.report === 'json' ? formatJson(report) : formatMarkdown(report);
|
|
75
|
+
const filePath = resolve(process.cwd(), fileName);
|
|
76
|
+
writeFileSync(filePath, content, 'utf-8');
|
|
77
|
+
console.log(`\nReport written to ${fileName}`);
|
|
78
|
+
}
|
|
63
79
|
// Exit code based on findings
|
|
64
80
|
const code = getExitCode(report.summary, options.strict ?? false);
|
|
65
81
|
if (code !== 0 && options.strict && report.summary.warnings > 0) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const DEFAULT_TIMEOUT = 10000;
|
|
2
2
|
export declare const MAX_REDIRECTS = 20;
|
|
3
|
-
export declare const USER_AGENT = "vercel-seo-audit/0.
|
|
3
|
+
export declare const USER_AGENT = "vercel-seo-audit/0.5.0";
|
|
4
4
|
export declare const SITEMAP_SAMPLE_SIZE = 10;
|
|
5
5
|
export declare const COMMON_PAGES: string[];
|
|
6
6
|
export declare const USER_AGENT_PRESETS: Record<string, string>;
|
package/dist/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export const DEFAULT_TIMEOUT = 10_000;
|
|
2
2
|
export const MAX_REDIRECTS = 20;
|
|
3
|
-
export const USER_AGENT = 'vercel-seo-audit/0.
|
|
3
|
+
export const USER_AGENT = 'vercel-seo-audit/0.5.0';
|
|
4
4
|
export const SITEMAP_SAMPLE_SIZE = 10;
|
|
5
5
|
export const COMMON_PAGES = ['/about', '/contact', '/blog', '/pricing'];
|
|
6
6
|
export const USER_AGENT_PRESETS = {
|
package/dist/utils/output.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AuditReport } from '../types.js';
|
|
2
2
|
export declare function formatReport(report: AuditReport, verbose: boolean): string;
|
|
3
3
|
export declare function formatJson(report: AuditReport): string;
|
|
4
|
+
export declare function formatMarkdown(report: AuditReport): string;
|
|
4
5
|
//# sourceMappingURL=output.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,WAAW,EAAiB,MAAM,aAAa,CAAC;AAoC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CA0C1E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEtD"}
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,WAAW,EAAiB,MAAM,aAAa,CAAC;AAoC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CA0C1E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEtD;AAwBD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA6C1D"}
|
package/dist/utils/output.js
CHANGED
|
@@ -69,4 +69,65 @@ export function formatReport(report, verbose) {
|
|
|
69
69
|
export function formatJson(report) {
|
|
70
70
|
return JSON.stringify(report, null, 2);
|
|
71
71
|
}
|
|
72
|
+
const severityMdIcons = {
|
|
73
|
+
error: '❌',
|
|
74
|
+
warning: '⚠️',
|
|
75
|
+
info: 'ℹ️',
|
|
76
|
+
pass: '✅',
|
|
77
|
+
};
|
|
78
|
+
function formatFindingMd(finding) {
|
|
79
|
+
const icon = severityMdIcons[finding.severity];
|
|
80
|
+
const lines = [];
|
|
81
|
+
lines.push(`- ${icon} **[${finding.severity.toUpperCase()}]** ${finding.message}`);
|
|
82
|
+
lines.push(` - ${finding.explanation}`);
|
|
83
|
+
lines.push(` - **Fix:** ${finding.suggestion}`);
|
|
84
|
+
if (finding.url) {
|
|
85
|
+
lines.push(` - URL: \`${finding.url}\``);
|
|
86
|
+
}
|
|
87
|
+
return lines.join('\n');
|
|
88
|
+
}
|
|
89
|
+
export function formatMarkdown(report) {
|
|
90
|
+
const lines = [];
|
|
91
|
+
lines.push(`# SEO Audit Report for ${report.url}`);
|
|
92
|
+
lines.push('');
|
|
93
|
+
lines.push(`> Completed in ${report.duration}ms at ${report.timestamp}`);
|
|
94
|
+
lines.push('');
|
|
95
|
+
// Summary
|
|
96
|
+
const { errors, warnings, info, passed } = report.summary;
|
|
97
|
+
lines.push('## Summary');
|
|
98
|
+
lines.push('');
|
|
99
|
+
lines.push('| Severity | Count |');
|
|
100
|
+
lines.push('|----------|-------|');
|
|
101
|
+
if (errors > 0)
|
|
102
|
+
lines.push(`| ❌ Errors | ${errors} |`);
|
|
103
|
+
if (warnings > 0)
|
|
104
|
+
lines.push(`| ⚠️ Warnings | ${warnings} |`);
|
|
105
|
+
if (info > 0)
|
|
106
|
+
lines.push(`| ℹ️ Info | ${info} |`);
|
|
107
|
+
if (passed > 0)
|
|
108
|
+
lines.push(`| ✅ Passed | ${passed} |`);
|
|
109
|
+
lines.push('');
|
|
110
|
+
// Group findings by category
|
|
111
|
+
const allFindings = report.modules.flatMap((m) => m.findings);
|
|
112
|
+
const categories = new Map();
|
|
113
|
+
for (const finding of allFindings) {
|
|
114
|
+
const cat = finding.category;
|
|
115
|
+
if (!categories.has(cat))
|
|
116
|
+
categories.set(cat, []);
|
|
117
|
+
categories.get(cat).push(finding);
|
|
118
|
+
}
|
|
119
|
+
for (const [category, findings] of categories) {
|
|
120
|
+
lines.push(`## ${category.charAt(0).toUpperCase() + category.slice(1)}`);
|
|
121
|
+
lines.push('');
|
|
122
|
+
for (const finding of findings) {
|
|
123
|
+
lines.push(formatFindingMd(finding));
|
|
124
|
+
}
|
|
125
|
+
lines.push('');
|
|
126
|
+
}
|
|
127
|
+
if (allFindings.length === 0) {
|
|
128
|
+
lines.push('**No issues found!**');
|
|
129
|
+
lines.push('');
|
|
130
|
+
}
|
|
131
|
+
return lines.join('\n');
|
|
132
|
+
}
|
|
72
133
|
//# sourceMappingURL=output.js.map
|
package/dist/utils/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
|