diff --git a/.cache/pages.d.ts b/.cache/pages.d.ts new file mode 100644 index 000000000..9b78bffa5 --- /dev/null +++ b/.cache/pages.d.ts @@ -0,0 +1,17 @@ +/** + * Type declaration for generated pages.json file + * This file is generated during the build process + */ + +type PageData = + | string + | { articles: string[] } + | { 'case-studies': string[] } + | { downloads: string[] } + | { services: string[] } + | { 'social-shares': string[] } + | { stories: string[] } + | { tags: string[] } + +declare const pagesData: PageData[] +export default pagesData diff --git a/.cache/pages.json b/.cache/pages.json new file mode 100644 index 000000000..4844728a4 --- /dev/null +++ b/.cache/pages.json @@ -0,0 +1,53 @@ +[ + "about", + { + "articles": [ + "getting-started-with-astro", + "typescript-best-practices", + "useful-vs-code-extensions", + "writing-library-code" + ] + }, + { + "case-studies": [ + "division-15", + "ecommerce-modernization", + "english-first", + "enterprise-api-platform", + "labcorp", + "us-logistics" + ] + }, + "contact", + "cookies", + { + "downloads": [ + "api-tool-consolidation-whitepaper", + "identity-security-for-dummies", + "lakehouse-analytics-guide", + "observability-benefits-guide", + "ransomware-recovery-kit" + ] + }, + "offline", + "privacy", + { + "services": ["create-custom-font-sets", "overview"] + }, + { + "social-shares": ["template"] + }, + { + "tags": [ + "apiDesign", + "cms", + "code", + "crm", + "graphql", + "online-learning", + "react", + "services", + "typescript" + ] + } +] diff --git a/.gitignore b/.gitignore index a355a51ce..f96c71ca3 100644 --- a/.gitignore +++ b/.gitignore @@ -32,8 +32,10 @@ npm-debug.log* # Optional eslint cache .eslintcache -# Cache -.cache +# Cache - ignore all contents except type declarations and placeholder data +.cache/* +!.cache/*.d.ts +!.cache/pages.json # Runtime data pids diff --git a/.husky/pre-commit b/.husky/pre-commit index 86819d136..9a1d77805 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -18,6 +18,11 @@ fi # Run TypeScript check (fast feedback on type errors) npm run check +# Run linters (fail fast on each) +npm run lint:style +npm run lint:code +npm run lint:json + # Run unit tests (fast feedback) npm run test:unit diff --git a/@types/remark-abbr.d.ts b/@types/remark-abbr.d.ts index c7e7cf3ce..a0c013eb9 100644 --- a/@types/remark-abbr.d.ts +++ b/@types/remark-abbr.d.ts @@ -1,3 +1,4 @@ +/* eslint-disable jsdoc/no-multi-asterisks */ /** * Type definitions for remark-abbr * diff --git a/@types/vitest-axe.d.ts b/@types/vitest-axe.d.ts index cd9617223..c3b6acff4 100644 --- a/@types/vitest-axe.d.ts +++ b/@types/vitest-axe.d.ts @@ -1,5 +1,5 @@ /// - +/* eslint-disable @typescript-eslint/no-empty-object-type, no-unused-vars, @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any */ import type { AxeMatchers } from 'vitest-axe/matchers' declare module 'vitest' { diff --git a/astro.config.ts b/astro.config.ts index 736d10080..8b6deae6e 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -17,11 +17,11 @@ import { import { callToActionValidator } from './src/integrations/CtaValidator/call-to-action-validator' import { serializeSitemapItem, writePagesJson } from './src/lib/config/sitemap-serialize' -// Type guard for required environment variables (only in CI) -const IS_CI = process.env['CI'] === 'true' +// Type guard for required environment variables (only in Vercel) +const IS_VERCEL = process.env['VERCEL'] const SENTRY_AUTH_TOKEN = process.env['SENTRY_AUTH_TOKEN'] -if (IS_CI && !SENTRY_AUTH_TOKEN) { - throw new Error('SENTRY_AUTH_TOKEN environment variable is required in CI but not set') +if (IS_VERCEL && !SENTRY_AUTH_TOKEN) { + throw new Error('SENTRY_AUTH_TOKEN environment variable is required in Vercel but not set') } export default defineConfig({ @@ -38,11 +38,11 @@ export default defineConfig({ callToActionValidator({ debug: true // Enable debug logging to see validation details }), - // Only include Sentry integration in CI environments - ...(IS_CI && SENTRY_AUTH_TOKEN ? [sentry({ + // Only include Sentry integration in Vercel environments + ...(IS_VERCEL ? [sentry({ project: "webstack-builders-corporate-website", org: "webstack-builders", - authToken: SENTRY_AUTH_TOKEN, + authToken: SENTRY_AUTH_TOKEN!, // Non-null assertion safe due to check above })] : []), sitemap({ lastmod: new Date(), diff --git a/axe-results-incomplete.json b/axe-results-incomplete.json index 7861c1e80..e64598465 100644 --- a/axe-results-incomplete.json +++ b/axe-results-incomplete.json @@ -31,9 +31,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - "#header" - ] + "target": ["#header"] } ], "impact": "serious", @@ -44,9 +42,7 @@ "none": [], "impact": "serious", "html": "", - "target": [ - ".lg\\:text-lg.tracking-\\[5px\\][href$=\"about\"]" - ], + "target": [".lg\\:text-lg.tracking-\\[5px\\][href$=\"about\"]"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a pseudo element" }, { @@ -62,9 +58,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - "#header" - ] + "target": ["#header"] } ], "impact": "serious", @@ -75,9 +69,7 @@ "none": [], "impact": "serious", "html": "", - "target": [ - ".lg\\:text-lg.tracking-\\[5px\\][href$=\"articles\"]" - ], + "target": [".lg\\:text-lg.tracking-\\[5px\\][href$=\"articles\"]"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a pseudo element" }, { @@ -93,9 +85,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - "#header" - ] + "target": ["#header"] } ], "impact": "serious", @@ -106,9 +96,7 @@ "none": [], "impact": "serious", "html": "", - "target": [ - ".lg\\:text-lg.tracking-\\[5px\\][href$=\"case-studies\"]" - ], + "target": [".lg\\:text-lg.tracking-\\[5px\\][href$=\"case-studies\"]"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a pseudo element" }, { @@ -124,9 +112,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - "#header" - ] + "target": ["#header"] } ], "impact": "serious", @@ -137,9 +123,7 @@ "none": [], "impact": "serious", "html": "", - "target": [ - ".lg\\:text-lg.tracking-\\[5px\\][href$=\"services\"]" - ], + "target": [".lg\\:text-lg.tracking-\\[5px\\][href$=\"services\"]"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a pseudo element" }, { @@ -155,9 +139,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - "#header" - ] + "target": ["#header"] } ], "impact": "serious", @@ -168,9 +150,7 @@ "none": [], "impact": "serious", "html": "", - "target": [ - ".lg\\:text-lg.tracking-\\[5px\\][href$=\"contact\"]" - ], + "target": [".lg\\:text-lg.tracking-\\[5px\\][href$=\"contact\"]"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a pseudo element" }, { @@ -187,9 +167,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -200,9 +178,7 @@ "none": [], "impact": "serious", "html": "", - "target": [ - ".hover\\:border-\\[var\\(--color-primary\\)\\]" - ], + "target": [".hover\\:border-\\[var\\(--color-primary\\)\\]"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it's partially obscured by another element" }, { @@ -219,9 +195,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -232,9 +206,7 @@ "none": [], "impact": "serious", "html": "

