@opensaas/stack-auth 0.37.0 → 0.38.0
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-build.log +1 -1
- package/CHANGELOG.md +37 -0
- package/CLAUDE.md +50 -3
- package/dist/config/plugin.js +1 -1
- package/dist/config/plugin.js.map +1 -1
- package/dist/config/types.d.ts +18 -5
- package/dist/config/types.d.ts.map +1 -1
- package/dist/server/build-better-auth-options.test.d.ts +2 -0
- package/dist/server/build-better-auth-options.test.d.ts.map +1 -0
- package/dist/server/build-better-auth-options.test.js +29 -0
- package/dist/server/build-better-auth-options.test.js.map +1 -0
- package/dist/server/index.d.ts +92 -14
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +123 -62
- package/dist/server/index.js.map +1 -1
- package/dist/server/schema-converter.d.ts +3 -3
- package/dist/server/schema-converter.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/config/plugin.ts +1 -1
- package/src/config/types.ts +18 -7
- package/src/server/build-better-auth-options.test.ts +59 -0
- package/src/server/index.ts +238 -38
- package/src/server/schema-converter.ts +3 -3
- package/tests/server.test.ts +210 -4
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +7 -1
package/dist/server/index.js
CHANGED
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
import { betterAuth } from 'better-auth';
|
|
2
2
|
import { prismaAdapter } from 'better-auth/adapters/prisma';
|
|
3
3
|
import { nextCookies } from 'better-auth/next-js';
|
|
4
|
+
/**
|
|
5
|
+
* Guard against the supplied plugin tuple silently drifting from the plugin
|
|
6
|
+
* array actually resolved from `authPlugin({ betterAuthPlugins })` — the
|
|
7
|
+
* supplied tuple exists for typing only, so if it isn't the exact same
|
|
8
|
+
* instances in the exact same order, the type it produces would be a lie
|
|
9
|
+
* about what `betterAuth()` is actually constructed with.
|
|
10
|
+
*/
|
|
11
|
+
function assertPluginTupleMatchesResolved(supplied, resolved) {
|
|
12
|
+
if (supplied.length !== resolved.length) {
|
|
13
|
+
throw new Error('[@opensaas/stack-auth] The plugin tuple passed to `buildBetterAuthOptions()` / `createAuth()` ' +
|
|
14
|
+
`has ${supplied.length} plugin(s), but the plugin array resolved from \`authPlugin({ ` +
|
|
15
|
+
`betterAuthPlugins })\` has ${resolved.length}. Pass the exact same array (without ` +
|
|
16
|
+
'`nextCookies()` — the stack appends that itself).');
|
|
17
|
+
}
|
|
18
|
+
const mismatchIndex = supplied.findIndex((plugin, index) => plugin !== resolved[index]);
|
|
19
|
+
if (mismatchIndex !== -1) {
|
|
20
|
+
throw new Error('[@opensaas/stack-auth] The plugin tuple passed to `buildBetterAuthOptions()` / `createAuth()` ' +
|
|
21
|
+
`does not match the plugin array resolved from \`authPlugin({ betterAuthPlugins })\` at index ` +
|
|
22
|
+
`${mismatchIndex} (got plugin "${supplied[mismatchIndex]?.id}", expected the same instance as ` +
|
|
23
|
+
`"${resolved[mismatchIndex]?.id}"). Pass the exact same array — same instances, same order.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
4
26
|
/**
|
|
5
27
|
* Get better-auth database configuration from OpenSaas config
|
|
6
28
|
*/
|
|
@@ -87,27 +109,7 @@ function mergeBetterAuthOptions(base, overrides) {
|
|
|
87
109
|
}
|
|
88
110
|
return result;
|
|
89
111
|
}
|
|
90
|
-
|
|
91
|
-
* Build the `BetterAuthOptions` a better-auth instance for this OpenSaas
|
|
92
|
-
* config should be constructed with — the same options `createAuth()` uses
|
|
93
|
-
* internally, available standalone for an app that still needs to hand-wire
|
|
94
|
-
* its own `betterAuth()` instance (e.g. a third-party contract that requires
|
|
95
|
-
* a resolved instance at module-init time). Keeps the auth plugin
|
|
96
|
-
* authoritative for everything it models; the app's additions on top become
|
|
97
|
-
* an explicit, reviewable diff instead of a parallel, hand-duplicated config.
|
|
98
|
-
*
|
|
99
|
-
* @example
|
|
100
|
-
* ```typescript
|
|
101
|
-
* import { betterAuth } from 'better-auth'
|
|
102
|
-
* import { buildBetterAuthOptions } from '@opensaas/stack-auth/server'
|
|
103
|
-
*
|
|
104
|
-
* export const auth = betterAuth({
|
|
105
|
-
* ...(await buildBetterAuthOptions(config, context)),
|
|
106
|
-
* databaseHooks: { user: { create: { after: syncDomainUser } } },
|
|
107
|
-
* })
|
|
108
|
-
* ```
|
|
109
|
-
*/
|
|
110
|
-
export async function buildBetterAuthOptions(opensaasConfig, context) {
|
|
112
|
+
export async function buildBetterAuthOptions(opensaasConfig, context, plugins) {
|
|
111
113
|
const resolvedConfig = await Promise.resolve(opensaasConfig);
|
|
112
114
|
const resolvedContext = await Promise.resolve(context);
|
|
113
115
|
// Extract auth config from plugin data
|
|
@@ -133,6 +135,10 @@ export async function buildBetterAuthOptions(opensaasConfig, context) {
|
|
|
133
135
|
'`emailAndPassword.enabled` is false, so there is no password-based account to reset.');
|
|
134
136
|
}
|
|
135
137
|
assertNoUnsupportedPassthroughKeys(authConfig.betterAuthOptions);
|
|
138
|
+
const resolvedPlugins = authConfig.betterAuthPlugins || [];
|
|
139
|
+
if (plugins) {
|
|
140
|
+
assertPluginTupleMatchesResolved(plugins, resolvedPlugins);
|
|
141
|
+
}
|
|
136
142
|
// Build better-auth configuration
|
|
137
143
|
const betterAuthConfig = {
|
|
138
144
|
database: getDatabaseConfig(resolvedConfig.db, resolvedContext),
|
|
@@ -203,29 +209,14 @@ export async function buildBetterAuthOptions(opensaasConfig, context) {
|
|
|
203
209
|
// cookie store. This is what makes the server-action auth forms (which
|
|
204
210
|
// call auth.api.signInEmail/signUpEmail/etc. server-side) actually
|
|
205
211
|
// persist a session. It must be the final plugin in the array.
|
|
206
|
-
plugins: [...
|
|
212
|
+
plugins: [...resolvedPlugins, nextCookies()],
|
|
207
213
|
};
|
|
208
214
|
return mergeBetterAuthOptions(betterAuthConfig, authConfig.betterAuthOptions);
|
|
209
215
|
}
|
|
210
|
-
|
|
211
|
-
* Create a better-auth instance from OpenSaas config
|
|
212
|
-
* This should be called once at app startup
|
|
213
|
-
*
|
|
214
|
-
* @example
|
|
215
|
-
* ```typescript
|
|
216
|
-
* // lib/auth.ts
|
|
217
|
-
* import { createAuth } from '@opensaas/stack-auth/server'
|
|
218
|
-
* import config from '../opensaas.config'
|
|
219
|
-
* import { rawOpensaasContext } from '@/.opensaas/context'
|
|
220
|
-
*
|
|
221
|
-
* export const auth = createAuth(config, rawOpensaasContext)
|
|
222
|
-
* ```
|
|
223
|
-
*/
|
|
224
|
-
export function createAuth(opensaasConfig, context) {
|
|
216
|
+
export function createAuth(opensaasConfig, context, plugins) {
|
|
225
217
|
// Resolve config and context asynchronously
|
|
226
218
|
const configPromise = Promise.resolve(opensaasConfig);
|
|
227
219
|
const contextPromise = Promise.resolve(context);
|
|
228
|
-
// Create auth instance lazily when needed
|
|
229
220
|
let authInstance = null;
|
|
230
221
|
let authPromise = null;
|
|
231
222
|
async function getAuthInstance() {
|
|
@@ -233,7 +224,9 @@ export function createAuth(opensaasConfig, context) {
|
|
|
233
224
|
return authInstance;
|
|
234
225
|
if (!authPromise) {
|
|
235
226
|
authPromise = (async () => {
|
|
236
|
-
const betterAuthConfig =
|
|
227
|
+
const betterAuthConfig = plugins
|
|
228
|
+
? await buildBetterAuthOptions(configPromise, contextPromise, plugins)
|
|
229
|
+
: await buildBetterAuthOptions(configPromise, contextPromise);
|
|
237
230
|
authInstance = betterAuth(betterAuthConfig);
|
|
238
231
|
return authInstance;
|
|
239
232
|
})();
|
|
@@ -282,34 +275,102 @@ export function createAuth(opensaasConfig, context) {
|
|
|
282
275
|
});
|
|
283
276
|
}
|
|
284
277
|
/**
|
|
285
|
-
*
|
|
278
|
+
* Field names already warned about failing to resolve against a session, so a
|
|
279
|
+
* given field warns at most once per process rather than once per request.
|
|
280
|
+
*/
|
|
281
|
+
const unresolvedSessionFieldWarnings = new Set();
|
|
282
|
+
/**
|
|
283
|
+
* Warn (once per field, per process) that a `sessionFields` entry could not
|
|
284
|
+
* be resolved from the session shape `auth.api.getSession()` actually
|
|
285
|
+
* returned — naming the field and what keys were available to check, so the
|
|
286
|
+
* gap is visible here instead of surfacing later as an access-control
|
|
287
|
+
* function silently reading `undefined`.
|
|
288
|
+
*/
|
|
289
|
+
function warnUnresolvedSessionField(field, resolvedSession) {
|
|
290
|
+
if (unresolvedSessionFieldWarnings.has(field))
|
|
291
|
+
return;
|
|
292
|
+
unresolvedSessionFieldWarnings.add(field);
|
|
293
|
+
const user = isPlainObject(resolvedSession.user) ? resolvedSession.user : undefined;
|
|
294
|
+
const sessionRow = isPlainObject(resolvedSession.session) ? resolvedSession.session : undefined;
|
|
295
|
+
console.warn(`[@opensaas/stack-auth] sessionFields: "${field}" was not found on the resolved session. ` +
|
|
296
|
+
`Checked its top-level keys (${Object.keys(resolvedSession).join(', ') || 'none'}), ` +
|
|
297
|
+
`its "user" object (${user ? Object.keys(user).join(', ') || 'none' : 'not present'}), ` +
|
|
298
|
+
`and its "session" object (${sessionRow ? Object.keys(sessionRow).join(', ') || 'none' : 'not present'}). ` +
|
|
299
|
+
`The field is omitted from the projected session. A \`customSession\` plugin that nests this ` +
|
|
300
|
+
`value elsewhere is the app's own to reconcile — see the \`sessionFields\` reference. ` +
|
|
301
|
+
`This warning will not repeat for "${field}".`);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Resolve a single `sessionFields` entry off the resolved better-auth
|
|
305
|
+
* session (whatever `auth.api.getSession()` returned — the default `{
|
|
306
|
+
* session, user }` shape, or a `customSession` plugin's replaced shape).
|
|
307
|
+
*
|
|
308
|
+
* `userId` is special-cased to the authenticated user's `id` — the
|
|
309
|
+
* documented default apps depend on. Every other name resolves against a
|
|
310
|
+
* fixed precedence so a collision between sources is predictable rather
|
|
311
|
+
* than incidental: a top-level key on the resolved session object, then the
|
|
312
|
+
* `user` object, then the `session` sub-object.
|
|
313
|
+
*/
|
|
314
|
+
function resolveSessionField(field, resolvedSession) {
|
|
315
|
+
const user = isPlainObject(resolvedSession.user) ? resolvedSession.user : undefined;
|
|
316
|
+
if (field === 'userId') {
|
|
317
|
+
return user && 'id' in user ? { found: true, value: user.id } : { found: false };
|
|
318
|
+
}
|
|
319
|
+
if (field in resolvedSession) {
|
|
320
|
+
return { found: true, value: resolvedSession[field] };
|
|
321
|
+
}
|
|
322
|
+
if (user && field in user) {
|
|
323
|
+
return { found: true, value: user[field] };
|
|
324
|
+
}
|
|
325
|
+
const sessionRow = isPlainObject(resolvedSession.session) ? resolvedSession.session : undefined;
|
|
326
|
+
if (sessionRow && field in sessionRow) {
|
|
327
|
+
return { found: true, value: sessionRow[field] };
|
|
328
|
+
}
|
|
329
|
+
return { found: false };
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Get session from better-auth and transform it to OpenSaas session format —
|
|
333
|
+
* a flattened projection of `sessionFields` off the *resolved* session
|
|
334
|
+
* object, not just its `user` sub-object. This is what makes a
|
|
335
|
+
* `customSession` plugin's fields (added at the top level, or a
|
|
336
|
+
* session-only field like the admin plugin's `impersonatedBy`) reachable.
|
|
337
|
+
* See the `sessionFields` reference for the resolution precedence.
|
|
286
338
|
*
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
*
|
|
291
|
-
*
|
|
339
|
+
* Returns `null` only when there is genuinely no session — a resolved
|
|
340
|
+
* session with no `user` key (a `customSession` plugin that dropped it) is
|
|
341
|
+
* still a session and still gets projected, never misreported as anonymous.
|
|
342
|
+
* A listed field that can't be resolved from the session shape is omitted
|
|
343
|
+
* and warns once per field per process (see `warnUnresolvedSessionField`)
|
|
344
|
+
* instead of silently vanishing into an access-control function reading
|
|
345
|
+
* `undefined`.
|
|
346
|
+
*
|
|
347
|
+
* Errors from the underlying `auth.api.getSession()` call propagate rather
|
|
348
|
+
* than becoming `null` — collapsing a lookup failure (e.g. a session-store
|
|
349
|
+
* outage) into "anonymous" is indistinguishable from a mass sign-out under
|
|
350
|
+
* fail-closed access control, so the caller must see it.
|
|
351
|
+
*
|
|
352
|
+
* Not called by any generated code before this helper existed — apps used to
|
|
353
|
+
* hand-roll this same transform against `auth.api.getSession({ headers:
|
|
354
|
+
* await headers() })`. Exported as the single reusable implementation; pass
|
|
355
|
+
* the caller's request headers (e.g. Next.js `await headers()` in a Server
|
|
356
|
+
* Component/action) so a session cookie can actually be resolved.
|
|
292
357
|
*/
|
|
293
358
|
export async function getSessionFromAuth(auth, sessionFields, headers) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
359
|
+
const resolvedSession = await auth.api.getSession({ headers });
|
|
360
|
+
if (!resolvedSession) {
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
const resolvedSessionRecord = resolvedSession;
|
|
364
|
+
const result = {};
|
|
365
|
+
for (const field of sessionFields) {
|
|
366
|
+
const resolved = resolveSessionField(field, resolvedSessionRecord);
|
|
367
|
+
if (resolved.found) {
|
|
368
|
+
result[field] = resolved.value;
|
|
298
369
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
for (const field of sessionFields) {
|
|
302
|
-
if (field === 'userId') {
|
|
303
|
-
result.userId = session.user.id;
|
|
304
|
-
}
|
|
305
|
-
else if (field in session.user) {
|
|
306
|
-
result[field] = session.user[field];
|
|
307
|
-
}
|
|
370
|
+
else {
|
|
371
|
+
warnUnresolvedSessionField(field, resolvedSessionRecord);
|
|
308
372
|
}
|
|
309
|
-
return result;
|
|
310
|
-
}
|
|
311
|
-
catch {
|
|
312
|
-
return null;
|
|
313
373
|
}
|
|
374
|
+
return result;
|
|
314
375
|
}
|
|
315
376
|
//# sourceMappingURL=index.js.map
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,13 +8,13 @@ import type { ListConfig } from '@opensaas/stack-core';
|
|
|
8
8
|
* Inferred from better-auth internal types
|
|
9
9
|
*/
|
|
10
10
|
type BetterAuthFieldAttribute = {
|
|
11
|
-
type: string;
|
|
11
|
+
type: string | string[];
|
|
12
12
|
required?: boolean;
|
|
13
13
|
unique?: boolean;
|
|
14
14
|
references?: {
|
|
15
15
|
model: string;
|
|
16
16
|
field: string;
|
|
17
|
-
onDelete?: 'cascade' | 'set null' | '
|
|
17
|
+
onDelete?: 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default';
|
|
18
18
|
};
|
|
19
19
|
defaultValue?: unknown;
|
|
20
20
|
returned?: boolean;
|
|
@@ -24,7 +24,7 @@ type BetterAuthFieldAttribute = {
|
|
|
24
24
|
* Better Auth table schema structure
|
|
25
25
|
*/
|
|
26
26
|
type BetterAuthTableSchema = {
|
|
27
|
-
modelName
|
|
27
|
+
modelName?: string;
|
|
28
28
|
fields: Record<string, BetterAuthFieldAttribute>;
|
|
29
29
|
};
|
|
30
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-converter.d.ts","sourceRoot":"","sources":["../../src/server/schema-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,sBAAsB,CAAA;AAEnE;;;GAGG;AACH,KAAK,wBAAwB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"schema-converter.d.ts","sourceRoot":"","sources":["../../src/server/schema-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,sBAAsB,CAAA;AAEnE;;;GAGG;AACH,KAAK,wBAAwB,GAAG;IAC9B,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE;QACX,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,CAAA;KAC7E,CAAA;IACD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED;;GAEG;AACH,KAAK,qBAAqB,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;CACjD,CAAA;AA2DD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,qBAAqB,GAEjC,UAAU,CAAC,GAAG,CAAC,CA4BjB;AAED;;;GAGG;AACH,KAAK,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAA;AAEvE;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAA;AA0BzE;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAC7C,aAAa,GAAE,iBAAsB,GAEpC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAejC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opensaas/stack-auth",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.38.0",
|
|
4
4
|
"description": "Better-auth integration for OpenSaas Stack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -60,13 +60,13 @@
|
|
|
60
60
|
"@typescript/native": "npm:typescript@^7.0.2",
|
|
61
61
|
"@vitest/coverage-v8": "^4.1.10",
|
|
62
62
|
"@vitest/ui": "^4.1.10",
|
|
63
|
-
"better-auth": "^1.
|
|
63
|
+
"better-auth": "^1.6.25",
|
|
64
64
|
"next": "^16.2.10",
|
|
65
|
-
"react": "^19.2.
|
|
65
|
+
"react": "^19.2.8",
|
|
66
66
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
67
67
|
"vitest": "^4.1.10",
|
|
68
|
-
"@opensaas/stack-cli": "0.
|
|
69
|
-
"@opensaas/stack-core": "0.
|
|
68
|
+
"@opensaas/stack-cli": "0.38.0",
|
|
69
|
+
"@opensaas/stack-core": "0.38.0"
|
|
70
70
|
},
|
|
71
71
|
"scripts": {
|
|
72
72
|
"build": "tsc",
|
package/src/config/plugin.ts
CHANGED
|
@@ -102,7 +102,7 @@ export function authPlugin(config: AuthConfig): Plugin {
|
|
|
102
102
|
// `oauth_application`, `passkey`) still register as new lists via
|
|
103
103
|
// `addList`, same as before.
|
|
104
104
|
for (const plugin of normalized.betterAuthPlugins) {
|
|
105
|
-
if (plugin && typeof plugin === 'object' &&
|
|
105
|
+
if (plugin && typeof plugin === 'object' && plugin.schema) {
|
|
106
106
|
// Plugin has schema property - convert to OpenSaaS lists
|
|
107
107
|
const pluginSchema = plugin.schema
|
|
108
108
|
const pluginLists = convertBetterAuthSchema(pluginSchema, baseModelKeys)
|
package/src/config/types.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ListConfig } from '@opensaas/stack-core'
|
|
2
|
-
import type { BetterAuthOptions, User } from 'better-auth'
|
|
2
|
+
import type { BetterAuthOptions, BetterAuthPlugin, User } from 'better-auth'
|
|
3
3
|
import type { ExtendUserListConfig } from '../lists/index.js'
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -337,8 +337,21 @@ export type AuthConfig = {
|
|
|
337
337
|
schema?: string
|
|
338
338
|
|
|
339
339
|
/**
|
|
340
|
-
* Which fields to include in the session object
|
|
341
|
-
*
|
|
340
|
+
* Which fields to include in the session object passed to access control
|
|
341
|
+
* functions — a **flattened projection** of the resolved better-auth
|
|
342
|
+
* session, not the session's own shape. `getSessionFromAuth` (the
|
|
343
|
+
* implementation the scaffolded `getSession()` calls) resolves each name
|
|
344
|
+
* against a fixed precedence: a top-level key on the resolved session
|
|
345
|
+
* object, then the `user` object, then the `session` sub-object.
|
|
346
|
+
* `userId` is special-cased to the authenticated user's `id`.
|
|
347
|
+
*
|
|
348
|
+
* A `customSession` better-auth plugin fully replaces the resolved shape
|
|
349
|
+
* (it can nest fields anywhere, e.g. under its own custom key) —
|
|
350
|
+
* reconciling that shape against `sessionFields` is the application's job.
|
|
351
|
+
* A listed name that can't be resolved is omitted and warns once per
|
|
352
|
+
* field per process, naming what was checked, rather than silently
|
|
353
|
+
* becoming `undefined` in an access control function.
|
|
354
|
+
*
|
|
342
355
|
* @default ['userId', 'email', 'name']
|
|
343
356
|
*
|
|
344
357
|
* @example
|
|
@@ -394,8 +407,7 @@ export type AuthConfig = {
|
|
|
394
407
|
* ]
|
|
395
408
|
* ```
|
|
396
409
|
*/
|
|
397
|
-
|
|
398
|
-
betterAuthPlugins?: any[]
|
|
410
|
+
betterAuthPlugins?: BetterAuthPlugin[]
|
|
399
411
|
|
|
400
412
|
/**
|
|
401
413
|
* Rate limiting configuration
|
|
@@ -528,8 +540,7 @@ export type NormalizedAuthConfig = Required<
|
|
|
528
540
|
* default (used to wire the datasource `schemas` array during generation).
|
|
529
541
|
*/
|
|
530
542
|
schema?: string
|
|
531
|
-
|
|
532
|
-
betterAuthPlugins: any[]
|
|
543
|
+
betterAuthPlugins: BetterAuthPlugin[]
|
|
533
544
|
rateLimit?: {
|
|
534
545
|
enabled: boolean
|
|
535
546
|
window?: number
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { describe, it, expectTypeOf } from 'vitest'
|
|
2
|
+
import { betterAuth } from 'better-auth'
|
|
3
|
+
import type { BetterAuthOptions } from 'better-auth'
|
|
4
|
+
import type { OpenSaasConfig, AccessContext } from '@opensaas/stack-core'
|
|
5
|
+
import { emailOTP, customSession } from 'better-auth/plugins'
|
|
6
|
+
import { buildBetterAuthOptions } from './index.js'
|
|
7
|
+
|
|
8
|
+
// The literal shape a `customSession()` callback replaces the session with —
|
|
9
|
+
// deliberately unlike better-auth's default `{ user, session }`, to prove the
|
|
10
|
+
// builder's return type carries a custom shape through to `api.getSession()`.
|
|
11
|
+
type AppSession = {
|
|
12
|
+
data: { allowAdminUI: boolean; subjectId: string }
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
type TestPlugins = [ReturnType<typeof emailOTP>, ReturnType<typeof customSession<AppSession>>]
|
|
16
|
+
|
|
17
|
+
// `ReturnType<typeof buildBetterAuthOptions>` on the overloaded export itself
|
|
18
|
+
// resolves against its last (generic) signature, not the call-site-selected
|
|
19
|
+
// one — wrapping each call shape in its own ordinary function and reading
|
|
20
|
+
// `ReturnType<typeof wrapper>` instead forces TS to resolve overloads exactly
|
|
21
|
+
// as a real call site would.
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- referenced only via `typeof` below
|
|
23
|
+
function callWithNoPlugins(
|
|
24
|
+
config: OpenSaasConfig | Promise<OpenSaasConfig>,
|
|
25
|
+
context: AccessContext | Promise<AccessContext>,
|
|
26
|
+
) {
|
|
27
|
+
return buildBetterAuthOptions(config, context)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- referenced only via `typeof` below
|
|
31
|
+
function callWithPlugins(
|
|
32
|
+
config: OpenSaasConfig | Promise<OpenSaasConfig>,
|
|
33
|
+
context: AccessContext | Promise<AccessContext>,
|
|
34
|
+
plugins: TestPlugins,
|
|
35
|
+
) {
|
|
36
|
+
return buildBetterAuthOptions(config, context, plugins)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type NoArgResult = Awaited<ReturnType<typeof callWithNoPlugins>>
|
|
40
|
+
type BuiltOptionsWithPlugins = Awaited<ReturnType<typeof callWithPlugins>>
|
|
41
|
+
type ConstructedAuth = ReturnType<typeof betterAuth<BuiltOptionsWithPlugins>>
|
|
42
|
+
|
|
43
|
+
describe('buildBetterAuthOptions plugin-tuple typing', () => {
|
|
44
|
+
it('back-compat: the no-argument call still returns the widened BetterAuthOptions', () => {
|
|
45
|
+
expectTypeOf<NoArgResult>().toEqualTypeOf<BetterAuthOptions>()
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
it('preserves plugin-derived auth.api.* endpoints and a customSession shape', () => {
|
|
49
|
+
// emailOTP() endpoints exist on the constructed Auth's `api` — erased entirely
|
|
50
|
+
// when constructed from the widened `BetterAuthOptions` (see #876).
|
|
51
|
+
expectTypeOf<ConstructedAuth['api']['signInEmailOTP']>().not.toBeNever()
|
|
52
|
+
expectTypeOf<ConstructedAuth['api']['sendVerificationOTP']>().not.toBeNever()
|
|
53
|
+
expectTypeOf<ConstructedAuth['api']['checkVerificationOTP']>().not.toBeNever()
|
|
54
|
+
|
|
55
|
+
// customSession()'s replaced shape, not better-auth's default { user, session }.
|
|
56
|
+
type GetSessionReturn = Awaited<ReturnType<ConstructedAuth['api']['getSession']>>
|
|
57
|
+
expectTypeOf<GetSessionReturn>().toEqualTypeOf<AppSession | null>()
|
|
58
|
+
})
|
|
59
|
+
})
|