From 4dbc6ace848b7ef820731587a314db12d83fb021 Mon Sep 17 00:00:00 2001 From: Prabin <42871240+prabincankod@users.noreply.github.com> Date: Thu, 5 Oct 2023 23:36:36 +0545 Subject: [PATCH 1/3] :sparkles:added link shortner project --- linkr/.env.example | 14 ++++ linkr/.gitignore | 42 +++++++++++ linkr/README.md | 28 +++++++ linkr/bun.lockb | Bin 0 -> 149789 bytes linkr/components.json | 16 ++++ linkr/next.config.mjs | 22 ++++++ linkr/package.json | 54 ++++++++++++++ linkr/postcss.config.cjs | 8 ++ linkr/prettier.config.mjs | 6 ++ linkr/prisma/schema.prisma | 21 ++++++ linkr/public/favicon.ico | Bin 0 -> 15406 bytes linkr/src/components/ui/button.tsx | 56 ++++++++++++++ linkr/src/components/ui/input.tsx | 25 +++++++ linkr/src/env.mjs | 45 +++++++++++ linkr/src/lib/utils.ts | 6 ++ linkr/src/middleware.ts | 16 ++++ linkr/src/pages/404.tsx | 3 + linkr/src/pages/_app.tsx | 18 +++++ linkr/src/pages/api/[slug].ts | 16 ++++ linkr/src/pages/api/trpc/[trpc].ts | 19 +++++ linkr/src/pages/index.tsx | 75 +++++++++++++++++++ linkr/src/server/api/root.ts | 14 ++++ linkr/src/server/api/routers/example.ts | 27 +++++++ linkr/src/server/api/trpc.ts | 95 ++++++++++++++++++++++++ linkr/src/server/db.ts | 16 ++++ linkr/src/styles/globals.css | 59 +++++++++++++++ linkr/src/utils/api.ts | 68 +++++++++++++++++ linkr/tailwind.config.js | 76 +++++++++++++++++++ linkr/tailwind.config.ts | 9 +++ linkr/tsconfig.json | 34 +++++++++ 30 files changed, 888 insertions(+) create mode 100644 linkr/.env.example create mode 100644 linkr/.gitignore create mode 100644 linkr/README.md create mode 100755 linkr/bun.lockb create mode 100644 linkr/components.json create mode 100644 linkr/next.config.mjs create mode 100644 linkr/package.json create mode 100644 linkr/postcss.config.cjs create mode 100644 linkr/prettier.config.mjs create mode 100644 linkr/prisma/schema.prisma create mode 100644 linkr/public/favicon.ico create mode 100644 linkr/src/components/ui/button.tsx create mode 100644 linkr/src/components/ui/input.tsx create mode 100644 linkr/src/env.mjs create mode 100644 linkr/src/lib/utils.ts create mode 100644 linkr/src/middleware.ts create mode 100644 linkr/src/pages/404.tsx create mode 100644 linkr/src/pages/_app.tsx create mode 100644 linkr/src/pages/api/[slug].ts create mode 100644 linkr/src/pages/api/trpc/[trpc].ts create mode 100644 linkr/src/pages/index.tsx create mode 100644 linkr/src/server/api/root.ts create mode 100644 linkr/src/server/api/routers/example.ts create mode 100644 linkr/src/server/api/trpc.ts create mode 100644 linkr/src/server/db.ts create mode 100644 linkr/src/styles/globals.css create mode 100644 linkr/src/utils/api.ts create mode 100644 linkr/tailwind.config.js create mode 100644 linkr/tailwind.config.ts create mode 100644 linkr/tsconfig.json diff --git a/linkr/.env.example b/linkr/.env.example new file mode 100644 index 0000000..168cf5b --- /dev/null +++ b/linkr/.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.mjs" +# should be updated accordingly. + +# Prisma +# https://www.prisma.io/docs/reference/database-reference/connection-urls#env +DATABASE_URL="file:./db.sqlite" diff --git a/linkr/.gitignore b/linkr/.gitignore new file mode 100644 index 0000000..2971a0b --- /dev/null +++ b/linkr/.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/linkr/README.md b/linkr/README.md new file mode 100644 index 0000000..fba19ed --- /dev/null +++ b/linkr/README.md @@ -0,0 +1,28 @@ +# 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) +- [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/linkr/bun.lockb b/linkr/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..a415aafdc820fe7c5c4fec4951ec78a239874a40 GIT binary patch literal 149789 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 A#Q*>R literal 0 HcmV?d00001 diff --git a/linkr/src/components/ui/button.tsx b/linkr/src/components/ui/button.tsx new file mode 100644 index 0000000..35d444f --- /dev/null +++ b/linkr/src/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "~/lib/utils"; + +const buttonVariants = cva( + "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ( + + ); + }, +); +Button.displayName = "Button"; + +export { Button, buttonVariants }; diff --git a/linkr/src/components/ui/input.tsx b/linkr/src/components/ui/input.tsx new file mode 100644 index 0000000..8ac4ede --- /dev/null +++ b/linkr/src/components/ui/input.tsx @@ -0,0 +1,25 @@ +import * as React from "react"; + +import { cn } from "~/lib/utils"; + +export interface InputProps + extends React.InputHTMLAttributes {} + +const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( + + ); + }, +); +Input.displayName = "Input"; + +export { Input }; diff --git a/linkr/src/env.mjs b/linkr/src/env.mjs new file mode 100644 index 0000000..b829852 --- /dev/null +++ b/linkr/src/env.mjs @@ -0,0 +1,45 @@ +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: { + DATABASE_URL: z + .string() + .url() + .refine( + (str) => !str.includes("YOUR_MYSQL_URL_HERE"), + "You forgot to change the default URL", + ), + NODE_ENV: z + .enum(["development", "test", "production"]) + .default("development"), + }, + + /** + * 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().min(1), + }, + + /** + * 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: { + DATABASE_URL: process.env.DATABASE_URL, + 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, +}); diff --git a/linkr/src/lib/utils.ts b/linkr/src/lib/utils.ts new file mode 100644 index 0000000..365058c --- /dev/null +++ b/linkr/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/linkr/src/middleware.ts b/linkr/src/middleware.ts new file mode 100644 index 0000000..b31523c --- /dev/null +++ b/linkr/src/middleware.ts @@ -0,0 +1,16 @@ +import { Link } from "@prisma/client"; +import { NextResponse } from "next/server"; +import { NextRequest } from "next/server"; + +// This function can be marked `async` if using `await` inside +export async function middleware(request: NextRequest) { + const slug = request.nextUrl.pathname.split("/").pop(); + const link: Link = await ( + await fetch(`${request.nextUrl.origin}/api/${slug}`) + ).json(); + return NextResponse.redirect(link.url); +} + +export const config = { + matcher: ["/r/:slug*"], +}; diff --git a/linkr/src/pages/404.tsx b/linkr/src/pages/404.tsx new file mode 100644 index 0000000..cad1702 --- /dev/null +++ b/linkr/src/pages/404.tsx @@ -0,0 +1,3 @@ +export default function Custom404() { + return

404 - Page Not Found

; +} diff --git a/linkr/src/pages/_app.tsx b/linkr/src/pages/_app.tsx new file mode 100644 index 0000000..93cb393 --- /dev/null +++ b/linkr/src/pages/_app.tsx @@ -0,0 +1,18 @@ +import { type AppType } from "next/app"; + +import { api } from "~/utils/api"; + +import "~/styles/globals.css"; + +import { Toaster } from "react-hot-toast"; + +const MyApp: AppType = ({ Component, pageProps }) => { + return ( + <> + + + + ); +}; + +export default api.withTRPC(MyApp); diff --git a/linkr/src/pages/api/[slug].ts b/linkr/src/pages/api/[slug].ts new file mode 100644 index 0000000..7a3882c --- /dev/null +++ b/linkr/src/pages/api/[slug].ts @@ -0,0 +1,16 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import { db } from "~/server/db"; + +export default async function getSlug( + req: NextApiRequest, + res: NextApiResponse, +) { + const slug = req.query.slug; + + const link = await db.link.findUnique({ where: { slug: slug as string } }); + if (link == null) { + console.log("nonono"); + res.status(404).send({ message: "not found" }); + } + res.send(link); +} diff --git a/linkr/src/pages/api/trpc/[trpc].ts b/linkr/src/pages/api/trpc/[trpc].ts new file mode 100644 index 0000000..634df1d --- /dev/null +++ b/linkr/src/pages/api/trpc/[trpc].ts @@ -0,0 +1,19 @@ +import { createNextApiHandler } from "@trpc/server/adapters/next"; + +import { env } from "~/env.mjs"; +import { appRouter } from "~/server/api/root"; +import { createTRPCContext } from "~/server/api/trpc"; + +// export API handler +export default createNextApiHandler({ + router: appRouter, + createContext: createTRPCContext, + onError: + env.NODE_ENV === "development" + ? ({ path, error }) => { + console.error( + `❌ tRPC failed on ${path ?? ""}: ${error.message}`, + ); + } + : undefined, +}); diff --git a/linkr/src/pages/index.tsx b/linkr/src/pages/index.tsx new file mode 100644 index 0000000..23cc2e1 --- /dev/null +++ b/linkr/src/pages/index.tsx @@ -0,0 +1,75 @@ +import { Button } from "~/components/ui/button"; +import Head from "next/head"; +import toast from "react-hot-toast"; +import Link from "next/link"; +import { Input } from "~/components/ui/input"; + +import { api } from "~/utils/api"; +import { useState } from "react"; + +export default function Home() { + const saveAlink = api.example.saveALink.useMutation(); + const [link, setLink] = useState("https://prabincankod.me"); + const [slug, setSlug] = useState("prabincankod"); + return ( + <> + + Linkr + + + + +
+
+
+ https://linkr.prasu.co/r/ + setSlug(e.target.value)} + /> + {/* */} + + +
+
+ Link + setLink(e.target.value)} + type="url" + placeholder="https://google.com" + className="my-1 block w-full rounded-md border border-slate-300 bg-white p-2 text-black placeholder-slate-400 shadow-sm focus:border-pink-500 focus:outline-none focus:ring-1 focus:ring-pink-500 sm:text-sm" + /> +
+ +
+
+ + ); +} diff --git a/linkr/src/server/api/root.ts b/linkr/src/server/api/root.ts new file mode 100644 index 0000000..7caea0f --- /dev/null +++ b/linkr/src/server/api/root.ts @@ -0,0 +1,14 @@ +import { exampleRouter } from "~/server/api/routers/example"; +import { 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({ + example: exampleRouter, +}); + +// export type definition of API +export type AppRouter = typeof appRouter; diff --git a/linkr/src/server/api/routers/example.ts b/linkr/src/server/api/routers/example.ts new file mode 100644 index 0000000..336e785 --- /dev/null +++ b/linkr/src/server/api/routers/example.ts @@ -0,0 +1,27 @@ +import { + PrismaClientKnownRequestError, + PrismaClientUnknownRequestError, +} from "@prisma/client/runtime/library"; +import { z } from "zod"; + +import { createTRPCRouter, publicProcedure } from "~/server/api/trpc"; + +export const exampleRouter = createTRPCRouter({ + saveALink: publicProcedure + .input(z.object({ link: z.string().url(), slug: z.string() })) + .mutation(async ({ ctx, input }) => { + try { + const link = await ctx.db.link.create({ + data: { slug: input.slug, url: input.link }, + }); + + return { + message: "link created successfully", + }; + } catch (e) { + if (e instanceof PrismaClientKnownRequestError) { + throw e; + } + } + }), +}); diff --git a/linkr/src/server/api/trpc.ts b/linkr/src/server/api/trpc.ts new file mode 100644 index 0000000..dc3b40b --- /dev/null +++ b/linkr/src/server/api/trpc.ts @@ -0,0 +1,95 @@ +/** + * 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 { type CreateNextContextOptions } from "@trpc/server/adapters/next"; +import superjson from "superjson"; +import { ZodError } from "zod"; + +import { db } from "~/server/db"; + +/** + * 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. + */ + +type CreateContextOptions = Record; + +/** + * This helper generates the "internals" for a tRPC context. If you need to use it, you can export + * it from here. + * + * Examples of things you may need it for: + * - testing, so we don't have to mock Next.js' req/res + * - tRPC's `createSSGHelpers`, where we don't have req/res + * + * @see https://create.t3.gg/en/usage/trpc#-serverapitrpcts + */ +const createInnerTRPCContext = (_opts: CreateContextOptions) => { + return { + db, + }; +}; + +/** + * This is the actual context you will use in your router. It will be used to process every request + * that goes through your tRPC endpoint. + * + * @see https://trpc.io/docs/context + */ +export const createTRPCContext = (_opts: CreateNextContextOptions) => { + return createInnerTRPCContext({}); +}; + +/** + * 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, + }, + }; + }, +}); + +/** + * 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/linkr/src/server/db.ts b/linkr/src/server/db.ts new file mode 100644 index 0000000..a4753ca --- /dev/null +++ b/linkr/src/server/db.ts @@ -0,0 +1,16 @@ +import { PrismaClient } from "@prisma/client"; + +import { env } from "~/env.mjs"; + +const globalForPrisma = globalThis as unknown as { + prisma: PrismaClient | undefined; +}; + +export const db = + globalForPrisma.prisma ?? + new PrismaClient({ + log: + env.NODE_ENV === "development" ? ["query", "error", "warn"] : ["error"], + }); + +if (env.NODE_ENV !== "production") globalForPrisma.prisma = db; diff --git a/linkr/src/styles/globals.css b/linkr/src/styles/globals.css new file mode 100644 index 0000000..1adec05 --- /dev/null +++ b/linkr/src/styles/globals.css @@ -0,0 +1,59 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 240 10% 3.9%; + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; + --primary: 346.8 77.2% 49.8%; + --primary-foreground: 355.7 100% 97.3%; + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; + --muted: 240 4.8% 95.9%; + --muted-foreground: 240 3.8% 46.1%; + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.9% 10%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + --ring: 346.8 77.2% 49.8%; + --radius: 0.3rem; + } + + .dark { + --background: 20 14.3% 4.1%; + --foreground: 0 0% 95%; + --card: 24 9.8% 10%; + --card-foreground: 0 0% 95%; + --popover: 0 0% 9%; + --popover-foreground: 0 0% 95%; + --primary: 346.8 77.2% 49.8%; + --primary-foreground: 355.7 100% 97.3%; + --secondary: 240 3.7% 15.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 15%; + --muted-foreground: 240 5% 64.9%; + --accent: 12 6.5% 15.1%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 85.7% 97.3%; + --border: 240 3.7% 15.9%; + --input: 240 3.7% 15.9%; + --ring: 346.8 77.2% 49.8%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/linkr/src/utils/api.ts b/linkr/src/utils/api.ts new file mode 100644 index 0000000..f4f4ad5 --- /dev/null +++ b/linkr/src/utils/api.ts @@ -0,0 +1,68 @@ +/** + * This is the client-side entrypoint for your tRPC API. It is used to create the `api` object which + * contains the Next.js App-wrapper, as well as your type-safe React Query hooks. + * + * We also create a few inference helpers for input and output types. + */ +import { httpBatchLink, loggerLink } from "@trpc/client"; +import { createTRPCNext } from "@trpc/next"; +import { type inferRouterInputs, type inferRouterOutputs } from "@trpc/server"; +import superjson from "superjson"; + +import { type AppRouter } from "~/server/api/root"; + +const getBaseUrl = () => { + if (typeof window !== "undefined") return ""; // browser should use relative url + if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`; // SSR should use vercel url + return `http://localhost:${process.env.PORT ?? 3000}`; // dev SSR should use localhost +}; + +/** A set of type-safe react-query hooks for your tRPC API. */ +export const api = createTRPCNext({ + config() { + return { + /** + * Transformer used for data de-serialization from the server. + * + * @see https://trpc.io/docs/data-transformers + */ + transformer: superjson, + + /** + * Links used to determine request flow from client to server. + * + * @see https://trpc.io/docs/links + */ + links: [ + loggerLink({ + enabled: (opts) => + process.env.NODE_ENV === "development" || + (opts.direction === "down" && opts.result instanceof Error), + }), + httpBatchLink({ + url: `${getBaseUrl()}/api/trpc`, + }), + ], + }; + }, + /** + * Whether tRPC should await queries when server rendering pages. + * + * @see https://trpc.io/docs/nextjs#ssr-boolean-default-false + */ + ssr: false, +}); + +/** + * Inference helper for inputs. + * + * @example type HelloInput = RouterInputs['example']['hello'] + */ +export type RouterInputs = inferRouterInputs; + +/** + * Inference helper for outputs. + * + * @example type HelloOutput = RouterOutputs['example']['hello'] + */ +export type RouterOutputs = inferRouterOutputs; diff --git a/linkr/tailwind.config.js b/linkr/tailwind.config.js new file mode 100644 index 0000000..c05b2ff --- /dev/null +++ b/linkr/tailwind.config.js @@ -0,0 +1,76 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ["class"], + content: [ + "./pages/**/*.{ts,tsx}", + "./components/**/*.{ts,tsx}", + "./app/**/*.{ts,tsx}", + "./src/**/*.{ts,tsx}", + ], + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: 0 }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: 0 }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [require("tailwindcss-animate")], +}; diff --git a/linkr/tailwind.config.ts b/linkr/tailwind.config.ts new file mode 100644 index 0000000..d4d3fa2 --- /dev/null +++ b/linkr/tailwind.config.ts @@ -0,0 +1,9 @@ +import { type Config } from "tailwindcss"; + +export default { + content: ["./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: {}, + }, + plugins: [], +} satisfies Config; diff --git a/linkr/tsconfig.json b/linkr/tsconfig.json new file mode 100644 index 0000000..07a0fd5 --- /dev/null +++ b/linkr/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "es2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "checkJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "noUncheckedIndexedAccess": true, + "baseUrl": ".", + "paths": { + "~/*": ["./src/*"] + } + }, + "include": [ + ".eslintrc.cjs", + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + "**/*.cjs", + "**/*.mjs", + "**/middleware.ts" + ], + "exclude": ["node_modules"] +} From df1e66050296b7ac5173670c3ffd8fbe95b0ce58 Mon Sep 17 00:00:00 2001 From: Prabin <42871240+prabincankod@users.noreply.github.com> Date: Fri, 6 Oct 2023 00:26:15 +0545 Subject: [PATCH 2/3] renamed the project folder --- {linkr => short-links}/.env.example | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {linkr => short-links}/.env.example (100%) diff --git a/linkr/.env.example b/short-links/.env.example similarity index 100% rename from linkr/.env.example rename to short-links/.env.example From 86c82ac4a5329d87af15f6e90fbe405516c7429b Mon Sep 17 00:00:00 2001 From: Prabin <42871240+prabincankod@users.noreply.github.com> Date: Thu, 5 Oct 2023 18:43:23 +0000 Subject: [PATCH 3/3] changed the foldername --- {linkr => link-shortner}/.gitignore | 0 {linkr => link-shortner}/README.md | 0 {linkr => link-shortner}/bun.lockb | Bin {linkr => link-shortner}/components.json | 0 {linkr => link-shortner}/next.config.mjs | 0 {linkr => link-shortner}/package.json | 0 {linkr => link-shortner}/postcss.config.cjs | 0 {linkr => link-shortner}/prettier.config.mjs | 0 {linkr => link-shortner}/prisma/schema.prisma | 0 {linkr => link-shortner}/public/favicon.ico | Bin .../src/components/ui/button.tsx | 0 .../src/components/ui/input.tsx | 0 {linkr => link-shortner}/src/env.mjs | 0 {linkr => link-shortner}/src/lib/utils.ts | 0 {linkr => link-shortner}/src/middleware.ts | 0 {linkr => link-shortner}/src/pages/404.tsx | 0 {linkr => link-shortner}/src/pages/_app.tsx | 0 {linkr => link-shortner}/src/pages/api/[slug].ts | 0 .../src/pages/api/trpc/[trpc].ts | 0 {linkr => link-shortner}/src/pages/index.tsx | 0 {linkr => link-shortner}/src/server/api/root.ts | 0 .../src/server/api/routers/example.ts | 0 {linkr => link-shortner}/src/server/api/trpc.ts | 0 {linkr => link-shortner}/src/server/db.ts | 0 {linkr => link-shortner}/src/styles/globals.css | 0 {linkr => link-shortner}/src/utils/api.ts | 0 {linkr => link-shortner}/tailwind.config.js | 0 {linkr => link-shortner}/tailwind.config.ts | 0 {linkr => link-shortner}/tsconfig.json | 0 short-links/.env.example | 14 -------------- 30 files changed, 14 deletions(-) rename {linkr => link-shortner}/.gitignore (100%) rename {linkr => link-shortner}/README.md (100%) rename {linkr => link-shortner}/bun.lockb (100%) rename {linkr => link-shortner}/components.json (100%) rename {linkr => link-shortner}/next.config.mjs (100%) rename {linkr => link-shortner}/package.json (100%) rename {linkr => link-shortner}/postcss.config.cjs (100%) rename {linkr => link-shortner}/prettier.config.mjs (100%) rename {linkr => link-shortner}/prisma/schema.prisma (100%) rename {linkr => link-shortner}/public/favicon.ico (100%) rename {linkr => link-shortner}/src/components/ui/button.tsx (100%) rename {linkr => link-shortner}/src/components/ui/input.tsx (100%) rename {linkr => link-shortner}/src/env.mjs (100%) rename {linkr => link-shortner}/src/lib/utils.ts (100%) rename {linkr => link-shortner}/src/middleware.ts (100%) rename {linkr => link-shortner}/src/pages/404.tsx (100%) rename {linkr => link-shortner}/src/pages/_app.tsx (100%) rename {linkr => link-shortner}/src/pages/api/[slug].ts (100%) rename {linkr => link-shortner}/src/pages/api/trpc/[trpc].ts (100%) rename {linkr => link-shortner}/src/pages/index.tsx (100%) rename {linkr => link-shortner}/src/server/api/root.ts (100%) rename {linkr => link-shortner}/src/server/api/routers/example.ts (100%) rename {linkr => link-shortner}/src/server/api/trpc.ts (100%) rename {linkr => link-shortner}/src/server/db.ts (100%) rename {linkr => link-shortner}/src/styles/globals.css (100%) rename {linkr => link-shortner}/src/utils/api.ts (100%) rename {linkr => link-shortner}/tailwind.config.js (100%) rename {linkr => link-shortner}/tailwind.config.ts (100%) rename {linkr => link-shortner}/tsconfig.json (100%) delete mode 100644 short-links/.env.example diff --git a/linkr/.gitignore b/link-shortner/.gitignore similarity index 100% rename from linkr/.gitignore rename to link-shortner/.gitignore diff --git a/linkr/README.md b/link-shortner/README.md similarity index 100% rename from linkr/README.md rename to link-shortner/README.md diff --git a/linkr/bun.lockb b/link-shortner/bun.lockb similarity index 100% rename from linkr/bun.lockb rename to link-shortner/bun.lockb diff --git a/linkr/components.json b/link-shortner/components.json similarity index 100% rename from linkr/components.json rename to link-shortner/components.json diff --git a/linkr/next.config.mjs b/link-shortner/next.config.mjs similarity index 100% rename from linkr/next.config.mjs rename to link-shortner/next.config.mjs diff --git a/linkr/package.json b/link-shortner/package.json similarity index 100% rename from linkr/package.json rename to link-shortner/package.json diff --git a/linkr/postcss.config.cjs b/link-shortner/postcss.config.cjs similarity index 100% rename from linkr/postcss.config.cjs rename to link-shortner/postcss.config.cjs diff --git a/linkr/prettier.config.mjs b/link-shortner/prettier.config.mjs similarity index 100% rename from linkr/prettier.config.mjs rename to link-shortner/prettier.config.mjs diff --git a/linkr/prisma/schema.prisma b/link-shortner/prisma/schema.prisma similarity index 100% rename from linkr/prisma/schema.prisma rename to link-shortner/prisma/schema.prisma diff --git a/linkr/public/favicon.ico b/link-shortner/public/favicon.ico similarity index 100% rename from linkr/public/favicon.ico rename to link-shortner/public/favicon.ico diff --git a/linkr/src/components/ui/button.tsx b/link-shortner/src/components/ui/button.tsx similarity index 100% rename from linkr/src/components/ui/button.tsx rename to link-shortner/src/components/ui/button.tsx diff --git a/linkr/src/components/ui/input.tsx b/link-shortner/src/components/ui/input.tsx similarity index 100% rename from linkr/src/components/ui/input.tsx rename to link-shortner/src/components/ui/input.tsx diff --git a/linkr/src/env.mjs b/link-shortner/src/env.mjs similarity index 100% rename from linkr/src/env.mjs rename to link-shortner/src/env.mjs diff --git a/linkr/src/lib/utils.ts b/link-shortner/src/lib/utils.ts similarity index 100% rename from linkr/src/lib/utils.ts rename to link-shortner/src/lib/utils.ts diff --git a/linkr/src/middleware.ts b/link-shortner/src/middleware.ts similarity index 100% rename from linkr/src/middleware.ts rename to link-shortner/src/middleware.ts diff --git a/linkr/src/pages/404.tsx b/link-shortner/src/pages/404.tsx similarity index 100% rename from linkr/src/pages/404.tsx rename to link-shortner/src/pages/404.tsx diff --git a/linkr/src/pages/_app.tsx b/link-shortner/src/pages/_app.tsx similarity index 100% rename from linkr/src/pages/_app.tsx rename to link-shortner/src/pages/_app.tsx diff --git a/linkr/src/pages/api/[slug].ts b/link-shortner/src/pages/api/[slug].ts similarity index 100% rename from linkr/src/pages/api/[slug].ts rename to link-shortner/src/pages/api/[slug].ts diff --git a/linkr/src/pages/api/trpc/[trpc].ts b/link-shortner/src/pages/api/trpc/[trpc].ts similarity index 100% rename from linkr/src/pages/api/trpc/[trpc].ts rename to link-shortner/src/pages/api/trpc/[trpc].ts diff --git a/linkr/src/pages/index.tsx b/link-shortner/src/pages/index.tsx similarity index 100% rename from linkr/src/pages/index.tsx rename to link-shortner/src/pages/index.tsx diff --git a/linkr/src/server/api/root.ts b/link-shortner/src/server/api/root.ts similarity index 100% rename from linkr/src/server/api/root.ts rename to link-shortner/src/server/api/root.ts diff --git a/linkr/src/server/api/routers/example.ts b/link-shortner/src/server/api/routers/example.ts similarity index 100% rename from linkr/src/server/api/routers/example.ts rename to link-shortner/src/server/api/routers/example.ts diff --git a/linkr/src/server/api/trpc.ts b/link-shortner/src/server/api/trpc.ts similarity index 100% rename from linkr/src/server/api/trpc.ts rename to link-shortner/src/server/api/trpc.ts diff --git a/linkr/src/server/db.ts b/link-shortner/src/server/db.ts similarity index 100% rename from linkr/src/server/db.ts rename to link-shortner/src/server/db.ts diff --git a/linkr/src/styles/globals.css b/link-shortner/src/styles/globals.css similarity index 100% rename from linkr/src/styles/globals.css rename to link-shortner/src/styles/globals.css diff --git a/linkr/src/utils/api.ts b/link-shortner/src/utils/api.ts similarity index 100% rename from linkr/src/utils/api.ts rename to link-shortner/src/utils/api.ts diff --git a/linkr/tailwind.config.js b/link-shortner/tailwind.config.js similarity index 100% rename from linkr/tailwind.config.js rename to link-shortner/tailwind.config.js diff --git a/linkr/tailwind.config.ts b/link-shortner/tailwind.config.ts similarity index 100% rename from linkr/tailwind.config.ts rename to link-shortner/tailwind.config.ts diff --git a/linkr/tsconfig.json b/link-shortner/tsconfig.json similarity index 100% rename from linkr/tsconfig.json rename to link-shortner/tsconfig.json diff --git a/short-links/.env.example b/short-links/.env.example deleted file mode 100644 index 168cf5b..0000000 --- a/short-links/.env.example +++ /dev/null @@ -1,14 +0,0 @@ -# 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.mjs" -# should be updated accordingly. - -# Prisma -# https://www.prisma.io/docs/reference/database-reference/connection-urls#env -DATABASE_URL="file:./db.sqlite"