From 48323b32b9476be22939a57df368d86c9cf3b3b1 Mon Sep 17 00:00:00 2001 From: Hydroxycarbamide Date: Sun, 14 Apr 2024 19:13:21 +0200 Subject: [PATCH] initial commit --- .env.example | 14 +++++ .eslintrc.cjs | 42 +++++++++++++++ .gitignore | 42 +++++++++++++++ README.md | 29 ++++++++++ bun.lockb | Bin 0 -> 156511 bytes next.config.js | 10 ++++ package.json | 44 +++++++++++++++ postcss.config.cjs | 7 +++ prettier.config.js | 6 +++ public/favicon.ico | Bin 0 -> 15406 bytes src/app/_components/create-post.tsx | 43 +++++++++++++++ src/app/api/trpc/[trpc]/route.ts | 34 ++++++++++++ src/app/layout.tsx | 30 +++++++++++ src/app/page.tsx | 65 ++++++++++++++++++++++ src/env.js | 40 ++++++++++++++ src/server/api/root.ts | 23 ++++++++ src/server/api/routers/post.ts | 32 +++++++++++ src/server/api/trpc.ts | 80 ++++++++++++++++++++++++++++ src/styles/globals.css | 3 ++ src/trpc/react.tsx | 62 +++++++++++++++++++++ src/trpc/server.ts | 22 ++++++++ tailwind.config.ts | 14 +++++ tsconfig.json | 42 +++++++++++++++ 23 files changed, 684 insertions(+) create mode 100644 .env.example create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 next.config.js create mode 100644 package.json create mode 100644 postcss.config.cjs create mode 100644 prettier.config.js create mode 100644 public/favicon.ico create mode 100644 src/app/_components/create-post.tsx create mode 100644 src/app/api/trpc/[trpc]/route.ts create mode 100644 src/app/layout.tsx create mode 100644 src/app/page.tsx create mode 100644 src/env.js create mode 100644 src/server/api/root.ts create mode 100644 src/server/api/routers/post.ts create mode 100644 src/server/api/trpc.ts create mode 100644 src/styles/globals.css create mode 100644 src/trpc/react.tsx create mode 100644 src/trpc/server.ts create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..adfe836 --- /dev/null +++ b/.env.example @@ -0,0 +1,14 @@ +# Since the ".env" file is gitignored, you can use the ".env.example" file to +# build a new ".env" file when you clone the repo. Keep this file up-to-date +# when you add new variables to `.env`. + +# This file will be committed to version control, so make sure not to have any +# secrets in it. If you are cloning this repo, create a copy of this file named +# ".env" and populate it with your secrets. + +# When adding additional environment variables, the schema in "/src/env.js" +# should be updated accordingly. + +# Example: +# SERVERVAR="foo" +# NEXT_PUBLIC_CLIENTVAR="bar" diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..a92fb0b --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,42 @@ +/** @type {import("eslint").Linter.Config} */ +const config = { + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": true + }, + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "next/core-web-vitals", + "plugin:@typescript-eslint/recommended-type-checked", + "plugin:@typescript-eslint/stylistic-type-checked" + ], + "rules": { + "@typescript-eslint/array-type": "off", + "@typescript-eslint/consistent-type-definitions": "off", + "@typescript-eslint/consistent-type-imports": [ + "warn", + { + "prefer": "type-imports", + "fixStyle": "inline-type-imports" + } + ], + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_" + } + ], + "@typescript-eslint/require-await": "off", + "@typescript-eslint/no-misused-promises": [ + "error", + { + "checksVoidReturn": { + "attributes": false + } + } + ] + } +} +module.exports = config; \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2971a0b --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# database +/prisma/db.sqlite +/prisma/db.sqlite-journal + +# next.js +/.next/ +/out/ +next-env.d.ts + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +# do not commit any .env files to git, except for the .env.example file. https://create.t3.gg/en/usage/env-variables#using-environment-variables +.env +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo diff --git a/README.md b/README.md new file mode 100644 index 0000000..67943c7 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Create T3 App + +This is a [T3 Stack](https://create.t3.gg/) project bootstrapped with `create-t3-app`. + +## What's next? How do I make an app with this? + +We try to keep this project as simple as possible, so you can start with just the scaffolding we set up for you, and add additional things later when they become necessary. + +If you are not familiar with the different technologies used in this project, please refer to the respective docs. If you still are in the wind, please join our [Discord](https://t3.gg/discord) and ask for help. + +- [Next.js](https://nextjs.org) +- [NextAuth.js](https://next-auth.js.org) +- [Prisma](https://prisma.io) +- [Drizzle](https://orm.drizzle.team) +- [Tailwind CSS](https://tailwindcss.com) +- [tRPC](https://trpc.io) + +## Learn More + +To learn more about the [T3 Stack](https://create.t3.gg/), take a look at the following resources: + +- [Documentation](https://create.t3.gg/) +- [Learn the T3 Stack](https://create.t3.gg/en/faq#what-learning-resources-are-currently-available) — Check out these awesome tutorials + +You can check out the [create-t3-app GitHub repository](https://github.com/t3-oss/create-t3-app) — your feedback and contributions are welcome! + +## How do I deploy this? + +Follow our deployment guides for [Vercel](https://create.t3.gg/en/deployment/vercel), [Netlify](https://create.t3.gg/en/deployment/netlify) and [Docker](https://create.t3.gg/en/deployment/docker) for more information. diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..867b50a15bd0ebc9ba0981f43f84a36edfdb91b3 GIT binary patch literal 156511 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

