@carlonicora/nextjs-jsonapi 3.28.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{BlockNoteEditor-ATZVHS6X.js → BlockNoteEditor-BXMTGKDV.js} +21 -20
- package/dist/BlockNoteEditor-BXMTGKDV.js.map +1 -0
- package/dist/{BlockNoteEditor-CWW2D3SG.mjs → BlockNoteEditor-FGVQP35E.mjs} +9 -8
- package/dist/{BlockNoteEditor-CWW2D3SG.mjs.map → BlockNoteEditor-FGVQP35E.mjs.map} +1 -1
- package/dist/{BlockNoteViewer-KRTAFTUX.mjs → BlockNoteViewer-DQYT6IJW.mjs} +3 -3
- package/dist/{BlockNoteViewer-7BFNTN4E.js → BlockNoteViewer-YH7G66PS.js} +4 -4
- package/dist/{BlockNoteViewer-7BFNTN4E.js.map → BlockNoteViewer-YH7G66PS.js.map} +1 -1
- package/dist/{HandbookSectionInterface-DgYH--Ik.d.mts → HandbookSectionInterface-BYsmnPEz.d.mts} +1 -1
- package/dist/{HandbookSectionInterface-Ck1wZJ81.d.ts → HandbookSectionInterface-OePKPbqN.d.ts} +1 -1
- package/dist/{JsonApiRequest-UHOWNI3O.mjs → JsonApiRequest-MEP6AXDT.mjs} +2 -2
- package/dist/JsonApiRequest-OB6WL4LA.js +26 -0
- package/dist/{JsonApiRequest-TE5WD3WS.js.map → JsonApiRequest-OB6WL4LA.js.map} +1 -1
- package/dist/ServerSession-DFNNNkg7.d.ts +29 -0
- package/dist/ServerSession-DK1z0_Ql.d.mts +29 -0
- package/dist/{analytics.modules-CfczU12P.d.ts → analytics.modules-Bsacu6ik.d.ts} +1 -1
- package/dist/{analytics.modules-pzGwMASI.d.mts → analytics.modules-txdCLNG-.d.mts} +1 -1
- package/dist/billing/index.js +404 -402
- package/dist/billing/index.js.map +1 -1
- package/dist/billing/index.mjs +10 -8
- package/dist/billing/index.mjs.map +1 -1
- package/dist/{chunk-7B4E42R5.mjs → chunk-3CZ2GK5R.mjs} +33 -9
- package/dist/chunk-3CZ2GK5R.mjs.map +1 -0
- package/dist/{chunk-4Z45NYPR.js → chunk-5W5MN7JP.js} +14 -83
- package/dist/chunk-5W5MN7JP.js.map +1 -0
- package/dist/{chunk-CAKOFJZD.js → chunk-6OFANJTE.js} +195 -142
- package/dist/chunk-6OFANJTE.js.map +1 -0
- package/dist/{chunk-5TRFNKJS.js → chunk-6TUB7Y6T.js} +23 -25
- package/dist/chunk-6TUB7Y6T.js.map +1 -0
- package/dist/{chunk-37DMFVLN.mjs → chunk-7SCREMTX.mjs} +4 -3
- package/dist/{chunk-37DMFVLN.mjs.map → chunk-7SCREMTX.mjs.map} +1 -1
- package/dist/{chunk-Q6J2ICKO.mjs → chunk-ADZSH3MG.mjs} +3 -72
- package/dist/chunk-ADZSH3MG.mjs.map +1 -0
- package/dist/{chunk-E3I4MT53.mjs → chunk-AQZ3T4BR.mjs} +71 -18
- package/dist/chunk-AQZ3T4BR.mjs.map +1 -0
- package/dist/{chunk-SJLXPHK5.mjs → chunk-E2LENTUH.mjs} +22 -24
- package/dist/chunk-E2LENTUH.mjs.map +1 -0
- package/dist/chunk-EBEXWN3I.mjs +17 -0
- package/dist/chunk-EBEXWN3I.mjs.map +1 -0
- package/dist/chunk-G4JR3SFV.js +28 -0
- package/dist/chunk-G4JR3SFV.js.map +1 -0
- package/dist/chunk-IK65TDQH.js +15 -0
- package/dist/chunk-IK65TDQH.js.map +1 -0
- package/dist/{chunk-GHFMKH3M.js → chunk-JEQ34Z5E.js} +62 -38
- package/dist/chunk-JEQ34Z5E.js.map +1 -0
- package/dist/{chunk-YDPDJIJF.js → chunk-NFCXUAE6.js} +1330 -1184
- package/dist/chunk-NFCXUAE6.js.map +1 -0
- package/dist/chunk-OEOK6A3P.js +17 -0
- package/dist/chunk-OEOK6A3P.js.map +1 -0
- package/dist/chunk-PW42LRSL.mjs +28 -0
- package/dist/chunk-PW42LRSL.mjs.map +1 -0
- package/dist/{chunk-U65JPKO3.mjs → chunk-R6ZYB4VN.mjs} +2 -2
- package/dist/chunk-T7SAW3UW.mjs +15 -0
- package/dist/chunk-T7SAW3UW.mjs.map +1 -0
- package/dist/{chunk-GKDHYB2R.js → chunk-TWBZ2GSX.js} +3 -3
- package/dist/{chunk-GKDHYB2R.js.map → chunk-TWBZ2GSX.js.map} +1 -1
- package/dist/{chunk-26MQIJNB.js → chunk-WGVNJXZO.js} +4 -3
- package/dist/chunk-WGVNJXZO.js.map +1 -0
- package/dist/{chunk-2IMQ5IKA.mjs → chunk-WJC4SYRL.mjs} +2133 -1987
- package/dist/chunk-WJC4SYRL.mjs.map +1 -0
- package/dist/client/index.d.mts +3 -3
- package/dist/client/index.d.ts +3 -3
- package/dist/client/index.js +6 -5
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +13 -12
- package/dist/components/index.d.mts +16 -6
- package/dist/components/index.d.ts +16 -6
- package/dist/components/index.js +8 -5
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +9 -6
- package/dist/{config-3N1LSrcC.d.ts → config-B6UB7j69.d.ts} +1 -1
- package/dist/{config-BmufyEj6.d.mts → config-CEAq4Ozy.d.mts} +10 -1
- package/dist/{config-AVtuvfM1.d.ts → config-DydDHCfb.d.ts} +10 -1
- package/dist/{config-BSKTYDoh.d.mts → config-n-ZpPmOL.d.mts} +1 -1
- package/dist/contexts/index.d.mts +28 -4
- package/dist/contexts/index.d.ts +28 -4
- package/dist/contexts/index.js +10 -5
- package/dist/contexts/index.js.map +1 -1
- package/dist/contexts/index.mjs +9 -4
- package/dist/core/index.d.mts +6 -6
- package/dist/core/index.d.ts +6 -6
- package/dist/core/index.js +5 -5
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +4 -4
- package/dist/features/analytics/index.d.mts +2 -2
- package/dist/features/analytics/index.d.ts +2 -2
- package/dist/features/analytics/index.js +124 -123
- package/dist/features/analytics/index.js.map +1 -1
- package/dist/features/analytics/index.mjs +6 -5
- package/dist/features/analytics/index.mjs.map +1 -1
- package/dist/features/analytics/server.d.mts +10 -2
- package/dist/features/analytics/server.d.ts +10 -2
- package/dist/features/analytics/server.js +8 -6
- package/dist/features/analytics/server.js.map +1 -1
- package/dist/features/analytics/server.mjs +6 -4
- package/dist/features/analytics/server.mjs.map +1 -1
- package/dist/features/help/index.d.mts +2 -2
- package/dist/features/help/index.d.ts +2 -2
- package/dist/features/help/index.js +39 -38
- package/dist/features/help/index.js.map +1 -1
- package/dist/features/help/index.mjs +5 -4
- package/dist/features/help/index.mjs.map +1 -1
- package/dist/features/tokenusage/index.d.mts +2 -2
- package/dist/features/tokenusage/index.d.ts +2 -2
- package/dist/features/tokenusage/index.js +127 -126
- package/dist/features/tokenusage/index.js.map +1 -1
- package/dist/features/tokenusage/index.mjs +6 -5
- package/dist/features/tokenusage/index.mjs.map +1 -1
- package/dist/index.d.mts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +11 -9
- package/dist/next-config/index.d.mts +43 -0
- package/dist/next-config/index.d.ts +43 -0
- package/dist/next-config/index.js +230 -0
- package/dist/next-config/index.js.map +1 -0
- package/dist/next-config/index.mjs +230 -0
- package/dist/next-config/index.mjs.map +1 -0
- package/dist/{request-FXF63NSQ.mjs → request-3IUMNVOS.mjs} +2 -2
- package/dist/request-LZBAOT3Y.js +8 -0
- package/dist/request-LZBAOT3Y.js.map +1 -0
- package/dist/server/cachedGet.d.mts +28 -0
- package/dist/server/cachedGet.d.ts +28 -0
- package/dist/server/cachedGet.js +60 -0
- package/dist/server/cachedGet.js.map +1 -0
- package/dist/server/cachedGet.mjs +60 -0
- package/dist/server/cachedGet.mjs.map +1 -0
- package/dist/server/cachedGet.stub.d.mts +7 -0
- package/dist/server/cachedGet.stub.d.ts +7 -0
- package/dist/server/cachedGet.stub.js +17 -0
- package/dist/server/cachedGet.stub.js.map +1 -0
- package/dist/server/cachedGet.stub.mjs +17 -0
- package/dist/server/cachedGet.stub.mjs.map +1 -0
- package/dist/server/index.d.mts +27 -25
- package/dist/server/index.d.ts +27 -25
- package/dist/server/index.js +13 -6
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +15 -8
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/index.mjs.map +1 -1
- package/dist/{types-D0uLYV2P.d.mts → types-Bq_UA8Lg.d.mts} +1 -1
- package/dist/{types-Cn153-mH.d.ts → types-bsm8Fp55.d.ts} +1 -1
- package/dist/{usePageUrlGenerator-B-3FRKBD.d.ts → usePageUrlGenerator-J_ECv-oQ.d.ts} +1 -1
- package/dist/{usePageUrlGenerator-CCJ_cdQy.d.mts → usePageUrlGenerator-uKBjAKqC.d.mts} +1 -1
- package/package.json +12 -1
- package/src/components/forms/__tests__/EditorSheet.test.tsx +25 -1
- package/src/components/forms/__tests__/useEditorDialog.test.ts +164 -1
- package/src/components/forms/useEditorDialog.ts +69 -2
- package/src/contexts/SessionContext.tsx +20 -0
- package/src/contexts/SocketContext.tsx +30 -3
- package/src/contexts/ViewportContext.tsx +17 -2
- package/src/contexts/__tests__/SessionContext.test.tsx +58 -0
- package/src/contexts/__tests__/SocketContext.session.test.tsx +77 -0
- package/src/contexts/index.ts +1 -0
- package/src/core/abstracts/AbstractService.ts +4 -6
- package/src/core/abstracts/__tests__/AbstractService.locale.test.ts +64 -0
- package/src/features/analytics/components/server/AnalyticsAdminPage.tsx +5 -1
- package/src/features/analytics/components/server/AnalyticsJourneyPage.tsx +5 -1
- package/src/features/company/hooks/useSubscriptionStatus.ts +6 -1
- package/src/features/notification/contexts/NotificationContext.tsx +5 -2
- package/src/features/notification/contexts/__tests__/NotificationContext.spec.tsx +22 -0
- package/src/features/user/contexts/CurrentUserContext.tsx +7 -5
- package/src/features/user/contexts/__tests__/CurrentUserContext.spec.tsx +63 -3
- package/src/hooks/__tests__/useSocket.render.test.ts +22 -0
- package/src/hooks/useSocket.ts +0 -1
- package/src/i18n/__tests__/config.test.ts +27 -0
- package/src/i18n/config.ts +17 -0
- package/src/i18n/index.ts +2 -0
- package/src/next-config/__tests__/createNextConfig.test.ts +268 -0
- package/src/next-config/csp.ts +128 -0
- package/src/next-config/headers.ts +61 -0
- package/src/next-config/index.ts +114 -0
- package/src/server/JsonApiServer.ts +3 -1
- package/src/server/ServerSession.ts +29 -1
- package/src/server/__tests__/JsonApiServer.test.ts +41 -0
- package/src/server/__tests__/ServerSession.read.test.ts +67 -0
- package/src/server/__tests__/cache.test.ts +48 -0
- package/src/server/__tests__/cachedGet.test.ts +125 -0
- package/src/server/__tests__/request.test.ts +96 -1
- package/src/server/cache.ts +21 -4
- package/src/server/cacheDigest.ts +10 -0
- package/src/server/cacheProfiles.ts +15 -0
- package/src/server/cachedGet.stub.ts +15 -0
- package/src/server/cachedGet.ts +80 -0
- package/src/server/request.ts +33 -32
- package/src/shadcnui/ui/__tests__/sidebar.menu-skeleton.test.tsx +50 -0
- package/src/shadcnui/ui/__tests__/sidebar.session.test.tsx +133 -0
- package/src/shadcnui/ui/sidebar.tsx +121 -18
- package/src/testing/matchers/jsonApiMatchers.ts +1 -0
- package/src/unified/JsonApiRequest.ts +4 -1
- package/src/unified/__tests__/JsonApiGet.cache.test.ts +51 -0
- package/src/utils/__tests__/map-thenable.test.ts +29 -0
- package/src/utils/__tests__/use-mobile.test.tsx +102 -1
- package/src/utils/map-thenable.ts +15 -0
- package/src/utils/use-mobile.tsx +13 -4
- package/dist/BlockNoteEditor-ATZVHS6X.js.map +0 -1
- package/dist/JsonApiRequest-TE5WD3WS.js +0 -26
- package/dist/chunk-26MQIJNB.js.map +0 -1
- package/dist/chunk-2IMQ5IKA.mjs.map +0 -1
- package/dist/chunk-4Z45NYPR.js.map +0 -1
- package/dist/chunk-5TRFNKJS.js.map +0 -1
- package/dist/chunk-7B4E42R5.mjs.map +0 -1
- package/dist/chunk-CAKOFJZD.js.map +0 -1
- package/dist/chunk-E3I4MT53.mjs.map +0 -1
- package/dist/chunk-GHFMKH3M.js.map +0 -1
- package/dist/chunk-Q6J2ICKO.mjs.map +0 -1
- package/dist/chunk-SJLXPHK5.mjs.map +0 -1
- package/dist/chunk-YDPDJIJF.js.map +0 -1
- package/dist/request-ZTX6I63X.js +0 -8
- package/dist/request-ZTX6I63X.js.map +0 -1
- /package/dist/{BlockNoteViewer-KRTAFTUX.mjs.map → BlockNoteViewer-DQYT6IJW.mjs.map} +0 -0
- /package/dist/{JsonApiRequest-UHOWNI3O.mjs.map → JsonApiRequest-MEP6AXDT.mjs.map} +0 -0
- /package/dist/{chunk-U65JPKO3.mjs.map → chunk-R6ZYB4VN.mjs.map} +0 -0
- /package/dist/{request-FXF63NSQ.mjs.map → request-3IUMNVOS.mjs.map} +0 -0
|
@@ -1,19 +1,29 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
2
|
|
|
3
3
|
var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
|
|
4
4
|
|
|
5
5
|
// src/server/request.ts
|
|
6
|
-
var
|
|
7
|
-
seconds: 1,
|
|
8
|
-
minutes: 60,
|
|
9
|
-
hours: 3600,
|
|
10
|
-
days: 86400,
|
|
11
|
-
weeks: 604800,
|
|
12
|
-
max: 31536e3,
|
|
13
|
-
// 1 year
|
|
14
|
-
default: 60
|
|
15
|
-
};
|
|
6
|
+
var _cachedget = require('@carlonicora/nextjs-jsonapi/cached-get');
|
|
16
7
|
async function serverRequest(params) {
|
|
8
|
+
if (params.method === "GET" && params.cache) {
|
|
9
|
+
try {
|
|
10
|
+
return await _cachedget.cachedServerGet.call(void 0, {
|
|
11
|
+
url: params.url,
|
|
12
|
+
cache: params.cache,
|
|
13
|
+
language: params.language,
|
|
14
|
+
companyId: params.companyId,
|
|
15
|
+
additionalHeaders: params.additionalHeaders
|
|
16
|
+
});
|
|
17
|
+
} catch (error) {
|
|
18
|
+
const status = _nullishCoalesce(_cachedget.statusFromDigest.call(void 0, error), () => ( 503));
|
|
19
|
+
return {
|
|
20
|
+
data: void 0,
|
|
21
|
+
ok: false,
|
|
22
|
+
status,
|
|
23
|
+
statusText: status === 503 ? "Service Unavailable" : ""
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
17
27
|
const response = {
|
|
18
28
|
data: void 0,
|
|
19
29
|
ok: false,
|
|
@@ -52,21 +62,9 @@ async function serverRequest(params) {
|
|
|
52
62
|
requestBody = JSON.stringify(params.body);
|
|
53
63
|
additionalHeaders["Content-Type"] = "application/json";
|
|
54
64
|
}
|
|
55
|
-
const nextOptions = {};
|
|
56
|
-
if (params.cache) {
|
|
57
|
-
if (params.cache in cacheLifeToSeconds) {
|
|
58
|
-
nextOptions.revalidate = cacheLifeToSeconds[params.cache];
|
|
59
|
-
} else {
|
|
60
|
-
nextOptions.tags = [params.cache];
|
|
61
|
-
nextOptions.revalidate = 60;
|
|
62
|
-
}
|
|
63
|
-
} else {
|
|
64
|
-
nextOptions.revalidate = 0;
|
|
65
|
-
}
|
|
66
65
|
const options = {
|
|
67
66
|
method: params.method,
|
|
68
|
-
headers: { Accept: "application/json", ...additionalHeaders }
|
|
69
|
-
next: nextOptions
|
|
67
|
+
headers: { Accept: "application/json", ...additionalHeaders }
|
|
70
68
|
};
|
|
71
69
|
if (requestBody !== void 0) {
|
|
72
70
|
options.body = requestBody;
|
|
@@ -97,4 +95,4 @@ _chunk7QVYU63Ejs.__name.call(void 0, serverRequest, "serverRequest");
|
|
|
97
95
|
|
|
98
96
|
|
|
99
97
|
exports.serverRequest = serverRequest;
|
|
100
|
-
//# sourceMappingURL=chunk-
|
|
98
|
+
//# sourceMappingURL=chunk-6TUB7Y6T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-6TUB7Y6T.js","../src/server/request.ts"],"names":[],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-6TUB7Y6T.js","sourcesContent":[null,"// Server-only utilities (NOT server actions - these cannot be called from client components)\n\nimport { ApiData } from \"../core/interfaces/ApiData\";\n// Through the package's own export, not \"./cachedGet\": the `react-server` condition gives\n// server code the real `\"use cache\"` function and every other bundle a stub. A relative\n// import would put `\"use cache\"` into the client bundles that reach this module.\nimport { cachedServerGet, statusFromDigest } from \"@carlonicora/nextjs-jsonapi/cached-get\";\n\nexport interface ServerRequestParams {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}\n\n/**\n * Server-side request.\n *\n * - A GET with a `cache` value goes through `cachedServerGet`, a token-free `\"use cache\"`\n * function. The token is never sent on that path.\n * - Everything else (uncached GET, POST, PUT, PATCH, DELETE) is a plain uncached `fetch`\n * that sends the token.\n */\nexport async function serverRequest(params: ServerRequestParams): Promise<ApiData> {\n if (params.method === \"GET\" && params.cache) {\n try {\n return await cachedServerGet({\n url: params.url,\n cache: params.cache,\n language: params.language,\n companyId: params.companyId,\n additionalHeaders: params.additionalHeaders,\n });\n } catch (error) {\n // The cached function throws on failure so Next does not store it. Convert it back\n // here, outside the cache scope. In production only `digest` survives the boundary.\n const status = statusFromDigest(error) ?? 503;\n return {\n data: undefined,\n ok: false,\n status,\n statusText: status === 503 ? \"Service Unavailable\" : \"\",\n };\n }\n }\n\n const response: ApiData = {\n data: undefined,\n ok: false,\n status: 0,\n statusText: \"\",\n };\n\n const additionalHeaders: Record<string, string> = { ...params.additionalHeaders };\n\n if (params.companyId) {\n additionalHeaders[\"x-companyid\"] = params.companyId;\n }\n additionalHeaders[\"x-language\"] = params.language;\n\n let requestBody: BodyInit | undefined = undefined;\n\n if (params.files) {\n const formData = new FormData();\n if (params.body && typeof params.body === \"object\") {\n for (const key in params.body) {\n if (Object.prototype.hasOwnProperty.call(params.body, key)) {\n formData.append(\n key,\n typeof params.body[key] === \"object\" ? JSON.stringify(params.body[key]) : params.body[key],\n );\n }\n }\n }\n\n if (params.files instanceof Blob) {\n formData.append(\"file\", params.files);\n } else if (typeof params.files === \"object\" && params.files !== null) {\n for (const key in params.files) {\n if (Object.prototype.hasOwnProperty.call(params.files, key)) {\n formData.append(key, params.files[key]);\n }\n }\n }\n\n requestBody = formData;\n } else if (params.body !== undefined) {\n requestBody = JSON.stringify(params.body);\n additionalHeaders[\"Content-Type\"] = \"application/json\";\n }\n\n const options: RequestInit = {\n method: params.method,\n headers: { Accept: \"application/json\", ...additionalHeaders },\n };\n\n if (requestBody !== undefined) {\n options.body = requestBody;\n }\n\n if (params.token) {\n options.headers = { ...options.headers, Authorization: `Bearer ${params.token}` };\n }\n\n try {\n const apiResponse = await fetch(params.url, options);\n\n response.ok = apiResponse.ok;\n response.status = apiResponse.status;\n response.statusText = apiResponse.statusText;\n try {\n response.data = await apiResponse.json();\n } catch {\n response.data = undefined;\n }\n } catch {\n // fetch() only throws when the API could not be reached at all (server\n // down, DNS, connection refused). Report it as 503 so consumers can tell\n // \"API unreachable\" apart from a 500 the API actually returned.\n response.ok = false;\n response.status = 503;\n response.statusText = \"Service Unavailable\";\n response.data = undefined;\n }\n\n return response;\n}\n"]}
|
|
@@ -307,7 +307,7 @@ async function makeRequest(params) {
|
|
|
307
307
|
});
|
|
308
308
|
} else {
|
|
309
309
|
if (!_serverRequest) {
|
|
310
|
-
const serverModule = await import("./request-
|
|
310
|
+
const serverModule = await import("./request-3IUMNVOS.mjs");
|
|
311
311
|
_serverRequest = serverModule.serverRequest;
|
|
312
312
|
}
|
|
313
313
|
return _serverRequest({
|
|
@@ -366,7 +366,8 @@ function buildUrl(endpoint, baseUrl) {
|
|
|
366
366
|
__name(buildUrl, "buildUrl");
|
|
367
367
|
async function JsonApiGet(params) {
|
|
368
368
|
runBootstrapper();
|
|
369
|
-
const
|
|
369
|
+
const isServerCached = typeof window === "undefined" && !!params.classKey.cache;
|
|
370
|
+
const token = isServerCached ? void 0 : params.token ?? await getToken();
|
|
370
371
|
const apiResponse = await makeRequest({
|
|
371
372
|
method: "GET",
|
|
372
373
|
url: buildUrl(params.endpoint, params.baseUrl),
|
|
@@ -515,4 +516,4 @@ export {
|
|
|
515
516
|
JsonApiPatch,
|
|
516
517
|
JsonApiDelete
|
|
517
518
|
};
|
|
518
|
-
//# sourceMappingURL=chunk-
|
|
519
|
+
//# sourceMappingURL=chunk-7SCREMTX.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/env.ts","../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":["/**\n * The single place in this package that reads `process.env`.\n *\n * Everything else imports {@link ENV}. Centralising the reads keeps every\n * default in one place — the same contract `base.config.ts` provides on the\n * NestJS side — instead of scattering `process.env.X || \"…\"` across hooks,\n * clients and components where the fallbacks silently drift apart.\n *\n * WHY THE READS MUST STAY LITERAL: Next.js inlines `NEXT_PUBLIC_*` by textual\n * substitution at build time, replacing the exact expression\n * `process.env.NEXT_PUBLIC_FOO` with a string literal. A computed lookup\n * (`process.env[key]`) is NOT substituted and reads as `undefined` in the\n * browser bundle. Every entry below therefore spells its variable out in full,\n * and new entries must do the same.\n *\n * WHY GETTERS AND NOT PLAIN PROPERTIES: every call site this replaced read\n * `process.env` at CALL time, not at import time. A plain property would freeze\n * the value when the module is first imported, which breaks any consumer that\n * assigns the variable after boot — the package's own tests do exactly that.\n * Getters keep the read lazy while leaving the expression literal, so the build\n * time substitution still applies.\n *\n * Because that substitution happens before the code runs, no reference to\n * `process` survives into the client bundle — so this module is safe to import\n * from client components, server components, route handlers and middleware\n * alike. It deliberately carries no `\"use client\"` directive for that reason.\n *\n * Values are normalised (empty string rather than `undefined`, booleans rather\n * than string comparisons) so callers never repeat the parsing. Callers that\n * must distinguish \"unset\" from \"set to empty\" — the URL getters, which throw a\n * configuration error — check for an empty string.\n */\nexport const ENV = {\n /** Public API base URL (NEXT_PUBLIC_API_URL). Empty when unset. */\n get API_URL(): string {\n return process.env.NEXT_PUBLIC_API_URL ?? \"\";\n },\n /** Public app base URL (NEXT_PUBLIC_ADDRESS). Empty when unset. */\n get APP_URL(): string {\n return process.env.NEXT_PUBLIC_ADDRESS ?? \"\";\n },\n /**\n * Alternative app base URL (NEXT_PUBLIC_APP_URL), used only by\n * `client/config.ts`'s `getAppUrl()` before it falls back to\n * `window.location.origin`. Empty when unset.\n */\n get APP_URL_ALTERNATE(): string {\n return process.env.NEXT_PUBLIC_APP_URL ?? \"\";\n },\n /** Web-push VAPID public key (NEXT_PUBLIC_VAPID_PUBLIC_KEY). Empty when unset. */\n get VAPID_PUBLIC_KEY(): string {\n return process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY ?? \"\";\n },\n /** Google Maps JS key (NEXT_PUBLIC_GOOGLE_MAPS_API_KEY). Empty disables autocomplete. */\n get GOOGLE_MAPS_API_KEY(): string {\n return process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ?? \"\";\n },\n /**\n * NEXT_PUBLIC_PRIVATE_INSTALLATION === \"true\", case-insensitively\n * (default false). A private installation is a single-tenant deployment.\n */\n get PRIVATE_INSTALLATION(): boolean {\n return process.env.NEXT_PUBLIC_PRIVATE_INSTALLATION?.toLowerCase() === \"true\";\n },\n /** NODE_ENV === \"production\" — set by the Next build, not by `.env`. */\n get IS_PRODUCTION(): boolean {\n return process.env.NODE_ENV === \"production\";\n },\n /** NODE_ENV === \"development\" — gates verbose client-side diagnostics. */\n get IS_DEVELOPMENT(): boolean {\n return process.env.NODE_ENV === \"development\";\n },\n};\n","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 // Last registration wins. An earlier version skipped re-registration, which\n // silently pinned the registry to the FIRST constructor seen by the process.\n // In dev that made a long-lived `next dev` server keep rehydrating with the\n // pre-edit class after any model change, so SSR produced a different tree\n // from the freshly bundled client and React threw a hydration mismatch.\n // Production is unaffected either way: bootstrap runs once per process.\n this._map.set(key.name, classConstructor);\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 // `statusText` is empty over HTTP/2 (the reason phrase was removed from the protocol), so the\n // body is the only reliable source of error text. APIs in this stack use either key.\n response.error =\n params.apiResponse?.data?.message ?? params.apiResponse?.data?.error ?? params.apiResponse.statusText;\n response.raw = params.apiResponse.data;\n return response;\n }\n\n if (params.apiResponse.status === 204) return response;\n\n // A success with no body (e.g. a 200 from a handler that sends nothing —\n // @HttpCode is inert when a controller injects @Res, so \"204\" endpoints can\n // arrive as empty 200s) translates to an empty success, not a crash on\n // `.included` below.\n if (params.apiResponse.data === undefined || params.apiResponse.data === null) 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 { ENV } from \"../core/env\";\nimport { 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 = ENV.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 = ENV.APP_URL;\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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/core/env.ts","../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":["/**\n * The single place in this package that reads `process.env`.\n *\n * Everything else imports {@link ENV}. Centralising the reads keeps every\n * default in one place — the same contract `base.config.ts` provides on the\n * NestJS side — instead of scattering `process.env.X || \"…\"` across hooks,\n * clients and components where the fallbacks silently drift apart.\n *\n * WHY THE READS MUST STAY LITERAL: Next.js inlines `NEXT_PUBLIC_*` by textual\n * substitution at build time, replacing the exact expression\n * `process.env.NEXT_PUBLIC_FOO` with a string literal. A computed lookup\n * (`process.env[key]`) is NOT substituted and reads as `undefined` in the\n * browser bundle. Every entry below therefore spells its variable out in full,\n * and new entries must do the same.\n *\n * WHY GETTERS AND NOT PLAIN PROPERTIES: every call site this replaced read\n * `process.env` at CALL time, not at import time. A plain property would freeze\n * the value when the module is first imported, which breaks any consumer that\n * assigns the variable after boot — the package's own tests do exactly that.\n * Getters keep the read lazy while leaving the expression literal, so the build\n * time substitution still applies.\n *\n * Because that substitution happens before the code runs, no reference to\n * `process` survives into the client bundle — so this module is safe to import\n * from client components, server components, route handlers and middleware\n * alike. It deliberately carries no `\"use client\"` directive for that reason.\n *\n * Values are normalised (empty string rather than `undefined`, booleans rather\n * than string comparisons) so callers never repeat the parsing. Callers that\n * must distinguish \"unset\" from \"set to empty\" — the URL getters, which throw a\n * configuration error — check for an empty string.\n */\nexport const ENV = {\n /** Public API base URL (NEXT_PUBLIC_API_URL). Empty when unset. */\n get API_URL(): string {\n return process.env.NEXT_PUBLIC_API_URL ?? \"\";\n },\n /** Public app base URL (NEXT_PUBLIC_ADDRESS). Empty when unset. */\n get APP_URL(): string {\n return process.env.NEXT_PUBLIC_ADDRESS ?? \"\";\n },\n /**\n * Alternative app base URL (NEXT_PUBLIC_APP_URL), used only by\n * `client/config.ts`'s `getAppUrl()` before it falls back to\n * `window.location.origin`. Empty when unset.\n */\n get APP_URL_ALTERNATE(): string {\n return process.env.NEXT_PUBLIC_APP_URL ?? \"\";\n },\n /** Web-push VAPID public key (NEXT_PUBLIC_VAPID_PUBLIC_KEY). Empty when unset. */\n get VAPID_PUBLIC_KEY(): string {\n return process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY ?? \"\";\n },\n /** Google Maps JS key (NEXT_PUBLIC_GOOGLE_MAPS_API_KEY). Empty disables autocomplete. */\n get GOOGLE_MAPS_API_KEY(): string {\n return process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ?? \"\";\n },\n /**\n * NEXT_PUBLIC_PRIVATE_INSTALLATION === \"true\", case-insensitively\n * (default false). A private installation is a single-tenant deployment.\n */\n get PRIVATE_INSTALLATION(): boolean {\n return process.env.NEXT_PUBLIC_PRIVATE_INSTALLATION?.toLowerCase() === \"true\";\n },\n /** NODE_ENV === \"production\" — set by the Next build, not by `.env`. */\n get IS_PRODUCTION(): boolean {\n return process.env.NODE_ENV === \"production\";\n },\n /** NODE_ENV === \"development\" — gates verbose client-side diagnostics. */\n get IS_DEVELOPMENT(): boolean {\n return process.env.NODE_ENV === \"development\";\n },\n};\n","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 // Last registration wins. An earlier version skipped re-registration, which\n // silently pinned the registry to the FIRST constructor seen by the process.\n // In dev that made a long-lived `next dev` server keep rehydrating with the\n // pre-edit class after any model change, so SSR produced a different tree\n // from the freshly bundled client and React threw a hydration mismatch.\n // Production is unaffected either way: bootstrap runs once per process.\n this._map.set(key.name, classConstructor);\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 // `statusText` is empty over HTTP/2 (the reason phrase was removed from the protocol), so the\n // body is the only reliable source of error text. APIs in this stack use either key.\n response.error =\n params.apiResponse?.data?.message ?? params.apiResponse?.data?.error ?? params.apiResponse.statusText;\n response.raw = params.apiResponse.data;\n return response;\n }\n\n if (params.apiResponse.status === 204) return response;\n\n // A success with no body (e.g. a 200 from a handler that sends nothing —\n // @HttpCode is inert when a controller injects @Res, so \"204\" endpoints can\n // arrive as empty 200s) translates to an empty success, not a crash on\n // `.included` below.\n if (params.apiResponse.data === undefined || params.apiResponse.data === null) 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 { ENV } from \"../core/env\";\nimport { 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 = ENV.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 = ENV.APP_URL;\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 // A cached server GET never sends the token, so it must not read the cookie either:\n // the read would make a public page dynamic.\n const isServerCached = typeof window === \"undefined\" && !!params.classKey.cache;\n const token = isServerCached ? undefined : (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":[]}
|
|
@@ -2,11 +2,11 @@ import {
|
|
|
2
2
|
AbstractService,
|
|
3
3
|
EndpointCreator,
|
|
4
4
|
Modules
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-AQZ3T4BR.mjs";
|
|
6
6
|
import {
|
|
7
7
|
ENV,
|
|
8
8
|
setBootstrapper
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-7SCREMTX.mjs";
|
|
10
10
|
import {
|
|
11
11
|
__name
|
|
12
12
|
} from "./chunk-PAWJFY3S.mjs";
|
|
@@ -77,48 +77,6 @@ function getStripePublishableKey() {
|
|
|
77
77
|
}
|
|
78
78
|
__name(getStripePublishableKey, "getStripePublishableKey");
|
|
79
79
|
|
|
80
|
-
// src/i18n/config.ts
|
|
81
|
-
var _config = null;
|
|
82
|
-
function configureI18n(config) {
|
|
83
|
-
_config = config;
|
|
84
|
-
}
|
|
85
|
-
__name(configureI18n, "configureI18n");
|
|
86
|
-
function useI18nRouter() {
|
|
87
|
-
if (!_config?.useRouter) {
|
|
88
|
-
throw new Error("i18n not configured. Call configureI18n() at app startup.");
|
|
89
|
-
}
|
|
90
|
-
return _config.useRouter();
|
|
91
|
-
}
|
|
92
|
-
__name(useI18nRouter, "useI18nRouter");
|
|
93
|
-
function useI18nTranslations(namespace) {
|
|
94
|
-
if (!_config?.useTranslations) {
|
|
95
|
-
return (key) => key;
|
|
96
|
-
}
|
|
97
|
-
return _config.useTranslations(namespace);
|
|
98
|
-
}
|
|
99
|
-
__name(useI18nTranslations, "useI18nTranslations");
|
|
100
|
-
function getI18nLink() {
|
|
101
|
-
if (!_config?.Link) {
|
|
102
|
-
throw new Error("i18n not configured. Call configureI18n() at app startup.");
|
|
103
|
-
}
|
|
104
|
-
return _config.Link;
|
|
105
|
-
}
|
|
106
|
-
__name(getI18nLink, "getI18nLink");
|
|
107
|
-
function useI18nLocale() {
|
|
108
|
-
if (_config?.useLocale) {
|
|
109
|
-
return _config.useLocale();
|
|
110
|
-
}
|
|
111
|
-
return "en";
|
|
112
|
-
}
|
|
113
|
-
__name(useI18nLocale, "useI18nLocale");
|
|
114
|
-
function useI18nDateFnsLocale() {
|
|
115
|
-
if (_config?.useDateFnsLocale) {
|
|
116
|
-
return _config.useDateFnsLocale();
|
|
117
|
-
}
|
|
118
|
-
return void 0;
|
|
119
|
-
}
|
|
120
|
-
__name(useI18nDateFnsLocale, "useI18nDateFnsLocale");
|
|
121
|
-
|
|
122
80
|
// src/login/config.ts
|
|
123
81
|
var _useDiscordAuth = false;
|
|
124
82
|
var _useGoogleAuth = false;
|
|
@@ -154,24 +112,6 @@ function getRegistrationMode() {
|
|
|
154
112
|
}
|
|
155
113
|
__name(getRegistrationMode, "getRegistrationMode");
|
|
156
114
|
|
|
157
|
-
// src/roles/config.ts
|
|
158
|
-
var _roleId = null;
|
|
159
|
-
function configureRoles(roleId) {
|
|
160
|
-
_roleId = roleId;
|
|
161
|
-
}
|
|
162
|
-
__name(configureRoles, "configureRoles");
|
|
163
|
-
function getRoleId() {
|
|
164
|
-
if (!_roleId) {
|
|
165
|
-
throw new Error("Roles not configured. Call configureRoles() at app startup.");
|
|
166
|
-
}
|
|
167
|
-
return _roleId;
|
|
168
|
-
}
|
|
169
|
-
__name(getRoleId, "getRoleId");
|
|
170
|
-
function isRolesConfigured() {
|
|
171
|
-
return _roleId !== null;
|
|
172
|
-
}
|
|
173
|
-
__name(isRolesConfigured, "isRolesConfigured");
|
|
174
|
-
|
|
175
115
|
// src/features/waitlist/config/waitlist.config.ts
|
|
176
116
|
var _waitlistConfig = {};
|
|
177
117
|
function configureWaitlist(config) {
|
|
@@ -267,21 +207,12 @@ export {
|
|
|
267
207
|
getAppUrl,
|
|
268
208
|
getTrackablePages,
|
|
269
209
|
getStripePublishableKey,
|
|
270
|
-
configureI18n,
|
|
271
|
-
useI18nRouter,
|
|
272
|
-
useI18nTranslations,
|
|
273
|
-
getI18nLink,
|
|
274
|
-
useI18nLocale,
|
|
275
|
-
useI18nDateFnsLocale,
|
|
276
210
|
configureLogin,
|
|
277
211
|
isDiscordAuthEnabled,
|
|
278
212
|
isGoogleAuthEnabled,
|
|
279
213
|
isInternalAuthEnabled,
|
|
280
214
|
isRegistrationAllowed,
|
|
281
215
|
getRegistrationMode,
|
|
282
|
-
configureRoles,
|
|
283
|
-
getRoleId,
|
|
284
|
-
isRolesConfigured,
|
|
285
216
|
configureWaitlist,
|
|
286
217
|
getWaitlistConfig,
|
|
287
218
|
configureReferral,
|
|
@@ -291,4 +222,4 @@ export {
|
|
|
291
222
|
ACTION_TYPES,
|
|
292
223
|
RbacService
|
|
293
224
|
};
|
|
294
|
-
//# sourceMappingURL=chunk-
|
|
225
|
+
//# sourceMappingURL=chunk-ADZSH3MG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/registry/helpStore.ts","../src/client/config.ts","../src/login/config.ts","../src/features/waitlist/config/waitlist.config.ts","../src/features/referral/config.ts","../src/features/rbac/data/RbacTypes.ts","../src/features/rbac/data/RbacService.ts"],"sourcesContent":["/**\n * Centralized help-content store accessible from client and server contexts.\n * Uses a globalThis Symbol key to persist across HMR/Turbopack reloads and to\n * bridge between the client-side `configureJsonApi` (in `client/config.ts`)\n * and the HelpProvider context. Holds the brand-only HelpContentConfig.\n *\n * NO external dependencies to avoid circular imports.\n *\n * Pattern mirrors `bootstrapStore.ts`.\n */\n\nconst HELP_CONTENT_KEY = Symbol.for(\"nextjs-jsonapi:helpContent\");\n\nconst globalStore = globalThis as unknown as {\n [HELP_CONTENT_KEY]?: unknown | null;\n};\n\nif (globalStore[HELP_CONTENT_KEY] === undefined) {\n globalStore[HELP_CONTENT_KEY] = null;\n}\n\nexport function _setStaticHelpContent(cfg: unknown | null): void {\n globalStore[HELP_CONTENT_KEY] = cfg;\n}\n\nexport function _getStaticHelpContent<T = unknown>(): T | null {\n return (globalStore[HELP_CONTENT_KEY] as T | null) ?? null;\n}\n","\"use client\";\n\nimport { ModuleWithPermissions } from \"../permissions/types\";\nimport { ENV } from \"../core/env\";\nimport { setBootstrapper } from \"../core/registry/bootstrapStore\";\nimport { _setStaticHelpContent } from \"../core/registry/helpStore\";\nimport type { HelpContentConfig } from \"../features/help/interfaces/help-content-config.interface\";\n\n// Config storage for client-side contexts\nlet _clientConfig: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n stripePublishableKey?: string;\n} | null = null;\n\n/**\n * Configure the JSON:API client. This is the main configuration function.\n * This is typically called during app initialization.\n * @param config.helpContent - Optional help-content config (brand only). Forwarded to the help feature's globalThis-backed store; not stored on the client config.\n */\nexport function configureJsonApi(config: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n stripePublishableKey?: string;\n helpContent?: HelpContentConfig;\n}): void {\n const { helpContent, ...rest } = config;\n _clientConfig = rest;\n if (helpContent) {\n _setStaticHelpContent(helpContent);\n }\n // Register and call bootstrapper to register all modules\n if (config.bootstrapper) {\n setBootstrapper(config.bootstrapper);\n config.bootstrapper();\n }\n}\n\n/**\n * Configure the client config. This is typically called during app initialization.\n * @deprecated Use configureJsonApi instead\n */\nexport function configureClientConfig(config: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n}): void {\n _clientConfig = config;\n}\n\n/**\n * Get the configured API URL.\n *\n * This may resolve to an internal/private host (e.g. a docker-network\n * hostname) when configured to do so for SSR fetches. Do NOT use this for\n * URLs that are rendered into HTML and followed by the browser — use\n * `getPublicApiUrl()` instead.\n */\nexport function getApiUrl(): string {\n if (_clientConfig?.apiUrl) {\n return _clientConfig.apiUrl;\n }\n return ENV.API_URL;\n}\n\n/**\n * Get the public-facing API URL.\n *\n * Always sourced from `NEXT_PUBLIC_API_URL` so it is identical on server\n * and client, and reachable from the user's browser. Use for any URL that\n * gets rendered into HTML the browser will navigate to (links, redirects,\n * OAuth hrefs).\n */\nexport function getPublicApiUrl(): string {\n return ENV.API_URL;\n}\n\n/**\n * Get the configured app URL.\n */\nexport function getAppUrl(): string {\n if (_clientConfig?.appUrl) {\n return _clientConfig.appUrl;\n }\n if (ENV.APP_URL_ALTERNATE) {\n return ENV.APP_URL_ALTERNATE;\n }\n if (typeof window !== \"undefined\") {\n return window.location.origin;\n }\n return \"\";\n}\n\n/**\n * Get the configured trackable pages.\n */\nexport function getTrackablePages(): ModuleWithPermissions[] {\n return _clientConfig?.trackablePages ?? [];\n}\n\n/**\n * Get the configured Stripe publishable key.\n */\nexport function getStripePublishableKey(): string | undefined {\n return _clientConfig?.stripePublishableKey;\n}\n","let _useDiscordAuth: boolean = false;\nlet _useGoogleAuth: boolean = false;\nlet _useInternalAuth: boolean = true;\nlet _allowRegistration: boolean = true;\nlet _registrationMode: \"open\" | \"closed\" | \"waitlist\" = \"open\";\n\nexport type RegistrationMode = \"open\" | \"closed\" | \"waitlist\";\n\nexport interface LoginConfig {\n discordClientId?: string;\n googleClientId?: string;\n useInternalAuth?: boolean;\n allowRegistration?: boolean;\n registrationMode?: RegistrationMode;\n}\n\nexport function configureLogin(params: LoginConfig): void {\n _useDiscordAuth = !!params.discordClientId;\n _useGoogleAuth = !!params.googleClientId;\n _useInternalAuth = params.useInternalAuth ?? true;\n _allowRegistration = params.allowRegistration ?? true;\n _registrationMode = params.registrationMode ?? \"open\";\n}\n\nexport function isDiscordAuthEnabled(): boolean {\n return _useDiscordAuth;\n}\n\nexport function isGoogleAuthEnabled(): boolean {\n return _useGoogleAuth;\n}\n\nexport function isInternalAuthEnabled(): boolean {\n return _useInternalAuth;\n}\n\nexport function isRegistrationAllowed(): boolean {\n return _allowRegistration;\n}\n\nexport function getRegistrationMode(): RegistrationMode {\n return _registrationMode;\n}\n","export type QuestionnaireFieldType = \"text\" | \"textarea\" | \"select\" | \"checkbox\";\n\nexport interface QuestionnaireOption {\n value: string;\n label: string;\n description?: string;\n}\n\nexport interface QuestionnaireField {\n id: string;\n type: QuestionnaireFieldType;\n label: string;\n description?: string;\n placeholder?: string;\n required?: boolean;\n options?: QuestionnaireOption[];\n}\n\nexport interface WaitlistConfig {\n questionnaire?: QuestionnaireField[];\n heroTitle?: string;\n heroSubtitle?: string;\n heroDescription?: string;\n benefits?: string[];\n}\n\nlet _waitlistConfig: WaitlistConfig = {};\n\nexport function configureWaitlist(config: WaitlistConfig): void {\n _waitlistConfig = config;\n}\n\nexport function getWaitlistConfig(): WaitlistConfig {\n return _waitlistConfig;\n}\n","/**\n * Configuration interface for frontend referral feature.\n */\nexport interface ReferralConfig {\n /**\n * Whether the referral feature is enabled.\n * When false, components render nothing and hooks return null.\n * @default false\n */\n enabled?: boolean;\n\n /**\n * Name of the cookie used to store referral codes.\n * @default \"referral_code\"\n */\n cookieName?: string;\n\n /**\n * Number of days the referral cookie is valid.\n * @default 30\n */\n cookieDays?: number;\n\n /**\n * Query parameter name for referral code in URL.\n * @default \"ref\"\n */\n urlParamName?: string;\n\n /**\n * Base URL for referral links.\n * @default window.location.origin (client-side only)\n */\n referralUrlBase?: string;\n\n /**\n * Path to append to base URL for referral links.\n * @default \"/\"\n */\n referralPath?: string;\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_REFERRAL_CONFIG: Required<ReferralConfig> = {\n enabled: false,\n cookieName: \"referral_code\",\n cookieDays: 30,\n urlParamName: \"ref\",\n referralUrlBase: \"\",\n referralPath: \"/\",\n};\n\n// Private storage for configuration\nlet _referralConfig: Required<ReferralConfig> = { ...DEFAULT_REFERRAL_CONFIG };\n\n/**\n * Configure referral feature settings.\n * Call this at app startup to enable and configure referral functionality.\n *\n * @example\n * ```typescript\n * import { configureReferral } from \"@carlonicora/nextjs-jsonapi\";\n *\n * configureReferral({\n * enabled: process.env.NEXT_PUBLIC_REFERRAL_ENABLED === 'true',\n * cookieDays: 30,\n * });\n * ```\n */\nexport function configureReferral(config: ReferralConfig): void {\n _referralConfig = { ...DEFAULT_REFERRAL_CONFIG, ...config };\n}\n\n/**\n * Get the current referral configuration.\n * @internal\n */\nexport function getReferralConfig(): Required<ReferralConfig> {\n return _referralConfig;\n}\n\n/**\n * Check if referral feature is enabled.\n */\nexport function isReferralEnabled(): boolean {\n return _referralConfig.enabled;\n}\n","export const COMPANY_ADMINISTRATOR_ROLE_ID = \"2e1eee00-6cba-4506-9059-ccd24e4ea5b0\";\n\nexport type PermissionValue = boolean | string;\n\nexport type ActionType = \"read\" | \"create\" | \"update\" | \"delete\";\n\nexport const ACTION_TYPES: ActionType[] = [\"read\", \"create\", \"update\", \"delete\"];\n\n/** The permissions object shape used by both Module and PermissionMapping entities */\nexport type PermissionsMap = {\n create?: PermissionValue;\n read?: PermissionValue;\n update?: PermissionValue;\n delete?: PermissionValue;\n};\n\n/**\n * Declarative-RBAC matrix types.\n *\n * Mirror of the library types defined in\n * `packages/nestjs-neo4jsonapi/src/foundations/rbac/dsl/types.ts`.\n * Frontend does not import from backend, so the shape is redefined here.\n *\n * A `PermToken` represents a single permission entry:\n * - `scope: true` → unconditional (e.g. full read of the module)\n * - `scope: false` → nothing (rarely used, mostly a placeholder)\n * - `scope: \"path\"` → scoped by relationship path (e.g. \"orders.account\")\n */\nexport type PermToken = { action: string; scope: boolean | string };\n\n/**\n * A per-module block of the matrix. Always has a `default` row (permissions\n * granted to every role). Additional keys are role IDs → role-specific\n * permission tokens that are unioned with `default` to produce the effective\n * permissions for that role in that module.\n */\nexport type RbacModuleBlock = { default: PermToken[] } & Record<string, PermToken[]>;\n\n/**\n * The full RBAC matrix as served by the dev endpoint `GET /_dev/rbac/matrix`.\n * Keys are module IDs; values are module blocks.\n */\nexport type RbacMatrix = Record<string, RbacModuleBlock>;\n","import { AbstractService, EndpointCreator, HttpMethod, Modules } from \"../../../core\";\nimport type { RbacMatrixModel } from \"./RbacMatrixModel\";\nimport type { RbacMatrix } from \"./RbacTypes\";\n\n/**\n * RbacService — fetches RBAC configuration for the admin UI.\n *\n * Declarative-matrix methods (`fetchMatrix`, `saveMatrix`) talk to the\n * dev-only endpoints added in\n * `packages/nestjs-neo4jsonapi/.../rbac-dev.controller.ts`. The controller\n * speaks JSON:API (singleton resource with `type: \"rbac-matrix\"`, `id:\n * \"singleton\"`), so these methods go through the standard `callApi()`\n * pipeline like every other service in the codebase.\n *\n * The backend only registers these routes when `devMode` is enabled on\n * `RbacModule.register` (see `apps/api/src/features/features.modules.ts`).\n * In production the routes return 404; callers should guard with a dev-mode\n * check.\n */\nexport class RbacService extends AbstractService {\n /**\n * Fetch the current RBAC matrix plus each module's known BFS relationship\n * paths (used by the permission picker as scope suggestions).\n *\n * Dev-only endpoint — see class header.\n */\n static async fetchMatrix(): Promise<{\n matrix: RbacMatrix;\n modulePaths: Record<string, readonly string[]>;\n }> {\n const endpoint = new EndpointCreator({ endpoint: Modules.RbacMatrix }).generate();\n\n const model = await this.callApi<RbacMatrixModel>({\n type: Modules.RbacMatrix,\n method: HttpMethod.GET,\n endpoint,\n });\n\n return {\n matrix: model.matrix ?? {},\n modulePaths: model.modulePaths ?? {},\n };\n }\n\n /**\n * Persist a matrix back to the declarative `permissions.ts` file.\n *\n * The backend serializes the matrix to formatted TypeScript using the\n * provided `roleNames` / `moduleNames` lookup tables (so the emitted file\n * references `RoleId.X` / `ModuleId.X` rather than raw UUIDs) and writes\n * it to `outputPath` (absolute, or relative to the repo root).\n *\n * Dev-only endpoint — see class header.\n */\n static async saveMatrix(args: {\n matrix: RbacMatrix;\n roleNames: Record<string, string>;\n moduleNames: Record<string, string>;\n outputPath: string;\n }): Promise<{ bytesWritten: number; path: string }> {\n const endpoint = new EndpointCreator({ endpoint: Modules.RbacMatrix }).generate();\n\n const model = await this.callApi<RbacMatrixModel>({\n type: Modules.RbacMatrix,\n method: HttpMethod.PUT,\n endpoint,\n input: args,\n });\n\n return {\n bytesWritten: model.bytesWritten ?? 0,\n path: model.path ?? \"\",\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAWA,IAAM,mBAAmB,uBAAO,IAAI,4BAA4B;AAEhE,IAAM,cAAc;AAIpB,IAAI,YAAY,gBAAgB,MAAM,QAAW;AAC/C,cAAY,gBAAgB,IAAI;AAClC;AAEO,SAAS,sBAAsB,KAA2B;AAC/D,cAAY,gBAAgB,IAAI;AAClC;AAFgB;AAIT,SAAS,wBAA+C;AAC7D,SAAQ,YAAY,gBAAgB,KAAkB;AACxD;AAFgB;;;AChBhB,IAAI,gBAOO;AAOJ,SAAS,iBAAiB,QAQxB;AACP,QAAM,EAAE,aAAa,GAAG,KAAK,IAAI;AACjC,kBAAgB;AAChB,MAAI,aAAa;AACf,0BAAsB,WAAW;AAAA,EACnC;AAEA,MAAI,OAAO,cAAc;AACvB,oBAAgB,OAAO,YAAY;AACnC,WAAO,aAAa;AAAA,EACtB;AACF;AAnBgB;AAyBT,SAAS,sBAAsB,QAI7B;AACP,kBAAgB;AAClB;AANgB;AAgBT,SAAS,YAAoB;AAClC,MAAI,eAAe,QAAQ;AACzB,WAAO,cAAc;AAAA,EACvB;AACA,SAAO,IAAI;AACb;AALgB;AAeT,SAAS,kBAA0B;AACxC,SAAO,IAAI;AACb;AAFgB;AAOT,SAAS,YAAoB;AAClC,MAAI,eAAe,QAAQ;AACzB,WAAO,cAAc;AAAA,EACvB;AACA,MAAI,IAAI,mBAAmB;AACzB,WAAO,IAAI;AAAA,EACb;AACA,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,OAAO,SAAS;AAAA,EACzB;AACA,SAAO;AACT;AAXgB;AAgBT,SAAS,oBAA6C;AAC3D,SAAO,eAAe,kBAAkB,CAAC;AAC3C;AAFgB;AAOT,SAAS,0BAA8C;AAC5D,SAAO,eAAe;AACxB;AAFgB;;;AC7GhB,IAAI,kBAA2B;AAC/B,IAAI,iBAA0B;AAC9B,IAAI,mBAA4B;AAChC,IAAI,qBAA8B;AAClC,IAAI,oBAAoD;AAYjD,SAAS,eAAe,QAA2B;AACxD,oBAAkB,CAAC,CAAC,OAAO;AAC3B,mBAAiB,CAAC,CAAC,OAAO;AAC1B,qBAAmB,OAAO,mBAAmB;AAC7C,uBAAqB,OAAO,qBAAqB;AACjD,sBAAoB,OAAO,oBAAoB;AACjD;AANgB;AAQT,SAAS,uBAAgC;AAC9C,SAAO;AACT;AAFgB;AAIT,SAAS,sBAA+B;AAC7C,SAAO;AACT;AAFgB;AAIT,SAAS,wBAAiC;AAC/C,SAAO;AACT;AAFgB;AAIT,SAAS,wBAAiC;AAC/C,SAAO;AACT;AAFgB;AAIT,SAAS,sBAAwC;AACtD,SAAO;AACT;AAFgB;;;ACdhB,IAAI,kBAAkC,CAAC;AAEhC,SAAS,kBAAkB,QAA8B;AAC9D,oBAAkB;AACpB;AAFgB;AAIT,SAAS,oBAAoC;AAClD,SAAO;AACT;AAFgB;;;ACaT,IAAM,0BAAoD;AAAA,EAC/D,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,cAAc;AAChB;AAGA,IAAI,kBAA4C,EAAE,GAAG,wBAAwB;AAgBtE,SAAS,kBAAkB,QAA8B;AAC9D,oBAAkB,EAAE,GAAG,yBAAyB,GAAG,OAAO;AAC5D;AAFgB;AAQT,SAAS,oBAA8C;AAC5D,SAAO;AACT;AAFgB;AAOT,SAAS,oBAA6B;AAC3C,SAAO,gBAAgB;AACzB;AAFgB;;;ACtFT,IAAM,gCAAgC;AAMtC,IAAM,eAA6B,CAAC,QAAQ,UAAU,UAAU,QAAQ;;;ACaxE,IAAM,cAAN,cAA0B,gBAAgB;AAAA,EAnBjD,OAmBiD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/C,aAAa,cAGV;AACD,UAAM,WAAW,IAAI,gBAAgB,EAAE,UAAU,QAAQ,WAAW,CAAC,EAAE,SAAS;AAEhF,UAAM,QAAQ,MAAM,KAAK,QAAyB;AAAA,MAChD,MAAM,QAAQ;AAAA,MACd;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,QAAQ,MAAM,UAAU,CAAC;AAAA,MACzB,aAAa,MAAM,eAAe,CAAC;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAa,WAAW,MAK4B;AAClD,UAAM,WAAW,IAAI,gBAAgB,EAAE,UAAU,QAAQ,WAAW,CAAC,EAAE,SAAS;AAEhF,UAAM,QAAQ,MAAM,KAAK,QAAyB;AAAA,MAChD,MAAM,QAAQ;AAAA,MACd;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAED,WAAO;AAAA,MACL,cAAc,MAAM,gBAAgB;AAAA,MACpC,MAAM,MAAM,QAAQ;AAAA,IACtB;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getClientToken
|
|
3
|
+
} from "./chunk-AUXK7QSA.mjs";
|
|
4
|
+
import {
|
|
5
|
+
directFetch
|
|
6
|
+
} from "./chunk-PI56A4DG.mjs";
|
|
1
7
|
import {
|
|
2
8
|
DataClassRegistry,
|
|
3
9
|
ENV,
|
|
@@ -9,13 +15,7 @@ import {
|
|
|
9
15
|
setBootstrapper,
|
|
10
16
|
translateResponse,
|
|
11
17
|
tryBootstrap
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import {
|
|
14
|
-
getClientToken
|
|
15
|
-
} from "./chunk-AUXK7QSA.mjs";
|
|
16
|
-
import {
|
|
17
|
-
directFetch
|
|
18
|
-
} from "./chunk-PI56A4DG.mjs";
|
|
18
|
+
} from "./chunk-7SCREMTX.mjs";
|
|
19
19
|
import {
|
|
20
20
|
__name
|
|
21
21
|
} from "./chunk-PAWJFY3S.mjs";
|
|
@@ -271,6 +271,55 @@ function clearLastApiMeta() {
|
|
|
271
271
|
}
|
|
272
272
|
__name(clearLastApiMeta, "clearLastApiMeta");
|
|
273
273
|
|
|
274
|
+
// src/i18n/config.ts
|
|
275
|
+
var _config = null;
|
|
276
|
+
function configureI18n(config) {
|
|
277
|
+
_config = config;
|
|
278
|
+
}
|
|
279
|
+
__name(configureI18n, "configureI18n");
|
|
280
|
+
function useI18nRouter() {
|
|
281
|
+
if (!_config?.useRouter) {
|
|
282
|
+
throw new Error("i18n not configured. Call configureI18n() at app startup.");
|
|
283
|
+
}
|
|
284
|
+
return _config.useRouter();
|
|
285
|
+
}
|
|
286
|
+
__name(useI18nRouter, "useI18nRouter");
|
|
287
|
+
function useI18nTranslations(namespace) {
|
|
288
|
+
if (!_config?.useTranslations) {
|
|
289
|
+
return (key) => key;
|
|
290
|
+
}
|
|
291
|
+
return _config.useTranslations(namespace);
|
|
292
|
+
}
|
|
293
|
+
__name(useI18nTranslations, "useI18nTranslations");
|
|
294
|
+
function getI18nLink() {
|
|
295
|
+
if (!_config?.Link) {
|
|
296
|
+
throw new Error("i18n not configured. Call configureI18n() at app startup.");
|
|
297
|
+
}
|
|
298
|
+
return _config.Link;
|
|
299
|
+
}
|
|
300
|
+
__name(getI18nLink, "getI18nLink");
|
|
301
|
+
function useI18nLocale() {
|
|
302
|
+
if (_config?.useLocale) {
|
|
303
|
+
return _config.useLocale();
|
|
304
|
+
}
|
|
305
|
+
return "en";
|
|
306
|
+
}
|
|
307
|
+
__name(useI18nLocale, "useI18nLocale");
|
|
308
|
+
async function getI18nServerLocale() {
|
|
309
|
+
if (!_config?.getLocale) {
|
|
310
|
+
throw new Error("i18n not configured. Call configureI18n() with getLocale at app startup.");
|
|
311
|
+
}
|
|
312
|
+
return _config.getLocale();
|
|
313
|
+
}
|
|
314
|
+
__name(getI18nServerLocale, "getI18nServerLocale");
|
|
315
|
+
function useI18nDateFnsLocale() {
|
|
316
|
+
if (_config?.useDateFnsLocale) {
|
|
317
|
+
return _config.useDateFnsLocale();
|
|
318
|
+
}
|
|
319
|
+
return void 0;
|
|
320
|
+
}
|
|
321
|
+
__name(useI18nDateFnsLocale, "useI18nDateFnsLocale");
|
|
322
|
+
|
|
274
323
|
// src/core/abstracts/AbstractService.ts
|
|
275
324
|
var HttpMethod = /* @__PURE__ */ ((HttpMethod2) => {
|
|
276
325
|
HttpMethod2["GET"] = "GET";
|
|
@@ -343,12 +392,11 @@ var AbstractService = class {
|
|
|
343
392
|
* Make an API call with automatic environment detection and error handling.
|
|
344
393
|
*/
|
|
345
394
|
static async callApi(params) {
|
|
346
|
-
const { JsonApiGet: JsonApiGet2, JsonApiPost: JsonApiPost2, JsonApiPut, JsonApiPatch, JsonApiDelete: JsonApiDelete2 } = await import("./JsonApiRequest-
|
|
395
|
+
const { JsonApiGet: JsonApiGet2, JsonApiPost: JsonApiPost2, JsonApiPut, JsonApiPatch, JsonApiDelete: JsonApiDelete2 } = await import("./JsonApiRequest-MEP6AXDT.mjs");
|
|
347
396
|
let apiResponse;
|
|
348
397
|
let language = "en";
|
|
349
398
|
if (typeof window === "undefined") {
|
|
350
|
-
|
|
351
|
-
language = await getLocale() ?? "en";
|
|
399
|
+
language = await getI18nServerLocale();
|
|
352
400
|
} else {
|
|
353
401
|
language = this.getClientLocale();
|
|
354
402
|
}
|
|
@@ -441,12 +489,11 @@ var AbstractService = class {
|
|
|
441
489
|
* Make an API call and return both data and meta from the response.
|
|
442
490
|
*/
|
|
443
491
|
static async callApiWithMeta(params) {
|
|
444
|
-
const { JsonApiGet: JsonApiGet2, JsonApiPost: JsonApiPost2, JsonApiPut, JsonApiPatch, JsonApiDelete: JsonApiDelete2 } = await import("./JsonApiRequest-
|
|
492
|
+
const { JsonApiGet: JsonApiGet2, JsonApiPost: JsonApiPost2, JsonApiPut, JsonApiPatch, JsonApiDelete: JsonApiDelete2 } = await import("./JsonApiRequest-MEP6AXDT.mjs");
|
|
445
493
|
let apiResponse;
|
|
446
494
|
let language = "en";
|
|
447
495
|
if (typeof window === "undefined") {
|
|
448
|
-
|
|
449
|
-
language = await getLocale() ?? "en";
|
|
496
|
+
language = await getI18nServerLocale();
|
|
450
497
|
} else {
|
|
451
498
|
language = this.getClientLocale();
|
|
452
499
|
}
|
|
@@ -527,11 +574,10 @@ var AbstractService = class {
|
|
|
527
574
|
* Get raw JSON:API response data without deserialization.
|
|
528
575
|
*/
|
|
529
576
|
static async getRawData(params) {
|
|
530
|
-
const { JsonApiGet: JsonApiGet2 } = await import("./JsonApiRequest-
|
|
577
|
+
const { JsonApiGet: JsonApiGet2 } = await import("./JsonApiRequest-MEP6AXDT.mjs");
|
|
531
578
|
let language = "en";
|
|
532
579
|
if (typeof window === "undefined") {
|
|
533
|
-
|
|
534
|
-
language = await getLocale() ?? "en";
|
|
580
|
+
language = await getI18nServerLocale();
|
|
535
581
|
} else {
|
|
536
582
|
language = this.getClientLocale();
|
|
537
583
|
}
|
|
@@ -1223,7 +1269,8 @@ function subscribeViewport(onChange) {
|
|
|
1223
1269
|
}
|
|
1224
1270
|
__name(subscribeViewport, "subscribeViewport");
|
|
1225
1271
|
function useIsMobile() {
|
|
1226
|
-
const
|
|
1272
|
+
const provided = React2.useContext(getViewportContext());
|
|
1273
|
+
const seeded = provided instanceof Promise ? React2.use(provided) : provided;
|
|
1227
1274
|
const [legacy, setLegacy] = React2.useState(false);
|
|
1228
1275
|
React2.useEffect(() => {
|
|
1229
1276
|
if (seeded !== void 0) return;
|
|
@@ -9932,6 +9979,12 @@ export {
|
|
|
9932
9979
|
clearLastApiTotal,
|
|
9933
9980
|
getLastApiMeta,
|
|
9934
9981
|
clearLastApiMeta,
|
|
9982
|
+
configureI18n,
|
|
9983
|
+
useI18nRouter,
|
|
9984
|
+
useI18nTranslations,
|
|
9985
|
+
getI18nLink,
|
|
9986
|
+
useI18nLocale,
|
|
9987
|
+
useI18nDateFnsLocale,
|
|
9935
9988
|
HttpMethod,
|
|
9936
9989
|
setGlobalErrorHandler,
|
|
9937
9990
|
getGlobalErrorHandler,
|
|
@@ -10179,4 +10232,4 @@ export {
|
|
|
10179
10232
|
AuditLogService,
|
|
10180
10233
|
AuditLogModule
|
|
10181
10234
|
};
|
|
10182
|
-
//# sourceMappingURL=chunk-
|
|
10235
|
+
//# sourceMappingURL=chunk-AQZ3T4BR.mjs.map
|