@carlonicora/nextjs-jsonapi 6.21.0 → 6.23.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 (182) hide show
  1. package/dist/{BlockNoteEditor-NXCRWS2O.js → BlockNoteEditor-PPRML5CO.js} +23 -23
  2. package/dist/{BlockNoteEditor-NXCRWS2O.js.map → BlockNoteEditor-PPRML5CO.js.map} +1 -1
  3. package/dist/{BlockNoteEditor-66ZACETR.mjs → BlockNoteEditor-UO4ZRCUM.mjs} +8 -8
  4. package/dist/{BlockNoteViewer-2UDFTXRS.mjs → BlockNoteViewer-2TJZ6JET.mjs} +6 -6
  5. package/dist/{BlockNoteViewer-4OHBRE4Q.js → BlockNoteViewer-K2HBF3IP.js} +7 -7
  6. package/dist/{BlockNoteViewer-4OHBRE4Q.js.map → BlockNoteViewer-K2HBF3IP.js.map} +1 -1
  7. package/dist/{JsonApiRequest-IKKHWCPB.mjs → JsonApiRequest-ADLBJ5RX.mjs} +2 -2
  8. package/dist/JsonApiRequest-KC6DOHKT.js +26 -0
  9. package/dist/{JsonApiRequest-G4J2WTSU.js.map → JsonApiRequest-KC6DOHKT.js.map} +1 -1
  10. package/dist/billing/index.js +495 -495
  11. package/dist/billing/index.mjs +7 -7
  12. package/dist/{chunk-N5ZE2Z6I.js → chunk-53SD4YRF.js} +5 -5
  13. package/dist/{chunk-N5ZE2Z6I.js.map → chunk-53SD4YRF.js.map} +1 -1
  14. package/dist/{chunk-4RA5PRXX.mjs → chunk-7OIWOPM5.mjs} +2 -2
  15. package/dist/{chunk-WCEYT3GG.js → chunk-A5M3MORY.js} +6 -3
  16. package/dist/chunk-A5M3MORY.js.map +1 -0
  17. package/dist/{chunk-AUD6ZLBB.mjs → chunk-BE6UMM5X.mjs} +13 -8
  18. package/dist/chunk-BE6UMM5X.mjs.map +1 -0
  19. package/dist/{chunk-KV4N7DEG.js → chunk-BQ2WAG4K.js} +29 -24
  20. package/dist/chunk-BQ2WAG4K.js.map +1 -0
  21. package/dist/{chunk-OQQ7CZWT.js → chunk-GMMDXINC.js} +12 -12
  22. package/dist/{chunk-OQQ7CZWT.js.map → chunk-GMMDXINC.js.map} +1 -1
  23. package/dist/{chunk-ZB6OYIMB.js → chunk-HN7L6RRW.js} +1296 -1093
  24. package/dist/{chunk-DPXOPLQP.mjs.map → chunk-HN7L6RRW.js.map} +1 -1
  25. package/dist/{chunk-OHHA5BBX.mjs → chunk-HP6DT6K3.mjs} +17 -15
  26. package/dist/chunk-HP6DT6K3.mjs.map +1 -0
  27. package/dist/{chunk-JSHLBRFV.mjs → chunk-N2BFT7KI.mjs} +2 -2
  28. package/dist/chunk-N2BFT7KI.mjs.map +1 -0
  29. package/dist/{chunk-YWLSIIE6.js → chunk-P7L6OFX5.js} +11 -11
  30. package/dist/{chunk-YWLSIIE6.js.map → chunk-P7L6OFX5.js.map} +1 -1
  31. package/dist/{chunk-3CGU6WXY.js → chunk-R5722NLL.js} +926 -924
  32. package/dist/chunk-R5722NLL.js.map +1 -0
  33. package/dist/{chunk-GM4VZTWL.js → chunk-RCOKQ3R4.js} +14 -8
  34. package/dist/chunk-RCOKQ3R4.js.map +1 -0
  35. package/dist/{chunk-M3N7LPHX.mjs → chunk-S7SPAC6X.mjs} +6 -3
  36. package/dist/chunk-S7SPAC6X.mjs.map +1 -0
  37. package/dist/{chunk-54K2CZ2F.js → chunk-SO3YUCL6.js} +4 -4
  38. package/dist/{chunk-54K2CZ2F.js.map → chunk-SO3YUCL6.js.map} +1 -1
  39. package/dist/{chunk-DPXOPLQP.mjs → chunk-T6G2F2BK.mjs} +220 -17
  40. package/dist/chunk-T6G2F2BK.mjs.map +1 -0
  41. package/dist/{chunk-G2UIQSNJ.mjs → chunk-TMV7TL7O.mjs} +4 -4
  42. package/dist/{chunk-BD6ARGGI.js → chunk-TNTCLVUR.js} +15 -15
  43. package/dist/{chunk-BD6ARGGI.js.map → chunk-TNTCLVUR.js.map} +1 -1
  44. package/dist/{chunk-QIEF7HIL.mjs → chunk-VNUT2D27.mjs} +2 -2
  45. package/dist/{chunk-KTGKW72G.mjs → chunk-W4ML6D2X.mjs} +2 -2
  46. package/dist/{chunk-MQ7TXALH.mjs → chunk-YMCL3JXZ.mjs} +14 -8
  47. package/dist/chunk-YMCL3JXZ.mjs.map +1 -0
  48. package/dist/{chunk-QGVVF77L.js → chunk-YSE2Z4RB.js} +11 -11
  49. package/dist/{chunk-QGVVF77L.js.map → chunk-YSE2Z4RB.js.map} +1 -1
  50. package/dist/{chunk-A3RB47X4.mjs → chunk-YTDGYI62.mjs} +3 -3
  51. package/dist/client/JsonApiClient.d.ts +5 -0
  52. package/dist/client/JsonApiClient.d.ts.map +1 -1
  53. package/dist/client/index.js +8 -8
  54. package/dist/client/index.mjs +7 -7
  55. package/dist/client/request.d.ts +5 -0
  56. package/dist/client/request.d.ts.map +1 -1
  57. package/dist/components/index.js +8 -8
  58. package/dist/components/index.mjs +7 -7
  59. package/dist/contexts/index.js +8 -8
  60. package/dist/contexts/index.mjs +7 -7
  61. package/dist/core/abstracts/AbstractService.d.ts +5 -0
  62. package/dist/core/abstracts/AbstractService.d.ts.map +1 -1
  63. package/dist/core/abstracts/ClientAbstractService.d.ts +5 -0
  64. package/dist/core/abstracts/ClientAbstractService.d.ts.map +1 -1
  65. package/dist/core/index.d.ts +2 -0
  66. package/dist/core/index.d.ts.map +1 -1
  67. package/dist/core/index.js +24 -6
  68. package/dist/core/index.js.map +1 -1
  69. package/dist/core/index.mjs +23 -5
  70. package/dist/core/registry/ModuleRegistry.d.ts +3 -0
  71. package/dist/core/registry/ModuleRegistry.d.ts.map +1 -1
  72. package/dist/email-automations/index.js +121 -121
  73. package/dist/email-automations/index.mjs +7 -7
  74. package/dist/features/analytics/index.js +139 -139
  75. package/dist/features/analytics/index.mjs +7 -7
  76. package/dist/features/analytics/server.js +9 -9
  77. package/dist/features/analytics/server.mjs +7 -7
  78. package/dist/features/blog/index.js +154 -154
  79. package/dist/features/blog/index.mjs +7 -7
  80. package/dist/features/blog/server.js +27 -27
  81. package/dist/features/blog/server.mjs +6 -6
  82. package/dist/features/discord-connection/data/discord-connect-confirmation.d.ts +11 -0
  83. package/dist/features/discord-connection/data/discord-connect-confirmation.d.ts.map +1 -0
  84. package/dist/features/discord-connection/data/discord-connect-confirmation.interface.d.ts +14 -0
  85. package/dist/features/discord-connection/data/discord-connect-confirmation.interface.d.ts.map +1 -0
  86. package/dist/features/discord-connection/data/discord-connect-confirmation.service.d.ts +10 -0
  87. package/dist/features/discord-connection/data/discord-connect-confirmation.service.d.ts.map +1 -0
  88. package/dist/features/discord-connection/data/discord-connect-intent.d.ts +11 -0
  89. package/dist/features/discord-connection/data/discord-connect-intent.d.ts.map +1 -0
  90. package/dist/features/discord-connection/data/discord-connect-intent.interface.d.ts +15 -0
  91. package/dist/features/discord-connection/data/discord-connect-intent.interface.d.ts.map +1 -0
  92. package/dist/features/discord-connection/data/discord-connect-intent.service.d.ts +11 -0
  93. package/dist/features/discord-connection/data/discord-connect-intent.service.d.ts.map +1 -0
  94. package/dist/features/discord-connection/data/discord-connection.d.ts +14 -0
  95. package/dist/features/discord-connection/data/discord-connection.d.ts.map +1 -0
  96. package/dist/features/discord-connection/data/discord-connection.interface.d.ts +10 -0
  97. package/dist/features/discord-connection/data/discord-connection.interface.d.ts.map +1 -0
  98. package/dist/features/discord-connection/data/discord-connection.service.d.ts +12 -0
  99. package/dist/features/discord-connection/data/discord-connection.service.d.ts.map +1 -0
  100. package/dist/features/discord-connection/data/index.d.ts +10 -0
  101. package/dist/features/discord-connection/data/index.d.ts.map +1 -0
  102. package/dist/features/discord-connection/discord-connection.module.d.ts +5 -0
  103. package/dist/features/discord-connection/discord-connection.module.d.ts.map +1 -0
  104. package/dist/features/discord-connection/index.d.ts +3 -0
  105. package/dist/features/discord-connection/index.d.ts.map +1 -0
  106. package/dist/features/help/index.js +41 -41
  107. package/dist/features/help/index.mjs +7 -7
  108. package/dist/features/tokenusage/index.js +130 -130
  109. package/dist/features/tokenusage/index.mjs +7 -7
  110. package/dist/features/user/contexts/UserContext.d.ts.map +1 -1
  111. package/dist/index.d.ts +1 -1
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +27 -7
  114. package/dist/index.js.map +1 -1
  115. package/dist/index.mjs +26 -6
  116. package/dist/local-transport-MJPOKPTU.js +15 -0
  117. package/dist/{local-transport-4YDJ6FQG.js.map → local-transport-MJPOKPTU.js.map} +1 -1
  118. package/dist/{local-transport-C7YTA4I7.mjs → local-transport-RVD4FZGA.mjs} +5 -5
  119. package/dist/offline/index.js +51 -51
  120. package/dist/offline/index.mjs +6 -6
  121. package/dist/{request-66FGJIHB.mjs → request-4AWGPIGH.mjs} +2 -2
  122. package/dist/{request-6W6UGKJV.js → request-H5FZBZA2.js} +3 -3
  123. package/dist/{request-6W6UGKJV.js.map → request-H5FZBZA2.js.map} +1 -1
  124. package/dist/server/index.js +8 -8
  125. package/dist/server/index.mjs +7 -7
  126. package/dist/unified/JsonApiRequest.d.ts +5 -0
  127. package/dist/unified/JsonApiRequest.d.ts.map +1 -1
  128. package/dist/write-through-7I3LA2WN.mjs +15 -0
  129. package/dist/write-through-HE2QSOVI.js +15 -0
  130. package/dist/{write-through-BAPS24GL.js.map → write-through-HE2QSOVI.js.map} +1 -1
  131. package/package.json +1 -1
  132. package/src/client/JsonApiClient.ts +10 -0
  133. package/src/client/__tests__/request.credentials.spec.ts +103 -0
  134. package/src/client/request.ts +9 -0
  135. package/src/components/forms/EditorSheet.tsx +2 -2
  136. package/src/components/forms/__tests__/EditorSheet.spec.tsx +16 -0
  137. package/src/core/abstracts/AbstractService.ts +10 -0
  138. package/src/core/abstracts/ClientAbstractService.ts +10 -0
  139. package/src/core/index.ts +3 -0
  140. package/src/core/registry/ModuleRegistry.ts +4 -0
  141. package/src/features/discord-connection/data/__tests__/DiscordConnection.spec.ts +114 -0
  142. package/src/features/discord-connection/data/discord-connect-confirmation.interface.ts +16 -0
  143. package/src/features/discord-connection/data/discord-connect-confirmation.service.ts +21 -0
  144. package/src/features/discord-connection/data/discord-connect-confirmation.ts +46 -0
  145. package/src/features/discord-connection/data/discord-connect-intent.interface.ts +16 -0
  146. package/src/features/discord-connection/data/discord-connect-intent.service.ts +20 -0
  147. package/src/features/discord-connection/data/discord-connect-intent.ts +42 -0
  148. package/src/features/discord-connection/data/discord-connection.interface.ts +10 -0
  149. package/src/features/discord-connection/data/discord-connection.service.ts +17 -0
  150. package/src/features/discord-connection/data/discord-connection.ts +41 -0
  151. package/src/features/discord-connection/data/index.ts +9 -0
  152. package/src/features/discord-connection/discord-connection.module.ts +28 -0
  153. package/src/features/discord-connection/index.ts +2 -0
  154. package/src/features/oauth/components/OAuthClientDetail.tsx +1 -1
  155. package/src/features/user/contexts/UserContext.tsx +6 -2
  156. package/src/index.ts +1 -1
  157. package/src/unified/JsonApiRequest.ts +14 -0
  158. package/dist/JsonApiRequest-G4J2WTSU.js +0 -26
  159. package/dist/chunk-3CGU6WXY.js.map +0 -1
  160. package/dist/chunk-AUD6ZLBB.mjs.map +0 -1
  161. package/dist/chunk-GM4VZTWL.js.map +0 -1
  162. package/dist/chunk-JSHLBRFV.mjs.map +0 -1
  163. package/dist/chunk-KV4N7DEG.js.map +0 -1
  164. package/dist/chunk-M3N7LPHX.mjs.map +0 -1
  165. package/dist/chunk-MQ7TXALH.mjs.map +0 -1
  166. package/dist/chunk-OHHA5BBX.mjs.map +0 -1
  167. package/dist/chunk-WCEYT3GG.js.map +0 -1
  168. package/dist/chunk-ZB6OYIMB.js.map +0 -1
  169. package/dist/local-transport-4YDJ6FQG.js +0 -15
  170. package/dist/write-through-BAPS24GL.js +0 -15
  171. package/dist/write-through-IWQKXYHE.mjs +0 -15
  172. /package/dist/{BlockNoteEditor-66ZACETR.mjs.map → BlockNoteEditor-UO4ZRCUM.mjs.map} +0 -0
  173. /package/dist/{BlockNoteViewer-2UDFTXRS.mjs.map → BlockNoteViewer-2TJZ6JET.mjs.map} +0 -0
  174. /package/dist/{JsonApiRequest-IKKHWCPB.mjs.map → JsonApiRequest-ADLBJ5RX.mjs.map} +0 -0
  175. /package/dist/{chunk-4RA5PRXX.mjs.map → chunk-7OIWOPM5.mjs.map} +0 -0
  176. /package/dist/{chunk-G2UIQSNJ.mjs.map → chunk-TMV7TL7O.mjs.map} +0 -0
  177. /package/dist/{chunk-QIEF7HIL.mjs.map → chunk-VNUT2D27.mjs.map} +0 -0
  178. /package/dist/{chunk-KTGKW72G.mjs.map → chunk-W4ML6D2X.mjs.map} +0 -0
  179. /package/dist/{chunk-A3RB47X4.mjs.map → chunk-YTDGYI62.mjs.map} +0 -0
  180. /package/dist/{local-transport-C7YTA4I7.mjs.map → local-transport-RVD4FZGA.mjs.map} +0 -0
  181. /package/dist/{request-66FGJIHB.mjs.map → request-4AWGPIGH.mjs.map} +0 -0
  182. /package/dist/{write-through-IWQKXYHE.mjs.map → write-through-7I3LA2WN.mjs.map} +0 -0
