@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,252 @@
1
+ import * as React from 'react';
2
+ import React__default from 'react';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ import { A as ApiDataInterface, J as JsonApiHydratedDataInterface } from '../ApiDataInterface-DPP8s46n.js';
5
+ import { A as ApiRequestDataTypeInterface } from '../ApiRequestDataTypeInterface-CUKFDBx2.js';
6
+ import { A as ApiResponseInterface } from '../ApiResponseInterface-DDI7QQPR.js';
7
+ import { A as ApiData } from '../ApiData-DPKNfY-9.js';
8
+
9
+ type CacheProfile = "seconds" | "minutes" | "hours" | "days" | "weeks" | "max" | "default";
10
+ interface JsonApiConfig {
11
+ /**
12
+ * The base URL for API requests (e.g., https://api.example.com)
13
+ */
14
+ apiUrl: string;
15
+ /**
16
+ * Custom token getter function. If not provided, will use default cookie-based token retrieval.
17
+ */
18
+ tokenGetter?: () => Promise<string | undefined>;
19
+ /**
20
+ * Custom language getter function. If not provided, will use browser locale or next-intl.
21
+ */
22
+ languageGetter?: () => Promise<string>;
23
+ /**
24
+ * Default headers to include in all requests
25
+ */
26
+ defaultHeaders?: Record<string, string>;
27
+ /**
28
+ * Global error handler for failed requests (client-side only)
29
+ */
30
+ onError?: (status: number, message: string) => void;
31
+ /**
32
+ * Cache configuration
33
+ */
34
+ cacheConfig?: {
35
+ defaultProfile: CacheProfile;
36
+ };
37
+ /**
38
+ * Function to bootstrap the data class registry.
39
+ * Will be called automatically when needed.
40
+ */
41
+ bootstrapper?: () => void;
42
+ }
43
+ declare const JsonApiContext: React.Context<JsonApiConfig | null>;
44
+ declare function useJsonApiConfig(): JsonApiConfig;
45
+ declare function useJsonApiConfigOptional(): JsonApiConfig | null;
46
+
47
+ interface JsonApiProviderProps {
48
+ config: JsonApiConfig;
49
+ children: React__default.ReactNode;
50
+ }
51
+ declare function JsonApiProvider({ config, children }: JsonApiProviderProps): react_jsx_runtime.JSX.Element;
52
+
53
+ interface UseJsonApiGetOptions {
54
+ /**
55
+ * Whether to enable the query. If false, the query won't run.
56
+ */
57
+ enabled?: boolean;
58
+ /**
59
+ * Dependencies that trigger a refetch when changed.
60
+ */
61
+ deps?: any[];
62
+ }
63
+ interface UseJsonApiGetResult<T> {
64
+ /**
65
+ * The fetched data, or null if not yet fetched.
66
+ */
67
+ data: T | null;
68
+ /**
69
+ * Whether the query is currently loading.
70
+ */
71
+ loading: boolean;
72
+ /**
73
+ * Error message if the query failed.
74
+ */
75
+ error: string | null;
76
+ /**
77
+ * The full API response (includes raw data, pagination, etc.)
78
+ */
79
+ response: ApiResponseInterface | null;
80
+ /**
81
+ * Function to manually refetch the data.
82
+ */
83
+ refetch: () => Promise<void>;
84
+ /**
85
+ * Whether there is a next page available.
86
+ */
87
+ hasNextPage: boolean;
88
+ /**
89
+ * Whether there is a previous page available.
90
+ */
91
+ hasPreviousPage: boolean;
92
+ /**
93
+ * Function to fetch the next page.
94
+ */
95
+ fetchNextPage: () => Promise<void>;
96
+ /**
97
+ * Function to fetch the previous page.
98
+ */
99
+ fetchPreviousPage: () => Promise<void>;
100
+ }
101
+ /**
102
+ * Hook for fetching data from a JSON:API endpoint.
103
+ *
104
+ * @example
105
+ * ```tsx
106
+ * const { data, loading, error, refetch } = useJsonApiGet<Article>({
107
+ * classKey: Modules.Article,
108
+ * endpoint: `/articles/${id}`,
109
+ * });
110
+ *
111
+ * if (loading) return <Loading />;
112
+ * if (error) return <Error message={error} />;
113
+ * return <ArticleView article={data} />;
114
+ * ```
115
+ */
116
+ declare function useJsonApiGet<T extends ApiDataInterface>(params: {
117
+ classKey: ApiRequestDataTypeInterface;
118
+ endpoint: string;
119
+ companyId?: string;
120
+ options?: UseJsonApiGetOptions;
121
+ }): UseJsonApiGetResult<T>;
122
+
123
+ type MutationMethod = "POST" | "PUT" | "PATCH" | "DELETE";
124
+ interface UseJsonApiMutationResult<T> {
125
+ /**
126
+ * The result data from the mutation, or null if not yet executed.
127
+ */
128
+ data: T | null;
129
+ /**
130
+ * Whether the mutation is currently in progress.
131
+ */
132
+ loading: boolean;
133
+ /**
134
+ * Error message if the mutation failed.
135
+ */
136
+ error: string | null;
137
+ /**
138
+ * The full API response.
139
+ */
140
+ response: ApiResponseInterface | null;
141
+ /**
142
+ * Execute the mutation.
143
+ */
144
+ mutate: (params: MutationParams) => Promise<T | null>;
145
+ /**
146
+ * Reset the mutation state.
147
+ */
148
+ reset: () => void;
149
+ }
150
+ interface MutationParams {
151
+ /**
152
+ * The endpoint to call.
153
+ */
154
+ endpoint: string;
155
+ /**
156
+ * The request body.
157
+ */
158
+ body?: any;
159
+ /**
160
+ * Files to upload.
161
+ */
162
+ files?: {
163
+ [key: string]: File | Blob;
164
+ } | File | Blob;
165
+ /**
166
+ * Company ID for multi-tenant requests.
167
+ */
168
+ companyId?: string;
169
+ /**
170
+ * Override the default JSON:API body creation.
171
+ */
172
+ overridesJsonApiCreation?: boolean;
173
+ /**
174
+ * Response type if different from the request type.
175
+ */
176
+ responseType?: ApiRequestDataTypeInterface;
177
+ }
178
+ /**
179
+ * Hook for making mutations (POST, PUT, PATCH, DELETE) to a JSON:API endpoint.
180
+ *
181
+ * @example
182
+ * ```tsx
183
+ * const { mutate, loading, error } = useJsonApiMutation<Article>({
184
+ * method: "POST",
185
+ * classKey: Modules.Article,
186
+ * });
187
+ *
188
+ * const handleSubmit = async (data: ArticleInput) => {
189
+ * const result = await mutate({
190
+ * endpoint: "/articles",
191
+ * body: data,
192
+ * });
193
+ * if (result) {
194
+ * // Success!
195
+ * }
196
+ * };
197
+ * ```
198
+ */
199
+ declare function useJsonApiMutation<T extends ApiDataInterface>(config: {
200
+ method: MutationMethod;
201
+ classKey: ApiRequestDataTypeInterface;
202
+ onSuccess?: (data: T) => void;
203
+ onError?: (error: string) => void;
204
+ }): UseJsonApiMutationResult<T>;
205
+
206
+ /**
207
+ * Hook to rehydrate server-passed data into typed objects.
208
+ * Use this when passing data from server components to client components.
209
+ *
210
+ * @example
211
+ * ```tsx
212
+ * // In server component
213
+ * const article = await ArticleService.findOne(id);
214
+ * return <ArticleDetails data={article.dehydrate()} />;
215
+ *
216
+ * // In client component
217
+ * function ArticleDetails({ data }: { data: JsonApiHydratedDataInterface }) {
218
+ * const article = useRehydration<Article>(Modules.Article, data);
219
+ * return <div>{article.title}</div>;
220
+ * }
221
+ * ```
222
+ */
223
+ declare function useRehydration<T extends ApiDataInterface>(classKey: ApiRequestDataTypeInterface, data: JsonApiHydratedDataInterface | null | undefined): T | null;
224
+ /**
225
+ * Hook to rehydrate a list of server-passed data into typed objects.
226
+ */
227
+ declare function useRehydrationList<T extends ApiDataInterface>(classKey: ApiRequestDataTypeInterface, data: JsonApiHydratedDataInterface[] | null | undefined): T[];
228
+
229
+ interface DirectFetchParams {
230
+ method: string;
231
+ url: string;
232
+ token?: string;
233
+ body?: any;
234
+ files?: {
235
+ [key: string]: File | Blob;
236
+ } | File | Blob;
237
+ companyId?: string;
238
+ language: string;
239
+ additionalHeaders?: Record<string, string>;
240
+ }
241
+ /**
242
+ * Client-side direct fetch to bypass server action overhead.
243
+ * Use this for client-side API calls.
244
+ */
245
+ declare function directFetch(params: DirectFetchParams): Promise<ApiData>;
246
+
247
+ /**
248
+ * Get the authentication token from cookies (client-side only)
249
+ */
250
+ declare function getClientToken(): Promise<string | undefined>;
251
+
252
+ export { type CacheProfile, type DirectFetchParams, type JsonApiConfig, JsonApiContext, JsonApiProvider, type JsonApiProviderProps, type MutationMethod, type MutationParams, type UseJsonApiGetOptions, type UseJsonApiGetResult, type UseJsonApiMutationResult, directFetch, getClientToken, useJsonApiConfig, useJsonApiConfigOptional, useJsonApiGet, useJsonApiMutation, useRehydration, useRehydrationList };
@@ -0,0 +1,275 @@
1
+ "use client";
2
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } 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; }"use client";
3
+
4
+
5
+ var _chunkIBS6NI7Djs = require('../chunk-IBS6NI7D.js');
6
+
7
+
8
+ var _chunkLXKSUWAVjs = require('../chunk-LXKSUWAV.js');
9
+
10
+
11
+ var _chunkJ4Q36PMPjs = require('../chunk-J4Q36PMP.js');
12
+ require('../chunk-DO2HLAZO.js');
13
+
14
+
15
+ var _chunk7QVYU63Ejs = require('../chunk-7QVYU63E.js');
16
+
17
+ // src/client/context/JsonApiContext.ts
18
+ var _react = require('react');
19
+ var JsonApiContext = _react.createContext.call(void 0, null);
20
+ function useJsonApiConfig() {
21
+ const config = _react.useContext.call(void 0, JsonApiContext);
22
+ if (!config) {
23
+ throw new Error("useJsonApiConfig must be used within a JsonApiProvider");
24
+ }
25
+ return config;
26
+ }
27
+ _chunk7QVYU63Ejs.__name.call(void 0, useJsonApiConfig, "useJsonApiConfig");
28
+ function useJsonApiConfigOptional() {
29
+ return _react.useContext.call(void 0, JsonApiContext);
30
+ }
31
+ _chunk7QVYU63Ejs.__name.call(void 0, useJsonApiConfigOptional, "useJsonApiConfigOptional");
32
+
33
+ // src/client/context/JsonApiProvider.tsx
34
+
35
+ var _jsxruntime = require('react/jsx-runtime');
36
+ function JsonApiProvider({ config, children }) {
37
+ _react.useEffect.call(void 0, () => {
38
+ if (config.bootstrapper) {
39
+ config.bootstrapper();
40
+ }
41
+ }, [config.bootstrapper]);
42
+ const memoizedConfig = _react.useMemo.call(void 0, () => config, [config]);
43
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, JsonApiContext.Provider, { value: memoizedConfig, children });
44
+ }
45
+ _chunk7QVYU63Ejs.__name.call(void 0, JsonApiProvider, "JsonApiProvider");
46
+
47
+ // src/client/hooks/useJsonApiGet.ts
48
+
49
+ function useJsonApiGet(params) {
50
+ const [data, setData] = _react.useState.call(void 0, null);
51
+ const [loading, setLoading] = _react.useState.call(void 0, false);
52
+ const [error, setError] = _react.useState.call(void 0, null);
53
+ const [response, setResponse] = _react.useState.call(void 0, null);
54
+ const isMounted = _react.useRef.call(void 0, true);
55
+ const fetchData = _react.useCallback.call(void 0, async () => {
56
+ if (_optionalChain([params, 'access', _ => _.options, 'optionalAccess', _2 => _2.enabled]) === false) return;
57
+ setLoading(true);
58
+ setError(null);
59
+ try {
60
+ const { JsonApiGet } = await Promise.resolve().then(() => _interopRequireWildcard(require("../JsonApiRequest-ZZLSP26T.js")));
61
+ const language = navigator.language.split("-")[0] || "en";
62
+ const apiResponse = await JsonApiGet({
63
+ classKey: params.classKey,
64
+ endpoint: params.endpoint,
65
+ companyId: params.companyId,
66
+ language
67
+ });
68
+ if (!isMounted.current) return;
69
+ setResponse(apiResponse);
70
+ if (apiResponse.ok) {
71
+ setData(apiResponse.data);
72
+ } else {
73
+ setError(apiResponse.error);
74
+ }
75
+ } catch (err) {
76
+ if (!isMounted.current) return;
77
+ setError(err instanceof Error ? err.message : "Unknown error");
78
+ } finally {
79
+ if (isMounted.current) {
80
+ setLoading(false);
81
+ }
82
+ }
83
+ }, [params.classKey, params.endpoint, params.companyId, _optionalChain([params, 'access', _3 => _3.options, 'optionalAccess', _4 => _4.enabled])]);
84
+ const fetchNextPage = _react.useCallback.call(void 0, async () => {
85
+ if (!_optionalChain([response, 'optionalAccess', _5 => _5.nextPage])) return;
86
+ setLoading(true);
87
+ try {
88
+ const nextResponse = await response.nextPage();
89
+ if (!isMounted.current) return;
90
+ setResponse(nextResponse);
91
+ if (nextResponse.ok) {
92
+ setData(nextResponse.data);
93
+ } else {
94
+ setError(nextResponse.error);
95
+ }
96
+ } catch (err) {
97
+ if (!isMounted.current) return;
98
+ setError(err instanceof Error ? err.message : "Unknown error");
99
+ } finally {
100
+ if (isMounted.current) {
101
+ setLoading(false);
102
+ }
103
+ }
104
+ }, [response]);
105
+ const fetchPreviousPage = _react.useCallback.call(void 0, async () => {
106
+ if (!_optionalChain([response, 'optionalAccess', _6 => _6.prevPage])) return;
107
+ setLoading(true);
108
+ try {
109
+ const prevResponse = await response.prevPage();
110
+ if (!isMounted.current) return;
111
+ setResponse(prevResponse);
112
+ if (prevResponse.ok) {
113
+ setData(prevResponse.data);
114
+ } else {
115
+ setError(prevResponse.error);
116
+ }
117
+ } catch (err) {
118
+ if (!isMounted.current) return;
119
+ setError(err instanceof Error ? err.message : "Unknown error");
120
+ } finally {
121
+ if (isMounted.current) {
122
+ setLoading(false);
123
+ }
124
+ }
125
+ }, [response]);
126
+ _react.useEffect.call(void 0, () => {
127
+ isMounted.current = true;
128
+ fetchData();
129
+ return () => {
130
+ isMounted.current = false;
131
+ };
132
+ }, [fetchData, ..._optionalChain([params, 'access', _7 => _7.options, 'optionalAccess', _8 => _8.deps]) || []]);
133
+ return {
134
+ data,
135
+ loading,
136
+ error,
137
+ response,
138
+ refetch: fetchData,
139
+ hasNextPage: !!_optionalChain([response, 'optionalAccess', _9 => _9.next]),
140
+ hasPreviousPage: !!_optionalChain([response, 'optionalAccess', _10 => _10.prev]),
141
+ fetchNextPage,
142
+ fetchPreviousPage
143
+ };
144
+ }
145
+ _chunk7QVYU63Ejs.__name.call(void 0, useJsonApiGet, "useJsonApiGet");
146
+
147
+ // src/client/hooks/useJsonApiMutation.ts
148
+
149
+ function useJsonApiMutation(config) {
150
+ const [data, setData] = _react.useState.call(void 0, null);
151
+ const [loading, setLoading] = _react.useState.call(void 0, false);
152
+ const [error, setError] = _react.useState.call(void 0, null);
153
+ const [response, setResponse] = _react.useState.call(void 0, null);
154
+ const reset = _react.useCallback.call(void 0, () => {
155
+ setData(null);
156
+ setLoading(false);
157
+ setError(null);
158
+ setResponse(null);
159
+ }, []);
160
+ const mutate = _react.useCallback.call(void 0,
161
+ async (params) => {
162
+ setLoading(true);
163
+ setError(null);
164
+ try {
165
+ const { JsonApiPost, JsonApiPut, JsonApiPatch, JsonApiDelete } = await Promise.resolve().then(() => _interopRequireWildcard(require("../JsonApiRequest-ZZLSP26T.js")));
166
+ const language = navigator.language.split("-")[0] || "en";
167
+ let apiResponse;
168
+ switch (config.method) {
169
+ case "POST":
170
+ apiResponse = await JsonApiPost({
171
+ classKey: config.classKey,
172
+ endpoint: params.endpoint,
173
+ companyId: params.companyId,
174
+ body: params.body,
175
+ overridesJsonApiCreation: params.overridesJsonApiCreation,
176
+ files: params.files,
177
+ language,
178
+ responseType: params.responseType
179
+ });
180
+ break;
181
+ case "PUT":
182
+ apiResponse = await JsonApiPut({
183
+ classKey: config.classKey,
184
+ endpoint: params.endpoint,
185
+ companyId: params.companyId,
186
+ body: params.body,
187
+ files: params.files,
188
+ language,
189
+ responseType: params.responseType
190
+ });
191
+ break;
192
+ case "PATCH":
193
+ apiResponse = await JsonApiPatch({
194
+ classKey: config.classKey,
195
+ endpoint: params.endpoint,
196
+ companyId: params.companyId,
197
+ body: params.body,
198
+ overridesJsonApiCreation: params.overridesJsonApiCreation,
199
+ files: params.files,
200
+ language,
201
+ responseType: params.responseType
202
+ });
203
+ break;
204
+ case "DELETE":
205
+ apiResponse = await JsonApiDelete({
206
+ classKey: config.classKey,
207
+ endpoint: params.endpoint,
208
+ companyId: params.companyId,
209
+ language,
210
+ responseType: params.responseType
211
+ });
212
+ break;
213
+ }
214
+ setResponse(apiResponse);
215
+ if (apiResponse.ok) {
216
+ const resultData = apiResponse.data;
217
+ setData(resultData);
218
+ _optionalChain([config, 'access', _11 => _11.onSuccess, 'optionalCall', _12 => _12(resultData)]);
219
+ return resultData;
220
+ } else {
221
+ setError(apiResponse.error);
222
+ _optionalChain([config, 'access', _13 => _13.onError, 'optionalCall', _14 => _14(apiResponse.error)]);
223
+ return null;
224
+ }
225
+ } catch (err) {
226
+ const errorMessage = err instanceof Error ? err.message : "Unknown error";
227
+ setError(errorMessage);
228
+ _optionalChain([config, 'access', _15 => _15.onError, 'optionalCall', _16 => _16(errorMessage)]);
229
+ return null;
230
+ } finally {
231
+ setLoading(false);
232
+ }
233
+ },
234
+ [config]
235
+ );
236
+ return {
237
+ data,
238
+ loading,
239
+ error,
240
+ response,
241
+ mutate,
242
+ reset
243
+ };
244
+ }
245
+ _chunk7QVYU63Ejs.__name.call(void 0, useJsonApiMutation, "useJsonApiMutation");
246
+
247
+ // src/client/hooks/useRehydration.ts
248
+
249
+ function useRehydration(classKey, data) {
250
+ return _react.useMemo.call(void 0, () => {
251
+ if (!data) return null;
252
+ return _chunkJ4Q36PMPjs.RehydrationFactory.rehydrate(classKey, data);
253
+ }, [classKey, data]);
254
+ }
255
+ _chunk7QVYU63Ejs.__name.call(void 0, useRehydration, "useRehydration");
256
+ function useRehydrationList(classKey, data) {
257
+ return _react.useMemo.call(void 0, () => {
258
+ if (!data || data.length === 0) return [];
259
+ return _chunkJ4Q36PMPjs.RehydrationFactory.rehydrateList(classKey, data);
260
+ }, [classKey, data]);
261
+ }
262
+ _chunk7QVYU63Ejs.__name.call(void 0, useRehydrationList, "useRehydrationList");
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+ exports.JsonApiContext = JsonApiContext; exports.JsonApiProvider = JsonApiProvider; exports.directFetch = _chunkIBS6NI7Djs.directFetch; exports.getClientToken = _chunkLXKSUWAVjs.getClientToken; exports.useJsonApiConfig = useJsonApiConfig; exports.useJsonApiConfigOptional = useJsonApiConfigOptional; exports.useJsonApiGet = useJsonApiGet; exports.useJsonApiMutation = useJsonApiMutation; exports.useRehydration = useRehydration; exports.useRehydrationList = useRehydrationList;
275
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/client/index.js","../../src/client/context/JsonApiContext.ts","../../src/client/context/JsonApiProvider.tsx","../../src/client/hooks/useJsonApiGet.ts","../../src/client/hooks/useJsonApiMutation.ts","../../src/client/hooks/useRehydration.ts"],"names":["useEffect","useState","useCallback","useMemo"],"mappings":"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","file":"/Users/carlo/Development/phlow2/packages/nextjs-jsonapi/dist/client/index.js","sourcesContent":[null,"\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\nexport type CacheProfile = \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"weeks\" | \"max\" | \"default\";\n\nexport interface JsonApiConfig {\n /**\n * The base URL for API requests (e.g., https://api.example.com)\n */\n apiUrl: string;\n\n /**\n * Custom token getter function. If not provided, will use default cookie-based token retrieval.\n */\n tokenGetter?: () => Promise<string | undefined>;\n\n /**\n * Custom language getter function. If not provided, will use browser locale or next-intl.\n */\n languageGetter?: () => Promise<string>;\n\n /**\n * Default headers to include in all requests\n */\n defaultHeaders?: Record<string, string>;\n\n /**\n * Global error handler for failed requests (client-side only)\n */\n onError?: (status: number, message: string) => void;\n\n /**\n * Cache configuration\n */\n cacheConfig?: {\n defaultProfile: CacheProfile;\n };\n\n /**\n * Function to bootstrap the data class registry.\n * Will be called automatically when needed.\n */\n bootstrapper?: () => void;\n}\n\nconst JsonApiContext = createContext<JsonApiConfig | null>(null);\n\nexport function useJsonApiConfig(): JsonApiConfig {\n const config = useContext(JsonApiContext);\n if (!config) {\n throw new Error(\"useJsonApiConfig must be used within a JsonApiProvider\");\n }\n return config;\n}\n\nexport function useJsonApiConfigOptional(): JsonApiConfig | null {\n return useContext(JsonApiContext);\n}\n\nexport { JsonApiContext };\n","\"use client\";\n\nimport React, { useEffect, useMemo } from \"react\";\nimport { JsonApiConfig, JsonApiContext } from \"./JsonApiContext\";\n\nexport interface JsonApiProviderProps {\n config: JsonApiConfig;\n children: React.ReactNode;\n}\n\nexport function JsonApiProvider({ config, children }: JsonApiProviderProps) {\n // Run bootstrapper on mount if provided\n useEffect(() => {\n if (config.bootstrapper) {\n config.bootstrapper();\n }\n }, [config.bootstrapper]);\n\n // Memoize config to prevent unnecessary re-renders\n const memoizedConfig = useMemo(() => config, [config]);\n\n return (\n <JsonApiContext.Provider value={memoizedConfig}>\n {children}\n </JsonApiContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport { ApiDataInterface } from \"../../core/interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../../core/interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../../core/interfaces/ApiResponseInterface\";\n\nexport interface UseJsonApiGetOptions {\n /**\n * Whether to enable the query. If false, the query won't run.\n */\n enabled?: boolean;\n /**\n * Dependencies that trigger a refetch when changed.\n */\n deps?: any[];\n}\n\nexport interface UseJsonApiGetResult<T> {\n /**\n * The fetched data, or null if not yet fetched.\n */\n data: T | null;\n /**\n * Whether the query is currently loading.\n */\n loading: boolean;\n /**\n * Error message if the query failed.\n */\n error: string | null;\n /**\n * The full API response (includes raw data, pagination, etc.)\n */\n response: ApiResponseInterface | null;\n /**\n * Function to manually refetch the data.\n */\n refetch: () => Promise<void>;\n /**\n * Whether there is a next page available.\n */\n hasNextPage: boolean;\n /**\n * Whether there is a previous page available.\n */\n hasPreviousPage: boolean;\n /**\n * Function to fetch the next page.\n */\n fetchNextPage: () => Promise<void>;\n /**\n * Function to fetch the previous page.\n */\n fetchPreviousPage: () => Promise<void>;\n}\n\n/**\n * Hook for fetching data from a JSON:API endpoint.\n *\n * @example\n * ```tsx\n * const { data, loading, error, refetch } = useJsonApiGet<Article>({\n * classKey: Modules.Article,\n * endpoint: `/articles/${id}`,\n * });\n *\n * if (loading) return <Loading />;\n * if (error) return <Error message={error} />;\n * return <ArticleView article={data} />;\n * ```\n */\nexport function useJsonApiGet<T extends ApiDataInterface>(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n options?: UseJsonApiGetOptions;\n}): UseJsonApiGetResult<T> {\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [response, setResponse] = useState<ApiResponseInterface | null>(null);\n const isMounted = useRef(true);\n\n const fetchData = useCallback(async () => {\n if (params.options?.enabled === false) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const { JsonApiGet } = await import(\"../../unified/JsonApiRequest\");\n const language = navigator.language.split(\"-\")[0] || \"en\";\n\n const apiResponse = await JsonApiGet({\n classKey: params.classKey,\n endpoint: params.endpoint,\n companyId: params.companyId,\n language,\n });\n\n if (!isMounted.current) return;\n\n setResponse(apiResponse);\n\n if (apiResponse.ok) {\n setData(apiResponse.data as T);\n } else {\n setError(apiResponse.error);\n }\n } catch (err) {\n if (!isMounted.current) return;\n setError(err instanceof Error ? err.message : \"Unknown error\");\n } finally {\n if (isMounted.current) {\n setLoading(false);\n }\n }\n }, [params.classKey, params.endpoint, params.companyId, params.options?.enabled]);\n\n const fetchNextPage = useCallback(async () => {\n if (!response?.nextPage) return;\n\n setLoading(true);\n try {\n const nextResponse = await response.nextPage();\n if (!isMounted.current) return;\n\n setResponse(nextResponse);\n if (nextResponse.ok) {\n setData(nextResponse.data as T);\n } else {\n setError(nextResponse.error);\n }\n } catch (err) {\n if (!isMounted.current) return;\n setError(err instanceof Error ? err.message : \"Unknown error\");\n } finally {\n if (isMounted.current) {\n setLoading(false);\n }\n }\n }, [response]);\n\n const fetchPreviousPage = useCallback(async () => {\n if (!response?.prevPage) return;\n\n setLoading(true);\n try {\n const prevResponse = await response.prevPage();\n if (!isMounted.current) return;\n\n setResponse(prevResponse);\n if (prevResponse.ok) {\n setData(prevResponse.data as T);\n } else {\n setError(prevResponse.error);\n }\n } catch (err) {\n if (!isMounted.current) return;\n setError(err instanceof Error ? err.message : \"Unknown error\");\n } finally {\n if (isMounted.current) {\n setLoading(false);\n }\n }\n }, [response]);\n\n useEffect(() => {\n isMounted.current = true;\n fetchData();\n return () => {\n isMounted.current = false;\n };\n }, [fetchData, ...(params.options?.deps || [])]);\n\n return {\n data,\n loading,\n error,\n response,\n refetch: fetchData,\n hasNextPage: !!response?.next,\n hasPreviousPage: !!response?.prev,\n fetchNextPage,\n fetchPreviousPage,\n };\n}\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport { ApiDataInterface } from \"../../core/interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../../core/interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../../core/interfaces/ApiResponseInterface\";\n\nexport type MutationMethod = \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport interface UseJsonApiMutationResult<T> {\n /**\n * The result data from the mutation, or null if not yet executed.\n */\n data: T | null;\n /**\n * Whether the mutation is currently in progress.\n */\n loading: boolean;\n /**\n * Error message if the mutation failed.\n */\n error: string | null;\n /**\n * The full API response.\n */\n response: ApiResponseInterface | null;\n /**\n * Execute the mutation.\n */\n mutate: (params: MutationParams) => Promise<T | null>;\n /**\n * Reset the mutation state.\n */\n reset: () => void;\n}\n\nexport interface MutationParams {\n /**\n * The endpoint to call.\n */\n endpoint: string;\n /**\n * The request body.\n */\n body?: any;\n /**\n * Files to upload.\n */\n files?: { [key: string]: File | Blob } | File | Blob;\n /**\n * Company ID for multi-tenant requests.\n */\n companyId?: string;\n /**\n * Override the default JSON:API body creation.\n */\n overridesJsonApiCreation?: boolean;\n /**\n * Response type if different from the request type.\n */\n responseType?: ApiRequestDataTypeInterface;\n}\n\n/**\n * Hook for making mutations (POST, PUT, PATCH, DELETE) to a JSON:API endpoint.\n *\n * @example\n * ```tsx\n * const { mutate, loading, error } = useJsonApiMutation<Article>({\n * method: \"POST\",\n * classKey: Modules.Article,\n * });\n *\n * const handleSubmit = async (data: ArticleInput) => {\n * const result = await mutate({\n * endpoint: \"/articles\",\n * body: data,\n * });\n * if (result) {\n * // Success!\n * }\n * };\n * ```\n */\nexport function useJsonApiMutation<T extends ApiDataInterface>(config: {\n method: MutationMethod;\n classKey: ApiRequestDataTypeInterface;\n onSuccess?: (data: T) => void;\n onError?: (error: string) => void;\n}): UseJsonApiMutationResult<T> {\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [response, setResponse] = useState<ApiResponseInterface | null>(null);\n\n const reset = useCallback(() => {\n setData(null);\n setLoading(false);\n setError(null);\n setResponse(null);\n }, []);\n\n const mutate = useCallback(\n async (params: MutationParams): Promise<T | null> => {\n setLoading(true);\n setError(null);\n\n try {\n const { JsonApiPost, JsonApiPut, JsonApiPatch, JsonApiDelete } = await import(\"../../unified/JsonApiRequest\");\n const language = navigator.language.split(\"-\")[0] || \"en\";\n\n let apiResponse: ApiResponseInterface;\n\n switch (config.method) {\n case \"POST\":\n apiResponse = await JsonApiPost({\n classKey: config.classKey,\n endpoint: params.endpoint,\n companyId: params.companyId,\n body: params.body,\n overridesJsonApiCreation: params.overridesJsonApiCreation,\n files: params.files,\n language,\n responseType: params.responseType,\n });\n break;\n case \"PUT\":\n apiResponse = await JsonApiPut({\n classKey: config.classKey,\n endpoint: params.endpoint,\n companyId: params.companyId,\n body: params.body,\n files: params.files,\n language,\n responseType: params.responseType,\n });\n break;\n case \"PATCH\":\n apiResponse = await JsonApiPatch({\n classKey: config.classKey,\n endpoint: params.endpoint,\n companyId: params.companyId,\n body: params.body,\n overridesJsonApiCreation: params.overridesJsonApiCreation,\n files: params.files,\n language,\n responseType: params.responseType,\n });\n break;\n case \"DELETE\":\n apiResponse = await JsonApiDelete({\n classKey: config.classKey,\n endpoint: params.endpoint,\n companyId: params.companyId,\n language,\n responseType: params.responseType,\n });\n break;\n }\n\n setResponse(apiResponse);\n\n if (apiResponse.ok) {\n const resultData = apiResponse.data as T;\n setData(resultData);\n config.onSuccess?.(resultData);\n return resultData;\n } else {\n setError(apiResponse.error);\n config.onError?.(apiResponse.error);\n return null;\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n config.onError?.(errorMessage);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [config],\n );\n\n return {\n data,\n loading,\n error,\n response,\n mutate,\n reset,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { ApiDataInterface } from \"../../core/interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../../core/interfaces/ApiRequestDataTypeInterface\";\nimport { JsonApiHydratedDataInterface } from \"../../core/interfaces/JsonApiHydratedDataInterface\";\nimport { RehydrationFactory } from \"../../core/factories/RehydrationFactory\";\n\n/**\n * Hook to rehydrate server-passed data into typed objects.\n * Use this when passing data from server components to client components.\n *\n * @example\n * ```tsx\n * // In server component\n * const article = await ArticleService.findOne(id);\n * return <ArticleDetails data={article.dehydrate()} />;\n *\n * // In client component\n * function ArticleDetails({ data }: { data: JsonApiHydratedDataInterface }) {\n * const article = useRehydration<Article>(Modules.Article, data);\n * return <div>{article.title}</div>;\n * }\n * ```\n */\nexport function useRehydration<T extends ApiDataInterface>(\n classKey: ApiRequestDataTypeInterface,\n data: JsonApiHydratedDataInterface | null | undefined,\n): T | null {\n return useMemo(() => {\n if (!data) return null;\n return RehydrationFactory.rehydrate<T>(classKey, data);\n }, [classKey, data]);\n}\n\n/**\n * Hook to rehydrate a list of server-passed data into typed objects.\n */\nexport function useRehydrationList<T extends ApiDataInterface>(\n classKey: ApiRequestDataTypeInterface,\n data: JsonApiHydratedDataInterface[] | null | undefined,\n): T[] {\n return useMemo(() => {\n if (!data || data.length === 0) return [];\n return RehydrationFactory.rehydrateList<T>(classKey, data);\n }, [classKey, data]);\n}\n"]}