create-stackkit-app 0.4.4 → 0.4.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 (55) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +62 -4
  3. package/dist/lib/create-project.d.ts +20 -1
  4. package/dist/lib/create-project.js +133 -48
  5. package/dist/lib/utils/config-utils.js +56 -1
  6. package/dist/lib/utils/logger.d.ts +16 -0
  7. package/dist/lib/utils/logger.js +59 -0
  8. package/dist/lib/utils/module-utils.js +346 -196
  9. package/dist/lib/utils/package-utils.js +2 -2
  10. package/modules/auth/authjs/files/api/auth/[...nextauth]/route.ts +6 -0
  11. package/modules/auth/authjs/files/lib/auth-client.ts +11 -0
  12. package/modules/auth/authjs/files/lib/auth.ts +41 -0
  13. package/modules/auth/authjs/files/schemas/prisma-schema.prisma +45 -0
  14. package/modules/auth/authjs/module.json +95 -0
  15. package/modules/auth/better-auth/files/lib/auth-client.ts +7 -0
  16. package/modules/auth/better-auth/files/lib/auth.ts +62 -0
  17. package/modules/auth/better-auth/files/lib/email-service.ts +34 -0
  18. package/modules/auth/better-auth/files/lib/email-templates.ts +89 -0
  19. package/modules/auth/better-auth/files/schemas/prisma-schema.prisma +1 -1
  20. package/modules/auth/better-auth/module.json +164 -27
  21. package/modules/database/mongoose/files/lib/db.ts +68 -0
  22. package/modules/database/{mongoose-mongodb → mongoose}/files/models/User.ts +0 -5
  23. package/modules/database/{mongoose-mongodb → mongoose}/module.json +9 -24
  24. package/modules/database/prisma/files/lib/prisma.ts +1 -3
  25. package/modules/database/prisma/files/prisma/schema.prisma +1 -1
  26. package/modules/database/prisma/files/prisma.config.ts +2 -2
  27. package/modules/database/prisma/module.json +5 -23
  28. package/package.json +1 -1
  29. package/templates/express/.env.example +0 -1
  30. package/templates/express/package.json +4 -4
  31. package/templates/express/src/app.ts +2 -2
  32. package/templates/express/src/features/health/health.controller.ts +18 -0
  33. package/templates/express/src/features/health/health.route.ts +9 -0
  34. package/templates/express/src/features/health/health.service.ts +6 -0
  35. package/templates/nextjs/lib/env.ts +8 -0
  36. package/templates/nextjs/package.json +7 -7
  37. package/templates/react-vite/.env.example +1 -2
  38. package/templates/react-vite/.prettierignore +4 -0
  39. package/templates/react-vite/.prettierrc +9 -0
  40. package/templates/react-vite/README.md +22 -0
  41. package/templates/react-vite/package.json +16 -16
  42. package/templates/react-vite/src/router.tsx +0 -12
  43. package/templates/react-vite/vite.config.ts +0 -6
  44. package/modules/auth/clerk/files/express/auth.ts +0 -7
  45. package/modules/auth/clerk/files/nextjs/auth-provider.tsx +0 -5
  46. package/modules/auth/clerk/files/nextjs/middleware.ts +0 -9
  47. package/modules/auth/clerk/files/react/auth-provider.tsx +0 -15
  48. package/modules/auth/clerk/module.json +0 -115
  49. package/modules/database/mongoose-mongodb/files/lib/db.ts +0 -78
  50. package/templates/express/src/features/auth/auth.controller.ts +0 -48
  51. package/templates/express/src/features/auth/auth.route.ts +0 -10
  52. package/templates/express/src/features/auth/auth.service.ts +0 -21
  53. package/templates/react-vite/src/api/services/user.service.ts +0 -18
  54. package/templates/react-vite/src/pages/UserProfile.tsx +0 -40
  55. package/templates/react-vite/src/types/user.d.ts +0 -6
@@ -3,7 +3,6 @@ import mongoose, { Document, Schema } from "mongoose";
3
3
  export interface IUser extends Document {
4
4
  name: string;
5
5
  email: string;
6
- password: string;
7
6
  createdAt: Date;
8
7
  updatedAt: Date;
9
8
  }
@@ -22,10 +21,6 @@ const UserSchema: Schema = new Schema(
22
21
  lowercase: true,
23
22
  trim: true,
24
23
  },
