Skip to content

Commit 79fff5a

Browse files
committed
fix(clerk-js,types): Remove experimental from checkAuthorization
1 parent 584c71c commit 79fff5a

File tree

11 files changed

+99
-73
lines changed

11 files changed

+99
-73
lines changed

packages/clerk-js/src/core/resources/Session.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ describe('Session', () => {
7373
updated_at: new Date().getTime(),
7474
} as SessionJSON);
7575

76-
const isAuthorized = await session.experimental__checkAuthorization({ permission: 'org:sys_profile:delete' });
76+
const isAuthorized = await session.checkAuthorization({ permission: 'org:sys_profile:delete' });
7777

7878
expect(isAuthorized).toBe(true);
7979
});
@@ -93,7 +93,7 @@ describe('Session', () => {
9393
updated_at: new Date().getTime(),
9494
} as SessionJSON);
9595

96-
const isAuthorized = await session.experimental__checkAuthorization({ permission: 'org:sys_profile:delete' });
96+
const isAuthorized = await session.checkAuthorization({ permission: 'org:sys_profile:delete' });
9797

9898
expect(isAuthorized).toBe(false);
9999
});

packages/clerk-js/src/core/resources/Session.ts

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,7 @@ export class Session extends BaseResource implements SessionResource {
7575
});
7676
};
7777

