create-next-pro-cli 0.1.4 → 0.1.5

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 (69) hide show
  1. package/package.json +1 -1
  2. package/templates/Page/loading.tsx +2 -7
  3. package/templates/Page/not-found.tsx +11 -0
  4. package/templates/Page/page-ui.tsx +1 -1
  5. package/templates/Projects/default/messages/en/{dashboard.json → Dashboard.json} +2 -1
  6. package/templates/Projects/default/messages/en/_global_ui.json +4 -0
  7. package/templates/Projects/default/messages/fr/{dashboard.json → Dashboard.json} +2 -1
  8. package/templates/Projects/default/messages/fr/_global_ui.json +4 -0
  9. package/templates/Projects/default/package.json +8 -2
  10. package/templates/Projects/default/src/app/[locale]/(public)/Login/page.tsx +6 -0
  11. package/templates/Projects/default/src/app/[locale]/(public)/Register/page.tsx +6 -0
  12. package/templates/Projects/default/src/app/[locale]/(public)/_home/loading.tsx +5 -1
  13. package/templates/Projects/default/src/app/[locale]/(public)/_home/page.tsx +3 -13
  14. package/templates/Projects/default/src/app/[locale]/(public)/layout.tsx +0 -2
  15. package/templates/Projects/default/src/app/[locale]/(user)/Dashboard/loading.tsx +10 -0
  16. package/templates/Projects/default/src/app/[locale]/(user)/Dashboard/page.tsx +5 -0
  17. package/templates/Projects/default/src/app/[locale]/(user)/Settings/page.tsx +6 -0
  18. package/templates/Projects/default/src/app/[locale]/(user)/UserInfo/page.tsx +6 -0
  19. package/templates/Projects/default/src/app/[locale]/(user)/layout.tsx +0 -3
  20. package/templates/Projects/default/src/app/[locale]/layout.tsx +3 -4
  21. package/templates/Projects/default/src/app/[locale]/loading.tsx +3 -6
  22. package/templates/Projects/default/src/app/[locale]/page.tsx +1 -111
  23. package/templates/Projects/default/src/app/api/auth/[...nextauth]/route.ts +6 -25
  24. package/templates/Projects/default/src/app/api/auth/post-login/route.ts +1 -2
  25. package/templates/Projects/default/src/app/styles/globals.css +295 -16
  26. package/templates/Projects/default/src/lib/auth/disconnect.ts +11 -0
  27. package/templates/Projects/default/src/lib/auth/isConnected.ts +5 -3
  28. package/templates/Projects/default/src/lib/utils.ts +6 -0
  29. package/templates/Projects/default/src/ui/Dashboard/LogoutButton.tsx +27 -0
  30. package/templates/Projects/default/src/ui/{dashboard/page.tsx → Dashboard/page-ui.tsx} +5 -4
  31. package/templates/Projects/default/src/{app/[locale]/(public)/login/page.tsx → ui/Login/page-ui.tsx} +7 -4
  32. package/templates/Projects/default/src/{app/[locale]/(public)/register/page.tsx → ui/Register/page-ui.tsx} +7 -4
  33. package/templates/Projects/default/src/ui/Settings/page-ui.tsx +17 -0
  34. package/templates/Projects/default/src/ui/UserInfo/page-ui.tsx +17 -0
  35. package/templates/Projects/default/src/ui/_global/BackButton.tsx +5 -3
  36. package/templates/Projects/default/src/ui/_global/Button.tsx +75 -0
  37. package/templates/Projects/default/src/ui/_global/GlobalHeader.tsx +42 -21
  38. package/templates/Projects/default/src/ui/_global/GlobalMain.tsx +3 -3
  39. package/templates/Projects/default/src/ui/_global/Loading.tsx +13 -0
  40. package/templates/Projects/default/src/ui/_global/LocaleSwitcher.tsx +1 -1
  41. package/templates/Projects/default/src/ui/_global/PublicNav.tsx +74 -13
  42. package/templates/Projects/default/src/ui/_global/ThemeToggle.tsx +53 -0
  43. package/templates/Projects/default/src/ui/_global/UserNav.tsx +8 -5
  44. package/templates/Projects/default/src/ui/_home/page-ui.tsx +27 -0
  45. package/templates/Projects/default/public/cnp-logo.ico +0 -0
  46. package/templates/Projects/default/public/file.svg +0 -1
  47. package/templates/Projects/default/public/globe.svg +0 -1
  48. package/templates/Projects/default/public/next.svg +0 -1
  49. package/templates/Projects/default/public/vercel.svg +0 -1
  50. package/templates/Projects/default/public/window.svg +0 -1
  51. package/templates/Projects/default/src/app/[locale]/(user)/dashboard/loading.tsx +0 -17
  52. package/templates/Projects/default/src/app/[locale]/(user)/dashboard/page.tsx +0 -12
  53. package/templates/Projects/default/src/app/[locale]/(user)/settings/page.tsx +0 -12
  54. package/templates/Projects/default/src/app/[locale]/(user)/user_info/page.tsx +0 -12
  55. package/templates/Projects/default/src/app/api/auth/[...nextauth].ts +0 -0
  56. package/templates/Projects/default/src/app/api/me/route.ts +0 -15
  57. /package/templates/Projects/default/messages/en/{login.json → Login.json} +0 -0
  58. /package/templates/Projects/default/messages/en/{register.json → Register.json} +0 -0
  59. /package/templates/Projects/default/messages/en/{settings.json → Settings.json} +0 -0
  60. /package/templates/Projects/default/messages/en/{user_info.json → UserInfo.json} +0 -0
  61. /package/templates/Projects/default/messages/fr/{login.json → Login.json} +0 -0
  62. /package/templates/Projects/default/messages/fr/{register.json → Register.json} +0 -0
  63. /package/templates/Projects/default/messages/fr/{settings.json → Settings.json} +0 -0
  64. /package/templates/Projects/default/messages/fr/{user_info.json → UserInfo.json} +0 -0
  65. /package/templates/Projects/default/src/app/[locale]/(user)/{dashboard → Dashboard}/error.tsx +0 -0
  66. /package/templates/Projects/default/src/app/[locale]/(user)/{settings → Settings}/loading.tsx +0 -0
  67. /package/templates/Projects/default/src/app/[locale]/(user)/{user_info → UserInfo}/loading.tsx +0 -0
  68. /package/templates/Projects/default/src/ui/{dashboard → Dashboard}/StatsCard.tsx +0 -0
  69. /package/templates/Projects/default/src/ui/{dashboard → Dashboard}/WelcomeCard.tsx +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-next-pro-cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Advanced Next.js project scaffolder with i18n, Tailwind, App Router and more.",
