@carlonicora/nextjs-jsonapi 6.13.1 → 6.14.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 (149) hide show
  1. package/dist/{BlockNoteEditor-UBVEUFNR.js → BlockNoteEditor-CUNH4LSQ.js} +25 -25
  2. package/dist/{BlockNoteEditor-UBVEUFNR.js.map → BlockNoteEditor-CUNH4LSQ.js.map} +1 -1
  3. package/dist/{BlockNoteEditor-VXMDSQAA.mjs → BlockNoteEditor-QIVV2OB4.mjs} +10 -10
  4. package/dist/{BlockNoteViewer-2XYASA5Y.js → BlockNoteViewer-APBOPT4B.js} +8 -8
  5. package/dist/{BlockNoteViewer-2XYASA5Y.js.map → BlockNoteViewer-APBOPT4B.js.map} +1 -1
  6. package/dist/{BlockNoteViewer-NBW2H6LC.mjs → BlockNoteViewer-HIUAJQRI.mjs} +7 -7
  7. package/dist/JsonApiRequest-G4J2WTSU.js +26 -0
  8. package/dist/{JsonApiRequest-WISJZSDE.js.map → JsonApiRequest-G4J2WTSU.js.map} +1 -1
  9. package/dist/{JsonApiRequest-F6TMJ42G.mjs → JsonApiRequest-IKKHWCPB.mjs} +2 -2
  10. package/dist/billing/index.js +497 -497
  11. package/dist/billing/index.mjs +9 -9
  12. package/dist/{chunk-7DBJTNSU.mjs → chunk-4RPGFQBA.mjs} +2 -2
  13. package/dist/{chunk-BZ5J2FIV.js → chunk-4XLDBOSE.js} +11 -11
  14. package/dist/{chunk-BZ5J2FIV.js.map → chunk-4XLDBOSE.js.map} +1 -1
  15. package/dist/{chunk-27LQDGNP.mjs → chunk-4ZJIUTIV.mjs} +6 -1
  16. package/dist/chunk-4ZJIUTIV.mjs.map +1 -0
  17. package/dist/{chunk-PXDUJ47N.js → chunk-6RCZ64BQ.js} +18 -18
  18. package/dist/{chunk-PXDUJ47N.js.map → chunk-6RCZ64BQ.js.map} +1 -1
  19. package/dist/{chunk-7JZHPMGW.mjs → chunk-A3RB47X4.mjs} +44 -20
  20. package/dist/chunk-A3RB47X4.mjs.map +1 -0
  21. package/dist/{chunk-DOCIFE6A.mjs → chunk-AUD6ZLBB.mjs} +3 -3
  22. package/dist/{chunk-GB6DBFYY.js → chunk-DGN3PR2F.js} +3 -3
  23. package/dist/{chunk-GB6DBFYY.js.map → chunk-DGN3PR2F.js.map} +1 -1
  24. package/dist/{chunk-7ZHTPFFT.js → chunk-DJXSCARG.js} +15 -15
  25. package/dist/{chunk-7ZHTPFFT.js.map → chunk-DJXSCARG.js.map} +1 -1
  26. package/dist/{chunk-QKNGZDSQ.js → chunk-GM4VZTWL.js} +2 -2
  27. package/dist/{chunk-QKNGZDSQ.js.map → chunk-GM4VZTWL.js.map} +1 -1
  28. package/dist/{chunk-PYRZCKC2.js → chunk-GSRTVIIK.js} +923 -923
  29. package/dist/{chunk-PYRZCKC2.js.map → chunk-GSRTVIIK.js.map} +1 -1
  30. package/dist/{chunk-47BBY5KA.mjs → chunk-HAW5PNJG.mjs} +4 -4
  31. package/dist/{chunk-YRKIFYOE.mjs → chunk-KTGKW72G.mjs} +27 -8
  32. package/dist/chunk-KTGKW72G.mjs.map +1 -0
  33. package/dist/{chunk-PV4Z5W6V.js → chunk-KV4N7DEG.js} +19 -19
  34. package/dist/{chunk-PV4Z5W6V.js.map → chunk-KV4N7DEG.js.map} +1 -1
  35. package/dist/{chunk-ZLTOUZN2.mjs → chunk-M3N7LPHX.mjs} +4 -4
  36. package/dist/{chunk-DGWOVYEC.mjs → chunk-MQ7TXALH.mjs} +2 -2
  37. package/dist/{chunk-W62MHDWM.js → chunk-N5ZE2Z6I.js} +58 -34
  38. package/dist/chunk-N5ZE2Z6I.js.map +1 -0
  39. package/dist/{chunk-2SV4SS6N.js → chunk-OQQ7CZWT.js} +12 -12
  40. package/dist/{chunk-2SV4SS6N.js.map → chunk-OQQ7CZWT.js.map} +1 -1
  41. package/dist/{chunk-JJMMT24D.mjs → chunk-OUEYZOLB.mjs} +2 -2
  42. package/dist/{chunk-XXP3TQHF.mjs → chunk-OY65RYD3.mjs} +2 -2
  43. package/dist/{chunk-MOGEGWXW.js → chunk-PMESKNKL.js} +868 -868
  44. package/dist/{chunk-MOGEGWXW.js.map → chunk-PMESKNKL.js.map} +1 -1
  45. package/dist/{chunk-B6JGKDP2.js → chunk-QGVVF77L.js} +48 -29
  46. package/dist/chunk-QGVVF77L.js.map +1 -0
  47. package/dist/{chunk-BH6JWIKI.mjs → chunk-QIEF7HIL.mjs} +2 -2
  48. package/dist/{chunk-P445QGOC.mjs → chunk-RFKSJIQB.mjs} +7 -7
  49. package/dist/{chunk-6JUCIWDC.mjs → chunk-UOTHRJD2.mjs} +2 -2
  50. package/dist/{chunk-KMW7UNL2.js → chunk-WCEYT3GG.js} +8 -8
  51. package/dist/{chunk-KMW7UNL2.js.map → chunk-WCEYT3GG.js.map} +1 -1
  52. package/dist/{chunk-MHB36MYE.js → chunk-WUNSG3IN.js} +7 -2
  53. package/dist/chunk-WUNSG3IN.js.map +1 -0
  54. package/dist/{chunk-N4RZZKL5.mjs → chunk-YKNULEHB.mjs} +12 -12
  55. package/dist/{chunk-Z4POQWFG.js → chunk-ZYSNJKOP.js} +4 -4
  56. package/dist/{chunk-Z4POQWFG.js.map → chunk-ZYSNJKOP.js.map} +1 -1
  57. package/dist/client/index.js +10 -10
  58. package/dist/client/index.mjs +9 -9
  59. package/dist/components/index.js +10 -10
  60. package/dist/components/index.mjs +9 -9
  61. package/dist/contexts/index.js +10 -10
  62. package/dist/contexts/index.mjs +9 -9
  63. package/dist/core/index.js +7 -7
  64. package/dist/core/index.mjs +6 -6
  65. package/dist/email-automations/index.js +99 -99
  66. package/dist/email-automations/index.mjs +9 -9
  67. package/dist/features/analytics/index.js +126 -126
  68. package/dist/features/analytics/index.mjs +9 -9
  69. package/dist/features/analytics/server.js +10 -10
  70. package/dist/features/analytics/server.mjs +8 -8
  71. package/dist/features/blog/index.js +156 -156
  72. package/dist/features/blog/index.mjs +9 -9
  73. package/dist/features/blog/server.js +28 -28
  74. package/dist/features/blog/server.mjs +7 -7
  75. package/dist/features/help/index.js +43 -43
  76. package/dist/features/help/index.mjs +9 -9
  77. package/dist/features/tokenusage/index.js +132 -132
  78. package/dist/features/tokenusage/index.mjs +9 -9
  79. package/dist/index.js +8 -8
  80. package/dist/index.mjs +7 -7
  81. package/dist/{lifecycle-LKGPRBS7.mjs → lifecycle-KI3PCJSE.mjs} +3 -3
  82. package/dist/lifecycle-TO65I7TO.js +23 -0
  83. package/dist/{lifecycle-4GUOTB46.js.map → lifecycle-TO65I7TO.js.map} +1 -1
  84. package/dist/local-transport-4YDJ6FQG.js +15 -0
  85. package/dist/{local-transport-7H3SPZSA.js.map → local-transport-4YDJ6FQG.js.map} +1 -1
  86. package/dist/local-transport-C7YTA4I7.mjs +15 -0
  87. package/dist/offline/index.d.mts +160 -4
  88. package/dist/offline/index.d.ts +160 -4
  89. package/dist/offline/index.js +210 -163
  90. package/dist/offline/index.js.map +1 -1
  91. package/dist/offline/index.mjs +76 -29
  92. package/dist/offline/index.mjs.map +1 -1
  93. package/dist/request-66FGJIHB.mjs +10 -0
  94. package/dist/request-6W6UGKJV.js +10 -0
  95. package/dist/{request-KTBV6HHH.js.map → request-6W6UGKJV.js.map} +1 -1
  96. package/dist/server/index.js +9 -9
  97. package/dist/server/index.mjs +8 -8
  98. package/dist/write-through-BAPS24GL.js +15 -0
  99. package/dist/{write-through-FDQ7N4YI.js.map → write-through-BAPS24GL.js.map} +1 -1
  100. package/dist/write-through-IWQKXYHE.mjs +15 -0
  101. package/package.json +1 -1
  102. package/src/offline/__tests__/generic-answers.spec.ts +146 -3
  103. package/src/offline/__tests__/local-transport.spec.ts +15 -1
  104. package/src/offline/__tests__/offline-fixtures.ts +29 -2
  105. package/src/offline/__tests__/write-through.spec.ts +27 -1
  106. package/src/offline/config.ts +9 -0
  107. package/src/offline/generic-answers.ts +44 -17
  108. package/src/offline/index.ts +2 -0
  109. package/src/offline/local-transport.ts +5 -3
  110. package/src/offline/sync/__tests__/runtime.spec.ts +30 -1
  111. package/src/offline/sync/__tests__/sync-fixtures.ts +22 -0
  112. package/src/offline/sync/__tests__/sync-root.spec.ts +184 -1
  113. package/src/offline/sync/known-roots.ts +29 -7
  114. package/src/offline/sync/runtime.ts +3 -2
  115. package/src/offline/sync/sync-root.ts +70 -19
  116. package/src/offline/types.ts +39 -1
  117. package/src/offline/write-through.ts +6 -3
  118. package/dist/JsonApiRequest-WISJZSDE.js +0 -26
  119. package/dist/chunk-27LQDGNP.mjs.map +0 -1
  120. package/dist/chunk-7JZHPMGW.mjs.map +0 -1
  121. package/dist/chunk-B6JGKDP2.js.map +0 -1
  122. package/dist/chunk-MHB36MYE.js.map +0 -1
  123. package/dist/chunk-W62MHDWM.js.map +0 -1
  124. package/dist/chunk-YRKIFYOE.mjs.map +0 -1
  125. package/dist/lifecycle-4GUOTB46.js +0 -23
  126. package/dist/local-transport-7H3SPZSA.js +0 -15
  127. package/dist/local-transport-QYFKA6AN.mjs +0 -15
  128. package/dist/request-KTBV6HHH.js +0 -10
  129. package/dist/request-SQOUNWZ4.mjs +0 -10
  130. package/dist/write-through-FDQ7N4YI.js +0 -15
  131. package/dist/write-through-R25VQMH6.mjs +0 -15
  132. /package/dist/{BlockNoteEditor-VXMDSQAA.mjs.map → BlockNoteEditor-QIVV2OB4.mjs.map} +0 -0
  133. /package/dist/{BlockNoteViewer-NBW2H6LC.mjs.map → BlockNoteViewer-HIUAJQRI.mjs.map} +0 -0
  134. /package/dist/{JsonApiRequest-F6TMJ42G.mjs.map → JsonApiRequest-IKKHWCPB.mjs.map} +0 -0
  135. /package/dist/{chunk-7DBJTNSU.mjs.map → chunk-4RPGFQBA.mjs.map} +0 -0
  136. /package/dist/{chunk-DOCIFE6A.mjs.map → chunk-AUD6ZLBB.mjs.map} +0 -0
  137. /package/dist/{chunk-47BBY5KA.mjs.map → chunk-HAW5PNJG.mjs.map} +0 -0
  138. /package/dist/{chunk-ZLTOUZN2.mjs.map → chunk-M3N7LPHX.mjs.map} +0 -0
  139. /package/dist/{chunk-DGWOVYEC.mjs.map → chunk-MQ7TXALH.mjs.map} +0 -0
  140. /package/dist/{chunk-JJMMT24D.mjs.map → chunk-OUEYZOLB.mjs.map} +0 -0
  141. /package/dist/{chunk-XXP3TQHF.mjs.map → chunk-OY65RYD3.mjs.map} +0 -0
  142. /package/dist/{chunk-BH6JWIKI.mjs.map → chunk-QIEF7HIL.mjs.map} +0 -0
  143. /package/dist/{chunk-P445QGOC.mjs.map → chunk-RFKSJIQB.mjs.map} +0 -0
  144. /package/dist/{chunk-6JUCIWDC.mjs.map → chunk-UOTHRJD2.mjs.map} +0 -0
  145. /package/dist/{chunk-N4RZZKL5.mjs.map → chunk-YKNULEHB.mjs.map} +0 -0
  146. /package/dist/{lifecycle-LKGPRBS7.mjs.map → lifecycle-KI3PCJSE.mjs.map} +0 -0
  147. /package/dist/{local-transport-QYFKA6AN.mjs.map → local-transport-C7YTA4I7.mjs.map} +0 -0
  148. /package/dist/{request-SQOUNWZ4.mjs.map → request-66FGJIHB.mjs.map} +0 -0
  149. /package/dist/{write-through-R25VQMH6.mjs.map → write-through-IWQKXYHE.mjs.map} +0 -0
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  AbstractService
3
- } from "./chunk-P445QGOC.mjs";
3
+ } from "./chunk-RFKSJIQB.mjs";
4
4
  import {
5
5
  EndpointCreator,
6
6
  Modules,
7
7
  useI18nTranslations
8
- } from "./chunk-6JUCIWDC.mjs";
8
+ } from "./chunk-UOTHRJD2.mjs";
9
9
  import {
10
10
  ENV,
11
11
  setBootstrapper
12
- } from "./chunk-DGWOVYEC.mjs";
12
+ } from "./chunk-MQ7TXALH.mjs";
13
13
  import {
14
14
  __name
15
15
  } from "./chunk-PAWJFY3S.mjs";
