diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 8bfa1a6..c0c7617 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -3,12 +3,16 @@ const config = { parser: "@typescript-eslint/parser", parserOptions: { project: true, + sourceType: "module", }, - plugins: ["@typescript-eslint"], + plugins: ["@typescript-eslint", "prettier", "import"], extends: [ "plugin:@next/next/recommended", - // "plugin:@typescript-eslint/recommended-type-checked", - // "plugin:@typescript-eslint/stylistic-type-checked", + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended", + "plugin:import/recommended", + "plugin:import/typescript", ], rules: { // These opinionated rules are enabled in stylistic-type-checked above. @@ -32,8 +36,51 @@ const config = { checksVoidReturn: { attributes: false }, }, ], + + "sort-imports": [ + "error", + { + ignoreCase: false, + ignoreDeclarationSort: true, // don"t want to sort import lines, use eslint-plugin-import instead + ignoreMemberSort: false, + memberSyntaxSortOrder: ["none", "all", "multiple", "single"], + allowSeparatedGroups: true, + }, + ], + + "import/order": [ + "error", + { + groups: [ + "builtin", // Built-in imports (come from NodeJS native) go first + "external", // <- External imports + "internal", // <- Absolute imports + ["sibling", "parent"], // <- Relative imports, the sibling and parent types they can be mingled together + "index", // <- index imports + "unknown", // <- unknown + ], + "newlines-between": "always", + alphabetize: { + /* sort in ascending order. Options: ["ignore", "asc", "desc"] */ + order: "asc", + /* ignore case. Options: [true, false] */ + caseInsensitive: true, + }, + }, + ], }, ignorePatterns: ["*.js"], + env: { + node: true, + }, + + settings: { + "import/resolver": { + typescript: { + project: "./tsconfig.json", + }, + }, + }, }; module.exports = config; diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..baaf67e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + // "editor.formatOnSave": true, + "eslint.validate": [ + "typescript" + ], + "editor.codeActionsOnSave": { + "source.fixAll": "always" + }, +} \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index fd18e50..0752d1d 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 6dd39ef..10aee99 100644 --- a/package.json +++ b/package.json @@ -78,15 +78,20 @@ "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", "@types/react-syntax-highlighter": "^15.5.11", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "@typescript-eslint/parser": "^6.11.0", + "@typescript-eslint/eslint-plugin": "^7.0.2", + "@typescript-eslint/parser": "^7.0.2", + "add": "^2.0.6", "autoprefixer": "^10.4.14", "dotenv-cli": "^7.3.0", "drizzle-kit": "latest", - "eslint": "^8.54.0", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-prettier": "^5.1.3", "mysql2": "^3.6.1", "postcss": "^8.4.31", - "prettier": "^3.1.0", + "prettier": "^3.2.5", "prettier-plugin-tailwindcss": "^0.5.7", "tailwindcss": "^3.3.5", "tsx": "^4.7.0", diff --git a/src/app/(auth)/signup/page.tsx b/src/app/(auth)/signup/page.tsx index 7885017..d5ada7c 100644 --- a/src/app/(auth)/signup/page.tsx +++ b/src/app/(auth)/signup/page.tsx @@ -1,8 +1,10 @@ import { redirect } from "next/navigation"; -import { Signup } from "./signup"; + import { validateRequest } from "~/lib/auth/validate-request"; import { redirects } from "~/lib/constants"; +import { Signup } from "./signup"; + export const metadata = { title: "Sign Up", description: "Signup Page", diff --git a/src/app/(auth)/signup/signup.tsx b/src/app/(auth)/signup/signup.tsx index f7e7368..639f44f 100644 --- a/src/app/(auth)/signup/signup.tsx +++ b/src/app/(auth)/signup/signup.tsx @@ -2,6 +2,7 @@ import Link from "next/link"; import { useFormState } from "react-dom"; + import { GitHubLogoIcon } from "~/components/icons"; import { PasswordInput } from "~/components/password-input"; import { SubmitButton } from "~/components/submit-button"; diff --git a/src/app/(auth)/verify-email/page.tsx b/src/app/(auth)/verify-email/page.tsx index 4bb1fb5..b16b94f 100644 --- a/src/app/(auth)/verify-email/page.tsx +++ b/src/app/(auth)/verify-email/page.tsx @@ -1,3 +1,6 @@ +import { redirect } from "next/navigation"; + +import type { User } from "@/server/db/schema"; import { Card, CardContent, @@ -5,11 +8,10 @@ import { CardHeader, CardTitle, } from "~/components/ui/card"; -import { redirect } from "next/navigation"; import { validateRequest } from "~/lib/auth/validate-request"; -import { VerifyCode } from "./verify-code"; import { redirects } from "~/lib/constants"; -import type { User } from "@/server/db/schema"; + +import { VerifyCode } from "./verify-code"; export const metadata = { title: "Verify Email", diff --git a/src/app/(auth)/verify-email/verify-code.tsx b/src/app/(auth)/verify-email/verify-code.tsx index 90ded15..e2e4539 100644 --- a/src/app/(auth)/verify-email/verify-code.tsx +++ b/src/app/(auth)/verify-email/verify-code.tsx @@ -1,16 +1,17 @@ "use client"; -import { Input } from "~/components/ui/input"; import { Label } from "@radix-ui/react-label"; import { useEffect, useRef } from "react"; import { useFormState } from "react-dom"; import { toast } from "sonner"; + import { ExclamationTriangleIcon } from "~/components/icons"; +import { SubmitButton } from "~/components/submit-button"; +import { Input } from "~/components/ui/input"; import { logout, - verifyEmail, resendVerificationEmail as resendEmail, + verifyEmail, } from "~/lib/auth/actions"; -import { SubmitButton } from "~/components/submit-button"; export const VerifyCode = () => { const [verifyEmailState, verifyEmailAction] = useFormState(verifyEmail, null); diff --git a/src/app/(landing)/layout.tsx b/src/app/(landing)/layout.tsx index a6aeac9..87d0d61 100644 --- a/src/app/(landing)/layout.tsx +++ b/src/app/(landing)/layout.tsx @@ -1,8 +1,10 @@ -import { APP_TITLE } from "~/lib/constants"; -import { type ReactNode } from "react"; import { type Metadata } from "next"; -import { Header } from "./_components/header"; +import { type ReactNode } from "react"; + import { validateRequest } from "~/lib/auth/validate-request"; +import { APP_TITLE } from "~/lib/constants"; + +import { Header } from "./_components/header"; export const metadata: Metadata = { title: APP_TITLE, diff --git a/src/app/(landing)/page.tsx b/src/app/(landing)/page.tsx index 3f370f4..00c3600 100644 --- a/src/app/(landing)/page.tsx +++ b/src/app/(landing)/page.tsx @@ -1,27 +1,29 @@ -import Link from "next/link"; +import { GitHubLogoIcon } from "@radix-ui/react-icons"; import { type Metadata } from "next"; +import Link from "next/link"; + import { PlusIcon } from "~/components/icons"; import { Button } from "~/components/ui/button"; -import { GitHubLogoIcon } from "@radix-ui/react-icons"; +import { + Card, + CardDescription, + CardHeader, + CardTitle, +} from "~/components/ui/card"; + import { CopyToClipboard } from "./_components/copy-to-clipboard"; import { Drizzle, LuciaAuth, - NextjsLight, NextjsDark, + NextjsLight, + ReactEmail, ReactJs, ShadcnUi, + StripeLogo, TRPC, TailwindCss, - StripeLogo, - ReactEmail, } from "./_components/feature-icons"; -import { - Card, - CardDescription, - CardHeader, - CardTitle, -} from "~/components/ui/card"; export const metadata: Metadata = { title: "Next.js Lucia Auth Starter Template", diff --git a/src/app/(main)/_components/header.tsx b/src/app/(main)/_components/header.tsx index 097bc1a..dc3677e 100644 --- a/src/app/(main)/_components/header.tsx +++ b/src/app/(main)/_components/header.tsx @@ -1,7 +1,8 @@ -import Link from "next/link"; -import { UserDropdown } from "~/app/(main)/_components/user-dropdown"; import { FunctionSquare } from "lucide-react"; +import Link from "next/link"; + import { APP_TITLE } from "@/lib/constants"; +import { UserDropdown } from "~/app/(main)/_components/user-dropdown"; import type { User } from "~/server/db/schema"; const routes = [{ name: "Dashboard", href: "/dashboard" }] as const; diff --git a/src/app/(main)/_components/user-dropdown.tsx b/src/app/(main)/_components/user-dropdown.tsx index 4d03e97..5b2d942 100644 --- a/src/app/(main)/_components/user-dropdown.tsx +++ b/src/app/(main)/_components/user-dropdown.tsx @@ -1,37 +1,36 @@ "use client"; -import { useState } from "react"; import Link from "next/link"; +import { useTheme } from "next-themes"; +import { useState } from "react"; +import { toast } from "sonner"; + +import { ExclamationTriangleIcon } from "~/components/icons"; +import { LoadingButton } from "~/components/loading-button"; +import { + AlertDialog, + AlertDialogContent, + AlertDialogDescription, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, +} from "~/components/ui/alert-dialog"; +import { Button } from "~/components/ui/button"; import { DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, -} from "~/components/ui/dropdown-menu"; -import { DropdownMenuTrigger, - DropdownMenuContent, - DropdownMenuGroup, - DropdownMenuItem, } from "~/components/ui/dropdown-menu"; -import { - AlertDialog, - AlertDialogContent, - AlertDialogDescription, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, -} from "~/components/ui/alert-dialog"; -import { Button } from "~/components/ui/button"; -import { LoadingButton } from "~/components/loading-button"; -import { ExclamationTriangleIcon } from "~/components/icons"; import { logout } from "~/lib/auth/actions"; import { APP_TITLE } from "~/lib/constants"; -import { toast } from "sonner"; -import { useTheme } from "next-themes"; export const UserDropdown = ({ email, diff --git a/src/app/(main)/account/page.tsx b/src/app/(main)/account/page.tsx index b573688..ec08cc1 100644 --- a/src/app/(main)/account/page.tsx +++ b/src/app/(main)/account/page.tsx @@ -1,5 +1,5 @@ -import type { User } from "~/server/db/schema"; import { redirect } from "next/navigation"; + import { SubmitButton } from "~/components/submit-button"; import { Card, @@ -12,6 +12,7 @@ import { import { logout } from "~/lib/auth/actions"; import { validateRequest } from "~/lib/auth/validate-request"; import { redirects } from "~/lib/constants"; +import type { User } from "~/server/db/schema"; export default async function AccountPage() { const { user } = (await validateRequest()) as { user: User | null }; diff --git a/src/app/(main)/dashboard/billing/_components/billing.tsx b/src/app/(main)/dashboard/billing/_components/billing.tsx index 103e092..dd29546 100644 --- a/src/app/(main)/dashboard/billing/_components/billing.tsx +++ b/src/app/(main)/dashboard/billing/_components/billing.tsx @@ -1,7 +1,6 @@ import Link from "next/link"; import { CheckIcon } from "~/components/icons"; - import { Button } from "~/components/ui/button"; import { Card, @@ -13,6 +12,7 @@ import { } from "~/components/ui/card"; import { formatDate } from "~/lib/utils"; import { type RouterOutputs } from "~/trpc/shared"; + import { ManageSubscriptionForm } from "./manage-subscription-form"; interface BillingProps { diff --git a/src/app/(main)/dashboard/billing/_components/manage-subscription-form.tsx b/src/app/(main)/dashboard/billing/_components/manage-subscription-form.tsx index 9a0ac46..7c14285 100644 --- a/src/app/(main)/dashboard/billing/_components/manage-subscription-form.tsx +++ b/src/app/(main)/dashboard/billing/_components/manage-subscription-form.tsx @@ -1,12 +1,12 @@ "use client"; import * as React from "react"; +import { toast } from "sonner"; import { type z } from "zod"; import { Button } from "~/components/ui/button"; import { type manageSubscriptionSchema } from "~/lib/validators/stripe"; import { api } from "~/trpc/react"; -import { toast } from "sonner"; type ManageSubscriptionFormProps = z.infer; diff --git a/src/app/(main)/dashboard/billing/page.tsx b/src/app/(main)/dashboard/billing/page.tsx index f146c94..effdce5 100644 --- a/src/app/(main)/dashboard/billing/page.tsx +++ b/src/app/(main)/dashboard/billing/page.tsx @@ -1,14 +1,14 @@ import type { Metadata } from "next"; import { redirect } from "next/navigation"; +import * as React from "react"; import { ExclamationTriangleIcon } from "~/components/icons"; - import { Alert, AlertDescription, AlertTitle } from "~/components/ui/alert"; import { env } from "~/env"; import { validateRequest } from "~/lib/auth/validate-request"; import { APP_TITLE } from "~/lib/constants"; import { api } from "~/trpc/server"; -import * as React from "react"; + import { Billing } from "./_components/billing"; import { BillingSkeleton } from "./_components/billing-skeleton"; diff --git a/src/app/(main)/dashboard/layout.tsx b/src/app/(main)/dashboard/layout.tsx index 922382c..1a5b710 100644 --- a/src/app/(main)/dashboard/layout.tsx +++ b/src/app/(main)/dashboard/layout.tsx @@ -1,10 +1,10 @@ +import { Inter } from "next/font/google"; import { redirect } from "next/navigation"; import * as React from "react"; + import { validateRequest } from "~/lib/auth/validate-request"; import { redirects } from "~/lib/constants"; -import { Inter } from "next/font/google"; - type DashboardLayoutProps = { children: React.ReactNode; }; diff --git a/src/app/(main)/dashboard/page.tsx b/src/app/(main)/dashboard/page.tsx index 5c78371..8b1fb23 100644 --- a/src/app/(main)/dashboard/page.tsx +++ b/src/app/(main)/dashboard/page.tsx @@ -1,7 +1,9 @@ import { type Metadata } from "next"; import * as React from "react"; + import { env } from "~/env"; import { api } from "~/trpc/server"; + import { Forms } from "./_components/forms"; import { CreateFormDialog } from "./_components/new-form-dialog"; import { PostsSkeleton } from "./_components/posts-skeleton"; diff --git a/src/lib/auth/actions.ts b/src/lib/auth/actions.ts index d28e6b9..e62a51c 100644 --- a/src/lib/auth/actions.ts +++ b/src/lib/auth/actions.ts @@ -2,34 +2,36 @@ /* eslint @typescript-eslint/no-explicit-any:0, @typescript-eslint/prefer-optional-chain:0 */ -import { z } from "zod"; +import { eq } from "drizzle-orm"; +import { Scrypt, generateId } from "lucia"; import { cookies } from "next/headers"; import { redirect } from "next/navigation"; -import { generateId, Scrypt } from "lucia"; -import { isWithinExpirationDate, TimeSpan, createDate } from "oslo"; -import { generateRandomString, alphabet } from "oslo/crypto"; -import { eq } from "drizzle-orm"; +import { TimeSpan, createDate, isWithinExpirationDate } from "oslo"; +import { alphabet, generateRandomString } from "oslo/crypto"; +import { z } from "zod"; + +import { env } from "~/env"; import { lucia } from "~/lib/auth"; -import { db } from "~/server/db"; +import { validateRequest } from "~/lib/auth/validate-request"; +import { renderVerificationCodeEmail } from "~/lib/email-templates/email-verification"; +import { renderResetPasswordEmail } from "~/lib/email-templates/reset-password"; import { - loginSchema, - signupSchema, type LoginInput, type SignupInput, + loginSchema, resetPasswordSchema, + signupSchema, } from "~/lib/validators/auth"; +import { db } from "~/server/db"; import { + type User, emailVerificationCodes, passwordResetTokens, - type User, users, } from "~/server/db/schema"; import { sendMail } from "~/server/send-mail"; -import { renderVerificationCodeEmail } from "~/lib/email-templates/email-verification"; -import { renderResetPasswordEmail } from "~/lib/email-templates/reset-password"; -import { validateRequest } from "~/lib/auth/validate-request"; + import { redirects } from "../constants"; -import { env } from "~/env"; export interface ActionResponse { fieldError?: Partial>; diff --git a/src/lib/auth/index.ts b/src/lib/auth/index.ts index c25fea9..6c4586a 100644 --- a/src/lib/auth/index.ts +++ b/src/lib/auth/index.ts @@ -1,11 +1,13 @@ +import { webcrypto } from "node:crypto"; + +import { DrizzlePostgreSQLAdapter } from "@lucia-auth/adapter-drizzle"; +import { GitHub } from "arctic"; import { Lucia, TimeSpan } from "lucia"; import type { Adapter } from "lucia"; -import { GitHub } from "arctic"; -import { env } from "~/env.js"; -import { sessions, users, type User as DbUser } from "@/server/db/schema"; + import { db } from "@/server/db"; -import { webcrypto } from "node:crypto"; -import { DrizzlePostgreSQLAdapter } from "@lucia-auth/adapter-drizzle"; +import { type User as DbUser, sessions, users } from "@/server/db/schema"; +import { env } from "~/env.js"; globalThis.crypto = webcrypto as unknown as Crypto; diff --git a/src/lib/auth/validate-request.ts b/src/lib/auth/validate-request.ts index d779f0e..70d69af 100644 --- a/src/lib/auth/validate-request.ts +++ b/src/lib/auth/validate-request.ts @@ -1,7 +1,8 @@ -import { cache } from "react"; +import type { Session, User } from "lucia"; import { cookies } from "next/headers"; +import { cache } from "react"; + import { lucia } from "~/lib/auth"; -import type { User, Session } from "lucia"; export const uncachedValidateRequest = async (): Promise< { user: User; session: Session } | { user: null; session: null } diff --git a/src/lib/email-templates/email-verification.tsx b/src/lib/email-templates/email-verification.tsx index 0bd6b62..40ee9f7 100644 --- a/src/lib/email-templates/email-verification.tsx +++ b/src/lib/email-templates/email-verification.tsx @@ -7,9 +7,10 @@ import { Section, Text, } from "@react-email/components"; -import { APP_TITLE } from "~/lib/constants"; import { render } from "@react-email/render"; +import { APP_TITLE } from "~/lib/constants"; + interface Props { code: string; } diff --git a/src/lib/email-templates/new-submission.tsx b/src/lib/email-templates/new-submission.tsx index cb73352..db4582a 100644 --- a/src/lib/email-templates/new-submission.tsx +++ b/src/lib/email-templates/new-submission.tsx @@ -1,4 +1,3 @@ -import { render } from "@react-email/render"; import { Body, Button, @@ -9,6 +8,8 @@ import { Section, Text, } from "@react-email/components"; +import { render } from "@react-email/render"; + import { APP_TITLE } from "~/lib/constants"; interface Props { diff --git a/src/lib/email-templates/reset-password.tsx b/src/lib/email-templates/reset-password.tsx index b47b329..3050aee 100644 --- a/src/lib/email-templates/reset-password.tsx +++ b/src/lib/email-templates/reset-password.tsx @@ -1,4 +1,3 @@ -import { render } from "@react-email/render"; import { Body, Button, @@ -9,6 +8,8 @@ import { Section, Text, } from "@react-email/components"; +import { render } from "@react-email/render"; + import { APP_TITLE } from "~/lib/constants"; interface Props { diff --git a/src/lib/stripe.ts b/src/lib/stripe.ts index c86dde4..c5134ca 100644 --- a/src/lib/stripe.ts +++ b/src/lib/stripe.ts @@ -1,6 +1,7 @@ -import { env } from "~/env"; import Stripe from "stripe"; +import { env } from "~/env"; + export const stripe = new Stripe(env.STRIPE_API_KEY, { apiVersion: "2023-10-16", typescript: true, diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 544aa66..4d145b3 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -1,7 +1,8 @@ -import { env } from "~/env"; -import { clsx, type ClassValue } from "clsx"; +import { type ClassValue, clsx } from "clsx"; import { twMerge } from "tailwind-merge"; +import { env } from "~/env"; + export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } diff --git a/src/server/api/routers/form.ts b/src/server/api/routers/form.ts index 9daef9a..8c44be0 100644 --- a/src/server/api/routers/form.ts +++ b/src/server/api/routers/form.ts @@ -1,7 +1,9 @@ -import { eq, count } from "drizzle-orm"; +import { count, eq } from "drizzle-orm"; import { generateId } from "lucia"; import { z } from "zod"; + import { formDatas, forms, posts } from "~/server/db/schema"; + import { createTRPCRouter, protectedProcedure } from "../trpc"; export const formRouter = createTRPCRouter({ diff --git a/src/server/api/routers/formData.ts b/src/server/api/routers/formData.ts index eb38a13..641fb56 100644 --- a/src/server/api/routers/formData.ts +++ b/src/server/api/routers/formData.ts @@ -1,7 +1,9 @@ -import { formDatas, forms } from "~/server/db/schema"; import { eq } from "drizzle-orm"; import { generateId } from "lucia"; import { z } from "zod"; + +import { formDatas, forms } from "~/server/db/schema"; + import { createTRPCRouter, protectedProcedure } from "../trpc"; export const formDataRouter = createTRPCRouter({ diff --git a/src/server/api/routers/stripe.ts b/src/server/api/routers/stripe.ts index f1254be..95698a2 100644 --- a/src/server/api/routers/stripe.ts +++ b/src/server/api/routers/stripe.ts @@ -2,6 +2,7 @@ import { freePlan, proPlan, subscriptionPlans } from "~/config/subscriptions"; import { stripe } from "~/lib/stripe"; import { absoluteUrl, formatPrice } from "~/lib/utils"; import { manageSubscriptionSchema } from "~/lib/validators/stripe"; + import { createTRPCRouter, protectedProcedure } from "../trpc"; export const stripeRouter = createTRPCRouter({ diff --git a/src/server/api/routers/user.ts b/src/server/api/routers/user.ts index 1052d5a..03f14bc 100644 --- a/src/server/api/routers/user.ts +++ b/src/server/api/routers/user.ts @@ -1,4 +1,4 @@ -import { protectedProcedure, createTRPCRouter } from "../trpc"; +import { createTRPCRouter, protectedProcedure } from "../trpc"; export const userRouter = createTRPCRouter({ get: protectedProcedure.query(({ ctx }) => ctx.user), diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index ea36711..8951140 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -7,12 +7,13 @@ * need to use are documented accordingly near the end. */ +import { TRPCError, initTRPC } from "@trpc/server"; +import superjson from "superjson"; +import { ZodError } from "zod"; + import { uncachedValidateRequest } from "~/lib/auth/validate-request"; import { stripe } from "~/lib/stripe"; import { db } from "~/server/db"; -import { initTRPC, TRPCError } from "@trpc/server"; -import superjson from "superjson"; -import { ZodError } from "zod"; /** * 1. CONTEXT diff --git a/src/server/db/index.ts b/src/server/db/index.ts index 312c44f..6e9a996 100644 --- a/src/server/db/index.ts +++ b/src/server/db/index.ts @@ -1,9 +1,10 @@ -import { drizzle } from "drizzle-orm/postgres-js"; -import { type PostgresJsDatabase } from "drizzle-orm/postgres-js"; +import { DrizzlePostgreSQLAdapter } from "@lucia-auth/adapter-drizzle"; +import { type PostgresJsDatabase, drizzle } from "drizzle-orm/postgres-js"; import postgres from "postgres"; + import { env } from "~/env.js"; + import * as schema from "./schema"; -import { DrizzlePostgreSQLAdapter } from "@lucia-auth/adapter-drizzle"; declare global { // eslint-disable-next-line no-var -- only var works here diff --git a/src/server/db/schema.ts b/src/server/db/schema.ts index acd66a4..e2adb8e 100644 --- a/src/server/db/schema.ts +++ b/src/server/db/schema.ts @@ -8,6 +8,7 @@ import { timestamp, varchar, } from "drizzle-orm/pg-core"; + import { createTable } from "~/server/db/util"; export const users = createTable( diff --git a/src/server/db/util.ts b/src/server/db/util.ts index d578093..eaf88f9 100644 --- a/src/server/db/util.ts +++ b/src/server/db/util.ts @@ -1,4 +1,5 @@ -import { DATABASE_PREFIX as prefix } from "~/lib/constants"; import { pgTableCreator } from "drizzle-orm/pg-core"; +import { DATABASE_PREFIX as prefix } from "~/lib/constants"; + export const createTable = pgTableCreator((name) => `${prefix}_${name}`); diff --git a/src/server/send-mail.ts b/src/server/send-mail.ts index 82e787a..359fb49 100644 --- a/src/server/send-mail.ts +++ b/src/server/send-mail.ts @@ -1,4 +1,5 @@ -import { createTransport, type TransportOptions } from "nodemailer"; +import { type TransportOptions, createTransport } from "nodemailer"; + import { env } from "~/env"; import { EMAIL_SENDER } from "~/lib/constants"; diff --git a/src/trpc/react.tsx b/src/trpc/react.tsx index 0fec48a..1dc56e2 100644 --- a/src/trpc/react.tsx +++ b/src/trpc/react.tsx @@ -6,6 +6,7 @@ import { createTRPCReact } from "@trpc/react-query"; import { useState } from "react"; import { type AppRouter } from "~/server/api/root"; + import { getUrl, transformer } from "./shared"; export const api = createTRPCReact(); diff --git a/src/trpc/server.ts b/src/trpc/server.ts index 48b28d0..2e2deac 100644 --- a/src/trpc/server.ts +++ b/src/trpc/server.ts @@ -1,18 +1,19 @@ import "server-only"; import { + TRPCClientError, createTRPCProxyClient, loggerLink, - TRPCClientError, } from "@trpc/client"; import { callProcedure } from "@trpc/server"; import { observable } from "@trpc/server/observable"; import { type TRPCErrorResponse } from "@trpc/server/rpc"; -import { cache } from "react"; import { headers } from "next/headers"; +import { cache } from "react"; -import { appRouter, type AppRouter } from "~/server/api/root"; +import { type AppRouter, appRouter } from "~/server/api/root"; import { createTRPCContext } from "~/server/api/trpc"; + import { transformer } from "./shared"; /**