5
5
  "bin": {
6
6
  "create-next-pro": "./bin.ts"
@@ -1,13 +1,8 @@
1
1
  // app/[locale]/template/loading.tsx
2
- "use client";
2
+ import LoadingUI from "@/ui/_global/Loading";
3
3
 
4
4
  export default function Loading() {
5
- const t = useTranslations("_global_ui");
6
- return (
7
- <div className="flex flex-col flex-1 items-center justify-center">
8
- <p className="text-gray-500">{t("common.loading")}</p>
9
- </div>
10
- );
5
+ return <LoadingUI />;
11
6
  }
12
7
  // This component is used to show a loading state while the page is being prepared
13
8
  // You can customize it with a spinner, skeletons, or any loading UI you prefer
@@ -0,0 +1,11 @@
1
+ import { Link } from "@/lib/i18n/navigation";
2
+
3
+ export default function NotFound() {
4
+ return (
5
+ <div>
6
+ <h2>Not Found</h2>
7
+ <p>Could not find requested resource</p>
8
+ <Link href="/">Return Home</Link>
9
+ </div>
10
+ );
11
+ }
@@ -1,4 +1,4 @@
1
- ("use client");
1
+ "use client";
2
2
  import { useTranslations } from "next-intl";
3
3
  import BackButton from "@/ui/_global/BackButton";
4
4
 
@@ -10,5 +10,6 @@
10
10
  "likes": "Likes",
11
11
  "comments": "Comments"
12
12
  }