@@ -342,4 +342,4 @@ export {
342
342
  ACTION_TYPES,
343
343
  RbacService
344
344
  };
345
- //# sourceMappingURL=chunk-47BBY5KA.mjs.map
345
+ //# sourceMappingURL=chunk-HAW5PNJG.mjs.map
@@ -2,7 +2,7 @@ import {
2
2
  cacheArtworkImage,
3
3
  imageUrlOf,
4
4
  isRootLocked
5
- } from "./chunk-7DBJTNSU.mjs";
5
+ } from "./chunk-4RPGFQBA.mjs";
6
6
  import {
7
7
  linkKindFor,
8
8
  linkKindsOf,
@@ -10,31 +10,49 @@ import {
10
10
  matchPattern,
11
11
  rootIdForResource,
12
12
  splitApiUrl
13
- } from "./chunk-7JZHPMGW.mjs";
13
+ } from "./chunk-A3RB47X4.mjs";
14
14
  import {
15
15
  OfflineUnavailableError,
16
16
  getOfflineConfig,
17
17
  getOfflineStore,
18
+ rootKinds,
18
19
  setOfflineState
19
- } from "./chunk-27LQDGNP.mjs";
20
+ } from "./chunk-4ZJIUTIV.mjs";
20
21
  import {
21
22
  __name
22
23
  } from "./chunk-PAWJFY3S.mjs";
