@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.
Files changed (214) hide show
  1. package/dist/{BlockNoteEditor-ATZVHS6X.js → BlockNoteEditor-BXMTGKDV.js} +21 -20
  2. package/dist/BlockNoteEditor-BXMTGKDV.js.map +1 -0
  3. package/dist/{BlockNoteEditor-CWW2D3SG.mjs → BlockNoteEditor-FGVQP35E.mjs} +9 -8
  4. package/dist/{BlockNoteEditor-CWW2D3SG.mjs.map → BlockNoteEditor-FGVQP35E.mjs.map} +1 -1
  5. package/dist/{BlockNoteViewer-KRTAFTUX.mjs → BlockNoteViewer-DQYT6IJW.mjs} +3 -3
  6. package/dist/{BlockNoteViewer-7BFNTN4E.js → BlockNoteViewer-YH7G66PS.js} +4 -4
  7. package/dist/{BlockNoteViewer-7BFNTN4E.js.map → BlockNoteViewer-YH7G66PS.js.map} +1 -1
  8. package/dist/{HandbookSectionInterface-DgYH--Ik.d.mts → HandbookSectionInterface-BYsmnPEz.d.mts} +1 -1
  9. package/dist/{HandbookSectionInterface-Ck1wZJ81.d.ts → HandbookSectionInterface-OePKPbqN.d.ts} +1 -1
  10. package/dist/{JsonApiRequest-UHOWNI3O.mjs → JsonApiRequest-MEP6AXDT.mjs} +2 -2
  11. package/dist/JsonApiRequest-OB6WL4LA.js +26 -0
  12. package/dist/{JsonApiRequest-TE5WD3WS.js.map → JsonApiRequest-OB6WL4LA.js.map} +1 -1
  13. package/dist/ServerSession-DFNNNkg7.d.ts +29 -0
  14. package/dist/ServerSession-DK1z0_Ql.d.mts +29 -0
  15. package/dist/{analytics.modules-CfczU12P.d.ts → analytics.modules-Bsacu6ik.d.ts} +1 -1
  16. package/dist/{analytics.modules-pzGwMASI.d.mts → analytics.modules-txdCLNG-.d.mts} +1 -1
  17. package/dist/billing/index.js +404 -402
  18. package/dist/billing/index.js.map +1 -1
  19. package/dist/billing/index.mjs +10 -8
  20. package/dist/billing/index.mjs.map +1 -1
  21. package/dist/{chunk-7B4E42R5.mjs → chunk-3CZ2GK5R.mjs} +33 -9
  22. package/dist/chunk-3CZ2GK5R.mjs.map +1 -0
  23. package/dist/{chunk-4Z45NYPR.js → chunk-5W5MN7JP.js} +14 -83
  24. package/dist/chunk-5W5MN7JP.js.map +1 -0
  25. package/dist/{chunk-CAKOFJZD.js → chunk-6OFANJTE.js} +195 -142
  26. package/dist/chunk-6OFANJTE.js.map +1 -0
  27. package/dist/{chunk-5TRFNKJS.js → chunk-6TUB7Y6T.js} +23 -25
  28. package/dist/chunk-6TUB7Y6T.js.map +1 -0
  29. package/dist/{chunk-37DMFVLN.mjs → chunk-7SCREMTX.mjs} +4 -3
  30. package/dist/{chunk-37DMFVLN.mjs.map → chunk-7SCREMTX.mjs.map} +1 -1
  31. package/dist/{chunk-Q6J2ICKO.mjs → chunk-ADZSH3MG.mjs} +3 -72
  32. package/dist/chunk-ADZSH3MG.mjs.map +1 -0
  33. package/dist/{chunk-E3I4MT53.mjs → chunk-AQZ3T4BR.mjs} +71 -18
  34. package/dist/chunk-AQZ3T4BR.mjs.map +1 -0
  35. package/dist/{chunk-SJLXPHK5.mjs → chunk-E2LENTUH.mjs} +22 -24
  36. package/dist/chunk-E2LENTUH.mjs.map +1 -0
  37. package/dist/chunk-EBEXWN3I.mjs +17 -0
  38. package/dist/chunk-EBEXWN3I.mjs.map +1 -0
  39. package/dist/chunk-G4JR3SFV.js +28 -0
  40. package/dist/chunk-G4JR3SFV.js.map +1 -0
  41. package/dist/chunk-IK65TDQH.js +15 -0
  42. package/dist/chunk-IK65TDQH.js.map +1 -0
  43. package/dist/{chunk-GHFMKH3M.js → chunk-JEQ34Z5E.js} +62 -38
  44. package/dist/chunk-JEQ34Z5E.js.map +1 -0
  45. package/dist/{chunk-YDPDJIJF.js → chunk-NFCXUAE6.js} +1330 -1184
  46. package/dist/chunk-NFCXUAE6.js.map +1 -0
  47. package/dist/chunk-OEOK6A3P.js +17 -0
  48. package/dist/chunk-OEOK6A3P.js.map +1 -0
  49. package/dist/chunk-PW42LRSL.mjs +28 -0
  50. package/dist/chunk-PW42LRSL.mjs.map +1 -0
  51. package/dist/{chunk-U65JPKO3.mjs → chunk-R6ZYB4VN.mjs} +2 -2
  52. package/dist/chunk-T7SAW3UW.mjs +15 -0
  53. package/dist/chunk-T7SAW3UW.mjs.map +1 -0
  54. package/dist/{chunk-GKDHYB2R.js → chunk-TWBZ2GSX.js} +3 -3
  55. package/dist/{chunk-GKDHYB2R.js.map → chunk-TWBZ2GSX.js.map} +1 -1
  56. package/dist/{chunk-26MQIJNB.js → chunk-WGVNJXZO.js} +4 -3
  57. package/dist/chunk-WGVNJXZO.js.map +1 -0
  58. package/dist/{chunk-2IMQ5IKA.mjs → chunk-WJC4SYRL.mjs} +2133 -1987
  59. package/dist/chunk-WJC4SYRL.mjs.map +1 -0
  60. package/dist/client/index.d.mts +3 -3
  61. package/dist/client/index.d.ts +3 -3
  62. package/dist/client/index.js +6 -5
  63. package/dist/client/index.js.map +1 -1
  64. package/dist/client/index.mjs +13 -12
  65. package/dist/components/index.d.mts +16 -6
  66. package/dist/components/index.d.ts +16 -6
  67. package/dist/components/index.js +8 -5
  68. package/dist/components/index.js.map +1 -1
  69. package/dist/components/index.mjs +9 -6
  70. package/dist/{config-3N1LSrcC.d.ts → config-B6UB7j69.d.ts} +1 -1
  71. package/dist/{config-BmufyEj6.d.mts → config-CEAq4Ozy.d.mts} +10 -1
  72. package/dist/{config-AVtuvfM1.d.ts → config-DydDHCfb.d.ts} +10 -1
  73. package/dist/{config-BSKTYDoh.d.mts → config-n-ZpPmOL.d.mts} +1 -1
  74. package/dist/contexts/index.d.mts +28 -4
  75. package/dist/contexts/index.d.ts +28 -4
  76. package/dist/contexts/index.js +10 -5
  77. package/dist/contexts/index.js.map +1 -1
  78. package/dist/contexts/index.mjs +9 -4
  79. package/dist/core/index.d.mts +6 -6
  80. package/dist/core/index.d.ts +6 -6
  81. package/dist/core/index.js +5 -5
  82. package/dist/core/index.js.map +1 -1
  83. package/dist/core/index.mjs +4 -4
  84. package/dist/features/analytics/index.d.mts +2 -2
  85. package/dist/features/analytics/index.d.ts +2 -2
  86. package/dist/features/analytics/index.js +124 -123
  87. package/dist/features/analytics/index.js.map +1 -1
  88. package/dist/features/analytics/index.mjs +6 -5
  89. package/dist/features/analytics/index.mjs.map +1 -1
  90. package/dist/features/analytics/server.d.mts +10 -2
  91. package/dist/features/analytics/server.d.ts +10 -2
  92. package/dist/features/analytics/server.js +8 -6
  93. package/dist/features/analytics/server.js.map +1 -1
  94. package/dist/features/analytics/server.mjs +6 -4
  95. package/dist/features/analytics/server.mjs.map +1 -1
  96. package/dist/features/help/index.d.mts +2 -2
  97. package/dist/features/help/index.d.ts +2 -2
  98. package/dist/features/help/index.js +39 -38
  99. package/dist/features/help/index.js.map +1 -1
  100. package/dist/features/help/index.mjs +5 -4
  101. package/dist/features/help/index.mjs.map +1 -1
  102. package/dist/features/tokenusage/index.d.mts +2 -2
  103. package/dist/features/tokenusage/index.d.ts +2 -2
  104. package/dist/features/tokenusage/index.js +127 -126
  105. package/dist/features/tokenusage/index.js.map +1 -1
  106. package/dist/features/tokenusage/index.mjs +6 -5
  107. package/dist/features/tokenusage/index.mjs.map +1 -1
  108. package/dist/index.d.mts +5 -5
  109. package/dist/index.d.ts +5 -5
  110. package/dist/index.js +8 -6
  111. package/dist/index.js.map +1 -1
  112. package/dist/index.mjs +11 -9
  113. package/dist/next-config/index.d.mts +43 -0
  114. package/dist/next-config/index.d.ts +43 -0
  115. package/dist/next-config/index.js +230 -0
  116. package/dist/next-config/index.js.map +1 -0
  117. package/dist/next-config/index.mjs +230 -0
  118. package/dist/next-config/index.mjs.map +1 -0
  119. package/dist/{request-FXF63NSQ.mjs → request-3IUMNVOS.mjs} +2 -2
  120. package/dist/request-LZBAOT3Y.js +8 -0
  121. package/dist/request-LZBAOT3Y.js.map +1 -0
  122. package/dist/server/cachedGet.d.mts +28 -0
  123. package/dist/server/cachedGet.d.ts +28 -0
  124. package/dist/server/cachedGet.js +60 -0
  125. package/dist/server/cachedGet.js.map +1 -0
  126. package/dist/server/cachedGet.mjs +60 -0
  127. package/dist/server/cachedGet.mjs.map +1 -0
  128. package/dist/server/cachedGet.stub.d.mts +7 -0
  129. package/dist/server/cachedGet.stub.d.ts +7 -0
  130. package/dist/server/cachedGet.stub.js +17 -0
  131. package/dist/server/cachedGet.stub.js.map +1 -0
  132. package/dist/server/cachedGet.stub.mjs +17 -0
  133. package/dist/server/cachedGet.stub.mjs.map +1 -0
  134. package/dist/server/index.d.mts +27 -25
  135. package/dist/server/index.d.ts +27 -25
  136. package/dist/server/index.js +13 -6
  137. package/dist/server/index.js.map +1 -1
  138. package/dist/server/index.mjs +15 -8
  139. package/dist/testing/index.js.map +1 -1
  140. package/dist/testing/index.mjs.map +1 -1
  141. package/dist/{types-D0uLYV2P.d.mts → types-Bq_UA8Lg.d.mts} +1 -1
  142. package/dist/{types-Cn153-mH.d.ts → types-bsm8Fp55.d.ts} +1 -1
  143. package/dist/{usePageUrlGenerator-B-3FRKBD.d.ts → usePageUrlGenerator-J_ECv-oQ.d.ts} +1 -1
  144. package/dist/{usePageUrlGenerator-CCJ_cdQy.d.mts → usePageUrlGenerator-uKBjAKqC.d.mts} +1 -1
  145. package/package.json +12 -1
  146. package/src/components/forms/__tests__/EditorSheet.test.tsx +25 -1
  147. package/src/components/forms/__tests__/useEditorDialog.test.ts +164 -1
  148. package/src/components/forms/useEditorDialog.ts +69 -2
  149. package/src/contexts/SessionContext.tsx +20 -0
  150. package/src/contexts/SocketContext.tsx +30 -3
  151. package/src/contexts/ViewportContext.tsx +17 -2
  152. package/src/contexts/__tests__/SessionContext.test.tsx +58 -0
  153. package/src/contexts/__tests__/SocketContext.session.test.tsx +77 -0
  154. package/src/contexts/index.ts +1 -0
  155. package/src/core/abstracts/AbstractService.ts +4 -6
  156. package/src/core/abstracts/__tests__/AbstractService.locale.test.ts +64 -0
  157. package/src/features/analytics/components/server/AnalyticsAdminPage.tsx +5 -1
  158. package/src/features/analytics/components/server/AnalyticsJourneyPage.tsx +5 -1
  159. package/src/features/company/hooks/useSubscriptionStatus.ts +6 -1
  160. package/src/features/notification/contexts/NotificationContext.tsx +5 -2
  161. package/src/features/notification/contexts/__tests__/NotificationContext.spec.tsx +22 -0
  162. package/src/features/user/contexts/CurrentUserContext.tsx +7 -5
  163. package/src/features/user/contexts/__tests__/CurrentUserContext.spec.tsx +63 -3
  164. package/src/hooks/__tests__/useSocket.render.test.ts +22 -0
  165. package/src/hooks/useSocket.ts +0 -1
  166. package/src/i18n/__tests__/config.test.ts +27 -0
  167. package/src/i18n/config.ts +17 -0
  168. package/src/i18n/index.ts +2 -0
  169. package/src/next-config/__tests__/createNextConfig.test.ts +268 -0
  170. package/src/next-config/csp.ts +128 -0
  171. package/src/next-config/headers.ts +61 -0
  172. package/src/next-config/index.ts +114 -0
  173. package/src/server/JsonApiServer.ts +3 -1
  174. package/src/server/ServerSession.ts +29 -1
  175. package/src/server/__tests__/JsonApiServer.test.ts +41 -0
  176. package/src/server/__tests__/ServerSession.read.test.ts +67 -0
  177. package/src/server/__tests__/cache.test.ts +48 -0
  178. package/src/server/__tests__/cachedGet.test.ts +125 -0
  179. package/src/server/__tests__/request.test.ts +96 -1
  180. package/src/server/cache.ts +21 -4
  181. package/src/server/cacheDigest.ts +10 -0
  182. package/src/server/cacheProfiles.ts +15 -0
  183. package/src/server/cachedGet.stub.ts +15 -0
  184. package/src/server/cachedGet.ts +80 -0
  185. package/src/server/request.ts +33 -32
  186. package/src/shadcnui/ui/__tests__/sidebar.menu-skeleton.test.tsx +50 -0
  187. package/src/shadcnui/ui/__tests__/sidebar.session.test.tsx +133 -0
  188. package/src/shadcnui/ui/sidebar.tsx +121 -18
  189. package/src/testing/matchers/jsonApiMatchers.ts +1 -0
  190. package/src/unified/JsonApiRequest.ts +4 -1
  191. package/src/unified/__tests__/JsonApiGet.cache.test.ts +51 -0
  192. package/src/utils/__tests__/map-thenable.test.ts +29 -0
  193. package/src/utils/__tests__/use-mobile.test.tsx +102 -1
  194. package/src/utils/map-thenable.ts +15 -0
  195. package/src/utils/use-mobile.tsx +13 -4
  196. package/dist/BlockNoteEditor-ATZVHS6X.js.map +0 -1
  197. package/dist/JsonApiRequest-TE5WD3WS.js +0 -26
  198. package/dist/chunk-26MQIJNB.js.map +0 -1
  199. package/dist/chunk-2IMQ5IKA.mjs.map +0 -1
  200. package/dist/chunk-4Z45NYPR.js.map +0 -1
  201. package/dist/chunk-5TRFNKJS.js.map +0 -1
  202. package/dist/chunk-7B4E42R5.mjs.map +0 -1
  203. package/dist/chunk-CAKOFJZD.js.map +0 -1
  204. package/dist/chunk-E3I4MT53.mjs.map +0 -1
  205. package/dist/chunk-GHFMKH3M.js.map +0 -1
  206. package/dist/chunk-Q6J2ICKO.mjs.map +0 -1
  207. package/dist/chunk-SJLXPHK5.mjs.map +0 -1
  208. package/dist/chunk-YDPDJIJF.js.map +0 -1
  209. package/dist/request-ZTX6I63X.js +0 -8
  210. package/dist/request-ZTX6I63X.js.map +0 -1
  211. /package/dist/{BlockNoteViewer-KRTAFTUX.mjs.map → BlockNoteViewer-DQYT6IJW.mjs.map} +0 -0
  212. /package/dist/{JsonApiRequest-UHOWNI3O.mjs.map → JsonApiRequest-MEP6AXDT.mjs.map} +0 -0
  213. /package/dist/{chunk-U65JPKO3.mjs.map → chunk-R6ZYB4VN.mjs.map} +0 -0
  214. /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
