Skip to content

Commit 15764a7

Browse files
authored
feat: allow users to define custom session factory + types (#2)
* feat: allow users to define custom session factory + types * refactor: allow user to overwrite `#auth-utils-session` * chore: update type * chore: update augment
1 parent bdbb4b8 commit 15764a7

File tree

9 files changed

+32
-11
lines changed

9 files changed

+32
-11
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ jobs:
6565
- name: Run test suite
6666
run: pnpm test
6767

68-
# - name: Test types
69-
# run: pnpm test:types
68+
- name: Test types
69+
run: pnpm test:types
7070

7171
# - name: Test playground types
7272
# run: pnpm test:types:playground

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,16 @@ await clearUserSession(event)
107107
const session = await requireUserSession(event)
108108
```
109109

110+
You can define the type for your user session by creating a type declaration file (for example, `auth.d.ts`) in your project:
111+
112+
```ts
113+
declare module '#auth-utils' {
114+
interface UserSession {
115+
// define the type here
116+
}
117+
}
118+
```
119+
110120
### OAuth Event Handlers
111121

112122
All helpers are exposed from the `oauth` global variable and can be used in your server routes or API routes.

playground/auth.d.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
declare module '#auth-utils' {
2+
interface UserSession {
3+
user: {
4+
spotify?: any
5+
github?: any
6+
}
7+
loggedInAt: number
8+
}
9+
}

playground/server/routes/auth/github.get.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ export default oauth.githubEventHandler({
33
await setUserSession(event, {
44
user: {
55
github: user,
6-
}
6+
},
7+
loggedInAt: Date.now()
78
})
89

910
return sendRedirect(event, '/')

playground/server/routes/auth/spotify.get.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ export default oauth.spotifyEventHandler({
33
await setUserSession(event, {
44
user: {
55
spotify: user,
6-
}
6+
},
7+
loggedInAt: Date.now()
78
})
89

910
return sendRedirect(event, '/')

src/module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ export default defineNuxtModule<ModuleOptions>({
2424
}
2525
}
2626

27+
nuxt.options.alias['#auth-utils'] = resolver.resolve('./runtime/types/auth-utils-session')
28+
2729
// App
2830
addImportsDir(resolver.resolve('./runtime/composables'))
2931
addPlugin(resolver.resolve('./runtime/plugins/session.server'))

src/runtime/composables/session.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { useState, computed, useRequestFetch } from '#imports'
2-
// import { UserSession } from '../server/utils/session'
3-
interface UserSession {}
2+
import type { UserSession } from '#auth-utils'
43

54
const useSessionState = () => useState<UserSession>('nuxt-session', () => ({}))
65

src/runtime/server/utils/session.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,7 @@ import type { H3Event } from 'h3'
22
import { useSession, createError } from 'h3'
33
import { defu } from 'defu'
44
import { useRuntimeConfig } from '#imports'
5-
6-
export interface UserSession {
7-
user?: any
8-
[key: string]: any
9-
}
5+
import type { UserSession } from '#auth-utils'
106

117
export async function getUserSession (event: H3Event) {
128
return (await _useSession(event)).data as UserSession
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export interface UserSession {
2+
user?: {}
3+
}

0 commit comments

Comments
 (0)