@studiocubics/cms 0.0.1 → 0.0.3

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.
Files changed (244) hide show
  1. package/dist/clerk/actions/invitations.d.ts +6 -0
  2. package/dist/clerk/actions/invitations.js +59 -0
  3. package/dist/clerk/actions/invitations.js.map +1 -0
  4. package/dist/clerk/actions/systemUsers.d.ts +8 -0
  5. package/dist/clerk/actions/systemUsers.js +64 -0
  6. package/dist/clerk/actions/systemUsers.js.map +1 -0
  7. package/dist/clerk/auth.d.ts +8 -0
  8. package/dist/clerk/auth.js +21 -0
  9. package/dist/clerk/auth.js.map +1 -0
  10. package/dist/clerk/hasPermission.d.ts +33 -0
  11. package/dist/clerk/hasPermission.js +78 -0
  12. package/dist/clerk/hasPermission.js.map +1 -0
  13. package/dist/clerk/rbacConfig.d.ts +31 -0
  14. package/dist/clerk/rbacConfig.js +48 -0
  15. package/dist/clerk/rbacConfig.js.map +1 -0
  16. package/dist/clerk/schemas/invitation.d.ts +12 -0
  17. package/dist/clerk/schemas/invitation.js +20 -0
  18. package/dist/clerk/schemas/invitation.js.map +1 -0
  19. package/dist/clerk/schemas/systemUser.d.ts +6 -0
  20. package/dist/clerk/toClientSafeUser.d.ts +48 -0
  21. package/dist/clerk/toClientSafeUser.js +46 -0
  22. package/dist/clerk/toClientSafeUser.js.map +1 -0
  23. package/dist/constants/defaults.d.ts +6 -0
  24. package/dist/constants/defaults.js +56 -0
  25. package/dist/constants/defaults.js.map +1 -0
  26. package/dist/constants/pageLimits.d.ts +2 -0
  27. package/dist/constants/pageLimits.js +5 -0
  28. package/dist/constants/pageLimits.js.map +1 -0
  29. package/dist/index.css +215 -0
  30. package/dist/index.js +45 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/providers/CMSRootProviders.d.ts +4 -0
  33. package/dist/providers/CMSRootProviders.js +11 -0
  34. package/dist/providers/CMSRootProviders.js.map +1 -0
  35. package/dist/ui/Inputs/ThemedMonacoEditor/ThemedMonacoEditor.d.ts +2 -0
  36. package/dist/ui/Inputs/ThemedMonacoEditor/ThemedMonacoEditor.js +13 -0
  37. package/dist/ui/Inputs/ThemedMonacoEditor/ThemedMonacoEditor.js.map +1 -0
  38. package/dist/ui/Inputs/ThemedMonacoEditor/ThemedMonacoEditor.module.css.js +4 -0
  39. package/dist/ui/Inputs/ThemedMonacoEditor/ThemedMonacoEditor.module.css.js.map +1 -0
  40. package/dist/ui/Layout/CMSSecurityLayout.d.ts +2 -0
  41. package/dist/ui/Layout/CMSSecurityLayout.js +18 -0
  42. package/dist/ui/Layout/CMSSecurityLayout.js.map +1 -0
  43. package/dist/ui/Layout/CMSSidebar/CMSSidebar.d.ts +6 -0
  44. package/dist/ui/Layout/CMSSidebar/CMSSidebar.js +15 -0
  45. package/dist/ui/Layout/CMSSidebar/CMSSidebar.js.map +1 -0
  46. package/dist/ui/Layout/CMSSidebar/CMSSidebarBody.d.ts +4 -0
  47. package/dist/ui/Layout/CMSSidebar/CMSSidebarBody.js +18 -0
  48. package/dist/ui/Layout/CMSSidebar/CMSSidebarBody.js.map +1 -0
  49. package/dist/ui/Layout/CMSSidebar/CMSSidebarFooter/CMSSidebarFooter.d.ts +1 -0
  50. package/dist/ui/Layout/CMSSidebar/CMSSidebarFooter/CMSSidebarFooter.js +39 -0
  51. package/dist/ui/Layout/CMSSidebar/CMSSidebarFooter/CMSSidebarFooter.js.map +1 -0
  52. package/dist/ui/Layout/CMSSidebar/CMSSidebarFooter/CMSSidebarFooter.module.css.js +4 -0
  53. package/dist/ui/Layout/CMSSidebar/CMSSidebarFooter/CMSSidebarFooter.module.css.js.map +1 -0
  54. package/dist/ui/Layout/CMSSidebar/CMSSidebarHeader/CMSSidebarHeader.d.ts +1 -0
  55. package/dist/ui/Layout/CMSSidebar/CMSSidebarHeader/CMSSidebarHeader.js +16 -0
  56. package/dist/ui/Layout/CMSSidebar/CMSSidebarHeader/CMSSidebarHeader.js.map +1 -0
  57. package/dist/ui/Layout/CMSSidebar/CMSSidebarHeader/CMSSidebarHeader.module.css.js +4 -0
  58. package/dist/ui/Layout/CMSSidebar/CMSSidebarHeader/CMSSidebarHeader.module.css.js.map +1 -0
  59. package/dist/ui/Layout/_index.d.ts +2 -0
  60. package/dist/ui/System/Auth/SignIn/SignIn.d.ts +1 -0
  61. package/dist/ui/System/Auth/SignIn/SignIn.js +28 -0
  62. package/dist/ui/System/Auth/SignIn/SignIn.js.map +1 -0
  63. package/dist/ui/System/Auth/SignIn/SignIn.module.css.js +4 -0
  64. package/dist/ui/System/Auth/SignIn/SignIn.module.css.js.map +1 -0
  65. package/dist/ui/System/Auth/SignIn/useSignInForm.d.ts +14 -0
  66. package/dist/ui/System/Auth/SignIn/useSignInForm.js +46 -0
  67. package/dist/ui/System/Auth/SignIn/useSignInForm.js.map +1 -0
  68. package/dist/ui/System/Auth/SignUp/SignUp.d.ts +1 -0
  69. package/dist/ui/System/Auth/SignUp/SignUp.js +36 -0
  70. package/dist/ui/System/Auth/SignUp/SignUp.js.map +1 -0
  71. package/dist/ui/System/Auth/SignUp/SignUp.module.css.js +4 -0
  72. package/dist/ui/System/Auth/SignUp/SignUp.module.css.js.map +1 -0
  73. package/dist/ui/System/Auth/SignUp/useSignUpForm.d.ts +19 -0
  74. package/dist/ui/System/Auth/SignUp/useSignUpForm.js +58 -0
  75. package/dist/ui/System/Auth/SignUp/useSignUpForm.js.map +1 -0
  76. package/dist/ui/System/Invitations/InvitationList.d.ts +1 -0
  77. package/dist/ui/System/Invitations/InvitationList.js +11 -0
  78. package/dist/ui/System/Invitations/InvitationList.js.map +1 -0
  79. package/dist/ui/System/Invitations/InvitationListActions.d.ts +11 -0
  80. package/dist/ui/System/Invitations/InvitationListActions.js +39 -0
  81. package/dist/ui/System/Invitations/InvitationListActions.js.map +1 -0
  82. package/dist/ui/System/Invitations/InvitationListCard.d.ts +4 -0
  83. package/dist/ui/System/Invitations/InvitationListCard.js +16 -0
  84. package/dist/ui/System/Invitations/InvitationListCard.js.map +1 -0
  85. package/dist/ui/System/Invitations/InvitationListPage.d.ts +2 -0
  86. package/dist/ui/System/Invitations/InvitationListPage.js +22 -0
  87. package/dist/ui/System/Invitations/InvitationListPage.js.map +1 -0
  88. package/dist/ui/System/Invitations/InvitationListPagination.d.ts +4 -0
  89. package/dist/ui/System/Invitations/InvitationListPagination.js +11 -0
  90. package/dist/ui/System/Invitations/InvitationListPagination.js.map +1 -0
  91. package/dist/ui/System/Permissions/RoleListCard.d.ts +6 -0
  92. package/dist/ui/System/Permissions/RoleListCard.js +11 -0
  93. package/dist/ui/System/Permissions/RoleListCard.js.map +1 -0
  94. package/dist/ui/System/Permissions/RolePermissionsPage.d.ts +4 -0
  95. package/dist/ui/System/Permissions/RolePermissionsPage.js +14 -0
  96. package/dist/ui/System/Permissions/RolePermissionsPage.js.map +1 -0
  97. package/dist/ui/System/Permissions/RolePermissionsTable.d.ts +2 -0
  98. package/dist/ui/System/Permissions/RolePermissionsTable.js +28 -0
  99. package/dist/ui/System/Permissions/RolePermissionsTable.js.map +1 -0
  100. package/dist/ui/System/SystemUser/CurrentSystemUserButton/CurrentSystemUserButton.d.ts +5 -0
  101. package/dist/ui/System/SystemUser/CurrentSystemUserButton/CurrentSystemUserButton.js +31 -0
  102. package/dist/ui/System/SystemUser/CurrentSystemUserButton/CurrentSystemUserButton.js.map +1 -0
  103. package/dist/ui/System/SystemUser/CurrentSystemUserButton/CurrentSystemUserButton.module.css.js +4 -0
  104. package/dist/ui/System/SystemUser/CurrentSystemUserButton/CurrentSystemUserButton.module.css.js.map +1 -0
  105. package/dist/ui/System/SystemUser/CurrentSystemUserPage.d.ts +1 -0
  106. package/dist/ui/System/SystemUser/CurrentSystemUserPage.js +17 -0
  107. package/dist/ui/System/SystemUser/CurrentSystemUserPage.js.map +1 -0
  108. package/dist/ui/System/SystemUser/SystemUserActions.d.ts +6 -0
  109. package/dist/ui/System/SystemUser/SystemUserActions.js +14 -0
  110. package/dist/ui/System/SystemUser/SystemUserActions.js.map +1 -0
  111. package/dist/ui/System/SystemUser/SystemUserDetails/SystemUserDetails.d.ts +12 -0
  112. package/dist/ui/System/SystemUser/SystemUserDetails/SystemUserDetails.js +16 -0
  113. package/dist/ui/System/SystemUser/SystemUserDetails/SystemUserDetails.js.map +1 -0
  114. package/dist/ui/System/SystemUser/SystemUserDetails/SystemUserDetails.module.css.js +4 -0
  115. package/dist/ui/System/SystemUser/SystemUserDetails/SystemUserDetails.module.css.js.map +1 -0
  116. package/dist/ui/System/SystemUser/SystemUserDetailsForm/SystemUserDetailsForm.d.ts +11 -0
  117. package/dist/ui/System/SystemUser/SystemUserDetailsForm/SystemUserDetailsForm.js +26 -0
  118. package/dist/ui/System/SystemUser/SystemUserDetailsForm/SystemUserDetailsForm.js.map +1 -0
  119. package/dist/ui/System/SystemUser/SystemUserDetailsForm/SystemUserDetailsForm.module.css.js +4 -0
  120. package/dist/ui/System/SystemUser/SystemUserDetailsForm/SystemUserDetailsForm.module.css.js.map +1 -0
  121. package/dist/ui/System/SystemUser/SystemUserList.d.ts +1 -0
  122. package/dist/ui/System/SystemUser/SystemUserList.js +11 -0
  123. package/dist/ui/System/SystemUser/SystemUserList.js.map +1 -0
  124. package/dist/ui/System/SystemUser/SystemUserListActions.d.ts +1 -0
  125. package/dist/ui/System/SystemUser/SystemUserListActions.js +11 -0
  126. package/dist/ui/System/SystemUser/SystemUserListActions.js.map +1 -0
  127. package/dist/ui/System/SystemUser/SystemUserListCard.d.ts +11 -0
  128. package/dist/ui/System/SystemUser/SystemUserListCard.js +34 -0
  129. package/dist/ui/System/SystemUser/SystemUserListCard.js.map +1 -0
  130. package/dist/ui/System/SystemUser/SystemUserListPage.d.ts +2 -0
  131. package/dist/ui/System/SystemUser/SystemUserListPage.js +24 -0
  132. package/dist/ui/System/SystemUser/SystemUserListPage.js.map +1 -0
  133. package/dist/ui/System/SystemUser/SystemUserListPagination.d.ts +4 -0
  134. package/dist/ui/System/SystemUser/SystemUserListPagination.js +11 -0
  135. package/dist/ui/System/SystemUser/SystemUserListPagination.js.map +1 -0
  136. package/dist/ui/System/SystemUser/SystemUserPage.d.ts +1 -0
  137. package/dist/ui/System/SystemUser/SystemUserPage.js +17 -0
  138. package/dist/ui/System/SystemUser/SystemUserPage.js.map +1 -0
  139. package/dist/ui/System/SystemUser/SystemUserPageContent.d.ts +5 -0
  140. package/dist/ui/System/SystemUser/SystemUserPageContent.js +13 -0
  141. package/dist/ui/System/SystemUser/SystemUserPageContent.js.map +1 -0
  142. package/dist/ui/System/SystemUser/SystemUserRole/SystemUserRole.d.ts +6 -0
  143. package/dist/ui/System/SystemUser/SystemUserRole/SystemUserRole.js +21 -0
  144. package/dist/ui/System/SystemUser/SystemUserRole/SystemUserRole.js.map +1 -0
  145. package/dist/ui/System/SystemUser/SystemUserRole/SystemUserRole.module.css.js +4 -0
  146. package/dist/ui/System/SystemUser/SystemUserRole/SystemUserRole.module.css.js.map +1 -0
  147. package/dist/ui/System/SystemUser/SystemUserRoleForm/SystemUserRoleForm.d.ts +9 -0
  148. package/dist/ui/System/SystemUser/SystemUserRoleForm/SystemUserRoleForm.js +19 -0
  149. package/dist/ui/System/SystemUser/SystemUserRoleForm/SystemUserRoleForm.js.map +1 -0
  150. package/dist/ui/System/SystemUser/SystemUserTimestamps.d.ts +9 -0
  151. package/dist/ui/System/SystemUser/SystemUserTimestamps.js +27 -0
  152. package/dist/ui/System/SystemUser/SystemUserTimestamps.js.map +1 -0
  153. package/dist/ui/System/WelcomePage/WelcomePage.d.ts +1 -0
  154. package/dist/ui/System/WelcomePage/WelcomePage.js +16 -0
  155. package/dist/ui/System/WelcomePage/WelcomePage.js.map +1 -0
  156. package/dist/ui/System/WelcomePage/WelcomePage.module.css.js +4 -0
  157. package/dist/ui/System/WelcomePage/WelcomePage.module.css.js.map +1 -0
  158. package/{src/ui/System/types.ts → dist/ui/System/types.d.ts} +3 -5
  159. package/dist/utils/proxyFunctions.d.ts +4 -0
  160. package/dist/utils/proxyFunctions.js +34 -0
  161. package/dist/utils/proxyFunctions.js.map +1 -0
  162. package/package.json +14 -16
  163. package/rollup.config.js +1 -1
  164. package/.turbo/turbo-build.log +0 -7
  165. package/CHANGELOG.md +0 -12
  166. package/eslint.config.js +0 -21
  167. package/src/clerk/actions/invitations.ts +0 -78
  168. package/src/clerk/actions/systemUsers.ts +0 -94
  169. package/src/clerk/auth.ts +0 -34
  170. package/src/clerk/clerk.d.ts +0 -105
  171. package/src/clerk/hasPermission.ts +0 -96
  172. package/src/clerk/rbacConfig.ts +0 -68
  173. package/src/clerk/schemas/invitation.ts +0 -17
  174. package/src/clerk/schemas/systemUser.ts +0 -16
  175. package/src/clerk/toClientSafeUser.ts +0 -77
  176. package/src/constants/defaults.tsx +0 -62
  177. package/src/constants/pageLimits.ts +0 -2
  178. package/src/declaration.d.ts +0 -5
  179. package/src/providers/CMSRootProviders.tsx +0 -13
  180. package/src/routes.d.ts +0 -96
  181. package/src/ui/Inputs/ThemedMonacoEditor/ThemedMonacoEditor.module.css +0 -4
  182. package/src/ui/Inputs/ThemedMonacoEditor/ThemedMonacoEditor.tsx +0 -16
  183. package/src/ui/Layout/CMSSecurityLayout.tsx +0 -27
  184. package/src/ui/Layout/CMSSidebar/CMSSidebar.tsx +0 -39
  185. package/src/ui/Layout/CMSSidebar/CMSSidebarBody.tsx +0 -43
  186. package/src/ui/Layout/CMSSidebar/CMSSidebarFooter/CMSSidebarFooter.module.css +0 -7
  187. package/src/ui/Layout/CMSSidebar/CMSSidebarFooter/CMSSidebarFooter.tsx +0 -59
  188. package/src/ui/Layout/CMSSidebar/CMSSidebarHeader/CMSSidebarHeader.module.css +0 -44
  189. package/src/ui/Layout/CMSSidebar/CMSSidebarHeader/CMSSidebarHeader.tsx +0 -30
  190. package/src/ui/Layout/_index.ts +0 -2
  191. package/src/ui/System/Auth/SignIn/SignIn.module.css +0 -50
  192. package/src/ui/System/Auth/SignIn/SignIn.tsx +0 -79
  193. package/src/ui/System/Auth/SignIn/useSignInForm.tsx +0 -42
  194. package/src/ui/System/Auth/SignUp/SignUp.module.css +0 -48
  195. package/src/ui/System/Auth/SignUp/SignUp.tsx +0 -138
  196. package/src/ui/System/Auth/SignUp/useSignUpForm.tsx +0 -54
  197. package/src/ui/System/Invitations/InvitationList.tsx +0 -9
  198. package/src/ui/System/Invitations/InvitationListActions.tsx +0 -167
  199. package/src/ui/System/Invitations/InvitationListCard.tsx +0 -79
  200. package/src/ui/System/Invitations/InvitationListPage.tsx +0 -32
  201. package/src/ui/System/Invitations/InvitationListPagination.tsx +0 -19
  202. package/src/ui/System/Permissions/RoleListCard.tsx +0 -33
  203. package/src/ui/System/Permissions/RolePermissionsPage.tsx +0 -18
  204. package/src/ui/System/Permissions/RolePermissionsTable.tsx +0 -36
  205. package/src/ui/System/SystemUser/CurrentSystemUserButton/CurrentSystemUserButton.module.css +0 -5
  206. package/src/ui/System/SystemUser/CurrentSystemUserButton/CurrentSystemUserButton.tsx +0 -102
  207. package/src/ui/System/SystemUser/CurrentSystemUserPage.tsx +0 -12
  208. package/src/ui/System/SystemUser/SystemUserActions.tsx +0 -45
  209. package/src/ui/System/SystemUser/SystemUserDetails/SystemUserDetails.module.css +0 -6
  210. package/src/ui/System/SystemUser/SystemUserDetails/SystemUserDetails.tsx +0 -71
  211. package/src/ui/System/SystemUser/SystemUserDetailsForm/SystemUserDetailsForm.module.css +0 -7
  212. package/src/ui/System/SystemUser/SystemUserDetailsForm/SystemUserDetailsForm.tsx +0 -114
  213. package/src/ui/System/SystemUser/SystemUserList.tsx +0 -18
  214. package/src/ui/System/SystemUser/SystemUserListActions.tsx +0 -17
  215. package/src/ui/System/SystemUser/SystemUserListCard.tsx +0 -85
  216. package/src/ui/System/SystemUser/SystemUserListPage.tsx +0 -33
  217. package/src/ui/System/SystemUser/SystemUserListPagination.tsx +0 -19
  218. package/src/ui/System/SystemUser/SystemUserPage.tsx +0 -30
  219. package/src/ui/System/SystemUser/SystemUserPageContent.tsx +0 -54
  220. package/src/ui/System/SystemUser/SystemUserRole/SystemUserRole.module.css +0 -17
  221. package/src/ui/System/SystemUser/SystemUserRole/SystemUserRole.tsx +0 -64
  222. package/src/ui/System/SystemUser/SystemUserRoleForm/SystemUserRoleForm.tsx +0 -51
  223. package/src/ui/System/SystemUser/SystemUserTimestamps.tsx +0 -56
  224. package/src/ui/System/WelcomePage/WelcomePage.module.css +0 -18
  225. package/src/ui/System/WelcomePage/WelcomePage.tsx +0 -43
  226. package/src/utils/proxyFunctions.ts +0 -37
  227. package/tsconfig.json +0 -32
  228. /package/{src/clerk/_index.ts → dist/clerk/_index.d.ts} +0 -0
  229. /package/{src/clerk/actions/_index.ts → dist/clerk/actions/_index.d.ts} +0 -0
  230. /package/{src/clerk/schemas/_index.ts → dist/clerk/schemas/_index.d.ts} +0 -0
  231. /package/{src/constants/_index.ts → dist/constants/_index.d.ts} +0 -0
  232. /package/{src/index.ts → dist/index.d.ts} +0 -0
  233. /package/{src/providers/_index.ts → dist/providers/_index.d.ts} +0 -0
  234. /package/{src/ui/Inputs/_index.ts → dist/ui/Inputs/_index.d.ts} +0 -0
  235. /package/{src/ui/Layout/CMSSidebar/_index.ts → dist/ui/Layout/CMSSidebar/_index.d.ts} +0 -0
  236. /package/{src/ui/System/Auth/SignIn/_index.ts → dist/ui/System/Auth/SignIn/_index.d.ts} +0 -0
  237. /package/{src/ui/System/Auth/SignUp/_index.ts → dist/ui/System/Auth/SignUp/_index.d.ts} +0 -0
  238. /package/{src/ui/System/Auth/_index.ts → dist/ui/System/Auth/_index.d.ts} +0 -0
  239. /package/{src/ui/System/Invitations/_index.ts → dist/ui/System/Invitations/_index.d.ts} +0 -0
  240. /package/{src/ui/System/Permissions/_index.ts → dist/ui/System/Permissions/_index.d.ts} +0 -0
  241. /package/{src/ui/System/SystemUser/_index.ts → dist/ui/System/SystemUser/_index.d.ts} +0 -0
  242. /package/{src/ui/System/_index.ts → dist/ui/System/_index.d.ts} +0 -0
  243. /package/{src/ui/_index.ts → dist/ui/_index.d.ts} +0 -0
  244. /package/{src/utils/_index.ts → dist/utils/_index.d.ts} +0 -0