- var cacheLifeToSeconds = {
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-SJLXPHK5.mjs.map
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 _chunk5TRFNKJSjs = require('./chunk-5TRFNKJS.js');
3
+ var _chunkYUO55Q5Ajs = require('./chunk-YUO55Q5A.js');
4
4
 
5
5
 
6
- var _chunkYUO55Q5Ajs = require('./chunk-YUO55Q5A.js');
6
+ var _chunk6TUB7Y6Tjs = require('./chunk-6TUB7Y6T.js');
7
+
8
+
9
+ var _chunkG4JR3SFVjs = require('./chunk-G4JR3SFV.js');
10
+
7
11
 
8
12
 
9
- var _chunkCAKOFJZDjs = require('./chunk-CAKOFJZD.js');
13
+ var _chunk6OFANJTEjs = require('./chunk-6OFANJTE.js');
10
14
 
11
15
 
12
16
 
13
17
 
14
- var _chunk26MQIJNBjs = require('./chunk-26MQIJNB.js');
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', _ => _.get, 'call', _2 => _2("companyId"), 'optionalAccess', _3 => _3.value]), () => ( ""));
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', _4 => _4.get, 'call', _5 => _5("userId"), 'optionalAccess', _6 => _6.value]), () => ( ""));
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', _7 => _7.get, 'call', _8 => _8("roles"), 'optionalAccess', _9 => _9.value]);
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', _10 => _10.get, 'call', _11 => _11("features"), 'optionalAccess', _12 => _12.value]);
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', _13 => _13.get, 'call', _14 => _14("features"), 'optionalAccess', _15 => _15.value]);
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', _16 => _16.get, 'call', _17 => _17("modules"), 'optionalAccess', _18 => _18.value]);
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 _chunkCAKOFJZDjs.checkPermissionsFromServer.call(void 0, {
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', _19 => _19.apiUrl])) {
122
+ if (_optionalChain([_serverConfig, 'optionalAccess', _31 => _31.apiUrl])) {
100
123
  return _serverConfig.apiUrl;
101
124
  }
102
- const envUrl = _chunk26MQIJNBjs.ENV.API_URL;
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', _20 => _20.appUrl])) {
135
+ if (_optionalChain([_serverConfig, 'optionalAccess', _32 => _32.appUrl])) {
113
136
  return _serverConfig.appUrl;
114
137
  }
115
- const envUrl = _chunk26MQIJNBjs.ENV.APP_URL;
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', _21 => _21.trackablePages]), () => ( []));
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', _22 => _22.bootstrapper])) {
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 _chunk5TRFNKJSjs.serverRequest.call(void 0, {
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', _23 => _23.additionalHeaders])
172
+ additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess', _35 => _35.additionalHeaders])
150
173
  });
151
- return _chunk26MQIJNBjs.translateResponse.call(void 0, {
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 = _chunk26MQIJNBjs.JsonApiDataFactory.create(params.classKey, body);
195
+ body = _chunkWGVNJXZOjs.JsonApiDataFactory.create(params.classKey, body);
173
196
  }
174
- const apiResponse = await _chunk5TRFNKJSjs.serverRequest.call(void 0, {
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', _24 => _24.additionalHeaders])
205
+ additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess', _36 => _36.additionalHeaders])
183
206
  });
184
- return _chunk26MQIJNBjs.translateResponse.call(void 0, {
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 = _chunk26MQIJNBjs.JsonApiDataFactory.create(params.classKey, body);
222
+ body = _chunkWGVNJXZOjs.JsonApiDataFactory.create(params.classKey, body);
200
223
  }
201
- const apiResponse = await _chunk5TRFNKJSjs.serverRequest.call(void 0, {
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', _25 => _25.additionalHeaders])
232
+ additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess', _37 => _37.additionalHeaders])
210
233
  });
211
- return _chunk26MQIJNBjs.translateResponse.call(void 0, {
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 = _chunk26MQIJNBjs.JsonApiDataFactory.create(params.classKey, body);
249
+ body = _chunkWGVNJXZOjs.JsonApiDataFactory.create(params.classKey, body);
227
250
  }
228
- const apiResponse = await _chunk5TRFNKJSjs.serverRequest.call(void 0, {
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', _26 => _26.additionalHeaders])
259
+ additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess', _38 => _38.additionalHeaders])
237
260
  });
238
- return _chunk26MQIJNBjs.translateResponse.call(void 0, {
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 _chunk5TRFNKJSjs.serverRequest.call(void 0, {
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', _27 => _27.additionalHeaders])
278
+ additionalHeaders: _optionalChain([_serverConfig, 'optionalAccess', _39 => _39.additionalHeaders])
256
279
  });
257
- return _chunk26MQIJNBjs.translateResponse.call(void 0, {
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
- exports.invalidateCacheTag = invalidateCacheTag; exports.invalidateCacheTags = invalidateCacheTags; 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;
280
- //# sourceMappingURL=chunk-GHFMKH3M.js.map
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"]}