@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 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, language: 'de' })
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 R(s){if(s!=null){if(typeof s=="boolean"||typeof s=="number")return String(s);if(typeof s=="string")return s;if(typeof s=="object"&&!Array.isArray(s)){const t=s;if("null"in t)return"null:";if("!null"in t)return"!null:";if("between"in t){const[i,n]=t.between;return`${i}...${n}`}const e=["eq","neq","like","!like","^like","like$","lt","gt","lte","gte","in","!in","empty","!empty"];for(const i of e)if(i in t){const n=t[i];return Array.isArray(n)?`${i}:${n.join(",")}`:`${i}:${String(n)}`}}}}function d(s){const t={};for(const[e,i]of Object.entries(s)){const n=R(i);n!==void 0&&(t[e]=n)}return t}function h(s,t,e){const i=t&&typeof t=="object"?d(t):{},n=Array.isArray(e)?{sort:e.join(",")}:e!=null?{sort:e}:{};return{...s,...i,...n}}class g{constructor(t){this.client=t}redirectsCache=null;configCache=new Map;async getResource(t,e={}){const i=await this.client.get(t,e);return this.unwrapResource(i)}async getCollection(t,e={},i={}){if(i.allPages)return this.client.getAll(t,e);const n=await this.client.get(t,e);return this.unwrapCollection(n)}async getContent(t,e={}){return this.getResource(`contents/${t}`,e)}async getContents(t={},e={}){const{filter:i,sort:n,...r}=t;return this.getCollection("contents",h(r,i,n),e)}async getBlock(t,e={}){return this.getResource(`blocks/${t}`,e)}async getBlocks(t={},e={}){const{filter:i,...n}=t;return this.getCollection("blocks",h(n,i,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 i=e.data;if(typeof i=="object"&&i!==null&&"meta"in i&&"data"in i)return i}return e}async getSitemap(t={},e={}){return this.getCollection("sitemap",t,e)}async getDataEntries(t,e={},i={}){return this.getCollection(`datasources/${t}/entries`,e,i)}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:i=!1,forceRefresh:n=!1}=typeof e=="boolean"?{allPages:!0,forceRefresh:e}:e;if(i&&this.redirectsCache&&!n)return this.redirectsCache;const{filter:r,...c}=t,a=h(c,r,void 0),f=await this.getCollection("redirects",a,{allPages:i}),l=Object.fromEntries(f.map(({source:y,target:p,status_code:v})=>[y,{target:p,status_code:v}]));return i&&(this.redirectsCache=l),l}async getConfig({slug:t="_config",language_iso:e,language:i,bypassCache:n=!1,...r}={}){const c=e??i,a=JSON.stringify({slug:t,language_iso:c,...r});if(!n&&this.configCache.has(a))return this.configCache.get(a);const l=(await this.getContent(t,{...r,language_iso:c})).content??{};return n||this.configCache.set(a,l),l}async syncRevision(t=426713400){const i=(await this.getSpace()).rv||t;return this.client.setRv(i),i}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 w(s){return new g(s)}class o{static instance;listeners={};initialized=!1;constructor(){}static getInstance(){return o.instance||(o.instance=new o),o.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 i=this.listeners[t]||new Set;return this.listeners[t]=i,i.add(e),()=>{i.delete(e)}}selectItem(t){this.isInPreviewMode()&&window.parent.postMessage({type:"SELECT_UPDATE",payload:{selectedItem:t}},"*")}updateField(t,e,i){this.isInPreviewMode()&&window.parent.postMessage({type:"FIELD_UPDATE",payload:{itemId:t,field:e,value:i}},"*")}handleMessage=t=>{if(!t.data||typeof t.data!="object")return;const{type:e,payload:i}=t.data;!e||!i||this.notify(e,i)};notify(t,e){const i=this.listeners[t];if(i)for(const n of i)n(e)}}const b=o.getInstance(),C=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));let u=0;class m{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 i=typeof globalThis.fetch=="function"?globalThis.fetch.bind(globalThis):null;if(t.fetchClient)this.fetchClient=t.fetchClient;else if(i)this.fetchClient=i;else throw new Error("No fetch implementation available. Provide `fetchClient` in ApiClient options.");this.getRvFn=t.getRv,this.setRvFn=t.setRv;const n=this.resolveRequestUrl(e);this.vid=t.version||"published",this.setRv(n?.searchParams.get("b10cks_rv")||t.rv||u)}async get(t,e={}){const i=this.buildUrl(t,{vid:this.vid,...e,rv:this.getRv(),token:this.token}),n=await this.fetchClient(i),r=await this.parseResponse(n);return this.hasRevision(r)&&this.setRv(r.rv),r}async post(t,e,i={}){const n=this.buildUrl(t,{vid:this.vid,...i,rv:this.getRv(),token:this.token}),r=await this.fetchClient(n,{method:"POST",headers:{"Content-Type":"application/json"},body:e!==void 0?JSON.stringify(e):void 0});return this.parseResponse(r)}async getAll(t,e={}){const i=await this.get(t,{...e,page:1}),n=this.normalizeCollectionResponse(i);if(n.rv&&this.setRv(n.rv),!n.meta||n.meta.last_page<=1)return n.data;const r=Array.from({length:n.meta.last_page-1},(a,f)=>this.get(t,{...e,page:f+2})),c=await Promise.all(r);return n.data.concat(c.flatMap(a=>this.normalizeCollectionResponse(a).data))}setRv(t){this.setRvFn?this.setRvFn(t):u=t}getRv(){return this.getRvFn?this.getRvFn():u}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:i,rv:n}=t;return{data:e,meta:i,rv:n}}return{data:[],meta:void 0,rv:void 0}}buildUrl(t,e){const i=new URL(`${this.baseUrl}/v1/${t}`);return Object.entries(e).forEach(([n,r])=>{r!=null&&i.searchParams.append(n,String(r))}),i.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=m;exports.B10cksDataApi=g;exports.PreviewBridge=o;exports.createB10cksDataApi=w;exports.previewBridge=b;exports.serializeFilter=d;exports.types=C;
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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}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":"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"}
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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\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 p(s) {
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 [i, n] = t.between;
11
- return `${i}...${n}`;
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 i of e)
30
- if (i in t) {
31
- const n = t[i];
32
- return Array.isArray(n) ? `${i}:${n.join(",")}` : `${i}:${String(n)}`;
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, i] of Object.entries(s)) {
40
- const n = p(i);
41
- n !== void 0 && (t[e] = n);
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 h(s, t, e) {
46
- const i = t && typeof t == "object" ? R(t) : {}, n = Array.isArray(e) ? { sort: e.join(",") } : e != null ? { sort: e } : {};
47
- return { ...s, ...i, ...n };
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 v {
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 i = await this.client.get(t, e);
57
- return this.unwrapResource(i);
70
+ const n = await this.client.get(t, e);
71
+ return this.unwrapResource(n);
58
72
  }
59
- async getCollection(t, e = {}, i = {}) {
60
- if (i.allPages)
73
+ async getCollection(t, e = {}, n = {}) {
74
+ if (n.allPages)
61
75
  return this.client.getAll(t, e);
62
- const n = await this.client.get(t, e);
63
- return this.unwrapCollection(n);
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: i, sort: n, ...r } = t;
83
+ const { filter: n, sort: i, ...r } = t;
70
84
  return this.getCollection(
71
85
  "contents",
72
- h(r, i, n),
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: i, ...n } = t;
94
+ const { filter: n, ...i } = t;
81
95
  return this.getCollection(
82
96
  "blocks",
83
- h(n, i, void 0),
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 i = e.data;
96
- if (typeof i == "object" && i !== null && "meta" in i && "data" in i)
97
- return i;
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 = {}, i = {}) {
105
- return this.getCollection(`datasources/${t}/entries`, e, i);
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: i = !1, forceRefresh: n = !1 } = typeof e == "boolean" ? { allPages: !0, forceRefresh: e } : e;
122
- if (i && this.redirectsCache && !n)
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, ...o } = t, a = h(o, r, void 0), f = await this.getCollection("redirects", a, { allPages: i }), l = Object.fromEntries(
125
- f.map(({ source: d, target: g, status_code: y }) => [d, { target: g, status_code: y }])
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 i && (this.redirectsCache = l), l;
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: i,
133
- bypassCache: n = !1,
146
+ language: n,
147
+ bypassCache: i = !1,
134
148
  ...r
135
149
  } = {}) {
136
- const o = e ?? i, a = JSON.stringify({ slug: t, language_iso: o, ...r });
137
- if (!n && this.configCache.has(a))
138
- return this.configCache.get(a);
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: o
155
+ language_iso: a
142
156
  })).content ?? {};