25
- password: {
26
- type: String,
27
- required: true,
28
- },
29
24
  },
30
25
  {
31
26
  timestamps: true,
@@ -1,6 +1,6 @@
1
1
  {
2
- "name": "mongoose-mongodb",
3
- "displayName": "Mongoose + MongoDB",
2
+ "name": "mongoose",
3
+ "displayName": "Mongoose (MongoDB)",
4
4
  "description": "Mongoose ODM for MongoDB database",
5
5
  "category": "database",
6
6
  "provider": "mongoose",
@@ -8,7 +8,7 @@
8
8
  "supportedFrameworks": ["nextjs", "express"],
9
9
  "dependencies": {
10
10
  "mongoose": "^8.8.4",
11
- "dotenv": "^17.2.3"
11
+ "mongodb": "^6.10.0"
12
12
  },
13
13
  "devDependencies": {
14
14
  "@types/mongoose": "^5.11.97"
@@ -17,8 +17,7 @@
17
17
  "common": [
18
18
  {
19
19
  "key": "DATABASE_URL",
20
- "value": "mongodb://localhost:27017/myapp",
21
- "description": "MongoDB connection string",
20
+ "value": "mongodb+srv://username:password@cluster.mongodb.net/mydb",
22
21
  "required": true
23
22
  }
24
23
  ]
@@ -30,35 +29,21 @@
30
29
  "compilerOptions": {
31
30
  "baseUrl": ".",
32
31
  "paths": {
33
- "@/*": ["./src/*"],
34
- "@/models/*": ["./src/models/*"]
32
+ "@/*": ["./*"]
35
33
  }
36
34
  },
37
- "include": ["src/**/*", "src/models/**/*"],
35
+ "include": ["src/**/*", "lib/**/*"],
38
36
  "exclude": ["node_modules", "dist"]
39
37
  }
40
38
  }
41
- },
42
- "nextjs": {
43
- "tsconfig.json": {
44
- "merge": {
45
- "compilerOptions": {
46
- "baseUrl": ".",
47
- "paths": {
48
- "@/models/*": ["./models/*"]
49
- }
50
- },
51
- "exclude": ["node_modules", ".next", "out"]
52
- }
53
- }
54
39
  }
55
40
  },
56
41
  "patches": [
57
42
  {
58
43
  "type": "create-file",
59
- "description": "Create MongoDB connection with Mongoose",
60
- "source": "lib/db.ts",
61
- "destination": "{{lib}}/db.ts"
44
+ "description": "{{dbDescription}}",
45
+ "source": "lib/{{dbFile}}",
46
+ "destination": "{{lib}}/{{dbFile}}"
62
47
  },
63
48
  {
64
49
  "type": "create-file",
@@ -1,6 +1,4 @@
1
1
  import "dotenv/config";
2
- import { PrismaClient } from "@/generated/prisma/client";
3
-
2
+ import { PrismaClient } from "./generated/prisma/client";
4
3
  {{prismaClientInit}}
5
-
6
4
  export { prisma };
@@ -1,6 +1,6 @@
1
1
  generator client {
2
2
  provider = "prisma-client"
3
- output = "../generated/prisma"
3
+ output = "../lib/generated/prisma"
4
4
  }
5
5
 
6
6
  datasource db {
@@ -1,5 +1,5 @@
1
1
  import "dotenv/config";
2
- import { defineConfig } from "prisma/config";
2
+ import { defineConfig, env } from "prisma/config";
3
3
 
4
4
  export default defineConfig({
5
5
  schema: "prisma/schema.prisma",
@@ -7,6 +7,6 @@ export default defineConfig({
7
7
  path: "prisma/migrations",
8
8
  },
9
9
  datasource: {
10
- url: process.env["DATABASE_URL"],
10
+ url: env('DATABASE_URL'),
11
11
  },
12
12
  });
@@ -49,7 +49,6 @@
49
49
  {
50
50
  "key": "DATABASE_URL",
51
51
  "value": "{{connectionString}}",
52
- "description": "Database connection URL",
53
52
  "required": true
54
53
  }
55
54
  ],
@@ -58,31 +57,26 @@
58
57
  {
59
58
  "key": "DATABASE_HOST",
60
59
  "value": "localhost",
61
- "description": "MySQL host",
62
60
  "required": true
63
61
  },
64
62
  {
65
63
  "key": "DATABASE_USER",
66
64
  "value": "",
67
- "description": "MySQL username",
68
65
  "required": true
69
66
  },
70
67
  {
71
68
  "key": "DATABASE_PASSWORD",
72
69
  "value": "",
73
- "description": "MySQL password",
74
70
  "required": true
75
71
  },
76
72
  {
77
73
  "key": "DATABASE_NAME",
78
74
  "value": "mydb",
79
- "description": "MySQL database name",
80
75
  "required": true
81
76
  },
82
77
  {
83
78
  "key": "DATABASE_PORT",
84
79
  "value": "3306",
85
- "description": "MySQL port",
86
80
  "required": false
87
81
  }
88
82
  ]
@@ -94,24 +88,12 @@
94
88
  "merge": {
95
89
  "compilerOptions": {
96
90
  "baseUrl": ".",
97
- "paths": {
98
- "@/*": ["./src/*"]
99
- }
100
- },
101
- "include": ["src/**/*"],
102
- "exclude": ["node_modules", "dist", "prisma/migrations"]
103
- }
104
- }
105
- },
106
- "nextjs": {
107
- "tsconfig.json": {
108
- "merge": {
109
- "compilerOptions": {
110
91
  "paths": {
111
92
  "@/*": ["./*"]
112
93
  }
113
94
  },
114
- "exclude": ["node_modules", ".next", "out", "prisma/migrations"]
95
+ "include": ["src/**/*", "lib/**/*"],
96
+ "exclude": ["node_modules", "dist", "lib/generated/prisma"]
115
97
  }
116
98
  }
117
99
  }
