@carlonicora/nextjs-jsonapi 1.0.3 → 1.0.5

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 (515) hide show
  1. package/dist/{AbstractService-BKlpJA61.d.mts → AbstractService-B2n_JdiC.d.mts} +1 -1
  2. package/dist/{AbstractService-D9eSVKNa.d.ts → AbstractService-DtQTYovo.d.ts} +1 -1
  3. package/dist/{content.interface-Dg2lt_An.d.mts → AuthComponent-CPLvEerw.d.mts} +11 -15
  4. package/dist/{content.interface-BhyAiOFq.d.ts → AuthComponent-m6Qp4Hz6.d.ts} +11 -15
  5. package/dist/{BlockNoteEditor-UVO3VZZE.mjs → BlockNoteEditor-BLVXQPXV.mjs} +14 -18
  6. package/dist/{BlockNoteEditor-UVO3VZZE.mjs.map → BlockNoteEditor-BLVXQPXV.mjs.map} +1 -1
  7. package/dist/{BlockNoteEditor-VFWG6LXI.js → BlockNoteEditor-ZTDHULFT.js} +15 -19
  8. package/dist/BlockNoteEditor-ZTDHULFT.js.map +1 -0
  9. package/dist/JsonApiRequest-O7BGUMFO.mjs +23 -0
  10. package/dist/JsonApiRequest-VARLNKAF.js +23 -0
  11. package/dist/JsonApiRequest-VARLNKAF.js.map +1 -0
  12. package/dist/chunk-2LM6LCJW.mjs +1 -0
  13. package/dist/chunk-3APORDYP.mjs +7783 -0
  14. package/dist/chunk-3APORDYP.mjs.map +1 -0
  15. package/dist/{chunk-TMVHSY3Y.js → chunk-5ZEADNNP.js} +36 -17
  16. package/dist/chunk-5ZEADNNP.js.map +1 -0
  17. package/dist/{chunk-ECDTZBYO.mjs → chunk-74F6BBHH.mjs} +21 -2
  18. package/dist/chunk-74F6BBHH.mjs.map +1 -0
  19. package/dist/{chunk-GYWPEPOH.mjs → chunk-7C5RAEBO.mjs} +72 -68
  20. package/dist/chunk-7C5RAEBO.mjs.map +1 -0
  21. package/dist/chunk-A5DDIABK.js +1 -0
  22. package/dist/{chunk-TEGF6ZWG.js → chunk-AGAJMJ4T.js} +47 -9
  23. package/dist/chunk-AGAJMJ4T.js.map +1 -0
  24. package/dist/{chunk-CXQOWQSY.js → chunk-AYHKQWHH.js} +15 -2
  25. package/dist/chunk-AYHKQWHH.js.map +1 -0
  26. package/dist/{chunk-I2REI7OA.js → chunk-HMHGLXWC.js} +33 -15
  27. package/dist/chunk-HMHGLXWC.js.map +1 -0
  28. package/dist/chunk-IWFGEPAA.mjs +1 -0
  29. package/dist/chunk-JC3WJK65.js +1 -0
  30. package/dist/{chunk-L6EQEAXU.mjs → chunk-PYF2U6WG.mjs} +25 -7
  31. package/dist/chunk-PYF2U6WG.mjs.map +1 -0
  32. package/dist/{chunk-YDVTFM7X.mjs → chunk-RBIVEH2K.mjs} +42 -4
  33. package/dist/chunk-RBIVEH2K.mjs.map +1 -0
  34. package/dist/{chunk-V2JJPI7N.js → chunk-RZO2LOW4.js} +237 -233
  35. package/dist/chunk-RZO2LOW4.js.map +1 -0
  36. package/dist/{chunk-X4BIHJ2B.mjs → chunk-SM63SZCP.mjs} +15 -2
  37. package/dist/chunk-SM63SZCP.mjs.map +1 -0
  38. package/dist/chunk-WEC4YMOS.js +7783 -0
  39. package/dist/chunk-WEC4YMOS.js.map +1 -0
  40. package/dist/client/index.d.mts +21 -2
  41. package/dist/client/index.d.ts +21 -2
  42. package/dist/client/index.js +18 -245
  43. package/dist/client/index.js.map +1 -1
  44. package/dist/client/index.mjs +28 -255
  45. package/dist/client/index.mjs.map +1 -1
  46. package/dist/components/index.d.mts +293 -8
  47. package/dist/components/index.d.ts +293 -8
  48. package/dist/components/index.js +78 -2323
  49. package/dist/components/index.js.map +1 -1
  50. package/dist/components/index.mjs +172 -2417
  51. package/dist/components/index.mjs.map +1 -1
  52. package/dist/{config-hXufftVS.d.ts → config-BmnK65TD.d.mts} +1 -0
  53. package/dist/{config-hXufftVS.d.mts → config-BmnK65TD.d.ts} +1 -0
  54. package/dist/config-DQeAo9Kf.d.mts +49 -0
  55. package/dist/config-DQeAo9Kf.d.ts +49 -0
  56. package/dist/contexts/index.d.mts +109 -21
  57. package/dist/contexts/index.d.ts +109 -21
  58. package/dist/contexts/index.js +39 -7
  59. package/dist/contexts/index.js.map +1 -1
  60. package/dist/contexts/index.mjs +40 -8
  61. package/dist/core/index.d.mts +3 -4
  62. package/dist/core/index.d.ts +3 -4
  63. package/dist/core/index.js +3 -7
  64. package/dist/core/index.js.map +1 -1
  65. package/dist/core/index.mjs +4 -8
  66. package/dist/{d3.link.interface-QMdB22bC.d.mts → d3.link.interface-ClC4Irqp.d.mts} +2 -1
  67. package/dist/{d3.link.interface-QMdB22bC.d.ts → d3.link.interface-ClC4Irqp.d.ts} +2 -1
  68. package/dist/features/index.d.mts +17 -86
  69. package/dist/features/index.d.ts +17 -86
  70. package/dist/features/index.js +7 -16
  71. package/dist/features/index.js.map +1 -1
  72. package/dist/features/index.mjs +10 -19
  73. package/dist/hooks/index.d.mts +18 -43
  74. package/dist/hooks/index.d.ts +18 -43
  75. package/dist/hooks/index.js +20 -7
  76. package/dist/hooks/index.js.map +1 -1
  77. package/dist/hooks/index.mjs +19 -6
  78. package/dist/index.d.mts +10 -6
  79. package/dist/index.d.ts +10 -6
  80. package/dist/index.js +13 -10
  81. package/dist/index.js.map +1 -1
  82. package/dist/index.mjs +22 -19
  83. package/dist/interfaces/index.d.mts +2 -1
  84. package/dist/interfaces/index.d.ts +2 -1
  85. package/dist/notification.interface-BBgMUdLR.d.mts +14 -0
  86. package/dist/notification.interface-gyvT-Z2F.d.ts +14 -0
  87. package/dist/permissions/index.d.mts +2 -3
  88. package/dist/permissions/index.d.ts +2 -3
  89. package/dist/server/index.d.mts +38 -18
  90. package/dist/server/index.d.ts +38 -18
  91. package/dist/server/index.js +70 -2
  92. package/dist/server/index.js.map +1 -1
  93. package/dist/server/index.mjs +68 -0
  94. package/dist/server/index.mjs.map +1 -1
  95. package/dist/types-BUAlgqqh.d.ts +39 -0
  96. package/dist/{types-DluCaP1I.d.ts → types-Bl61ob-7.d.mts} +19 -2
  97. package/dist/{types-lQVA8d_P.d.mts → types-Bl61ob-7.d.ts} +19 -2
  98. package/dist/types-iVdVY7ba.d.mts +39 -0
  99. package/dist/useSocket-Cn7fB_B1.d.mts +25 -0
  100. package/dist/useSocket-DzMKRKCA.d.ts +25 -0
  101. package/dist/user.fields-CbdObSmS.d.mts +18 -0
  102. package/dist/user.fields-CbdObSmS.d.ts +18 -0
  103. package/dist/utils/index.d.mts +1 -2
  104. package/dist/utils/index.d.ts +1 -2
  105. package/package.json +6 -3
  106. package/src/atoms/index.ts +1 -0
  107. package/src/atoms/recentPagesAtom.ts +10 -0
  108. package/src/client/context/JsonApiContext.ts +61 -0
  109. package/src/client/context/JsonApiProvider.tsx +27 -0
  110. package/src/client/context/index.ts +2 -0
  111. package/src/client/hooks/index.ts +3 -0
  112. package/src/client/hooks/useJsonApiGet.ts +188 -0
  113. package/src/client/hooks/useJsonApiMutation.ts +193 -0
  114. package/src/client/hooks/useRehydration.ts +47 -0
  115. package/src/client/index.ts +24 -0
  116. package/src/client/request.ts +97 -0
  117. package/src/client/token.ts +10 -0
  118. package/src/components/containers/PageContainer.tsx +15 -0
  119. package/src/components/containers/ReactMarkdownContainer.tsx +119 -0
  120. package/src/components/containers/TabsContainer.tsx +93 -0
  121. package/src/components/containers/index.ts +3 -0
  122. package/src/components/contents/AttributeElement.tsx +20 -0
  123. package/src/components/contents/index.ts +1 -0
  124. package/src/components/details/AllowedUsersDetails.tsx +23 -0
  125. package/src/components/details/index.ts +1 -0
  126. package/src/components/editors/BlockNoteDiffInlineContent.tsx +152 -0
  127. package/src/components/editors/BlockNoteEditor.tsx +404 -0
  128. package/src/components/editors/BlockNoteEditorContainer.tsx +13 -0
  129. package/src/components/editors/BlockNoteEditorFormattingToolbar.tsx +38 -0
  130. package/src/components/editors/index.ts +1 -0
  131. package/src/components/errors/ErrorDetails.tsx +41 -0
  132. package/src/components/errors/errorToast.ts +9 -0
  133. package/src/components/errors/index.ts +2 -0
  134. package/src/components/forms/CommonAssociationForm.tsx +162 -0
  135. package/src/components/forms/CommonDeleter.tsx +94 -0
  136. package/src/components/forms/CommonEditorButtons.tsx +30 -0
  137. package/src/components/forms/CommonEditorHeader.tsx +35 -0
  138. package/src/components/forms/CommonEditorTrigger.tsx +26 -0
  139. package/src/components/forms/DatePickerPopover.tsx +219 -0
  140. package/src/components/forms/DateRangeSelector.tsx +110 -0
  141. package/src/components/forms/FileUploader.tsx +324 -0
  142. package/src/components/forms/FormCheckbox.tsx +66 -0
  143. package/src/components/forms/FormContainerGeneric.tsx +39 -0
  144. package/src/components/forms/FormDate.tsx +247 -0
  145. package/src/components/forms/FormDateTime.tsx +231 -0
  146. package/src/components/forms/FormInput.tsx +110 -0
  147. package/src/components/forms/FormPassword.tsx +54 -0
  148. package/src/components/forms/FormPlaceAutocomplete.tsx +286 -0
  149. package/src/components/forms/FormSelect.tsx +72 -0
  150. package/src/components/forms/FormSlider.tsx +51 -0
  151. package/src/components/forms/FormSwitch.tsx +25 -0
  152. package/src/components/forms/FormTextarea.tsx +44 -0
  153. package/src/components/forms/MultiFileUploader.tsx +107 -0
  154. package/src/components/forms/PasswordInput.tsx +47 -0
  155. package/src/components/forms/index.ts +22 -0
  156. package/src/components/index.ts +16 -0
  157. package/src/components/navigations/Breadcrumb.tsx +83 -0
  158. package/src/components/navigations/ContentTitle.tsx +39 -0
  159. package/src/components/navigations/Header.tsx +27 -0
  160. package/src/components/navigations/ModeToggleSwitch.tsx +25 -0
  161. package/src/components/navigations/PageSection.tsx +64 -0
  162. package/src/components/navigations/RecentPagesNavigator.tsx +52 -0
  163. package/src/components/navigations/index.ts +6 -0
  164. package/src/components/pages/PageContainerContentDetails.tsx +76 -0
  165. package/src/components/pages/PageContentContainer.tsx +31 -0
  166. package/src/components/pages/index.ts +2 -0
  167. package/src/components/tables/ContentListTable.tsx +166 -0
  168. package/src/components/tables/ContentTableSearch.tsx +105 -0
  169. package/src/components/tables/cells/cell.component.tsx +18 -0
  170. package/src/components/tables/cells/cell.date.tsx +16 -0
  171. package/src/components/tables/cells/cell.id.tsx +27 -0
  172. package/src/components/tables/cells/cell.link.tsx +18 -0
  173. package/src/components/tables/cells/cell.text.tsx +12 -0
  174. package/src/components/tables/cells/cell.url.tsx +13 -0
  175. package/src/components/tables/cells/index.ts +5 -0
  176. package/src/components/tables/index.ts +3 -0
  177. package/src/contexts/CommonContext.tsx +52 -0
  178. package/src/contexts/SharedContext.tsx +37 -0
  179. package/src/contexts/SocketContext.tsx +65 -0
  180. package/src/contexts/index.ts +7 -0
  181. package/src/core/abstracts/AbstractApiData.ts +138 -0
  182. package/src/core/abstracts/AbstractService.ts +263 -0
  183. package/src/core/abstracts/index.ts +2 -0
  184. package/src/core/endpoint/EndpointCreator.ts +97 -0
  185. package/src/core/endpoint/index.ts +1 -0
  186. package/src/core/factories/JsonApiDataFactory.ts +12 -0
  187. package/src/core/factories/RehydrationFactory.ts +30 -0
  188. package/src/core/factories/index.ts +2 -0
  189. package/src/core/fields/FieldSelector.ts +15 -0
  190. package/src/core/fields/index.ts +1 -0
  191. package/src/core/index.ts +20 -0
  192. package/src/core/interfaces/ApiData.ts +8 -0
  193. package/src/core/interfaces/ApiDataInterface.ts +15 -0
  194. package/src/core/interfaces/ApiRequestDataTypeInterface.ts +14 -0
  195. package/src/core/interfaces/ApiResponseInterface.ts +17 -0
  196. package/src/core/interfaces/JsonApiHydratedDataInterface.ts +5 -0
  197. package/src/core/interfaces/index.ts +5 -0
  198. package/{dist/chunk-DO2HLAZO.js → src/core/registry/DataClassRegistry.ts} +20 -17
  199. package/src/core/registry/ModuleRegistrar.ts +43 -0
  200. package/src/core/registry/ModuleRegistry.ts +64 -0
  201. package/src/core/registry/index.ts +3 -0
  202. package/src/core/utils/index.ts +2 -0
  203. package/src/core/utils/rehydrate.ts +24 -0
  204. package/src/core/utils/translateResponse.ts +125 -0
  205. package/src/features/auth/auth.module.ts +9 -0
  206. package/src/features/auth/components/containers/AuthContainer.tsx +32 -0
  207. package/src/features/auth/components/containers/index.ts +1 -0
  208. package/src/features/auth/components/details/LandingComponent.tsx +39 -0
  209. package/src/features/auth/components/details/index.ts +1 -0
  210. package/src/features/auth/components/forms/AcceptInvitation.tsx +136 -0
  211. package/src/features/auth/components/forms/ActivateAccount.tsx +75 -0
  212. package/src/features/auth/components/forms/Cookies.tsx +32 -0
  213. package/src/features/auth/components/forms/ForgotPassword.tsx +108 -0
  214. package/src/features/auth/components/forms/Login.tsx +118 -0
  215. package/src/features/auth/components/forms/Logout.tsx +19 -0
  216. package/src/features/auth/components/forms/RefreshUser.tsx +39 -0
  217. package/src/features/auth/components/forms/Register.tsx +150 -0
  218. package/src/features/auth/components/forms/ResetPassword.tsx +126 -0
  219. package/src/features/auth/components/forms/index.ts +9 -0
  220. package/src/features/auth/components/index.ts +3 -0
  221. package/src/features/auth/config.ts +57 -0
  222. package/src/features/auth/contexts/AuthContext.tsx +77 -0
  223. package/src/features/auth/contexts/index.ts +1 -0
  224. package/src/features/auth/data/auth.interface.ts +31 -0
  225. package/src/features/auth/data/auth.service.ts +159 -0
  226. package/src/features/auth/data/auth.ts +54 -0
  227. package/src/features/auth/data/index.ts +3 -0
  228. package/src/features/auth/enums/AuthComponent.ts +9 -0
  229. package/src/features/auth/enums/index.ts +1 -0
  230. package/src/features/auth/index.ts +4 -0
  231. package/src/features/auth/utils/AuthCookies.ts +134 -0
  232. package/src/features/auth/utils/index.ts +1 -0
  233. package/src/features/company/company.module.ts +10 -0
  234. package/src/features/company/components/containers/AdminCompanyContainer.tsx +26 -0
  235. package/src/features/company/components/containers/CompanyContainer.tsx +17 -0
  236. package/src/features/company/components/containers/index.ts +2 -0
  237. package/src/features/company/components/details/CompanyDetails.tsx +26 -0
  238. package/src/features/company/components/details/index.ts +1 -0
  239. package/src/features/company/components/forms/CompanyConfigurationEditor.tsx +151 -0
  240. package/src/features/company/components/forms/CompanyConfigurationSecurityForm.tsx +97 -0
  241. package/src/features/company/components/forms/CompanyDeleter.tsx +121 -0
  242. package/src/features/company/components/forms/CompanyEditor.tsx +245 -0
  243. package/src/features/company/components/forms/CompanyLicense.tsx +213 -0
  244. package/src/features/company/components/forms/index.ts +5 -0
  245. package/src/features/company/components/index.ts +4 -0
  246. package/src/features/company/components/lists/CompaniesList.tsx +31 -0
  247. package/src/features/company/components/lists/index.ts +1 -0
  248. package/src/features/company/contexts/CompanyContext.tsx +99 -0
  249. package/src/features/company/contexts/index.ts +0 -0
  250. package/src/features/company/data/company.fields.ts +6 -0
  251. package/src/features/company/data/company.interface.ts +28 -0
  252. package/src/features/company/data/company.service.ts +73 -0
  253. package/src/features/company/data/company.ts +104 -0
  254. package/src/features/company/data/index.ts +4 -0
  255. package/src/features/company/hooks/index.ts +1 -0
  256. package/src/features/company/hooks/useCompanyTableStructure.tsx +82 -0
  257. package/src/features/company/index.ts +2 -0
  258. package/src/features/content/content.module.ts +20 -0
  259. package/src/features/content/data/content.fields.ts +13 -0
  260. package/src/features/content/data/content.interface.ts +23 -0
  261. package/src/features/content/data/content.service.ts +75 -0
  262. package/src/features/content/data/content.ts +85 -0
  263. package/src/features/content/data/index.ts +4 -0
  264. package/src/features/content/index.ts +2 -0
  265. package/src/features/feature/components/forms/FormFeatures.tsx +150 -0
  266. package/src/features/feature/components/forms/index.ts +1 -0
  267. package/src/features/feature/components/index.ts +1 -0
  268. package/src/features/feature/data/feature.interface.ts +9 -0
  269. package/src/features/feature/data/feature.service.ts +19 -0
  270. package/src/features/feature/data/feature.ts +33 -0
  271. package/src/features/feature/data/index.ts +3 -0
  272. package/src/features/feature/feature.module.ts +10 -0
  273. package/src/features/feature/index.ts +2 -0
  274. package/src/features/index.ts +12 -0
  275. package/src/features/module/data/index.ts +2 -0
  276. package/src/features/module/data/module.interface.ts +12 -0
  277. package/src/features/module/data/module.ts +42 -0
  278. package/src/features/module/index.ts +2 -0
  279. package/src/features/module/module.module.ts +10 -0
  280. package/src/features/notification/components/common/NotificationErrorBoundary.tsx +51 -0
  281. package/src/features/notification/components/common/index.ts +1 -0
  282. package/src/features/notification/components/containers/NotificationsListContainer.tsx +44 -0
  283. package/src/features/notification/components/containers/index.ts +1 -0
  284. package/src/features/notification/components/index.ts +5 -0
  285. package/src/features/notification/components/lists/NotificationsList.tsx +129 -0
  286. package/src/features/notification/components/lists/index.ts +1 -0
  287. package/src/features/notification/components/modals/NotificationModal.tsx +220 -0
  288. package/src/features/notification/components/modals/index.ts +1 -0
  289. package/src/features/notification/components/notifications/Notification.tsx +120 -0
  290. package/src/features/notification/components/notifications/PushNotificationProvider.tsx +9 -0
  291. package/src/features/notification/components/notifications/index.ts +2 -0
  292. package/src/features/notification/contexts/NotificationContext.tsx +187 -0
  293. package/src/features/notification/contexts/index.ts +1 -0
  294. package/src/features/notification/data/index.ts +4 -0
  295. package/src/features/notification/data/notification.fields.ts +8 -0
  296. package/src/features/notification/data/notification.interface.ts +14 -0
  297. package/src/features/notification/data/notification.service.ts +34 -0
  298. package/src/features/notification/data/notification.ts +51 -0
  299. package/src/features/notification/index.ts +2 -0
  300. package/src/features/notification/notification.module.ts +10 -0
  301. package/src/features/push/data/index.ts +3 -0
  302. package/src/features/push/data/push.interface.ts +8 -0
  303. package/src/features/push/data/push.service.ts +17 -0
  304. package/src/features/push/data/push.ts +18 -0
  305. package/src/features/push/index.ts +2 -0
  306. package/src/features/push/push.module.ts +10 -0
  307. package/src/features/role/components/containers/RoleContainer.tsx +18 -0
  308. package/src/features/role/components/containers/index.ts +1 -0
  309. package/src/features/role/components/details/RoleDetails.tsx +21 -0
  310. package/src/features/role/components/details/index.ts +1 -0
  311. package/src/features/role/components/forms/FormRoles.tsx +82 -0
  312. package/src/features/role/components/forms/RemoveUserFromRole.tsx +108 -0
  313. package/src/features/role/components/forms/UserRoleAdd.tsx +128 -0
  314. package/src/features/role/components/forms/index.ts +3 -0
  315. package/src/features/role/components/index.ts +4 -0
  316. package/src/features/role/components/lists/RolesList.tsx +27 -0
  317. package/src/features/role/components/lists/UserRolesList.tsx +31 -0
  318. package/src/features/role/components/lists/index.ts +2 -0
  319. package/src/features/role/contexts/RoleContext.tsx +84 -0
  320. package/src/features/role/contexts/index.ts +1 -0
  321. package/src/features/role/data/index.ts +4 -0
  322. package/src/features/role/data/role.fields.ts +8 -0
  323. package/src/features/role/data/role.interface.ts +16 -0
  324. package/src/features/role/data/role.service.ts +117 -0
  325. package/src/features/role/data/role.ts +62 -0
  326. package/src/features/role/hooks/index.ts +1 -0
  327. package/src/features/role/hooks/useRoleTableStructure.tsx +72 -0
  328. package/src/features/role/index.ts +2 -0
  329. package/src/features/role/role.module.ts +10 -0
  330. package/src/features/s3/data/index.ts +3 -0
  331. package/src/features/s3/data/s3.interface.ts +11 -0
  332. package/src/features/s3/data/s3.service.ts +30 -0
  333. package/src/features/s3/data/s3.ts +60 -0
  334. package/src/features/s3/index.ts +2 -0
  335. package/src/features/s3/s3.module.ts +10 -0
  336. package/src/features/search/index.ts +1 -0
  337. package/src/features/search/interfaces/index.ts +1 -0
  338. package/src/features/search/interfaces/search.result.interface.ts +3 -0
  339. package/src/features/user/author.module.ts +10 -0
  340. package/src/features/user/components/containers/UserContainer.tsx +23 -0
  341. package/src/features/user/components/containers/UserIndexContainer.tsx +12 -0
  342. package/src/features/user/components/containers/UsersListContainer.tsx +36 -0
  343. package/src/features/user/components/containers/index.ts +3 -0
  344. package/src/features/user/components/details/UserDetails.tsx +74 -0
  345. package/src/features/user/components/details/UserIndexDetails.tsx +28 -0
  346. package/src/features/user/components/details/index.ts +2 -0
  347. package/src/features/user/components/forms/RoleUserAdd.tsx +93 -0
  348. package/src/features/user/components/forms/UserAvatarEditor.tsx +78 -0
  349. package/src/features/user/components/forms/UserDeleter.tsx +49 -0
  350. package/src/features/user/components/forms/UserEditor.tsx +319 -0
  351. package/src/features/user/components/forms/UserMultiSelect.tsx +218 -0
  352. package/src/features/user/components/forms/UserReactivator.tsx +79 -0
  353. package/src/features/user/components/forms/UserResentInvitationEmail.tsx +88 -0
  354. package/src/features/user/components/forms/UserSelector.tsx +185 -0
  355. package/src/features/user/components/forms/index.ts +8 -0
  356. package/src/features/user/components/index.ts +5 -0
  357. package/src/features/user/components/lists/AdminUsersList.tsx +41 -0
  358. package/src/features/user/components/lists/CompanyUsersList.tsx +44 -0
  359. package/src/features/user/components/lists/ContributorsList.tsx +41 -0
  360. package/src/features/user/components/lists/RelevantUsersList.tsx +30 -0
  361. package/src/features/user/components/lists/RoleUsersList.tsx +31 -0
  362. package/src/features/user/components/lists/UserListInAdd.tsx +53 -0
  363. package/src/features/user/components/lists/UsersList.tsx +30 -0
  364. package/src/features/user/components/lists/UsersListByContentIds.tsx +30 -0
  365. package/src/features/user/components/lists/index.ts +8 -0
  366. package/src/features/user/components/widgets/UserAvatar.tsx +86 -0
  367. package/src/features/user/components/widgets/UserAvatarList.tsx +31 -0
  368. package/src/features/user/components/widgets/UserSearchPopover.tsx +89 -0
  369. package/src/features/user/components/widgets/index.ts +1 -0
  370. package/src/features/user/contexts/CurrentUserContext.tsx +156 -0
  371. package/src/features/user/contexts/UserContext.tsx +106 -0
  372. package/src/features/user/contexts/index.ts +2 -0
  373. package/src/features/user/data/index.ts +4 -0
  374. package/src/features/user/data/user.fields.ts +8 -0
  375. package/src/features/user/data/user.interface.ts +41 -0
  376. package/src/features/user/data/user.service.ts +246 -0
  377. package/src/features/user/data/user.ts +162 -0
  378. package/src/features/user/hooks/index.ts +2 -0
  379. package/src/features/user/hooks/useUserSearch.ts +53 -0
  380. package/src/features/user/hooks/useUserTableStructure.tsx +115 -0
  381. package/src/features/user/index.ts +3 -0
  382. package/src/features/user/user.module.ts +21 -0
  383. package/src/hooks/TableGeneratorRegistry.ts +53 -0
  384. package/src/hooks/index.ts +37 -0
  385. package/src/hooks/types.ts +35 -0
  386. package/src/hooks/url.rewriter.ts +22 -0
  387. package/src/hooks/useCustomD3Graph.tsx +707 -0
  388. package/src/hooks/useDataListRetriever.ts +349 -0
  389. package/src/hooks/useDebounce.ts +33 -0
  390. package/src/hooks/useNotificationSync.ts +20 -0
  391. package/src/hooks/usePageTracker.ts +69 -0
  392. package/src/hooks/usePageUrlGenerator.ts +50 -0
  393. package/src/hooks/usePushNotifications.ts +82 -0
  394. package/src/hooks/useSocket.ts +201 -0
  395. package/src/hooks/useTableGenerator.ts +20 -0
  396. package/src/i18n/config.ts +74 -0
  397. package/src/i18n/index.ts +18 -0
  398. package/src/index.ts +20 -0
  399. package/src/interfaces/breadcrumb.item.data.interface.ts +4 -0
  400. package/src/interfaces/d3.link.interface.ts +8 -0
  401. package/src/interfaces/d3.node.interface.ts +12 -0
  402. package/src/interfaces/index.ts +3 -0
  403. package/src/permissions/check.ts +127 -0
  404. package/src/permissions/index.ts +2 -0
  405. package/src/permissions/types.ts +109 -0
  406. package/src/roles/config.ts +46 -0
  407. package/src/roles/index.ts +1 -0
  408. package/src/server/ServerSession.ts +103 -0
  409. package/src/server/cache.ts +28 -0
  410. package/src/server/index.ts +4 -0
  411. package/src/server/request.ts +113 -0
  412. package/src/server/token.ts +10 -0
  413. package/src/shadcnui/custom/kanban.tsx +1001 -0
  414. package/src/shadcnui/custom/link.tsx +18 -0
  415. package/src/shadcnui/custom/multi-select.tsx +382 -0
  416. package/src/shadcnui/index.ts +49 -0
  417. package/src/shadcnui/ui/accordion.tsx +52 -0
  418. package/src/shadcnui/ui/alert-dialog.tsx +141 -0
  419. package/src/shadcnui/ui/alert.tsx +43 -0
  420. package/src/shadcnui/ui/avatar.tsx +50 -0
  421. package/src/shadcnui/ui/badge.tsx +40 -0
  422. package/src/shadcnui/ui/breadcrumb.tsx +115 -0
  423. package/src/shadcnui/ui/button.tsx +51 -0
  424. package/src/shadcnui/ui/calendar.tsx +73 -0
  425. package/src/shadcnui/ui/card.tsx +43 -0
  426. package/src/shadcnui/ui/carousel.tsx +225 -0
  427. package/src/shadcnui/ui/chart.tsx +320 -0
  428. package/src/shadcnui/ui/checkbox.tsx +29 -0
  429. package/src/shadcnui/ui/collapsible.tsx +11 -0
  430. package/src/shadcnui/ui/command.tsx +155 -0
  431. package/src/shadcnui/ui/context-menu.tsx +179 -0
  432. package/src/shadcnui/ui/dialog.tsx +96 -0
  433. package/src/shadcnui/ui/drawer.tsx +89 -0
  434. package/src/shadcnui/ui/dropdown-menu.tsx +205 -0
  435. package/src/shadcnui/ui/form.tsx +138 -0
  436. package/src/shadcnui/ui/hover-card.tsx +29 -0
  437. package/src/shadcnui/ui/input.tsx +21 -0
  438. package/src/shadcnui/ui/label.tsx +26 -0
  439. package/src/shadcnui/ui/navigation-menu.tsx +168 -0
  440. package/src/shadcnui/ui/popover.tsx +33 -0
  441. package/src/shadcnui/ui/progress.tsx +25 -0
  442. package/src/shadcnui/ui/radio-group.tsx +37 -0
  443. package/src/shadcnui/ui/resizable.tsx +47 -0
  444. package/src/shadcnui/ui/scroll-area.tsx +40 -0
  445. package/src/shadcnui/ui/select.tsx +164 -0
  446. package/src/shadcnui/ui/separator.tsx +28 -0
  447. package/src/shadcnui/ui/sheet.tsx +139 -0
  448. package/src/shadcnui/ui/sidebar.tsx +677 -0
  449. package/src/shadcnui/ui/skeleton.tsx +13 -0
  450. package/src/shadcnui/ui/slider.tsx +25 -0
  451. package/src/shadcnui/ui/sonner.tsx +25 -0
  452. package/src/shadcnui/ui/switch.tsx +31 -0
  453. package/src/shadcnui/ui/table.tsx +120 -0
  454. package/src/shadcnui/ui/tabs.tsx +55 -0
  455. package/src/shadcnui/ui/textarea.tsx +24 -0
  456. package/src/shadcnui/ui/toggle.tsx +39 -0
  457. package/src/shadcnui/ui/tooltip.tsx +61 -0
  458. package/src/unified/JsonApiRequest.ts +348 -0
  459. package/src/unified/index.ts +1 -0
  460. package/src/utils/blocknote-diff.util.ts +815 -0
  461. package/src/utils/blocknote-word-diff-renderer.util.ts +413 -0
  462. package/src/utils/cn.ts +6 -0
  463. package/src/utils/compose-refs.ts +61 -0
  464. package/src/utils/date-formatter.ts +53 -0
  465. package/src/utils/exists.ts +7 -0
  466. package/src/utils/index.ts +15 -0
  467. package/src/utils/schemas/entity.object.schema.ts +8 -0
  468. package/src/utils/schemas/index.ts +2 -0
  469. package/src/utils/schemas/user.object.schema.ts +9 -0
  470. package/src/utils/table-options.ts +67 -0
  471. package/src/utils/use-mobile.tsx +21 -0
  472. package/dist/ApiRequestDataTypeInterface-CUKFDBx2.d.mts +0 -20
  473. package/dist/ApiRequestDataTypeInterface-CUKFDBx2.d.ts +0 -20
  474. package/dist/BlockNoteEditor-VFWG6LXI.js.map +0 -1
  475. package/dist/JsonApiRequest-S3ICLM7B.mjs +0 -20
  476. package/dist/JsonApiRequest-ZZLSP26T.js +0 -20
  477. package/dist/JsonApiRequest-ZZLSP26T.js.map +0 -1
  478. package/dist/chunk-366S2JCC.mjs +0 -31
  479. package/dist/chunk-366S2JCC.mjs.map +0 -1
  480. package/dist/chunk-5W6AKZE6.mjs +0 -131
  481. package/dist/chunk-5W6AKZE6.mjs.map +0 -1
  482. package/dist/chunk-A3J3AAYM.mjs +0 -97
  483. package/dist/chunk-A3J3AAYM.mjs.map +0 -1
  484. package/dist/chunk-AWONBQQP.js +0 -97
  485. package/dist/chunk-AWONBQQP.js.map +0 -1
  486. package/dist/chunk-CXQOWQSY.js.map +0 -1
  487. package/dist/chunk-DKKMWBP4.mjs +0 -1
  488. package/dist/chunk-DKKMWBP4.mjs.map +0 -1
  489. package/dist/chunk-DO2HLAZO.js.map +0 -1
  490. package/dist/chunk-DZXDB3K2.mjs +0 -17
  491. package/dist/chunk-DZXDB3K2.mjs.map +0 -1
  492. package/dist/chunk-ECDTZBYO.mjs.map +0 -1
  493. package/dist/chunk-FY4SXJGU.js +0 -806
  494. package/dist/chunk-FY4SXJGU.js.map +0 -1
  495. package/dist/chunk-GYWPEPOH.mjs.map +0 -1
  496. package/dist/chunk-H6FMOA6B.js +0 -1
  497. package/dist/chunk-H6FMOA6B.js.map +0 -1
  498. package/dist/chunk-I2REI7OA.js.map +0 -1
  499. package/dist/chunk-J4Q36PMP.js +0 -31
  500. package/dist/chunk-J4Q36PMP.js.map +0 -1
  501. package/dist/chunk-L6EQEAXU.mjs.map +0 -1
  502. package/dist/chunk-MFO27OHB.mjs +0 -48
  503. package/dist/chunk-MFO27OHB.mjs.map +0 -1
  504. package/dist/chunk-RAF7PNLG.js +0 -131
  505. package/dist/chunk-RAF7PNLG.js.map +0 -1
  506. package/dist/chunk-RUR22SVM.js +0 -17
  507. package/dist/chunk-RUR22SVM.js.map +0 -1
  508. package/dist/chunk-TEGF6ZWG.js.map +0 -1
  509. package/dist/chunk-TMVHSY3Y.js.map +0 -1
  510. package/dist/chunk-V2JJPI7N.js.map +0 -1
  511. package/dist/chunk-WWWMJZEF.mjs +0 -806
  512. package/dist/chunk-WWWMJZEF.mjs.map +0 -1
  513. package/dist/chunk-X4BIHJ2B.mjs.map +0 -1
  514. package/dist/chunk-YDVTFM7X.mjs.map +0 -1
  515. /package/dist/{JsonApiRequest-S3ICLM7B.mjs.map → JsonApiRequest-O7BGUMFO.mjs.map} +0 -0
