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.
Files changed (93) hide show
  1. package/dist/index.js +42127 -93
  2. package/package.json +3 -2
  3. package/dist/commands/add-app.d.ts +0 -10
  4. package/dist/commands/add-app.d.ts.map +0 -1
  5. package/dist/commands/add-app.js +0 -392
  6. package/dist/commands/add-app.js.map +0 -1
  7. package/dist/commands/add-auth.d.ts +0 -8
  8. package/dist/commands/add-auth.d.ts.map +0 -1
  9. package/dist/commands/add-auth.js +0 -182
  10. package/dist/commands/add-auth.js.map +0 -1
  11. package/dist/commands/add-component.d.ts +0 -2
  12. package/dist/commands/add-component.d.ts.map +0 -1
  13. package/dist/commands/add-component.js +0 -116
  14. package/dist/commands/add-component.js.map +0 -1
  15. package/dist/commands/add-lib.d.ts +0 -9
  16. package/dist/commands/add-lib.d.ts.map +0 -1
  17. package/dist/commands/add-lib.js +0 -190
  18. package/dist/commands/add-lib.js.map +0 -1
  19. package/dist/commands/add-storybook.d.ts +0 -6
  20. package/dist/commands/add-storybook.d.ts.map +0 -1
  21. package/dist/commands/add-storybook.js +0 -181
  22. package/dist/commands/add-storybook.js.map +0 -1
  23. package/dist/commands/doctor.d.ts +0 -2
  24. package/dist/commands/doctor.d.ts.map +0 -1
  25. package/dist/commands/doctor.js +0 -235
  26. package/dist/commands/doctor.js.map +0 -1
  27. package/dist/commands/init.d.ts +0 -9
  28. package/dist/commands/init.d.ts.map +0 -1
  29. package/dist/commands/init.js +0 -527
  30. package/dist/commands/init.js.map +0 -1
  31. package/dist/commands/list.d.ts +0 -2
  32. package/dist/commands/list.d.ts.map +0 -1
  33. package/dist/commands/list.js +0 -130
  34. package/dist/commands/list.js.map +0 -1
  35. package/dist/commands/publish.d.ts +0 -8
  36. package/dist/commands/publish.d.ts.map +0 -1
  37. package/dist/commands/publish.js +0 -179
  38. package/dist/commands/publish.js.map +0 -1
  39. package/dist/commands/remove-component.d.ts +0 -5
  40. package/dist/commands/remove-component.d.ts.map +0 -1
  41. package/dist/commands/remove-component.js +0 -172
  42. package/dist/commands/remove-component.js.map +0 -1
  43. package/dist/commands/update.d.ts +0 -5
  44. package/dist/commands/update.d.ts.map +0 -1
  45. package/dist/commands/update.js +0 -126
  46. package/dist/commands/update.js.map +0 -1
  47. package/dist/config.d.ts +0 -14
  48. package/dist/config.d.ts.map +0 -1
  49. package/dist/config.js +0 -35
  50. package/dist/config.js.map +0 -1
  51. package/dist/exec.d.ts +0 -25
  52. package/dist/exec.d.ts.map +0 -1
  53. package/dist/exec.js +0 -80
  54. package/dist/exec.js.map +0 -1
  55. package/dist/files.d.ts +0 -7
  56. package/dist/files.d.ts.map +0 -1
  57. package/dist/files.js +0 -23
  58. package/dist/files.js.map +0 -1
  59. package/dist/index.d.ts +0 -3
  60. package/dist/index.d.ts.map +0 -1
  61. package/dist/index.js.map +0 -1
  62. package/dist/resolve-root.d.ts +0 -22
  63. package/dist/resolve-root.d.ts.map +0 -1
  64. package/dist/resolve-root.js +0 -65
  65. package/dist/resolve-root.js.map +0 -1
  66. package/dist/setups/auth/base.d.ts +0 -11
  67. package/dist/setups/auth/base.d.ts.map +0 -1
  68. package/dist/setups/auth/base.js +0 -91
  69. package/dist/setups/auth/base.js.map +0 -1
  70. package/dist/setups/auth/index.d.ts +0 -6
  71. package/dist/setups/auth/index.d.ts.map +0 -1
  72. package/dist/setups/auth/index.js +0 -5
  73. package/dist/setups/auth/index.js.map +0 -1
  74. package/dist/setups/auth/systems/better-auth.d.ts +0 -3
  75. package/dist/setups/auth/systems/better-auth.d.ts.map +0 -1
  76. package/dist/setups/auth/systems/better-auth.js +0 -357
  77. package/dist/setups/auth/systems/better-auth.js.map +0 -1
  78. package/dist/setups/auth/systems/clerk.d.ts +0 -3
  79. package/dist/setups/auth/systems/clerk.d.ts.map +0 -1
  80. package/dist/setups/auth/systems/clerk.js +0 -259
  81. package/dist/setups/auth/systems/clerk.js.map +0 -1
  82. package/dist/setups/auth/systems/workos.d.ts +0 -3
  83. package/dist/setups/auth/systems/workos.d.ts.map +0 -1
  84. package/dist/setups/auth/systems/workos.js +0 -273
  85. package/dist/setups/auth/systems/workos.js.map +0 -1
  86. package/dist/setups/auth/types.d.ts +0 -39
  87. package/dist/setups/auth/types.d.ts.map +0 -1
  88. package/dist/setups/auth/types.js +0 -2
  89. package/dist/setups/auth/types.js.map +0 -1
  90. package/dist/ui.d.ts +0 -44
  91. package/dist/ui.d.ts.map +0 -1
  92. package/dist/ui.js +0 -149
  93. 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,3 +0,0 @@
1
- import type { AuthPackageScaffolder } from "../types.js";
2
- export declare const clerkScaffolder: AuthPackageScaffolder;
3
- //# sourceMappingURL=clerk.d.ts.map
@@ -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,3 +0,0 @@
1
- import type { AuthPackageScaffolder } from "../types.js";
2
- export declare const workosScaffolder: AuthPackageScaffolder;
3
- //# sourceMappingURL=workos.d.ts.map
@@ -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"}