deesse 0.2.12 → 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.
- package/.turbo/turbo-type-check.log +1 -1
- package/dist/config/define.d.ts +39 -7
- package/dist/config/define.d.ts.map +1 -1
- package/dist/config/define.js +60 -7
- package/dist/config/define.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -4
- package/dist/server.js.map +1 -1
- package/package.json +56 -56
- package/src/config/define.ts +107 -15
- package/src/index.ts +14 -8
- package/src/server.ts +2 -4
package/dist/config/define.d.ts
CHANGED
|
@@ -3,27 +3,59 @@ import type { BetterAuthPlugin } from 'better-auth';
|
|
|
3
3
|
import type { Plugin } from './plugin';
|
|
4
4
|
import type { PageTree } from './page';
|
|
5
5
|
import type { AdminHeaderConfig } from '@deessejs/admin';
|
|
6
|
-
|
|
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>> = {
|
|
7
11
|
name?: string;
|
|
8
|
-
database: PostgresJsDatabase<
|
|
12
|
+
database: PostgresJsDatabase<TSchema>;
|
|
9
13
|
plugins?: Plugin[];
|
|
10
14
|
pages?: PageTree[];
|
|
11
15
|
secret: string;
|
|
12
|
-
auth:
|
|
13
|
-
baseURL: string;
|
|
14
|
-
};
|
|
16
|
+
auth: AuthConfig;
|
|
15
17
|
admin?: {
|
|
16
18
|
header?: AdminHeaderConfig;
|
|
17
19
|
};
|
|
18
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
|
+
};
|
|
19
38
|
/**
|
|
20
39
|
* Internal config type used at runtime - includes admin plugin
|
|
40
|
+
* Preserves the schema generic for type safety.
|
|
21
41
|
*/
|
|
22
|
-
export type InternalConfig = Config & {
|
|
42
|
+
export type InternalConfig<TSchema extends Record<string, unknown> = Record<string, never>> = Config<TSchema> & {
|
|
23
43
|
auth: {
|
|
24
44
|
baseURL: string;
|
|
25
45
|
plugins: BetterAuthPlugin[];
|
|
46
|
+
emailAndPassword: {
|
|
47
|
+
enabled: boolean;
|
|
48
|
+
};
|
|
49
|
+
session: {
|
|
50
|
+
maxAge: number;
|
|
51
|
+
};
|
|
52
|
+
trustedOrigins: string[];
|
|
26
53
|
};
|
|
27
54
|
};
|
|
28
|
-
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>;
|
|
29
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;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,MAAM,MAAM,MAAM,GAAG;
|
|
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"}
|
package/dist/config/define.js
CHANGED
|
@@ -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
|
-
//
|
|
4
|
-
const
|
|
5
|
-
|
|
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":"AAKA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,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,14 +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
14
|
export type { DeesseClientOptions } from "./client.js";
|
|
14
15
|
/**
|
|
15
16
|
* Get the Deesse singleton instance.
|
|
16
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.
|
|
17
21
|
*/
|
|
18
|
-
export declare const getDeesse: (config
|
|
22
|
+
export declare const getDeesse: (config?: InternalConfig) => Promise<Deesse>;
|
|
19
23
|
/**
|
|
20
24
|
* Clear the Deesse singleton cache.
|
|
21
25
|
* Primarily useful for testing.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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,9 +1,11 @@
|
|
|
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
10
|
/**
|
|
9
11
|
* Symbol-based global storage for Deesse instance.
|
|
@@ -46,17 +48,21 @@ 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,
|
|
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
63
|
if (cache.instance &&
|
|
58
64
|
cache.config &&
|
|
59
|
-
!isConfigEqual(cache.config,
|
|
65
|
+
!isConfigEqual(cache.config, effectiveConfig)) {
|
|
60
66
|
console.info("[deesse] Config changed, performing hot reload...");
|
|
61
67
|
// Close the old pool before creating new instance (with 5s timeout)
|
|
62
68
|
if (cache.pool) {
|
|
@@ -69,17 +75,17 @@ export const getDeesse = async (config) => {
|
|
|
69
75
|
}
|
|
70
76
|
}
|
|
71
77
|
// Create new instance with new config
|
|
72
|
-
const instance = createDeesse(
|
|
78
|
+
const instance = createDeesse(effectiveConfig);
|
|
73
79
|
cache.pool = extractPool(instance.database);
|
|
74
80
|
cache.instance = instance;
|
|
75
|
-
cache.config =
|
|
81
|
+
cache.config = effectiveConfig;
|
|
76
82
|
return instance;
|
|
77
83
|
}
|
|
78
84
|
// Case 3: No instance exists - create one
|
|
79
|
-
const instance = createDeesse(
|
|
85
|
+
const instance = createDeesse(effectiveConfig);
|
|
80
86
|
cache.pool = extractPool(instance.database);
|
|
81
87
|
cache.instance = instance;
|
|
82
|
-
cache.config =
|
|
88
|
+
cache.config = effectiveConfig;
|
|
83
89
|
return instance;
|
|
84
90
|
};
|
|
85
91
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -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,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,
|
|
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,10 +7,8 @@ export function createDeesse(config) {
|
|
|
7
7
|
}),
|
|
8
8
|
baseURL: config.auth.baseURL,
|
|
9
9
|
secret: config.secret,
|
|
10
|
-
emailAndPassword:
|
|
11
|
-
|
|
12
|
-
},
|
|
13
|
-
trustedOrigins: [config.auth.baseURL],
|
|
10
|
+
emailAndPassword: config.auth.emailAndPassword,
|
|
11
|
+
trustedOrigins: config.auth.trustedOrigins,
|
|
14
12
|
plugins: config.auth.plugins,
|
|
15
13
|
});
|
|
16
14
|
return {
|
package/dist/server.js.map
CHANGED
|
@@ -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;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
|
|
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,56 +1,56 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "deesse",
|
|
3
|
-
"version": "0.2.
|
|
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
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
45
|
-
"drizzle-
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
}
|
|
56
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "deesse",
|
|
3
|
+
"version": "0.2.13",
|
|
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
|
+
"dependencies": {
|
|
35
|
+
"@better-auth/drizzle-adapter": "^1.0.0",
|
|
36
|
+
"@deessejs/admin": "^0.1.0",
|
|
37
|
+
"better-auth": "^1.0.0",
|
|
38
|
+
"drizzle-orm": "^0.38.0",
|
|
39
|
+
"lucide-react": "^0.468.0",
|
|
40
|
+
"pg": "^8.13.0",
|
|
41
|
+
"zod": "^3.23.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/react": "^19.0.0",
|
|
45
|
+
"drizzle-kit": "^0.30.0",
|
|
46
|
+
"@types/pg": "^8.11.0",
|
|
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"
|
|
55
|
+
}
|
|
56
|
+
}
|
package/src/config/define.ts
CHANGED
|
@@ -5,39 +5,131 @@ import type { PageTree } from './page';
|
|
|
5
5
|
import type { AdminHeaderConfig } from '@deessejs/admin';
|
|
6
6
|
import { admin } from 'better-auth/plugins';
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* User schema type - each application defines their own schema.
|
|
10
|
+
* Use generics to preserve Drizzle type safety.
|
|
11
|
+
*/
|
|
12
|
+
export type Config<TSchema extends Record<string, unknown> = Record<string, never>> = {
|
|
9
13
|
name?: string;
|
|
10
|
-
database: PostgresJsDatabase<
|
|
14
|
+
database: PostgresJsDatabase<TSchema>;
|
|
11
15
|
plugins?: Plugin[];
|
|
12
16
|
pages?: PageTree[];
|
|
13
17
|
secret: string;
|
|
14
|
-
auth:
|
|
15
|
-
baseURL: string;
|
|
16
|
-
};
|
|
18
|
+
auth: AuthConfig;
|
|
17
19
|
admin?: {
|
|
18
20
|
header?: AdminHeaderConfig;
|
|
19
21
|
};
|
|
20
22
|
};
|
|
21
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Auth configuration - all fields optional for partial override
|
|
26
|
+
*/
|
|
27
|
+
export type AuthConfig = {
|
|
28
|
+
baseURL: string;
|
|
29
|
+
plugins?: BetterAuthPlugin[];
|
|
30
|
+
emailAndPassword?: {
|
|
31
|
+
enabled?: boolean;
|
|
32
|
+
allowSignUp?: boolean;
|
|
33
|
+
requireEmailVerification?: boolean;
|
|
34
|
+
};
|
|
35
|
+
session?: {
|
|
36
|
+
maxAge?: number;
|
|
37
|
+
updateAge?: number;
|
|
38
|
+
};
|
|
39
|
+
trustedOrigins?: string[];
|
|
40
|
+
};
|
|
41
|
+
|
|
22
42
|
/**
|
|
23
43
|
* Internal config type used at runtime - includes admin plugin
|
|
44
|
+
* Preserves the schema generic for type safety.
|
|
24
45
|
*/
|
|
25
|
-
export type InternalConfig = Config & {
|
|
46
|
+
export type InternalConfig<TSchema extends Record<string, unknown> = Record<string, never>> = Config<TSchema> & {
|
|
26
47
|
auth: {
|
|
27
48
|
baseURL: string;
|
|
28
49
|
plugins: BetterAuthPlugin[];
|
|
50
|
+
emailAndPassword: { enabled: boolean };
|
|
51
|
+
session: { maxAge: number };
|
|
52
|
+
trustedOrigins: string[];
|
|
29
53
|
};
|
|
30
54
|
};
|
|
31
55
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Deep merge two objects, with source overriding target for nested objects.
|
|
58
|
+
* Arrays are concatenated, primitive overrides replace values.
|
|
59
|
+
*/
|
|
60
|
+
function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {
|
|
61
|
+
const result = { ...target };
|
|
62
|
+
for (const key of Object.keys(source) as (keyof T)[]) {
|
|
63
|
+
const targetValue = target[key];
|
|
64
|
+
const sourceValue = source[key];
|
|
65
|
+
|
|
66
|
+
if (
|
|
67
|
+
typeof targetValue === 'object' &&
|
|
68
|
+
targetValue !== null &&
|
|
69
|
+
!Array.isArray(targetValue) &&
|
|
70
|
+
typeof sourceValue === 'object' &&
|
|
71
|
+
sourceValue !== null &&
|
|
72
|
+
!Array.isArray(sourceValue)
|
|
73
|
+
) {
|
|
74
|
+
result[key] = deepMerge(
|
|
75
|
+
targetValue as Record<string, unknown>,
|
|
76
|
+
sourceValue as Record<string, unknown>
|
|
77
|
+
) as T[typeof key];
|
|
78
|
+
} else if (sourceValue !== undefined) {
|
|
79
|
+
result[key] = sourceValue as T[typeof key];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Global config storage for getDeesse() without arguments.
|
|
87
|
+
* Stored at module level to persist across HMR.
|
|
88
|
+
* Uses 'any' for the schema since it's a runtime singleton.
|
|
89
|
+
*/
|
|
90
|
+
let globalConfig: InternalConfig<any> | undefined;
|
|
91
|
+
|
|
92
|
+
export function defineConfig<TSchema extends Record<string, unknown>>(
|
|
93
|
+
config: Config<TSchema>
|
|
94
|
+
): InternalConfig<TSchema> {
|
|
95
|
+
// Default auth configuration - admin() is always first
|
|
96
|
+
const defaultAuth = {
|
|
97
|
+
plugins: [admin()] as BetterAuthPlugin[],
|
|
98
|
+
emailAndPassword: { enabled: true },
|
|
99
|
+
session: { maxAge: 60 * 60 * 24 * 7 }, // 7 days
|
|
100
|
+
trustedOrigins: [config.auth.baseURL],
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// Merge user config with defaults
|
|
104
|
+
const mergedAuth = {
|
|
105
|
+
baseURL: config.auth.baseURL,
|
|
106
|
+
secret: config.secret,
|
|
107
|
+
plugins: [...defaultAuth.plugins, ...(config.auth.plugins || [])],
|
|
108
|
+
emailAndPassword: deepMerge(defaultAuth.emailAndPassword, config.auth.emailAndPassword || {}),
|
|
109
|
+
session: deepMerge(defaultAuth.session, config.auth.session || {}),
|
|
110
|
+
trustedOrigins: config.auth.trustedOrigins || defaultAuth.trustedOrigins,
|
|
111
|
+
};
|
|
35
112
|
|
|
36
|
-
|
|
113
|
+
const internalConfig: InternalConfig<TSchema> = {
|
|
37
114
|
...config,
|
|
38
|
-
auth:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
115
|
+
auth: mergedAuth,
|
|
116
|
+
} as InternalConfig<TSchema>;
|
|
117
|
+
|
|
118
|
+
// Store globally for getDeesse() without arguments
|
|
119
|
+
globalConfig = internalConfig;
|
|
120
|
+
|
|
121
|
+
return internalConfig;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Get the global config stored by defineConfig().
|
|
126
|
+
* Throws if defineConfig() has not been called.
|
|
127
|
+
*/
|
|
128
|
+
export function getGlobalConfig<TSchema extends Record<string, unknown> = Record<string, never>>(): InternalConfig<TSchema> {
|
|
129
|
+
if (!globalConfig) {
|
|
130
|
+
throw new Error(
|
|
131
|
+
"Deesse config not defined. Call defineConfig() before accessing getDeesse() without arguments."
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
return globalConfig as InternalConfig<TSchema>;
|
|
43
135
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @deessejs/deesse core package
|
|
2
2
|
|
|
3
|
-
import type { InternalConfig } from "./config/define.js";
|
|
4
3
|
import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
|
|
5
4
|
import { createDeesse, type Deesse } from "./server.js";
|
|
5
|
+
import { getGlobalConfig, type InternalConfig } from "./config/define.js";
|
|
6
6
|
|
|
7
7
|
export { defineConfig } from "./config/index.js";
|
|
8
8
|
export type { Config, InternalConfig } from "./config/index.js";
|
|
@@ -14,6 +14,8 @@ export type { Page, Section, PageTree } from "./config/index.js";
|
|
|
14
14
|
export { z } from "zod";
|
|
15
15
|
export type { ZodSchema } from "zod";
|
|
16
16
|
|
|
17
|
+
export { sql } from "drizzle-orm";
|
|
18
|
+
|
|
17
19
|
export type { Deesse } from "./server.js";
|
|
18
20
|
|
|
19
21
|
export { createClient } from "./client.js";
|
|
@@ -69,14 +71,18 @@ function extractPool(db: PostgresJsDatabase): unknown {
|
|
|
69
71
|
/**
|
|
70
72
|
* Get the Deesse singleton instance.
|
|
71
73
|
* Cached on global to persist across HMR.
|
|
74
|
+
*
|
|
75
|
+
* Can be called without arguments if defineConfig() was called first,
|
|
76
|
+
* or with a config for explicit instantiation.
|
|
72
77
|
*/
|
|
73
78
|
export const getDeesse = async (
|
|
74
|
-
config
|
|
79
|
+
config?: InternalConfig
|
|
75
80
|
): Promise<Deesse> => {
|
|
81
|
+
const effectiveConfig = config ?? getGlobalConfig();
|
|
76
82
|
const cache = getGlobalCache();
|
|
77
83
|
|
|
78
84
|
// Case 1: Instance exists and config is semantically equal
|
|
79
|
-
if (cache.instance && cache.config && isConfigEqual(cache.config,
|
|
85
|
+
if (cache.instance && cache.config && isConfigEqual(cache.config, effectiveConfig)) {
|
|
80
86
|
return cache.instance;
|
|
81
87
|
}
|
|
82
88
|
|
|
@@ -84,7 +90,7 @@ export const getDeesse = async (
|
|
|
84
90
|
if (
|
|
85
91
|
cache.instance &&
|
|
86
92
|
cache.config &&
|
|
87
|
-
!isConfigEqual(cache.config,
|
|
93
|
+
!isConfigEqual(cache.config, effectiveConfig)
|
|
88
94
|
) {
|
|
89
95
|
console.info("[deesse] Config changed, performing hot reload...");
|
|
90
96
|
|
|
@@ -100,19 +106,19 @@ export const getDeesse = async (
|
|
|
100
106
|
}
|
|
101
107
|
|
|
102
108
|
// Create new instance with new config
|
|
103
|
-
const instance = createDeesse(
|
|
109
|
+
const instance = createDeesse(effectiveConfig);
|
|
104
110
|
cache.pool = extractPool(instance.database);
|
|
105
111
|
cache.instance = instance;
|
|
106
|
-
cache.config =
|
|
112
|
+
cache.config = effectiveConfig;
|
|
107
113
|
|
|
108
114
|
return instance;
|
|
109
115
|
}
|
|
110
116
|
|
|
111
117
|
// Case 3: No instance exists - create one
|
|
112
|
-
const instance = createDeesse(
|
|
118
|
+
const instance = createDeesse(effectiveConfig);
|
|
113
119
|
cache.pool = extractPool(instance.database);
|
|
114
120
|
cache.instance = instance;
|
|
115
|
-
cache.config =
|
|
121
|
+
cache.config = effectiveConfig;
|
|
116
122
|
|
|
117
123
|
return instance;
|
|
118
124
|
};
|
package/src/server.ts
CHANGED
|
@@ -16,10 +16,8 @@ export function createDeesse(config: InternalConfig): Deesse {
|
|
|
16
16
|
}),
|
|
17
17
|
baseURL: config.auth.baseURL,
|
|
18
18
|
secret: config.secret,
|
|
19
|
-
emailAndPassword:
|
|
20
|
-
|
|
21
|
-
},
|
|
22
|
-
trustedOrigins: [config.auth.baseURL],
|
|
19
|
+
emailAndPassword: config.auth.emailAndPassword,
|
|
20
|
+
trustedOrigins: config.auth.trustedOrigins,
|
|
23
21
|
plugins: config.auth.plugins,
|
|
24
22
|
}) as Auth;
|
|
25
23
|
|