@@ -131,9 +113,9 @@
131
113
  },
132
114
  {
133
115
  "type": "create-file",
134
- "description": "Create Prisma client singleton",
135
- "source": "lib/prisma.ts",
136
- "destination": "{{lib}}/prisma.ts"
116
+ "description": "{{dbDescription}}",
117
+ "source": "lib/{{dbFile}}",
118
+ "destination": "{{lib}}/{{dbFile}}"
137
119
  }
138
120
  ],
139
121
  "postInstall": ["npx prisma generate"]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-stackkit-app",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "Create a new StackKit project with modular composition",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -1,3 +1,2 @@
1
- # APP CONFIGURATION
2
1
  PORT=3000
3
2
  NODE_ENV=development
@@ -22,12 +22,12 @@
22
22
  "@types/cors": "^2.8.19",
23
23
  "@types/express": "^5.0.6",
24
24
  "@types/morgan": "^1.9.10",
25
- "@types/node": "^25.0.6",
26
- "@typescript-eslint/eslint-plugin": "^8.52.0",
27
- "@typescript-eslint/parser": "^8.52.0",
25
+ "@types/node": "^25.0.8",
26
+ "@typescript-eslint/eslint-plugin": "^8.53.0",
27
+ "@typescript-eslint/parser": "^8.53.0",
28
28
  "cross-env": "^10.1.0",
29
29
  "eslint": "^9.39.2",
30
30
  "tsx": "^4.21.0",
31
31
  "typescript": "^5.9.3"
32
32
  }
33
- }
33
+ }
@@ -3,7 +3,7 @@ import express, { Application, NextFunction, Request, Response } from "express";
3
3
  import helmet from "helmet";
4
4
  import morgan from "morgan";
5
5
  import { env } from "./config/env";
6
- import { authRoutes } from "./features/auth/auth.route";
6
+ import { authRoutes } from "./features/health/health.route";
7
7
  import { errorHandler } from "./middlewares/error.middleware";
8
8
 
9
9
  // app initialization
@@ -35,7 +35,7 @@ app.get("/", (_req: Request, res: Response) => {
35
35
  });
36
36
 
37
37
  // routes
38
- app.use("/api/auth", authRoutes);
38
+ app.use("/api/health", authRoutes);
39
39
 
40
40
  // unhandled routes