@@ -292,7 +292,7 @@ _chunk7QVYU63Ejs.__name.call(void 0, getToken, "getToken");
292
292
  async function makeRequest(params) {
293
293
  if (typeof window !== "undefined") {
294
294
  if (!_directFetch) {
295
- const clientModule = await Promise.resolve().then(() => _interopRequireWildcard(require("./request-6W6UGKJV.js")));
295
+ const clientModule = await Promise.resolve().then(() => _interopRequireWildcard(require("./request-H5FZBZA2.js")));
296
296
  _directFetch = clientModule.directFetch;
297
297
  }
298
298
  return _directFetch({
@@ -303,7 +303,8 @@ async function makeRequest(params) {
303
303
  files: params.files,
304
304
  companyId: params.companyId,
305
305
  language: params.language,
306
- additionalHeaders: params.additionalHeaders
306
+ additionalHeaders: params.additionalHeaders,
307
+ credentials: params.credentials
307
308
  });
308
309
  } else {
309
310
  if (!_serverRequest) {
@@ -375,7 +376,8 @@ async function JsonApiGet(params) {
375
376
  cache: params.classKey.cache,
376
377
  companyId: params.companyId,
377
378
  language: params.language,
378
- additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _23 => _23.additionalHeaders])
379
+ additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _23 => _23.additionalHeaders]),
380
+ credentials: params.credentials
379
381
  });
