Compare commits
4 Commits
bb5828cbfc
...
785e36af08
| Author | SHA1 | Date | |
|---|---|---|---|
| 785e36af08 | |||
| d4c32476d6 | |||
| 9b9d4634dd | |||
| c9e48cd5a4 |
@@ -2,7 +2,7 @@ import { Download } from "lucide-react";
|
||||
import fs from "fs";
|
||||
import path from "path";
|
||||
|
||||
export default function AGB() {
|
||||
export default function AVB() {
|
||||
const filePath = path.join(process.cwd(), "context/avbs.md");
|
||||
const fileContent = fs.readFileSync(filePath, "utf8");
|
||||
|
||||
|
||||
@@ -246,7 +246,7 @@ const Layout = ({ children }: { children: React.ReactNode }) => {
|
||||
href="/agb"
|
||||
className="hover:text-accent transition-colors"
|
||||
>
|
||||
{t("footer.agb")}
|
||||
{t("footer.avb")}
|
||||
</Link>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
"legal": "Rechtliches",
|
||||
"impressum": "Impressum",
|
||||
"datenschutz": "Datenschutz",
|
||||
"agb": "AVB",
|
||||
"avb": "AVB",
|
||||
"rights": "Alle Rechte vorbehalten.",
|
||||
"madeWith": "Entwickelt mit",
|
||||
"precision": "Präzision",
|
||||
|
||||
@@ -47,8 +47,9 @@ async function main() {
|
||||
const others = urls.filter((u) => !homeEN.includes(u) && !homeDE.includes(u));
|
||||
urls = [...homeDE, ...homeEN, ...others.slice(0, limit - (homeEN.length + homeDE.length))];
|
||||
}
|
||||
} catch (err: any) {
|
||||
console.error(`❌ Failed to fetch sitemap: ${err.message}`);
|
||||
} catch (err: unknown) {
|
||||
const errorBody = err instanceof Error ? err.message : String(err);
|
||||
console.error(`❌ Failed to fetch sitemap: ${errorBody}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
@@ -78,10 +79,11 @@ async function main() {
|
||||
const consoleErrorsList: Array<{ type: string; error: string; page: string }> = [];
|
||||
|
||||
// Listen for unhandled exceptions natively in the page
|
||||
page.on('pageerror', (err: any) => {
|
||||
page.on('pageerror', (err: unknown) => {
|
||||
const errorMessage = err instanceof Error ? err.message : String(err);
|
||||
consoleErrorsList.push({
|
||||
type: 'PAGE_ERROR',
|
||||
error: err.message,
|
||||
error: errorMessage,
|
||||
page: page.url(),
|
||||
});
|
||||
hasConsoleErrors = true;
|
||||
@@ -163,8 +165,9 @@ async function main() {
|
||||
|
||||
// Wait a tiny bit more for final lazy loads
|
||||
await new Promise((r) => setTimeout(r, 1000));
|
||||
} catch (err: any) {
|
||||
console.error(`⚠️ Timeout or navigation error on ${u}: ${err.message}`);
|
||||
} catch (err: unknown) {
|
||||
const errorBody = err instanceof Error ? err.message : String(err);
|
||||
console.error(`⚠️ Timeout or navigation error on ${u}: ${errorBody}`);
|
||||
// Don't fail the whole script just because one page timed out, but flag it
|
||||
hasBrokenAssets = true;
|
||||
}
|
||||
|
||||
@@ -57,9 +57,10 @@ async function main() {
|
||||
const filename = `${safePath || 'index'}.html`;
|
||||
|
||||
fs.writeFileSync(path.join(outputDir, filename), res.data);
|
||||
} catch (err: any) {
|
||||
console.error(`❌ HTTP Error fetching ${u}: ${err.message}`);
|
||||
throw new Error(`Failed to fetch page: ${u} - ${err.message}`);
|
||||
} catch (err: unknown) {
|
||||
const errorBody = err instanceof Error ? err.message : String(err);
|
||||
console.error(`❌ HTTP Error fetching ${u}: ${errorBody}`);
|
||||
throw new Error(`Failed to fetch page: ${u} - ${errorBody}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,12 +68,13 @@ async function main() {
|
||||
try {
|
||||
execSync(`npx html-validate .htmlvalidate-tmp/*.html`, { stdio: 'inherit' });
|
||||
console.log(`✅ HTML Validation passed perfectly!`);
|
||||
} catch (e) {
|
||||
} catch {
|
||||
console.error(`❌ HTML Validation found issues.`);
|
||||
process.exit(1);
|
||||
}
|
||||
} catch (error: any) {
|
||||
console.error(`\n❌ Error during HTML Validation:`, error.message);
|
||||
} catch (error: unknown) {
|
||||
const errorBody = error instanceof Error ? error.message : String(error);
|
||||
console.error(`\n❌ Error during HTML Validation:`, errorBody);
|
||||
process.exit(1);
|
||||
} finally {
|
||||
const outputDir = path.join(process.cwd(), '.htmlvalidate-tmp');
|
||||
|
||||
@@ -3,6 +3,30 @@ import * as cheerio from 'cheerio';
|
||||
import { execSync } from 'child_process';
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import { AxiosError } from 'axios';
|
||||
|
||||
interface Pa11yConfig {
|
||||
defaults: {
|
||||
threshold?: number;
|
||||
runners?: string[];
|
||||
ignore?: string[];
|
||||
chromeLaunchConfig?: {
|
||||
executablePath?: string;
|
||||
args?: string[];
|
||||
};
|
||||
headers?: Record<string, string>;
|
||||
timeout?: number;
|
||||
};
|
||||
urls?: string[];
|
||||
}
|
||||
|
||||
interface Pa11yResult {
|
||||
type?: string;
|
||||
message?: string;
|
||||
code?: string;
|
||||
context?: string;
|
||||
selector?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* WCAG Audit Script
|
||||
@@ -65,14 +89,15 @@ async function main() {
|
||||
|
||||
// 2. Prepare pa11y-ci config
|
||||
const baseConfigPath = path.join(process.cwd(), '.pa11yci.json');
|
||||
let baseConfig: any = { defaults: {} };
|
||||
let baseConfig: Pa11yConfig = { defaults: {} };
|
||||
if (fs.existsSync(baseConfigPath)) {
|
||||
baseConfig = JSON.parse(fs.readFileSync(baseConfigPath, 'utf8'));
|
||||
}
|
||||
|
||||
// Extract domain for cookie
|
||||
const urlObj = new URL(targetUrl);
|
||||
const domain = urlObj.hostname;
|
||||
// Extract domain for cookie (not currently used)
|
||||
// const urlObj = new URL(targetUrl);
|
||||
// domain is not used, so remove or keep if needed later? Linter says unused.
|
||||
// const domain = urlObj.hostname;
|
||||
|
||||
// Update config with discovered URLs and gatekeeper cookie
|
||||
const tempConfig = {
|
||||
@@ -118,7 +143,7 @@ async function main() {
|
||||
encoding: 'utf8',
|
||||
stdio: 'inherit',
|
||||
});
|
||||
} catch (err: any) {
|
||||
} catch {
|
||||
// pa11y-ci exits with non-zero if issues are found, which is expected
|
||||
}
|
||||
|
||||
@@ -136,10 +161,10 @@ async function main() {
|
||||
|
||||
if (Array.isArray(results)) {
|
||||
// pa11y action execution errors come as objects with a message but no type
|
||||
const actionErrors = results.filter((r: any) => !r.type && r.message).length;
|
||||
errors = results.filter((r: any) => r.type === 'error').length + actionErrors;
|
||||
warnings = results.filter((r: any) => r.type === 'warning').length;
|
||||
notices = results.filter((r: any) => r.type === 'notice').length;
|
||||
const actionErrors = results.filter((r: Pa11yResult) => !r.type && r.message).length;
|
||||
errors = results.filter((r: Pa11yResult) => r.type === 'error').length + actionErrors;
|
||||
warnings = results.filter((r: Pa11yResult) => r.type === 'warning').length;
|
||||
notices = results.filter((r: Pa11yResult) => r.type === 'notice').length;
|
||||
}
|
||||
|
||||
// Clean URL for display
|
||||
@@ -168,13 +193,14 @@ async function main() {
|
||||
}
|
||||
|
||||
console.log(`\n✨ WCAG Audit completed!`);
|
||||
} catch (error: any) {
|
||||
} catch (error: unknown) {
|
||||
console.error(`\n❌ Error during WCAG Audit:`);
|
||||
if (axios.isAxiosError(error)) {
|
||||
if (error instanceof AxiosError) {
|
||||
console.error(`Status: ${error.response?.status}`);
|
||||
console.error(`URL: ${error.config?.url}`);
|
||||
} else {
|
||||
console.error(error.message);
|
||||
const errorBody = error instanceof Error ? error.message : String(error);
|
||||
console.error(errorBody);
|
||||
}
|
||||
process.exit(1);
|
||||
} finally {
|
||||
|
||||
Reference in New Issue
Block a user