deesse 0.2.11 → 0.2.12

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.
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,uBAAuB,EACxB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,uBAAuB,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC,uBAAuB,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,mBAAmB,GAC3B,YAAY,CAId"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,uBAAuB,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAIm1iG,CAAC;;;;;;;;qBAA+N,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAAmwF,CAAC;yBAA8C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAA9xmG,CAAC;qBAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAAy3C,CAAC,EAAC,eAAgB;iBAAuB,CAAC,EAAC,YAAa;uBAA6B,CAAC,EAAC,kBAAmB;mBAAa,CAAC,GAAG,WAAW,IAAI,WAAW;;;;;qBAAkT,CAAC;qBAAmC,CAAC;;gBAAmD,CAAC,EAAC,WAAY;oBAA0B,CAAC,EAAC,eAAgB;oBAA0B,CAAC;0BAAwC,CAAC,EAAC,cAAe;kBAAwB,CAAC;kBAA8C,CAAC;mBAA+B,CAAC;uBAAyG,CAAC;6BAAuB,CAAC;;mBAAyC,CAAC;;;iBAA0G,CAAC;gBAA+B,CAAC;;;;;;;;;;;;gBAA+e,CAAC;iBAAgB,CAAC;kBAAiB,CAAC;kBAAiB,CAAC;;iBAA8F,CAAC;wBAAiE,CAAC;kBAAgC,CAAC;uBAAkG,CAAC;6BAA0E,CAAC;yBAAwC,CAAC;;;2BAAkF,CAAC;mHAAuL,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EADrwJ"}
package/dist/client.js CHANGED
@@ -18,7 +18,6 @@ import { createAuthClient } from "better-auth/react";
18
18
  * ```
19
19
  */
20
20
  export function createClient(options) {
21
- const auth = createAuthClient(options.auth);
22
- return { auth };
21
+ return { auth: createAuthClient(options.auth) };
23
22
  }
24
23
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAcrD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAC1B,OAA4B;IAE5B,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAmD,CAAC;IAE9F,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAOrD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAC1B,OAA4B;IAE5B,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;AAClD,CAAC"}
@@ -2,15 +2,19 @@ import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
2
2
  import type { BetterAuthPlugin } from 'better-auth';
3
3
  import type { Plugin } from './plugin';
4
4
  import type { PageTree } from './page';
5
+ import type { AdminHeaderConfig } from '@deessejs/admin';
5
6
  export type Config = {
6
7
  name?: string;
7
- database: PostgresJsDatabase;
8
+ database: PostgresJsDatabase<any>;
8
9
  plugins?: Plugin[];
9
10
  pages?: PageTree[];
10
11
  secret: string;
11
12
  auth: {
12
13
  baseURL: string;
13
14
  };
15
+ admin?: {
16
+ header?: AdminHeaderConfig;
17
+ };
14
18
  };
15
19
  /**
16
20
  * Internal config type used at runtime - includes admin plugin
@@ -1 +1 @@
1
- {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/config/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGvC,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG;IACpC,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;KAC7B,CAAC;CACH,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAW3D"}
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/config/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,iBAAiB,CAAC;KAC5B,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG;IACpC,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;KAC7B,CAAC;CACH,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAW3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/config/define.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAuB5C,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,sDAAsD;IACtD,MAAM,WAAW,GAAuB,CAAC,KAAK,EAAE,CAAC,CAAC;IAElD,OAAO;QACL,GAAG,MAAM;QACT,IAAI,EAAE;YACJ,GAAG,MAAM,CAAC,IAAI;YACd,OAAO,EAAE,WAAW;SACrB;KACgB,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/config/define.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AA0B5C,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,sDAAsD;IACtD,MAAM,WAAW,GAAuB,CAAC,KAAK,EAAE,CAAC,CAAC;IAElD,OAAO;QACL,GAAG,MAAM;QACT,IAAI,EAAE;YACJ,GAAG,MAAM,CAAC,IAAI;YACd,OAAO,EAAE,WAAW;SACrB;KACgB,CAAC;AACtB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -10,10 +10,7 @@ export { z } from "zod";
10
10
  export type { ZodSchema } from "zod";
11
11
  export type { Deesse } from "./server.js";
12
12
  export { createClient } from "./client.js";
13
- export type { DeesseClient, DeesseClientOptions } from "./client.js";
14
- export { isDatabaseEmpty, requireDatabaseNotEmpty, validateAdminEmail } from "./lib/admin.js";
15
- export type { EmailValidationOptions } from "./lib/admin.js";
16
- export { isPublicEmailDomain, isAllowedAdminEmail, getAllowedDomains, validateAdminEmailDomain, PUBLIC_EMAIL_DOMAINS } from "./lib/validation.js";
13
+ export type { DeesseClientOptions } from "./client.js";
17
14
  /**
18
15
  * Get the Deesse singleton instance.
19
16
  * Cached on global to persist across HMR.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,YAAY,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAErC,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AA+ClJ;;;GAGG;AACH,eAAO,MAAM,SAAS,GACpB,QAAQ,cAAc,KACrB,OAAO,CAAC,MAAM,CA4BhB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAAO,IAKnC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,IAAI,CAcnD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,YAAY,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAErC,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAiDvD;;;GAGG;AACH,eAAO,MAAM,SAAS,GACpB,QAAQ,cAAc,KACrB,OAAO,CAAC,MAAM,CA2ChB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAAO,IAKnC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,IAAI,CAcnD,CAAC"}
package/dist/index.js CHANGED
@@ -5,8 +5,6 @@ export { plugin } from "./config/index.js";
5
5
  export { page, section } from "./config/index.js";
6
6
  export { z } from "zod";
7
7
  export { createClient } from "./client.js";
8
- export { isDatabaseEmpty, requireDatabaseNotEmpty, validateAdminEmail } from "./lib/admin.js";
9
- export { isPublicEmailDomain, isAllowedAdminEmail, getAllowedDomains, validateAdminEmailDomain, PUBLIC_EMAIL_DOMAINS } from "./lib/validation.js";
10
8
  /**
11
9
  * Symbol-based global storage for Deesse instance.
12
10
  * Using Symbol.for ensures uniqueness across the process.
@@ -26,6 +24,8 @@ function getGlobalCache() {
26
24
  /**
27
25
  * Deep equality check for config comparison.
28
26
  * Required because config objects are recreated on HMR.
27
+ * Note: We do NOT compare database pools - the pool reference from $client
28
+ * may return new wrapper objects on each access, causing false positives.
29
29
  */
30
30
  function isConfigEqual(a, b) {
31
31
  if (a.secret !== b.secret)
@@ -54,14 +54,26 @@ export const getDeesse = async (config) => {
54
54
  return cache.instance;
55
55
  }
56
56
  // Case 2: Instance exists but config changed - hot reload
57
- // IMPORTANT: Don't close the pool! cache.instance still uses the old pool.
58
- // The new config's pool will be garbage collected when the HMR module reference is dropped.
59
57
  if (cache.instance &&
60
58
  cache.config &&
61
59
  !isConfigEqual(cache.config, config)) {
62
60
  console.info("[deesse] Config changed, performing hot reload...");
61
+ // Close the old pool before creating new instance (with 5s timeout)
62
+ if (cache.pool) {
63
+ const oldPool = cache.pool;
64
+ if (typeof oldPool.end === "function") {
65
+ await Promise.race([
66
+ oldPool.end(),
67
+ new Promise((resolve) => setTimeout(() => resolve(undefined), 5000)),
68
+ ]).catch(console.error);
69
+ }
70
+ }
71
+ // Create new instance with new config
72
+ const instance = createDeesse(config);
73
+ cache.pool = extractPool(instance.database);
74
+ cache.instance = instance;
63
75
  cache.config = config;
64
- return cache.instance;
76
+ return instance;
65
77
  }
66
78
  // Case 3: No instance exists - create one
67
79
  const instance = createDeesse(config);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,15 @@ export declare function isDatabaseEmpty(auth: Auth): Promise<boolean>;
9
9
  * Throws if no users exist.
10
10
  */
11
11
  export declare function requireDatabaseNotEmpty(auth: Auth): Promise<void>;
12
+ /**
13
+ * Check if any admin users exist in the database.
14
+ * Returns true if at least one user with role "admin" exists.
15
+ *
16
+ * Uses the internal adapter directly to bypass auth checks.
17
+ * This is necessary because the listUsers API endpoint requires admin permissions,
18
+ * which creates a circular dependency when checking if an admin exists.
19
+ */
20
+ export declare function hasAdminUsers(auth: Auth): Promise<boolean>;
12
21
  export interface EmailValidationOptions {
13
22
  allowedDomains?: string[];
14
23
  blockedDomains?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/lib/admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAQlE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,sBAA2B,GACnC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BpC"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/lib/admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAQlE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAShE;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,sBAA2B,GACnC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BpC"}
package/dist/lib/admin.js CHANGED
@@ -22,6 +22,25 @@ export async function requireDatabaseNotEmpty(auth) {
22
22
  "Use the First Admin Setup page to create the initial admin account.");
23
23
  }
24
24
  }
25
+ /**
26
+ * Check if any admin users exist in the database.
27
+ * Returns true if at least one user with role "admin" exists.
28
+ *
29
+ * Uses the internal adapter directly to bypass auth checks.
30
+ * This is necessary because the listUsers API endpoint requires admin permissions,
31
+ * which creates a circular dependency when checking if an admin exists.
32
+ */
33
+ export async function hasAdminUsers(auth) {
34
+ try {
35
+ // Access internal adapter directly - bypasses all auth middleware
36
+ const context = await auth.$context;
37
+ const users = await context.internalAdapter.listUsers(100);
38
+ return users.some((u) => u.role === "admin") ?? false;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
25
44
  /**
26
45
  * Validate an admin email against configured rules.
27
46
  */
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/lib/admin.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAO,IAAI,CAAC,GAAW,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAU;IACtD,IAAI,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,yDAAyD;YACzD,qEAAqE,CACtE,CAAC;IACJ,CAAC;AACH,CAAC;AAQD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,UAAkC,EAAE;IAEpC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IAElD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;IACzD,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,MAAM,aAAa,EAAE,CAAC;IACtE,CAAC;IAED,uCAAuC;IACvC,IAAI,OAAO,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAC7F,CAAC;IAED,iDAAiD;IACjD,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QAC9F,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,sEAAsE,EAAE,CAAC;QACzG,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/lib/admin.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAO,IAAI,CAAC,GAAW,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAU;IACtD,IAAI,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,yDAAyD;YACzD,qEAAqE,CACtE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU;IAC5C,IAAI,CAAC;QACH,kEAAkE;QAClE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,KAAK,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAQD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,UAAkC,EAAE;IAEpC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IAElD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;IACzD,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,MAAM,aAAa,EAAE,CAAC;IACtE,CAAC;IAED,uCAAuC;IACvC,IAAI,OAAO,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAC7F,CAAC;IAED,iDAAiD;IACjD,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QAC9F,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,sEAAsE,EAAE,CAAC;QACzG,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
package/dist/server.d.ts CHANGED
@@ -1,15 +1,8 @@
1
1
  import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
2
- import type { BetterAuthPlugin } from "better-auth";
2
+ import type { Auth } from "better-auth";
3
3
  import type { InternalConfig } from "./config/define";
4
- import { betterAuth } from "better-auth";
5
- import { drizzleAdapter } from "@better-auth/drizzle-adapter";
6
4
  export type Deesse = {
7
- auth: Awaited<ReturnType<typeof betterAuth<{
8
- database: ReturnType<typeof drizzleAdapter>;
9
- baseURL: string;
10
- secret: string;
11
- plugins: BetterAuthPlugin[];
12
- }>>>;
5
+ auth: Auth;
13
6
  database: PostgresJsDatabase;
14
7
  };
15
8
  export declare function createDeesse(config: InternalConfig): Deesse;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC;QACzC,QAAQ,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;QAC5C,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,gBAAgB,EAAE,CAAC;KAC7B,CAAC,CAAC,CAAC,CAAC;IACL,QAAQ,EAAE,kBAAkB,CAAC;CAC9B,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAc3D"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAItD,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,kBAAkB,CAAC;CAC9B,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAkB3D"}
package/dist/server.js CHANGED
@@ -7,6 +7,10 @@ export function createDeesse(config) {
7
7
  }),
8
8
  baseURL: config.auth.baseURL,
9
9
  secret: config.secret,
10
+ emailAndPassword: {
11
+ enabled: true,
12
+ },
13
+ trustedOrigins: [config.auth.baseURL],
10
14
  plugins: config.auth.plugins,
11
15
  });
12
16
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAY9D,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,MAAM,IAAI,GAAG,UAAU,CAAC;QACtB,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE;YACxC,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;QAC5B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;KAC7B,CAAC,CAAC;IAEH,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAO9D,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,MAAM,IAAI,GAAG,UAAU,CAAC;QACtB,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE;YACxC,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;QAC5B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,gBAAgB,EAAE;YAChB,OAAO,EAAE,IAAI;SACd;QACD,cAAc,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QACrC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;KAC7B,CAAS,CAAC;IAEX,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,63 +1,56 @@
1
- {
2
- "name": "deesse",
3
- "version": "0.2.11",
4
- "private": false,
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "import": "./dist/index.js",
11
- "types": "./dist/index.d.ts"
12
- },
13
- "./server": {
14
- "import": "./dist/server.js",
15
- "types": "./dist/server.d.ts"
16
- },
17
- "./config": {
18
- "import": "./dist/config/index.js",
19
- "types": "./dist/config/index.d.ts"
20
- },
21
- "./config/define": {
22
- "import": "./dist/config/define.js",
23
- "types": "./dist/config/define.d.ts"
24
- },
25
- "./client": {
26
- "import": "./dist/client.js",
27
- "types": "./dist/client.d.ts"
28
- },
29
- "./cache": {
30
- "import": "./dist/cache.js",
31
- "types": "./dist/cache.d.ts"
32
- },
33
- "./lib/admin": {
34
- "import": "./dist/lib/admin.js",
35
- "types": "./dist/lib/admin.d.ts"
36
- },
37
- "./lib/validation": {
38
- "import": "./dist/lib/validation.js",
39
- "types": "./dist/lib/validation.d.ts"
40
- }
41
- },
42
- "scripts": {
43
- "dev": "tsc --watch",
44
- "build": "tsc",
45
- "type-check": "tsc --noEmit",
46
- "lint": "eslint src --ext .ts,.tsx",
47
- "clean": "rm -rf dist"
48
- },
49
- "dependencies": {
50
- "@better-auth/drizzle-adapter": "^1.0.0",
51
- "better-auth": "^1.0.0",
52
- "drizzle-orm": "^0.38.0",
53
- "lucide-react": "^0.468.0",
54
- "pg": "^8.13.0",
55
- "zod": "^3.23.0"
56
- },
57
- "devDependencies": {
58
- "@types/react": "^19.0.0",
59
- "drizzle-kit": "^0.30.0",
60
- "@types/pg": "^8.11.0",
61
- "typescript": "^5.0.0"
62
- }
63
- }
1
+ {
2
+ "name": "deesse",
3
+ "version": "0.2.12",
4
+ "private": false,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./server": {
14
+ "import": "./dist/server.js",
15
+ "types": "./dist/server.d.ts"
16
+ },
17
+ "./config": {
18
+ "import": "./dist/config/index.js",
19
+ "types": "./dist/config/index.d.ts"
20
+ },
21
+ "./config/define": {
22
+ "import": "./dist/config/define.js",
23
+ "types": "./dist/config/define.d.ts"
24
+ },
25
+ "./client": {
26
+ "import": "./dist/client.js",
27
+ "types": "./dist/client.d.ts"
28
+ },
29
+ "./cache": {
30
+ "import": "./dist/cache.js",
31
+ "types": "./dist/cache.d.ts"
32
+ }
33
+ },
34
+ "scripts": {
35
+ "dev": "tsc --watch",
36
+ "build": "tsc",
37
+ "type-check": "tsc --noEmit",
38
+ "lint": "eslint src --ext .ts,.tsx",
39
+ "clean": "rm -rf dist"
40
+ },
41
+ "dependencies": {
42
+ "@better-auth/drizzle-adapter": "^1.0.0",
43
+ "@deessejs/admin": "^0.1.0",
44
+ "better-auth": "^1.0.0",
45
+ "drizzle-orm": "^0.38.0",
46
+ "lucide-react": "^0.468.0",
47
+ "pg": "^8.13.0",
48
+ "zod": "^3.23.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/react": "^19.0.0",
52
+ "drizzle-kit": "^0.30.0",
53
+ "@types/pg": "^8.11.0",
54
+ "typescript": "^5.0.0"
55
+ }
56
+ }
package/src/client.ts CHANGED
@@ -1,17 +1,10 @@
1
1
  import { createAuthClient } from "better-auth/react";
2
- import type {
3
- AuthClient,
4
- BetterAuthClientOptions,
5
- } from "better-auth/client";
2
+ import type { BetterAuthClientOptions } from "better-auth/client";
6
3
 
7
4
  export interface DeesseClientOptions {
8
5
  auth: BetterAuthClientOptions;
9
6
  }
10
7
 
11
- export interface DeesseClient {
12
- auth: AuthClient<BetterAuthClientOptions>;
13
- }
14
-
15
8
  /**
16
9
  * Creates a type-safe authentication client.
17
10
  * Wraps better-auth's createAuthClient with a simpler API.
@@ -32,8 +25,6 @@ export interface DeesseClient {
32
25
  */
33
26
  export function createClient(
34
27
  options: DeesseClientOptions,
35
- ): DeesseClient {
36
- const auth = createAuthClient(options.auth) as unknown as AuthClient<BetterAuthClientOptions>;
37
-
38
- return { auth };
28
+ ) {
29
+ return { auth: createAuthClient(options.auth) };
39
30
  }
@@ -2,17 +2,21 @@ import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
2
2
  import type { BetterAuthPlugin } from 'better-auth';
3
3
  import type { Plugin } from './plugin';
4
4
  import type { PageTree } from './page';
5
+ import type { AdminHeaderConfig } from '@deessejs/admin';
5
6
  import { admin } from 'better-auth/plugins';
6
7
 
7
8
  export type Config = {
8
9
  name?: string;
9
- database: PostgresJsDatabase;
10
+ database: PostgresJsDatabase<any>;
10
11
  plugins?: Plugin[];
11
12
  pages?: PageTree[];
12
13
  secret: string;
13
14
  auth: {
14
15
  baseURL: string;
15
16
  };
17
+ admin?: {
18
+ header?: AdminHeaderConfig;
19
+ };
16
20
  };
17
21
 
18
22
  /**
package/src/index.ts CHANGED
@@ -17,11 +17,7 @@ export type { ZodSchema } from "zod";
17
17
  export type { Deesse } from "./server.js";
18
18
 
19
19
  export { createClient } from "./client.js";
20
- export type { DeesseClient, DeesseClientOptions } from "./client.js";
21
-
22
- export { isDatabaseEmpty, requireDatabaseNotEmpty, validateAdminEmail } from "./lib/admin.js";
23
- export type { EmailValidationOptions } from "./lib/admin.js";
24
- export { isPublicEmailDomain, isAllowedAdminEmail, getAllowedDomains, validateAdminEmailDomain, PUBLIC_EMAIL_DOMAINS } from "./lib/validation.js";
20
+ export type { DeesseClientOptions } from "./client.js";
25
21
 
26
22
  /**
27
23
  * Symbol-based global storage for Deesse instance.
@@ -52,6 +48,8 @@ function getGlobalCache(): GlobalDeesseCache {
52
48
  /**
53
49
  * Deep equality check for config comparison.
54
50
  * Required because config objects are recreated on HMR.
51
+ * Note: We do NOT compare database pools - the pool reference from $client
52
+ * may return new wrapper objects on each access, causing false positives.
55
53
  */
56
54
  function isConfigEqual(a: InternalConfig, b: InternalConfig): boolean {
57
55
  if (a.secret !== b.secret) return false;
@@ -83,16 +81,31 @@ export const getDeesse = async (
83
81
  }
84
82
 
85
83
  // Case 2: Instance exists but config changed - hot reload
86
- // IMPORTANT: Don't close the pool! cache.instance still uses the old pool.
87
- // The new config's pool will be garbage collected when the HMR module reference is dropped.
88
84
  if (
89
85
  cache.instance &&
90
86
  cache.config &&
91
87
  !isConfigEqual(cache.config, config)
92
88
  ) {
93
89
  console.info("[deesse] Config changed, performing hot reload...");
90
+
91
+ // Close the old pool before creating new instance (with 5s timeout)
92
+ if (cache.pool) {
93
+ const oldPool = cache.pool as { end?: () => Promise<void> };
94
+ if (typeof oldPool.end === "function") {
95
+ await Promise.race([
96
+ oldPool.end(),
97
+ new Promise((resolve) => setTimeout(() => resolve(undefined), 5000)),
98
+ ]).catch(console.error);
99
+ }
100
+ }
101
+
102
+ // Create new instance with new config
103
+ const instance = createDeesse(config);
104
+ cache.pool = extractPool(instance.database);
105
+ cache.instance = instance;
94
106
  cache.config = config;
95
- return cache.instance;
107
+
108
+ return instance;
96
109
  }
97
110
 
98
111
  // Case 3: No instance exists - create one
package/src/server.ts CHANGED
@@ -1,16 +1,11 @@
1
1
  import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
2
- import type { BetterAuthPlugin } from "better-auth";
2
+ import type { Auth } from "better-auth";
3
3
  import type { InternalConfig } from "./config/define";
4
4
  import { betterAuth } from "better-auth";
5
5
  import { drizzleAdapter } from "@better-auth/drizzle-adapter";
6
6
 
7
7
  export type Deesse = {
8
- auth: Awaited<ReturnType<typeof betterAuth<{
9
- database: ReturnType<typeof drizzleAdapter>;
10
- baseURL: string;
11
- secret: string;
12
- plugins: BetterAuthPlugin[];
13
- }>>>;
8
+ auth: Auth;
14
9
  database: PostgresJsDatabase;
15
10
  };
16
11
 
@@ -21,8 +16,12 @@ export function createDeesse(config: InternalConfig): Deesse {
21
16
  }),
22
17
  baseURL: config.auth.baseURL,
23
18
  secret: config.secret,
19
+ emailAndPassword: {
20
+ enabled: true,
21
+ },
22
+ trustedOrigins: [config.auth.baseURL],
24
23
  plugins: config.auth.plugins,
25
- });
24
+ }) as Auth;
26
25
 
27
26
  return {
28
27
  auth,
package/tsconfig.json CHANGED
@@ -1,12 +1,12 @@
1
- {
2
- "extends": "../../tsconfig.json",
3
- "compilerOptions": {
4
- "composite": false,
5
- "module": "ESNext",
6
- "moduleResolution": "bundler",
7
- "outDir": "./dist",
8
- "rootDir": "./src"
9
- },
10
- "include": ["src/**/*"],
11
- "exclude": ["node_modules", "dist"]
12
- }
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "composite": false,
5
+ "module": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "outDir": "./dist",
8
+ "rootDir": "./src"
9
+ },
10
+ "include": ["src/**/*"],
11
+ "exclude": ["node_modules", "dist"]
12
+ }
package/src/lib/admin.ts DELETED
@@ -1,68 +0,0 @@
1
- import type { Auth } from "better-auth";
2
-
3
- /**
4
- * Check if the database has any users.
5
- * Returns true if the database is empty (no users).
6
- */
7
- export async function isDatabaseEmpty(auth: Auth): Promise<boolean> {
8
- try {
9
- const result = await (auth.api as any).listUsers({ limit: 1 });
10
- return !result?.users || result.users.length === 0;
11
- } catch {
12
- // If listUsers fails, assume not empty (safer default)
13
- return false;
14
- }
15
- }
16
-
17
- /**
18
- * Require that the database is NOT empty.
19
- * Throws if no users exist.
20
- */
21
- export async function requireDatabaseNotEmpty(auth: Auth): Promise<void> {
22
- if (await isDatabaseEmpty(auth)) {
23
- throw new Error(
24
- "Database is empty. Cannot proceed with this operation. " +
25
- "Use the First Admin Setup page to create the initial admin account."
26
- );
27
- }
28
- }
29
-
30
- export interface EmailValidationOptions {
31
- allowedDomains?: string[];
32
- blockedDomains?: string[];
33
- requireOrganization?: boolean;
34
- }
35
-
36
- /**
37
- * Validate an admin email against configured rules.
38
- */
39
- export function validateAdminEmail(
40
- email: string,
41
- options: EmailValidationOptions = {}
42
- ): { valid: boolean; error?: string } {
43
- const domain = email.split('@')[1]?.toLowerCase();
44
-
45
- if (!domain) {
46
- return { valid: false, error: "Invalid email format" };
47
- }
48
-
49
- // Check blocked domains
50
- if (options.blockedDomains?.includes(domain)) {
51
- return { valid: false, error: `Email domain ${domain} is blocked` };
52
- }
53
-
54
- // Check allowed domains (if specified)
55
- if (options.allowedDomains?.length && !options.allowedDomains.includes(domain)) {
56
- return { valid: false, error: `Email must be from: ${options.allowedDomains.join(', ')}` };
57
- }
58
-
59
- // Require organization (no public email domains)
60
- if (options.requireOrganization) {
61
- const PUBLIC_DOMAINS = ['gmail.com', 'yahoo.com', 'hotmail.com', 'outlook.com', 'icloud.com'];
62
- if (PUBLIC_DOMAINS.includes(domain)) {
63
- return { valid: false, error: "Personal email domains are not allowed. Use an organizational email." };
64
- }
65
- }
66
-
67
- return { valid: true };
68
- }