nx-factory-cli 2.1.1 → 2.1.3
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.
- package/dist/index.js +42127 -93
- package/package.json +3 -2
- package/dist/commands/add-app.d.ts +0 -10
- package/dist/commands/add-app.d.ts.map +0 -1
- package/dist/commands/add-app.js +0 -392
- package/dist/commands/add-app.js.map +0 -1
- package/dist/commands/add-auth.d.ts +0 -8
- package/dist/commands/add-auth.d.ts.map +0 -1
- package/dist/commands/add-auth.js +0 -182
- package/dist/commands/add-auth.js.map +0 -1
- package/dist/commands/add-component.d.ts +0 -2
- package/dist/commands/add-component.d.ts.map +0 -1
- package/dist/commands/add-component.js +0 -116
- package/dist/commands/add-component.js.map +0 -1
- package/dist/commands/add-lib.d.ts +0 -9
- package/dist/commands/add-lib.d.ts.map +0 -1
- package/dist/commands/add-lib.js +0 -190
- package/dist/commands/add-lib.js.map +0 -1
- package/dist/commands/add-storybook.d.ts +0 -6
- package/dist/commands/add-storybook.d.ts.map +0 -1
- package/dist/commands/add-storybook.js +0 -181
- package/dist/commands/add-storybook.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -2
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -235
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/init.d.ts +0 -9
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -527
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.d.ts +0 -2
- package/dist/commands/list.d.ts.map +0 -1
- package/dist/commands/list.js +0 -130
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/publish.d.ts +0 -8
- package/dist/commands/publish.d.ts.map +0 -1
- package/dist/commands/publish.js +0 -179
- package/dist/commands/publish.js.map +0 -1
- package/dist/commands/remove-component.d.ts +0 -5
- package/dist/commands/remove-component.d.ts.map +0 -1
- package/dist/commands/remove-component.js +0 -172
- package/dist/commands/remove-component.js.map +0 -1
- package/dist/commands/update.d.ts +0 -5
- package/dist/commands/update.d.ts.map +0 -1
- package/dist/commands/update.js +0 -126
- package/dist/commands/update.js.map +0 -1
- package/dist/config.d.ts +0 -14
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -35
- package/dist/config.js.map +0 -1
- package/dist/exec.d.ts +0 -25
- package/dist/exec.d.ts.map +0 -1
- package/dist/exec.js +0 -80
- package/dist/exec.js.map +0 -1
- package/dist/files.d.ts +0 -7
- package/dist/files.d.ts.map +0 -1
- package/dist/files.js +0 -23
- package/dist/files.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/resolve-root.d.ts +0 -22
- package/dist/resolve-root.d.ts.map +0 -1
- package/dist/resolve-root.js +0 -65
- package/dist/resolve-root.js.map +0 -1
- package/dist/setups/auth/base.d.ts +0 -11
- package/dist/setups/auth/base.d.ts.map +0 -1
- package/dist/setups/auth/base.js +0 -91
- package/dist/setups/auth/base.js.map +0 -1
- package/dist/setups/auth/index.d.ts +0 -6
- package/dist/setups/auth/index.d.ts.map +0 -1
- package/dist/setups/auth/index.js +0 -5
- package/dist/setups/auth/index.js.map +0 -1
- package/dist/setups/auth/systems/better-auth.d.ts +0 -3
- package/dist/setups/auth/systems/better-auth.d.ts.map +0 -1
- package/dist/setups/auth/systems/better-auth.js +0 -357
- package/dist/setups/auth/systems/better-auth.js.map +0 -1
- package/dist/setups/auth/systems/clerk.d.ts +0 -3
- package/dist/setups/auth/systems/clerk.d.ts.map +0 -1
- package/dist/setups/auth/systems/clerk.js +0 -259
- package/dist/setups/auth/systems/clerk.js.map +0 -1
- package/dist/setups/auth/systems/workos.d.ts +0 -3
- package/dist/setups/auth/systems/workos.d.ts.map +0 -1
- package/dist/setups/auth/systems/workos.js +0 -273
- package/dist/setups/auth/systems/workos.js.map +0 -1
- package/dist/setups/auth/types.d.ts +0 -39
- package/dist/setups/auth/types.d.ts.map +0 -1
- package/dist/setups/auth/types.js +0 -2
- package/dist/setups/auth/types.js.map +0 -1
- package/dist/ui.d.ts +0 -44
- package/dist/ui.d.ts.map +0 -1
- package/dist/ui.js +0 -149
- package/dist/ui.js.map +0 -1
|
@@ -1,357 +0,0 @@
|
|
|
1
|
-
import path from "path";
|
|
2
|
-
import { writeFile, ensureDir } from "../../../files";
|
|
3
|
-
export const betterAuthScaffolder = {
|
|
4
|
-
label: "Better Auth",
|
|
5
|
-
dependencies: {
|
|
6
|
-
"better-auth": "latest",
|
|
7
|
-
},
|
|
8
|
-
devDependencies: {
|
|
9
|
-
"@types/react": "^19.0.0",
|
|
10
|
-
},
|
|
11
|
-
peerDependencies: {
|
|
12
|
-
react: "^18 || ^19",
|
|
13
|
-
"react-dom": "^18 || ^19",
|
|
14
|
-
},
|
|
15
|
-
async scaffold(pkgDir, _opts) {
|
|
16
|
-
await ensureDir(path.join(pkgDir, "src"));
|
|
17
|
-
// ── src/index.ts ──────────────────────────────────────────────────────────
|
|
18
|
-
await writeFile(path.join(pkgDir, "src/index.ts"), `/**
|
|
19
|
-
* @workspace/auth — Better Auth v1.2+
|
|
20
|
-
*
|
|
21
|
-
* Prefer sub-path imports for tree-shaking:
|
|
22
|
-
* import { auth } from "@workspace/auth/server"
|
|
23
|
-
* import { authClient } from "@workspace/auth/client"
|
|
24
|
-
* import { authMiddleware } from "@workspace/auth/middleware"
|
|
25
|
-
*/
|
|
26
|
-
export * from "./server.js";
|
|
27
|
-
export * from "./client.js";
|
|
28
|
-
`);
|
|
29
|
-
// ── src/server.ts ─────────────────────────────────────────────────────────
|
|
30
|
-
// better-auth v1.2: betterAuth() config, database adapters, plugins
|
|
31
|
-
await writeFile(path.join(pkgDir, "src/server.ts"), `/**
|
|
32
|
-
* Better Auth @latest — server instance.
|
|
33
|
-
*
|
|
34
|
-
* This file is the single source of truth for your auth configuration.
|
|
35
|
-
* Import \`auth\` in API routes, server components, and middleware.
|
|
36
|
-
*
|
|
37
|
-
* @example Next.js App Router (Server Component)
|
|
38
|
-
* import { auth } from "@workspace/auth/server";
|
|
39
|
-
* import { headers } from "next/headers";
|
|
40
|
-
*
|
|
41
|
-
* const session = await auth.api.getSession({ headers: await headers() });
|
|
42
|
-
*
|
|
43
|
-
* @example Next.js Route Handler
|
|
44
|
-
* import { auth } from "@workspace/auth/server";
|
|
45
|
-
* import { toNextJsHandler } from "better-auth/next-js";
|
|
46
|
-
* export const { GET, POST } = toNextJsHandler(auth.handler);
|
|
47
|
-
*
|
|
48
|
-
* @example Remix loader
|
|
49
|
-
* import { auth } from "@workspace/auth/server";
|
|
50
|
-
* const session = await auth.api.getSession({ headers: request.headers });
|
|
51
|
-
*/
|
|
52
|
-
import { betterAuth } from "better-auth";
|
|
53
|
-
|
|
54
|
-
export const auth = betterAuth({
|
|
55
|
-
/**
|
|
56
|
-
* Database adapter.
|
|
57
|
-
*
|
|
58
|
-
* Default: in-memory (development only — data is lost on restart).
|
|
59
|
-
* For production, pick one:
|
|
60
|
-
*
|
|
61
|
-
* PostgreSQL:
|
|
62
|
-
* import { pg } from "better-auth/adapters/pg";
|
|
63
|
-
* database: pg({ connectionString: process.env.DATABASE_URL! }),
|
|
64
|
-
*
|
|
65
|
-
* MySQL:
|
|
66
|
-
* import { mysql } from "better-auth/adapters/mysql";
|
|
67
|
-
* database: mysql({ uri: process.env.DATABASE_URL! }),
|
|
68
|
-
*
|
|
69
|
-
* SQLite (local dev):
|
|
70
|
-
* import { sqlite } from "better-auth/adapters/sqlite";
|
|
71
|
-
* import Database from "better-sqlite3";
|
|
72
|
-
* database: sqlite(new Database("./dev.db")),
|
|
73
|
-
*
|
|
74
|
-
* Prisma:
|
|
75
|
-
* import { prismaAdapter } from "better-auth/adapters/prisma";
|
|
76
|
-
* import { prisma } from "@workspace/db";
|
|
77
|
-
* database: prismaAdapter(prisma, { provider: "postgresql" }),
|
|
78
|
-
*
|
|
79
|
-
* Drizzle:
|
|
80
|
-
* import { drizzleAdapter } from "better-auth/adapters/drizzle";
|
|
81
|
-
* import { db } from "@workspace/db";
|
|
82
|
-
* database: drizzleAdapter(db, { provider: "pg" }),
|
|
83
|
-
*/
|
|
84
|
-
database: undefined as never, // Replace with your adapter
|
|
85
|
-
|
|
86
|
-
emailAndPassword: {
|
|
87
|
-
enabled: true,
|
|
88
|
-
// requireEmailVerification: true,
|
|
89
|
-
// sendResetPassword: async ({ user, url }) => { ... },
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
session: {
|
|
93
|
-
cookieCache: {
|
|
94
|
-
enabled: true,
|
|
95
|
-
maxAge: 60 * 5, // 5 minutes
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
|
|
99
|
-
// Social providers (uncomment as needed):
|
|
100
|
-
// socialProviders: {
|
|
101
|
-
// github: {
|
|
102
|
-
// clientId: process.env.GITHUB_CLIENT_ID!,
|
|
103
|
-
// clientSecret: process.env.GITHUB_CLIENT_SECRET!,
|
|
104
|
-
// },
|
|
105
|
-
// google: {
|
|
106
|
-
// clientId: process.env.GOOGLE_CLIENT_ID!,
|
|
107
|
-
// clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
|
|
108
|
-
// },
|
|
109
|
-
// },
|
|
110
|
-
|
|
111
|
-
// Plugins (uncomment to enable):
|
|
112
|
-
// plugins: [
|
|
113
|
-
// twoFactor(), // import { twoFactor } from "better-auth/plugins";
|
|
114
|
-
// organization(), // import { organization } from "better-auth/plugins";
|
|
115
|
-
// admin(), // import { admin } from "better-auth/plugins";
|
|
116
|
-
// passkey(), // import { passkey } from "better-auth/plugins";
|
|
117
|
-
// ],
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
/** Inferred Session type from your auth config */
|
|
121
|
-
export type Session = typeof auth.$Infer.Session;
|
|
122
|
-
/** Inferred User type from your auth config */
|
|
123
|
-
export type User = typeof auth.$Infer.Session.user;
|
|
124
|
-
`);
|
|
125
|
-
// ── src/client.ts ─────────────────────────────────────────────────────────
|
|
126
|
-
// better-auth v1.2: createAuthClient from "better-auth/react"
|
|
127
|
-
await writeFile(path.join(pkgDir, "src/client.ts"), `/**
|
|
128
|
-
* Better Auth v1.2+ — browser client.
|
|
129
|
-
*
|
|
130
|
-
* Works in React Client Components, Vite SPAs, and Expo.
|
|
131
|
-
*
|
|
132
|
-
* @example
|
|
133
|
-
* import { signIn, signOut, useSession } from "@workspace/auth/client";
|
|
134
|
-
*
|
|
135
|
-
* // React hook
|
|
136
|
-
* const { data: session, isPending } = useSession();
|
|
137
|
-
*
|
|
138
|
-
* // Sign in with email
|
|
139
|
-
* const { data, error } = await signIn.email({ email, password });
|
|
140
|
-
*
|
|
141
|
-
* // Sign in with OAuth
|
|
142
|
-
* await signIn.social({ provider: "github" });
|
|
143
|
-
*
|
|
144
|
-
* // Sign out
|
|
145
|
-
* await signOut();
|
|
146
|
-
*/
|
|
147
|
-
"use client";
|
|
148
|
-
|
|
149
|
-
import { createAuthClient } from "better-auth/react";
|
|
150
|
-
|
|
151
|
-
export const authClient = createAuthClient({
|
|
152
|
-
/**
|
|
153
|
-
* The base URL of your app's auth API.
|
|
154
|
-
* Each app in the monorepo exposes /api/auth, so override per-app
|
|
155
|
-
* via NEXT_PUBLIC_APP_URL (or VITE_APP_URL for Vite apps).
|
|
156
|
-
*/
|
|
157
|
-
baseURL:
|
|
158
|
-
process.env.NEXT_PUBLIC_APP_URL ??
|
|
159
|
-
(typeof window !== "undefined" ? window.location.origin : "http://localhost:3000"),
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
export const {
|
|
163
|
-
signIn,
|
|
164
|
-
signOut,
|
|
165
|
-
signUp,
|
|
166
|
-
useSession,
|
|
167
|
-
useActiveSessions,
|
|
168
|
-
getSession,
|
|
169
|
-
updateUser,
|
|
170
|
-
deleteUser,
|
|
171
|
-
linkSocial,
|
|
172
|
-
unlinkAccount,
|
|
173
|
-
listSessions,
|
|
174
|
-
revokeSession,
|
|
175
|
-
revokeSessions,
|
|
176
|
-
changeEmail,
|
|
177
|
-
changePassword,
|
|
178
|
-
resetPassword,
|
|
179
|
-
forgetPassword,
|
|
180
|
-
verifyEmail,
|
|
181
|
-
sendVerificationEmail,
|
|
182
|
-
} = authClient;
|
|
183
|
-
`);
|
|
184
|
-
// ── src/middleware.ts ─────────────────────────────────────────────────────
|
|
185
|
-
// better-auth v1.2: auth.api.getSession pattern (no separate middleware pkg)
|
|
186
|
-
await writeFile(path.join(pkgDir, "src/middleware.ts"), `/**
|
|
187
|
-
* Better Auth v1.2+ — Next.js middleware.
|
|
188
|
-
*
|
|
189
|
-
* Quick start — copy into apps/<your-app>/middleware.ts:
|
|
190
|
-
*
|
|
191
|
-
* export { authMiddleware as default, middlewareConfig as config }
|
|
192
|
-
* from "@workspace/auth/middleware";
|
|
193
|
-
*
|
|
194
|
-
* Custom public paths:
|
|
195
|
-
*
|
|
196
|
-
* import { buildMiddleware } from "@workspace/auth/middleware";
|
|
197
|
-
* export default buildMiddleware({ publicPaths: ["/", "/about(.*)"] });
|
|
198
|
-
* export { middlewareConfig as config } from "@workspace/auth/middleware";
|
|
199
|
-
*/
|
|
200
|
-
import { NextRequest, NextResponse } from "next/server";
|
|
201
|
-
import { auth } from "./server.js";
|
|
202
|
-
|
|
203
|
-
const DEFAULT_PUBLIC_PATHS = [
|
|
204
|
-
"/",
|
|
205
|
-
"/sign-in",
|
|
206
|
-
"/sign-up",
|
|
207
|
-
"/api/auth", // Better Auth's own handler
|
|
208
|
-
"/api/webhooks", // Webhook endpoints
|
|
209
|
-
];
|
|
210
|
-
|
|
211
|
-
export const middlewareConfig = {
|
|
212
|
-
matcher: [
|
|
213
|
-
"/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)",
|
|
214
|
-
"/(api|trpc)(.*)",
|
|
215
|
-
],
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
/** Default middleware — protects everything except the paths above */
|
|
219
|
-
export const authMiddleware = buildMiddleware();
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Build a middleware with configurable public paths.
|
|
223
|
-
*
|
|
224
|
-
* @param publicPaths - Paths that do NOT require authentication (prefix match)
|
|
225
|
-
* @param redirectTo - Where to redirect unauthenticated users (default: /sign-in)
|
|
226
|
-
*/
|
|
227
|
-
export function buildMiddleware({
|
|
228
|
-
publicPaths = DEFAULT_PUBLIC_PATHS,
|
|
229
|
-
redirectTo = "/sign-in",
|
|
230
|
-
}: {
|
|
231
|
-
publicPaths?: string[];
|
|
232
|
-
redirectTo?: string;
|
|
233
|
-
} = {}) {
|
|
234
|
-
return async function middleware(request: NextRequest): Promise<NextResponse> {
|
|
235
|
-
const { pathname } = request.nextUrl;
|
|
236
|
-
const isPublic = publicPaths.some((p) => pathname.startsWith(p));
|
|
237
|
-
|
|
238
|
-
if (!isPublic) {
|
|
239
|
-
// better-auth v1.2: auth.api.getSession({ headers })
|
|
240
|
-
const session = await auth.api.getSession({
|
|
241
|
-
headers: request.headers,
|
|
242
|
-
});
|
|
243
|
-
if (!session) {
|
|
244
|
-
const signInUrl = new URL(redirectTo, request.url);
|
|
245
|
-
signInUrl.searchParams.set("callbackUrl", pathname);
|
|
246
|
-
return NextResponse.redirect(signInUrl);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
return NextResponse.next();
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
`);
|
|
254
|
-
// ── src/next-route-handler.ts — template for the catch-all API route ─────
|
|
255
|
-
await writeFile(path.join(pkgDir, "src/next-route-handler.ts"), `/**
|
|
256
|
-
* Template: apps/<your-app>/src/app/api/auth/[...all]/route.ts
|
|
257
|
-
*
|
|
258
|
-
* Copy this pattern into your app's API route directory.
|
|
259
|
-
* Do NOT import this file directly — it must live under app/api/auth/[...all]/.
|
|
260
|
-
*
|
|
261
|
-
* better-auth v1.2: auth.handler is the standard way to expose the API.
|
|
262
|
-
*/
|
|
263
|
-
import { auth } from "@workspace/auth/server";
|
|
264
|
-
import { toNextJsHandler } from "better-auth/next-js";
|
|
265
|
-
|
|
266
|
-
// This creates GET and POST handlers that Next.js will pick up automatically.
|
|
267
|
-
export const { GET, POST } = toNextJsHandler(auth.handler);
|
|
268
|
-
`);
|
|
269
|
-
// ── .env.example ─────────────────────────────────────────────────────────
|
|
270
|
-
await writeFile(path.join(pkgDir, ".env.example"), `# ─── Better Auth v1.2+ ────────────────────────────────────────────────────────
|
|
271
|
-
# Secret used to sign session tokens — generate with: openssl rand -base64 32
|
|
272
|
-
BETTER_AUTH_SECRET=REPLACE_WITH_RANDOM_32_CHAR_SECRET
|
|
273
|
-
|
|
274
|
-
# The canonical URL of your app (used for cookie domain & CORS)
|
|
275
|
-
BETTER_AUTH_URL=http://localhost:3000
|
|
276
|
-
NEXT_PUBLIC_APP_URL=http://localhost:3000
|
|
277
|
-
|
|
278
|
-
# ─── Database ─────────────────────────────────────────────────────────────────
|
|
279
|
-
# Uncomment the adapter you're using (see packages/auth/src/server.ts)
|
|
280
|
-
# DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
|
|
281
|
-
|
|
282
|
-
# ─── OAuth providers (optional) ───────────────────────────────────────────────
|
|
283
|
-
# GITHUB_CLIENT_ID=
|
|
284
|
-
# GITHUB_CLIENT_SECRET=
|
|
285
|
-
# GOOGLE_CLIENT_ID=
|
|
286
|
-
# GOOGLE_CLIENT_SECRET=
|
|
287
|
-
`);
|
|
288
|
-
// ── README.md ─────────────────────────────────────────────────────────────
|
|
289
|
-
await writeFile(path.join(pkgDir, "README.md"), `# @workspace/auth — Better Auth v1.2+
|
|
290
|
-
|
|
291
|
-
Shared authentication powered by [Better Auth](https://www.better-auth.com) — open-source, self-hosted, database-agnostic.
|
|
292
|
-
|
|
293
|
-
## Setup
|
|
294
|
-
|
|
295
|
-
### 1. Choose a database adapter
|
|
296
|
-
Edit \`packages/auth/src/server.ts\` and uncomment the adapter for your database (PostgreSQL, MySQL, SQLite, Prisma, Drizzle).
|
|
297
|
-
|
|
298
|
-
### 2. Copy env vars to your app
|
|
299
|
-
\`\`\`bash
|
|
300
|
-
cp packages/auth/.env.example apps/<your-app>/.env.local
|
|
301
|
-
# Fill in BETTER_AUTH_SECRET (openssl rand -base64 32) and DATABASE_URL
|
|
302
|
-
\`\`\`
|
|
303
|
-
|
|
304
|
-
### 3. Add the dependency
|
|
305
|
-
\`\`\`json
|
|
306
|
-
{ "dependencies": { "@workspace/auth": "workspace:*" } }
|
|
307
|
-
\`\`\`
|
|
308
|
-
|
|
309
|
-
### 4. Add the API route (Next.js)
|
|
310
|
-
\`\`\`ts
|
|
311
|
-
// apps/<your-app>/src/app/api/auth/[...all]/route.ts
|
|
312
|
-
import { auth } from "@workspace/auth/server";
|
|
313
|
-
import { toNextJsHandler } from "better-auth/next-js";
|
|
314
|
-
export const { GET, POST } = toNextJsHandler(auth.handler);
|
|
315
|
-
\`\`\`
|
|
316
|
-
|
|
317
|
-
### 5. Add middleware
|
|
318
|
-
\`\`\`ts
|
|
319
|
-
// apps/<your-app>/middleware.ts
|
|
320
|
-
export { authMiddleware as default, middlewareConfig as config }
|
|
321
|
-
from "@workspace/auth/middleware";
|
|
322
|
-
\`\`\`
|
|
323
|
-
|
|
324
|
-
### 6. Run migrations
|
|
325
|
-
\`\`\`bash
|
|
326
|
-
npx better-auth migrate
|
|
327
|
-
# or: npx better-auth generate (for Drizzle/Prisma — creates migration files)
|
|
328
|
-
\`\`\`
|
|
329
|
-
|
|
330
|
-
## Usage
|
|
331
|
-
|
|
332
|
-
\`\`\`tsx
|
|
333
|
-
// Server component
|
|
334
|
-
import { auth } from "@workspace/auth/server";
|
|
335
|
-
import { headers } from "next/headers";
|
|
336
|
-
const session = await auth.api.getSession({ headers: await headers() });
|
|
337
|
-
|
|
338
|
-
// Client component
|
|
339
|
-
"use client";
|
|
340
|
-
import { useSession, signIn, signOut } from "@workspace/auth/client";
|
|
341
|
-
const { data: session, isPending } = useSession();
|
|
342
|
-
await signIn.email({ email, password });
|
|
343
|
-
await signIn.social({ provider: "github" });
|
|
344
|
-
await signOut();
|
|
345
|
-
\`\`\`
|
|
346
|
-
|
|
347
|
-
## API
|
|
348
|
-
|
|
349
|
-
| Sub-path | Key exports |
|
|
350
|
-
|---|---|
|
|
351
|
-
| \`@workspace/auth/server\` | \`auth\`, \`Session\` type, \`User\` type |
|
|
352
|
-
| \`@workspace/auth/client\` | \`authClient\`, \`signIn\`, \`signOut\`, \`signUp\`, \`useSession\` |
|
|
353
|
-
| \`@workspace/auth/middleware\` | \`authMiddleware\`, \`buildMiddleware()\`, \`middlewareConfig\` |
|
|
354
|
-
`);
|
|
355
|
-
},
|
|
356
|
-
};
|
|
357
|
-
//# sourceMappingURL=better-auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"better-auth.js","sourceRoot":"","sources":["../../../../src/setups/auth/systems/better-auth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,CAAC,MAAM,oBAAoB,GAA0B;IACzD,KAAK,EAAE,aAAa;IAEpB,YAAY,EAAE;QACZ,aAAa,EAAE,QAAQ;KACxB;IAED,eAAe,EAAE;QACf,cAAc,EAAE,SAAS;KAC1B;IAED,gBAAgB,EAAE;QAChB,KAAK,EAAQ,YAAY;QACzB,WAAW,EAAE,YAAY;KAC1B;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,KAAyB;QACtD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAE1C,6EAA6E;QAC7E,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EACjC;;;;;;;;;;CAUL,CACI,CAAC;QAEF,6EAA6E;QAC7E,oEAAoE;QACpE,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6FL,CACI,CAAC;QAEF,6EAA6E;QAC7E,8DAA8D;QAC9D,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDL,CACI,CAAC;QAEF,6EAA6E;QAC7E,6EAA6E;QAC7E,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmEL,CACI,CAAC;QAEF,4EAA4E;QAC5E,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,2BAA2B,CAAC,EAC9C;;;;;;;;;;;;;CAaL,CACI,CAAC;QAEF,4EAA4E;QAC5E,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EACjC;;;;;;;;;;;;;;;;;CAiBL,CACI,CAAC;QAEF,6EAA6E;QAC7E,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAC9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEL,CACI,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clerk.d.ts","sourceRoot":"","sources":["../../../../src/setups/auth/systems/clerk.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAsB,MAAM,aAAa,CAAC;AAE7E,eAAO,MAAM,eAAe,EAAE,qBA2R7B,CAAC"}
|
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
import path from "path";
|
|
2
|
-
import { writeFile, ensureDir } from "../../../files.js";
|
|
3
|
-
export const clerkScaffolder = {
|
|
4
|
-
label: "Clerk",
|
|
5
|
-
// Clerk v6 — all packages unified under @clerk/nextjs / @clerk/react etc.
|
|
6
|
-
dependencies: {
|
|
7
|
-
"@clerk/nextjs": "latest",
|
|
8
|
-
"@clerk/clerk-react": "latest",
|
|
9
|
-
"@clerk/remix": "latest",
|
|
10
|
-
"@clerk/clerk-expo": "latest",
|
|
11
|
-
},
|
|
12
|
-
devDependencies: {
|
|
13
|
-
"@types/react": "^19.0.0",
|
|
14
|
-
},
|
|
15
|
-
peerDependencies: {
|
|
16
|
-
react: "^18 || ^19",
|
|
17
|
-
"react-dom": "^18 || ^19",
|
|
18
|
-
},
|
|
19
|
-
async scaffold(pkgDir, _opts) {
|
|
20
|
-
await ensureDir(path.join(pkgDir, "src"));
|
|
21
|
-
// ── src/index.ts ──────────────────────────────────────────────────────────
|
|
22
|
-
await writeFile(path.join(pkgDir, "src/index.ts"), `/**
|
|
23
|
-
* @workspace/auth — Clerk latest setup.
|
|
24
|
-
*
|
|
25
|
-
* Prefer sub-path imports for tree-shaking:
|
|
26
|
-
* import { auth, currentUser } from "@workspace/auth/server"
|
|
27
|
-
* import { useAuth, UserButton } from "@workspace/auth/client"
|
|
28
|
-
* import { authMiddleware } from "@workspace/auth/middleware"
|
|
29
|
-
*/
|
|
30
|
-
export * from "./server.js";
|
|
31
|
-
export * from "./client.js";
|
|
32
|
-
`);
|
|
33
|
-
// ── src/server.ts ─────────────────────────────────────────────────────────
|
|
34
|
-
// Clerk v6: auth() is async, currentUser() is async, clerkClient is a factory
|
|
35
|
-
await writeFile(path.join(pkgDir, "src/server.ts"), `/**
|
|
36
|
-
* Clerk v6 — server-side helpers.
|
|
37
|
-
* Import in Next.js Server Components, Route Handlers, or Middleware.
|
|
38
|
-
*
|
|
39
|
-
* @example Next.js App Router
|
|
40
|
-
* import { auth, currentUser } from "@workspace/auth/server";
|
|
41
|
-
*
|
|
42
|
-
* export default async function Page() {
|
|
43
|
-
* const { userId } = await auth();
|
|
44
|
-
* const user = await currentUser();
|
|
45
|
-
* }
|
|
46
|
-
*
|
|
47
|
-
* @example Route Handler / Remix loader
|
|
48
|
-
* import { getAuth } from "@workspace/auth/server";
|
|
49
|
-
* const { userId } = getAuth(req); // Express / Remix: sync helper
|
|
50
|
-
*/
|
|
51
|
-
|
|
52
|
-
// auth() — returns Promise<{ userId, sessionId, sessionClaims, ... }>
|
|
53
|
-
export { auth } from "@clerk/nextjs/server";
|
|
54
|
-
|
|
55
|
-
// currentUser() — returns full User object or null
|
|
56
|
-
export { currentUser } from "@clerk/nextjs/server";
|
|
57
|
-
|
|
58
|
-
// clerkClient() — factory function (Clerk v6 changed from singleton to factory)
|
|
59
|
-
export { clerkClient } from "@clerk/nextjs/server";
|
|
60
|
-
|
|
61
|
-
// getAuth() — for Express/Remix/Node environments (sync, takes Request)
|
|
62
|
-
export { getAuth } from "@clerk/nextjs/server";
|
|
63
|
-
|
|
64
|
-
// Type helpers
|
|
65
|
-
export type {
|
|
66
|
-
User,
|
|
67
|
-
Organization,
|
|
68
|
-
Session,
|
|
69
|
-
} from "@clerk/nextjs/server";
|
|
70
|
-
`);
|
|
71
|
-
// ── src/client.ts ─────────────────────────────────────────────────────────
|
|
72
|
-
await writeFile(path.join(pkgDir, "src/client.ts"), `/**
|
|
73
|
-
* Clerk v6 — client-side hooks and pre-built components.
|
|
74
|
-
* Use in React Client Components, Vite SPAs, or Expo apps.
|
|
75
|
-
*
|
|
76
|
-
* @example
|
|
77
|
-
* import { useAuth, useUser, UserButton } from "@workspace/auth/client";
|
|
78
|
-
*
|
|
79
|
-
* function Header() {
|
|
80
|
-
* const { isSignedIn } = useAuth();
|
|
81
|
-
* return isSignedIn ? <UserButton /> : <SignInButton />;
|
|
82
|
-
* }
|
|
83
|
-
*/
|
|
84
|
-
"use client";
|
|
85
|
-
|
|
86
|
-
// Hooks
|
|
87
|
-
export {
|
|
88
|
-
useAuth,
|
|
89
|
-
useUser,
|
|
90
|
-
useClerk,
|
|
91
|
-
useSession,
|
|
92
|
-
useOrganization,
|
|
93
|
-
useOrganizationList,
|
|
94
|
-
useSignIn,
|
|
95
|
-
useSignUp,
|
|
96
|
-
} from "@clerk/nextjs";
|
|
97
|
-
|
|
98
|
-
// Pre-built UI components
|
|
99
|
-
export {
|
|
100
|
-
ClerkProvider,
|
|
101
|
-
SignIn,
|
|
102
|
-
SignUp,
|
|
103
|
-
SignInButton,
|
|
104
|
-
SignUpButton,
|
|
105
|
-
SignOutButton,
|
|
106
|
-
UserButton,
|
|
107
|
-
UserProfile,
|
|
108
|
-
OrganizationProfile,
|
|
109
|
-
OrganizationSwitcher,
|
|
110
|
-
CreateOrganization,
|
|
111
|
-
} from "@clerk/nextjs";
|
|
112
|
-
|
|
113
|
-
// Render helpers
|
|
114
|
-
export { SignedIn, SignedOut, Protect } from "@clerk/nextjs";
|
|
115
|
-
`);
|
|
116
|
-
// ── src/middleware.ts ─────────────────────────────────────────────────────
|
|
117
|
-
// Clerk v6: clerkMiddleware replaces authMiddleware (deprecated in v5, removed in v6)
|
|
118
|
-
await writeFile(path.join(pkgDir, "src/middleware.ts"), `/**
|
|
119
|
-
* Clerk v6 middleware for Next.js.
|
|
120
|
-
*
|
|
121
|
-
* Clerk v6 uses clerkMiddleware() — authMiddleware() was removed.
|
|
122
|
-
*
|
|
123
|
-
* Quick start — copy into apps/<your-app>/middleware.ts:
|
|
124
|
-
*
|
|
125
|
-
* export { authMiddleware as default, middlewareConfig as config }
|
|
126
|
-
* from "@workspace/auth/middleware";
|
|
127
|
-
*
|
|
128
|
-
* Custom public routes:
|
|
129
|
-
*
|
|
130
|
-
* import { buildMiddleware } from "@workspace/auth/middleware";
|
|
131
|
-
* export default buildMiddleware(["/", "/about(.*)", "/marketing(.*)"]);
|
|
132
|
-
* export { middlewareConfig as config } from "@workspace/auth/middleware";
|
|
133
|
-
*/
|
|
134
|
-
import {
|
|
135
|
-
clerkMiddleware,
|
|
136
|
-
createRouteMatcher,
|
|
137
|
-
type ClerkMiddlewareOptions,
|
|
138
|
-
} from "@clerk/nextjs/server";
|
|
139
|
-
|
|
140
|
-
export const middlewareConfig = {
|
|
141
|
-
matcher: [
|
|
142
|
-
// Skip Next.js internals and all static files
|
|
143
|
-
"/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)",
|
|
144
|
-
// Always run for API routes
|
|
145
|
-
"/(api|trpc)(.*)",
|
|
146
|
-
],
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
const defaultPublicPaths = [
|
|
150
|
-
"/",
|
|
151
|
-
"/sign-in(.*)",
|
|
152
|
-
"/sign-up(.*)",
|
|
153
|
-
"/api/webhooks(.*)",
|
|
154
|
-
];
|
|
155
|
-
|
|
156
|
-
/** Default middleware — protects all routes except the ones above */
|
|
157
|
-
export const authMiddleware = clerkMiddleware(
|
|
158
|
-
async (auth, request) => {
|
|
159
|
-
const isPublic = createRouteMatcher(defaultPublicPaths);
|
|
160
|
-
if (!isPublic(request)) await auth.protect();
|
|
161
|
-
},
|
|
162
|
-
);
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Build a middleware with custom public paths.
|
|
166
|
-
*
|
|
167
|
-
* @param publicPaths - Array of path patterns (supports wildcards with (.*))
|
|
168
|
-
* @param options - Extra Clerk middleware options (e.g. debug: true)
|
|
169
|
-
*
|
|
170
|
-
* @example
|
|
171
|
-
* export default buildMiddleware(["/", "/marketing(.*)", "/blog(.*)"]);
|
|
172
|
-
*/
|
|
173
|
-
export function buildMiddleware(
|
|
174
|
-
publicPaths: string[],
|
|
175
|
-
options?: ClerkMiddlewareOptions,
|
|
176
|
-
) {
|
|
177
|
-
const isPublic = createRouteMatcher(publicPaths);
|
|
178
|
-
return clerkMiddleware(async (auth, request) => {
|
|
179
|
-
if (!isPublic(request)) await auth.protect();
|
|
180
|
-
}, options);
|
|
181
|
-
}
|
|
182
|
-
`);
|
|
183
|
-
// ── .env.example ─────────────────────────────────────────────────────────
|
|
184
|
-
await writeFile(path.join(pkgDir, ".env.example"), `# ─── Clerk v6 ────────────────────────────────────────────────────────────────
|
|
185
|
-
# Get these from: https://dashboard.clerk.com → your app → API Keys
|
|
186
|
-
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_REPLACE_ME
|
|
187
|
-
CLERK_SECRET_KEY=sk_test_REPLACE_ME
|
|
188
|
-
|
|
189
|
-
# Redirect URLs (optional — Clerk uses these if set)
|
|
190
|
-
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
|
|
191
|
-
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
|
|
192
|
-
NEXT_PUBLIC_CLERK_SIGN_IN_FALLBACK_REDIRECT_URL=/dashboard
|
|
193
|
-
NEXT_PUBLIC_CLERK_SIGN_UP_FALLBACK_REDIRECT_URL=/dashboard
|
|
194
|
-
`);
|
|
195
|
-
// ── README.md ─────────────────────────────────────────────────────────────
|
|
196
|
-
await writeFile(path.join(pkgDir, "README.md"), `# @workspace/auth — Clerk v6
|
|
197
|
-
|
|
198
|
-
Shared authentication package powered by [Clerk](https://clerk.com) v6.
|
|
199
|
-
|
|
200
|
-
> **Clerk v6 notes:** \`authMiddleware\` was removed — use \`clerkMiddleware\` (exported here as \`authMiddleware\` for compatibility). \`clerkClient\` is now a factory function, not a singleton.
|
|
201
|
-
|
|
202
|
-
## Setup
|
|
203
|
-
|
|
204
|
-
### 1. Copy env vars to your app
|
|
205
|
-
\`\`\`bash
|
|
206
|
-
cp packages/auth/.env.example apps/<your-app>/.env.local
|
|
207
|
-
# Fill in keys from https://dashboard.clerk.com
|
|
208
|
-
\`\`\`
|
|
209
|
-
|
|
210
|
-
### 2. Add the dependency
|
|
211
|
-
\`\`\`json
|
|
212
|
-
{ "dependencies": { "@workspace/auth": "workspace:*" } }
|
|
213
|
-
\`\`\`
|
|
214
|
-
|
|
215
|
-
### 3. Wrap your root layout
|
|
216
|
-
\`\`\`tsx
|
|
217
|
-
// apps/<your-app>/src/app/layout.tsx
|
|
218
|
-
import { ClerkProvider } from "@workspace/auth/client";
|
|
219
|
-
|
|
220
|
-
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
221
|
-
return (
|
|
222
|
-
<ClerkProvider>
|
|
223
|
-
<html><body>{children}</body></html>
|
|
224
|
-
</ClerkProvider>
|
|
225
|
-
);
|
|
226
|
-
}
|
|
227
|
-
\`\`\`
|
|
228
|
-
|
|
229
|
-
### 4. Add the middleware
|
|
230
|
-
\`\`\`ts
|
|
231
|
-
// apps/<your-app>/middleware.ts
|
|
232
|
-
export { authMiddleware as default, middlewareConfig as config }
|
|
233
|
-
from "@workspace/auth/middleware";
|
|
234
|
-
\`\`\`
|
|
235
|
-
|
|
236
|
-
### 5. Use in your pages
|
|
237
|
-
\`\`\`tsx
|
|
238
|
-
// Server component
|
|
239
|
-
import { auth, currentUser } from "@workspace/auth/server";
|
|
240
|
-
const { userId } = await auth();
|
|
241
|
-
const user = await currentUser();
|
|
242
|
-
|
|
243
|
-
// Client component
|
|
244
|
-
"use client";
|
|
245
|
-
import { useAuth, UserButton, SignedIn, SignedOut } from "@workspace/auth/client";
|
|
246
|
-
const { isSignedIn } = useAuth();
|
|
247
|
-
\`\`\`
|
|
248
|
-
|
|
249
|
-
## API
|
|
250
|
-
|
|
251
|
-
| Sub-path | Key exports |
|
|
252
|
-
|---|---|
|
|
253
|
-
| \`@workspace/auth/server\` | \`auth()\`, \`currentUser()\`, \`clerkClient()\`, \`getAuth()\` |
|
|
254
|
-
| \`@workspace/auth/client\` | \`useAuth\`, \`useUser\`, \`ClerkProvider\`, \`UserButton\`, \`SignedIn\`, \`SignedOut\` |
|
|
255
|
-
| \`@workspace/auth/middleware\` | \`authMiddleware\`, \`buildMiddleware()\`, \`middlewareConfig\` |
|
|
256
|
-
`);
|
|
257
|
-
},
|
|
258
|
-
};
|
|
259
|
-
//# sourceMappingURL=clerk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clerk.js","sourceRoot":"","sources":["../../../../src/setups/auth/systems/clerk.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGzD,MAAM,CAAC,MAAM,eAAe,GAA0B;IACpD,KAAK,EAAE,OAAO;IAEd,0EAA0E;IAC1E,YAAY,EAAE;QACZ,eAAe,EAAO,QAAQ;QAC9B,oBAAoB,EAAE,QAAQ;QAC9B,cAAc,EAAQ,QAAQ;QAC9B,mBAAmB,EAAG,QAAQ;KAC/B;IAED,eAAe,EAAE;QACf,cAAc,EAAE,SAAS;KAC1B;IAED,gBAAgB,EAAE;QAChB,KAAK,EAAQ,YAAY;QACzB,WAAW,EAAE,YAAY;KAC1B;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,KAAyB;QACtD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAE1C,6EAA6E;QAC7E,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EACjC;;;;;;;;;;CAUL,CACI,CAAC;QAEF,6EAA6E;QAC7E,8EAA8E;QAC9E,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCL,CACI,CAAC;QAEF,6EAA6E;QAC7E,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CL,CACI,CAAC;QAEF,6EAA6E;QAC7E,sFAAsF;QACtF,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEL,CACI,CAAC;QAEF,4EAA4E;QAC5E,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EACjC;;;;;;;;;;CAUL,CACI,CAAC;QAEF,6EAA6E;QAC7E,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAC9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DL,CACI,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workos.d.ts","sourceRoot":"","sources":["../../../../src/setups/auth/systems/workos.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAsB,MAAM,aAAa,CAAC;AAE7E,eAAO,MAAM,gBAAgB,EAAE,qBAyS9B,CAAC"}
|