@delmaredigital/payload-better-auth 0.3.4 → 0.3.6

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 (34) hide show
  1. package/README.md +91 -5
  2. package/dist/adapter/collections.d.ts +28 -0
  3. package/dist/adapter/collections.d.ts.map +1 -1
  4. package/dist/adapter/collections.js +72 -2
  5. package/dist/adapter/collections.js.map +1 -1
  6. package/dist/adapter/index.d.ts.map +1 -1
  7. package/dist/adapter/index.js +4 -3
  8. package/dist/adapter/index.js.map +1 -1
  9. package/dist/components/LoginView.d.ts.map +1 -1
  10. package/dist/components/LoginView.js +11 -6
  11. package/dist/components/LoginView.js.map +1 -1
  12. package/dist/components/management/ApiKeysManagementClient.d.ts.map +1 -1
  13. package/dist/components/management/ApiKeysManagementClient.js +3 -4
  14. package/dist/components/management/ApiKeysManagementClient.js.map +1 -1
  15. package/dist/components/management/SecurityNavLinks.d.ts +8 -3
  16. package/dist/components/management/SecurityNavLinks.d.ts.map +1 -1
  17. package/dist/components/management/SecurityNavLinks.js +20 -12
  18. package/dist/components/management/SecurityNavLinks.js.map +1 -1
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +4 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/plugin/index.d.ts.map +1 -1
  24. package/dist/plugin/index.js +116 -9
  25. package/dist/plugin/index.js.map +1 -1
  26. package/dist/utils/betterAuthDefaults.d.ts +1102 -0
  27. package/dist/utils/betterAuthDefaults.d.ts.map +1 -0
  28. package/dist/utils/betterAuthDefaults.js +93 -0
  29. package/dist/utils/betterAuthDefaults.js.map +1 -0
  30. package/dist/utils/firstUserAdmin.d.ts +85 -0
  31. package/dist/utils/firstUserAdmin.d.ts.map +1 -0
  32. package/dist/utils/firstUserAdmin.js +128 -0
  33. package/dist/utils/firstUserAdmin.js.map +1 -0
  34. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"betterAuthDefaults.d.ts","sourceRoot":"","sources":["../../src/utils/betterAuthDefaults.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEhE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAkE2mE,CAAC;;;;;;;;;;;;;;4BAA4Z,CAAC;mCAAgD,CAAC;;;;2DAA0P,CAAC;;;;4CAA+H,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;6EAAi5C,CAAC;;;;;;;;;;;;;4BAA0d,CAAC;;;;;;;;;;;;;;;;;;;mCAAgzB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAA84Q,CAAC;iCAAkD,CAAC;;;;;;;;;6BAA8Q,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAAkyX,CAAC;iCAAkD,CAAC;;;;;;;;;6BAA8Q,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAAi5D,CAAC;iCAAkD,CAAC;;;;;;;;;6BAA8Q,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA7D5p5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,iBAAiB,EAChE,OAAO,EAAE,CAAC,GACT,CAAC,CAgBH"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Utility to apply sensible defaults to Better Auth options.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import { apiKey as betterAuthApiKey } from 'better-auth/plugins';
7
+ /**
8
+ * API Key plugin with sensible defaults for use with this package.
9
+ *
10
+ * Enables metadata storage by default so that scopes can be displayed
11
+ * in the admin UI after key creation.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { apiKeyWithDefaults } from '@delmaredigital/payload-better-auth'
16
+ *
17
+ * export const betterAuthOptions = {
18
+ * plugins: [
19
+ * apiKeyWithDefaults(), // metadata enabled by default
20
+ * ],
21
+ * }
22
+ * ```
23
+ *
24
+ * @example With custom options
25
+ * ```ts
26
+ * apiKeyWithDefaults({
27
+ * rateLimit: { max: 100, window: 60 },
28
+ * // enableMetadata is already true
29
+ * })
30
+ * ```
31
+ */
32
+ export function apiKeyWithDefaults(options) {
33
+ return betterAuthApiKey({
34
+ enableMetadata: true,
35
+ ...options,
36
+ });
37
+ }
38
+ /**
39
+ * Applies sensible defaults to Better Auth options.
40
+ *
41
+ * Currently applies the following defaults:
42
+ * - `trustedOrigins`: If not explicitly provided but `baseURL` is set,
43
+ * defaults to `[baseURL]`. This handles the common single-domain case
44
+ * where the app's origin should be trusted for auth requests.
45
+ *
46
+ * Multi-domain setups can still explicitly set `trustedOrigins` to include
47
+ * multiple origins.
48
+ *
49
+ * @example Simple case - trustedOrigins defaults to [baseURL]
50
+ * ```ts
51
+ * import { withBetterAuthDefaults } from '@delmaredigital/payload-better-auth'
52
+ *
53
+ * const auth = betterAuth(withBetterAuthDefaults({
54
+ * baseURL: 'https://myapp.com',
55
+ * // trustedOrigins automatically becomes ['https://myapp.com']
56
+ * }))
57
+ * ```
58
+ *
59
+ * @example Multi-domain case - explicit trustedOrigins respected
60
+ * ```ts
61
+ * const auth = betterAuth(withBetterAuthDefaults({
62
+ * baseURL: 'https://myapp.com',
63
+ * trustedOrigins: ['https://myapp.com', 'https://other-domain.com'],
64
+ * // trustedOrigins stays as explicitly provided
65
+ * }))
66
+ * ```
67
+ *
68
+ * @example With createBetterAuthPlugin
69
+ * ```ts
70
+ * createBetterAuthPlugin({
71
+ * createAuth: (payload) => betterAuth(withBetterAuthDefaults({
72
+ * database: payloadAdapter({ payloadClient: payload }),
73
+ * baseURL: process.env.BETTER_AUTH_URL,
74
+ * })),
75
+ * })
76
+ * ```
77
+ */
78
+ export function withBetterAuthDefaults(options) {
79
+ // If trustedOrigins is explicitly provided, use it as-is
80
+ if (options.trustedOrigins !== undefined) {
81
+ return options;
82
+ }
83
+ // If baseURL is set, default trustedOrigins to [baseURL]
84
+ if (options.baseURL) {
85
+ return {
86
+ ...options,
87
+ trustedOrigins: [options.baseURL],
88
+ };
89
+ }
90
+ // No defaults to apply
91
+ return options;
92
+ }
93
+ //# sourceMappingURL=betterAuthDefaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"betterAuthDefaults.js","sourceRoot":"","sources":["../../src/utils/betterAuthDefaults.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAIhE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA6B;IAC9D,OAAO,gBAAgB,CAAC;QACtB,cAAc,EAAE,IAAI;QACpB,GAAG,OAAO;KACX,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAU;IAEV,yDAAyD;IACzD,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,yDAAyD;IACzD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,GAAG,OAAO;YACV,cAAc,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SAClC,CAAA;IACH,CAAC;IAED,uBAAuB;IACvB,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * First User Admin Hook Utility
3
+ *
4
+ * Provides a Better Auth databaseHooks configuration that automatically
5
+ * makes the first registered user an admin.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import type { BetterAuthOptions } from 'better-auth';
10
+ export type FirstUserAdminOptions = {
11
+ /**
12
+ * Role to assign to the first user
13
+ * @default 'admin'
14
+ */
15
+ adminRole?: string;
16
+ /**
17
+ * Role to assign to subsequent users (if not already set)
18
+ * @default 'user'
19
+ */
20
+ defaultRole?: string;
21
+ /**
22
+ * Field name for the role field
23
+ * @default 'role'
24
+ */
25
+ roleField?: string;
26
+ };
27
+ /**
28
+ * Creates Better Auth databaseHooks configuration that makes the first
29
+ * registered user an admin.
30
+ *
31
+ * @example Basic usage
32
+ * ```ts
33
+ * import { betterAuth } from 'better-auth'
34
+ * import { payloadAdapter } from '@delmaredigital/payload-better-auth/adapter'
35
+ * import { firstUserAdminHooks } from '@delmaredigital/payload-better-auth'
36
+ *
37
+ * export const auth = betterAuth({
38
+ * database: payloadAdapter({ payloadClient: payload }),
39
+ * databaseHooks: firstUserAdminHooks(),
40
+ * })
41
+ * ```
42
+ *
43
+ * @example Custom roles
44
+ * ```ts
45
+ * export const auth = betterAuth({
46
+ * database: payloadAdapter({ payloadClient: payload }),
47
+ * databaseHooks: firstUserAdminHooks({
48
+ * adminRole: 'super-admin',
49
+ * defaultRole: 'member',
50
+ * }),
51
+ * })
52
+ * ```
53
+ *
54
+ * @example Merging with other hooks
55
+ * ```ts
56
+ * export const auth = betterAuth({
57
+ * database: payloadAdapter({ payloadClient: payload }),
58
+ * databaseHooks: {
59
+ * user: {
60
+ * create: {
61
+ * before: async (user, ctx) => {
62
+ * // First apply first-user-admin logic
63
+ * const result = await firstUserAdminHooks().user.create.before(user, ctx)
64
+ * const userData = result?.data ?? user
65
+ *
66
+ * // Then apply your custom logic
67
+ * return {
68
+ * data: {
69
+ * ...userData,
70
+ * createdVia: 'custom-signup',
71
+ * },
72
+ * }
73
+ * },
74
+ * after: async (user) => {
75
+ * // Your after-create logic
76
+ * console.log('User created:', user.email)
77
+ * },
78
+ * },
79
+ * },
80
+ * },
81
+ * })
82
+ * ```
83
+ */
84
+ export declare function firstUserAdminHooks(options?: FirstUserAdminOptions): NonNullable<BetterAuthOptions['databaseHooks']>;
85
+ //# sourceMappingURL=firstUserAdmin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firstUserAdmin.d.ts","sourceRoot":"","sources":["../../src/utils/firstUserAdmin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,WAAW,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAyEjD"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * First User Admin Hook Utility
3
+ *
4
+ * Provides a Better Auth databaseHooks configuration that automatically
5
+ * makes the first registered user an admin.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ /**
10
+ * Creates Better Auth databaseHooks configuration that makes the first
11
+ * registered user an admin.
12
+ *
13
+ * @example Basic usage
14
+ * ```ts
15
+ * import { betterAuth } from 'better-auth'
16
+ * import { payloadAdapter } from '@delmaredigital/payload-better-auth/adapter'
17
+ * import { firstUserAdminHooks } from '@delmaredigital/payload-better-auth'
18
+ *
19
+ * export const auth = betterAuth({
20
+ * database: payloadAdapter({ payloadClient: payload }),
21
+ * databaseHooks: firstUserAdminHooks(),
22
+ * })
23
+ * ```
24
+ *
25
+ * @example Custom roles
26
+ * ```ts
27
+ * export const auth = betterAuth({
28
+ * database: payloadAdapter({ payloadClient: payload }),
29
+ * databaseHooks: firstUserAdminHooks({
30
+ * adminRole: 'super-admin',
31
+ * defaultRole: 'member',
32
+ * }),
33
+ * })
34
+ * ```
35
+ *
36
+ * @example Merging with other hooks
37
+ * ```ts
38
+ * export const auth = betterAuth({
39
+ * database: payloadAdapter({ payloadClient: payload }),
40
+ * databaseHooks: {
41
+ * user: {
42
+ * create: {
43
+ * before: async (user, ctx) => {
44
+ * // First apply first-user-admin logic
45
+ * const result = await firstUserAdminHooks().user.create.before(user, ctx)
46
+ * const userData = result?.data ?? user
47
+ *
48
+ * // Then apply your custom logic
49
+ * return {
50
+ * data: {
51
+ * ...userData,
52
+ * createdVia: 'custom-signup',
53
+ * },
54
+ * }
55
+ * },
56
+ * after: async (user) => {
57
+ * // Your after-create logic
58
+ * console.log('User created:', user.email)
59
+ * },
60
+ * },
61
+ * },
62
+ * },
63
+ * })
64
+ * ```
65
+ */
66
+ export function firstUserAdminHooks(options) {
67
+ const { adminRole = 'admin', defaultRole = 'user', roleField = 'role', } = options ?? {};
68
+ // Using explicit any for the context type because Better Auth's
69
+ // GenericEndpointContext type is complex and includes [x: string]: any.
70
+ // The runtime behavior is what matters here.
71
+ const beforeHook = async (user, ctx) => {
72
+ try {
73
+ // Access the adapter from context
74
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
+ const context = ctx;
76
+ const adapter = context?.context?.adapter;
77
+ if (!adapter?.count) {
78
+ // Adapter not available, fall back to default role
79
+ return {
80
+ data: {
81
+ ...user,
82
+ [roleField]: user[roleField] ?? defaultRole,
83
+ },
84
+ };
85
+ }
86
+ const userCount = await adapter.count({
87
+ model: 'user',
88
+ where: [],
89
+ });
90
+ if (userCount === 0) {
91
+ // First user becomes admin
92
+ return {
93
+ data: {
94
+ ...user,
95
+ [roleField]: adminRole,
96
+ },
97
+ };
98
+ }
99
+ // Subsequent users get default role if not already set
100
+ return {
101
+ data: {
102
+ ...user,
103
+ [roleField]: user[roleField] ?? defaultRole,
104
+ },
105
+ };
106
+ }
107
+ catch (error) {
108
+ // On error, don't block user creation - just use provided or default role
109
+ console.warn('[firstUserAdminHooks] Failed to check user count:', error);
110
+ return {
111
+ data: {
112
+ ...user,
113
+ [roleField]: user[roleField] ?? defaultRole,
114
+ },
115
+ };
116
+ }
117
+ };
118
+ return {
119
+ user: {
120
+ create: {
121
+ // Cast needed because Better Auth's hook types are complex
122
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
123
+ before: beforeHook,
124
+ },
125
+ },
126
+ };
127
+ }
128
+ //# sourceMappingURL=firstUserAdmin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firstUserAdmin.js","sourceRoot":"","sources":["../../src/utils/firstUserAdmin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAwBH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA+B;IAE/B,MAAM,EACJ,SAAS,GAAG,OAAO,EACnB,WAAW,GAAG,MAAM,EACpB,SAAS,GAAG,MAAM,GACnB,GAAG,OAAO,IAAI,EAAE,CAAA;IAEjB,gEAAgE;IAChE,wEAAwE;IACxE,6CAA6C;IAC7C,MAAM,UAAU,GAAG,KAAK,EACtB,IAA6B,EAC7B,GAAY,EACgC,EAAE;QAC9C,IAAI,CAAC;YACH,kCAAkC;YAClC,8DAA8D;YAC9D,MAAM,OAAO,GAAG,GAA6C,CAAA;YAC7D,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,CAAA;YAEzC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBACpB,mDAAmD;gBACnD,OAAO;oBACL,IAAI,EAAE;wBACJ,GAAG,IAAI;wBACP,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,WAAW;qBAC5C;iBACF,CAAA;YACH,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;gBACpC,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,EAAE;aACV,CAAC,CAAA;YAEF,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,2BAA2B;gBAC3B,OAAO;oBACL,IAAI,EAAE;wBACJ,GAAG,IAAI;wBACP,CAAC,SAAS,CAAC,EAAE,SAAS;qBACvB;iBACF,CAAA;YACH,CAAC;YAED,uDAAuD;YACvD,OAAO;gBACL,IAAI,EAAE;oBACJ,GAAG,IAAI;oBACP,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,WAAW;iBAC5C;aACF,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,OAAO,CAAC,IAAI,CAAC,mDAAmD,EAAE,KAAK,CAAC,CAAA;YACxE,OAAO;gBACL,IAAI,EAAE;oBACJ,GAAG,IAAI;oBACP,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,WAAW;iBAC5C;aACF,CAAA;QACH,CAAC;IACH,CAAC,CAAA;IAED,OAAO;QACL,IAAI,EAAE;YACJ,MAAM,EAAE;gBACN,2DAA2D;gBAC3D,8DAA8D;gBAC9D,MAAM,EAAE,UAAiB;aAC1B;SACF;KACF,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delmaredigital/payload-better-auth",
3
- "version": "0.3.4",
3
+ "version": "0.3.6",
4
4
  "description": "Better Auth adapter and plugins for Payload CMS",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -54,7 +54,7 @@
54
54
  "scripts": {
55
55
  "build": "tsc",
56
56
  "dev": "tsc --watch",
57
- "dev-publish": "pnpm build && pnpm version prerelease --preid=dev && pnpm publish --registry http://localhost:4873",
57
+ "dev-publish": "pnpm build && pnpm version prerelease --preid=dev --no-git-tag-version && pnpm publish --registry http://localhost:4873 --no-git-checks",
58
58
  "clean": "rm -rf dist",
59
59
  "generate:types": "tsx src/scripts/generate-types.ts",
60
60
  "test": "vitest run",
@@ -82,7 +82,7 @@
82
82
  "better-auth": "^1.4.17",
83
83
  "next": "^16.1.4",
84
84
  "payload": "^3.73.0",
85
- "react": "^19.2.3",
85
+ "react": "^19.2.4",
86
86
  "tsx": "^4.21.0",
87
87
  "typescript": "^5.9.3",
88
88
  "vitest": "^2.1.9"