\nBuilding the Future of Software Development\n

", - "target": [ - ".max-w-3xl.mx-auto > .mb-6.md\\:text-4xl.text-3xl" - ], + "target": [".max-w-3xl.mx-auto > .mb-6.md\\:text-4xl.text-3xl"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it's partially obscured by another element" }, { @@ -251,9 +223,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -264,9 +234,7 @@ "none": [], "impact": "serious", "html": "

", - "target": [ - ".mb-8.leading-relaxed.text-\\[color\\:var\\(--color-text-offset\\)\\]" - ], + "target": [".mb-8.leading-relaxed.text-\\[color\\:var\\(--color-text-offset\\)\\]"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it's partially obscured by another element" }, { @@ -283,9 +251,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -296,9 +262,7 @@ "none": [], "impact": "serious", "html": "

\nPlatform Engineering\n

", - "target": [ - ".text-center:nth-child(1) > .text-lg.mb-2" - ], + "target": [".text-center:nth-child(1) > .text-lg.mb-2"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it's partially obscured by another element" }, { @@ -315,9 +279,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -347,9 +309,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -360,9 +320,7 @@ "none": [], "impact": "serious", "html": "

\nCloud Architecture\n

", - "target": [ - ".text-center:nth-child(2) > .text-lg.mb-2" - ], + "target": [".text-center:nth-child(2) > .text-lg.mb-2"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it's partially obscured by another element" }, { @@ -379,9 +337,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -392,9 +348,7 @@ "none": [], "impact": "serious", "html": "

\nAzure-focused solutions that scale with your business\n

", - "target": [ - ".text-center:nth-child(2) > .text-\\[color\\:var\\(--color-text-offset\\)\\]" - ], + "target": [".text-center:nth-child(2) > .text-\\[color\\:var\\(--color-text-offset\\)\\]"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it's partially obscured by another element" }, { @@ -411,9 +365,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -424,9 +376,7 @@ "none": [], "impact": "serious", "html": "

\nDeveloper Experience\n

", - "target": [ - ".text-center:nth-child(3) > .text-lg.mb-2" - ], + "target": [".text-center:nth-child(3) > .text-lg.mb-2"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it's partially obscured by another element" }, { @@ -443,9 +393,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -456,9 +404,7 @@ "none": [], "impact": "serious", "html": "

\nTools and workflows that empower development teams\n

", - "target": [ - ".text-center:nth-child(3) > .text-\\[color\\:var\\(--color-text-offset\\)\\]" - ], + "target": [".text-center:nth-child(3) > .text-\\[color\\:var\\(--color-text-offset\\)\\]"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it's partially obscured by another element" }, { @@ -475,9 +421,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -488,9 +432,7 @@ "none": [], "impact": "serious", "html": "

Featured Services

", - "target": [ - ".max-w-6xl.py-16:nth-child(3) > .mb-12 > .md\\:text-4xl.text-3xl" - ], + "target": [".max-w-6xl.py-16:nth-child(3) > .mb-12 > .md\\:text-4xl.text-3xl"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it's partially obscured by another element" }, { @@ -507,9 +449,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -539,9 +479,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -571,9 +509,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -603,9 +539,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -616,9 +550,7 @@ "none": [], "impact": "serious", "html": "
", - "target": [ - ".border-\\[color\\:var\\(--color-primary\\)\\].py-3[href$=\"articles\"]" - ], + "target": [".border-\\[color\\:var\\(--color-primary\\)\\].py-3[href$=\"articles\"]"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it's partially obscured by another element" }, { @@ -635,9 +567,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - ".md\\:py-24" - ] + "target": [".md\\:py-24"] } ], "impact": "serious", @@ -648,9 +578,7 @@ "none": [], "impact": "serious", "html": "

Ready to Transform Your Development Process?

", - "target": [ - ".lg\\:text-5xl" - ], + "target": [".lg\\:text-5xl"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a background gradient" }, { @@ -667,9 +595,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - ".md\\:py-24" - ] + "target": [".md\\:py-24"] } ], "impact": "serious", @@ -680,9 +606,7 @@ "none": [], "impact": "serious", "html": "

