api-core-lib 12.0.4 → 12.0.6

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.
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/server.ts
31
+ var server_exports = {};
32
+ __export(server_exports, {
33
+ createServerApi: () => createServerApi
34
+ });
35
+ module.exports = __toCommonJS(server_exports);
36
+
37
+ // src/core/processor.ts
38
+ var import_axios2 = __toESM(require("axios"), 1);
39
+
40
+ // src/core/utils.ts
41
+ var import_axios = __toESM(require("axios"), 1);
42
+ function isAxiosResponse(obj) {
43
+ return obj && obj.data !== void 0 && obj.status !== void 0 && obj.config !== void 0;
44
+ }
45
+ function isServerError(error) {
46
+ return import_axios.default.isAxiosError(error) && error.response !== void 0;
47
+ }
48
+ function isNetworkError(error) {
49
+ return import_axios.default.isAxiosError(error) && error.response === void 0 && error.request !== void 0;
50
+ }
51
+
52
+ // src/core/processor.ts
53
+ var processResponse = (responseOrError) => {
54
+ if (isAxiosResponse(responseOrError)) {
55
+ const response = responseOrError;
56
+ const rawData = response.data;
57
+ const isStandardApiResponse = rawData && typeof rawData.success === "boolean" && rawData.data !== void 0;
58
+ return {
59
+ data: isStandardApiResponse ? rawData.data : rawData,
60
+ links: isStandardApiResponse ? rawData.links : void 0,
61
+ meta: isStandardApiResponse ? rawData.meta : void 0,
62
+ rawResponse: rawData,
63
+ loading: false,
64
+ success: true,
65
+ error: null,
66
+ message: isStandardApiResponse ? rawData.message : "Request successful.",
67
+ validationErrors: []
68
+ };
69
+ }
70
+ if (isServerError(responseOrError)) {
71
+ const error = responseOrError;
72
+ const responseData = error.response.data;
73
+ const status = error.response.status;
74
+ let defaultMessage = "An unexpected server error occurred.";
75
+ switch (status) {
76
+ case 400:
77
+ defaultMessage = "Bad Request";
78
+ break;
79
+ case 401:
80
+ defaultMessage = "Unauthorized";
81
+ break;
82
+ case 403:
83
+ defaultMessage = "Forbidden";
84
+ break;
85
+ case 404:
86
+ defaultMessage = "Not Found";
87
+ break;
88
+ case 422:
89
+ defaultMessage = "Validation Failed";
90
+ break;
91
+ case 500:
92
+ defaultMessage = "Internal Server Error";
93
+ break;
94
+ case 503:
95
+ defaultMessage = "Service Unavailable";
96
+ break;
97
+ default:
98
+ defaultMessage = `Server Error (${status})`;
99
+ }
100
+ const finalApiError = {
101
+ message: responseData?.message || defaultMessage,
102
+ status,
103
+ code: responseData?.code || error.code,
104
+ errors: responseData?.errors || []
105
+ };
106
+ return {
107
+ data: null,
108
+ rawResponse: responseData,
109
+ error: finalApiError,
110
+ validationErrors: finalApiError.errors,
111
+ success: false,
112
+ loading: false,
113
+ message: finalApiError.message
114
+ };
115
+ }
116
+ if (isNetworkError(responseOrError)) {
117
+ const error = responseOrError;
118
+ return {
119
+ data: null,
120
+ rawResponse: error.request,
121
+ error: { message: "Network Error: Unable to connect.", status: 0, code: error.code },
122
+ success: false,
123
+ loading: false,
124
+ message: "Network Error."
125
+ };
126
+ }
127
+ if (import_axios2.default.isCancel(responseOrError)) {
128
+ return {
129
+ data: null,
130
+ rawResponse: null,
131
+ error: { message: "Request Canceled.", status: 499 },
132
+ success: false,
133
+ loading: false,
134
+ message: "Request Canceled."
135
+ };
136
+ }
137
+ return {
138
+ data: null,
139
+ rawResponse: responseOrError,
140
+ error: { message: "An unknown error occurred.", status: -1 },
141
+ success: false,
142
+ loading: false,
143
+ message: "An unknown error occurred."
144
+ };
145
+ };
146
+
147
+ // src/core/buildDynamicUrl.ts
148
+ function buildDynamicUrl(template, params) {
149
+ if (!params) {
150
+ return template;
151
+ }
152
+ return template.replace(/\{(\w+)\}/g, (placeholder, key) => {
153
+ return params.hasOwnProperty(key) ? String(params[key]) : placeholder;
154
+ });
155
+ }
156
+
157
+ // src/services/crud.ts
158
+ async function callDynamicApi(axiosInstance, baseEndpoint, actionConfig, params) {
159
+ const { pathParams, body, config } = params;
160
+ const urlTemplate = `${baseEndpoint}${actionConfig.path}`;
161
+ const finalUrl = buildDynamicUrl(urlTemplate, pathParams || {});
162
+ try {
163
+ const { method } = actionConfig;
164
+ let response;
165
+ if (method === "POST" || method === "PUT" || method === "PATCH") {
166
+ response = await axiosInstance[method.toLowerCase()](finalUrl, body, config);
167
+ } else if (method === "DELETE") {
168
+ response = await axiosInstance.delete(finalUrl, { data: body, ...config });
169
+ } else {
170
+ response = await axiosInstance.get(finalUrl, { params: body, ...config });
171
+ }
172
+ return processResponse(response);
173
+ } catch (error) {
174
+ return processResponse(error);
175
+ }
176
+ }
177
+
178
+ // src/core/globalStateManager.ts
179
+ var createInitialState = () => ({
180
+ data: null,
181
+ links: void 0,
182
+ meta: void 0,
183
+ error: null,
184
+ loading: false,
185
+ success: false,
186
+ called: false,
187
+ isStale: false,
188
+ message: void 0,
189
+ validationErrors: [],
190
+ rawResponse: null
191
+ });
192
+ var GlobalStateManager = class {
193
+ store = /* @__PURE__ */ new Map();
194
+ /**
195
+ * يحصل على لقطة (snapshot) للحالة الحالية لمفتاح معين.
196
+ */
197
+ getSnapshot(key) {
198
+ return this.store.get(key)?.state ?? createInitialState();
199
+ }
200
+ /**
201
+ * يسجل دالة callback للاستماع إلى التغييرات على مفتاح معين.
202
+ * @returns دالة لإلغاء الاشتراك.
203
+ */
204
+ subscribe(key, callback) {
205
+ if (!this.store.has(key)) {
206
+ this.store.set(key, { state: createInitialState(), listeners: /* @__PURE__ */ new Set() });
207
+ }
208
+ const item = this.store.get(key);
209
+ item.listeners.add(callback);
210
+ return () => {
211
+ item.listeners.delete(callback);
212
+ };
213
+ }
214
+ /**
215
+ * يحدّث الحالة لمفتاح معين ويقوم بإعلام جميع المشتركين.
216
+ */
217
+ setState(key, updater) {
218
+ const currentState = this.getSnapshot(key);
219
+ const newState = updater(currentState);
220
+ if (!this.store.has(key)) {
221
+ this.store.set(key, { state: newState, listeners: /* @__PURE__ */ new Set() });
222
+ } else {
223
+ this.store.get(key).state = newState;
224
+ }
225
+ this.store.get(key).listeners.forEach((listener) => listener());
226
+ }
227
+ /**
228
+ * يجعل البيانات المرتبطة بمفتاح معين "قديمة" (stale).
229
+ */
230
+ invalidate(key) {
231
+ const state = this.getSnapshot(key);
232
+ if (state.called) {
233
+ this.setState(key, (prev) => ({ ...prev, isStale: true }));
234
+ }
235
+ }
236
+ /**
237
+ * [نسخة محدثة وأكثر قوة]
238
+ * يجعل كل البيانات التي تبدأ بمفتاح معين "قديمة" (stale).
239
+ * @example invalidateByPrefix('myModule/list::') سيبطل كل صفحات القائمة.
240
+ */
241
+ invalidateByPrefix(prefix) {
242
+ this.store.forEach((value, key) => {
243
+ if (key.startsWith(prefix)) {
244
+ const state = this.getSnapshot(key);
245
+ if (state.called) {
246
+ this.setState(key, (prev) => ({ ...prev, isStale: true }));
247
+ }
248
+ }
249
+ });
250
+ }
251
+ /**
252
+ * Serializes the current state of the query store into a JSON string.
253
+ * This is used on the server to pass the initial state to the client.
254
+ * @returns A JSON string representing the dehydrated state.
255
+ */
256
+ dehydrate() {
257
+ const stateToPersist = {};
258
+ this.store.forEach((value, key) => {
259
+ if (value.state.called) {
260
+ stateToPersist[key] = value.state;
261
+ }
262
+ });
263
+ return JSON.stringify(stateToPersist);
264
+ }
265
+ /**
266
+ * Merges a dehydrated state object into the current store.
267
+ * This is used on the client to hydrate the state received from the server.
268
+ * @param hydratedState - A JSON string from the `dehydrate` method.
269
+ */
270
+ rehydrate(hydratedState) {
271
+ try {
272
+ const parsedState = JSON.parse(hydratedState);
273
+ for (const key in parsedState) {
274
+ this.setState(key, () => parsedState[key]);
275
+ }
276
+ } catch (e) {
277
+ console.error("[api-core-lib] Failed to rehydrate state:", e);
278
+ }
279
+ }
280
+ };
281
+ var globalStateManager = new GlobalStateManager();
282
+
283
+ // src/server.ts
284
+ var generateCacheKey = (moduleName, actionName, input, callOptions = {}) => {
285
+ const params = { path: callOptions.pathParams, body: input };
286
+ try {
287
+ return `${moduleName}/${actionName}::${JSON.stringify(params)}`;
288
+ } catch (error) {
289
+ return `${moduleName}/${actionName}::${Date.now()}`;
290
+ }
291
+ };
292
+ function createServerApi(apiClient, moduleConfig) {
293
+ return {
294
+ /**
295
+ * Prefetches data for a specific action on the server and populates the cache.
296
+ */
297
+ prefetch: async (actionName, input, options = {}) => {
298
+ const actionConfig = moduleConfig.actions[actionName];
299
+ if (!actionConfig) {
300
+ throw new Error(`Action "${actionName}" not found in module.`);
301
+ }
302
+ const result = await callDynamicApi(apiClient, moduleConfig.baseEndpoint, actionConfig, {
303
+ pathParams: options.pathParams,
304
+ body: input
305
+ });
306
+ const cacheKey = generateCacheKey(moduleConfig.baseEndpoint, actionName, input, { pathParams: options.pathParams });
307
+ if (result.success) {
308
+ globalStateManager.setState(cacheKey, () => ({
309
+ data: result.data,
310
+ error: null,
311
+ loading: false,
312
+ success: true,
313
+ called: true,
314
+ isStale: false,
315
+ rawResponse: result.rawResponse
316
+ }));
317
+ } else {
318
+ globalStateManager.setState(cacheKey, () => ({
319
+ data: null,
320
+ error: result.error,
321
+ loading: false,
322
+ success: false,
323
+ called: true,
324
+ isStale: true,
325
+ rawResponse: result.rawResponse
326
+ }));
327
+ }
328
+ return result.data;
329
+ },
330
+ /**
331
+ * Dehydrates the current state in the global manager into a JSON string.
332
+ */
333
+ dehydrate: () => {
334
+ return globalStateManager.dehydrate();
335
+ }
336
+ };
337
+ }
338
+ // Annotate the CommonJS export names for ESM import in node:
339
+ 0 && (module.exports = {
340
+ createServerApi
341
+ });
342
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts","../src/core/processor.ts","../src/core/utils.ts","../src/core/buildDynamicUrl.ts","../src/services/crud.ts","../src/core/globalStateManager.ts"],"sourcesContent":["// file: api-core-lib/src/server.ts\r\n\r\n/**\r\n * ===================================================================================\r\n * SERVER-SIDE ENTRY POINT\r\n * ===================================================================================\r\n * This file exports utilities that are safe to use in server-only environments\r\n * like React Server Components, Next.js API Routes, or other backend logic.\r\n * It MUST NOT import any file that has a dependency on client-only React APIs\r\n * like 'useState', 'useEffect', or 'createContext'.\r\n */\r\n\r\n\r\nimport type { AxiosInstance } from 'axios';\r\nimport { ActionConfigModule, ApiModuleConfig, InputOf } from './types/apiModule.types';\r\nimport { callDynamicApi } from './services/crud';\r\nimport { globalStateManager } from './core/globalStateManager';\r\n\r\n// This helper is duplicated here to keep this file self-contained and server-safe.\r\nconst generateCacheKey = (\r\n moduleName: string,\r\n actionName: string,\r\n input?: unknown,\r\n callOptions: { pathParams?: Record<string, any> } = {}\r\n): string => {\r\n const params = { path: callOptions.pathParams, body: input };\r\n try {\r\n return `${moduleName}/${actionName}::${JSON.stringify(params)}`;\r\n } catch (error) {\r\n return `${moduleName}/${actionName}::${Date.now()}`;\r\n }\r\n};\r\n\r\n/**\r\n * Creates a server-safe interface for pre-fetching data and dehydrating state.\r\n * Use this in your React Server Components to prepare data for the client.\r\n * @param apiClient A configured Axios instance.\r\n * @param moduleConfig The configuration for the module you want to use.\r\n * @returns An object with `prefetch` and `dehydrate` methods.\r\n */\r\nexport function createServerApi<\r\n TActions extends Record<string, ActionConfigModule<any, any>>\r\n>(\r\n apiClient: AxiosInstance,\r\n moduleConfig: ApiModuleConfig<TActions>\r\n) {\r\n return {\r\n /**\r\n * Prefetches data for a specific action on the server and populates the cache.\r\n */\r\n prefetch: async <TActionName extends keyof TActions>(\r\n actionName: TActionName,\r\n input?: InputOf<TActions[TActionName]>,\r\n options: { pathParams?: Record<string, any> } = {}\r\n ): Promise<any> => {\r\n const actionConfig = moduleConfig.actions[actionName];\r\n if (!actionConfig) {\r\n throw new Error(`Action \"${actionName as string}\" not found in module.`);\r\n }\r\n\r\n const result = await callDynamicApi(apiClient, moduleConfig.baseEndpoint, actionConfig, {\r\n pathParams: options.pathParams,\r\n body: input,\r\n });\r\n\r\n const cacheKey = generateCacheKey(moduleConfig.baseEndpoint, actionName as string, input, { pathParams: options.pathParams });\r\n \r\n if (result.success) {\r\n globalStateManager.setState(cacheKey, () => ({\r\n data: result.data, error: null, loading: false, success: true, called: true, isStale: false, rawResponse: result.rawResponse,\r\n }));\r\n } else {\r\n globalStateManager.setState(cacheKey, () => ({\r\n data: null, error: result.error, loading: false, success: false, called: true, isStale: true, rawResponse: result.rawResponse,\r\n }));\r\n }\r\n\r\n return result.data;\r\n },\r\n\r\n /**\r\n * Dehydrates the current state in the global manager into a JSON string.\r\n */\r\n dehydrate: (): string => {\r\n return globalStateManager.dehydrate();\r\n },\r\n };\r\n}","import axios, { AxiosError, AxiosResponse } from 'axios';\r\nimport { ApiError, StandardResponse, ValidationError } from '../types';\r\n// [مهم] استيراد دوال الحماية الجديدة\r\nimport { isServerError, isNetworkError, isAxiosResponse } from './utils';\r\n\r\n/**\r\n * [النسخة النهائية والمضمونة]\r\n * تستخدم دوال حماية النوع المخصصة للقضاء على أخطاء 'never' بشكل نهائي.\r\n */\r\nexport const processResponse = <T>(\r\n responseOrError: AxiosResponse<any> | AxiosError,\r\n): StandardResponse<T> => {\r\n \r\n // ===================================================================================\r\n // #region المسار 1: معالجة النجاح\r\n // ===================================================================================\r\n if (isAxiosResponse(responseOrError)) {\r\n const response = responseOrError;\r\n const rawData = response.data;\r\n const isStandardApiResponse = rawData && typeof rawData.success === 'boolean' && rawData.data !== undefined;\r\n \r\n return {\r\n data: isStandardApiResponse ? rawData.data : rawData,\r\n links: isStandardApiResponse ? rawData.links : undefined,\r\n meta: isStandardApiResponse ? rawData.meta : undefined,\r\n rawResponse: rawData,\r\n loading: false, success: true, error: null,\r\n message: isStandardApiResponse ? rawData.message : 'Request successful.',\r\n validationErrors: [],\r\n };\r\n }\r\n\r\n // ===================================================================================\r\n // #region المسار 2: معالجة الأخطاء\r\n // ===================================================================================\r\n\r\n // الحالة 2.1: خطأ من الخادم (4xx/5xx)\r\n // داخل هذا البلوك، TypeScript متأكد 100% أن `responseOrError.response` موجود.\r\n if (isServerError(responseOrError)) {\r\n const error = responseOrError; // الآن `error` من النوع الصحيح\r\n type ApiErrorResponse = { message?: string; code?: string; errors?: ValidationError[] };\r\n const responseData = error.response.data as ApiErrorResponse | undefined;\r\n const status = error.response.status;\r\n let defaultMessage = 'An unexpected server error occurred.';\r\n\r\n switch (status) {\r\n case 400: defaultMessage = 'Bad Request'; break;\r\n case 401: defaultMessage = 'Unauthorized'; break;\r\n case 403: defaultMessage = 'Forbidden'; break;\r\n case 404: defaultMessage = 'Not Found'; break;\r\n case 422: defaultMessage = 'Validation Failed'; break;\r\n case 500: defaultMessage = 'Internal Server Error'; break;\r\n case 503: defaultMessage = 'Service Unavailable'; break;\r\n default: defaultMessage = `Server Error (${status})`;\r\n }\r\n\r\n const finalApiError: ApiError = {\r\n message: responseData?.message || defaultMessage,\r\n status: status,\r\n code: responseData?.code || error.code,\r\n errors: responseData?.errors || [],\r\n };\r\n \r\n return {\r\n data: null, rawResponse: responseData,\r\n error: finalApiError,\r\n validationErrors: finalApiError.errors,\r\n success: false, loading: false, message: finalApiError.message,\r\n };\r\n }\r\n\r\n // الحالة 2.2: خطأ في الشبكة\r\n // داخل هذا البلوك، TypeScript متأكد 100% أن `responseOrError.request` موجود.\r\n if (isNetworkError(responseOrError)) {\r\n const error = responseOrError;\r\n return {\r\n data: null, rawResponse: error.request,\r\n error: { message: 'Network Error: Unable to connect.', status: 0, code: error.code },\r\n success: false, loading: false, message: 'Network Error.',\r\n };\r\n }\r\n \r\n // الحالة 2.3: تم إلغاء الطلب\r\n if (axios.isCancel(responseOrError)) {\r\n return {\r\n data: null, rawResponse: null,\r\n error: { message: 'Request Canceled.', status: 499 },\r\n success: false, loading: false, message: 'Request Canceled.',\r\n };\r\n }\r\n\r\n // ===================================================================================\r\n // #region المسار الأخير: الحالة الاحتياطية\r\n // ===================================================================================\r\n \r\n // لأي خطأ آخر لم تتم معالجته (مثل أخطاء الإعداد)\r\n return {\r\n data: null, rawResponse: responseOrError,\r\n error: { message: 'An unknown error occurred.', status: -1 },\r\n success: false, loading: false, message: 'An unknown error occurred.',\r\n };\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // file: src/core/processor.ts (مُحدَّث)\r\n\r\n// import { AxiosResponse } from 'axios';\r\n// import { ApiError, StandardResponse } from '../types';\r\n// import { isApiError, isAxiosResponse } from './utils';\r\n\r\n// export const processResponse = <T>(\r\n// responseOrError: AxiosResponse<any> | ApiError,\r\n// ): StandardResponse<T> => {\r\n// console.log(\"responseOrError [lib]\" , responseOrError)\r\n// console.log(\"responseOrError.data [lib]\" , responseOrError?.status)\r\n\r\n// if (isApiError(responseOrError)) {\r\n// return {\r\n// data: null,\r\n// rawResponse: undefined,\r\n// error: responseOrError,\r\n// validationErrors: responseOrError.errors || [],\r\n// success: false,\r\n// loading: false,\r\n// message: responseOrError.message,\r\n// };\r\n// }\r\n \r\n// if (isAxiosResponse(responseOrError)) {\r\n// const rawData = responseOrError.data;\r\n// const isWrappedResponse = \r\n// rawData && \r\n// typeof rawData.success === 'boolean' && \r\n// rawData.data !== undefined;\r\n \r\n// const finalData: T = isWrappedResponse ? rawData.data : rawData;\r\n// const message = isWrappedResponse ? rawData.message : 'Request successful.';\r\n\r\n// return {\r\n// data: finalData,\r\n// rawResponse: rawData,\r\n// loading: false,\r\n// success: true,\r\n// error: null,\r\n// message: message,\r\n// validationErrors: [],\r\n// };\r\n// }\r\n\r\n// return {\r\n// data: null,\r\n// rawResponse: undefined,\r\n// error: { message: 'An unknown error occurred during response processing.', status: 500 },\r\n// success: false,\r\n// loading: false,\r\n// message: 'An unknown error occurred.',\r\n// validationErrors: []\r\n// };\r\n// };","import axios, { AxiosError, AxiosResponse, CancelTokenSource } from 'axios';\r\nimport { ApiError, QueryOptions, StandardResponse } from '../types';\r\n\r\n// ===================================================================================\r\n// #region Type Guards (التحقق من الأنواع)\r\n// ===================================================================================\r\n\r\n/**\r\n * يتحقق مما إذا كان الكائن هو خطأ مخصص من نوع ApiError.\r\n */\r\nexport function isApiError(obj: any): obj is ApiError {\r\n return obj && typeof obj.status === 'number' && typeof obj.message === 'string' && obj.config === undefined;\r\n}\r\n\r\n\r\n// الدوال القديمة يمكن الإبقاء عليها للتوافق أو استبدالها بالكامل\r\nexport function isAxiosError(obj: any): obj is AxiosError {\r\n return obj && obj.isAxiosError === true;\r\n}\r\n\r\nexport function isAxiosResponse(obj: any): obj is AxiosResponse {\r\n return obj && obj.data !== undefined && obj.status !== undefined && obj.config !== undefined;\r\n}\r\n\r\n\r\n\r\n\r\n// ===================================================================================\r\n// #region URL & Query Handling (معالجة روابط URL والاستعلامات)\r\n// ===================================================================================\r\n\r\n/**\r\n * يبني رابطًا ديناميكيًا عن طريق استبدال المتغيرات المؤقتة مثل {key} بالقيم من كائن.\r\n * @param template - قالب الرابط (مثال: '/users/{userId}/posts').\r\n * @param params - كائن يحتوي على قيم المتغيرات (مثال: { userId: 123 }).\r\n * @returns الرابط النهائي بعد المعالجة.\r\n */\r\nexport function buildDynamicUrl(template: string, params?: Record<string, any>): string {\r\n if (!params) {\r\n return template;\r\n }\r\n return template.replace(/\\{(\\w+)\\}/g, (placeholder, key) => {\r\n return params.hasOwnProperty(key) ? String(params[key]) : placeholder;\r\n });\r\n}\r\n\r\n/**\r\n * [نسخة مطورة] يبني سلسلة استعلام (query string) من كائن الخيارات.\r\n * يدعم الآن الفلاتر المتداخلة (filter[key]=value) والترتيب المتعدد.\r\n * @param options - كائن خيارات الاستعلام (فلترة, ترتيب, ...).\r\n * @returns سلسلة استعلام جاهزة للإضافة للرابط.\r\n */\r\nexport function buildPaginateQuery(options: QueryOptions): string {\r\n const params = new URLSearchParams();\r\n\r\n for (const key in options) {\r\n const value = options[key];\r\n\r\n if (value === null || value === undefined) {\r\n continue; // تجاهل القيم الفارغة\r\n }\r\n\r\n if (key === 'filter' && typeof value === 'object' && !Array.isArray(value)) {\r\n // التعامل مع الفلاتر المتداخلة\r\n for (const filterKey in value) {\r\n const filterValue = value[filterKey];\r\n if (filterValue !== null && filterValue !== undefined) {\r\n params.append(`filter[${filterKey}]`, String(filterValue));\r\n }\r\n }\r\n } else if (key === 'sortBy' && Array.isArray(value)) {\r\n // التعامل مع الترتيب المتعدد\r\n value.forEach(sortItem => {\r\n if (sortItem && sortItem.key && sortItem.direction) {\r\n params.append('sortBy[]', `${sortItem.key}:${sortItem.direction}`);\r\n }\r\n });\r\n } else {\r\n // التعامل مع باقي المعاملات\r\n params.append(key, String(value));\r\n }\r\n }\r\n\r\n return params.toString();\r\n}\r\n\r\n// ===================================================================================\r\n// #region Object & Data Helpers (أدوات مساعدة للكائنات والبيانات)\r\n// ===================================================================================\r\n\r\n/**\r\n * يتحقق مما إذا كانت الاستجابة تحتوي على بيانات قابلة للعرض.\r\n * @param response - كائن StandardResponse.\r\n * @returns `true` إذا كانت البيانات موجودة وليست مصفوفة فارغة.\r\n */\r\nexport function hasData<T>(response: StandardResponse<T> | null | undefined): boolean {\r\n if (!response || !response.success || response.data === null || response.data === undefined) {\r\n return false;\r\n }\r\n if (Array.isArray(response.data) && response.data.length === 0) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * ينشئ نسخة جديدة من كائن مع إزالة كل الخصائص التي قيمتها `null` أو `undefined`.\r\n * @param obj - الكائن المراد تنظيفه.\r\n * @returns نسخة نظيفة من الكائن.\r\n */\r\nexport function cleanObject<T extends Record<string, any>>(obj: T): Partial<T> {\r\n const newObj: Partial<T> = {};\r\n for (const key in obj) {\r\n if (obj[key] !== null && obj[key] !== undefined) {\r\n newObj[key] = obj[key];\r\n }\r\n }\r\n return newObj;\r\n}\r\n\r\n// ===================================================================================\r\n// #region Async Helpers (أدوات مساعدة غير متزامنة)\r\n// ===================================================================================\r\n\r\n/**\r\n * ينشئ دالة تقوم بتأخير تنفيذ الدالة الأصلية حتى انقضاء فترة زمنية معينة\r\n * بعد آخر مرة تم استدعاؤها. مفيدة جدًا لتقليل الطلبات في حقول البحث.\r\n * @param func - الدالة التي سيتم تأخير تنفيذها.\r\n * @param delay - مدة التأخير بالمللي ثانية.\r\n * @returns دالة جديدة قابلة للاستدعاء.\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(func: T, delay: number): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n return function(...args: Parameters<T>) {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n func(...args);\r\n }, delay);\r\n };\r\n}\r\n\r\n/**\r\n * دالة بسيطة لإيقاف التنفيذ لمدة زمنية محددة.\r\n * @param ms - مدة التأخير بالمللي ثانية.\r\n * @returns Promise يكتمل بعد انقضاء المدة.\r\n */\r\nexport function delay(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\n// ===================================================================================\r\n// #region Request Cancellation (إدارة إلغاء الطلبات)\r\n// ===================================================================================\r\n\r\nconst cancelTokens = new Map<string, CancelTokenSource>();\r\n\r\n/**\r\n * ينشئ cancel token جديد لطلب معين، ويلغي أي طلب قديم بنفس المفتاح.\r\n * يمنع حالات الـ race conditions في المكونات التي ترسل طلبات متتالية.\r\n * @param key - مفتاح فريد لتعريف الطلب (مثال: 'user-search').\r\n * @returns كائن CancelTokenSource من Axios.\r\n */\r\nexport const createCancelToken = (key: string): CancelTokenSource => {\r\n const existingToken = cancelTokens.get(key);\r\n if (existingToken) {\r\n existingToken.cancel('Operation canceled due to a new request.');\r\n }\r\n const source = axios.CancelToken.source();\r\n cancelTokens.set(key, source);\r\n return source;\r\n};\r\n\r\n\r\n\r\n\r\n\r\n// ===================================================================================\r\n// #region Advanced Type Guards (أدوات تحقق متقدمة من الأنواع)\r\n// ===================================================================================\r\n\r\n/**\r\n * [جديد وحاسم] يتحقق مما إذا كان الخطأ هو خطأ من الخادم (يحتوي على `response`).\r\n * الأهم من ذلك، أنه يضيق نوع الخطأ ليضمن وجود `response`.\r\n */\r\nexport function isServerError(error: any): error is AxiosError & { response: AxiosResponse } {\r\n return axios.isAxiosError(error) && error.response !== undefined;\r\n}\r\n\r\n/**\r\n * [جديد وحاسم] يتحقق مما إذا كان الخطأ هو خطأ في الشبكة (لا يحتوي على `response` ولكن يحتوي على `request`).\r\n * يضيق نوع الخطأ ليضمن عدم وجود `response`.\r\n */\r\nexport function isNetworkError(error: any): error is AxiosError & { request: any } {\r\n return axios.isAxiosError(error) && error.response === undefined && error.request !== undefined;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// /**\r\n// * @file src/core/utils.ts\r\n// * @description\r\n// * يحتوي هذا الملف على مجموعة من الدوال المساعدة المستخدمة في جميع أنحاء المكتبة،\r\n// * مثل بناء سلاسل الاستعلام (query strings) وإدارة إلغاء الطلبات،\r\n// * بالإضافة إلى دوال التحقق من الأنواع (type guards).\r\n// */\r\n\r\n// import axios, { CancelTokenSource } from 'axios';\r\n// import { ApiError, QueryOptions } from '../types';\r\n// import { AxiosResponse } from 'axios';\r\n\r\n// // ===================================\r\n// // إدارة إلغاء الطلبات\r\n// // ===================================\r\n// const cancelTokens = new Map<string, CancelTokenSource>();\r\n\r\n// export const createCancelToken = (key: string): CancelTokenSource => {\r\n// const existingToken = cancelTokens.get(key);\r\n// if (existingToken) {\r\n// existingToken.cancel('Operation canceled due to a new request.');\r\n// cancelTokens.delete(key);\r\n// }\r\n// const source = axios.CancelToken.source();\r\n// cancelTokens.set(key, source);\r\n// return source;\r\n// };\r\n\r\n\r\n\r\n// interface BuildQueryOptions {\r\n// encode?: boolean;\r\n// }\r\n\r\n// /**\r\n// * يبني سلسلة استعلام (query string) من كائن الخيارات.\r\n// * @param options - كائن خيارات الاستعلام (فلترة, ترتيب, ...).\r\n// * @param config - إعدادات إضافية مثل التحكم في التشفير.\r\n// * @returns سلسلة استعلام جاهزة للإضافة للرابط.\r\n// */\r\n// export function buildPaginateQuery(options: QueryOptions, config: BuildQueryOptions = { encode: true }): string {\r\n// // استخدام URLSearchParams يقوم بالتشفير تلقائيًا وهو الأسلوب القياسي والآمن\r\n// if (config.encode) {\r\n// const params = new URLSearchParams();\r\n// Object.entries(options).forEach(([key, value]) => {\r\n// if (value !== undefined && value !== null) {\r\n// // يمكنك إضافة منطق أكثر تعقيدًا هنا للتعامل مع المصفوفات أو الكائنات\r\n// params.append(key, String(value));\r\n// }\r\n// });\r\n// return params.toString();\r\n// }\r\n\r\n// // منطق بديل إذا كان encode = false (لـ APIs التي تتطلب تنسيقًا خاصًا)\r\n// const parts = Object.entries(options)\r\n// .filter(([, value]) => value !== undefined && value !== null)\r\n// .map(([key, value]) => `${key}=${String(value)}`);\r\n \r\n// return parts.join('&');\r\n// }\r\n\r\n// // ===================================\r\n// // التحقق من الأنواع (Type Guards)\r\n// // ===================================\r\n// export function isApiError(obj: any): obj is ApiError {\r\n// console.log(\"obj in IsApiError\" , obj)\r\n// return obj && typeof obj.status === 'number' && typeof obj.message === 'string' && obj.config === undefined;\r\n// }\r\n\r\n// export function isAxiosResponse(obj: any): obj is AxiosResponse {\r\n// return obj && obj.data !== undefined && obj.status !== undefined && obj.config !== undefined;\r\n// }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// // import axios, { CancelTokenSource } from 'axios';\r\n// // import { PaginateQueryOptions, ApiError } from '../types';\r\n\r\n// // // === Cancel Token Management ===\r\n// // const cancelTokens = new Map<string, CancelTokenSource>();\r\n\r\n// // export const createCancelToken = (key: string): CancelTokenSource => {\r\n// // const existingToken = cancelTokens.get(key);\r\n// // if (existingToken) {\r\n// // existingToken.cancel('Operation canceled due to new request.');\r\n// // cancelTokens.delete(key);\r\n// // }\r\n// // const source = axios.CancelToken.source();\r\n// // cancelTokens.set(key, source);\r\n// // return source;\r\n// // };\r\n\r\n// // export const cancelRequest = (key: string): void => {\r\n// // const source = cancelTokens.get(key);\r\n// // if (source) {\r\n// // source.cancel('Operation canceled by user.');\r\n// // cancelTokens.delete(key);\r\n// // }\r\n// // };\r\n\r\n// // export const cancelAllRequests = (): void => {\r\n// // cancelTokens.forEach(source => source.cancel('All operations canceled.'));\r\n// // cancelTokens.clear();\r\n// // };\r\n\r\n// // // === Query Builder ===\r\n// // export function buildPaginateQuery(query: PaginateQueryOptions): string {\r\n// // const params = new URLSearchParams();\r\n// // if (!query) return '';\r\n\r\n// // if (query.page) params.append('page', query.page.toString());\r\n// // if (query.limit) params.append('limit', query.limit.toString());\r\n// // if (query.search) params.append('search', query.search);\r\n// // if (query.sortBy) {\r\n// // query.sortBy.forEach(sort => params.append('sortBy', `${sort.key}:${sort.direction}`));\r\n// // }\r\n// // if (query.filter) {\r\n// // Object.entries(query.filter).forEach(([field, value]) => {\r\n// // params.append(`filter.${field}`, value);\r\n// // });\r\n// // }\r\n// // const queryString = params.toString();\r\n// // return queryString ? `?${queryString}` : '';\r\n// // }\r\n\r\n// // // === Type Guards ===\r\n// // export function isApiError(obj: any): obj is ApiError {\r\n// // return obj && typeof obj.status === 'number' && typeof obj.message === 'string' && obj.config === undefined;\r\n// // }\r\n\r\n// // export function isAxiosResponse(obj: any): obj is any {\r\n// // return obj && obj.data !== undefined && obj.status !== undefined && obj.config !== undefined;\r\n// // }","/**\r\n * Replaces path placeholders like {key} with values from a params object.\r\n * @param template - The URL template (e.g., '/users/{userId}/posts').\r\n * @param params - An object with keys matching the placeholders (e.g., { userId: 123 }).\r\n * @returns The final, resolved URL string.\r\n */\r\nexport function buildDynamicUrl(template: string, params?: Record<string, any>): string {\r\n if (!params) {\r\n return template;\r\n }\r\n return template.replace(/\\{(\\w+)\\}/g, (placeholder, key) => {\r\n return params.hasOwnProperty(key) ? String(params[key]) : placeholder;\r\n });\r\n}","// file: src/services/crud.ts\r\n\r\nimport { AxiosInstance, AxiosRequestConfig } from 'axios';\r\nimport { ActionOptions, RequestConfig, StandardResponse } from '../types';\r\nimport { processResponse } from '../core/processor';\r\nimport { buildDynamicUrl } from '@/core/buildDynamicUrl';\r\nimport { ActionConfigModule } from '@/types/apiModule.types';\r\n\r\n/**\r\n * A factory function to create a reusable set of API services for a specific endpoint.\r\n * It provides full CRUD operations plus advanced features like bulk deletion and file uploads,\r\n * with intelligent, dynamic URL building.\r\n */\r\nexport function createApiServices<T>(axiosInstance: AxiosInstance, baseEndpoint: string) {\r\n \r\n /**\r\n * Intelligently resolves the final URL for a request.\r\n * Priority:\r\n * 1. A full endpoint override from `config.endpoint`.\r\n * 2. The base endpoint appended with an ID, if provided.\r\n * 3. The base endpoint alone.\r\n * It also replaces dynamic segments like {id} or {tenantId} in the URL.\r\n */\r\n const resolveUrl = (config: ActionOptions = {}, id?: string | number): string => {\r\n const endpointTemplate = config.endpoint || (id != null ? `${baseEndpoint}/{id}` : baseEndpoint);\r\n \r\n // Create a params object for URL building. We include common ID variations.\r\n const params = id != null ? { id, tenant: id, tenantId: id, recordId: id } : {};\r\n \r\n return buildDynamicUrl(endpointTemplate, params);\r\n };\r\n\r\n /**\r\n * Fetches data. Can fetch a list or a single record based on whether an ID is provided.\r\n * This is the primary flexible read operation.\r\n */\r\n const get = async (id?: string | number, config?: ActionOptions): Promise<StandardResponse<T>> => {\r\n const url = resolveUrl(config, id);\r\n try {\r\n const response = await axiosInstance.get(url, config);\r\n return processResponse<T>(response);\r\n } catch (error) {\r\n return processResponse<T>(error as any);\r\n }\r\n };\r\n \r\n /**\r\n * Fetches a list of records using a query string.\r\n * This is specifically for fetching paginated/filtered lists.\r\n */\r\n const getWithQuery = async (query: string, config?: RequestConfig): Promise<StandardResponse<T>> => {\r\n const url = `${baseEndpoint}?${query}`;\r\n try {\r\n const response = await axiosInstance.get(url, config);\r\n return processResponse<T>(response);\r\n } catch (error) {\r\n return processResponse<T>(error as any);\r\n }\r\n };\r\n\r\n /**\r\n * Creates a new resource.\r\n */\r\n const post = async (data: Partial<T>, config?: ActionOptions): Promise<StandardResponse<T>> => {\r\n const url = resolveUrl(config);\r\n try {\r\n const response = await axiosInstance.post(url, data, config);\r\n console.log(\"[lib] response POST: \" , response)\r\n console.log(\"[lib] response processResponse POST: \" , processResponse<T>(response))\r\n return processResponse<T>(response);\r\n } catch (error) {\r\n console.log(\"[lib] response error POST: \" , processResponse<T>(error as any))\r\n return processResponse<T>(error as any);\r\n }\r\n };\r\n \r\n /**\r\n * Replaces an entire resource.\r\n */\r\n const put = async (id: string | number, data: T, config?: ActionOptions): Promise<StandardResponse<T>> => {\r\n const url = resolveUrl(config, id);\r\n try {\r\n const response = await axiosInstance.put(url, data, config);\r\n return processResponse<T>(response);\r\n } catch (error) {\r\n return processResponse<T>(error as any);\r\n }\r\n };\r\n\r\n /**\r\n * Partially updates a resource.\r\n */\r\n const patch = async (id: string | number, data: Partial<T>, config?: ActionOptions): Promise<StandardResponse<T>> => {\r\n const url = resolveUrl(config, id);\r\n try {\r\n const response = await axiosInstance.patch(url, data, config);\r\n return processResponse<T>(response);\r\n } catch (error) {\r\n return processResponse<T>(error as any);\r\n }\r\n };\r\n\r\n /**\r\n * Deletes a resource.\r\n */\r\n const remove = async (id: string | number, config?: ActionOptions): Promise<StandardResponse<any>> => {\r\n const url = resolveUrl(config, id);\r\n try {\r\n const response = await axiosInstance.delete(url, config);\r\n return processResponse<any>(response);\r\n } catch (error) {\r\n return processResponse<any>(error as any);\r\n }\r\n };\r\n \r\n /**\r\n * Deletes multiple resources in a single request.\r\n */\r\n const bulkDelete = async (ids: Array<string | number>, config?: ActionOptions): Promise<StandardResponse<any>> => {\r\n const url = resolveUrl(config); // Bulk actions typically don't use an ID in the path.\r\n try {\r\n const response = await axiosInstance.delete(url, { data: { ids }, ...config });\r\n return processResponse<any>(response);\r\n } catch (error) {\r\n return processResponse<any>(error as any);\r\n }\r\n };\r\n\r\n /**\r\n * Uploads a file, with optional additional data.\r\n */\r\n const upload = async (file: File, additionalData?: Record<string, any>, config?: ActionOptions): Promise<StandardResponse<any>> => {\r\n const url = resolveUrl(config);\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n if (additionalData) {\r\n Object.keys(additionalData).forEach(key => formData.append(key, String(additionalData[key])));\r\n }\r\n try {\r\n const response = await axiosInstance.post(url, formData, {\r\n ...config, headers: { ...config?.headers, 'Content-Type': 'multipart/form-data' },\r\n });\r\n return processResponse<any>(response);\r\n } catch (error) {\r\n return processResponse<any>(error as any);\r\n }\r\n };\r\n\r\n return { get, getWithQuery, post, put, patch, remove, bulkDelete, upload };\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// نفترض أن هذه الدوال موجودة في ملف مساعد\r\n// import { buildDynamicUrl } from '@/core/buildDynamicUrl';\r\n// import { processResponse } from '../core/processor';\r\n\r\n/**\r\n * [نسخة محدثة ومحسّنة]\r\n * دالة عامة وصريحة لتنفيذ أي طلب API.\r\n * تستقبل وسائط منظمة بدلاً من محاولة تخمينها.\r\n * \r\n * @param axiosInstance - نسخة Axios.\r\n * @param baseEndpoint - نقطة النهاية الأساسية للموديول.\r\n * @param actionConfig - إعدادات الإجراء المحدد.\r\n * @param params - كائن يحتوي على جميع البارامترات اللازمة للطلب.\r\n * @returns Promise<StandardResponse<any>>\r\n */\r\nexport async function callDynamicApi(\r\n axiosInstance: AxiosInstance,\r\n baseEndpoint: string,\r\n actionConfig: ActionConfigModule<any, any>,\r\n params: {\r\n pathParams?: Record<string, string | number>;\r\n body?: any;\r\n config?: AxiosRequestConfig;\r\n }\r\n): Promise<StandardResponse<any>> {\r\n \r\n // 1. استخراج البارامترات بشكل صريح وواضح\r\n const { pathParams, body, config } = params;\r\n\r\n // 2. بناء الـ URL الديناميكي\r\n const urlTemplate = `${baseEndpoint}${actionConfig.path}`;\r\n // افترض وجود هذه الدوال أو قم بإنشائها\r\n const finalUrl = buildDynamicUrl(urlTemplate, pathParams || {}); \r\n\r\n try {\r\n const { method } = actionConfig;\r\n let response;\r\n\r\n // 3. تنفيذ الطلب بناءً على نوع الـ Method\r\n // أصبح المنطق الآن أكثر نظافة ووضوحًا\r\n if (method === 'POST' || method === 'PUT' || method === 'PATCH') {\r\n response = await axiosInstance[method.toLowerCase() as 'post'](finalUrl, body, config);\r\n } else if (method === 'DELETE') {\r\n // DELETE قد يحتوي على body في بعض الحالات (مثل bulk)\r\n response = await axiosInstance.delete(finalUrl, { data: body, ...config });\r\n } else { // GET\r\n // في GET، الجسم (body) يمثل معاملات الاستعلام (query params)\r\n response = await axiosInstance.get(finalUrl, { params: body, ...config });\r\n }\r\n \r\n return processResponse(response);\r\n } catch (error) {\r\n // معالجة الأخطاء تبقى كما هي\r\n return processResponse(error as any);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n// import { AxiosInstance } from 'axios';\r\n// import { ActionOptions, RequestConfig, StandardResponse } from '../types';\r\n// import { processResponse } from '../core/processor';\r\n\r\n// type CrudRequestConfig = RequestConfig & ActionOptions;\r\n\r\n// /**\r\n// * دالة مصنع (Factory Function) لإنشاء مجموعة خدمات API قابلة لإعادة الاستخدام لنقطة نهاية (endpoint) محددة.\r\n// * توفر عمليات CRUD كاملة بالإضافة إلى ميزات متقدمة مثل الحذف الجماعي ورفع الملفات.\r\n// */\r\n// export function createApiServices<T>(axiosInstance: AxiosInstance, endpoint: string) {\r\n \r\n// // --- Read Operations ---\r\n// const get = async (id?: string, config?: RequestConfig): Promise<StandardResponse<T | T[]>> => {\r\n// const url = id ? `${endpoint}/${id}` : endpoint;\r\n// try {\r\n// const response = await axiosInstance.get(url, config);\r\n// return processResponse(response);\r\n// } catch (error) {\r\n// return processResponse(error as any);\r\n// }\r\n// };\r\n \r\n// const getWithQuery = async (query: string, config?: RequestConfig): Promise<StandardResponse<T[]>> => {\r\n// try {\r\n// const response = await axiosInstance.get(`${endpoint}${query}`, config);\r\n// return processResponse(response);\r\n// } catch (error) {\r\n// return processResponse(error as any);\r\n// }\r\n// };\r\n\r\n// // --- Write Operations ---\r\n// const post = async (data: Partial<T>, config?: CrudRequestConfig): Promise<StandardResponse<T>> => {\r\n// const finalUrl = config?.endpoint || endpoint;\r\n// try {\r\n// const response = await axiosInstance.post(finalUrl, data, config);\r\n// return processResponse(response);\r\n// } catch (error) {\r\n// return processResponse(error as any);\r\n// }\r\n// };\r\n \r\n// /**\r\n// * ✅ NEW: إضافة دالة PUT\r\n// * تستخدم لاستبدال مورد بالكامل.\r\n// * لاحظ أن `data` من النوع `T` وليس `Partial<T>` لأن PUT يتوقع المورد كاملاً.\r\n// */\r\n// const put = async (id: string, data: T, config?: CrudRequestConfig): Promise<StandardResponse<T>> => {\r\n// const finalUrl = config?.endpoint || `${endpoint}/${id}`;\r\n// try {\r\n// const response = await axiosInstance.put(finalUrl, data, config);\r\n// return processResponse(response);\r\n// } catch (error) {\r\n// return processResponse(error as any);\r\n// }\r\n// };\r\n\r\n// const patch = async (id: string, data: Partial<T>, config?: CrudRequestConfig): Promise<StandardResponse<T>> => {\r\n// const finalUrl = config?.endpoint || `${endpoint}/${id}`;\r\n// try {\r\n// const response = await axiosInstance.patch(finalUrl, data, config);\r\n// return processResponse(response);\r\n// } catch (error) {\r\n// return processResponse(error as any);\r\n// }\r\n// };\r\n\r\n// const remove = async (id: string, config?: CrudRequestConfig): Promise<StandardResponse<any>> => {\r\n// const finalUrl = config?.endpoint || `${endpoint}/${id}`;\r\n// try {\r\n// const response = await axiosInstance.delete(finalUrl, config);\r\n// return processResponse(response);\r\n// } catch (error) {\r\n// return processResponse(error as any);\r\n// }\r\n// };\r\n \r\n// // --- Advanced Operations ---\r\n\r\n// /**\r\n// * ✅ NEW: إضافة دالة للحذف الجماعي (Bulk Delete)\r\n// * مفيدة جدًا لحذف عدة عناصر في طلب واحد لتحسين الأداء.\r\n// * ترسل مصفوفة من الـ IDs في جسم الطلب (request body).\r\n// */\r\n// const bulkDelete = async (ids: string[], config?: CrudRequestConfig): Promise<StandardResponse<any>> => {\r\n// const finalUrl = config?.endpoint || `${endpoint}`; // يمكن تخصيص المسار\r\n// try {\r\n// // Axios's delete method can send a body via the config object\r\n// const response = await axiosInstance.delete(finalUrl, { data: { ids }, ...config });\r\n// return processResponse(response);\r\n// } catch (error) {\r\n// return processResponse(error as any);\r\n// }\r\n// };\r\n\r\n// /**\r\n// * ✅ NEW: إضافة دالة لرفع الملفات (File Upload)\r\n// * تتعامل مع `FormData` لرفع الملفات، وهي ميزة أساسية في معظم التطبيقات.\r\n// * يمكن إرسال بيانات إضافية مع الملف.\r\n// */\r\n// const upload = async (file: File, additionalData?: Record<string, any>, config?: CrudRequestConfig): Promise<StandardResponse<any>> => {\r\n// const finalUrl = config?.endpoint || `${endpoint}`;\r\n \r\n// const formData = new FormData();\r\n// formData.append('file', file); // 'file' هو اسم الحقل الشائع، يمكن تغييره\r\n \r\n// if (additionalData) {\r\n// Object.keys(additionalData).forEach(key => {\r\n// formData.append(key, additionalData[key]);\r\n// });\r\n// }\r\n\r\n// try {\r\n// const response = await axiosInstance.post(finalUrl, formData, {\r\n// ...config,\r\n// headers: {\r\n// ...config?.headers,\r\n// 'Content-Type': 'multipart/form-data',\r\n// },\r\n// });\r\n// return processResponse(response);\r\n// } catch (error) {\r\n// return processResponse(error as any);\r\n// }\r\n// };\r\n\r\n// return { get, getWithQuery, post, put, patch, remove, bulkDelete, upload };\r\n// }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","// file: src/core/globalStateManager.ts\r\n\r\nimport { ActionStateModule } from \"@/types\";\r\n\r\n\r\ntype CacheItem = {\r\n state: ActionStateModule<any>;\r\n listeners: Set<() => void>;\r\n};\r\n\r\nconst createInitialState = (): ActionStateModule<any> => ({\r\n data: null,\r\n links: undefined,\r\n meta: undefined,\r\n error: null,\r\n loading: false,\r\n success: false,\r\n called: false,\r\n isStale: false,\r\n message: undefined,\r\n validationErrors: [],\r\n rawResponse: null,\r\n});\r\n\r\nclass GlobalStateManager {\r\n private store = new Map<string, CacheItem>();\r\n\r\n /**\r\n * يحصل على لقطة (snapshot) للحالة الحالية لمفتاح معين.\r\n */\r\n public getSnapshot<T>(key: string): ActionStateModule<T> {\r\n return this.store.get(key)?.state as ActionStateModule<T> ?? createInitialState();\r\n }\r\n\r\n /**\r\n * يسجل دالة callback للاستماع إلى التغييرات على مفتاح معين.\r\n * @returns دالة لإلغاء الاشتراك.\r\n */\r\n public subscribe(key: string, callback: () => void): () => void {\r\n if (!this.store.has(key)) {\r\n this.store.set(key, { state: createInitialState(), listeners: new Set() });\r\n }\r\n const item = this.store.get(key)!;\r\n item.listeners.add(callback);\r\n\r\n return () => {\r\n item.listeners.delete(callback);\r\n };\r\n }\r\n\r\n /**\r\n * يحدّث الحالة لمفتاح معين ويقوم بإعلام جميع المشتركين.\r\n */\r\n public setState<T>(key: string, updater: (prevState: ActionStateModule<T>) => ActionStateModule<T>): void {\r\n const currentState = this.getSnapshot<T>(key);\r\n const newState = updater(currentState);\r\n\r\n // نضمن وجود العنصر قبل التحديث\r\n if (!this.store.has(key)) {\r\n this.store.set(key, { state: newState, listeners: new Set() });\r\n } else {\r\n this.store.get(key)!.state = newState;\r\n }\r\n\r\n // إعلام المشتركين\r\n this.store.get(key)!.listeners.forEach(listener => listener());\r\n }\r\n\r\n /**\r\n * يجعل البيانات المرتبطة بمفتاح معين \"قديمة\" (stale).\r\n */\r\n public invalidate(key: string): void {\r\n const state = this.getSnapshot(key);\r\n // يبطل فقط إذا كانت هناك بيانات بالفعل\r\n if (state.called) {\r\n this.setState(key, (prev) => ({ ...prev, isStale: true }));\r\n }\r\n }\r\n\r\n\r\n /**\r\n * [نسخة محدثة وأكثر قوة]\r\n * يجعل كل البيانات التي تبدأ بمفتاح معين \"قديمة\" (stale).\r\n * @example invalidateByPrefix('myModule/list::') سيبطل كل صفحات القائمة.\r\n */\r\n public invalidateByPrefix(prefix: string): void {\r\n this.store.forEach((value, key) => {\r\n if (key.startsWith(prefix)) {\r\n const state = this.getSnapshot(key);\r\n // يبطل فقط إذا كانت هناك بيانات بالفعل\r\n if (state.called) {\r\n this.setState(key, (prev) => ({ ...prev, isStale: true }));\r\n }\r\n }\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Serializes the current state of the query store into a JSON string.\r\n * This is used on the server to pass the initial state to the client.\r\n * @returns A JSON string representing the dehydrated state.\r\n */\r\n public dehydrate(): string {\r\n const stateToPersist: Record<string, any> = {};\r\n this.store.forEach((value, key) => {\r\n // Dehydrate only if the state has been populated.\r\n if (value.state.called) {\r\n stateToPersist[key] = value.state;\r\n }\r\n });\r\n return JSON.stringify(stateToPersist);\r\n }\r\n\r\n /**\r\n * Merges a dehydrated state object into the current store.\r\n * This is used on the client to hydrate the state received from the server.\r\n * @param hydratedState - A JSON string from the `dehydrate` method.\r\n */\r\n public rehydrate(hydratedState: string): void {\r\n try {\r\n const parsedState = JSON.parse(hydratedState);\r\n for (const key in parsedState) {\r\n // We call setState to ensure any listening components are notified.\r\n // This prevents race conditions where a component might subscribe before rehydration is complete.\r\n this.setState(key, () => parsedState[key]);\r\n }\r\n } catch (e) {\r\n console.error(\"[api-core-lib] Failed to rehydrate state:\", e);\r\n }\r\n }\r\n\r\n \r\n}\r\n\r\nexport const globalStateManager = new GlobalStateManager();"],"mappings":"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","names":["import_axios","axios","axios"]}
@@ -0,0 +1,35 @@
1
+ import { AxiosInstance } from 'axios';
2
+ import { a as ActionConfigModule, e as ApiModuleConfig, I as InputOf } from './apiModule.types-2yhaJWN3.cjs';
3
+ import 'react';
4
+
5
+ /**
6
+ * ===================================================================================
7
+ * SERVER-SIDE ENTRY POINT
8
+ * ===================================================================================
9
+ * This file exports utilities that are safe to use in server-only environments
10
+ * like React Server Components, Next.js API Routes, or other backend logic.
11
+ * It MUST NOT import any file that has a dependency on client-only React APIs
12
+ * like 'useState', 'useEffect', or 'createContext'.
13
+ */
14
+
15
+ /**
16
+ * Creates a server-safe interface for pre-fetching data and dehydrating state.
17
+ * Use this in your React Server Components to prepare data for the client.
18
+ * @param apiClient A configured Axios instance.
19
+ * @param moduleConfig The configuration for the module you want to use.
20
+ * @returns An object with `prefetch` and `dehydrate` methods.
21
+ */
22
+ declare function createServerApi<TActions extends Record<string, ActionConfigModule<any, any>>>(apiClient: AxiosInstance, moduleConfig: ApiModuleConfig<TActions>): {
23
+ /**
24
+ * Prefetches data for a specific action on the server and populates the cache.
25
+ */
26
+ prefetch: <TActionName extends keyof TActions>(actionName: TActionName, input?: InputOf<TActions[TActionName]>, options?: {
27
+ pathParams?: Record<string, any>;
28
+ }) => Promise<any>;
29
+ /**
30
+ * Dehydrates the current state in the global manager into a JSON string.
31
+ */
32
+ dehydrate: () => string;
33
+ };
34
+
35
+ export { createServerApi };
@@ -0,0 +1,35 @@
1
+ import { AxiosInstance } from 'axios';
2
+ import { a as ActionConfigModule, e as ApiModuleConfig, I as InputOf } from './apiModule.types-2yhaJWN3.js';
3
+ import 'react';
4
+
5
+ /**
6
+ * ===================================================================================
7
+ * SERVER-SIDE ENTRY POINT
8
+ * ===================================================================================
9
+ * This file exports utilities that are safe to use in server-only environments
10
+ * like React Server Components, Next.js API Routes, or other backend logic.
11
+ * It MUST NOT import any file that has a dependency on client-only React APIs
12
+ * like 'useState', 'useEffect', or 'createContext'.
13
+ */
14
+
15
+ /**
16
+ * Creates a server-safe interface for pre-fetching data and dehydrating state.
17
+ * Use this in your React Server Components to prepare data for the client.
18
+ * @param apiClient A configured Axios instance.
19
+ * @param moduleConfig The configuration for the module you want to use.
20
+ * @returns An object with `prefetch` and `dehydrate` methods.
21
+ */
22
+ declare function createServerApi<TActions extends Record<string, ActionConfigModule<any, any>>>(apiClient: AxiosInstance, moduleConfig: ApiModuleConfig<TActions>): {
23
+ /**
24
+ * Prefetches data for a specific action on the server and populates the cache.
25
+ */
26
+ prefetch: <TActionName extends keyof TActions>(actionName: TActionName, input?: InputOf<TActions[TActionName]>, options?: {
27
+ pathParams?: Record<string, any>;
28
+ }) => Promise<any>;
29
+ /**
30
+ * Dehydrates the current state in the global manager into a JSON string.
31
+ */
32
+ dehydrate: () => string;
33
+ };
34
+
35
+ export { createServerApi };
package/dist/server.js ADDED
@@ -0,0 +1 @@
1
+ const _0x13a1d6=_0x50da;(function(_0x139055,_0x45e2d1){const _0x46f85=_0x50da,_0x1cdd77=_0x139055();while(!![]){try{const _0x18dcbe=parseInt(_0x46f85(0x192,'sgwt'))/0x1+-parseInt(_0x46f85(0x186,'Fc%I'))/0x2*(parseInt(_0x46f85(0x1d2,'EJR7'))/0x3)+parseInt(_0x46f85(0x1e6,'N^h3'))/0x4*(-parseInt(_0x46f85(0x174,'Fc%I'))/0x5)+-parseInt(_0x46f85(0x21c,'iTkr'))/0x6+parseInt(_0x46f85(0x203,'yf2#'))/0x7+parseInt(_0x46f85(0x17f,'DIP('))/0x8+-parseInt(_0x46f85(0x243,'wdpG'))/0x9*(-parseInt(_0x46f85(0x1ea,'4!fg'))/0xa);if(_0x18dcbe===_0x45e2d1)break;else _0x1cdd77['push'](_0x1cdd77['shift']());}catch(_0x457c74){_0x1cdd77['push'](_0x1cdd77['shift']());}}}(_0x4894,0xe21ca));const _0x15788f=(function(){const _0x3015df=_0x50da,_0x41fac9={'NQlGX':function(_0xeb94f4,_0x229d24){return _0xeb94f4!==_0x229d24;},'HAalj':_0x3015df(0x200,'sgwt')};let _0x2f46c5=!![];return function(_0x5de12c,_0x94652){const _0x3ef4e0=_0x2f46c5?function(){const _0x38d2c9=_0x50da;if(_0x41fac9[_0x38d2c9(0x213,')!8h')](_0x41fac9[_0x38d2c9(0x226,'mK6^')],_0x41fac9[_0x38d2c9(0x240,'hCC1')]))this[_0x38d2c9(0x23e,'DIP(')](_0x2a41b7,_0x2f6265=>({..._0x2f6265,'isStale':!![]}));else{if(_0x94652){const _0x347906=_0x94652[_0x38d2c9(0x230,'s1h4')](_0x5de12c,arguments);return _0x94652=null,_0x347906;}}}:function(){};return _0x2f46c5=![],_0x3ef4e0;};}()),_0x452b4f=_0x15788f(this,function(){const _0x4efe2d=_0x50da,_0x1eca50={'cFeEb':_0x4efe2d(0x176,'wdpG')};return _0x452b4f[_0x4efe2d(0x25c,'R$fJ')]()[_0x4efe2d(0x276,'IIAx')](_0x1eca50[_0x4efe2d(0x24d,'IIAx')])[_0x4efe2d(0x264,'yf2#')]()[_0x4efe2d(0x280,'VghR')](_0x452b4f)[_0x4efe2d(0x196,'k@Eq')](_0x1eca50[_0x4efe2d(0x1de,'x71i')]);});_0x452b4f();function _0x4894(){const _0x2e6334=['W4tdM8oPW6C','W7G6W4BcUSoT','W7KcWRfRWRuozq','eYddRCkPFa','WOlcM8oaCSoACCkE','WRJdTSkm','FLNdKW','smoECMXz','WPC2WO55mCkXCG','WQqRW7JdQa','ehKYW7hcKmkcWP/dUmkjlSoc','WPn1lhpdPa','WOPgWRixWQ3cVxZcNa','W4dcLmkUWROUWPRcRHpdIG','jCoVymoLcSk4','eh3dUCokWQy','W7dcHuxcGSk8','W6b2zG','cmkVWRZdIJK','W6bxASkyE0ddP8kQW6C','WPafW5/dNq','W6ZcKqRcT8k5WRpdTsLFjae','dcdcV8opWOq','nJHU','FwxcSCkMW7i','WQVdSmkaDSk6','WQhdTYjkW70','W4zGWPjFiCk8Ebm','zHCjW5hcSCoFDmk2','semnFLuZW6RcMmoVWO9AimkjCGXLW61PW4K','WRBdOmk5wCkXet/cKSoCW5FdH8kV','W4S2WOG/WP0','W7ayW4lcLCoNW5Hjg8oS','W6fhFWbw','CX0pW4FcPmoDAa','WRBdSmkiDCka','ntXUW7m','rmk/pmoUuKtdJL56','WRrAfSo/WP0','av4GW6BcLW','W4NdSeVcSHGDnSomW6S','auddPW','iIL7W6z2','g8oGFCkQqM/dVw5Dmq','W68cWQX7WQqy','W4RcVxtcRmk0','bJNdTmkWua','WQDmWPldMSkWWPiyg8oSW4VcVmkJW40','gxxdHcOs','g8kcvsWaWRRdUa','qJNcQqH+n8oA','DCk2pmkZfSkAwZRdUaO','yr0XW63cSSoBCSkqhs3cTa','qI9ciupdGSoqhc4','W43dQSouW5bz','W6GgWQXYWRuz','w8oIW4qtW6ddK8oniSkpW5dcOq','WPFcUCkeWQFdPG','WQTTW4KibSk5','A2VcN8ktW4rW','WQ8ri39t','WPH6W5m2mW','BxJcGCkqW5m','WPm2WPnqnCkZDa','Emk0kSoBqG','WPySaNH8','h23cJLfjrCoHlmkwomoZW5FdKHZdMWCLWRn1','W7GcWRrnWQqCzqC','s2hcM8kyW4q','q1NdKXhcGXFcT8oxWQhdKMBcO0JcRG','W6KdWPvxWR0','W7Tbq8kzDL3dTCkBW7b2WPpdJW','gSktsYSa','WO98pmoxWPa','wmk3o8oYz0VdMu1Kea','W4OlWQaVWQZcOK/cPNv1','ECoqW67cPMf3WPSUW4hcISkBWPhcJG','suygqba','eIZcOmorWPldNCkb','wv0duq','W6v3rWTV','WORcJmobBSojzq','dCk2WOb4WRJcGSkpiCktW77cMGhcIW','WOtdOIJdMGq','iuNdRduIWPiwebtcMsBcVmkiW6T4lrm','DH0zW6C','FKCiAG','WQXPW4Kbf8k4','w8kZoW','pgtdKceb','W6KDWQqCWQ0','WQXEd8oKWQO','W7OMW6VdVfK','wsRcUYHQ','WPKWWO9+jW','BgVcH8kE','WOvuoCoQWORcMG','W4JcUCkQWOSj','lHddJSkqDq','W63cMWZcOCk2WRhdRq','WPfdlCo2WOy','d8k1WOrXWR3cHmkphmkmW5BcMJ/cSG','W5SEWRi4WP3cV3ZcV250W6nq','Dr58dxNdOa','W5ddM8oPW65XiSkQWRtcGfK','eYZcPq','WOtdOIBdNaq','uCkAnSkfFa','W5ldN8oUW7zolCkRWRa','W7rDCmkKFLhdRG','W6/cOdxcQ8kF','W6JdU8o8W6Pl','DSk9WPlcQs8BW7DgW6JdMhCMAWe','dh3cVefv','aKtdP8o5','WPjuiCoCWORcNIddRa','ECkmWPZcLGC','i8oYFmoSeq','W5XarSkRxG','aCo4smoUgG','oZVdI8ojWPiSiqBcImoPESoSWOq','WR7dO8kitCkH','y2pdTa','W43dNSoDBSopnSkDEIldSwddHCozWQddJrddPrzrE8ocWQC','sCoJvhX5','FSozW4xcGLC','WRDxcxpdPW','W6JcSCo9WRvd','eGi8fCoXCSov','zMNcMmk5W4G','WRyJjhi2hSogB8otW4zAb3NdNG','W7xcP8oGWOHKbSkKkq','WRRcLXtcG8oViSoOm8ooDCoSWPVdUWVcMgddQa','yfNdLbxcJqlcUq','WP1fnu3dPq','W7JcKqRcT8kJWRpdSt8','a04CW6tcPa','ErPrjeC','W5NdPNZcTqq','ed5UW7T8W5ZcTSkf','WOhdUstdOCkjcsJcUCoYhq','amk/WPldMry','W54AWRuoWRBcSgJcVgLYW7K','WOJcLWZcIW','qYJcTHz6','W4lcMGRcGCkLWRZdPdyxgbaVlCobWPJdVmo4W7fTW6JdVG','W5ddM8oVW7ve','quCmyH0JW7hdISo5W5DvkSkoxf9fW7LSWOSjWOvLpXDrrColWOtdLSkzWOxcUmo0zKy9W5iBFMnL','qJNcQHrWoSomWRO','atddPG','nCkluYOa','dbiSbCo1zSod','WQm3h2HWWRdcI8onWOe','omkmWQZdGsyLW504','WR/cMaJcICoc','W5CqWRy','WO5nW40Ocq','WRrFnmo6WORcLZVdU8onW7ZcSmkL','WQFdTcldQrq','W6WcWRrnWR4CyrfslCoq','WRPqjCoMW5pcNdVdU8obWQVcUCkOW7iXl8o/WPLFDSoYWQZdTmodkSkij8o8j1emWODapCkRDHFdTSoYWQ9tWRK','AvNdJX/cIbFcVCkdWOe','Fe8xxN4','W5xcOgBcRmk0daxcJCoR','W6FcNq3cKmkYWRZdOcHe','WPVcKCoGDCojF8kvCG','v1Ctvq','W7BdQCoyW6ba','WRRdJeVdKCoLWORdVdz+era','FKNdHrxcJXFcTCkvWOe','WPVcO8k3WQpdSG','W7yEW4hcLmoA','W6ddNxhcRWW','p8kgWOVdPIaTW4C6','W7tcP8oNWQT/cCkJkq','WP/cGXVcICoUmmoV','WORdLSk6uCkH','WOtdGZr/W6hcVNbx','odnSW7n/W5VdSSogWPDUemk3W58xW6BdP8ouvG','ACoDW4pcOLWbDsjyf8k+','W7tcT8oWWPTUg8kK','aCkAWR7dPGi','weFcTmktW6a','W4RcI8oLWOjz','dKtdOa','WPZcLWZcGSoBiSoUo8omAa','EeKtz1uHW7a','W5GcWRjOWRKEDejVlmofWQBdUKrNnmk0WQ7cKa','W64uW6/dLuG','WRpdHe/dNCkpWRNdJrXDcG','lmkmWQW','jCkOvX0bbq','W50MWRSKWRe','yrPKc2u','WPfqiCoN','WOpcL8oaDCoEEmkEzYq','W78gWPDMWRK','W5v6AYnv','ASozW4pcKa','W7ZcMvtcS8ke','CYBcQJfu','WPtdUsNdMXxcNb3cMCkKW5ZcGW','W7BcSvVcNSk4','tMGYBKa','W5WwW7tdThBcMx3cNmoZWPX6WPyLW5K','bZhdTG','rfBdLCokqa','pNZcKfzj','WPe4WPv0','cCoOWQtcIHmpW5qV','eGmWbmoX','WPhdOt3dTSo6s0VdLSkZDwyN','WRrceMNdKSkfW73dRSkeWOG','WQGRW78','tLldHSovqW','EHj3jeC','gGHiW4vu','omkDWRNdPJC','W7JcGaZcJCk5WRxdRdXo','keddP8oVWQHraSodW7ntWQxdSSk8WQlcUSk2dCoTW4xcPXBcU8oIW5z4W53cICkAWOtcImkvdmkd','WRRdHeJdLmoJW6hcTgH8dGykpmoo','lXGRvSosBSoth8k9','yCoywNn9','ut/cRq1WoSom','bmkcvYOeWQ7dQq','WRVdPSkszSko','wSk3omoiuLNdM0nNemox','cCoGW5pdQ3iXW6ukW6tdSga','W4VcMmkP','DCopAwLtqmokdmoRWRikW4FcPwrsW5vQgCootSkJW43dG8oIbLNcHchdL8kaoqXx','WQxdLCkEvmkQ','WRyxWOjpgW','nCo0B8o3fSkS','W4BdLCoVW4naimkW','lmknWRNdGZu','gSktrs0qWRO','W5hcJtRcTmkq','z8o9DdSXc8kmkW','W6xcLGtcKSkt','W5aazCk3W4JdJ2BdUCoqW4FcMSkRW7S','W6bQEmk5Aa','c0tdJG8T','zw3dSa','iJH7W6bWW5O','w8k3WOlcUW','xCoDW4xcH1CsjrrccSkLtK1f','W7tcTSo8WOPU','ASkwnSk/tW','smoaFNPr','WQjdoCo3WRO','orhcK8owWRi','nNddHW','sSk3pmo/CKtdJ1XMcSoCza','F1qozei','WRm+W77dOmo8f8ohqdO','W63cK8o9WRSLWPhcSXhdNdtcQCk8WQanrvRcUmoMkhJcHSk9W4yiEmoRWPz1W6lcHSk5C2urWOpdHq','W50SWOCBWRm','tmozW5pdKwafDcrvc8k+','AviDF1u','qrPugxS','WP7dUdhdIq3cHWZcM8kKW5y','vmktWOlcVWi','A8kylmoaEa','W4CsW7pdQhxcLLNcIW','W7CruJdcSCosWR3dGSkcWPi5W53dNa','ucfZWPFdHSocW53dPmkMcCo2wSoK','mJj+W7C','W7/cQSoaWRDH','qSkffCoZEq','iKJdHmopWR0','sSk9WPxcRI8hW68d','swtdK8kkW49/FX3cMSoPgCoaWPmgW5v8CmkMW6/dHColWORdTHagpq','xtNcRqu','W7xcHCo8WPTs','WRlcSCk9WRVdH8ob','W4RcRghcI8kLaXtcMG'];_0x4894=function(){return _0x2e6334;};return _0x4894();}import _0x13b60d from'axios';import _0x377556 from'axios';function isAxiosResponse(_0x4f95d2){const _0x5285d6=_0x50da,_0x579ff2={'EPAkU':function(_0x2dce1f,_0x5861e2){return _0x2dce1f!==_0x5861e2;},'ILPZm':function(_0x5cb997,_0x491138){return _0x5cb997!==_0x491138;}};return _0x4f95d2&&_0x579ff2[_0x5285d6(0x179,'ok0!')](_0x4f95d2[_0x5285d6(0x27d,'Fcyk')],void 0x0)&&_0x579ff2[_0x5285d6(0x1c7,'wdpG')](_0x4f95d2[_0x5285d6(0x18b,'4!fg')],void 0x0)&&_0x579ff2[_0x5285d6(0x27e,'wdpG')](_0x4f95d2[_0x5285d6(0x1c5,'4!fg')],void 0x0);}function _0x50da(_0x119f7b,_0x139f68){const _0xc1973f=_0x4894();return _0x50da=function(_0x452b4f,_0x15788f){_0x452b4f=_0x452b4f-0x16f;let _0x48947a=_0xc1973f[_0x452b4f];if(_0x50da['aCTJCR']===undefined){var _0x50daba=function(_0x4f433c){const _0xc9ee1f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4a8dbf='',_0xf0144d='',_0x20e74a=_0x4a8dbf+_0x50daba;for(let _0x3300d6=0x0,_0xa0f848,_0x5ddd4d,_0x8de3b3=0x0;_0x5ddd4d=_0x4f433c['charAt'](_0x8de3b3++);~_0x5ddd4d&&(_0xa0f848=_0x3300d6%0x4?_0xa0f848*0x40+_0x5ddd4d:_0x5ddd4d,_0x3300d6++%0x4)?_0x4a8dbf+=_0x20e74a['charCodeAt'](_0x8de3b3+0xa)-0xa!==0x0?String['fromCharCode'](0xff&_0xa0f848>>(-0x2*_0x3300d6&0x6)):_0x3300d6:0x0){_0x5ddd4d=_0xc9ee1f['indexOf'](_0x5ddd4d);}for(let _0x5aa2a6=0x0,_0x98d308=_0x4a8dbf['length'];_0x5aa2a6<_0x98d308;_0x5aa2a6++){_0xf0144d+='%'+('00'+_0x4a8dbf['charCodeAt'](_0x5aa2a6)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xf0144d);};const _0x4389f4=function(_0x36677f,_0x458b4b){let _0x11b186=[],_0x24b52b=0x0,_0x42ec6b,_0x6cba42='';_0x36677f=_0x50daba(_0x36677f);let _0x2dca9c;for(_0x2dca9c=0x0;_0x2dca9c<0x100;_0x2dca9c++){_0x11b186[_0x2dca9c]=_0x2dca9c;}for(_0x2dca9c=0x0;_0x2dca9c<0x100;_0x2dca9c++){_0x24b52b=(_0x24b52b+_0x11b186[_0x2dca9c]+_0x458b4b['charCodeAt'](_0x2dca9c%_0x458b4b['length']))%0x100,_0x42ec6b=_0x11b186[_0x2dca9c],_0x11b186[_0x2dca9c]=_0x11b186[_0x24b52b],_0x11b186[_0x24b52b]=_0x42ec6b;}_0x2dca9c=0x0,_0x24b52b=0x0;for(let _0x5ab919=0x0;_0x5ab919<_0x36677f['length'];_0x5ab919++){_0x2dca9c=(_0x2dca9c+0x1)%0x100,_0x24b52b=(_0x24b52b+_0x11b186[_0x2dca9c])%0x100,_0x42ec6b=_0x11b186[_0x2dca9c],_0x11b186[_0x2dca9c]=_0x11b186[_0x24b52b],_0x11b186[_0x24b52b]=_0x42ec6b,_0x6cba42+=String['fromCharCode'](_0x36677f['charCodeAt'](_0x5ab919)^_0x11b186[(_0x11b186[_0x2dca9c]+_0x11b186[_0x24b52b])%0x100]);}return _0x6cba42;};_0x50da['lMkGgV']=_0x4389f4,_0x119f7b=arguments,_0x50da['aCTJCR']=!![];}const _0x3657aa=_0xc1973f[0x0],_0x42ada2=_0x452b4f+_0x3657aa,_0x3d2bbd=_0x119f7b[_0x42ada2];if(!_0x3d2bbd){if(_0x50da['uUZFbV']===undefined){const _0x220192=function(_0x5b8f83){this['fwCyYS']=_0x5b8f83,this['tuGmWv']=[0x1,0x0,0x0],this['zNZene']=function(){return'newState';},this['zYMfjE']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['EnhgCp']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x220192['prototype']['hZWQCE']=function(){const _0x2061c4=new RegExp(this['zYMfjE']+this['EnhgCp']),_0x3f9ec7=_0x2061c4['test'](this['zNZene']['toString']())?--this['tuGmWv'][0x1]:--this['tuGmWv'][0x0];return this['uFpHiT'](_0x3f9ec7);},_0x220192['prototype']['uFpHiT']=function(_0x584e25){if(!Boolean(~_0x584e25))return _0x584e25;return this['sqnVmS'](this['fwCyYS']);},_0x220192['prototype']['sqnVmS']=function(_0x3c6003){for(let _0x28a9b3=0x0,_0x39b0b2=this['tuGmWv']['length'];_0x28a9b3<_0x39b0b2;_0x28a9b3++){this['tuGmWv']['push'](Math['round'](Math['random']())),_0x39b0b2=this['tuGmWv']['length'];}return _0x3c6003(this['tuGmWv'][0x0]);},new _0x220192(_0x50da)['hZWQCE'](),_0x50da['uUZFbV']=!![];}_0x48947a=_0x50da['lMkGgV'](_0x48947a,_0x15788f),_0x119f7b[_0x42ada2]=_0x48947a;}else _0x48947a=_0x3d2bbd;return _0x48947a;},_0x50da(_0x119f7b,_0x139f68);}function isServerError(_0x56aa82){const _0xfeaa6f=_0x50da,_0x381dd8={'ZchnI':function(_0x5ec40f,_0x38ef4f){return _0x5ec40f!==_0x38ef4f;}};return _0x377556[_0xfeaa6f(0x1d5,'s1h4')](_0x56aa82)&&_0x381dd8[_0xfeaa6f(0x273,')!8h')](_0x56aa82[_0xfeaa6f(0x1b1,'Fc%I')],void 0x0);}function isNetworkError(_0x4109a0){const _0x5a060b=_0x50da,_0x1ff956={'CFdXk':function(_0x699e52,_0x27194f){return _0x699e52===_0x27194f;}};return _0x377556[_0x5a060b(0x1fe,'sd3M')](_0x4109a0)&&_0x1ff956[_0x5a060b(0x1c9,'yf2#')](_0x4109a0[_0x5a060b(0x23a,'pK]d')],void 0x0)&&_0x4109a0[_0x5a060b(0x1b9,'4oP7')]!==void 0x0;}var processResponse=_0x2481ae=>{const _0x5cbac2=_0x50da,_0x256b0b={'PbeAu':function(_0x49292a,_0x38b9b9){return _0x49292a(_0x38b9b9);},'OTRtV':function(_0x16ccc3,_0x3afbcf){return _0x16ccc3!==_0x3afbcf;},'JINuJ':_0x5cbac2(0x1e5,'naC5'),'bckxY':_0x5cbac2(0x1d0,'s1h4'),'ZYHtz':function(_0x4f1ef1,_0x4b694f){return _0x4f1ef1===_0x4b694f;},'UkCpc':_0x5cbac2(0x1bf,'EJR7'),'LGUTr':function(_0x2011cc,_0xdf08d1){return _0x2011cc!==_0xdf08d1;},'icpTX':_0x5cbac2(0x1f9,'#XoZ'),'nbzvD':function(_0x5baef5,_0x2bb43f){return _0x5baef5!==_0x2bb43f;},'lGlVn':_0x5cbac2(0x26e,'pK]d'),'dTKOH':_0x5cbac2(0x1a2,'ajE@'),'KIGlj':_0x5cbac2(0x1a4,'Fcyk'),'zFfur':_0x5cbac2(0x254,'sgwt'),'ATzHG':_0x5cbac2(0x24f,'Plnm'),'FiUpD':_0x5cbac2(0x180,'6GJd'),'aVYGQ':_0x5cbac2(0x23b,'Tyl]'),'PvvRP':_0x5cbac2(0x248,'DIP('),'KURWG':_0x5cbac2(0x272,'4oP7'),'xhSOj':_0x5cbac2(0x20b,'nb*B'),'bdUIm':_0x5cbac2(0x1b2,'3yNv')};if(_0x256b0b[_0x5cbac2(0x255,'VghR')](isAxiosResponse,_0x2481ae)){if(_0x256b0b[_0x5cbac2(0x171,'ok0!')](_0x256b0b[_0x5cbac2(0x1f3,'Plnm')],_0x256b0b[_0x5cbac2(0x262,'N^h3')])){const _0x1e0b71=_0x2481ae,_0x5778fe=_0x1e0b71[_0x5cbac2(0x246,'Tyl]')],_0x4e2635=_0x5778fe&&_0x256b0b[_0x5cbac2(0x263,'WJ@t')](typeof _0x5778fe[_0x5cbac2(0x237,'6GJd')],_0x256b0b[_0x5cbac2(0x1dd,'sgwt')])&&_0x256b0b[_0x5cbac2(0x1d1,'13Yt')](_0x5778fe[_0x5cbac2(0x173,'EJR7')],void 0x0);return{'data':_0x4e2635?_0x5778fe[_0x5cbac2(0x1db,'k@Eq')]:_0x5778fe,'links':_0x4e2635?_0x5778fe[_0x5cbac2(0x1cd,'PtjY')]:void 0x0,'meta':_0x4e2635?_0x5778fe[_0x5cbac2(0x25d,'(Do1')]:void 0x0,'rawResponse':_0x5778fe,'loading':![],'success':!![],'error':null,'message':_0x4e2635?_0x5778fe[_0x5cbac2(0x23c,'U6B[')]:_0x256b0b[_0x5cbac2(0x1da,'s1h4')],'validationErrors':[]};}else{const _0x30af0c={};return this[_0x5cbac2(0x1be,'tjbv')][_0x5cbac2(0x21a,'DIP(')]((_0x51a820,_0x2fe779)=>{const _0x76eeaa=_0x5cbac2;_0x51a820[_0x76eeaa(0x1e1,'k@Eq')][_0x76eeaa(0x1f2,'3yNv')]&&(_0x30af0c[_0x2fe779]=_0x51a820[_0x76eeaa(0x1e4,'wdpG')]);}),_0x4ee9cd[_0x5cbac2(0x1df,'WJ@t')](_0x30af0c);}}if(_0x256b0b[_0x5cbac2(0x211,'LJL!')](isServerError,_0x2481ae)){if(_0x256b0b[_0x5cbac2(0x191,'DIP(')](_0x256b0b[_0x5cbac2(0x1b8,'N^h3')],_0x5cbac2(0x19c,'sgwt'))){const _0x207e5b=_0x2481ae,_0x1eab80=_0x207e5b[_0x5cbac2(0x24b,'Cos#')][_0x5cbac2(0x1c0,'L4Uo')],_0x56b6aa=_0x207e5b[_0x5cbac2(0x223,'mK6^')][_0x5cbac2(0x18e,'jLY7')];let _0x469a08=_0x256b0b[_0x5cbac2(0x225,'DIP(')];switch(_0x56b6aa){case 0x190:_0x469a08=_0x256b0b[_0x5cbac2(0x17a,'hCC1')];break;case 0x191:_0x469a08=_0x256b0b[_0x5cbac2(0x189,'s1h4')];break;case 0x193:_0x469a08=_0x256b0b[_0x5cbac2(0x22b,'Fc%I')];break;case 0x194:_0x469a08=_0x256b0b[_0x5cbac2(0x1f0,'n$9@')];break;case 0x1a6:_0x469a08=_0x256b0b[_0x5cbac2(0x23f,'x71i')];break;case 0x1f4:_0x469a08=_0x256b0b[_0x5cbac2(0x1f4,'wFNE')];break;case 0x1f7:_0x469a08=_0x256b0b[_0x5cbac2(0x17b,'k@Eq')];break;default:_0x469a08=_0x5cbac2(0x198,'Fcyk')+_0x56b6aa+')';}const _0x286e87={'message':_0x1eab80?.[_0x5cbac2(0x1bb,'R$fJ')]||_0x469a08,'status':_0x56b6aa,'code':_0x1eab80?.[_0x5cbac2(0x206,'(Do1')]||_0x207e5b[_0x5cbac2(0x1ad,'k@Eq')],'errors':_0x1eab80?.[_0x5cbac2(0x208,'R$fJ')]||[]};return{'data':null,'rawResponse':_0x1eab80,'error':_0x286e87,'validationErrors':_0x286e87[_0x5cbac2(0x208,'R$fJ')],'success':![],'loading':![],'message':_0x286e87[_0x5cbac2(0x183,'jLY7')]};}else{const _0x4a5e49=this[_0x5cbac2(0x1ef,'iTkr')](_0x50c1b7);_0x4a5e49[_0x5cbac2(0x1ee,'4oP7')]&&this[_0x5cbac2(0x22a,'sgwt')](_0x1834ce,_0x5a05fb=>({..._0x5a05fb,'isStale':!![]}));}}if(_0x256b0b[_0x5cbac2(0x1f7,')AQx')](isNetworkError,_0x2481ae)){const _0x3194c7=_0x2481ae;return{'data':null,'rawResponse':_0x3194c7[_0x5cbac2(0x205,'PtjY')],'error':{'message':_0x5cbac2(0x188,'tjbv'),'status':0x0,'code':_0x3194c7[_0x5cbac2(0x20c,'HhFM')]},'success':![],'loading':![],'message':_0x5cbac2(0x1fc,'U6B[')};}if(_0x13b60d[_0x5cbac2(0x268,'13Yt')](_0x2481ae))return{'data':null,'rawResponse':null,'error':{'message':_0x256b0b[_0x5cbac2(0x194,'nb*B')],'status':0x1f3},'success':![],'loading':![],'message':_0x256b0b[_0x5cbac2(0x1ae,'pK]d')]};return{'data':null,'rawResponse':_0x2481ae,'error':{'message':_0x256b0b[_0x5cbac2(0x1fd,'4oP7')],'status':-0x1},'success':![],'loading':![],'message':_0x256b0b[_0x5cbac2(0x207,'uHAG')]};};function buildDynamicUrl(_0x16140a,_0x1cbeb7){const _0x42788c=_0x50da,_0x314c1c={'pAdQV':function(_0x217c9f,_0x5f11ac){return _0x217c9f(_0x5f11ac);}};if(!_0x1cbeb7)return _0x16140a;return _0x16140a[_0x42788c(0x1e9,'Cos#')](/\{(\w+)\}/g,(_0x2853f6,_0xbe2ee0)=>{const _0x5eabde=_0x42788c;return _0x1cbeb7[_0x5eabde(0x16f,')!8h')](_0xbe2ee0)?_0x314c1c[_0x5eabde(0x1a6,'hCC1')](String,_0x1cbeb7[_0xbe2ee0]):_0x2853f6;});}async function callDynamicApi(_0x598672,_0x9de8ba,_0x368d54,_0x57aef0){const _0x295175=_0x50da,_0x1898dc={'NDLKl':function(_0x1bb793,_0x583119){return _0x1bb793===_0x583119;},'AuCey':_0x295175(0x271,'wckl'),'TNNep':function(_0x4e4e63,_0x28bedf){return _0x4e4e63!==_0x28bedf;},'rGocY':_0x295175(0x227,'Fc%I'),'nckFi':function(_0x518404,_0x2c370f,_0x524dcc){return _0x518404(_0x2c370f,_0x524dcc);},'jSZiN':function(_0x535c0c,_0x45ac98){return _0x535c0c||_0x45ac98;},'dDwEB':function(_0x1acd78,_0x54b0e5){return _0x1acd78===_0x54b0e5;},'GxFmy':_0x295175(0x1ed,'mK6^'),'PMGlA':_0x295175(0x1d8,'uHAG'),'CNcZO':function(_0x13a93e,_0x43a82f){return _0x13a93e===_0x43a82f;},'YfSLg':_0x295175(0x19e,'VvGX'),'rXzXw':function(_0x39bd46,_0x5c31e3){return _0x39bd46===_0x5c31e3;},'CzsUK':_0x295175(0x278,'hCC1'),'taWxi':function(_0x27b347,_0x5ee465){return _0x27b347!==_0x5ee465;},'prxyx':_0x295175(0x253,'wFNE'),'jYYjU':_0x295175(0x267,'s1h4'),'VSEfa':_0x295175(0x21e,'hCC1'),'OHMaF':function(_0x46964d,_0x3505cb){return _0x46964d(_0x3505cb);},'Ckhge':_0x295175(0x277,'LJL!'),'ZyDPG':_0x295175(0x236,'pK]d'),'uoBYS':function(_0x573910,_0x597b58){return _0x573910(_0x597b58);}},{pathParams:_0x229229,body:_0x388ecc,config:_0xb98dc0}=_0x57aef0,_0x319572=''+_0x9de8ba+_0x368d54[_0x295175(0x279,'sgwt')],_0x37c47b=_0x1898dc[_0x295175(0x238,'3yNv')](buildDynamicUrl,_0x319572,_0x1898dc[_0x295175(0x1af,')AQx')](_0x229229,{}));try{if(_0x1898dc[_0x295175(0x218,'ajE@')](_0x1898dc[_0x295175(0x22e,'4!fg')],_0x1898dc[_0x295175(0x26d,'3yNv')]))_0x1decf3[_0x295175(0x25a,'wdpG')][_0x295175(0x1e3,'4oP7')](_0xf9361f);else{const {method:_0x539d76}=_0x368d54;let _0x282ce2;if(_0x1898dc[_0x295175(0x18a,'EJR7')](_0x539d76,_0x295175(0x1cb,'L4Uo'))||_0x1898dc[_0x295175(0x1a9,')AQx')](_0x539d76,_0x1898dc[_0x295175(0x23d,'0WOr')])||_0x1898dc[_0x295175(0x193,'sd3M')](_0x539d76,_0x1898dc[_0x295175(0x27f,'Cos#')])){if(_0x1898dc[_0x295175(0x27b,'4oP7')](_0x1898dc[_0x295175(0x21b,'sgwt')],_0x1898dc[_0x295175(0x1e7,'nb*B')]))_0x282ce2=await _0x598672[_0x539d76[_0x295175(0x1eb,'HhFM')]()](_0x37c47b,_0x388ecc,_0xb98dc0);else{const _0x5cb97f=_0x3bd780,_0x89e11d=_0x5cb97f[_0x295175(0x20d,'wckl')],_0x24f88a=_0x89e11d&&_0x1898dc[_0x295175(0x219,'naC5')](typeof _0x89e11d[_0x295175(0x26b,'pK]d')],_0x1898dc[_0x295175(0x228,'#XoZ')])&&_0x1898dc[_0x295175(0x282,'wckl')](_0x89e11d[_0x295175(0x1b7,'mK6^')],void 0x0);return{'data':_0x24f88a?_0x89e11d[_0x295175(0x216,'3yNv')]:_0x89e11d,'links':_0x24f88a?_0x89e11d[_0x295175(0x215,'EJR7')]:void 0x0,'meta':_0x24f88a?_0x89e11d[_0x295175(0x1b3,'Cos#')]:void 0x0,'rawResponse':_0x89e11d,'loading':![],'success':!![],'error':null,'message':_0x24f88a?_0x89e11d[_0x295175(0x24e,'6GJd')]:_0x295175(0x1d4,'wckl'),'validationErrors':[]};}}else _0x539d76===_0x1898dc[_0x295175(0x25e,'mK6^')]?_0x282ce2=await _0x598672[_0x295175(0x20e,'wFNE')](_0x37c47b,{'data':_0x388ecc,..._0xb98dc0}):_0x282ce2=await _0x598672[_0x295175(0x1bc,'s1h4')](_0x37c47b,{'params':_0x388ecc,..._0xb98dc0});return _0x1898dc[_0x295175(0x210,'nb*B')](processResponse,_0x282ce2);}}catch(_0x5aa885){if(_0x1898dc[_0x295175(0x1fb,'3yNv')]!==_0x1898dc[_0x295175(0x18f,'DIP(')])return _0x1898dc[_0x295175(0x1cf,'3yNv')](processResponse,_0x5aa885);else{const _0x40ab9f=_0x58e189;return{'data':null,'rawResponse':_0x40ab9f[_0x295175(0x1e8,'jLY7')],'error':{'message':_0x295175(0x17e,'VvGX'),'status':0x0,'code':_0x40ab9f[_0x295175(0x197,'Fc%I')]},'success':![],'loading':![],'message':_0x1898dc[_0x295175(0x1b4,'pK]d')]};}}}var createInitialState=()=>({'data':null,'links':void 0x0,'meta':void 0x0,'error':null,'loading':![],'success':![],'called':![],'isStale':![],'message':void 0x0,'validationErrors':[],'rawResponse':null}),GlobalStateManager=class{[_0x13a1d6(0x199,'pK]d')]=new Map();[_0x13a1d6(0x26a,'Fcyk')](_0x2f3dd0){const _0x3d127b=_0x13a1d6;return this[_0x3d127b(0x247,'Cos#')][_0x3d127b(0x1c8,'uHAG')](_0x2f3dd0)?.[_0x3d127b(0x221,'VghR')]??createInitialState();}[_0x13a1d6(0x260,'U6B[')](_0x368efe,_0x524587){const _0x30cd09=_0x13a1d6,_0x1add6e={'lKdaB':_0x30cd09(0x184,'s1h4'),'DmWWz':function(_0x19d614,_0x2866fe){return _0x19d614!==_0x2866fe;}};if(!this[_0x30cd09(0x1be,'tjbv')][_0x30cd09(0x231,'ok0!')](_0x368efe)){if(_0x1add6e[_0x30cd09(0x1b0,'VvGX')](_0x30cd09(0x244,'yf2#'),_0x30cd09(0x1c2,'0WOr')))this[_0x30cd09(0x1ff,'jLY7')][_0x30cd09(0x220,'PtjY')](_0x368efe,{'state':createInitialState(),'listeners':new Set()});else{const _0x2ea58b=_0x511bc1[_0x30cd09(0x234,'Fcyk')](_0x345954);for(const _0x48dff in _0x2ea58b){this[_0x30cd09(0x1fa,'4oP7')](_0x48dff,()=>_0x2ea58b[_0x48dff]);}}}const _0x276fc7=this[_0x30cd09(0x247,'Cos#')][_0x30cd09(0x1e0,'VvGX')](_0x368efe);return _0x276fc7[_0x30cd09(0x27a,'R$fJ')][_0x30cd09(0x24c,'naC5')](_0x524587),()=>{const _0x5ad919=_0x30cd09;if(_0x5ad919(0x1c6,'VvGX')===_0x1add6e[_0x5ad919(0x1a8,'Fc%I')]){const _0x2eb324={'path':_0x42c2f6[_0x5ad919(0x177,'0WOr')],'body':_0x3d8550};try{return _0x3e3e52+'/'+_0x4ed460+'::'+_0x5c34cb[_0x5ad919(0x1a1,'L4Uo')](_0x2eb324);}catch(_0x4ad3f1){return _0x19af13+'/'+_0x3aca6c+'::'+_0x5fe8e6[_0x5ad919(0x195,'ok0!')]();}}else _0x276fc7[_0x5ad919(0x1c4,'ajE@')][_0x5ad919(0x217,'sgwt')](_0x524587);};}[_0x13a1d6(0x250,'yf2#')](_0x268e4c,_0x55a198){const _0x2b429b=_0x13a1d6,_0x28e19c={'ivbLu':function(_0x4791ac,_0x3addbb){return _0x4791ac(_0x3addbb);}},_0x1c0379=this[_0x2b429b(0x245,'LJL!')](_0x268e4c),_0x234641=_0x28e19c[_0x2b429b(0x214,'Cos#')](_0x55a198,_0x1c0379);!this[_0x2b429b(0x1ba,'naC5')][_0x2b429b(0x26f,'VvGX')](_0x268e4c)?this[_0x2b429b(0x1ba,'naC5')][_0x2b429b(0x1bd,'U6B[')](_0x268e4c,{'state':_0x234641,'listeners':new Set()}):this[_0x2b429b(0x172,'#XoZ')][_0x2b429b(0x187,'ajE@')](_0x268e4c)[_0x2b429b(0x19a,'DxxO')]=_0x234641,this[_0x2b429b(0x20a,'VghR')][_0x2b429b(0x275,'yf2#')](_0x268e4c)[_0x2b429b(0x1dc,')AQx')][_0x2b429b(0x224,'sd3M')](_0x2595cf=>_0x2595cf());}[_0x13a1d6(0x1a7,'VghR')](_0x1ab148){const _0x6b045b=_0x13a1d6,_0x116239=this[_0x6b045b(0x245,'LJL!')](_0x1ab148);_0x116239[_0x6b045b(0x1ee,'4oP7')]&&this[_0x6b045b(0x1fa,'4oP7')](_0x1ab148,_0x25e20a=>({..._0x25e20a,'isStale':!![]}));}[_0x13a1d6(0x269,'k@Eq')](_0x26b0fd){const _0x281353=_0x13a1d6,_0x1f0b83={'ZrGmA':function(_0x413ec2,_0x20fb46){return _0x413ec2!==_0x20fb46;},'rIIbE':_0x281353(0x259,'wckl')};this[_0x281353(0x1f8,'Plnm')][_0x281353(0x1f6,'EJR7')]((_0x71045d,_0x50365b)=>{const _0x10991c=_0x281353;if(_0x1f0b83[_0x10991c(0x181,'tjbv')](_0x1f0b83[_0x10991c(0x1d6,'LJL!')],_0x1f0b83[_0x10991c(0x233,'tjbv')]))this[_0x10991c(0x1aa,')!8h')](_0xe60afb,()=>_0x163389[_0xdbe8f1]);else{if(_0x50365b[_0x10991c(0x202,'LJL!')](_0x26b0fd)){const _0xa72b25=this[_0x10991c(0x1cc,'DIP(')](_0x50365b);_0xa72b25[_0x10991c(0x1b5,'n$9@')]&&this[_0x10991c(0x1d3,'HhFM')](_0x50365b,_0x386c62=>({..._0x386c62,'isStale':!![]}));}}});}[_0x13a1d6(0x1d7,'N^h3')](){const _0x4f7eaf=_0x13a1d6,_0x4ba68b={'RiyaW':function(_0x220631,_0x389b70){return _0x220631(_0x389b70);},'SnpcI':function(_0x3e1efd,_0x315ec7){return _0x3e1efd===_0x315ec7;},'HxaNV':_0x4f7eaf(0x261,'n$9@')},_0x3ff590={};return this[_0x4f7eaf(0x235,'0WOr')][_0x4f7eaf(0x1d9,'HhFM')]((_0x1f9222,_0x59b108)=>{const _0x55ef8b=_0x4f7eaf,_0xbd6db4={'sjcdm':function(_0x2a16b7,_0x451211){const _0x367164=_0x50da;return _0x4ba68b[_0x367164(0x27c,'uHAG')](_0x2a16b7,_0x451211);}};if(_0x4ba68b[_0x55ef8b(0x251,'Tyl]')](_0x55ef8b(0x26c,'yf2#'),_0x4ba68b[_0x55ef8b(0x222,'DxxO')]))_0x1f9222[_0x55ef8b(0x17c,'yf2#')][_0x55ef8b(0x1f1,'wFNE')]&&(_0x3ff590[_0x59b108]=_0x1f9222[_0x55ef8b(0x1a5,'wckl')]);else{const _0x3e762b=this[_0x55ef8b(0x256,'4oP7')](_0x19e4f0),_0x104d2a=_0xbd6db4[_0x55ef8b(0x19b,'tjbv')](_0x33cb7c,_0x3e762b);!this[_0x55ef8b(0x172,'#XoZ')][_0x55ef8b(0x178,'L4Uo')](_0xc317ee)?this[_0x55ef8b(0x175,'6GJd')][_0x55ef8b(0x20f,')AQx')](_0x20b621,{'state':_0x104d2a,'listeners':new _0x504875()}):this[_0x55ef8b(0x20a,'VghR')][_0x55ef8b(0x170,'naC5')](_0x53c12c)[_0x55ef8b(0x204,'(Do1')]=_0x104d2a,this[_0x55ef8b(0x172,'#XoZ')][_0x55ef8b(0x1ce,'k@Eq')](_0xee9611)[_0x55ef8b(0x25b,'DIP(')][_0x55ef8b(0x18c,'mK6^')](_0x28e2f7=>_0x28e2f7());}}),JSON[_0x4f7eaf(0x17d,'DIP(')](_0x3ff590);}[_0x13a1d6(0x1ca,'sd3M')](_0x29515b){const _0x5644e8=_0x13a1d6,_0x26f8f7={'YXBrE':_0x5644e8(0x24a,'wckl')};try{const _0x554082=JSON[_0x5644e8(0x249,'mK6^')](_0x29515b);for(const _0x262414 in _0x554082){this[_0x5644e8(0x1aa,')!8h')](_0x262414,()=>_0x554082[_0x262414]);}}catch(_0x5c59e6){console[_0x5644e8(0x1a0,'wckl')](_0x26f8f7[_0x5644e8(0x19d,'PtjY')],_0x5c59e6);}}},globalStateManager=new GlobalStateManager(),generateCacheKey=(_0x2dc7bf,_0x53b3f8,_0x4a3b3f,_0x5085fd={})=>{const _0x1861e7=_0x13a1d6,_0x21c2f9={'MoZkT':function(_0xd06a0f,_0x1b4a3e){return _0xd06a0f===_0x1b4a3e;},'dSFFk':_0x1861e7(0x18d,'yf2#'),'cbEnr':_0x1861e7(0x22d,'sd3M')},_0x1326b0={'path':_0x5085fd[_0x1861e7(0x21f,'mK6^')],'body':_0x4a3b3f};try{if(_0x21c2f9[_0x1861e7(0x212,'sgwt')](_0x21c2f9[_0x1861e7(0x1a3,'LJL!')],_0x21c2f9[_0x1861e7(0x241,'WJ@t')]))_0x4e676e[_0x1861e7(0x1f5,'3yNv')](_0x1861e7(0x257,'sgwt'),_0x227f11);else return _0x2dc7bf+'/'+_0x53b3f8+'::'+JSON[_0x1861e7(0x1ec,'hCC1')](_0x1326b0);}catch(_0x33df99){return _0x2dc7bf+'/'+_0x53b3f8+'::'+Date[_0x1861e7(0x252,'LJL!')]();}};function createServerApi(_0x8115fe,_0x64d581){const _0x5485bd={'OxNFi':function(_0x34a7b0,_0x5f02b8,_0x5ad82d,_0x4c4ab4,_0x85baf1){return _0x34a7b0(_0x5f02b8,_0x5ad82d,_0x4c4ab4,_0x85baf1);}};return{'prefetch':async(_0x362449,_0x38a7e4,_0x2120b3={})=>{const _0x3c4aab=_0x50da,_0x3f9d93=_0x64d581[_0x3c4aab(0x182,'Cos#')][_0x362449];if(!_0x3f9d93)throw new Error(_0x3c4aab(0x242,'k@Eq')+_0x362449+_0x3c4aab(0x232,'R$fJ'));const _0x386e05=await _0x5485bd[_0x3c4aab(0x281,'wdpG')](callDynamicApi,_0x8115fe,_0x64d581[_0x3c4aab(0x19f,')AQx')],_0x3f9d93,{'pathParams':_0x2120b3[_0x3c4aab(0x270,'Tyl]')],'body':_0x38a7e4}),_0x257b14=generateCacheKey(_0x64d581[_0x3c4aab(0x21d,'LJL!')],_0x362449,_0x38a7e4,{'pathParams':_0x2120b3[_0x3c4aab(0x201,')AQx')]});return _0x386e05[_0x3c4aab(0x266,'Tyl]')]?globalStateManager[_0x3c4aab(0x265,'pK]d')](_0x257b14,()=>({'data':_0x386e05[_0x3c4aab(0x173,'EJR7')],'error':null,'loading':![],'success':!![],'called':!![],'isStale':![],'rawResponse':_0x386e05[_0x3c4aab(0x1c1,'x71i')]})):globalStateManager[_0x3c4aab(0x1b6,'wdpG')](_0x257b14,()=>({'data':null,'error':_0x386e05[_0x3c4aab(0x22c,'4!fg')],'loading':![],'success':![],'called':!![],'isStale':!![],'rawResponse':_0x386e05[_0x3c4aab(0x185,')AQx')]})),_0x386e05[_0x3c4aab(0x229,'VvGX')];},'dehydrate':()=>{const _0x53998b=_0x50da;return globalStateManager[_0x53998b(0x258,'U6B[')]();}};}export{createServerApi};