380
382
  return translateResponse({
381
383
  classKey: params.classKey,
@@ -410,7 +412,8 @@ async function JsonApiPost(params) {
410
412
  files: params.files,
411
413
  companyId: params.companyId,
412
414
  language: params.language,
413
- additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _24 => _24.additionalHeaders])
415
+ additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _24 => _24.additionalHeaders]),
416
+ credentials: params.credentials
414
417
  });
415
418
  return translateResponse({
416
419
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
@@ -437,7 +440,8 @@ async function JsonApiPut(params) {
437
440
  files: params.files,
438
441
  companyId: params.companyId,
439
442
  language: params.language,
440
- additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _25 => _25.additionalHeaders])
443
+ additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _25 => _25.additionalHeaders]),
444
+ credentials: params.credentials
441
445
  });
442
446
  return translateResponse({
443
447
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
@@ -464,7 +468,8 @@ async function JsonApiPatch(params) {
464
468
  files: params.files,
465
469
  companyId: params.companyId,
466
470
  language: params.language,
467
- additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _26 => _26.additionalHeaders])
471
+ additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _26 => _26.additionalHeaders]),
472
+ credentials: params.credentials
468
473
  });
469
474
  return translateResponse({
470
475
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
@@ -483,7 +488,8 @@ async function JsonApiDelete(params) {
483
488
  token,
484
489
  companyId: params.companyId,
485
490
  language: params.language,
486
- additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _27 => _27.additionalHeaders])
491
+ additionalHeaders: _optionalChain([_staticConfig, 'optionalAccess', _27 => _27.additionalHeaders]),
492
+ credentials: params.credentials
487
493
  });