41
41
  app.use((req: Request, _res: Response, next: NextFunction) => {
@@ -0,0 +1,18 @@
1
+ import { NextFunction, Request, Response } from "express";
2
+
3
+ const health = async (_req: Request, res: Response, next: NextFunction) => {
4
+ try {
5
+ res.status(200).json({
6
+ success: true,
7
+ message: "API is healthy!",
8
+ timestamp: new Date().toISOString(),
9
+ version: "1.0.0",
10
+ });
11
+ } catch (error) {
12
+ next(error);
13
+ }
14
+ };
15
+
16
+ export const healthController = {
17
+ health,
18
+ };
@@ -0,0 +1,9 @@
1
+ import { Router } from "express";
2
+ import { healthController } from "./health.controller";
3
+
4
+ const router = Router();
5
+
6
+ // demo route
7
+ router.get("/", healthController.health);
8
+
9
+ export const authRoutes = router;
@@ -0,0 +1,6 @@
1
+ // Demo service - placeholder for future use
2
+ // Add your service logic here when needed
3
+
4
+ export const healthServices = {
5
+ // placeholder
6
+ };
@@ -0,0 +1,8 @@
1
+ export const env = {
2
+ app: {
3
+ url: process.env.NEXT_PUBLIC_APP_URL || "http://localhost:3000",
4
+ },
5
+
6
+ isDev: process.env.NODE_ENV === "development",
7
+ isProd: process.env.NODE_ENV === "production",
8
+ } as const;
@@ -15,13 +15,13 @@
15
15
  "react-dom": "19.2.3"
16
16
  },
17
17
  "devDependencies": {
18
- "@tailwindcss/postcss": "^4",
19
- "@types/node": "^20",
20
- "@types/react": "^19",
21
- "@types/react-dom": "^19",
22
- "eslint": "^9",
18
+ "@tailwindcss/postcss": "^4.1.18",
19
+ "@types/node": "^25.0.8",
20
+ "@types/react": "^19.2.8",
21
+ "@types/react-dom": "^19.2.3",
22
+ "eslint": "^9.39.2",
23
23
  "eslint-config-next": "16.1.1",
24
- "tailwindcss": "^4",
25
- "typescript": "^5"
24
+ "tailwindcss": "^4.1.18",
25
+ "typescript": "^5.9.3"
26
26
  }
27
27
  }
@@ -1,2 +1 @@
1
- # API Configuration
2
- VITE_API_URL=http://localhost:3000
1
+ VITE_API_URL=http://localhost:3000
@@ -0,0 +1,4 @@
1
+ dist
2
+ node_modules
3
+ coverage
4
+ *.log
@@ -0,0 +1,9 @@
1
+ {
2
+ "semi": true,
3
+ "trailingComma": "all",
4
+ "singleQuote": false,
5
+ "printWidth": 100,
6
+ "tabWidth": 2,
7
+ "useTabs": false,
8
+ "arrowParens": "always"
9
+ }
@@ -14,6 +14,7 @@ A production-ready React starter template with TypeScript, Vite, and essential l
14
14
  - **SEO Ready** with React Helmet Async
15
15
  - **Error Boundaries** for graceful error handling
16
16
  - **ESLint** for code quality
17
+ - **Prettier** for code formatting
17
18
  - **Custom Hooks** included
18
19
 
19
20
  ## Quick Start
@@ -30,6 +31,18 @@ pnpm build
30
31
 
31
32
  # Preview production build
32
33
  pnpm preview
34
+
35
+ # Run linter
36
+ pnpm lint
37
+
38
+ # Fix linting issues
39
+ pnpm lint:fix
40
+
41
+ # Format code
42
+ pnpm format
43
+
44
+ # Check formatting
45
+ pnpm format:check
33
46
  ```
34
47
 
35
48
  ## Project Structure
@@ -44,6 +57,7 @@ src/
44
57
  ├── pages/ # Route pages
45
58
  ├── types/ # TypeScript types
46
59
  ├── utils/ # Helper functions
60
+ ├── test/ # Test setup
47
61
  ├── App.tsx # Main app component
48
62
  ├── main.tsx # Entry point
49
63
  └── index.css # Global styles
@@ -51,6 +65,14 @@ src/
51
65
 
52
66
  ## Environment Variables
53
67
 
68
+ Copy `.env.example` to `.env` and update the values:
69
+
70
+ ```bash
71
+ cp .env.example .env
72
+ ```
73
+
74
+ ## Environment Variables
75
+
54
76
  Create a `.env` file:
55
77
 
56
78
  ```env
