@carlonicora/nextjs-jsonapi 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/dist/{ApiResponseInterface-DDI7QQPR.d.ts → ApiResponseInterface-DMwITHYP.d.mts} +11 -2
  2. package/dist/{ApiResponseInterface-BHN5D9r5.d.mts → ApiResponseInterface-DWgIAXI-.d.ts} +11 -2
  3. package/dist/AuthComponent-hxOPs9o8.d.mts +11 -0
  4. package/dist/AuthComponent-hxOPs9o8.d.ts +11 -0
  5. package/dist/{BlockNoteEditor-G6AK2NWA.js → BlockNoteEditor-IJASTIUZ.js} +16 -23
  6. package/dist/BlockNoteEditor-IJASTIUZ.js.map +1 -0
  7. package/dist/{BlockNoteEditor-AIEEQM6A.mjs → BlockNoteEditor-M6TUP3NT.mjs} +8 -15
  8. package/dist/BlockNoteEditor-M6TUP3NT.mjs.map +1 -0
  9. package/dist/JsonApiRequest-2OM5NDAW.js +24 -0
  10. package/dist/JsonApiRequest-2OM5NDAW.js.map +1 -0
  11. package/dist/{JsonApiRequest-6UR7DIAR.mjs → JsonApiRequest-SYZ6FGCA.mjs} +2 -3
  12. package/dist/{chunk-2K3Q24UF.js → chunk-3ZPK4QOB.js} +24 -14
  13. package/dist/chunk-3ZPK4QOB.js.map +1 -0
  14. package/dist/{chunk-VET55IZO.js → chunk-4L7OWJ2P.js} +10290 -7537
  15. package/dist/chunk-4L7OWJ2P.js.map +1 -0
  16. package/dist/chunk-4U5CJA44.mjs +3435 -0
  17. package/dist/chunk-4U5CJA44.mjs.map +1 -0
  18. package/dist/chunk-AGWQ75PQ.js +142 -0
  19. package/dist/chunk-AGWQ75PQ.js.map +1 -0
  20. package/dist/{chunk-PMXG5WBC.js → chunk-CKS6SVUK.js} +160 -24
  21. package/dist/chunk-CKS6SVUK.js.map +1 -0
  22. package/dist/{chunk-YF5XQZDR.mjs → chunk-F5UNXZ3J.mjs} +1 -1
  23. package/dist/chunk-F5UNXZ3J.mjs.map +1 -0
  24. package/dist/chunk-IGOWVLJH.mjs +142 -0
  25. package/dist/chunk-IGOWVLJH.mjs.map +1 -0
  26. package/dist/{chunk-HR4H2FP7.mjs → chunk-KJ4ETLJB.mjs} +24 -14
  27. package/dist/chunk-KJ4ETLJB.mjs.map +1 -0
  28. package/dist/{chunk-IKBA4AHN.mjs → chunk-SAL7XW2G.mjs} +143 -7
  29. package/dist/chunk-SAL7XW2G.mjs.map +1 -0
  30. package/dist/chunk-TW4QRJ7D.mjs +12085 -0
  31. package/dist/chunk-TW4QRJ7D.mjs.map +1 -0
  32. package/dist/chunk-U4NADAHN.js +3435 -0
  33. package/dist/chunk-U4NADAHN.js.map +1 -0
  34. package/dist/{chunk-EFJEWLRL.js → chunk-YUO55Q5A.js} +1 -1
  35. package/dist/chunk-YUO55Q5A.js.map +1 -0
  36. package/dist/client/index.d.mts +161 -11
  37. package/dist/client/index.d.ts +161 -11
  38. package/dist/client/index.js +71 -11
  39. package/dist/client/index.js.map +1 -1
  40. package/dist/client/index.mjs +70 -10
  41. package/dist/components/index.d.mts +763 -11
  42. package/dist/components/index.d.ts +763 -11
  43. package/dist/components/index.js +462 -11
  44. package/dist/components/index.js.map +1 -1
  45. package/dist/components/index.mjs +463 -12
  46. package/dist/config-BdCV25CE.d.mts +69 -0
  47. package/dist/config-C9dt1QiR.d.ts +69 -0
  48. package/dist/content.fields-Ck5lkQ5d.d.mts +47 -0
  49. package/dist/content.fields-Ck5lkQ5d.d.ts +47 -0
  50. package/dist/{content.interface-CR2aBeAW.d.ts → content.interface-B6qP_ABq.d.mts} +2 -3
  51. package/dist/{content.interface-FpLfsaRm.d.mts → content.interface-DHAFLasV.d.ts} +2 -3
  52. package/dist/contexts/index.d.mts +13 -6
  53. package/dist/contexts/index.d.ts +13 -6
  54. package/dist/contexts/index.js +7 -11
  55. package/dist/contexts/index.js.map +1 -1
  56. package/dist/contexts/index.mjs +6 -10
  57. package/dist/core/index.d.mts +575 -8
  58. package/dist/core/index.d.ts +575 -8
  59. package/dist/core/index.js +131 -3
  60. package/dist/core/index.js.map +1 -1
  61. package/dist/core/index.mjs +132 -4
  62. package/dist/index.d.mts +95 -71
  63. package/dist/index.d.ts +95 -71
  64. package/dist/index.js +113 -7
  65. package/dist/index.js.map +1 -1
  66. package/dist/index.mjs +135 -29
  67. package/dist/notification.interface-agcMYCkg.d.mts +228 -0
  68. package/dist/notification.interface-agcMYCkg.d.ts +228 -0
  69. package/dist/request-GBLBPYFM.js +8 -0
  70. package/dist/request-GBLBPYFM.js.map +1 -0
  71. package/dist/request-XABCMU25.mjs +8 -0
  72. package/dist/s3.service-DYnmymEd.d.mts +350 -0
  73. package/dist/s3.service-DyXjKTqr.d.ts +350 -0
  74. package/dist/server/index.d.mts +69 -4
  75. package/dist/server/index.d.ts +69 -4
  76. package/dist/server/index.js +211 -5
  77. package/dist/server/index.js.map +1 -1
  78. package/dist/server/index.mjs +211 -5
  79. package/dist/server/index.mjs.map +1 -1
  80. package/dist/token-2UWQJY5T.js +8 -0
  81. package/dist/token-2UWQJY5T.js.map +1 -0
  82. package/dist/token-EOK3N45S.mjs +8 -0
  83. package/dist/{useSocket-L-An7_Mr.d.mts → useSocket-91s8M4Xd.d.mts} +1 -1
  84. package/dist/{useSocket-BV6yMdWS.d.ts → useSocket-DSR7vaXj.d.ts} +1 -1
  85. package/package.json +12 -52
  86. package/src/client/JsonApiClient.ts +248 -0
  87. package/src/client/config.ts +78 -0
  88. package/src/client/index.ts +6 -1
  89. package/src/components/containers/TabsContainer.tsx +1 -1
  90. package/src/components/editors/BlockNoteEditor.tsx +3 -1
  91. package/src/components/index.ts +4 -0
  92. package/src/components/navigations/Breadcrumb.tsx +1 -1
  93. package/src/components/navigations/Header.tsx +2 -2
  94. package/src/contexts/CommonContext.tsx +1 -1
  95. package/src/contexts/SocketContext.tsx +1 -1
  96. package/src/contexts/index.ts +3 -0
  97. package/src/core/abstracts/ClientAbstractService.ts +255 -0
  98. package/src/core/abstracts/ServerAbstractService.ts +180 -0
  99. package/src/core/abstracts/index.ts +2 -0
  100. package/src/core/index.ts +35 -3
  101. package/src/discord/config.ts +15 -0
  102. package/src/discord/index.ts +1 -0
  103. package/src/features/auth/components/details/LandingComponent.tsx +2 -2
  104. package/src/features/auth/components/forms/AcceptInvitation.tsx +1 -1
  105. package/src/features/auth/components/forms/ActivateAccount.tsx +1 -1
  106. package/src/features/auth/components/forms/Cookies.tsx +2 -1
  107. package/src/features/auth/components/forms/ForgotPassword.tsx +1 -1
  108. package/src/features/auth/components/forms/Login.tsx +1 -1
  109. package/src/features/auth/components/forms/Logout.tsx +1 -1
  110. package/src/features/auth/components/forms/RefreshUser.tsx +2 -1
  111. package/src/features/auth/components/forms/Register.tsx +1 -1
  112. package/src/features/auth/components/forms/ResetPassword.tsx +1 -1
  113. package/src/features/auth/data/auth.service.ts +1 -1
  114. package/src/features/auth/utils/AuthCookies.ts +1 -1
  115. package/src/features/company/components/forms/CompanyConfigurationEditor.tsx +4 -2
  116. package/src/features/company/components/forms/CompanyDeleter.tsx +2 -1
  117. package/src/features/company/components/forms/CompanyEditor.tsx +6 -3
  118. package/src/features/company/components/forms/CompanyLicense.tsx +4 -2
  119. package/src/features/company/components/lists/CompaniesList.tsx +2 -1
  120. package/src/features/content/components/lists/ContentsListById.tsx +2 -1
  121. package/src/features/content/components/lists/RelevantContentsList.tsx +2 -1
  122. package/src/features/notification/components/lists/NotificationsList.tsx +2 -1
  123. package/src/features/notification/contexts/NotificationContext.tsx +2 -1
  124. package/src/features/role/components/forms/RemoveUserFromRole.tsx +4 -2
  125. package/src/features/role/components/forms/UserRoleAdd.tsx +2 -1
  126. package/src/features/role/components/lists/RolesList.tsx +2 -1
  127. package/src/features/role/components/lists/UserRolesList.tsx +2 -1
  128. package/src/features/user/components/forms/RoleUserAdd.tsx +4 -2
  129. package/src/features/user/components/forms/UserDeleter.tsx +2 -1
  130. package/src/features/user/components/forms/UserEditor.tsx +6 -3
  131. package/src/features/user/components/forms/UserMultiSelect.tsx +2 -1
  132. package/src/features/user/components/forms/UserReactivator.tsx +2 -1
  133. package/src/features/user/components/forms/UserResentInvitationEmail.tsx +2 -1
  134. package/src/features/user/components/forms/UserSelector.tsx +2 -1
  135. package/src/features/user/components/lists/AdminUsersList.tsx +2 -1
  136. package/src/features/user/components/lists/CompanyUsersList.tsx +2 -1
  137. package/src/features/user/components/lists/RelevantUsersList.tsx +2 -1
  138. package/src/features/user/components/lists/RoleUsersList.tsx +2 -1
  139. package/src/features/user/components/lists/UsersListByContentIds.tsx +2 -1
  140. package/src/features/user/hooks/useUserSearch.ts +2 -1
  141. package/src/hooks/useDataListRetriever.ts +4 -4
  142. package/src/hooks/usePageTracker.ts +1 -1
  143. package/src/hooks/usePushNotifications.ts +3 -2
  144. package/src/hooks/useSocket.ts +1 -1
  145. package/src/index.ts +7 -2
  146. package/src/roles/config.ts +0 -15
  147. package/src/roles/index.ts +1 -9
  148. package/src/server/JsonApiServer.ts +249 -0
  149. package/src/server/cache.ts +1 -1
  150. package/src/server/index.ts +13 -0
  151. package/src/server/request.ts +32 -18
  152. package/src/server/token.ts +1 -1
  153. package/dist/AbstractService-BsY6W3Ej.d.mts +0 -109
  154. package/dist/AbstractService-wLid8dB0.d.ts +0 -109
  155. package/dist/ApiData-DPKNfY-9.d.mts +0 -10
  156. package/dist/ApiData-DPKNfY-9.d.ts +0 -10
  157. package/dist/ApiDataInterface-DPP8s46n.d.mts +0 -21
  158. package/dist/ApiDataInterface-DPP8s46n.d.ts +0 -21
  159. package/dist/AuthComponent-B_Ps2Vb9.d.ts +0 -78
  160. package/dist/AuthComponent-CxnGgvoh.d.mts +0 -78
  161. package/dist/BlockNoteEditor-AIEEQM6A.mjs.map +0 -1
  162. package/dist/BlockNoteEditor-G6AK2NWA.js.map +0 -1
  163. package/dist/JsonApiRequest-UJ7FGIVI.js +0 -25
  164. package/dist/JsonApiRequest-UJ7FGIVI.js.map +0 -1
  165. package/dist/atoms/index.d.mts +0 -12
  166. package/dist/atoms/index.d.ts +0 -12
  167. package/dist/atoms/index.js +0 -9
  168. package/dist/atoms/index.js.map +0 -1
  169. package/dist/atoms/index.mjs +0 -9
  170. package/dist/chunk-2K3Q24UF.js.map +0 -1
  171. package/dist/chunk-32HM6MDD.js +0 -98
  172. package/dist/chunk-32HM6MDD.js.map +0 -1
  173. package/dist/chunk-3FBCC4G3.js +0 -8
  174. package/dist/chunk-3FBCC4G3.js.map +0 -1
  175. package/dist/chunk-3UELCPIN.js +0 -46
  176. package/dist/chunk-3UELCPIN.js.map +0 -1
  177. package/dist/chunk-5IET37O4.js +0 -4210
  178. package/dist/chunk-5IET37O4.js.map +0 -1
  179. package/dist/chunk-AGAJMJ4T.js +0 -147
  180. package/dist/chunk-AGAJMJ4T.js.map +0 -1
  181. package/dist/chunk-AYHKQWHH.js +0 -68
  182. package/dist/chunk-AYHKQWHH.js.map +0 -1
  183. package/dist/chunk-DEYKTLA3.js +0 -1131
  184. package/dist/chunk-DEYKTLA3.js.map +0 -1
  185. package/dist/chunk-EFJEWLRL.js.map +0 -1
  186. package/dist/chunk-FMBQZAIP.mjs +0 -490
  187. package/dist/chunk-FMBQZAIP.mjs.map +0 -1
  188. package/dist/chunk-HAG77QBV.mjs +0 -98
  189. package/dist/chunk-HAG77QBV.mjs.map +0 -1
  190. package/dist/chunk-HR4H2FP7.mjs.map +0 -1
  191. package/dist/chunk-IKBA4AHN.mjs.map +0 -1
  192. package/dist/chunk-J7YDGYSW.mjs +0 -9332
  193. package/dist/chunk-J7YDGYSW.mjs.map +0 -1
  194. package/dist/chunk-JGFWIT2E.mjs +0 -1131
  195. package/dist/chunk-JGFWIT2E.mjs.map +0 -1
  196. package/dist/chunk-P2F54I7Q.mjs +0 -4210
  197. package/dist/chunk-P2F54I7Q.mjs.map +0 -1
  198. package/dist/chunk-PMXG5WBC.js.map +0 -1
  199. package/dist/chunk-Q2N6SQYW.mjs +0 -8
  200. package/dist/chunk-Q2N6SQYW.mjs.map +0 -1
  201. package/dist/chunk-Q4FXESVT.js +0 -490
  202. package/dist/chunk-Q4FXESVT.js.map +0 -1
  203. package/dist/chunk-RBIVEH2K.mjs +0 -147
  204. package/dist/chunk-RBIVEH2K.mjs.map +0 -1
  205. package/dist/chunk-SM63SZCP.mjs +0 -68
  206. package/dist/chunk-SM63SZCP.mjs.map +0 -1
  207. package/dist/chunk-SZZYEG3P.mjs +0 -46
  208. package/dist/chunk-SZZYEG3P.mjs.map +0 -1
  209. package/dist/chunk-VET55IZO.js.map +0 -1
  210. package/dist/chunk-YF5XQZDR.mjs.map +0 -1
  211. package/dist/config-BmnK65TD.d.mts +0 -35
  212. package/dist/config-BmnK65TD.d.ts +0 -35
  213. package/dist/config-DQeAo9Kf.d.mts +0 -49
  214. package/dist/config-DQeAo9Kf.d.ts +0 -49
  215. package/dist/content.fields-cHPdM8GJ.d.mts +0 -27
  216. package/dist/content.fields-cHPdM8GJ.d.ts +0 -27
  217. package/dist/d3.link.interface-ClC4Irqp.d.mts +0 -21
  218. package/dist/d3.link.interface-ClC4Irqp.d.ts +0 -21
  219. package/dist/features/index.d.mts +0 -477
  220. package/dist/features/index.d.ts +0 -477
  221. package/dist/features/index.js +0 -108
  222. package/dist/features/index.js.map +0 -1
  223. package/dist/features/index.mjs +0 -108
  224. package/dist/hooks/index.d.mts +0 -69
  225. package/dist/hooks/index.d.ts +0 -69
  226. package/dist/hooks/index.js +0 -55
  227. package/dist/hooks/index.js.map +0 -1
  228. package/dist/hooks/index.mjs +0 -55
  229. package/dist/hooks/index.mjs.map +0 -1
  230. package/dist/interfaces/index.d.mts +0 -4
  231. package/dist/interfaces/index.d.ts +0 -4
  232. package/dist/interfaces/index.js +0 -2
  233. package/dist/interfaces/index.js.map +0 -1
  234. package/dist/interfaces/index.mjs +0 -2
  235. package/dist/interfaces/index.mjs.map +0 -1
  236. package/dist/notification.interface-B2BrLoDA.d.mts +0 -14
  237. package/dist/notification.interface-DlZLnAfg.d.ts +0 -14
  238. package/dist/permissions/index.d.mts +0 -41
  239. package/dist/permissions/index.d.ts +0 -41
  240. package/dist/permissions/index.js +0 -14
  241. package/dist/permissions/index.js.map +0 -1
  242. package/dist/permissions/index.mjs +0 -14
  243. package/dist/permissions/index.mjs.map +0 -1
  244. package/dist/request-7FE3LJLV.mjs +0 -9
  245. package/dist/request-7FE3LJLV.mjs.map +0 -1
  246. package/dist/request-QFS7NEIE.js +0 -9
  247. package/dist/request-QFS7NEIE.js.map +0 -1
  248. package/dist/roles/index.d.mts +0 -39
  249. package/dist/roles/index.d.ts +0 -39
  250. package/dist/roles/index.js +0 -18
  251. package/dist/roles/index.js.map +0 -1
  252. package/dist/roles/index.mjs +0 -18
  253. package/dist/roles/index.mjs.map +0 -1
  254. package/dist/shadcnui/index.d.mts +0 -698
  255. package/dist/shadcnui/index.d.ts +0 -698
  256. package/dist/shadcnui/index.js +0 -468
  257. package/dist/shadcnui/index.js.map +0 -1
  258. package/dist/shadcnui/index.mjs +0 -467
  259. package/dist/shadcnui/index.mjs.map +0 -1
  260. package/dist/token-IJSPOMW6.mjs +0 -9
  261. package/dist/token-IJSPOMW6.mjs.map +0 -1
  262. package/dist/token-UYE7CV6X.js +0 -9
  263. package/dist/token-UYE7CV6X.js.map +0 -1
  264. package/dist/types-B2QRyqyK.d.ts +0 -39
  265. package/dist/types-CgvNmxTd.d.mts +0 -39
  266. package/dist/types-t2PyXhDu.d.mts +0 -116
  267. package/dist/types-t2PyXhDu.d.ts +0 -116
  268. package/dist/user.interface-CooB1R79.d.mts +0 -85
  269. package/dist/user.interface-KnIT9pVY.d.ts +0 -85
  270. package/dist/utils/index.d.mts +0 -224
  271. package/dist/utils/index.d.ts +0 -224
  272. package/dist/utils/index.js +0 -46
  273. package/dist/utils/index.js.map +0 -1
  274. package/dist/utils/index.mjs +0 -46
  275. package/dist/utils/index.mjs.map +0 -1
  276. /package/dist/{JsonApiRequest-6UR7DIAR.mjs.map → JsonApiRequest-SYZ6FGCA.mjs.map} +0 -0
  277. /package/dist/{atoms/index.mjs.map → request-XABCMU25.mjs.map} +0 -0
  278. /package/dist/{features/index.mjs.map → token-EOK3N45S.mjs.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/factories/RehydrationFactory.ts","../src/core/abstracts/AbstractApiData.ts","../src/core/abstracts/AbstractService.ts","../src/core/registry/ModuleRegistrar.ts","../src/core/registry/ModuleRegistry.ts","../src/core/endpoint/EndpointCreator.ts","../src/core/fields/FieldSelector.ts","../src/core/utils/rehydrate.ts"],"sourcesContent":["import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { JsonApiHydratedDataInterface } from \"../interfaces/JsonApiHydratedDataInterface\";\nimport { DataClassRegistry } from \"../registry/DataClassRegistry\";\n\nexport class RehydrationFactory {\n public static rehydrate<T extends ApiDataInterface>(\n classKey: ApiRequestDataTypeInterface,\n data: JsonApiHydratedDataInterface,\n ): T {\n const factoryClass = DataClassRegistry.get(classKey);\n\n const instance = new factoryClass();\n return instance.rehydrate(data) as T;\n }\n\n public static rehydrateList<T extends ApiDataInterface>(\n classKey: ApiRequestDataTypeInterface,\n data: JsonApiHydratedDataInterface[],\n ): T[] {\n const factoryClass = DataClassRegistry.get(classKey);\n\n const response = data.map((item: JsonApiHydratedDataInterface) => {\n const instance = new factoryClass();\n return instance.rehydrate(item) as T;\n });\n\n return response;\n }\n}\n","import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { JsonApiHydratedDataInterface } from \"../interfaces/JsonApiHydratedDataInterface\";\nimport { RehydrationFactory } from \"../factories/RehydrationFactory\";\n\nexport abstract class AbstractApiData implements ApiDataInterface {\n protected _jsonApi?: any;\n protected _included?: any[];\n\n protected _id?: string;\n protected _type?: string;\n protected _createdAt?: Date;\n protected _updatedAt?: Date;\n\n protected _self?: string;\n\n get type(): string {\n if (!this._type) throw new Error(\"Type is not set.\");\n return this._type;\n }\n\n get id(): string {\n if (!this._id) throw new Error(\"Id is not set.\");\n return this._id;\n }\n\n get self(): string | undefined {\n return this._self;\n }\n\n get createdAt(): Date {\n return this._createdAt ?? new Date();\n }\n\n get updatedAt(): Date {\n return this._updatedAt ?? new Date();\n }\n\n get included(): any[] {\n return this._included ?? [];\n }\n\n get jsonApi(): any {\n return this._jsonApi;\n }\n\n ingestJsonApi(_data: JsonApiHydratedDataInterface): void {}\n\n generateApiUrl(_params?: any): string {\n throw new Error(\"Method not implemented.\");\n }\n\n createJsonApi(_data?: any): any {\n throw new Error(\"Method not implemented.\");\n }\n\n protected _readIncluded<T extends ApiDataInterface>(\n data: JsonApiHydratedDataInterface,\n type: string,\n dataType: ApiRequestDataTypeInterface,\n ): T | T[] | undefined {\n if (\n data.included === undefined ||\n data.included.length === 0 ||\n data.jsonApi.relationships === undefined ||\n data.jsonApi.relationships[type] === undefined ||\n data.jsonApi.relationships[type].data === undefined\n ) {\n return undefined;\n }\n\n if (Array.isArray(data.jsonApi.relationships[type].data)) {\n const response: T[] = data.jsonApi.relationships[type].data.map((jsonApiData: any) => {\n const includedData = data.included.find(\n (includedData: any) => includedData.id === jsonApiData.id && includedData.type === jsonApiData.type,\n );\n\n if (includedData === undefined) return undefined;\n\n return RehydrationFactory.rehydrate(dataType, {\n jsonApi: includedData,\n included: data.included,\n }) as T;\n });\n\n return response.filter((item: T | undefined) => item !== undefined) as T[];\n }\n\n const includedData = data.included.find(\n (includedData: any) =>\n includedData.id === data.jsonApi.relationships[type].data.id &&\n includedData.type === data.jsonApi.relationships[type].data.type,\n );\n\n if (includedData === undefined && data.allData !== undefined) {\n // Try to find in allData as a fallback\n const fallbackData = data.allData.find(\n (includedData: any) =>\n includedData.id === data.jsonApi.relationships[type].data.id &&\n includedData.type === data.jsonApi.relationships[type].data.type,\n );\n if (fallbackData !== undefined) {\n return RehydrationFactory.rehydrate(dataType, {\n jsonApi: fallbackData,\n included: data.included,\n }) as T;\n }\n }\n\n if (includedData === undefined) return undefined;\n\n return RehydrationFactory.rehydrate(dataType, {\n jsonApi: includedData,\n included: data.included,\n }) as T;\n }\n\n dehydrate(): JsonApiHydratedDataInterface {\n return {\n jsonApi: this._jsonApi,\n included: this._included ?? [],\n };\n }\n\n rehydrate(data: JsonApiHydratedDataInterface): this {\n this._jsonApi = data.jsonApi;\n this._included = data.included;\n\n this._type = this._jsonApi.type;\n this._id = this._jsonApi.id;\n this._createdAt = this._jsonApi.meta?.createdAt !== undefined ? new Date(this._jsonApi.meta.createdAt) : undefined;\n this._updatedAt = this._jsonApi.meta?.updatedAt !== undefined ? new Date(this._jsonApi.meta.updatedAt) : undefined;\n\n this._self = this._jsonApi.links?.self ?? undefined;\n\n return this;\n }\n}\n","import { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../interfaces/ApiResponseInterface\";\n\nexport enum HttpMethod {\n GET = \"GET\",\n POST = \"POST\",\n PUT = \"PUT\",\n PATCH = \"PATCH\",\n DELETE = \"DELETE\",\n}\n\nexport interface NextRef {\n next?: string;\n}\n\nexport interface PreviousRef {\n previous?: string;\n}\n\nexport interface SelfRef {\n self?: string;\n}\n\nlet globalErrorHandler: ((status: number, message: string) => void) | null = null;\n\n/**\n * Set a global error handler for API errors (client-side only).\n * This handler will be called instead of throwing errors.\n */\nexport function setGlobalErrorHandler(handler: (status: number, message: string) => void) {\n globalErrorHandler = handler;\n}\n\n/**\n * Get the current global error handler.\n */\nexport function getGlobalErrorHandler(): ((status: number, message: string) => void) | null {\n return globalErrorHandler;\n}\n\n/**\n * Abstract base class for services that interact with the JSON:API.\n * Extend this class to create feature-specific services.\n */\nexport abstract class AbstractService {\n /**\n * Extract locale from client-side URL pathname\n * URL structure: /{locale}/route-path (e.g., /it/accounts)\n * Fallback chain: URL locale → navigator.language → \"en\"\n */\n private static getClientLocale(): string {\n if (typeof window === \"undefined\") {\n return \"en\"; // Server-side fallback\n }\n\n // Extract locale from URL pathname (first segment after leading slash)\n const pathSegments = window.location.pathname.split(\"/\").filter(Boolean);\n const urlLocale = pathSegments[0];\n\n // Validate against supported locales (currently only \"en\")\n const supportedLocales = [\"en\"];\n if (urlLocale && supportedLocales.includes(urlLocale)) {\n return urlLocale;\n }\n\n // Fallback to navigator language\n const navigatorLocale = navigator.language.split(\"-\")[0];\n if (navigatorLocale && supportedLocales.includes(navigatorLocale)) {\n return navigatorLocale;\n }\n\n // Final fallback\n return \"en\";\n }\n\n static async next<T>(params: {\n type: ApiRequestDataTypeInterface;\n endpoint: string;\n next?: NextRef;\n previous?: PreviousRef;\n self?: SelfRef;\n }): Promise<T> {\n return await this.callApi<T>({\n method: HttpMethod.GET,\n type: params.type,\n endpoint: params.endpoint,\n next: params.next,\n previous: params.previous,\n self: params.self,\n });\n }\n\n /**\n * Fetch the previous page of results.\n */\n static async previous<T>(params: {\n type: ApiRequestDataTypeInterface;\n endpoint: string;\n next?: NextRef;\n previous?: PreviousRef;\n self?: SelfRef;\n }): Promise<T> {\n return await this.callApi<T>({\n method: HttpMethod.GET,\n type: params.type,\n endpoint: params.endpoint,\n next: params.next,\n previous: params.previous,\n self: params.self,\n });\n }\n\n /**\n * Make an API call with automatic environment detection and error handling.\n */\n protected static async callApi<T>(params: {\n type: ApiRequestDataTypeInterface;\n method: HttpMethod;\n endpoint: string;\n companyId?: string;\n input?: any;\n overridesJsonApiCreation?: boolean;\n next?: NextRef;\n previous?: PreviousRef;\n self?: SelfRef;\n responseType?: ApiRequestDataTypeInterface;\n files?: { [key: string]: File | Blob } | File | Blob;\n }): Promise<T> {\n // Dynamic import to avoid bundling issues\n const { JsonApiGet, JsonApiPost, JsonApiPut, JsonApiPatch, JsonApiDelete } =\n await import(\"../../unified/JsonApiRequest\");\n\n let apiResponse: ApiResponseInterface;\n\n // Get language based on environment\n let language = \"en\";\n if (typeof window === \"undefined\") {\n const { getLocale } = await import(\"next-intl/server\");\n language = (await getLocale()) ?? \"en\";\n } else {\n // Client-side: extract locale from URL pathname\n language = this.getClientLocale();\n }\n\n switch (params.method) {\n case HttpMethod.GET:\n apiResponse = await JsonApiGet({\n classKey: params.type,\n endpoint: params.endpoint,\n companyId: params.companyId,\n language: language,\n });\n break;\n case HttpMethod.POST:\n apiResponse = await JsonApiPost({\n classKey: params.type,\n endpoint: params.endpoint,\n companyId: params.companyId,\n body: params.input,\n overridesJsonApiCreation: params.overridesJsonApiCreation,\n language: language,\n responseType: params.responseType,\n files: params.files,\n });\n break;\n case HttpMethod.PUT:\n apiResponse = await JsonApiPut({\n classKey: params.type,\n endpoint: params.endpoint,\n companyId: params.companyId,\n body: params.input,\n language: language,\n responseType: params.responseType,\n files: params.files,\n });\n break;\n case HttpMethod.PATCH:\n apiResponse = await JsonApiPatch({\n classKey: params.type,\n endpoint: params.endpoint,\n companyId: params.companyId,\n body: params.input,\n overridesJsonApiCreation: params.overridesJsonApiCreation,\n language: language,\n responseType: params.responseType,\n files: params.files,\n });\n break;\n case HttpMethod.DELETE:\n apiResponse = await JsonApiDelete({\n classKey: params.type,\n endpoint: params.endpoint,\n companyId: params.companyId,\n language: language,\n responseType: params.responseType,\n });\n break;\n default:\n throw new Error(\"Method not found\");\n }\n\n if (!apiResponse.ok) {\n if (globalErrorHandler && typeof window !== \"undefined\") {\n globalErrorHandler(apiResponse.response, apiResponse.error);\n return undefined as any;\n } else {\n const error = new Error(`${apiResponse.response}:${apiResponse.error}`) as any;\n error.status = apiResponse.response;\n error.digest = `HTTP_${apiResponse.response}`;\n throw error;\n }\n }\n\n if (apiResponse.next && params.next) params.next.next = apiResponse.next;\n if (apiResponse.prev && params.previous) params.previous.previous = apiResponse.prev;\n if (apiResponse.self && params.self) params.self.self = apiResponse.self;\n\n return apiResponse.data as T;\n }\n\n /**\n * Get raw JSON:API response data without deserialization.\n */\n protected static async getRawData(params: {\n type: ApiRequestDataTypeInterface;\n method: HttpMethod;\n endpoint: string;\n companyId?: string;\n }): Promise<any> {\n const { JsonApiGet } = await import(\"../../unified/JsonApiRequest\");\n\n let language = \"en\";\n\n if (typeof window === \"undefined\") {\n const { getLocale } = await import(\"next-intl/server\");\n language = (await getLocale()) ?? \"en\";\n } else {\n // Client-side: extract locale from URL pathname\n language = this.getClientLocale();\n }\n\n const apiResponse: ApiResponseInterface = await JsonApiGet({\n classKey: params.type,\n endpoint: params.endpoint,\n companyId: params.companyId,\n language: language,\n });\n\n if (!apiResponse.ok) {\n if (globalErrorHandler && typeof window !== \"undefined\") {\n globalErrorHandler(apiResponse.response, apiResponse.error);\n return undefined as any;\n } else {\n const error = new Error(`${apiResponse.response}:${apiResponse.error}`) as any;\n error.status = apiResponse.response;\n error.digest = `HTTP_${apiResponse.response}`;\n throw error;\n }\n }\n\n return apiResponse.raw;\n }\n}\n","import { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { DataClassRegistry } from \"./DataClassRegistry\";\n\n/**\n * Helper class to bootstrap the registry from a Modules-style class.\n * This supports the pattern where modules are defined as static getters.\n */\nexport class ModuleRegistrar {\n private static _isBootstrapped = false;\n\n /**\n * Bootstrap the registry from a Modules class.\n * Automatically detects static getters and registers their models.\n *\n * @param modulesClass - The Modules class with static getters\n */\n static bootstrap<T extends object>(modulesClass: T): void {\n if (this._isBootstrapped) return;\n\n const data = Object.getOwnPropertyNames(modulesClass)\n .filter((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(modulesClass, key);\n return descriptor && typeof descriptor.get === \"function\";\n })\n .map((key) => (modulesClass as any)[key] as ApiRequestDataTypeInterface);\n\n data.forEach((item) => {\n if (item && item.model) {\n DataClassRegistry.registerObjectClass(item, item.model);\n }\n });\n\n this._isBootstrapped = true;\n }\n\n /**\n * Reset the bootstrapped state. Useful for testing.\n */\n static reset(): void {\n this._isBootstrapped = false;\n DataClassRegistry.clear();\n }\n}\n","import { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { ModuleWithPermissions } from \"../../permissions/types\";\n\n// Foundation module types - defined by LIBRARY\nexport interface FoundationModuleDefinitions {\n S3: ModuleWithPermissions;\n Auth: ModuleWithPermissions;\n User: ModuleWithPermissions;\n Author: ModuleWithPermissions;\n Company: ModuleWithPermissions;\n Role: ModuleWithPermissions;\n Notification: ModuleWithPermissions;\n Push: ModuleWithPermissions;\n Feature: ModuleWithPermissions;\n Module: ModuleWithPermissions;\n Content: ModuleWithPermissions;\n UserTopic: ModuleWithPermissions;\n UserExpertise: ModuleWithPermissions;\n}\n\n// App-specific modules - apps will augment this interface ONLY\n\nexport interface AppModuleDefinitions {}\n\n// Combined type for full autocompletion\nexport type ModuleDefinitions = FoundationModuleDefinitions & AppModuleDefinitions;\n\nclass ModuleRegistryClass {\n private _modules: Map<string, ApiRequestDataTypeInterface> = new Map();\n\n register<K extends string>(name: K, module: ApiRequestDataTypeInterface): void {\n this._modules.set(name, module);\n }\n\n get<K extends keyof ModuleDefinitions>(name: K): ModuleDefinitions[K] {\n const module = this._modules.get(name as string);\n if (!module) {\n throw new Error(`Module \"${String(name)}\" not registered. Call bootstrap() first.`);\n }\n return module as ModuleDefinitions[K];\n }\n\n findByName(moduleName: string): ModuleWithPermissions {\n // Search by module's name property (e.g., \"topics\", \"articles\")\n for (const module of this._modules.values()) {\n if ((module as ModuleWithPermissions).name === moduleName) {\n return module as ModuleWithPermissions;\n }\n }\n throw new Error(`Module not found: ${moduleName}`);\n }\n\n findByModelName(modelName: string): ModuleWithPermissions {\n // Direct lookup by registry key (e.g., \"Article\", \"Document\")\n const module = this._modules.get(modelName);\n if (!module) {\n throw new Error(`Module not found for model: ${modelName}`);\n }\n return module as ModuleWithPermissions;\n }\n}\n\nexport const ModuleRegistry = new ModuleRegistryClass();\n\n// Proxy object for Modules.X syntax with autocompletion\nexport const Modules = new Proxy({} as ModuleDefinitions, {\n get(_, prop: string) {\n if (prop === \"findByName\") {\n return (name: string) => ModuleRegistry.findByName(name);\n }\n if (prop === \"findByModelName\") {\n return (name: string) => ModuleRegistry.findByModelName(name);\n }\n return ModuleRegistry.get(prop as keyof ModuleDefinitions);\n },\n}) as ModuleDefinitions & {\n findByName: (name: string) => ModuleWithPermissions;\n findByModelName: (name: string) => ModuleWithPermissions;\n};\n","import { FieldSelector } from \"../fields/FieldSelector\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\n\nexport type EndpointQuery = {\n endpoint: ApiRequestDataTypeInterface;\n id?: string;\n childEndpoint?: ApiRequestDataTypeInterface | string;\n childId?: string;\n additionalParams?: { key: string; value: string | string[] }[];\n};\n\nexport class EndpointCreator {\n private _endpoint: EndpointQuery;\n\n constructor(params: {\n endpoint: ApiRequestDataTypeInterface;\n id?: string;\n childEndpoint?: ApiRequestDataTypeInterface | string;\n childId?: string;\n additionalParams?: { key: string; value: string }[];\n }) {\n this._endpoint = {\n endpoint: params.endpoint,\n id: params.id,\n childEndpoint: params.childEndpoint,\n childId: params.childId,\n additionalParams: params.additionalParams ?? [],\n };\n }\n\n endpoint(value: ApiRequestDataTypeInterface): EndpointCreator {\n this._endpoint.endpoint = value;\n return this;\n }\n\n id(value: string): EndpointCreator {\n this._endpoint.id = value;\n return this;\n }\n\n childEndpoint(value: ApiRequestDataTypeInterface | string): EndpointCreator {\n this._endpoint.childEndpoint = value;\n return this;\n }\n\n childId(value: string): EndpointCreator {\n this._endpoint.childId = value;\n return this;\n }\n\n set additionalParams(value: { key: string; value: string }[]) {\n this._endpoint.additionalParams = value;\n }\n\n addAdditionalParam(key: string, value: string | string[]): EndpointCreator {\n if (!this._endpoint.additionalParams) this._endpoint.additionalParams = [];\n this._endpoint.additionalParams.push({ key, value });\n return this;\n }\n\n limitToType(selectors: string[]): this {\n this.addAdditionalParam(`include`, selectors.join(\",\"));\n return this;\n }\n\n limitToFields(selectors: FieldSelector<any>[]): this {\n if (selectors.length === 0) return this;\n\n selectors.forEach((selector) => {\n const fieldString = selector.fields.join(\",\");\n this.addAdditionalParam(`fields[${selector.type}]`, fieldString);\n });\n\n return this;\n }\n\n generate(): string {\n let additionalParams = \"\";\n if (this._endpoint.additionalParams) {\n additionalParams = this._endpoint.additionalParams.map((param) => `${param.key}=${param.value}`).join(\"&\");\n }\n\n let response = `${this._endpoint.endpoint.name}`;\n if (this._endpoint.id) response += `/${this._endpoint.id}`;\n if (this._endpoint.childEndpoint) {\n response += `/${\n typeof this._endpoint.childEndpoint === \"string\"\n ? this._endpoint.childEndpoint\n : this._endpoint.childEndpoint.name\n }`;\n }\n if (this._endpoint.childId) response += `/${this._endpoint.childId}`;\n if (additionalParams) response += `?${additionalParams}`;\n\n return response;\n }\n}\n","export type GetterKeys<T> = {\n [K in keyof T]: T[K] extends () => any ? never : K;\n}[keyof T];\n\nexport type FieldSelector<T> = {\n type: string;\n fields: ReadonlyArray<GetterKeys<T>>;\n};\n\nexport function createJsonApiInclusion<T>(dataType: string, fields: ReadonlyArray<GetterKeys<T>>): FieldSelector<T> {\n return {\n type: dataType,\n fields,\n };\n}\n","import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { JsonApiHydratedDataInterface } from \"../interfaces/JsonApiHydratedDataInterface\";\nimport { RehydrationFactory } from \"../factories/RehydrationFactory\";\n\n/**\n * Rehydrate a single dehydrated object back into its typed class instance.\n */\nexport function rehydrate<T extends ApiDataInterface>(\n classKey: ApiRequestDataTypeInterface,\n data: JsonApiHydratedDataInterface,\n): T {\n return RehydrationFactory.rehydrate(classKey, data) as T;\n}\n\n/**\n * Rehydrate a list of dehydrated objects back into typed class instances.\n */\nexport function rehydrateList<T extends ApiDataInterface>(\n classKey: ApiRequestDataTypeInterface,\n data: JsonApiHydratedDataInterface[],\n): T[] {\n return RehydrationFactory.rehydrateList(classKey, data) as T[];\n}\n"],"mappings":"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","names":["includedData","HttpMethod"]}