488
494
  return translateResponse({
489
495
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
@@ -516,4 +522,4 @@ _chunk7QVYU63Ejs.__name.call(void 0, JsonApiDelete, "JsonApiDelete");
516
522
 
517
523
 
518
524
  exports.ENV = ENV; exports.DataClassRegistry = DataClassRegistry; exports.JsonApiDataFactory = JsonApiDataFactory; exports.setBootstrapper = setBootstrapper; exports.getBootstrapper = getBootstrapper; exports.tryBootstrap = tryBootstrap; exports.hasBootstrapper = hasBootstrapper; exports.resetBootstrapStore = resetBootstrapStore; exports.translateData = translateData; exports.translateResponse = translateResponse; exports.configureJsonApi = configureJsonApi; exports.getApiUrl = getApiUrl; exports.getAppUrl = getAppUrl; exports.getTrackablePages = getTrackablePages; exports.buildUrl = buildUrl; exports.JsonApiGet = JsonApiGet; exports.JsonApiPost = JsonApiPost; exports.JsonApiPut = JsonApiPut; exports.JsonApiPatch = JsonApiPatch; exports.JsonApiDelete = JsonApiDelete;
519
- //# sourceMappingURL=chunk-GM4VZTWL.js.map
525
+ //# sourceMappingURL=chunk-RCOKQ3R4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-RCOKQ3R4.js","../src/core/env.ts","../src/core/registry/DataClassRegistry.ts","../src/core/factories/JsonApiDataFactory.ts","../src/core/registry/bootstrapStore.ts","../src/core/utils/translateResponse.ts","../src/unified/JsonApiRequest.ts"],"names":[],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-RCOKQ3R4.js","sourcesContent":[null,"/**\n * The single place in this package that reads `process.env`.\n *\n * Everything else imports {@link ENV}. Centralising the reads keeps every\n * default in one place — the same contract `base.config.ts` provides on the\n * NestJS side — instead of scattering `process.env.X || \"…\"` across hooks,\n * clients and components where the fallbacks silently drift apart.\n *\n * WHY THE READS MUST STAY LITERAL: Next.js inlines `NEXT_PUBLIC_*` by textual\n * substitution at build time, replacing the exact expression\n * `process.env.NEXT_PUBLIC_FOO` with a string literal. A computed lookup\n * (`process.env[key]`) is NOT substituted and reads as `undefined` in the\n * browser bundle. Every entry below therefore spells its variable out in full,\n * and new entries must do the same.\n *\n * WHY GETTERS AND NOT PLAIN PROPERTIES: every call site this replaced read\n * `process.env` at CALL time, not at import time. A plain property would freeze\n * the value when the module is first imported, which breaks any consumer that\n * assigns the variable after boot — the package's own tests do exactly that.\n * Getters keep the read lazy while leaving the expression literal, so the build\n * time substitution still applies.\n *\n * Because that substitution happens before the code runs, no reference to\n * `process` survives into the client bundle — so this module is safe to import\n * from client components, server components, route handlers and middleware\n * alike. It deliberately carries no `\"use client\"` directive for that reason.\n *\n * Values are normalised (empty string rather than `undefined`, booleans rather\n * than string comparisons) so callers never repeat the parsing. Callers that\n * must distinguish \"unset\" from \"set to empty\" — the URL getters, which throw a\n * configuration error — check for an empty string.\n */\nexport const ENV = {\n /** Public API base URL (NEXT_PUBLIC_API_URL). Empty when unset. */\n get API_URL(): string {\n return process.env.NEXT_PUBLIC_API_URL ?? \"\";\n },\n /** Public app base URL (NEXT_PUBLIC_ADDRESS). Empty when unset. */\n get APP_URL(): string {\n return process.env.NEXT_PUBLIC_ADDRESS ?? \"\";\n },\n /**\n * Alternative app base URL (NEXT_PUBLIC_APP_URL), used only by\n * `client/config.ts`'s `getAppUrl()` before it falls back to\n * `window.location.origin`. Empty when unset.\n */\n get APP_URL_ALTERNATE(): string {\n return process.env.NEXT_PUBLIC_APP_URL ?? \"\";\n },\n /** Web-push VAPID public key (NEXT_PUBLIC_VAPID_PUBLIC_KEY). Empty when unset. */\n get VAPID_PUBLIC_KEY(): string {\n return process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY ?? \"\";\n },\n /** Google Maps JS key (NEXT_PUBLIC_GOOGLE_MAPS_API_KEY). Empty disables autocomplete. */\n get GOOGLE_MAPS_API_KEY(): string {\n return process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ?? \"\";\n },\n /**\n * NEXT_PUBLIC_PRIVATE_INSTALLATION === \"true\", case-insensitively\n * (default false). A private installation is a single-tenant deployment.\n */\n get PRIVATE_INSTALLATION(): boolean {\n return process.env.NEXT_PUBLIC_PRIVATE_INSTALLATION?.toLowerCase() === \"true\";\n },\n /** NODE_ENV === \"production\" — set by the Next build, not by `.env`. */\n get IS_PRODUCTION(): boolean {\n return process.env.NODE_ENV === \"production\";\n },\n /** NODE_ENV === \"development\" — gates verbose client-side diagnostics. */\n get IS_DEVELOPMENT(): boolean {\n return process.env.NODE_ENV === \"development\";\n },\n};\n","import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\n\nexport class DataClassRegistry {\n // Use Map with string key (module.name) for reliable lookup\n // String keys are stable across HMR and module re-evaluations\n // Note: WeakMap with object identity was tried but fails during Next.js navigation\n // because module re-evaluation creates new object instances with different identity\n private static _map = new Map<string, { new (): ApiDataInterface }>();\n\n public static registerObjectClass(\n key: ApiRequestDataTypeInterface,\n classConstructor: { new (): ApiDataInterface },\n ): void {\n // Last registration wins. An earlier version skipped re-registration, which\n // silently pinned the registry to the FIRST constructor seen by the process.\n // In dev that made a long-lived `next dev` server keep rehydrating with the\n // pre-edit class after any model change, so SSR produced a different tree\n // from the freshly bundled client and React threw a hydration mismatch.\n // Production is unaffected either way: bootstrap runs once per process.\n this._map.set(key.name, classConstructor);\n }\n\n public static get(classKey: ApiRequestDataTypeInterface): {\n new (): ApiDataInterface;\n } {\n const response = this._map.get(classKey.name);\n if (!response) {\n throw new Error(\n `Class not registered for key: ${typeof classKey === \"string\" ? classKey : classKey.name}. Ensure bootstrap() was called.`,\n );\n }\n\n return response;\n }\n\n /**\n * Get class constructor by JSON:API type name.\n * Used for polymorphic rehydration where the type is determined at runtime.\n */\n public static getByJsonApiType(typeName: string): { new (): ApiDataInterface } | undefined {\n return this._map.get(typeName);\n }\n\n /**\n * Bootstrap the registry with all modules.\n * This is a convenience method for apps to register all their modules at once.\n *\n * @param modules - An object with module definitions (like the app's Modules class)\n */\n public static bootstrap(modules: Record<string, ApiRequestDataTypeInterface>): void {\n Object.values(modules).forEach((module) => {\n if (module && module.model) {\n this.registerObjectClass(module, module.model);\n }\n });\n }\n\n /**\n * Clear all registered classes. Useful for testing.\n */\n public static clear(): void {\n this._map.clear();\n }\n}\n\n// Export alias for backward compatibility\nexport { DataClassRegistry as DataClass };\n","import { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { DataClassRegistry } from \"../registry/DataClassRegistry\";\n\nexport class JsonApiDataFactory {\n public static create(classKey: ApiRequestDataTypeInterface, data: any): any {\n const factoryClass = DataClassRegistry.get(classKey);\n\n const instance = new factoryClass() as ApiDataInterface;\n const result = instance.createJsonApi(data);\n return result;\n }\n}\n","/**\n * Centralized bootstrap store accessible from ModuleRegistry.\n * This file has NO external dependencies to avoid circular imports.\n *\n * The bootstrap store allows ModuleRegistry to call the app's bootstrapper\n * when modules are accessed before bootstrap() was called, providing\n * self-healing behavior for module evaluation order issues.\n *\n * IMPORTANT: We use globalThis to persist state across HMR/Turbopack\n * module re-evaluations in development mode. Without this, the bootstrapper\n * reference would be lost when modules are hot-reloaded, causing\n * \"Module not registered\" errors during navigation.\n */\n\ntype BootstrapperFn = () => void;\n\n// Symbol key to avoid conflicts with other globals\nconst BOOTSTRAP_KEY = Symbol.for(\"nextjs-jsonapi:bootstrapper\");\nconst BOOTSTRAP_ATTEMPTED_KEY = Symbol.for(\"nextjs-jsonapi:bootstrapAttempted\");\n\n// Use globalThis to persist across HMR reloads\nconst globalStore = globalThis as unknown as {\n [BOOTSTRAP_KEY]?: BootstrapperFn | null;\n [BOOTSTRAP_ATTEMPTED_KEY]?: boolean;\n};\n\n// Initialize from global if not set\nif (globalStore[BOOTSTRAP_KEY] === undefined) {\n globalStore[BOOTSTRAP_KEY] = null;\n}\nif (globalStore[BOOTSTRAP_ATTEMPTED_KEY] === undefined) {\n globalStore[BOOTSTRAP_ATTEMPTED_KEY] = false;\n}\n\n// Getters/setters that use the global store\nfunction getBootstrapperInternal(): BootstrapperFn | null {\n return globalStore[BOOTSTRAP_KEY] ?? null;\n}\n\nfunction setBootstrapperInternal(fn: BootstrapperFn | null): void {\n globalStore[BOOTSTRAP_KEY] = fn;\n}\n\nfunction getBootstrapAttempted(): boolean {\n return globalStore[BOOTSTRAP_ATTEMPTED_KEY] ?? false;\n}\n\nfunction setBootstrapAttempted(value: boolean): void {\n globalStore[BOOTSTRAP_ATTEMPTED_KEY] = value;\n}\n\n/**\n * Register the bootstrapper function.\n * Called by configureJsonApi() from client/config, client/JsonApiClient, or unified/JsonApiRequest.\n */\nexport function setBootstrapper(fn: BootstrapperFn): void {\n setBootstrapperInternal(fn);\n}\n\n/**\n * Get the registered bootstrapper function.\n * Returns null if no bootstrapper has been registered.\n */\nexport function getBootstrapper(): BootstrapperFn | null {\n return getBootstrapperInternal();\n}\n\n/**\n * Attempt to run the bootstrapper if one is registered.\n * Returns true if bootstrapper was executed, false if not available.\n * Safe to call multiple times - bootstrapper is expected to be idempotent.\n */\nexport function tryBootstrap(): boolean {\n const bootstrapper = getBootstrapperInternal();\n const attempted = getBootstrapAttempted();\n\n if (attempted && !bootstrapper) {\n // Already tried and no bootstrapper available\n return false;\n }\n setBootstrapAttempted(true);\n\n if (bootstrapper) {\n bootstrapper();\n return true;\n }\n return false;\n}\n\n/**\n * Check if a bootstrapper has been registered.\n */\nexport function hasBootstrapper(): boolean {\n return getBootstrapperInternal() !== null;\n}\n\n/**\n * Reset the bootstrap store. Useful for testing.\n */\nexport function resetBootstrapStore(): void {\n setBootstrapperInternal(null);\n setBootstrapAttempted(false);\n}\n","import { ApiData } from \"../interfaces/ApiData\";\nimport { ApiDataInterface } from \"../interfaces/ApiDataInterface\";\nimport { ApiRequestDataTypeInterface } from \"../interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../interfaces/ApiResponseInterface\";\nimport { DataClassRegistry } from \"../registry/DataClassRegistry\";\n\n/**\n * Translates raw JSON:API data into typed objects.\n * Does not require API response metadata.\n */\nexport function translateData<T extends ApiDataInterface>(params: {\n classKey: ApiRequestDataTypeInterface;\n data: any;\n}): T | T[] {\n const factoryClass = DataClassRegistry.get(params.classKey);\n\n if (!factoryClass) {\n throw new Error(\n `Class not registered for key: ${typeof params.classKey === \"string\" ? params.classKey : params.classKey.name}`,\n );\n }\n\n const included: any = params.data.included ?? [];\n\n if (Array.isArray(params.data.data)) {\n const responseData: T[] = [];\n\n for (const data of params.data.data) {\n const object = new factoryClass();\n object.rehydrate({ jsonApi: data, included: included, allData: params.data.data });\n responseData.push(object as T);\n }\n\n return responseData as T[];\n } else {\n const responseData = new factoryClass();\n responseData.rehydrate({\n jsonApi: params.data.data,\n included: included,\n });\n\n return responseData as T;\n }\n}\n\n/**\n * Translates a full API response into a typed ApiResponseInterface.\n * Includes pagination support.\n */\nexport async function translateResponse<T extends ApiDataInterface>(params: {\n classKey: ApiRequestDataTypeInterface;\n apiResponse: ApiData;\n companyId?: string;\n language: string;\n paginationHandler?: (endpoint: string) => Promise<ApiResponseInterface>;\n}): Promise<ApiResponseInterface> {\n const response: ApiResponseInterface = {\n ok: true,\n response: 0,\n data: [],\n error: \"\",\n };\n\n const factoryClass = DataClassRegistry.get(params.classKey);\n\n if (!factoryClass) {\n throw new Error(\n `Class not registered for key: ${typeof params.classKey === \"string\" ? params.classKey : params.classKey.name}`,\n );\n }\n\n response.ok = params.apiResponse.ok;\n response.response = params.apiResponse.status;\n\n if (!params.apiResponse.ok) {\n // The nestjs-neo4jsonapi `HttpExceptionFilter` emits a JSON:API error document\n // (`errors: [{ status, title, detail, ... }]`), so `detail` is read first, then the legacy\n // `message`/`error` keys, then `statusText` (empty over HTTP/2).\n response.error =\n params.apiResponse?.data?.errors?.[0]?.detail ??\n params.apiResponse?.data?.message ??\n params.apiResponse?.data?.error ??\n params.apiResponse.statusText;\n response.raw = params.apiResponse.data;\n return response;\n }\n\n if (params.apiResponse.status === 204) return response;\n\n // A success with no body (e.g. a 200 from a handler that sends nothing —\n // @HttpCode is inert when a controller injects @Res, so \"204\" endpoints can\n // arrive as empty 200s) translates to an empty success, not a crash on\n // `.included` below.\n if (params.apiResponse.data === undefined || params.apiResponse.data === null) return response;\n\n response.raw = params.apiResponse.data;\n\n // Extract meta from JSON:API response\n if (params.apiResponse.data?.meta) {\n response.meta = params.apiResponse.data.meta;\n }\n\n try {\n // Check if response is JSON:API formatted (has a 'data' property)\n // If not, return the raw response data directly (e.g., { url: \"...\" } or { clientSecret: \"...\" })\n if (\n params.apiResponse.data &&\n typeof params.apiResponse.data === \"object\" &&\n !Array.isArray(params.apiResponse.data) &&\n params.apiResponse.data.data === undefined\n ) {\n response.data = params.apiResponse.data;\n return response;\n }\n\n const included: any = params.apiResponse.data.included ?? [];\n\n if (params.apiResponse.data.links) {\n response.self = params.apiResponse.data.links.self;\n\n if (params.apiResponse.data.links.next && params.paginationHandler) {\n response.next = params.apiResponse.data.links.next;\n response.nextPage = async () => params.paginationHandler!(params.apiResponse.data.links.next);\n }\n\n if (params.apiResponse.data.links.prev && params.paginationHandler) {\n response.prev = params.apiResponse.data.links.prev;\n response.prevPage = async () => params.paginationHandler!(params.apiResponse.data.links.prev);\n }\n }\n\n if (Array.isArray(params.apiResponse.data.data)) {\n const responseData: T[] = [];\n\n for (const data of params.apiResponse.data.data) {\n const object = new factoryClass();\n object.rehydrate({ jsonApi: data, included: included, allData: params.apiResponse.data.data });\n responseData.push(object as T);\n }\n\n response.data = responseData;\n } else {\n const responseData = new factoryClass();\n responseData.rehydrate({\n jsonApi: params.apiResponse.data.data,\n included: included,\n });\n\n response.data = responseData;\n }\n } catch (e) {\n console.error(e);\n }\n\n return response;\n}\n","import { ENV } from \"../core/env\";\nimport { JsonApiDataFactory } from \"../core/factories/JsonApiDataFactory\";\nimport { ApiData } from \"../core/interfaces/ApiData\";\nimport { ApiRequestDataTypeInterface } from \"../core/interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../core/interfaces/ApiResponseInterface\";\nimport { setBootstrapper } from \"../core/registry/bootstrapStore\";\nimport { translateResponse } from \"../core/utils/translateResponse\";\nimport { ModuleWithPermissions } from \"../permissions/types\";\n\n// Type definitions for dynamically imported functions (avoiding typeof import to prevent bundling)\ntype DirectFetchFn = (params: {\n method: string;\n url: string;\n token?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n credentials?: RequestCredentials;\n}) => Promise<ApiData>;\n\ntype ServerRequestFn = (params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n}) => Promise<ApiData>;\n\ntype GetTokenFn = () => Promise<string | undefined>;\n\n// These will be dynamically imported based on environment\nlet _directFetch: DirectFetchFn;\nlet _serverRequest: ServerRequestFn;\nlet _getClientToken: GetTokenFn;\nlet _getServerToken: GetTokenFn;\n\n// Config storage for non-React contexts\nlet _staticConfig: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n} | null = null;\n\n/**\n * Configure the JSON:API client for non-React contexts (e.g., server components).\n * For React contexts, use JsonApiProvider instead.\n */\nexport function configureJsonApi(config: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n}): void {\n _staticConfig = config;\n // Register and call bootstrapper to register all modules\n if (config.bootstrapper) {\n setBootstrapper(config.bootstrapper);\n config.bootstrapper();\n }\n}\n\nasync function getToken(): Promise<string | undefined> {\n if (typeof window === \"undefined\") {\n // Server-side\n if (!_getServerToken) {\n const serverModule = await import(\"../server/token\");\n _getServerToken = serverModule.getServerToken;\n }\n return _getServerToken();\n } else {\n // Client-side\n if (!_getClientToken) {\n const clientModule = await import(\"../client/token\");\n _getClientToken = clientModule.getClientToken;\n }\n return _getClientToken();\n }\n}\n\nasync function makeRequest(params: {\n method: string;\n url: string;\n token?: string;\n cache?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n /** Client-side only: forwarded to the browser `fetch`. Ignored on the server. */\n credentials?: RequestCredentials;\n}): Promise<ApiData> {\n if (typeof window !== \"undefined\") {\n // Client-side: use direct fetch\n if (!_directFetch) {\n const clientModule = await import(\"../client/request\");\n _directFetch = clientModule.directFetch;\n }\n return _directFetch({\n method: params.method,\n url: params.url,\n token: params.token,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n credentials: params.credentials,\n });\n } else {\n // Server-side: use server request with caching\n if (!_serverRequest) {\n const serverModule = await import(\"../server/request\");\n _serverRequest = serverModule.serverRequest;\n }\n return _serverRequest({\n method: params.method,\n url: params.url,\n token: params.token,\n cache: params.cache,\n body: params.body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: params.additionalHeaders,\n });\n }\n}\n\nexport function getApiUrl(): string {\n if (_staticConfig?.apiUrl) {\n return _staticConfig.apiUrl;\n }\n // Fallback to environment variable\n const envUrl = ENV.API_URL;\n if (!envUrl) {\n throw new Error(\"API URL not configured. Use configureJsonApi() or set NEXT_PUBLIC_API_URL environment variable.\");\n }\n return envUrl;\n}\n\nexport function getAppUrl(): string {\n if (_staticConfig?.appUrl) {\n return _staticConfig.appUrl;\n }\n // Fallback to environment variable\n const envUrl = ENV.APP_URL;\n if (!envUrl) {\n throw new Error(\n \"App URL not configured. Use configureJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable.\",\n );\n }\n return envUrl.trim().replace(/\\/+$/, \"\");\n}\n\nexport function getTrackablePages(): ModuleWithPermissions[] {\n return _staticConfig?.trackablePages ?? [];\n}\n\nfunction runBootstrapper(): void {\n if (_staticConfig?.bootstrapper) {\n _staticConfig.bootstrapper();\n }\n}\n\n/**\n * Resolve the final request URL for an endpoint.\n *\n * - `endpoint` starting with \"http\" is always passed through unchanged (existing behaviour).\n * - Otherwise, an explicit `baseUrl` (per-call override) takes precedence over the global\n * `getApiUrl()` resolution. Omitting `baseUrl` preserves today's behaviour exactly.\n */\nexport function buildUrl(endpoint: string, baseUrl?: string): string {\n if (endpoint.startsWith(\"http\")) return endpoint;\n const apiUrl = baseUrl ?? getApiUrl();\n return `${apiUrl}${endpoint}`;\n}\n\nexport async function JsonApiGet(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n token?: string;\n baseUrl?: string;\n credentials?: RequestCredentials;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n // A cached server GET never sends the token, so it must not read the cookie either:\n // the read would make a public page dynamic.\n const isServerCached = typeof window === \"undefined\" && !!params.classKey.cache;\n const token = isServerCached ? undefined : (params.token ?? (await getToken()));\n\n const apiResponse = await makeRequest({\n method: \"GET\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n cache: params.classKey.cache,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n credentials: params.credentials,\n });\n\n return translateResponse({\n classKey: params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n paginationHandler: async (endpoint: string) =>\n JsonApiGet({\n classKey: params.classKey,\n endpoint,\n companyId: params.companyId,\n language: params.language,\n token: params.token,\n baseUrl: params.baseUrl,\n }),\n });\n}\n\nexport async function JsonApiPost(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n overridesJsonApiCreation?: boolean;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n token?: string;\n baseUrl?: string;\n credentials?: RequestCredentials;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"POST\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n credentials: params.credentials,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPut(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n token?: string;\n baseUrl?: string;\n credentials?: RequestCredentials;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n let body = params.body;\n if (!body) {\n body = {};\n } else {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PUT\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n credentials: params.credentials,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiPatch(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n overridesJsonApiCreation?: boolean;\n responseType?: ApiRequestDataTypeInterface;\n language: string;\n token?: string;\n baseUrl?: string;\n credentials?: RequestCredentials;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n let body = params.body;\n if (!body) {\n body = {};\n } else if (params.overridesJsonApiCreation !== true) {\n body = JsonApiDataFactory.create(params.classKey, body);\n }\n\n const apiResponse = await makeRequest({\n method: \"PATCH\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n credentials: params.credentials,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n\nexport async function JsonApiDelete(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n token?: string;\n baseUrl?: string;\n credentials?: RequestCredentials;\n}): Promise<ApiResponseInterface> {\n runBootstrapper();\n const token = params.token ?? (await getToken());\n\n const apiResponse = await makeRequest({\n method: \"DELETE\",\n url: buildUrl(params.endpoint, params.baseUrl),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _staticConfig?.additionalHeaders,\n credentials: params.credentials,\n });\n\n return translateResponse({\n classKey: params.responseType ?? params.classKey,\n apiResponse,\n companyId: params.companyId,\n language: params.language,\n });\n}\n"]}
@@ -21,7 +21,7 @@ async function directFetch(params) {
21
21
  return answerLocally(params);
22
22
  }
23
23
  if (offline && response.ok && params.method.toUpperCase() !== "GET") {
24
- const { writeThrough } = await import("./write-through-IWQKXYHE.mjs");
24
+ const { writeThrough } = await import("./write-through-7I3LA2WN.mjs");
25
25
  await writeThrough({ method: params.method, url: params.url }, response);
26
26
  }
27
27
  return response;
@@ -33,7 +33,7 @@ function hasReplayHeader(headers) {
33
33
  }
34
34
  __name(hasReplayHeader, "hasReplayHeader");
35
35
  async function answerLocally(params) {
36
- const { localTransport } = await import("./local-transport-C7YTA4I7.mjs");
36
+ const { localTransport } = await import("./local-transport-RVD4FZGA.mjs");
37
37
  return localTransport({ method: params.method, url: params.url, body: params.body, files: params.files });
38
38
  }
39
39
  __name(answerLocally, "answerLocally");
@@ -83,6 +83,9 @@ async function fetchFromApi(params) {
83
83
  if (requestBody !== void 0) {
84
84
  options.body = requestBody;
85
85
  }
86
+ if (params.credentials) {
87
+ options.credentials = params.credentials;
88
+ }
86
89
  if (params.token) {
87
90
  options.headers = { ...options.headers, Authorization: `Bearer ${params.token}` };
88
91
  }
@@ -110,4 +113,4 @@ __name(fetchFromApi, "fetchFromApi");
110
113
  export {
111
114
  directFetch
112
115
  };
113
- //# sourceMappingURL=chunk-M3N7LPHX.mjs.map
116
+ //# sourceMappingURL=chunk-S7SPAC6X.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/request.ts"],"sourcesContent":["\"use client\";\n\nimport { ApiData } from \"../core/interfaces/ApiData\";\nimport { isOfflineConfigured } from \"../offline/config\";\nimport { getOfflineState, reachesNetworkWhileOffline, setOfflineState } from \"../offline/state\";\nimport { OFFLINE_REPLAY_HEADER } from \"../offline/types\";\n\nexport interface DirectFetchParams {\n method: string;\n url: string;\n token?: string;\n body?: any;\n files?: { [key: string]: File | Blob } | File | Blob;\n companyId?: string;\n language: string;\n additionalHeaders?: Record<string, string>;\n /**\n * Optional `fetch` credentials mode (e.g. \"include\" so the browser stores a cookie the API sets).\n * Omitted => no `credentials` option is passed, unchanged behaviour.\n */\n credentials?: RequestCredentials;\n}\n\n/**\n * Client-side direct fetch to bypass server action overhead.\n * Use this for client-side API calls.\n */\nexport async function directFetch(params: DirectFetchParams): Promise<ApiData> {\n // Offline mode is opt-in (`configureOffline`). Without it nothing below loads or runs. A request\n // the server runs as an offline replay always goes to the network, and so do the reads and the\n // change-set request of a reconnect attempt (the session stays offline until its sync succeeds).\n const offline = isOfflineConfigured() && !hasReplayHeader(params.additionalHeaders);\n if (offline && !getOfflineState().online && !reachesNetworkWhileOffline(params.method, params.url)) {\n return answerLocally(params);\n }\n\n const response = await fetchFromApi(params);\n\n if (offline && response.networkError) {\n setOfflineState({ online: false });\n return answerLocally(params);\n }\n if (offline && response.ok && params.method.toUpperCase() !== \"GET\") {\n const { writeThrough } = await import(\"../offline/write-through\");\n await writeThrough({ method: params.method, url: params.url }, response);\n }\n\n return response;\n}\n\nfunction hasReplayHeader(headers?: Record<string, string>): boolean {\n if (!headers) return false;\n return Object.keys(headers).some((key) => key.toLowerCase() === OFFLINE_REPLAY_HEADER);\n}\n\nasync function answerLocally(params: DirectFetchParams): Promise<ApiData> {\n const { localTransport } = await import(\"../offline/local-transport\");\n return localTransport({ method: params.method, url: params.url, body: params.body, files: params.files });\n}\n\nasync function fetchFromApi(params: DirectFetchParams): Promise<ApiData> {\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.credentials) {\n options.credentials = params.credentials;\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 response.networkError = true;\n }\n\n return response;\n}\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@ var _chunkG4JR3SFVjs = require('./chunk-G4JR3SFV.js');
4
4
 
5
5
 
6
6
 
7
- var _chunkZB6OYIMBjs = require('./chunk-ZB6OYIMB.js');
7
+ var _chunkHN7L6RRWjs = require('./chunk-HN7L6RRW.js');
8
8
 
9
9
 
10
10
  var _chunk7QVYU63Ejs = require('./chunk-7QVYU63E.js');
@@ -40,7 +40,7 @@ var ServerSession = class {
40
40
  const headerStore = await _headers.headers.call(void 0, );
41
41
  const token = _optionalChain([cookieStore, 'access', _ => _.get, 'call', _2 => _2("token"), 'optionalAccess', _3 => _3.value]) || void 0;
42
42
  const roles = _optionalChain([cookieStore, 'access', _4 => _4.get, 'call', _5 => _5("roles"), 'optionalAccess', _6 => _6.value]);
43
- const viewportCookie = _optionalChain([cookieStore, 'access', _7 => _7.get, 'call', _8 => _8(_chunkZB6OYIMBjs.VIEWPORT_COOKIE_NAME), 'optionalAccess', _9 => _9.value]);
43
+ const viewportCookie = _optionalChain([cookieStore, 'access', _7 => _7.get, 'call', _8 => _8(_chunkHN7L6RRWjs.VIEWPORT_COOKIE_NAME), 'optionalAccess', _9 => _9.value]);
44
44
  return {
45
45
  isLogged: !!token,
46
46
  isAdministrator: !!roles && roles.includes(_chunkG4JR3SFVjs.getRoleId.call(void 0, ).Administrator),
@@ -88,7 +88,7 @@ var ServerSession = class {
88
88
  if (!rawModules) return false;
89
89
  const modules = JSON.parse(_pako.ungzip.call(void 0, Buffer.from(rawModules, "base64"), { toText: true }));
90
90
  const selectedModule = modules.find((module) => module.id === params.module.moduleId);
91
- return _chunkZB6OYIMBjs.checkPermissionsFromServer.call(void 0, {
91
+ return _chunkHN7L6RRWjs.checkPermissionsFromServer.call(void 0, {
92
92
  module: params.module,
93
93
  action: params.action,
94
94
  data: params.data,
@@ -138,4 +138,4 @@ _chunk7QVYU63Ejs.__name.call(void 0, readBuildId, "readBuildId");
138
138
 
139
139
 
140
140
  exports.invalidateCacheTag = invalidateCacheTag; exports.invalidateCacheTags = invalidateCacheTags; exports.updateCacheTag = updateCacheTag; exports.ServerSession = ServerSession; exports.buildOfflineManifest = buildOfflineManifest;
141
- //# sourceMappingURL=chunk-54K2CZ2F.js.map
141
+ //# sourceMappingURL=chunk-SO3YUCL6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-54K2CZ2F.js","../src/server/cache.ts","../src/server/ServerSession.ts","../src/offline/server/build-offline-manifest.ts"],"names":[],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-54K2CZ2F.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","import { createHash } from \"node:crypto\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type OfflineManifest = { buildId: string; assets: string[] };\n\nasync function listFiles(dir: string): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) files.push(...(await listFiles(full)));\n else if (entry.isFile()) files.push(full);\n }\n return files;\n}\n\n/**\n * Describes the running build for the service worker's offline shell precache\n * (`/offline-manifest.json`): the build id from `<distDir>/BUILD_ID` and every\n * file under `<distDir>/static`, as the `/_next/static/...` URL Next serves it at.\n * `next dev` writes no BUILD_ID (its folder is `.next/dev`): the id is then `dev-` plus a hash\n * of the asset list. Dev chunk names do NOT carry content hashes (an edit rewrites a chunk under\n * the same name), so the id changes only when files appear or disappear; the service worker\n * therefore serves `/_next/static/` network first for a `dev-` build (pwa/sw.js).\n * `distDir` must be the value the app's next.config uses. `extraAssets` are further same-origin\n * URLs the shell needs with no network (the SQLite files the device worker loads).\n */\nexport async function buildOfflineManifest(params: {\n distDir: string;\n extraAssets?: string[];\n}): Promise<OfflineManifest> {\n const staticDir = path.join(params.distDir, \"static\");\n const files = await listFiles(staticDir);\n const assets = files\n .map((file) => `/_next/static/${path.relative(staticDir, file).split(path.sep).join(\"/\")}`)\n .concat(params.extraAssets ?? [])\n .sort();\n const buildId = await readBuildId(params.distDir, assets);\n return { buildId, assets };\n}\n\nasync function readBuildId(distDir: string, assets: string[]): Promise<string> {\n try {\n return (await readFile(path.join(distDir, \"BUILD_ID\"), \"utf8\")).trim();\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n return `dev-${createHash(\"sha256\").update(assets.join(\"\\n\")).digest(\"hex\").slice(0, 16)}`;\n }\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-SO3YUCL6.js","../src/server/cache.ts","../src/server/ServerSession.ts","../src/offline/server/build-offline-manifest.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACTA,mCAAyC;AAkBzC,MAAA,SAAsB,kBAAA,CAAmB,GAAA,EAAa,QAAA,EAAwB,KAAA,EAAsB;AAClG,EAAA,kCAAA,GAAc,EAAK,OAAO,CAAA;AAC5B;AAFsB,qCAAA,kBAAA,EAAA,oBAAA,CAAA;AAUtB,MAAA,SAAsB,mBAAA,CAAoB,IAAA,EAAgB,QAAA,EAAwB,KAAA,EAAsB;AACtG,EAAA,IAAA,CAAA,MAAW,IAAA,GAAO,IAAA,EAAM;AACtB,IAAA,kCAAA,GAAc,EAAK,OAAO,CAAA;AAAA,EAC5B;AACF;AAJsB,qCAAA,mBAAA,EAAA,qBAAA,CAAA;AAYtB,MAAA,SAAsB,cAAA,CAAe,GAAA,EAA4B;AAC/D,EAAA,8BAAA,GAAa,CAAA;AACf;AAFsB,qCAAA,cAAA,EAAA,gBAAA,CAAA;ADftB;AACA;AE5BA,uCAAiC;AACjC,6CAAyB;AACzB,qCAA0B;AAC1B,4BAAuB;AAahB,IAAM,cAAA,EAAN,MAAoB;AAAA,EAhB3B,OAgB2B;AAAA,IAAA,qCAAA,IAAA,EAAA,eAAA,CAAA;AAAA,EAAA;AAAA,EACzB,OAAA,MAAa,IAAA,CAAA,EAAiC;AAC5C,IAAA,MAAM,YAAA,EAAc,MAAM,8BAAA,CAAQ;AAClC,IAAA,MAAM,YAAA,EAAc,MAAM,8BAAA,CAAQ;AAElC,IAAA,MAAM,MAAA,kBAAQ,WAAA,mBAAY,GAAA,mBAAI,OAAO,CAAA,6BAAG,QAAA,GAAS,KAAA,CAAA;AACjD,IAAA,MAAM,MAAA,kBAAQ,WAAA,qBAAY,GAAA,mBAAI,OAAO,CAAA,6BAAG,OAAA;AACxC,IAAA,MAAM,eAAA,kBAAiB,WAAA,qBAAY,GAAA,mBAAI,qCAAoB,CAAA,6BAAG,OAAA;AAE9D,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,CAAC,CAAC,KAAA;AAAA,MACZ,eAAA,EAAiB,CAAC,CAAC,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,wCAAA,CAAU,CAAE,aAAa,CAAA;AAAA,MACpE,KAAA;AAAA,MACA,WAAA,kBAAa,WAAA,uBAAY,GAAA,qBAAI,eAAe,CAAA,+BAAG,QAAA,IAAU,OAAA;AAAA,MACzD,QAAA,EAAU,eAAA,EAAiB,eAAA,IAAmB,IAAA,EAAM,+BAAA,EAAY,OAAA,EAAS,YAAY,CAAC,CAAA,CAAE,MAAA,CAAO,KAAA,IAAS;AAAA,IAC1G,CAAA;AAAA,EACF;AAAA,EAEA,OAAA,MAAa,QAAA,CAAA,EAAW;AACtB,IAAA,MAAM,YAAA,EAAc,MAAM,8BAAA,CAAQ;AAClC,IAAA,MAAM,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAErC,IAAA,GAAA,CAAI,CAAC,MAAA,GAAS,CAAC,KAAA,CAAM,KAAA,EAAO,OAAO,KAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,MAAa,SAAA,CAAA,EAAY;AACvB,IAAA,MAAM,YAAA,EAAc,MAAM,8BAAA,CAAQ;AAClC,IAAA,wCAAO,WAAA,uBAAY,GAAA,qBAAI,WAAW,CAAA,+BAAG,OAAA,UAAS,IAAA;AAAA,EAChD;AAAA,EAEA,OAAA,MAAa,MAAA,CAAA,EAAS;AACpB,IAAA,MAAM,YAAA,EAAc,MAAM,8BAAA,CAAQ;AAClC,IAAA,wCAAO,WAAA,uBAAY,GAAA,qBAAI,QAAQ,CAAA,+BAAG,OAAA,UAAS,IAAA;AAAA,EAC7C;AAAA,EAEA,OAAA,MAAa,eAAA,CAAiD,MAAA,EAAmD;AAC/G,IAAA,GAAA,CAAI,CAAE,MAAM,IAAA,CAAK,qBAAA,CAAsB,MAAM,CAAA,EAAI,kCAAA,CAAS,IAAA,CAAM,CAAA;AAAA,EAClE;AAAA,EAEA,OAAA,MAAa,OAAA,CAAQ,MAAA,EAAkC;AACrD,IAAA,MAAM,YAAA,EAAc,MAAM,8BAAA,CAAQ;AAClC,IAAA,MAAM,MAAA,kBAAQ,WAAA,uBAAY,GAAA,qBAAI,OAAO,CAAA,+BAAG,OAAA;AAExC,IAAA,GAAA,CAAI,CAAC,MAAA,GAAS,CAAC,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,KAAA;AAE9C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,MAAa,UAAA,CAAW,SAAA,EAAqC;AAC3D,IAAA,MAAM,YAAA,EAAc,MAAM,8BAAA,CAAQ;AAClC,IAAA,MAAM,SAAA,kBAAW,WAAA,uBAAY,GAAA,qBAAI,UAAU,CAAA,+BAAG,OAAA;AAE9C,IAAA,GAAA,CAAI,CAAC,SAAA,GAAY,CAAC,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG,OAAO,KAAA;AAEvD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,MAAa,qBAAA,CAAuD,MAAA,EAI/C;AACnB,IAAA,MAAM,YAAA,EAAc,MAAM,8BAAA,CAAQ;AAElC,IAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS;AACzB,MAAA,MAAM,SAAA,kBAAW,WAAA,uBAAY,GAAA,qBAAI,UAAU,CAAA,+BAAG,OAAA;AAE9C,MAAA,GAAA,CAAI,SAAA,GAAY,CAAC,QAAA,CAAS,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,EAAG,OAAO,KAAA;AAAA,IACpE;AAEA,IAAA,MAAM,WAAA,kBAAa,WAAA,uBAAY,GAAA,qBAAI,SAAS,CAAA,+BAAG,OAAA;AAC/C,IAAA,GAAA,CAAI,CAAC,UAAA,EAAY,OAAO,KAAA;AAExB,IAAA,MAAM,QAAA,EAQA,IAAA,CAAK,KAAA,CAAM,0BAAA,MAAO,CAAO,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAK,CAAC,CAAC,CAAA;AAE5E,IAAA,MAAM,eAAA,EAAiB,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,EAAA,GAAW,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AAEpF,IAAA,OAAO,yDAAA;AAA2B,MAChC,MAAA,EAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAA,EAAQ,MAAA,CAAO,MAAA;AAAA,MACf,IAAA,EAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,CAAA;AAAA,MAC1B;AAAA,IACF,CAAC,CAAA;AAAA,EAWH;AACF,CAAA;AFrBA;AACA;AGpGA,gCAA2B;AAC3B,uCAAkC;AAClC,wEAAiB;AAIjB,MAAA,SAAe,SAAA,CAAU,GAAA,EAAgC;AACvD,EAAA,MAAM,QAAA,EAAU,MAAM,+BAAA,GAAQ,EAAK,EAAE,aAAA,EAAe,KAAK,CAAC,CAAA;AAC1D,EAAA,MAAM,MAAA,EAAkB,CAAC,CAAA;AACzB,EAAA,IAAA,CAAA,MAAW,MAAA,GAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,KAAA,EAAO,cAAA,CAAK,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACtC,IAAA,GAAA,CAAI,KAAA,CAAM,WAAA,CAAY,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,GAAI,MAAM,SAAA,CAAU,IAAI,CAAE,CAAA;AAAA,IAAA,KAAA,GAAA,CACrD,KAAA,CAAM,MAAA,CAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,KAAA;AACT;AATe,qCAAA,SAAA,EAAA,WAAA,CAAA;AAsBf,MAAA,SAAsB,oBAAA,CAAqB,MAAA,EAGd;AAC3B,EAAA,MAAM,UAAA,EAAY,cAAA,CAAK,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,QAAQ,CAAA;AACpD,EAAA,MAAM,MAAA,EAAQ,MAAM,SAAA,CAAU,SAAS,CAAA;AACvC,EAAA,MAAM,OAAA,EAAS,KAAA,CACZ,GAAA,CAAI,CAAC,IAAA,EAAA,GAAS,CAAA,cAAA,EAAiB,cAAA,CAAK,QAAA,CAAS,SAAA,EAAW,IAAI,CAAA,CAAE,KAAA,CAAM,cAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAGlC,EAAA;AAC/B,EAAA;AAC3B;AAZsB;AAcyD;AACzE,EAAA;AACmE,IAAA;AACvD,EAAA;AACgD,IAAA;AACyB,IAAA;AACzF,EAAA;AACF;AAPe;AH0FgG;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-SO3YUCL6.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","import { createHash } from \"node:crypto\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type OfflineManifest = { buildId: string; assets: string[] };\n\nasync function listFiles(dir: string): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) files.push(...(await listFiles(full)));\n else if (entry.isFile()) files.push(full);\n }\n return files;\n}\n\n/**\n * Describes the running build for the service worker's offline shell precache\n * (`/offline-manifest.json`): the build id from `<distDir>/BUILD_ID` and every\n * file under `<distDir>/static`, as the `/_next/static/...` URL Next serves it at.\n * `next dev` writes no BUILD_ID (its folder is `.next/dev`): the id is then `dev-` plus a hash\n * of the asset list. Dev chunk names do NOT carry content hashes (an edit rewrites a chunk under\n * the same name), so the id changes only when files appear or disappear; the service worker\n * therefore serves `/_next/static/` network first for a `dev-` build (pwa/sw.js).\n * `distDir` must be the value the app's next.config uses. `extraAssets` are further same-origin\n * URLs the shell needs with no network (the SQLite files the device worker loads).\n */\nexport async function buildOfflineManifest(params: {\n distDir: string;\n extraAssets?: string[];\n}): Promise<OfflineManifest> {\n const staticDir = path.join(params.distDir, \"static\");\n const files = await listFiles(staticDir);\n const assets = files\n .map((file) => `/_next/static/${path.relative(staticDir, file).split(path.sep).join(\"/\")}`)\n .concat(params.extraAssets ?? [])\n .sort();\n const buildId = await readBuildId(params.distDir, assets);\n return { buildId, assets };\n}\n\nasync function readBuildId(distDir: string, assets: string[]): Promise<string> {\n try {\n return (await readFile(path.join(distDir, \"BUILD_ID\"), \"utf8\")).trim();\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n return `dev-${createHash(\"sha256\").update(assets.join(\"\\n\")).digest(\"hex\").slice(0, 16)}`;\n }\n}\n"]}