create-apppaaaul 2.0.2 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +20 -20
  2. package/dist/index.js +168 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/templates/nextjs-ts-clean/project/.editorconfig +9 -0
  5. package/dist/templates/nextjs-ts-clean/project/.vscode/launch.json +28 -0
  6. package/dist/templates/nextjs-ts-clean/project/.vscode/settings.json +8 -0
  7. package/dist/templates/nextjs-ts-clean/project/README.md +15 -0
  8. package/dist/templates/nextjs-ts-clean/project/eslint.config.mjs +172 -0
  9. package/dist/templates/nextjs-ts-clean/project/next.config.mjs +13 -0
  10. package/dist/templates/nextjs-ts-clean/project/package.json +46 -0
  11. package/dist/templates/nextjs-ts-clean/project/pnpm-lock.yaml +5463 -0
  12. package/dist/templates/nextjs-ts-clean/project/postcss.config.js +6 -0
  13. package/dist/templates/nextjs-ts-clean/project/public/next.svg +1 -0
  14. package/dist/templates/nextjs-ts-clean/project/public/vercel.svg +1 -0
  15. package/dist/templates/nextjs-ts-clean/project/src/app/favicon.ico +0 -0
  16. package/dist/templates/nextjs-ts-clean/project/src/app/globals.css +77 -0
  17. package/dist/templates/nextjs-ts-clean/project/src/app/layout.tsx +26 -0
  18. package/dist/templates/nextjs-ts-clean/project/src/app/page.tsx +5 -0
  19. package/dist/templates/nextjs-ts-clean/project/src/components/ui/button.tsx +49 -0
  20. package/dist/templates/nextjs-ts-clean/project/src/lib/utils.ts +6 -0
  21. package/dist/templates/nextjs-ts-clean/project/tailwind.config.ts +80 -0
  22. package/dist/templates/nextjs-ts-clean/project/tsconfig.json +27 -0
  23. package/dist/templates/nextjs-ts-landing/project/.editorconfig +9 -0
  24. package/dist/templates/nextjs-ts-landing/project/.eslintrc.cjs +101 -0
  25. package/dist/templates/nextjs-ts-landing/project/.eslintrc.mjs +172 -0
  26. package/dist/templates/nextjs-ts-landing/project/.vscode/launch.json +28 -0
  27. package/dist/templates/nextjs-ts-landing/project/.vscode/settings.json +8 -0
  28. package/dist/templates/nextjs-ts-landing-drizzle/project/.editorconfig +9 -0
  29. package/dist/templates/nextjs-ts-landing-drizzle/project/.eslintrc.mjs +172 -0
  30. package/dist/templates/nextjs-ts-landing-drizzle/project/.vscode/launch.json +28 -0
  31. package/dist/templates/nextjs-ts-landing-drizzle/project/.vscode/settings.json +8 -0
  32. package/dist/templates/nextjs-ts-landing-drizzle/project/README.md +15 -0
  33. package/dist/templates/nextjs-ts-landing-drizzle/project/components.json +17 -0
  34. package/dist/templates/nextjs-ts-landing-drizzle/project/docker-compose.yml +15 -0
  35. package/dist/templates/nextjs-ts-landing-drizzle/project/drizzle.config.ts +11 -0
  36. package/dist/templates/nextjs-ts-landing-drizzle/project/next.config.mjs +10 -0
  37. package/dist/templates/nextjs-ts-landing-drizzle/project/package.json +57 -0
  38. package/dist/templates/nextjs-ts-landing-drizzle/project/pnpm-lock.yaml +6248 -0
  39. package/dist/templates/nextjs-ts-landing-drizzle/project/postcss.config.js +6 -0
  40. package/dist/templates/nextjs-ts-landing-drizzle/project/public/next.svg +1 -0
  41. package/dist/templates/nextjs-ts-landing-drizzle/project/public/vercel.svg +1 -0
  42. package/dist/templates/nextjs-ts-landing-drizzle/project/src/app/api/auth/[...nextauth]/route.ts +3 -0
  43. package/dist/templates/nextjs-ts-landing-drizzle/project/src/app/favicon.ico +0 -0
  44. package/dist/templates/nextjs-ts-landing-drizzle/project/src/app/globals.css +47 -0
  45. package/dist/templates/nextjs-ts-landing-drizzle/project/src/app/layout.tsx +20 -0
  46. package/dist/templates/nextjs-ts-landing-drizzle/project/src/app/page.tsx +5 -0
  47. package/dist/templates/nextjs-ts-landing-drizzle/project/src/auth.ts +79 -0
  48. package/dist/templates/nextjs-ts-landing-drizzle/project/src/components/ui/button.tsx +49 -0
  49. package/dist/templates/nextjs-ts-landing-drizzle/project/src/db/index.ts +25 -0
  50. package/dist/templates/nextjs-ts-landing-drizzle/project/src/db/schema.ts +93 -0
  51. package/dist/templates/nextjs-ts-landing-drizzle/project/src/lib/utils.ts +6 -0
  52. package/dist/templates/nextjs-ts-landing-drizzle/project/tailwind.config.ts +80 -0
  53. package/dist/templates/nextjs-ts-landing-drizzle/project/tsconfig.json +27 -0
  54. package/dist/templates/nextjs-ts-landing-prisma/project/.editorconfig +9 -0
  55. package/dist/templates/nextjs-ts-landing-prisma/project/.vscode/launch.json +28 -0
  56. package/dist/templates/nextjs-ts-landing-prisma/project/.vscode/settings.json +8 -0
  57. package/dist/templates/nextjs-ts-landing-prisma/project/README.md +15 -0
  58. package/dist/templates/nextjs-ts-landing-prisma/project/components.json +17 -0
  59. package/dist/templates/nextjs-ts-landing-prisma/project/docker-compose.yml +15 -0
  60. package/dist/templates/nextjs-ts-landing-prisma/project/eslint.config.mjs +172 -0
  61. package/dist/templates/nextjs-ts-landing-prisma/project/next.config.mjs +10 -0
  62. package/dist/templates/nextjs-ts-landing-prisma/project/package.json +58 -0
  63. package/dist/templates/nextjs-ts-landing-prisma/project/pnpm-lock.yaml +5854 -0
  64. package/dist/templates/nextjs-ts-landing-prisma/project/pnpm-workspace.yaml +6 -0
  65. package/dist/templates/nextjs-ts-landing-prisma/project/postcss.config.mjs +5 -0
  66. package/dist/templates/nextjs-ts-landing-prisma/project/prisma/migrations/20250329125127_init/migration.sql +25 -0
  67. package/dist/templates/nextjs-ts-landing-prisma/project/prisma/migrations/migration_lock.toml +3 -0
  68. package/dist/templates/nextjs-ts-landing-prisma/project/prisma/schema.prisma +24 -0
  69. package/dist/templates/nextjs-ts-landing-prisma/project/public/next.svg +1 -0
  70. package/dist/templates/nextjs-ts-landing-prisma/project/public/vercel.svg +1 -0
  71. package/dist/templates/nextjs-ts-landing-prisma/project/src/app/api/auth/[...nextauth]/route.ts +3 -0
  72. package/dist/templates/nextjs-ts-landing-prisma/project/src/app/favicon.ico +0 -0
  73. package/dist/templates/nextjs-ts-landing-prisma/project/src/app/globals.css +117 -0
  74. package/dist/templates/nextjs-ts-landing-prisma/project/src/app/layout.tsx +20 -0
  75. package/dist/templates/nextjs-ts-landing-prisma/project/src/app/page.tsx +5 -0
  76. package/dist/templates/nextjs-ts-landing-prisma/project/src/auth.ts +79 -0
  77. package/dist/templates/nextjs-ts-landing-prisma/project/src/components/ui/button.tsx +49 -0
  78. package/dist/templates/nextjs-ts-landing-prisma/project/src/lib/db.ts +11 -0
  79. package/dist/templates/nextjs-ts-landing-prisma/project/src/lib/utils.ts +6 -0
  80. package/dist/templates/nextjs-ts-landing-prisma/project/tailwind.config.ts +80 -0
  81. package/dist/templates/nextjs-ts-landing-prisma/project/tsconfig.json +27 -0
  82. package/package.json +43 -43
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ };
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 283 64"><path fill="black" d="M141 16c-11 0-19 7-19 18s9 18 20 18c7 0 13-3 16-7l-7-5c-2 3-6 4-9 4-5 0-9-3-10-7h28v-3c0-11-8-18-19-18zm-9 15c1-4 4-7 9-7s8 3 9 7h-18zm117-15c-11 0-19 7-19 18s9 18 20 18c6 0 12-3 16-7l-8-5c-2 3-5 4-8 4-5 0-9-3-11-7h28l1-3c0-11-8-18-19-18zm-10 15c2-4 5-7 10-7s8 3 9 7h-19zm-39 3c0 6 4 10 10 10 4 0 7-2 9-5l8 5c-3 5-9 8-17 8-11 0-19-7-19-18s8-18 19-18c8 0 14 3 17 8l-8 5c-2-3-5-5-9-5-6 0-10 4-10 10zm83-29v46h-9V5h9zM37 0l37 64H0L37 0zm92 5-27 48L74 5h10l18 30 17-30h10zm59 12v10l-3-1c-6 0-10 4-10 10v15h-9V17h9v9c0-5 6-9 13-9z"/></svg>
@@ -0,0 +1,77 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ @layer base {
6
+ :root {
7
+ --background: 0 0% 100%;
8
+ --foreground: 240 10% 3.9%;
9
+
10
+ --card: 0 0% 100%;
11
+ --card-foreground: 240 10% 3.9%;
12
+
13
+ --popover: 0 0% 100%;
14
+ --popover-foreground: 240 10% 3.9%;
15
+
16
+ --primary: 240 5.9% 10%;
17
+ --primary-foreground: 0 0% 98%;
18
+
19
+ --secondary: 240 4.8% 95.9%;
20
+ --secondary-foreground: 240 5.9% 10%;
21
+
22
+ --muted: 240 4.8% 95.9%;
23
+ --muted-foreground: 240 3.8% 46.1%;
24
+
25
+ --accent: 240 4.8% 95.9%;
26
+ --accent-foreground: 240 5.9% 10%;
27
+
28
+ --destructive: 0 84.2% 60.2%;
29
+ --destructive-foreground: 0 0% 98%;
30
+
31
+ --border: 240 5.9% 90%;
32
+ --input: 240 5.9% 90%;
33
+ --ring: 240 10% 3.9%;
34
+
35
+ --radius: 0.5rem;
36
+ }
37
+
38
+ @media (prefers-color-scheme: dark) {
39
+ :root {
40
+ --background: 240 10% 3.9%;
41
+ --foreground: 0 0% 98%;
42
+
43
+ --card: 240 10% 3.9%;
44
+ --card-foreground: 0 0% 98%;
45
+
46
+ --popover: 240 10% 3.9%;
47
+ --popover-foreground: 0 0% 98%;
48
+
49
+ --primary: 0 0% 98%;
50
+ --primary-foreground: 240 5.9% 10%;
51
+
52
+ --secondary: 240 3.7% 15.9%;
53
+ --secondary-foreground: 0 0% 98%;
54
+
55
+ --muted: 240 3.7% 15.9%;
56
+ --muted-foreground: 240 5% 64.9%;
57
+
58
+ --accent: 240 3.7% 15.9%;
59
+ --accent-foreground: 0 0% 98%;
60
+
61
+ --destructive: 0 62.8% 30.6%;
62
+ --destructive-foreground: 0 0% 98%;
63
+
64
+ --border: 240 3.7% 15.9%;
65
+ --input: 240 3.7% 15.9%;
66
+ --ring: 240 4.9% 83.9%;
67
+ }
68
+ }
69
+
70
+ * {
71
+ @apply border-border;
72
+ }
73
+
74
+ body {
75
+ @apply bg-background text-foreground;
76
+ }
77
+ }
@@ -0,0 +1,26 @@
1
+ import type {Metadata} from "next";
2
+
3
+ import Link from "next/link";
4
+
5
+ import "./globals.css";
6
+
7
+ export const metadata: Metadata = {
8
+ title: "{{name}}",
9
+ description: "Generated by apppaaaul",
10
+ };
11
+
12
+ export default function RootLayout({children}: {children: React.ReactNode}) {
13
+ return (
14
+ <html lang="en">
15
+ <body className="container m-auto grid min-h-screen grid-rows-[auto,1fr,auto] bg-background px-4 font-sans antialiased">
16
+ <header className="text-xl font-bold leading-[4rem]">
17
+ <Link href="/">{{name}}</Link>
18
+ </header>
19
+ <main className="py-8">{children}</main>
20
+ <footer className="text-center leading-[4rem] opacity-70">
21
+ © {new Date().getFullYear()} {{name}}
22
+ </footer>
23
+ </body>
24
+ </html>
25
+ );
26
+ }
@@ -0,0 +1,5 @@
1
+ import {Button} from "@/components/ui/button";
2
+
3
+ export default function HomePage() {
4
+ return <Button>👋</Button>;
5
+ }
@@ -0,0 +1,49 @@
1
+ import * as React from "react";
2
+ import {Slot} from "@radix-ui/react-slot";
3
+ import {cva, type VariantProps} from "class-variance-authority";
4
+
5
+ import {cn} from "@/lib/utils";
6
+
7
+ const buttonVariants = cva(
8
+ "inline-flex items-center justify-center whitespace-nowrap 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",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
13
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
14
+ outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
15
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
16
+ ghost: "hover:bg-accent hover:text-accent-foreground",
17
+ link: "text-primary underline-offset-4 hover:underline",
18
+ },
19
+ size: {
20
+ default: "h-10 px-4 py-2",
21
+ sm: "h-9 rounded-md px-3",
22
+ lg: "h-11 rounded-md px-8",
23
+ icon: "h-10 w-10",
24
+ },
25
+ },
26
+ defaultVariants: {
27
+ variant: "default",
28
+ size: "default",
29
+ },
30
+ },
31
+ );
32
+
33
+ export interface ButtonProps
34
+ extends React.ButtonHTMLAttributes<HTMLButtonElement>,
35
+ VariantProps<typeof buttonVariants> {
36
+ asChild?: boolean;
37
+ }
38
+
39
+ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
40
+ ({className, variant, size, asChild = false, ...props}, ref) => {
41
+ const Comp = asChild ? Slot : "button";
42
+
43
+ return <Comp ref={ref} className={cn(buttonVariants({variant, size, className}))} {...props} />;
44
+ },
45
+ );
46
+
47
+ Button.displayName = "Button";
48
+
49
+ export {Button, buttonVariants};
@@ -0,0 +1,6 @@
1
+ import {type ClassValue, clsx} from "clsx";
2
+ import {twMerge} from "tailwind-merge";
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+ }
@@ -0,0 +1,80 @@
1
+ import type {Config} from "tailwindcss";
2
+
3
+ const config = {
4
+ darkMode: ["class"],
5
+ content: [
6
+ "./pages/**/*.{ts,tsx}",
7
+ "./components/**/*.{ts,tsx}",
8
+ "./app/**/*.{ts,tsx}",
9
+ "./src/**/*.{ts,tsx}",
10
+ ],
11
+ prefix: "",
12
+ theme: {
13
+ container: {
14
+ center: true,
15
+ padding: "2rem",
16
+ screens: {
17
+ "2xl": "1400px",
18
+ },
19
+ },
20
+ extend: {
21
+ colors: {
22
+ border: "hsl(var(--border))",
23
+ input: "hsl(var(--input))",
24
+ ring: "hsl(var(--ring))",
25
+ background: "hsl(var(--background))",
26
+ foreground: "hsl(var(--foreground))",
27
+ primary: {
28
+ DEFAULT: "hsl(var(--primary))",
29
+ foreground: "hsl(var(--primary-foreground))",
30
+ },
31
+ secondary: {
32
+ DEFAULT: "hsl(var(--secondary))",
33
+ foreground: "hsl(var(--secondary-foreground))",
34
+ },
35
+ destructive: {
36
+ DEFAULT: "hsl(var(--destructive))",
37
+ foreground: "hsl(var(--destructive-foreground))",
38
+ },
39
+ muted: {
40
+ DEFAULT: "hsl(var(--muted))",
41
+ foreground: "hsl(var(--muted-foreground))",
42
+ },
43
+ accent: {
44
+ DEFAULT: "hsl(var(--accent))",
45
+ foreground: "hsl(var(--accent-foreground))",
46
+ },
47
+ popover: {
48
+ DEFAULT: "hsl(var(--popover))",
49
+ foreground: "hsl(var(--popover-foreground))",
50
+ },
51
+ card: {
52
+ DEFAULT: "hsl(var(--card))",
53
+ foreground: "hsl(var(--card-foreground))",
54
+ },
55
+ },
56
+ borderRadius: {
57
+ lg: "var(--radius)",
58
+ md: "calc(var(--radius) - 2px)",
59
+ sm: "calc(var(--radius) - 4px)",
60
+ },
61
+ keyframes: {
62
+ "accordion-down": {
63
+ from: {height: "0"},
64
+ to: {height: "var(--radix-accordion-content-height)"},
65
+ },
66
+ "accordion-up": {
67
+ from: {height: "var(--radix-accordion-content-height)"},
68
+ to: {height: "0"},
69
+ },
70
+ },
71
+ animation: {
72
+ "accordion-down": "accordion-down 0.2s ease-out",
73
+ "accordion-up": "accordion-up 0.2s ease-out",
74
+ },
75
+ },
76
+ },
77
+ plugins: [require("tailwindcss-animate")],
78
+ } satisfies Config;
79
+
80
+ export default config;
@@ -0,0 +1,27 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es6",
4
+ "lib": ["dom", "dom.iterable", "esnext"],
5
+ "allowJs": true,
6
+ "skipLibCheck": true,
7
+ "strict": true,
8
+ "noEmit": true,
9
+ "esModuleInterop": true,
10
+ "module": "esnext",
11
+ "moduleResolution": "bundler",
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "jsx": "preserve",
15
+ "incremental": true,
16
+ "plugins": [
17
+ {
18
+ "name": "next"
19
+ }
20
+ ],
21
+ "paths": {
22
+ "@/*": ["./src/*"]
23
+ }
24
+ },
25
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
26
+ "exclude": ["node_modules"]
27
+ }
@@ -0,0 +1,9 @@
1
+ root = true
2
+
3
+ [*]
4
+ insert_final_newline = true
5
+ charset = utf-8
6
+ indent_style = space
7
+ indent_size = 2
8
+ trim_trailing_whitespace = true
9
+ max_line_length = 80
@@ -0,0 +1,101 @@
1
+ const { resolve } = require("node:path");
2
+
3
+ const project = resolve(__dirname, "tsconfig.json");
4
+
5
+ module.exports = {
6
+ root: true,
7
+ plugins: ["prettier", "import"],
8
+ extends: [
9
+ require.resolve("@vercel/style-guide/eslint/typescript"),
10
+ require.resolve("@vercel/style-guide/eslint/react"),
11
+ require.resolve("@vercel/style-guide/eslint/next"),
12
+ "plugin:prettier/recommended",
13
+ ],
14
+ parserOptions: {
15
+ ecmaVersion: "latest",
16
+ project,
17
+ },
18
+ settings: {
19
+ "import/resolver": {
20
+ typescript: {
21
+ project,
22
+ },
23
+ },
24
+ },
25
+ rules: {
26
+ "prettier/prettier": [
27
+ "warn",
28
+ {
29
+ printWidth: 100,
30
+ trailingComma: "all",
31
+ tabWidth: 2,
32
+ semi: true,
33
+ singleQuote: false,
34
+ bracketSpacing: true,
35
+ arrowParens: "always",
36
+ endOfLine: "auto",
37
+ plugins: ["prettier-plugin-tailwindcss"],
38
+ },
39
+ ],
40
+ "import/no-default-export": "off",
41
+ "import/order": [
42
+ "warn",
43
+ {
44
+ groups: ["type", "builtin", "object", "external", "internal", "parent", "sibling", "index"],
45
+ pathGroups: [
46
+ {
47
+ pattern: "~/**",
48
+ group: "external",
49
+ position: "after",
50
+ },
51
+ ],
52
+ "newlines-between": "always",
53
+ },
54
+ ],
55
+ "padding-line-between-statements": [
56
+ "warn",
57
+ { blankLine: "always", prev: "*", next: ["return", "export"] },
58
+ { blankLine: "always", prev: ["const", "let", "var"], next: "*" },
59
+ { blankLine: "any", prev: ["const", "let", "var"], next: ["const", "let", "var"] },
60
+ ],
61
+ "no-console": "warn",
62
+ "react/prop-types": "off",
63
+ "react/jsx-uses-react": "off",
64
+ "react/react-in-jsx-scope": "off",
65
+ "react/self-closing-comp": "warn",
66
+ "react/jsx-sort-props": [
67
+ "warn",
68
+ {
69
+ callbacksLast: true,
70
+ shorthandFirst: true,
71
+ noSortAlphabetically: false,
72
+ reservedFirst: true,
73
+ },
74
+ ],
75
+ "@typescript-eslint/no-non-null-assertion": "off",
76
+ "@typescript-eslint/no-shadow": "off",
77
+ "@typescript-eslint/explicit-function-return-type": "off",
78
+ "@typescript-eslint/require-await": "off",
79
+ "@typescript-eslint/no-floating-promises": "off",
80
+ "@typescript-eslint/no-confusing-void-expression": "off",
81
+ "@typescript-eslint/no-unused-vars": [
82
+ "warn",
83
+ {
84
+ args: "after-used",
85
+ ignoreRestSiblings: false,
86
+ argsIgnorePattern: "^_.*?$",
87
+ },
88
+ ],
89
+ "@next/next/no-img-element": "off",
90
+ "jsx-a11y/no-static-element-interactions": "off",
91
+ "jsx-a11y/click-events-have-key-events": "off",
92
+ "@typescript-eslint/no-unsafe-call": "off",
93
+ "@typescript-eslint/no-unsafe-member-access": "off",
94
+ "@typescript-eslint/no-misused-promises": "off",
95
+ "@typescript-eslint/no-unnecessary-condition": "off",
96
+ "@typescript-eslint/no-unsafe-assignment": "off",
97
+ "@typescript-eslint/no-unsafe-return": "off",
98
+ "@typescript-eslint/no-unsafe-argument": "off",
99
+ "@typescript-eslint/restrict-template-expressions": "off",
100
+ },
101
+ };
@@ -0,0 +1,172 @@
1
+ import globals from "globals";
2
+ import tseslint from "typescript-eslint";
3
+ import eslintPluginReact from "eslint-plugin-react";
4
+ import eslintPluginReactHooks from "eslint-plugin-react-hooks";
5
+ import {fixupPluginRules} from "@eslint/compat";
6
+ import eslintPluginPrettier from "eslint-plugin-prettier/recommended";
7
+ import eslintPluginImport from "eslint-plugin-import";
8
+ import eslintPluginReactCompiler from "eslint-plugin-react-compiler";
9
+ import eslintPluginNext from "@next/eslint-plugin-next";
10
+ import eslintPluginJsxA11y from "eslint-plugin-jsx-a11y";
11
+ import vercelStyleGuideTypescript from "@vercel/style-guide/eslint/typescript";
12
+ import vercelStyleGuideReact from "@vercel/style-guide/eslint/rules/react";
13
+ import vercelStyleGuideNext from "@vercel/style-guide/eslint/next";
14
+
15
+ export default [
16
+ // Ignores configuration
17
+ {
18
+ ignores: ["node_modules", ".next", "out", "coverage", ".idea"],
19
+ },
20
+ // General configuration
21
+ {
22
+ rules: {
23
+ "padding-line-between-statements": [
24
+ "warn",
25
+ {blankLine: "always", prev: "*", next: ["return", "export"]},
26
+ {blankLine: "always", prev: ["const", "let", "var"], next: "*"},
27
+ {blankLine: "any", prev: ["const", "let", "var"], next: ["const", "let", "var"]},
28
+ ],
29
+ "no-console": "warn",
30
+ },
31
+ },
32
+ // React configuration
33
+ {
34
+ plugins: {
35
+ react: fixupPluginRules(eslintPluginReact),
36
+ "react-hooks": fixupPluginRules(eslintPluginReactHooks),
37
+ "react-compiler": fixupPluginRules(eslintPluginReactCompiler),
38
+ "jsx-a11y": fixupPluginRules(eslintPluginJsxA11y),
39
+ },
40
+ languageOptions: {
41
+ parserOptions: {
42
+ ecmaFeatures: {
43
+ jsx: true,
44
+ },
45
+ },
46
+ globals: {
47
+ ...globals.browser,
48
+ ...globals.serviceworker,
49
+ },
50
+ },
51
+ settings: {
52
+ react: {
53
+ version: "detect",
54
+ },
55
+ },
56
+ rules: {
57
+ ...eslintPluginReact.configs.recommended.rules,
58
+ ...eslintPluginJsxA11y.configs.recommended.rules,
59
+ ...eslintPluginReactHooks.configs.recommended.rules,
60
+ ...vercelStyleGuideReact.rules,
61
+ "react/prop-types": "off",
62
+ "react/jsx-uses-react": "off",
63
+ "react/react-in-jsx-scope": "off",
64
+ "react/self-closing-comp": "warn",
65
+ "react/jsx-sort-props": [
66
+ "warn",
67
+ {
68
+ callbacksLast: true,
69
+ shorthandFirst: true,
70
+ noSortAlphabetically: false,
71
+ reservedFirst: true,
72
+ },
73
+ ],
74
+ "react-compiler/react-compiler": "error",
75
+ "jsx-a11y/no-static-element-interactions": "off",
76
+ "jsx-a11y/click-events-have-key-events": "off",
77
+ },
78
+ },
79
+ // TypeScript configuration
80
+ ...[
81
+ ...tseslint.configs.recommended,
82
+ {
83
+ rules: {
84
+ ...vercelStyleGuideTypescript.rules,
85
+ "@typescript-eslint/no-non-null-assertion": "off",
86
+ "@typescript-eslint/no-shadow": "off",
87
+ "@typescript-eslint/explicit-function-return-type": "off",
88
+ "@typescript-eslint/require-await": "off",
89
+ "@typescript-eslint/no-floating-promises": "off",
90
+ "@typescript-eslint/no-confusing-void-expression": "off",
91
+ "@typescript-eslint/no-unused-vars": [
92
+ "warn",
93
+ {
94
+ args: "after-used",
95
+ ignoreRestSiblings: false,
96
+ argsIgnorePattern: "^_.*?$",
97
+ },
98
+ ],
99
+ },
100
+ },
101
+ ],
102
+ // Prettier configuration
103
+ ...[
104
+ eslintPluginPrettier,
105
+ {
106
+ rules: {
107
+ "prettier/prettier": [
108
+ "warn",
109
+ {
110
+ printWidth: 100,
111
+ trailingComma: "all",
112
+ tabWidth: 2,
113
+ semi: true,
114
+ singleQuote: false,
115
+ bracketSpacing: true,
116
+ arrowParens: "always",
117
+ endOfLine: "auto",
118
+ plugins: ["prettier-plugin-tailwindcss"],
119
+ },
120
+ ],
121
+ },
122
+ },
123
+ ],
124
+ // Import configuration
125
+ {
126
+ plugins: {
127
+ import: fixupPluginRules(eslintPluginImport),
128
+ },
129
+ rules: {
130
+ "import/no-default-export": "off",
131
+ "import/order": [
132
+ "warn",
133
+ {
134
+ groups: [
135
+ "type",
136
+ "builtin",
137
+ "object",
138
+ "external",
139
+ "internal",
140
+ "parent",
141
+ "sibling",
142
+ "index",
143
+ ],
144
+ pathGroups: [
145
+ {
146
+ pattern: "~/**",
147
+ group: "external",
148
+ position: "after",
149
+ },
150
+ ],
151
+ "newlines-between": "always",
152
+ },
153
+ ],
154
+ },
155
+ },
156
+ // Next configuration
157
+ {
158
+ plugins: {
159
+ next: fixupPluginRules(eslintPluginNext),
160
+ },
161
+ languageOptions: {
162
+ globals: {
163
+ ...globals.node,
164
+ ...globals.browser,
165
+ },
166
+ },
167
+ rules: {
168
+ ...vercelStyleGuideNext.rules,
169
+ "@next/next/no-img-element": "off",
170
+ },
171
+ },
172
+ ];
@@ -0,0 +1,28 @@
1
+ {
2
+ "version": "0.2.0",
3
+ "configurations": [
4
+ {
5
+ "name": "Next.js: debug server-side",
6
+ "type": "node-terminal",
7
+ "request": "launch",
8
+ "command": "pnpm dev"
9
+ },
10
+ {
11
+ "name": "Next.js: debug client-side",
12
+ "type": "chrome",
13
+ "request": "launch",
14
+ "url": "http://localhost:3000"
15
+ },
16
+ {
17
+ "name": "Next.js: debug full stack",
18
+ "type": "node-terminal",
19
+ "request": "launch",
20
+ "command": "pnpm dev",
21
+ "serverReadyAction": {
22
+ "pattern": "started server on .+, url: (https?://.+)",
23
+ "uriFormat": "%s",
24
+ "action": "debugWithChrome"
25
+ }
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "editor.formatOnSave": false,
3
+ "typescript.tsdk": "node_modules\\typescript\\lib",
4
+ "typescript.enablePromptUseWorkspaceTsdk": true,
5
+ "editor.codeActionsOnSave": {
6
+ "source.fixAll.eslint": true
7
+ }
8
+ }
@@ -0,0 +1,9 @@
1
+ root = true
2
+
3
+ [*]
4
+ insert_final_newline = true
5
+ charset = utf-8
6
+ indent_style = space
7
+ indent_size = 2
8
+ trim_trailing_whitespace = true
9
+ max_line_length = 80