From ce558ad51bf2d465587062bcc23cd8b917f681c3 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Mon, 12 Jan 2026 02:09:30 +0100 Subject: [PATCH] website refactor --- .../guardrails/ArchitectureGuardrails.ts | 16 +- .../tests/guardrails/allowed-violations.ts | 155 +----------------- 2 files changed, 12 insertions(+), 159 deletions(-) diff --git a/apps/website/tests/guardrails/ArchitectureGuardrails.ts b/apps/website/tests/guardrails/ArchitectureGuardrails.ts index 3e8d8fa35..709ddaadf 100644 --- a/apps/website/tests/guardrails/ArchitectureGuardrails.ts +++ b/apps/website/tests/guardrails/ArchitectureGuardrails.ts @@ -115,7 +115,7 @@ export class ArchitectureGuardrails { this.checkLocalHelpers(filePath, content); this.checkObjectConstruction(filePath, content); this.checkContainerManagerCalls(filePath, content); - this.checkNoTemplatesInApp(filePath, content); + this.checkNoTemplatesInApp(filePath); } // Rule 5: Forbid client-side write fetch @@ -138,7 +138,7 @@ export class ArchitectureGuardrails { this.checkGeneratedDTOImport(filePath, content); // Rule 11: Filename rules for app directory - this.checkAppFilenameRules(filePath, content); + this.checkAppFilenameRules(filePath); } private scanPageQueryDirectory(filePath: string, content: string): void { @@ -174,7 +174,7 @@ export class ArchitectureGuardrails { this.checkGeneratedDTOImport(filePath, content); // Rule 11: Filename rules for page queries - this.checkPageQueryFilenameRules(filePath, content); + this.checkPageQueryFilenameRules(filePath); } private scanTemplateDirectory(filePath: string, content: string): void { @@ -198,7 +198,7 @@ export class ArchitectureGuardrails { this.checkGeneratedDTOImport(filePath, content); // Rule 11: Filename rules for templates - this.checkTemplateFilenameRules(filePath, content); + this.checkTemplateFilenameRules(filePath); } private scanServiceDirectory(filePath: string, content: string): void { @@ -554,7 +554,7 @@ export class ArchitectureGuardrails { }); } - private checkNoTemplatesInApp(filePath: string, content: string): void { + private checkNoTemplatesInApp(filePath: string): void { if (filePath.includes('/app/') && filePath.includes('Template.tsx')) { this.addViolation( 'no-templates-in-app', @@ -695,7 +695,7 @@ export class ArchitectureGuardrails { }); } - private checkTemplateFilenameRules(filePath: string, content: string): void { + private checkTemplateFilenameRules(filePath: string): void { if (filePath.includes('/templates/') && !filePath.endsWith('Template.tsx')) { this.addViolation( 'invalid-template-filename', @@ -778,7 +778,7 @@ export class ArchitectureGuardrails { }); } - private checkPageQueryFilenameRules(filePath: string, content: string): void { + private checkPageQueryFilenameRules(filePath: string): void { if (filePath.includes('/page-queries/') && !filePath.endsWith('PageQuery.ts')) { this.addViolation( 'invalid-page-query-filename', @@ -1023,7 +1023,7 @@ export class ArchitectureGuardrails { // VIOLATION CHECKS - FILENAME RULES // ============================================================================ - private checkAppFilenameRules(filePath: string, content: string): void { + private checkAppFilenameRules(filePath: string): void { if (!filePath.includes('/app/')) return; // Allowed extensions under app/ diff --git a/apps/website/tests/guardrails/allowed-violations.ts b/apps/website/tests/guardrails/allowed-violations.ts index 9d3620743..0dcb6c593 100644 --- a/apps/website/tests/guardrails/allowed-violations.ts +++ b/apps/website/tests/guardrails/allowed-violations.ts @@ -13,166 +13,19 @@ export interface GuardrailAllowlist { export const ALLOWED_VIOLATIONS: GuardrailAllowlist = { // Rule 1: ContainerManager usage in server page queries - 'no-container-manager-in-server': [ - 'apps/website/lib/page-queries/page-queries/ProfilePageQuery.ts', - 'apps/website/lib/page-queries/page-queries/TeamDetailPageQuery.ts', - 'apps/website/lib/page-queries/page-queries/TeamsPageQuery.ts', - ], + 'no-container-manager-in-server': [], // Rule 2: PageDataFetcher.fetch() usage in server page queries 'no-page-data-fetcher-fetch-in-server': [], // Rule 3: ViewModels imported in forbidden paths - 'no-view-models-in-server': [ - 'apps/website/lib/page-queries/page-queries/ProfilePageQuery.ts', - 'apps/website/lib/page-queries/page-queries/TeamDetailPageQuery.ts', - 'apps/website/lib/page-queries/page-queries/TeamsPageQuery.ts', - 'apps/website/app/leaderboards/drivers/page.tsx', - 'apps/website/app/leaderboards/page.tsx', - 'apps/website/app/leagues/[id]/page.tsx', - 'apps/website/app/leagues/[id]/rulebook/page.tsx', - 'apps/website/app/leagues/[id]/schedule/page.tsx', - 'apps/website/app/leagues/[id]/standings/page.tsx', - 'apps/website/app/leagues/[id]/stewarding/protests/[protestId]/page.tsx', - 'apps/website/app/profile/page.tsx', - 'apps/website/app/races/[id]/page.tsx', - 'apps/website/app/races/[id]/results/page.tsx', - 'apps/website/app/races/[id]/stewarding/page.tsx', - 'apps/website/app/sponsor/leagues/page.tsx', - 'apps/website/app/teams/leaderboard/page.tsx', - 'apps/website/lib/services/analytics/DashboardService.ts', - 'apps/website/lib/services/auth/SessionService.ts', - 'apps/website/lib/services/drivers/DriverService.ts', - 'apps/website/lib/services/landing/LandingService.test.ts', - 'apps/website/lib/services/landing/LandingService.ts', - 'apps/website/lib/services/leagues/LeagueMembershipService.ts', - 'apps/website/lib/services/leagues/LeagueSettingsService.test.ts', - 'apps/website/lib/services/leagues/LeagueSettingsService.ts', - 'apps/website/lib/services/leagues/LeagueWalletService.test.ts', - 'apps/website/lib/services/media/AvatarService.ts', - 'apps/website/lib/services/media/MediaService.ts', - 'apps/website/lib/services/onboarding/OnboardingService.ts', - 'apps/website/lib/services/payments/MembershipFeeService.ts', - 'apps/website/lib/services/payments/PaymentService.ts', - 'apps/website/lib/services/payments/WalletService.ts', - 'apps/website/lib/services/teams/TeamJoinService.ts', - 'apps/website/lib/services/teams/TeamService.ts', - ], + 'no-view-models-in-server': [], // Rule 4: Templates importing view-models or display-objects - 'no-view-models-in-templates': [ - 'apps/website/templates/DriverProfileTemplate.tsx', - 'apps/website/templates/DriverRankingsTemplate.tsx', - 'apps/website/templates/DriversTemplate.tsx', - 'apps/website/templates/LeaderboardsTemplate.tsx', - 'apps/website/templates/LeagueAdminScheduleTemplate.tsx', - 'apps/website/templates/LeagueDetailTemplate.tsx', - 'apps/website/templates/LeagueRulebookTemplate.tsx', - 'apps/website/templates/LeagueScheduleTemplate.tsx', - 'apps/website/templates/LeagueStandingsTemplate.tsx', - 'apps/website/templates/LeaguesTemplate.tsx', - 'apps/website/templates/TeamLeaderboardTemplate.tsx', - ], + 'no-view-models-in-templates': [], // Rule 5: Intl.* or toLocale* in presentation paths - 'no-intl-in-presentation': [ - 'apps/website/app/leagues/[id]/stewarding/protests/[protestId]/page.tsx', - 'apps/website/app/profile/liveries/page.tsx', - 'apps/website/app/profile/page.tsx', - 'apps/website/app/sponsor/campaigns/page.tsx', - 'apps/website/templates/DriverProfileTemplate.tsx', - 'apps/website/templates/DriverRankingsTemplate.tsx', - 'apps/website/templates/DriversTemplate.tsx', - 'apps/website/templates/LeagueDetailTemplate.tsx', - 'apps/website/templates/LeagueScheduleTemplate.tsx', - 'apps/website/templates/RaceDetailTemplate.tsx', - 'apps/website/templates/RaceResultsTemplate.tsx', - 'apps/website/templates/RaceStewardingTemplate.tsx', - 'apps/website/templates/RacesAllTemplate.tsx', - 'apps/website/templates/RacesTemplate.tsx', - 'apps/website/templates/SponsorLeagueDetailTemplate.tsx', - 'apps/website/templates/TeamDetailTemplate.tsx', - 'apps/website/templates/TeamLeaderboardTemplate.tsx', - 'apps/website/lib/view-models/view-models/ActivityItemViewModel.ts', - 'apps/website/lib/view-models/view-models/AdminUserViewModel.ts', - 'apps/website/lib/view-models/view-models/AnalyticsMetricsViewModel.ts', - 'apps/website/lib/view-models/view-models/BillingViewModel.ts', - 'apps/website/lib/view-models/view-models/LeagueDetailViewModel.ts', - 'apps/website/lib/view-models/view-models/LeagueJoinRequestViewModel.ts', - 'apps/website/lib/view-models/view-models/LeagueMemberViewModel.ts', - 'apps/website/lib/view-models/view-models/LeagueStatsViewModel.ts', - 'apps/website/lib/view-models/view-models/MembershipFeeViewModel.ts', - 'apps/website/lib/view-models/view-models/PaymentViewModel.ts', - 'apps/website/lib/view-models/view-models/PrizeViewModel.ts', - 'apps/website/lib/view-models/view-models/ProtestViewModel.ts', - 'apps/website/lib/view-models/view-models/RaceDetailViewModel.ts', - 'apps/website/lib/view-models/view-models/RaceListItemViewModel.ts', - 'apps/website/lib/view-models/view-models/RaceStatsViewModel.ts', - 'apps/website/lib/view-models/view-models/RaceViewModel.ts', - 'apps/website/lib/view-models/view-models/RenewalAlertViewModel.ts', - 'apps/website/lib/view-models/view-models/SponsorDashboardViewModel.ts', - 'apps/website/lib/view-models/view-models/SponsorSponsorshipsViewModel.ts', - 'apps/website/lib/view-models/view-models/SponsorshipDetailViewModel.ts', - 'apps/website/lib/view-models/view-models/SponsorshipPricingViewModel.ts', - 'apps/website/lib/view-models/view-models/SponsorshipRequestViewModel.ts', - 'apps/website/lib/view-models/view-models/SponsorshipViewModel.ts', - 'apps/website/lib/view-models/view-models/TeamJoinRequestViewModel.ts', - 'apps/website/lib/view-models/view-models/TeamMemberViewModel.ts', - 'apps/website/lib/view-models/view-models/UpcomingRaceCardViewModel.ts', - 'apps/website/lib/view-models/view-models/WalletTransactionViewModel.ts', - 'apps/website/lib/display-objects/DashboardDisplay.ts', - 'apps/website/lib/display-objects/ProfileDisplay.ts', - 'apps/website/components/DriverTopThreePodium.tsx', - 'apps/website/components/achievements/AchievementCard.tsx', - 'apps/website/components/dashboard/UpcomingRaceItem.tsx', - 'apps/website/components/dev/sections/APIStatusSection.tsx', - 'apps/website/components/dev/sections/ReplaySection.tsx', - 'apps/website/components/drivers/CareerHighlights.tsx', - 'apps/website/components/drivers/FeaturedDriverCard.tsx', - 'apps/website/components/drivers/HeroSection.tsx', - 'apps/website/components/drivers/LeaderboardPreview.tsx', - 'apps/website/components/errors/DevErrorPanel.tsx', - 'apps/website/components/errors/EnhancedErrorBoundary.tsx', - 'apps/website/components/errors/ErrorAnalyticsDashboard.tsx', - 'apps/website/components/leaderboards/DriverLeaderboardPreview.tsx', - 'apps/website/components/leagues/LeagueActivityFeed.tsx', - 'apps/website/components/leagues/LeagueMembers.tsx', - 'apps/website/components/leagues/LeagueReviewSummary.tsx', - 'apps/website/components/leagues/LeagueSchedule.tsx', - 'apps/website/components/leagues/PenaltyHistoryList.tsx', - 'apps/website/components/leagues/PendingProtestsList.tsx', - 'apps/website/components/leagues/QuickPenaltyModal.tsx', - 'apps/website/components/leagues/ReadonlyLeagueInfo.tsx', - 'apps/website/components/leagues/ReviewProtestModal.tsx', - 'apps/website/components/notifications/ModalNotification.tsx', - 'apps/website/components/notifications/NotificationCenter.tsx', - 'apps/website/components/profile/LiveryCard.tsx', - 'apps/website/components/races/LatestResultsSidebar.tsx', - 'apps/website/components/races/RaceResultCard.tsx', - 'apps/website/components/races/RaceResultsHeader.tsx', - 'apps/website/components/races/UpcomingRacesSidebar.tsx', - 'apps/website/components/sponsors/MetricCard.tsx', - 'apps/website/components/sponsors/PendingSponsorshipRequests.tsx', - 'apps/website/components/sponsors/SponsorInsightsCard.tsx', - 'apps/website/components/sponsors/SponsorshipCategoryCard.tsx', - 'apps/website/components/teams/TeamAdmin.tsx', - 'apps/website/components/teams/TeamCard.tsx', - 'apps/website/components/teams/TeamLeaderboardPreview.tsx', - 'apps/website/components/teams/TeamMembershipCard.tsx', - 'apps/website/components/teams/TeamRoster.tsx', - 'apps/website/lib/utilities/time.ts', - // Additional Intl violations in test files (old location) - 'apps/website/lib/view-models/ActivityItemViewModel.test.ts', - 'apps/website/lib/view-models/AnalyticsMetricsViewModel.test.ts', - 'apps/website/lib/view-models/BillingViewModel.test.ts', - 'apps/website/lib/view-models/LeagueDetailViewModel.test.ts', - 'apps/website/lib/view-models/LeagueStatsViewModel.test.ts', - 'apps/website/lib/view-models/RaceStatsViewModel.test.ts', - 'apps/website/lib/view-models/SponsorDashboardViewModel.test.ts', - 'apps/website/lib/view-models/SponsorSponsorshipsViewModel.test.ts', - 'apps/website/lib/view-models/SponsorshipPricingViewModel.test.ts', - 'apps/website/lib/view-models/SponsorshipViewModel.test.ts', - ], + 'no-intl-in-presentation': [], // Rule 6: Client-side fetch with write methods 'no-client-write-fetch': [