fI|6J57gYfP8&G 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 Q8#Y5i26313f8js>AKHxl@c;k- literal 0 HcmV?d00001 diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..9bfe4a0 --- /dev/null +++ b/next.config.js @@ -0,0 +1,10 @@ +/** + * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially useful + * for Docker builds. + */ +await import("./src/env.js"); + +/** @type {import("next").NextConfig} */ +const config = {}; + +export default config; diff --git a/package.json b/package.json new file mode 100644 index 0000000..94f890c --- /dev/null +++ b/package.json @@ -0,0 +1,44 @@ +{ + "name": "piped-invidious-playlist-converter", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "build": "next build", + "dev": "next dev", + "lint": "next lint", + "start": "next start" + }, + "dependencies": { + "@t3-oss/env-nextjs": "^0.9.2", + "@tanstack/react-query": "^5.25.0", + "@trpc/client": "next", + "@trpc/next": "next", + "@trpc/react-query": "next", + "@trpc/server": "next", + "next": "^14.1.3", + "react": "18.2.0", + "react-dom": "18.2.0", + "server-only": "^0.0.1", + "superjson": "^2.2.1", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/eslint": "^8.56.2", + "@types/node": "^20.11.20", + "@types/react": "^18.2.57", + "@types/react-dom": "^18.2.19", + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", + "eslint": "^8.57.0", + "eslint-config-next": "^14.1.3", + "postcss": "^8.4.34", + "prettier": "^3.2.5", + "prettier-plugin-tailwindcss": "^0.5.11", + "tailwindcss": "^3.4.1", + "typescript": "^5.4.2" + }, + "ct3aMetadata": { + "initVersion": "7.30.1" + } +} diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 0000000..4cdb2f4 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +module.exports = config; diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..b2d59b4 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,6 @@ +/** @type {import('prettier').Config & import('prettier-plugin-tailwindcss').PluginOptions} */ +const config = { + plugins: ["prettier-plugin-tailwindcss"], +}; + +export default config; diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..60c702aac13409c82c4040f8fee9603eb84aa10c GIT binary patch literal 15406 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 A#Q*>R literal 0 HcmV?d00001 diff --git a/src/app/_components/create-post.tsx b/src/app/_components/create-post.tsx new file mode 100644 index 0000000..da3a1c8 --- /dev/null +++ b/src/app/_components/create-post.tsx @@ -0,0 +1,43 @@ +"use client"; + +import { useRouter } from "next/navigation"; +import { useState } from "react"; + +import { api } from "~/trpc/react"; + +export function CreatePost() { + const router = useRouter(); + const [name, setName] = useState(""); + + const createPost = api.post.create.useMutation({ + onSuccess: () => { + router.refresh(); + setName(""); + }, + }); + + return ( +

