@carlonicora/nextjs-jsonapi 0.0.1

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 (222) hide show
  1. package/README.md +889 -0
  2. package/dist/AbstractService-BKlpJA61.d.mts +109 -0
  3. package/dist/AbstractService-D9eSVKNa.d.ts +109 -0
  4. package/dist/ApiData-DPKNfY-9.d.mts +10 -0
  5. package/dist/ApiData-DPKNfY-9.d.ts +10 -0
  6. package/dist/ApiDataInterface-DPP8s46n.d.mts +21 -0
  7. package/dist/ApiDataInterface-DPP8s46n.d.ts +21 -0
  8. package/dist/ApiRequestDataTypeInterface-CUKFDBx2.d.mts +20 -0
  9. package/dist/ApiRequestDataTypeInterface-CUKFDBx2.d.ts +20 -0
  10. package/dist/ApiResponseInterface-BHN5D9r5.d.mts +16 -0
  11. package/dist/ApiResponseInterface-DDI7QQPR.d.ts +16 -0
  12. package/dist/BlockNoteEditor-UVO3VZZE.mjs +396 -0
  13. package/dist/BlockNoteEditor-UVO3VZZE.mjs.map +1 -0
  14. package/dist/BlockNoteEditor-VFWG6LXI.js +396 -0
  15. package/dist/BlockNoteEditor-VFWG6LXI.js.map +1 -0
  16. package/dist/JsonApiRequest-S3ICLM7B.mjs +20 -0
  17. package/dist/JsonApiRequest-S3ICLM7B.mjs.map +1 -0
  18. package/dist/JsonApiRequest-ZZLSP26T.js +20 -0
  19. package/dist/JsonApiRequest-ZZLSP26T.js.map +1 -0
  20. package/dist/atoms/index.d.mts +12 -0
  21. package/dist/atoms/index.d.ts +12 -0
  22. package/dist/atoms/index.js +9 -0
  23. package/dist/atoms/index.js.map +1 -0
  24. package/dist/atoms/index.mjs +9 -0
  25. package/dist/atoms/index.mjs.map +1 -0
  26. package/dist/breadcrumb.item.data.interface-CgB4_1EE.d.mts +6 -0
  27. package/dist/breadcrumb.item.data.interface-CgB4_1EE.d.ts +6 -0
  28. package/dist/chunk-2K3Q24UF.js +89 -0
  29. package/dist/chunk-2K3Q24UF.js.map +1 -0
  30. package/dist/chunk-2LM6LCJW.mjs +1091 -0
  31. package/dist/chunk-2LM6LCJW.mjs.map +1 -0
  32. package/dist/chunk-366S2JCC.mjs +31 -0
  33. package/dist/chunk-366S2JCC.mjs.map +1 -0
  34. package/dist/chunk-3FBCC4G3.js +8 -0
  35. package/dist/chunk-3FBCC4G3.js.map +1 -0
  36. package/dist/chunk-4HCRAOS5.js +28 -0
  37. package/dist/chunk-4HCRAOS5.js.map +1 -0
  38. package/dist/chunk-5W6AKZE6.mjs +131 -0
  39. package/dist/chunk-5W6AKZE6.mjs.map +1 -0
  40. package/dist/chunk-6GKHCVF6.js +98 -0
  41. package/dist/chunk-6GKHCVF6.js.map +1 -0
  42. package/dist/chunk-7QVYU63E.js +7 -0
  43. package/dist/chunk-7QVYU63E.js.map +1 -0
  44. package/dist/chunk-A3J3AAYM.mjs +97 -0
  45. package/dist/chunk-A3J3AAYM.mjs.map +1 -0
  46. package/dist/chunk-A5DDIABK.js +4209 -0
  47. package/dist/chunk-A5DDIABK.js.map +1 -0
  48. package/dist/chunk-AUXK7QSA.mjs +15 -0
  49. package/dist/chunk-AUXK7QSA.mjs.map +1 -0
  50. package/dist/chunk-AWONBQQP.js +97 -0
  51. package/dist/chunk-AWONBQQP.js.map +1 -0
  52. package/dist/chunk-BLWVZK6J.mjs +28 -0
  53. package/dist/chunk-BLWVZK6J.mjs.map +1 -0
  54. package/dist/chunk-C7C7VY4F.mjs +77 -0
  55. package/dist/chunk-C7C7VY4F.mjs.map +1 -0
  56. package/dist/chunk-CXQOWQSY.js +55 -0
  57. package/dist/chunk-CXQOWQSY.js.map +1 -0
  58. package/dist/chunk-DD3KISNB.mjs +98 -0
  59. package/dist/chunk-DD3KISNB.mjs.map +1 -0
  60. package/dist/chunk-DKKMWBP4.mjs +1 -0
  61. package/dist/chunk-DKKMWBP4.mjs.map +1 -0
  62. package/dist/chunk-DO2HLAZO.js +48 -0
  63. package/dist/chunk-DO2HLAZO.js.map +1 -0
  64. package/dist/chunk-DZXDB3K2.mjs +17 -0
  65. package/dist/chunk-DZXDB3K2.mjs.map +1 -0
  66. package/dist/chunk-ECDTZBYO.mjs +230 -0
  67. package/dist/chunk-ECDTZBYO.mjs.map +1 -0
  68. package/dist/chunk-EFJEWLRL.js +16 -0
  69. package/dist/chunk-EFJEWLRL.js.map +1 -0
  70. package/dist/chunk-FY4SXJGU.js +806 -0
  71. package/dist/chunk-FY4SXJGU.js.map +1 -0
  72. package/dist/chunk-GYWPEPOH.mjs +1354 -0
  73. package/dist/chunk-GYWPEPOH.mjs.map +1 -0
  74. package/dist/chunk-H6FMOA6B.js +1 -0
  75. package/dist/chunk-H6FMOA6B.js.map +1 -0
  76. package/dist/chunk-HR4H2FP7.mjs +89 -0
  77. package/dist/chunk-HR4H2FP7.mjs.map +1 -0
  78. package/dist/chunk-I2REI7OA.js +462 -0
  79. package/dist/chunk-I2REI7OA.js.map +1 -0
  80. package/dist/chunk-IBS6NI7D.js +77 -0
  81. package/dist/chunk-IBS6NI7D.js.map +1 -0
  82. package/dist/chunk-IWFGEPAA.mjs +4209 -0
  83. package/dist/chunk-IWFGEPAA.mjs.map +1 -0
  84. package/dist/chunk-J4Q36PMP.js +31 -0
  85. package/dist/chunk-J4Q36PMP.js.map +1 -0
  86. package/dist/chunk-JC3WJK65.js +1091 -0
  87. package/dist/chunk-JC3WJK65.js.map +1 -0
  88. package/dist/chunk-L6EQEAXU.mjs +462 -0
  89. package/dist/chunk-L6EQEAXU.mjs.map +1 -0
  90. package/dist/chunk-LXKSUWAV.js +15 -0
  91. package/dist/chunk-LXKSUWAV.js.map +1 -0
  92. package/dist/chunk-MFO27OHB.mjs +48 -0
  93. package/dist/chunk-MFO27OHB.mjs.map +1 -0
  94. package/dist/chunk-PAWJFY3S.mjs +7 -0
  95. package/dist/chunk-PAWJFY3S.mjs.map +1 -0
  96. package/dist/chunk-Q2N6SQYW.mjs +8 -0
  97. package/dist/chunk-Q2N6SQYW.mjs.map +1 -0
  98. package/dist/chunk-RAF7PNLG.js +131 -0
  99. package/dist/chunk-RAF7PNLG.js.map +1 -0
  100. package/dist/chunk-RUR22SVM.js +17 -0
  101. package/dist/chunk-RUR22SVM.js.map +1 -0
  102. package/dist/chunk-TEGF6ZWG.js +109 -0
  103. package/dist/chunk-TEGF6ZWG.js.map +1 -0
  104. package/dist/chunk-TMVHSY3Y.js +230 -0
  105. package/dist/chunk-TMVHSY3Y.js.map +1 -0
  106. package/dist/chunk-V2JJPI7N.js +1354 -0
  107. package/dist/chunk-V2JJPI7N.js.map +1 -0
  108. package/dist/chunk-WWWMJZEF.mjs +806 -0
  109. package/dist/chunk-WWWMJZEF.mjs.map +1 -0
  110. package/dist/chunk-X4BIHJ2B.mjs +55 -0
  111. package/dist/chunk-X4BIHJ2B.mjs.map +1 -0
  112. package/dist/chunk-YDVTFM7X.mjs +109 -0
  113. package/dist/chunk-YDVTFM7X.mjs.map +1 -0
  114. package/dist/chunk-YF5XQZDR.mjs +16 -0
  115. package/dist/chunk-YF5XQZDR.mjs.map +1 -0
  116. package/dist/client/index.d.mts +252 -0
  117. package/dist/client/index.d.ts +252 -0
  118. package/dist/client/index.js +275 -0
  119. package/dist/client/index.js.map +1 -0
  120. package/dist/client/index.mjs +274 -0
  121. package/dist/client/index.mjs.map +1 -0
  122. package/dist/components/index.d.mts +441 -0
  123. package/dist/components/index.d.ts +441 -0
  124. package/dist/components/index.js +2474 -0
  125. package/dist/components/index.js.map +1 -0
  126. package/dist/components/index.mjs +2474 -0
  127. package/dist/components/index.mjs.map +1 -0
  128. package/dist/config-hXufftVS.d.mts +34 -0
  129. package/dist/config-hXufftVS.d.ts +34 -0
  130. package/dist/content.interface-BhyAiOFq.d.ts +35 -0
  131. package/dist/content.interface-Dg2lt_An.d.mts +35 -0
  132. package/dist/contexts/index.d.mts +56 -0
  133. package/dist/contexts/index.d.ts +56 -0
  134. package/dist/contexts/index.js +21 -0
  135. package/dist/contexts/index.js.map +1 -0
  136. package/dist/contexts/index.mjs +21 -0
  137. package/dist/contexts/index.mjs.map +1 -0
  138. package/dist/core/index.d.mts +152 -0
  139. package/dist/core/index.d.ts +152 -0
  140. package/dist/core/index.js +47 -0
  141. package/dist/core/index.js.map +1 -0
  142. package/dist/core/index.mjs +47 -0
  143. package/dist/core/index.mjs.map +1 -0
  144. package/dist/d3.link.interface-QMdB22bC.d.mts +20 -0
  145. package/dist/d3.link.interface-QMdB22bC.d.ts +20 -0
  146. package/dist/features/index.d.mts +553 -0
  147. package/dist/features/index.d.ts +553 -0
  148. package/dist/features/index.js +94 -0
  149. package/dist/features/index.js.map +1 -0
  150. package/dist/features/index.mjs +94 -0
  151. package/dist/features/index.mjs.map +1 -0
  152. package/dist/hooks/index.d.mts +94 -0
  153. package/dist/hooks/index.d.ts +94 -0
  154. package/dist/hooks/index.js +43 -0
  155. package/dist/hooks/index.js.map +1 -0
  156. package/dist/hooks/index.mjs +43 -0
  157. package/dist/hooks/index.mjs.map +1 -0
  158. package/dist/index.d.mts +72 -0
  159. package/dist/index.d.ts +72 -0
  160. package/dist/index.js +84 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/index.mjs +84 -0
  163. package/dist/index.mjs.map +1 -0
  164. package/dist/interfaces/index.d.mts +3 -0
  165. package/dist/interfaces/index.d.ts +3 -0
  166. package/dist/interfaces/index.js +2 -0
  167. package/dist/interfaces/index.js.map +1 -0
  168. package/dist/interfaces/index.mjs +2 -0
  169. package/dist/interfaces/index.mjs.map +1 -0
  170. package/dist/permissions/index.d.mts +41 -0
  171. package/dist/permissions/index.d.ts +41 -0
  172. package/dist/permissions/index.js +14 -0
  173. package/dist/permissions/index.js.map +1 -0
  174. package/dist/permissions/index.mjs +14 -0
  175. package/dist/permissions/index.mjs.map +1 -0
  176. package/dist/request-7FE3LJLV.mjs +9 -0
  177. package/dist/request-7FE3LJLV.mjs.map +1 -0
  178. package/dist/request-FYMQK5CX.mjs +9 -0
  179. package/dist/request-FYMQK5CX.mjs.map +1 -0
  180. package/dist/request-QFS7NEIE.js +9 -0
  181. package/dist/request-QFS7NEIE.js.map +1 -0
  182. package/dist/request-ZYY6RI5X.js +9 -0
  183. package/dist/request-ZYY6RI5X.js.map +1 -0
  184. package/dist/roles/index.d.mts +33 -0
  185. package/dist/roles/index.d.ts +33 -0
  186. package/dist/roles/index.js +12 -0
  187. package/dist/roles/index.js.map +1 -0
  188. package/dist/roles/index.mjs +12 -0
  189. package/dist/roles/index.mjs.map +1 -0
  190. package/dist/server/index.d.mts +44 -0
  191. package/dist/server/index.d.ts +44 -0
  192. package/dist/server/index.js +29 -0
  193. package/dist/server/index.js.map +1 -0
  194. package/dist/server/index.mjs +29 -0
  195. package/dist/server/index.mjs.map +1 -0
  196. package/dist/shadcnui/index.d.mts +698 -0
  197. package/dist/shadcnui/index.d.ts +698 -0
  198. package/dist/shadcnui/index.js +466 -0
  199. package/dist/shadcnui/index.js.map +1 -0
  200. package/dist/shadcnui/index.mjs +465 -0
  201. package/dist/shadcnui/index.mjs.map +1 -0
  202. package/dist/token-IJSPOMW6.mjs +9 -0
  203. package/dist/token-IJSPOMW6.mjs.map +1 -0
  204. package/dist/token-MJMC26ON.js +9 -0
  205. package/dist/token-MJMC26ON.js.map +1 -0
  206. package/dist/token-UADJQ7VC.mjs +9 -0
  207. package/dist/token-UADJQ7VC.mjs.map +1 -0
  208. package/dist/token-UYE7CV6X.js +9 -0
  209. package/dist/token-UYE7CV6X.js.map +1 -0
  210. package/dist/types-DluCaP1I.d.ts +95 -0
  211. package/dist/types-lQVA8d_P.d.mts +95 -0
  212. package/dist/useDataListRetriever-futhx3OP.d.mts +32 -0
  213. package/dist/useDataListRetriever-futhx3OP.d.ts +32 -0
  214. package/dist/user.interface-CAsTIbuQ.d.mts +85 -0
  215. package/dist/user.interface-CbWqMaaU.d.ts +85 -0
  216. package/dist/utils/index.d.mts +201 -0
  217. package/dist/utils/index.d.ts +201 -0
  218. package/dist/utils/index.js +32 -0
  219. package/dist/utils/index.js.map +1 -0
  220. package/dist/utils/index.mjs +32 -0
  221. package/dist/utils/index.mjs.map +1 -0
  222. package/package.json +205 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../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 { 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\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 return ModuleRegistry.get(prop as keyof ModuleDefinitions);\n },\n}) as ModuleDefinitions & { findByName: (name: string) => ModuleWithPermissions };\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"]}
