diff --git a/apps/landing/.eslintrc.js b/apps/landing/.eslintrc.js index 3d9be6e61..c3b985290 100644 --- a/apps/landing/.eslintrc.js +++ b/apps/landing/.eslintrc.js @@ -1,4 +1,4 @@ /** @type {import("eslint").Linter.Config} */ module.exports = { - ...require("@rallly/eslint-config")(__dirname), + ...require("@rallly/eslint-config/next")(__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/next.config.js b/apps/landing/next.config.js index ffc1d041d..71fb89800 100644 --- a/apps/landing/next.config.js +++ b/apps/landing/next.config.js @@ -21,6 +21,7 @@ const nextConfig = { "@rallly/icons", "@rallly/ui", "@rallly/tailwind-config", + "@rallly/utils", "next-mdx-remote", ], webpack(config) { diff --git a/apps/landing/package.json b/apps/landing/package.json index 1d0eba373..5bcd9f6e7 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -18,6 +18,7 @@ "@rallly/languages": "*", "@rallly/tailwind-config": "*", "@rallly/ui": "*", + "@rallly/utils": "*", "@svgr/webpack": "^6.5.1", "@vercel/analytics": "^0.1.8", "accept-language-parser": "^1.5.0", diff --git a/apps/landing/src/app/[locale]/blog/[slug]/page.tsx b/apps/landing/src/app/[locale]/blog/[slug]/page.tsx index e9007c582..273bd7207 100644 --- a/apps/landing/src/app/[locale]/blog/[slug]/page.tsx +++ b/apps/landing/src/app/[locale]/blog/[slug]/page.tsx @@ -1,3 +1,4 @@ +import { absoluteUrl } from "@rallly/utils/absolute-url"; import { ArrowLeftIcon } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; @@ -5,7 +6,6 @@ import { MDXRemote } from "next-mdx-remote/rsc"; import PostHeader from "@/components/blog/post-header"; import { getAllPosts, getPostBySlug } from "@/lib/api"; -import { absoluteUrl } from "@/utils/absolute-url"; export default async function Page({ params }: { params: { slug: string } }) { const post = getPostBySlug(params.slug, [ diff --git a/apps/landing/src/app/[locale]/layout.tsx b/apps/landing/src/app/[locale]/layout.tsx index 142b03e8b..854f7996c 100644 --- a/apps/landing/src/app/[locale]/layout.tsx +++ b/apps/landing/src/app/[locale]/layout.tsx @@ -11,7 +11,7 @@ import { } from "@rallly/ui/dropdown-menu"; import { Analytics } from "@vercel/analytics/react"; import { ChevronRightIcon, MenuIcon } from "lucide-react"; -import { Viewport } from "next"; +import type { Viewport } from "next"; import Image from "next/image"; import Link from "next/link"; import { Trans } from "react-i18next/TransWithoutContext"; diff --git a/apps/landing/src/app/[locale]/pricing/page.tsx b/apps/landing/src/app/[locale]/pricing/page.tsx index 5ea58c70c..48aa03396 100644 --- a/apps/landing/src/app/[locale]/pricing/page.tsx +++ b/apps/landing/src/app/[locale]/pricing/page.tsx @@ -1,4 +1,4 @@ -import { TFunction } from "i18next"; +import type { TFunction } from "i18next"; import { TrendingUpIcon } from "lucide-react"; import Link from "next/link"; import { Trans } from "react-i18next/TransWithoutContext"; diff --git a/apps/landing/src/app/sitemap.ts b/apps/landing/src/app/sitemap.ts index b5155e181..d448d5da0 100644 --- a/apps/landing/src/app/sitemap.ts +++ b/apps/landing/src/app/sitemap.ts @@ -1,8 +1,8 @@ import { supportedLngs } from "@rallly/languages"; +import { absoluteUrl } from "@rallly/utils/absolute-url"; import type { MetadataRoute } from "next"; import { getAllPosts } from "@/lib/api"; -import { absoluteUrl } from "@/utils/absolute-url"; const alternateLanguages = supportedLngs.filter((lng) => lng !== "en"); 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/i18n/client.tsx b/apps/landing/src/i18n/client.tsx index 370719169..37f71c9b6 100644 --- a/apps/landing/src/i18n/client.tsx +++ b/apps/landing/src/i18n/client.tsx @@ -1,5 +1,6 @@ "use client"; -import i18next, { Namespace } from "i18next"; +import type { Namespace } from "i18next"; +import i18next from "i18next"; import ICU from "i18next-icu"; import resourcesToBackend from "i18next-resources-to-backend"; import React from "react"; diff --git a/apps/landing/src/i18n/server.ts b/apps/landing/src/i18n/server.ts index 791dc3315..2f48c385f 100644 --- a/apps/landing/src/i18n/server.ts +++ b/apps/landing/src/i18n/server.ts @@ -1,4 +1,5 @@ -import { createInstance, Namespace } from "i18next"; +import type { Namespace } from "i18next"; +import { createInstance } 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..febaa8ced 100644 --- a/apps/landing/src/middleware.ts +++ b/apps/landing/src/middleware.ts @@ -1,6 +1,7 @@ import { supportedLngs } from "@rallly/languages"; import languageParser from "accept-language-parser"; -import { NextRequest, NextResponse } from "next/server"; +import type { NextRequest} from "next/server"; +import { 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..a94049a9c 100644 --- a/apps/landing/src/pages/api/og-image.tsx +++ b/apps/landing/src/pages/api/og-image.tsx @@ -1,6 +1,6 @@ /* 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..f012fe332 100644 --- a/apps/landing/src/types.ts +++ b/apps/landing/src/types.ts @@ -1,5 +1,5 @@ -import { NextPage } from "next"; -import React from "react"; +import type { NextPage } from "next"; +import type React from "react"; export type ReactTag = keyof JSX.IntrinsicElements; diff --git a/apps/landing/src/utils/absolute-url.ts b/apps/landing/src/utils/absolute-url.ts deleted file mode 100644 index c0b8b0153..000000000 --- a/apps/landing/src/utils/absolute-url.ts +++ /dev/null @@ -1,30 +0,0 @@ -const port = process.env.PORT || 3000; - -const getVercelUrl = () => { - return process.env.NEXT_PUBLIC_VERCEL_URL - ? `https://${process.env.NEXT_PUBLIC_VERCEL_URL}` - : null; -}; - -function joinPath(baseUrl: string, subpath = "") { - if (subpath) { - const url = new URL(subpath, baseUrl); - return url.href; - } - - return baseUrl; -} - -export function absoluteUrl(subpath = "", query?: Record) { - const queryString = query - ? `?${Object.entries(query) - .map(([key, value]) => `${key}=${encodeURIComponent(value)}`) - .join("&")}` - : ""; - const baseUrl = - process.env.NEXT_PUBLIC_BASE_URL ?? - getVercelUrl() ?? - `http://localhost:${port}`; - - return joinPath(baseUrl, subpath) + queryString; -} diff --git a/apps/landing/src/utils/page-translations.ts b/apps/landing/src/utils/page-translations.ts index 28c605424..b3a3a066e 100644 --- a/apps/landing/src/utils/page-translations.ts +++ b/apps/landing/src/utils/page-translations.ts @@ -1,4 +1,4 @@ -import { GetStaticProps } from "next"; +import type { GetStaticProps } from "next"; import { serverSideTranslations } from "next-i18next/serverSideTranslations"; export const getStaticTranslations = diff --git a/apps/landing/tsconfig.json b/apps/landing/tsconfig.json index 2cc56f4ed..d992551a0 100644 --- a/apps/landing/tsconfig.json +++ b/apps/landing/tsconfig.json @@ -3,23 +3,12 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@/*": [ - "src/*" - ], - "~/*": [ - "public/*" - ] + "@/*": ["src/*"], + "~/*": ["public/*"], }, "checkJs": false, - "strictNullChecks": true + "strictNullChecks": true, }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"], } diff --git a/apps/web/.eslintrc.js b/apps/web/.eslintrc.js index 3d9be6e61..c3b985290 100644 --- a/apps/web/.eslintrc.js +++ b/apps/web/.eslintrc.js @@ -1,4 +1,4 @@ /** @type {import("eslint").Linter.Config} */ module.exports = { - ...require("@rallly/eslint-config")(__dirname), + ...require("@rallly/eslint-config/next")(__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..746d9abfc 100644 --- a/apps/web/declarations/next-auth.d.ts +++ b/apps/web/declarations/next-auth.d.ts @@ -1,8 +1,10 @@ /* 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 type { DefaultSession, DefaultUser } from "next-auth"; +import NextAuth from "next-auth"; +import type { DefaultJWT} from "next-auth/jwt"; +import { JWT } from "next-auth/jwt"; declare module "next-auth" { /** diff --git a/apps/web/playwright.config.ts b/apps/web/playwright.config.ts index 66a69c5fb..a551b456e 100644 --- a/apps/web/playwright.config.ts +++ b/apps/web/playwright.config.ts @@ -1,5 +1,6 @@ import { loadEnvConfig } from "@next/env"; -import { devices, PlaywrightTestConfig } from "@playwright/test"; +import type { PlaywrightTestConfig } from "@playwright/test"; +import { devices } from "@playwright/test"; const ci = process.env.CI === "true"; 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 f63bac478..79422818e 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)/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 5cefabea9..7cc192be2 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 f406c6b29..8f2845732 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 587fd1456..a663896b1 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 1b8afee49..9ca958016 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"; 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 a8c911d86..247aff25f 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,7 +16,8 @@ import { Trans } from "@/components/trans"; import { useSubscription } from "@/contexts/plan"; import { trpc } from "@/trpc/client"; -import { BillingPlans, PricingData } from "./billing-plans"; +import type { PricingData } from "./billing-plans"; +import { BillingPlans } from "./billing-plans"; declare global { interface Window { 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 3efabbaa7..c20958f09 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 { env } from "@/env"; import { getTranslation } from "@/i18n/server"; 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 edd8f174a..8f8ae5015 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 "@/i18n/server"; 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 236dc23ab..99f0e2cd1 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 @@ -1,5 +1,7 @@ "use client"; import { Button } from "@rallly/ui/button"; +import type { + DialogProps} from "@rallly/ui/dialog"; import { Dialog, DialogClose, @@ -7,7 +9,6 @@ import { DialogDescription, DialogFooter, DialogHeader, - 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 f80ee04fb..8a9ec1862 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 "@/i18n/server"; 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 efe676bba..6efceeae6 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({ diff --git a/apps/web/src/app/[locale]/(auth)/login/page.tsx b/apps/web/src/app/[locale]/(auth)/login/page.tsx index 514774f15..fba4788a5 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 { AuthCard } from "@/components/auth/auth-layout"; import { getTranslation } from "@/i18n/server"; diff --git a/apps/web/src/app/[locale]/(auth)/register/page.tsx b/apps/web/src/app/[locale]/(auth)/register/page.tsx index 4c5cec707..6219e6cb9 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 "@/i18n/server"; 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..49e6b3203 100644 --- a/apps/web/src/app/[locale]/admin/[adminUrlId]/page.tsx +++ b/apps/web/src/app/[locale]/admin/[adminUrlId]/page.tsx @@ -1,10 +1,10 @@ import { prisma } from "@rallly/database"; +import { absoluteUrl } from "@rallly/utils/absolute-url"; 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]/page.tsx b/apps/web/src/app/[locale]/invite/[urlId]/page.tsx index 6a63e0ce6..a93a8d897 100644 --- a/apps/web/src/app/[locale]/invite/[urlId]/page.tsx +++ b/apps/web/src/app/[locale]/invite/[urlId]/page.tsx @@ -1,10 +1,9 @@ import { prisma } from "@rallly/database"; -import { Metadata } from "next"; +import { absoluteUrl } from "@rallly/utils/absolute-url"; import { notFound } from "next/navigation"; import { InvitePage } from "@/app/[locale]/invite/[urlId]/invite-page"; import { getTranslation } from "@/i18n/server"; -import { absoluteUrl } from "@/utils/absolute-url"; export default async function Page() { return ; @@ -70,5 +69,5 @@ export async function generateMetadata({ }, ], }, - } satisfies Metadata; + }; } diff --git a/apps/web/src/app/[locale]/layout.tsx b/apps/web/src/app/[locale]/layout.tsx index 66f2982d3..1886ecbc6 100644 --- a/apps/web/src/app/[locale]/layout.tsx +++ b/apps/web/src/app/[locale]/layout.tsx @@ -2,7 +2,7 @@ import "tailwindcss/tailwind.css"; import "../../style.css"; 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"; diff --git a/apps/web/src/app/[locale]/new/page.tsx b/apps/web/src/app/[locale]/new/page.tsx index 69e3bed21..fcb76ef3f 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 { CreatePoll } from "@/components/create-poll"; import { UserDropdown } from "@/components/user-dropdown"; import { getTranslation } from "@/i18n/server"; diff --git a/apps/web/src/app/[locale]/p/[participantUrlId]/page.tsx b/apps/web/src/app/[locale]/p/[participantUrlId]/page.tsx index b7e6e678d..786dd2125 100644 --- a/apps/web/src/app/[locale]/p/[participantUrlId]/page.tsx +++ b/apps/web/src/app/[locale]/p/[participantUrlId]/page.tsx @@ -1,10 +1,10 @@ import { prisma } from "@rallly/database"; +import { absoluteUrl } from "@rallly/utils/absolute-url"; 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..49f76644e 100644 --- a/apps/web/src/app/[locale]/poll/[urlId]/duplicate-dialog.tsx +++ b/apps/web/src/app/[locale]/poll/[urlId]/duplicate-dialog.tsx @@ -1,5 +1,7 @@ "use client"; import { Button } from "@rallly/ui/button"; +import type { + DialogProps} from "@rallly/ui/dialog"; import { Dialog, DialogClose, @@ -7,7 +9,6 @@ import { DialogDescription, DialogFooter, DialogHeader, - 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..7f1a3a4f2 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 @@ -13,14 +13,15 @@ import Link from "next/link"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; +import type { + PollDetailsData} from "@/components/forms/poll-details-form"; import { - 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..63e51d9c8 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 @@ -6,9 +6,10 @@ import Link from "next/link"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; +import type { + PollSettingsFormData} from "@/components/forms/poll-settings"; import { - PollSettingsForm, - PollSettingsFormData, + PollSettingsForm } 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..53a89bac0 100644 --- a/apps/web/src/app/api/logout/route.ts +++ b/apps/web/src/app/api/logout/route.ts @@ -1,4 +1,5 @@ -import { NextRequest, NextResponse } from "next/server"; +import type { NextRequest} from "next/server"; +import { 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..956899d19 100644 --- a/apps/web/src/app/api/storage/[...key]/route.ts +++ b/apps/web/src/app/api/storage/[...key]/route.ts @@ -1,5 +1,6 @@ import { GetObjectCommand } from "@aws-sdk/client-s3"; -import { NextRequest, NextResponse } from "next/server"; +import type { NextRequest} from "next/server"; +import { 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..f08fc32cf 100644 --- a/apps/web/src/app/components/logout-button.tsx +++ b/apps/web/src/app/components/logout-button.tsx @@ -1,5 +1,6 @@ "use client"; -import { Button, ButtonProps } from "@rallly/ui/button"; +import type { ButtonProps } from "@rallly/ui/button"; +import { Button } from "@rallly/ui/button"; import { usePostHog } from "@/utils/posthog"; diff --git a/apps/web/src/app/guest.ts b/apps/web/src/app/guest.ts index c56cd5e61..2072a8fa6 100644 --- a/apps/web/src/app/guest.ts +++ b/apps/web/src/app/guest.ts @@ -1,9 +1,10 @@ import languages from "@rallly/languages"; +import { absoluteUrl } from "@rallly/utils/absolute-url"; 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 type { JWT } from "next-auth/jwt"; +import { encode } from "next-auth/jwt"; -import { absoluteUrl } from "@/utils/absolute-url"; import { randomid } from "@/utils/nanoid"; const supportedLocales = Object.keys(languages); diff --git a/apps/web/src/app/providers.tsx b/apps/web/src/app/providers.tsx index 0cd76514f..4536b00e6 100644 --- a/apps/web/src/app/providers.tsx +++ b/apps/web/src/app/providers.tsx @@ -9,7 +9,7 @@ import { useState } from "react"; import { UserProvider } from "@/components/user-provider"; import { I18nProvider } from "@/i18n/client"; import { trpcConfig } from "@/trpc/client/config"; -import { AppRouter } from "@/trpc/routers"; +import type { AppRouter } from "@/trpc/routers"; import { ConnectedDayjsProvider } from "@/utils/dayjs"; export const trpc = createTRPCReact({ diff --git a/apps/web/src/auth.ts b/apps/web/src/auth.ts index d3ad42a25..5a7ef551f 100644 --- a/apps/web/src/auth.ts +++ b/apps/web/src/auth.ts @@ -1,10 +1,11 @@ import { prisma } from "@rallly/database"; -import { +import { absoluteUrl } from "@rallly/utils/absolute-url"; +import type { GetServerSidePropsContext, NextApiRequest, NextApiResponse, } from "next"; -import { NextAuthOptions, User } from "next-auth"; +import type { NextAuthOptions, User } from "next-auth"; import NextAuth, { getServerSession as getServerSessionWithOptions, } from "next-auth/next"; @@ -12,14 +13,13 @@ import AzureADProvider from "next-auth/providers/azure-ad"; import CredentialsProvider from "next-auth/providers/credentials"; import EmailProvider from "next-auth/providers/email"; import GoogleProvider from "next-auth/providers/google"; -import { Provider } from "next-auth/providers/index"; +import type { Provider } from "next-auth/providers/index"; import { posthog } from "@/app/posthog"; import { CustomPrismaAdapter } from "@/auth/custom-prisma-adapter"; import { mergeGuestsIntoUser } from "@/auth/merge-user"; import { env } from "@/env"; import type { RegistrationTokenPayload } from "@/trpc/types"; -import { absoluteUrl } from "@/utils/absolute-url"; import { getEmailClient } from "@/utils/emails"; import { getValueByPath } from "@/utils/get-value-by-path"; import { generateOtp, randomid } from "@/utils/nanoid"; diff --git a/apps/web/src/auth/custom-prisma-adapter.ts b/apps/web/src/auth/custom-prisma-adapter.ts index 004bd78fe..a5d8ce87c 100644 --- a/apps/web/src/auth/custom-prisma-adapter.ts +++ b/apps/web/src/auth/custom-prisma-adapter.ts @@ -10,8 +10,8 @@ * See: https://github.com/lukevella/rallly/issues/949 */ import { PrismaAdapter } from "@auth/prisma-adapter"; -import { ExtendedPrismaClient, PrismaClient } from "@rallly/database"; -import { Adapter, AdapterAccount } from "next-auth/adapters"; +import type { ExtendedPrismaClient, PrismaClient } from "@rallly/database"; +import type { Adapter, AdapterAccount } from "next-auth/adapters"; export function CustomPrismaAdapter(client: ExtendedPrismaClient): Adapter { return { diff --git a/apps/web/src/components/add-to-calendar-button.tsx b/apps/web/src/components/add-to-calendar-button.tsx index b4bb10c0f..d83bf9e8c 100644 --- a/apps/web/src/components/add-to-calendar-button.tsx +++ b/apps/web/src/components/add-to-calendar-button.tsx @@ -9,8 +9,9 @@ import { DropdownMenuTrigger, } from "@rallly/ui/dropdown-menu"; import { Icon } from "@rallly/ui/icon"; +import type { + CalendarEvent} from "calendar-link"; import { - CalendarEvent, google, ics, office365, diff --git a/apps/web/src/components/create-poll.tsx b/apps/web/src/components/create-poll.tsx index 13d18cf97..4218397c6 100644 --- a/apps/web/src/components/create-poll.tsx +++ b/apps/web/src/components/create-poll.tsx @@ -21,7 +21,8 @@ import { trpc } from "@/trpc/client"; import { setCookie } from "@/utils/cookies"; import { usePostHog } from "@/utils/posthog"; -import { NewEventData, PollDetailsForm, PollOptionsForm } from "./forms"; +import type { NewEventData} from "./forms"; +import { PollDetailsForm, PollOptionsForm } from "./forms"; const required = (v: T | undefined): T => { if (!v) { diff --git a/apps/web/src/components/date-icon.tsx b/apps/web/src/components/date-icon.tsx index ef62c92dd..174e8d648 100644 --- a/apps/web/src/components/date-icon.tsx +++ b/apps/web/src/components/date-icon.tsx @@ -1,5 +1,6 @@ import clsx from "clsx"; -import dayjs, { Dayjs } from "dayjs"; +import type { Dayjs } from "dayjs"; +import dayjs from "dayjs"; export const DateIconInner = (props: { dow?: React.ReactNode; diff --git a/apps/web/src/components/forms/poll-details-form.tsx b/apps/web/src/components/forms/poll-details-form.tsx index 252e5fede..8d634e22c 100644 --- a/apps/web/src/components/forms/poll-details-form.tsx +++ b/apps/web/src/components/forms/poll-details-form.tsx @@ -7,7 +7,7 @@ import { useFormContext } from "react-hook-form"; import { Trans } from "@/components/trans"; import { useFormValidation } from "@/utils/form-validation"; -import { NewEventData } from "./types"; +import type { NewEventData } from "./types"; export interface PollDetailsData { title: string; diff --git a/apps/web/src/components/forms/poll-options-form/month-calendar/month-calendar.tsx b/apps/web/src/components/forms/poll-options-form/month-calendar/month-calendar.tsx index d1539f9f2..d83dd137a 100644 --- a/apps/web/src/components/forms/poll-options-form/month-calendar/month-calendar.tsx +++ b/apps/web/src/components/forms/poll-options-form/month-calendar/month-calendar.tsx @@ -24,7 +24,7 @@ import { useTranslation } from "next-i18next"; import * as React from "react"; import { useFormContext } from "react-hook-form"; -import { NewEventData } from "@/components/forms"; +import type { NewEventData } from "@/components/forms"; import { Trans } from "@/components/trans"; import { @@ -35,8 +35,8 @@ import { } from "../../../../utils/date-time-utils"; import DateCard from "../../../date-card"; import { useHeadlessDatePicker } from "../../../headless-date-picker"; -import { DateTimeOption } from ".."; -import { DateTimePickerProps } from "../types"; +import type { DateTimeOption } from ".."; +import type { DateTimePickerProps } from "../types"; import { formatDateWithoutTime, formatDateWithoutTz } from "../utils"; import TimePicker from "./time-picker"; diff --git a/apps/web/src/components/forms/poll-options-form/poll-options-form.tsx b/apps/web/src/components/forms/poll-options-form/poll-options-form.tsx index 9d7fa4608..f030581ea 100644 --- a/apps/web/src/components/forms/poll-options-form/poll-options-form.tsx +++ b/apps/web/src/components/forms/poll-options-form/poll-options-form.tsx @@ -23,9 +23,9 @@ import { useFormContext } from "react-hook-form"; import { TimeZoneCommand } from "@/components/time-zone-picker/time-zone-select"; import { getBrowserTimeZone } from "../../../utils/date-time-utils"; -import { NewEventData } from "../types"; +import type { NewEventData } from "../types"; import MonthCalendar from "./month-calendar"; -import { DateTimeOption } from "./types"; +import type { DateTimeOption } from "./types"; import WeekCalendar from "./week-calendar"; export type PollOptionsData = { diff --git a/apps/web/src/components/forms/poll-options-form/week-calendar.tsx b/apps/web/src/components/forms/poll-options-form/week-calendar.tsx index 50d0d1d4c..5cb47770d 100644 --- a/apps/web/src/components/forms/poll-options-form/week-calendar.tsx +++ b/apps/web/src/components/forms/poll-options-form/week-calendar.tsx @@ -4,13 +4,14 @@ import "./rbc-overrides.css"; import dayjs from "dayjs"; import { XIcon } from "lucide-react"; import React from "react"; -import { Calendar, CalendarProps } from "react-big-calendar"; +import type { CalendarProps } from "react-big-calendar"; +import { Calendar } from "react-big-calendar"; import { createBreakpoint } from "react-use"; import { getDuration } from "../../../utils/date-time-utils"; import DateNavigationToolbar from "./date-navigation-toolbar"; import dayjsLocalizer from "./dayjs-localizer"; -import { DateTimeOption, DateTimePickerProps } from "./types"; +import type { DateTimeOption, DateTimePickerProps } from "./types"; import { formatDateWithoutTz } from "./utils"; const localizer = dayjsLocalizer(dayjs); diff --git a/apps/web/src/components/forms/types.ts b/apps/web/src/components/forms/types.ts index b68b4f75f..f1d5d1b4a 100644 --- a/apps/web/src/components/forms/types.ts +++ b/apps/web/src/components/forms/types.ts @@ -1,7 +1,7 @@ -import { PollSettingsFormData } from "@/components/forms/poll-settings"; +import type { PollSettingsFormData } from "@/components/forms/poll-settings"; -import { PollDetailsData } from "./poll-details-form"; -import { PollOptionsData } from "./poll-options-form/poll-options-form"; +import type { PollDetailsData } from "./poll-details-form"; +import type { PollOptionsData } from "./poll-options-form/poll-options-form"; export type NewEventData = PollDetailsData & PollOptionsData & diff --git a/apps/web/src/components/login-link.tsx b/apps/web/src/components/login-link.tsx index 966992244..ce69d2b0a 100644 --- a/apps/web/src/components/login-link.tsx +++ b/apps/web/src/components/login-link.tsx @@ -1,4 +1,5 @@ -import Link, { LinkProps } from "next/link"; +import type { LinkProps } from "next/link"; +import Link from "next/link"; import { usePathname } from "next/navigation"; import React from "react"; diff --git a/apps/web/src/components/modal/modal-provider.tsx b/apps/web/src/components/modal/modal-provider.tsx index 219f9c1a2..9aee4d71a 100644 --- a/apps/web/src/components/modal/modal-provider.tsx +++ b/apps/web/src/components/modal/modal-provider.tsx @@ -2,7 +2,8 @@ import * as React from "react"; import { useList } from "react-use"; import { useRequiredContext } from "../use-required-context"; -import Modal, { ModalProps } from "./modal"; +import type { ModalProps } from "./modal"; +import Modal from "./modal"; export interface ModalProviderProps { children?: React.ReactNode; diff --git a/apps/web/src/components/modal/modal.tsx b/apps/web/src/components/modal/modal.tsx index 8dd70f623..ce221d032 100644 --- a/apps/web/src/components/modal/modal.tsx +++ b/apps/web/src/components/modal/modal.tsx @@ -1,4 +1,5 @@ -import { Button, ButtonProps } from "@rallly/ui/button"; +import type { ButtonProps } from "@rallly/ui/button"; +import { Button } from "@rallly/ui/button"; import { Dialog, DialogClose, diff --git a/apps/web/src/components/modal/use-modal.tsx b/apps/web/src/components/modal/use-modal.tsx index 2872e1407..d9dab0562 100644 --- a/apps/web/src/components/modal/use-modal.tsx +++ b/apps/web/src/components/modal/use-modal.tsx @@ -1,6 +1,7 @@ import React from "react"; -import Modal, { ModalProps } from "./modal"; +import type { ModalProps } from "./modal"; +import Modal from "./modal"; type OpenModalFn = () => void; type CloseModalFn = () => void; diff --git a/apps/web/src/components/new-participant-modal.tsx b/apps/web/src/components/new-participant-modal.tsx index 0b361c947..24c43dc5a 100644 --- a/apps/web/src/components/new-participant-modal.tsx +++ b/apps/web/src/components/new-participant-modal.tsx @@ -1,5 +1,5 @@ import { zodResolver } from "@hookform/resolvers/zod"; -import { VoteType } from "@rallly/database"; +import type { VoteType } from "@rallly/database"; import { Badge } from "@rallly/ui/badge"; import { Button } from "@rallly/ui/button"; import { FormMessage } from "@rallly/ui/form"; diff --git a/apps/web/src/components/page-dialog.tsx b/apps/web/src/components/page-dialog.tsx index e9b23e862..9870543e7 100644 --- a/apps/web/src/components/page-dialog.tsx +++ b/apps/web/src/components/page-dialog.tsx @@ -1,5 +1,5 @@ import { Container } from "@/components/container"; -import { IconComponent } from "@/types"; +import type { IconComponent } from "@/types"; export const PageDialog = ( props: React.PropsWithChildren<{ icon?: IconComponent }>, diff --git a/apps/web/src/components/participant-dropdown.tsx b/apps/web/src/components/participant-dropdown.tsx index 5b47e86f5..2065b9a41 100644 --- a/apps/web/src/components/participant-dropdown.tsx +++ b/apps/web/src/components/participant-dropdown.tsx @@ -30,7 +30,8 @@ import { Input } from "@rallly/ui/input"; import { PencilIcon, TagIcon, TrashIcon } from "lucide-react"; import { useTranslation } from "next-i18next"; import React from "react"; -import { SubmitHandler, useForm } from "react-hook-form"; +import type { SubmitHandler} from "react-hook-form"; +import { useForm } from "react-hook-form"; import { useMount } from "react-use"; import { z } from "zod"; diff --git a/apps/web/src/components/participants-provider.tsx b/apps/web/src/components/participants-provider.tsx index 826ce203c..8e8ed2050 100644 --- a/apps/web/src/components/participants-provider.tsx +++ b/apps/web/src/components/participants-provider.tsx @@ -1,10 +1,10 @@ -import { Participant, VoteType } from "@rallly/database"; +import type { Participant, VoteType } from "@rallly/database"; import * as React from "react"; import { useVisibility } from "@/components/visibility"; import { usePermissions } from "@/contexts/permissions"; import { trpc } from "@/trpc/client"; -import { Vote } from "@/trpc/client/types"; +import type { Vote } from "@/trpc/client/types"; import { useRequiredContext } from "./use-required-context"; diff --git a/apps/web/src/components/pay-wall-dialog.tsx b/apps/web/src/components/pay-wall-dialog.tsx index 1e46a52be..484014851 100644 --- a/apps/web/src/components/pay-wall-dialog.tsx +++ b/apps/web/src/components/pay-wall-dialog.tsx @@ -2,10 +2,11 @@ import { pricingData } from "@rallly/billing/pricing"; import { Badge } from "@rallly/ui/badge"; +import type { + DialogProps} from "@rallly/ui/dialog"; import { Dialog, DialogContent, - DialogProps, useDialog, } from "@rallly/ui/dialog"; import { RadioGroup, RadioGroupItem } from "@rallly/ui/radio-group"; diff --git a/apps/web/src/components/poll-context.tsx b/apps/web/src/components/poll-context.tsx index 2f9c6aa6d..8042c4e40 100644 --- a/apps/web/src/components/poll-context.tsx +++ b/apps/web/src/components/poll-context.tsx @@ -1,15 +1,16 @@ -import { Participant, VoteType } from "@rallly/database"; +import type { Participant, VoteType } from "@rallly/database"; import dayjs from "dayjs"; import { keyBy } from "lodash"; import { TrashIcon } from "lucide-react"; import { useTranslation } from "next-i18next"; import React from "react"; -import { GetPollApiResponse, Vote } from "@/trpc/client/types"; -import { - getDuration, +import type { GetPollApiResponse, Vote } from "@/trpc/client/types"; +import type { ParsedDateOption, - ParsedTimeSlotOption, + ParsedTimeSlotOption} from "@/utils/date-time-utils"; +import { + getDuration } from "@/utils/date-time-utils"; import { useDayjs } from "@/utils/dayjs"; diff --git a/apps/web/src/components/poll-status.tsx b/apps/web/src/components/poll-status.tsx index 498c62a24..447754016 100644 --- a/apps/web/src/components/poll-status.tsx +++ b/apps/web/src/components/poll-status.tsx @@ -1,4 +1,4 @@ -import { PollStatus } from "@rallly/database"; +import type { PollStatus } from "@rallly/database"; import { cn } from "@rallly/ui"; import { Trans } from "@/components/trans"; diff --git a/apps/web/src/components/poll/desktop-poll/participant-row.tsx b/apps/web/src/components/poll/desktop-poll/participant-row.tsx index 4c4c45c96..6dd080795 100644 --- a/apps/web/src/components/poll/desktop-poll/participant-row.tsx +++ b/apps/web/src/components/poll/desktop-poll/participant-row.tsx @@ -13,7 +13,7 @@ import { usePoll } from "@/components/poll-context"; import { Trans } from "@/components/trans"; import { useUser } from "@/components/user-provider"; import { usePermissions } from "@/contexts/permissions"; -import { Vote } from "@/trpc/client/types"; +import type { Vote } from "@/trpc/client/types"; import VoteIcon from "../vote-icon"; import ParticipantRowForm from "./participant-row-form"; diff --git a/apps/web/src/components/poll/manage-poll/finalize-poll-dialog.tsx b/apps/web/src/components/poll/manage-poll/finalize-poll-dialog.tsx index 0fe198ddb..2237ffdad 100644 --- a/apps/web/src/components/poll/manage-poll/finalize-poll-dialog.tsx +++ b/apps/web/src/components/poll/manage-poll/finalize-poll-dialog.tsx @@ -1,5 +1,7 @@ import { cn } from "@rallly/ui"; import { Button } from "@rallly/ui/button"; +import type { + DialogProps} from "@rallly/ui/dialog"; import { Dialog, DialogClose, @@ -7,7 +9,6 @@ import { DialogDescription, DialogFooter, DialogHeader, - DialogProps, DialogTitle, } from "@rallly/ui/dialog"; import { diff --git a/apps/web/src/components/poll/mobile-poll/date-option.tsx b/apps/web/src/components/poll/mobile-poll/date-option.tsx index 9839d1ae9..f4d461da9 100644 --- a/apps/web/src/components/poll/mobile-poll/date-option.tsx +++ b/apps/web/src/components/poll/mobile-poll/date-option.tsx @@ -1,6 +1,7 @@ import * as React from "react"; -import PollOption, { PollOptionProps } from "./poll-option"; +import type { PollOptionProps } from "./poll-option"; +import PollOption from "./poll-option"; export interface DateOptionProps extends PollOptionProps { dow: string; diff --git a/apps/web/src/components/poll/mobile-poll/grouped-options.tsx b/apps/web/src/components/poll/mobile-poll/grouped-options.tsx index 7320452e5..7d99f6fdf 100644 --- a/apps/web/src/components/poll/mobile-poll/grouped-options.tsx +++ b/apps/web/src/components/poll/mobile-poll/grouped-options.tsx @@ -2,7 +2,7 @@ import clsx from "clsx"; import { groupBy } from "lodash"; import * as React from "react"; -import { ParsedDateTimeOpton } from "@/utils/date-time-utils"; +import type { ParsedDateTimeOpton } from "@/utils/date-time-utils"; import PollOptions from "./poll-options"; diff --git a/apps/web/src/components/poll/mobile-poll/poll-option.tsx b/apps/web/src/components/poll/mobile-poll/poll-option.tsx index 4ba1f37a1..7e218638e 100644 --- a/apps/web/src/components/poll/mobile-poll/poll-option.tsx +++ b/apps/web/src/components/poll/mobile-poll/poll-option.tsx @@ -1,5 +1,5 @@ "use client"; -import { Participant, VoteType } from "@rallly/database"; +import type { Participant, VoteType } from "@rallly/database"; import { cn } from "@rallly/ui"; import { Button } from "@rallly/ui/button"; import { Icon } from "@rallly/ui/icon"; diff --git a/apps/web/src/components/poll/mobile-poll/poll-options.tsx b/apps/web/src/components/poll/mobile-poll/poll-options.tsx index a65916b42..4546f8b35 100644 --- a/apps/web/src/components/poll/mobile-poll/poll-options.tsx +++ b/apps/web/src/components/poll/mobile-poll/poll-options.tsx @@ -1,10 +1,10 @@ -import { VoteType } from "@rallly/database"; +import type { VoteType } from "@rallly/database"; import * as React from "react"; import { Controller } from "react-hook-form"; import { useVotingForm } from "@/components/poll/voting-form"; import { usePoll } from "@/components/poll-context"; -import { ParsedDateTimeOpton } from "@/utils/date-time-utils"; +import type { ParsedDateTimeOpton } from "@/utils/date-time-utils"; import DateOption from "./date-option"; import TimeSlotOption from "./time-slot-option"; diff --git a/apps/web/src/components/poll/mobile-poll/time-slot-option.tsx b/apps/web/src/components/poll/mobile-poll/time-slot-option.tsx index 043da8c76..1db9da299 100644 --- a/apps/web/src/components/poll/mobile-poll/time-slot-option.tsx +++ b/apps/web/src/components/poll/mobile-poll/time-slot-option.tsx @@ -1,7 +1,8 @@ import { ClockIcon } from "lucide-react"; import * as React from "react"; -import PollOption, { PollOptionProps } from "./poll-option"; +import type { PollOptionProps } from "./poll-option"; +import PollOption from "./poll-option"; export interface TimeSlotOptionProps extends PollOptionProps { startTime: string; diff --git a/apps/web/src/components/poll/mutations.ts b/apps/web/src/components/poll/mutations.ts index 503aa3d29..a0bc74f5d 100644 --- a/apps/web/src/components/poll/mutations.ts +++ b/apps/web/src/components/poll/mutations.ts @@ -2,7 +2,7 @@ import { usePoll } from "@/components/poll-context"; import { trpc } from "@/trpc/client"; import { usePostHog } from "@/utils/posthog"; -import { ParticipantForm } from "./types"; +import type { ParticipantForm } from "./types"; export const normalizeVotes = ( optionIds: string[], diff --git a/apps/web/src/components/poll/types.ts b/apps/web/src/components/poll/types.ts index b1208b523..4c20a535c 100644 --- a/apps/web/src/components/poll/types.ts +++ b/apps/web/src/components/poll/types.ts @@ -1,4 +1,4 @@ -import { VoteType } from "@rallly/database"; +import type { VoteType } from "@rallly/database"; export interface ParticipantForm { votes: Array< diff --git a/apps/web/src/components/poll/vote-icon.tsx b/apps/web/src/components/poll/vote-icon.tsx index 4415b2f30..927be9f6c 100644 --- a/apps/web/src/components/poll/vote-icon.tsx +++ b/apps/web/src/components/poll/vote-icon.tsx @@ -1,4 +1,4 @@ -import { VoteType } from "@rallly/database"; +import type { VoteType } from "@rallly/database"; import { IfNeedBeIcon, NoIcon, PendingIcon, YesIcon } from "@rallly/icons"; import clsx from "clsx"; import * as React from "react"; diff --git a/apps/web/src/components/poll/vote-selector.tsx b/apps/web/src/components/poll/vote-selector.tsx index f95e272d1..26117b89f 100644 --- a/apps/web/src/components/poll/vote-selector.tsx +++ b/apps/web/src/components/poll/vote-selector.tsx @@ -1,4 +1,4 @@ -import { VoteType } from "@rallly/database"; +import type { VoteType } from "@rallly/database"; import { cn } from "@rallly/ui"; import * as React from "react"; diff --git a/apps/web/src/components/register-link.tsx b/apps/web/src/components/register-link.tsx index 5ad0f6561..ab6829441 100644 --- a/apps/web/src/components/register-link.tsx +++ b/apps/web/src/components/register-link.tsx @@ -1,4 +1,5 @@ -import Link, { LinkProps } from "next/link"; +import type { LinkProps } from "next/link"; +import Link from "next/link"; import { usePathname, useRouter } from "next/navigation"; import React from "react"; diff --git a/apps/web/src/components/table/table-column-header.tsx b/apps/web/src/components/table/table-column-header.tsx index 8c45af79d..7e16728dd 100644 --- a/apps/web/src/components/table/table-column-header.tsx +++ b/apps/web/src/components/table/table-column-header.tsx @@ -1,6 +1,6 @@ import { cn } from "@rallly/ui"; import { Icon } from "@rallly/ui/icon"; -import { Column } from "@tanstack/react-table"; +import type { Column } from "@tanstack/react-table"; import { ArrowDownIcon, ArrowUpIcon, ChevronsUpDownIcon } from "lucide-react"; interface DataTableColumnHeaderProps diff --git a/apps/web/src/components/time-format-picker.tsx b/apps/web/src/components/time-format-picker.tsx index e7e2bfeb5..cf0f41ace 100644 --- a/apps/web/src/components/time-format-picker.tsx +++ b/apps/web/src/components/time-format-picker.tsx @@ -1,4 +1,4 @@ -import { TimeFormat } from "@rallly/database"; +import type { TimeFormat } from "@rallly/database"; import { RadioGroup, RadioGroupItem } from "@rallly/ui/radio-group"; import { Trans } from "@/components/trans"; diff --git a/apps/web/src/components/time-zone-picker/time-zone-select.tsx b/apps/web/src/components/time-zone-picker/time-zone-select.tsx index 47c856c3c..70f7accf0 100644 --- a/apps/web/src/components/time-zone-picker/time-zone-select.tsx +++ b/apps/web/src/components/time-zone-picker/time-zone-select.tsx @@ -1,6 +1,6 @@ "use client"; -import { SelectProps } from "@radix-ui/react-select"; +import type { SelectProps } from "@radix-ui/react-select"; import { Badge } from "@rallly/ui/badge"; import { Button } from "@rallly/ui/button"; import { diff --git a/apps/web/src/components/trans.tsx b/apps/web/src/components/trans.tsx index 25b5e87fa..e8bce31d9 100644 --- a/apps/web/src/components/trans.tsx +++ b/apps/web/src/components/trans.tsx @@ -2,7 +2,7 @@ import { Trans as BaseTrans } from "react-i18next"; import { useTranslation } from "@/i18n/client"; -import { I18nNamespaces } from "../../declarations/i18next"; +import type { I18nNamespaces } from "../../declarations/i18next"; export const Trans = (props: { i18nKey: keyof I18nNamespaces["app"]; diff --git a/apps/web/src/components/user-provider.tsx b/apps/web/src/components/user-provider.tsx index 464e0d0bb..bc58e7aa4 100644 --- a/apps/web/src/components/user-provider.tsx +++ b/apps/web/src/components/user-provider.tsx @@ -1,5 +1,5 @@ "use client"; -import { Session } from "next-auth"; +import type { Session } from "next-auth"; import { useSession } from "next-auth/react"; import React from "react"; diff --git a/apps/web/src/contexts/preferences.tsx b/apps/web/src/contexts/preferences.tsx index cf9350880..01785ebe5 100644 --- a/apps/web/src/contexts/preferences.tsx +++ b/apps/web/src/contexts/preferences.tsx @@ -1,4 +1,4 @@ -import { TimeFormat } from "@rallly/database"; +import type { TimeFormat } from "@rallly/database"; import React from "react"; import { useSetState } from "react-use"; diff --git a/apps/web/src/i18n/i18n.ts b/apps/web/src/i18n/i18n.ts index 37b1681d6..3609c720a 100644 --- a/apps/web/src/i18n/i18n.ts +++ b/apps/web/src/i18n/i18n.ts @@ -1,4 +1,5 @@ -import { createInstance, Namespace } from "i18next"; +import type { Namespace } from "i18next"; +import { createInstance } from "i18next"; import ICU from "i18next-icu"; import resourcesToBackend from "i18next-resources-to-backend"; import { initReactI18next } from "react-i18next/initReactI18next"; diff --git a/apps/web/src/i18n/settings.ts b/apps/web/src/i18n/settings.ts index ee224312a..66d91dbab 100644 --- a/apps/web/src/i18n/settings.ts +++ b/apps/web/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/web/src/pages/[locale]/auth/disable-notifications.tsx b/apps/web/src/pages/[locale]/auth/disable-notifications.tsx index 6cc1a598b..2a99ae50c 100644 --- a/apps/web/src/pages/[locale]/auth/disable-notifications.tsx +++ b/apps/web/src/pages/[locale]/auth/disable-notifications.tsx @@ -1,5 +1,5 @@ import { prisma } from "@rallly/database"; -import { GetServerSideProps } from "next"; +import type { GetServerSideProps } from "next"; import { getServerSession } from "@/auth"; import type { DisableNotificationsPayload } from "@/trpc/types"; diff --git a/apps/web/src/pages/_app.tsx b/apps/web/src/pages/_app.tsx index 64799f1ba..1abf3b4c1 100644 --- a/apps/web/src/pages/_app.tsx +++ b/apps/web/src/pages/_app.tsx @@ -4,8 +4,8 @@ import "../style.css"; import { TooltipProvider } from "@rallly/ui/tooltip"; import { domMax, LazyMotion } from "framer-motion"; -import { NextPage } from "next"; -import { AppProps } from "next/app"; +import type { NextPage } from "next"; +import type { AppProps } from "next/app"; import { Inter } from "next/font/google"; import Head from "next/head"; import { SessionProvider, signIn, useSession } from "next-auth/react"; @@ -17,7 +17,7 @@ import { I18nProvider } from "@/i18n/client"; import { trpc } from "@/trpc/client"; import { ConnectedDayjsProvider } from "@/utils/dayjs"; -import { NextPageWithLayout } from "../types"; +import type { NextPageWithLayout } from "../types"; const inter = Inter({ subsets: ["latin"], diff --git a/apps/web/src/pages/api/og-image-poll.tsx b/apps/web/src/pages/api/og-image-poll.tsx index 9d72780ee..64c9cea88 100644 --- a/apps/web/src/pages/api/og-image-poll.tsx +++ b/apps/web/src/pages/api/og-image-poll.tsx @@ -1,6 +1,6 @@ /* eslint-disable @next/next/no-img-element */ import { ImageResponse } from "next/og"; -import { NextRequest } from "next/server"; +import type { NextRequest } from "next/server"; import { z } from "zod"; const schema = z.object({ diff --git a/apps/web/src/pages/api/paddle.ts b/apps/web/src/pages/api/paddle.ts index e0ef98c79..43f82378b 100644 --- a/apps/web/src/pages/api/paddle.ts +++ b/apps/web/src/pages/api/paddle.ts @@ -4,7 +4,7 @@ import crypto from "crypto"; import type { NextApiRequest, NextApiResponse } from "next"; import * as Serialize from "php-serialize"; -import { PaddlePassthrough, PaddleRequest } from "@/paddle.interface"; +import type { PaddlePassthrough, PaddleRequest } from "@/paddle.interface"; const allowedIpAdresses = [ // Sandbox diff --git a/apps/web/src/pages/api/stripe/checkout.ts b/apps/web/src/pages/api/stripe/checkout.ts index 59d18b7e9..9b751b13f 100644 --- a/apps/web/src/pages/api/stripe/checkout.ts +++ b/apps/web/src/pages/api/stripe/checkout.ts @@ -1,10 +1,10 @@ import { getProPricing, stripe } from "@rallly/billing"; import { prisma } from "@rallly/database"; -import { NextApiRequest, NextApiResponse } from "next"; +import { absoluteUrl } from "@rallly/utils/absolute-url"; +import type { NextApiRequest, NextApiResponse } from "next"; import { z } from "zod"; import { getServerSession } from "@/auth"; -import { absoluteUrl } from "@/utils/absolute-url"; export const config = { edge: true, diff --git a/apps/web/src/pages/api/stripe/portal.ts b/apps/web/src/pages/api/stripe/portal.ts index 32c492eac..52ca06780 100644 --- a/apps/web/src/pages/api/stripe/portal.ts +++ b/apps/web/src/pages/api/stripe/portal.ts @@ -1,10 +1,10 @@ import { stripe } from "@rallly/billing"; import { prisma } from "@rallly/database"; -import { NextApiRequest, NextApiResponse } from "next"; +import { absoluteUrl } from "@rallly/utils/absolute-url"; +import type { NextApiRequest, NextApiResponse } from "next"; import { z } from "zod"; import { getServerSession } from "@/auth"; -import { absoluteUrl } from "@/utils/absolute-url"; const inputSchema = z.object({ session_id: z.string().optional(), diff --git a/apps/web/src/pages/api/stripe/webhook.ts b/apps/web/src/pages/api/stripe/webhook.ts index 57854a15a..028d6ad0d 100644 --- a/apps/web/src/pages/api/stripe/webhook.ts +++ b/apps/web/src/pages/api/stripe/webhook.ts @@ -3,7 +3,7 @@ import { stripe } from "@rallly/billing"; import { prisma } from "@rallly/database"; import * as Sentry from "@sentry/node"; import { buffer } from "micro"; -import { NextApiRequest, NextApiResponse } from "next"; +import type { NextApiRequest, NextApiResponse } from "next"; import { z } from "zod"; import { posthog, posthogApiHandler } from "@/app/posthog"; diff --git a/apps/web/src/pages/api/trpc/[trpc].ts b/apps/web/src/pages/api/trpc/[trpc].ts index af2bf183b..e57956aa7 100644 --- a/apps/web/src/pages/api/trpc/[trpc].ts +++ b/apps/web/src/pages/api/trpc/[trpc].ts @@ -4,7 +4,8 @@ import { createNextApiHandler } from "@trpc/server/adapters/next"; import { posthogApiHandler } from "@/app/posthog"; import { getServerSession } from "@/auth"; -import { AppRouter, appRouter } from "@/trpc/routers"; +import type { AppRouter} from "@/trpc/routers"; +import { appRouter } from "@/trpc/routers"; import { getEmailClient } from "@/utils/emails"; import { composeApiHandlers } from "@/utils/next"; diff --git a/apps/web/src/trpc/client/types.ts b/apps/web/src/trpc/client/types.ts index c8e8adf85..c52d635a3 100644 --- a/apps/web/src/trpc/client/types.ts +++ b/apps/web/src/trpc/client/types.ts @@ -1,4 +1,4 @@ -import { PollStatus, User, VoteType } from "@rallly/database"; +import type { PollStatus, User, VoteType } from "@rallly/database"; export type GetPollApiResponse = { id: string; diff --git a/apps/web/src/trpc/context.ts b/apps/web/src/trpc/context.ts index 2a1b688be..252b42459 100644 --- a/apps/web/src/trpc/context.ts +++ b/apps/web/src/trpc/context.ts @@ -1,4 +1,4 @@ -import { EmailClient } from "@rallly/emails"; +import type { EmailClient } from "@rallly/emails"; import type { NextApiRequest, NextApiResponse } from "next"; export type TRPCContext = { diff --git a/apps/web/src/trpc/routers/auth.ts b/apps/web/src/trpc/routers/auth.ts index b48fe65dc..4eee82802 100644 --- a/apps/web/src/trpc/routers/auth.ts +++ b/apps/web/src/trpc/routers/auth.ts @@ -7,7 +7,7 @@ import { generateOtp } from "@/utils/nanoid"; import { createToken, decryptToken } from "@/utils/session"; import { publicProcedure, rateLimitMiddleware, router } from "../trpc"; -import { RegistrationTokenPayload } from "../types"; +import type { RegistrationTokenPayload } from "../types"; export const auth = router({ requestRegistration: publicProcedure diff --git a/apps/web/src/trpc/routers/polls.ts b/apps/web/src/trpc/routers/polls.ts index b52728b43..bed015687 100644 --- a/apps/web/src/trpc/routers/polls.ts +++ b/apps/web/src/trpc/routers/polls.ts @@ -1,11 +1,12 @@ -import { PollStatus, prisma } from "@rallly/database"; +import type { PollStatus } from "@rallly/database"; +import { prisma } from "@rallly/database"; +import { absoluteUrl, shortUrl } from "@rallly/utils/absolute-url"; import { TRPCError } from "@trpc/server"; import dayjs from "dayjs"; import * as ics from "ics"; import { z } from "zod"; import { posthog } from "@/app/posthog"; -import { absoluteUrl, shortUrl } from "@/utils/absolute-url"; import { getEmailClient } from "@/utils/emails"; import { getTimeZoneAbbreviation } from "../../utils/date"; diff --git a/apps/web/src/trpc/routers/polls/comments.ts b/apps/web/src/trpc/routers/polls/comments.ts index 7fa270171..56982cb04 100644 --- a/apps/web/src/trpc/routers/polls/comments.ts +++ b/apps/web/src/trpc/routers/polls/comments.ts @@ -1,12 +1,12 @@ import { prisma } from "@rallly/database"; +import { absoluteUrl } from "@rallly/utils/absolute-url"; import { z } from "zod"; -import { absoluteUrl } from "@/utils/absolute-url"; import { getEmailClient } from "@/utils/emails"; import { createToken } from "@/utils/session"; import { publicProcedure, rateLimitMiddleware, router } from "../../trpc"; -import { DisableNotificationsPayload } from "../../types"; +import type { DisableNotificationsPayload } from "../../types"; export const comments = router({ list: publicProcedure diff --git a/apps/web/src/trpc/routers/polls/participants.ts b/apps/web/src/trpc/routers/polls/participants.ts index b901da91b..fb063bf87 100644 --- a/apps/web/src/trpc/routers/polls/participants.ts +++ b/apps/web/src/trpc/routers/polls/participants.ts @@ -1,12 +1,12 @@ import { prisma } from "@rallly/database"; +import { absoluteUrl } from "@rallly/utils/absolute-url"; import { TRPCError } from "@trpc/server"; import { z } from "zod"; -import { absoluteUrl } from "@/utils/absolute-url"; import { createToken } from "@/utils/session"; import { publicProcedure, rateLimitMiddleware, router } from "../../trpc"; -import { DisableNotificationsPayload } from "../../types"; +import type { DisableNotificationsPayload } from "../../types"; export const participants = router({ list: publicProcedure diff --git a/apps/web/src/trpc/trpc.ts b/apps/web/src/trpc/trpc.ts index 615abd10f..e07ac0c20 100644 --- a/apps/web/src/trpc/trpc.ts +++ b/apps/web/src/trpc/trpc.ts @@ -7,7 +7,7 @@ import superjson from "superjson"; import { isSelfHosted } from "@/utils/constants"; import { getSubscriptionStatus } from "@/utils/subscription"; -import { TRPCContext } from "./context"; +import type { TRPCContext } from "./context"; const t = initTRPC.context().create({ transformer: superjson, diff --git a/apps/web/src/utils/date-time-utils.ts b/apps/web/src/utils/date-time-utils.ts index 76fba8c9b..a63445c0e 100644 --- a/apps/web/src/utils/date-time-utils.ts +++ b/apps/web/src/utils/date-time-utils.ts @@ -2,7 +2,7 @@ import dayjs from "dayjs"; import { supportedTimeZones } from "@/utils/supported-time-zones"; -import { +import type { DateTimeOption, TimeOption, } from "../components/forms/poll-options-form"; diff --git a/apps/web/src/utils/dayjs.tsx b/apps/web/src/utils/dayjs.tsx index 24ae160e0..e006b3170 100644 --- a/apps/web/src/utils/dayjs.tsx +++ b/apps/web/src/utils/dayjs.tsx @@ -1,4 +1,4 @@ -import { TimeFormat } from "@rallly/database"; +import type { TimeFormat } from "@rallly/database"; import dayjs from "dayjs"; import advancedFormat from "dayjs/plugin/advancedFormat"; import duration from "dayjs/plugin/duration"; diff --git a/apps/web/src/utils/emails.ts b/apps/web/src/utils/emails.ts index 44d9d6588..ccac9626b 100644 --- a/apps/web/src/utils/emails.ts +++ b/apps/web/src/utils/emails.ts @@ -1,8 +1,9 @@ -import { EmailClient, SupportedEmailProviders } from "@rallly/emails"; +import type { SupportedEmailProviders } from "@rallly/emails"; +import { EmailClient } from "@rallly/emails"; +import { absoluteUrl } from "@rallly/utils/absolute-url"; import * as Sentry from "@sentry/nextjs"; import { env } from "@/env"; -import { absoluteUrl } from "@/utils/absolute-url"; import { isSelfHosted } from "@/utils/constants"; export const getEmailClient = (locale?: string) => { diff --git a/apps/web/src/utils/next.ts b/apps/web/src/utils/next.ts index 391f3b2c5..496e95705 100644 --- a/apps/web/src/utils/next.ts +++ b/apps/web/src/utils/next.ts @@ -1,4 +1,4 @@ -import { NextApiHandler } from "next"; +import type { NextApiHandler } from "next"; export function composeApiHandlers(...fns: NextApiHandler[]): NextApiHandler { return async (req, res) => { diff --git a/apps/web/tests/create-delete-poll.spec.ts b/apps/web/tests/create-delete-poll.spec.ts index e2081c558..294a0c5b8 100644 --- a/apps/web/tests/create-delete-poll.spec.ts +++ b/apps/web/tests/create-delete-poll.spec.ts @@ -1,5 +1,7 @@ -import { expect, Page, test } from "@playwright/test"; -import smtpTester, { MailServer } from "smtp-tester"; +import type { Page} from "@playwright/test"; +import { expect, test } from "@playwright/test"; +import type { MailServer } from "smtp-tester"; +import smtpTester from "smtp-tester"; import { NewPollPage } from "tests/new-poll-page"; test.describe.serial(() => { diff --git a/apps/web/tests/edit-options-page.ts b/apps/web/tests/edit-options-page.ts index 3e186c061..f913a62dc 100644 --- a/apps/web/tests/edit-options-page.ts +++ b/apps/web/tests/edit-options-page.ts @@ -1,4 +1,4 @@ -import { Page } from "@playwright/test"; +import type { Page } from "@playwright/test"; export class EditOptionsPage { constructor(public readonly page: Page) {} diff --git a/apps/web/tests/edit-options.spec.ts b/apps/web/tests/edit-options.spec.ts index 37847fd6b..018702597 100644 --- a/apps/web/tests/edit-options.spec.ts +++ b/apps/web/tests/edit-options.spec.ts @@ -1,6 +1,8 @@ -import { expect, Page, test } from "@playwright/test"; -import smtpTester, { MailServer } from "smtp-tester"; -import { EditOptionsPage } from "tests/edit-options-page"; +import type { Page} from "@playwright/test"; +import { expect, test } from "@playwright/test"; +import type { MailServer } from "smtp-tester"; +import smtpTester from "smtp-tester"; +import type { EditOptionsPage } from "tests/edit-options-page"; import { NewPollPage } from "tests/new-poll-page"; test.describe("edit options", () => { diff --git a/apps/web/tests/invite-page.ts b/apps/web/tests/invite-page.ts index aa157e903..aab10aa2d 100644 --- a/apps/web/tests/invite-page.ts +++ b/apps/web/tests/invite-page.ts @@ -1,4 +1,4 @@ -import { Page } from "@playwright/test"; +import type { Page } from "@playwright/test"; export class InvitePage { constructor(public readonly page: Page) {} diff --git a/apps/web/tests/new-poll-page.ts b/apps/web/tests/new-poll-page.ts index d8de6dda5..0fee36b86 100644 --- a/apps/web/tests/new-poll-page.ts +++ b/apps/web/tests/new-poll-page.ts @@ -1,4 +1,4 @@ -import { Page } from "@playwright/test"; +import type { Page } from "@playwright/test"; import { PollPage } from "tests/poll-page"; export class NewPollPage { diff --git a/apps/web/tests/poll-page.ts b/apps/web/tests/poll-page.ts index 01e5a5bc9..9ca40adca 100644 --- a/apps/web/tests/poll-page.ts +++ b/apps/web/tests/poll-page.ts @@ -1,4 +1,4 @@ -import { Page } from "@playwright/test"; +import type { Page } from "@playwright/test"; import { EditOptionsPage } from "tests/edit-options-page"; import { InvitePage } from "tests/invite-page"; diff --git a/apps/web/tests/vote-and-comment.spec.ts b/apps/web/tests/vote-and-comment.spec.ts index 9755e676b..c2f01cc0f 100644 --- a/apps/web/tests/vote-and-comment.spec.ts +++ b/apps/web/tests/vote-and-comment.spec.ts @@ -1,7 +1,9 @@ -import { expect, Page, Request, test } from "@playwright/test"; +import type { Page, Request } from "@playwright/test"; +import { expect, test } from "@playwright/test"; import { load } from "cheerio"; -import smtpTester, { MailServer } from "smtp-tester"; -import { PollPage } from "tests/poll-page"; +import type { MailServer } from "smtp-tester"; +import smtpTester from "smtp-tester"; +import type { PollPage } from "tests/poll-page"; import { NewPollPage } from "./new-poll-page"; diff --git a/packages/billing/.eslintrc.js b/packages/billing/.eslintrc.js new file mode 100644 index 000000000..3d9be6e61 --- /dev/null +++ b/packages/billing/.eslintrc.js @@ -0,0 +1,4 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + ...require("@rallly/eslint-config")(__dirname), +}; diff --git a/packages/billing/package.json b/packages/billing/package.json index 6f49c83ed..4eb9f9b4d 100644 --- a/packages/billing/package.json +++ b/packages/billing/package.json @@ -9,7 +9,8 @@ "./*": "./src/*.ts" }, "scripts": { - "normalize-subscription-metadata": "dotenv -e ../../.env -- tsx ./src/scripts/normalize-metadata.ts" + "normalize-subscription-metadata": "dotenv -e ../../.env -- tsx ./src/scripts/normalize-metadata.ts", + "type-check": "tsc --pretty --noEmit" }, "dependencies": { "@radix-ui/react-radio-group": "^1.2.0", diff --git a/packages/billing/src/scripts/normalize-subscription-metadata.ts b/packages/billing/src/scripts/normalize-subscription-metadata.ts index 8067421c7..aba1b136e 100644 --- a/packages/billing/src/scripts/normalize-subscription-metadata.ts +++ b/packages/billing/src/scripts/normalize-subscription-metadata.ts @@ -1,9 +1,11 @@ +/* eslint-disable no-console */ /** * This script will go through all subscriptions and add the userId to the metadata. */ -import { stripe } from "../lib/stripe"; import { prisma } from "@rallly/database"; +import { stripe } from "../lib/stripe"; + async function getSubscriptionsWithMissingMetadata( starting_after?: string, ): Promise { diff --git a/packages/database/package.json b/packages/database/package.json index 15bd023b3..fcf7a6043 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -7,11 +7,13 @@ "db:push": "prisma db push --skip-generate", "db:deploy": "prisma migrate deploy", "db:migrate": "prisma migrate dev", - "db:seed": "tsx prisma/seed.ts" + "db:seed": "tsx prisma/seed.ts", + "type-check": "tsc --pretty --noEmit" }, "exports": "./index.ts", "devDependencies": { "@faker-js/faker": "^7.6.0", + "@rallly/eslint-config": "*", "@rallly/tsconfig": "*", "@types/node": "^18.15.10", "prisma": "^5.17.0", diff --git a/packages/emails/.eslintrc.js b/packages/emails/.eslintrc.js index 3d9be6e61..4c5998cec 100644 --- a/packages/emails/.eslintrc.js +++ b/packages/emails/.eslintrc.js @@ -1,4 +1,4 @@ /** @type {import("eslint").Linter.Config} */ module.exports = { - ...require("@rallly/eslint-config")(__dirname), + ...require("@rallly/eslint-config/preset")(__dirname), }; diff --git a/packages/emails/src/components/email-context.tsx b/packages/emails/src/components/email-context.tsx index 4f760d9d6..37c1d422d 100644 --- a/packages/emails/src/components/email-context.tsx +++ b/packages/emails/src/components/email-context.tsx @@ -1,5 +1,5 @@ import { i18nDefaultConfig, i18nInstance } from "../i18n"; -import { EmailContext } from "../types"; +import type { EmailContext } from "../types"; i18nInstance.init({ ...i18nDefaultConfig, diff --git a/packages/emails/src/components/email-layout.tsx b/packages/emails/src/components/email-layout.tsx index 88ea1e829..1690b7165 100644 --- a/packages/emails/src/components/email-layout.tsx +++ b/packages/emails/src/components/email-layout.tsx @@ -9,7 +9,7 @@ import { } from "@react-email/components"; import { Trans } from "react-i18next/TransWithoutContext"; -import { EmailContext } from "../types"; +import type { EmailContext } from "../types"; import { darkTextColor, fontFamily, Link, Text } from "./styled-components"; export interface EmailLayoutProps { diff --git a/packages/emails/src/components/styled-components.tsx b/packages/emails/src/components/styled-components.tsx index 65c4da1fd..fda938aa8 100644 --- a/packages/emails/src/components/styled-components.tsx +++ b/packages/emails/src/components/styled-components.tsx @@ -1,12 +1,13 @@ +import type { + LinkProps, + SectionProps, + TextProps} from "@react-email/components"; import { Button as UnstyledButton, Heading as UnstyledHeading, Link as UnstyledLink, - LinkProps, Section as UnstyledSection, - SectionProps, - Text as UnstyledText, - TextProps, + Text as UnstyledText } from "@react-email/components"; import type { EmailContext } from "../types"; diff --git a/packages/emails/src/send-email.tsx b/packages/emails/src/send-email.tsx index 8ea2fdf92..0c7c4ce29 100644 --- a/packages/emails/src/send-email.tsx +++ b/packages/emails/src/send-email.tsx @@ -2,7 +2,8 @@ import * as aws from "@aws-sdk/client-ses"; import { defaultProvider } from "@aws-sdk/credential-provider-node"; import { renderAsync } from "@react-email/render"; import { waitUntil } from "@vercel/functions"; -import { createTransport, Transporter } from "nodemailer"; +import type { Transporter } from "nodemailer"; +import { createTransport } from "nodemailer"; import type Mail from "nodemailer/lib/mailer"; import React from "react"; diff --git a/packages/emails/src/templates/new-comment.tsx b/packages/emails/src/templates/new-comment.tsx index ac2c878bf..97ff4a8dd 100644 --- a/packages/emails/src/templates/new-comment.tsx +++ b/packages/emails/src/templates/new-comment.tsx @@ -1,8 +1,9 @@ import { Trans } from "react-i18next/TransWithoutContext"; -import NotificationEmail, { +import type { NotificationBaseProps, } from "../components/notification-email"; +import NotificationEmail from "../components/notification-email"; import { Heading, Text } from "../components/styled-components"; import type { EmailContext } from "../types"; diff --git a/packages/emails/src/templates/new-participant.tsx b/packages/emails/src/templates/new-participant.tsx index 7a50aa959..b0efa9a48 100644 --- a/packages/emails/src/templates/new-participant.tsx +++ b/packages/emails/src/templates/new-participant.tsx @@ -1,8 +1,7 @@ import { Trans } from "react-i18next/TransWithoutContext"; -import NotificationEmail, { - NotificationBaseProps, -} from "../components/notification-email"; +import type { NotificationBaseProps } from "../components/notification-email"; +import NotificationEmail from "../components/notification-email"; import { Heading, Text } from "../components/styled-components"; import type { EmailContext } from "../types"; diff --git a/packages/eslint-config/next.js b/packages/eslint-config/next.js new file mode 100644 index 000000000..df791aace --- /dev/null +++ b/packages/eslint-config/next.js @@ -0,0 +1,11 @@ +const preset = require("./preset"); + +/** @return {import("eslint").Linter.Config} */ +module.exports = function (workspaceDirPath) { + const baseConfig = preset(workspaceDirPath); + + return { + ...baseConfig, + extends: [...baseConfig.extends, "next"], + }; +}; diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 9d5b707d6..5f81adaef 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -1,7 +1,9 @@ { "name": "@rallly/eslint-config", "version": "0.0.0", - "main": "preset.js", + "exports": { + "./*": "./*.js" + }, "private": true, "devDependencies": { "@typescript-eslint/eslint-plugin": "^6.6.0", diff --git a/packages/eslint-config/preset.js b/packages/eslint-config/preset.js index e03e64e39..5c8aac861 100644 --- a/packages/eslint-config/preset.js +++ b/packages/eslint-config/preset.js @@ -2,8 +2,15 @@ module.exports = function (workspaceDirPath) { return { root: true, - extends: ["next", "turbo"], - plugins: ["simple-import-sort", "@typescript-eslint"], + extends: ["turbo"], + plugins: [ + "eslint-plugin-import", + "simple-import-sort", + "@typescript-eslint", + ], + env: { + es6: true, + }, ignorePatterns: ["dist/", "playwright-report/"], globals: { React: true, @@ -32,6 +39,7 @@ module.exports = function (workspaceDirPath) { "import/no-duplicates": "error", "no-console": ["error", { allow: ["warn", "error", "info"] }], "no-unused-vars": "error", + "@typescript-eslint/consistent-type-imports": "error", }, }; }; diff --git a/packages/tsconfig/base.json b/packages/tsconfig/base.json index a3339ebe2..e35905d37 100644 --- a/packages/tsconfig/base.json +++ b/packages/tsconfig/base.json @@ -6,6 +6,7 @@ "noPropertyAccessFromIndexSignature": false, "exactOptionalPropertyTypes": false, "noUncheckedIndexedAccess": false, - "noImplicitReturns": false + "noImplicitReturns": false, + "verbatimModuleSyntax": true } } diff --git a/packages/ui/.eslintrc.js b/packages/ui/.eslintrc.js new file mode 100644 index 000000000..a3b5a656d --- /dev/null +++ b/packages/ui/.eslintrc.js @@ -0,0 +1,2 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = require("@rallly/eslint-config/preset")(__dirname); diff --git a/packages/ui/package.json b/packages/ui/package.json index 0232de418..19e8e9a5b 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -5,7 +5,9 @@ "main": "src/index.ts", "types": "src/index.ts", "scripts": { - "ui:add": "npx shadcn-ui@latest add" + "ui:add": "npx shadcn-ui@latest add", + "lint": "eslint .", + "type-check": "tsc --noEmit" }, "exports": { ".": "./src/lib/utils.ts", @@ -36,6 +38,7 @@ "tailwind-merge": "^1.12.0" }, "devDependencies": { + "@rallly/eslint-config": "*", "@rallly/tsconfig": "*" } } diff --git a/packages/ui/src/avatar.tsx b/packages/ui/src/avatar.tsx index bcaebfb94..12460d690 100644 --- a/packages/ui/src/avatar.tsx +++ b/packages/ui/src/avatar.tsx @@ -1,9 +1,8 @@ "use client"; -import * as React from "react"; import * as AvatarPrimitive from "@radix-ui/react-avatar"; - import { cn } from "@rallly/ui"; +import * as React from "react"; const Avatar = React.forwardRef< React.ElementRef, @@ -82,4 +81,4 @@ const AvatarFallback = React.forwardRef< }); AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; -export { Avatar, AvatarImage, AvatarFallback }; +export { Avatar, AvatarFallback,AvatarImage }; diff --git a/packages/ui/src/button.tsx b/packages/ui/src/button.tsx index 7782cbc11..4e897ba7c 100644 --- a/packages/ui/src/button.tsx +++ b/packages/ui/src/button.tsx @@ -1,8 +1,10 @@ "use client"; import { Slot } from "@radix-ui/react-slot"; -import { cva, VariantProps } from "class-variance-authority"; -import * as React from "react"; +import type { VariantProps } from "class-variance-authority"; +import { cva } from "class-variance-authority"; import { Loader2Icon } from "lucide-react"; +import * as React from "react"; + import { cn } from "./lib/utils"; const buttonVariants = cva( diff --git a/packages/ui/src/checkbox.tsx b/packages/ui/src/checkbox.tsx index 03527e371..5317760e3 100644 --- a/packages/ui/src/checkbox.tsx +++ b/packages/ui/src/checkbox.tsx @@ -1,7 +1,8 @@ "use client"; -import * as React from "react"; import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; +import * as React from "react"; + import CheckboxCheckIcon from "./checkbox-check.svg"; import { cn } from "./lib/utils"; diff --git a/packages/ui/src/command.tsx b/packages/ui/src/command.tsx index 6994f84f1..949789c31 100644 --- a/packages/ui/src/command.tsx +++ b/packages/ui/src/command.tsx @@ -1,13 +1,13 @@ "use client"; -import { DialogProps } from "@radix-ui/react-dialog"; -import { SearchIcon } from "lucide-react"; +import type { DialogProps } from "@radix-ui/react-dialog"; import { Command as CommandPrimitive } from "cmdk"; +import { SearchIcon } from "lucide-react"; import * as React from "react"; import { Dialog, DialogContent } from "./dialog"; -import { cn } from "./lib/utils"; import { Icon } from "./icon"; +import { cn } from "./lib/utils"; const Command = React.forwardRef< React.ElementRef, diff --git a/packages/ui/src/dialog.tsx b/packages/ui/src/dialog.tsx index 94ff54c49..609fe41cb 100644 --- a/packages/ui/src/dialog.tsx +++ b/packages/ui/src/dialog.tsx @@ -5,6 +5,7 @@ import { XIcon } from "lucide-react"; import * as React from "react"; import { cn } from "./lib/utils"; + export type { DialogProps } from "@radix-ui/react-dialog"; const Dialog = DialogPrimitive.Root; diff --git a/packages/ui/src/dropdown-menu.tsx b/packages/ui/src/dropdown-menu.tsx index 1507868bd..9345da728 100644 --- a/packages/ui/src/dropdown-menu.tsx +++ b/packages/ui/src/dropdown-menu.tsx @@ -4,8 +4,8 @@ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; import { CheckIcon, ChevronRightIcon, PlusCircleIcon } from "lucide-react"; import * as React from "react"; -import { cn } from "./lib/utils"; import { Icon } from "./icon"; +import { cn } from "./lib/utils"; const DropdownMenu = DropdownMenuPrimitive.Root; @@ -21,7 +21,7 @@ const DropdownMenuTrigger = React.forwardRef< }} /> )); - +DropdownMenuTrigger.displayName = DropdownMenuPrimitive.Trigger.displayName; const DropdownMenuGroup = DropdownMenuPrimitive.Group; const DropdownMenuPortal = DropdownMenuPrimitive.Portal; diff --git a/packages/ui/src/flex.tsx b/packages/ui/src/flex.tsx index aab17dbe4..b3875cd62 100644 --- a/packages/ui/src/flex.tsx +++ b/packages/ui/src/flex.tsx @@ -1,9 +1,10 @@ +import { Slot } from "@radix-ui/react-slot"; +import type {VariantProps } from "class-variance-authority"; +import { cva } from "class-variance-authority"; import * as React from "react"; -import { Slot } from "@radix-ui/react-slot"; +import type { ComponentPropsWithout, RemovedProps } from "./helpers/component-props"; import { cn } from "./lib/utils"; -import { VariantProps, cva } from "class-variance-authority"; -import { ComponentPropsWithout, RemovedProps } from "./helpers/component-props"; type FlexElement = React.ElementRef<"div">; type FlexDivProps = { as?: "div" } & ComponentPropsWithout<"div", RemovedProps>; diff --git a/packages/ui/src/form.tsx b/packages/ui/src/form.tsx index a5eea9cc0..e2a655d66 100644 --- a/packages/ui/src/form.tsx +++ b/packages/ui/src/form.tsx @@ -1,11 +1,12 @@ -import * as LabelPrimitive from "@radix-ui/react-label"; +import type * as LabelPrimitive from "@radix-ui/react-label"; import { Slot } from "@radix-ui/react-slot"; import * as React from "react"; -import { - Controller, +import type { ControllerProps, FieldPath, - FieldValues, + FieldValues} from "react-hook-form"; +import { + Controller, FormProvider, useFormContext, } from "react-hook-form"; diff --git a/packages/ui/src/helpers/component-props.ts b/packages/ui/src/helpers/component-props.ts index 6f8fbedd2..d3cfe0a87 100644 --- a/packages/ui/src/helpers/component-props.ts +++ b/packages/ui/src/helpers/component-props.ts @@ -1,6 +1,7 @@ import type React from "react"; type ComponentPropsAs< + // eslint-disable-next-line @typescript-eslint/no-explicit-any C extends React.ElementType, T extends React.ComponentPropsWithoutRef["as"], > = Omit< diff --git a/packages/ui/src/hooks/use-toast.ts b/packages/ui/src/hooks/use-toast.ts index ffeeb4654..6a8115203 100644 --- a/packages/ui/src/hooks/use-toast.ts +++ b/packages/ui/src/hooks/use-toast.ts @@ -186,4 +186,4 @@ function useToast() { }; } -export { useToast, toast }; +export { toast,useToast }; diff --git a/packages/ui/src/icon.tsx b/packages/ui/src/icon.tsx index 273532909..580856a23 100644 --- a/packages/ui/src/icon.tsx +++ b/packages/ui/src/icon.tsx @@ -1,7 +1,9 @@ "use client"; import { Slot } from "@radix-ui/react-slot"; +import type {VariantProps } from "class-variance-authority"; +import { cva } from "class-variance-authority"; + import { cn } from "./lib/utils"; -import { VariantProps, cva } from "class-variance-authority"; const iconVariants = cva("", { variants: { diff --git a/packages/ui/src/input.tsx b/packages/ui/src/input.tsx index 250ae7cfc..a88fd9c38 100644 --- a/packages/ui/src/input.tsx +++ b/packages/ui/src/input.tsx @@ -1,7 +1,7 @@ +import { cva } from "class-variance-authority"; import * as React from "react"; import { cn } from "./lib/utils"; -import { cva } from "class-variance-authority"; export type InputProps = Omit< React.InputHTMLAttributes, diff --git a/packages/ui/src/label.tsx b/packages/ui/src/label.tsx index 4817f8464..494e76a86 100644 --- a/packages/ui/src/label.tsx +++ b/packages/ui/src/label.tsx @@ -1,7 +1,8 @@ "use client"; import * as LabelPrimitive from "@radix-ui/react-label"; -import { cva, VariantProps } from "class-variance-authority"; +import type { VariantProps } from "class-variance-authority"; +import { cva } from "class-variance-authority"; import * as React from "react"; import { cn } from "./lib/utils"; diff --git a/packages/ui/src/lib/utils.ts b/packages/ui/src/lib/utils.ts index 70f56a54e..73803b0ce 100644 --- a/packages/ui/src/lib/utils.ts +++ b/packages/ui/src/lib/utils.ts @@ -1,4 +1,5 @@ -import clsx, { ClassValue } from "clsx"; +import type { ClassValue } from "clsx"; +import clsx from "clsx"; import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { diff --git a/packages/ui/src/radio-pills.tsx b/packages/ui/src/radio-pills.tsx index b392483c0..4e816d654 100644 --- a/packages/ui/src/radio-pills.tsx +++ b/packages/ui/src/radio-pills.tsx @@ -15,6 +15,7 @@ const RadioPills = React.forwardRef< {...props} /> )); +RadioPills.displayName = Primitive.Root.displayName; const RadioPillsItem = React.forwardRef< React.ElementRef, diff --git a/packages/ui/src/select.tsx b/packages/ui/src/select.tsx index 63095618f..c6b8ff0a1 100644 --- a/packages/ui/src/select.tsx +++ b/packages/ui/src/select.tsx @@ -4,8 +4,8 @@ import * as SelectPrimitive from "@radix-ui/react-select"; import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; import * as React from "react"; -import { cn } from "./lib/utils"; import { Icon } from "./icon"; +import { cn } from "./lib/utils"; const Select = SelectPrimitive.Root; @@ -24,6 +24,7 @@ const SelectValue = React.forwardRef< ); }); +SelectValue.displayName = SelectPrimitive.Value.displayName; const SelectTrigger = React.forwardRef< React.ElementRef, diff --git a/packages/ui/src/text-field.tsx b/packages/ui/src/text-field.tsx index 99126291a..173e51006 100644 --- a/packages/ui/src/text-field.tsx +++ b/packages/ui/src/text-field.tsx @@ -1,10 +1,12 @@ "use client"; +import type { VariantProps } from "class-variance-authority"; +import { cva } from "class-variance-authority"; import * as React from "react"; +import type { IconProps } from "./icon"; +import { Icon } from "./icon"; import { cn } from "./lib/utils"; -import { VariantProps, cva } from "class-variance-authority"; -import { Icon, IconProps } from "./icon"; const inputVariants = cva( cn( @@ -47,13 +49,14 @@ const TextFieldInput = React.forwardRef( ); }, ); +TextFieldInput.displayName = "TextFieldInput"; interface TextFieldProps extends InputProps { children?: React.ReactNode; } const TextField = React.forwardRef( - ({ className, size, type, children, ...props }, ref) => { + ({ className, size, children, ...props }, ref) => { return (
; type ToastActionElement = React.ReactElement; export { - type ToastProps, type ToastActionElement, - ToastProvider, - ToastViewport, + type ToastProps, Toast, - ToastTitle, - ToastDescription, - ToastClose, ToastAction, + ToastClose, + ToastDescription, + ToastProvider, + ToastTitle, + ToastViewport, }; diff --git a/packages/ui/src/toaster.tsx b/packages/ui/src/toaster.tsx index a5ed4dcc0..6e54f56e4 100644 --- a/packages/ui/src/toaster.tsx +++ b/packages/ui/src/toaster.tsx @@ -1,4 +1,5 @@ "use client"; +import { useToast } from "./hooks/use-toast"; import { Toast, ToastClose, @@ -7,7 +8,6 @@ import { ToastTitle, ToastViewport, } from "./toast"; -import { useToast } from "./hooks/use-toast"; export function Toaster() { const { toasts } = useToast(); diff --git a/packages/ui/tailwind.config.js b/packages/ui/tailwind.config.js index 7aafe5288..31dcd66a6 100644 --- a/packages/ui/tailwind.config.js +++ b/packages/ui/tailwind.config.js @@ -1,3 +1 @@ -const sharedConfig = require("@rallly/tailwind-config/tailwind.config"); - -module.exports = sharedConfig; +module.exports = require("@rallly/tailwind-config/tailwind.config"); diff --git a/packages/utils/package.json b/packages/utils/package.json index fc6848be5..11c1996f8 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -2,6 +2,13 @@ "name": "@rallly/utils", "version": "0.0.0", "private": true, - "main": "index.ts", - "types": "index.ts" + "scripts": { + "test:unit": "vitest run" + }, + "exports": { + "./*": "./src/*.ts" + }, + "devDependencies": { + "vitest": "^2.1.1" + } } diff --git a/apps/web/src/utils/absolute-url.test.ts b/packages/utils/src/absolute-url.test.ts similarity index 100% rename from apps/web/src/utils/absolute-url.test.ts rename to packages/utils/src/absolute-url.test.ts diff --git a/apps/web/src/utils/absolute-url.ts b/packages/utils/src/absolute-url.ts similarity index 100% rename from apps/web/src/utils/absolute-url.ts rename to packages/utils/src/absolute-url.ts diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json index 3584963a3..49bb37363 100644 --- a/packages/utils/tsconfig.json +++ b/packages/utils/tsconfig.json @@ -1,4 +1,7 @@ { + "compilerOptions": { + "types": ["vitest/globals"], + }, "extends": "@rallly/tsconfig/react.json", "include": ["**/*.ts", "**/*.tsx"], } diff --git a/packages/utils/vitest.config.mts b/packages/utils/vitest.config.mts new file mode 100644 index 000000000..7717bf3c6 --- /dev/null +++ b/packages/utils/vitest.config.mts @@ -0,0 +1,10 @@ +import path from "path"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + globals: true, + include: ["**/*.test.ts"], + exclude: ["**/node_modules/**", "**/*.spec.ts"], + }, +});