{ + e.preventDefault(); + createPost.mutate({ name }); + }} + className="flex flex-col gap-2" + > + setName(e.target.value)} + className="w-full rounded-full px-4 py-2 text-black" + /> + + + ); +} diff --git a/src/app/api/trpc/[trpc]/route.ts b/src/app/api/trpc/[trpc]/route.ts new file mode 100644 index 0000000..5fbd827 --- /dev/null +++ b/src/app/api/trpc/[trpc]/route.ts @@ -0,0 +1,34 @@ +import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; +import { type NextRequest } from "next/server"; + +import { env } from "~/env"; +import { appRouter } from "~/server/api/root"; +import { createTRPCContext } from "~/server/api/trpc"; + +/** + * This wraps the `createTRPCContext` helper and provides the required context for the tRPC API when + * handling a HTTP request (e.g. when you make requests from Client Components). + */ +const createContext = async (req: NextRequest) => { + return createTRPCContext({ + headers: req.headers, + }); +}; + +const handler = (req: NextRequest) => + fetchRequestHandler({ + endpoint: "/api/trpc", + req, + router: appRouter, + createContext: () => createContext(req), + onError: + env.NODE_ENV === "development" + ? ({ path, error }) => { + console.error( + `❌ tRPC failed on ${path ?? ""}: ${error.message}` + ); + } + : undefined, + }); + +export { handler as GET, handler as POST }; diff --git a/src/app/layout.tsx b/src/app/layout.tsx new file mode 100644 index 0000000..67f7af0 --- /dev/null +++ b/src/app/layout.tsx @@ -0,0 +1,30 @@ +import "~/styles/globals.css"; + +import { Inter } from "next/font/google"; + +import { TRPCReactProvider } from "~/trpc/react"; + +const inter = Inter({ + subsets: ["latin"], + variable: "--font-sans", +}); + +export const metadata = { + title: "Create T3 App", + description: "Generated by create-t3-app", + icons: [{ rel: "icon", url: "/favicon.ico" }], +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + {children} + + + ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx new file mode 100644 index 0000000..098c794 --- /dev/null +++ b/src/app/page.tsx @@ -0,0 +1,65 @@ +import Link from "next/link"; + +import { CreatePost } from "~/app/_components/create-post"; +import { api } from "~/trpc/server"; + +export default async function Home() { + const hello = await api.post.hello({ text: "from tRPC" }); + + return ( +
+
+

+ Create T3 App +

+
+ +

First Steps →

+
+ Just the basics - Everything you need to know to set up your + database and authentication. +
+ + +

Documentation →

+
+ Learn more about Create T3 App, the libraries it uses, and how to + deploy it. +
+ +
+
+

+ {hello ? hello.greeting : "Loading tRPC query..."} +

+
+ + +
+
+ ); +} + +async function CrudShowcase() { + const latestPost = await api.post.getLatest(); + + return ( +
+ {latestPost ? ( +

Your most recent post: {latestPost.name}

+ ) : ( +

You have no posts yet.

+ )} + + +
+ ); +} diff --git a/src/env.js b/src/env.js new file mode 100644 index 0000000..5c2f937 --- /dev/null +++ b/src/env.js @@ -0,0 +1,40 @@ +import { createEnv } from "@t3-oss/env-nextjs"; +import { z } from "zod"; + +export const env = createEnv({ + /** + * Specify your server-side environment variables schema here. This way you can ensure the app + * isn't built with invalid env vars. + */ + server: { + NODE_ENV: z.enum(["development", "test", "production"]), + }, + + /** + * Specify your client-side environment variables schema here. This way you can ensure the app + * isn't built with invalid env vars. To expose them to the client, prefix them with + * `NEXT_PUBLIC_`. + */ + client: { + // NEXT_PUBLIC_CLIENTVAR: z.string(), + }, + + /** + * You can't destruct `process.env` as a regular object in the Next.js edge runtimes (e.g. + * middlewares) or client-side so we need to destruct manually. + */ + runtimeEnv: { + NODE_ENV: process.env.NODE_ENV, + // NEXT_PUBLIC_CLIENTVAR: process.env.NEXT_PUBLIC_CLIENTVAR, + }, + /** + * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially + * useful for Docker builds. + */ + skipValidation: !!process.env.SKIP_ENV_VALIDATION, + /** + * Makes it so that empty strings are treated as undefined. `SOME_VAR: z.string()` and + * `SOME_VAR=''` will throw an error. + */ + emptyStringAsUndefined: true, +}); diff --git a/src/server/api/root.ts b/src/server/api/root.ts new file mode 100644 index 0000000..b341fc4 --- /dev/null +++ b/src/server/api/root.ts @@ -0,0 +1,23 @@ +import { postRouter } from "~/server/api/routers/post"; +import { createCallerFactory, createTRPCRouter } from "~/server/api/trpc"; + +/** + * This is the primary router for your server. + * + * All routers added in /api/routers should be manually added here. + */ +export const appRouter = createTRPCRouter({ + post: postRouter, +}); + +// export type definition of API +export type AppRouter = typeof appRouter; + +/** + * Create a server-side caller for the tRPC API. + * @example + * const trpc = createCaller(createContext); + * const res = await trpc.post.all(); + * ^? Post[] + */ +export const createCaller = createCallerFactory(appRouter); diff --git a/src/server/api/routers/post.ts b/src/server/api/routers/post.ts new file mode 100644 index 0000000..1673517 --- /dev/null +++ b/src/server/api/routers/post.ts @@ -0,0 +1,32 @@ +import { z } from "zod"; + +import { createTRPCRouter, publicProcedure } from "~/server/api/trpc"; + +let post = { + id: 1, + name: "Hello World", +}; + +export const postRouter = createTRPCRouter({ + hello: publicProcedure + .input(z.object({ text: z.string() })) + .query(({ input }) => { + return { + greeting: `Hello ${input.text}`, + }; + }), + + create: publicProcedure + .input(z.object({ name: z.string().min(1) })) + .mutation(async ({ input }) => { + // simulate a slow db call + await new Promise((resolve) => setTimeout(resolve, 1000)); + + post = { id: post.id + 1, name: input.name }; + return post; + }), + + getLatest: publicProcedure.query(() => { + return post; + }), +}); diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts new file mode 100644 index 0000000..abd4137 --- /dev/null +++ b/src/server/api/trpc.ts @@ -0,0 +1,80 @@ +/** + * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS: + * 1. You want to modify request context (see Part 1). + * 2. You want to create a new middleware or type of procedure (see Part 3). + * + * TL;DR - This is where all the tRPC server stuff is created and plugged in. The pieces you will + * need to use are documented accordingly near the end. + */ +import { initTRPC } from "@trpc/server"; +import superjson from "superjson"; +import { ZodError } from "zod"; + +/** + * 1. CONTEXT + * + * This section defines the "contexts" that are available in the backend API. + * + * These allow you to access things when processing a request, like the database, the session, etc. + * + * This helper generates the "internals" for a tRPC context. The API handler and RSC clients each + * wrap this and provides the required context. + * + * @see https://trpc.io/docs/server/context + */ +export const createTRPCContext = async (opts: { headers: Headers }) => { + return { + ...opts, + }; +}; + +/** + * 2. INITIALIZATION + * + * This is where the tRPC API is initialized, connecting the context and transformer. We also parse + * ZodErrors so that you get typesafety on the frontend if your procedure fails due to validation + * errors on the backend. + */ +const t = initTRPC.context().create({ + transformer: superjson, + errorFormatter({ shape, error }) { + return { + ...shape, + data: { + ...shape.data, + zodError: + error.cause instanceof ZodError ? error.cause.flatten() : null, + }, + }; + }, +}); + +/** + * Create a server-side caller. + * + * @see https://trpc.io/docs/server/server-side-calls + */ +export const createCallerFactory = t.createCallerFactory; + +/** + * 3. ROUTER & PROCEDURE (THE IMPORTANT BIT) + * + * These are the pieces you use to build your tRPC API. You should import these a lot in the + * "/src/server/api/routers" directory. + */ + +/** + * This is how you create new routers and sub-routers in your tRPC API. + * + * @see https://trpc.io/docs/router + */ +export const createTRPCRouter = t.router; + +/** + * Public (unauthenticated) procedure + * + * This is the base piece you use to build new queries and mutations on your tRPC API. It does not + * guarantee that a user querying is authorized, but you can still access user session data if they + * are logged in. + */ +export const publicProcedure = t.procedure; diff --git a/src/styles/globals.css b/src/styles/globals.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/src/styles/globals.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/src/trpc/react.tsx b/src/trpc/react.tsx new file mode 100644 index 0000000..1c45f1d --- /dev/null +++ b/src/trpc/react.tsx @@ -0,0 +1,62 @@ +"use client"; + +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { loggerLink, unstable_httpBatchStreamLink } from "@trpc/client"; +import { createTRPCReact } from "@trpc/react-query"; +import { useState } from "react"; +import SuperJSON from "superjson"; + +import { type AppRouter } from "~/server/api/root"; + +const createQueryClient = () => new QueryClient(); + +let clientQueryClientSingleton: QueryClient | undefined = undefined; +const getQueryClient = () => { + if (typeof window === "undefined") { + // Server: always make a new query client + return createQueryClient(); + } + // Browser: use singleton pattern to keep the same query client + return (clientQueryClientSingleton ??= createQueryClient()); +}; + +export const api = createTRPCReact(); + +export function TRPCReactProvider(props: { children: React.ReactNode }) { + const queryClient = getQueryClient(); + + const [trpcClient] = useState(() => + api.createClient({ + links: [ + loggerLink({ + enabled: (op) => + process.env.NODE_ENV === "development" || + (op.direction === "down" && op.result instanceof Error), + }), + unstable_httpBatchStreamLink({ + transformer: SuperJSON, + url: getBaseUrl() + "/api/trpc", + headers: () => { + const headers = new Headers(); + headers.set("x-trpc-source", "nextjs-react"); + return headers; + }, + }), + ], + }) + ); + + return ( + + + {props.children} + + + ); +} + +function getBaseUrl() { + if (typeof window !== "undefined") return window.location.origin; + if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`; + return `http://localhost:${process.env.PORT ?? 3000}`; +} diff --git a/src/trpc/server.ts b/src/trpc/server.ts new file mode 100644 index 0000000..07a9f69 --- /dev/null +++ b/src/trpc/server.ts @@ -0,0 +1,22 @@ +import "server-only"; + +import { headers } from "next/headers"; +import { cache } from "react"; + +import { createCaller } from "~/server/api/root"; +import { createTRPCContext } from "~/server/api/trpc"; + +/** + * This wraps the `createTRPCContext` helper and provides the required context for the tRPC API when + * handling a tRPC call from a React Server Component. + */ +const createContext = cache(() => { + const heads = new Headers(headers()); + heads.set("x-trpc-source", "rsc"); + + return createTRPCContext({ + headers: heads, + }); +}); + +export const api = createCaller(createContext); diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..f06488f --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,14 @@ +import { type Config } from "tailwindcss"; +import { fontFamily } from "tailwindcss/defaultTheme"; + +export default { + content: ["./src/**/*.tsx"], + theme: { + extend: { + fontFamily: { + sans: ["var(--font-sans)", ...fontFamily.sans], + }, + }, + }, + plugins: [], +} satisfies Config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..905062d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,42 @@ +{ + "compilerOptions": { + /* Base Options: */ + "esModuleInterop": true, + "skipLibCheck": true, + "target": "es2022", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + + /* Strictness */ + "strict": true, + "noUncheckedIndexedAccess": true, + "checkJs": true, + + /* Bundled projects */ + "lib": ["dom", "dom.iterable", "ES2022"], + "noEmit": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "preserve", + "plugins": [{ "name": "next" }], + "incremental": true, + + /* Path Aliases */ + "baseUrl": ".", + "paths": { + "~/*": ["./src/*"] + } + }, + "include": [ + ".eslintrc.cjs", + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + "**/*.cjs", + "**/*.js", + ".next/types/**/*.ts" + ], + "exclude": ["node_modules"] +}