better-auth-studio 1.0.79-beta.2 → 1.0.79-beta.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/README.md CHANGED
@@ -278,6 +278,92 @@ pnpx better-auth-studio --version
278
278
  # Show help
279
279
  pnpx better-auth-studio --help
280
280
  ```
281
+
282
+ ## 🏠 Self-Hosting (Beta)
283
+
284
+ > ⚠️ **Beta Feature**: Self-hosting is currently in beta. Please report any issues on GitHub.
285
+
286
+ Deploy Better Auth Studio alongside your application for production use.
287
+
288
+ ### Setup
289
+
290
+ **Step 1: Initialize configuration**
291
+ ```bash
292
+ pnpx better-auth-studio init
293
+ ```
294
+
295
+ This creates a `studio.config.ts` file:
296
+ ```typescript
297
+ import type { StudioConfig } from "better-auth-studio";
298
+ import { auth } from "./lib/auth";
299
+
300
+ const config: StudioConfig = {
301
+ auth,
302
+ basePath: "/api/studio",
303
+ metadata: {
304
+ title: "Admin Dashboard",
305
+ theme: "dark",
306
+ },
307
+ access: {
308
+ roles: ["admin"],
309
+ allowEmails: ["admin@example.com"],
310
+ },
311
+ };
312
+
313
+ export default config;
314
+ ```
315
+
316
+ ### Next.js (App Router)
317
+
318
+ The init command automatically creates `app/api/studio/[[...path]]/route.ts`:
319
+ ```typescript
320
+ import { createStudioHandler } from "better-auth-studio/nextjs";
321
+ import studioConfig from "@/studio.config";
322
+
323
+ const handler = createStudioHandler(studioConfig);
324
+
325
+ export {
326
+ handler as GET,
327
+ handler as POST,
328
+ handler as PUT,
329
+ handler as DELETE,
330
+ handler as PATCH,
331
+ };
332
+ ```
333
+
334
+ Access at `http://localhost:3000/api/studio`
335
+
336
+ ### Express
337
+
338
+ Add the studio handler to your server:
339
+ ```typescript
340
+ import express from "express";
341
+ import { toNodeHandler } from "better-auth/node";
342
+ import { betterAuthStudio } from "better-auth-studio/express";
343
+ import { auth } from "./auth";
344
+ import studioConfig from "./studio.config";
345
+
346
+ const app = express();
347
+
348
+ app.use(express.json());
349
+ app.use("/api/studio", betterAuthStudio(studioConfig));
350
+ app.all("/api/auth/*", toNodeHandler(auth));
351
+
352
+ app.listen(3000);
353
+ ```
354
+
355
+ Access at `http://localhost:3000/api/studio`
356
+
357
+ ### Configuration Options
358
+
359
+ | Option | Required | Description |
360
+ |--------|----------|-------------|
361
+ | `auth` | Yes | Your Better Auth instance |
362
+ | `basePath` | Yes | URL path where studio is mounted |
363
+ | `access.allowEmails` | No | Array of admin email addresses |
364
+ | `access.roles` | No | Array of allowed user roles |
365
+ | `metadata` | No | Custom branding (title, theme) |
366
+
281
367
  ## 📝 Development
282
368
 
283
369
  ### Running from Source
@@ -1,16 +1,3 @@
1
1
  import type { StudioConfig } from '../types/handler.js';
2
- type NextRequest = {
3
- method: string;
4
- headers: Headers;
5
- nextUrl: {
6
- pathname: string;
7
- search: string;
8
- };
9
- json: () => Promise<any>;
10
- };
11
- /**
12
- * Next.js adapter for Better Auth Studio (App Router)
13
- */
14
- export declare function createStudioHandler(config: StudioConfig): (request: NextRequest) => Promise<Response>;
15
- export {};
2
+ export declare function createStudioHandler(config: StudioConfig): (request: Request) => Promise<Response>;
16
3
  //# sourceMappingURL=nextjs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/adapters/nextjs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAuC,MAAM,qBAAqB,CAAC;AAE7F,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,IAAI,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,IACxC,SAAS,WAAW,KAAG,OAAO,CAAC,QAAQ,CAAC,CAevD"}
1
+ {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/adapters/nextjs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAuC,MAAM,qBAAqB,CAAC;AAW7F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,IACxC,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CAanD"}
@@ -1,13 +1,18 @@
1
1
  import { handleStudioRequest } from '../core/handler.js';
2
- /**
3
- * Next.js adapter for Better Auth Studio (App Router)
4
- */
2
+ function getUrlFromRequest(req) {
3
+ const nextUrl = req.nextUrl;
4
+ if (nextUrl && typeof nextUrl.pathname === 'string') {
5
+ return nextUrl.pathname + (nextUrl.search || '');
6
+ }
7
+ const url = new URL(req.url);
8
+ return url.pathname + url.search;
9
+ }
5
10
  export function createStudioHandler(config) {
6
11
  return async (request) => {
7
12
  try {
8
- const universalRequest = await nextToUniversal(request);
13
+ const universalRequest = await requestToUniversal(request);
9
14
  const universalResponse = await handleStudioRequest(universalRequest, config);
10
- return universalToNext(universalResponse);
15
+ return universalToResponse(universalResponse);
11
16
  }
12
17
  catch (error) {
13
18
  console.error('Studio handler error:', error);
@@ -18,7 +23,7 @@ export function createStudioHandler(config) {
18
23
  }
19
24
  };
20
25
  }
21
- async function nextToUniversal(req) {
26
+ async function requestToUniversal(req) {
22
27
  let body;
23
28
  if (req.method !== 'GET' && req.method !== 'HEAD') {
24
29
  const contentType = req.headers.get('content-type') || '';
@@ -34,13 +39,13 @@ async function nextToUniversal(req) {
34
39
  headers[key] = value;
35
40
  });
36
41
  return {
37
- url: req.nextUrl.pathname + req.nextUrl.search,
42
+ url: getUrlFromRequest(req),
38
43
  method: req.method,
39
44
  headers,
40
45
  body,
41
46
  };
42
47
  }
43
- function universalToNext(res) {
48
+ function universalToResponse(res) {
44
49
  return new Response(res.body, {
45
50
  status: res.status,
46
51
  headers: res.headers,
@@ -1 +1 @@
1
- {"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../src/adapters/nextjs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAUzD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,OAAO,KAAK,EAAE,OAAoB,EAAqB,EAAE;QACvD,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;YAExD,MAAM,iBAAiB,GAAG,MAAM,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YAE9E,OAAO,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,EAAE;gBACtE,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAgB;IAC7C,IAAI,IAAS,CAAC;IACd,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE;QACjD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM;QAC9C,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO;QACP,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAsB;IAC7C,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE;QAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../src/adapters/nextjs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD,SAAS,iBAAiB,CAAC,GAAY;IACrC,MAAM,OAAO,GAAI,GAAW,CAAC,OAAO,CAAC;IACrC,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACpD,OAAO,OAAO,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,OAAO,KAAK,EAAE,OAAgB,EAAqB,EAAE;QACnD,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC3D,MAAM,iBAAiB,GAAG,MAAM,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YAC9E,OAAO,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,EAAE;gBACtE,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,GAAY;IAC5C,IAAI,IAAS,CAAC;IACd,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE;QACjD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,EAAE,iBAAiB,CAAC,GAAG,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO;QACP,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAsB;IACjD,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE;QAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;AACL,CAAC"}