Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/module/type-templates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ declare module '@onmax/nuxt-better-auth/config' {
type ServerAuthConfig = Omit<BetterAuthOptions, 'secret' | 'baseURL'> & {
plugins?: readonly BetterAuthPlugin[]
}
export function defineServerAuth<const R extends ServerAuthConfig>(config: R): (ctx: _AugmentedServerAuthContext) => R
export function defineServerAuth<const R extends ServerAuthConfig>(config: (ctx: _AugmentedServerAuthContext) => R): (ctx: _AugmentedServerAuthContext) => R
export function defineServerAuth<const R>(config: (ctx: _AugmentedServerAuthContext) => R & ServerAuthConfig): (ctx: _AugmentedServerAuthContext) => R
export function defineServerAuth<const R>(config: R & ServerAuthConfig): (ctx: _AugmentedServerAuthContext) => R
}
`,
}, { nuxt: true, nitro: true, node: true })
Expand Down
6 changes: 3 additions & 3 deletions src/runtime/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,9 @@ export interface AuthPrivateRuntimeConfig {
secondaryStorage: boolean
}

export function defineServerAuth<const R extends ServerAuthConfig>(config: R): (ctx: ServerAuthContext) => R
export function defineServerAuth<const R extends ServerAuthConfig>(config: (ctx: ServerAuthContext) => R): (ctx: ServerAuthContext) => R
export function defineServerAuth<T extends ServerAuthConfig>(config: T | ((ctx: ServerAuthContext) => T)): (ctx: ServerAuthContext) => T {
export function defineServerAuth<const R>(config: (ctx: ServerAuthContext) => R & ServerAuthConfig): (ctx: ServerAuthContext) => R
export function defineServerAuth<const R>(config: R & ServerAuthConfig): (ctx: ServerAuthContext) => R
export function defineServerAuth(config: ServerAuthConfig | ((ctx: ServerAuthContext) => ServerAuthConfig)): (ctx: ServerAuthContext) => ServerAuthConfig {
return typeof config === 'function' ? config : () => config
}

Expand Down
18 changes: 18 additions & 0 deletions test/cases/define-server-auth-literal-inference/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "ESNext",
"lib": [
"ESNext",
"DOM"
],
"module": "preserve",
"moduleResolution": "bundler",
"types": [],
"strict": true,
"noEmit": true,
"skipLibCheck": true
},
"files": [
"./typecheck-target.ts"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { defineServerAuth } from '../../../../src/runtime/config'

const objectConfig = defineServerAuth({
advanced: { database: { generateId: 'uuid' } },
user: {
additionalFields: {
address: { type: 'string', required: false, fieldName: 'address' },
},
},
})

const callbackConfig = defineServerAuth(() => ({
advanced: { database: { generateId: 'uuid' } },
user: {
additionalFields: {
city: { type: 'string', required: false },
},
},
}))

void objectConfig
void callbackConfig

// @ts-expect-error invalid generateId literal
defineServerAuth({
advanced: { database: { generateId: 'invalid-id' } },
})

// @ts-expect-error invalid additionalFields type literal
defineServerAuth({
user: {
additionalFields: {
badField: { type: 'invalid-type' },
},
},
})
16 changes: 16 additions & 0 deletions test/define-server-auth-literal-inference.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { spawnSync } from 'node:child_process'
import { fileURLToPath } from 'node:url'
import { describe, expect, it } from 'vitest'

const fixtureDir = fileURLToPath(new URL('./cases/define-server-auth-literal-inference', import.meta.url))

describe('defineServerAuth literal inference regression #134', () => {
it('typechecks nested literals without as const and rejects invalid literals', () => {
const typecheck = spawnSync('pnpm', ['exec', 'tsc', '--noEmit', '--pretty', 'false', '-p', 'tsconfig.json'], {
cwd: fixtureDir,
encoding: 'utf8',
})

expect(typecheck.status, `tsc failed:\n${typecheck.stdout}\n${typecheck.stderr}`).toBe(0)
})
})
Loading