@@ -1,98 +0,0 @@
1
- import {
2
- __name
3
- } from "./chunk-PAWJFY3S.mjs";
4
-
5
- // src/permissions/types.ts
6
- var Action = /* @__PURE__ */ ((Action2) => {
7
- Action2["Read"] = "read";
8
- Action2["Create"] = "create";
9
- Action2["Update"] = "update";
10
- Action2["Delete"] = "delete";
11
- return Action2;
12
- })(Action || {});
13
-
14
- // src/permissions/check.ts
15
- function checkPermissions(params) {
16
- const selectedModule = params.user.modules.find((module) => module.id === params.module.moduleId);
17
- if (!selectedModule) return false;
18
- const permissionConfig = selectedModule.permissions[params.action];
19
- if (!permissionConfig) return false;
20
- if (typeof permissionConfig === "boolean") return permissionConfig;
21
- if (!params.data) return true;
22
- try {
23
- const singlePermissionConfig = permissionConfig.split("|").map((p) => p.trim());
24
- for (const path of singlePermissionConfig) {
25
- if (getValueFromPath(params.data, path, params.user.id)) return true;
26
- }
27
- return false;
28
- } catch {
29
- if (typeof permissionConfig === "string") {
30
- return getValueFromPath(params.data, permissionConfig, params.user.id);
31
- }
32
- }
33
- return false;
34
- }
35
- __name(checkPermissions, "checkPermissions");
36
- function checkPermissionsFromServer(params) {
37
- if (!params.selectedModule) return false;
38
- const permissionConfig = params.selectedModule.permissions[params.action];
39
- if (!permissionConfig) return false;
40
- if (typeof permissionConfig === "boolean") return permissionConfig;
41
- if (!params.data) return true;
42
- try {
43
- const singlePermissionConfig = permissionConfig.split("|").map((p) => p.trim());
44
- for (const path of singlePermissionConfig) {
45
- if (getValueFromPath(params.data, path, params.userId)) return true;
46
- }
47
- return false;
48
- } catch {
49
- if (typeof permissionConfig === "string") {
50
- return getValueFromPath(params.data, permissionConfig, params.userId);
51
- }
52
- }
53
- return false;
54
- }
55
- __name(checkPermissionsFromServer, "checkPermissionsFromServer");
56
- function getValueFromPath(obj, path, userId) {
57
- const parts = path.split(".");
58
- let current = obj;
59
- for (const part of parts) {
60
- if (!current) return false;
61
- if (Array.isArray(current)) {
62
- let found = false;
63
- for (const item of current) {
64
- const result = getValueFromPath(item, parts.slice(parts.indexOf(part)).join("."), userId);
65
- if (result === userId || result === true) {
66
- found = true;
67
- break;
68
- }
69
- }
70
- return found;
71
- } else if (current[part] !== void 0) {
72
- current = current[part];
73
- } else {
74
- return false;
75
- }
76
- }
77
- if (Array.isArray(current)) {
78
- return current.some((item) => {
79
- if (typeof item === "object" && item.id !== void 0) {
80
- return item.id.toString() === userId;
81
- }
82
- return item.toString() === userId;
83
- });
84
- }
85
- if (typeof current === "object" && current.id !== void 0) {
86
- return current.id.toString() === userId;
87
- }
88
- return current.toString() === userId;
89
- }
90
- __name(getValueFromPath, "getValueFromPath");
91
-
92
- export {
93
- Action,
94
- checkPermissions,
95
- checkPermissionsFromServer,
96
- getValueFromPath
97
- };
98
- //# sourceMappingURL=chunk-HAG77QBV.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/permissions/types.ts","../src/permissions/check.ts"],"sourcesContent":["import { LucideIcon } from \"lucide-react\";\nimport { ApiRequestDataTypeInterface } from \"../core/interfaces/ApiRequestDataTypeInterface\";\nimport { FieldSelector } from \"../core/fields/FieldSelector\";\n\n/**\n * Permission actions\n */\nexport enum Action {\n Read = \"read\",\n Create = \"create\",\n Update = \"update\",\n Delete = \"delete\",\n}\n\n/**\n * Generic permission check type.\n * Can be a boolean or a function that checks permissions dynamically.\n * @template T - The data type being checked\n * @template U - The user type (defaults to PermissionUser)\n */\nexport type PermissionCheck<T, U = PermissionUser> = boolean | ((user?: U | string, data?: T) => boolean);\n\n/**\n * Page URL configuration for modules\n */\nexport type PageUrl = {\n pageUrl?: string;\n};\n\n/**\n * Module permission definition wrapper\n */\nexport type ModulePermissionDefinition<T> = {\n interface: T;\n};\n\n/**\n * Base module definition\n */\nexport type ModuleDefinition = {\n pageUrl?: string;\n name: string;\n model: any;\n feature?: string;\n moduleId?: string;\n};\n\n/**\n * Permission configuration for a module.\n * Can be a boolean (allow/deny all) or a string path for dynamic checks.\n */\nexport interface PermissionConfig {\n create: boolean | string;\n read: boolean | string;\n update: boolean | string;\n delete: boolean | string;\n}\n\n/**\n * Generic interface for a module that has permissions.\n * Apps should ensure their Module class implements this.\n */\nexport interface PermissionModule {\n id: string;\n permissions: PermissionConfig;\n}\n\n/**\n * Generic interface for a user that has modules with permissions.\n * Apps should ensure their User class implements this.\n */\nexport interface PermissionUser {\n id: string;\n modules: PermissionModule[];\n}\n\n/**\n * Module definition with permissions - extends ApiRequestDataTypeInterface\n */\nexport type ModuleWithPermissions = ApiRequestDataTypeInterface & {\n pageUrl?: string;\n feature?: string;\n moduleId?: string;\n icon?: LucideIcon;\n inclusions?: Record<\n string,\n {\n types?: string[];\n fields?: FieldSelector<any>[];\n }\n >;\n};\n\n/**\n * Factory type for creating module definitions\n */\nexport type ModuleFactory = (params: {\n pageUrl?: string;\n name: string;\n cache?: string | \"days\" | \"default\" | \"hours\" | \"max\" | \"minutes\" | \"seconds\" | \"weeks\";\n model: any;\n feature?: string;\n moduleId?: string;\n icon?: LucideIcon;\n inclusions?: Record<\n string,\n {\n types?: string[];\n fields?: FieldSelector<any>[];\n }\n >;\n}) => ModuleWithPermissions;\n","import { Action, ModuleWithPermissions, PermissionModule, PermissionUser } from \"./types\";\n\n/**\n * Check if a user has permission to perform an action on a module.\n *\n * @param module - The module to check permissions for\n * @param action - The action to check (read, create, update, delete)\n * @param user - The user with their modules and permissions\n * @param data - Optional data object for path-based permission checks\n */\nexport function checkPermissions<T extends PermissionUser>(params: {\n module: ModuleWithPermissions;\n action: Action;\n user: T;\n data?: any;\n}): boolean {\n const selectedModule = params.user.modules.find((module: PermissionModule) => module.id === params.module.moduleId);\n\n if (!selectedModule) return false;\n const permissionConfig = selectedModule.permissions[params.action];\n\n if (!permissionConfig) return false;\n if (typeof permissionConfig === \"boolean\") return permissionConfig as boolean;\n\n if (!params.data) return true;\n\n try {\n const singlePermissionConfig = permissionConfig.split(\"|\").map((p) => p.trim());\n\n for (const path of singlePermissionConfig) {\n if (getValueFromPath(params.data, path, params.user.id)) return true;\n }\n return false;\n } catch {\n if (typeof permissionConfig === \"string\") {\n return getValueFromPath(params.data, permissionConfig, params.user.id);\n }\n }\n\n return false;\n}\n\n/**\n * Check permissions from server context where user object is not fully available.\n *\n * @param module - The module to check permissions for\n * @param action - The action to check\n * @param userId - The user's ID\n * @param selectedModule - The selected module with its permissions\n * @param data - Optional data object for path-based permission checks\n */\nexport function checkPermissionsFromServer(params: {\n module: ModuleWithPermissions;\n action: Action;\n userId: string;\n selectedModule?: PermissionModule;\n data?: any;\n}): boolean {\n if (!params.selectedModule) return false;\n const permissionConfig = params.selectedModule.permissions[params.action];\n\n if (!permissionConfig) return false;\n if (typeof permissionConfig === \"boolean\") return permissionConfig as boolean;\n\n if (!params.data) return true;\n\n try {\n const singlePermissionConfig = permissionConfig.split(\"|\").map((p) => p.trim());\n\n for (const path of singlePermissionConfig) {\n if (getValueFromPath(params.data, path, params.userId)) return true;\n }\n return false;\n } catch {\n if (typeof permissionConfig === \"string\") {\n return getValueFromPath(params.data, permissionConfig, params.userId);\n }\n }\n\n return false;\n}\n\n/**\n * Traverse an object path and check if the value matches the user ID.\n * Handles nested objects, arrays, and various data structures.\n */\nexport function getValueFromPath(obj: any, path: string, userId: string): any {\n const parts = path.split(\".\");\n let current = obj;\n\n for (const part of parts) {\n if (!current) return false;\n\n if (Array.isArray(current)) {\n let found = false;\n for (const item of current) {\n const result = getValueFromPath(item, parts.slice(parts.indexOf(part)).join(\".\"), userId);\n if (result === userId || result === true) {\n found = true;\n break;\n }\n }\n return found;\n } else if (current[part] !== undefined) {\n current = current[part];\n } else {\n return false;\n }\n }\n\n if (Array.isArray(current)) {\n // If final value is an array, check if any element has id matching userId\n return current.some((item: any) => {\n if (typeof item === \"object\" && item.id !== undefined) {\n return item.id.toString() === userId;\n }\n return item.toString() === userId;\n });\n }\n\n // Direct comparison for primitive values or objects with id\n if (typeof current === \"object\" && current.id !== undefined) {\n return current.id.toString() === userId;\n }\n\n return current.toString() === userId;\n}\n"],"mappings":";;;;;AAOO,IAAK,SAAL,kBAAKA,YAAL;AACL,EAAAA,QAAA,UAAO;AACP,EAAAA,QAAA,YAAS;AACT,EAAAA,QAAA,YAAS;AACT,EAAAA,QAAA,YAAS;AAJC,SAAAA;AAAA,GAAA;;;ACGL,SAAS,iBAA2C,QAK/C;AACV,QAAM,iBAAiB,OAAO,KAAK,QAAQ,KAAK,CAAC,WAA6B,OAAO,OAAO,OAAO,OAAO,QAAQ;AAElH,MAAI,CAAC,eAAgB,QAAO;AAC5B,QAAM,mBAAmB,eAAe,YAAY,OAAO,MAAM;AAEjE,MAAI,CAAC,iBAAkB,QAAO;AAC9B,MAAI,OAAO,qBAAqB,UAAW,QAAO;AAElD,MAAI,CAAC,OAAO,KAAM,QAAO;AAEzB,MAAI;AACF,UAAM,yBAAyB,iBAAiB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAE9E,eAAW,QAAQ,wBAAwB;AACzC,UAAI,iBAAiB,OAAO,MAAM,MAAM,OAAO,KAAK,EAAE,EAAG,QAAO;AAAA,IAClE;AACA,WAAO;AAAA,EACT,QAAQ;AACN,QAAI,OAAO,qBAAqB,UAAU;AACxC,aAAO,iBAAiB,OAAO,MAAM,kBAAkB,OAAO,KAAK,EAAE;AAAA,IACvE;AAAA,EACF;AAEA,SAAO;AACT;AA9BgB;AAyCT,SAAS,2BAA2B,QAM/B;AACV,MAAI,CAAC,OAAO,eAAgB,QAAO;AACnC,QAAM,mBAAmB,OAAO,eAAe,YAAY,OAAO,MAAM;AAExE,MAAI,CAAC,iBAAkB,QAAO;AAC9B,MAAI,OAAO,qBAAqB,UAAW,QAAO;AAElD,MAAI,CAAC,OAAO,KAAM,QAAO;AAEzB,MAAI;AACF,UAAM,yBAAyB,iBAAiB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAE9E,eAAW,QAAQ,wBAAwB;AACzC,UAAI,iBAAiB,OAAO,MAAM,MAAM,OAAO,MAAM,EAAG,QAAO;AAAA,IACjE;AACA,WAAO;AAAA,EACT,QAAQ;AACN,QAAI,OAAO,qBAAqB,UAAU;AACxC,aAAO,iBAAiB,OAAO,MAAM,kBAAkB,OAAO,MAAM;AAAA,IACtE;AAAA,EACF;AAEA,SAAO;AACT;AA7BgB;AAmCT,SAAS,iBAAiB,KAAU,MAAc,QAAqB;AAC5E,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,UAAU;AAEd,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAS,QAAO;AAErB,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,UAAI,QAAQ;AACZ,iBAAW,QAAQ,SAAS;AAC1B,cAAM,SAAS,iBAAiB,MAAM,MAAM,MAAM,MAAM,QAAQ,IAAI,CAAC,EAAE,KAAK,GAAG,GAAG,MAAM;AACxF,YAAI,WAAW,UAAU,WAAW,MAAM;AACxC,kBAAQ;AACR;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,WAAW,QAAQ,IAAI,MAAM,QAAW;AACtC,gBAAU,QAAQ,IAAI;AAAA,IACxB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAE1B,WAAO,QAAQ,KAAK,CAAC,SAAc;AACjC,UAAI,OAAO,SAAS,YAAY,KAAK,OAAO,QAAW;AACrD,eAAO,KAAK,GAAG,SAAS,MAAM;AAAA,MAChC;AACA,aAAO,KAAK,SAAS,MAAM;AAAA,IAC7B,CAAC;AAAA,EACH;AAGA,MAAI,OAAO,YAAY,YAAY,QAAQ,OAAO,QAAW;AAC3D,WAAO,QAAQ,GAAG,SAAS,MAAM;AAAA,EACnC;AAEA,SAAO,QAAQ,SAAS,MAAM;AAChC;AAxCgB;","names":["Action"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/request.ts"],"sourcesContent":["\"use server\";\n\nimport { ApiData } from \"../core/interfaces/ApiData\";\nimport { cacheLife } from \"next/dist/server/use-cache/cache-life\";\nimport { cacheTag } from \"next/dist/server/use-cache/cache-tag\";\n\nexport interface ServerRequestParams {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}\n\n/**\n * Server-side request with Next.js caching support.\n * Uses \"use cache\" directive for automatic caching.\n */\nexport async function serverRequest(params: ServerRequestParams): Promise<ApiData> {\n \"use cache\";\n\n const response: ApiData = {\n data: undefined,\n ok: false,\n status: 0,\n statusText: \"\",\n };\n\n // Apply caching configuration\n if (params.cache) {\n if ([\"days\", \"default\", \"hours\", \"max\", \"minutes\", \"seconds\", \"weeks\"].includes(params.cache)) {\n cacheLife(params.cache as any);\n } else {\n cacheTag(params.cache);\n }\n } else {\n cacheLife(\"seconds\");\n }\n\n const additionalHeaders: Record<string, string> = { ...params.additionalHeaders };\n\n if (params.companyId) {\n additionalHeaders[\"x-companyid\"] = params.companyId;\n }\n additionalHeaders[\"x-language\"] = params.language;\n\n let requestBody: BodyInit | undefined = undefined;\n\n if (params.files) {\n const formData = new FormData();\n if (params.body && typeof params.body === \"object\") {\n for (const key in params.body) {\n if (Object.prototype.hasOwnProperty.call(params.body, key)) {\n formData.append(\n key,\n typeof params.body[key] === \"object\" ? JSON.stringify(params.body[key]) : params.body[key],\n );\n }\n }\n }\n\n if (params.files instanceof Blob) {\n formData.append(\"file\", params.files);\n } else if (typeof params.files === \"object\" && params.files !== null) {\n for (const key in params.files) {\n if (Object.prototype.hasOwnProperty.call(params.files, key)) {\n formData.append(key, params.files[key]);\n }\n }\n }\n\n requestBody = formData;\n } else if (params.body !== undefined) {\n requestBody = JSON.stringify(params.body);\n additionalHeaders[\"Content-Type\"] = \"application/json\";\n }\n\n const options: RequestInit = {\n method: params.method,\n headers: { Accept: \"application/json\", ...additionalHeaders },\n };\n\n if (requestBody !== undefined) {\n options.body = requestBody;\n }\n\n if (params.token) {\n options.headers = { ...options.headers, Authorization: `Bearer ${params.token}` };\n }\n\n try {\n const apiResponse = await fetch(params.url, options);\n\n response.ok = apiResponse.ok;\n response.status = apiResponse.status;\n response.statusText = apiResponse.statusText;\n try {\n response.data = await apiResponse.json();\n } catch {\n response.data = undefined;\n }\n } catch {\n response.ok = false;\n response.status = 500;\n response.data = undefined;\n }\n\n return response;\n}\n"],"mappings":";;;;;AAGA,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AAkBzB,eAAsB,cAAc,QAA+C;AACjF;AAEA,QAAM,WAAoB;AAAA,IACxB,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAGA,MAAI,OAAO,OAAO;AAChB,QAAI,CAAC,QAAQ,WAAW,SAAS,OAAO,WAAW,WAAW,OAAO,EAAE,SAAS,OAAO,KAAK,GAAG;AAC7F,gBAAU,OAAO,KAAY;AAAA,IAC/B,OAAO;AACL,eAAS,OAAO,KAAK;AAAA,IACvB;AAAA,EACF,OAAO;AACL,cAAU,SAAS;AAAA,EACrB;AAEA,QAAM,oBAA4C,EAAE,GAAG,OAAO,kBAAkB;AAEhF,MAAI,OAAO,WAAW;AACpB,sBAAkB,aAAa,IAAI,OAAO;AAAA,EAC5C;AACA,oBAAkB,YAAY,IAAI,OAAO;AAEzC,MAAI,cAAoC;AAExC,MAAI,OAAO,OAAO;AAChB,UAAM,WAAW,IAAI,SAAS;AAC9B,QAAI,OAAO,QAAQ,OAAO,OAAO,SAAS,UAAU;AAClD,iBAAW,OAAO,OAAO,MAAM;AAC7B,YAAI,OAAO,UAAU,eAAe,KAAK,OAAO,MAAM,GAAG,GAAG;AAC1D,mBAAS;AAAA,YACP;AAAA,YACA,OAAO,OAAO,KAAK,GAAG,MAAM,WAAW,KAAK,UAAU,OAAO,KAAK,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG;AAAA,UAC3F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,iBAAiB,MAAM;AAChC,eAAS,OAAO,QAAQ,OAAO,KAAK;AAAA,IACtC,WAAW,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,MAAM;AACpE,iBAAW,OAAO,OAAO,OAAO;AAC9B,YAAI,OAAO,UAAU,eAAe,KAAK,OAAO,OAAO,GAAG,GAAG;AAC3D,mBAAS,OAAO,KAAK,OAAO,MAAM,GAAG,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,kBAAc;AAAA,EAChB,WAAW,OAAO,SAAS,QAAW;AACpC,kBAAc,KAAK,UAAU,OAAO,IAAI;AACxC,sBAAkB,cAAc,IAAI;AAAA,EACtC;AAEA,QAAM,UAAuB;AAAA,IAC3B,QAAQ,OAAO;AAAA,IACf,SAAS,EAAE,QAAQ,oBAAoB,GAAG,kBAAkB;AAAA,EAC9D;AAEA,MAAI,gBAAgB,QAAW;AAC7B,YAAQ,OAAO;AAAA,EACjB;AAEA,MAAI,OAAO,OAAO;AAChB,YAAQ,UAAU,EAAE,GAAG,QAAQ,SAAS,eAAe,UAAU,OAAO,KAAK,GAAG;AAAA,EAClF;AAEA,MAAI;AACF,UAAM,cAAc,MAAM,MAAM,OAAO,KAAK,OAAO;AAEnD,aAAS,KAAK,YAAY;AAC1B,aAAS,SAAS,YAAY;AAC9B,aAAS,aAAa,YAAY;AAClC,QAAI;AACF,eAAS,OAAO,MAAM,YAAY,KAAK;AAAA,IACzC,QAAQ;AACN,eAAS,OAAO;AAAA,IAClB;AAAA,EACF,QAAQ;AACN,aAAS,KAAK;AACd,aAAS,SAAS;AAClB,aAAS,OAAO;AAAA,EAClB;AAEA,SAAO;AACT;AA1FsB;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/unified/JsonApiRequest.ts"],"sourcesContent":["import { JsonApiDataFactory } from \"../core/factories/JsonApiDataFactory\";\nimport { ApiData } from \"../core/interfaces/ApiData\";\nimport { ApiRequestDataTypeInterface } from \"../core/interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../core/interfaces/ApiResponseInterface\";\nimport { translateResponse } from \"../core/utils/translateResponse\";\nimport { ModuleWithPermissions } from \"../permissions/types\";\n\n// Type definitions for dynamically imported functions (avoiding typeof import to prevent bundling)\ntype DirectFetchFn = (params: {\n method: string;\n url: string;\n token?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}) => Promise<ApiData>;\n\ntype ServerRequestFn = (params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}) => Promise<ApiData>;\n\ntype GetTokenFn = () => Promise<string | undefined>;\n\n// These will be dynamically imported based on environment\nlet _directFetch: DirectFetchFn;\nlet _serverRequest: ServerRequestFn;\nlet _getClientToken: GetTokenFn;\nlet _getServerToken: GetTokenFn;\n\n// Config storage for non-React contexts\nlet _staticConfig: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n} | null = null;\n\n/**\n * Configure the JSON:API client for non-React contexts (e.g., server components).\n * For React contexts, use JsonApiProvider instead.\n */\nexport function configureJsonApi(config: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n}): void {\n _staticConfig = config;\n // Call bootstrapper immediately to register all modules\n if (config.bootstrapper) {\n config.bootstrapper();\n }\n}\n\nasync function getToken(): Promise<string | undefined> {\n if (typeof window === \"undefined\") {\n // Server-side\n if (!_getServerToken) {\n const serverModule = await import(\"../server/token\");\n _getServerToken = serverModule.getServerToken;\n }\n return _getServerToken();\n } else {\n // Client-side\n if (!_getClientToken) {\n const clientModule = await import(\"../client/token\");\n _getClientToken = clientModule.getClientToken;\n }\n return _getClientToken();\n }\n}\n\nasync function makeRequest(params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}): Promise<ApiData> {\n if (typeof window !== \"undefined\") {\n // Client-side: use direct fetch\n if (!_directFetch) {\n const clientModule = await import(\"../client/request\");\n _directFetch = clientModule.directFetch;\n }\n return _directFetch({\n method: params.method,\n url: params.url,\n token: params.token,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n });\n } else {\n // Server-side: use server request with caching\n if (!_serverRequest) {\n const serverModule = await import(\"../server/request\");\n _serverRequest = serverModule.serverRequest;\n }\n return _serverRequest({\n method: params.method,\n url: params.url,\n token: params.token,\n cache: params.cache,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n });\n }\n}\n\nexport function getApiUrl(): string {\n if (_staticConfig?.apiUrl) {\n return _staticConfig.apiUrl;\n }\n // Fallback to environment variable\n const envUrl = process.env.NEXT_PUBLIC_API_URL;\n if (!envUrl) {\n throw new Error(\"API URL not configured. Use configureJsonApi() or set NEXT_PUBLIC_API_URL environment variable.\");\n }\n return envUrl;\n}\n\nexport function getAppUrl(): string {\n if (_staticConfig?.appUrl) {\n return _staticConfig.appUrl;\n }\n // Fallback to environment variable\n const envUrl = process.env.NEXT_PUBLIC_ADDRESS;\n if (!envUrl) {\n throw new Error(\n \"App URL not configured. Use configureJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable.\",\n );\n }\n return envUrl.trim().replace(/\\/+$/, \"\");\n}\n\nexport function getTrackablePages(): ModuleWithPermissions[] {\n return _staticConfig?.trackablePages ?? [];\n}\n\nfunction runBootstrapper(): void {\n if (_staticConfig?.bootstrapper) {\n _staticConfig.bootstrapper();\n }\n}\n\nfunction buildUrl(endpoint: string): string {\n const apiUrl = getApiUrl();\n return endpoint.startsWith(\"http\") ? endpoint : `${apiUrl}${endpoint}`;\n}\n\nexport async function JsonApiGet(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n const apiResponse = await makeRequest({\n method: \"GET\",\n url: buildUrl(params.endpoint),\n token,\n cache: params.classKey.cache,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n paginationHandler: async (endpoint: string) =>\n JsonApiGet({\n classKey: params.classKey,\n endpoint,\n companyId: params.companyId,\n language: params.language,\n }),\n });\n}\n\nexport async function JsonApiPost(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n overridesJsonApiCreation?: boolean;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"POST\",\n url: buildUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPut(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PUT\",\n url: buildUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPatch(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n overridesJsonApiCreation?: boolean;\n responseType?: ApiRequestDataTypeInterface;\n language: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PATCH\",\n url: buildUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiDelete(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = await getToken();\n\n const apiResponse = await makeRequest({\n method: \"DELETE\",\n url: buildUrl(params.endpoint),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n"],"mappings":"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","names":[]}