@@ -12,33 +12,33 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@tailwindcss/vite": "^4.1.18",
15
- "@tanstack/react-query": "^5.62.0",
16
- "@tanstack/react-query-devtools": "^5.62.0",
17
- "axios": "^1.7.7",
15
+ "@tanstack/react-query": "^5.90.16",
16
+ "@tanstack/react-query-devtools": "^5.91.2",
17
+ "axios": "^1.13.2",
18
18
  "class-variance-authority": "^0.7.1",
19
19
  "clsx": "^2.1.1",
20
- "react": "^19.2.0",
21
- "react-dom": "^19.2.0",
20
+ "react": "^19.2.3",
21
+ "react-dom": "^19.2.3",
22
22
  "react-helmet-async": "^2.0.5",
23
- "react-hot-toast": "^2.4.1",
23
+ "react-hot-toast": "^2.6.0",
24
24
  "react-router": "^7.12.0",
25
25
  "tailwind-merge": "^3.4.0"
26
26
  },
27
27
  "devDependencies": {
28
- "@eslint/js": "^9.39.1",
29
- "@types/node": "^24.10.1",
30
- "@types/react": "^19.2.5",
28
+ "@eslint/js": "^9.39.2",
29
+ "@types/node": "^25.0.8",
30
+ "@types/react": "^19.2.8",
31
31
  "@types/react-dom": "^19.2.3",
32
- "@vitejs/plugin-react": "^5.1.1",
32
+ "@vitejs/plugin-react": "^5.1.2",
33
33
  "autoprefixer": "^10.4.23",
34
- "eslint": "^9.39.1",
34
+ "eslint": "^9.39.2",
35
35
  "eslint-plugin-react-hooks": "^7.0.1",
36
- "eslint-plugin-react-refresh": "^0.4.24",
37
- "globals": "^16.5.0",
36
+ "eslint-plugin-react-refresh": "^0.4.26",
37
+ "globals": "^17.0.0",
38
38
  "postcss": "^8.5.6",
39
39
  "tailwindcss": "^4.1.18",
40
40
  "typescript": "~5.9.3",
41
- "typescript-eslint": "^8.46.4",
42
- "vite": "^7.2.4"
41
+ "typescript-eslint": "^8.53.0",
42
+ "vite": "^7.3.1"
43
43
  }
44
- }
44
+ }
@@ -1,11 +1,9 @@
1
1
  import { createBrowserRouter } from "react-router";
2
- import { userService } from "./api/services/user.service";
3
2
  import { ErrorBoundary } from "./components/ErrorBoundary";
4
3
  import Layout from "./components/Layout";
5
4
  import About from "./pages/About";
6
5
  import Home from "./pages/Home";
7
6
  import NotFound from "./pages/NotFound";
8
- import UserProfile from "./pages/UserProfile";
9
7
 