143
- return n || this.configCache.set(a, l), l;
157
+ return i || this.configCache.set(o, l), l;
144
158
  }
145
159
  async syncRevision(t = 426713400) {
146
- const i = (await this.getSpace()).rv || t;
147
- return this.client.setRv(i), i;
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 w(s) {
168
- return new v(s);
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 i = this.listeners[t] || /* @__PURE__ */ new Set();
195
- return this.listeners[t] = i, i.add(e), () => {
196
- i.delete(e);
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, i) {
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: i }
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: i } = t.data;
221
- !e || !i || this.notify(e, i);
234
+ const { type: e, payload: n } = t.data;
235
+ !e || !n || this.notify(e, n);
222
236
  };
223
237
  notify(t, e) {
224
- const i = this.listeners[t];
225
- if (i)
226
- for (const n of i)
227
- n(e);
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
- const b = c.getInstance(), C = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
265
+ function d(s) {
266
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
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 u = 0;
234
- class m {
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 i = typeof globalThis.fetch == "function" ? globalThis.fetch.bind(globalThis) : null;
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 (i)
247
- this.fetchClient = i;
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 n = this.resolveRequestUrl(e);
254
- this.vid = t.version || "published", this.setRv(n?.searchParams.get("b10cks_rv") || t.rv || u);
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 i = this.buildUrl(t, {
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
- }), n = await this.fetchClient(i), r = await this.parseResponse(n);
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, i = {}) {
266
- const n = this.buildUrl(t, {
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(n, {
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 i = await this.get(t, {
355
+ const n = await this.get(t, {
280
356
  ...e,
281
357
  page: 1
282
- }), n = this.normalizeCollectionResponse(i);
283
- if (n.rv && this.setRv(n.rv), !n.meta || n.meta.last_page <= 1)
284
- return n.data;
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: n.meta.last_page - 1 },
287
- (a, f) => this.get(t, { ...e, page: f + 2 })
288
- ), o = await Promise.all(r);
289
- return n.data.concat(
290
- o.flatMap((a) => this.normalizeCollectionResponse(a).data)
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) : u = t;
370
+ this.setRvFn ? this.setRvFn(t) : h = t;
295
371
  }
296
372
  getRv() {
297
- return this.getRvFn ? this.getRvFn() : u;
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: i,
322
- rv: n
397
+ meta: n,
398
+ rv: i
323
399
  } = t;
324
- return { data: e, meta: i, rv: n };
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 i = new URL(`${this.baseUrl}/v1/${t}`);
330
- return Object.entries(e).forEach(([n, r]) => {
331
- r != null && i.searchParams.append(n, String(r));
332
- }), i.toString();
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
- m as ApiClient,
349
- v as B10cksDataApi,
424
+ E as ApiClient,
425
+ C as B10cksDataApi,
350
426
  c as PreviewBridge,
351
- w as createB10cksDataApi,
352
- b as previewBridge,
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
- C as types
436
+ _ as types
355
437
  };
356
438
  //# sourceMappingURL=index.mjs.map
@@ -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":"AAyDA,SAASA,EAAqBC,GAAoC;AAChE,MAAIA,KAAU,MAEd;AAAA,QADI,OAAOA,KAAU,aACjB,OAAOA,KAAU,SAAU,QAAO,OAAOA,CAAK;AAClD,QAAI,OAAOA,KAAU,SAAU,QAAOA;AAEtC,QAAI,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK,GAAG;AACtD,YAAMC,IAAMD;AAEZ,UAAI,UAAUC,EAAK,QAAO;AAC1B,UAAI,WAAWA,EAAK,QAAO;AAC3B,UAAI,aAAaA,GAAK;AACpB,cAAM,CAACC,GAAMC,CAAE,IAAIF,EAAI;AACvB,eAAO,GAAGC,CAAI,MAAMC,CAAE;AAAA,MACxB;AAEA,YAAMC,IAAM;AAAA,QACV;AAAA,QAAM;AAAA,QAAO;AAAA,QAAQ;AAAA,QAAS;AAAA,QAAS;AAAA,QACvC;AAAA,QAAM;AAAA,QAAM;AAAA,QAAO;AAAA,QAAO;AAAA,QAAM;AAAA,QAAO;AAAA,QAAS;AAAA,MAAA;AAElD,iBAAWC,KAAMD;AACf,YAAIC,KAAMJ,GAAK;AACb,gBAAMK,IAAML,EAAII,CAAE;AAClB,iBAAI,MAAM,QAAQC,CAAG,IAAU,GAAGD,CAAE,IAAIC,EAAI,KAAK,GAAG,CAAC,KAC9C,GAAGD,CAAE,IAAI,OAAOC,CAAG,CAAC;AAAA,QAC7B;AAAA,IAEJ;AAAA;AAGF;AAEO,SAASC,EAAgBC,GAAyD;AACvF,QAAMC,IAAiC,CAAA;AACvC,aAAW,CAACC,GAAKV,CAAK,KAAK,OAAO,QAAQQ,CAAM,GAAG;AACjD,UAAMG,IAAaZ,EAAqBC,CAAK;AAC7C,IAAIW,MAAe,WACjBF,EAAOC,CAAG,IAAIC;AAAA,EAElB;AACA,SAAOF;AACT;AAEA,SAASG,EACPC,GACAL,GACAM,GACgB;AAChB,QAAMC,IACJP,KAAU,OAAOA,KAAW,WACxBD,EAAgBC,CAAiC,IACjD,CAAA,GACAQ,IACJ,MAAM,QAAQF,CAAI,IAAI,EAAE,MAAMA,EAAK,KAAK,GAAG,MAAMA,KAAQ,OAAO,EAAE,MAAAA,EAAA,IAAS,CAAA;AAC7E,SAAO,EAAE,GAAGD,GAAQ,GAAGE,GAAc,GAAGC,EAAA;AAC1C;AAEO,MAAMC,EAAc;AAAA,EAIzB,YAA6BC,GAAuB;AAAvB,SAAA,SAAAA;AAAA,EAAwB;AAAA,EAH7C,iBAAqC;AAAA,EAC5B,kCAAkB,IAAA;AAAA,EAInC,MAAM,YAAeC,GAAoBN,IAAyB,IAAgB;AAChF,UAAMO,IAAW,MAAM,KAAK,OAAO,IAAOD,GAAUN,CAAM;AAC1D,WAAO,KAAK,eAAeO,CAAQ;AAAA,EACrC;AAAA,EAEA,MAAM,cACJD,GACAN,IAAyB,CAAA,GACzBQ,IAAkC,CAAA,GACpB;AACd,QAAIA,EAAQ;AACV,aAAO,KAAK,OAAO,OAAUF,GAAUN,CAAM;AAG/C,UAAMO,IAAW,MAAM,KAAK,OAAO,IAA8BD,GAAUN,CAAM;AACjF,WAAO,KAAK,iBAAiBO,CAAQ;AAAA,EACvC;AAAA,EAEA,MAAM,WACJE,GACAT,IAA4D,IACrC;AACvB,WAAO,KAAK,YAA0B,YAAYS,CAAQ,IAAIT,CAAM;AAAA,EACtE;AAAA,EAEA,MAAM,YACJA,IAA8B,IAC9BQ,IAAkC,CAAA,GACT;AACzB,UAAM,EAAE,QAAAb,GAAQ,MAAAM,GAAM,GAAGS,MAASV;AAClC,WAAO,KAAK;AAAA,MACV;AAAA,MACAD,EAAsBW,GAAMf,GAAQM,CAAI;AAAA,MACxCO;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,SAASG,GAAiBX,IAAyB,IAAsB;AAC7E,WAAO,KAAK,YAAqB,UAAUW,CAAO,IAAIX,CAAM;AAAA,EAC9D;AAAA,EAEA,MAAM,UACJA,IAA4B,IAC5BQ,IAAkC,CAAA,GACd;AACpB,UAAM,EAAE,QAAAb,GAAQ,GAAGe,EAAA,IAASV;AAC5B,WAAO,KAAK;AAAA,MACV;AAAA,MACAD,EAAsBW,GAAMf,GAAQ,MAAS;AAAA,MAC7Ca;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,OACJR,GAC8B;AAC9B,UAAMO,IAAW,MAAM,KAAK,OAAO;AAAA,MACjC;AAAA,MACAP;AAAA,IAAA;AAEF,QACE,OAAOO,KAAa,YACpBA,MAAa,QACb,UAAUA,KACV,UAAWA;AAEX,aAAOA;AAET,QAAI,OAAOA,KAAa,YAAYA,MAAa,QAAQ,UAAUA,GAAU;AAC3E,YAAMK,IAASL,EAA+B;AAC9C,UACE,OAAOK,KAAU,YACjBA,MAAU,QACV,UAAUA,KACV,UAAUA;AAEV,eAAOA;AAAA,IAEX;AACA,WAAOL;AAAA,EACT;AAAA,EAEA,MAAM,WACJP,IAA8C,IAC9CQ,IAAkC,CAAA,GACP;AAC3B,WAAO,KAAK,cAA8B,WAAWR,GAAQQ,CAAO;AAAA,EACtE;AAAA,EAEA,MAAM,eACJK,GACAb,IAAyB,CAAA,GACzBQ,IAAkC,CAAA,GACV;AACxB,WAAO,KAAK,cAA2B,eAAeK,CAAM,YAAYb,GAAQQ,CAAO;AAAA,EACzF;AAAA,EAEA,MAAM,eACJR,IAAyB,IACzBQ,IAAkC,CAAA,GACT;AACzB,WAAO,KAAK,cAA4B,eAAeR,GAAQQ,CAAO;AAAA,EACxE;AAAA,EAEA,MAAM,SAASR,IAAyB,IAAsB;AAC5D,WAAO,KAAK,YAAqB,aAAaA,CAAM;AAAA,EACtD;AAAA,EAEA,MAAM,eAAea,GAAyD;AAC5E,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAGJ,WAAO,KAAK,OAAO,KAAqC,oBAAoB,EAAE,QAAAA,GAAQ;AAAA,EACxF;AAAA,EAOA,MAAM,aACJb,IAA+B,IAC/Bc,IAAwD,IAClC;AACtB,UAAM,EAAE,UAAAC,IAAW,IAAO,cAAAC,IAAe,OACvC,OAAOF,KAA0B,YAC7B,EAAE,UAAU,IAAM,cAAcA,MAChCA;AAEN,QAAIC,KAAY,KAAK,kBAAkB,CAACC;AACtC,aAAO,KAAK;AAGd,UAAM,EAAE,QAAArB,GAAQ,GAAGe,EAAA,IAASV,GACtBiB,IAAalB,EAAsBW,GAAMf,GAAQ,MAAS,GAC1DuB,IAAY,MAAM,KAAK,cAA0B,aAAaD,GAAY,EAAE,UAAAF,GAAU,GACtFI,IAAM,OAAO;AAAA,MACjBD,EAAU,IAAI,CAAC,EAAE,QAAAL,GAAQ,QAAAO,GAAQ,aAAAC,EAAA,MAAkB,CAACR,GAAQ,EAAE,QAAAO,GAAQ,aAAAC,EAAA,CAAa,CAAC;AAAA,IAAA;AAGtF,WAAIN,MACF,KAAK,iBAAiBI,IAGjBA;AAAA,EACT;AAAA,EAEA,MAAM,UAAuC;AAAA,IAC3C,MAAAG,IAAO;AAAA,IACP,cAAAC;AAAA,IACA,UAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,GAAGzB;AAAA,EAAA,IACiB,IAAgB;AACpC,UAAM0B,IAAqBH,KAAgBC,GACrCG,IAAW,KAAK,UAAU,EAAE,MAAAL,GAAM,cAAcI,GAAoB,GAAG1B,GAAQ;AACrF,QAAI,CAACyB,KAAe,KAAK,YAAY,IAAIE,CAAQ;AAC/C,aAAO,KAAK,YAAY,IAAIA,CAAQ;AAOtC,UAAMxC,KAJgB,MAAM,KAAK,WAAoCmC,GAAM;AAAA,MACzE,GAAGtB;AAAA,MACH,cAAc0B;AAAA,IAAA,CACf,GAC4B,WAAW,CAAA;AAExC,WAAKD,KACH,KAAK,YAAY,IAAIE,GAAUxC,CAAK,GAG/BA;AAAA,EACT;AAAA,EAEA,MAAM,aAAayC,IAAa,WAAqC;AAEnE,UAAMC,KADQ,MAAM,KAAK,SAAA,GACJ,MAAMD;AAC3B,gBAAK,OAAO,MAAMC,CAAM,GACjBA;AAAA,EACT;AAAA,EAEA,aAAa;AACX,SAAK,iBAAiB,MACtB,KAAK,YAAY,MAAA;AAAA,EACnB;AAAA,EAEQ,eAAkBtB,GAA8B;AACtD,WAAI,OAAOA,KAAa,YAAYA,MAAa,QAAQ,UAAUA,IACzDA,EAAyB,OAG5BA;AAAA,EACT;AAAA,EAEQ,iBAAoBA,GAAuC;AACjE,QAAI,MAAM,QAAQA,CAAQ;AACxB,aAAOA;AAGT,QAAI,OAAOA,KAAa,YAAYA,MAAa,QAAQ,UAAUA,GAAU;AAC3E,UAAI,MAAM,QAAQA,EAAS,IAAI;AAC7B,eAAOA,EAAS;AAGlB,UACE,OAAOA,EAAS,QAAS,YACzBA,EAAS,SAAS,QAClB,UAAUA,EAAS,QACnB,MAAM,QAAQA,EAAS,KAAK,IAAI;AAEhC,eAAOA,EAAS,KAAK;AAAA,IAEzB;AAEA,WAAO,CAAA;AAAA,EACT;AACF;AAEO,SAASuB,EAAoBzB,GAAsC;AACxE,SAAO,IAAID,EAAcC,CAAM;AACjC;ACtTO,MAAM0B,EAAc;AAAA,EACzB,OAAe;AAAA,EACE,YAAqE,CAAA;AAAA,EAC9E,cAAc;AAAA,EAEd,cAAc;AAAA,EAAC;AAAA,EAEvB,OAAO,cAAc;AACnB,WAAKA,EAAc,aACjBA,EAAc,WAAW,IAAIA,EAAA,IAExBA,EAAc;AAAA,EACvB;AAAA,EAEA,OAAO;AACL,IAAI,CAAC,KAAK,qBAAqB,KAAK,gBAIpC,OAAO,iBAAiB,WAAW,KAAK,aAAa,GACrD,KAAK,cAAc;AAAA,EACrB;AAAA,EAEA,UAAU;AACR,IAAI,KAAK,eAAe,OAAO,SAAW,OACxC,OAAO,oBAAoB,WAAW,KAAK,aAAa,GAE1D,KAAK,cAAc;AACnB,eAAWC,KAAa,OAAO,KAAK,KAAK,SAAS;AAChD,WAAK,UAAUA,CAAS,GAAG,MAAA;AAAA,EAE/B;AAAA,EAEA,kBAA2B;AACzB,WAAO,OAAO,SAAW,OAAe,OAAO,SAAS,OAAO;AAAA,EACjE;AAAA,EAEA,GAAwBA,GAAcC,GAAyD;AAC7F,QAAI,CAAC,KAAK;AACR,aAAO,MAAM;AAAA,MAAC;AAGhB,UAAMC,IAAY,KAAK,UAAUF,CAAS,yBAAS,IAAA;AACnD,gBAAK,UAAUA,CAAS,IAAIE,GAC5BA,EAAU,IAAID,CAAkC,GAEzC,MAAM;AACX,MAAAC,EAAU,OAAOD,CAAkC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,WAAWE,GAAsB;AAC/B,IAAK,KAAK,qBAIV,OAAO,OAAO;AAAA,MACZ;AAAA,QACE,MAAM;AAAA,QACN,SAAS,EAAE,cAAAA,EAAA;AAAA,MAAa;AAAA,MAE1B;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,YAAYC,GAAgBC,GAAelD,GAAe;AACxD,IAAK,KAAK,qBAIV,OAAO,OAAO;AAAA,MACZ;AAAA,QACE,MAAM;AAAA,QACN,SAAS,EAAE,QAAAiD,GAAQ,OAAAC,GAAO,OAAAlD,EAAA;AAAA,MAAM;AAAA,MAElC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,gBAAgB,CAACmD,MAAwB;AAC/C,QAAI,CAACA,EAAM,QAAQ,OAAOA,EAAM,QAAS;AACvC;AAGF,UAAM,EAAE,MAAAC,GAAM,SAAAC,EAAA,IAAYF,EAAM;AAChC,IAAI,CAACC,KAAQ,CAACC,KAId,KAAK,OAAOD,GAAMC,CAAgB;AAAA,EACpC;AAAA,EAEQ,OAA4BD,GAASC,GAA6B;AACxE,UAAMC,IAAY,KAAK,UAAUF,CAAI;AACrC,QAAKE;AAIL,iBAAWR,KAAYQ;AACnB,QAAAR,EAA+CO,CAAO;AAAA,EAE5D;AACF;AAEO,MAAME,IAAgBX,EAAc,YAAA;;;ACnH3C,IAAIY,IAAsB;AASnB,MAAMC,EAAU;AAAA,EACJ;AAAA,EACR;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAYpC,GAAiCqC,GAA2B;AACtE,SAAK,UAAUrC,EAAQ,QAAQ,SAAS,GAAG,IAAIA,EAAQ,QAAQ,MAAM,GAAG,EAAE,IAAIA,EAAQ,SACtF,KAAK,QAAQA,EAAQ;AACrB,UAAMsC,IACJ,OAAO,WAAW,SAAU,aAAa,WAAW,MAAM,KAAK,UAAU,IAAI;AAC/E,QAAItC,EAAQ;AACV,WAAK,cAAcA,EAAQ;AAAA,aAClBsC;AACT,WAAK,cAAcA;AAAA;AAEnB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAIJ,SAAK,UAAUtC,EAAQ,OACvB,KAAK,UAAUA,EAAQ;AAEvB,UAAMuC,IAAM,KAAK,kBAAkBF,CAAU;AAC7C,SAAK,MAAMrC,EAAQ,WAAW,aAC9B,KAAK,MAAMuC,GAAK,aAAa,IAAI,WAAW,KAAKvC,EAAQ,MAAMmC,CAAE;AAAA,EACnE;AAAA,EAEA,MAAM,IACJrC,GACAN,IAAqE,IACpC;AACjC,UAAM+C,IAAM,KAAK,SAASzC,GAAU;AAAA,MAClC,KAAK,KAAK;AAAA,MACV,GAAGN;AAAA,MACH,IAAI,KAAK,MAAA;AAAA,MACT,OAAO,KAAK;AAAA,IAAA,CACb,GAEKwC,IAAU,MAAM,KAAK,YAAYO,CAAG,GACpCxC,IAAW,MAAM,KAAK,cAAsCiC,CAAO;AAEzE,WAAI,KAAK,YAAYjC,CAAQ,KAC3B,KAAK,MAAMA,EAAS,EAAE,GAGjBA;AAAA,EACT;AAAA,EAEA,MAAM,KACJD,GACA0C,GACAhD,IAAqE,CAAA,GACzD;AACZ,UAAM+C,IAAM,KAAK,SAASzC,GAAU;AAAA,MAClC,KAAK,KAAK;AAAA,MACV,GAAGN;AAAA,MACH,IAAI,KAAK,MAAA;AAAA,MACT,OAAO,KAAK;AAAA,IAAA,CACb,GAEKwC,IAAU,MAAM,KAAK,YAAYO,GAAK;AAAA,MAC1C,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,MAC3B,MAAMC,MAAS,SAAY,KAAK,UAAUA,CAAI,IAAI;AAAA,IAAA,CACnD;AAED,WAAO,KAAK,cAAiBR,CAAO;AAAA,EACtC;AAAA,EAEA,MAAM,OACJlC,GACAN,IAAqE,IACvD;AACd,UAAMiD,IAAgB,MAAM,KAAK,IAAiD3C,GAAU;AAAA,MAC1F,GAAGN;AAAA,MACH,MAAM;AAAA,IAAA,CACP,GACKkD,IAA0B,KAAK,4BAA+BD,CAAa;AAMjF,QAJIC,EAAwB,MAC1B,KAAK,MAAMA,EAAwB,EAAE,GAGnC,CAACA,EAAwB,QAAQA,EAAwB,KAAK,aAAa;AAC7E,aAAOA,EAAwB;AAGjC,UAAMC,IAAe,MAAM;AAAA,MACzB,EAAE,QAAQD,EAAwB,KAAK,YAAY,EAAA;AAAA,MACnD,CAACE,GAAGC,MAAM,KAAK,IAA6B/C,GAAU,EAAE,GAAGN,GAAQ,MAAMqD,IAAI,EAAA,CAAG;AAAA,IAAA,GAG5EC,IAAe,MAAM,QAAQ,IAAIH,CAAY;AAEnD,WAAOD,EAAwB,KAAK;AAAA,MAClCI,EAAa,QAAQ,CAAC/C,MAAa,KAAK,4BAA+BA,CAAQ,EAAE,IAAI;AAAA,IAAA;AAAA,EAEzF;AAAA,EAEA,MAAMpB,GAAwB;AAC5B,IAAI,KAAK,UACP,KAAK,QAAQA,CAAK,IAElBwD,IAAKxD;AAAA,EAET;AAAA,EAEA,QAAQ;AACN,WAAI,KAAK,UACA,KAAK,QAAA,IAEPwD;AAAA,EACT;AAAA,EAEA,MAAc,cAAiBH,GAA8B;AAC3D,QAAI,KAAK,gBAAgBA,CAAO,GAAG;AACjC,UAAI,CAACA,EAAQ;AACX,cAAM,IAAI,MAAM,8BAA8BA,EAAQ,MAAM,EAAE;AAGhE,aAAQ,MAAMA,EAAQ,KAAA;AAAA,IACxB;AAEA,WAAOA;AAAA,EACT;AAAA,EAEQ,4BAA+BjC,GAAoC;AACzE,QAAI,KAAK,6BAA6BA,CAAQ,GAAG;AAC/C,YAAMgD,IAAiBhD,EAAS;AAEhC,aAAO;AAAA,QACL,MAAMgD,EAAe;AAAA,QACrB,MAAOA,EAA+D;AAAA,QACtE,IAAIhD,EAAS,MAAMgD,EAAe;AAAA,MAAA;AAAA,IAEtC;AAEA,QAAI,MAAM,QAAQhD,CAAQ;AACxB,aAAO,EAAE,MAAMA,GAAU,MAAM,QAAW,IAAI,OAAA;AAGhD,QAAI,OAAOA,KAAa,YAAYA,MAAa,QAAQ,UAAUA,GAAU;AAC3E,YAAM;AAAA,QACJ,MAAAiD;AAAA,QACA,MAAAC;AAAA,QACA,IAAIC;AAAA,MAAA,IACFnD;AAKJ,aAAO,EAAE,MAAAiD,GAAM,MAAAC,GAAM,IAAIC,EAAA;AAAA,IAC3B;AAEA,WAAO,EAAE,MAAM,CAAA,GAAI,MAAM,QAAW,IAAI,OAAA;AAAA,EAC1C;AAAA,EAEQ,SAASpD,GAAkBN,GAAyC;AAC1E,UAAM+C,IAAM,IAAI,IAAI,GAAG,KAAK,OAAO,OAAOzC,CAAQ,EAAE;AAEpD,kBAAO,QAAQN,CAAM,EAAE,QAAQ,CAAC,CAACH,GAAKV,CAAK,MAAM;AAC/C,MAA2BA,KAAU,QACnC4D,EAAI,aAAa,OAAOlD,GAAK,OAAOV,CAAK,CAAC;AAAA,IAE9C,CAAC,GAEM4D,EAAI,SAAA;AAAA,EACb;AAAA,EAEQ,kBAAkBF,GAAuC;AAC/D,WAAKA,IAIDA,aAAsB,MACjBA,IAGF,IAAI,IAAIA,GAAY,kBAAkB,IAPpC;AAAA,EAQX;AAAA,EAEQ,gBAAgB1D,GAAmC;AACzD,WACE,OAAOA,KAAU,YACjBA,MAAU,QACV,UAAUA,KACV,OAAQA,EAAmB,QAAS,cACpC,QAAQA;AAAA,EAEZ;AAAA,EAEQ,YAAYA,GAAkD;AACpE,WAAO,OAAOA,KAAU,YAAYA,MAAU,QAAQ,QAAQA;AAAA,EAChE;AAAA,EAEQ,6BACNA,GAC8C;AAC9C,WACE,OAAOA,KAAU,YACjBA,MAAU,QACV,UAAUA,KACV,OAAOA,EAAM,QAAS,YACtBA,EAAM,SAAS,QACf,UAAUA,EAAM,QAChB,MAAM,QAAQA,EAAM,KAAK,IAAI;AAAA,EAEjC;AACF;"}
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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@b10cks/client",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Core b10cks API client",
5
5
  "license": "MIT",
6
6
  "author": "Michael Wallner @ Coder's Cantina",