@workos-inc/authkit-nextjs 2.11.1 → 2.12.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/README.md CHANGED
@@ -209,6 +209,31 @@ export default function RootLayout({ children }: { children: React.ReactNode })
209
209
  }
210
210
  ```
211
211
 
212
+ #### Optimizing with Server-Side Auth Data
213
+
214
+ To avoid a server action call on mount, you can pass the initial auth data from the server to the `AuthKitProvider`.
215
+
216
+ ```jsx
217
+ import { AuthKitProvider } from '@workos-inc/authkit-nextjs/components';
218
+ import { withAuth } from '@workos-inc/authkit-nextjs';
219
+
220
+ export default async function RootLayout({ children }: { children: React.ReactNode }) {
221
+ // Fetch auth data on the server
222
+ const auth = await withAuth();
223
+
224
+ // Remove the accessToken from the auth object as it is not needed on the client side
225
+ const { accessToken, ...initialAuth } = auth;
226
+
227
+ return (
228
+ <html lang="en">
229
+ <body>
230
+ <AuthKitProvider initialAuth={initialAuth}>{children}</AuthKitProvider>
231
+ </body>
232
+ </html>
233
+ );
234
+ }
235
+ ```
236
+
212
237
  ### Get the current user in a server component
213
238
 
214
239
  For pages where you want to display a signed-in and signed-out view, use `withAuth` to retrieve the user session from WorkOS.
@@ -2,17 +2,18 @@
2
2
  import React, { createContext, useCallback, useContext, useEffect, useState } from 'react';
3
3
  import { checkSessionAction, getAuthAction, handleSignOutAction, refreshAuthAction, switchToOrganizationAction, } from '../actions.js';
4
4
  const AuthContext = createContext(undefined);
5
- export const AuthKitProvider = ({ children, onSessionExpired }) => {
6
- const [user, setUser] = useState(null);
7
- const [sessionId, setSessionId] = useState(undefined);
8
- const [organizationId, setOrganizationId] = useState(undefined);
9
- const [role, setRole] = useState(undefined);
10
- const [roles, setRoles] = useState(undefined);
11
- const [permissions, setPermissions] = useState(undefined);
12
- const [entitlements, setEntitlements] = useState(undefined);
13
- const [featureFlags, setFeatureFlags] = useState(undefined);
14
- const [impersonator, setImpersonator] = useState(undefined);
15
- const [loading, setLoading] = useState(true);
5
+ export const AuthKitProvider = ({ children, onSessionExpired, initialAuth }) => {
6
+ var _a;
7
+ const [user, setUser] = useState((_a = initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.user) !== null && _a !== void 0 ? _a : null);
8
+ const [sessionId, setSessionId] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.sessionId);
9
+ const [organizationId, setOrganizationId] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.organizationId);
10
+ const [role, setRole] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.role);
11
+ const [roles, setRoles] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.roles);
12
+ const [permissions, setPermissions] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.permissions);
13
+ const [entitlements, setEntitlements] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.entitlements);
14
+ const [featureFlags, setFeatureFlags] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.featureFlags);
15
+ const [impersonator, setImpersonator] = useState(initialAuth === null || initialAuth === void 0 ? void 0 : initialAuth.impersonator);
16
+ const [loading, setLoading] = useState(!initialAuth);
16
17
  const getAuth = useCallback(async ({ ensureSignedIn = false } = {}) => {
17
18
  setLoading(true);
18
19
  try {
@@ -78,7 +79,9 @@ export const AuthKitProvider = ({ children, onSessionExpired }) => {
78
79
  await handleSignOutAction({ returnTo });
79
80
  }, []);
80
81
  useEffect(() => {
81
- getAuth();
82
+ if (!initialAuth) {
83
+ getAuth();
84
+ }
82
85
  // Return early if the session expired checks are disabled.
83
86
  if (onSessionExpired === false) {
84
87
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"authkit-provider.js","sourceRoot":"","sources":["../../../src/components/authkit-provider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authkit-provider.js","sourceRoot":"","sources":["../../../src/components/authkit-provider.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import React, { ReactNode } from 'react';
2
2
  import type { Impersonator, User } from '@workos-inc/node';
3
- import type { UserInfo, SwitchToOrganizationOptions } from '../interfaces.js';
3
+ import type { UserInfo, SwitchToOrganizationOptions, NoUserInfo } from '../interfaces.js';
4
4
  type AuthContextType = {
5
5
  user: User | null;
6
6
  sessionId: string | undefined;
@@ -35,8 +35,12 @@ interface AuthKitProviderProps {
35
35
  * You can also pass this as `false` to disable the expired session checks.
36
36
  */
37
37
  onSessionExpired?: false | (() => void);
38
+ /**
39
+ * Initial auth data from the server. If provided, the provider will skip the initial client-side fetch.
40
+ */
41
+ initialAuth?: Omit<UserInfo | NoUserInfo, 'accessToken'>;
38
42
  }
39
- export declare const AuthKitProvider: ({ children, onSessionExpired }: AuthKitProviderProps) => React.JSX.Element;
43
+ export declare const AuthKitProvider: ({ children, onSessionExpired, initialAuth }: AuthKitProviderProps) => React.JSX.Element;
40
44
  export declare function useAuth(options: {
41
45
  ensureSignedIn: true;
42
46
  }): AuthContextType & ({
@@ -1,5 +1,5 @@
1
1
  import { WorkOS } from '@workos-inc/node';
2
- export declare const VERSION = "2.11.1";
2
+ export declare const VERSION = "2.12.0";
3
3
  /**
4
4
  * Create a WorkOS instance with the provided API key and options.
5
5
  * If an instance already exists, it returns the existing instance.
@@ -1,7 +1,7 @@
1
1
  import { WorkOS } from '@workos-inc/node';
2
2
  import { WORKOS_API_HOSTNAME, WORKOS_API_KEY, WORKOS_API_HTTPS, WORKOS_API_PORT } from './env-variables.js';
3
3
  import { lazy } from './utils.js';
4
- export const VERSION = '2.11.1';
4
+ export const VERSION = '2.12.0';
5
5
  const options = {
6
6
  apiHostname: WORKOS_API_HOSTNAME,
7
7
  https: WORKOS_API_HTTPS ? WORKOS_API_HTTPS === 'true' : true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workos-inc/authkit-nextjs",
3
- "version": "2.11.1",
3
+ "version": "2.12.0",
4
4
  "description": "Authentication and session helpers for using WorkOS & AuthKit with Next.js",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -35,6 +35,121 @@ describe('AuthKitProvider', () => {
35
35
  expect(getByText('Test Child')).toBeInTheDocument();
36
36
  });
37
37
 
38
+ it('should skip initial getAuthAction call when initialAuth is provided', async () => {
39
+ const initialAuth = {
40
+ user: {
41
+ id: 'user-123',
42
+ email: 'test@example.com',
43
+ emailVerified: true,
44
+ profilePictureUrl: null,
45
+ firstName: 'Test',
46
+ lastName: 'User',
47
+ object: 'user' as const,
48
+ createdAt: '2024-01-01T00:00:00Z',
49
+ updatedAt: '2024-01-01T00:00:00Z',
50
+ lastSignInAt: '2024-01-01T00:00:00Z',
51
+ externalId: null,
52
+ locale: 'en-US',
53
+ metadata: {},
54
+ },
55
+ sessionId: 'test-session',
56
+ organizationId: 'test-org',
57
+ role: 'admin',
58
+ roles: ['admin'],
59
+ permissions: ['read', 'write'],
60
+ entitlements: ['feature1'],
61
+ featureFlags: ['test-flag'],
62
+ impersonator: undefined,
63
+ };
64
+
65
+ render(
66
+ <AuthKitProvider initialAuth={initialAuth}>
67
+ <div>Test Child</div>
68
+ </AuthKitProvider>,
69
+ );
70
+
71
+ // Wait a bit to ensure no call is made
72
+ await waitFor(
73
+ () => {
74
+ expect(getAuthAction).not.toHaveBeenCalled();
75
+ },
76
+ { timeout: 100 },
77
+ );
78
+ });
79
+
80
+ it('should initialize state with initialAuth values', async () => {
81
+ const initialAuth = {
82
+ user: {
83
+ id: 'user-123',
84
+ email: 'test@example.com',
85
+ emailVerified: true,
86
+ profilePictureUrl: null,
87
+ firstName: 'Test',
88
+ lastName: 'User',
89
+ object: 'user' as const,
90
+ createdAt: '2024-01-01T00:00:00Z',
91
+ updatedAt: '2024-01-01T00:00:00Z',
92
+ lastSignInAt: '2024-01-01T00:00:00Z',
93
+ locale: 'en-US',
94
+ externalId: null,
95
+ metadata: {},
96
+ },
97
+ sessionId: 'test-session',
98
+ organizationId: 'test-org',
99
+ role: 'admin',
100
+ roles: ['admin'],
101
+ permissions: ['read', 'write'],
102
+ entitlements: ['feature1'],
103
+ featureFlags: ['test-flag'],
104
+ impersonator: { email: 'admin@example.com', reason: 'Support request' },
105
+ };
106
+
107
+ const TestComponent = () => {
108
+ const auth = useAuth();
109
+ return (
110
+ <div>
111
+ <div data-testid="loading">{auth.loading.toString()}</div>
112
+ <div data-testid="email">{auth.user?.email}</div>
113
+ <div data-testid="session">{auth.sessionId}</div>
114
+ <div data-testid="org">{auth.organizationId}</div>
115
+ <div data-testid="role">{auth.role}</div>
116
+ <div data-testid="impersonator">{auth.impersonator?.email}</div>
117
+ </div>
118
+ );
119
+ };
120
+
121
+ const { getByTestId } = render(
122
+ <AuthKitProvider initialAuth={initialAuth}>
123
+ <TestComponent />
124
+ </AuthKitProvider>,
125
+ );
126
+
127
+ // Should not be loading when initialAuth is provided
128
+ expect(getByTestId('loading')).toHaveTextContent('false');
129
+ expect(getByTestId('email')).toHaveTextContent('test@example.com');
130
+ expect(getByTestId('session')).toHaveTextContent('test-session');
131
+ expect(getByTestId('org')).toHaveTextContent('test-org');
132
+ expect(getByTestId('role')).toHaveTextContent('admin');
133
+ expect(getByTestId('impersonator')).toHaveTextContent('admin@example.com');
134
+ });
135
+
136
+ it('should call getAuthAction when initialAuth is not provided', async () => {
137
+ (getAuthAction as jest.Mock).mockResolvedValueOnce({
138
+ user: { email: 'test@example.com' },
139
+ sessionId: 'test-session',
140
+ });
141
+
142
+ render(
143
+ <AuthKitProvider>
144
+ <div>Test Child</div>
145
+ </AuthKitProvider>,
146
+ );
147
+
148
+ await waitFor(() => {
149
+ expect(getAuthAction).toHaveBeenCalledTimes(1);
150
+ });
151
+ });
152
+
38
153
  it('should do nothing if onSessionExpired is false', async () => {
39
154
  jest.spyOn(window, 'addEventListener');
40
155
 
@@ -9,7 +9,7 @@ import {
9
9
  switchToOrganizationAction,
10
10
  } from '../actions.js';
11
11
  import type { Impersonator, User } from '@workos-inc/node';
12
- import type { UserInfo, SwitchToOrganizationOptions } from '../interfaces.js';
12
+ import type { UserInfo, SwitchToOrganizationOptions, NoUserInfo } from '../interfaces.js';
13
13
 
14
14
  type AuthContextType = {
15
15
  user: User | null;
@@ -40,19 +40,23 @@ interface AuthKitProviderProps {
40
40
  * You can also pass this as `false` to disable the expired session checks.
41
41
  */
42
42
  onSessionExpired?: false | (() => void);
43
+ /**
44
+ * Initial auth data from the server. If provided, the provider will skip the initial client-side fetch.
45
+ */
46
+ initialAuth?: Omit<UserInfo | NoUserInfo, 'accessToken'>;
43
47
  }
44
48
 
45
- export const AuthKitProvider = ({ children, onSessionExpired }: AuthKitProviderProps) => {
46
- const [user, setUser] = useState<User | null>(null);
47
- const [sessionId, setSessionId] = useState<string | undefined>(undefined);
48
- const [organizationId, setOrganizationId] = useState<string | undefined>(undefined);
49
- const [role, setRole] = useState<string | undefined>(undefined);
50
- const [roles, setRoles] = useState<string[] | undefined>(undefined);
51
- const [permissions, setPermissions] = useState<string[] | undefined>(undefined);
52
- const [entitlements, setEntitlements] = useState<string[] | undefined>(undefined);
53
- const [featureFlags, setFeatureFlags] = useState<string[] | undefined>(undefined);
54
- const [impersonator, setImpersonator] = useState<Impersonator | undefined>(undefined);
55
- const [loading, setLoading] = useState(true);
49
+ export const AuthKitProvider = ({ children, onSessionExpired, initialAuth }: AuthKitProviderProps) => {
50
+ const [user, setUser] = useState<User | null>(initialAuth?.user ?? null);
51
+ const [sessionId, setSessionId] = useState<string | undefined>(initialAuth?.sessionId);
52
+ const [organizationId, setOrganizationId] = useState<string | undefined>(initialAuth?.organizationId);
53
+ const [role, setRole] = useState<string | undefined>(initialAuth?.role);
54
+ const [roles, setRoles] = useState<string[] | undefined>(initialAuth?.roles);
55
+ const [permissions, setPermissions] = useState<string[] | undefined>(initialAuth?.permissions);
56
+ const [entitlements, setEntitlements] = useState<string[] | undefined>(initialAuth?.entitlements);
57
+ const [featureFlags, setFeatureFlags] = useState<string[] | undefined>(initialAuth?.featureFlags);
58
+ const [impersonator, setImpersonator] = useState<Impersonator | undefined>(initialAuth?.impersonator);
59
+ const [loading, setLoading] = useState(!initialAuth);
56
60
 
57
61
  const getAuth = useCallback(async ({ ensureSignedIn = false }: { ensureSignedIn?: boolean } = {}) => {
58
62
  setLoading(true);
@@ -128,7 +132,9 @@ export const AuthKitProvider = ({ children, onSessionExpired }: AuthKitProviderP
128
132
  }, []);
129
133
 
130
134
  useEffect(() => {
131
- getAuth();
135
+ if (!initialAuth) {
136
+ getAuth();
137
+ }
132
138
 
133
139
  // Return early if the session expired checks are disabled.
134
140
  if (onSessionExpired === false) {
package/src/workos.ts CHANGED
@@ -2,7 +2,7 @@ import { WorkOS } from '@workos-inc/node';
2
2
  import { WORKOS_API_HOSTNAME, WORKOS_API_KEY, WORKOS_API_HTTPS, WORKOS_API_PORT } from './env-variables.js';
3
3
  import { lazy } from './utils.js';
4
4
 
5
- export const VERSION = '2.11.1';
5
+ export const VERSION = '2.12.0';
6
6
 
7
7
  const options = {
8
8
  apiHostname: WORKOS_API_HOSTNAME,