deesse 0.2.11 → 0.2.13

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,24 +2,60 @@ 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
- export type Config = {
5
+ import type { AdminHeaderConfig } from '@deessejs/admin';
6
+ /**
7
+ * User schema type - each application defines their own schema.
8
+ * Use generics to preserve Drizzle type safety.
9
+ */
10
+ export type Config<TSchema extends Record<string, unknown> = Record<string, never>> = {
6
11
  name?: string;
7
- database: PostgresJsDatabase;
12
+ database: PostgresJsDatabase<TSchema>;
8
13
  plugins?: Plugin[];
9
14
  pages?: PageTree[];
10
15
  secret: string;
11
- auth: {
12
- baseURL: string;
16
+ auth: AuthConfig;
17
+ admin?: {
18
+ header?: AdminHeaderConfig;
13
19
  };
14
20
  };
21
+ /**
22
+ * Auth configuration - all fields optional for partial override
23
+ */
24
+ export type AuthConfig = {
25
+ baseURL: string;
26
+ plugins?: BetterAuthPlugin[];
27
+ emailAndPassword?: {
28
+ enabled?: boolean;
29
+ allowSignUp?: boolean;
30
+ requireEmailVerification?: boolean;
31
+ };
32
+ session?: {
33
+ maxAge?: number;
34
+ updateAge?: number;
35
+ };
36
+ trustedOrigins?: string[];
37
+ };
15
38
  /**
16
39
  * Internal config type used at runtime - includes admin plugin
40
+ * Preserves the schema generic for type safety.
17
41
  */
18
- export type InternalConfig = Config & {
42
+ export type InternalConfig<TSchema extends Record<string, unknown> = Record<string, never>> = Config<TSchema> & {
19
43
  auth: {
20
44
  baseURL: string;
21
45
  plugins: BetterAuthPlugin[];
46
+ emailAndPassword: {
47
+ enabled: boolean;
48
+ };
49
+ session: {
50
+ maxAge: number;
51
+ };
52
+ trustedOrigins: string[];
22
53
  };
23
54
  };
24
- export declare function defineConfig(config: Config): InternalConfig;
55
+ export declare function defineConfig<TSchema extends Record<string, unknown>>(config: Config<TSchema>): InternalConfig<TSchema>;
56
+ /**
57
+ * Get the global config stored by defineConfig().
58
+ * Throws if defineConfig() has not been called.
59
+ */
60
+ export declare function getGlobalConfig<TSchema extends Record<string, unknown> = Record<string, never>>(): InternalConfig<TSchema>;
25
61
  //# sourceMappingURL=define.d.ts.map
@@ -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;;;GAGG;AACH,MAAM,MAAM,MAAM,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,iBAAiB,CAAC;KAC5B,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,wBAAwB,CAAC,EAAE,OAAO,CAAC;KACpC,CAAC;IACF,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG;IAC9G,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC5B,gBAAgB,EAAE;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE,CAAC;QACvC,OAAO,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;CACH,CAAC;AAsCF,wBAAgB,YAAY,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GACtB,cAAc,CAAC,OAAO,CAAC,CA4BzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,cAAc,CAAC,OAAO,CAAC,CAO1H"}
@@ -1,13 +1,66 @@
1
1
  import { admin } from 'better-auth/plugins';
2
+ /**
3
+ * Deep merge two objects, with source overriding target for nested objects.
4
+ * Arrays are concatenated, primitive overrides replace values.
5
+ */
6
+ function deepMerge(target, source) {
7
+ const result = { ...target };
8
+ for (const key of Object.keys(source)) {
9
+ const targetValue = target[key];
10
+ const sourceValue = source[key];
11
+ if (typeof targetValue === 'object' &&
12
+ targetValue !== null &&
13
+ !Array.isArray(targetValue) &&
14
+ typeof sourceValue === 'object' &&
15
+ sourceValue !== null &&
16
+ !Array.isArray(sourceValue)) {
17
+ result[key] = deepMerge(targetValue, sourceValue);
18
+ }
19
+ else if (sourceValue !== undefined) {
20
+ result[key] = sourceValue;
21
+ }
22
+ }
23
+ return result;
24
+ }
25
+ /**
26
+ * Global config storage for getDeesse() without arguments.
27
+ * Stored at module level to persist across HMR.
28
+ * Uses 'any' for the schema since it's a runtime singleton.
29
+ */
30
+ let globalConfig;
2
31
  export function defineConfig(config) {
3
- // Always include admin plugin - user cannot remove it
4
- const authPlugins = [admin()];
5
- return {
32
+ // Default auth configuration - admin() is always first
33
+ const defaultAuth = {
34
+ plugins: [admin()],
35
+ emailAndPassword: { enabled: true },
36
+ session: { maxAge: 60 * 60 * 24 * 7 }, // 7 days
37
+ trustedOrigins: [config.auth.baseURL],
38
+ };
39
+ // Merge user config with defaults
40
+ const mergedAuth = {
41
+ baseURL: config.auth.baseURL,
42
+ secret: config.secret,
43
+ plugins: [...defaultAuth.plugins, ...(config.auth.plugins || [])],
44
+ emailAndPassword: deepMerge(defaultAuth.emailAndPassword, config.auth.emailAndPassword || {}),
45
+ session: deepMerge(defaultAuth.session, config.auth.session || {}),
46
+ trustedOrigins: config.auth.trustedOrigins || defaultAuth.trustedOrigins,
47
+ };
48
+ const internalConfig = {
6
49
  ...config,
7
- auth: {
8
- ...config.auth,
9
- plugins: authPlugins,
10
- },
50
+ auth: mergedAuth,
11
51
  };
52
+ // Store globally for getDeesse() without arguments
53
+ globalConfig = internalConfig;
54
+ return internalConfig;
55
+ }
56
+ /**
57
+ * Get the global config stored by defineConfig().
58
+ * Throws if defineConfig() has not been called.
59
+ */
60
+ export function getGlobalConfig() {
61
+ if (!globalConfig) {
62
+ throw new Error("Deesse config not defined. Call defineConfig() before accessing getDeesse() without arguments.");
63
+ }
64
+ return globalConfig;
12
65
  }
13
66
  //# sourceMappingURL=define.js.map
@@ -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;AAkD5C;;;GAGG;AACH,SAAS,SAAS,CAAoC,MAAS,EAAE,MAAkB;IACjF,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAgB,EAAE,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAEhC,IACE,OAAO,WAAW,KAAK,QAAQ;YAC/B,WAAW,KAAK,IAAI;YACpB,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAC3B,OAAO,WAAW,KAAK,QAAQ;YAC/B,WAAW,KAAK,IAAI;YACpB,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAC3B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,WAAsC,EACtC,WAAsC,CACtB,CAAC;QACrB,CAAC;aAAM,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,GAAG,WAA4B,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,IAAI,YAA6C,CAAC;AAElD,MAAM,UAAU,YAAY,CAC1B,MAAuB;IAEvB,uDAAuD;IACvD,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAuB;QACxC,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QACnC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS;QAChD,cAAc,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;KACtC,CAAC;IAEF,kCAAkC;IAClC,MAAM,UAAU,GAAG;QACjB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;QAC5B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACjE,gBAAgB,EAAE,SAAS,CAAC,WAAW,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;QAC7F,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAClE,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,WAAW,CAAC,cAAc;KACzE,CAAC;IAEF,MAAM,cAAc,GAA4B;QAC9C,GAAG,MAAM;QACT,IAAI,EAAE,UAAU;KACU,CAAC;IAE7B,mDAAmD;IACnD,YAAY,GAAG,cAAc,CAAC;IAE9B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,YAAuC,CAAC;AACjD,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { InternalConfig } from "./config/define.js";
2
1
  import { type Deesse } from "./server.js";
2
+ import { type InternalConfig } from "./config/define.js";
3
3
  export { defineConfig } from "./config/index.js";
4
4
  export type { Config, InternalConfig } from "./config/index.js";
5
5
  export { plugin } from "./config/index.js";
@@ -8,17 +8,18 @@ export { page, section } from "./config/index.js";
8
8
  export type { Page, Section, PageTree } from "./config/index.js";
9
9
  export { z } from "zod";
10
10
  export type { ZodSchema } from "zod";
11
+ export { sql } from "drizzle-orm";
11
12
  export type { Deesse } from "./server.js";
12
13
  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";
14
+ export type { DeesseClientOptions } from "./client.js";
17
15
  /**
18
16
  * Get the Deesse singleton instance.
19
17
  * Cached on global to persist across HMR.
18
+ *
19
+ * Can be called without arguments if defineConfig() was called first,
20
+ * or with a config for explicit instantiation.
20
21
  */
21
- export declare const getDeesse: (config: InternalConfig) => Promise<Deesse>;
22
+ export declare const getDeesse: (config?: InternalConfig) => Promise<Deesse>;
22
23
  /**
23
24
  * Clear the Deesse singleton cache.
24
25
  * Primarily useful for testing.
@@ -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":"AAGA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE1E,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,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAiDvD;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GACpB,SAAS,cAAc,KACtB,OAAO,CAAC,MAAM,CA4ChB,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
@@ -1,12 +1,12 @@
1
1
  // @deessejs/deesse core package
2
2
  import { createDeesse } from "./server.js";
3
+ import { getGlobalConfig } from "./config/define.js";
3
4
  export { defineConfig } from "./config/index.js";
4
5
  export { plugin } from "./config/index.js";
5
6
  export { page, section } from "./config/index.js";
6
7
  export { z } from "zod";
8
+ export { sql } from "drizzle-orm";
7
9
  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
10
  /**
11
11
  * Symbol-based global storage for Deesse instance.
12
12
  * Using Symbol.for ensures uniqueness across the process.
@@ -26,6 +26,8 @@ function getGlobalCache() {
26
26
  /**
27
27
  * Deep equality check for config comparison.
28
28
  * Required because config objects are recreated on HMR.
29
+ * Note: We do NOT compare database pools - the pool reference from $client
30
+ * may return new wrapper objects on each access, causing false positives.
29
31
  */
30
32
  function isConfigEqual(a, b) {
31
33
  if (a.secret !== b.secret)
@@ -46,28 +48,44 @@ function extractPool(db) {
46
48
  /**
47
49
  * Get the Deesse singleton instance.
48
50
  * Cached on global to persist across HMR.
51
+ *
52
+ * Can be called without arguments if defineConfig() was called first,
53
+ * or with a config for explicit instantiation.
49
54
  */
50
55
  export const getDeesse = async (config) => {
56
+ const effectiveConfig = config ?? getGlobalConfig();
51
57
  const cache = getGlobalCache();
52
58
  // Case 1: Instance exists and config is semantically equal
53
- if (cache.instance && cache.config && isConfigEqual(cache.config, config)) {
59
+ if (cache.instance && cache.config && isConfigEqual(cache.config, effectiveConfig)) {
54
60
  return cache.instance;
55
61
  }
56
62
  // 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
63
  if (cache.instance &&
60
64
  cache.config &&
61
- !isConfigEqual(cache.config, config)) {
65
+ !isConfigEqual(cache.config, effectiveConfig)) {
62
66
  console.info("[deesse] Config changed, performing hot reload...");
63
- cache.config = config;
64
- return cache.instance;
67
+ // Close the old pool before creating new instance (with 5s timeout)
68
+ if (cache.pool) {
69
+ const oldPool = cache.pool;
70
+ if (typeof oldPool.end === "function") {
71
+ await Promise.race([
72
+ oldPool.end(),
73
+ new Promise((resolve) => setTimeout(() => resolve(undefined), 5000)),
74
+ ]).catch(console.error);
75
+ }
76
+ }
77
+ // Create new instance with new config
78
+ const instance = createDeesse(effectiveConfig);
79
+ cache.pool = extractPool(instance.database);
80
+ cache.instance = instance;
81
+ cache.config = effectiveConfig;
82
+ return instance;
65
83
  }
66
84
  // Case 3: No instance exists - create one
67
- const instance = createDeesse(config);
85
+ const instance = createDeesse(effectiveConfig);
68
86
  cache.pool = extractPool(instance.database);
69
87
  cache.instance = instance;
70
- cache.config = config;
88
+ cache.config = effectiveConfig;
71
89
  return instance;
72
90
  };
73
91
  /**
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAIhC,OAAO,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE9F,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAElJ;;;GAGG;AACH,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAQhE,SAAS,cAAc;IACrB,MAAM,CAAC,GAAG,MAET,CAAC;IACF,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC1B,CAAC,CAAC,iBAAiB,CAAC,GAAG;YACrB,QAAQ,EAAE,SAAS;YACnB,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,SAAS;SAChB,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC,iBAAiB,CAAE,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,CAAiB,EAAE,CAAiB;IACzD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,EAAsB;IACzC,OAAQ,EAAuC,CAAC,OAAO,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,MAAsB,EACL,EAAE;IACnB,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAE/B,2DAA2D;IAC3D,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1E,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED,0DAA0D;IAC1D,2EAA2E;IAC3E,4FAA4F;IAC5F,IACE,KAAK,CAAC,QAAQ;QACd,KAAK,CAAC,MAAM;QACZ,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAClE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACtB,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5C,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IAEtB,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAS,EAAE;IACzC,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;IACzB,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;AACzB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAAmB,EAAE;IACtD,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAE/B,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAqC,CAAC;QACzD,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;YAC3C,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;QACD,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAC3B,CAAC,CAAC;AAEF,mCAAmC;AACnC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,cAAc,EAAE;aACb,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;aACpB,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC"}
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,CAgB3D"}
package/dist/server.js CHANGED
@@ -7,6 +7,8 @@ export function createDeesse(config) {
7
7
  }),
8
8
  baseURL: config.auth.baseURL,
9
9
  secret: config.secret,
10
+ emailAndPassword: config.auth.emailAndPassword,
11
+ trustedOrigins: config.auth.trustedOrigins,
10
12
  plugins: config.auth.plugins,
11
13
  });
12
14
  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,MAAM,CAAC,IAAI,CAAC,gBAAgB;QAC9C,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc;QAC1C,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,6 +1,6 @@
1
1
  {
2
2
  "name": "deesse",
3
- "version": "0.2.11",
3
+ "version": "0.2.13",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -29,25 +29,11 @@
29
29
  "./cache": {
30
30
  "import": "./dist/cache.js",
31
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
32
  }
41
33
  },
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
34
  "dependencies": {
50
35
  "@better-auth/drizzle-adapter": "^1.0.0",
36
+ "@deessejs/admin": "^0.1.0",
51
37
  "better-auth": "^1.0.0",
52
38
  "drizzle-orm": "^0.38.0",
53
39
  "lucide-react": "^0.468.0",
@@ -59,5 +45,12 @@
59
45
  "drizzle-kit": "^0.30.0",
60
46
  "@types/pg": "^8.11.0",
61
47
  "typescript": "^5.0.0"
48
+ },
49
+ "scripts": {
50
+ "dev": "tsc --watch",
51
+ "build": "tsc",
52
+ "type-check": "tsc --noEmit",
53
+ "lint": "eslint src --ext .ts,.tsx",
54
+ "clean": "rm -rf dist"
62
55
  }
63
- }
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
  }