78-
/**
79-
* @experimental The method is experimental and subject to change in future releases.
80-
*/
81-
experimental__checkAuthorization: CheckAuthorization = params => {
78+
checkAuthorization: CheckAuthorization = params => {
8279
// if there is no active organization user can not be authorized
8380
if (!this.lastActiveOrganizationId || !this.user) {
8481
return false;
@@ -103,18 +100,6 @@ export class Session extends BaseResource implements SessionResource {
103100
return activeOrganizationRole === params.role;
104101
}
105102

106-
if (params.some) {
107-
return !!params.some.find(permObj => {
108-
if (permObj.permission) {
109-
return activeOrganizationPermissions.includes(permObj.permission);
110-
}
111-
if (permObj.role) {
112-
return activeOrganizationRole === permObj.role;
113-
}
114-
return false;
115-
});
116-
}
117-
118103
return false;
119104
};
120105

packages/clerk-js/src/ui.retheme/common/Gate.tsx

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,29 @@
11
import { useSession } from '@clerk/shared/react';
2-
import type { CheckAuthorization } from '@clerk/types';
2+
import type { CheckAuthorization, MembershipRole, OrganizationPermissionKey } from '@clerk/types';
33
import type { ComponentType, PropsWithChildren, ReactNode } from 'react';
44
import React, { useEffect } from 'react';
55

66
import { useRouter } from '../router';
77

8-
type GateParams = Parameters<CheckAuthorization>[0];
8+
type GateParams = Parameters<CheckAuthorization>[0] | ((has: CheckAuthorization) => boolean);
99
type GateProps = PropsWithChildren<
10-
GateParams & {
10+
(
11+
| {
12+
condition?: never;
13+
role: MembershipRole;
14+
permission?: never;
15+
}
16+
| {
17+
condition?: never;
18+
role?: never;
19+
permission: OrganizationPermissionKey;
20+
}
21+
| {
22+
condition: (has: CheckAuthorization) => boolean;
23+
role?: never;
24+
permission?: never;
25+
}
26+
) & {
1127
fallback?: ReactNode;
1228
redirectTo?: string;
1329
}
@@ -16,15 +32,31 @@ type GateProps = PropsWithChildren<
1632
export const useGate = (params: GateParams) => {
1733
const { session } = useSession();
1834

35+
if (!session?.id) {
36+
return { isAuthorizedUser: false };
37+
}
38+
39+
/**
40+
* if a function is passed and returns false then throw not found
41+
*/
42+
if (typeof params === 'function') {
43+
if (params(session.checkAuthorization)) {
44+
return { isAuthorizedUser: true };
45+
}
46+
return { isAuthorizedUser: false };
47+
}
48+
1949
return {
20-
isAuthorizedUser: session?.experimental__checkAuthorization(params),
50+
isAuthorizedUser: session?.checkAuthorization(params),
2151
};
2252
};
2353

2454
export const Gate = (gateProps: GateProps) => {
2555
const { children, fallback, redirectTo, ...restAuthorizedParams } = gateProps;
2656

27-
const { isAuthorizedUser } = useGate(restAuthorizedParams);
57+
const { isAuthorizedUser } = useGate(
58+
typeof restAuthorizedParams.condition === 'function' ? restAuthorizedParams.condition : restAuthorizedParams,
59+
);
2860

2961
const { navigate } = useRouter();
3062

packages/clerk-js/src/ui.retheme/components/OrganizationProfile/OrganizationProfileNavbar.tsx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,12 @@ export const OrganizationProfileNavbar = (
1414
const { organization } = useOrganization();
1515
const { pages } = useOrganizationProfileContext();
1616

17-
const { isAuthorizedUser: allowMembersRoute } = useGate({
18-
some: [
19-
{
17+
const { isAuthorizedUser: allowMembersRoute } = useGate(
18+
has =>
19+
has({
2020
permission: 'org:sys_memberships:read',
21-
},
22-
{
23-
permission: 'org:sys_memberships:manage',
24-
},
25-
],
26-
});
21+
}) || has({ permission: 'org:sys_memberships:manage' }),
22+
);
2723

2824
if (!organization) {
2925
return null;

packages/clerk-js/src/ui.retheme/components/OrganizationProfile/OrganizationProfileRoutes.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export const OrganizationProfileRoutes = (props: PropsOfComponent<typeof Profile
7777
</Route>
7878
<Route path=':id'>
7979
<Gate
80-
permission={'org:sys_domains:manage'}
80+
permission='org:sys_domains:manage'
8181
redirectTo='../../'
8282
>
8383
<VerifiedDomainPage />
@@ -130,8 +130,10 @@ export const OrganizationProfileRoutes = (props: PropsOfComponent<typeof Profile
130130
</Route>
131131
<Route index>
132132
<Gate
133-
some={[{ permission: 'org:sys_memberships:read' }, { permission: 'org:sys_memberships:manage' }]}
134-
redirectTo='./organization-settings'
133+
condition={has =>
134+
has({ permission: 'org:sys_memberships:read' }) || has({ permission: 'org:sys_memberships:manage' })
135+
}
136+
redirectTo={isSettingsPageRoot ? '../' : './organization-settings'}
135137
>
136138
<OrganizationMembers />
137139
</Gate>

packages/clerk-js/src/ui.retheme/utils/test/mockHelpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export const mockClerkMethods = (clerk: LoadedClerk): DeepJestMocked<LoadedClerk
3535
mockMethodsOf(clerk.client.signUp);
3636
clerk.client.sessions.forEach(session => {
3737
mockMethodsOf(session, {
38-
exclude: ['experimental__checkAuthorization'],
38+
exclude: ['checkAuthorization'],
3939
});
4040
mockMethodsOf(session.user);
4141
session.user?.emailAddresses.forEach(m => mockMethodsOf(m));

packages/clerk-js/src/ui/common/Gate.tsx

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,29 @@
11
import { useSession } from '@clerk/shared/react';
2-
import type { CheckAuthorization } from '@clerk/types';
2+
import type { CheckAuthorization, MembershipRole, OrganizationPermissionKey } from '@clerk/types';
33
import type { ComponentType, PropsWithChildren, ReactNode } from 'react';
44
import React, { useEffect } from 'react';
55

66
import { useRouter } from '../router';
77

8-
type GateParams = Parameters<CheckAuthorization>[0];
8+
type GateParams = Parameters<CheckAuthorization>[0] | ((has: CheckAuthorization) => boolean);
99
type GateProps = PropsWithChildren<
10-
GateParams & {
10+
(
11+
| {
12+
condition?: never;
13+
role: MembershipRole;
14+
permission?: never;
15+
}
16+
| {
17+
condition?: never;
18+
role?: never;
19+
permission: OrganizationPermissionKey;
20+
}
21+
| {
22+
condition: (has: CheckAuthorization) => boolean;
23+
role?: never;
24+
permission?: never;
25+
}
26+
) & {
1127
fallback?: ReactNode;
1228
redirectTo?: string;
1329
}
@@ -16,15 +32,31 @@ type GateProps = PropsWithChildren<
1632
export const useGate = (params: GateParams) => {
1733
const { session } = useSession();
1834

35+
if (!session?.id) {
36+
return { isAuthorizedUser: false };
37+
}
38+
39+
/**
40+
* if a function is passed and returns false then throw not found
41+
*/
42+
if (typeof params === 'function') {
43+
if (params(session.checkAuthorization)) {
44+
return { isAuthorizedUser: true };
45+
}
46+
return { isAuthorizedUser: false };
47+
}
48+
1949
return {
20-
isAuthorizedUser: session?.experimental__checkAuthorization(params),
50+
isAuthorizedUser: session?.checkAuthorization(params),
2151
};
2252
};
2353

2454
export const Gate = (gateProps: GateProps) => {
2555
const { children, fallback, redirectTo, ...restAuthorizedParams } = gateProps;
2656

27-
const { isAuthorizedUser } = useGate(restAuthorizedParams);
57+
const { isAuthorizedUser } = useGate(
58+
typeof restAuthorizedParams.condition === 'function' ? restAuthorizedParams.condition : restAuthorizedParams,
59+
);
2860

2961
const { navigate } = useRouter();
3062

packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationProfileNavbar.tsx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,12 @@ export const OrganizationProfileNavbar = (
1313
const { organization } = useOrganization();
1414
const { pages } = useOrganizationProfileContext();
1515

16-
const { isAuthorizedUser: allowMembersRoute } = useGate({
17-
some: [
18-
{
16+
const { isAuthorizedUser: allowMembersRoute } = useGate(
17+
has =>
18+
has({
1919
permission: 'org:sys_memberships:read',
20-
},
21-
{
22-
permission: 'org:sys_memberships:manage',
23-
},
24-
],
25-
});
20+
}) || has({ permission: 'org:sys_memberships:manage' }),
21+
);
2622

2723
if (!organization) {
2824
return null;

packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationProfileRoutes.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export const OrganizationProfileRoutes = (props: PropsOfComponent<typeof Profile
7777
</Route>
7878
<Route path=':id'>
7979
<Gate
80-
permission={'org:sys_domains:manage'}
80+
permission='org:sys_domains:manage'
8181
redirectTo='../../'
8282
>
8383
<VerifiedDomainPage />
@@ -130,7 +130,9 @@ export const OrganizationProfileRoutes = (props: PropsOfComponent<typeof Profile
130130
</Route>
131131
<Route index>
132132
<Gate
133-
some={[{ permission: 'org:sys_memberships:read' }, { permission: 'org:sys_memberships:manage' }]}
133+
condition={has =>
134+
has({ permission: 'org:sys_memberships:read' }) || has({ permission: 'org:sys_memberships:manage' })
135+
}
134136
redirectTo={isSettingsPageRoot ? '../' : './organization-settings'}
135137
>
136138
<OrganizationMembers />

packages/clerk-js/src/ui/utils/test/mockHelpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export const mockClerkMethods = (clerk: LoadedClerk): DeepJestMocked<LoadedClerk
3535
mockMethodsOf(clerk.client.signUp);
3636
clerk.client.sessions.forEach(session => {
3737
mockMethodsOf(session, {
38-
exclude: ['experimental__checkAuthorization'],
38+
exclude: ['checkAuthorization'],
3939
});
4040
mockMethodsOf(session.user);
4141
session.user?.emailAddresses.forEach(m => mockMethodsOf(m));

packages/types/src/session.ts

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,10 @@ export type CheckAuthorization = CheckAuthorizationFn<CheckAuthorizationParams>;
2828

2929
type CheckAuthorizationParams =
3030
| {
31-
some: (
32-
| {
33-
role: MembershipRole;
34-
permission?: never;
35-
}
36-
| {
37-
role?: never;
38-
permission: OrganizationPermissionKey;
39-
}
40-
)[];
41-
role?: never;
42-
permission?: never;
43-
}
44-
| {
45-
some?: never;
4631
role: MembershipRole;
4732
permission?: never;
4833
}
4934
| {
50-
some?: never;
5135
role?: never;
5236
permission: OrganizationPermissionKey;
5337
};
@@ -67,10 +51,7 @@ export interface SessionResource extends ClerkResource {
6751
remove: () => Promise<SessionResource>;
6852
touch: () => Promise<SessionResource>;
6953
getToken: GetToken;
70-
/**
71-
* @experimental The method is experimental and subject to change in future releases.
72-
*/
73-
experimental__checkAuthorization: CheckAuthorization;
54+
checkAuthorization: CheckAuthorization;
7455
clearCache: () => void;
7556
createdAt: Date;
7657
updatedAt: Date;

0 commit comments

Comments
 (0)