@@ -0,0 +1,6 @@
1
+ import { type Invitation } from "@clerk/nextjs/server";
2
+ import type { InvitationCreateState } from "../../ui/System/Invitations/InvitationListActions";
3
+ import type { PaginatedResponse } from "../clerk";
4
+ export declare const invitationListReadAction: (params: ClerkInvitationListParams) => Promise<PaginatedResponse<Invitation[]>>;
5
+ export declare const invitationDeleteAction: (id: string) => Promise<import("@studiocubics/utils").ActionResponse<string, string[]>>;
6
+ export declare function invitationCreateAction(_: InvitationCreateState, formData: FormData): Promise<InvitationCreateState>;
@@ -0,0 +1,59 @@
1
+ 'use server';
2
+ import { clerkClient } from '@clerk/nextjs/server';
3
+ import { auth } from '../auth.js';
4
+ import { revalidatePath } from 'next/cache';
5
+ import { headers } from 'next/headers';
6
+ import { getInvitationPublicMetadata } from '../rbacConfig.js';
7
+ import { createInvitationSchema } from '../schemas/invitation.js';
8
+ import z from 'zod';
9
+ import { apiRes } from '@studiocubics/utils';
10
+ import { cache } from 'react';
11
+
12
+ const invitationListReadAction = cache(async (params) => {
13
+ const session = await auth();
14
+ if (!session.hasPermission("invitations", "read")) {
15
+ throw new Error(apiRes.forbidden);
16
+ }
17
+ const client = await clerkClient();
18
+ const invitationsList = await client.invitations.getInvitationList(params);
19
+ return invitationsList;
20
+ });
21
+ const invitationDeleteAction = async (id) => {
22
+ const session = await auth();
23
+ if (!session.hasPermission("invitations", "delete")) {
24
+ return apiRes.actionFail(apiRes.forbidden);
25
+ }
26
+ if (!id || typeof id !== "string")
27
+ return apiRes.actionFail(apiRes.wrongType("id", "string"));
28
+ const client = await clerkClient();
29
+ await client.invitations.revokeInvitation(id);
30
+ revalidatePath("/dashboard/security/invitations");
31
+ return apiRes.actionSuccess();
32
+ };
33
+ async function invitationCreateAction(_, formData) {
34
+ const session = await auth();
35
+ if (!session.hasPermission("invitations", "create")) {
36
+ return apiRes.actionFail(apiRes.forbidden);
37
+ }
38
+ const headersList = await headers();
39
+ const host = headersList.get("host");
40
+ const protocol = host?.startsWith("localhost") ? "http" : "https";
41
+ const formDataObj = Object.fromEntries(formData.entries());
42
+ const { success, data, error } = createInvitationSchema.safeParse(formDataObj);
43
+ if (!success) {
44
+ const flattenedError = z.flattenError(error);
45
+ return apiRes.actionFail(flattenedError.formErrors.join("\n"), flattenedError.fieldErrors);
46
+ }
47
+ const publicMetadata = getInvitationPublicMetadata(data.role);
48
+ const client = await clerkClient();
49
+ await client.invitations.createInvitation({
50
+ ...data,
51
+ redirectUrl: `${protocol}://${host}/auth/signUp`,
52
+ publicMetadata,
53
+ });
54
+ revalidatePath("/dashboard/security/invitations");
55
+ return apiRes.actionSuccess();
56
+ }
57
+
58
+ export { invitationCreateAction, invitationDeleteAction, invitationListReadAction };
59
+ //# sourceMappingURL=invitations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invitations.js","sources":["../../../src/clerk/actions/invitations.ts"],"sourcesContent":["\"use server\";\n\nimport { clerkClient, type Invitation } from \"@clerk/nextjs/server\";\nimport { auth } from \"../auth\";\nimport { revalidatePath } from \"next/cache\";\nimport { headers } from \"next/headers\";\nimport { getInvitationPublicMetadata } from \"../rbacConfig\";\nimport { createInvitationSchema } from \"../schemas/invitation\";\nimport z from \"zod\";\nimport type { InvitationCreateState } from \"../../ui/System/Invitations/InvitationListActions\";\nimport { apiRes } from \"@studiocubics/utils\";\nimport type { PaginatedResponse } from \"../clerk\";\nimport { cache } from \"react\";\n\nexport const invitationListReadAction = cache(\n async (\n params: ClerkInvitationListParams,\n ): Promise<PaginatedResponse<Invitation[]>> => {\n const session = await auth();\n if (!session.hasPermission(\"invitations\", \"read\")) {\n throw new Error(apiRes.forbidden);\n }\n const client = await clerkClient();\n const invitationsList = await client.invitations.getInvitationList(params);\n return invitationsList;\n },\n);\nexport const invitationDeleteAction = async (id: string) => {\n const session = await auth();\n if (!session.hasPermission(\"invitations\", \"delete\")) {\n return apiRes.actionFail(apiRes.forbidden);\n }\n\n if (!id || typeof id !== \"string\")\n return apiRes.actionFail(apiRes.wrongType(\"id\", \"string\"));\n\n const client = await clerkClient();\n await client.invitations.revokeInvitation(id);\n\n revalidatePath(\"/dashboard/security/invitations\");\n return apiRes.actionSuccess();\n};\n\nexport async function invitationCreateAction(\n _: InvitationCreateState,\n formData: FormData,\n): Promise<InvitationCreateState> {\n const session = await auth();\n if (!session.hasPermission(\"invitations\", \"create\")) {\n return apiRes.actionFail(apiRes.forbidden);\n }\n\n const headersList = await headers();\n const host = headersList.get(\"host\");\n const protocol = host?.startsWith(\"localhost\") ? \"http\" : \"https\";\n\n const formDataObj = Object.fromEntries(formData.entries());\n const { success, data, error } =\n createInvitationSchema.safeParse(formDataObj);\n if (!success) {\n const flattenedError = z.flattenError(error);\n return apiRes.actionFail(\n flattenedError.formErrors.join(\"\\n\"),\n flattenedError.fieldErrors,\n );\n }\n\n const publicMetadata = getInvitationPublicMetadata(data.role);\n const client = await clerkClient();\n await client.invitations.createInvitation({\n ...data,\n redirectUrl: `${protocol}://${host}/auth/signUp`,\n publicMetadata,\n });\n\n revalidatePath(\"/dashboard/security/invitations\");\n return apiRes.actionSuccess();\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type User } from "@clerk/nextjs/server";
2
+ import type { PaginatedResponse } from "../clerk";
3
+ import type { SystemUserRoleUpdateState } from "../../ui/System/SystemUser/SystemUserRoleForm/SystemUserRoleForm";
4
+ import type { SystemUserDetailsUpdateState } from "../../ui/_index";
5
+ export declare const systemUserListReadAction: (params: ClerkUserListParams, removeCurrent?: boolean) => Promise<PaginatedResponse<User[]>>;
6
+ export declare const systemUserReadAction: (id: string) => Promise<User>;
7
+ export declare function systemUserRoleUpdateAction(userId: string, _: SystemUserRoleUpdateState, formData: FormData): Promise<SystemUserRoleUpdateState>;
8
+ export declare function systemUserDetailsUpdateAction(userId: string, _: SystemUserDetailsUpdateState, formData: FormData): Promise<SystemUserDetailsUpdateState>;
@@ -0,0 +1,64 @@
1
+ 'use server';
2
+ import { clerkClient } from '@clerk/nextjs/server';
3
+ import { auth } from '../auth.js';
4
+ import { apiRes } from '@studiocubics/utils';
5
+ import { cache } from 'react';
6
+
7
+ const systemUserListReadAction = cache(async (params, removeCurrent = false) => {
8
+ const session = await auth();
9
+ if (!session.hasPermission("systemUsers", "read")) {
10
+ throw new Error(apiRes.forbidden);
11
+ }
12
+ const client = await clerkClient();
13
+ const systemUserList = await client.users.getUserList(params);
14
+ if (removeCurrent) {
15
+ systemUserList.data = systemUserList.data.filter((su) => su.id !== session.userId);
16
+ systemUserList.totalCount--;
17
+ }
18
+ return systemUserList;
19
+ });
20
+ const systemUserReadAction = cache(async (id) => {
21
+ const session = await auth();
22
+ if (!session.hasPermission("systemUsers", "read")) {
23
+ throw new Error(apiRes.forbidden);
24
+ }
25
+ const client = await clerkClient();
26
+ const systemUser = await client.users.getUser(id);
27
+ if (!systemUser) {
28
+ throw new Error(apiRes.notFound(`System User: ${id}`));
29
+ }
30
+ return systemUser;
31
+ });
32
+ async function systemUserRoleUpdateAction(userId, _, formData) {
33
+ const session = await auth();
34
+ if (!session.hasPermission("systemUsers", "update")) {
35
+ throw new Error(apiRes.forbidden);
36
+ }
37
+ const role = formData.get("role");
38
+ console.log("userId", userId);
39
+ console.log("role", role);
40
+ return apiRes.actionSuccess();
41
+ // const client = await clerkClient();
42
+ // const { publicMetadata } = await client.users.getUser(userId);
43
+ // const patchedUser = await client.users.updateUserMetadata(userId, {
44
+ // publicMetadata: {
45
+ // ...publicMetadata,
46
+ // role,
47
+ // },
48
+ // });
49
+ // return apiRes.actionSuccess(patchedUser);
50
+ }
51
+ async function systemUserDetailsUpdateAction(userId, _, formData) {
52
+ const session = await auth();
53
+ if (!session.hasPermission("systemUsers", "update")) {
54
+ throw new Error(apiRes.forbidden);
55
+ }
56
+ console.log("firstName", formData.get("firstName"));
57
+ console.log("lastName", formData.get("firstName"));
58
+ console.log("imageFile", formData.get("imageFile"));
59
+ console.log("userId", userId);
60
+ return apiRes.actionSuccess();
61
+ }
62
+
63
+ export { systemUserDetailsUpdateAction, systemUserListReadAction, systemUserReadAction, systemUserRoleUpdateAction };
64
+ //# sourceMappingURL=systemUsers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemUsers.js","sources":["../../../src/clerk/actions/systemUsers.ts"],"sourcesContent":["\"use server\";\nimport { clerkClient, type User } from \"@clerk/nextjs/server\";\nimport { auth } from \"../auth\";\nimport { apiRes } from \"@studiocubics/utils\";\nimport type { PaginatedResponse } from \"../clerk\";\nimport type { SystemUserRoleUpdateState } from \"../../ui/System/SystemUser/SystemUserRoleForm/SystemUserRoleForm\";\nimport { cache } from \"react\";\nimport type { SystemUserDetailsUpdateState } from \"../../ui/_index\";\n\nexport const systemUserListReadAction = cache(\n async (\n params: ClerkUserListParams,\n removeCurrent: boolean = false,\n ): Promise<PaginatedResponse<User[]>> => {\n const session = await auth();\n\n if (!session.hasPermission(\"systemUsers\", \"read\")) {\n throw new Error(apiRes.forbidden);\n }\n\n const client = await clerkClient();\n const systemUserList = await client.users.getUserList(params);\n\n if (removeCurrent) {\n systemUserList.data = systemUserList.data.filter(\n (su) => su.id !== session.userId,\n );\n systemUserList.totalCount--;\n }\n\n return systemUserList;\n },\n);\n\nexport const systemUserReadAction = cache(async (id: string) => {\n const session = await auth();\n\n if (!session.hasPermission(\"systemUsers\", \"read\")) {\n throw new Error(apiRes.forbidden);\n }\n\n const client = await clerkClient();\n const systemUser = await client.users.getUser(id);\n\n if (!systemUser) {\n throw new Error(apiRes.notFound(`System User: ${id}`));\n }\n\n return systemUser;\n});\n\nexport async function systemUserRoleUpdateAction(\n userId: string,\n _: SystemUserRoleUpdateState,\n formData: FormData,\n): Promise<SystemUserRoleUpdateState> {\n const session = await auth();\n\n if (!session.hasPermission(\"systemUsers\", \"update\")) {\n throw new Error(apiRes.forbidden);\n }\n const role = formData.get(\"role\");\n console.log(\"userId\", userId);\n console.log(\"role\", role);\n return apiRes.actionSuccess();\n\n // const client = await clerkClient();\n // const { publicMetadata } = await client.users.getUser(userId);\n // const patchedUser = await client.users.updateUserMetadata(userId, {\n // publicMetadata: {\n // ...publicMetadata,\n // role,\n // },\n // });\n // return apiRes.actionSuccess(patchedUser);\n}\n\nexport async function systemUserDetailsUpdateAction(\n userId: string,\n _: SystemUserDetailsUpdateState,\n formData: FormData,\n): Promise<SystemUserDetailsUpdateState> {\n const session = await auth();\n\n if (!session.hasPermission(\"systemUsers\", \"update\")) {\n throw new Error(apiRes.forbidden);\n }\n console.log(\"firstName\", formData.get(\"firstName\"));\n console.log(\"lastName\", formData.get(\"firstName\"));\n console.log(\"imageFile\", formData.get(\"imageFile\"));\n\n console.log(\"userId\", userId);\n return apiRes.actionSuccess();\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { auth as clerkAuth } from "@clerk/nextjs/server";
2
+ import type { Resource, RoleActions } from "./rbacConfig";
3
+ type ClerkAuthResult = Awaited<ReturnType<typeof clerkAuth>>;
4
+ export type AuthWithPermissions = ClerkAuthResult & {
5
+ hasPermission: (resource: Resource, action: RoleActions, record?: Record<string, any>) => Promise<boolean>;
6
+ };
7
+ export declare function auth(options?: Parameters<typeof clerkAuth>[0]): Promise<AuthWithPermissions>;
8
+ export {};
@@ -0,0 +1,21 @@
1
+ 'use server';
2
+ import { auth as auth$1 } from '@clerk/nextjs/server';
3
+ import { hasPermissionForClaims } from './hasPermission.js';
4
+
5
+ async function auth(options) {
6
+ const clerkAuthResult = await auth$1(options);
7
+ return {
8
+ ...clerkAuthResult,
9
+ hasPermission: async (resource, action, record) => {
10
+ return hasPermissionForClaims({
11
+ claims: clerkAuthResult.sessionClaims,
12
+ resource,
13
+ action,
14
+ record,
15
+ });
16
+ },
17
+ };
18
+ }
19
+
20
+ export { auth };
21
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sources":["../../src/clerk/auth.ts"],"sourcesContent":["\"use server\";\nimport { auth as clerkAuth } from \"@clerk/nextjs/server\";\nimport { hasPermissionForClaims } from \"./hasPermission\";\nimport type { Resource, RoleActions } from \"./rbacConfig\";\ntype ClerkAuthResult = Awaited<ReturnType<typeof clerkAuth>>;\n\nexport type AuthWithPermissions = ClerkAuthResult & {\n hasPermission: (\n resource: Resource,\n action: RoleActions,\n record?: Record<string, any>,\n ) => Promise<boolean>;\n};\nexport async function auth(\n options?: Parameters<typeof clerkAuth>[0],\n): Promise<AuthWithPermissions> {\n const clerkAuthResult = await clerkAuth(options);\n\n return {\n ...clerkAuthResult,\n hasPermission: async (\n resource: Resource,\n action: RoleActions,\n record?: Record<string, any>,\n ) => {\n return hasPermissionForClaims({\n claims: clerkAuthResult.sessionClaims,\n resource,\n action,\n record,\n });\n },\n };\n}\n"],"names":["clerkAuth"],"mappings":";;;;AAaO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA,CAAA,CAAI,CACxB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAyC,CAAA,CAAA;AAEzC,CAAA,CAAA,CAAA,CAAA,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,CAAA,CAAG,MAAMA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAS,CAAC,OAAO,CAAC;IAEhD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe;QAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,EAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACb,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,EAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAA,CACnB,MAA4B,CAAA,CAAA,CAAA,CAAA,CAC1B;AACF,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,sBAAsB,CAAC;gBAC5B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa;gBACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ;gBACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM;gBACN,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM;AACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC;QACJ,CAAC;KACF;AACH;;"}
@@ -0,0 +1,33 @@
1
+ import { type Resource, type RoleActions, type Role } from "./rbacConfig";
2
+ /**
3
+ * Evaluates RBAC permissions using explicitly provided session claims.
4
+ *
5
+ * @returns `true` if the role defined in `sessionClaims.metadata.role`
6
+ * is allowed to perform `action` on `resource` under RBAC rules.
7
+ */
8
+ export declare function hasPermissionForClaims(args: {
9
+ claims: ClerkSessionClaims;
10
+ resource: Resource;
11
+ action: RoleActions;
12
+ record?: Record<string, any>;
13
+ }): Promise<boolean>;
14
+ /**
15
+ * Evaluates RBAC permissions for the currently authenticated user.
16
+ *
17
+ * Use this when you do NOT already have session claims.
18
+ *
19
+ * @returns `true` if the current user's role is allowed
20
+ * to perform `action` on `resource` under RBAC rules.
21
+ */
22
+ export declare function hasPermission(args: {
23
+ resource: Resource;
24
+ action: RoleActions;
25
+ record?: Record<string, any>;
26
+ }): Promise<boolean>;
27
+ export type PermissionCheckInput = {
28
+ role: Role;
29
+ claims: ClerkSessionClaims;
30
+ resource: Resource;
31
+ action: RoleActions;
32
+ record?: Record<string, any>;
33
+ };
@@ -0,0 +1,78 @@
1
+ 'use server';
2
+ import { auth } from '@clerk/nextjs/server';
3
+ import { RBAC_CONFIG } from './rbacConfig.js';
4
+
5
+ /**
6
+ * Evaluates RBAC permissions using explicitly provided session claims.
7
+ *
8
+ * @returns `true` if the role defined in `sessionClaims.metadata.role`
9
+ * is allowed to perform `action` on `resource` under RBAC rules.
10
+ */
11
+ async function hasPermissionForClaims(args) {
12
+ if (!("metadata" in args.claims))
13
+ return false;
14
+ const role = args.claims?.metadata.role;
15
+ if (!role)
16
+ return false;
17
+ return checkPermissions({ role, ...args });
18
+ }
19
+ /**
20
+ * Evaluates RBAC permissions for the currently authenticated user.
21
+ *
22
+ * Use this when you do NOT already have session claims.
23
+ *
24
+ * @returns `true` if the current user's role is allowed
25
+ * to perform `action` on `resource` under RBAC rules.
26
+ */
27
+ async function hasPermission(args) {
28
+ let claims;
29
+ const a = await auth();
30
+ claims = a.sessionClaims;
31
+ const role = claims?.metadata.role;
32
+ if (!role)
33
+ return false;
34
+ return checkPermissions({
35
+ role,
36
+ claims,
37
+ ...args,
38
+ });
39
+ }
40
+ /**
41
+ * Core RBAC policy evaluator.
42
+ *
43
+ * This is the authorization engine shared by all permission checks.
44
+ * It does NOT perform authentication or session resolution.
45
+ *
46
+ * Rules:
47
+ * - `isSystem` roles bypass all checks
48
+ * - permissions are matched by `{ resource, action }`
49
+ * - optional ownership constraints are enforced via `ownerField`
50
+ * @param {PermissionCheckInput} args
51
+ * @returns `true` if at least one permission grants access
52
+ */
53
+ function checkPermissions(args) {
54
+ const def = RBAC_CONFIG[args.role];
55
+ if (!def)
56
+ return false;
57
+ // Allow system
58
+ if (def.isSystem)
59
+ return true;
60
+ // Iterate over all permissions
61
+ for (const p of def.permissions) {
62
+ if (p.resource !== args.resource)
63
+ continue;
64
+ if (!p.actions?.[args.action])
65
+ continue;
66
+ // Ownership conditions
67
+ if (p.conditions?.ownerField && args.record) {
68
+ const ownerField = p.conditions.ownerField;
69
+ if (args.record[ownerField] !== args.claims.id)
70
+ continue;
71
+ }
72
+ return true;
73
+ }
74
+ return false;
75
+ }
76
+
77
+ export { hasPermission, hasPermissionForClaims };
78
+ //# sourceMappingURL=hasPermission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasPermission.js","sources":["../../src/clerk/hasPermission.ts"],"sourcesContent":["\"use server\";\nimport { auth } from \"@clerk/nextjs/server\";\nimport {\n type Resource,\n type RoleActions,\n type Role,\n RBAC_CONFIG,\n} from \"./rbacConfig\";\n\n/**\n * Evaluates RBAC permissions using explicitly provided session claims.\n *\n * @returns `true` if the role defined in `sessionClaims.metadata.role`\n * is allowed to perform `action` on `resource` under RBAC rules.\n */\nexport async function hasPermissionForClaims(args: {\n claims: ClerkSessionClaims;\n resource: Resource;\n action: RoleActions;\n record?: Record<string, any>;\n}): Promise<boolean> {\n if (!(\"metadata\" in args.claims)) return false;\n const role = args.claims?.metadata.role;\n if (!role) return false;\n return checkPermissions({ role, ...args });\n}\n\n/**\n * Evaluates RBAC permissions for the currently authenticated user.\n *\n * Use this when you do NOT already have session claims.\n *\n * @returns `true` if the current user's role is allowed\n * to perform `action` on `resource` under RBAC rules.\n */\nexport async function hasPermission(args: {\n resource: Resource;\n action: RoleActions;\n record?: Record<string, any>;\n}): Promise<boolean> {\n let claims;\n\n const a = await auth();\n claims = a.sessionClaims;\n\n const role = claims?.metadata.role;\n if (!role) return false;\n return checkPermissions({\n role,\n claims,\n ...args,\n });\n}\nexport type PermissionCheckInput = {\n role: Role;\n claims: ClerkSessionClaims;\n resource: Resource;\n action: RoleActions;\n record?: Record<string, any>;\n};\n\n/**\n * Core RBAC policy evaluator.\n *\n * This is the authorization engine shared by all permission checks.\n * It does NOT perform authentication or session resolution.\n *\n * Rules:\n * - `isSystem` roles bypass all checks\n * - permissions are matched by `{ resource, action }`\n * - optional ownership constraints are enforced via `ownerField`\n * @param {PermissionCheckInput} args\n * @returns `true` if at least one permission grants access\n */\nfunction checkPermissions(args: PermissionCheckInput) {\n const def = RBAC_CONFIG[args.role];\n if (!def) return false;\n\n // Allow system\n if (def.isSystem) return true;\n\n // Iterate over all permissions\n for (const p of def.permissions) {\n if (p.resource !== args.resource) continue;\n if (!p.actions?.[args.action]) continue;\n\n // Ownership conditions\n if (p.conditions?.ownerField && args.record) {\n const ownerField = p.conditions.ownerField;\n if (args.record[ownerField] !== args.claims.id) continue;\n }\n\n return true;\n }\n return false;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export declare const roles: readonly ["admin", "manager", "member"];
2
+ export declare const resources: readonly ["systemUsers", "projects", "invitations"];
3
+ export declare const RBAC_CONFIG: {
4
+ [K in Role]: RoleDoc;
5
+ };
6
+ export type Role = (typeof roles)[number];
7
+ export type Resource = (typeof resources)[number];
8
+ export type RoleActions = "create" | "read" | "update" | "delete";
9
+ export type ResourcePermission = {
10
+ resource: Resource;
11
+ actions: Partial<Record<RoleActions, boolean>>;
12
+ conditions?: {
13
+ ownerField?: string;
14
+ };
15
+ };
16
+ export type RoleDoc = {
17
+ desc?: string;
18
+ inherits?: string[];
19
+ isSystem?: boolean;
20
+ permissions: ResourcePermission[];
21
+ };
22
+ export declare const getInvitationPublicMetadata: (role: Role) => {
23
+ role: "admin";
24
+ onboardingComplete: boolean;
25
+ } | {
26
+ role: "manager";
27
+ onboardingComplete: boolean;
28
+ } | {
29
+ role: "member";
30
+ onboardingComplete: boolean;
31
+ };
@@ -0,0 +1,48 @@
1
+ const roles = ["admin", "manager", "member"];
2
+ const resources = ["systemUsers", "projects", "invitations"];
3
+ const RBAC_CONFIG = {
4
+ admin: {
5
+ desc: "Full system authority with unrestricted access and management capabilities.",
6
+ isSystem: true,
7
+ permissions: [], // system role bypasses all checks
8
+ },
9
+ manager: {
10
+ desc: "Responsible for overseeing teams and resources; can manage existing items and invite users.",
11
+ inherits: ["member"],
12
+ permissions: [
13
+ {
14
+ resource: "systemUsers",
15
+ actions: { create: true, read: true, update: true },
16
+ conditions: { ownerField: "id" },
17
+ },
18
+ {
19
+ resource: "projects",
20
+ actions: { create: true, read: true, update: true, delete: true },
21
+ },
22
+ {
23
+ resource: "invitations",
24
+ actions: { create: true, read: true, update: true, delete: true },
25
+ },
26
+ ],
27
+ },
28
+ member: {
29
+ desc: "Standard user with read-level access to assigned resources; limited modification rights.",
30
+ permissions: [
31
+ { resource: "systemUsers", actions: { read: true } },
32
+ { resource: "projects", actions: { read: true } },
33
+ ],
34
+ },
35
+ };
36
+ const getInvitationPublicMetadata = (role) => {
37
+ switch (role) {
38
+ case "admin":
39
+ return { role, onboardingComplete: true };
40
+ case "manager":
41
+ return { role, onboardingComplete: true };
42
+ default:
43
+ return { role, onboardingComplete: false };
44
+ }
45
+ };
46
+
47
+ export { RBAC_CONFIG, getInvitationPublicMetadata, resources, roles };
48
+ //# sourceMappingURL=rbacConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbacConfig.js","sources":["../../src/clerk/rbacConfig.ts"],"sourcesContent":["export const roles = [\"admin\", \"manager\", \"member\"] as const;\nexport const resources = [\"systemUsers\", \"projects\", \"invitations\"] as const;\n\nexport const RBAC_CONFIG: {\n [K in Role]: RoleDoc;\n} = {\n admin: {\n desc: \"Full system authority with unrestricted access and management capabilities.\",\n isSystem: true,\n permissions: [], // system role bypasses all checks\n },\n manager: {\n desc: \"Responsible for overseeing teams and resources; can manage existing items and invite users.\",\n inherits: [\"member\"],\n permissions: [\n {\n resource: \"systemUsers\",\n actions: { create: true, read: true, update: true },\n conditions: { ownerField: \"id\" },\n },\n {\n resource: \"projects\",\n actions: { create: true, read: true, update: true, delete: true },\n },\n {\n resource: \"invitations\",\n actions: { create: true, read: true, update: true, delete: true },\n },\n ],\n },\n member: {\n desc: \"Standard user with read-level access to assigned resources; limited modification rights.\",\n permissions: [\n { resource: \"systemUsers\", actions: { read: true } },\n { resource: \"projects\", actions: { read: true } },\n ],\n },\n} as const;\n\nexport type Role = (typeof roles)[number];\nexport type Resource = (typeof resources)[number];\n\nexport type RoleActions = \"create\" | \"read\" | \"update\" | \"delete\";\n\nexport type ResourcePermission = {\n resource: Resource;\n actions: Partial<Record<RoleActions, boolean>>;\n conditions?: {\n ownerField?: string; // e.g. “creatorId”\n };\n};\nexport type RoleDoc = {\n desc?: string;\n inherits?: string[];\n isSystem?: boolean;\n permissions: ResourcePermission[];\n};\n\nexport const getInvitationPublicMetadata = (role: Role) => {\n switch (role) {\n case \"admin\":\n return { role, onboardingComplete: true };\n case \"manager\":\n return { role, onboardingComplete: true };\n default:\n return { role, onboardingComplete: false };\n }\n};\n"],"names":[],"mappings":"AAAO,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ;AAC3C,MAAM,SAAS,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa;AAE3D,MAAM,WAAW,GAEpB;AACF,IAAA,KAAK,EAAE;AACL,QAAA,IAAI,EAAE,6EAA6E;AACnF,QAAA,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,EAAE;AAChB,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,IAAI,EAAE,6FAA6F;QACnG,QAAQ,EAAE,CAAC,QAAQ,CAAC;AACpB,QAAA,WAAW,EAAE;AACX,YAAA;AACE,gBAAA,QAAQ,EAAE,aAAa;AACvB,gBAAA,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AACnD,gBAAA,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;AACjC,aAAA;AACD,YAAA;AACE,gBAAA,QAAQ,EAAE,UAAU;AACpB,gBAAA,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AAClE,aAAA;AACD,YAAA;AACE,gBAAA,QAAQ,EAAE,aAAa;AACvB,gBAAA,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AAClE,aAAA;AACF,SAAA;AACF,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,IAAI,EAAE,0FAA0F;AAChG,QAAA,WAAW,EAAE;YACX,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACpD,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;AAClD,SAAA;AACF,KAAA;;AAsBI,MAAM,2BAA2B,GAAG,CAAC,IAAU,KAAI;IACxD,QAAQ,IAAI;AACV,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE;AAC3C,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE;AAC3C,QAAA;AACE,YAAA,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE;;AAEhD;;;;"}
@@ -0,0 +1,12 @@
1
+ import z from "zod";
2
+ export declare const createInvitationSchema: z.ZodObject<{
3
+ emailAddress: z.ZodString;
4
+ expiresInDays: z.ZodOptional<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodNumber>>;
5
+ ignoreExisting: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
6
+ notify: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
7
+ role: z.ZodEnum<{
8
+ admin: "admin";
9
+ manager: "manager";
10
+ member: "member";
11
+ }>;
12
+ }, z.core.$strip>;
@@ -0,0 +1,20 @@
1
+ import z from 'zod';
2
+ import { roles } from '../rbacConfig.js';
3
+
4
+ const createInvitationSchema = z.object({
5
+ emailAddress: z.string(),
6
+ expiresInDays: z
7
+ .preprocess((val) => {
8
+ if (typeof val === "string") {
9
+ return Number.parseInt(val);
10
+ }
11
+ return val;
12
+ }, z.number())
13
+ .optional(),
14
+ ignoreExisting: z.boolean().default(false).optional(),
15
+ notify: z.boolean().default(true).optional(),
16
+ role: z.enum(roles),
17
+ });
18
+
19
+ export { createInvitationSchema };
20
+ //# sourceMappingURL=invitation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invitation.js","sources":["../../../src/clerk/schemas/invitation.ts"],"sourcesContent":["import z from \"zod\";\nimport { roles } from \"../rbacConfig\";\n\nexport const createInvitationSchema = z.object({\n emailAddress: z.string(),\n expiresInDays: z\n .preprocess((val) => {\n if (typeof val === \"string\") {\n return Number.parseInt(val);\n }\n return val;\n }, z.number())\n .optional(),\n ignoreExisting: z.boolean().default(false).optional(),\n notify: z.boolean().default(true).optional(),\n role: z.enum(roles),\n});\n"],"names":[],"mappings":";;;AAGO,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;AAC7C,IAAA,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;AACxB,IAAA,aAAa,EAAE;AACZ,SAAA,UAAU,CAAC,CAAC,GAAG,KAAI;AAClB,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC3B,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC7B;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;AACZ,SAAA,QAAQ,EAAE;AACb,IAAA,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;AACrD,IAAA,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;AAC5C,IAAA,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AACpB,CAAA;;;;"}
@@ -0,0 +1,6 @@
1
+ import z from "zod";
2
+ export declare const systemUserUpdateSchema: z.ZodObject<{
3
+ firstName: z.ZodString;
4
+ lastName: z.ZodString;
5
+ imageFile: z.ZodFile;
6
+ }, z.core.$strip>;
@@ -0,0 +1,48 @@
1
+ import type { User } from "@clerk/nextjs/server";
2
+ /**
3
+ * Client-safe representation of a Clerk User.
4
+ *
5
+ * This intentionally excludes any sensitive or server-only fields
6
+ * (e.g. privateMetadata, externalAccounts with tokens, etc.)
7
+ * and contains only JSON-serializable data that is safe to pass
8
+ * from Server Components to Client Components.
9
+ */
10
+ export type ClientSafeUser = {
11
+ id: string;
12
+ username: string | null;
13
+ firstName: string | null;
14
+ lastName: string | null;
15
+ fullName: string | null;
16
+ imageUrl: string;
17
+ primaryEmailAddress: {
18
+ id: string;
19
+ emailAddress: string;
20
+ verified: boolean;
21
+ };
22
+ emailAddresses: Array<{
23
+ id: string;
24
+ emailAddress: string;
25
+ verified: boolean;
26
+ }>;
27
+ publicMetadata: CustomJwtSessionClaims["metadata"];
28
+ createdAt: Date | null;
29
+ updatedAt: Date | null;
30
+ lastSignInAt: Date | null;
31
+ };
32
+ /**
33
+ * Converts a Clerk `User` (server-side) into a client-safe, serializable object.
34
+ *
35
+ * Why this exists:
36
+ * - The Clerk `User` class contains methods and non-serializable fields.
37
+ * - Passing it directly to a Client Component will break React Server Components.
38
+ * - This function strips the object down to stable, safe primitives only.
39
+ *
40
+ * Rules enforced here:
41
+ * - No functions
42
+ * - No circular references
43
+ * - No private or sensitive data
44
+ *
45
+ * @param user Clerk User instance from `@clerk/nextjs/server`
46
+ * @returns ClientSafeUser plain object
47
+ */
48
+ export declare function toClientSafeUser(user: User): ClientSafeUser;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Converts a Clerk `User` (server-side) into a client-safe, serializable object.
3
+ *
4
+ * Why this exists:
5
+ * - The Clerk `User` class contains methods and non-serializable fields.
6
+ * - Passing it directly to a Client Component will break React Server Components.
7
+ * - This function strips the object down to stable, safe primitives only.
8
+ *
9
+ * Rules enforced here:
10
+ * - No functions
11
+ * - No circular references
12
+ * - No private or sensitive data
13
+ *
14
+ * @param user Clerk User instance from `@clerk/nextjs/server`
15
+ * @returns ClientSafeUser plain object
16
+ */
17
+ function toClientSafeUser(user) {
18
+ const pea = user.emailAddresses.find((ea) => ea.id == user.primaryEmailAddressId);
19
+ if (!pea)
20
+ throw new Error("Missing primaryEmailAddress");
21
+ return {
22
+ id: user.id,
23
+ username: user.username,
24
+ firstName: user.firstName,
25
+ lastName: user.lastName,
26
+ fullName: user.fullName,
27
+ imageUrl: user.imageUrl,
28
+ primaryEmailAddress: {
29
+ id: pea.id,
30
+ emailAddress: pea.emailAddress,
31
+ verified: pea.verification?.status === "verified",
32
+ },
33
+ emailAddresses: user.emailAddresses.map((email) => ({
34
+ id: email.id,
35
+ emailAddress: email.emailAddress,
36
+ verified: email.verification?.status === "verified",
37
+ })),
38
+ publicMetadata: user.publicMetadata ?? {},
39
+ createdAt: new Date(user.createdAt),
40
+ updatedAt: new Date(user.updatedAt),
41
+ lastSignInAt: user.lastSignInAt ? new Date(user.lastSignInAt) : null,
42
+ };
43
+ }
44
+
45
+ export { toClientSafeUser };
46
+ //# sourceMappingURL=toClientSafeUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toClientSafeUser.js","sources":["../../src/clerk/toClientSafeUser.ts"],"sourcesContent":["import type { User } from \"@clerk/nextjs/server\";\n\n/**\n * Client-safe representation of a Clerk User.\n *\n * This intentionally excludes any sensitive or server-only fields\n * (e.g. privateMetadata, externalAccounts with tokens, etc.)\n * and contains only JSON-serializable data that is safe to pass\n * from Server Components to Client Components.\n */\nexport type ClientSafeUser = {\n id: string;\n username: string | null;\n firstName: string | null;\n lastName: string | null;\n fullName: string | null;\n imageUrl: string;\n primaryEmailAddress: {\n id: string;\n emailAddress: string;\n verified: boolean;\n };\n emailAddresses: Array<{\n id: string;\n emailAddress: string;\n verified: boolean;\n }>;\n publicMetadata: CustomJwtSessionClaims[\"metadata\"];\n createdAt: Date | null;\n updatedAt: Date | null;\n lastSignInAt: Date | null;\n};\n\n/**\n * Converts a Clerk `User` (server-side) into a client-safe, serializable object.\n *\n * Why this exists:\n * - The Clerk `User` class contains methods and non-serializable fields.\n * - Passing it directly to a Client Component will break React Server Components.\n * - This function strips the object down to stable, safe primitives only.\n *\n * Rules enforced here:\n * - No functions\n * - No circular references\n * - No private or sensitive data\n *\n * @param user Clerk User instance from `@clerk/nextjs/server`\n * @returns ClientSafeUser plain object\n */\nexport function toClientSafeUser(user: User): ClientSafeUser {\n const pea = user.emailAddresses.find(\n (ea) => ea.id == user.primaryEmailAddressId\n );\n if (!pea) throw new Error(\"Missing primaryEmailAddress\");\n return {\n id: user.id,\n username: user.username,\n firstName: user.firstName,\n lastName: user.lastName,\n fullName: user.fullName,\n imageUrl: user.imageUrl,\n primaryEmailAddress: {\n id: pea.id,\n emailAddress: pea.emailAddress,\n verified: pea.verification?.status === \"verified\",\n },\n emailAddresses: user.emailAddresses.map((email) => ({\n id: email.id,\n emailAddress: email.emailAddress,\n verified: email.verification?.status === \"verified\",\n })),\n publicMetadata: user.publicMetadata ?? {},\n createdAt: new Date(user.createdAt),\n updatedAt: new Date(user.updatedAt),\n lastSignInAt: user.lastSignInAt ? new Date(user.lastSignInAt) : null,\n };\n}\n"],"names":[],"mappings":"AAiCA;;;;;;;;;;;;;;;AAeG;AACG,SAAU,gBAAgB,CAAC,IAAU,EAAA;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAClC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,qBAAqB,CAC5C;AACD,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC;IACxD,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,QAAA,mBAAmB,EAAE;YACnB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,YAAY,EAAE,GAAG,CAAC,YAAY;AAC9B,YAAA,QAAQ,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,UAAU;AAClD,SAAA;AACD,QAAA,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM;YAClD,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,YAAY,EAAE,KAAK,CAAC,YAAY;AAChC,YAAA,QAAQ,EAAE,KAAK,CAAC,YAAY,EAAE,MAAM,KAAK,UAAU;AACpD,SAAA,CAAC,CAAC;AACH,QAAA,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,EAAE;AACzC,QAAA,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;AACnC,QAAA,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;AACnC,QAAA,YAAY,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI;KACrE;AACH;;;;"}
@@ -0,0 +1,6 @@
1
+ import type { ListItemProps, TabProps } from "@studiocubics/components";
2
+ export declare const defaultNavLinks: ListItemProps[];
3
+ export declare const defaultSecurityLinks: TabProps[];
4
+ export declare const fontH: import("next/dist/compiled/@next/font").NextFontWithVariable;
5
+ export declare const fontP: import("next/dist/compiled/@next/font").NextFontWithVariable;
6
+ export declare const defaultBodyClassName: string;