@b10cks/client 1.2.2 → 1.4.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/README.md +228 -40
- package/dist/index.d.ts +242 -9
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +253 -75
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,33 +1,122 @@
|
|
|
1
|
-
|
|
1
|
+
function j(s) {
|
|
2
|
+
if (!s) return;
|
|
3
|
+
if (s.type === "email") {
|
|
4
|
+
const n = new URLSearchParams();
|
|
5
|
+
s.subject && n.set("subject", s.subject), s.body && n.set("body", s.body), s.cc && n.set("cc", s.cc), s.bcc && n.set("bcc", s.bcc);
|
|
6
|
+
const i = n.toString();
|
|
7
|
+
return { href: `mailto:${s.email}${i ? `?${i}` : ""}`, target: "_self" };
|
|
8
|
+
}
|
|
9
|
+
if (s.type === "asset")
|
|
10
|
+
return;
|
|
11
|
+
const t = s.target ?? "_self";
|
|
12
|
+
let e = s.url ?? "";
|
|
13
|
+
return "anchor" in s && s.anchor && (e = `${e.trimEnd()}#${s.anchor}`), { href: e, target: t };
|
|
14
|
+
}
|
|
15
|
+
function v(s) {
|
|
16
|
+
if (s != null) {
|
|
17
|
+
if (typeof s == "boolean" || typeof s == "number") return String(s);
|
|
18
|
+
if (typeof s == "string") return s;
|
|
19
|
+
if (typeof s == "object" && !Array.isArray(s)) {
|
|
20
|
+
const t = s;
|
|
21
|
+
if ("null" in t) return "null:";
|
|
22
|
+
if ("!null" in t) return "!null:";
|
|
23
|
+
if ("between" in t) {
|
|
24
|
+
const [n, i] = t.between;
|
|
25
|
+
return `${n}...${i}`;
|
|
26
|
+
}
|
|
27
|
+
const e = [
|
|
28
|
+
"eq",
|
|
29
|
+
"neq",
|
|
30
|
+
"like",
|
|
31
|
+
"!like",
|
|
32
|
+
"^like",
|
|
33
|
+
"like$",
|
|
34
|
+
"lt",
|
|
35
|
+
"gt",
|
|
36
|
+
"lte",
|
|
37
|
+
"gte",
|
|
38
|
+
"in",
|
|
39
|
+
"!in",
|
|
40
|
+
"empty",
|
|
41
|
+
"!empty"
|
|
42
|
+
];
|
|
43
|
+
for (const n of e)
|
|
44
|
+
if (n in t) {
|
|
45
|
+
const i = t[n];
|
|
46
|
+
return Array.isArray(i) ? `${n}:${i.join(",")}` : `${n}:${String(i)}`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function R(s) {
|
|
52
|
+
const t = {};
|
|
53
|
+
for (const [e, n] of Object.entries(s)) {
|
|
54
|
+
const i = v(n);
|
|
55
|
+
i !== void 0 && (t[e] = i);
|
|
56
|
+
}
|
|
57
|
+
return t;
|
|
58
|
+
}
|
|
59
|
+
function f(s, t, e) {
|
|
60
|
+
const n = t && typeof t == "object" ? R(t) : {}, i = Array.isArray(e) ? { sort: e.join(",") } : e != null ? { sort: e } : {};
|
|
61
|
+
return { ...s, ...n, ...i };
|
|
62
|
+
}
|
|
63
|
+
class C {
|
|
2
64
|
constructor(t) {
|
|
3
65
|
this.client = t;
|
|
4
66
|
}
|
|
5
67
|
redirectsCache = null;
|
|
6
68
|
configCache = /* @__PURE__ */ new Map();
|
|
7
69
|
async getResource(t, e = {}) {
|
|
8
|
-
const
|
|
9
|
-
return this.unwrapResource(
|
|
70
|
+
const n = await this.client.get(t, e);
|
|
71
|
+
return this.unwrapResource(n);
|
|
10
72
|
}
|
|
11
|
-
async getCollection(t, e = {},
|
|
12
|
-
if (
|
|
73
|
+
async getCollection(t, e = {}, n = {}) {
|
|
74
|
+
if (n.allPages)
|
|
13
75
|
return this.client.getAll(t, e);
|
|
14
|
-
const
|
|
15
|
-
return this.unwrapCollection(
|
|
76
|
+
const i = await this.client.get(t, e);
|
|
77
|
+
return this.unwrapCollection(i);
|
|
16
78
|
}
|
|
17
79
|
async getContent(t, e = {}) {
|
|
18
80
|
return this.getResource(`contents/${t}`, e);
|
|
19
81
|
}
|
|
20
82
|
async getContents(t = {}, e = {}) {
|
|
21
|
-
|
|
83
|
+
const { filter: n, sort: i, ...r } = t;
|
|
84
|
+
return this.getCollection(
|
|
85
|
+
"contents",
|
|
86
|
+
f(r, n, i),
|
|
87
|
+
e
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
async getBlock(t, e = {}) {
|
|
91
|
+
return this.getResource(`blocks/${t}`, e);
|
|
22
92
|
}
|
|
23
93
|
async getBlocks(t = {}, e = {}) {
|
|
24
|
-
|
|
94
|
+
const { filter: n, ...i } = t;
|
|
95
|
+
return this.getCollection(
|
|
96
|
+
"blocks",
|
|
97
|
+
f(i, n, void 0),
|
|
98
|
+
e
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
async search(t) {
|
|
102
|
+
const e = await this.client.get(
|
|
103
|
+
"search",
|
|
104
|
+
t
|
|
105
|
+
);
|
|
106
|
+
if (typeof e == "object" && e !== null && "data" in e && "meta" in e)
|
|
107
|
+
return e;
|
|
108
|
+
if (typeof e == "object" && e !== null && "data" in e) {
|
|
109
|
+
const n = e.data;
|
|
110
|
+
if (typeof n == "object" && n !== null && "meta" in n && "data" in n)
|
|
111
|
+
return n;
|
|
112
|
+
}
|
|
113
|
+
return e;
|
|
25
114
|
}
|
|
26
115
|
async getSitemap(t = {}, e = {}) {
|
|
27
116
|
return this.getCollection("sitemap", t, e);
|
|
28
117
|
}
|
|
29
|
-
async getDataEntries(t, e = {},
|
|
30
|
-
return this.getCollection(`datasources/${t}/entries`, e,
|
|
118
|
+
async getDataEntries(t, e = {}, n = {}) {
|
|
119
|
+
return this.getCollection(`datasources/${t}/entries`, e, n);
|
|
31
120
|
}
|
|
32
121
|
async getDataSources(t = {}, e = {}) {
|
|
33
122
|
return this.getCollection("datasources", t, e);
|
|
@@ -35,34 +124,41 @@ class d {
|
|
|
35
124
|
async getSpace(t = {}) {
|
|
36
125
|
return this.getResource("spaces/me", t);
|
|
37
126
|
}
|
|
127
|
+
async lookupRedirect(t) {
|
|
128
|
+
if (!this.client.post)
|
|
129
|
+
throw new Error(
|
|
130
|
+
"lookupRedirect requires a client that supports POST. Use ApiClient from @b10cks/client."
|
|
131
|
+
);
|
|
132
|
+
return this.client.post("redirects/lookup", { source: t });
|
|
133
|
+
}
|
|
38
134
|
async getRedirects(t = {}, e = !1) {
|
|
39
|
-
const { allPages:
|
|
40
|
-
if (
|
|
135
|
+
const { allPages: n = !1, forceRefresh: i = !1 } = typeof e == "boolean" ? { allPages: !0, forceRefresh: e } : e;
|
|
136
|
+
if (n && this.redirectsCache && !i)
|
|
41
137
|
return this.redirectsCache;
|
|
42
|
-
const
|
|
43
|
-
|
|
138
|
+
const { filter: r, ...a } = t, o = f(a, r, void 0), u = await this.getCollection("redirects", o, { allPages: n }), l = Object.fromEntries(
|
|
139
|
+
u.map(({ source: m, target: b, status_code: w }) => [m, { target: b, status_code: w }])
|
|
44
140
|
);
|
|
45
|
-
return
|
|
141
|
+
return n && (this.redirectsCache = l), l;
|
|
46
142
|
}
|
|
47
143
|
async getConfig({
|
|
48
144
|
slug: t = "_config",
|
|
49
145
|
language_iso: e,
|
|
50
|
-
language:
|
|
51
|
-
bypassCache:
|
|
52
|
-
...
|
|
146
|
+
language: n,
|
|
147
|
+
bypassCache: i = !1,
|
|
148
|
+
...r
|
|
53
149
|
} = {}) {
|
|
54
|
-
const
|
|
55
|
-
if (!
|
|
56
|
-
return this.configCache.get(
|
|
150
|
+
const a = e ?? n, o = JSON.stringify({ slug: t, language_iso: a, ...r });
|
|
151
|
+
if (!i && this.configCache.has(o))
|
|
152
|
+
return this.configCache.get(o);
|
|
57
153
|
const l = (await this.getContent(t, {
|
|
58
|
-
...
|
|
59
|
-
language_iso:
|
|
154
|
+
...r,
|
|
155
|
+
language_iso: a
|
|
60
156
|
})).content ?? {};
|
|
61
|
-
return
|
|
157
|
+
return i || this.configCache.set(o, l), l;
|
|
62
158
|
}
|
|
63
159
|
async syncRevision(t = 426713400) {
|
|
64
|
-
const
|
|
65
|
-
return this.client.setRv(
|
|
160
|
+
const n = (await this.getSpace()).rv || t;
|
|
161
|
+
return this.client.setRv(n), n;
|
|
66
162
|
}
|
|
67
163
|
clearCache() {
|
|
68
164
|
this.redirectsCache = null, this.configCache.clear();
|
|
@@ -82,8 +178,8 @@ class d {
|
|
|
82
178
|
return [];
|
|
83
179
|
}
|
|
84
180
|
}
|
|
85
|
-
function
|
|
86
|
-
return new
|
|
181
|
+
function $(s) {
|
|
182
|
+
return new C(s);
|
|
87
183
|
}
|
|
88
184
|
class c {
|
|
89
185
|
static instance;
|
|
@@ -109,9 +205,9 @@ class c {
|
|
|
109
205
|
if (!this.isInPreviewMode())
|
|
110
206
|
return () => {
|
|
111
207
|
};
|
|
112
|
-
const
|
|
113
|
-
return this.listeners[t] =
|
|
114
|
-
|
|
208
|
+
const n = this.listeners[t] || /* @__PURE__ */ new Set();
|
|
209
|
+
return this.listeners[t] = n, n.add(e), () => {
|
|
210
|
+
n.delete(e);
|
|
115
211
|
};
|
|
116
212
|
}
|
|
117
213
|
selectItem(t) {
|
|
@@ -123,11 +219,11 @@ class c {
|
|
|
123
219
|
"*"
|
|
124
220
|
);
|
|
125
221
|
}
|
|
126
|
-
updateField(t, e,
|
|
222
|
+
updateField(t, e, n) {
|
|
127
223
|
this.isInPreviewMode() && window.parent.postMessage(
|
|
128
224
|
{
|
|
129
225
|
type: "FIELD_UPDATE",
|
|
130
|
-
payload: { itemId: t, field: e, value:
|
|
226
|
+
payload: { itemId: t, field: e, value: n }
|
|
131
227
|
},
|
|
132
228
|
"*"
|
|
133
229
|
);
|
|
@@ -135,21 +231,83 @@ class c {
|
|
|
135
231
|
handleMessage = (t) => {
|
|
136
232
|
if (!t.data || typeof t.data != "object")
|
|
137
233
|
return;
|
|
138
|
-
const { type: e, payload:
|
|
139
|
-
!e || !
|
|
234
|
+
const { type: e, payload: n } = t.data;
|
|
235
|
+
!e || !n || this.notify(e, n);
|
|
140
236
|
};
|
|
141
237
|
notify(t, e) {
|
|
142
|
-
const
|
|
143
|
-
if (
|
|
144
|
-
for (const
|
|
145
|
-
|
|
238
|
+
const n = this.listeners[t];
|
|
239
|
+
if (n)
|
|
240
|
+
for (const i of n)
|
|
241
|
+
i(e);
|
|
146
242
|
}
|
|
147
243
|
}
|
|
148
|
-
const
|
|
244
|
+
const A = c.getInstance();
|
|
245
|
+
function p(s) {
|
|
246
|
+
return (s ?? "").trim().replace(/^\/+|\/+$/g, "");
|
|
247
|
+
}
|
|
248
|
+
function y(s, t) {
|
|
249
|
+
const e = p(s), n = p(t);
|
|
250
|
+
if (!n)
|
|
251
|
+
return e && e !== "home" ? `/${e}` : "/";
|
|
252
|
+
if (!e || e === "home")
|
|
253
|
+
return `/${n}`;
|
|
254
|
+
const i = `${n}/`;
|
|
255
|
+
return e === n || e.startsWith(i) ? `/${e}` : `/${n}/${e}`;
|
|
256
|
+
}
|
|
257
|
+
function g(s, t) {
|
|
258
|
+
if (!t) return null;
|
|
259
|
+
try {
|
|
260
|
+
return new URL(s, t).toString();
|
|
261
|
+
} catch {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
function d(s) {
|
|
266
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
267
|
+
}
|
|
268
|
+
function S(s, t = {}) {
|
|
269
|
+
const { siteUrl: e, locale: n } = t, i = /* @__PURE__ */ new Set();
|
|
270
|
+
return s.filter((r) => {
|
|
271
|
+
if (n && r.language_iso !== n || r.meta?.robots?.toLowerCase().includes("noindex")) return !1;
|
|
272
|
+
const a = y(r.full_slug, r.language_iso), o = e ? g(a, e) ?? a : a;
|
|
273
|
+
return i.has(o) ? !1 : (i.add(o), !0);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
function P(s, t) {
|
|
277
|
+
return [
|
|
278
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
279
|
+
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
|
|
280
|
+
s.map((n) => {
|
|
281
|
+
const i = y(n.full_slug, n.language_iso), r = t ? g(i, t) : i;
|
|
282
|
+
if (!r) return "";
|
|
283
|
+
const a = [" <url>", ` <loc>${d(r)}</loc>`];
|
|
284
|
+
return n.published_at && a.push(` <lastmod>${d(n.published_at)}</lastmod>`), a.push(" </url>"), a.join(`
|
|
285
|
+
`);
|
|
286
|
+
}).filter(Boolean).join(`
|
|
287
|
+
`),
|
|
288
|
+
"</urlset>"
|
|
289
|
+
].join(`
|
|
290
|
+
`);
|
|
291
|
+
}
|
|
292
|
+
function F(s, t) {
|
|
293
|
+
return [
|
|
294
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
295
|
+
'<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
|
|
296
|
+
s.map((n) => {
|
|
297
|
+
const i = t ? g(n, t) : n;
|
|
298
|
+
return i ? [" <sitemap>", ` <loc>${d(i)}</loc>`, " </sitemap>"].join(`
|
|
299
|
+
`) : "";
|
|
300
|
+
}).filter(Boolean).join(`
|
|
301
|
+
`),
|
|
302
|
+
"</sitemapindex>"
|
|
303
|
+
].join(`
|
|
304
|
+
`);
|
|
305
|
+
}
|
|
306
|
+
const _ = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
149
307
|
__proto__: null
|
|
150
308
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
151
|
-
let
|
|
152
|
-
class
|
|
309
|
+
let h = 0;
|
|
310
|
+
class E {
|
|
153
311
|
baseUrl;
|
|
154
312
|
token;
|
|
155
313
|
vid;
|
|
@@ -158,48 +316,61 @@ class R {
|
|
|
158
316
|
setRvFn;
|
|
159
317
|
constructor(t, e) {
|
|
160
318
|
this.baseUrl = t.baseUrl.endsWith("/") ? t.baseUrl.slice(0, -1) : t.baseUrl, this.token = t.token;
|
|
161
|
-
const
|
|
319
|
+
const n = typeof globalThis.fetch == "function" ? globalThis.fetch.bind(globalThis) : null;
|
|
162
320
|
if (t.fetchClient)
|
|
163
321
|
this.fetchClient = t.fetchClient;
|
|
164
|
-
else if (
|
|
165
|
-
this.fetchClient =
|
|
322
|
+
else if (n)
|
|
323
|
+
this.fetchClient = n;
|
|
166
324
|
else
|
|
167
325
|
throw new Error(
|
|
168
326
|
"No fetch implementation available. Provide `fetchClient` in ApiClient options."
|
|
169
327
|
);
|
|
170
328
|
this.getRvFn = t.getRv, this.setRvFn = t.setRv;
|
|
171
|
-
const
|
|
172
|
-
this.vid = t.version || "published", this.setRv(
|
|
329
|
+
const i = this.resolveRequestUrl(e);
|
|
330
|
+
this.vid = t.version || "published", this.setRv(i?.searchParams.get("b10cks_rv") || t.rv || h);
|
|
173
331
|
}
|
|
174
332
|
async get(t, e = {}) {
|
|
175
|
-
const
|
|
333
|
+
const n = this.buildUrl(t, {
|
|
176
334
|
vid: this.vid,
|
|
335
|
+
rv: this.getRv(),
|
|
177
336
|
...e,
|
|
337
|
+
token: this.token
|
|
338
|
+
}), i = await this.fetchClient(n), r = await this.parseResponse(i);
|
|
339
|
+
return this.hasRevision(r) && this.setRv(r.rv), r;
|
|
340
|
+
}
|
|
341
|
+
async post(t, e, n = {}) {
|
|
342
|
+
const i = this.buildUrl(t, {
|
|
343
|
+
vid: this.vid,
|
|
178
344
|
rv: this.getRv(),
|
|
345
|
+
...n,
|
|
179
346
|
token: this.token
|
|
180
|
-
}),
|
|
181
|
-
|
|
347
|
+
}), r = await this.fetchClient(i, {
|
|
348
|
+
method: "POST",
|
|
349
|
+
headers: { "Content-Type": "application/json" },
|
|
350
|
+
body: e !== void 0 ? JSON.stringify(e) : void 0
|
|
351
|
+
});
|
|
352
|
+
return this.parseResponse(r);
|
|
182
353
|
}
|
|
183
354
|
async getAll(t, e = {}) {
|
|
184
|
-
const
|
|
355
|
+
const n = await this.get(t, {
|
|
185
356
|
...e,
|
|
186
357
|
page: 1
|
|
187
|
-
}),
|
|
188
|
-
if (
|
|
189
|
-
return
|
|
190
|
-
const
|
|
191
|
-
{ length:
|
|
192
|
-
(
|
|
193
|
-
),
|
|
194
|
-
return
|
|
195
|
-
|
|
358
|
+
}), i = this.normalizeCollectionResponse(n);
|
|
359
|
+
if (i.rv && this.setRv(i.rv), !i.meta || i.meta.last_page <= 1)
|
|
360
|
+
return i.data;
|
|
361
|
+
const r = Array.from(
|
|
362
|
+
{ length: i.meta.last_page - 1 },
|
|
363
|
+
(o, u) => this.get(t, { ...e, page: u + 2 })
|
|
364
|
+
), a = await Promise.all(r);
|
|
365
|
+
return i.data.concat(
|
|
366
|
+
a.flatMap((o) => this.normalizeCollectionResponse(o).data)
|
|
196
367
|
);
|
|
197
368
|
}
|
|
198
369
|
setRv(t) {
|
|
199
|
-
this.setRvFn ? this.setRvFn(t) :
|
|
370
|
+
this.setRvFn ? this.setRvFn(t) : h = t;
|
|
200
371
|
}
|
|
201
372
|
getRv() {
|
|
202
|
-
return this.getRvFn ? this.getRvFn() :
|
|
373
|
+
return this.getRvFn ? this.getRvFn() : h;
|
|
203
374
|
}
|
|
204
375
|
async parseResponse(t) {
|
|
205
376
|
if (this.isFetchResponse(t)) {
|
|
@@ -223,18 +394,18 @@ class R {
|
|
|
223
394
|
if (typeof t == "object" && t !== null && "data" in t) {
|
|
224
395
|
const {
|
|
225
396
|
data: e,
|
|
226
|
-
meta:
|
|
227
|
-
rv:
|
|
397
|
+
meta: n,
|
|
398
|
+
rv: i
|
|
228
399
|
} = t;
|
|
229
|
-
return { data: e, meta:
|
|
400
|
+
return { data: e, meta: n, rv: i };
|
|
230
401
|
}
|
|
231
402
|
return { data: [], meta: void 0, rv: void 0 };
|
|
232
403
|
}
|
|
233
404
|
buildUrl(t, e) {
|
|
234
|
-
const
|
|
235
|
-
return Object.entries(e).forEach(([
|
|
236
|
-
|
|
237
|
-
}),
|
|
405
|
+
const n = new URL(`${this.baseUrl}/v1/${t}`);
|
|
406
|
+
return Object.entries(e).forEach(([i, r]) => {
|
|
407
|
+
r != null && n.searchParams.append(i, String(r));
|
|
408
|
+
}), n.toString();
|
|
238
409
|
}
|
|
239
410
|
resolveRequestUrl(t) {
|
|
240
411
|
return t ? t instanceof URL ? t : new URL(t, "http://localhost") : null;
|
|
@@ -250,11 +421,18 @@ class R {
|
|
|
250
421
|
}
|
|
251
422
|
}
|
|
252
423
|
export {
|
|
253
|
-
|
|
254
|
-
|
|
424
|
+
E as ApiClient,
|
|
425
|
+
C as B10cksDataApi,
|
|
255
426
|
c as PreviewBridge,
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
427
|
+
y as buildLocalizedPath,
|
|
428
|
+
$ as createB10cksDataApi,
|
|
429
|
+
S as filterSitemapEntries,
|
|
430
|
+
p as normalizePathSegment,
|
|
431
|
+
A as previewBridge,
|
|
432
|
+
F as renderSitemapIndex,
|
|
433
|
+
P as renderSitemapXml,
|
|
434
|
+
j as resolveB10cksLink,
|
|
435
|
+
R as serializeFilter,
|
|
436
|
+
_ as types
|
|
259
437
|
};
|
|
260
438
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/data-api.ts","../src/preview-bridge.ts","../src/index.ts"],"sourcesContent":["import type {\n IBCollectionResponse,\n Endpoint,\n IBBaseQueryParams,\n IBBlock,\n IBContent,\n IBContentQueryParams,\n IBDataEntry,\n IBDataSource,\n IBRedirect,\n IBSitemapEntry,\n IBSpace,\n} from './types'\n\ntype ApiQueryParams = Omit<IBBaseQueryParams, 'token'>\ntype ApiCollectionResponse<T> =\n | T[]\n | IBCollectionResponse<T>\n | { data: T[]; rv?: string | number }\n | { data: IBCollectionResponse<T>; rv?: string | number }\ntype ApiCollectionResult<T> =\n | ApiCollectionResponse<T>\n | { data: ApiCollectionResponse<T>; rv?: string | number }\n\nexport interface CollectionFetchOptions {\n allPages?: boolean\n}\n\nexport interface RedirectFetchOptions extends CollectionFetchOptions {\n forceRefresh?: boolean\n}\n\nexport interface DataApiClient {\n get<T>(\n endpoint: Endpoint,\n params?: ApiQueryParams\n ): Promise<T | { data: T; rv?: string | number }>\n getAll<T>(endpoint: Endpoint, params?: ApiQueryParams): Promise<T[]>\n setRv(value: string | number): void\n}\n\nexport type RedirectMap = Record<string, { target: string; status_code: number }>\n\nexport interface GetConfigOptions extends Omit<IBContentQueryParams, 'token' | 'full_slug'> {\n slug?: string\n language?: string\n bypassCache?: boolean\n}\n\nexport class B10cksDataApi {\n private redirectsCache: RedirectMap | null = null\n private readonly configCache = new Map<string, unknown>()\n\n constructor(private readonly client: DataApiClient) {}\n\n async getResource<T>(endpoint: Endpoint, params: ApiQueryParams = {}): Promise<T> {\n const response = await this.client.get<T>(endpoint, params)\n return this.unwrapResource(response)\n }\n\n async getCollection<T>(\n endpoint: Endpoint,\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<T[]> {\n if (options.allPages) {\n return this.client.getAll<T>(endpoint, params)\n }\n\n const response = await this.client.get<ApiCollectionResponse<T>>(endpoint, params)\n return this.unwrapCollection(response)\n }\n\n async getContent<T = Record<string, unknown>>(\n fullSlug: string,\n params: Omit<IBContentQueryParams, 'token' | 'full_slug'> = {}\n ): Promise<IBContent<T>> {\n return this.getResource<IBContent<T>>(`contents/${fullSlug}`, params)\n }\n\n async getContents<T = Record<string, unknown>>(\n params: Omit<IBContentQueryParams, 'token'> = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBContent<T>[]> {\n return this.getCollection<IBContent<T>>('contents', params, options)\n }\n\n async getBlocks(params: ApiQueryParams = {}, options: CollectionFetchOptions = {}): Promise<IBBlock[]> {\n return this.getCollection<IBBlock>('blocks', params, options)\n }\n\n async getSitemap(\n params: Omit<IBContentQueryParams, 'token'> = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBSitemapEntry[]> {\n return this.getCollection<IBSitemapEntry>('sitemap', params, options)\n }\n\n async getDataEntries(\n source: string,\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBDataEntry[]> {\n return this.getCollection<IBDataEntry>(`datasources/${source}/entries`, params, options)\n }\n\n async getDataSources(\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBDataSource[]> {\n return this.getCollection<IBDataSource>('datasources', params, options)\n }\n\n async getSpace(params: ApiQueryParams = {}): Promise<IBSpace> {\n return this.getResource<IBSpace>('spaces/me', params)\n }\n\n async getRedirects(params?: ApiQueryParams, forceRefresh?: boolean): Promise<RedirectMap>\n async getRedirects(params?: ApiQueryParams, options?: RedirectFetchOptions): Promise<RedirectMap>\n async getRedirects(\n params: ApiQueryParams = {},\n forceRefreshOrOptions: boolean | RedirectFetchOptions = false\n ): Promise<RedirectMap> {\n const { allPages = false, forceRefresh = false } =\n typeof forceRefreshOrOptions === 'boolean'\n ? { allPages: true, forceRefresh: forceRefreshOrOptions }\n : forceRefreshOrOptions\n\n if (allPages && this.redirectsCache && !forceRefresh) {\n return this.redirectsCache\n }\n\n const redirects = await this.getCollection<IBRedirect>('redirects', params, { allPages })\n const map = Object.fromEntries(\n redirects.map(({ source, target, status_code }) => [source, { target, status_code }])\n )\n\n if (allPages) {\n this.redirectsCache = map\n }\n\n return map\n }\n\n async getConfig<T = Record<string, unknown>>({\n slug = '_config',\n language_iso,\n language,\n bypassCache = false,\n ...params\n }: GetConfigOptions = {}): Promise<T> {\n const normalizedLanguage = language_iso ?? language\n const cacheKey = JSON.stringify({ slug, language_iso: normalizedLanguage, ...params })\n if (!bypassCache && this.configCache.has(cacheKey)) {\n return this.configCache.get(cacheKey) as T\n }\n\n const configContent = await this.getContent<Record<string, unknown>>(slug, {\n ...params,\n language_iso: normalizedLanguage,\n })\n const value = (configContent.content ?? {}) as T\n\n if (!bypassCache) {\n this.configCache.set(cacheKey, value)\n }\n\n return value\n }\n\n async syncRevision(fallbackRv = 426713400): Promise<string | number> {\n const space = await this.getSpace()\n const nextRv = space.rv || fallbackRv\n this.client.setRv(nextRv)\n return nextRv\n }\n\n clearCache() {\n this.redirectsCache = null\n this.configCache.clear()\n }\n\n private unwrapResource<T>(response: T | { data: T }): T {\n if (typeof response === 'object' && response !== null && 'data' in response) {\n return response.data\n }\n\n return response\n }\n\n private unwrapCollection<T>(response: ApiCollectionResult<T>): T[] {\n if (Array.isArray(response)) {\n return response\n }\n\n if (typeof response === 'object' && response !== null && 'data' in response) {\n if (Array.isArray(response.data)) {\n return response.data\n }\n\n if (\n typeof response.data === 'object' &&\n response.data !== null &&\n 'data' in response.data &&\n Array.isArray(response.data.data)\n ) {\n return response.data.data\n }\n }\n\n return []\n }\n}\n\nexport function createB10cksDataApi(client: DataApiClient): B10cksDataApi {\n return new B10cksDataApi(client)\n}\n","export type ContentUpdateEvent = {\n content: Record<string, unknown>\n}\n\nexport type SelectUpdateEvent = {\n selectedItem: string\n}\n\nexport type FieldUpdateEvent = {\n itemId: string\n field: string\n value: string\n}\n\nexport type EventType = 'CONTENT_UPDATE' | 'SELECT_UPDATE' | 'HOVER_UPDATE' | 'FIELD_UPDATE'\n\nexport type EventPayloadMap = {\n CONTENT_UPDATE: ContentUpdateEvent\n SELECT_UPDATE: SelectUpdateEvent\n HOVER_UPDATE: SelectUpdateEvent\n FIELD_UPDATE: FieldUpdateEvent\n}\n\ntype EventCallback<T> = (payload: T) => void\n\nexport type BridgeEvent = {\n type: EventType\n payload: EventPayloadMap[EventType]\n b10cksId?: string\n}\n\nexport class PreviewBridge {\n private static instance: PreviewBridge\n private readonly listeners: Partial<Record<EventType, Set<EventCallback<unknown>>>> = {}\n private initialized = false\n\n private constructor() {}\n\n static getInstance() {\n if (!PreviewBridge.instance) {\n PreviewBridge.instance = new PreviewBridge()\n }\n return PreviewBridge.instance\n }\n\n init() {\n if (!this.isInPreviewMode() || this.initialized) {\n return\n }\n\n window.addEventListener('message', this.handleMessage)\n this.initialized = true\n }\n\n destroy() {\n if (this.initialized && typeof window !== 'undefined') {\n window.removeEventListener('message', this.handleMessage)\n }\n this.initialized = false\n for (const eventType of Object.keys(this.listeners) as EventType[]) {\n this.listeners[eventType]?.clear()\n }\n }\n\n isInPreviewMode(): boolean {\n return typeof window !== 'undefined' && window.self !== window.top\n }\n\n on<T extends EventType>(eventType: T, callback: EventCallback<EventPayloadMap[T]>): () => void {\n if (!this.isInPreviewMode()) {\n return () => {}\n }\n\n const listeners = this.listeners[eventType] || new Set<EventCallback<unknown>>()\n this.listeners[eventType] = listeners\n listeners.add(callback as EventCallback<unknown>)\n\n return () => {\n listeners.delete(callback as EventCallback<unknown>)\n }\n }\n\n selectItem(selectedItem: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'SELECT_UPDATE',\n payload: { selectedItem },\n },\n '*'\n )\n }\n\n updateField(itemId: string, field: string, value: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'FIELD_UPDATE',\n payload: { itemId, field, value },\n },\n '*'\n )\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event.data || typeof event.data !== 'object') {\n return\n }\n\n const { type, payload } = event.data as BridgeEvent\n if (!type || !payload) {\n return\n }\n\n this.notify(type, payload as never)\n }\n\n private notify<T extends EventType>(type: T, payload: EventPayloadMap[T]) {\n const callbacks = this.listeners[type]\n if (!callbacks) {\n return\n }\n\n for (const callback of callbacks) {\n ;(callback as EventCallback<EventPayloadMap[T]>)(payload)\n }\n }\n}\n\nexport const previewBridge = PreviewBridge.getInstance()\n","import type {\n B10cksApiClientOptions,\n Endpoint,\n FetchClient,\n IBBaseQueryParams,\n IBCollectionResponse,\n IBMeta,\n IBResponse,\n} from './types'\n\nexport interface B10cksApiClientRvOptions {\n getRv?: () => string | number\n setRv?: (value: string | number) => void\n}\n\nexport * from './data-api'\nexport * from './preview-bridge'\nexport type * from './types'\nexport * as types from './types'\n\nlet rv: string | number = 0\n\ntype ApiResourceResponse<T> = IBResponse<T> | T\ntype ApiCollectionResponse<T> =\n | IBCollectionResponse<T>\n | IBResponse<IBCollectionResponse<T>>\n | T[]\n | { data: T[]; meta?: IBMeta; rv?: string | number }\n\nexport class ApiClient {\n private readonly baseUrl: string\n readonly token: string\n private readonly vid: string\n private readonly fetchClient: FetchClient\n private readonly getRvFn?: () => string | number\n private readonly setRvFn?: (value: string | number) => void\n\n constructor(options: B10cksApiClientOptions, requestUrl?: URL | string) {\n this.baseUrl = options.baseUrl.endsWith('/') ? options.baseUrl.slice(0, -1) : options.baseUrl\n this.token = options.token\n const defaultFetch =\n typeof globalThis.fetch === 'function' ? globalThis.fetch.bind(globalThis) : null\n if (options.fetchClient) {\n this.fetchClient = options.fetchClient\n } else if (defaultFetch) {\n this.fetchClient = defaultFetch as FetchClient\n } else {\n throw new Error(\n 'No fetch implementation available. Provide `fetchClient` in ApiClient options.'\n )\n }\n\n this.getRvFn = options.getRv\n this.setRvFn = options.setRv\n\n const url = this.resolveRequestUrl(requestUrl)\n this.vid = options.version || 'published'\n this.setRv(url?.searchParams.get('b10cks_rv') || options.rv || rv)\n }\n\n async get<T>(\n endpoint: Endpoint,\n params: Omit<IBBaseQueryParams, 'token'> = {}\n ): Promise<ApiResourceResponse<T>> {\n const url = this.buildUrl(endpoint, {\n vid: this.vid,\n ...params,\n rv: this.getRv(),\n token: this.token,\n })\n\n const payload = await this.fetchClient(url)\n const response = await this.parseResponse<ApiResourceResponse<T>>(payload)\n\n if (this.hasRevision(response)) {\n this.setRv(response.rv)\n }\n\n return response\n }\n\n async getAll<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T[]> {\n const firstResponse = await this.get<IBCollectionResponse<T> & { meta?: IBMeta }>(endpoint, {\n ...params,\n page: 1,\n })\n const normalizedFirstResponse = this.normalizeCollectionResponse<T>(firstResponse)\n\n if (normalizedFirstResponse.rv) {\n this.setRv(normalizedFirstResponse.rv)\n }\n\n if (!normalizedFirstResponse.meta || normalizedFirstResponse.meta.last_page <= 1) {\n return normalizedFirstResponse.data\n }\n\n const pageRequests = Array.from(\n { length: normalizedFirstResponse.meta.last_page - 1 },\n (_, i) => this.get<IBCollectionResponse<T>>(endpoint, { ...params, page: i + 2 })\n )\n\n const allResponses = await Promise.all(pageRequests)\n\n return normalizedFirstResponse.data.concat(\n allResponses.flatMap((response) => this.normalizeCollectionResponse<T>(response).data)\n )\n }\n\n setRv(value: string | number) {\n if (this.setRvFn) {\n this.setRvFn(value)\n } else {\n rv = value\n }\n }\n\n getRv() {\n if (this.getRvFn) {\n return this.getRvFn()\n }\n return rv\n }\n\n private async parseResponse<T>(payload: unknown): Promise<T> {\n if (this.isFetchResponse(payload)) {\n if (!payload.ok) {\n throw new Error(`Request failed with status ${payload.status}`)\n }\n\n return (await payload.json()) as T\n }\n\n return payload as T\n }\n\n private normalizeCollectionResponse<T>(response: ApiCollectionResponse<T>) {\n if (this.isCollectionResponseEnvelope(response)) {\n const nestedResponse = response.data\n\n return {\n data: nestedResponse.data,\n meta: (nestedResponse as IBCollectionResponse<T> & { meta?: IBMeta }).meta,\n rv: response.rv || nestedResponse.rv,\n }\n }\n\n if (Array.isArray(response)) {\n return { data: response, meta: undefined, rv: undefined }\n }\n\n if (typeof response === 'object' && response !== null && 'data' in response) {\n const {\n data,\n meta,\n rv: responseRv,\n } = response as {\n data: T[]\n meta?: IBMeta\n rv?: string | number\n }\n return { data, meta, rv: responseRv }\n }\n\n return { data: [], meta: undefined, rv: undefined }\n }\n\n private buildUrl(endpoint: string, params: Record<string, unknown>): string {\n const url = new URL(`${this.baseUrl}/v1/${endpoint}`)\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value))\n }\n })\n\n return url.toString()\n }\n\n private resolveRequestUrl(requestUrl?: URL | string): URL | null {\n if (!requestUrl) {\n return null\n }\n\n if (requestUrl instanceof URL) {\n return requestUrl\n }\n\n return new URL(requestUrl, 'http://localhost')\n }\n\n private isFetchResponse(value: unknown): value is Response {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'json' in value &&\n typeof (value as Response).json === 'function' &&\n 'ok' in value\n )\n }\n\n private hasRevision(value: unknown): value is { rv: string | number } {\n return typeof value === 'object' && value !== null && 'rv' in value\n }\n\n private isCollectionResponseEnvelope<T>(\n value: ApiCollectionResponse<T>\n ): value is IBResponse<IBCollectionResponse<T>> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'data' in value &&\n typeof value.data === 'object' &&\n value.data !== null &&\n 'data' in value.data &&\n Array.isArray(value.data.data)\n )\n }\n}\n"],"names":["B10cksDataApi","client","endpoint","params","response","options","fullSlug","source","forceRefreshOrOptions","allPages","forceRefresh","redirects","map","target","status_code","slug","language_iso","language","bypassCache","normalizedLanguage","cacheKey","value","fallbackRv","nextRv","createB10cksDataApi","PreviewBridge","eventType","callback","listeners","selectedItem","itemId","field","event","type","payload","callbacks","previewBridge","rv","ApiClient","requestUrl","defaultFetch","url","firstResponse","normalizedFirstResponse","pageRequests","_","i","allResponses","nestedResponse","data","meta","responseRv","key"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/content.ts","../src/data-api.ts","../src/preview-bridge.ts","../src/sitemap.ts","../src/index.ts"],"sourcesContent":["import type { B10cksLink } from './types'\n\nexport interface B10cksLinkResolved {\n href: string\n target: string\n}\n\n/**\n * Resolves a B10cksLink value to a plain { href, target } object.\n *\n * - `'email'` links produce a `mailto:` href with optional subject/body/cc/bcc query params.\n * - `'url'` and `'internal'` links use the stored `url` field; an `anchor` is appended as a\n * hash fragment when present.\n * - `'asset'` links cannot be resolved to a URL without the asset record — returns `undefined`.\n * - Locale prefixing and router integration are intentionally left to the caller.\n */\nexport function resolveB10cksLink(\n link: B10cksLink | undefined | null\n): B10cksLinkResolved | undefined {\n if (!link) return undefined\n\n if (link.type === 'email') {\n const params = new URLSearchParams()\n if (link.subject) params.set('subject', link.subject)\n if (link.body) params.set('body', link.body)\n if (link.cc) params.set('cc', link.cc)\n if (link.bcc) params.set('bcc', link.bcc)\n const query = params.toString()\n return { href: `mailto:${link.email}${query ? `?${query}` : ''}`, target: '_self' }\n }\n\n if (link.type === 'asset') {\n return undefined\n }\n\n // 'url' and 'internal' share url + target + optional anchor\n const target = link.target ?? '_self'\n let href = link.url ?? ''\n if ('anchor' in link && link.anchor) {\n href = `${href.trimEnd()}#${link.anchor}`\n }\n\n return { href, target }\n}\n","import type {\n IBCollectionResponse,\n Endpoint,\n IBBaseQueryParams,\n IBBlock,\n IBContent,\n IBContentQueryParams,\n IBDataEntry,\n IBDataSource,\n IBGetBlocksParams,\n IBGetContentsParams,\n IBGetRedirectsParams,\n IBRedirect,\n IBRedirectLookupResult,\n IBSearchParams,\n IBSearchResponse,\n IBSearchResult,\n IBSitemapEntry,\n IBSpace,\n} from './types'\n\ntype ApiQueryParams = Omit<IBBaseQueryParams, 'token'> & Record<string, unknown>\ntype ApiCollectionResponse<T> =\n | T[]\n | IBCollectionResponse<T>\n | { data: T[]; rv?: string | number }\n | { data: IBCollectionResponse<T>; rv?: string | number }\ntype ApiCollectionResult<T> =\n | ApiCollectionResponse<T>\n | { data: ApiCollectionResponse<T>; rv?: string | number }\n\nexport interface CollectionFetchOptions {\n allPages?: boolean\n}\n\nexport interface RedirectFetchOptions extends CollectionFetchOptions {\n forceRefresh?: boolean\n}\n\nexport interface DataApiClient {\n get<T>(\n endpoint: Endpoint,\n params?: ApiQueryParams\n ): Promise<T | { data: T; rv?: string | number }>\n getAll<T>(endpoint: Endpoint, params?: ApiQueryParams): Promise<T[]>\n post?<T>(endpoint: string, body?: unknown, params?: ApiQueryParams): Promise<T>\n setRv(value: string | number): void\n}\n\nexport type RedirectMap = Record<string, { target: string; status_code: number }>\n\nexport interface GetConfigOptions extends Omit<IBContentQueryParams, 'token' | 'full_slug'> {\n slug?: string\n language?: string\n bypassCache?: boolean\n}\n\nfunction serializeFilterValue(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined\n if (typeof value === 'boolean') return String(value)\n if (typeof value === 'number') return String(value)\n if (typeof value === 'string') return value\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>\n\n if ('null' in obj) return 'null:'\n if ('!null' in obj) return '!null:'\n if ('between' in obj) {\n const [from, to] = obj.between as [string, string]\n return `${from}...${to}`\n }\n\n const ops = [\n 'eq', 'neq', 'like', '!like', '^like', 'like$',\n 'lt', 'gt', 'lte', 'gte', 'in', '!in', 'empty', '!empty',\n ] as const\n for (const op of ops) {\n if (op in obj) {\n const val = obj[op]\n if (Array.isArray(val)) return `${op}:${val.join(',')}`\n return `${op}:${String(val)}`\n }\n }\n }\n\n return undefined\n}\n\nexport function serializeFilter(filter: Record<string, unknown>): Record<string, string> {\n const result: Record<string, string> = {}\n for (const [key, value] of Object.entries(filter)) {\n const serialized = serializeFilterValue(value)\n if (serialized !== undefined) {\n result[key] = serialized\n }\n }\n return result\n}\n\nfunction buildParamsWithFilter(\n params: Record<string, unknown>,\n filter: unknown,\n sort: string | string[] | undefined\n): ApiQueryParams {\n const filterParams =\n filter && typeof filter === 'object'\n ? serializeFilter(filter as Record<string, unknown>)\n : {}\n const sortParam =\n Array.isArray(sort) ? { sort: sort.join(',') } : sort != null ? { sort } : {}\n return { ...params, ...filterParams, ...sortParam }\n}\n\nexport class B10cksDataApi {\n private redirectsCache: RedirectMap | null = null\n private readonly configCache = new Map<string, unknown>()\n\n constructor(private readonly client: DataApiClient) {}\n\n async getResource<T>(endpoint: Endpoint, params: ApiQueryParams = {}): Promise<T> {\n const response = await this.client.get<T>(endpoint, params)\n return this.unwrapResource(response)\n }\n\n async getCollection<T>(\n endpoint: Endpoint,\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<T[]> {\n if (options.allPages) {\n return this.client.getAll<T>(endpoint, params)\n }\n\n const response = await this.client.get<ApiCollectionResponse<T>>(endpoint, params)\n return this.unwrapCollection(response)\n }\n\n async getContent<T = Record<string, unknown>>(\n fullSlug: string,\n params: Omit<IBContentQueryParams, 'token' | 'full_slug'> = {}\n ): Promise<IBContent<T>> {\n return this.getResource<IBContent<T>>(`contents/${fullSlug}`, params)\n }\n\n async getContents<T = Record<string, unknown>>(\n params: IBGetContentsParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBContent<T>[]> {\n const { filter, sort, ...rest } = params\n return this.getCollection<IBContent<T>>(\n 'contents',\n buildParamsWithFilter(rest, filter, sort),\n options\n )\n }\n\n async getBlock(blockId: string, params: ApiQueryParams = {}): Promise<IBBlock> {\n return this.getResource<IBBlock>(`blocks/${blockId}`, params)\n }\n\n async getBlocks(\n params: IBGetBlocksParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBBlock[]> {\n const { filter, ...rest } = params\n return this.getCollection<IBBlock>(\n 'blocks',\n buildParamsWithFilter(rest, filter, undefined),\n options\n )\n }\n\n async search<T = Record<string, unknown>>(\n params: IBSearchParams\n ): Promise<IBSearchResponse<T>> {\n const response = await this.client.get<IBSearchResponse<T>>(\n 'search',\n params as unknown as ApiQueryParams\n )\n if (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n 'meta' in (response as Record<string, unknown>)\n ) {\n return response as IBSearchResponse<T>\n }\n if (typeof response === 'object' && response !== null && 'data' in response) {\n const inner = (response as { data: unknown }).data\n if (\n typeof inner === 'object' &&\n inner !== null &&\n 'meta' in inner &&\n 'data' in inner\n ) {\n return inner as IBSearchResponse<T>\n }\n }\n return response as unknown as IBSearchResponse<T>\n }\n\n async getSitemap(\n params: Omit<IBContentQueryParams, 'token'> = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBSitemapEntry[]> {\n return this.getCollection<IBSitemapEntry>('sitemap', params, options)\n }\n\n async getDataEntries(\n source: string,\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBDataEntry[]> {\n return this.getCollection<IBDataEntry>(`datasources/${source}/entries`, params, options)\n }\n\n async getDataSources(\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBDataSource[]> {\n return this.getCollection<IBDataSource>('datasources', params, options)\n }\n\n async getSpace(params: ApiQueryParams = {}): Promise<IBSpace> {\n return this.getResource<IBSpace>('spaces/me', params)\n }\n\n async lookupRedirect(source: string): Promise<IBRedirectLookupResult | false> {\n if (!this.client.post) {\n throw new Error(\n 'lookupRedirect requires a client that supports POST. Use ApiClient from @b10cks/client.'\n )\n }\n return this.client.post<IBRedirectLookupResult | false>('redirects/lookup', { source })\n }\n\n async getRedirects(params?: IBGetRedirectsParams, forceRefresh?: boolean): Promise<RedirectMap>\n async getRedirects(\n params?: IBGetRedirectsParams,\n options?: RedirectFetchOptions\n ): Promise<RedirectMap>\n async getRedirects(\n params: IBGetRedirectsParams = {},\n forceRefreshOrOptions: boolean | RedirectFetchOptions = false\n ): Promise<RedirectMap> {\n const { allPages = false, forceRefresh = false } =\n typeof forceRefreshOrOptions === 'boolean'\n ? { allPages: true, forceRefresh: forceRefreshOrOptions }\n : forceRefreshOrOptions\n\n if (allPages && this.redirectsCache && !forceRefresh) {\n return this.redirectsCache\n }\n\n const { filter, ...rest } = params\n const flatParams = buildParamsWithFilter(rest, filter, undefined)\n const redirects = await this.getCollection<IBRedirect>('redirects', flatParams, { allPages })\n const map = Object.fromEntries(\n redirects.map(({ source, target, status_code }) => [source, { target, status_code }])\n )\n\n if (allPages) {\n this.redirectsCache = map\n }\n\n return map\n }\n\n async getConfig<T = Record<string, unknown>>({\n slug = '_config',\n language_iso,\n language,\n bypassCache = false,\n ...params\n }: GetConfigOptions = {}): Promise<T> {\n const normalizedLanguage = language_iso ?? language\n const cacheKey = JSON.stringify({ slug, language_iso: normalizedLanguage, ...params })\n if (!bypassCache && this.configCache.has(cacheKey)) {\n return this.configCache.get(cacheKey) as T\n }\n\n const configContent = await this.getContent<Record<string, unknown>>(slug, {\n ...params,\n language_iso: normalizedLanguage,\n })\n const value = (configContent.content ?? {}) as T\n\n if (!bypassCache) {\n this.configCache.set(cacheKey, value)\n }\n\n return value\n }\n\n async syncRevision(fallbackRv = 426713400): Promise<string | number> {\n const space = await this.getSpace()\n const nextRv = space.rv || fallbackRv\n this.client.setRv(nextRv)\n return nextRv\n }\n\n clearCache() {\n this.redirectsCache = null\n this.configCache.clear()\n }\n\n private unwrapResource<T>(response: T | { data: T }): T {\n if (typeof response === 'object' && response !== null && 'data' in response) {\n return (response as { data: T }).data\n }\n\n return response\n }\n\n private unwrapCollection<T>(response: ApiCollectionResult<T>): T[] {\n if (Array.isArray(response)) {\n return response\n }\n\n if (typeof response === 'object' && response !== null && 'data' in response) {\n if (Array.isArray(response.data)) {\n return response.data\n }\n\n if (\n typeof response.data === 'object' &&\n response.data !== null &&\n 'data' in response.data &&\n Array.isArray(response.data.data)\n ) {\n return response.data.data\n }\n }\n\n return []\n }\n}\n\nexport function createB10cksDataApi(client: DataApiClient): B10cksDataApi {\n return new B10cksDataApi(client)\n}\n","export type ContentUpdateEvent = {\n content: Record<string, unknown>\n}\n\nexport type SelectUpdateEvent = {\n selectedItem: string\n}\n\nexport type FieldUpdateEvent = {\n itemId: string\n field: string\n value: string\n}\n\nexport type EventType = 'CONTENT_UPDATE' | 'SELECT_UPDATE' | 'HOVER_UPDATE' | 'FIELD_UPDATE'\n\nexport type EventPayloadMap = {\n CONTENT_UPDATE: ContentUpdateEvent\n SELECT_UPDATE: SelectUpdateEvent\n HOVER_UPDATE: SelectUpdateEvent\n FIELD_UPDATE: FieldUpdateEvent\n}\n\ntype EventCallback<T> = (payload: T) => void\n\nexport type BridgeEvent = {\n type: EventType\n payload: EventPayloadMap[EventType]\n b10cksId?: string\n}\n\nexport class PreviewBridge {\n private static instance: PreviewBridge\n private readonly listeners: Partial<Record<EventType, Set<EventCallback<unknown>>>> = {}\n private initialized = false\n\n private constructor() {}\n\n static getInstance() {\n if (!PreviewBridge.instance) {\n PreviewBridge.instance = new PreviewBridge()\n }\n return PreviewBridge.instance\n }\n\n init() {\n if (!this.isInPreviewMode() || this.initialized) {\n return\n }\n\n window.addEventListener('message', this.handleMessage)\n this.initialized = true\n }\n\n destroy() {\n if (this.initialized && typeof window !== 'undefined') {\n window.removeEventListener('message', this.handleMessage)\n }\n this.initialized = false\n for (const eventType of Object.keys(this.listeners) as EventType[]) {\n this.listeners[eventType]?.clear()\n }\n }\n\n isInPreviewMode(): boolean {\n return typeof window !== 'undefined' && window.self !== window.top\n }\n\n on<T extends EventType>(eventType: T, callback: EventCallback<EventPayloadMap[T]>): () => void {\n if (!this.isInPreviewMode()) {\n return () => {}\n }\n\n const listeners = this.listeners[eventType] || new Set<EventCallback<unknown>>()\n this.listeners[eventType] = listeners\n listeners.add(callback as EventCallback<unknown>)\n\n return () => {\n listeners.delete(callback as EventCallback<unknown>)\n }\n }\n\n selectItem(selectedItem: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'SELECT_UPDATE',\n payload: { selectedItem },\n },\n '*'\n )\n }\n\n updateField(itemId: string, field: string, value: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'FIELD_UPDATE',\n payload: { itemId, field, value },\n },\n '*'\n )\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event.data || typeof event.data !== 'object') {\n return\n }\n\n const { type, payload } = event.data as BridgeEvent\n if (!type || !payload) {\n return\n }\n\n this.notify(type, payload as never)\n }\n\n private notify<T extends EventType>(type: T, payload: EventPayloadMap[T]) {\n const callbacks = this.listeners[type]\n if (!callbacks) {\n return\n }\n\n for (const callback of callbacks) {\n ;(callback as EventCallback<EventPayloadMap[T]>)(payload)\n }\n }\n}\n\nexport const previewBridge = PreviewBridge.getInstance()\n","import type { IBSitemapEntry } from './types'\n\nexport function normalizePathSegment(value: string | null | undefined): string {\n return (value ?? '').trim().replace(/^\\/+|\\/+$/g, '')\n}\n\n/**\n * Combines a b10cks `full_slug` and `language_iso` into a rooted, locale-prefixed path.\n *\n * - The slug `home` is treated as the root (`/` or `/<locale>`).\n * - Slugs that already start with the locale prefix are not double-prefixed.\n */\nexport function buildLocalizedPath(\n fullSlug: string | null | undefined,\n languageIso: string | null | undefined\n): string {\n const slug = normalizePathSegment(fullSlug)\n const locale = normalizePathSegment(languageIso)\n\n if (!locale) {\n return slug && slug !== 'home' ? `/${slug}` : '/'\n }\n\n if (!slug || slug === 'home') {\n return `/${locale}`\n }\n\n const localePrefix = `${locale}/`\n if (slug === locale || slug.startsWith(localePrefix)) {\n return `/${slug}`\n }\n\n return `/${locale}/${slug}`\n}\n\nfunction toAbsoluteUrl(path: string, siteUrl?: string): string | null {\n if (!siteUrl) return null\n try {\n return new URL(path, siteUrl).toString()\n } catch {\n return null\n }\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n}\n\nexport interface SitemapFilterOptions {\n /** Absolute base URL used for deduplication. Without it, paths are compared as strings. */\n siteUrl?: string\n /** Only include entries for this locale (ISO code). */\n locale?: string\n}\n\n/**\n * Filters sitemap entries by locale, deduplicates by resolved URL, and drops `noindex` entries.\n */\nexport function filterSitemapEntries(\n entries: IBSitemapEntry[],\n options: SitemapFilterOptions = {}\n): IBSitemapEntry[] {\n const { siteUrl, locale } = options\n const seen = new Set<string>()\n\n return entries.filter((entry) => {\n if (locale && entry.language_iso !== locale) return false\n if (entry.meta?.robots?.toLowerCase().includes('noindex')) return false\n\n const path = buildLocalizedPath(entry.full_slug, entry.language_iso)\n const key = siteUrl ? (toAbsoluteUrl(path, siteUrl) ?? path) : path\n if (seen.has(key)) return false\n\n seen.add(key)\n return true\n })\n}\n\n/**\n * Renders `IBSitemapEntry[]` as a `<urlset>` XML string.\n * Pass `siteUrl` to emit absolute `<loc>` values; without it, relative paths are used.\n */\nexport function renderSitemapXml(entries: IBSitemapEntry[], siteUrl?: string): string {\n const urls = entries\n .map((entry) => {\n const path = buildLocalizedPath(entry.full_slug, entry.language_iso)\n const loc = siteUrl ? toAbsoluteUrl(path, siteUrl) : path\n if (!loc) return ''\n const lines = [' <url>', ` <loc>${escapeXml(loc)}</loc>`]\n if (entry.published_at) lines.push(` <lastmod>${escapeXml(entry.published_at)}</lastmod>`)\n lines.push(' </url>')\n return lines.join('\\n')\n })\n .filter(Boolean)\n .join('\\n')\n\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">',\n urls,\n '</urlset>',\n ].join('\\n')\n}\n\n/**\n * Renders a list of sitemap paths as a `<sitemapindex>` XML string.\n */\nexport function renderSitemapIndex(paths: string[], siteUrl?: string): string {\n const sitemaps = paths\n .map((path) => {\n const loc = siteUrl ? toAbsoluteUrl(path, siteUrl) : path\n if (!loc) return ''\n return [' <sitemap>', ` <loc>${escapeXml(loc)}</loc>`, ' </sitemap>'].join('\\n')\n })\n .filter(Boolean)\n .join('\\n')\n\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">',\n sitemaps,\n '</sitemapindex>',\n ].join('\\n')\n}\n","import type {\n B10cksApiClientOptions,\n Endpoint,\n FetchClient,\n IBBaseQueryParams,\n IBCollectionResponse,\n IBMeta,\n IBResponse,\n} from './types'\n\nexport interface B10cksApiClientRvOptions {\n getRv?: () => string | number\n setRv?: (value: string | number) => void\n}\n\nexport * from './content'\nexport * from './data-api'\nexport * from './preview-bridge'\nexport * from './sitemap'\nexport type * from './types'\nexport * as types from './types'\n\nlet rv: string | number = 0\n\ntype ApiResourceResponse<T> = IBResponse<T> | T\ntype ApiCollectionResponse<T> =\n | IBCollectionResponse<T>\n | IBResponse<IBCollectionResponse<T>>\n | T[]\n | { data: T[]; meta?: IBMeta; rv?: string | number }\n\nexport class ApiClient {\n private readonly baseUrl: string\n readonly token: string\n private readonly vid: string\n private readonly fetchClient: FetchClient\n private readonly getRvFn?: () => string | number\n private readonly setRvFn?: (value: string | number) => void\n\n constructor(options: B10cksApiClientOptions, requestUrl?: URL | string) {\n this.baseUrl = options.baseUrl.endsWith('/') ? options.baseUrl.slice(0, -1) : options.baseUrl\n this.token = options.token\n const defaultFetch =\n typeof globalThis.fetch === 'function' ? globalThis.fetch.bind(globalThis) : null\n if (options.fetchClient) {\n this.fetchClient = options.fetchClient\n } else if (defaultFetch) {\n this.fetchClient = defaultFetch as FetchClient\n } else {\n throw new Error(\n 'No fetch implementation available. Provide `fetchClient` in ApiClient options.'\n )\n }\n\n this.getRvFn = options.getRv\n this.setRvFn = options.setRv\n\n const url = this.resolveRequestUrl(requestUrl)\n this.vid = options.version || 'published'\n this.setRv(url?.searchParams.get('b10cks_rv') || options.rv || rv)\n }\n\n async get<T>(\n endpoint: Endpoint,\n params: Omit<IBBaseQueryParams, 'token'> & Record<string, unknown> = {}\n ): Promise<ApiResourceResponse<T>> {\n const url = this.buildUrl(endpoint, {\n vid: this.vid,\n rv: this.getRv(),\n ...params,\n token: this.token,\n })\n\n const payload = await this.fetchClient(url)\n const response = await this.parseResponse<ApiResourceResponse<T>>(payload)\n\n if (this.hasRevision(response)) {\n this.setRv(response.rv)\n }\n\n return response\n }\n\n async post<T>(\n endpoint: string,\n body?: unknown,\n params: Omit<IBBaseQueryParams, 'token'> & Record<string, unknown> = {}\n ): Promise<T> {\n const url = this.buildUrl(endpoint, {\n vid: this.vid,\n rv: this.getRv(),\n ...params,\n token: this.token,\n })\n\n const payload = await this.fetchClient(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n\n return this.parseResponse<T>(payload)\n }\n\n async getAll<T>(\n endpoint: Endpoint,\n params: Omit<IBBaseQueryParams, 'token'> & Record<string, unknown> = {}\n ): Promise<T[]> {\n const firstResponse = await this.get<IBCollectionResponse<T> & { meta?: IBMeta }>(endpoint, {\n ...params,\n page: 1,\n })\n const normalizedFirstResponse = this.normalizeCollectionResponse<T>(firstResponse)\n\n if (normalizedFirstResponse.rv) {\n this.setRv(normalizedFirstResponse.rv)\n }\n\n if (!normalizedFirstResponse.meta || normalizedFirstResponse.meta.last_page <= 1) {\n return normalizedFirstResponse.data\n }\n\n const pageRequests = Array.from(\n { length: normalizedFirstResponse.meta.last_page - 1 },\n (_, i) => this.get<IBCollectionResponse<T>>(endpoint, { ...params, page: i + 2 })\n )\n\n const allResponses = await Promise.all(pageRequests)\n\n return normalizedFirstResponse.data.concat(\n allResponses.flatMap((response) => this.normalizeCollectionResponse<T>(response).data)\n )\n }\n\n setRv(value: string | number) {\n if (this.setRvFn) {\n this.setRvFn(value)\n } else {\n rv = value\n }\n }\n\n getRv() {\n if (this.getRvFn) {\n return this.getRvFn()\n }\n return rv\n }\n\n private async parseResponse<T>(payload: unknown): Promise<T> {\n if (this.isFetchResponse(payload)) {\n if (!payload.ok) {\n throw new Error(`Request failed with status ${payload.status}`)\n }\n\n return (await payload.json()) as T\n }\n\n return payload as T\n }\n\n private normalizeCollectionResponse<T>(response: ApiCollectionResponse<T>) {\n if (this.isCollectionResponseEnvelope(response)) {\n const nestedResponse = response.data\n\n return {\n data: nestedResponse.data,\n meta: (nestedResponse as IBCollectionResponse<T> & { meta?: IBMeta }).meta,\n rv: response.rv || nestedResponse.rv,\n }\n }\n\n if (Array.isArray(response)) {\n return { data: response, meta: undefined, rv: undefined }\n }\n\n if (typeof response === 'object' && response !== null && 'data' in response) {\n const {\n data,\n meta,\n rv: responseRv,\n } = response as {\n data: T[]\n meta?: IBMeta\n rv?: string | number\n }\n return { data, meta, rv: responseRv }\n }\n\n return { data: [], meta: undefined, rv: undefined }\n }\n\n private buildUrl(endpoint: string, params: Record<string, unknown>): string {\n const url = new URL(`${this.baseUrl}/v1/${endpoint}`)\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value))\n }\n })\n\n return url.toString()\n }\n\n private resolveRequestUrl(requestUrl?: URL | string): URL | null {\n if (!requestUrl) {\n return null\n }\n\n if (requestUrl instanceof URL) {\n return requestUrl\n }\n\n return new URL(requestUrl, 'http://localhost')\n }\n\n private isFetchResponse(value: unknown): value is Response {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'json' in value &&\n typeof (value as Response).json === 'function' &&\n 'ok' in value\n )\n }\n\n private hasRevision(value: unknown): value is { rv: string | number } {\n return typeof value === 'object' && value !== null && 'rv' in value\n }\n\n private isCollectionResponseEnvelope<T>(\n value: ApiCollectionResponse<T>\n ): value is IBResponse<IBCollectionResponse<T>> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'data' in value &&\n typeof value.data === 'object' &&\n value.data !== null &&\n 'data' in value.data &&\n Array.isArray(value.data.data)\n )\n }\n}\n"],"names":["resolveB10cksLink","link","params","query","target","href","serializeFilterValue","value","obj","from","to","ops","op","val","serializeFilter","filter","result","key","serialized","buildParamsWithFilter","sort","filterParams","sortParam","B10cksDataApi","client","endpoint","response","options","fullSlug","rest","blockId","inner","source","forceRefreshOrOptions","allPages","forceRefresh","flatParams","redirects","map","status_code","slug","language_iso","language","bypassCache","normalizedLanguage","cacheKey","fallbackRv","nextRv","createB10cksDataApi","PreviewBridge","eventType","callback","listeners","selectedItem","itemId","field","event","type","payload","callbacks","previewBridge","normalizePathSegment","buildLocalizedPath","languageIso","locale","localePrefix","toAbsoluteUrl","path","siteUrl","escapeXml","filterSitemapEntries","entries","seen","entry","renderSitemapXml","loc","lines","renderSitemapIndex","paths","rv","ApiClient","requestUrl","defaultFetch","url","body","firstResponse","normalizedFirstResponse","pageRequests","_","i","allResponses","nestedResponse","data","meta","responseRv"],"mappings":"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"}
|