@b10cks/client 1.3.0 → 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 +93 -2
- package/dist/index.d.ts +76 -0
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +176 -94
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,9 +16,13 @@ import { ApiClient, createB10cksDataApi } from '@b10cks/client'
|
|
|
16
16
|
const client = new ApiClient({
|
|
17
17
|
baseUrl: 'https://api.b10cks.com/api',
|
|
18
18
|
token: 'your-access-token',
|
|
19
|
+
version: 'published', // 'published' (default) or 'draft'
|
|
20
|
+
rv: 0, // revision token — pass Date.now() to bypass CDN cache
|
|
19
21
|
})
|
|
20
22
|
|
|
23
|
+
// Factory function — equivalent to new B10cksDataApi(client)
|
|
21
24
|
const dataApi = createB10cksDataApi(client)
|
|
25
|
+
// or: import { B10cksDataApi } from '@b10cks/client'; const dataApi = new B10cksDataApi(client)
|
|
22
26
|
|
|
23
27
|
// Fetch a page of contents
|
|
24
28
|
const contents = await dataApi.getContents({ vid: 'published', page: 1, per_page: 20 })
|
|
@@ -143,6 +147,20 @@ const params = serializeFilter({
|
|
|
143
147
|
|
|
144
148
|
Pass `{ allPages: true }` as the second argument to any collection method to fetch every page automatically.
|
|
145
149
|
|
|
150
|
+
## `ApiClient` configuration
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
interface B10cksApiClientOptions {
|
|
154
|
+
baseUrl: string // Base URL of the b10cks data API (include `/api`)
|
|
155
|
+
token: string // Space access token
|
|
156
|
+
version?: 'published' | 'draft' // Content version to fetch (default: 'published')
|
|
157
|
+
rv?: string | number // Revision token; use Date.now() to bypass CDN cache
|
|
158
|
+
fetchClient?: FetchClient // Custom fetch implementation (required in environments without globalThis.fetch)
|
|
159
|
+
getRv?: () => string | number // Custom getter for the shared revision token
|
|
160
|
+
setRv?: (value: string | number) => void // Custom setter for the shared revision token
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
146
164
|
## Low-level `ApiClient`
|
|
147
165
|
|
|
148
166
|
`ApiClient` implements the `DataApiClient` interface and can be used directly for one-off requests:
|
|
@@ -150,8 +168,12 @@ Pass `{ allPages: true }` as the second argument to any collection method to fet
|
|
|
150
168
|
```typescript
|
|
151
169
|
const client = new ApiClient({ baseUrl, token })
|
|
152
170
|
|
|
153
|
-
// GET with custom params
|
|
154
|
-
const data = await client.get('contents', { page: 1,
|
|
171
|
+
// GET with custom params — all extra keys are forwarded as query params as-is
|
|
172
|
+
const data = await client.get('contents', { page: 1, language_iso: 'de', vid: 'published' })
|
|
173
|
+
|
|
174
|
+
// Per-request rv override — pass rv in params to override the instance-level revision token
|
|
175
|
+
// (useful to bypass CDN cache for a single request without affecting other calls)
|
|
176
|
+
const fresh = await client.get('contents', { rv: Date.now() })
|
|
155
177
|
|
|
156
178
|
// GET all pages
|
|
157
179
|
const all = await client.getAll('blocks')
|
|
@@ -176,6 +198,75 @@ const result = await client.post('redirects/lookup', { source: '/old' })
|
|
|
176
198
|
| `sitemap` | GET (list) |
|
|
177
199
|
| `spaces/me` | GET |
|
|
178
200
|
|
|
201
|
+
## Link resolution
|
|
202
|
+
|
|
203
|
+
`resolveB10cksLink` converts a `B10cksLink` value (the union type emitted by the type generator for `link`-type fields) into a plain `{ href, target }` object. Locale prefixing and router integration are left to the caller.
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
import { resolveB10cksLink } from '@b10cks/client'
|
|
207
|
+
|
|
208
|
+
const resolved = resolveB10cksLink(block.ctaLink)
|
|
209
|
+
// resolved: { href: 'https://example.com', target: '_blank' }
|
|
210
|
+
// or: { href: 'mailto:hi@example.com', target: '_self' }
|
|
211
|
+
// or: undefined (when link is nullish or type === 'asset')
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Sitemap utilities
|
|
215
|
+
|
|
216
|
+
Framework-agnostic helpers for building multilingual sitemaps from `IBSitemapEntry[]`.
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
import {
|
|
220
|
+
buildLocalizedPath,
|
|
221
|
+
filterSitemapEntries,
|
|
222
|
+
renderSitemapXml,
|
|
223
|
+
renderSitemapIndex,
|
|
224
|
+
} from '@b10cks/client'
|
|
225
|
+
|
|
226
|
+
// Build a rooted locale-prefixed path from a content entry
|
|
227
|
+
buildLocalizedPath('about', 'en') // → '/en/about'
|
|
228
|
+
buildLocalizedPath('home', 'en') // → '/en'
|
|
229
|
+
buildLocalizedPath('de/uber-uns', 'de') // → '/de/uber-uns' (no double prefix)
|
|
230
|
+
|
|
231
|
+
// Filter: deduplicate, drop noindex, optionally restrict to one locale
|
|
232
|
+
const filtered = filterSitemapEntries(entries, {
|
|
233
|
+
siteUrl: 'https://example.com',
|
|
234
|
+
locale: 'en',
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
// Render <urlset> XML
|
|
238
|
+
const xml = renderSitemapXml(filtered, 'https://example.com')
|
|
239
|
+
|
|
240
|
+
// Render <sitemapindex> XML for multi-sitemap setups
|
|
241
|
+
const index = renderSitemapIndex(['/sitemap-en.xml', '/sitemap-de.xml'], 'https://example.com')
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## TypeScript
|
|
245
|
+
|
|
246
|
+
Common types exported from the package root:
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
import type {
|
|
250
|
+
B10cksLink, // Union type for link fields (url | email | internal | asset)
|
|
251
|
+
B10cksLinkResolved, // Return type of resolveB10cksLink
|
|
252
|
+
IBContent, // A content entry (generic: IBContent<YourContentShape>)
|
|
253
|
+
IBContentBlock, // Base block shape with id and block fields
|
|
254
|
+
IBBlock, // A block schema
|
|
255
|
+
IBDataEntry, // A data source entry (key/value)
|
|
256
|
+
IBDataSource, // A data source definition
|
|
257
|
+
IBSitemapEntry, // Sitemap entry with full_slug, language_iso, meta, published_at
|
|
258
|
+
IBSeoMeta, // robots and canonical fields
|
|
259
|
+
IBSpace, // Space info
|
|
260
|
+
IBRedirect, // Redirect rule (source, target, status_code)
|
|
261
|
+
IBSearchResult, // Search result extending IBContent with relevance_score
|
|
262
|
+
IBSearchResponse, // Wrapper around IBSearchResult[]
|
|
263
|
+
IBCollectionResponse,// Paginated list envelope
|
|
264
|
+
IBMeta, // Pagination metadata (total, last_page, per_page, …)
|
|
265
|
+
IBResponse, // Single-item envelope { data, rv }
|
|
266
|
+
B10cksApiClientOptions,
|
|
267
|
+
} from '@b10cks/client'
|
|
268
|
+
```
|
|
269
|
+
|
|
179
270
|
## License
|
|
180
271
|
|
|
181
272
|
MIT
|
package/dist/index.d.ts
CHANGED
|
@@ -65,12 +65,51 @@ export declare class B10cksDataApi {
|
|
|
65
65
|
private unwrapCollection;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
export declare type B10cksLink = {
|
|
69
|
+
type: 'url';
|
|
70
|
+
url: string;
|
|
71
|
+
anchor?: string;
|
|
72
|
+
target?: '_self' | '_blank' | '_parent' | '_top';
|
|
73
|
+
rel?: string;
|
|
74
|
+
} | {
|
|
75
|
+
type: 'email';
|
|
76
|
+
email: string;
|
|
77
|
+
subject?: string;
|
|
78
|
+
body?: string;
|
|
79
|
+
cc?: string;
|
|
80
|
+
bcc?: string;
|
|
81
|
+
} | {
|
|
82
|
+
type: 'internal';
|
|
83
|
+
url: string;
|
|
84
|
+
title: string;
|
|
85
|
+
content: string;
|
|
86
|
+
params?: string;
|
|
87
|
+
anchor?: string;
|
|
88
|
+
target?: '_self' | '_blank' | '_parent' | '_top';
|
|
89
|
+
} | {
|
|
90
|
+
type: 'asset';
|
|
91
|
+
id: string;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export declare interface B10cksLinkResolved {
|
|
95
|
+
href: string;
|
|
96
|
+
target: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
68
99
|
export declare type BridgeEvent = {
|
|
69
100
|
type: EventType;
|
|
70
101
|
payload: EventPayloadMap[EventType];
|
|
71
102
|
b10cksId?: string;
|
|
72
103
|
};
|
|
73
104
|
|
|
105
|
+
/**
|
|
106
|
+
* Combines a b10cks `full_slug` and `language_iso` into a rooted, locale-prefixed path.
|
|
107
|
+
*
|
|
108
|
+
* - The slug `home` is treated as the root (`/` or `/<locale>`).
|
|
109
|
+
* - Slugs that already start with the locale prefix are not double-prefixed.
|
|
110
|
+
*/
|
|
111
|
+
export declare function buildLocalizedPath(fullSlug: string | null | undefined, languageIso: string | null | undefined): string;
|
|
112
|
+
|
|
74
113
|
export declare interface CollectionFetchOptions {
|
|
75
114
|
allPages?: boolean;
|
|
76
115
|
}
|
|
@@ -136,6 +175,11 @@ export declare type FieldUpdateEvent = {
|
|
|
136
175
|
value: string;
|
|
137
176
|
};
|
|
138
177
|
|
|
178
|
+
/**
|
|
179
|
+
* Filters sitemap entries by locale, deduplicates by resolved URL, and drops `noindex` entries.
|
|
180
|
+
*/
|
|
181
|
+
export declare function filterSitemapEntries(entries: IBSitemapEntry[], options?: SitemapFilterOptions): IBSitemapEntry[];
|
|
182
|
+
|
|
139
183
|
export declare interface GetConfigOptions extends Omit<IBContentQueryParams, 'token' | 'full_slug'> {
|
|
140
184
|
slug?: string;
|
|
141
185
|
language?: string;
|
|
@@ -374,6 +418,8 @@ export declare type IdFilter = string | {
|
|
|
374
418
|
'!null': true;
|
|
375
419
|
};
|
|
376
420
|
|
|
421
|
+
export declare function normalizePathSegment(value: string | null | undefined): string;
|
|
422
|
+
|
|
377
423
|
export declare class PreviewBridge {
|
|
378
424
|
private static instance;
|
|
379
425
|
private readonly listeners;
|
|
@@ -401,12 +447,41 @@ export declare type RedirectMap = Record<string, {
|
|
|
401
447
|
status_code: number;
|
|
402
448
|
}>;
|
|
403
449
|
|
|
450
|
+
/**
|
|
451
|
+
* Renders a list of sitemap paths as a `<sitemapindex>` XML string.
|
|
452
|
+
*/
|
|
453
|
+
export declare function renderSitemapIndex(paths: string[], siteUrl?: string): string;
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Renders `IBSitemapEntry[]` as a `<urlset>` XML string.
|
|
457
|
+
* Pass `siteUrl` to emit absolute `<loc>` values; without it, relative paths are used.
|
|
458
|
+
*/
|
|
459
|
+
export declare function renderSitemapXml(entries: IBSitemapEntry[], siteUrl?: string): string;
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Resolves a B10cksLink value to a plain { href, target } object.
|
|
463
|
+
*
|
|
464
|
+
* - `'email'` links produce a `mailto:` href with optional subject/body/cc/bcc query params.
|
|
465
|
+
* - `'url'` and `'internal'` links use the stored `url` field; an `anchor` is appended as a
|
|
466
|
+
* hash fragment when present.
|
|
467
|
+
* - `'asset'` links cannot be resolved to a URL without the asset record — returns `undefined`.
|
|
468
|
+
* - Locale prefixing and router integration are intentionally left to the caller.
|
|
469
|
+
*/
|
|
470
|
+
export declare function resolveB10cksLink(link: B10cksLink | undefined | null): B10cksLinkResolved | undefined;
|
|
471
|
+
|
|
404
472
|
export declare type SelectUpdateEvent = {
|
|
405
473
|
selectedItem: string;
|
|
406
474
|
};
|
|
407
475
|
|
|
408
476
|
export declare function serializeFilter(filter: Record<string, unknown>): Record<string, string>;
|
|
409
477
|
|
|
478
|
+
export declare interface SitemapFilterOptions {
|
|
479
|
+
/** Absolute base URL used for deduplication. Without it, paths are compared as strings. */
|
|
480
|
+
siteUrl?: string;
|
|
481
|
+
/** Only include entries for this locale (ISO code). */
|
|
482
|
+
locale?: string;
|
|
483
|
+
}
|
|
484
|
+
|
|
410
485
|
export declare type StringFilter = string | {
|
|
411
486
|
eq: string;
|
|
412
487
|
} | {
|
|
@@ -451,6 +526,7 @@ export declare namespace types {
|
|
|
451
526
|
IBSpace,
|
|
452
527
|
IBRedirect,
|
|
453
528
|
IBContentQueryParams,
|
|
529
|
+
B10cksLink,
|
|
454
530
|
B10cksApiClientOptions,
|
|
455
531
|
StringFilter,
|
|
456
532
|
IdFilter,
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function C(r){if(!r)return;if(r.type==="email"){const n=new URLSearchParams;r.subject&&n.set("subject",r.subject),r.body&&n.set("body",r.body),r.cc&&n.set("cc",r.cc),r.bcc&&n.set("bcc",r.bcc);const i=n.toString();return{href:`mailto:${r.email}${i?`?${i}`:""}`,target:"_self"}}if(r.type==="asset")return;const t=r.target??"_self";let e=r.url??"";return"anchor"in r&&r.anchor&&(e=`${e.trimEnd()}#${r.anchor}`),{href:e,target:t}}function j(r){if(r!=null){if(typeof r=="boolean"||typeof r=="number")return String(r);if(typeof r=="string")return r;if(typeof r=="object"&&!Array.isArray(r)){const t=r;if("null"in t)return"null:";if("!null"in t)return"!null:";if("between"in t){const[n,i]=t.between;return`${n}...${i}`}const e=["eq","neq","like","!like","^like","like$","lt","gt","lte","gte","in","!in","empty","!empty"];for(const n of e)if(n in t){const i=t[n];return Array.isArray(i)?`${n}:${i.join(",")}`:`${n}:${String(i)}`}}}}function y(r){const t={};for(const[e,n]of Object.entries(r)){const i=j(n);i!==void 0&&(t[e]=i)}return t}function f(r,t,e){const n=t&&typeof t=="object"?y(t):{},i=Array.isArray(e)?{sort:e.join(",")}:e!=null?{sort:e}:{};return{...r,...n,...i}}class b{constructor(t){this.client=t}redirectsCache=null;configCache=new Map;async getResource(t,e={}){const n=await this.client.get(t,e);return this.unwrapResource(n)}async getCollection(t,e={},n={}){if(n.allPages)return this.client.getAll(t,e);const i=await this.client.get(t,e);return this.unwrapCollection(i)}async getContent(t,e={}){return this.getResource(`contents/${t}`,e)}async getContents(t={},e={}){const{filter:n,sort:i,...s}=t;return this.getCollection("contents",f(s,n,i),e)}async getBlock(t,e={}){return this.getResource(`blocks/${t}`,e)}async getBlocks(t={},e={}){const{filter:n,...i}=t;return this.getCollection("blocks",f(i,n,void 0),e)}async search(t){const e=await this.client.get("search",t);if(typeof e=="object"&&e!==null&&"data"in e&&"meta"in e)return e;if(typeof e=="object"&&e!==null&&"data"in e){const n=e.data;if(typeof n=="object"&&n!==null&&"meta"in n&&"data"in n)return n}return e}async getSitemap(t={},e={}){return this.getCollection("sitemap",t,e)}async getDataEntries(t,e={},n={}){return this.getCollection(`datasources/${t}/entries`,e,n)}async getDataSources(t={},e={}){return this.getCollection("datasources",t,e)}async getSpace(t={}){return this.getResource("spaces/me",t)}async lookupRedirect(t){if(!this.client.post)throw new Error("lookupRedirect requires a client that supports POST. Use ApiClient from @b10cks/client.");return this.client.post("redirects/lookup",{source:t})}async getRedirects(t={},e=!1){const{allPages:n=!1,forceRefresh:i=!1}=typeof e=="boolean"?{allPages:!0,forceRefresh:e}:e;if(n&&this.redirectsCache&&!i)return this.redirectsCache;const{filter:s,...a}=t,o=f(a,s,void 0),u=await this.getCollection("redirects",o,{allPages:n}),l=Object.fromEntries(u.map(({source:w,target:v,status_code:R})=>[w,{target:v,status_code:R}]));return n&&(this.redirectsCache=l),l}async getConfig({slug:t="_config",language_iso:e,language:n,bypassCache:i=!1,...s}={}){const a=e??n,o=JSON.stringify({slug:t,language_iso:a,...s});if(!i&&this.configCache.has(o))return this.configCache.get(o);const l=(await this.getContent(t,{...s,language_iso:a})).content??{};return i||this.configCache.set(o,l),l}async syncRevision(t=426713400){const n=(await this.getSpace()).rv||t;return this.client.setRv(n),n}clearCache(){this.redirectsCache=null,this.configCache.clear()}unwrapResource(t){return typeof t=="object"&&t!==null&&"data"in t?t.data:t}unwrapCollection(t){if(Array.isArray(t))return t;if(typeof t=="object"&&t!==null&&"data"in t){if(Array.isArray(t.data))return t.data;if(typeof t.data=="object"&&t.data!==null&&"data"in t.data&&Array.isArray(t.data.data))return t.data.data}return[]}}function S(r){return new b(r)}class c{static instance;listeners={};initialized=!1;constructor(){}static getInstance(){return c.instance||(c.instance=new c),c.instance}init(){!this.isInPreviewMode()||this.initialized||(window.addEventListener("message",this.handleMessage),this.initialized=!0)}destroy(){this.initialized&&typeof window<"u"&&window.removeEventListener("message",this.handleMessage),this.initialized=!1;for(const t of Object.keys(this.listeners))this.listeners[t]?.clear()}isInPreviewMode(){return typeof window<"u"&&window.self!==window.top}on(t,e){if(!this.isInPreviewMode())return()=>{};const n=this.listeners[t]||new Set;return this.listeners[t]=n,n.add(e),()=>{n.delete(e)}}selectItem(t){this.isInPreviewMode()&&window.parent.postMessage({type:"SELECT_UPDATE",payload:{selectedItem:t}},"*")}updateField(t,e,n){this.isInPreviewMode()&&window.parent.postMessage({type:"FIELD_UPDATE",payload:{itemId:t,field:e,value:n}},"*")}handleMessage=t=>{if(!t.data||typeof t.data!="object")return;const{type:e,payload:n}=t.data;!e||!n||this.notify(e,n)};notify(t,e){const n=this.listeners[t];if(n)for(const i of n)i(e)}}const A=c.getInstance();function d(r){return(r??"").trim().replace(/^\/+|\/+$/g,"")}function p(r,t){const e=d(r),n=d(t);if(!n)return e&&e!=="home"?`/${e}`:"/";if(!e||e==="home")return`/${n}`;const i=`${n}/`;return e===n||e.startsWith(i)?`/${e}`:`/${n}/${e}`}function m(r,t){if(!t)return null;try{return new URL(r,t).toString()}catch{return null}}function g(r){return r.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function $(r,t={}){const{siteUrl:e,locale:n}=t,i=new Set;return r.filter(s=>{if(n&&s.language_iso!==n||s.meta?.robots?.toLowerCase().includes("noindex"))return!1;const a=p(s.full_slug,s.language_iso),o=e?m(a,e)??a:a;return i.has(o)?!1:(i.add(o),!0)})}function P(r,t){return['<?xml version="1.0" encoding="UTF-8"?>','<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',r.map(n=>{const i=p(n.full_slug,n.language_iso),s=t?m(i,t):i;if(!s)return"";const a=[" <url>",` <loc>${g(s)}</loc>`];return n.published_at&&a.push(` <lastmod>${g(n.published_at)}</lastmod>`),a.push(" </url>"),a.join(`
|
|
2
|
+
`)}).filter(Boolean).join(`
|
|
3
|
+
`),"</urlset>"].join(`
|
|
4
|
+
`)}function F(r,t){return['<?xml version="1.0" encoding="UTF-8"?>','<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',r.map(n=>{const i=t?m(n,t):n;return i?[" <sitemap>",` <loc>${g(i)}</loc>`," </sitemap>"].join(`
|
|
5
|
+
`):""}).filter(Boolean).join(`
|
|
6
|
+
`),"</sitemapindex>"].join(`
|
|
7
|
+
`)}const z=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));let h=0;class k{baseUrl;token;vid;fetchClient;getRvFn;setRvFn;constructor(t,e){this.baseUrl=t.baseUrl.endsWith("/")?t.baseUrl.slice(0,-1):t.baseUrl,this.token=t.token;const n=typeof globalThis.fetch=="function"?globalThis.fetch.bind(globalThis):null;if(t.fetchClient)this.fetchClient=t.fetchClient;else if(n)this.fetchClient=n;else throw new Error("No fetch implementation available. Provide `fetchClient` in ApiClient options.");this.getRvFn=t.getRv,this.setRvFn=t.setRv;const i=this.resolveRequestUrl(e);this.vid=t.version||"published",this.setRv(i?.searchParams.get("b10cks_rv")||t.rv||h)}async get(t,e={}){const n=this.buildUrl(t,{vid:this.vid,rv:this.getRv(),...e,token:this.token}),i=await this.fetchClient(n),s=await this.parseResponse(i);return this.hasRevision(s)&&this.setRv(s.rv),s}async post(t,e,n={}){const i=this.buildUrl(t,{vid:this.vid,rv:this.getRv(),...n,token:this.token}),s=await this.fetchClient(i,{method:"POST",headers:{"Content-Type":"application/json"},body:e!==void 0?JSON.stringify(e):void 0});return this.parseResponse(s)}async getAll(t,e={}){const n=await this.get(t,{...e,page:1}),i=this.normalizeCollectionResponse(n);if(i.rv&&this.setRv(i.rv),!i.meta||i.meta.last_page<=1)return i.data;const s=Array.from({length:i.meta.last_page-1},(o,u)=>this.get(t,{...e,page:u+2})),a=await Promise.all(s);return i.data.concat(a.flatMap(o=>this.normalizeCollectionResponse(o).data))}setRv(t){this.setRvFn?this.setRvFn(t):h=t}getRv(){return this.getRvFn?this.getRvFn():h}async parseResponse(t){if(this.isFetchResponse(t)){if(!t.ok)throw new Error(`Request failed with status ${t.status}`);return await t.json()}return t}normalizeCollectionResponse(t){if(this.isCollectionResponseEnvelope(t)){const e=t.data;return{data:e.data,meta:e.meta,rv:t.rv||e.rv}}if(Array.isArray(t))return{data:t,meta:void 0,rv:void 0};if(typeof t=="object"&&t!==null&&"data"in t){const{data:e,meta:n,rv:i}=t;return{data:e,meta:n,rv:i}}return{data:[],meta:void 0,rv:void 0}}buildUrl(t,e){const n=new URL(`${this.baseUrl}/v1/${t}`);return Object.entries(e).forEach(([i,s])=>{s!=null&&n.searchParams.append(i,String(s))}),n.toString()}resolveRequestUrl(t){return t?t instanceof URL?t:new URL(t,"http://localhost"):null}isFetchResponse(t){return typeof t=="object"&&t!==null&&"json"in t&&typeof t.json=="function"&&"ok"in t}hasRevision(t){return typeof t=="object"&&t!==null&&"rv"in t}isCollectionResponseEnvelope(t){return typeof t=="object"&&t!==null&&"data"in t&&typeof t.data=="object"&&t.data!==null&&"data"in t.data&&Array.isArray(t.data.data)}}exports.ApiClient=k;exports.B10cksDataApi=b;exports.PreviewBridge=c;exports.buildLocalizedPath=p;exports.createB10cksDataApi=S;exports.filterSitemapEntries=$;exports.normalizePathSegment=d;exports.previewBridge=A;exports.renderSitemapIndex=F;exports.renderSitemapXml=P;exports.resolveB10cksLink=C;exports.serializeFilter=y;exports.types=z;
|
|
2
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","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 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 {\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'> & Record<string, unknown> = {}\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 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 ...params,\n rv: this.getRv(),\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":["serializeFilterValue","value","obj","from","to","ops","op","val","serializeFilter","filter","result","key","serialized","buildParamsWithFilter","params","sort","filterParams","sortParam","B10cksDataApi","client","endpoint","response","options","fullSlug","rest","blockId","inner","source","forceRefreshOrOptions","allPages","forceRefresh","flatParams","redirects","map","target","status_code","slug","language_iso","language","bypassCache","normalizedLanguage","cacheKey","fallbackRv","nextRv","createB10cksDataApi","PreviewBridge","eventType","callback","listeners","selectedItem","itemId","field","event","type","payload","callbacks","previewBridge","rv","ApiClient","requestUrl","defaultFetch","url","body","firstResponse","normalizedFirstResponse","pageRequests","_","i","allResponses","nestedResponse","data","meta","responseRv"],"mappings":"gFAyDA,SAASA,EAAqBC,EAAoC,CAChE,GAAIA,GAAU,KAEd,IADI,OAAOA,GAAU,WACjB,OAAOA,GAAU,SAAU,OAAO,OAAOA,CAAK,EAClD,GAAI,OAAOA,GAAU,SAAU,OAAOA,EAEtC,GAAI,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,EAAG,CACtD,MAAMC,EAAMD,EAEZ,GAAI,SAAUC,EAAK,MAAO,QAC1B,GAAI,UAAWA,EAAK,MAAO,SAC3B,GAAI,YAAaA,EAAK,CACpB,KAAM,CAACC,EAAMC,CAAE,EAAIF,EAAI,QACvB,MAAO,GAAGC,CAAI,MAAMC,CAAE,EACxB,CAEA,MAAMC,EAAM,CACV,KAAM,MAAO,OAAQ,QAAS,QAAS,QACvC,KAAM,KAAM,MAAO,MAAO,KAAM,MAAO,QAAS,QAAA,EAElD,UAAWC,KAAMD,EACf,GAAIC,KAAMJ,EAAK,CACb,MAAMK,EAAML,EAAII,CAAE,EAClB,OAAI,MAAM,QAAQC,CAAG,EAAU,GAAGD,CAAE,IAAIC,EAAI,KAAK,GAAG,CAAC,GAC9C,GAAGD,CAAE,IAAI,OAAOC,CAAG,CAAC,EAC7B,CAEJ,EAGF,CAEO,SAASC,EAAgBC,EAAyD,CACvF,MAAMC,EAAiC,CAAA,EACvC,SAAW,CAACC,EAAKV,CAAK,IAAK,OAAO,QAAQQ,CAAM,EAAG,CACjD,MAAMG,EAAaZ,EAAqBC,CAAK,EACzCW,IAAe,SACjBF,EAAOC,CAAG,EAAIC,EAElB,CACA,OAAOF,CACT,CAEA,SAASG,EACPC,EACAL,EACAM,EACgB,CAChB,MAAMC,EACJP,GAAU,OAAOA,GAAW,SACxBD,EAAgBC,CAAiC,EACjD,CAAA,EACAQ,EACJ,MAAM,QAAQF,CAAI,EAAI,CAAE,KAAMA,EAAK,KAAK,GAAG,GAAMA,GAAQ,KAAO,CAAE,KAAAA,CAAA,EAAS,CAAA,EAC7E,MAAO,CAAE,GAAGD,EAAQ,GAAGE,EAAc,GAAGC,CAAA,CAC1C,CAEO,MAAMC,CAAc,CAIzB,YAA6BC,EAAuB,CAAvB,KAAA,OAAAA,CAAwB,CAH7C,eAAqC,KAC5B,gBAAkB,IAInC,MAAM,YAAeC,EAAoBN,EAAyB,GAAgB,CAChF,MAAMO,EAAW,MAAM,KAAK,OAAO,IAAOD,EAAUN,CAAM,EAC1D,OAAO,KAAK,eAAeO,CAAQ,CACrC,CAEA,MAAM,cACJD,EACAN,EAAyB,CAAA,EACzBQ,EAAkC,CAAA,EACpB,CACd,GAAIA,EAAQ,SACV,OAAO,KAAK,OAAO,OAAUF,EAAUN,CAAM,EAG/C,MAAMO,EAAW,MAAM,KAAK,OAAO,IAA8BD,EAAUN,CAAM,EACjF,OAAO,KAAK,iBAAiBO,CAAQ,CACvC,CAEA,MAAM,WACJE,EACAT,EAA4D,GACrC,CACvB,OAAO,KAAK,YAA0B,YAAYS,CAAQ,GAAIT,CAAM,CACtE,CAEA,MAAM,YACJA,EAA8B,GAC9BQ,EAAkC,CAAA,EACT,CACzB,KAAM,CAAE,OAAAb,EAAQ,KAAAM,EAAM,GAAGS,GAASV,EAClC,OAAO,KAAK,cACV,WACAD,EAAsBW,EAAMf,EAAQM,CAAI,EACxCO,CAAA,CAEJ,CAEA,MAAM,SAASG,EAAiBX,EAAyB,GAAsB,CAC7E,OAAO,KAAK,YAAqB,UAAUW,CAAO,GAAIX,CAAM,CAC9D,CAEA,MAAM,UACJA,EAA4B,GAC5BQ,EAAkC,CAAA,EACd,CACpB,KAAM,CAAE,OAAAb,EAAQ,GAAGe,CAAA,EAASV,EAC5B,OAAO,KAAK,cACV,SACAD,EAAsBW,EAAMf,EAAQ,MAAS,EAC7Ca,CAAA,CAEJ,CAEA,MAAM,OACJR,EAC8B,CAC9B,MAAMO,EAAW,MAAM,KAAK,OAAO,IACjC,SACAP,CAAA,EAEF,GACE,OAAOO,GAAa,UACpBA,IAAa,MACb,SAAUA,GACV,SAAWA,EAEX,OAAOA,EAET,GAAI,OAAOA,GAAa,UAAYA,IAAa,MAAQ,SAAUA,EAAU,CAC3E,MAAMK,EAASL,EAA+B,KAC9C,GACE,OAAOK,GAAU,UACjBA,IAAU,MACV,SAAUA,GACV,SAAUA,EAEV,OAAOA,CAEX,CACA,OAAOL,CACT,CAEA,MAAM,WACJP,EAA8C,GAC9CQ,EAAkC,CAAA,EACP,CAC3B,OAAO,KAAK,cAA8B,UAAWR,EAAQQ,CAAO,CACtE,CAEA,MAAM,eACJK,EACAb,EAAyB,CAAA,EACzBQ,EAAkC,CAAA,EACV,CACxB,OAAO,KAAK,cAA2B,eAAeK,CAAM,WAAYb,EAAQQ,CAAO,CACzF,CAEA,MAAM,eACJR,EAAyB,GACzBQ,EAAkC,CAAA,EACT,CACzB,OAAO,KAAK,cAA4B,cAAeR,EAAQQ,CAAO,CACxE,CAEA,MAAM,SAASR,EAAyB,GAAsB,CAC5D,OAAO,KAAK,YAAqB,YAAaA,CAAM,CACtD,CAEA,MAAM,eAAea,EAAyD,CAC5E,GAAI,CAAC,KAAK,OAAO,KACf,MAAM,IAAI,MACR,yFAAA,EAGJ,OAAO,KAAK,OAAO,KAAqC,mBAAoB,CAAE,OAAAA,EAAQ,CACxF,CAOA,MAAM,aACJb,EAA+B,GAC/Bc,EAAwD,GAClC,CACtB,KAAM,CAAE,SAAAC,EAAW,GAAO,aAAAC,EAAe,IACvC,OAAOF,GAA0B,UAC7B,CAAE,SAAU,GAAM,aAAcA,GAChCA,EAEN,GAAIC,GAAY,KAAK,gBAAkB,CAACC,EACtC,OAAO,KAAK,eAGd,KAAM,CAAE,OAAArB,EAAQ,GAAGe,CAAA,EAASV,EACtBiB,EAAalB,EAAsBW,EAAMf,EAAQ,MAAS,EAC1DuB,EAAY,MAAM,KAAK,cAA0B,YAAaD,EAAY,CAAE,SAAAF,EAAU,EACtFI,EAAM,OAAO,YACjBD,EAAU,IAAI,CAAC,CAAE,OAAAL,EAAQ,OAAAO,EAAQ,YAAAC,CAAA,IAAkB,CAACR,EAAQ,CAAE,OAAAO,EAAQ,YAAAC,CAAA,CAAa,CAAC,CAAA,EAGtF,OAAIN,IACF,KAAK,eAAiBI,GAGjBA,CACT,CAEA,MAAM,UAAuC,CAC3C,KAAAG,EAAO,UACP,aAAAC,EACA,SAAAC,EACA,YAAAC,EAAc,GACd,GAAGzB,CAAA,EACiB,GAAgB,CACpC,MAAM0B,EAAqBH,GAAgBC,EACrCG,EAAW,KAAK,UAAU,CAAE,KAAAL,EAAM,aAAcI,EAAoB,GAAG1B,EAAQ,EACrF,GAAI,CAACyB,GAAe,KAAK,YAAY,IAAIE,CAAQ,EAC/C,OAAO,KAAK,YAAY,IAAIA,CAAQ,EAOtC,MAAMxC,GAJgB,MAAM,KAAK,WAAoCmC,EAAM,CACzE,GAAGtB,EACH,aAAc0B,CAAA,CACf,GAC4B,SAAW,CAAA,EAExC,OAAKD,GACH,KAAK,YAAY,IAAIE,EAAUxC,CAAK,EAG/BA,CACT,CAEA,MAAM,aAAayC,EAAa,UAAqC,CAEnE,MAAMC,GADQ,MAAM,KAAK,SAAA,GACJ,IAAMD,EAC3B,YAAK,OAAO,MAAMC,CAAM,EACjBA,CACT,CAEA,YAAa,CACX,KAAK,eAAiB,KACtB,KAAK,YAAY,MAAA,CACnB,CAEQ,eAAkBtB,EAA8B,CACtD,OAAI,OAAOA,GAAa,UAAYA,IAAa,MAAQ,SAAUA,EACzDA,EAAyB,KAG5BA,CACT,CAEQ,iBAAoBA,EAAuC,CACjE,GAAI,MAAM,QAAQA,CAAQ,EACxB,OAAOA,EAGT,GAAI,OAAOA,GAAa,UAAYA,IAAa,MAAQ,SAAUA,EAAU,CAC3E,GAAI,MAAM,QAAQA,EAAS,IAAI,EAC7B,OAAOA,EAAS,KAGlB,GACE,OAAOA,EAAS,MAAS,UACzBA,EAAS,OAAS,MAClB,SAAUA,EAAS,MACnB,MAAM,QAAQA,EAAS,KAAK,IAAI,EAEhC,OAAOA,EAAS,KAAK,IAEzB,CAEA,MAAO,CAAA,CACT,CACF,CAEO,SAASuB,EAAoBzB,EAAsC,CACxE,OAAO,IAAID,EAAcC,CAAM,CACjC,CCtTO,MAAM0B,CAAc,CACzB,OAAe,SACE,UAAqE,CAAA,EAC9E,YAAc,GAEd,aAAc,CAAC,CAEvB,OAAO,aAAc,CACnB,OAAKA,EAAc,WACjBA,EAAc,SAAW,IAAIA,GAExBA,EAAc,QACvB,CAEA,MAAO,CACD,CAAC,KAAK,mBAAqB,KAAK,cAIpC,OAAO,iBAAiB,UAAW,KAAK,aAAa,EACrD,KAAK,YAAc,GACrB,CAEA,SAAU,CACJ,KAAK,aAAe,OAAO,OAAW,KACxC,OAAO,oBAAoB,UAAW,KAAK,aAAa,EAE1D,KAAK,YAAc,GACnB,UAAWC,KAAa,OAAO,KAAK,KAAK,SAAS,EAChD,KAAK,UAAUA,CAAS,GAAG,MAAA,CAE/B,CAEA,iBAA2B,CACzB,OAAO,OAAO,OAAW,KAAe,OAAO,OAAS,OAAO,GACjE,CAEA,GAAwBA,EAAcC,EAAyD,CAC7F,GAAI,CAAC,KAAK,kBACR,MAAO,IAAM,CAAC,EAGhB,MAAMC,EAAY,KAAK,UAAUF,CAAS,OAAS,IACnD,YAAK,UAAUA,CAAS,EAAIE,EAC5BA,EAAU,IAAID,CAAkC,EAEzC,IAAM,CACXC,EAAU,OAAOD,CAAkC,CACrD,CACF,CAEA,WAAWE,EAAsB,CAC1B,KAAK,mBAIV,OAAO,OAAO,YACZ,CACE,KAAM,gBACN,QAAS,CAAE,aAAAA,CAAA,CAAa,EAE1B,GAAA,CAEJ,CAEA,YAAYC,EAAgBC,EAAelD,EAAe,CACnD,KAAK,mBAIV,OAAO,OAAO,YACZ,CACE,KAAM,eACN,QAAS,CAAE,OAAAiD,EAAQ,MAAAC,EAAO,MAAAlD,CAAA,CAAM,EAElC,GAAA,CAEJ,CAEQ,cAAiBmD,GAAwB,CAC/C,GAAI,CAACA,EAAM,MAAQ,OAAOA,EAAM,MAAS,SACvC,OAGF,KAAM,CAAE,KAAAC,EAAM,QAAAC,CAAA,EAAYF,EAAM,KAC5B,CAACC,GAAQ,CAACC,GAId,KAAK,OAAOD,EAAMC,CAAgB,CACpC,EAEQ,OAA4BD,EAASC,EAA6B,CACxE,MAAMC,EAAY,KAAK,UAAUF,CAAI,EACrC,GAAKE,EAIL,UAAWR,KAAYQ,EACnBR,EAA+CO,CAAO,CAE5D,CACF,CAEO,MAAME,EAAgBX,EAAc,YAAA,+FCnH3C,IAAIY,EAAsB,EASnB,MAAMC,CAAU,CACJ,QACR,MACQ,IACA,YACA,QACA,QAEjB,YAAYpC,EAAiCqC,EAA2B,CACtE,KAAK,QAAUrC,EAAQ,QAAQ,SAAS,GAAG,EAAIA,EAAQ,QAAQ,MAAM,EAAG,EAAE,EAAIA,EAAQ,QACtF,KAAK,MAAQA,EAAQ,MACrB,MAAMsC,EACJ,OAAO,WAAW,OAAU,WAAa,WAAW,MAAM,KAAK,UAAU,EAAI,KAC/E,GAAItC,EAAQ,YACV,KAAK,YAAcA,EAAQ,oBAClBsC,EACT,KAAK,YAAcA,MAEnB,OAAM,IAAI,MACR,gFAAA,EAIJ,KAAK,QAAUtC,EAAQ,MACvB,KAAK,QAAUA,EAAQ,MAEvB,MAAMuC,EAAM,KAAK,kBAAkBF,CAAU,EAC7C,KAAK,IAAMrC,EAAQ,SAAW,YAC9B,KAAK,MAAMuC,GAAK,aAAa,IAAI,WAAW,GAAKvC,EAAQ,IAAMmC,CAAE,CACnE,CAEA,MAAM,IACJrC,EACAN,EAAqE,GACpC,CACjC,MAAM+C,EAAM,KAAK,SAASzC,EAAU,CAClC,IAAK,KAAK,IACV,GAAGN,EACH,GAAI,KAAK,MAAA,EACT,MAAO,KAAK,KAAA,CACb,EAEKwC,EAAU,MAAM,KAAK,YAAYO,CAAG,EACpCxC,EAAW,MAAM,KAAK,cAAsCiC,CAAO,EAEzE,OAAI,KAAK,YAAYjC,CAAQ,GAC3B,KAAK,MAAMA,EAAS,EAAE,EAGjBA,CACT,CAEA,MAAM,KACJD,EACA0C,EACAhD,EAAqE,CAAA,EACzD,CACZ,MAAM+C,EAAM,KAAK,SAASzC,EAAU,CAClC,IAAK,KAAK,IACV,GAAGN,EACH,GAAI,KAAK,MAAA,EACT,MAAO,KAAK,KAAA,CACb,EAEKwC,EAAU,MAAM,KAAK,YAAYO,EAAK,CAC1C,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAA,EAC3B,KAAMC,IAAS,OAAY,KAAK,UAAUA,CAAI,EAAI,MAAA,CACnD,EAED,OAAO,KAAK,cAAiBR,CAAO,CACtC,CAEA,MAAM,OACJlC,EACAN,EAAqE,GACvD,CACd,MAAMiD,EAAgB,MAAM,KAAK,IAAiD3C,EAAU,CAC1F,GAAGN,EACH,KAAM,CAAA,CACP,EACKkD,EAA0B,KAAK,4BAA+BD,CAAa,EAMjF,GAJIC,EAAwB,IAC1B,KAAK,MAAMA,EAAwB,EAAE,EAGnC,CAACA,EAAwB,MAAQA,EAAwB,KAAK,WAAa,EAC7E,OAAOA,EAAwB,KAGjC,MAAMC,EAAe,MAAM,KACzB,CAAE,OAAQD,EAAwB,KAAK,UAAY,CAAA,EACnD,CAACE,EAAGC,IAAM,KAAK,IAA6B/C,EAAU,CAAE,GAAGN,EAAQ,KAAMqD,EAAI,CAAA,CAAG,CAAA,EAG5EC,EAAe,MAAM,QAAQ,IAAIH,CAAY,EAEnD,OAAOD,EAAwB,KAAK,OAClCI,EAAa,QAAS/C,GAAa,KAAK,4BAA+BA,CAAQ,EAAE,IAAI,CAAA,CAEzF,CAEA,MAAMpB,EAAwB,CACxB,KAAK,QACP,KAAK,QAAQA,CAAK,EAElBwD,EAAKxD,CAET,CAEA,OAAQ,CACN,OAAI,KAAK,QACA,KAAK,QAAA,EAEPwD,CACT,CAEA,MAAc,cAAiBH,EAA8B,CAC3D,GAAI,KAAK,gBAAgBA,CAAO,EAAG,CACjC,GAAI,CAACA,EAAQ,GACX,MAAM,IAAI,MAAM,8BAA8BA,EAAQ,MAAM,EAAE,EAGhE,OAAQ,MAAMA,EAAQ,KAAA,CACxB,CAEA,OAAOA,CACT,CAEQ,4BAA+BjC,EAAoC,CACzE,GAAI,KAAK,6BAA6BA,CAAQ,EAAG,CAC/C,MAAMgD,EAAiBhD,EAAS,KAEhC,MAAO,CACL,KAAMgD,EAAe,KACrB,KAAOA,EAA+D,KACtE,GAAIhD,EAAS,IAAMgD,EAAe,EAAA,CAEtC,CAEA,GAAI,MAAM,QAAQhD,CAAQ,EACxB,MAAO,CAAE,KAAMA,EAAU,KAAM,OAAW,GAAI,MAAA,EAGhD,GAAI,OAAOA,GAAa,UAAYA,IAAa,MAAQ,SAAUA,EAAU,CAC3E,KAAM,CACJ,KAAAiD,EACA,KAAAC,EACA,GAAIC,CAAA,EACFnD,EAKJ,MAAO,CAAE,KAAAiD,EAAM,KAAAC,EAAM,GAAIC,CAAA,CAC3B,CAEA,MAAO,CAAE,KAAM,CAAA,EAAI,KAAM,OAAW,GAAI,MAAA,CAC1C,CAEQ,SAASpD,EAAkBN,EAAyC,CAC1E,MAAM+C,EAAM,IAAI,IAAI,GAAG,KAAK,OAAO,OAAOzC,CAAQ,EAAE,EAEpD,cAAO,QAAQN,CAAM,EAAE,QAAQ,CAAC,CAACH,EAAKV,CAAK,IAAM,CACpBA,GAAU,MACnC4D,EAAI,aAAa,OAAOlD,EAAK,OAAOV,CAAK,CAAC,CAE9C,CAAC,EAEM4D,EAAI,SAAA,CACb,CAEQ,kBAAkBF,EAAuC,CAC/D,OAAKA,EAIDA,aAAsB,IACjBA,EAGF,IAAI,IAAIA,EAAY,kBAAkB,EAPpC,IAQX,CAEQ,gBAAgB1D,EAAmC,CACzD,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,SAAUA,GACV,OAAQA,EAAmB,MAAS,YACpC,OAAQA,CAEZ,CAEQ,YAAYA,EAAkD,CACpE,OAAO,OAAOA,GAAU,UAAYA,IAAU,MAAQ,OAAQA,CAChE,CAEQ,6BACNA,EAC8C,CAC9C,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,SAAUA,GACV,OAAOA,EAAM,MAAS,UACtBA,EAAM,OAAS,MACf,SAAUA,EAAM,MAChB,MAAM,QAAQA,EAAM,KAAK,IAAI,CAEjC,CACF"}
|
|
1
|
+
{"version":3,"file":"index.js","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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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
|
-
function
|
|
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) {
|
|
2
16
|
if (s != null) {
|
|
3
17
|
if (typeof s == "boolean" || typeof s == "number") return String(s);
|
|
4
18
|
if (typeof s == "string") return s;
|
|
@@ -7,8 +21,8 @@ function p(s) {
|
|
|
7
21
|
if ("null" in t) return "null:";
|
|
8
22
|
if ("!null" in t) return "!null:";
|
|
9
23
|
if ("between" in t) {
|
|
10
|
-
const [
|
|
11
|
-
return `${
|
|
24
|
+
const [n, i] = t.between;
|
|
25
|
+
return `${n}...${i}`;
|
|
12
26
|
}
|
|
13
27
|
const e = [
|
|
14
28
|
"eq",
|
|
@@ -26,50 +40,50 @@ function p(s) {
|
|
|
26
40
|
"empty",
|
|
27
41
|
"!empty"
|
|
28
42
|
];
|
|
29
|
-
for (const
|
|
30
|
-
if (
|
|
31
|
-
const
|
|
32
|
-
return Array.isArray(
|
|
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)}`;
|
|
33
47
|
}
|
|
34
48
|
}
|
|
35
49
|
}
|
|
36
50
|
}
|
|
37
51
|
function R(s) {
|
|
38
52
|
const t = {};
|
|
39
|
-
for (const [e,
|
|
40
|
-
const
|
|
41
|
-
|
|
53
|
+
for (const [e, n] of Object.entries(s)) {
|
|
54
|
+
const i = v(n);
|
|
55
|
+
i !== void 0 && (t[e] = i);
|
|
42
56
|
}
|
|
43
57
|
return t;
|
|
44
58
|
}
|
|
45
|
-
function
|
|
46
|
-
const
|
|
47
|
-
return { ...s, ...
|
|
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 };
|
|
48
62
|
}
|
|
49
|
-
class
|
|
63
|
+
class C {
|
|
50
64
|
constructor(t) {
|
|
51
65
|
this.client = t;
|
|
52
66
|
}
|
|
53
67
|
redirectsCache = null;
|
|
54
68
|
configCache = /* @__PURE__ */ new Map();
|
|
55
69
|
async getResource(t, e = {}) {
|
|
56
|
-
const
|
|
57
|
-
return this.unwrapResource(
|
|
70
|
+
const n = await this.client.get(t, e);
|
|
71
|
+
return this.unwrapResource(n);
|
|
58
72
|
}
|
|
59
|
-
async getCollection(t, e = {},
|
|
60
|
-
if (
|
|
73
|
+
async getCollection(t, e = {}, n = {}) {
|
|
74
|
+
if (n.allPages)
|
|
61
75
|
return this.client.getAll(t, e);
|
|
62
|
-
const
|
|
63
|
-
return this.unwrapCollection(
|
|
76
|
+
const i = await this.client.get(t, e);
|
|
77
|
+
return this.unwrapCollection(i);
|
|
64
78
|
}
|
|
65
79
|
async getContent(t, e = {}) {
|
|
66
80
|
return this.getResource(`contents/${t}`, e);
|
|
67
81
|
}
|
|
68
82
|
async getContents(t = {}, e = {}) {
|
|
69
|
-
const { filter:
|
|
83
|
+
const { filter: n, sort: i, ...r } = t;
|
|
70
84
|
return this.getCollection(
|
|
71
85
|
"contents",
|
|
72
|
-
|
|
86
|
+
f(r, n, i),
|
|
73
87
|
e
|
|
74
88
|
);
|
|
75
89
|
}
|
|
@@ -77,10 +91,10 @@ class v {
|
|
|
77
91
|
return this.getResource(`blocks/${t}`, e);
|
|
78
92
|
}
|
|
79
93
|
async getBlocks(t = {}, e = {}) {
|
|
80
|
-
const { filter:
|
|
94
|
+
const { filter: n, ...i } = t;
|
|
81
95
|
return this.getCollection(
|
|
82
96
|
"blocks",
|
|
83
|
-
|
|
97
|
+
f(i, n, void 0),
|
|
84
98
|
e
|
|
85
99
|
);
|
|
86
100
|
}
|
|
@@ -92,17 +106,17 @@ class v {
|
|
|
92
106
|
if (typeof e == "object" && e !== null && "data" in e && "meta" in e)
|
|
93
107
|
return e;
|
|
94
108
|
if (typeof e == "object" && e !== null && "data" in e) {
|
|
95
|
-
const
|
|
96
|
-
if (typeof
|
|
97
|
-
return
|
|
109
|
+
const n = e.data;
|
|
110
|
+
if (typeof n == "object" && n !== null && "meta" in n && "data" in n)
|
|
111
|
+
return n;
|
|
98
112
|
}
|
|
99
113
|
return e;
|
|
100
114
|
}
|
|
101
115
|
async getSitemap(t = {}, e = {}) {
|
|
102
116
|
return this.getCollection("sitemap", t, e);
|
|
103
117
|
}
|
|
104
|
-
async getDataEntries(t, e = {},
|
|
105
|
-
return this.getCollection(`datasources/${t}/entries`, e,
|
|
118
|
+
async getDataEntries(t, e = {}, n = {}) {
|
|
119
|
+
return this.getCollection(`datasources/${t}/entries`, e, n);
|
|
106
120
|
}
|
|
107
121
|
async getDataSources(t = {}, e = {}) {
|
|
108
122
|
return this.getCollection("datasources", t, e);
|
|
@@ -118,33 +132,33 @@ class v {
|
|
|
118
132
|
return this.client.post("redirects/lookup", { source: t });
|
|
119
133
|
}
|
|
120
134
|
async getRedirects(t = {}, e = !1) {
|
|
121
|
-
const { allPages:
|
|
122
|
-
if (
|
|
135
|
+
const { allPages: n = !1, forceRefresh: i = !1 } = typeof e == "boolean" ? { allPages: !0, forceRefresh: e } : e;
|
|
136
|
+
if (n && this.redirectsCache && !i)
|
|
123
137
|
return this.redirectsCache;
|
|
124
|
-
const { filter: r, ...
|
|
125
|
-
|
|
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 }])
|
|
126
140
|
);
|
|
127
|
-
return
|
|
141
|
+
return n && (this.redirectsCache = l), l;
|
|
128
142
|
}
|
|
129
143
|
async getConfig({
|
|
130
144
|
slug: t = "_config",
|
|
131
145
|
language_iso: e,
|
|
132
|
-
language:
|
|
133
|
-
bypassCache:
|
|
146
|
+
language: n,
|
|
147
|
+
bypassCache: i = !1,
|
|
134
148
|
...r
|
|
135
149
|
} = {}) {
|
|
136
|
-
const
|
|
137
|
-
if (!
|
|
138
|
-
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);
|
|
139
153
|
const l = (await this.getContent(t, {
|
|
140
154
|
...r,
|
|
141
|
-
language_iso:
|
|
155
|
+
language_iso: a
|
|
142
156
|
})).content ?? {};
|
|
143
|
-
return
|
|
157
|
+
return i || this.configCache.set(o, l), l;
|
|
144
158
|
}
|
|
145
159
|
async syncRevision(t = 426713400) {
|
|
146
|
-
const
|
|
147
|
-
return this.client.setRv(
|
|
160
|
+
const n = (await this.getSpace()).rv || t;
|
|
161
|
+
return this.client.setRv(n), n;
|
|
148
162
|
}
|
|
149
163
|
clearCache() {
|
|
150
164
|
this.redirectsCache = null, this.configCache.clear();
|
|
@@ -164,8 +178,8 @@ class v {
|
|
|
164
178
|
return [];
|
|
165
179
|
}
|
|
166
180
|
}
|
|
167
|
-
function
|
|
168
|
-
return new
|
|
181
|
+
function $(s) {
|
|
182
|
+
return new C(s);
|
|
169
183
|
}
|
|
170
184
|
class c {
|
|
171
185
|
static instance;
|
|
@@ -191,9 +205,9 @@ class c {
|
|
|
191
205
|
if (!this.isInPreviewMode())
|
|
192
206
|
return () => {
|
|
193
207
|
};
|
|
194
|
-
const
|
|
195
|
-
return this.listeners[t] =
|
|
196
|
-
|
|
208
|
+
const n = this.listeners[t] || /* @__PURE__ */ new Set();
|
|
209
|
+
return this.listeners[t] = n, n.add(e), () => {
|
|
210
|
+
n.delete(e);
|
|
197
211
|
};
|
|
198
212
|
}
|
|
199
213
|
selectItem(t) {
|
|
@@ -205,11 +219,11 @@ class c {
|
|
|
205
219
|
"*"
|
|
206
220
|
);
|
|
207
221
|
}
|
|
208
|
-
updateField(t, e,
|
|
222
|
+
updateField(t, e, n) {
|
|
209
223
|
this.isInPreviewMode() && window.parent.postMessage(
|
|
210
224
|
{
|
|
211
225
|
type: "FIELD_UPDATE",
|
|
212
|
-
payload: { itemId: t, field: e, value:
|
|
226
|
+
payload: { itemId: t, field: e, value: n }
|
|
213
227
|
},
|
|
214
228
|
"*"
|
|
215
229
|
);
|
|
@@ -217,21 +231,83 @@ class c {
|
|
|
217
231
|
handleMessage = (t) => {
|
|
218
232
|
if (!t.data || typeof t.data != "object")
|
|
219
233
|
return;
|
|
220
|
-
const { type: e, payload:
|
|
221
|
-
!e || !
|
|
234
|
+
const { type: e, payload: n } = t.data;
|
|
235
|
+
!e || !n || this.notify(e, n);
|
|
222
236
|
};
|
|
223
237
|
notify(t, e) {
|
|
224
|
-
const
|
|
225
|
-
if (
|
|
226
|
-
for (const
|
|
227
|
-
|
|
238
|
+
const n = this.listeners[t];
|
|
239
|
+
if (n)
|
|
240
|
+
for (const i of n)
|
|
241
|
+
i(e);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
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;
|
|
228
263
|
}
|
|
229
264
|
}
|
|
230
|
-
|
|
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({
|
|
231
307
|
__proto__: null
|
|
232
308
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
233
|
-
let
|
|
234
|
-
class
|
|
309
|
+
let h = 0;
|
|
310
|
+
class E {
|
|
235
311
|
baseUrl;
|
|
236
312
|
token;
|
|
237
313
|
vid;
|
|
@@ -240,35 +316,35 @@ class m {
|
|
|
240
316
|
setRvFn;
|
|
241
317
|
constructor(t, e) {
|
|
242
318
|
this.baseUrl = t.baseUrl.endsWith("/") ? t.baseUrl.slice(0, -1) : t.baseUrl, this.token = t.token;
|
|
243
|
-
const
|
|
319
|
+
const n = typeof globalThis.fetch == "function" ? globalThis.fetch.bind(globalThis) : null;
|
|
244
320
|
if (t.fetchClient)
|
|
245
321
|
this.fetchClient = t.fetchClient;
|
|
246
|
-
else if (
|
|
247
|
-
this.fetchClient =
|
|
322
|
+
else if (n)
|
|
323
|
+
this.fetchClient = n;
|
|
248
324
|
else
|
|
249
325
|
throw new Error(
|
|
250
326
|
"No fetch implementation available. Provide `fetchClient` in ApiClient options."
|
|
251
327
|
);
|
|
252
328
|
this.getRvFn = t.getRv, this.setRvFn = t.setRv;
|
|
253
|
-
const
|
|
254
|
-
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);
|
|
255
331
|
}
|
|
256
332
|
async get(t, e = {}) {
|
|
257
|
-
const
|
|
333
|
+
const n = this.buildUrl(t, {
|
|
258
334
|
vid: this.vid,
|
|
259
|
-
...e,
|
|
260
335
|
rv: this.getRv(),
|
|
336
|
+
...e,
|
|
261
337
|
token: this.token
|
|
262
|
-
}),
|
|
338
|
+
}), i = await this.fetchClient(n), r = await this.parseResponse(i);
|
|
263
339
|
return this.hasRevision(r) && this.setRv(r.rv), r;
|
|
264
340
|
}
|
|
265
|
-
async post(t, e,
|
|
266
|
-
const
|
|
341
|
+
async post(t, e, n = {}) {
|
|
342
|
+
const i = this.buildUrl(t, {
|
|
267
343
|
vid: this.vid,
|
|
268
|
-
...i,
|
|
269
344
|
rv: this.getRv(),
|
|
345
|
+
...n,
|
|
270
346
|
token: this.token
|
|
271
|
-
}), r = await this.fetchClient(
|
|
347
|
+
}), r = await this.fetchClient(i, {
|
|
272
348
|
method: "POST",
|
|
273
349
|
headers: { "Content-Type": "application/json" },
|
|
274
350
|
body: e !== void 0 ? JSON.stringify(e) : void 0
|
|
@@ -276,25 +352,25 @@ class m {
|
|
|
276
352
|
return this.parseResponse(r);
|
|
277
353
|
}
|
|
278
354
|
async getAll(t, e = {}) {
|
|
279
|
-
const
|
|
355
|
+
const n = await this.get(t, {
|
|
280
356
|
...e,
|
|
281
357
|
page: 1
|
|
282
|
-
}),
|
|
283
|
-
if (
|
|
284
|
-
return
|
|
358
|
+
}), i = this.normalizeCollectionResponse(n);
|
|
359
|
+
if (i.rv && this.setRv(i.rv), !i.meta || i.meta.last_page <= 1)
|
|
360
|
+
return i.data;
|
|
285
361
|
const r = Array.from(
|
|
286
|
-
{ length:
|
|
287
|
-
(
|
|
288
|
-
),
|
|
289
|
-
return
|
|
290
|
-
|
|
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)
|
|
291
367
|
);
|
|
292
368
|
}
|
|
293
369
|
setRv(t) {
|
|
294
|
-
this.setRvFn ? this.setRvFn(t) :
|
|
370
|
+
this.setRvFn ? this.setRvFn(t) : h = t;
|
|
295
371
|
}
|
|
296
372
|
getRv() {
|
|
297
|
-
return this.getRvFn ? this.getRvFn() :
|
|
373
|
+
return this.getRvFn ? this.getRvFn() : h;
|
|
298
374
|
}
|
|
299
375
|
async parseResponse(t) {
|
|
300
376
|
if (this.isFetchResponse(t)) {
|
|
@@ -318,18 +394,18 @@ class m {
|
|
|
318
394
|
if (typeof t == "object" && t !== null && "data" in t) {
|
|
319
395
|
const {
|
|
320
396
|
data: e,
|
|
321
|
-
meta:
|
|
322
|
-
rv:
|
|
397
|
+
meta: n,
|
|
398
|
+
rv: i
|
|
323
399
|
} = t;
|
|
324
|
-
return { data: e, meta:
|
|
400
|
+
return { data: e, meta: n, rv: i };
|
|
325
401
|
}
|
|
326
402
|
return { data: [], meta: void 0, rv: void 0 };
|
|
327
403
|
}
|
|
328
404
|
buildUrl(t, e) {
|
|
329
|
-
const
|
|
330
|
-
return Object.entries(e).forEach(([
|
|
331
|
-
r != null &&
|
|
332
|
-
}),
|
|
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();
|
|
333
409
|
}
|
|
334
410
|
resolveRequestUrl(t) {
|
|
335
411
|
return t ? t instanceof URL ? t : new URL(t, "http://localhost") : null;
|
|
@@ -345,12 +421,18 @@ class m {
|
|
|
345
421
|
}
|
|
346
422
|
}
|
|
347
423
|
export {
|
|
348
|
-
|
|
349
|
-
|
|
424
|
+
E as ApiClient,
|
|
425
|
+
C as B10cksDataApi,
|
|
350
426
|
c as PreviewBridge,
|
|
351
|
-
|
|
352
|
-
|
|
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,
|
|
353
435
|
R as serializeFilter,
|
|
354
|
-
|
|
436
|
+
_ as types
|
|
355
437
|
};
|
|
356
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 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 {\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'> & Record<string, unknown> = {}\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 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 ...params,\n rv: this.getRv(),\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":["serializeFilterValue","value","obj","from","to","ops","op","val","serializeFilter","filter","result","key","serialized","buildParamsWithFilter","params","sort","filterParams","sortParam","B10cksDataApi","client","endpoint","response","options","fullSlug","rest","blockId","inner","source","forceRefreshOrOptions","allPages","forceRefresh","flatParams","redirects","map","target","status_code","slug","language_iso","language","bypassCache","normalizedLanguage","cacheKey","fallbackRv","nextRv","createB10cksDataApi","PreviewBridge","eventType","callback","listeners","selectedItem","itemId","field","event","type","payload","callbacks","previewBridge","rv","ApiClient","requestUrl","defaultFetch","url","body","firstResponse","normalizedFirstResponse","pageRequests","_","i","allResponses","nestedResponse","data","meta","responseRv"],"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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"}
|