@moneydevkit/better-auth 0.10.0-beta.2

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 ADDED
@@ -0,0 +1,72 @@
1
+ # @moneydevkit/better-auth
2
+
3
+ Better Auth plugin for MoneyDevKit. Automatically links authenticated users to MDK customers.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @moneydevkit/better-auth better-auth
9
+ ```
10
+
11
+ You'll also need a MoneyDevKit UI package for your framework:
12
+ - [Next.js](https://github.com/moneydevkit/mdk-checkout/tree/main/packages/nextjs)
13
+ - [Replit](https://github.com/moneydevkit/mdk-checkout/tree/main/packages/replit)
14
+
15
+ ## Setup
16
+
17
+ ### 1. Environment variables
18
+
19
+ ```bash
20
+ MDK_ACCESS_TOKEN=your_api_key
21
+ MDK_MNEMONIC=your_wallet_mnemonic
22
+ ```
23
+
24
+ ### 2. Server plugin
25
+
26
+ ```typescript
27
+ // lib/auth.ts
28
+ import { betterAuth } from "better-auth"
29
+ import { moneydevkit } from "@moneydevkit/better-auth"
30
+
31
+ export const auth = betterAuth({
32
+ // ... your config
33
+ plugins: [moneydevkit()]
34
+ })
35
+ ```
36
+
37
+ ### 3. Client plugin
38
+
39
+ ```tsx
40
+ import { createAuthClient } from "better-auth/react"
41
+ import { moneydevkitClient } from "@moneydevkit/better-auth/client"
42
+
43
+ const authClient = createAuthClient({
44
+ plugins: [moneydevkitClient()]
45
+ })
46
+
47
+ // Same API as useCheckout().createCheckout from @moneydevkit/nextjs
48
+ const result = await authClient.createCheckout({
49
+ type: 'AMOUNT',
50
+ amount: 500,
51
+ currency: 'USD',
52
+ successUrl: '/checkout/success',
53
+ })
54
+
55
+ if (result.data) {
56
+ window.location.href = result.data.checkoutUrl
57
+ }
58
+ ```
59
+
60
+ ### 4. Framework setup
61
+
62
+ Follow the setup guide for your framework's MoneyDevKit package (route handler, checkout page, config):
63
+ - [Next.js setup](https://github.com/moneydevkit/mdk-checkout/tree/main/packages/nextjs#quick-start-nextjs-app-router)
64
+ - [Replit setup](https://github.com/moneydevkit/mdk-checkout/tree/main/packages/replit#setup)
65
+
66
+ ## How it works
67
+
68
+ The plugin adds a `/moneydevkit/checkout` endpoint that:
69
+ - If user is authenticated: maps `user.id` → `customer.externalId`, auto-fills email/name
70
+ - If no session: creates checkout without customer info (guest checkout)
71
+
72
+ This links all checkouts to the same MDK customer record for returning users.
@@ -0,0 +1,29 @@
1
+ import type { CreateCheckoutParams } from '@moneydevkit/core';
2
+ /**
3
+ * MoneyDevKit Client Plugin for Better Auth
4
+ *
5
+ * Provides `createCheckout` - same API as `useCheckout().createCheckout` from @moneydevkit/nextjs
6
+ */
7
+ export declare const moneydevkitClient: () => {
8
+ id: "moneydevkit";
9
+ getActions: ($fetch: import("better-auth/client").BetterFetch) => {
10
+ /**
11
+ * Create a checkout and return the URL.
12
+ * Same API as useCheckout().createCheckout from @moneydevkit/nextjs
13
+ */
14
+ createCheckout: (params: CreateCheckoutParams) => Promise<{
15
+ data: null;
16
+ error: {
17
+ message?: string | undefined;
18
+ status: number;
19
+ statusText: string;
20
+ };
21
+ } | {
22
+ data: {
23
+ checkoutUrl: string;
24
+ };
25
+ error: null;
26
+ }>;
27
+ };
28
+ };
29
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAG7D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;QAIxB;;;WAGG;iCAC4B,oBAAoB;;;;;;;;;;;;;;CAcxD,CAAA"}
package/dist/client.js ADDED
@@ -0,0 +1,25 @@
1
+ import { CHECKOUT_ENDPOINT } from './constants';
2
+ /**
3
+ * MoneyDevKit Client Plugin for Better Auth
4
+ *
5
+ * Provides `createCheckout` - same API as `useCheckout().createCheckout` from @moneydevkit/nextjs
6
+ */
7
+ export const moneydevkitClient = () => {
8
+ return {
9
+ id: 'moneydevkit',
10
+ getActions: ($fetch) => ({
11
+ /**
12
+ * Create a checkout and return the URL.
13
+ * Same API as useCheckout().createCheckout from @moneydevkit/nextjs
14
+ */
15
+ createCheckout: async (params) => {
16
+ const response = await $fetch(CHECKOUT_ENDPOINT, { method: 'POST', body: params });
17
+ if (response.error || !response.data) {
18
+ return { data: null, error: response.error };
19
+ }
20
+ return { data: { checkoutUrl: response.data.redirectUrl }, error: null };
21
+ },
22
+ }),
23
+ };
24
+ };
25
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,OAAO;QACL,EAAE,EAAE,aAAa;QACjB,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvB;;;eAGG;YACH,cAAc,EAAE,KAAK,EAAE,MAA4B,EAAE,EAAE;gBACrD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAC3B,iBAAiB,EACjB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CACjC,CAAA;gBAED,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACrC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAA;gBAC9C,CAAC;gBAED,OAAO,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;YAC1E,CAAC;SACF,CAAC;KAC8B,CAAA;AACpC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** Endpoint path - shared between server and client */
2
+ export declare const CHECKOUT_ENDPOINT = "/moneydevkit/checkout";
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,0BAA0B,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** Endpoint path - shared between server and client */
2
+ export const CHECKOUT_ENDPOINT = '/moneydevkit/checkout';
3
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,uBAAuB,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { BetterAuthPlugin } from 'better-auth';
2
+ export * from '@moneydevkit/core';
3
+ export { createUnifiedHandler, POST, GET } from '@moneydevkit/core/route';
4
+ export { CHECKOUT_ENDPOINT } from './constants';
5
+ /**
6
+ * MoneyDevKit Better Auth Plugin
7
+ *
8
+ * Thin wrapper around @moneydevkit/core that automatically injects
9
+ * authenticated user info into checkout customer data.
10
+ * If no user is authenticated, creates checkout without customer info.
11
+ */
12
+ export declare const moneydevkit: () => BetterAuthPlugin;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAGnD,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAMzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,QAAO,gBAoD9B,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ import { createAuthEndpoint, sessionMiddleware } from 'better-auth/api';
2
+ // Re-export everything from core - users only need @moneydevkit/better-auth
3
+ export * from '@moneydevkit/core';
4
+ export { createUnifiedHandler, POST, GET } from '@moneydevkit/core/route';
5
+ import { createCheckout } from '@moneydevkit/core';
6
+ import { CHECKOUT_ENDPOINT } from './constants';
7
+ export { CHECKOUT_ENDPOINT } from './constants';
8
+ /**
9
+ * MoneyDevKit Better Auth Plugin
10
+ *
11
+ * Thin wrapper around @moneydevkit/core that automatically injects
12
+ * authenticated user info into checkout customer data.
13
+ * If no user is authenticated, creates checkout without customer info.
14
+ */
15
+ export const moneydevkit = () => {
16
+ return {
17
+ id: 'moneydevkit',
18
+ endpoints: {
19
+ createCheckout: createAuthEndpoint(CHECKOUT_ENDPOINT, {
20
+ method: 'POST',
21
+ use: [sessionMiddleware],
22
+ }, async (ctx) => {
23
+ try {
24
+ // Better Auth already parses the body - access via ctx.body
25
+ const body = ctx.body;
26
+ const user = ctx.context.session?.user;
27
+ // If authenticated, inject user info into customer
28
+ const customer = user
29
+ ? {
30
+ ...body.customer,
31
+ externalId: user.id,
32
+ email: user.email ?? body.customer?.email,
33
+ name: user.name ?? body.customer?.name,
34
+ }
35
+ : body.customer;
36
+ const result = await createCheckout({
37
+ ...body,
38
+ customer,
39
+ });
40
+ if (result.error) {
41
+ console.error('[MDK Better Auth] createCheckout error:', result.error);
42
+ throw new Error(result.error.message);
43
+ }
44
+ const checkoutPath = body.checkoutPath || '/checkout';
45
+ const redirectUrl = `${checkoutPath}/${result.data.checkout.id}`;
46
+ return ctx.json({
47
+ checkout: result.data.checkout,
48
+ redirectUrl,
49
+ });
50
+ }
51
+ catch (err) {
52
+ console.error('[MDK Better Auth] Checkout endpoint error:', err);
53
+ throw err;
54
+ }
55
+ }),
56
+ },
57
+ };
58
+ };
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGvE,4EAA4E;AAC5E,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAqB,EAAE;IAChD,OAAO;QACL,EAAE,EAAE,aAAa;QACjB,SAAS,EAAE;YACT,cAAc,EAAE,kBAAkB,CAChC,iBAAiB,EACjB;gBACE,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,CAAC,iBAAiB,CAAC;aACzB,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;gBACZ,IAAI,CAAC;oBACH,4DAA4D;oBAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,IAA4B,CAAA;oBAE7C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAA;oBAEtC,mDAAmD;oBACnD,MAAM,QAAQ,GAAG,IAAI;wBACnB,CAAC,CAAC;4BACE,GAAG,IAAI,CAAC,QAAQ;4BAChB,UAAU,EAAE,IAAI,CAAC,EAAE;4BACnB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK;4BACzC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI;yBACvC;wBACH,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA;oBAEjB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;wBAClC,GAAG,IAAI;wBACP,QAAQ;qBACT,CAAC,CAAA;oBAEF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACjB,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;wBACtE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;oBACvC,CAAC;oBAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,WAAW,CAAA;oBACrD,MAAM,WAAW,GAAG,GAAG,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAA;oBAEhE,OAAO,GAAG,CAAC,IAAI,CAAC;wBACd,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;wBAC9B,WAAW;qBACZ,CAAC,CAAA;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC,CAAA;oBAChE,MAAM,GAAG,CAAA;gBACX,CAAC;YACH,CAAC,CACF;SACF;KACF,CAAA;AACH,CAAC,CAAA"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@moneydevkit/better-auth",
3
+ "version": "0.10.0-beta.2",
4
+ "description": "Better Auth plugin for MoneyDevKit checkout integration",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/moneydevkit/mdk-checkout.git",
8
+ "directory": "packages/better-auth"
9
+ },
10
+ "homepage": "https://github.com/moneydevkit/mdk-checkout/blob/main/packages/better-auth/README.md",
11
+ "license": "MIT",
12
+ "type": "module",
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "./client": {
22
+ "types": "./dist/client.d.ts",
23
+ "import": "./dist/client.js",
24
+ "default": "./dist/client.js"
25
+ },
26
+ "./package.json": "./package.json"
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "dependencies": {
32
+ "zod": "^3.25.42",
33
+ "@moneydevkit/api-contract": "0.1.21",
34
+ "@moneydevkit/core": "0.10.0-beta.2"
35
+ },
36
+ "peerDependencies": {
37
+ "better-auth": "^1.0.0"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^20.10.5",
41
+ "better-auth": "^1.4.7",
42
+ "typescript": "^5.6.3"
43
+ },
44
+ "scripts": {
45
+ "prebuild": "npm --prefix ../core run build",
46
+ "build": "rm -rf dist && tsc -p tsconfig.json",
47
+ "clean": "rm -rf dist",
48
+ "typecheck": "tsc --noEmit"
49
+ }
50
+ }