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
20 changes: 20 additions & 0 deletions .changeset/chatty-loops-watch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
'@clerk/nuxt': minor
---

Deprecate `event.context.auth` in favor of `event.context.auth()` as function

```diff
export default clerkMiddleware((event) => {
+ const { userId } = event.context.auth()
- const { userId } = event.context.auth
const isAdminRoute = event.path.startsWith('/api/admin')

if (!userId && isAdminRoute) {
throw createError({
statusCode: 401,
statusMessage: 'Unauthorized: User not signed in',
})
}
})
```
2 changes: 1 addition & 1 deletion integration/templates/nuxt-node/server/api/me.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { clerkClient } from '@clerk/nuxt/server';

export default eventHandler(async event => {
const { userId } = event.context.auth;
const { userId } = event.context.auth();

if (!userId) {
throw createError({
Expand Down
10 changes: 7 additions & 3 deletions packages/nuxt/src/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export type ModuleOptions = Omit<LoadClerkJsScriptOptions, 'routerPush' | 'route
* import { clerkMiddleware } from '@clerk/nuxt/server'
*
* export default clerkMiddleware((event) => {
* console.log('auth', event.context.auth)
* console.log('auth', event.context.auth())
* })
* ```
*/
Expand Down Expand Up @@ -99,14 +99,18 @@ export default defineNuxtModule<ModuleOptions>({
});
}

// Adds TS support for `event.context.auth` in event handlers
// Adds TS support for `event.context.auth()` in event handlers
addTypeTemplate(
{
filename: 'types/clerk.d.ts',
getContents: () => `import type { AuthObject } from '@clerk/backend';
declare module 'h3' {
type AuthObjectHandler = AuthObject & {
(): AuthObject;
}

interface H3EventContext {
auth: AuthObject;
auth: AuthObjectHandler;
}
}
`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ describe('clerkMiddleware(params)', () => {
app.use(clerkMiddleware());
app.use(
'/',
eventHandler(event => event.context.auth),
eventHandler(event => event.context.auth()),
);
const response = await handler(new Request(new URL('/', 'http://localhost')));

Expand All @@ -56,7 +56,7 @@ describe('clerkMiddleware(params)', () => {
app.use(clerkMiddleware(MOCK_OPTIONS));
app.use(
'/',
eventHandler(event => event.context.auth),
eventHandler(event => event.context.auth()),
);
const response = await handler(new Request(new URL('/', 'http://localhost')));

Expand All @@ -75,7 +75,7 @@ describe('clerkMiddleware(params)', () => {
);
app.use(
'/',
eventHandler(event => event.context.auth),
eventHandler(event => event.context.auth()),
);
const response = await handler(new Request(new URL('/', 'http://localhost')));

Expand All @@ -94,7 +94,7 @@ describe('clerkMiddleware(params)', () => {
);
app.use(
'/',
eventHandler(event => event.context.auth),
eventHandler(event => event.context.auth()),
);
const response = await handler(new Request(new URL('/', 'http://localhost')));

Expand Down
13 changes: 12 additions & 1 deletion packages/nuxt/src/runtime/server/clerkMiddleware.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { AuthenticateRequestOptions } from '@clerk/backend/internal';
import { AuthStatus, constants } from '@clerk/backend/internal';
import { deprecated } from '@clerk/shared/deprecated';
import type { EventHandler } from 'h3';
import { createError, eventHandler, setResponseHeader } from 'h3';

Expand Down Expand Up @@ -98,7 +99,17 @@ export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]) => {
}

const authObject = requestState.toAuth();
event.context.auth = authObject;
const authHandler = () => authObject;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm planning to raise another PR after shipping this one, which it'll introduce some parameters to this authHandler

That's the whole reason we're doing this change as well, so having a function allow to perform custom logic against the auth object


const auth = new Proxy(Object.assign(authHandler, authObject), {
get(target, prop: string, receiver) {
deprecated('event.context.auth', 'Use `event.context.auth()` as a function instead.');

return Reflect.get(target, prop, receiver);
},
});

event.context.auth = auth;
// Internal serializable state that will be passed to the client
event.context.__clerk_initial_state = createInitialState(authObject);

Expand Down
6 changes: 4 additions & 2 deletions packages/nuxt/src/runtime/server/getAuth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ import type { H3Event } from 'h3';
import { moduleRegistrationRequired } from './errors';

export function getAuth(event: H3Event) {
if (!event.context.auth) {
const authObject = event.context.auth();

if (!authObject) {
throw new Error(moduleRegistrationRequired);
}

return event.context.auth;
return authObject;
}