@@ -0,0 +1,201 @@
1
+ "use client";
2
+
3
+ import { useEffect, useRef, useState } from "react";
4
+ import io from "socket.io-client";
5
+ import { Modules, rehydrate } from "../core";
6
+ import { NotificationInterface } from "../features";
7
+
8
+ type Socket = ReturnType<typeof io>;
9
+
10
+ interface UseSocketOptions {
11
+ token: string;
12
+ }
13
+
14
+ interface SocketLike {
15
+ emit: (event: string, ...args: any[]) => void;
16
+ on: (event: string, callback: (...args: any[]) => void) => void;
17
+ off: (event: string, callback?: (...args: any[]) => void) => void;
18
+ connected: boolean;
19
+ }
20
+
21
+ interface UseSocketReturn {
22
+ socket: SocketLike | null;
23
+ isConnected: boolean;
24
+ messages: any[];
25
+ socketNotifications: NotificationInterface[];
26
+ sendMessage: (event: string, data: any) => void;
27
+ removeMessage: (index: number) => void;
28
+ removeSocketNotification: (index: number) => void;
29
+ clearMessages: () => void;
30
+ clearSocketNotifications: () => void;
31
+ }
32
+
33
+ export function useSocket({ token }: UseSocketOptions): UseSocketReturn {
34
+ const errorCount = useRef(0);
35
+ const shouldConnect = useRef(true);
36
+ const hookInstanceId = useRef(Math.random().toString(36).substring(2, 11));
37
+
38
+ const [socket, setSocket] = useState<Socket | null>(null);
39
+ const [isConnected, setIsConnected] = useState<boolean>(false);
40
+ const [messages, setMessages] = useState<any[]>([]);
41
+ const [socketNotifications, setSocketNotifications] = useState<NotificationInterface[]>([]);
42
+
43
+ const socketRef = useRef<Socket | null>(null);
44
+
45
+ useEffect(() => {
46
+ if (!token) return;
47
+
48
+ const globalSocketKey = `__socket_${process.env.NEXT_PUBLIC_API_URL?.replace(/[^a-zA-Z0-9]/g, "_")}`;
49
+
50
+ if (typeof window !== "undefined") {
51
+ const allSocketKeys = Object.keys(window).filter((key) => key.startsWith("__socket_"));
52
+
53
+ const existingSocket = (window as any)[globalSocketKey];
54
+ if (existingSocket) {
55
+ if (existingSocket.connected) {
56
+ // CRITICAL: Clear existing listeners to prevent accumulation
57
+ existingSocket.removeAllListeners();
58
+
59
+ socketRef.current = existingSocket;
60
+ setSocket(existingSocket);
61
+ setIsConnected(existingSocket.connected);
62
+ } else {
63
+ existingSocket.disconnect();
64
+ delete (window as any)[globalSocketKey];
65
+ }
66
+ }
67
+ }
68
+
69
+ let currentSocket: any;
70
+ const isReusing = socketRef.current && socketRef.current.connected;
71
+
72
+ if (isReusing) {
73
+ currentSocket = socketRef.current;
74
+ } else {
75
+ // React StrictMode protection: Prevent double-mounting issues
76
+ if (!shouldConnect.current) {
77
+ return;
78
+ }
79
+ shouldConnect.current = false;
80
+
81
+ try {
82
+ currentSocket = io(process.env.NEXT_PUBLIC_API_URL as string, {
83
+ auth: { token },
84
+ transports: ["websocket"],
85
+ timeout: 20000,
86
+ });
87
+
88
+ if (typeof window !== "undefined") {
89
+ if (currentSocket.id && currentSocket.id !== "undefined") {
90
+ (window as any)[globalSocketKey] = currentSocket;
91
+ }
92
+ }
93
+
94
+ socketRef.current = currentSocket;
95
+ setSocket(currentSocket);
96
+ } catch (error) {
97
+ return () => {}; // Return empty cleanup function on error
98
+ }
99
+ }
100
+
101
+ const handleConnect = () => {
102
+ setIsConnected(true);
103
+ };
104
+
105
+ const handleDisconnect = () => {
106
+ setIsConnected(false);
107
+ };
108
+
109
+ const handleMessage = (data: any) => {
110
+ setMessages((prevMessages) => {
111
+ const newMessages = [...prevMessages, data];
112
+ return newMessages;
113
+ });
114
+ };
115
+
116
+ const handleNotification = (data: any) => {
117
+ const notification = rehydrate(Modules.Notification, data) as NotificationInterface;
118
+ if (notification) {
119
+ setSocketNotifications((prev) => {
120
+ const newNotifications = [...prev, notification];
121
+ return newNotifications;
122
+ });
123
+ }
124
+ };
125
+
126
+ // Attach event listeners
127
+ if (currentSocket) {
128
+ currentSocket.on("connect", handleConnect);
129
+ currentSocket.on("disconnect", handleDisconnect);
130
+ currentSocket.on("message", handleMessage);
131
+ currentSocket.on("notification", handleNotification);
132
+ }
133
+
134
+ return () => {
135
+ shouldConnect.current = true;
136
+
137
+ // In development, preserve socket in window for HMR but remove listeners
138
+ if (currentSocket) {
139
+ if (process.env.NODE_ENV === "development") {
140
+ currentSocket.off("connect", handleConnect);
141
+ currentSocket.off("disconnect", handleDisconnect);
142
+ currentSocket.off("message", handleMessage);
143
+ currentSocket.off("notification", handleNotification);
144
+ } else {
145
+ currentSocket.off("connect", handleConnect);
146
+ currentSocket.off("disconnect", handleDisconnect);
147
+ currentSocket.off("message", handleMessage);
148
+ currentSocket.off("notification", handleNotification);
149
+
150
+ currentSocket.disconnect();
151
+
152
+ if (typeof window !== "undefined") {
153
+ delete (window as any)[globalSocketKey];
154
+ }
155
+ }
156
+ }
157
+ };
158
+ }, [token]);
159
+
160
+ const sendMessage = (event: string, data: any) => {
161
+ if (socketRef.current && isConnected) {
162
+ socketRef.current.emit(event, data);
163
+ }
164
+ };
165
+
166
+ const removeMessage = (index: number) => {
167
+ setMessages((prevMessages) => {
168
+ const newMessages = [...prevMessages];
169
+ newMessages.splice(index, 1);
170
+ return newMessages;
171
+ });
172
+ };
173
+
174
+ const removeSocketNotification = (index: number) => {
175
+ setSocketNotifications((prevNotifications) => {
176
+ const newNotifications = [...prevNotifications];
177
+ newNotifications.splice(index, 1);
178
+ return newNotifications;
179
+ });
180
+ };
181
+
182
+ const clearMessages = () => {
183
+ setMessages([]);
184
+ };
185
+
186
+ const clearSocketNotifications = () => {
187
+ setSocketNotifications([]);
188
+ };
189
+
190
+ return {
191
+ socket,
192
+ isConnected,
193
+ messages,
194
+ socketNotifications,
195
+ sendMessage,
196
+ removeMessage,
197
+ removeSocketNotification,
198
+ clearMessages,
199
+ clearSocketNotifications,
200
+ };
201
+ }
@@ -0,0 +1,20 @@
1
+ "use client";
2
+
3
+ import { UseTableStructureHook, UseTableStructureHookParams, UseTableStructureHookReturn } from "./types";
4
+ import { ModuleWithPermissions } from "../permissions";
5
+ import { tableGeneratorRegistry } from "./TableGeneratorRegistry";
6
+
7
+ export function registerTableGenerator<T, U>(
8
+ type: string | ModuleWithPermissions,
9
+ hook: UseTableStructureHook<T, U>,
10
+ ): void {
11
+ const name = typeof type === "string" ? type : type.name;
12
+ tableGeneratorRegistry.register(name, hook);
13
+ }
14
+
15
+ export function useTableGenerator<T, U>(
16
+ type: ModuleWithPermissions,
17
+ params: UseTableStructureHookParams<T, U>,
18
+ ): UseTableStructureHookReturn<T> {
19
+ return tableGeneratorRegistry.get(type.name, params);
20
+ }
@@ -0,0 +1,74 @@
1
+ import { ComponentType } from "react";
2
+
3
+ // Types for injected hooks
4
+ export interface I18nRouter {
5
+ push: (href: string) => void;
6
+ replace: (href: string) => void;
7
+ back: () => void;
8
+ forward: () => void;
9
+ refresh: () => void;
10
+ prefetch: (href: string) => void;
11
+ }
12
+
13
+ export type UseRouterHook = () => I18nRouter;
14
+ export type UseTranslationsHook = (namespace?: string) => (key: string, values?: Record<string, any>) => string;
15
+ export type UseLocaleHook = () => string;
16
+
17
+ export type UseDateFnsLocaleHook = () => any; // date-fns Locale type
18
+ export type LinkComponent = ComponentType<{ href: string; children: React.ReactNode; [key: string]: any }>;
19
+
20
+ export interface I18nConfig {
21
+ useRouter: UseRouterHook;
22
+ useTranslations: UseTranslationsHook;
23
+ useLocale?: UseLocaleHook;
24
+ useDateFnsLocale?: UseDateFnsLocaleHook;
25
+ Link: LinkComponent;
26
+ usePathname: () => string;
27
+ }
28
+
29
+ // Private storage
30
+ let _config: I18nConfig | null = null;
31
+
32
+ // Configuration function (called by app at startup)
33
+ export function configureI18n(config: I18nConfig): void {
34
+ _config = config;
35
+ }
36
+
37
+ // Hooks for library components to use
38
+ export function useI18nRouter(): I18nRouter {
39
+ if (!_config?.useRouter) {
40
+ throw new Error("i18n not configured. Call configureI18n() at app startup.");
41
+ }
42
+ return _config.useRouter();
43
+ }
44
+
45
+ export function useI18nTranslations(namespace?: string): (key: string, values?: Record<string, any>) => string {
46
+ if (!_config?.useTranslations) {
47
+ // Fallback: return key as-is (safe for server/client)
48
+ return (key: string) => key;
49
+ }
50
+ return _config.useTranslations(namespace);
51
+ }
52
+
53
+ export function getI18nLink(): LinkComponent {
54
+ if (!_config?.Link) {
55
+ throw new Error("i18n not configured. Call configureI18n() at app startup.");
56
+ }
57
+ return _config.Link;
58
+ }
59
+
60
+ export function useI18nLocale(): string {
61
+ if (_config?.useLocale) {
62
+ return _config.useLocale();
63
+ }
64
+ // Fallback to English (safe for server/client)
65
+ return "en";
66
+ }
67
+
68
+ export function useI18nDateFnsLocale(): any {
69
+ if (_config?.useDateFnsLocale) {
70
+ return _config.useDateFnsLocale();
71
+ }
72
+ // Fallback to undefined (Calendar will use default)
73
+ return undefined;
74
+ }
@@ -0,0 +1,18 @@
1
+ export {
2
+ configureI18n,
3
+ useI18nRouter,
4
+ useI18nTranslations,
5
+ useI18nLocale,
6
+ useI18nDateFnsLocale,
7
+ getI18nLink,
8
+ } from "./config";
9
+
10
+ export type {
11
+ I18nConfig,
12
+ I18nRouter,
13
+ UseRouterHook,
14
+ UseTranslationsHook,
15
+ UseLocaleHook,
16
+ UseDateFnsLocaleHook,
17
+ LinkComponent,
18
+ } from "./config";
package/src/index.ts ADDED
@@ -0,0 +1,20 @@
1
+ // Unified API (auto-detects environment)
2
+ export * from "./unified";
3
+
4
+ // Core exports for convenience
5
+ export * from "./core";
6
+
7
+ // Permissions
8
+ export * from "./permissions";
9
+
10
+ // I18n configuration (NOT hooks - those are in /hooks with "use client")
11
+ export { configureI18n } from "./i18n";
12
+ export type { I18nConfig } from "./i18n";
13
+
14
+ // Roles configuration
15
+ export { configureRoles, getRoleId, isRolesConfigured } from "./roles";
16
+ export type { RoleIdConfig } from "./roles";
17
+
18
+ // Auth configuration
19
+ export { configureAuth, getTokenHandler } from "./features/auth/config";
20
+ export type { TokenHandler, TokenParams } from "./features/auth/config";
@@ -0,0 +1,4 @@
1
+ export type BreadcrumbItemData = {
2
+ name: string;
3
+ href?: string;
4
+ };
@@ -0,0 +1,8 @@
1
+ import type { SimulationLinkDatum } from "d3";
2
+ import { D3Node } from "./d3.node.interface";
3
+
4
+ export interface D3Link extends SimulationLinkDatum<D3Node> {
5
+ source: string | D3Node;
6
+ target: string | D3Node;
7
+ relationshipType?: string;
8
+ }
@@ -0,0 +1,12 @@
1
+ import { LucideIcon } from "lucide-react";
2
+
3
+ export interface D3Node extends d3.SimulationNodeDatum {
4
+ id: string;
5
+ name: string;
6
+ instanceType: string;
7
+ relationshipType?: string;
8
+ isBrowsableNode?: boolean;
9
+ icon?: LucideIcon;
10
+ visible?: boolean;
11
+ washedOut?: boolean;
12
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./breadcrumb.item.data.interface";
2
+ export * from "./d3.link.interface";
3
+ export * from "./d3.node.interface";
@@ -0,0 +1,127 @@
1
+ import { Action, ModuleWithPermissions, PermissionModule, PermissionUser } from "./types";
2
+
3
+ /**
4
+ * Check if a user has permission to perform an action on a module.
5
+ *
6
+ * @param module - The module to check permissions for
7
+ * @param action - The action to check (read, create, update, delete)
8
+ * @param user - The user with their modules and permissions
9
+ * @param data - Optional data object for path-based permission checks
10
+ */
11
+ export function checkPermissions<T extends PermissionUser>(params: {
12
+ module: ModuleWithPermissions;
13
+ action: Action;
14
+ user: T;
15
+ data?: any;
16
+ }): boolean {
17
+ const selectedModule = params.user.modules.find((module: PermissionModule) => module.id === params.module.moduleId);
18
+
19
+ if (!selectedModule) return false;
20
+ const permissionConfig = selectedModule.permissions[params.action];
21
+
22
+ if (!permissionConfig) return false;
23
+ if (typeof permissionConfig === "boolean") return permissionConfig as boolean;
24
+
25
+ if (!params.data) return true;
26
+
27
+ try {
28
+ const singlePermissionConfig = permissionConfig.split("|").map((p) => p.trim());
29
+
30
+ for (const path of singlePermissionConfig) {
31
+ if (getValueFromPath(params.data, path, params.user.id)) return true;
32
+ }
33
+ return false;
34
+ } catch {
35
+ if (typeof permissionConfig === "string") {
36
+ return getValueFromPath(params.data, permissionConfig, params.user.id);
37
+ }
38
+ }
39
+
40
+ return false;
41
+ }
42
+
43
+ /**
44
+ * Check permissions from server context where user object is not fully available.
45
+ *
46
+ * @param module - The module to check permissions for
47
+ * @param action - The action to check
48
+ * @param userId - The user's ID
49
+ * @param selectedModule - The selected module with its permissions
50
+ * @param data - Optional data object for path-based permission checks
51
+ */
52
+ export function checkPermissionsFromServer(params: {
53
+ module: ModuleWithPermissions;
54
+ action: Action;
55
+ userId: string;
56
+ selectedModule?: PermissionModule;
57
+ data?: any;
58
+ }): boolean {
59
+ if (!params.selectedModule) return false;
60
+ const permissionConfig = params.selectedModule.permissions[params.action];
61
+
62
+ if (!permissionConfig) return false;
63
+ if (typeof permissionConfig === "boolean") return permissionConfig as boolean;
64
+
65
+ if (!params.data) return true;
66
+
67
+ try {
68
+ const singlePermissionConfig = permissionConfig.split("|").map((p) => p.trim());
69
+
70
+ for (const path of singlePermissionConfig) {
71
+ if (getValueFromPath(params.data, path, params.userId)) return true;
72
+ }
73
+ return false;
74
+ } catch {
75
+ if (typeof permissionConfig === "string") {
76
+ return getValueFromPath(params.data, permissionConfig, params.userId);
77
+ }
78
+ }
79
+
80
+ return false;
81
+ }
82
+
83
+ /**
84
+ * Traverse an object path and check if the value matches the user ID.
85
+ * Handles nested objects, arrays, and various data structures.
86
+ */
87
+ export function getValueFromPath(obj: any, path: string, userId: string): any {
88
+ const parts = path.split(".");
89
+ let current = obj;
90
+
91
+ for (const part of parts) {
92
+ if (!current) return false;
93
+
94
+ if (Array.isArray(current)) {
95
+ let found = false;
96
+ for (const item of current) {
97
+ const result = getValueFromPath(item, parts.slice(parts.indexOf(part)).join("."), userId);
98
+ if (result === userId || result === true) {
99
+ found = true;
100
+ break;
101
+ }
102
+ }
103
+ return found;
104
+ } else if (current[part] !== undefined) {
105
+ current = current[part];
106
+ } else {
107
+ return false;
108
+ }
109
+ }
110
+
111
+ if (Array.isArray(current)) {
112
+ // If final value is an array, check if any element has id matching userId
113
+ return current.some((item: any) => {
114
+ if (typeof item === "object" && item.id !== undefined) {
115
+ return item.id.toString() === userId;
116
+ }
117
+ return item.toString() === userId;
118
+ });
119
+ }
120
+
121
+ // Direct comparison for primitive values or objects with id
122
+ if (typeof current === "object" && current.id !== undefined) {
123
+ return current.id.toString() === userId;
124
+ }
125
+
126
+ return current.toString() === userId;
127
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./types";
2
+ export * from "./check";
@@ -0,0 +1,109 @@
1
+ import { ApiRequestDataTypeInterface } from "../core/interfaces/ApiRequestDataTypeInterface";
2
+ import { FieldSelector } from "../core/fields/FieldSelector";
3
+
4
+ /**
5
+ * Permission actions
6
+ */
7
+ export enum Action {
8
+ Read = "read",
9
+ Create = "create",
10
+ Update = "update",
11
+ Delete = "delete",
12
+ }
13
+
14
+ /**
15
+ * Generic permission check type.
16
+ * Can be a boolean or a function that checks permissions dynamically.
17
+ * @template T - The data type being checked
18
+ * @template U - The user type (defaults to PermissionUser)
19
+ */
20
+ export type PermissionCheck<T, U = PermissionUser> = boolean | ((user?: U | string, data?: T) => boolean);
21
+
22
+ /**
23
+ * Page URL configuration for modules
24
+ */
25
+ export type PageUrl = {
26
+ pageUrl?: string;
27
+ };
28
+
29
+ /**
30
+ * Module permission definition wrapper
31
+ */
32
+ export type ModulePermissionDefinition<T> = {
33
+ interface: T;
34
+ };
35
+
36
+ /**
37
+ * Base module definition
38
+ */
39
+ export type ModuleDefinition = {
40
+ pageUrl?: string;
41
+ name: string;
42
+ model: any;
43
+ feature?: string;
44
+ moduleId?: string;
45
+ };
46
+
47
+ /**
48
+ * Permission configuration for a module.
49
+ * Can be a boolean (allow/deny all) or a string path for dynamic checks.
50
+ */
51
+ export interface PermissionConfig {
52
+ create: boolean | string;
53
+ read: boolean | string;
54
+ update: boolean | string;
55
+ delete: boolean | string;
56
+ }
57
+
58
+ /**
59
+ * Generic interface for a module that has permissions.
60
+ * Apps should ensure their Module class implements this.
61
+ */
62
+ export interface PermissionModule {
63
+ id: string;
64
+ permissions: PermissionConfig;
65
+ }
66
+
67
+ /**
68
+ * Generic interface for a user that has modules with permissions.
69
+ * Apps should ensure their User class implements this.
70
+ */
71
+ export interface PermissionUser {
72
+ id: string;
73
+ modules: PermissionModule[];
74
+ }
75
+
76
+ /**
77
+ * Module definition with permissions - extends ApiRequestDataTypeInterface
78
+ */
79
+ export type ModuleWithPermissions = ApiRequestDataTypeInterface & {
80
+ pageUrl?: string;
81
+ feature?: string;
82
+ moduleId?: string;
83
+ inclusions?: Record<
84
+ string,
85
+ {
86
+ types?: string[];
87
+ fields?: FieldSelector<any>[];
88
+ }
89
+ >;
90
+ };
91
+
92
+ /**
93
+ * Factory type for creating module definitions
94
+ */
95
+ export type ModuleFactory = (params: {
96
+ pageUrl?: string;
97
+ name: string;
98
+ cache?: string | "days" | "default" | "hours" | "max" | "minutes" | "seconds" | "weeks";
99
+ model: any;
100
+ feature?: string;
101
+ moduleId?: string;
102
+ inclusions?: Record<
103
+ string,
104
+ {
105
+ types?: string[];
106
+ fields?: FieldSelector<any>[];
107
+ }
108
+ >;
109
+ }) => ModuleWithPermissions;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Role ID configuration interface
3
+ * Apps provide their role IDs via configureRoles()
4
+ */
5
+ export interface RoleIdConfig {
6
+ Administrator: string;
7
+ CompanyAdministrator: string;
8
+ [key: string]: string; // Allow additional roles
9
+ }
10
+
11
+ // Private storage for the injected role IDs
12
+ let _roleId: RoleIdConfig | null = null;
13
+
14
+ /**
15
+ * Configure role IDs for the library
16
+ * Call this at app startup to provide role ID constants
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * import { configureRoles } from "@carlonicora/nextjs-jsonapi";
21
+ * import { RoleId } from "@phlow/shared";
22
+ *
23
+ * configureRoles(RoleId);
24
+ * ```
25
+ */
26
+ export function configureRoles(roleId: RoleIdConfig): void {
27
+ _roleId = roleId;
28
+ }
29
+
30
+ /**
31
+ * Get configured role IDs
32
+ * @throws Error if roles not configured
33
+ */
34
+ export function getRoleId(): RoleIdConfig {
35
+ if (!_roleId) {
36
+ throw new Error("Roles not configured. Call configureRoles() at app startup.");
37
+ }
38
+ return _roleId;
39
+ }
40
+
41
+ /**
42
+ * Check if roles have been configured
43
+ */
44
+ export function isRolesConfigured(): boolean {
45
+ return _roleId !== null;
46
+ }
@@ -0,0 +1 @@
1
+ export { configureRoles, getRoleId, isRolesConfigured, type RoleIdConfig } from "./config";