23
24
 
24
25
  // src/offline/sync/known-roots.ts
25
26
  var _lastSyncRoots = [];
26
- function rememberSyncRoots(ids) {
27
+ var _lastExtraSyncRoots = [];
28
+ function rememberSyncRoots(ids, extraIds = []) {
27
29
  _lastSyncRoots = [...ids];
30
+ _lastExtraSyncRoots = [...extraIds];
28
31
  }
29
32
  __name(rememberSyncRoots, "rememberSyncRoots");
30
33
  async function knownRootIds(store) {
31
34
  const config = getOfflineConfig();
32
35
  const ids = new Set(_lastSyncRoots);
33
- for (const record of await store.listRecords({ type: config.rootModule.name })) ids.add(record.id);
36
+ for (const kind of rootKinds(config)) {
37
+ for (const record of await store.listRecords({ type: kind.module.name })) ids.add(record.id);
38
+ }
34
39
  for (const entry of await store.queue()) ids.add(entry.rootId);
35
40
  return [...ids].sort();
36
41
  }
37
42
  __name(knownRootIds, "knownRootIds");
43
+ async function extraRootIds(store) {
44
+ const ids = new Set(_lastExtraSyncRoots);
45
+ for (const kind of getOfflineConfig().extraRootKinds ?? []) {
46
+ for (const record of await store.listRecords({ type: kind.module.name })) ids.add(record.id);
47
+ }
48
+ return ids;
49
+ }
50
+ __name(extraRootIds, "extraRootIds");
51
+ async function knownPrimaryRootIds(store) {
52
+ const extra = await extraRootIds(store);
53
+ return (await knownRootIds(store)).filter((id) => !extra.has(id));
54
+ }
55
+ __name(knownPrimaryRootIds, "knownPrimaryRootIds");
38
56
  async function refreshLockedRoots() {
39
57
  const config = getOfflineConfig();
40
58
  if (!config.getUserId()) return;
@@ -176,8 +194,8 @@ async function writeThrough(request, response) {
176
194
  }
177
195
  return;
178
196
  }
179
- const rootParams = matchPattern([config.rootModule, ":rootId"], path.split("/").slice(0, 2).join("/"));
180
- const pathRootId = rootParams?.rootId;
197
+ const rootSegments = path.split("/").slice(0, 2).join("/");
198
+ const pathRootId = rootKinds(config).map((kind) => matchPattern([kind.module, ":rootId"], rootSegments)?.rootId).find((rootId) => rootId !== void 0);
181
199
  const document = response.data;
182
200
  const primary = Array.isArray(document?.data) ? document.data : document?.data ? [document.data] : [];
183
201
  const waiting = waitingRecordKeys(
@@ -205,10 +223,11 @@ __name(writeThrough, "writeThrough");
205
223
  export {
206
224
  rememberSyncRoots,
207
225
  knownRootIds,
226
+ knownPrimaryRootIds,
208
227
  refreshLockedRoots,
209
228
  recordKeyOf,
210
229
  recordKeysOfEntry,
211
230
  waitingRecordKeys,
212
231
  writeThrough
213
232
  };
214
- //# sourceMappingURL=chunk-YRKIFYOE.mjs.map
233
+ //# sourceMappingURL=chunk-KTGKW72G.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/offline/sync/known-roots.ts","../src/offline/sync/waiting.ts","../src/offline/write-through.ts"],"sourcesContent":["import { getOfflineConfig, getOfflineStore, rootKinds } from \"../config\";\nimport { setOfflineState } from \"../state\";\nimport type { DeviceStore } from \"../store/DeviceStore\";\nimport { isRootLocked } from \"../store/lifecycle\";\n\nlet _lastSyncRoots: string[] = [];\nlet _lastExtraSyncRoots: string[] = [];\n\n/**\n * Remembers the root records the last online sync listed: `ids` of every kind, `extraIds` those\n * of the `extraRootKinds` among them.\n */\nexport function rememberSyncRoots(ids: string[], extraIds: string[] = []): void {\n _lastSyncRoots = [...ids];\n _lastExtraSyncRoots = [...extraIds];\n}\n\n/**\n * Every root record the device knows of, of every kind: its stored root records, the root records\n * with waiting changes, and the last sync roots (a locked root record is never downloaded, so it\n * may have no stored record).\n */\nexport async function knownRootIds(store: DeviceStore): Promise<string[]> {\n const config = getOfflineConfig();\n const ids = new Set<string>(_lastSyncRoots);\n for (const kind of rootKinds(config)) {\n for (const record of await store.listRecords({ type: kind.module.name })) ids.add(record.id);\n }\n for (const entry of await store.queue()) ids.add(entry.rootId);\n return [...ids].sort();\n}\n\n/** The known root records of the `extraRootKinds`: stored, or listed by the last sync. */\nasync function extraRootIds(store: DeviceStore): Promise<Set<string>> {\n const ids = new Set<string>(_lastExtraSyncRoots);\n for (const kind of getOfflineConfig().extraRootKinds ?? []) {\n for (const record of await store.listRecords({ type: kind.module.name })) ids.add(record.id);\n }\n return ids;\n}\n\n/** `knownRootIds` without the root records of the `extraRootKinds` (the primary kind only). */\nexport async function knownPrimaryRootIds(store: DeviceStore): Promise<string[]> {\n const extra = await extraRootIds(store);\n return (await knownRootIds(store)).filter((id) => !extra.has(id));\n}\n\n/** Recomputes `lockedRootIds` from the stored sync states, now. */\nexport async function refreshLockedRoots(): Promise<void> {\n const config = getOfflineConfig();\n if (!config.getUserId()) return;\n const store = await getOfflineStore();\n const now = new Date();\n const locked: string[] = [];\n for (const id of await knownRootIds(store)) {\n if (isRootLocked(await store.getSyncState(id), now)) locked.push(id);\n }\n setOfflineState({ lockedRootIds: locked });\n}\n","import type { QueueEntry } from \"../store/DeviceStore\";\n\nexport const recordKeyOf = (type: string, id: string) => `${type}:${id}`;\n\n/**\n * The records a queue entry targets: its `recordType`/`recordId`, the `data.type`/`data.id` of\n * its body (a record created on this device), and the `<type>/<id>` of its path (the last\n * segment naming a synced type, when an id follows it: `npcs/n1`, `npcs/n1/merge`; a collection\n * path such as `roots/C/npcs` targets no record).\n */\nexport function recordKeysOfEntry(entry: QueueEntry, typeNames: Set<string>): string[] {\n const keys: string[] = [];\n if (entry.recordType && entry.recordId) keys.push(recordKeyOf(entry.recordType, entry.recordId));\n\n const data = entry.body?.data;\n if (data && !Array.isArray(data) && typeof data.type === \"string\" && typeof data.id === \"string\") {\n keys.push(recordKeyOf(data.type, data.id));\n }\n\n const segments = String(entry.path ?? \"\")\n .split(\"?\")[0]\n .split(\"/\")\n .filter(Boolean);\n for (let index = segments.length - 1; index >= 0; index--) {\n if (!typeNames.has(segments[index])) continue;\n if (index + 1 < segments.length) keys.push(recordKeyOf(segments[index], segments[index + 1]));\n break;\n }\n return keys;\n}\n\n/**\n * Every record with a waiting change: targeted by a queue entry that is pending, sending, in\n * conflict or failed. Such a record is never overwritten or deleted by a sync or a write-through.\n */\nexport function waitingRecordKeys(queue: QueueEntry[], typeNames: Set<string>): Set<string> {\n const keys = new Set<string>();\n for (const entry of queue) for (const key of recordKeysOfEntry(entry, typeNames)) keys.add(key);\n return keys;\n}\n","import type { ApiData } from \"../core/interfaces/ApiData\";\nimport { getOfflineConfig, getOfflineStore, OfflineUnavailableError, rootKinds } from \"./config\";\nimport { rootIdForResource, linkKindFor, linkKindsOf, linksOfKind } from \"./generic-answers\";\nimport { splitApiUrl } from \"./local-transport\";\nimport { matchPattern } from \"./router\";\nimport type { DeviceStore, StoredLink } from \"./store/DeviceStore\";\nimport type { OfflineTypeConfig } from \"./types\";\nimport { cacheArtworkImage, imageUrlOf } from \"./sync/artwork-cache\";\nimport { knownRootIds } from \"./sync/known-roots\";\nimport { recordKeyOf, waitingRecordKeys } from \"./sync/waiting\";\n\nexport type WriteThroughRequest = { method: string; url: string };\n\nfunction updatedAtOf(resource: any): Date | null {\n const value = resource?.attributes?.updatedAt;\n if (!value) return null;\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\ntype Identifier = { type: string; id: string };\n\nfunction identifiersOf(relationship: any): Identifier[] {\n const data = relationship?.data;\n if (!data) return [];\n return (Array.isArray(data) ? data : [data]).filter((item: any) => item && item.type && item.id);\n}\n\n/**\n * Brings the stored links of the written record in line with the relationships the answer\n * carries (only those whose `data` it holds), as the local answers do: a link of the\n * relationship (its name or mapped Neo4j type; any kind when the type is not mapped, for an\n * identifier the record held before) to an identifier no longer there is removed, and a new\n * identifier gets a link of `linkKindFor` the relationship.\n */\nasync function updateLinks(\n store: DeviceStore,\n typeConfig: OfflineTypeConfig | undefined,\n record: Identifier,\n before: any,\n after: any,\n): Promise<void> {\n const otherEnd = (link: StoredLink) => (link.fromId === record.id ? link.toId : link.fromId);\n const allLinks = async (): Promise<StoredLink[]> => [\n ...(await store.linksFrom(record.id)),\n ...(await store.linksTo(record.id)),\n ];\n\n for (const [name, relationship] of Object.entries<any>(after ?? {})) {\n if (!relationship || !(\"data\" in relationship)) continue;\n const next = new Map(identifiersOf(relationship).map((identifier) => [identifier.id, identifier]));\n const previous = new Set(identifiersOf(before?.[name]).map((identifier) => identifier.id));\n const kinds = linkKindsOf(typeConfig, name) ?? [name];\n const ofRelationship = await linksOfKind(store, record.id, kinds, \"both\");\n const mapped = linkKindsOf(typeConfig, name) !== undefined;\n\n const stale = [\n ...ofRelationship.filter((link) => !next.has(otherEnd(link))),\n // Unmapped: the link to an identifier the record held before may carry any kind.\n ...(mapped ? [] : (await allLinks()).filter((link) => previous.has(otherEnd(link)) && !next.has(otherEnd(link)))),\n ];\n for (const link of stale) await store.deleteLink({ fromId: link.fromId, toId: link.toId, kind: link.kind });\n\n const linked = new Set(\n (mapped ? await linksOfKind(store, record.id, kinds, \"both\") : await allLinks()).map(otherEnd),\n );\n for (const [id, identifier] of next) {\n if (linked.has(id)) continue;\n await store.putLink({\n fromType: record.type,\n fromId: record.id,\n toType: identifier.type,\n toId: id,\n kind: linkKindFor(typeConfig, name),\n props: {},\n });\n }\n }\n}\n\ntype ImageChange = { url: string; previousUrl?: string };\n\nasync function storeResource(\n store: DeviceStore,\n resource: any,\n pathRootId: string | undefined,\n waiting: Set<string>,\n kept: Set<string>,\n primary: boolean,\n images: ImageChange[],\n): Promise<void> {\n const config = getOfflineConfig();\n if (!resource?.type || !resource?.id) return;\n if (!config.types.some((typeConfig) => typeConfig.module.name === resource.type)) return;\n // A record with unsent local changes keeps them: the next sync, once they are sent, brings\n // the server's version.\n if (waiting.has(recordKeyOf(resource.type, resource.id))) return;\n\n const existing = await store.getRecord(resource.type, resource.id);\n if (existing && existing.base !== null) return;\n const rootId = existing?.rootId ?? (await rootIdForResource(store, config, resource)) ?? pathRootId;\n // A record that belongs to no root record on this device waits for the next sync.\n if (!rootId) return;\n // Only the root records the device keeps are written through (never a player's root record).\n if (!kept.has(rootId)) return;\n\n // An answer can carry a sparse resource (fields limited): it is merged onto what is stored.\n const before = existing?.resource ?? {};\n const merged = {\n ...before,\n ...resource,\n attributes: { ...(before.attributes ?? {}), ...(resource.attributes ?? {}) },\n relationships: { ...(before.relationships ?? {}), ...(resource.relationships ?? {}) },\n };\n\n await store.putRecord({\n type: resource.type,\n id: resource.id,\n rootId,\n resource: merged,\n updatedAt: updatedAtOf(resource) ?? existing?.updatedAt ?? null,\n base: null,\n localOnly: false,\n });\n if (primary) {\n const typeConfig = config.types.find((candidate) => candidate.module.name === resource.type);\n await updateLinks(store, typeConfig, resource, before.relationships, resource.relationships);\n }\n\n const url = imageUrlOf(merged);\n const previousUrl = imageUrlOf(existing?.resource);\n if (url && url !== previousUrl) images.push({ url, previousUrl });\n}\n\n/**\n * After a successful online write, copies the answer into the device copy so it is never behind\n * the GM's own work: the resource and its `included` for POST/PUT/PATCH, the record removed for a\n * DELETE. It never fails the request: a problem is logged and the next sync repairs the copy.\n */\nexport async function writeThrough(request: WriteThroughRequest, response: ApiData): Promise<void> {\n const method = request.method.toUpperCase();\n if (method === \"GET\" || !response.ok) return;\n\n try {\n const config = getOfflineConfig();\n if (!config.getUserId()) return;\n const { path } = splitApiUrl(request.url);\n const store = await getOfflineStore();\n\n if (method === \"DELETE\") {\n for (const typeConfig of config.types) {\n const params = matchPattern([typeConfig.module, \":id\"], path);\n if (params) {\n await store.deleteRecord(typeConfig.module.name, params.id);\n return;\n }\n }\n return;\n }\n\n // A path under a root record of any kind (`<root module>/:rootId/...`).\n const rootSegments = path.split(\"/\").slice(0, 2).join(\"/\");\n const pathRootId = rootKinds(config)\n .map((kind) => matchPattern([kind.module, \":rootId\"], rootSegments)?.rootId)\n .find((rootId) => rootId !== undefined);\n\n const document = response.data;\n const primary = Array.isArray(document?.data) ? document.data : document?.data ? [document.data] : [];\n const waiting = waitingRecordKeys(\n await store.queue(),\n new Set(config.types.map((typeConfig) => typeConfig.module.name)),\n );\n // The root records this device keeps for the signed-in user (stored roots, waiting changes, last\n // sync roots): a write in any other root record (a player's) stores nothing.\n const kept = new Set(await knownRootIds(store));\n const images: ImageChange[] = [];\n await store.transaction(async (transactionStore) => {\n for (const resource of primary) {\n await storeResource(transactionStore, resource, pathRootId, waiting, kept, true, images);\n }\n for (const resource of document?.included ?? []) {\n await storeResource(transactionStore, resource, pathRootId, waiting, kept, false, images);\n }\n });\n // A new image URL of an artwork: downloaded, the old cached image removed (as the sync does).\n for (const image of images) await cacheArtworkImage(image.url, image.previousUrl);\n } catch (error) {\n // A browser that cannot keep the device copy was already warned about once.\n if (error instanceof OfflineUnavailableError) return;\n console.warn(\"[offline] could not copy the answer to the device\", error);\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,12 +1,12 @@
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 _chunkKMW7UNL2js = require('./chunk-KMW7UNL2.js');
3
+ var _chunkWCEYT3GGjs = require('./chunk-WCEYT3GG.js');
4
4
 
5
5
 
6
6
 
7
7
 
8
8
 
9
- var _chunkQKNGZDSQjs = require('./chunk-QKNGZDSQ.js');
9
+ var _chunkGM4VZTWLjs = require('./chunk-GM4VZTWL.js');
10
10
 
11
11
 
12
12
  var _chunkLXKSUWAVjs = require('./chunk-LXKSUWAV.js');
@@ -22,7 +22,7 @@ var _clientConfig = null;
22
22
  function configureClientJsonApi(config) {
23
23
  _clientConfig = config;
24
24
  if (config.bootstrapper) {
25
- _chunkQKNGZDSQjs.setBootstrapper.call(void 0, config.bootstrapper);
25
+ _chunkGM4VZTWLjs.setBootstrapper.call(void 0, config.bootstrapper);
26
26
  config.bootstrapper();
27
27
  }
28
28
  }
@@ -31,7 +31,7 @@ function getClientApiUrl() {
31
31
  if (_optionalChain([_clientConfig, 'optionalAccess', _ => _.apiUrl])) {
32
32
  return _clientConfig.apiUrl;
33
33
  }
34
- const envUrl = _chunkQKNGZDSQjs.ENV.API_URL;
34
+ const envUrl = _chunkGM4VZTWLjs.ENV.API_URL;
35
35
  if (!envUrl) {
36
36
  throw new Error(
37
37
  "API URL not configured. Use configureClientJsonApi() or set NEXT_PUBLIC_API_URL environment variable."
@@ -44,7 +44,7 @@ function getClientAppUrl() {
44
44
  if (_optionalChain([_clientConfig, 'optionalAccess', _2 => _2.appUrl])) {
45
45
  return _clientConfig.appUrl;
46
46
  }
47
- const envUrl = _chunkQKNGZDSQjs.ENV.APP_URL;
47
+ const envUrl = _chunkGM4VZTWLjs.ENV.APP_URL;
48
48
  if (!envUrl) {
49
49
  throw new Error(
50
50
  "App URL not configured. Use configureClientJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable."
@@ -72,7 +72,7 @@ _chunk7QVYU63Ejs.__name.call(void 0, buildClientUrl, "buildClientUrl");
72
72
  async function ClientJsonApiGet(params) {
73
73
  runClientBootstrapper();
74
74
  const token = await _chunkLXKSUWAVjs.getClientToken.call(void 0, );
75
- const apiResponse = await _chunkKMW7UNL2js.directFetch.call(void 0, {
75
+ const apiResponse = await _chunkWCEYT3GGjs.directFetch.call(void 0, {
76
76
  method: "GET",
77
77
  url: buildClientUrl(params.endpoint, params.baseUrl),
78
78
  token,
@@ -80,7 +80,7 @@ async function ClientJsonApiGet(params) {
80
80
  language: params.language,
81
81
  additionalHeaders: _optionalChain([_clientConfig, 'optionalAccess', _5 => _5.additionalHeaders])
82
82
  });
83
- return _chunkQKNGZDSQjs.translateResponse.call(void 0, {
83
+ return _chunkGM4VZTWLjs.translateResponse.call(void 0, {
84
84
  classKey: params.classKey,
85
85
  apiResponse,
86
86
  companyId: params.companyId,
@@ -102,9 +102,9 @@ async function ClientJsonApiPost(params) {
102
102
  if (!body) {
103
103
  body = {};
104
104
  } else if (params.overridesJsonApiCreation !== true) {
105
- body = _chunkQKNGZDSQjs.JsonApiDataFactory.create(params.classKey, body);
105
+ body = _chunkGM4VZTWLjs.JsonApiDataFactory.create(params.classKey, body);
106
106
  }
107
- const apiResponse = await _chunkKMW7UNL2js.directFetch.call(void 0, {
107
+ const apiResponse = await _chunkWCEYT3GGjs.directFetch.call(void 0, {
108
108
  method: "POST",
109
109
  url: buildClientUrl(params.endpoint, params.baseUrl),
110
110
  token,
@@ -114,7 +114,7 @@ async function ClientJsonApiPost(params) {
114
114
  language: params.language,
115
115
  additionalHeaders: _optionalChain([_clientConfig, 'optionalAccess', _6 => _6.additionalHeaders])
116
116
  });
117
- return _chunkQKNGZDSQjs.translateResponse.call(void 0, {
117
+ return _chunkGM4VZTWLjs.translateResponse.call(void 0, {
118
118
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
119
119
  apiResponse,
120
120
  companyId: params.companyId,
@@ -129,9 +129,9 @@ async function ClientJsonApiPut(params) {
129
129
  if (!body) {
130
130
  body = {};
131
131
  } else {
132
- body = _chunkQKNGZDSQjs.JsonApiDataFactory.create(params.classKey, body);
132
+ body = _chunkGM4VZTWLjs.JsonApiDataFactory.create(params.classKey, body);
133
133
  }
134
- const apiResponse = await _chunkKMW7UNL2js.directFetch.call(void 0, {
134
+ const apiResponse = await _chunkWCEYT3GGjs.directFetch.call(void 0, {
135
135
  method: "PUT",
136
136
  url: buildClientUrl(params.endpoint, params.baseUrl),
137
137
  token,
@@ -141,7 +141,7 @@ async function ClientJsonApiPut(params) {
141
141
  language: params.language,
142
142
  additionalHeaders: _optionalChain([_clientConfig, 'optionalAccess', _7 => _7.additionalHeaders])
143
143
  });
144
- return _chunkQKNGZDSQjs.translateResponse.call(void 0, {
144
+ return _chunkGM4VZTWLjs.translateResponse.call(void 0, {
145
145
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
146
146
  apiResponse,
147
147
  companyId: params.companyId,
@@ -156,9 +156,9 @@ async function ClientJsonApiPatch(params) {
156
156
  if (!body) {
157
157
  body = {};
158
158
  } else if (params.overridesJsonApiCreation !== true) {
159
- body = _chunkQKNGZDSQjs.JsonApiDataFactory.create(params.classKey, body);
159
+ body = _chunkGM4VZTWLjs.JsonApiDataFactory.create(params.classKey, body);
160
160
  }
161
- const apiResponse = await _chunkKMW7UNL2js.directFetch.call(void 0, {
161
+ const apiResponse = await _chunkWCEYT3GGjs.directFetch.call(void 0, {
162
162
  method: "PATCH",
163
163
  url: buildClientUrl(params.endpoint, params.baseUrl),
164
164
  token,
@@ -168,7 +168,7 @@ async function ClientJsonApiPatch(params) {
168
168
  language: params.language,
169
169
  additionalHeaders: _optionalChain([_clientConfig, 'optionalAccess', _8 => _8.additionalHeaders])
170
170
  });
171
- return _chunkQKNGZDSQjs.translateResponse.call(void 0, {
171
+ return _chunkGM4VZTWLjs.translateResponse.call(void 0, {
172
172
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
173
173
  apiResponse,
174
174
  companyId: params.companyId,
@@ -179,7 +179,7 @@ _chunk7QVYU63Ejs.__name.call(void 0, ClientJsonApiPatch, "ClientJsonApiPatch");
179
179
  async function ClientJsonApiDelete(params) {
180
180
  runClientBootstrapper();
181
181
  const token = await _chunkLXKSUWAVjs.getClientToken.call(void 0, );
182
- const apiResponse = await _chunkKMW7UNL2js.directFetch.call(void 0, {
182
+ const apiResponse = await _chunkWCEYT3GGjs.directFetch.call(void 0, {
183
183
  method: "DELETE",
184
184
  url: buildClientUrl(params.endpoint, params.baseUrl),
185
185
  token,
@@ -187,7 +187,7 @@ async function ClientJsonApiDelete(params) {
187
187
  language: params.language,
188
188
  additionalHeaders: _optionalChain([_clientConfig, 'optionalAccess', _9 => _9.additionalHeaders])
189
189
  });
190
- return _chunkQKNGZDSQjs.translateResponse.call(void 0, {
190
+ return _chunkGM4VZTWLjs.translateResponse.call(void 0, {
191
191
  classKey: _nullishCoalesce(params.responseType, () => ( params.classKey)),
192
192
  apiResponse,
193
193
  companyId: params.companyId,
@@ -209,4 +209,4 @@ _chunk7QVYU63Ejs.__name.call(void 0, ClientJsonApiDelete, "ClientJsonApiDelete")
209
209
 
210
210
 
211
211
  exports.CURRENT_USER_STORAGE_KEY = CURRENT_USER_STORAGE_KEY; exports.configureClientJsonApi = configureClientJsonApi; exports.getClientApiUrl = getClientApiUrl; exports.getClientAppUrl = getClientAppUrl; exports.getClientTrackablePages = getClientTrackablePages; exports.buildClientUrl = buildClientUrl; exports.ClientJsonApiGet = ClientJsonApiGet; exports.ClientJsonApiPost = ClientJsonApiPost; exports.ClientJsonApiPut = ClientJsonApiPut; exports.ClientJsonApiPatch = ClientJsonApiPatch; exports.ClientJsonApiDelete = ClientJsonApiDelete;
212
- //# sourceMappingURL=chunk-PV4Z5W6V.js.map
212
+ //# sourceMappingURL=chunk-KV4N7DEG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-PV4Z5W6V.js","../src/features/user/data/user.storage.ts","../src/client/JsonApiClient.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACRO,IAAM,yBAAA,EAA2B,MAAA;ADUxC;AACA;AENA,IAAI,cAAA,EAMO,IAAA;AAMJ,SAAS,sBAAA,CAAuB,MAAA,EAM9B;AACP,EAAA,cAAA,EAAgB,MAAA;AAChB,EAAA,GAAA,CAAI,MAAA,CAAO,YAAA,EAAc;AACvB,IAAA,8CAAA,MAAgB,CAAO,YAAY,CAAA;AACnC,IAAA,MAAA,CAAO,YAAA,CAAa,CAAA;AAAA,EACtB;AACF;AAZgB,qCAAA,sBAAA,EAAA,wBAAA,CAAA;AAcT,SAAS,eAAA,CAAA,EAA0B;AACxC,EAAA,GAAA,iBAAI,aAAA,2BAAe,QAAA,EAAQ;AACzB,IAAA,OAAO,aAAA,CAAc,MAAA;AAAA,EACvB;AACA,EAAA,MAAM,OAAA,EAAS,oBAAA,CAAI,OAAA;AACnB,EAAA,GAAA,CAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAXgB,qCAAA,eAAA,EAAA,iBAAA,CAAA;AAaT,SAAS,eAAA,CAAA,EAA0B;AACxC,EAAA,GAAA,iBAAI,aAAA,6BAAe,QAAA,EAAQ;AACzB,IAAA,OAAO,aAAA,CAAc,MAAA;AAAA,EACvB;AACA,EAAA,MAAM,OAAA,EAAS,oBAAA,CAAI,OAAA;AACnB,EAAA,GAAA,CAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACzC;AAXgB,qCAAA,eAAA,EAAA,iBAAA,CAAA;AAaT,SAAS,uBAAA,CAAA,EAAmD;AACjE,EAAA,wCAAO,aAAA,6BAAe,gBAAA,UAAkB,CAAC,GAAA;AAC3C;AAFgB,qCAAA,uBAAA,EAAA,yBAAA,CAAA;AAIhB,SAAS,qBAAA,CAAA,EAA8B;AACrC,EAAA,GAAA,iBAAI,aAAA,6BAAe,cAAA,EAAc;AAC/B,IAAA,aAAA,CAAc,YAAA,CAAa,CAAA;AAAA,EAC7B;AACF;AAJS,qCAAA,qBAAA,EAAA,uBAAA,CAAA;AAcF,SAAS,cAAA,CAAe,QAAA,EAAkB,OAAA,EAA0B;AACzE,EAAA,GAAA,CAAI,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,QAAA;AACxC,EAAA,MAAM,OAAA,mBAAS,OAAA,UAAW,eAAA,CAAgB,GAAA;AAC1C,EAAA,OAAO,CAAA,EAAA;AACT;AAJgB;AAMhB;AAOE,EAAA;AACM,EAAA;AAEA,EAAA;AACJ,IAAA;AACK,IAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AAEM,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAEI,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AANe,IAAA;AAQpB,EAAA;AACH;AAjCsB;AAmCtB;AAWE,EAAA;AACM,EAAA;AAEF,EAAA;AACC,EAAA;AACH,IAAA;AACF,EAAA;AACE,IAAA;AACF,EAAA;AAEM,EAAA;AACJ,IAAA;AACK,IAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AAEM,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AACH;AAtCsB;AAwCtB;AAUE,EAAA;AACM,EAAA;AAEF,EAAA;AACC,EAAA;AACH,IAAA;AACK,EAAA;AACL,IAAA;AACF,EAAA;AAEM,EAAA;AACJ,IAAA;AACK,IAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AAEM,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AACH;AArCsB;AAuCtB;AAWE,EAAA;AACM,EAAA;AAEF,EAAA;AACC,EAAA;AACH,IAAA;AACF,EAAA;AACE,IAAA;AACF,EAAA;AAEM,EAAA;AACJ,IAAA;AACK,IAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AAEM,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AACH;AAtCsB;AAwCtB;AAQE,EAAA;AACM,EAAA;AAEA,EAAA;AACJ,IAAA;AACK,IAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AAEM,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AACH;AA1BsB;AF9CZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-PV4Z5W6V.js","sourcesContent":[null,"/**\n * localStorage key backing the `CurrentUserProvider` atom.\n *\n * Owned by this library, not by the apps that consume it: `<Logout />` clears\n * it on every sign-out. Kept in its own module so both the provider that writes\n * it and the component that clears it can reference the same constant without\n * importing each other.\n */\nexport const CURRENT_USER_STORAGE_KEY = \"user\";\n","\"use client\";\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 { setBootstrapper } from \"../core/registry/bootstrapStore\";\nimport { translateResponse } from \"../core/utils/translateResponse\";\nimport { ModuleWithPermissions } from \"../permissions/types\";\nimport { directFetch } from \"./request\";\nimport { getClientToken } from \"./token\";\n\n// Config storage for client contexts\nlet _clientConfig: {\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 browser contexts.\n * Call this in your client-side initialization or use JsonApiProvider.\n */\nexport function configureClientJsonApi(config: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n}): void {\n _clientConfig = config;\n if (config.bootstrapper) {\n setBootstrapper(config.bootstrapper);\n config.bootstrapper();\n }\n}\n\nexport function getClientApiUrl(): string {\n if (_clientConfig?.apiUrl) {\n return _clientConfig.apiUrl;\n }\n const envUrl = ENV.API_URL;\n if (!envUrl) {\n throw new Error(\n \"API URL not configured. Use configureClientJsonApi() or set NEXT_PUBLIC_API_URL environment variable.\",\n );\n }\n return envUrl;\n}\n\nexport function getClientAppUrl(): string {\n if (_clientConfig?.appUrl) {\n return _clientConfig.appUrl;\n }\n const envUrl = ENV.APP_URL;\n if (!envUrl) {\n throw new Error(\n \"App URL not configured. Use configureClientJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable.\",\n );\n }\n return envUrl.trim().replace(/\\/+$/, \"\");\n}\n\nexport function getClientTrackablePages(): ModuleWithPermissions[] {\n return _clientConfig?.trackablePages ?? [];\n}\n\nfunction runClientBootstrapper(): void {\n if (_clientConfig?.bootstrapper) {\n _clientConfig.bootstrapper();\n }\n}\n\n/**\n * Resolve the final request URL for an endpoint (client-side variant of `buildUrl`\n * in `unified/JsonApiRequest.ts` — kept in lockstep with it).\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 * `getClientApiUrl()` resolution. Omitting `baseUrl` preserves today's behaviour exactly.\n */\nexport function buildClientUrl(endpoint: string, baseUrl?: string): string {\n if (endpoint.startsWith(\"http\")) return endpoint;\n const apiUrl = baseUrl ?? getClientApiUrl();\n return `${apiUrl}${endpoint}`;\n}\n\nexport async function ClientJsonApiGet(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runClientBootstrapper();\n const token = await getClientToken();\n\n const apiResponse = await directFetch({\n method: \"GET\",\n url: buildClientUrl(params.endpoint, params.baseUrl),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _clientConfig?.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 ClientJsonApiGet({\n classKey: params.classKey,\n endpoint,\n companyId: params.companyId,\n language: params.language,\n baseUrl: params.baseUrl,\n }),\n });\n}\n\nexport async function ClientJsonApiPost(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 baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runClientBootstrapper();\n const token = await getClientToken();\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 directFetch({\n method: \"POST\",\n url: buildClientUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _clientConfig?.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 ClientJsonApiPut(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 baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runClientBootstrapper();\n const token = await getClientToken();\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 directFetch({\n method: \"PUT\",\n url: buildClientUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _clientConfig?.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 ClientJsonApiPatch(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 baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runClientBootstrapper();\n const token = await getClientToken();\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 directFetch({\n method: \"PATCH\",\n url: buildClientUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _clientConfig?.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 ClientJsonApiDelete(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runClientBootstrapper();\n const token = await getClientToken();\n\n const apiResponse = await directFetch({\n method: \"DELETE\",\n url: buildClientUrl(params.endpoint, params.baseUrl),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _clientConfig?.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"]}
1
+ {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-KV4N7DEG.js","../src/features/user/data/user.storage.ts","../src/client/JsonApiClient.ts"],"names":[],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/chunk-KV4N7DEG.js","sourcesContent":[null,"/**\n * localStorage key backing the `CurrentUserProvider` atom.\n *\n * Owned by this library, not by the apps that consume it: `<Logout />` clears\n * it on every sign-out. Kept in its own module so both the provider that writes\n * it and the component that clears it can reference the same constant without\n * importing each other.\n */\nexport const CURRENT_USER_STORAGE_KEY = \"user\";\n","\"use client\";\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 { setBootstrapper } from \"../core/registry/bootstrapStore\";\nimport { translateResponse } from \"../core/utils/translateResponse\";\nimport { ModuleWithPermissions } from \"../permissions/types\";\nimport { directFetch } from \"./request\";\nimport { getClientToken } from \"./token\";\n\n// Config storage for client contexts\nlet _clientConfig: {\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 browser contexts.\n * Call this in your client-side initialization or use JsonApiProvider.\n */\nexport function configureClientJsonApi(config: {\n apiUrl: string;\n appUrl?: string;\n trackablePages?: ModuleWithPermissions[];\n bootstrapper?: () => void;\n additionalHeaders?: Record<string, string>;\n}): void {\n _clientConfig = config;\n if (config.bootstrapper) {\n setBootstrapper(config.bootstrapper);\n config.bootstrapper();\n }\n}\n\nexport function getClientApiUrl(): string {\n if (_clientConfig?.apiUrl) {\n return _clientConfig.apiUrl;\n }\n const envUrl = ENV.API_URL;\n if (!envUrl) {\n throw new Error(\n \"API URL not configured. Use configureClientJsonApi() or set NEXT_PUBLIC_API_URL environment variable.\",\n );\n }\n return envUrl;\n}\n\nexport function getClientAppUrl(): string {\n if (_clientConfig?.appUrl) {\n return _clientConfig.appUrl;\n }\n const envUrl = ENV.APP_URL;\n if (!envUrl) {\n throw new Error(\n \"App URL not configured. Use configureClientJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable.\",\n );\n }\n return envUrl.trim().replace(/\\/+$/, \"\");\n}\n\nexport function getClientTrackablePages(): ModuleWithPermissions[] {\n return _clientConfig?.trackablePages ?? [];\n}\n\nfunction runClientBootstrapper(): void {\n if (_clientConfig?.bootstrapper) {\n _clientConfig.bootstrapper();\n }\n}\n\n/**\n * Resolve the final request URL for an endpoint (client-side variant of `buildUrl`\n * in `unified/JsonApiRequest.ts` — kept in lockstep with it).\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 * `getClientApiUrl()` resolution. Omitting `baseUrl` preserves today's behaviour exactly.\n */\nexport function buildClientUrl(endpoint: string, baseUrl?: string): string {\n if (endpoint.startsWith(\"http\")) return endpoint;\n const apiUrl = baseUrl ?? getClientApiUrl();\n return `${apiUrl}${endpoint}`;\n}\n\nexport async function ClientJsonApiGet(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runClientBootstrapper();\n const token = await getClientToken();\n\n const apiResponse = await directFetch({\n method: \"GET\",\n url: buildClientUrl(params.endpoint, params.baseUrl),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _clientConfig?.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 ClientJsonApiGet({\n classKey: params.classKey,\n endpoint,\n companyId: params.companyId,\n language: params.language,\n baseUrl: params.baseUrl,\n }),\n });\n}\n\nexport async function ClientJsonApiPost(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 baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runClientBootstrapper();\n const token = await getClientToken();\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 directFetch({\n method: \"POST\",\n url: buildClientUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _clientConfig?.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 ClientJsonApiPut(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 baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runClientBootstrapper();\n const token = await getClientToken();\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 directFetch({\n method: \"PUT\",\n url: buildClientUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _clientConfig?.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 ClientJsonApiPatch(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 baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runClientBootstrapper();\n const token = await getClientToken();\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 directFetch({\n method: \"PATCH\",\n url: buildClientUrl(params.endpoint, params.baseUrl),\n token,\n body,\n files: params.files,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _clientConfig?.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 ClientJsonApiDelete(params: {\n classKey: ApiRequestDataTypeInterface;\n endpoint: string;\n companyId?: string;\n language: string;\n responseType?: ApiRequestDataTypeInterface;\n baseUrl?: string;\n}): Promise<ApiResponseInterface> {\n runClientBootstrapper();\n const token = await getClientToken();\n\n const apiResponse = await directFetch({\n method: \"DELETE\",\n url: buildClientUrl(params.endpoint, params.baseUrl),\n token,\n companyId: params.companyId,\n language: params.language,\n additionalHeaders: _clientConfig?.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"]}
@@ -4,7 +4,7 @@ import {
4
4
  isOfflineConfigured,
5
5
  reachesNetworkWhileOffline,
6
6
  setOfflineState
7
- } from "./chunk-27LQDGNP.mjs";
7
+ } from "./chunk-4ZJIUTIV.mjs";
8
8
  import {
9
9
  __name
10
10
  } from "./chunk-PAWJFY3S.mjs";
@@ -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-R25VQMH6.mjs");
24
+ const { writeThrough } = await import("./write-through-IWQKXYHE.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-QYFKA6AN.mjs");
36
+ const { localTransport } = await import("./local-transport-C7YTA4I7.mjs");
37
37
  return localTransport({ method: params.method, url: params.url, body: params.body, files: params.files });
38
38
  }
39
39
  __name(answerLocally, "answerLocally");
@@ -110,4 +110,4 @@ __name(fetchFromApi, "fetchFromApi");
110
110
  export {
111
111
  directFetch
112
112
  };
113
- //# sourceMappingURL=chunk-ZLTOUZN2.mjs.map
113
+ //# sourceMappingURL=chunk-M3N7LPHX.mjs.map
@@ -292,7 +292,7 @@ __name(getToken, "getToken");
292
292
  async function makeRequest(params) {
293
293
  if (typeof window !== "undefined") {
294
294
  if (!_directFetch) {
295
- const clientModule = await import("./request-SQOUNWZ4.mjs");
295
+ const clientModule = await import("./request-66FGJIHB.mjs");
296
296
  _directFetch = clientModule.directFetch;
297
297
  }
298
298
  return _directFetch({
@@ -516,4 +516,4 @@ export {
516
516
  JsonApiPatch,
517
517
  JsonApiDelete
518
518
  };
519
- //# sourceMappingURL=chunk-DGWOVYEC.mjs.map
519
+ //# sourceMappingURL=chunk-MQ7TXALH.mjs.map