better-auth-studio 1.0.79-beta.8 → 1.1.0

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 (72) hide show
  1. package/README.md +10 -0
  2. package/dist/adapters/astro.d.ts +22 -0
  3. package/dist/adapters/astro.d.ts.map +1 -0
  4. package/dist/adapters/astro.js +95 -0
  5. package/dist/adapters/astro.js.map +1 -0
  6. package/dist/adapters/elysia.d.ts +7 -0
  7. package/dist/adapters/elysia.d.ts.map +1 -0
  8. package/dist/adapters/elysia.js +101 -0
  9. package/dist/adapters/elysia.js.map +1 -0
  10. package/dist/adapters/hono.d.ts +7 -0
  11. package/dist/adapters/hono.d.ts.map +1 -0
  12. package/dist/adapters/hono.js +78 -0
  13. package/dist/adapters/hono.js.map +1 -0
  14. package/dist/adapters/nextjs.d.ts +1 -1
  15. package/dist/adapters/nextjs.d.ts.map +1 -1
  16. package/dist/adapters/nextjs.js +1 -1
  17. package/dist/adapters/nextjs.js.map +1 -1
  18. package/dist/adapters/nuxt.d.ts +19 -0
  19. package/dist/adapters/nuxt.d.ts.map +1 -0
  20. package/dist/adapters/nuxt.js +99 -0
  21. package/dist/adapters/nuxt.js.map +1 -0
  22. package/dist/adapters/remix.d.ts +26 -0
  23. package/dist/adapters/remix.d.ts.map +1 -0
  24. package/dist/adapters/remix.js +98 -0
  25. package/dist/adapters/remix.js.map +1 -0
  26. package/dist/adapters/solid-start.d.ts +30 -0
  27. package/dist/adapters/solid-start.d.ts.map +1 -0
  28. package/dist/adapters/solid-start.js +96 -0
  29. package/dist/adapters/solid-start.js.map +1 -0
  30. package/dist/adapters/svelte-kit.d.ts +36 -0
  31. package/dist/adapters/svelte-kit.d.ts.map +1 -0
  32. package/dist/adapters/svelte-kit.js +108 -0
  33. package/dist/adapters/svelte-kit.js.map +1 -0
  34. package/dist/adapters/tanstack-start.d.ts +32 -0
  35. package/dist/adapters/tanstack-start.d.ts.map +1 -0
  36. package/dist/adapters/tanstack-start.js +102 -0
  37. package/dist/adapters/tanstack-start.js.map +1 -0
  38. package/dist/cli/commands/init.d.ts +3 -1
  39. package/dist/cli/commands/init.d.ts.map +1 -1
  40. package/dist/cli/commands/init.js +124 -9
  41. package/dist/cli/commands/init.js.map +1 -1
  42. package/dist/cli.js +3 -2
  43. package/dist/cli.js.map +1 -1
  44. package/dist/core/handler.d.ts.map +1 -1
  45. package/dist/core/handler.js +236 -61
  46. package/dist/core/handler.js.map +1 -1
  47. package/dist/data.d.ts +1 -1
  48. package/dist/data.d.ts.map +1 -1
  49. package/dist/data.js +3 -7
  50. package/dist/data.js.map +1 -1
  51. package/dist/public/assets/main-COYGEnAm.js +1150 -0
  52. package/dist/public/assets/main-s8HrXBxq.css +1 -0
  53. package/dist/public/index.html +2 -2
  54. package/dist/routes.d.ts.map +1 -1
  55. package/dist/routes.js +758 -150
  56. package/dist/routes.js.map +1 -1
  57. package/dist/studio.d.ts.map +1 -1
  58. package/dist/studio.js +15 -2
  59. package/dist/studio.js.map +1 -1
  60. package/dist/utils/html-injector.js +44 -1
  61. package/dist/utils/html-injector.js.map +1 -1
  62. package/package.json +14 -8
  63. package/public/assets/main-COYGEnAm.js +1150 -0
  64. package/public/assets/main-s8HrXBxq.css +1 -0
  65. package/public/index.html +2 -2
  66. package/scripts/postinstall.js +39 -12
  67. package/data/GeoLite2-City.mmdb +0 -0
  68. package/data/GeoLite2-City.tar.gz +0 -1
  69. package/dist/public/assets/main-3NIBCudD.js +0 -1155
  70. package/dist/public/assets/main-DbXDm13A.css +0 -1
  71. package/public/assets/main-3NIBCudD.js +0 -1155
  72. package/public/assets/main-DbXDm13A.css +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remix.js","sourceRoot":"","sources":["../../src/adapters/remix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { StudioConfig } from '../types/handler.js';