@@ -0,0 +1,15 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
4
+
5
+ // src/client/token.ts
6
+ var _cookiesnext = require('cookies-next');
7
+ async function getClientToken() {
8
+ return await _cookiesnext.getCookie.call(void 0, "token");
9
+ }
10
+ _chunk7QVYU63Ejs.__name.call(void 0, getClientToken, "getClientToken");
11
+
12
+
13
+
14
+ exports.getClientToken = getClientToken;
15
+ //# sourceMappingURL=chunk-LXKSUWAV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-LXKSUWAV.js","../src/client/token.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACFA,2CAA0B;AAK1B,MAAA,SAAsB,cAAA,CAAA,EAA8C;AAClE,EAAA,OAAO,MAAM,oCAAA,OAAiB,CAAA;AAChC;AAFsB,qCAAA,cAAA,EAAA,gBAAA,CAAA;ADGtB;AACA;AACE;AACF,wCAAC","file":"/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-LXKSUWAV.js","sourcesContent":[null,"\"use client\";\n\nimport { getCookie } from \"cookies-next\";\n\n/**\n * Get the authentication token from cookies (client-side only)\n */\nexport async function getClientToken(): Promise<string | undefined> {\n return await getCookie(\"token\");\n}\n"]}
@@ -0,0 +1,48 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-PAWJFY3S.mjs";
4
+
5
+ // src/core/registry/DataClassRegistry.ts
6
+ var DataClassRegistry = class {
7
+ static {
8
+ __name(this, "DataClassRegistry");
9
+ }
10
+ static _map = /* @__PURE__ */ new Map();
11
+ static registerObjectClass(key, classConstructor) {
12
+ const classKey = key.name;
13
+ if (!this._map.has(classKey)) {
14
+ this._map.set(classKey, classConstructor);
15
+ }
16
+ }
17
+ static get(classKey) {
18
+ const response = this._map.get(classKey.name);
19
+ if (!response) {
20
+ throw new Error(`Class not registered for key: ${typeof classKey === "string" ? classKey : classKey.name}`);
21
+ }
22
+ return response;
23
+ }
24
+ /**
25
+ * Bootstrap the registry with all modules.
26
+ * This is a convenience method for apps to register all their modules at once.
27
+ *
28
+ * @param modules - An object with module definitions (like the app's Modules class)
29
+ */
30
+ static bootstrap(modules) {
31
+ Object.values(modules).forEach((module) => {
32
+ if (module && module.model) {
33
+ this.registerObjectClass(module, module.model);
34
+ }
35
+ });
36
+ }
37
+ /**
38
+ * Clear all registered classes. Useful for testing.
39
+ */
40
+ static clear() {
41
+ this._map.clear();
42
+ }
43
+ };
44
+
45
+ export {
46
+ DataClassRegistry
47
+ };
48
+ //# sourceMappingURL=chunk-MFO27OHB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/registry/DataClassRegistry.ts"],"sourcesContent":["import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\n\nexport class DataClassRegistry {\n private static _map = new Map<string, { new (): ApiDataInterface }>();\n\n public static registerObjectClass(\n key: ApiRequestDataTypeInterface,\n classConstructor: { new (): ApiDataInterface },\n ): void {\n const classKey = key.name;\n if (!this._map.has(classKey)) {\n this._map.set(classKey, classConstructor);\n }\n }\n\n public static get(classKey: ApiRequestDataTypeInterface): {\n new (): ApiDataInterface;\n } {\n const response = this._map.get(classKey.name);\n if (!response) {\n throw new Error(`Class not registered for key: ${typeof classKey === \"string\" ? classKey : classKey.name}`);\n }\n\n return response;\n }\n\n /**\n * Bootstrap the registry with all modules.\n * This is a convenience method for apps to register all their modules at once.\n *\n * @param modules - An object with module definitions (like the app's Modules class)\n */\n public static bootstrap(modules: Record<string, ApiRequestDataTypeInterface>): void {\n Object.values(modules).forEach((module) => {\n if (module && module.model) {\n this.registerObjectClass(module, module.model);\n }\n });\n }\n\n /**\n * Clear all registered classes. Useful for testing.\n */\n public static clear(): void {\n this._map.clear();\n }\n}\n\n// Export alias for backward compatibility\nexport { DataClassRegistry as DataClass };\n"],"mappings":";;;;;AAGO,IAAM,oBAAN,MAAwB;AAAA,EAH/B,OAG+B;AAAA;AAAA;AAAA,EAC7B,OAAe,OAAO,oBAAI,IAA0C;AAAA,EAEpE,OAAc,oBACZ,KACA,kBACM;AACN,UAAM,WAAW,IAAI;AACrB,QAAI,CAAC,KAAK,KAAK,IAAI,QAAQ,GAAG;AAC5B,WAAK,KAAK,IAAI,UAAU,gBAAgB;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,OAAc,IAAI,UAEhB;AACA,UAAM,WAAW,KAAK,KAAK,IAAI,SAAS,IAAI;AAC5C,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,iCAAiC,OAAO,aAAa,WAAW,WAAW,SAAS,IAAI,EAAE;AAAA,IAC5G;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAc,UAAU,SAA4D;AAClF,WAAO,OAAO,OAAO,EAAE,QAAQ,CAAC,WAAW;AACzC,UAAI,UAAU,OAAO,OAAO;AAC1B,aAAK,oBAAoB,QAAQ,OAAO,KAAK;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,QAAc;AAC1B,SAAK,KAAK,MAAM;AAAA,EAClB;AACF;","names":[]}
@@ -0,0 +1,7 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ export {
5
+ __name
6
+ };
7
+ //# sourceMappingURL=chunk-PAWJFY3S.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,8 @@
1
+ // src/atoms/recentPagesAtom.ts
2
+ import { atomWithStorage } from "jotai/utils";
3
+ var recentPagesAtom = atomWithStorage("recentPages", []);
4
+
5
+ export {
6
+ recentPagesAtom
7
+ };
8
+ //# sourceMappingURL=chunk-Q2N6SQYW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/atoms/recentPagesAtom.ts"],"sourcesContent":["import { atomWithStorage } from \"jotai/utils\";\n\nexport interface RecentPage {\n url: string;\n title: string;\n moduleType: string;\n timestamp: number;\n}\n\nexport const recentPagesAtom = atomWithStorage<RecentPage[]>(\"recentPages\", []);\n"],"mappings":";AAAA,SAAS,uBAAuB;AASzB,IAAM,kBAAkB,gBAA8B,eAAe,CAAC,CAAC;","names":[]}
@@ -0,0 +1,131 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+ var _chunk6GKHCVF6js = require('./chunk-6GKHCVF6.js');
4
+
5
+
6
+ var _chunk4HCRAOS5js = require('./chunk-4HCRAOS5.js');
7
+
8
+
9
+
10
+ var _chunkI2REI7OAjs = require('./chunk-I2REI7OA.js');
11
+
12
+
13
+ var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
14
+
15
+ // src/contexts/SharedContext.tsx
16
+ var _react = require('react');
17
+ var _jsxruntime = require('react/jsx-runtime');
18
+ var SharedContext = _react.createContext.call(void 0, null);
19
+ var SharedProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, ({ children, value }) => {
20
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SharedContext.Provider, { value, children });
21
+ }, "SharedProvider");
22
+ var useSharedContext = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, () => {
23
+ const context = _react.useContext.call(void 0, SharedContext);
24
+ if (!context) {
25
+ throw new Error("useSharedContext must be used within a SharedProvider");
26
+ }
27
+ return context;
28
+ }, "useSharedContext");
29
+
30
+ // src/features/user/contexts/CurrentUserContext.tsx
31
+ var _cookiesnext = require('cookies-next');
32
+ var _jotai = require('jotai');
33
+ var _utils = require('jotai/utils');
34
+ var _navigation = require('next/navigation');
35
+
36
+
37
+ var userAtom = _utils.atomWithStorage.call(void 0, "user", null);
38
+ var CurrentUserContext = _react.createContext.call(void 0, void 0);
39
+ var CurrentUserProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, ({ children }) => {
40
+ const path = _navigation.usePathname.call(void 0, );
41
+ const [dehydratedUser, setDehydratedUser] = _jotai.useAtom.call(void 0, userAtom);
42
+ _react.useEffect.call(void 0, () => {
43
+ const token = _cookiesnext.getCookie.call(void 0, "token");
44
+ if (!token && dehydratedUser) setDehydratedUser(null);
45
+ }, [dehydratedUser, setDehydratedUser]);
46
+ const matchUrlToModule = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (params) => {
47
+ const moduleKeys = Object.getOwnPropertyNames(_chunkI2REI7OAjs.Modules).filter(
48
+ (key) => key !== "prototype" && key !== "_factory" && key !== "length" && key !== "name"
49
+ );
50
+ const matchedModuleKey = moduleKeys.find((key) => {
51
+ const descriptor2 = Object.getOwnPropertyDescriptor(_chunkI2REI7OAjs.Modules, key);
52
+ if (!_optionalChain([descriptor2, 'optionalAccess', _ => _.get])) return false;
53
+ const selectedModule = descriptor2.get.call(_chunkI2REI7OAjs.Modules);
54
+ return path.toLowerCase().startsWith(_optionalChain([selectedModule, 'access', _2 => _2.pageUrl, 'optionalAccess', _3 => _3.toLowerCase, 'call', _4 => _4()]));
55
+ });
56
+ if (!matchedModuleKey) return void 0;
57
+ const descriptor = Object.getOwnPropertyDescriptor(_chunkI2REI7OAjs.Modules, matchedModuleKey);
58
+ return _optionalChain([descriptor, 'optionalAccess', _5 => _5.get, 'optionalAccess', _6 => _6.call, 'call', _7 => _7(_chunkI2REI7OAjs.Modules)]);
59
+ }, "matchUrlToModule");
60
+ const currentUser = dehydratedUser ? _chunkI2REI7OAjs.rehydrate.call(void 0, _chunkI2REI7OAjs.Modules.User, dehydratedUser) : null;
61
+ const company = _nullishCoalesce(_optionalChain([currentUser, 'optionalAccess', _8 => _8.company]), () => ( null));
62
+ const setUser = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (user) => {
63
+ if (user) setDehydratedUser(user.dehydrate());
64
+ else setDehydratedUser(null);
65
+ }, "setUser");
66
+ const hasRole = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (roleId) => {
67
+ if (!currentUser) return false;
68
+ return !!_optionalChain([currentUser, 'access', _9 => _9.roles, 'optionalAccess', _10 => _10.some, 'call', _11 => _11((userRole) => userRole.id === roleId)]);
69
+ }, "hasRole");
70
+ const hasAccesToFeature = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (featureIdentifier) => {
71
+ if (hasRole(_chunk4HCRAOS5js.getRoleId.call(void 0, ).Administrator)) return true;
72
+ if (!company) return false;
73
+ return company.features.some((feature) => feature.id === featureIdentifier);
74
+ }, "hasAccesToFeature");
75
+ function hasPermissionToModule(params) {
76
+ if (!currentUser) return false;
77
+ if (!!params.module.feature && !hasAccesToFeature(params.module.feature)) return false;
78
+ return _chunk6GKHCVF6js.checkPermissions.call(void 0, { module: params.module, action: params.action, data: params.data, user: currentUser });
79
+ }
80
+ _chunk7QVYU63Ejs.__name.call(void 0, hasPermissionToModule, "hasPermissionToModule");
81
+ function hasPermissionToModules(params) {
82
+ if (!currentUser) return false;
83
+ if (!params.modules.every((module) => !module.feature || hasAccesToFeature(module.feature))) return false;
84
+ return params.modules.every(
85
+ (module) => _chunk6GKHCVF6js.checkPermissions.call(void 0, { module, action: params.action, data: params.data, user: currentUser })
86
+ );
87
+ }
88
+ _chunk7QVYU63Ejs.__name.call(void 0, hasPermissionToModules, "hasPermissionToModules");
89
+ function hasPermissionToPath(path2) {
90
+ if (!currentUser) return false;
91
+ if (path2 === "#" || path2 === "/") return true;
92
+ const selectedModule = matchUrlToModule({ path: path2 });
93
+ if (!selectedModule) return true;
94
+ const response = hasPermissionToModule({ module: selectedModule, action: "read" /* Read */ });
95
+ return response;
96
+ }
97
+ _chunk7QVYU63Ejs.__name.call(void 0, hasPermissionToPath, "hasPermissionToPath");
98
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
99
+ CurrentUserContext.Provider,
100
+ {
101
+ value: {
102
+ currentUser,
103
+ company,
104
+ setUser,
105
+ hasPermissionToModule,
106
+ hasPermissionToModules,
107
+ hasPermissionToPath,
108
+ hasAccesToFeature,
109
+ matchUrlToModule,
110
+ hasRole
111
+ },
112
+ children
113
+ }
114
+ );
115
+ }, "CurrentUserProvider");
116
+ function useCurrentUserContext() {
117
+ const context = _react.useContext.call(void 0, CurrentUserContext);
118
+ if (context === void 0) {
119
+ throw new Error("useCurrentUserContext must be used within a UserProvider");
120
+ }
121
+ return context;
122
+ }
123
+ _chunk7QVYU63Ejs.__name.call(void 0, useCurrentUserContext, "useCurrentUserContext");
124
+
125
+
126
+
127
+
128
+
129
+
130
+ exports.SharedProvider = SharedProvider; exports.useSharedContext = useSharedContext; exports.CurrentUserProvider = CurrentUserProvider; exports.useCurrentUserContext = useCurrentUserContext;
131
+ //# sourceMappingURL=chunk-RAF7PNLG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-RAF7PNLG.js","../src/contexts/SharedContext.tsx","../src/features/user/contexts/CurrentUserContext.tsx"],"names":["createContext","descriptor","path","jsx","useContext"],"mappings":"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","file":"/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-RAF7PNLG.js","sourcesContent":[null,"import { createContext, ReactNode, useContext } from \"react\";\nimport { BreadcrumbItemData } from \"../interfaces\";\n\nconst SharedContext = createContext<{\n breadcrumbs: BreadcrumbItemData[];\n title: {\n type: string | string[];\n element?: string;\n functions?: ReactNode;\n };\n} | null>(null);\n\ninterface SharedProviderProps {\n children: ReactNode;\n value: {\n breadcrumbs: BreadcrumbItemData[];\n title: {\n type: string;\n element?: string;\n functions?: ReactNode;\n };\n };\n}\n\nexport const SharedProvider = ({ children, value }: SharedProviderProps) => {\n return <SharedContext.Provider value={value}>{children}</SharedContext.Provider>;\n};\n\nexport const useSharedContext = () => {\n const context = useContext(SharedContext);\n if (!context) {\n throw new Error(\"useSharedContext must be used within a SharedProvider\");\n }\n return context;\n};\n","\"use client\";\n\nimport { getCookie } from \"cookies-next\";\nimport { useAtom } from \"jotai\";\nimport { atomWithStorage } from \"jotai/utils\";\nimport { usePathname } from \"next/navigation\";\nimport React, { createContext, useContext, useEffect } from \"react\";\nimport { Modules, rehydrate } from \"../../../core\";\nimport { Action, checkPermissions, ModuleWithPermissions } from \"../../../permissions\";\nimport { getRoleId } from \"../../../roles\";\nimport { CompanyInterface } from \"../../company\";\nimport { FeatureInterface } from \"../../feature\";\nimport { RoleInterface } from \"../../role\";\nimport { UserInterface } from \"../data\";\n\nexport interface CurrentUserContextType<T extends UserInterface = UserInterface> {\n currentUser: T | null;\n company: CompanyInterface | null;\n setUser: (user?: T) => void;\n hasPermissionToModule: <M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }) => boolean;\n hasPermissionToModules: <M extends ModuleWithPermissions>(params: {\n modules: M[];\n action: Action;\n data?: any;\n }) => boolean;\n hasPermissionToPath: (path: string) => boolean;\n hasAccesToFeature: (featureIdentifier: string) => boolean;\n matchUrlToModule: (prarms?: { path: string }) => ModuleWithPermissions | undefined;\n hasRole: (roleId: string) => boolean;\n}\n\nconst userAtom = atomWithStorage(\"user\", null);\n\nconst CurrentUserContext = createContext<CurrentUserContextType | undefined>(undefined);\n\nexport const CurrentUserProvider = ({ children }: { children: React.ReactNode }) => {\n const path = usePathname();\n\n const [dehydratedUser, setDehydratedUser] = useAtom(userAtom);\n\n useEffect(() => {\n const token = getCookie(\"token\");\n if (!token && dehydratedUser) setDehydratedUser(null);\n }, [dehydratedUser, setDehydratedUser]);\n\n const matchUrlToModule = (params?: { path: string }): ModuleWithPermissions | undefined => {\n const moduleKeys = Object.getOwnPropertyNames(Modules).filter(\n (key) => key !== \"prototype\" && key !== \"_factory\" && key !== \"length\" && key !== \"name\",\n );\n\n const matchedModuleKey = moduleKeys.find((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(Modules, key);\n\n if (!descriptor?.get) return false;\n\n const selectedModule = descriptor.get.call(Modules);\n\n return path.toLowerCase().startsWith(selectedModule.pageUrl?.toLowerCase());\n });\n\n if (!matchedModuleKey) return undefined;\n\n const descriptor = Object.getOwnPropertyDescriptor(Modules, matchedModuleKey);\n return descriptor?.get?.call(Modules);\n };\n\n const currentUser = dehydratedUser ? rehydrate<UserInterface>(Modules.User, dehydratedUser) : null;\n\n const company = currentUser?.company ?? null;\n\n const setUser = (user?: UserInterface): void => {\n if (user) setDehydratedUser(user.dehydrate() as any);\n else setDehydratedUser(null);\n };\n\n const hasRole = (roleId: string): boolean => {\n if (!currentUser) return false;\n\n return !!currentUser.roles?.some((userRole: RoleInterface) => userRole.id === roleId);\n };\n\n const hasAccesToFeature = (featureIdentifier: string): boolean => {\n if (hasRole(getRoleId().Administrator)) return true;\n if (!company) return false;\n\n return company.features.some((feature: FeatureInterface) => feature.id === featureIdentifier);\n };\n\n function hasPermissionToModule<M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: M extends ModuleWithPermissions ? any : never;\n }): boolean {\n if (!currentUser) return false;\n\n if (!!params.module.feature && !hasAccesToFeature(params.module.feature)) return false;\n\n return checkPermissions({ module: params.module, action: params.action, data: params.data, user: currentUser });\n }\n\n function hasPermissionToModules<M extends ModuleWithPermissions>(params: {\n modules: M[];\n action: Action;\n data?: M extends ModuleWithPermissions ? any : never;\n }): boolean {\n if (!currentUser) return false;\n\n if (!params.modules.every((module) => !module.feature || hasAccesToFeature(module.feature))) return false;\n\n return params.modules.every((module) =>\n checkPermissions({ module: module, action: params.action, data: params.data, user: currentUser }),\n );\n }\n\n function hasPermissionToPath(path: string): boolean {\n if (!currentUser) return false;\n if (path === \"#\" || path === \"/\") return true;\n\n const selectedModule = matchUrlToModule({ path: path });\n if (!selectedModule) return true;\n\n const response = hasPermissionToModule({ module: selectedModule, action: Action.Read });\n\n return response;\n }\n\n return (\n <CurrentUserContext.Provider\n value={{\n currentUser: currentUser,\n company: company,\n setUser: setUser,\n hasPermissionToModule: hasPermissionToModule,\n hasPermissionToModules: hasPermissionToModules,\n hasPermissionToPath: hasPermissionToPath,\n hasAccesToFeature: hasAccesToFeature,\n matchUrlToModule: matchUrlToModule,\n hasRole: hasRole,\n }}\n >\n {children}\n </CurrentUserContext.Provider>\n );\n};\n\nexport function useCurrentUserContext<T extends UserInterface = UserInterface>(): CurrentUserContextType<T> {\n const context = useContext(CurrentUserContext);\n if (context === undefined) {\n throw new Error(\"useCurrentUserContext must be used within a UserProvider\");\n }\n return context as unknown as CurrentUserContextType<T>;\n}\n"]}
@@ -0,0 +1,17 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+ var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
4
+
5
+ // src/components/errors/errorToast.ts
6
+ var _sonner = require('sonner');
7
+ function errorToast(params) {
8
+ _sonner.toast.error(_nullishCoalesce(_optionalChain([params, 'optionalAccess', _ => _.title]), () => ( "Error")), {
9
+ description: params.error instanceof Error ? params.error.message : String(params.error)
10
+ });
11
+ }
12
+ _chunk7QVYU63Ejs.__name.call(void 0, errorToast, "errorToast");
13
+
14
+
15
+
16
+ exports.errorToast = errorToast;
17
+ //# sourceMappingURL=chunk-RUR22SVM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-RUR22SVM.js","../src/components/errors/errorToast.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACFA,gCAAsB;AAEf,SAAS,UAAA,CAAW,MAAA,EAAwC;AACjE,EAAA,aAAA,CAAM,KAAA,kCAAM,MAAA,2BAAQ,OAAA,UAAS,SAAA,EAAS;AAAA,IACpC,WAAA,EAAa,MAAA,CAAO,MAAA,WAAiB,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,KAAK;AAAA,EACzF,CAAC,CAAA;AACH;AAJgB,qCAAA,UAAA,EAAA,YAAA,CAAA;ADQhB;AACA;AACE;AACF,gCAAC","file":"/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-RUR22SVM.js","sourcesContent":[null,"// import { toast } from \"@/hooks/use-toast\";\n\nimport { toast } from \"sonner\";\n\nexport function errorToast(params: { title?: string; error: any }) {\n toast.error(params?.title ?? \"Error\", {\n description: params.error instanceof Error ? params.error.message : String(params.error),\n });\n}\n"]}
@@ -0,0 +1,109 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+ var _chunkDO2HLAZOjs = require('./chunk-DO2HLAZO.js');
4
+
5
+
6
+ var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
7
+
8
+ // src/core/factories/JsonApiDataFactory.ts
9
+ var JsonApiDataFactory = class {
10
+ static {
11
+ _chunk7QVYU63Ejs.__name.call(void 0, this, "JsonApiDataFactory");
12
+ }
13
+ static create(classKey, data) {
14
+ const factoryClass = _chunkDO2HLAZOjs.DataClassRegistry.get(classKey);
15
+ const instance = new factoryClass();
16
+ return instance.createJsonApi(data);
17
+ }
18
+ };
19
+
20
+ // src/core/utils/translateResponse.ts
21
+ function translateData(params) {
22
+ const factoryClass = _chunkDO2HLAZOjs.DataClassRegistry.get(params.classKey);
23
+ if (!factoryClass) {
24
+ throw new Error(
25
+ `Class not registered for key: ${typeof params.classKey === "string" ? params.classKey : params.classKey.name}`
26
+ );
27
+ }
28
+ const included = _nullishCoalesce(params.data.included, () => ( []));
29
+ if (Array.isArray(params.data.data)) {
30
+ const responseData = [];
31
+ for (const data of params.data.data) {
32
+ const object = new factoryClass();
33
+ object.rehydrate({ jsonApi: data, included, allData: params.data.data });
34
+ responseData.push(object);
35
+ }
36
+ return responseData;
37
+ } else {
38
+ const responseData = new factoryClass();
39
+ responseData.rehydrate({
40
+ jsonApi: params.data.data,
41
+ included
42
+ });
43
+ return responseData;
44
+ }
45
+ }
46
+ _chunk7QVYU63Ejs.__name.call(void 0, translateData, "translateData");
47
+ async function translateResponse(params) {
48
+ const response = {
49
+ ok: true,
50
+ response: 0,
51
+ data: [],
52
+ error: ""
53
+ };
54
+ const factoryClass = _chunkDO2HLAZOjs.DataClassRegistry.get(params.classKey);
55
+ if (!factoryClass) {
56
+ throw new Error(
57
+ `Class not registered for key: ${typeof params.classKey === "string" ? params.classKey : params.classKey.name}`
58
+ );
59
+ }
60
+ response.ok = params.apiResponse.ok;
61
+ response.response = params.apiResponse.status;
62
+ if (!params.apiResponse.ok) {
63
+ response.error = _nullishCoalesce(_optionalChain([params, 'access', _ => _.apiResponse, 'optionalAccess', _2 => _2.data, 'optionalAccess', _3 => _3.message]), () => ( params.apiResponse.statusText));
64
+ return response;
65
+ }
66
+ if (params.apiResponse.status === 204) return response;
67
+ response.raw = params.apiResponse.data;
68
+ try {
69
+ const included = _nullishCoalesce(params.apiResponse.data.included, () => ( []));
70
+ if (params.apiResponse.data.links) {
71
+ response.self = params.apiResponse.data.links.self;
72
+ if (params.apiResponse.data.links.next && params.paginationHandler) {
73
+ response.next = params.apiResponse.data.links.next;
74
+ response.nextPage = async () => params.paginationHandler(params.apiResponse.data.links.next);
75
+ }
76
+ if (params.apiResponse.data.links.prev && params.paginationHandler) {
77
+ response.prev = params.apiResponse.data.links.prev;
78
+ response.prevPage = async () => params.paginationHandler(params.apiResponse.data.links.prev);
79
+ }
80
+ }
81
+ if (Array.isArray(params.apiResponse.data.data)) {
82
+ const responseData = [];
83
+ for (const data of params.apiResponse.data.data) {
84
+ const object = new factoryClass();
85
+ object.rehydrate({ jsonApi: data, included, allData: params.apiResponse.data.data });
86
+ responseData.push(object);
87
+ }
88
+ response.data = responseData;
89
+ } else {
90
+ const responseData = new factoryClass();
91
+ responseData.rehydrate({
92
+ jsonApi: params.apiResponse.data.data,
93
+ included
94
+ });
95
+ response.data = responseData;
96
+ }
97
+ } catch (e) {
98
+ console.error(e);
99
+ }
100
+ return response;
101
+ }
102
+ _chunk7QVYU63Ejs.__name.call(void 0, translateResponse, "translateResponse");
103
+
104
+
105
+
106
+
107
+
108
+ exports.JsonApiDataFactory = JsonApiDataFactory; exports.translateData = translateData; exports.translateResponse = translateResponse;
109
+ //# sourceMappingURL=chunk-TEGF6ZWG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-TEGF6ZWG.js","../src/core/factories/JsonApiDataFactory.ts","../src/core/utils/translateResponse.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACHO,IAAM,mBAAA,EAAN,MAAyB;AAAA,EAJhC,OAIgC;AAAA,IAAA,qCAAA,IAAA,EAAA,oBAAA,CAAA;AAAA,EAAA;AAAA,EAC9B,OAAc,MAAA,CAAO,QAAA,EAAuC,IAAA,EAAgB;AAC1E,IAAA,MAAM,aAAA,EAAe,kCAAA,CAAkB,GAAA,CAAI,QAAQ,CAAA;AAEnD,IAAA,MAAM,SAAA,EAAW,IAAI,YAAA,CAAa,CAAA;AAClC,IAAA,OAAO,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AAAA,EACpC;AACF,CAAA;ADOA;AACA;AETO,SAAS,aAAA,CAA0C,MAAA,EAG9C;AACV,EAAA,MAAM,aAAA,EAAe,kCAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AAE1D,EAAA,GAAA,CAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,8BAAA,EAAiC,OAAO,MAAA,CAAO,SAAA,IAAa,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAAA,IAAA;AAC/G,EAAA;AAGF,EAAA;AAEA,EAAA;AACE,IAAA;AAEA,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AAA6B,IAAA;AAG/B,IAAA;AAAO,EAAA;AAEP,IAAA;AACA,IAAA;AAAuB,MAAA;AACA,MAAA;AACrB,IAAA;AAGF,IAAA;AAAO,EAAA;AAEX;AAjCgB;AAuChB;AAOE,EAAA;AAAuC,IAAA;AACjC,IAAA;AACM,IAAA;AACH,IAAA;AACA,EAAA;AAGT,EAAA;AAEA,EAAA;AACE,IAAA;AAAU,MAAA;AACqG,IAAA;AAC/G,EAAA;AAGF,EAAA;AACA,EAAA;AAEA,EAAA;AACE,IAAA;AACA,IAAA;AAAO,EAAA;AAGT,EAAA;AAEA,EAAA;AAEA,EAAA;AACE,IAAA;AAEA,IAAA;AACE,MAAA;AAEA,MAAA;AACE,QAAA;AACA,QAAA;AAA4F,MAAA;AAG9F,MAAA;AACE,QAAA;AACA,QAAA;AAA4F,MAAA;AAC9F,IAAA;AAGF,IAAA;AACE,MAAA;AAEA,MAAA;AACE,QAAA;AACA,QAAA;AACA,QAAA;AAA6B,MAAA;AAG/B,MAAA;AAAgB,IAAA;AAEhB,MAAA;AACA,MAAA;AAAuB,QAAA;AACY,QAAA;AACjC,MAAA;AAGF,MAAA;AAAgB,IAAA;AAClB,EAAA;AAEA,IAAA;AAAe,EAAA;AAGjB,EAAA;AACF;AA3EsB;AFqDtB;AACA;AACA;AACA;AACA;AACA","file":"/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/chunk-TEGF6ZWG.js","sourcesContent":[null,"import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { DataClassRegistry } from \"../registry/DataClassRegistry\";\n\nexport class JsonApiDataFactory {\n public static create(classKey: ApiRequestDataTypeInterface, data: any): any {\n const factoryClass = DataClassRegistry.get(classKey);\n\n const instance = new factoryClass() as ApiDataInterface;\n return instance.createJsonApi(data);\n }\n}\n","import { ApiData } from \"../interfaces/ApiData\";\nimport { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../interfaces/ApiResponseInterface\";\nimport { DataClassRegistry } from \"../registry/DataClassRegistry\";\n\n/**\n * Translates raw JSON:API data into typed objects.\n * Does not require API response metadata.\n */\nexport function translateData<T extends ApiDataInterface>(params: {\n classKey: ApiRequestDataTypeInterface;\n data: any;\n}): T | T[] {\n const factoryClass = DataClassRegistry.get(params.classKey);\n\n if (!factoryClass) {\n throw new Error(\n `Class not registered for key: ${typeof params.classKey === \"string\" ? params.classKey : params.classKey.name}`,\n );\n }\n\n const included: any = params.data.included ?? [];\n\n if (Array.isArray(params.data.data)) {\n const responseData: T[] = [];\n\n for (const data of params.data.data) {\n const object = new factoryClass();\n object.rehydrate({ jsonApi: data, included: included, allData: params.data.data });\n responseData.push(object as T);\n }\n\n return responseData as T[];\n } else {\n const responseData = new factoryClass();\n responseData.rehydrate({\n jsonApi: params.data.data,\n included: included,\n });\n\n return responseData as T;\n }\n}\n\n/**\n * Translates a full API response into a typed ApiResponseInterface.\n * Includes pagination support.\n */\nexport async function translateResponse<T extends ApiDataInterface>(params: {\n classKey: ApiRequestDataTypeInterface;\n apiResponse: ApiData;\n companyId?: string;\n language: string;\n paginationHandler?: (endpoint: string) => Promise<ApiResponseInterface>;\n}): Promise<ApiResponseInterface> {\n const response: ApiResponseInterface = {\n ok: true,\n response: 0,\n data: [],\n error: \"\",\n };\n\n const factoryClass = DataClassRegistry.get(params.classKey);\n\n if (!factoryClass) {\n throw new Error(\n `Class not registered for key: ${typeof params.classKey === \"string\" ? params.classKey : params.classKey.name}`,\n );\n }\n\n response.ok = params.apiResponse.ok;\n response.response = params.apiResponse.status;\n\n if (!params.apiResponse.ok) {\n response.error = params.apiResponse?.data?.message ?? params.apiResponse.statusText;\n return response;\n }\n\n if (params.apiResponse.status === 204) return response;\n\n response.raw = params.apiResponse.data;\n\n try {\n const included: any = params.apiResponse.data.included ?? [];\n\n if (params.apiResponse.data.links) {\n response.self = params.apiResponse.data.links.self;\n\n if (params.apiResponse.data.links.next && params.paginationHandler) {\n response.next = params.apiResponse.data.links.next;\n response.nextPage = async () => params.paginationHandler!(params.apiResponse.data.links.next);\n }\n\n if (params.apiResponse.data.links.prev && params.paginationHandler) {\n response.prev = params.apiResponse.data.links.prev;\n response.prevPage = async () => params.paginationHandler!(params.apiResponse.data.links.prev);\n }\n }\n\n if (Array.isArray(params.apiResponse.data.data)) {\n const responseData: T[] = [];\n\n for (const data of params.apiResponse.data.data) {\n const object = new factoryClass();\n object.rehydrate({ jsonApi: data, included: included, allData: params.apiResponse.data.data });\n responseData.push(object as T);\n }\n\n response.data = responseData;\n } else {\n const responseData = new factoryClass();\n responseData.rehydrate({\n jsonApi: params.apiResponse.data.data,\n included: included,\n });\n\n response.data = responseData;\n }\n } catch (e) {\n console.error(e);\n }\n\n return response;\n}\n"]}