@carlonicora/nextjs-jsonapi 2.2.1 → 2.2.2
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.
- package/dist/{BlockNoteEditor-2LGNETXD.mjs → BlockNoteEditor-ADT6II2V.mjs} +5 -5
- package/dist/{BlockNoteEditor-EAEGUVFI.js → BlockNoteEditor-QTIDATPF.js} +20 -20
- package/dist/{BlockNoteEditor-EAEGUVFI.js.map → BlockNoteEditor-QTIDATPF.js.map} +1 -1
- package/dist/{JsonApiRequest-F5LBESSA.mjs → JsonApiRequest-3UWVIIFL.mjs} +2 -2
- package/dist/JsonApiRequest-QRU3IPIU.js +26 -0
- package/dist/{JsonApiRequest-YAPUG4ND.js.map → JsonApiRequest-QRU3IPIU.js.map} +1 -1
- package/dist/billing/index.js +447 -447
- package/dist/billing/index.js.map +1 -1
- package/dist/billing/index.mjs +62 -62
- package/dist/billing/index.mjs.map +1 -1
- package/dist/{chunk-B34NBMKV.mjs → chunk-7DJOQTNN.mjs} +3 -3
- package/dist/{chunk-R57FRJ6H.mjs → chunk-DLTMYGLR.mjs} +5 -5
- package/dist/{chunk-Z2CB63VG.mjs → chunk-E5YA5Z5X.mjs} +2 -2
- package/dist/chunk-E5YA5Z5X.mjs.map +1 -0
- package/dist/{chunk-4I2W336O.js → chunk-F3BPNQDB.js} +737 -737
- package/dist/{chunk-4I2W336O.js.map → chunk-F3BPNQDB.js.map} +1 -1
- package/dist/{chunk-QWCAOLBD.js → chunk-FPO4DLZN.js} +12 -12
- package/dist/{chunk-QWCAOLBD.js.map → chunk-FPO4DLZN.js.map} +1 -1
- package/dist/{chunk-DQJ5C5TV.js → chunk-KSU6CCW6.js} +30 -30
- package/dist/{chunk-DQJ5C5TV.js.map → chunk-KSU6CCW6.js.map} +1 -1
- package/dist/{chunk-BLKR2Q7F.js → chunk-LANOKEFZ.js} +9 -9
- package/dist/{chunk-BLKR2Q7F.js.map → chunk-LANOKEFZ.js.map} +1 -1
- package/dist/{chunk-OC7F4L7K.mjs → chunk-YEPE2HT6.mjs} +6 -6
- package/dist/client/index.js +5 -5
- package/dist/client/index.mjs +4 -4
- package/dist/components/index.js +5 -5
- package/dist/components/index.mjs +4 -4
- package/dist/contexts/index.js +5 -5
- package/dist/contexts/index.mjs +4 -4
- package/dist/core/index.js +3 -3
- package/dist/core/index.mjs +2 -2
- package/dist/features/help/index.js +38 -38
- package/dist/features/help/index.mjs +4 -4
- package/dist/features/tokenusage/index.js +72 -72
- package/dist/features/tokenusage/index.mjs +4 -4
- package/dist/index.js +4 -4
- package/dist/index.mjs +3 -3
- package/dist/server/index.js +12 -12
- package/dist/server/index.mjs +2 -2
- package/package.json +1 -1
- package/src/core/utils/__tests__/translateResponse.test.ts +64 -0
- package/src/core/utils/translateResponse.ts +4 -1
- package/src/features/billing/components/containers/BillingDashboardContainer.tsx +71 -68
- package/dist/JsonApiRequest-YAPUG4ND.js +0 -26
- package/dist/chunk-Z2CB63VG.mjs.map +0 -1
- /package/dist/{BlockNoteEditor-2LGNETXD.mjs.map → BlockNoteEditor-ADT6II2V.mjs.map} +0 -0
- /package/dist/{JsonApiRequest-F5LBESSA.mjs.map → JsonApiRequest-3UWVIIFL.mjs.map} +0 -0
- /package/dist/{chunk-B34NBMKV.mjs.map → chunk-7DJOQTNN.mjs.map} +0 -0
- /package/dist/{chunk-R57FRJ6H.mjs.map → chunk-DLTMYGLR.mjs.map} +0 -0
- /package/dist/{chunk-OC7F4L7K.mjs.map → chunk-YEPE2HT6.mjs.map} +0 -0
package/dist/server/index.mjs
CHANGED
|
@@ -15,13 +15,13 @@ import {
|
|
|
15
15
|
S3Service,
|
|
16
16
|
UserService,
|
|
17
17
|
checkPermissionsFromServer
|
|
18
|
-
} from "../chunk-
|
|
18
|
+
} from "../chunk-DLTMYGLR.mjs";
|
|
19
19
|
import "../chunk-AUXK7QSA.mjs";
|
|
20
20
|
import "../chunk-C7C7VY4F.mjs";
|
|
21
21
|
import {
|
|
22
22
|
JsonApiDataFactory,
|
|
23
23
|
translateResponse
|
|
24
|
-
} from "../chunk-
|
|
24
|
+
} from "../chunk-E5YA5Z5X.mjs";
|
|
25
25
|
import {
|
|
26
26
|
__name
|
|
27
27
|
} from "../chunk-PAWJFY3S.mjs";
|
package/package.json
CHANGED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { ApiData } from "../../interfaces/ApiData";
|
|
3
|
+
import { ApiDataInterface } from "../../interfaces/ApiDataInterface";
|
|
4
|
+
import { ApiRequestDataTypeInterface } from "../../interfaces/ApiRequestDataTypeInterface";
|
|
5
|
+
import { DataClassRegistry } from "../../registry/DataClassRegistry";
|
|
6
|
+
import { translateResponse } from "../translateResponse";
|
|
7
|
+
|
|
8
|
+
class StubData implements Partial<ApiDataInterface> {
|
|
9
|
+
id = "";
|
|
10
|
+
rehydrate(): void {}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const stubModule = {
|
|
14
|
+
name: "stub-module",
|
|
15
|
+
model: StubData as unknown as { new (): ApiDataInterface },
|
|
16
|
+
} as unknown as ApiRequestDataTypeInterface;
|
|
17
|
+
|
|
18
|
+
const errorResponse = (params: { status: number; statusText: string; data: unknown }): ApiData =>
|
|
19
|
+
({
|
|
20
|
+
ok: false,
|
|
21
|
+
status: params.status,
|
|
22
|
+
statusText: params.statusText,
|
|
23
|
+
data: params.data,
|
|
24
|
+
}) as ApiData;
|
|
25
|
+
|
|
26
|
+
describe("translateResponse error extraction", () => {
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
DataClassRegistry.clear();
|
|
29
|
+
DataClassRegistry.registerObjectClass(stubModule, StubData as unknown as { new (): ApiDataInterface });
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("reads the `error` key used by API error bodies", async () => {
|
|
33
|
+
const response = await translateResponse({
|
|
34
|
+
classKey: stubModule,
|
|
35
|
+
// HTTP/2 drops the reason phrase, so statusText is empty in the browser.
|
|
36
|
+
apiResponse: errorResponse({ status: 404, statusText: "", data: { error: "Customer not found" } }),
|
|
37
|
+
language: "en",
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
expect(response.ok).toBe(false);
|
|
41
|
+
expect(response.response).toBe(404);
|
|
42
|
+
expect(response.error).toBe("Customer not found");
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("still prefers the `message` key when present", async () => {
|
|
46
|
+
const response = await translateResponse({
|
|
47
|
+
classKey: stubModule,
|
|
48
|
+
apiResponse: errorResponse({ status: 400, statusText: "", data: { message: "Validation failed" } }),
|
|
49
|
+
language: "en",
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
expect(response.error).toBe("Validation failed");
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("falls back to statusText when the body carries no error text", async () => {
|
|
56
|
+
const response = await translateResponse({
|
|
57
|
+
classKey: stubModule,
|
|
58
|
+
apiResponse: errorResponse({ status: 500, statusText: "Internal Server Error", data: undefined }),
|
|
59
|
+
language: "en",
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
expect(response.error).toBe("Internal Server Error");
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -73,7 +73,10 @@ export async function translateResponse<T extends ApiDataInterface>(params: {
|
|
|
73
73
|
response.response = params.apiResponse.status;
|
|
74
74
|
|
|
75
75
|
if (!params.apiResponse.ok) {
|
|
76
|
-
|
|
76
|
+
// `statusText` is empty over HTTP/2 (the reason phrase was removed from the protocol), so the
|
|
77
|
+
// body is the only reliable source of error text. APIs in this stack use either key.
|
|
78
|
+
response.error =
|
|
79
|
+
params.apiResponse?.data?.message ?? params.apiResponse?.data?.error ?? params.apiResponse.statusText;
|
|
77
80
|
response.raw = params.apiResponse.data;
|
|
78
81
|
return response;
|
|
79
82
|
}
|
|
@@ -112,84 +112,87 @@ export function BillingDashboardContainer() {
|
|
|
112
112
|
setNoCustomerExists(false);
|
|
113
113
|
} catch (error: unknown) {
|
|
114
114
|
console.error("[BillingDashboard] Failed to load customer:", error);
|
|
115
|
-
//
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
// A 404 means the company has no billing customer yet - a setup prompt, not an error.
|
|
116
|
+
// Match on the status, never on the message: `statusText` is empty over HTTP/2, so the
|
|
117
|
+
// error text carries no reason phrase to match against.
|
|
118
|
+
if ((error as { status?: number })?.status === 404) {
|
|
118
119
|
setNoCustomerExists(true);
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
customer: false,
|
|
122
|
-
subscriptions: false,
|
|
123
|
-
paymentMethods: false,
|
|
124
|
-
invoices: false,
|
|
125
|
-
usage: false,
|
|
126
|
-
});
|
|
127
|
-
return; // Don't try to fetch other data
|
|
120
|
+
} else {
|
|
121
|
+
setErrors((prev) => ({ ...prev, customer: "Failed to load billing account" }));
|
|
128
122
|
}
|
|
129
|
-
setErrors((prev) => ({ ...prev, customer: "Failed to load billing account" }));
|
|
130
123
|
} finally {
|
|
131
124
|
setLoading((prev) => ({ ...prev, customer: false }));
|
|
132
125
|
}
|
|
133
126
|
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return [];
|
|
147
|
-
} finally {
|
|
148
|
-
setLoading((prev) => ({ ...prev, subscriptions: false }));
|
|
149
|
-
}
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
// Fetch payment methods
|
|
153
|
-
const fetchPaymentMethods = async () => {
|
|
154
|
-
try {
|
|
155
|
-
const paymentMethods = await StripeCustomerService.listPaymentMethods();
|
|
156
|
-
setData((prev) => ({ ...prev, paymentMethods }));
|
|
157
|
-
setErrors((prev) => ({ ...prev, paymentMethods: null }));
|
|
158
|
-
} catch (error) {
|
|
159
|
-
console.error("[BillingDashboard] Failed to load payment methods:", error);
|
|
160
|
-
setErrors((prev) => ({ ...prev, paymentMethods: "Failed to load payment methods" }));
|
|
161
|
-
} finally {
|
|
162
|
-
setLoading((prev) => ({ ...prev, paymentMethods: false }));
|
|
163
|
-
}
|
|
164
|
-
};
|
|
127
|
+
// Without a customer there is nothing downstream to fetch. Release every section here, or the
|
|
128
|
+
// cards that are only cleared inside their own fetchers stay skeletons forever.
|
|
129
|
+
if (!customer) {
|
|
130
|
+
setLoading({
|
|
131
|
+
customer: false,
|
|
132
|
+
subscriptions: false,
|
|
133
|
+
paymentMethods: false,
|
|
134
|
+
invoices: false,
|
|
135
|
+
usage: false,
|
|
136
|
+
});
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
165
139
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
140
|
+
// Fetch subscriptions
|
|
141
|
+
const fetchSubscriptions = async () => {
|
|
142
|
+
try {
|
|
143
|
+
const subscriptions = await StripeSubscriptionService.listSubscriptions();
|
|
144
|
+
setData((prev) => ({ ...prev, subscriptions }));
|
|
145
|
+
setErrors((prev) => ({ ...prev, subscriptions: null }));
|
|
146
|
+
return subscriptions;
|
|
147
|
+
} catch (error) {
|
|
148
|
+
console.error("[BillingDashboard] Failed to load subscriptions:", error);
|
|
149
|
+
setErrors((prev) => ({ ...prev, subscriptions: "Failed to load subscriptions" }));
|
|
150
|
+
return [];
|
|
151
|
+
} finally {
|
|
152
|
+
setLoading((prev) => ({ ...prev, subscriptions: false }));
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
// Fetch payment methods
|
|
157
|
+
const fetchPaymentMethods = async () => {
|
|
158
|
+
try {
|
|
159
|
+
const paymentMethods = await StripeCustomerService.listPaymentMethods();
|
|
160
|
+
setData((prev) => ({ ...prev, paymentMethods }));
|
|
161
|
+
setErrors((prev) => ({ ...prev, paymentMethods: null }));
|
|
162
|
+
} catch (error) {
|
|
163
|
+
console.error("[BillingDashboard] Failed to load payment methods:", error);
|
|
164
|
+
setErrors((prev) => ({ ...prev, paymentMethods: "Failed to load payment methods" }));
|
|
165
|
+
} finally {
|
|
166
|
+
setLoading((prev) => ({ ...prev, paymentMethods: false }));
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// Fetch invoices
|
|
171
|
+
const fetchInvoices = async () => {
|
|
172
|
+
try {
|
|
173
|
+
const invoices = await StripeInvoiceService.listInvoices();
|
|
174
|
+
setData((prev) => ({ ...prev, invoices }));
|
|
175
|
+
setErrors((prev) => ({ ...prev, invoices: null }));
|
|
176
|
+
} catch (error) {
|
|
177
|
+
console.error("[BillingDashboard] Failed to load invoices:", error);
|
|
178
|
+
setErrors((prev) => ({ ...prev, invoices: "Failed to load invoices" }));
|
|
179
|
+
} finally {
|
|
180
|
+
setLoading((prev) => ({ ...prev, invoices: false }));
|
|
181
|
+
}
|
|
182
|
+
};
|
|
179
183
|
|
|
180
|
-
|
|
181
|
-
|
|
184
|
+
// Execute all in parallel
|
|
185
|
+
const [subscriptions] = await Promise.all([fetchSubscriptions(), fetchPaymentMethods(), fetchInvoices()]);
|
|
182
186
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
+
// Check if there are metered subscriptions and fetch usage data
|
|
188
|
+
const hasMetered = subscriptions.some(
|
|
189
|
+
(sub: StripeSubscriptionInterface) => sub.price?.recurring?.usageType === "metered",
|
|
190
|
+
);
|
|
187
191
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
}
|
|
192
|
+
if (hasMetered) {
|
|
193
|
+
await fetchUsageData();
|
|
194
|
+
} else {
|
|
195
|
+
setLoading((prev) => ({ ...prev, usage: false }));
|
|
193
196
|
}
|
|
194
197
|
}, []);
|
|
195
198
|
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var _chunkQWCAOLBDjs = require('./chunk-QWCAOLBD.js');
|
|
13
|
-
require('./chunk-7QVYU63E.js');
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
exports.JsonApiDelete = _chunkQWCAOLBDjs.JsonApiDelete; exports.JsonApiGet = _chunkQWCAOLBDjs.JsonApiGet; exports.JsonApiPatch = _chunkQWCAOLBDjs.JsonApiPatch; exports.JsonApiPost = _chunkQWCAOLBDjs.JsonApiPost; exports.JsonApiPut = _chunkQWCAOLBDjs.JsonApiPut; exports.buildUrl = _chunkQWCAOLBDjs.buildUrl; exports.configureJsonApi = _chunkQWCAOLBDjs.configureJsonApi; exports.getApiUrl = _chunkQWCAOLBDjs.getApiUrl; exports.getAppUrl = _chunkQWCAOLBDjs.getAppUrl; exports.getTrackablePages = _chunkQWCAOLBDjs.getTrackablePages;
|
|
26
|
-
//# sourceMappingURL=JsonApiRequest-YAPUG4ND.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/registry/DataClassRegistry.ts","../src/core/factories/JsonApiDataFactory.ts","../src/core/registry/bootstrapStore.ts","../src/core/utils/translateResponse.ts","../src/unified/JsonApiRequest.ts"],"sourcesContent":["import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\n\nexport class DataClassRegistry {\n // Use Map with string key (module.name) for reliable lookup\n // String keys are stable across HMR and module re-evaluations\n // Note: WeakMap with object identity was tried but fails during Next.js navigation\n // because module re-evaluation creates new object instances with different identity\n private static _map = new Map<string, { new (): ApiDataInterface }>();\n\n public static registerObjectClass(\n key: ApiRequestDataTypeInterface,\n classConstructor: { new (): ApiDataInterface },\n ): void {\n const classKey = key.name;\n if (!this._map.has(classKey)) {\n this._map.set(classKey, classConstructor);\n }\n }\n\n public static get(classKey: ApiRequestDataTypeInterface): {\n new (): ApiDataInterface;\n } {\n const response = this._map.get(classKey.name);\n if (!response) {\n throw new Error(\n `Class not registered for key: ${typeof classKey === \"string\" ? classKey : classKey.name}. Ensure bootstrap() was called.`,\n );\n }\n\n return response;\n }\n\n /**\n * Get class constructor by JSON:API type name.\n * Used for polymorphic rehydration where the type is determined at runtime.\n */\n public static getByJsonApiType(typeName: string): { new (): ApiDataInterface } | undefined {\n return this._map.get(typeName);\n }\n\n /**\n * Bootstrap the registry with all modules.\n * This is a convenience method for apps to register all their modules at once.\n *\n * @param modules - An object with module definitions (like the app's Modules class)\n */\n public static bootstrap(modules: Record<string, ApiRequestDataTypeInterface>): void {\n Object.values(modules).forEach((module) => {\n if (module && module.model) {\n this.registerObjectClass(module, module.model);\n }\n });\n }\n\n /**\n * Clear all registered classes. Useful for testing.\n */\n public static clear(): void {\n this._map.clear();\n }\n}\n\n// Export alias for backward compatibility\nexport { DataClassRegistry as DataClass };\n","import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { DataClassRegistry } from \"../registry/DataClassRegistry\";\n\nexport class JsonApiDataFactory {\n public static create(classKey: ApiRequestDataTypeInterface, data: any): any {\n const factoryClass = DataClassRegistry.get(classKey);\n\n const instance = new factoryClass() as ApiDataInterface;\n const result = instance.createJsonApi(data);\n return result;\n }\n}\n","/**\n * Centralized bootstrap store accessible from ModuleRegistry.\n * This file has NO external dependencies to avoid circular imports.\n *\n * The bootstrap store allows ModuleRegistry to call the app's bootstrapper\n * when modules are accessed before bootstrap() was called, providing\n * self-healing behavior for module evaluation order issues.\n *\n * IMPORTANT: We use globalThis to persist state across HMR/Turbopack\n * module re-evaluations in development mode. Without this, the bootstrapper\n * reference would be lost when modules are hot-reloaded, causing\n * \"Module not registered\" errors during navigation.\n */\n\ntype BootstrapperFn = () => void;\n\n// Symbol key to avoid conflicts with other globals\nconst BOOTSTRAP_KEY = Symbol.for(\"nextjs-jsonapi:bootstrapper\");\nconst BOOTSTRAP_ATTEMPTED_KEY = Symbol.for(\"nextjs-jsonapi:bootstrapAttempted\");\n\n// Use globalThis to persist across HMR reloads\nconst globalStore = globalThis as unknown as {\n [BOOTSTRAP_KEY]?: BootstrapperFn | null;\n [BOOTSTRAP_ATTEMPTED_KEY]?: boolean;\n};\n\n// Initialize from global if not set\nif (globalStore[BOOTSTRAP_KEY] === undefined) {\n globalStore[BOOTSTRAP_KEY] = null;\n}\nif (globalStore[BOOTSTRAP_ATTEMPTED_KEY] === undefined) {\n globalStore[BOOTSTRAP_ATTEMPTED_KEY] = false;\n}\n\n// Getters/setters that use the global store\nfunction getBootstrapperInternal(): BootstrapperFn | null {\n return globalStore[BOOTSTRAP_KEY] ?? null;\n}\n\nfunction setBootstrapperInternal(fn: BootstrapperFn | null): void {\n globalStore[BOOTSTRAP_KEY] = fn;\n}\n\nfunction getBootstrapAttempted(): boolean {\n return globalStore[BOOTSTRAP_ATTEMPTED_KEY] ?? false;\n}\n\nfunction setBootstrapAttempted(value: boolean): void {\n globalStore[BOOTSTRAP_ATTEMPTED_KEY] = value;\n}\n\n/**\n * Register the bootstrapper function.\n * Called by configureJsonApi() from client/config, client/JsonApiClient, or unified/JsonApiRequest.\n */\nexport function setBootstrapper(fn: BootstrapperFn): void {\n setBootstrapperInternal(fn);\n}\n\n/**\n * Get the registered bootstrapper function.\n * Returns null if no bootstrapper has been registered.\n */\nexport function getBootstrapper(): BootstrapperFn | null {\n return getBootstrapperInternal();\n}\n\n/**\n * Attempt to run the bootstrapper if one is registered.\n * Returns true if bootstrapper was executed, false if not available.\n * Safe to call multiple times - bootstrapper is expected to be idempotent.\n */\nexport function tryBootstrap(): boolean {\n const bootstrapper = getBootstrapperInternal();\n const attempted = getBootstrapAttempted();\n\n if (attempted && !bootstrapper) {\n // Already tried and no bootstrapper available\n return false;\n }\n setBootstrapAttempted(true);\n\n if (bootstrapper) {\n bootstrapper();\n return true;\n }\n return false;\n}\n\n/**\n * Check if a bootstrapper has been registered.\n */\nexport function hasBootstrapper(): boolean {\n return getBootstrapperInternal() !== null;\n}\n\n/**\n * Reset the bootstrap store. Useful for testing.\n */\nexport function resetBootstrapStore(): void {\n setBootstrapperInternal(null);\n setBootstrapAttempted(false);\n}\n","import { ApiData } from \"../interfaces/ApiData\";\nimport { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../interfaces/ApiResponseInterface\";\nimport { DataClassRegistry } from \"../registry/DataClassRegistry\";\n\n/**\n * Translates raw JSON:API data into typed objects.\n * Does not require API response metadata.\n */\nexport function translateData<T extends ApiDataInterface>(params: {\n classKey: ApiRequestDataTypeInterface;\n data: any;\n}): T | T[] {\n const factoryClass = DataClassRegistry.get(params.classKey);\n\n if (!factoryClass) {\n throw new Error(\n `Class not registered for key: ${typeof params.classKey === \"string\" ? params.classKey : params.classKey.name}`,\n );\n }\n\n const included: any = params.data.included ?? [];\n\n if (Array.isArray(params.data.data)) {\n const responseData: T[] = [];\n\n for (const data of params.data.data) {\n const object = new factoryClass();\n object.rehydrate({ jsonApi: data, included: included, allData: params.data.data });\n responseData.push(object as T);\n }\n\n return responseData as T[];\n } else {\n const responseData = new factoryClass();\n responseData.rehydrate({\n jsonApi: params.data.data,\n included: included,\n });\n\n return responseData as T;\n }\n}\n\n/**\n * Translates a full API response into a typed ApiResponseInterface.\n * Includes pagination support.\n */\nexport async function translateResponse<T extends ApiDataInterface>(params: {\n classKey: ApiRequestDataTypeInterface;\n apiResponse: ApiData;\n companyId?: string;\n language: string;\n paginationHandler?: (endpoint: string) => Promise<ApiResponseInterface>;\n}): Promise<ApiResponseInterface> {\n const response: ApiResponseInterface = {\n ok: true,\n response: 0,\n data: [],\n error: \"\",\n };\n\n const factoryClass = DataClassRegistry.get(params.classKey);\n\n if (!factoryClass) {\n throw new Error(\n `Class not registered for key: ${typeof params.classKey === \"string\" ? params.classKey : params.classKey.name}`,\n );\n }\n\n response.ok = params.apiResponse.ok;\n response.response = params.apiResponse.status;\n\n if (!params.apiResponse.ok) {\n response.error = params.apiResponse?.data?.message ?? params.apiResponse.statusText;\n response.raw = params.apiResponse.data;\n return response;\n }\n\n if (params.apiResponse.status === 204) return response;\n\n response.raw = params.apiResponse.data;\n\n // Extract meta from JSON:API response\n if (params.apiResponse.data?.meta) {\n response.meta = params.apiResponse.data.meta;\n }\n\n try {\n // Check if response is JSON:API formatted (has a 'data' property)\n // If not, return the raw response data directly (e.g., { url: \"...\" } or { clientSecret: \"...\" })\n if (\n params.apiResponse.data &&\n typeof params.apiResponse.data === \"object\" &&\n !Array.isArray(params.apiResponse.data) &&\n params.apiResponse.data.data === undefined\n ) {\n response.data = params.apiResponse.data;\n return response;\n }\n\n const included: any = params.apiResponse.data.included ?? [];\n\n if (params.apiResponse.data.links) {\n response.self = params.apiResponse.data.links.self;\n\n if (params.apiResponse.data.links.next && params.paginationHandler) {\n response.next = params.apiResponse.data.links.next;\n response.nextPage = async () => params.paginationHandler!(params.apiResponse.data.links.next);\n }\n\n if (params.apiResponse.data.links.prev && params.paginationHandler) {\n response.prev = params.apiResponse.data.links.prev;\n response.prevPage = async () => params.paginationHandler!(params.apiResponse.data.links.prev);\n }\n }\n\n if (Array.isArray(params.apiResponse.data.data)) {\n const responseData: T[] = [];\n\n for (const data of params.apiResponse.data.data) {\n const object = new factoryClass();\n object.rehydrate({ jsonApi: data, included: included, allData: params.apiResponse.data.data });\n responseData.push(object as T);\n }\n\n response.data = responseData;\n } else {\n const responseData = new factoryClass();\n responseData.rehydrate({\n jsonApi: params.apiResponse.data.data,\n included: included,\n });\n\n response.data = responseData;\n }\n } catch (e) {\n console.error(e);\n }\n\n return response;\n}\n","import { JsonApiDataFactory } from \"../core/factories/JsonApiDataFactory\";\nimport { ApiData } from \"../core/interfaces/ApiData\";\nimport { ApiRequestDataTypeInterface } from \"../core/interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../core/interfaces/ApiResponseInterface\";\nimport { setBootstrapper } from \"../core/registry/bootstrapStore\";\nimport { translateResponse } from \"../core/utils/translateResponse\";\nimport { ModuleWithPermissions } from \"../permissions/types\";\n\n// Type definitions for dynamically imported functions (avoiding typeof import to prevent bundling)\ntype DirectFetchFn = (params: {\n method: string;\n url: string;\n token?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}) => Promise<ApiData>;\n\ntype ServerRequestFn = (params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}) => Promise<ApiData>;\n\ntype GetTokenFn = () => Promise<string | undefined>;\n\n// These will be dynamically imported based on environment\nlet _directFetch: DirectFetchFn;\nlet _serverRequest: ServerRequestFn;\nlet _getClientToken: GetTokenFn;\nlet _getServerToken: GetTokenFn;\n\n// Config storage for non-React contexts\nlet _staticConfig: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n} | null = null;\n\n/**\n * Configure the JSON:API client for non-React contexts (e.g., server components).\n * For React contexts, use JsonApiProvider instead.\n */\nexport function configureJsonApi(config: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n}): void {\n _staticConfig = config;\n // Register and call bootstrapper to register all modules\n if (config.bootstrapper) {\n setBootstrapper(config.bootstrapper);\n config.bootstrapper();\n }\n}\n\nasync function getToken(): Promise<string | undefined> {\n if (typeof window === \"undefined\") {\n // Server-side\n if (!_getServerToken) {\n const serverModule = await import(\"../server/token\");\n _getServerToken = serverModule.getServerToken;\n }\n return _getServerToken();\n } else {\n // Client-side\n if (!_getClientToken) {\n const clientModule = await import(\"../client/token\");\n _getClientToken = clientModule.getClientToken;\n }\n return _getClientToken();\n }\n}\n\nasync function makeRequest(params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}): Promise<ApiData> {\n if (typeof window !== \"undefined\") {\n // Client-side: use direct fetch\n if (!_directFetch) {\n const clientModule = await import(\"../client/request\");\n _directFetch = clientModule.directFetch;\n }\n return _directFetch({\n method: params.method,\n url: params.url,\n token: params.token,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n });\n } else {\n // Server-side: use server request with caching\n if (!_serverRequest) {\n const serverModule = await import(\"../server/request\");\n _serverRequest = serverModule.serverRequest;\n }\n return _serverRequest({\n method: params.method,\n url: params.url,\n token: params.token,\n cache: params.cache,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n });\n }\n}\n\nexport function getApiUrl(): string {\n if (_staticConfig?.apiUrl) {\n return _staticConfig.apiUrl;\n }\n // Fallback to environment variable\n const envUrl = process.env.NEXT_PUBLIC_API_URL;\n if (!envUrl) {\n throw new Error(\"API URL not configured. Use configureJsonApi() or set NEXT_PUBLIC_API_URL environment variable.\");\n }\n return envUrl;\n}\n\nexport function getAppUrl(): string {\n if (_staticConfig?.appUrl) {\n return _staticConfig.appUrl;\n }\n // Fallback to environment variable\n const envUrl = process.env.NEXT_PUBLIC_ADDRESS;\n if (!envUrl) {\n throw new Error(\n \"App URL not configured. Use configureJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable.\",\n );\n }\n return envUrl.trim().replace(/\\/+$/, \"\");\n}\n\nexport function getTrackablePages(): ModuleWithPermissions[] {\n return _staticConfig?.trackablePages ?? [];\n}\n\nfunction runBootstrapper(): void {\n if (_staticConfig?.bootstrapper) {\n _staticConfig.bootstrapper();\n }\n}\n\n/**\n * Resolve the final request URL for an endpoint.\n *\n * - `endpoint` starting with \"http\" is always passed through unchanged (existing behaviour).\n * - Otherwise, an explicit `baseUrl` (per-call override) takes precedence over the global\n * `getApiUrl()` resolution. Omitting `baseUrl` preserves today's behaviour exactly.\n */\nexport function buildUrl(endpoint: string, baseUrl?: string): string {\n if (endpoint.startsWith(\"http\")) return endpoint;\n const apiUrl = baseUrl ?? getApiUrl();\n return `${apiUrl}${endpoint}`;\n}\n\nexport async function JsonApiGet(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n token?: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n const apiResponse = await makeRequest({\n method: \"GET\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n cache: params.classKey.cache,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n paginationHandler: async (endpoint: string) =>\n JsonApiGet({\n classKey: params.classKey,\n endpoint,\n companyId: params.companyId,\n language: params.language,\n token: params.token,\n baseUrl: params.baseUrl,\n }),\n });\n}\n\nexport async function JsonApiPost(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n overridesJsonApiCreation?: boolean;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n token?: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"POST\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPut(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n token?: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n let body = params.body;\n if (!body) {\n body = {};\n } else {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PUT\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPatch(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n overridesJsonApiCreation?: boolean;\n responseType?: ApiRequestDataTypeInterface;\n language: string;\n token?: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PATCH\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiDelete(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n token?: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n const apiResponse = await makeRequest({\n method: \"DELETE\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n"],"mappings":"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","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|