@carlonicora/nextjs-jsonapi 3.28.2 → 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-36VL2TNM.js → BlockNoteEditor-BXMTGKDV.js} +21 -20
- package/dist/BlockNoteEditor-BXMTGKDV.js.map +1 -0
- package/dist/{BlockNoteEditor-4IDXT6ZU.mjs → BlockNoteEditor-FGVQP35E.mjs} +9 -8
- package/dist/{BlockNoteEditor-4IDXT6ZU.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-KOTKKBJT.js → chunk-NFCXUAE6.js} +1328 -1183
- 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-HPUV6FBW.mjs → chunk-WJC4SYRL.mjs} +2131 -1986
- 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/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-36VL2TNM.js.map +0 -1
- package/dist/JsonApiRequest-TE5WD3WS.js +0 -26
- package/dist/chunk-26MQIJNB.js.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-HPUV6FBW.mjs.map +0 -1
- package/dist/chunk-KOTKKBJT.js.map +0 -1
- package/dist/chunk-Q6J2ICKO.mjs.map +0 -1
- package/dist/chunk-SJLXPHK5.mjs.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
|
@@ -3,17 +3,27 @@ import {
|
|
|
3
3
|
} from "./chunk-PAWJFY3S.mjs";
|
|
4
4
|
|
|
5
5
|
// src/server/request.ts
|
|
6
|
-
|
|
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
|
+
import { cachedServerGet, statusFromDigest } from "@carlonicora/nextjs-jsonapi/cached-get";
|
|
16
7
|
async function serverRequest(params) {
|
|
8
|
+
if (params.method === "GET" && params.cache) {
|
|
9
|
+
try {
|
|
10
|
+
return await cachedServerGet({
|
|
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 = statusFromDigest(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 @@ __name(serverRequest, "serverRequest");
|
|
|
97
95
|
export {
|
|
98
96
|
serverRequest
|
|
99
97
|
};
|
|
100
|
-
//# sourceMappingURL=chunk-
|
|
98
|
+
//# sourceMappingURL=chunk-E2LENTUH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/request.ts"],"sourcesContent":["// 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"],"mappings":";;;;;AAMA,SAAS,iBAAiB,wBAAwB;AAsBlD,eAAsB,cAAc,QAA+C;AACjF,MAAI,OAAO,WAAW,SAAS,OAAO,OAAO;AAC3C,QAAI;AACF,aAAO,MAAM,gBAAgB;AAAA,QAC3B,KAAK,OAAO;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO;AAAA,QAClB,mBAAmB,OAAO;AAAA,MAC5B,CAAC;AAAA,IACH,SAAS,OAAO;AAGd,YAAM,SAAS,iBAAiB,KAAK,KAAK;AAC1C,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI;AAAA,QACJ;AAAA,QACA,YAAY,WAAW,MAAM,wBAAwB;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAoB;AAAA,IACxB,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAEA,QAAM,oBAA4C,EAAE,GAAG,OAAO,kBAAkB;AAEhF,MAAI,OAAO,WAAW;AACpB,sBAAkB,aAAa,IAAI,OAAO;AAAA,EAC5C;AACA,oBAAkB,YAAY,IAAI,OAAO;AAEzC,MAAI,cAAoC;AAExC,MAAI,OAAO,OAAO;AAChB,UAAM,WAAW,IAAI,SAAS;AAC9B,QAAI,OAAO,QAAQ,OAAO,OAAO,SAAS,UAAU;AAClD,iBAAW,OAAO,OAAO,MAAM;AAC7B,YAAI,OAAO,UAAU,eAAe,KAAK,OAAO,MAAM,GAAG,GAAG;AAC1D,mBAAS;AAAA,YACP;AAAA,YACA,OAAO,OAAO,KAAK,GAAG,MAAM,WAAW,KAAK,UAAU,OAAO,KAAK,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG;AAAA,UAC3F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,iBAAiB,MAAM;AAChC,eAAS,OAAO,QAAQ,OAAO,KAAK;AAAA,IACtC,WAAW,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,MAAM;AACpE,iBAAW,OAAO,OAAO,OAAO;AAC9B,YAAI,OAAO,UAAU,eAAe,KAAK,OAAO,OAAO,GAAG,GAAG;AAC3D,mBAAS,OAAO,KAAK,OAAO,MAAM,GAAG,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,kBAAc;AAAA,EAChB,WAAW,OAAO,SAAS,QAAW;AACpC,kBAAc,KAAK,UAAU,OAAO,IAAI;AACxC,sBAAkB,cAAc,IAAI;AAAA,EACtC;AAEA,QAAM,UAAuB;AAAA,IAC3B,QAAQ,OAAO;AAAA,IACf,SAAS,EAAE,QAAQ,oBAAoB,GAAG,kBAAkB;AAAA,EAC9D;AAEA,MAAI,gBAAgB,QAAW;AAC7B,YAAQ,OAAO;AAAA,EACjB;AAEA,MAAI,OAAO,OAAO;AAChB,YAAQ,UAAU,EAAE,GAAG,QAAQ,SAAS,eAAe,UAAU,OAAO,KAAK,GAAG;AAAA,EAClF;AAEA,MAAI;AACF,UAAM,cAAc,MAAM,MAAM,OAAO,KAAK,OAAO;AAEnD,aAAS,KAAK,YAAY;AAC1B,aAAS,SAAS,YAAY;AAC9B,aAAS,aAAa,YAAY;AAClC,QAAI;AACF,eAAS,OAAO,MAAM,YAAY,KAAK;AAAA,IACzC,QAAQ;AACN,eAAS,OAAO;AAAA,IAClB;AAAA,EACF,QAAQ;AAIN,aAAS,KAAK;AACd,aAAS,SAAS;AAClB,aAAS,aAAa;AACtB,aAAS,OAAO;AAAA,EAClB;AAEA,SAAO;AACT;AAvGsB;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__name
|
|
3
|
+
} from "./chunk-PAWJFY3S.mjs";
|
|
4
|
+
|
|
5
|
+
// src/server/cacheDigest.ts
|
|
6
|
+
function statusFromDigest(error) {
|
|
7
|
+
const digest = error?.digest;
|
|
8
|
+
if (typeof digest !== "string") return void 0;
|
|
9
|
+
const match = /^HTTP_(\d+)$/.exec(digest);
|
|
10
|
+
return match ? Number(match[1]) : void 0;
|
|
11
|
+
}
|
|
12
|
+
__name(statusFromDigest, "statusFromDigest");
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
statusFromDigest
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=chunk-EBEXWN3I.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/cacheDigest.ts"],"sourcesContent":["// Shared by `cachedGet.ts` and its client stub, so `serverRequest` reads the status\n// back the same way whichever one the bundler resolved.\n\n/** Reads the HTTP status from an `HTTP_<status>` digest, or `undefined` when there is none. */\nexport function statusFromDigest(error: unknown): number | undefined {\n const digest = (error as { digest?: unknown } | null | undefined)?.digest;\n if (typeof digest !== \"string\") return undefined;\n const match = /^HTTP_(\\d+)$/.exec(digest);\n return match ? Number(match[1]) : undefined;\n}\n"],"mappings":";;;;;AAIO,SAAS,iBAAiB,OAAoC;AACnE,QAAM,SAAU,OAAmD;AACnE,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,QAAM,QAAQ,eAAe,KAAK,MAAM;AACxC,SAAO,QAAQ,OAAO,MAAM,CAAC,CAAC,IAAI;AACpC;AALgB;","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
|
|
4
|
+
|
|
5
|
+
// src/roles/config.ts
|
|
6
|
+
var _roleId = null;
|
|
7
|
+
function configureRoles(roleId) {
|
|
8
|
+
_roleId = roleId;
|
|
9
|
+
}
|
|
10
|
+
_chunk7QVYU63Ejs.__name.call(void 0, configureRoles, "configureRoles");
|
|
11
|
+
function getRoleId() {
|
|
12
|
+
if (!_roleId) {
|
|
13
|
+
throw new Error("Roles not configured. Call configureRoles() at app startup.");
|
|
14
|
+
}
|
|
15
|
+
return _roleId;
|
|
16
|
+
}
|
|
17
|
+
_chunk7QVYU63Ejs.__name.call(void 0, getRoleId, "getRoleId");
|
|
18
|
+
function isRolesConfigured() {
|
|
19
|
+
return _roleId !== null;
|
|
20
|
+
}
|
|
21
|
+
_chunk7QVYU63Ejs.__name.call(void 0, isRolesConfigured, "isRolesConfigured");
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
exports.configureRoles = configureRoles; exports.getRoleId = getRoleId; exports.isRolesConfigured = isRolesConfigured;
|
|
28
|
+
//# sourceMappingURL=chunk-G4JR3SFV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-G4JR3SFV.js","../src/roles/config.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACOA,IAAI,QAAA,EAA+B,IAAA;AAc5B,SAAS,cAAA,CAAe,MAAA,EAA4B;AACzD,EAAA,QAAA,EAAU,MAAA;AACZ;AAFgB,qCAAA,cAAA,EAAA,gBAAA,CAAA;AAQT,SAAS,SAAA,CAAA,EAA0B;AACxC,EAAA,GAAA,CAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,6DAA6D,CAAA;AAAA,EAC/E;AACA,EAAA,OAAO,OAAA;AACT;AALgB,qCAAA,SAAA,EAAA,WAAA,CAAA;AAUT,SAAS,iBAAA,CAAA,EAA6B;AAC3C,EAAA,OAAO,QAAA,IAAY,IAAA;AACrB;AAFgB,qCAAA,iBAAA,EAAA,mBAAA,CAAA;ADtBhB;AACA;AACE;AACA;AACA;AACF,sHAAC","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-G4JR3SFV.js","sourcesContent":[null,"/**\n * Role ID configuration interface\n * Apps provide their role IDs via configureRoles()\n */\nexport interface RoleIdConfig {\n Administrator: string;\n CompanyAdministrator: string;\n [key: string]: string; // Allow additional roles\n}\n\n// Private storage for the injected role IDs\nlet _roleId: RoleIdConfig | null = null;\n\n/**\n * Configure role IDs for the library\n * Call this at app startup to provide role ID constants\n *\n * @example\n * ```typescript\n * import { configureRoles } from \"@carlonicora/nextjs-jsonapi\";\n * import { RoleId } from \"@phlow/shared\";\n *\n * configureRoles(RoleId);\n * ```\n */\nexport function configureRoles(roleId: RoleIdConfig): void {\n _roleId = roleId;\n}\n\n/**\n * Get configured role IDs\n * @throws Error if roles not configured\n */\nexport function getRoleId(): RoleIdConfig {\n if (!_roleId) {\n throw new Error(\"Roles not configured. Call configureRoles() at app startup.\");\n }\n return _roleId;\n}\n\n/**\n * Check if roles have been configured\n */\nexport function isRolesConfigured(): boolean {\n return _roleId !== null;\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/server/cacheProfiles.ts
|
|
2
|
+
var CACHE_PROFILES = [
|
|
3
|
+
"seconds",
|
|
4
|
+
"minutes",
|
|
5
|
+
"hours",
|
|
6
|
+
"days",
|
|
7
|
+
"weeks",
|
|
8
|
+
"max",
|
|
9
|
+
"default"
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
exports.CACHE_PROFILES = CACHE_PROFILES;
|
|
15
|
+
//# sourceMappingURL=chunk-IK65TDQH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-IK65TDQH.js","../src/server/cacheProfiles.ts"],"names":[],"mappings":"AAAA;ACMO,IAAM,eAAA,EAA0C;AAAA,EACrD,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA;ADJA;AACA;AACE;AACF,wCAAC","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-IK65TDQH.js","sourcesContent":[null,"// Plain constants, no `next/cache` import: `cachedGet.ts` reads them, and this file\n// keeps `revalidateTag`/`updateTag` (in `cache.ts`) out of every graph that loads it.\n\nexport type CacheProfile = \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"weeks\" | \"max\" | \"default\";\n\n/** The built-in `cacheLife` profile names. A module `cache` value outside this list is treated as a tag. */\nexport const CACHE_PROFILES: readonly CacheProfile[] = [\n \"seconds\",\n \"minutes\",\n \"hours\",\n \"days\",\n \"weeks\",\n \"max\",\n \"default\",\n];\n"]}
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkYUO55Q5Ajs = require('./chunk-YUO55Q5A.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunk6TUB7Y6Tjs = require('./chunk-6TUB7Y6T.js');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunkG4JR3SFVjs = require('./chunk-G4JR3SFV.js');
|
|
10
|
+
|
|
7
11
|
|
|
8
12
|
|
|
9
|
-
var
|
|
13
|
+
var _chunk6OFANJTEjs = require('./chunk-6OFANJTE.js');
|
|
10
14
|
|
|
11
15
|
|
|
12
16
|
|
|
13
17
|
|
|
14
|
-
var
|
|
18
|
+
var _chunkWGVNJXZOjs = require('./chunk-WGVNJXZO.js');
|
|
15
19
|
|
|
16
20
|
|
|
17
21
|
var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
|
|
@@ -28,15 +32,34 @@ async function invalidateCacheTags(tags, profile = "max") {
|
|
|
28
32
|
}
|
|
29
33
|
}
|
|
30
34
|
_chunk7QVYU63Ejs.__name.call(void 0, invalidateCacheTags, "invalidateCacheTags");
|
|
35
|
+
async function updateCacheTag(tag) {
|
|
36
|
+
_cache.updateTag.call(void 0, tag);
|
|
37
|
+
}
|
|
38
|
+
_chunk7QVYU63Ejs.__name.call(void 0, updateCacheTag, "updateCacheTag");
|
|
31
39
|
|
|
32
40
|
// src/server/ServerSession.ts
|
|
33
41
|
var _headers = require('next/headers');
|
|
34
42
|
var _navigation = require('next/navigation');
|
|
43
|
+
var _server = require('next/server');
|
|
35
44
|
var _pako = require('pako');
|
|
36
45
|
var ServerSession = class {
|
|
37
46
|
static {
|
|
38
47
|
_chunk7QVYU63Ejs.__name.call(void 0, this, "ServerSession");
|
|
39
48
|
}
|
|
49
|
+
static async read() {
|
|
50
|
+
const cookieStore = await _headers.cookies.call(void 0, );
|
|
51
|
+
const headerStore = await _headers.headers.call(void 0, );
|
|
52
|
+
const token = _optionalChain([cookieStore, 'access', _ => _.get, 'call', _2 => _2("token"), 'optionalAccess', _3 => _3.value]) || void 0;
|
|
53
|
+
const roles = _optionalChain([cookieStore, 'access', _4 => _4.get, 'call', _5 => _5("roles"), 'optionalAccess', _6 => _6.value]);
|
|
54
|
+
const viewportCookie = _optionalChain([cookieStore, 'access', _7 => _7.get, 'call', _8 => _8(_chunk6OFANJTEjs.VIEWPORT_COOKIE_NAME), 'optionalAccess', _9 => _9.value]);
|
|
55
|
+
return {
|
|
56
|
+
isLogged: !!token,
|
|
57
|
+
isAdministrator: !!roles && roles.includes(_chunkG4JR3SFVjs.getRoleId.call(void 0, ).Administrator),
|
|
58
|
+
token,
|
|
59
|
+
sidebarOpen: _optionalChain([cookieStore, 'access', _10 => _10.get, 'call', _11 => _11("sidebar_state"), 'optionalAccess', _12 => _12.value]) !== "false",
|
|
60
|
+
isMobile: viewportCookie ? viewportCookie === "1" : _server.userAgent.call(void 0, { headers: headerStore }).device.type === "mobile"
|
|
61
|
+
};
|
|
62
|
+
}
|
|
40
63
|
static async isLogged() {
|
|
41
64
|
const cookieStore = await _headers.cookies.call(void 0, );
|
|
42
65
|
const token = cookieStore.get("token");
|
|
@@ -45,38 +68,38 @@ var ServerSession = class {
|
|
|
45
68
|
}
|
|
46
69
|
static async companyId() {
|
|
47
70
|
const cookieStore = await _headers.cookies.call(void 0, );
|
|
48
|
-
return _nullishCoalesce(_optionalChain([cookieStore, 'access',
|
|
71
|
+
return _nullishCoalesce(_optionalChain([cookieStore, 'access', _13 => _13.get, 'call', _14 => _14("companyId"), 'optionalAccess', _15 => _15.value]), () => ( ""));
|
|
49
72
|
}
|
|
50
73
|
static async userId() {
|
|
51
74
|
const cookieStore = await _headers.cookies.call(void 0, );
|
|
52
|
-
return _nullishCoalesce(_optionalChain([cookieStore, 'access',
|
|
75
|
+
return _nullishCoalesce(_optionalChain([cookieStore, 'access', _16 => _16.get, 'call', _17 => _17("userId"), 'optionalAccess', _18 => _18.value]), () => ( ""));
|
|
53
76
|
}
|
|
54
77
|
static async checkPermission(params) {
|
|
55
78
|
if (!await this.hasPermissionToModule(params)) _navigation.redirect.call(void 0, `/401`);
|
|
56
79
|
}
|
|
57
80
|
static async hasRole(roleId) {
|
|
58
81
|
const cookieStore = await _headers.cookies.call(void 0, );
|
|
59
|
-
const roles = _optionalChain([cookieStore, 'access',
|
|
82
|
+
const roles = _optionalChain([cookieStore, 'access', _19 => _19.get, 'call', _20 => _20("roles"), 'optionalAccess', _21 => _21.value]);
|
|
60
83
|
if (!roles || !roles.includes(roleId)) return false;
|
|
61
84
|
return true;
|
|
62
85
|
}
|
|
63
86
|
static async hasFeature(featureId) {
|
|
64
87
|
const cookieStore = await _headers.cookies.call(void 0, );
|
|
65
|
-
const features = _optionalChain([cookieStore, 'access',
|
|
88
|
+
const features = _optionalChain([cookieStore, 'access', _22 => _22.get, 'call', _23 => _23("features"), 'optionalAccess', _24 => _24.value]);
|
|
66
89
|
if (!features || !features.includes(featureId)) return false;
|
|
67
90
|
return true;
|
|
68
91
|
}
|
|
69
92
|
static async hasPermissionToModule(params) {
|
|
70
93
|
const cookieStore = await _headers.cookies.call(void 0, );
|
|
71
94
|
if (params.module.feature) {
|
|
72
|
-
const features = _optionalChain([cookieStore, 'access',
|
|
95
|
+
const features = _optionalChain([cookieStore, 'access', _25 => _25.get, 'call', _26 => _26("features"), 'optionalAccess', _27 => _27.value]);
|
|
73
96
|
if (features && !features.includes(params.module.feature)) return false;
|
|
74
97
|
}
|
|
75
|
-
const rawModules = _optionalChain([cookieStore, 'access',
|
|
98
|
+
const rawModules = _optionalChain([cookieStore, 'access', _28 => _28.get, 'call', _29 => _29("modules"), 'optionalAccess', _30 => _30.value]);
|
|
76
99
|
if (!rawModules) return false;
|
|
77
100
|
const modules = JSON.parse(_pako.ungzip.call(void 0, Buffer.from(rawModules, "base64"), { toText: true }));
|
|
78
101
|
const selectedModule = modules.find((module) => module.id === params.module.moduleId);
|
|
79
|
-
return
|
|
102
|
+
return _chunk6OFANJTEjs.checkPermissionsFromServer.call(void 0, {
|
|
80
103
|
module: params.module,
|
|
81
104
|
action: params.action,
|
|
82
105
|
data: params.data,
|
|
@@ -96,10 +119,10 @@ function configureServerJsonApi(config) {
|
|
|
96
119
|
}
|
|
97
120
|
_chunk7QVYU63Ejs.__name.call(void 0, configureServerJsonApi, "configureServerJsonApi");
|
|
98
121
|
function getServerApiUrl() {
|
|
99
|
-
if (_optionalChain([_serverConfig, 'optionalAccess',
|
|
122
|
+
if (_optionalChain([_serverConfig, 'optionalAccess', _31 => _31.apiUrl])) {
|
|
100
123
|
return _serverConfig.apiUrl;
|
|
101
124
|
}
|
|
102
|
-
const envUrl =
|
|
125
|
+
const envUrl = _chunkWGVNJXZOjs.ENV.API_URL;
|
|
103
126
|
if (!envUrl) {
|
|
104
127
|
throw new Error(
|
|
105
128
|
"API URL not configured. Use configureServerJsonApi() or set NEXT_PUBLIC_API_URL environment variable."
|
|
@@ -109,10 +132,10 @@ function getServerApiUrl() {
|
|
|
109
132
|
}
|
|
110
133
|
_chunk7QVYU63Ejs.__name.call(void 0, getServerApiUrl, "getServerApiUrl");
|
|
111
134
|
function getServerAppUrl() {
|
|
112
|
-
if (_optionalChain([_serverConfig, 'optionalAccess',
|
|
135
|
+
if (_optionalChain([_serverConfig, 'optionalAccess', _32 => _32.appUrl])) {
|
|
113
136
|
return _serverConfig.appUrl;
|
|
114
137
|
}
|
|
115
|
-
const envUrl =
|
|
138
|
+
const envUrl = _chunkWGVNJXZOjs.ENV.APP_URL;
|
|
116
139
|
if (!envUrl) {
|
|
117
140
|
throw new Error(
|
|
118
141
|
"App URL not configured. Use configureServerJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable."
|
|
@@ -122,11 +145,11 @@ function getServerAppUrl() {
|
|
|
122
145
|
}
|
|
123
146
|
_chunk7QVYU63Ejs.__name.call(void 0, getServerAppUrl, "getServerAppUrl");
|
|
124
147
|
function getServerTrackablePages() {
|
|
125
|
-
return _nullishCoalesce(_optionalChain([_serverConfig, 'optionalAccess',
|
|
148
|
+
return _nullishCoalesce(_optionalChain([_serverConfig, 'optionalAccess', _33 => _33.trackablePages]), () => ( []));
|
|
126
149
|
}
|
|
127
150
|
_chunk7QVYU63Ejs.__name.call(void 0, getServerTrackablePages, "getServerTrackablePages");
|
|
128
151
|
function runServerBootstrapper() {
|
|
129
|
-
if (_optionalChain([_serverConfig, 'optionalAccess',
|
|
152
|
+
if (_optionalChain([_serverConfig, 'optionalAccess', _34 => _34.bootstrapper])) {
|
|
130
153
|
_serverConfig.bootstrapper();
|
|
131
154
|
}
|
|
132
155
|
}
|
|
@@ -138,17 +161,17 @@ function buildServerUrl(endpoint) {
|
|
|
138
161
|
_chunk7QVYU63Ejs.__name.call(void 0, buildServerUrl, "buildServerUrl");
|
|
139
162
|
async function ServerJsonApiGet(params) {
|
|
140
163
|
runServerBootstrapper();
|
|
141
|
-
const token = await _chunkYUO55Q5Ajs.getServerToken.call(void 0, );
|
|
142
|
-
const apiResponse = await
|
|
164
|
+
const token = params.classKey.cache ? void 0 : await _chunkYUO55Q5Ajs.getServerToken.call(void 0, );
|
|
165
|
+
const apiResponse = await _chunk6TUB7Y6Tjs.serverRequest.call(void 0, {
|
|
143
166
|
method: "GET",
|
|
144
167
|
url: buildServerUrl(params.endpoint),
|
|
145
168
|
token,
|
|
146
169
|
cache: params.classKey.cache,
|
|
147
170
|
companyId: params.companyId,
|
|
148
171
|
language: params.language,
|
|
149
|
-
additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess',
|
|
172
|
+
additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess', _35 => _35.additionalHeaders])
|
|
150
173
|
});
|
|
151
|
-
return
|
|
174
|
+
return _chunkWGVNJXZOjs.translateResponse.call(void 0, {
|
|
152
175
|
classKey: params.classKey,
|
|
153
176
|
apiResponse,
|
|
154
177
|
companyId: params.companyId,
|
|
@@ -169,9 +192,9 @@ async function ServerJsonApiPost(params) {
|
|
|
169
192
|
if (!body) {
|
|
170
193
|
body = {};
|
|
171
194
|
} else if (params.overridesJsonApiCreation !== true) {
|
|
172
|
-
body =
|
|
195
|
+
body = _chunkWGVNJXZOjs.JsonApiDataFactory.create(params.classKey, body);
|
|
173
196
|
}
|
|
174
|
-
const apiResponse = await
|
|
197
|
+
const apiResponse = await _chunk6TUB7Y6Tjs.serverRequest.call(void 0, {
|
|
175
198
|
method: "POST",
|
|
176
199
|
url: buildServerUrl(params.endpoint),
|
|
177
200
|
token,
|
|
@@ -179,9 +202,9 @@ async function ServerJsonApiPost(params) {
|
|
|
179
202
|
files: params.files,
|
|
180
203
|
companyId: params.companyId,
|
|
181
204
|
language: params.language,
|
|
182
|
-
additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess',
|
|
205
|
+
additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess', _36 => _36.additionalHeaders])
|
|
183
206
|
});
|
|
184
|
-
return
|
|
207
|
+
return _chunkWGVNJXZOjs.translateResponse.call(void 0, {
|
|
185
208
|
classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
|
|
186
209
|
apiResponse,
|
|
187
210
|
companyId: params.companyId,
|
|
@@ -196,9 +219,9 @@ async function ServerJsonApiPut(params) {
|
|
|
196
219
|
if (!body) {
|
|
197
220
|
body = {};
|
|
198
221
|
} else {
|
|
199
|
-
body =
|
|
222
|
+
body = _chunkWGVNJXZOjs.JsonApiDataFactory.create(params.classKey, body);
|
|
200
223
|
}
|
|
201
|
-
const apiResponse = await
|
|
224
|
+
const apiResponse = await _chunk6TUB7Y6Tjs.serverRequest.call(void 0, {
|
|
202
225
|
method: "PUT",
|
|
203
226
|
url: buildServerUrl(params.endpoint),
|
|
204
227
|
token,
|
|
@@ -206,9 +229,9 @@ async function ServerJsonApiPut(params) {
|
|
|
206
229
|
files: params.files,
|
|
207
230
|
companyId: params.companyId,
|
|
208
231
|
language: params.language,
|
|
209
|
-
additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess',
|
|
232
|
+
additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess', _37 => _37.additionalHeaders])
|
|
210
233
|
});
|
|
211
|
-
return
|
|
234
|
+
return _chunkWGVNJXZOjs.translateResponse.call(void 0, {
|
|
212
235
|
classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
|
|
213
236
|
apiResponse,
|
|
214
237
|
companyId: params.companyId,
|
|
@@ -223,9 +246,9 @@ async function ServerJsonApiPatch(params) {
|
|
|
223
246
|
if (!body) {
|
|
224
247
|
body = {};
|
|
225
248
|
} else if (params.overridesJsonApiCreation !== true) {
|
|
226
|
-
body =
|
|
249
|
+
body = _chunkWGVNJXZOjs.JsonApiDataFactory.create(params.classKey, body);
|
|
227
250
|
}
|
|
228
|
-
const apiResponse = await
|
|
251
|
+
const apiResponse = await _chunk6TUB7Y6Tjs.serverRequest.call(void 0, {
|
|
229
252
|
method: "PATCH",
|
|
230
253
|
url: buildServerUrl(params.endpoint),
|
|
231
254
|
token,
|
|
@@ -233,9 +256,9 @@ async function ServerJsonApiPatch(params) {
|
|
|
233
256
|
files: params.files,
|
|
234
257
|
companyId: params.companyId,
|
|
235
258
|
language: params.language,
|
|
236
|
-
additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess',
|
|
259
|
+
additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess', _38 => _38.additionalHeaders])
|
|
237
260
|
});
|
|
238
|
-
return
|
|
261
|
+
return _chunkWGVNJXZOjs.translateResponse.call(void 0, {
|
|
239
262
|
classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
|
|
240
263
|
apiResponse,
|
|
241
264
|
companyId: params.companyId,
|
|
@@ -246,15 +269,15 @@ _chunk7QVYU63Ejs.__name.call(void 0, ServerJsonApiPatch, "ServerJsonApiPatch");
|
|
|
246
269
|
async function ServerJsonApiDelete(params) {
|
|
247
270
|
runServerBootstrapper();
|
|
248
271
|
const token = await _chunkYUO55Q5Ajs.getServerToken.call(void 0, );
|
|
249
|
-
const apiResponse = await
|
|
272
|
+
const apiResponse = await _chunk6TUB7Y6Tjs.serverRequest.call(void 0, {
|
|
250
273
|
method: "DELETE",
|
|
251
274
|
url: buildServerUrl(params.endpoint),
|
|
252
275
|
token,
|
|
253
276
|
companyId: params.companyId,
|
|
254
277
|
language: params.language,
|
|
255
|
-
additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess',
|
|
278
|
+
additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess', _39 => _39.additionalHeaders])
|
|
256
279
|
});
|
|
257
|
-
return
|
|
280
|
+
return _chunkWGVNJXZOjs.translateResponse.call(void 0, {
|
|
258
281
|
classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
|
|
259
282
|
apiResponse,
|
|
260
283
|
companyId: params.companyId,
|
|
@@ -276,5 +299,6 @@ _chunk7QVYU63Ejs.__name.call(void 0, ServerJsonApiDelete, "ServerJsonApiDelete")
|
|
|
276
299
|
|
|
277
300
|
|
|
278
301
|
|
|
279
|
-
|
|
280
|
-
|
|
302
|
+
|
|
303
|
+
exports.invalidateCacheTag = invalidateCacheTag; exports.invalidateCacheTags = invalidateCacheTags; exports.updateCacheTag = updateCacheTag; exports.ServerSession = ServerSession; exports.configureServerJsonApi = configureServerJsonApi; exports.getServerApiUrl = getServerApiUrl; exports.getServerAppUrl = getServerAppUrl; exports.getServerTrackablePages = getServerTrackablePages; exports.ServerJsonApiGet = ServerJsonApiGet; exports.ServerJsonApiPost = ServerJsonApiPost; exports.ServerJsonApiPut = ServerJsonApiPut; exports.ServerJsonApiPatch = ServerJsonApiPatch; exports.ServerJsonApiDelete = ServerJsonApiDelete;
|
|
304
|
+
//# sourceMappingURL=chunk-JEQ34Z5E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-JEQ34Z5E.js","../src/server/cache.ts","../src/server/ServerSession.ts","../src/server/JsonApiServer.ts"],"names":[],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-JEQ34Z5E.js","sourcesContent":[null,"// Server-only utilities (NOT server actions - these cannot be called from client components)\n\nimport { revalidateTag, updateTag } from \"next/cache\";\n\nimport type { CacheProfile } from \"./cacheProfiles\";\n\nexport { CACHE_PROFILES, type CacheProfile } from \"./cacheProfiles\";\n\n/**\n * Revalidate a cache tag to invalidate cached data.\n * Next.js 16+ requires a profile parameter.\n *\n * With `\"max\"` the tagged entries are marked stale and served stale-while-revalidate\n * (a one-year window): the next request still gets the old data while fresh data loads\n * in the background. It is not an immediate invalidation. A Server Action that must\n * read its own write uses `updateCacheTag` instead.\n *\n * @param tag - The cache tag to invalidate\n * @param profile - The cache profile whose `expire` bounds how long stale data may be served (defaults to \"max\")\n */\nexport async function invalidateCacheTag(tag: string, profile: CacheProfile = \"max\"): Promise<void> {\n revalidateTag(tag, profile);\n}\n\n/**\n * Revalidate multiple cache tags.\n *\n * @param tags - Array of cache tags to invalidate\n * @param profile - The cache profile, see `invalidateCacheTag` (defaults to \"max\", stale-while-revalidate)\n */\nexport async function invalidateCacheTags(tags: string[], profile: CacheProfile = \"max\"): Promise<void> {\n for (const tag of tags) {\n revalidateTag(tag, profile);\n }\n}\n\n/**\n * Expire a cache tag immediately, so the same request reads fresh data (read-your-own-writes).\n * Wraps `updateTag`, which works in Server Actions only. Route Handlers use `invalidateCacheTag`.\n *\n * @param tag - The cache tag to expire\n */\nexport async function updateCacheTag(tag: string): Promise<void> {\n updateTag(tag);\n}\n","import { cookies, headers } from \"next/headers\";\nimport { redirect } from \"next/navigation\";\nimport { userAgent } from \"next/server\";\nimport { ungzip } from \"pako\";\nimport { Action, checkPermissionsFromServer, ModuleWithPermissions } from \"../permissions\";\nimport { getRoleId } from \"../roles/config\";\nimport { VIEWPORT_COOKIE_NAME } from \"../utils/use-mobile\";\n\nexport interface SessionSnapshot {\n isLogged: boolean;\n isAdministrator: boolean;\n token?: string;\n sidebarOpen: boolean;\n isMobile: boolean;\n}\n\nexport class ServerSession {\n static async read(): Promise<SessionSnapshot> {\n const cookieStore = await cookies();\n const headerStore = await headers();\n\n const token = cookieStore.get(\"token\")?.value || undefined;\n const roles = cookieStore.get(\"roles\")?.value;\n const viewportCookie = cookieStore.get(VIEWPORT_COOKIE_NAME)?.value;\n\n return {\n isLogged: !!token,\n isAdministrator: !!roles && roles.includes(getRoleId().Administrator),\n token,\n sidebarOpen: cookieStore.get(\"sidebar_state\")?.value !== \"false\",\n isMobile: viewportCookie ? viewportCookie === \"1\" : userAgent({ headers: headerStore }).device.type === \"mobile\",\n };\n }\n\n static async isLogged() {\n const cookieStore = await cookies();\n const token = cookieStore.get(\"token\");\n\n if (!token || !token.value) return false;\n return true;\n }\n\n static async companyId() {\n const cookieStore = await cookies();\n return cookieStore.get(\"companyId\")?.value ?? \"\";\n }\n\n static async userId() {\n const cookieStore = await cookies();\n return cookieStore.get(\"userId\")?.value ?? \"\";\n }\n\n static async checkPermission<M extends ModuleWithPermissions>(params: { module: M; action: Action; data?: any }) {\n if (!(await this.hasPermissionToModule(params))) redirect(`/401`);\n }\n\n static async hasRole(roleId: string): Promise<boolean> {\n const cookieStore = await cookies();\n const roles = cookieStore.get(\"roles\")?.value;\n\n if (!roles || !roles.includes(roleId)) return false;\n\n return true;\n }\n\n static async hasFeature(featureId: string): Promise<boolean> {\n const cookieStore = await cookies();\n const features = cookieStore.get(\"features\")?.value;\n\n if (!features || !features.includes(featureId)) return false;\n\n return true;\n }\n\n static async hasPermissionToModule<M extends ModuleWithPermissions>(params: {\n module: M;\n action: Action;\n data?: any;\n }): Promise<boolean> {\n const cookieStore = await cookies();\n\n if (params.module.feature) {\n const features = cookieStore.get(\"features\")?.value;\n\n if (features && !features.includes(params.module.feature)) return false;\n }\n\n const rawModules = cookieStore.get(\"modules\")?.value;\n if (!rawModules) return false;\n\n const modules: {\n id: string;\n permissions: {\n create: boolean | string;\n read: boolean | string;\n update: boolean | string;\n delete: boolean | string;\n };\n }[] = JSON.parse(ungzip(Buffer.from(rawModules, \"base64\"), { toText: true }));\n\n const selectedModule = modules.find((module) => module.id === params.module.moduleId);\n\n return checkPermissionsFromServer({\n module: params.module,\n action: params.action,\n data: params.data,\n userId: await this.userId(),\n selectedModule: selectedModule,\n });\n\n // if (!selectedModule) return false;\n\n // if (!selectedModule.permissions[params.action]) return false;\n // if (typeof selectedModule.permissions[params.action] === \"boolean\")\n // return selectedModule.permissions[params.action] as boolean;\n\n // if (!params.data) return false;\n\n // return params.data[selectedModule.permissions[params.action] as string] === this.userId;\n }\n}\n","// Server-only utilities (NOT server actions - these cannot be called from client components)\n\nimport { ENV } from \"../core/env\";\nimport { JsonApiDataFactory } from \"../core/factories/JsonApiDataFactory\";\nimport { ApiRequestDataTypeInterface } from \"../core/interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../core/interfaces/ApiResponseInterface\";\nimport { translateResponse } from \"../core/utils/translateResponse\";\nimport { ModuleWithPermissions } from \"../permissions/types\";\nimport { serverRequest } from \"./request\";\nimport { getServerToken } from \"./token\";\n\n// Config storage for server contexts\nlet _serverConfig: {\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 server client.\n * Call this in your Bootstrapper or server initialization.\n */\nexport function configureServerJsonApi(config: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n}): void {\n _serverConfig = config;\n if (config.bootstrapper) {\n config.bootstrapper();\n }\n}\n\nexport function getServerApiUrl(): string {\n if (_serverConfig?.apiUrl) {\n return _serverConfig.apiUrl;\n }\n const envUrl = ENV.API_URL;\n if (!envUrl) {\n throw new Error(\n \"API URL not configured. Use configureServerJsonApi() or set NEXT_PUBLIC_API_URL environment variable.\",\n );\n }\n return envUrl;\n}\n\nexport function getServerAppUrl(): string {\n if (_serverConfig?.appUrl) {\n return _serverConfig.appUrl;\n }\n const envUrl = ENV.APP_URL;\n if (!envUrl) {\n throw new Error(\n \"App URL not configured. Use configureServerJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable.\",\n );\n }\n return envUrl.trim().replace(/\\/+$/, \"\");\n}\n\nexport function getServerTrackablePages(): ModuleWithPermissions[] {\n return _serverConfig?.trackablePages ?? [];\n}\n\nfunction runServerBootstrapper(): void {\n if (_serverConfig?.bootstrapper) {\n _serverConfig.bootstrapper();\n }\n}\n\nfunction buildServerUrl(endpoint: string): string {\n const apiUrl = getServerApiUrl();\n return endpoint.startsWith(\"http\") ? endpoint : `${apiUrl}${endpoint}`;\n}\n\nexport async function ServerJsonApiGet(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n}): Promise<ApiResponseInterface> {\n runServerBootstrapper();\n // A cached GET never sends the token, so it must not read the cookie either:\n // the read would make a public page dynamic.\n const token = params.classKey.cache ? undefined : await getServerToken();\n\n const apiResponse = await serverRequest({\n method: \"GET\",\n url: buildServerUrl(params.endpoint),\n token,\n cache: params.classKey.cache,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _serverConfig?.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 ServerJsonApiGet({\n classKey: params.classKey,\n endpoint,\n companyId: params.companyId,\n language: params.language,\n }),\n });\n}\n\nexport async function ServerJsonApiPost(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}): Promise<ApiResponseInterface> {\n runServerBootstrapper();\n const token = await getServerToken();\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 serverRequest({\n method: \"POST\",\n url: buildServerUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _serverConfig?.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 ServerJsonApiPut(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}): Promise<ApiResponseInterface> {\n runServerBootstrapper();\n const token = await getServerToken();\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 serverRequest({\n method: \"PUT\",\n url: buildServerUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _serverConfig?.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 ServerJsonApiPatch(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}): Promise<ApiResponseInterface> {\n runServerBootstrapper();\n const token = await getServerToken();\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 serverRequest({\n method: \"PATCH\",\n url: buildServerUrl(params.endpoint),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _serverConfig?.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 ServerJsonApiDelete(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n runServerBootstrapper();\n const token = await getServerToken();\n\n const apiResponse = await serverRequest({\n method: \"DELETE\",\n url: buildServerUrl(params.endpoint),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _serverConfig?.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"]}
|