", - "target": [ - ".md\\:text-xl" - ], + "target": [".md\\:text-xl"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a background gradient" }, { @@ -699,9 +623,7 @@ "relatedNodes": [ { "html": "

", - "target": [ - ".md\\:py-24" - ] + "target": [".md\\:py-24"] } ], "impact": "serious", @@ -712,9 +634,7 @@ "none": [], "impact": "serious", "html": "", - "target": [ - ".border-white" - ], + "target": [".border-white"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a background gradient" }, { @@ -731,9 +651,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -744,9 +662,7 @@ "none": [], "impact": "serious", "html": "

\nTechnologies & Expertise\n

", - "target": [ - ".md\\:text-3xl.mb-8.text-2xl" - ], + "target": [".md\\:text-3xl.mb-8.text-2xl"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it's partially obscured by another element" }, { @@ -797,9 +713,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -863,9 +777,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -929,9 +841,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -995,9 +905,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -1061,9 +969,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -1127,9 +1033,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "body" - ] + "target": ["body"] } ], "impact": "serious", @@ -1165,11 +1069,9 @@ "none": [], "impact": "serious", "html": "

\nThis site uses cookies. Learn more in our Cookie Policy and Privacy Policy.\n

", - "target": [ - "#cookie-modal__content" - ], + "target": ["#cookie-modal__content"], "failureSummary": "Fix any of the following:\n Element's background color could not be determined because it partially overlaps other elements" } ] } -] \ No newline at end of file +] diff --git a/axe-results-violations.json b/axe-results-violations.json index 1f7c132b2..c6d4b83fe 100644 --- a/axe-results-violations.json +++ b/axe-results-violations.json @@ -34,9 +34,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - ".md\\:p-8" - ] + "target": [".md\\:p-8"] } ], "impact": "serious", @@ -47,9 +45,7 @@ "none": [], "impact": "serious", "html": "
\nUp to:\n
", - "target": [ - ".text-\\[var\\(--color-text-offset\\)\\].tracking-wide.mb-4" - ], + "target": [".text-\\[var\\(--color-text-offset\\)\\].tracking-wide.mb-4"], "failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.05 (foreground color: #9ca3af, background color: #e5e7eb, font size: 10.5pt (14px), font weight: normal). Expected contrast ratio of 4.5:1" }, { @@ -68,9 +64,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - ".md\\:p-8" - ] + "target": [".md\\:p-8"] } ], "impact": "serious", @@ -102,9 +96,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - ".md\\:p-8" - ] + "target": [".md\\:p-8"] } ], "impact": "serious", @@ -136,9 +128,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - ".md\\:p-8" - ] + "target": [".md\\:p-8"] } ], "impact": "serious", @@ -170,9 +160,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "a[href$=\"web-development\"]" - ] + "target": ["a[href$=\"web-development\"]"] } ], "impact": "serious", @@ -183,9 +171,7 @@ "none": [], "impact": "serious", "html": "", - "target": [ - "a[href$=\"web-development\"]" - ], + "target": ["a[href$=\"web-development\"]"], "failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.98 (foreground color: #374151, background color: #006dca, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1" }, { @@ -204,9 +190,7 @@ "relatedNodes": [ { "html": "", - "target": [ - ".hover\\:bg-\\[color\\:var\\(--color-primary-offset\\)\\]" - ] + "target": [".hover\\:bg-\\[color\\:var\\(--color-primary-offset\\)\\]"] } ], "impact": "serious", @@ -217,9 +201,7 @@ "none": [], "impact": "serious", "html": "", - "target": [ - ".hover\\:bg-\\[color\\:var\\(--color-primary-offset\\)\\]" - ], + "target": [".hover\\:bg-\\[color\\:var\\(--color-primary-offset\\)\\]"], "failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.98 (foreground color: #374151, background color: #006dca, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1" }, { @@ -238,9 +220,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - ".bg-\\[color\\:var\\(--color-bg-offset\\)\\].py-16:nth-child(5)" - ] + "target": [".bg-\\[color\\:var\\(--color-bg-offset\\)\\].py-16:nth-child(5)"] } ], "impact": "serious", @@ -340,9 +320,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "a[href$=\"division-15\"]" - ] + "target": ["a[href$=\"division-15\"]"] } ], "impact": "serious", @@ -442,9 +420,7 @@ "relatedNodes": [ { "html": "", - "target": [ - "a[href$=\"demo\"]" - ] + "target": ["a[href$=\"demo\"]"] } ], "impact": "serious", @@ -476,9 +452,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - ".bg-\\[color\\:var\\(--color-bg-offset\\)\\].py-16:nth-child(7)" - ] + "target": [".bg-\\[color\\:var\\(--color-bg-offset\\)\\].py-16:nth-child(7)"] } ], "impact": "serious", @@ -544,9 +518,7 @@ "relatedNodes": [ { "html": "
", - "target": [ - ".md\\:p-12" - ] + "target": [".md\\:p-12"] } ], "impact": "serious", @@ -557,9 +529,7 @@ "none": [], "impact": "serious", "html": "

Get the latest insights on platform engineering, cloud architecture, and developer productivity delivered to your inbox. No spam, just valuable content for technical leaders.

", - "target": [ - ".max-w-2xl.text-\\[var\\(--color-text-offset\\)\\].md\\:text-lg" - ], + "target": [".max-w-2xl.text-\\[var\\(--color-text-offset\\)\\].md\\:text-lg"], "failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.3 (foreground color: #9ca3af, background color: #f3f4f6, font size: 13.5pt (18px), font weight: normal). Expected contrast ratio of 4.5:1" }, { @@ -578,9 +548,7 @@ "relatedNodes": [ { "html": "
-