diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5838d5a15..9ea985445 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,15 +24,18 @@ jobs: run: pnpm type-check linting: - name: Linting + name: Linting and Formatting runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: ./.github/actions/setup-node - uses: ./.github/actions/pnpm-install - - name: Check linting rules - run: pnpm lint + - name: Install Biome + run: pnpm add -D @biomejs/biome + + - name: Check linting and formatting + run: pnpm ci unit-tests: name: Unit tests diff --git a/.vscode/settings.json b/.vscode/settings.json index ee40c4498..1d45c3009 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,10 @@ { "editor.codeActionsOnSave": { - "source.fixAll": "explicit" + "source.fixAll.eslint": "never", + "source.organizeImports.biome": "explicit", + "quickfix.biome": "explicit" }, + "editor.defaultFormatter": "biomejs.biome", "typescript.tsdk": "node_modules/typescript/lib", "typescript.preferences.importModuleSpecifier": "non-relative", "cSpell.words": ["Rallly", "Vella"] diff --git a/apps/docs/.eslintrc.js b/apps/docs/.eslintrc.js deleted file mode 100644 index 3d9be6e61..000000000 --- a/apps/docs/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import("eslint").Linter.Config} */ -module.exports = { - ...require("@rallly/eslint-config")(__dirname), -}; diff --git a/apps/landing/.eslintrc.js b/apps/landing/.eslintrc.js deleted file mode 100644 index 3d9be6e61..000000000 --- a/apps/landing/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import("eslint").Linter.Config} */ -module.exports = { - ...require("@rallly/eslint-config")(__dirname), -}; diff --git a/apps/landing/declarations/i18next.d.ts b/apps/landing/declarations/i18next.d.ts index 36c74741b..0f61e7901 100644 --- a/apps/landing/declarations/i18next.d.ts +++ b/apps/landing/declarations/i18next.d.ts @@ -1,9 +1,9 @@ import "react-i18next"; -import blog from "../public/locales/en/blog.json"; -import common from "../public/locales/en/common.json"; -import home from "../public/locales/en/home.json"; -import pricing from "../public/locales/en/pricing.json"; +import type blog from "../public/locales/en/blog.json"; +import type common from "../public/locales/en/common.json"; +import type home from "../public/locales/en/home.json"; +import type pricing from "../public/locales/en/pricing.json"; interface I18nNamespaces { common: typeof common; diff --git a/apps/landing/package.json b/apps/landing/package.json index b095cb190..ec76cc8a0 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -7,7 +7,6 @@ "build": "next build", "analyze": "cross-env ANALYZE=true next build", "start": "next start", - "lint": "eslint .", "type-check": "tsc --pretty --noEmit", "i18n:scan": "i18next-scanner --config i18next-scanner.config.js", "prettier": "prettier --write ./src" @@ -39,7 +38,6 @@ }, "devDependencies": { "@next/bundle-analyzer": "^12.3.4", - "@rallly/eslint-config": "workspace:*", "@rallly/tsconfig": "workspace:*", "@types/accept-language-parser": "^1.5.3", "@types/color-hash": "^1.0.2", diff --git a/apps/landing/public/static/scripts/mailerlite.js b/apps/landing/public/static/scripts/mailerlite.js index 33658aef0..7098cc04d 100644 --- a/apps/landing/public/static/scripts/mailerlite.js +++ b/apps/landing/public/static/scripts/mailerlite.js @@ -1,9 +1,9 @@ -(function (w, d, e, u, f, l, n) { +((w, d, e, u, f, l, n) => { (w[f] = w[f] || - function () { + (() => { (w[f].q = w[f].q || []).push(arguments); - }), + })), (l = d.createElement(e)), (l.async = 1), (l.src = u), diff --git a/apps/landing/src/app/[locale]/footer.tsx b/apps/landing/src/app/[locale]/footer.tsx index fbd4e6d21..290222205 100644 --- a/apps/landing/src/app/[locale]/footer.tsx +++ b/apps/landing/src/app/[locale]/footer.tsx @@ -19,7 +19,7 @@ import { import Image from "next/image"; import Link from "next/link"; import { usePathname, useRouter } from "next/navigation"; -import * as React from "react"; +import type * as React from "react"; import { useTranslation } from "react-i18next"; import { Trans } from "@/components/trans"; @@ -302,7 +302,7 @@ export const Footer: React.FunctionComponent = () => { { { { return (
dangerouslySetInnerHTML={{ __html: content }} /> ); diff --git a/apps/landing/src/components/error-page.tsx b/apps/landing/src/components/error-page.tsx index 3ee7a79b2..73af8a629 100644 --- a/apps/landing/src/components/error-page.tsx +++ b/apps/landing/src/components/error-page.tsx @@ -4,7 +4,7 @@ import { Button } from "@rallly/ui/button"; import { FileSearchIcon } from "lucide-react"; import Link from "next/link"; import { useTranslation } from "next-i18next"; -import * as React from "react"; +import type * as React from "react"; export interface ComponentProps { icon?: React.ReactNode; diff --git a/apps/landing/src/components/home/bonus.tsx b/apps/landing/src/components/home/bonus.tsx index 674ade828..f4dfab9d1 100644 --- a/apps/landing/src/components/home/bonus.tsx +++ b/apps/landing/src/components/home/bonus.tsx @@ -1,5 +1,5 @@ import { prisma } from "@rallly/database"; -import { TFunction } from "i18next"; +import type { TFunction } from "i18next"; import { CalendarCheck2Icon, LanguagesIcon, diff --git a/apps/landing/src/components/marketing.tsx b/apps/landing/src/components/marketing.tsx index 499687e32..32189a63b 100644 --- a/apps/landing/src/components/marketing.tsx +++ b/apps/landing/src/components/marketing.tsx @@ -3,7 +3,7 @@ import { motion } from "framer-motion"; import { ArrowUpRight } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; -import React from "react"; +import type React from "react"; import { Trans } from "@/components/trans"; diff --git a/apps/landing/src/i18n/client.tsx b/apps/landing/src/i18n/client.tsx index 370719169..1df9a6d63 100644 --- a/apps/landing/src/i18n/client.tsx +++ b/apps/landing/src/i18n/client.tsx @@ -1,8 +1,8 @@ "use client"; -import i18next, { Namespace } from "i18next"; +import i18next, { type Namespace } from "i18next"; import ICU from "i18next-icu"; import resourcesToBackend from "i18next-resources-to-backend"; -import React from "react"; +import type React from "react"; import { I18nextProvider, initReactI18next, diff --git a/apps/landing/src/i18n/server.ts b/apps/landing/src/i18n/server.ts index 791dc3315..7799c21d6 100644 --- a/apps/landing/src/i18n/server.ts +++ b/apps/landing/src/i18n/server.ts @@ -1,4 +1,4 @@ -import { createInstance, Namespace } from "i18next"; +import { createInstance, type Namespace } from "i18next"; import ICU from "i18next-icu"; import resourcesToBackend from "i18next-resources-to-backend"; import { initReactI18next } from "react-i18next/initReactI18next"; diff --git a/apps/landing/src/i18n/settings.ts b/apps/landing/src/i18n/settings.ts index 03a1ad58c..9b6213a62 100644 --- a/apps/landing/src/i18n/settings.ts +++ b/apps/landing/src/i18n/settings.ts @@ -1,5 +1,5 @@ import allLanguages from "@rallly/languages"; -import { InitOptions } from "i18next"; +import type { InitOptions } from "i18next"; export const fallbackLng = "en"; export const languages = Object.keys(allLanguages); diff --git a/apps/landing/src/middleware.ts b/apps/landing/src/middleware.ts index a3bd13da4..138dd7c20 100644 --- a/apps/landing/src/middleware.ts +++ b/apps/landing/src/middleware.ts @@ -1,6 +1,6 @@ import { supportedLngs } from "@rallly/languages"; import languageParser from "accept-language-parser"; -import { NextRequest, NextResponse } from "next/server"; +import { type NextRequest, NextResponse } from "next/server"; export async function getLocaleFromHeader(req: NextRequest) { const headers = req.headers; diff --git a/apps/landing/src/pages/api/og-image.tsx b/apps/landing/src/pages/api/og-image.tsx index 0f35d682c..17cd925a4 100644 --- a/apps/landing/src/pages/api/og-image.tsx +++ b/apps/landing/src/pages/api/og-image.tsx @@ -1,6 +1,5 @@ -/* eslint-disable @next/next/no-img-element */ import { ImageResponse } from "next/og"; -import { NextRequest } from "next/server"; +import type { NextRequest } from "next/server"; export const config = { runtime: "edge", diff --git a/apps/landing/src/types.ts b/apps/landing/src/types.ts index 34a261038..e38089a90 100644 --- a/apps/landing/src/types.ts +++ b/apps/landing/src/types.ts @@ -1,5 +1,4 @@ -import { NextPage } from "next"; -import React from "react"; +import type React from "react"; export type ReactTag = keyof JSX.IntrinsicElements; @@ -7,19 +6,6 @@ export type PropsOf = TTag extends React.ElementType ? React.ComponentProps : never; -// eslint-disable-next-line @typescript-eslint/ban-types -export type NextPageWithLayout

= NextPage & { - getLayout?: (page: React.ReactElement) => React.ReactNode; -}; - -// eslint-disable-next-line @typescript-eslint/ban-types -export type PropsWithClassName = {}> = - React.PropsWithChildren & { - className?: string; - }; - -export type IconComponent = React.ComponentType; - export type Post = { slug: string; title: string; diff --git a/apps/web/.eslintrc.js b/apps/web/.eslintrc.js deleted file mode 100644 index 3d9be6e61..000000000 --- a/apps/web/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import("eslint").Linter.Config} */ -module.exports = { - ...require("@rallly/eslint-config")(__dirname), -}; diff --git a/apps/web/declarations/i18next.d.ts b/apps/web/declarations/i18next.d.ts index 8c9bf6f51..20a262e1c 100644 --- a/apps/web/declarations/i18next.d.ts +++ b/apps/web/declarations/i18next.d.ts @@ -1,8 +1,8 @@ import "i18next"; -import emails from "@rallly/emails/locales/emails.json"; +import type emails from "@rallly/emails/locales/emails.json"; -import app from "../public/locales/en/app.json"; +import type app from "../public/locales/en/app.json"; interface I18nNamespaces { app: typeof app; diff --git a/apps/web/declarations/next-auth.d.ts b/apps/web/declarations/next-auth.d.ts index eb7f8cb89..9148791aa 100644 --- a/apps/web/declarations/next-auth.d.ts +++ b/apps/web/declarations/next-auth.d.ts @@ -1,8 +1,7 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ import type { TimeFormat } from "@rallly/database"; import { extend } from "lodash"; -import NextAuth, { DefaultSession, DefaultUser } from "next-auth"; -import { DefaultJWT, JWT } from "next-auth/jwt"; +import NextAuth, { type DefaultSession, type DefaultUser } from "next-auth"; +import { type DefaultJWT, JWT } from "next-auth/jwt"; declare module "next-auth" { /** diff --git a/apps/web/package.json b/apps/web/package.json index a534db1b3..0d1385265 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -8,7 +8,6 @@ "build:test": "NODE_ENV=test next build", "analyze": "cross-env ANALYZE=true next build", "start": "next start", - "lint": "eslint .", "type-check": "tsc --pretty --noEmit", "i18n:scan": "i18next-scanner --config i18next-scanner.config.js", "prettier": "prettier --write ./src", @@ -88,7 +87,6 @@ "devDependencies": { "@next/env": "^14.2.15", "@playwright/test": "^1.39.0", - "@rallly/eslint-config": "workspace:*", "@rallly/tsconfig": "workspace:*", "@types/accept-language-parser": "^1.5.3", "@types/color-hash": "^1.0.2", diff --git a/apps/web/playwright.config.ts b/apps/web/playwright.config.ts index 66a69c5fb..d4f8dc7f3 100644 --- a/apps/web/playwright.config.ts +++ b/apps/web/playwright.config.ts @@ -1,5 +1,5 @@ import { loadEnvConfig } from "@next/env"; -import { devices, PlaywrightTestConfig } from "@playwright/test"; +import { devices, type PlaywrightTestConfig } from "@playwright/test"; const ci = process.env.CI === "true"; diff --git a/apps/web/src/app/[locale]/(admin)/app-card.tsx b/apps/web/src/app/[locale]/(admin)/app-card.tsx index cad1795c6..3066b9188 100644 --- a/apps/web/src/app/[locale]/(admin)/app-card.tsx +++ b/apps/web/src/app/[locale]/(admin)/app-card.tsx @@ -1,6 +1,6 @@ import { cn } from "@rallly/ui"; import { BarChart2Icon } from "lucide-react"; -import React from "react"; +import type React from "react"; export function AppCard({ children, diff --git a/apps/web/src/app/[locale]/(admin)/events/event-list.tsx b/apps/web/src/app/[locale]/(admin)/events/event-list.tsx index fdc35632c..f6f8a6fc5 100644 --- a/apps/web/src/app/[locale]/(admin)/events/event-list.tsx +++ b/apps/web/src/app/[locale]/(admin)/events/event-list.tsx @@ -4,7 +4,7 @@ import { Card, CardContent } from "@rallly/ui/card"; import { getCoreRowModel, useReactTable } from "@tanstack/react-table"; import dayjs from "dayjs"; -import { ScheduledEvent } from "@/app/[locale]/(admin)/events/types"; +import type { ScheduledEvent } from "@/app/[locale]/(admin)/events/types"; import { Trans } from "@/components/trans"; import { generateGradient } from "@/utils/color-hash"; import { useDayjs } from "@/utils/dayjs"; diff --git a/apps/web/src/app/[locale]/(admin)/events/page.tsx b/apps/web/src/app/[locale]/(admin)/events/page.tsx index 901e0cbd0..5d0565087 100644 --- a/apps/web/src/app/[locale]/(admin)/events/page.tsx +++ b/apps/web/src/app/[locale]/(admin)/events/page.tsx @@ -1,5 +1,5 @@ import { UserScheduledEvents } from "@/app/[locale]/(admin)/events/user-scheduled-events"; -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; import { PageContainer, PageContent, diff --git a/apps/web/src/app/[locale]/(admin)/layout.tsx b/apps/web/src/app/[locale]/(admin)/layout.tsx index 07219a403..eeb1d109d 100644 --- a/apps/web/src/app/[locale]/(admin)/layout.tsx +++ b/apps/web/src/app/[locale]/(admin)/layout.tsx @@ -1,5 +1,5 @@ import { cn } from "@rallly/ui"; -import React from "react"; +import type React from "react"; import { MobileNavigation } from "@/app/[locale]/(admin)/mobile-navigation"; import { ProBadge } from "@/app/[locale]/(admin)/pro-badge"; diff --git a/apps/web/src/app/[locale]/(admin)/menu-item.tsx b/apps/web/src/app/[locale]/(admin)/menu-item.tsx index 120b6dcf7..384ede518 100644 --- a/apps/web/src/app/[locale]/(admin)/menu-item.tsx +++ b/apps/web/src/app/[locale]/(admin)/menu-item.tsx @@ -4,7 +4,7 @@ import { cn } from "@rallly/ui"; import { Link } from "lucide-react"; import { usePathname } from "next/navigation"; -import { IconComponent } from "@/types"; +import type { IconComponent } from "@/types"; export function MenuItem({ href, diff --git a/apps/web/src/app/[locale]/(admin)/menu/page.tsx b/apps/web/src/app/[locale]/(admin)/menu/page.tsx index 7623c0f99..a41af31af 100644 --- a/apps/web/src/app/[locale]/(admin)/menu/page.tsx +++ b/apps/web/src/app/[locale]/(admin)/menu/page.tsx @@ -1,7 +1,7 @@ import { Trans } from "react-i18next/TransWithoutContext"; import { Sidebar } from "@/app/[locale]/(admin)/sidebar"; -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; import { PageContainer, PageContent, diff --git a/apps/web/src/app/[locale]/(admin)/page.tsx b/apps/web/src/app/[locale]/(admin)/page.tsx index fd7aab034..44f0b4a1b 100644 --- a/apps/web/src/app/[locale]/(admin)/page.tsx +++ b/apps/web/src/app/[locale]/(admin)/page.tsx @@ -2,7 +2,7 @@ import { HomeIcon } from "lucide-react"; import { Trans } from "react-i18next/TransWithoutContext"; import Dashboard from "@/app/[locale]/(admin)/dashboard"; -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; import { PageContainer, PageContent, diff --git a/apps/web/src/app/[locale]/(admin)/polls/page.tsx b/apps/web/src/app/[locale]/(admin)/polls/page.tsx index 497bcd49a..e894c6874 100644 --- a/apps/web/src/app/[locale]/(admin)/polls/page.tsx +++ b/apps/web/src/app/[locale]/(admin)/polls/page.tsx @@ -1,7 +1,7 @@ import { BarChart2Icon } from "lucide-react"; import { UserPolls } from "@/app/[locale]/(admin)/polls/user-polls"; -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; import { PageContainer, PageContent, diff --git a/apps/web/src/app/[locale]/(admin)/polls/user-polls.tsx b/apps/web/src/app/[locale]/(admin)/polls/user-polls.tsx index 3081cd21c..19d7a6a75 100644 --- a/apps/web/src/app/[locale]/(admin)/polls/user-polls.tsx +++ b/apps/web/src/app/[locale]/(admin)/polls/user-polls.tsx @@ -1,5 +1,5 @@ "use client"; -import { PollStatus } from "@rallly/database"; +import type { PollStatus } from "@rallly/database"; import { cn } from "@rallly/ui"; import { Badge } from "@rallly/ui/badge"; import { Button } from "@rallly/ui/button"; @@ -50,8 +50,8 @@ function FilteredPolls({ status }: { status: PollStatus }) { return (

    - {data.pages.map((page, i) => ( -
  1. + {data.pages.map((page) => ( +
  2. ))} @@ -102,7 +102,7 @@ function useQueryParam(name: string) { const searchParams = useSearchParams(); return [ searchParams?.get(name), - function (value: string) { + (value: string) => { const newParams = new URLSearchParams(searchParams?.toString()); newParams.set(name, value); window.history.replaceState(null, "", `?${newParams.toString()}`); diff --git a/apps/web/src/app/[locale]/(admin)/settings/billing/billing-page.tsx b/apps/web/src/app/[locale]/(admin)/settings/billing/billing-page.tsx index ce7f01c41..97c4d28da 100644 --- a/apps/web/src/app/[locale]/(admin)/settings/billing/billing-page.tsx +++ b/apps/web/src/app/[locale]/(admin)/settings/billing/billing-page.tsx @@ -16,11 +16,11 @@ import { Trans } from "@/components/trans"; import { useSubscription } from "@/contexts/plan"; import { trpc } from "@/utils/trpc/client"; -import { BillingPlans, PricingData } from "./billing-plans"; +import { BillingPlans, type PricingData } from "./billing-plans"; declare global { interface Window { - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // biome-ignore lint/suspicious/noExplicitAny: Paddle: any; } } diff --git a/apps/web/src/app/[locale]/(admin)/settings/billing/page.tsx b/apps/web/src/app/[locale]/(admin)/settings/billing/page.tsx index 3e81f2dc2..92e4a3b9c 100644 --- a/apps/web/src/app/[locale]/(admin)/settings/billing/page.tsx +++ b/apps/web/src/app/[locale]/(admin)/settings/billing/page.tsx @@ -2,7 +2,7 @@ import { pricingData } from "@rallly/billing/pricing"; import { notFound } from "next/navigation"; import { BillingPage } from "@/app/[locale]/(admin)/settings/billing/billing-page"; -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; import { getTranslation } from "@/app/i18n"; import { env } from "@/env"; diff --git a/apps/web/src/app/[locale]/(admin)/settings/layout.tsx b/apps/web/src/app/[locale]/(admin)/settings/layout.tsx index 3d621b6ae..773647a7d 100644 --- a/apps/web/src/app/[locale]/(admin)/settings/layout.tsx +++ b/apps/web/src/app/[locale]/(admin)/settings/layout.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import type React from "react"; import { PageContainer, diff --git a/apps/web/src/app/[locale]/(admin)/settings/preferences/page.tsx b/apps/web/src/app/[locale]/(admin)/settings/preferences/page.tsx index 377df6db4..9aed78f6f 100644 --- a/apps/web/src/app/[locale]/(admin)/settings/preferences/page.tsx +++ b/apps/web/src/app/[locale]/(admin)/settings/preferences/page.tsx @@ -1,4 +1,4 @@ -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; import { getTranslation } from "@/app/i18n"; import { PreferencesPage } from "./preferences-page"; diff --git a/apps/web/src/app/[locale]/(admin)/settings/profile/delete-account-dialog.tsx b/apps/web/src/app/[locale]/(admin)/settings/profile/delete-account-dialog.tsx index 935fdf1e7..4640399e5 100644 --- a/apps/web/src/app/[locale]/(admin)/settings/profile/delete-account-dialog.tsx +++ b/apps/web/src/app/[locale]/(admin)/settings/profile/delete-account-dialog.tsx @@ -7,7 +7,7 @@ import { DialogDescription, DialogFooter, DialogHeader, - DialogProps, + type DialogProps, DialogTitle, } from "@rallly/ui/dialog"; import { Form, FormField, FormItem, FormMessage } from "@rallly/ui/form"; diff --git a/apps/web/src/app/[locale]/(admin)/settings/profile/page.tsx b/apps/web/src/app/[locale]/(admin)/settings/profile/page.tsx index 30a7eaa6c..cb8bb6d19 100644 --- a/apps/web/src/app/[locale]/(admin)/settings/profile/page.tsx +++ b/apps/web/src/app/[locale]/(admin)/settings/profile/page.tsx @@ -1,4 +1,4 @@ -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; import { getTranslation } from "@/app/i18n"; import { ProfilePage } from "./profile-page"; diff --git a/apps/web/src/app/[locale]/(admin)/sidebar.tsx b/apps/web/src/app/[locale]/(admin)/sidebar.tsx index 8f695cc69..98c14ab0a 100644 --- a/apps/web/src/app/[locale]/(admin)/sidebar.tsx +++ b/apps/web/src/app/[locale]/(admin)/sidebar.tsx @@ -25,7 +25,7 @@ import { ProBadge } from "@/components/pro-badge"; import { Trans } from "@/components/trans"; import { IfGuest, useUser } from "@/components/user-provider"; import { IfFreeUser } from "@/contexts/plan"; -import { IconComponent } from "@/types"; +import type { IconComponent } from "@/types"; import { usePostHog } from "@/utils/posthog"; function NavItem({ @@ -64,9 +64,9 @@ export function Sidebar() { const posthog = usePostHog(); return (
- {alternativeLoginMethods.map((method, i) => ( - diff --git a/apps/web/src/app/[locale]/(auth)/login/page.tsx b/apps/web/src/app/[locale]/(auth)/login/page.tsx index 10caefed9..209deb363 100644 --- a/apps/web/src/app/[locale]/(auth)/login/page.tsx +++ b/apps/web/src/app/[locale]/(auth)/login/page.tsx @@ -2,7 +2,7 @@ import Link from "next/link"; import { Trans } from "react-i18next/TransWithoutContext"; import { LoginForm } from "@/app/[locale]/(auth)/login/login-form"; -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; import { getTranslation } from "@/app/i18n"; import { AuthCard } from "@/components/auth/auth-layout"; diff --git a/apps/web/src/app/[locale]/(auth)/register/page.tsx b/apps/web/src/app/[locale]/(auth)/register/page.tsx index ffab0cecd..4523475c8 100644 --- a/apps/web/src/app/[locale]/(auth)/register/page.tsx +++ b/apps/web/src/app/[locale]/(auth)/register/page.tsx @@ -1,5 +1,5 @@ import { RegisterForm } from "@/app/[locale]/(auth)/register/register-page"; -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; import { getTranslation } from "@/app/i18n"; export default async function Page() { diff --git a/apps/web/src/app/[locale]/admin/[adminUrlId]/page.tsx b/apps/web/src/app/[locale]/admin/[adminUrlId]/page.tsx index 5ad41db82..54ff3a140 100644 --- a/apps/web/src/app/[locale]/admin/[adminUrlId]/page.tsx +++ b/apps/web/src/app/[locale]/admin/[adminUrlId]/page.tsx @@ -4,7 +4,7 @@ import { notFound } from "next/navigation"; import { Redirect } from "@/app/components/redirect"; import { absoluteUrl } from "@/utils/absolute-url"; -import { PParams } from "./types"; +import type { PParams } from "./types"; export default async function Page({ params }: { params: PParams }) { const { adminUrlId } = params; diff --git a/apps/web/src/app/[locale]/admin/[adminUrlId]/types.ts b/apps/web/src/app/[locale]/admin/[adminUrlId]/types.ts index 107528266..ab9aefb9b 100644 --- a/apps/web/src/app/[locale]/admin/[adminUrlId]/types.ts +++ b/apps/web/src/app/[locale]/admin/[adminUrlId]/types.ts @@ -1,4 +1,4 @@ -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; export interface PParams extends Params { adminUrlId: string; diff --git a/apps/web/src/app/[locale]/invite/[urlId]/layout.tsx b/apps/web/src/app/[locale]/invite/[urlId]/layout.tsx index c456865c0..6c9bb8322 100644 --- a/apps/web/src/app/[locale]/invite/[urlId]/layout.tsx +++ b/apps/web/src/app/[locale]/invite/[urlId]/layout.tsx @@ -1,6 +1,6 @@ "use client"; import { notFound, useParams, useSearchParams } from "next/navigation"; -import React from "react"; +import type React from "react"; import { LegacyPollContextProvider } from "@/components/poll/poll-context-provider"; import { VisibilityProvider } from "@/components/visibility"; diff --git a/apps/web/src/app/[locale]/invite/[urlId]/page.tsx b/apps/web/src/app/[locale]/invite/[urlId]/page.tsx index 05ebab740..4dca6fb1e 100644 --- a/apps/web/src/app/[locale]/invite/[urlId]/page.tsx +++ b/apps/web/src/app/[locale]/invite/[urlId]/page.tsx @@ -1,5 +1,5 @@ import { prisma } from "@rallly/database"; -import { Metadata } from "next"; +import type { Metadata } from "next"; import { InvitePage } from "@/app/[locale]/invite/[urlId]/invite-page"; import { getTranslation } from "@/app/i18n"; diff --git a/apps/web/src/app/[locale]/layout.tsx b/apps/web/src/app/[locale]/layout.tsx index ee7d143cf..cc0282fbd 100644 --- a/apps/web/src/app/[locale]/layout.tsx +++ b/apps/web/src/app/[locale]/layout.tsx @@ -3,9 +3,9 @@ import "../../style.css"; import languages from "@rallly/languages"; import { Toaster } from "@rallly/ui/toaster"; -import { Viewport } from "next"; +import type { Viewport } from "next"; import { Inter } from "next/font/google"; -import React from "react"; +import type React from "react"; import { TimeZoneChangeDetector } from "@/app/[locale]/timezone-change-detector"; import { Providers } from "@/app/providers"; diff --git a/apps/web/src/app/[locale]/new/page.tsx b/apps/web/src/app/[locale]/new/page.tsx index c442a58e0..5d4298fb5 100644 --- a/apps/web/src/app/[locale]/new/page.tsx +++ b/apps/web/src/app/[locale]/new/page.tsx @@ -2,7 +2,7 @@ import { Trans } from "react-i18next/TransWithoutContext"; import { GroupPollIcon } from "@/app/[locale]/(admin)/app-card"; import { BackButton } from "@/app/[locale]/(admin)/menu/menu-button"; -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; import { getTranslation } from "@/app/i18n"; import { CreatePoll } from "@/components/create-poll"; import { UserDropdown } from "@/components/user-dropdown"; diff --git a/apps/web/src/app/[locale]/p/[participantUrlId]/page.tsx b/apps/web/src/app/[locale]/p/[participantUrlId]/page.tsx index b7e6e678d..e02bb1d14 100644 --- a/apps/web/src/app/[locale]/p/[participantUrlId]/page.tsx +++ b/apps/web/src/app/[locale]/p/[participantUrlId]/page.tsx @@ -4,7 +4,7 @@ import { notFound } from "next/navigation"; import { Redirect } from "@/app/components/redirect"; import { absoluteUrl } from "@/utils/absolute-url"; -import { PParams } from "./types"; +import type { PParams } from "./types"; export default async function Page({ params }: { params: PParams }) { const { participantUrlId } = params; diff --git a/apps/web/src/app/[locale]/p/[participantUrlId]/types.ts b/apps/web/src/app/[locale]/p/[participantUrlId]/types.ts index a1c016c92..25635176c 100644 --- a/apps/web/src/app/[locale]/p/[participantUrlId]/types.ts +++ b/apps/web/src/app/[locale]/p/[participantUrlId]/types.ts @@ -1,4 +1,4 @@ -import { Params } from "@/app/[locale]/types"; +import type { Params } from "@/app/[locale]/types"; export interface PParams extends Params { participantUrlId: string; diff --git a/apps/web/src/app/[locale]/poll/[urlId]/duplicate-dialog.tsx b/apps/web/src/app/[locale]/poll/[urlId]/duplicate-dialog.tsx index 19cd763f4..3e2956ad2 100644 --- a/apps/web/src/app/[locale]/poll/[urlId]/duplicate-dialog.tsx +++ b/apps/web/src/app/[locale]/poll/[urlId]/duplicate-dialog.tsx @@ -7,7 +7,7 @@ import { DialogDescription, DialogFooter, DialogHeader, - DialogProps, + type DialogProps, DialogTitle, } from "@rallly/ui/dialog"; import { useRouter } from "next/navigation"; diff --git a/apps/web/src/app/[locale]/poll/[urlId]/edit-details/page.tsx b/apps/web/src/app/[locale]/poll/[urlId]/edit-details/page.tsx index 0fe1c362b..891d2a6e4 100644 --- a/apps/web/src/app/[locale]/poll/[urlId]/edit-details/page.tsx +++ b/apps/web/src/app/[locale]/poll/[urlId]/edit-details/page.tsx @@ -14,13 +14,13 @@ import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { - PollDetailsData, + type PollDetailsData, PollDetailsForm, } from "@/components/forms/poll-details-form"; import { useUpdatePollMutation } from "@/components/poll/mutations"; import { usePoll } from "@/components/poll-context"; import { Trans } from "@/components/trans"; -import { NextPageWithLayout } from "@/types"; +import type { NextPageWithLayout } from "@/types"; const Page: NextPageWithLayout = () => { const { poll } = usePoll(); diff --git a/apps/web/src/app/[locale]/poll/[urlId]/edit-options/page.tsx b/apps/web/src/app/[locale]/poll/[urlId]/edit-options/page.tsx index d9e29e07b..ad9b20964 100644 --- a/apps/web/src/app/[locale]/poll/[urlId]/edit-options/page.tsx +++ b/apps/web/src/app/[locale]/poll/[urlId]/edit-options/page.tsx @@ -8,7 +8,7 @@ import { useRouter } from "next/navigation"; import { useTranslation } from "next-i18next"; import { useForm } from "react-hook-form"; -import { PollOptionsData } from "@/components/forms"; +import type { PollOptionsData } from "@/components/forms"; import PollOptionsForm from "@/components/forms/poll-options-form"; import { useModalContext } from "@/components/modal/modal-provider"; import { useUpdatePollMutation } from "@/components/poll/mutations"; diff --git a/apps/web/src/app/[locale]/poll/[urlId]/edit-settings/page.tsx b/apps/web/src/app/[locale]/poll/[urlId]/edit-settings/page.tsx index 8c60d9d1e..352421fcf 100644 --- a/apps/web/src/app/[locale]/poll/[urlId]/edit-settings/page.tsx +++ b/apps/web/src/app/[locale]/poll/[urlId]/edit-settings/page.tsx @@ -8,7 +8,7 @@ import { useForm } from "react-hook-form"; import { PollSettingsForm, - PollSettingsFormData, + type PollSettingsFormData, } from "@/components/forms/poll-settings"; import { useUpdatePollMutation } from "@/components/poll/mutations"; import { Trans } from "@/components/trans"; diff --git a/apps/web/src/app/api/logout/route.ts b/apps/web/src/app/api/logout/route.ts index 6887de148..937a26793 100644 --- a/apps/web/src/app/api/logout/route.ts +++ b/apps/web/src/app/api/logout/route.ts @@ -1,4 +1,4 @@ -import { NextRequest, NextResponse } from "next/server"; +import { type NextRequest, NextResponse } from "next/server"; import { resetUser } from "@/app/guest"; diff --git a/apps/web/src/app/api/storage/[...key]/route.ts b/apps/web/src/app/api/storage/[...key]/route.ts index 9c7040cee..515079d62 100644 --- a/apps/web/src/app/api/storage/[...key]/route.ts +++ b/apps/web/src/app/api/storage/[...key]/route.ts @@ -1,5 +1,5 @@ import { GetObjectCommand } from "@aws-sdk/client-s3"; -import { NextRequest, NextResponse } from "next/server"; +import { type NextRequest, NextResponse } from "next/server"; import { env } from "@/env"; import { getS3Client } from "@/utils/s3"; diff --git a/apps/web/src/app/components/logout-button.tsx b/apps/web/src/app/components/logout-button.tsx index 47693ac86..a74b1c331 100644 --- a/apps/web/src/app/components/logout-button.tsx +++ b/apps/web/src/app/components/logout-button.tsx @@ -1,5 +1,5 @@ "use client"; -import { Button, ButtonProps } from "@rallly/ui/button"; +import { Button, type ButtonProps } from "@rallly/ui/button"; import { usePostHog } from "@/utils/posthog"; diff --git a/apps/web/src/app/components/tab-menu.tsx b/apps/web/src/app/components/tab-menu.tsx index f78a70150..79079c5a4 100644 --- a/apps/web/src/app/components/tab-menu.tsx +++ b/apps/web/src/app/components/tab-menu.tsx @@ -2,7 +2,7 @@ import { cn } from "@rallly/ui"; import Link from "next/link"; import { usePathname } from "next/navigation"; -import React from "react"; +import type React from "react"; export function TabMenuItem({ href, diff --git a/apps/web/src/app/global-error.tsx b/apps/web/src/app/global-error.tsx index 9bda5feef..4f9c8a9dd 100644 --- a/apps/web/src/app/global-error.tsx +++ b/apps/web/src/app/global-error.tsx @@ -4,13 +4,17 @@ import * as Sentry from "@sentry/nextjs"; import NextError from "next/error"; import { useEffect } from "react"; -export default function GlobalError({ error }: { error: Error & { digest?: string } }) { +export default function GlobalError({ + error, +}: { + error: Error & { digest?: string }; +}) { useEffect(() => { Sentry.captureException(error); }, [error]); return ( - + {/* `NextError` is the default Next.js error page component. Its type definition requires a `statusCode` prop. However, since the App Router @@ -20,4 +24,4 @@ export default function GlobalError({ error }: { error: Error & { digest?: strin ); -} \ No newline at end of file +} diff --git a/apps/web/src/app/guest.ts b/apps/web/src/app/guest.ts index c56cd5e61..73bd9d5a1 100644 --- a/apps/web/src/app/guest.ts +++ b/apps/web/src/app/guest.ts @@ -1,7 +1,7 @@ import languages from "@rallly/languages"; import languageParser from "accept-language-parser"; -import { NextRequest, NextResponse } from "next/server"; -import { encode, JWT } from "next-auth/jwt"; +import type { NextRequest, NextResponse } from "next/server"; +import { encode, type JWT } from "next-auth/jwt"; import { absoluteUrl } from "@/utils/absolute-url"; import { randomid } from "@/utils/nanoid"; diff --git a/apps/web/src/app/i18n.ts b/apps/web/src/app/i18n.ts index 68770b424..6857851c9 100644 --- a/apps/web/src/app/i18n.ts +++ b/apps/web/src/app/i18n.ts @@ -1,4 +1,4 @@ -import { createInstance, Namespace } from "i18next"; +import { createInstance, type Namespace } from "i18next"; import resourcesToBackend from "i18next-resources-to-backend"; import { initReactI18next } from "react-i18next/initReactI18next"; diff --git a/apps/web/src/app/i18n/client.tsx b/apps/web/src/app/i18n/client.tsx index 14987801d..c5475abfd 100644 --- a/apps/web/src/app/i18n/client.tsx +++ b/apps/web/src/app/i18n/client.tsx @@ -1,9 +1,9 @@ "use client"; -import i18next, { Namespace } from "i18next"; +import i18next, { type Namespace } from "i18next"; import ICU from "i18next-icu"; import resourcesToBackend from "i18next-resources-to-backend"; import { useParams } from "next/navigation"; -import React from "react"; +import type React from "react"; import { I18nextProvider, initReactI18next, diff --git a/apps/web/src/app/i18n/settings.ts b/apps/web/src/app/i18n/settings.ts index ec240cf21..ab6678999 100644 --- a/apps/web/src/app/i18n/settings.ts +++ b/apps/web/src/app/i18n/settings.ts @@ -1,5 +1,5 @@ import allLanguages from "@rallly/languages"; -import { InitOptions } from "i18next"; +import type { InitOptions } from "i18next"; export const fallbackLng = "en"; export const languages = Object.keys(allLanguages); diff --git a/apps/web/src/app/providers.tsx b/apps/web/src/app/providers.tsx index cc3a96405..cfcb094fc 100644 --- a/apps/web/src/app/providers.tsx +++ b/apps/web/src/app/providers.tsx @@ -8,7 +8,7 @@ import { useState } from "react"; import { I18nProvider } from "@/app/i18n/client"; import { UserProvider } from "@/components/user-provider"; -import { AppRouter } from "@/trpc/routers"; +import type { AppRouter } from "@/trpc/routers"; import { ConnectedDayjsProvider } from "@/utils/dayjs"; import { trpcConfig } from "@/utils/trpc/config"; diff --git a/apps/web/src/components/add-to-calendar-button.tsx b/apps/web/src/components/add-to-calendar-button.tsx index b4bb10c0f..bf8bf422f 100644 --- a/apps/web/src/components/add-to-calendar-button.tsx +++ b/apps/web/src/components/add-to-calendar-button.tsx @@ -10,7 +10,7 @@ import { } from "@rallly/ui/dropdown-menu"; import { Icon } from "@rallly/ui/icon"; import { - CalendarEvent, + type CalendarEvent, google, ics, office365, diff --git a/apps/web/src/components/auth/auth-forms.tsx b/apps/web/src/components/auth/auth-forms.tsx index 09375bc4f..ad7a4ab3d 100644 --- a/apps/web/src/components/auth/auth-forms.tsx +++ b/apps/web/src/components/auth/auth-forms.tsx @@ -1,7 +1,7 @@ import { Button } from "@rallly/ui/button"; import { Input } from "@rallly/ui/input"; import { Trans, useTranslation } from "next-i18next"; -import React from "react"; +import type React from "react"; import { useForm } from "react-hook-form"; import { requiredString } from "../../utils/form-validation"; diff --git a/apps/web/src/components/auth/auth-layout.tsx b/apps/web/src/components/auth/auth-layout.tsx index 6922ab45e..cf46ed22c 100644 --- a/apps/web/src/components/auth/auth-layout.tsx +++ b/apps/web/src/components/auth/auth-layout.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import type React from "react"; import { Logo } from "@/components/logo"; diff --git a/apps/web/src/components/cookie-consent.tsx b/apps/web/src/components/cookie-consent.tsx index 8af73d936..c73ae1bf3 100644 --- a/apps/web/src/components/cookie-consent.tsx +++ b/apps/web/src/components/cookie-consent.tsx @@ -47,6 +47,7 @@ const CookieConsentPopover = () => { Privacy Policy @@ -281,6 +283,7 @@ function DiscussionInner() { /> ) : (