10
8
  export const router = createBrowserRouter([
11
9
  {
@@ -15,16 +13,6 @@ export const router = createBrowserRouter([
15
13
  children: [
16
14
  { index: true, Component: Home },
17
15
  { path: "about", Component: About },
18
- {
19
- path: "users/:userId",
20
- loader: async ({ params }) => {
21
- const id = params.userId;
22
- if (!id) throw new Response("Missing user id", { status: 400 });
23
- const user = await userService.getUser(id);
24
- return user;
25
- },
26
- Component: UserProfile,
27
- },
28
16
  { path: "*", Component: NotFound },
29
17
  ],
30
18
  },
@@ -1,13 +1,7 @@
1
1
  import tailwindcss from "@tailwindcss/vite";
2
2
  import react from "@vitejs/plugin-react";
3
- import path from "path";
4
3
  import { defineConfig } from "vite";
5
4
 
6
5
  export default defineConfig({
7
6
  plugins: [react(), tailwindcss()],
8
- resolve: {
9
- alias: {
10
- "@": path.resolve(__dirname, "./src"),
11
- },
12
- },
13
7
  });
@@ -1,7 +0,0 @@
1
- import { clerkClient, clerkMiddleware, requireAuth } from "@clerk/express";
2
-
3
- export { clerkMiddleware, requireAuth };
4
-
5
- export async function getCurrentUser(userId: string) {
6
- return await clerkClient.users.getUser(userId);
7
- }
@@ -1,5 +0,0 @@
1
- import { ClerkProvider } from "@clerk/nextjs";
2
-
3
- export function AuthProvider({ children }: { children: React.ReactNode }) {
4
- return <ClerkProvider>{children}</ClerkProvider>;
5
- }
@@ -1,9 +0,0 @@
1
- import { authMiddleware } from "@clerk/nextjs";
2
-
3
- export default authMiddleware({
4
- publicRoutes: ["/"],
5
- });
6
-
7
- export const config = {
8
- matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"],
9
- };
@@ -1,15 +0,0 @@
1
- import { ClerkProvider } from "@clerk/clerk-react";
2
-
3
- const publishableKey = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY;
4
-
5
- if (!publishableKey) {
6
- throw new Error("Missing Publishable Key");
7
- }
8
-
9
- export function AuthProvider({ children }: { children: React.ReactNode }) {
10
- return (
11
- <ClerkProvider publishableKey={publishableKey} afterSignOutUrl="/">
12
- {children}
13
- </ClerkProvider>
14
- );
15
- }
@@ -1,115 +0,0 @@
1
- {
2
- "name": "clerk",
3
- "displayName": "Clerk",
4
- "description": "Clerk Authentication",
5
- "category": "auth",
6
- "provider": "clerk",
7
- "supportedFrameworks": ["nextjs", "express", "react-vite"],
8
- "frameworkConfigs": {
9
- "nextjs": {
10
- "dependencies": {
11
- "@clerk/nextjs": "^6.10.2"
12
- },
13
- "envVars": [
14
- {
15
- "key": "NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY",
16
- "value": "",
17
- "description": "Clerk publishable key (from Clerk dashboard)",
18
- "required": true
19
- },
20
- {
21
- "key": "CLERK_SECRET_KEY",
22
- "value": "",
23
- "description": "Clerk secret key (from Clerk dashboard)",
24
- "required": true
25
- },
26
- {
27
- "key": "NEXT_PUBLIC_CLERK_SIGN_IN_URL",
28
- "value": "/sign-in",
29
- "description": "Sign in page URL",
30
- "required": true
31
- },
32
- {
33
- "key": "NEXT_PUBLIC_CLERK_SIGN_UP_URL",
34
- "value": "/sign-up",
35
- "description": "Sign up page URL",
36
- "required": true
37
- },
38
- {
39
- "key": "NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL",
40
- "value": "/",
41
- "description": "Redirect URL after sign in",
42
- "required": true
43
- },
44
- {
45
- "key": "NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL",
46
- "value": "/",
47
- "description": "Redirect URL after sign up",
48
- "required": true
49
- }
50
- ],
51
- "patches": [
52
- {
53
- "type": "create-file",
54
- "description": "Create Clerk auth provider",
55
- "source": "nextjs/auth-provider.tsx",
56
- "destination": "{{lib}}/auth-provider.tsx"
57
- },
58
- {
59
- "type": "create-file",
60
- "description": "Create Clerk middleware",
61
- "source": "nextjs/middleware.ts",
62
- "destination": "middleware.ts"
63
- }
64
- ]
65
- },
66
- "express": {
67
- "dependencies": {
68
- "@clerk/express": "^1.3.0"
69
- },
70
- "envVars": [
71
- {
72
- "key": "CLERK_PUBLISHABLE_KEY",
73
- "value": "",
74
- "description": "Clerk publishable key (from Clerk dashboard)",
75
- "required": true
76
- },
77
- {
78
- "key": "CLERK_SECRET_KEY",
79
- "value": "",
80
- "description": "Clerk secret key (from Clerk dashboard)",
81
- "required": true
82
- }
83
- ],
84
- "patches": [
85
- {
86
- "type": "create-file",
87
- "description": "Create Clerk auth utilities",
88
- "source": "express/auth.ts",
89
- "destination": "{{lib}}/auth.ts"
90
- }
91
- ]
92
- },
93
- "react-vite": {
94
- "dependencies": {
95
- "@clerk/clerk-react": "^5.15.0"
96
- },
97
- "envVars": [
98
- {
99
- "key": "VITE_CLERK_PUBLISHABLE_KEY",
100
- "value": "",
101
- "description": "Clerk publishable key (from Clerk dashboard)",
102
- "required": true
103
- }
104
- ],
105
- "patches": [
106
- {
107
- "type": "create-file",
108
- "description": "Create Clerk auth provider",
109
- "source": "react/auth-provider.tsx",
110
- "destination": "{{lib}}/auth-provider.tsx"
111
- }
112
- ]
113
- }
114
- }
115
- }