/** * Allowlist for architecture guardrail violations * * This file contains violations that currently exist in the codebase. * In future slices, these should be shrunk to zero. * * Format: Each rule has an array of file paths that are allowed to violate it. */ export interface GuardrailAllowlist { [ruleName: string]: string[]; } 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', ], // 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', ], // 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', ], // 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', ], // Rule 6: Client-side fetch with write methods 'no-client-write-fetch': [ 'apps/website/app/sponsor/signup/page.tsx', ], // Rule 7: *Template.tsx files under app/ 'no-templates-in-app': [], // Rule 8: 'as any' usage - ZERO TOLERANCE // Hard fail - no allowlist entries allowed 'no-as-any': [], // New Rule 1: RSC boundary - additional checks 'no-presenters-in-server': [], 'no-sorting-filtering-in-server': [], 'no-display-objects-in-server': [], 'no-unsafe-services-in-server': [], 'no-di-in-server': [], 'no-local-helpers-in-server': [], 'no-object-construction-in-server': [], 'no-container-manager-calls-in-server': [], // New Rule 2: Template purity - additional checks 'no-state-hooks-in-templates': [], 'no-computations-in-templates': [], 'no-restricted-imports-in-templates': [], 'no-invalid-template-signature': [], 'no-template-helper-exports': [], 'invalid-template-filename': [], // New Rule 3: Display Object guardrails 'no-io-in-display-objects': [], 'no-non-class-display-exports': [], // New Rule 4: Page Query guardrails 'no-null-returns-in-page-queries': [], 'invalid-page-query-filename': [], // New Rule 5: Services guardrails 'no-service-state': [], 'no-blockers-in-services': [], 'no-dto-variable-name': [], // New Rule 6: Client-only guardrails 'no-use-client-directive': [], 'no-viewmodel-imports-from-server': [], 'no-http-in-presenters': [], // New Rule 7: Write boundary guardrails 'no-server-action-imports-from-client': [], 'no-server-action-viewmodel-returns': [], // New Rule 10: Generated DTO isolation 'no-generated-dto-in-ui': [], 'no-types-in-templates': [], // New Rule 11: Filename rules 'invalid-app-filename': [], };