diff --git a/scripts/check-broken-assets.ts b/scripts/check-broken-assets.ts index 1b394f2..e4dc428 100644 --- a/scripts/check-broken-assets.ts +++ b/scripts/check-broken-assets.ts @@ -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,7 +79,7 @@ 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: Error) => { consoleErrorsList.push({ type: 'PAGE_ERROR', error: err.message, @@ -163,8 +164,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; } diff --git a/scripts/check-html.ts b/scripts/check-html.ts index b2ce4ae..e00d96b 100644 --- a/scripts/check-html.ts +++ b/scripts/check-html.ts @@ -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'); diff --git a/scripts/wcag-sitemap.ts b/scripts/wcag-sitemap.ts index 1e7401a..804e514 100644 --- a/scripts/wcag-sitemap.ts +++ b/scripts/wcag-sitemap.ts @@ -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; + 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; + // 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 {