13
- }
13
+ },
14
+ "logout": "Logout"
14
15
  }
@@ -26,5 +26,9 @@
26
26
  "settings": "Settings",
27
27
  "user_info": "User Information"
28
28
  }
29
+ },
30
+ "Loading": {
31
+ "title": "Loading",
32
+ "description": "Please wait while we prepare your experience..."
29
33
  }
30
34
  }
@@ -10,5 +10,6 @@
10
10
  "likes": "J'aime",
11
11
  "comments": "Commentaires"
12
12
  }
13
- }
13
+ },
14
+ "logout": "Déconnexion"
14
15
  }
@@ -26,5 +26,9 @@
26
26
  "settings": "Paramètres",
27
27
  "user_info": "Informations sur l'utilisateur"
28
28
  }
29
+ },
30
+ "Loading": {
31
+ "title": "Chargement en cours",
32
+ "description": "Veuillez patienter pendant que nous préparons votre expérience..."
29
33
  }
30
34
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "my-next-app",
2
+ "name": "my-next-pro",
3
3
  "version": "0.1.0",
4
4
  "private": true,
5
5
  "scripts": {
@@ -9,13 +9,19 @@
9
9
  "lint": "next lint"
10
10
  },
11
11
  "dependencies": {
12
+ "@radix-ui/react-slot": "^1.2.3",
13
+ "class-variance-authority": "^0.7.1",
14
+ "clsx": "^2.1.1",
12
15
  "cookie": "^1.0.2",
13
16
  "jsonwebtoken": "^9.0.2",
17
+ "lucide-react": "^0.539.0",
14
18
  "next": "15.4.5",
15
19
  "next-auth": "^4.24.11",
16
20
  "next-intl": "^4.3.4",
17
21
  "react": "19.1.0",
18
- "react-dom": "19.1.0"
22
+ "react-dom": "19.1.0",
23
+ "tailwind-merge": "^3.3.1",
24
+ "tailwindcss-animate": "^1.0.7"
19
25
  },