2
+ type ApiEvent = {
3
+ request: Request;
4
+ params: Record<string, string>;
5
+ locals: Record<string, unknown>;
6
+ env: Record<string, unknown>;
7
+ fetch: typeof fetch;
8
+ url: URL;
9
+ };
10
+ /**
11
+ * SolidStart adapter for Better Auth Studio
12
+ *
13
+ * Usage in a catch-all route handler:
14
+ * ```ts
15
+ * // src/routes/api/studio/[...path].ts
16
+ * import { betterAuthStudio } from 'better-auth-studio/solid-start';
17
+ * import studioConfig from '../../../../studio.config';
18
+ *
19
+ * const handler = betterAuthStudio(studioConfig);
20
+ *
21
+ * export const GET = handler;
22
+ * export const POST = handler;
23
+ * export const PUT = handler;
24
+ * export const DELETE = handler;
25
+ * export const PATCH = handler;
26
+ * ```
27
+ */
28
+ export declare function betterAuthStudio(config: StudioConfig): (event: ApiEvent) => Promise<Response>;
29
+ export {};
30
+ //# sourceMappingURL=solid-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-start.d.ts","sourceRoot":"","sources":["../../src/adapters/solid-start.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAuC,MAAM,qBAAqB,CAAC;AAE7F,KAAK,QAAQ,GAAG;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,GAAG,EAAE,GAAG,CAAC;CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,IACrC,OAAO,QAAQ,KAAG,OAAO,CAAC,QAAQ,CAAC,CAalD"}
@@ -0,0 +1,96 @@
1
+ import { handleStudioRequest } from '../core/handler.js';
2
+ /**
3
+ * SolidStart adapter for Better Auth Studio
4
+ *
5
+ * Usage in a catch-all route handler:
6
+ * ```ts
7
+ * // src/routes/api/studio/[...path].ts
8
+ * import { betterAuthStudio } from 'better-auth-studio/solid-start';
9
+ * import studioConfig from '../../../../studio.config';
10
+ *
11
+ * const handler = betterAuthStudio(studioConfig);
12
+ *
13
+ * export const GET = handler;
14
+ * export const POST = handler;
15
+ * export const PUT = handler;
16
+ * export const DELETE = handler;
17
+ * export const PATCH = handler;
18
+ * ```
19
+ */
20
+ export function betterAuthStudio(config) {
21
+ return async (event) => {
22
+ try {
23
+ const universalReq = await convertSolidStartToUniversal(event, config);
24
+ const universalRes = await handleStudioRequest(universalReq, config);
25
+ return universalToResponse(universalRes);
26
+ }
27
+ catch (error) {
28
+ console.error('Studio handler error:', error);
29
+ return new Response(JSON.stringify({ error: 'Internal server error' }), {
30
+ status: 500,
31
+ headers: { 'Content-Type': 'application/json' },
32
+ });
33
+ }
34
+ };
35
+ }
36
+ async function convertSolidStartToUniversal(event, config) {
37
+ const request = event.request;
38
+ let body;
39
+ const method = request.method;
40
+ if (method !== 'GET' && method !== 'HEAD') {
41
+ const contentType = request.headers.get('content-type') || '';
42
+ if (contentType.includes('application/json')) {
43
+ try {
44
+ body = await request.json();
45
+ }
46
+ catch { }
47
+ }
48
+ else if (contentType.includes('application/x-www-form-urlencoded') ||
49
+ contentType.includes('multipart/form-data')) {
50
+ try {
51
+ const formData = await request.formData();
52
+ body = Object.fromEntries(formData.entries());
53
+ }
54
+ catch { }
55
+ }
56
+ else {
57
+ try {
58
+ const text = await request.text();
59
+ if (text && text.trim()) {
60
+ try {
61
+ body = JSON.parse(text);
62
+ }
63
+ catch {
64
+ body = text;
65
+ }
66
+ }
67
+ }
68
+ catch { }
69
+ }
70
+ }
71
+ const headers = {};
72
+ request.headers.forEach((value, key) => {
73
+ headers[key] = value;
74
+ });
75
+ const basePath = config.basePath || '/api/studio';
76
+ const normalizedBasePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;
77
+ const url = new URL(request.url);
78
+ let path = url.pathname;
79
+ if (path.startsWith(normalizedBasePath)) {
80
+ path = path.slice(normalizedBasePath.length) || '/';
81
+ }
82
+ const pathWithQuery = path + url.search;
83
+ return {
84
+ url: pathWithQuery,
85
+ method: method,
86
+ headers,
87
+ body,
88
+ };
89
+ }
90
+ function universalToResponse(res) {
91
+ return new Response(res.body, {
92
+ status: res.status,
93
+ headers: res.headers,
94
+ });
95
+ }
96
+ //# sourceMappingURL=solid-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-start.js","sourceRoot":"","sources":["../../src/adapters/solid-start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { RequestEvent } from '@sveltejs/kit';
2
+ import type { StudioConfig } from '../types/handler.js';
3
+ /**
4
+ * SvelteKit adapter for Better Auth Studio
5
+ *
6
+ * Usage in a catch-all route handler:
7
+ * ```ts
8
+ * // src/routes/api/studio/[...path]/+server.ts
9
+ * import { betterAuthStudio } from 'better-auth-studio/svelte-kit';
10
+ * import studioConfig from '../../../../studio.config';
11
+ *
12
+ * const handler = betterAuthStudio(studioConfig);
13
+ *
14
+ * export async function GET(event) {
15
+ * return handler(event);
16
+ * }
17
+ *
18
+ * export async function POST(event) {
19
+ * return handler(event);
20
+ * }
21
+ *
22
+ * export async function PUT(event) {
23
+ * return handler(event);
24
+ * }
25
+ *
26
+ * export async function DELETE(event) {
27
+ * return handler(event);
28
+ * }
29
+ *
30
+ * export async function PATCH(event) {
31
+ * return handler(event);
32
+ * }
33
+ * ```
34
+ */
35
+ export declare function betterAuthStudio(config: StudioConfig): (event: RequestEvent) => Promise<Response>;
36
+ //# sourceMappingURL=svelte-kit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte-kit.d.ts","sourceRoot":"","sources":["../../src/adapters/svelte-kit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAuC,MAAM,qBAAqB,CAAC;AAE7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,IACrC,OAAO,YAAY,KAAG,OAAO,CAAC,QAAQ,CAAC,CAatD"}
@@ -0,0 +1,108 @@
1
+ import { handleStudioRequest } from '../core/handler.js';
2
+ /**
3
+ * SvelteKit adapter for Better Auth Studio
4
+ *
5
+ * Usage in a catch-all route handler:
6
+ * ```ts
7
+ * // src/routes/api/studio/[...path]/+server.ts
8
+ * import { betterAuthStudio } from 'better-auth-studio/svelte-kit';
9
+ * import studioConfig from '../../../../studio.config';
10
+ *
11
+ * const handler = betterAuthStudio(studioConfig);
12
+ *
13
+ * export async function GET(event) {
14
+ * return handler(event);
15
+ * }
16
+ *
17
+ * export async function POST(event) {
18
+ * return handler(event);
19
+ * }
20
+ *
21
+ * export async function PUT(event) {
22
+ * return handler(event);
23
+ * }
24
+ *
25
+ * export async function DELETE(event) {
26
+ * return handler(event);
27
+ * }
28
+ *
29
+ * export async function PATCH(event) {
30
+ * return handler(event);
31
+ * }
32
+ * ```
33
+ */
34
+ export function betterAuthStudio(config) {
35
+ return async (event) => {
36
+ try {
37
+ const universalReq = await convertSvelteKitToUniversal(event, config);
38
+ const universalRes = await handleStudioRequest(universalReq, config);
39
+ return universalToResponse(universalRes);
40
+ }
41
+ catch (error) {
42
+ console.error('Studio handler error:', error);
43
+ return new Response(JSON.stringify({ error: 'Internal server error' }), {
44
+ status: 500,
45
+ headers: { 'Content-Type': 'application/json' },
46
+ });
47
+ }
48
+ };
49
+ }
50
+ async function convertSvelteKitToUniversal(event, config) {
51
+ let body;
52
+ const method = event.request.method;
53
+ if (method !== 'GET' && method !== 'HEAD') {
54
+ const contentType = event.request.headers.get('content-type') || '';
55
+ if (contentType.includes('application/json')) {
56
+ try {
57
+ body = await event.request.json();
58
+ }
59
+ catch { }
60
+ }
61
+ else if (contentType.includes('application/x-www-form-urlencoded') ||
62
+ contentType.includes('multipart/form-data')) {
63
+ try {
64
+ const formData = await event.request.formData();
65
+ body = Object.fromEntries(formData.entries());
66
+ }
67
+ catch { }
68
+ }
69
+ else {
70
+ try {
71
+ const text = await event.request.text();
72
+ if (text && text.trim()) {
73
+ try {
74
+ body = JSON.parse(text);
75
+ }
76
+ catch {
77
+ body = text;
78
+ }
79
+ }
80
+ }
81
+ catch { }
82
+ }
83
+ }
84
+ const headers = {};
85
+ event.request.headers.forEach((value, key) => {
86
+ headers[key] = value;
87
+ });
88
+ const basePath = config.basePath || '/api/studio';
89
+ const normalizedBasePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;
90
+ let path = event.url.pathname;
91
+ if (path.startsWith(normalizedBasePath)) {
92
+ path = path.slice(normalizedBasePath.length) || '/';
93
+ }
94
+ const pathWithQuery = path + event.url.search;
95
+ return {
96
+ url: pathWithQuery,
97
+ method: method,
98
+ headers,
99
+ body,
100
+ };
101
+ }
102
+ function universalToResponse(res) {
103
+ return new Response(res.body, {
104
+ status: res.status,
105
+ headers: res.headers,
106
+ });
107
+ }
108
+ //# sourceMappingURL=svelte-kit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte-kit.js","sourceRoot":"","sources":["../../src/adapters/svelte-kit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { StudioConfig } from '../types/handler.js';
2
+ type TanStackStartHandlerContext = {
3
+ request: Request;
4
+ };
5
+ /**
6
+ * TanStack Start adapter for Better Auth Studio
7
+ *
8
+ * Usage in a server route:
9
+ * ```ts
10
+ * // src/routes/api/studio/$.ts
11
+ * import { createFileRoute } from '@tanstack/react-router';
12
+ * import { betterAuthStudio } from 'better-auth-studio/tanstack-start';
13
+ * import studioConfig from '../../../../studio.config';
14
+ *
15
+ * const handler = betterAuthStudio(studioConfig);
16
+ *
17
+ * export const Route = createFileRoute('/api/studio/$')({
18
+ * server: {
19
+ * handlers: {
20
+ * GET: handler,
21
+ * POST: handler,
22
+ * PUT: handler,
23
+ * DELETE: handler,
24
+ * PATCH: handler,
25
+ * },
26
+ * },
27
+ * });
28
+ * ```
29
+ */
30
+ export declare function betterAuthStudio(config: StudioConfig): ({ request }: TanStackStartHandlerContext) => Promise<Response>;
31
+ export {};
32
+ //# sourceMappingURL=tanstack-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tanstack-start.d.ts","sourceRoot":"","sources":["../../src/adapters/tanstack-start.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAuC,MAAM,qBAAqB,CAAC;AAG7F,KAAK,2BAA2B,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,IACrC,aAAa,2BAA2B,KAAG,OAAO,CAAC,QAAQ,CAAC,CAa3E"}
@@ -0,0 +1,102 @@
1
+ import { handleStudioRequest } from '../core/handler.js';
2
+ /**
3
+ * TanStack Start adapter for Better Auth Studio
4
+ *
5
+ * Usage in a server route:
6
+ * ```ts
7
+ * // src/routes/api/studio/$.ts
8
+ * import { createFileRoute } from '@tanstack/react-router';
9
+ * import { betterAuthStudio } from 'better-auth-studio/tanstack-start';
10
+ * import studioConfig from '../../../../studio.config';
11
+ *
12
+ * const handler = betterAuthStudio(studioConfig);
13
+ *
14
+ * export const Route = createFileRoute('/api/studio/$')({
15
+ * server: {
16
+ * handlers: {
17
+ * GET: handler,
18
+ * POST: handler,
19
+ * PUT: handler,
20
+ * DELETE: handler,
21
+ * PATCH: handler,
22
+ * },
23
+ * },
24
+ * });
25
+ * ```
26
+ */
27
+ export function betterAuthStudio(config) {
28
+ return async ({ request }) => {
29
+ try {
30
+ const universalReq = await convertTanStackStartToUniversal(request, config);
31
+ const universalRes = await handleStudioRequest(universalReq, config);
32
+ return universalToResponse(universalRes);
33
+ }
34
+ catch (error) {
35
+ console.error('Studio handler error:', error);
36
+ return new Response(JSON.stringify({ error: 'Internal server error' }), {
37
+ status: 500,
38
+ headers: { 'Content-Type': 'application/json' },
39
+ });
40
+ }
41
+ };
42
+ }
43
+ async function convertTanStackStartToUniversal(request, config) {
44
+ let body;
45
+ const method = request.method;
46
+ if (method !== 'GET' && method !== 'HEAD') {
47
+ const contentType = request.headers.get('content-type') || '';
48
+ if (contentType.includes('application/json')) {
49
+ try {
50
+ body = await request.json();
51
+ }
52
+ catch { }
53
+ }
54
+ else if (contentType.includes('application/x-www-form-urlencoded') ||
55
+ contentType.includes('multipart/form-data')) {
56
+ try {
57
+ const formData = await request.formData();
58
+ body = Object.fromEntries(formData.entries());
59
+ }
60
+ catch { }
61
+ }
62
+ else {
63
+ try {
64
+ const text = await request.text();
65
+ if (text && text.trim()) {
66
+ try {
67
+ body = JSON.parse(text);
68
+ }
69
+ catch {
70
+ body = text;
71
+ }
72
+ }
73
+ }
74
+ catch { }
75
+ }
76
+ }
77
+ const headers = {};
78
+ request.headers.forEach((value, key) => {
79
+ headers[key] = value;
80
+ });
81
+ const basePath = config.basePath || '/api/studio';
82
+ const normalizedBasePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;
83
+ const url = new URL(request.url);
84
+ let path = url.pathname;
85
+ if (path.startsWith(normalizedBasePath)) {
86
+ path = path.slice(normalizedBasePath.length) || '/';
87
+ }
88
+ const pathWithQuery = path + url.search;
89
+ return {
90
+ url: pathWithQuery,
91
+ method: method,
92
+ headers,
93
+ body,
94
+ };
95
+ }
96
+ function universalToResponse(res) {
97
+ return new Response(res.body, {
98
+ status: res.status,
99
+ headers: res.headers,
100
+ });
101
+ }
102
+ //# sourceMappingURL=tanstack-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tanstack-start.js","sourceRoot":"","sources":["../../src/adapters/tanstack-start.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
- export declare function initCommand(): Promise<void>;
1
+ export declare function initCommand(options?: {
2
+ apiDir?: string;
3
+ }): Promise<void>;
2
4
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,kBAgBhC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,iBAkB9D"}
@@ -1,6 +1,6 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
- export async function initCommand() {
3
+ export async function initCommand(options) {
4
4
  console.log('🚀 Initializing Better Auth Studio...\n');
5
5
  const framework = detectFramework();
6
6
  console.log('🔍 Detected framework:', framework);
@@ -8,7 +8,10 @@ export async function initCommand() {
8
8
  console.log('✅ Created config:', configPath);
9
9
  const basePath = '/api/studio';
10
10
  if (framework === 'nextjs') {
11
- await setupNextJS(basePath);
11
+ await setupNextJS(basePath, options?.apiDir);
12
+ }
13
+ else if (framework === 'sveltekit') {
14
+ await setupSvelteKit(basePath);
12
15
  }
13
16
  else {
14
17
  showManualInstructions(framework, basePath);
@@ -20,7 +23,13 @@ async function createStudioConfig(framework) {
20
23
  console.log('⚠️ studio.config.ts already exists, skipping...');
21
24
  return configPath;
22
25
  }
23
- const authImportPath = framework === 'nextjs' ? '@/lib/auth' : './src/auth';
26
+ let authImportPath = './src/auth';
27
+ if (framework === 'nextjs') {
28
+ authImportPath = '@/lib/auth';
29
+ }
30
+ else if (framework === 'sveltekit') {
31
+ authImportPath = '$lib/auth';
32
+ }
24
33
  const configContent = `import type { StudioConfig } from 'better-auth-studio';
25
34
  import { auth } from '${authImportPath}';
26
35
 
@@ -38,9 +47,27 @@ export default config;
38
47
  writeFileSync(configPath, configContent, 'utf-8');
39
48
  return configPath;
40
49
  }
41
- async function setupNextJS(basePath) {
50
+ function detectNextJSAppDir() {
51
+ if (existsSync(join(process.cwd(), 'src', 'app'))) {
52
+ return 'src/app';
53
+ }
54
+ if (existsSync(join(process.cwd(), 'app'))) {
55
+ return 'app';
56
+ }
57
+ return 'app';
58
+ }
59
+ async function setupNextJS(basePath, customApiDir) {
42
60
  const segments = basePath.split('/').filter(Boolean);
43
- const routeDir = join(process.cwd(), 'app', ...segments, '[[...path]]');
61
+ let appDir;
62
+ if (customApiDir) {
63
+ appDir = customApiDir;
64
+ console.log(`📂 Using custom API directory: ${appDir}`);
65
+ }
66
+ else {
67
+ appDir = detectNextJSAppDir();
68
+ console.log(`📂 Auto-detected app directory: ${appDir}`);
69
+ }
70
+ const routeDir = join(process.cwd(), appDir, ...segments, '[[...path]]');
44
71
  const routeFile = join(routeDir, 'route.ts');
45
72
  if (existsSync(routeFile)) {
46
73
  console.log('⚠️ Route file already exists:', routeFile);
@@ -51,14 +78,18 @@ async function setupNextJS(basePath) {
51
78
  writeFileSync(routeFile, code, 'utf-8');
52
79
  console.log('✅ Generated route file:', routeFile);
53
80
  }
81
+ const relativePath = `${appDir}${basePath}/[[...path]]/route.ts`;
54
82
  console.log(`
55
83
  ╔═══════════════════════════════════════════════════════════════╗
56
- ║ ✅ Next.js Setup Complete!
84
+ ║ ✅ Next.js Setup Complete!
57
85
  ╠═══════════════════════════════════════════════════════════════╣
58
86
  ║ ║
59
87
  ║ 📁 Files created: ║
60
88
  ║ • studio.config.ts ║
61
- ║ • app${basePath}/[[...path]]/route.ts
89
+ ║ • ${relativePath}
90
+ ║ ║
91
+ ║ ⚠️ Important: Ensure better-auth-studio is in dependencies ║
92
+ ║ (not devDependencies) for production deployments ║
62
93
  ║ ║
63
94
  ║ 🚀 Start your app: ║
64
95
  ║ pnpm dev ║
@@ -70,10 +101,10 @@ async function setupNextJS(basePath) {
70
101
  `);
71
102
  }
72
103
  function generateNextJSRoute() {
73
- return `import { createStudioHandler } from 'better-auth-studio/nextjs';
104
+ return `import { betterAuthStudio } from 'better-auth-studio/nextjs';
74
105
  import studioConfig from '@/studio.config';
75
106
 
76
- const handler = createStudioHandler(studioConfig);
107
+ const handler = betterAuthStudio(studioConfig);
77
108
 
78
109
  export {
79
110
  handler as GET,
@@ -84,6 +115,68 @@ export {
84
115
  };
85
116
  `;
86
117
  }
118
+ async function setupSvelteKit(basePath) {
119
+ const segments = basePath.split('/').filter(Boolean);
120
+ const routeDir = join(process.cwd(), 'src', 'routes', ...segments, '[...path]');
121
+ const routeFile = join(routeDir, '+server.ts');
122
+ if (existsSync(routeFile)) {
123
+ console.log('⚠️ Route file already exists:', routeFile);
124
+ }
125
+ else {
126
+ mkdirSync(routeDir, { recursive: true });
127
+ const code = generateSvelteKitRoute();
128
+ writeFileSync(routeFile, code, 'utf-8');
129
+ console.log('✅ Generated route file:', routeFile);
130
+ }
131
+ const relativePath = `src/routes${basePath}/[...path]/+server.ts`;
132
+ console.log(`
133
+ ╔═══════════════════════════════════════════════════════════════╗
134
+ ║ ✅ SvelteKit Setup Complete! ║
135
+ ╠═══════════════════════════════════════════════════════════════╣
136
+ ║ ║
137
+ ║ 📁 Files created: ║
138
+ ║ • studio.config.ts ║
139
+ ║ • ${relativePath} ║
140
+ ║ ║
141
+ ║ ⚠️ Important: Ensure better-auth-studio is in dependencies ║
142
+ ║ (not devDependencies) for production deployments ║
143
+ ║ ║
144
+ ║ 🚀 Start your app: ║
145
+ ║ pnpm dev ║
146
+ ║ ║
147
+ ║ 🌐 Dashboard will be at: ║
148
+ ║ http://localhost:5173${basePath} ║
149
+ ║ ║
150
+ ╚═══════════════════════════════════════════════════════════════╝
151
+ `);
152
+ }
153
+ function generateSvelteKitRoute() {
154
+ return `import { betterAuthStudio } from 'better-auth-studio/svelte-kit';
155
+ import studioConfig from '../../../../../studio.config.js';
156
+
157
+ const handler = betterAuthStudio(studioConfig);
158
+
159
+ export async function GET(event) {
160
+ return handler(event);
161
+ }
162
+
163
+ export async function POST(event) {
164
+ return handler(event);
165
+ }
166
+
167
+ export async function PUT(event) {
168
+ return handler(event);
169
+ }
170
+
171
+ export async function DELETE(event) {
172
+ return handler(event);
173
+ }
174
+
175
+ export async function PATCH(event) {
176
+ return handler(event);
177
+ }
178
+ `;
179
+ }
87
180
  function showManualInstructions(framework, basePath) {
88
181
  const frameworkName = framework === 'express' ? 'Express' : 'your app';
89
182
  console.log(`
@@ -111,21 +204,43 @@ app.use('${basePath}', betterAuthStudio(studioConfig));
111
204
  `);
112
205
  }
113
206
  function detectFramework() {
207
+ // Check for SvelteKit
208
+ if (existsSync('svelte.config.js') ||
209
+ existsSync('svelte.config.ts') ||
210
+ existsSync('src/routes') ||
211
+ existsSync('src/hooks.server.ts')) {
212
+ try {
213
+ const pkgPath = join(process.cwd(), 'package.json');
214
+ if (existsSync(pkgPath)) {
215
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
216
+ if (pkg.dependencies?.['@sveltejs/kit'] || pkg.devDependencies?.['@sveltejs/kit']) {
217
+ return 'sveltekit';
218
+ }
219
+ }
220
+ }
221
+ catch { }
222
+ }
223
+ // Check for Next.js
114
224
  if (existsSync('next.config.js') ||
115
225
  existsSync('next.config.mjs') ||
116
226
  existsSync('next.config.ts')) {
117
227
  return 'nextjs';
118
228
  }
229
+ // Check for Express
119
230
  if (existsSync('src/index.ts') || existsSync('src/app.ts') || existsSync('src/server.ts')) {
120
231
  return 'express';
121
232
  }
122
233
  if (existsSync('app.js') || existsSync('server.js') || existsSync('index.js')) {
123
234
  return 'express';
124
235
  }
236
+ // Check package.json for framework dependencies
125
237
  try {
126
238
  const pkgPath = join(process.cwd(), 'package.json');
127
239
  if (existsSync(pkgPath)) {
128
240
  const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
241
+ if (pkg.dependencies?.['@sveltejs/kit'] || pkg.devDependencies?.['@sveltejs/kit']) {
242
+ return 'sveltekit';
243
+ }
129
244
  if (pkg.dependencies?.express || pkg.devDependencies?.express) {
130
245
  return 'express';
131
246
  }