website refactor

This commit is contained in:
2026-01-12 02:09:30 +01:00
parent 61db9116f6
commit ce558ad51b
2 changed files with 12 additions and 159 deletions

View File

@@ -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/

View File

@@ -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': [