20
26
  "devDependencies": {
21
27
  "@eslint/eslintrc": "^3",
@@ -0,0 +1,6 @@
1
+ // src/app/[locale]/(public)/Login/page.tsx
2
+ import LoginPageUI from "@/ui/Login/page-ui";
3
+
4
+ export default function LoginPage() {
5
+ return <LoginPageUI />;
6
+ }
@@ -0,0 +1,6 @@
1
+ // src/app/[locale]/(public)/Register/page.tsx
2
+ import RegisterPageUI from "@/ui/Register/page-ui";
3
+
4
+ export default function RegisterPage() {
5
+ return <RegisterPageUI />;
6
+ }
@@ -1 +1,5 @@
1
- // app/[locale]/_main/loading.tsx
1
+ // app/[locale]/_main/loading.tsx
2
+ import LoadingUI from "@/ui/_global/Loading";
3
+ export default function Loading() {
4
+ return <LoadingUI />;
5
+ }
@@ -1,16 +1,6 @@
1
- "use client";
2
- import { useTranslations } from "next-intl";
3
- // import Test from "@/ui/_home/test/page";
1
+ // src/app/[locale]/(public)/_home/page.tsx
2
+ import HomePageUI from "@/ui/_home/page-ui";
4
3
 
5
4
  export default function HomePage() {
6
- const t = useTranslations("_home");
7
- return (
8
- <main className="py-8 px-4 max-w-3xl mx-auto">
9
- {/* <Test /> */}
10
- <div className="flex items-center justify-between mb-6">
11
- <h1 className="text-2xl font-bold">{t("title")}</h1>
12
- </div>
13
- <p className="text-muted mt-2">{t("description")}</p>
14
- </main>
15
- );
5
+ return <HomePageUI />;
16
6
  }
@@ -2,10 +2,8 @@ import React from "react";
2
2
 
3
3
  export default function PublicLayout({
4
4
  children,
5
- params,
6
5
  }: {
7
6
  children: React.ReactNode;
8
- params: { locale: string };
9
7
  }) {
10
8
  return children;
11
9
  }
@@ -0,0 +1,10 @@
1
+ // app/[locale]/dashboard/loading.tsx
2
+ "use client";
3
+
4
+ export default function Loading() {
5
+ return (
6
+ <div className="flex flex-col flex-1 items-center justify-center">
7
+ <p className="text-gray-500">Loading dashboard...</p>
8
+ </div>
9
+ );
10
+ }
@@ -0,0 +1,5 @@
1
+ import Dashboard from "@/ui/Dashboard/page-ui";
2
+
3
+ export default function DashboardPage() {
4
+ return <Dashboard />;
5
+ }
@@ -0,0 +1,6 @@
1
+ "use client";
2
+ import SettingsPageUI from "@/ui/Settings/page-ui";
3
+
4
+ export default function UserInfoPage() {
5
+ return <SettingsPageUI />;
6
+ }
@@ -0,0 +1,6 @@
1
+ "use client";
2
+ import UserInfoPageUI from "@/ui/UserInfo/page-ui";
3
+
4
+ export default function UserInfoPage() {
5
+ return <UserInfoPageUI />;
6
+ }
@@ -1,8 +1,5 @@
1
1
  // app/[locale]/(user)/layout.tsx
2
2
 
3
- import UserNav from "@/ui/_global/UserNav";
4
- import LocaleSwitcher from "@/ui/_global/LocaleSwitcher";
5
-
6
3
  export default function UserLayout({
7
4
  children,
8
5
  }: {
@@ -1,6 +1,6 @@
1
1
  // app/[locale]/layout.tsx
2
+ import { NextIntlClientProvider } from "next-intl";
2
3
  import { setRequestLocale } from "next-intl/server";
3
- import { NextIntlClientProvider, hasLocale, Locale } from "next-intl";
4
4
  import React from "react";
5
5
  import "@/app/styles/globals.css"; // Import global styles
6
6
  import GlobalHeader from "@/ui/_global/GlobalHeader";
@@ -16,14 +16,13 @@ export default async function LocaleLayout({
16
16
  }) {
17
17
  const { locale } = await params;
18
18
  setRequestLocale(locale);
19
-
20
- const isConnectedValue = await isConnected();
19
+ const isConnectedInitial = await isConnected();
21
20
 
22
21
  return (
23
22
  <html lang={locale}>
24
23
  <body>
25
24
  <NextIntlClientProvider>
26
- <GlobalHeader isConnected={isConnectedValue} />
25
+ <GlobalHeader isConnectedInitial={isConnectedInitial} />
27
26
  <GlobalMain>{children}</GlobalMain>
28
27
  </NextIntlClientProvider>
29
28
  </body>
@@ -1,12 +1,9 @@
1
1
  // app/[locale]/dashboard/loading.tsx
2
- "use client";
2
+
3
+ import LoadingUI from "@/ui/_global/Loading";
3
4
 
4
5
  export default function Loading() {
5
- return (
6
- <div className="flex flex-col flex-1 items-center justify-center">
7
- <p className="text-gray-500">Loading ROOT...</p>
8
- </div>
9
- );
6
+ return <LoadingUI />;
10
7
  }
11
8
  // This component is used to show a loading state while the dashboard is being prepared
12
9
  // You can customize it with a spinner, skeletons, or any loading UI you prefer
@@ -1,116 +1,6 @@
1
1
  import React from "react";
2
- import Image from "next/image";
3
2
  import HomePage from "@/app/[locale]/(public)/_home/page";
4
- import DashboardPage from "@/app/[locale]/(user)/dashboard/page";
5
- import PublicNav from "@/ui/_global/PublicNav";
6
- import UserNav from "@/ui/_global/UserNav";
7
- import LocaleSwitcher from "@/ui/_global/LocaleSwitcher";
8
- import { cookies } from "next/headers";
9
- import { verify } from "jsonwebtoken";
10
3
 
11
4
  export default async function FallbackPage() {
12
- let isConnected = false;
13
- const cookieStore = await cookies();
14
- const appToken = cookieStore.get("app_token")?.value;
15
- if (appToken) {
16
- try {
17
- verify(appToken, process.env.APP_JWT_SECRET!);
18
- isConnected = true;
19
- } catch {
20
- isConnected = false;
21
- }
22
- }
23
-
24
- return (
25
- <HomePage />
26
- /* <main className="min-h-screen bg-neutral-50 font-sans text-gray-900">
27
- <header className="sticky top-0 z-30 w-full border-b bg-white/80 backdrop-blur supports-[backdrop-filter]:bg-white/60 shadow-sm">
28
- <div className="mx-auto flex h-16 max-w-6xl items-center justify-between px-6">
29
- <div className="flex items-center gap-3">
30
- <Image
31
- src="/cnp-logo.svg"
32
- alt="Logo"
33
- width={63}
34
- height={63}
35
- className="mr-2"
36
- />
37
- <span className="text-lg font-semibold tracking-tight select-none">
38
- Create Next Pro
39
- </span>
40
- </div>
41
- <nav className="flex items-center gap-4">
42
- {isConnected ? <UserNav /> : <PublicNav />}
43
- <LocaleSwitcher />
44
- </nav>
45
- </div>
46
- </header>
47
-
48
- <section className="mx-auto w-full max-w-3xl py-16 px-6">
49
- {isConnected ? <DashboardPage /> : <HomePage />}
50
- </section>
51
- </main> */
52
- );
5
+ return <HomePage />;
53
6
  }
54
-
55
- // Design inspiré de nextjs.org avec Tailwind CSS.
56
-
57
- // import React from "react";
58
- // import HomePage from "@/app/[locale]/(public)/_home/page";
59
- // import DashboardPage from "@/app/[locale]/(user)/dashboard/page";
60
- // import PublicNav from "@/ui/_global/PublicNav";
61
- // import UserNav from "@/ui/_global/UserNav";
62
- // import LocaleSwitcher from "@/ui/_global/LocaleSwitcher";
63
-
64
- // export default async function FallbackPage({
65
- // params,
66
- // }: {
67
- // params: Promise<{ locale: string }>;
68
- // }) {
69
- // // TODO: Remplacer par la logique réelle d'authentification (next-auth)
70
- // const isConnected = false;
71
- // const { locale } = await params;
72
-
73
- // return (
74
- // <main className="min-h-screen bg-neutral-50 font-sans text-gray-900">
75
- // {/* Header sticky façon nextjs.org */}
76
- // <header className="sticky top-0 z-30 w-full border-b bg-white/80 backdrop-blur supports-[backdrop-filter]:bg-white/60 shadow-sm">
77
- // <div className="mx-auto flex h-16 max-w-6xl items-center justify-between px-6">
78
- // <div className="flex items-center gap-3">
79
- // {/* Logo Next.js SVG */}
80
- // <svg
81
- // width="32"
82
- // height="32"
83
- // viewBox="0 0 32 32"
84
- // fill="none"
85
- // xmlns="http://www.w3.org/2000/svg"
86
- // className="mr-2"
87
- // >
88
- // <rect width="32" height="32" rx="16" fill="#000" />
89
- // <path
90
- // d="M16.018 29.917c7.66 0 13.899-6.238 13.899-13.899 0-7.66-6.239-13.899-13.899-13.899-7.66 0-13.899 6.239-13.899 13.899 0 7.661 6.239 13.899 13.899 13.899Z"
91
- // fill="#fff"
92
- // />
93
- // <path
94
- // d="M23.635 22.295 12.7 10.36h-1.68v11.28h1.44v-9.12l10.08 10.08 1.095-1.095ZM19.36 21.64h1.44V10.36h-1.44v11.28Z"
95
- // fill="#000"
96
- // />
97
- // </svg>
98
- // <span className="text-lg font-semibold tracking-tight select-none">
99
- // Create Next Pro
100
- // </span>
101
- // </div>
102
- // <nav className="flex items-center gap-4">
103
- // {isConnected ? <UserNav /> : <PublicNav />}
104
- // <LocaleSwitcher />
105
- // </nav>
106
- // </div>
107
- // </header>
108
- // {/* Main content */}
109
- // <section className="mx-auto w-full max-w-3xl py-16 px-6">
110
- // {isConnected ? <DashboardPage /> : <HomePage />}
111
- // </section>
112
- // </main>
113
- // );
114
- // }
115
-
116
- // // Design inspiré de nextjs.org avec Tailwind CSS.
@@ -1,6 +1,4 @@
1
- import { sign } from "jsonwebtoken";
2
1
  import NextAuth from "next-auth";
3
- //import { authOptions } from "@/auth.config";
4
2
  import type {
5
3
  NextAuthOptions,
6
4
  Session,
@@ -10,8 +8,6 @@ import type {
10
8
  } from "next-auth";
11
9
  import GoogleProvider from "next-auth/providers/google";
12
10
  import type { JWT } from "next-auth/jwt";
13
- import { getToken } from "next-auth/jwt";
14
- import { NextRequest, NextResponse } from "next/server";
15
11
 
16
12
  const authOptions: NextAuthOptions = {
17
13
  providers: [
@@ -28,20 +24,14 @@ const authOptions: NextAuthOptions = {
28
24
  token.name = user.name;
29
25
  }
30
26
  console.log("JWT Callback:", token);
31
- // On ne met rien dans le token NextAuth
32
- // Le token JWT applicatif est géré dans le middleware
33
- // et dans le callback de la route d'authentification
34
- // pour éviter de le stocker dans la session NextAuth
35
- // et de le renvoyer au client.
36
- // Il est uniquement utilisé côté serveur pour vérifier l'authentification.
37
- // On peut ajouter des données supplémentaires si nécessaire
38
- // mais pour l'instant, on garde le token minimaliste.
39
- // Exemple d'ajout de données :
40
- // token.customData = "some data";
27
+
41
28
  return token;
42
29
  },
43
30
  async session({ session, token }: { session: Session; token: JWT }) {
44
- // On ne met rien dans la session NextAuth
31
+ if (session.user) {
32
+ session.user.email = token.email;
33
+ session.user.name = token.name;
34
+ }
45
35
  return session;
46
36
  },
47
37
  async signIn({
@@ -60,22 +50,13 @@ const authOptions: NextAuthOptions = {
60
50
  return true;
61
51
  },
62
52
  async redirect({ url, baseUrl }: { url: string; baseUrl: string }) {
63
- // Après login, redirige vers l'endpoint qui pose le cookie JWT applicatif
64
- // console.log("Before Redirect Callback :", { url: url, baseUrl: baseUrl });
65
53
  const customCallbackRoute = "/api/auth/post-login";
66
- /* if (url.startsWith(baseUrl)) {
67
- console.log("Redirecting to post-login endpoint");
68
- return "/api/auth/post-login";
69
- } */
70
- // console.log("Redirecting to base URL + customCallbackRoute");
54
+
71
55
  return baseUrl + customCallbackRoute;
72
56
  },
73
57
  },
74
- // Ajoute ici d'autres options/callbacks si besoin
75
58
  };
76
59
 
77
- // Suppression de customJwtCookie : la pose du cookie se fait dans /api/auth/post-login
78
-
79
60
  const handler = NextAuth(authOptions);
80
61
 
81
62
  export { handler as GET, handler as POST };
@@ -2,7 +2,6 @@ import { getToken } from "next-auth/jwt";
2
2
  import { sign } from "jsonwebtoken";
3
3
  import { NextResponse, NextRequest } from "next/server";
4
4
  import { redirect } from "@/lib/i18n/navigation";
5
- // import { NextURL } from "next/dist/server/web/next-url";
6
5
 
7
6
  export async function GET(req: NextRequest) {
8
7
  const token = await getToken({ req, secret: process.env.NEXTAUTH_SECRET });
@@ -13,7 +12,7 @@ export async function GET(req: NextRequest) {
13
12
  { expiresIn: "7d" }
14
13
  );
15
14
  const res = NextResponse.redirect(req.nextUrl.origin + "/");
16
- res.cookies.set("app_token", appJwt, {
15
+ res.cookies.set("access_token", appJwt, {
17
16
  httpOnly: true,
18
17
  secure: process.env.NODE_ENV === "production",
19
18
  sameSite: "strict",