diff --git a/portal/.eslintrc.json b/portal/.eslintrc.json index 5145767..36be866 100644 --- a/portal/.eslintrc.json +++ b/portal/.eslintrc.json @@ -1,11 +1,35 @@ { - "extends": "next/core-web-vitals", + "root": true, + "extends": ["next/core-web-vitals", "plugin:@typescript-eslint/recommended"], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2022, + "sourceType": "module", + "ecmaFeatures": { "jsx": true } + }, + "plugins": ["@typescript-eslint"], "rules": { - "@typescript-eslint/no-explicit-any": "warn", - "no-console": "warn", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-unused-vars": [ + "warn", + { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" } + ], "@typescript-eslint/no-empty-object-type": "off", - "jsx-a11y/label-has-associated-control": "warn", - "react/no-unescaped-entities": "warn", - "import/order": "warn" + "@typescript-eslint/no-require-imports": "off", + "no-console": "error", + "jsx-a11y/label-has-associated-control": "error", + "react/no-unescaped-entities": "error", + "import/order": [ + "error", + { + "groups": ["builtin", "external", "internal", "parent", "sibling", "index"], + "newlines-between": "always", + "alphabetize": { "order": "asc", "caseInsensitive": true }, + "pathGroups": [ + { "pattern": "@/**", "group": "internal", "position": "after" } + ], + "pathGroupsExcludedImportTypes": ["builtin"] + } + ] } } diff --git a/portal/src/app/admin/page.tsx b/portal/src/app/admin/page.tsx index f013187..75bba77 100644 --- a/portal/src/app/admin/page.tsx +++ b/portal/src/app/admin/page.tsx @@ -1,10 +1,11 @@ 'use client'; -import { useSession } from 'next-auth/react'; -import { signIn } from 'next-auth/react'; -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card'; import { Building2, Users, CreditCard, Shield, ArrowRight } from 'lucide-react'; import Link from 'next/link'; +import { useSession } from 'next-auth/react'; +import { signIn } from 'next-auth/react'; + +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card'; export default function AdminPortalPage() { const { data: session, status } = useSession(); diff --git a/portal/src/app/analytics/page.tsx b/portal/src/app/analytics/page.tsx index 94b0a9c..7cb0b73 100644 --- a/portal/src/app/analytics/page.tsx +++ b/portal/src/app/analytics/page.tsx @@ -2,6 +2,7 @@ import { useSession } from 'next-auth/react'; import { signIn } from 'next-auth/react'; + import { AdvancedAnalytics } from '@/components/analytics/AdvancedAnalytics'; export default function AnalyticsPage() { diff --git a/portal/src/app/api/auth/[...nextauth]/route.ts b/portal/src/app/api/auth/[...nextauth]/route.ts index 802bebd..ad645a9 100644 --- a/portal/src/app/api/auth/[...nextauth]/route.ts +++ b/portal/src/app/api/auth/[...nextauth]/route.ts @@ -1,4 +1,5 @@ import NextAuth from 'next-auth'; + import { authOptions } from '@/lib/auth'; const handler = NextAuth(authOptions); diff --git a/portal/src/app/api/auth/error/page.tsx b/portal/src/app/api/auth/error/page.tsx index 8a6f55e..0415a5b 100644 --- a/portal/src/app/api/auth/error/page.tsx +++ b/portal/src/app/api/auth/error/page.tsx @@ -1,7 +1,7 @@ 'use client'; -import { useSearchParams } from 'next/navigation'; import Link from 'next/link'; +import { useSearchParams } from 'next/navigation'; import { Suspense } from 'react'; function AuthErrorContent() { diff --git a/portal/src/app/argocd/page.tsx b/portal/src/app/argocd/page.tsx index 0c2cb6b..0874b94 100644 --- a/portal/src/app/argocd/page.tsx +++ b/portal/src/app/argocd/page.tsx @@ -1,7 +1,8 @@ 'use client' -import { useSession } from 'next-auth/react' import { redirect } from 'next/navigation' +import { useSession } from 'next-auth/react' + import ArgoCDApplications from '@/components/argocd/ArgoCDApplications' export default function ArgoCDPage() { diff --git a/portal/src/app/crossplane/page.tsx b/portal/src/app/crossplane/page.tsx index 244bcf3..28d2cdd 100644 --- a/portal/src/app/crossplane/page.tsx +++ b/portal/src/app/crossplane/page.tsx @@ -1,7 +1,8 @@ 'use client' -import { useSession } from 'next-auth/react' import { redirect } from 'next/navigation' +import { useSession } from 'next-auth/react' + import CrossplaneResourceBrowser from '@/components/crossplane/CrossplaneResourceBrowser' export default function CrossplanePage() { diff --git a/portal/src/app/dashboard/business/page.tsx b/portal/src/app/dashboard/business/page.tsx index 68695ee..bda7b2e 100644 --- a/portal/src/app/dashboard/business/page.tsx +++ b/portal/src/app/dashboard/business/page.tsx @@ -2,13 +2,14 @@ import { useSession } from 'next-auth/react'; import { signIn } from 'next-auth/react'; -import { CostOverviewTile } from '@/components/dashboard/CostOverviewTile'; -import { CostForecastingTile } from '@/components/dashboard/CostForecastingTile'; -import { ResourceUsageTile } from '@/components/dashboard/ResourceUsageTile'; + import { BillingTile } from '@/components/dashboard/BillingTile'; -import { ServiceAdoptionTile } from '@/components/dashboard/ServiceAdoptionTile'; import { ComplianceStatusTile } from '@/components/dashboard/ComplianceStatusTile'; +import { CostForecastingTile } from '@/components/dashboard/CostForecastingTile'; +import { CostOverviewTile } from '@/components/dashboard/CostOverviewTile'; import { QuickActionsPanel } from '@/components/dashboard/QuickActionsPanel'; +import { ResourceUsageTile } from '@/components/dashboard/ResourceUsageTile'; +import { ServiceAdoptionTile } from '@/components/dashboard/ServiceAdoptionTile'; export default function BusinessDashboardPage() { const { status } = useSession(); diff --git a/portal/src/app/dashboard/developer/page.tsx b/portal/src/app/dashboard/developer/page.tsx index 403d754..ea7adaf 100644 --- a/portal/src/app/dashboard/developer/page.tsx +++ b/portal/src/app/dashboard/developer/page.tsx @@ -2,11 +2,12 @@ import { useSession } from 'next-auth/react'; import { signIn } from 'next-auth/react'; + +import { APIKeysTile } from '@/components/dashboard/APIKeysTile'; import { APIUsageTile } from '@/components/dashboard/APIUsageTile'; import { DeploymentsTile } from '@/components/dashboard/DeploymentsTile'; -import { TestEnvironmentsTile } from '@/components/dashboard/TestEnvironmentsTile'; -import { APIKeysTile } from '@/components/dashboard/APIKeysTile'; import { QuickActionsPanel } from '@/components/dashboard/QuickActionsPanel'; +import { TestEnvironmentsTile } from '@/components/dashboard/TestEnvironmentsTile'; export default function DeveloperDashboardPage() { const { status } = useSession(); diff --git a/portal/src/app/dashboard/page.tsx b/portal/src/app/dashboard/page.tsx index 672c9e7..163cd44 100644 --- a/portal/src/app/dashboard/page.tsx +++ b/portal/src/app/dashboard/page.tsx @@ -1,9 +1,10 @@ 'use client'; +import { useRouter } from 'next/navigation'; import { useSession } from 'next-auth/react'; import { signIn } from 'next-auth/react'; -import { useRouter } from 'next/navigation'; import { useEffect } from 'react'; + import { getDashboardRoute } from '@/lib/roles'; export default function DashboardPage() { diff --git a/portal/src/app/dashboard/technical/page.tsx b/portal/src/app/dashboard/technical/page.tsx index 8743c1d..3ad8905 100644 --- a/portal/src/app/dashboard/technical/page.tsx +++ b/portal/src/app/dashboard/technical/page.tsx @@ -2,12 +2,13 @@ import { useSession } from 'next-auth/react'; import { signIn } from 'next-auth/react'; -import { SystemHealthTile } from '@/components/dashboard/SystemHealthTile'; -import { IntegrationStatusTile } from '@/components/dashboard/IntegrationStatusTile'; -import { DataPipelineTile } from '@/components/dashboard/DataPipelineTile'; -import { ResourceUtilizationTile } from '@/components/dashboard/ResourceUtilizationTile'; + import { OptimizationEngine } from '@/components/ai/OptimizationEngine'; +import { DataPipelineTile } from '@/components/dashboard/DataPipelineTile'; +import { IntegrationStatusTile } from '@/components/dashboard/IntegrationStatusTile'; import { QuickActionsPanel } from '@/components/dashboard/QuickActionsPanel'; +import { ResourceUtilizationTile } from '@/components/dashboard/ResourceUtilizationTile'; +import { SystemHealthTile } from '@/components/dashboard/SystemHealthTile'; export default function TechnicalDashboardPage() { const { status } = useSession(); diff --git a/portal/src/app/developer/page.tsx b/portal/src/app/developer/page.tsx index e8cc24c..15e33e8 100644 --- a/portal/src/app/developer/page.tsx +++ b/portal/src/app/developer/page.tsx @@ -1,10 +1,11 @@ 'use client'; -import { useSession } from 'next-auth/react'; -import { signIn } from 'next-auth/react'; -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card'; import { Key, Book, TestTube, BarChart3, Webhook, Download, ArrowRight } from 'lucide-react'; import Link from 'next/link'; +import { useSession } from 'next-auth/react'; +import { signIn } from 'next-auth/react'; + +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card'; export default function DeveloperPortalPage() { const { status } = useSession(); diff --git a/portal/src/app/developer/webhooks/test/page.tsx b/portal/src/app/developer/webhooks/test/page.tsx index 42d4d66..6bd7f7c 100644 --- a/portal/src/app/developer/webhooks/test/page.tsx +++ b/portal/src/app/developer/webhooks/test/page.tsx @@ -1,15 +1,26 @@ 'use client'; -import { useState } from 'react'; -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card'; import { Send, CheckCircle, XCircle } from 'lucide-react'; +import { useState } from 'react'; + +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card'; + +interface WebhookTestResult { + success: boolean; + status?: number; + statusText?: string; + responseTime?: number; + response?: unknown; + error?: string; + timestamp: string; +} export default function WebhookTestingPage() { const [url, setUrl] = useState(''); const [method, setMethod] = useState('POST'); const [headers, setHeaders] = useState('{"Content-Type": "application/json"}'); const [payload, setPayload] = useState('{"event": "test", "data": {}}'); - const [testResult, setTestResult] = useState(null); + const [testResult, setTestResult] = useState(null); const [isTesting, setIsTesting] = useState(false); const testWebhook = async () => { @@ -39,10 +50,10 @@ export default function WebhookTestingPage() { response: data, timestamp: new Date().toISOString(), }); - } catch (error: any) { + } catch (error: unknown) { setTestResult({ success: false, - error: error.message, + error: error instanceof Error ? error.message : 'Request failed', timestamp: new Date().toISOString(), }); } finally { @@ -64,8 +75,11 @@ export default function WebhookTestingPage() {
- + setUrl(e.target.value)} @@ -75,8 +89,11 @@ export default function WebhookTestingPage() {
- +