@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.
- package/dist/{BlockNoteEditor-UBVEUFNR.js → BlockNoteEditor-CUNH4LSQ.js} +25 -25
- package/dist/{BlockNoteEditor-UBVEUFNR.js.map → BlockNoteEditor-CUNH4LSQ.js.map} +1 -1
- package/dist/{BlockNoteEditor-VXMDSQAA.mjs → BlockNoteEditor-QIVV2OB4.mjs} +10 -10
- package/dist/{BlockNoteViewer-2XYASA5Y.js → BlockNoteViewer-APBOPT4B.js} +8 -8
- package/dist/{BlockNoteViewer-2XYASA5Y.js.map → BlockNoteViewer-APBOPT4B.js.map} +1 -1
- package/dist/{BlockNoteViewer-NBW2H6LC.mjs → BlockNoteViewer-HIUAJQRI.mjs} +7 -7
- package/dist/JsonApiRequest-G4J2WTSU.js +26 -0
- package/dist/{JsonApiRequest-WISJZSDE.js.map → JsonApiRequest-G4J2WTSU.js.map} +1 -1
- package/dist/{JsonApiRequest-F6TMJ42G.mjs → JsonApiRequest-IKKHWCPB.mjs} +2 -2
- package/dist/billing/index.js +497 -497
- package/dist/billing/index.mjs +9 -9
- package/dist/{chunk-7DBJTNSU.mjs → chunk-4RPGFQBA.mjs} +2 -2
- package/dist/{chunk-BZ5J2FIV.js → chunk-4XLDBOSE.js} +11 -11
- package/dist/{chunk-BZ5J2FIV.js.map → chunk-4XLDBOSE.js.map} +1 -1
- package/dist/{chunk-27LQDGNP.mjs → chunk-4ZJIUTIV.mjs} +6 -1
- package/dist/chunk-4ZJIUTIV.mjs.map +1 -0
- package/dist/{chunk-PXDUJ47N.js → chunk-6RCZ64BQ.js} +18 -18
- package/dist/{chunk-PXDUJ47N.js.map → chunk-6RCZ64BQ.js.map} +1 -1
- package/dist/{chunk-7JZHPMGW.mjs → chunk-A3RB47X4.mjs} +44 -20
- package/dist/chunk-A3RB47X4.mjs.map +1 -0
- package/dist/{chunk-DOCIFE6A.mjs → chunk-AUD6ZLBB.mjs} +3 -3
- package/dist/{chunk-GB6DBFYY.js → chunk-DGN3PR2F.js} +3 -3
- package/dist/{chunk-GB6DBFYY.js.map → chunk-DGN3PR2F.js.map} +1 -1
- package/dist/{chunk-7ZHTPFFT.js → chunk-DJXSCARG.js} +15 -15
- package/dist/{chunk-7ZHTPFFT.js.map → chunk-DJXSCARG.js.map} +1 -1
- package/dist/{chunk-QKNGZDSQ.js → chunk-GM4VZTWL.js} +2 -2
- package/dist/{chunk-QKNGZDSQ.js.map → chunk-GM4VZTWL.js.map} +1 -1
- package/dist/{chunk-PYRZCKC2.js → chunk-GSRTVIIK.js} +923 -923
- package/dist/{chunk-PYRZCKC2.js.map → chunk-GSRTVIIK.js.map} +1 -1
- package/dist/{chunk-47BBY5KA.mjs → chunk-HAW5PNJG.mjs} +4 -4
- package/dist/{chunk-YRKIFYOE.mjs → chunk-KTGKW72G.mjs} +27 -8
- package/dist/chunk-KTGKW72G.mjs.map +1 -0
- package/dist/{chunk-PV4Z5W6V.js → chunk-KV4N7DEG.js} +19 -19
- package/dist/{chunk-PV4Z5W6V.js.map → chunk-KV4N7DEG.js.map} +1 -1
- package/dist/{chunk-ZLTOUZN2.mjs → chunk-M3N7LPHX.mjs} +4 -4
- package/dist/{chunk-DGWOVYEC.mjs → chunk-MQ7TXALH.mjs} +2 -2
- package/dist/{chunk-W62MHDWM.js → chunk-N5ZE2Z6I.js} +58 -34
- package/dist/chunk-N5ZE2Z6I.js.map +1 -0
- package/dist/{chunk-2SV4SS6N.js → chunk-OQQ7CZWT.js} +12 -12
- package/dist/{chunk-2SV4SS6N.js.map → chunk-OQQ7CZWT.js.map} +1 -1
- package/dist/{chunk-JJMMT24D.mjs → chunk-OUEYZOLB.mjs} +2 -2
- package/dist/{chunk-XXP3TQHF.mjs → chunk-OY65RYD3.mjs} +2 -2
- package/dist/{chunk-MOGEGWXW.js → chunk-PMESKNKL.js} +868 -868
- package/dist/{chunk-MOGEGWXW.js.map → chunk-PMESKNKL.js.map} +1 -1
- package/dist/{chunk-B6JGKDP2.js → chunk-QGVVF77L.js} +48 -29
- package/dist/chunk-QGVVF77L.js.map +1 -0
- package/dist/{chunk-BH6JWIKI.mjs → chunk-QIEF7HIL.mjs} +2 -2
- package/dist/{chunk-P445QGOC.mjs → chunk-RFKSJIQB.mjs} +7 -7
- package/dist/{chunk-6JUCIWDC.mjs → chunk-UOTHRJD2.mjs} +2 -2
- package/dist/{chunk-KMW7UNL2.js → chunk-WCEYT3GG.js} +8 -8
- package/dist/{chunk-KMW7UNL2.js.map → chunk-WCEYT3GG.js.map} +1 -1
- package/dist/{chunk-MHB36MYE.js → chunk-WUNSG3IN.js} +7 -2
- package/dist/chunk-WUNSG3IN.js.map +1 -0
- package/dist/{chunk-N4RZZKL5.mjs → chunk-YKNULEHB.mjs} +12 -12
- package/dist/{chunk-Z4POQWFG.js → chunk-ZYSNJKOP.js} +4 -4
- package/dist/{chunk-Z4POQWFG.js.map → chunk-ZYSNJKOP.js.map} +1 -1
- package/dist/client/index.js +10 -10
- package/dist/client/index.mjs +9 -9
- package/dist/components/index.js +10 -10
- package/dist/components/index.mjs +9 -9
- package/dist/contexts/index.js +10 -10
- package/dist/contexts/index.mjs +9 -9
- package/dist/core/index.js +7 -7
- package/dist/core/index.mjs +6 -6
- package/dist/email-automations/index.js +99 -99
- package/dist/email-automations/index.mjs +9 -9
- package/dist/features/analytics/index.js +126 -126
- package/dist/features/analytics/index.mjs +9 -9
- package/dist/features/analytics/server.js +10 -10
- package/dist/features/analytics/server.mjs +8 -8
- package/dist/features/blog/index.js +156 -156
- package/dist/features/blog/index.mjs +9 -9
- package/dist/features/blog/server.js +28 -28
- package/dist/features/blog/server.mjs +7 -7
- package/dist/features/help/index.js +43 -43
- package/dist/features/help/index.mjs +9 -9
- package/dist/features/tokenusage/index.js +132 -132
- package/dist/features/tokenusage/index.mjs +9 -9
- package/dist/index.js +8 -8
- package/dist/index.mjs +7 -7
- package/dist/{lifecycle-LKGPRBS7.mjs → lifecycle-KI3PCJSE.mjs} +3 -3
- package/dist/lifecycle-TO65I7TO.js +23 -0
- package/dist/{lifecycle-4GUOTB46.js.map → lifecycle-TO65I7TO.js.map} +1 -1
- package/dist/local-transport-4YDJ6FQG.js +15 -0
- package/dist/{local-transport-7H3SPZSA.js.map → local-transport-4YDJ6FQG.js.map} +1 -1
- package/dist/local-transport-C7YTA4I7.mjs +15 -0
- package/dist/offline/index.d.mts +160 -4
- package/dist/offline/index.d.ts +160 -4
- package/dist/offline/index.js +210 -163
- package/dist/offline/index.js.map +1 -1
- package/dist/offline/index.mjs +76 -29
- package/dist/offline/index.mjs.map +1 -1
- package/dist/request-66FGJIHB.mjs +10 -0
- package/dist/request-6W6UGKJV.js +10 -0
- package/dist/{request-KTBV6HHH.js.map → request-6W6UGKJV.js.map} +1 -1
- package/dist/server/index.js +9 -9
- package/dist/server/index.mjs +8 -8
- package/dist/write-through-BAPS24GL.js +15 -0
- package/dist/{write-through-FDQ7N4YI.js.map → write-through-BAPS24GL.js.map} +1 -1
- package/dist/write-through-IWQKXYHE.mjs +15 -0
- package/package.json +1 -1
- package/src/offline/__tests__/generic-answers.spec.ts +146 -3
- package/src/offline/__tests__/local-transport.spec.ts +15 -1
- package/src/offline/__tests__/offline-fixtures.ts +29 -2
- package/src/offline/__tests__/write-through.spec.ts +27 -1
- package/src/offline/config.ts +9 -0
- package/src/offline/generic-answers.ts +44 -17
- package/src/offline/index.ts +2 -0
- package/src/offline/local-transport.ts +5 -3
- package/src/offline/sync/__tests__/runtime.spec.ts +30 -1
- package/src/offline/sync/__tests__/sync-fixtures.ts +22 -0
- package/src/offline/sync/__tests__/sync-root.spec.ts +184 -1
- package/src/offline/sync/known-roots.ts +29 -7
- package/src/offline/sync/runtime.ts +3 -2
- package/src/offline/sync/sync-root.ts +70 -19
- package/src/offline/types.ts +39 -1
- package/src/offline/write-through.ts +6 -3
- package/dist/JsonApiRequest-WISJZSDE.js +0 -26
- package/dist/chunk-27LQDGNP.mjs.map +0 -1
- package/dist/chunk-7JZHPMGW.mjs.map +0 -1
- package/dist/chunk-B6JGKDP2.js.map +0 -1
- package/dist/chunk-MHB36MYE.js.map +0 -1
- package/dist/chunk-W62MHDWM.js.map +0 -1
- package/dist/chunk-YRKIFYOE.mjs.map +0 -1
- package/dist/lifecycle-4GUOTB46.js +0 -23
- package/dist/local-transport-7H3SPZSA.js +0 -15
- package/dist/local-transport-QYFKA6AN.mjs +0 -15
- package/dist/request-KTBV6HHH.js +0 -10
- package/dist/request-SQOUNWZ4.mjs +0 -10
- package/dist/write-through-FDQ7N4YI.js +0 -15
- package/dist/write-through-R25VQMH6.mjs +0 -15
- /package/dist/{BlockNoteEditor-VXMDSQAA.mjs.map → BlockNoteEditor-QIVV2OB4.mjs.map} +0 -0
- /package/dist/{BlockNoteViewer-NBW2H6LC.mjs.map → BlockNoteViewer-HIUAJQRI.mjs.map} +0 -0
- /package/dist/{JsonApiRequest-F6TMJ42G.mjs.map → JsonApiRequest-IKKHWCPB.mjs.map} +0 -0
- /package/dist/{chunk-7DBJTNSU.mjs.map → chunk-4RPGFQBA.mjs.map} +0 -0
- /package/dist/{chunk-DOCIFE6A.mjs.map → chunk-AUD6ZLBB.mjs.map} +0 -0
- /package/dist/{chunk-47BBY5KA.mjs.map → chunk-HAW5PNJG.mjs.map} +0 -0
- /package/dist/{chunk-ZLTOUZN2.mjs.map → chunk-M3N7LPHX.mjs.map} +0 -0
- /package/dist/{chunk-DGWOVYEC.mjs.map → chunk-MQ7TXALH.mjs.map} +0 -0
- /package/dist/{chunk-JJMMT24D.mjs.map → chunk-OUEYZOLB.mjs.map} +0 -0
- /package/dist/{chunk-XXP3TQHF.mjs.map → chunk-OY65RYD3.mjs.map} +0 -0
- /package/dist/{chunk-BH6JWIKI.mjs.map → chunk-QIEF7HIL.mjs.map} +0 -0
- /package/dist/{chunk-P445QGOC.mjs.map → chunk-RFKSJIQB.mjs.map} +0 -0
- /package/dist/{chunk-6JUCIWDC.mjs.map → chunk-UOTHRJD2.mjs.map} +0 -0
- /package/dist/{chunk-N4RZZKL5.mjs.map → chunk-YKNULEHB.mjs.map} +0 -0
- /package/dist/{lifecycle-LKGPRBS7.mjs.map → lifecycle-KI3PCJSE.mjs.map} +0 -0
- /package/dist/{local-transport-QYFKA6AN.mjs.map → local-transport-C7YTA4I7.mjs.map} +0 -0
- /package/dist/{request-SQOUNWZ4.mjs.map → request-66FGJIHB.mjs.map} +0 -0
- /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-
|
|
3
|
+
} from "./chunk-RFKSJIQB.mjs";
|
|
4
4
|
import {
|
|
5
5
|
EndpointCreator,
|
|
6
6
|
Modules,
|
|
7
7
|
useI18nTranslations
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-UOTHRJD2.mjs";
|
|
9
9
|
import {
|
|
10
10
|
ENV,
|
|
11
11
|
setBootstrapper
|
|
12
|
-
} from "./chunk-
|
|
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-
|
|
345
|
+
//# sourceMappingURL=chunk-HAW5PNJG.mjs.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
cacheArtworkImage,
|
|
3
3
|
imageUrlOf,
|
|
4
4
|
isRootLocked
|
|
5
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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
|
|
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
|
|
180
|
-
const pathRootId =
|
|
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-
|
|
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
|
|
3
|
+
var _chunkWCEYT3GGjs = require('./chunk-WCEYT3GG.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
105
|
+
body = _chunkGM4VZTWLjs.JsonApiDataFactory.create(params.classKey, body);
|
|
106
106
|
}
|
|
107
|
-
const apiResponse = await
|
|
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
|
|
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 =
|
|
132
|
+
body = _chunkGM4VZTWLjs.JsonApiDataFactory.create(params.classKey, body);
|
|
133
133
|
}
|
|
134
|
-
const apiResponse = await
|
|
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
|
|
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 =
|
|
159
|
+
body = _chunkGM4VZTWLjs.JsonApiDataFactory.create(params.classKey, body);
|
|
160
160
|
}
|
|
161
|
-
const apiResponse = await
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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":"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","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":"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-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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
519
|
+
//# sourceMappingURL=chunk-MQ7TXALH.mjs.map
|