@b10cks/client 1.0.2 → 1.2.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
@@ -24,21 +24,27 @@ const dataApi = createB10cksDataApi(client)
24
24
  // Fetch blocks
25
25
  const blocks = await dataApi.getBlocks()
26
26
 
27
- // Fetch all contents with pagination
28
- const contents = await dataApi.getContents({ vid: 'published' })
27
+ // Fetch the first page of contents
28
+ const contents = await dataApi.getContents({ vid: 'published', page: 1, per_page: 20 })
29
+
30
+ // Fetch all contents across all pages
31
+ const allContents = await dataApi.getContents({ vid: 'published', per_page: 100 }, { allPages: true })
29
32
 
30
33
  // Fetch a specific content entry
31
34
  const content = await dataApi.getContent('home', { vid: 'draft' })
32
35
 
33
36
  // Fetch specific datasource entries
34
37
  const entries = await dataApi.getDataEntries('my-datasource')
38
+
39
+ // Fetch sitemap entries
40
+ const sitemap = await dataApi.getSitemap({ vid: 'published' })
35
41
  ```
36
42
 
37
43
  ## Features
38
44
 
39
45
  - **Simple HTTP Client**: Type-safe API client for b10cks endpoints
40
46
  - **Framework-Agnostic Data API**: Shared `B10cksDataApi` used by all framework SDKs
41
- - **Pagination Support**: Automatic handling of paginated responses
47
+ - **Pagination Support**: Fetch a specific page by default, or opt into fetching all pages
42
48
  - **Revision Tracking**: Built-in support for revision (RV), with VID passed explicitly in request params
43
49
  - **Flexible Fetch**: Use browser fetch, Node fetch, or a custom fetch implementation
44
50
 
@@ -50,12 +56,13 @@ const entries = await dataApi.getDataEntries('my-datasource')
50
56
  ## Data API Methods
51
57
 
52
58
  - `getContent(fullSlug, params)` - pass `vid` in `params` when needed
53
- - `getContents(params)` - pass `vid` in `params` when needed
54
- - `getBlocks(params)`
55
- - `getDataEntries(source, params)`
56
- - `getDataSources(params)`
59
+ - `getContents(params, options)` - `params` supports `page` and `per_page`; set `options.allPages` to `true` to fetch every page
60
+ - `getBlocks(params, options)` - `params` supports `page` and `per_page`
61
+ - `getDataEntries(source, params, options)` - `params` supports `page` and `per_page`
62
+ - `getDataSources(params, options)` - `params` supports `page` and `per_page`
63
+ - `getSitemap(params, options)` - pass `vid` in `params`; `params` also supports `page` and `per_page`
57
64
  - `getSpace(params)`
58
- - `getRedirects(params, forceRefresh)`
65
+ - `getRedirects(params, forceRefresh | { forceRefresh?, allPages? })` - `params` supports `page` and `per_page`
59
66
  - `getConfig(options)`
60
67
  - `syncRevision(fallbackRv)`
61
68
 
@@ -66,6 +73,7 @@ const entries = await dataApi.getDataEntries('my-datasource')
66
73
  - `contents/{id}` - Specific content
67
74
  - `datasources` - Data sources
68
75
  - `datasources/{id}/entries` - Datasource entries
76
+ - `sitemap` - Sitemap entries
69
77
  - `spaces/me` - Current space info
70
78
 
71
79
  ## License
package/dist/index.d.ts CHANGED
@@ -44,18 +44,21 @@ export declare class B10cksDataApi {
44
44
  private readonly configCache;
45
45
  constructor(client: DataApiClient);
46
46
  getResource<T>(endpoint: Endpoint, params?: ApiQueryParams): Promise<T>;
47
- getCollection<T>(endpoint: Endpoint, params?: ApiQueryParams): Promise<T[]>;
47
+ getCollection<T>(endpoint: Endpoint, params?: ApiQueryParams, options?: CollectionFetchOptions): Promise<T[]>;
48
48
  getContent<T = Record<string, unknown>>(fullSlug: string, params?: Omit<IBContentQueryParams, 'token' | 'full_slug'>): Promise<IBContent<T>>;
49
- getContents<T = Record<string, unknown>>(params?: Omit<IBContentQueryParams, 'token'>): Promise<IBContent<T>[]>;
50
- getBlocks(params?: ApiQueryParams): Promise<IBBlock[]>;
51
- getDataEntries(source: string, params?: ApiQueryParams): Promise<IBDataEntry[]>;
52
- getDataSources(params?: ApiQueryParams): Promise<IBDataSource[]>;
49
+ getContents<T = Record<string, unknown>>(params?: Omit<IBContentQueryParams, 'token'>, options?: CollectionFetchOptions): Promise<IBContent<T>[]>;
50
+ getBlocks(params?: ApiQueryParams, options?: CollectionFetchOptions): Promise<IBBlock[]>;
51
+ getSitemap(params?: Omit<IBContentQueryParams, 'token'>, options?: CollectionFetchOptions): Promise<IBSitemapEntry[]>;
52
+ getDataEntries(source: string, params?: ApiQueryParams, options?: CollectionFetchOptions): Promise<IBDataEntry[]>;
53
+ getDataSources(params?: ApiQueryParams, options?: CollectionFetchOptions): Promise<IBDataSource[]>;
53
54
  getSpace(params?: ApiQueryParams): Promise<IBSpace>;
54
55
  getRedirects(params?: ApiQueryParams, forceRefresh?: boolean): Promise<RedirectMap>;
56
+ getRedirects(params?: ApiQueryParams, options?: RedirectFetchOptions): Promise<RedirectMap>;
55
57
  getConfig<T = Record<string, unknown>>({ slug, language_iso, language, bypassCache, ...params }?: GetConfigOptions): Promise<T>;
56
58
  syncRevision(fallbackRv?: number): Promise<string | number>;
57
59
  clearCache(): void;
58
60
  private unwrapResource;
61
+ private unwrapCollection;
59
62
  }
60
63
 
61
64
  export declare type BridgeEvent = {
@@ -64,6 +67,10 @@ export declare type BridgeEvent = {
64
67
  b10cksId?: string;
65
68
  };
66
69
 
70
+ export declare interface CollectionFetchOptions {
71
+ allPages?: boolean;
72
+ }
73
+
67
74
  export declare type ContentUpdateEvent = {
68
75
  content: Record<string, unknown>;
69
76
  };
@@ -79,7 +86,7 @@ export declare interface DataApiClient {
79
86
  setRv(value: string | number): void;
80
87
  }
81
88
 
82
- export declare type Endpoint = 'blocks' | 'contents' | `contents/${string}` | `datasources/${string}/entries` | 'datasources' | 'redirects' | 'spaces/me';
89
+ export declare type Endpoint = 'blocks' | 'contents' | `contents/${string}` | `datasources/${string}/entries` | 'datasources' | 'redirects' | 'sitemap' | 'spaces/me';
83
90
 
84
91
  declare type EventCallback<T> = (payload: T) => void;
85
92
 
@@ -224,6 +231,20 @@ export declare interface IBResponse<T> {
224
231
  rv?: string | number;
225
232
  }
226
233
 
234
+ export declare interface IBSeoMeta {
235
+ robots: string | null;
236
+ canonical: string | null;
237
+ }
238
+
239
+ export declare interface IBSitemapEntry {
240
+ id: string;
241
+ name: string;
242
+ full_slug: string;
243
+ language_iso: string;
244
+ meta: IBSeoMeta;
245
+ published_at: string | null;
246
+ }
247
+
227
248
  export declare interface IBSortParams {
228
249
  sort?: string;
229
250
  }
@@ -253,6 +274,10 @@ export declare class PreviewBridge {
253
274
 
254
275
  export declare const previewBridge: PreviewBridge;
255
276
 
277
+ export declare interface RedirectFetchOptions extends CollectionFetchOptions {
278
+ forceRefresh?: boolean;
279
+ }
280
+
256
281
  export declare type RedirectMap = Record<string, {
257
282
  target: string;
258
283
  status_code: number;
@@ -270,6 +295,8 @@ export declare namespace types {
270
295
  IBCollectionResponse,
271
296
  IBMetaLink,
272
297
  IBMeta,
298
+ IBSeoMeta,
299
+ IBSitemapEntry,
273
300
  IBContentRelation,
274
301
  IBContent,
275
302
  IBContentBlock,
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class f{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={}){return this.client.getAll(t,e)}async getContent(t,e={}){return this.getResource(`contents/${t}`,e)}async getContents(t={}){return this.getCollection("contents",t)}async getBlocks(t={}){return this.getCollection("blocks",t)}async getDataEntries(t,e={}){return this.getCollection(`datasources/${t}/entries`,e)}async getDataSources(t={}){return this.getCollection("datasources",t)}async getSpace(t={}){return this.getResource("spaces/me",t)}async getRedirects(t={},e=!1){if(this.redirectsCache&&!e)return this.redirectsCache;const i=await this.getCollection("redirects",t),s=Object.fromEntries(i.map(({source:n,target:o,status_code:r})=>[n,{target:o,status_code:r}]));return this.redirectsCache=s,s}async getConfig({slug:t="_config",language_iso:e,language:i,bypassCache:s=!1,...n}={}){const o=e??i,r=JSON.stringify({slug:t,language_iso:o,...n});if(!s&&this.configCache.has(r))return this.configCache.get(r);const d=(await this.getContent(t,{...n,language_iso:o})).content??{};return s||this.configCache.set(r,d),d}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}}function u(c){return new f(c)}class a{static instance;listeners={};initialized=!1;constructor(){}static getInstance(){return a.instance||(a.instance=new a),a.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 s of i)s(e)}}const g=a.getInstance(),p=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));let l=0;class v{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 s=this.resolveRequestUrl(e);this.vid=t.version||"published",this.setRv(s?.searchParams.get("b10cks_rv")||t.rv||l)}async get(t,e={}){const i=this.buildUrl(t,{vid:this.vid,...e,rv:this.getRv(),token:this.token}),s=await this.fetchClient(i),n=await this.parseResponse(s);return this.hasRevision(n)&&this.setRv(n.rv),n}async getAll(t,e={}){const i=await this.get(t,{...e,page:1}),s=this.normalizeCollectionResponse(i);if(s.rv&&this.setRv(s.rv),!s.meta||s.meta.last_page<=1)return s.data;const n=Array.from({length:s.meta.last_page-1},(r,h)=>this.get(t,{...e,page:h+2})),o=await Promise.all(n);return s.data.concat(o.flatMap(r=>this.normalizeCollectionResponse(r).data))}setRv(t){this.setRvFn?this.setRvFn(t):l=t}getRv(){return this.getRvFn?this.getRvFn():l}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:s}=t;return{data:e,meta:i,rv:s}}return{data:[],meta:void 0,rv:void 0}}buildUrl(t,e){const i=new URL(`${this.baseUrl}/v1/${t}`);return Object.entries(e).forEach(([s,n])=>{n!=null&&i.searchParams.append(s,String(n))}),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=v;exports.B10cksDataApi=f;exports.PreviewBridge=a;exports.createB10cksDataApi=u;exports.previewBridge=g;exports.types=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class f{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={}){return this.getCollection("contents",t,e)}async getBlocks(t={},e={}){return this.getCollection("blocks",t,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 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 s=await this.getCollection("redirects",t,{allPages:i}),r=Object.fromEntries(s.map(({source:a,target:o,status_code:l})=>[a,{target:o,status_code:l}]));return i&&(this.redirectsCache=r),r}async getConfig({slug:t="_config",language_iso:e,language:i,bypassCache:n=!1,...s}={}){const r=e??i,a=JSON.stringify({slug:t,language_iso:r,...s});if(!n&&this.configCache.has(a))return this.configCache.get(a);const l=(await this.getContent(t,{...s,language_iso:r})).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 u(h){return new f(h)}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 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 g=c.getInstance(),y=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));let d=0;class v{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||d)}async get(t,e={}){const i=this.buildUrl(t,{vid:this.vid,...e,rv:this.getRv(),token:this.token}),n=await this.fetchClient(i),s=await this.parseResponse(n);return this.hasRevision(s)&&this.setRv(s.rv),s}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 s=Array.from({length:n.meta.last_page-1},(a,o)=>this.get(t,{...e,page:o+2})),r=await Promise.all(s);return n.data.concat(r.flatMap(a=>this.normalizeCollectionResponse(a).data))}setRv(t){this.setRvFn?this.setRvFn(t):d=t}getRv(){return this.getRvFn?this.getRvFn():d}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,s])=>{s!=null&&i.searchParams.append(n,String(s))}),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=v;exports.B10cksDataApi=f;exports.PreviewBridge=c;exports.createB10cksDataApi=u;exports.previewBridge=g;exports.types=y;
2
2
  //# 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 Endpoint,\n IBBaseQueryParams,\n IBBlock,\n IBContent,\n IBContentQueryParams,\n IBDataEntry,\n IBDataSource,\n IBRedirect,\n IBSpace,\n} from './types'\n\ntype ApiQueryParams = Omit<IBBaseQueryParams, 'token'>\n\nexport interface DataApiClient {\n get<T>(\n endpoint: Endpoint,\n params?: ApiQueryParams\n ): Promise<T | { data: T; rv?: string | number }>\n getAll<T>(endpoint: Endpoint, params?: ApiQueryParams): Promise<T[]>\n setRv(value: string | number): void\n}\n\nexport type RedirectMap = Record<string, { target: string; status_code: number }>\n\nexport interface GetConfigOptions extends Omit<IBContentQueryParams, 'token' | 'full_slug'> {\n slug?: string\n language?: string\n bypassCache?: boolean\n}\n\nexport class B10cksDataApi {\n private redirectsCache: RedirectMap | null = null\n private readonly configCache = new Map<string, unknown>()\n\n constructor(private readonly client: DataApiClient) {}\n\n async getResource<T>(endpoint: Endpoint, params: ApiQueryParams = {}): Promise<T> {\n const response = await this.client.get<T>(endpoint, params)\n return this.unwrapResource(response)\n }\n\n async getCollection<T>(endpoint: Endpoint, params: ApiQueryParams = {}): Promise<T[]> {\n return this.client.getAll<T>(endpoint, params)\n }\n\n async getContent<T = Record<string, unknown>>(\n fullSlug: string,\n params: Omit<IBContentQueryParams, 'token' | 'full_slug'> = {}\n ): Promise<IBContent<T>> {\n return this.getResource<IBContent<T>>(`contents/${fullSlug}`, params)\n }\n\n async getContents<T = Record<string, unknown>>(\n params: Omit<IBContentQueryParams, 'token'> = {}\n ): Promise<IBContent<T>[]> {\n return this.getCollection<IBContent<T>>('contents', params)\n }\n\n async getBlocks(params: ApiQueryParams = {}): Promise<IBBlock[]> {\n return this.getCollection<IBBlock>('blocks', params)\n }\n\n async getDataEntries(source: string, params: ApiQueryParams = {}): Promise<IBDataEntry[]> {\n return this.getCollection<IBDataEntry>(`datasources/${source}/entries`, params)\n }\n\n async getDataSources(params: ApiQueryParams = {}): Promise<IBDataSource[]> {\n return this.getCollection<IBDataSource>('datasources', params)\n }\n\n async getSpace(params: ApiQueryParams = {}): Promise<IBSpace> {\n return this.getResource<IBSpace>('spaces/me', params)\n }\n\n async getRedirects(params: ApiQueryParams = {}, forceRefresh = false): Promise<RedirectMap> {\n if (this.redirectsCache && !forceRefresh) {\n return this.redirectsCache\n }\n\n const redirects = await this.getCollection<IBRedirect>('redirects', params)\n const map = Object.fromEntries(\n redirects.map(({ source, target, status_code }) => [source, { target, status_code }])\n )\n this.redirectsCache = map\n return map\n }\n\n async getConfig<T = Record<string, unknown>>({\n slug = '_config',\n language_iso,\n language,\n bypassCache = false,\n ...params\n }: GetConfigOptions = {}): Promise<T> {\n const normalizedLanguage = language_iso ?? language\n const cacheKey = JSON.stringify({ slug, language_iso: normalizedLanguage, ...params })\n if (!bypassCache && this.configCache.has(cacheKey)) {\n return this.configCache.get(cacheKey) as T\n }\n\n const configContent = await this.getContent<Record<string, unknown>>(slug, {\n ...params,\n language_iso: normalizedLanguage,\n })\n const value = (configContent.content ?? {}) as T\n\n if (!bypassCache) {\n this.configCache.set(cacheKey, value)\n }\n\n return value\n }\n\n async syncRevision(fallbackRv = 426713400): Promise<string | number> {\n const space = await this.getSpace()\n const nextRv = space.rv || fallbackRv\n this.client.setRv(nextRv)\n return nextRv\n }\n\n clearCache() {\n this.redirectsCache = null\n this.configCache.clear()\n }\n\n private unwrapResource<T>(response: T | { data: T }): T {\n if (typeof response === 'object' && response !== null && 'data' in response) {\n return response.data\n }\n\n return response\n }\n}\n\nexport function createB10cksDataApi(client: DataApiClient): B10cksDataApi {\n return new B10cksDataApi(client)\n}\n","export type ContentUpdateEvent = {\n content: Record<string, unknown>\n}\n\nexport type SelectUpdateEvent = {\n selectedItem: string\n}\n\nexport type FieldUpdateEvent = {\n itemId: string\n field: string\n value: string\n}\n\nexport type EventType = 'CONTENT_UPDATE' | 'SELECT_UPDATE' | 'HOVER_UPDATE' | 'FIELD_UPDATE'\n\nexport type EventPayloadMap = {\n CONTENT_UPDATE: ContentUpdateEvent\n SELECT_UPDATE: SelectUpdateEvent\n HOVER_UPDATE: SelectUpdateEvent\n FIELD_UPDATE: FieldUpdateEvent\n}\n\ntype EventCallback<T> = (payload: T) => void\n\nexport type BridgeEvent = {\n type: EventType\n payload: EventPayloadMap[EventType]\n b10cksId?: string\n}\n\nexport class PreviewBridge {\n private static instance: PreviewBridge\n private readonly listeners: Partial<Record<EventType, Set<EventCallback<unknown>>>> = {}\n private initialized = false\n\n private constructor() {}\n\n static getInstance() {\n if (!PreviewBridge.instance) {\n PreviewBridge.instance = new PreviewBridge()\n }\n return PreviewBridge.instance\n }\n\n init() {\n if (!this.isInPreviewMode() || this.initialized) {\n return\n }\n\n window.addEventListener('message', this.handleMessage)\n this.initialized = true\n }\n\n destroy() {\n if (this.initialized && typeof window !== 'undefined') {\n window.removeEventListener('message', this.handleMessage)\n }\n this.initialized = false\n for (const eventType of Object.keys(this.listeners) as EventType[]) {\n this.listeners[eventType]?.clear()\n }\n }\n\n isInPreviewMode(): boolean {\n return typeof window !== 'undefined' && window.self !== window.top\n }\n\n on<T extends EventType>(eventType: T, callback: EventCallback<EventPayloadMap[T]>): () => void {\n if (!this.isInPreviewMode()) {\n return () => {}\n }\n\n const listeners = this.listeners[eventType] || new Set<EventCallback<unknown>>()\n this.listeners[eventType] = listeners\n listeners.add(callback as EventCallback<unknown>)\n\n return () => {\n listeners.delete(callback as EventCallback<unknown>)\n }\n }\n\n selectItem(selectedItem: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'SELECT_UPDATE',\n payload: { selectedItem },\n },\n '*'\n )\n }\n\n updateField(itemId: string, field: string, value: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'FIELD_UPDATE',\n payload: { itemId, field, value },\n },\n '*'\n )\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event.data || typeof event.data !== 'object') {\n return\n }\n\n const { type, payload } = event.data as BridgeEvent\n if (!type || !payload) {\n return\n }\n\n this.notify(type, payload as never)\n }\n\n private notify<T extends EventType>(type: T, payload: EventPayloadMap[T]) {\n const callbacks = this.listeners[type]\n if (!callbacks) {\n return\n }\n\n for (const callback of callbacks) {\n ;(callback as EventCallback<EventPayloadMap[T]>)(payload)\n }\n }\n}\n\nexport const previewBridge = PreviewBridge.getInstance()\n","import type {\n B10cksApiClientOptions,\n Endpoint,\n FetchClient,\n IBBaseQueryParams,\n IBCollectionResponse,\n IBMeta,\n IBResponse,\n} from './types'\n\nexport interface B10cksApiClientRvOptions {\n getRv?: () => string | number\n setRv?: (value: string | number) => void\n}\n\nexport * from './data-api'\nexport * from './preview-bridge'\nexport type * from './types'\nexport * as types from './types'\n\nlet rv: string | number = 0\n\ntype ApiResourceResponse<T> = IBResponse<T> | T\ntype ApiCollectionResponse<T> =\n | IBCollectionResponse<T>\n | IBResponse<IBCollectionResponse<T>>\n | T[]\n | { data: T[]; meta?: IBMeta; rv?: string | number }\n\nexport class ApiClient {\n private readonly baseUrl: string\n readonly token: string\n private readonly vid: string\n private readonly fetchClient: FetchClient\n private readonly getRvFn?: () => string | number\n private readonly setRvFn?: (value: string | number) => void\n\n constructor(options: B10cksApiClientOptions, requestUrl?: URL | string) {\n this.baseUrl = options.baseUrl.endsWith('/') ? options.baseUrl.slice(0, -1) : options.baseUrl\n this.token = options.token\n const defaultFetch =\n typeof globalThis.fetch === 'function' ? globalThis.fetch.bind(globalThis) : null\n if (options.fetchClient) {\n this.fetchClient = options.fetchClient\n } else if (defaultFetch) {\n this.fetchClient = defaultFetch as FetchClient\n } else {\n throw new Error(\n 'No fetch implementation available. Provide `fetchClient` in ApiClient options.'\n )\n }\n\n this.getRvFn = options.getRv\n this.setRvFn = options.setRv\n\n const url = this.resolveRequestUrl(requestUrl)\n this.vid = options.version || 'published'\n this.setRv(url?.searchParams.get('b10cks_rv') || options.rv || rv)\n }\n\n async get<T>(\n endpoint: Endpoint,\n params: Omit<IBBaseQueryParams, 'token'> = {}\n ): Promise<ApiResourceResponse<T>> {\n const url = this.buildUrl(endpoint, {\n vid: this.vid,\n ...params,\n rv: this.getRv(),\n token: this.token,\n })\n\n const payload = await this.fetchClient(url)\n const response = await this.parseResponse<ApiResourceResponse<T>>(payload)\n\n if (this.hasRevision(response)) {\n this.setRv(response.rv)\n }\n\n return response\n }\n\n async getAll<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T[]> {\n const firstResponse = await this.get<IBCollectionResponse<T> & { meta?: IBMeta }>(endpoint, {\n ...params,\n page: 1,\n })\n const normalizedFirstResponse = this.normalizeCollectionResponse<T>(firstResponse)\n\n if (normalizedFirstResponse.rv) {\n this.setRv(normalizedFirstResponse.rv)\n }\n\n if (!normalizedFirstResponse.meta || normalizedFirstResponse.meta.last_page <= 1) {\n return normalizedFirstResponse.data\n }\n\n const pageRequests = Array.from(\n { length: normalizedFirstResponse.meta.last_page - 1 },\n (_, i) => this.get<IBCollectionResponse<T>>(endpoint, { ...params, page: i + 2 })\n )\n\n const allResponses = await Promise.all(pageRequests)\n\n return normalizedFirstResponse.data.concat(\n allResponses.flatMap((response) => this.normalizeCollectionResponse<T>(response).data)\n )\n }\n\n setRv(value: string | number) {\n if (this.setRvFn) {\n this.setRvFn(value)\n } else {\n rv = value\n }\n }\n\n getRv() {\n if (this.getRvFn) {\n return this.getRvFn()\n }\n return rv\n }\n\n private async parseResponse<T>(payload: unknown): Promise<T> {\n if (this.isFetchResponse(payload)) {\n if (!payload.ok) {\n throw new Error(`Request failed with status ${payload.status}`)\n }\n\n return (await payload.json()) as T\n }\n\n return payload as T\n }\n\n private normalizeCollectionResponse<T>(response: ApiCollectionResponse<T>) {\n if (this.isCollectionResponseEnvelope(response)) {\n const nestedResponse = response.data\n\n return {\n data: nestedResponse.data,\n meta: (nestedResponse as IBCollectionResponse<T> & { meta?: IBMeta }).meta,\n rv: response.rv || nestedResponse.rv,\n }\n }\n\n if (Array.isArray(response)) {\n return { data: response, meta: undefined, rv: undefined }\n }\n\n if (typeof response === 'object' && response !== null && 'data' in response) {\n const {\n data,\n meta,\n rv: responseRv,\n } = response as {\n data: T[]\n meta?: IBMeta\n rv?: string | number\n }\n return { data, meta, rv: responseRv }\n }\n\n return { data: [], meta: undefined, rv: undefined }\n }\n\n private buildUrl(endpoint: string, params: Record<string, unknown>): string {\n const url = new URL(`${this.baseUrl}/v1/${endpoint}`)\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value))\n }\n })\n\n return url.toString()\n }\n\n private resolveRequestUrl(requestUrl?: URL | string): URL | null {\n if (!requestUrl) {\n return null\n }\n\n if (requestUrl instanceof URL) {\n return requestUrl\n }\n\n return new URL(requestUrl, 'http://localhost')\n }\n\n private isFetchResponse(value: unknown): value is Response {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'json' in value &&\n typeof (value as Response).json === 'function' &&\n 'ok' in value\n )\n }\n\n private hasRevision(value: unknown): value is { rv: string | number } {\n return typeof value === 'object' && value !== null && 'rv' in value\n }\n\n private isCollectionResponseEnvelope<T>(\n value: ApiCollectionResponse<T>\n ): value is IBResponse<IBCollectionResponse<T>> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'data' in value &&\n typeof value.data === 'object' &&\n value.data !== null &&\n 'data' in value.data &&\n Array.isArray(value.data.data)\n )\n }\n}\n"],"names":["B10cksDataApi","client","endpoint","params","response","fullSlug","source","forceRefresh","redirects","map","target","status_code","slug","language_iso","language","bypassCache","normalizedLanguage","cacheKey","value","fallbackRv","nextRv","createB10cksDataApi","PreviewBridge","eventType","callback","listeners","selectedItem","itemId","field","event","type","payload","callbacks","previewBridge","rv","ApiClient","options","requestUrl","defaultFetch","url","firstResponse","normalizedFirstResponse","pageRequests","_","i","allResponses","nestedResponse","data","meta","responseRv","key"],"mappings":"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"}
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 IBRedirect,\n IBSitemapEntry,\n IBSpace,\n} from './types'\n\ntype ApiQueryParams = Omit<IBBaseQueryParams, 'token'>\ntype ApiCollectionResponse<T> =\n | T[]\n | IBCollectionResponse<T>\n | { data: T[]; rv?: string | number }\n | { data: IBCollectionResponse<T>; rv?: string | number }\ntype ApiCollectionResult<T> =\n | ApiCollectionResponse<T>\n | { data: ApiCollectionResponse<T>; rv?: string | number }\n\nexport interface CollectionFetchOptions {\n allPages?: boolean\n}\n\nexport interface RedirectFetchOptions extends CollectionFetchOptions {\n forceRefresh?: boolean\n}\n\nexport interface DataApiClient {\n get<T>(\n endpoint: Endpoint,\n params?: ApiQueryParams\n ): Promise<T | { data: T; rv?: string | number }>\n getAll<T>(endpoint: Endpoint, params?: ApiQueryParams): Promise<T[]>\n setRv(value: string | number): void\n}\n\nexport type RedirectMap = Record<string, { target: string; status_code: number }>\n\nexport interface GetConfigOptions extends Omit<IBContentQueryParams, 'token' | 'full_slug'> {\n slug?: string\n language?: string\n bypassCache?: boolean\n}\n\nexport class B10cksDataApi {\n private redirectsCache: RedirectMap | null = null\n private readonly configCache = new Map<string, unknown>()\n\n constructor(private readonly client: DataApiClient) {}\n\n async getResource<T>(endpoint: Endpoint, params: ApiQueryParams = {}): Promise<T> {\n const response = await this.client.get<T>(endpoint, params)\n return this.unwrapResource(response)\n }\n\n async getCollection<T>(\n endpoint: Endpoint,\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<T[]> {\n if (options.allPages) {\n return this.client.getAll<T>(endpoint, params)\n }\n\n const response = await this.client.get<ApiCollectionResponse<T>>(endpoint, params)\n return this.unwrapCollection(response)\n }\n\n async getContent<T = Record<string, unknown>>(\n fullSlug: string,\n params: Omit<IBContentQueryParams, 'token' | 'full_slug'> = {}\n ): Promise<IBContent<T>> {\n return this.getResource<IBContent<T>>(`contents/${fullSlug}`, params)\n }\n\n async getContents<T = Record<string, unknown>>(\n params: Omit<IBContentQueryParams, 'token'> = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBContent<T>[]> {\n return this.getCollection<IBContent<T>>('contents', params, options)\n }\n\n async getBlocks(params: ApiQueryParams = {}, options: CollectionFetchOptions = {}): Promise<IBBlock[]> {\n return this.getCollection<IBBlock>('blocks', params, options)\n }\n\n async getSitemap(\n params: Omit<IBContentQueryParams, 'token'> = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBSitemapEntry[]> {\n return this.getCollection<IBSitemapEntry>('sitemap', params, options)\n }\n\n async getDataEntries(\n source: string,\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBDataEntry[]> {\n return this.getCollection<IBDataEntry>(`datasources/${source}/entries`, params, options)\n }\n\n async getDataSources(\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBDataSource[]> {\n return this.getCollection<IBDataSource>('datasources', params, options)\n }\n\n async getSpace(params: ApiQueryParams = {}): Promise<IBSpace> {\n return this.getResource<IBSpace>('spaces/me', params)\n }\n\n async getRedirects(params?: ApiQueryParams, forceRefresh?: boolean): Promise<RedirectMap>\n async getRedirects(params?: ApiQueryParams, options?: RedirectFetchOptions): Promise<RedirectMap>\n async getRedirects(\n params: ApiQueryParams = {},\n forceRefreshOrOptions: boolean | RedirectFetchOptions = false\n ): Promise<RedirectMap> {\n const { allPages = false, forceRefresh = false } =\n typeof forceRefreshOrOptions === 'boolean'\n ? { allPages: true, forceRefresh: forceRefreshOrOptions }\n : forceRefreshOrOptions\n\n if (allPages && this.redirectsCache && !forceRefresh) {\n return this.redirectsCache\n }\n\n const redirects = await this.getCollection<IBRedirect>('redirects', params, { allPages })\n const map = Object.fromEntries(\n redirects.map(({ source, target, status_code }) => [source, { target, status_code }])\n )\n\n if (allPages) {\n this.redirectsCache = map\n }\n\n return map\n }\n\n async getConfig<T = Record<string, unknown>>({\n slug = '_config',\n language_iso,\n language,\n bypassCache = false,\n ...params\n }: GetConfigOptions = {}): Promise<T> {\n const normalizedLanguage = language_iso ?? language\n const cacheKey = JSON.stringify({ slug, language_iso: normalizedLanguage, ...params })\n if (!bypassCache && this.configCache.has(cacheKey)) {\n return this.configCache.get(cacheKey) as T\n }\n\n const configContent = await this.getContent<Record<string, unknown>>(slug, {\n ...params,\n language_iso: normalizedLanguage,\n })\n const value = (configContent.content ?? {}) as T\n\n if (!bypassCache) {\n this.configCache.set(cacheKey, value)\n }\n\n return value\n }\n\n async syncRevision(fallbackRv = 426713400): Promise<string | number> {\n const space = await this.getSpace()\n const nextRv = space.rv || fallbackRv\n this.client.setRv(nextRv)\n return nextRv\n }\n\n clearCache() {\n this.redirectsCache = null\n this.configCache.clear()\n }\n\n private unwrapResource<T>(response: T | { data: T }): T {\n if (typeof response === 'object' && response !== null && 'data' in response) {\n return response.data\n }\n\n return response\n }\n\n private unwrapCollection<T>(response: ApiCollectionResult<T>): T[] {\n if (Array.isArray(response)) {\n return response\n }\n\n if (typeof response === 'object' && response !== null && 'data' in response) {\n if (Array.isArray(response.data)) {\n return response.data\n }\n\n if (\n typeof response.data === 'object' &&\n response.data !== null &&\n 'data' in response.data &&\n Array.isArray(response.data.data)\n ) {\n return response.data.data\n }\n }\n\n return []\n }\n}\n\nexport function createB10cksDataApi(client: DataApiClient): B10cksDataApi {\n return new B10cksDataApi(client)\n}\n","export type ContentUpdateEvent = {\n content: Record<string, unknown>\n}\n\nexport type SelectUpdateEvent = {\n selectedItem: string\n}\n\nexport type FieldUpdateEvent = {\n itemId: string\n field: string\n value: string\n}\n\nexport type EventType = 'CONTENT_UPDATE' | 'SELECT_UPDATE' | 'HOVER_UPDATE' | 'FIELD_UPDATE'\n\nexport type EventPayloadMap = {\n CONTENT_UPDATE: ContentUpdateEvent\n SELECT_UPDATE: SelectUpdateEvent\n HOVER_UPDATE: SelectUpdateEvent\n FIELD_UPDATE: FieldUpdateEvent\n}\n\ntype EventCallback<T> = (payload: T) => void\n\nexport type BridgeEvent = {\n type: EventType\n payload: EventPayloadMap[EventType]\n b10cksId?: string\n}\n\nexport class PreviewBridge {\n private static instance: PreviewBridge\n private readonly listeners: Partial<Record<EventType, Set<EventCallback<unknown>>>> = {}\n private initialized = false\n\n private constructor() {}\n\n static getInstance() {\n if (!PreviewBridge.instance) {\n PreviewBridge.instance = new PreviewBridge()\n }\n return PreviewBridge.instance\n }\n\n init() {\n if (!this.isInPreviewMode() || this.initialized) {\n return\n }\n\n window.addEventListener('message', this.handleMessage)\n this.initialized = true\n }\n\n destroy() {\n if (this.initialized && typeof window !== 'undefined') {\n window.removeEventListener('message', this.handleMessage)\n }\n this.initialized = false\n for (const eventType of Object.keys(this.listeners) as EventType[]) {\n this.listeners[eventType]?.clear()\n }\n }\n\n isInPreviewMode(): boolean {\n return typeof window !== 'undefined' && window.self !== window.top\n }\n\n on<T extends EventType>(eventType: T, callback: EventCallback<EventPayloadMap[T]>): () => void {\n if (!this.isInPreviewMode()) {\n return () => {}\n }\n\n const listeners = this.listeners[eventType] || new Set<EventCallback<unknown>>()\n this.listeners[eventType] = listeners\n listeners.add(callback as EventCallback<unknown>)\n\n return () => {\n listeners.delete(callback as EventCallback<unknown>)\n }\n }\n\n selectItem(selectedItem: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'SELECT_UPDATE',\n payload: { selectedItem },\n },\n '*'\n )\n }\n\n updateField(itemId: string, field: string, value: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'FIELD_UPDATE',\n payload: { itemId, field, value },\n },\n '*'\n )\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event.data || typeof event.data !== 'object') {\n return\n }\n\n const { type, payload } = event.data as BridgeEvent\n if (!type || !payload) {\n return\n }\n\n this.notify(type, payload as never)\n }\n\n private notify<T extends EventType>(type: T, payload: EventPayloadMap[T]) {\n const callbacks = this.listeners[type]\n if (!callbacks) {\n return\n }\n\n for (const callback of callbacks) {\n ;(callback as EventCallback<EventPayloadMap[T]>)(payload)\n }\n }\n}\n\nexport const previewBridge = PreviewBridge.getInstance()\n","import type {\n B10cksApiClientOptions,\n Endpoint,\n FetchClient,\n IBBaseQueryParams,\n IBCollectionResponse,\n IBMeta,\n IBResponse,\n} from './types'\n\nexport interface B10cksApiClientRvOptions {\n getRv?: () => string | number\n setRv?: (value: string | number) => void\n}\n\nexport * from './data-api'\nexport * from './preview-bridge'\nexport type * from './types'\nexport * as types from './types'\n\nlet rv: string | number = 0\n\ntype ApiResourceResponse<T> = IBResponse<T> | T\ntype ApiCollectionResponse<T> =\n | IBCollectionResponse<T>\n | IBResponse<IBCollectionResponse<T>>\n | T[]\n | { data: T[]; meta?: IBMeta; rv?: string | number }\n\nexport class ApiClient {\n private readonly baseUrl: string\n readonly token: string\n private readonly vid: string\n private readonly fetchClient: FetchClient\n private readonly getRvFn?: () => string | number\n private readonly setRvFn?: (value: string | number) => void\n\n constructor(options: B10cksApiClientOptions, requestUrl?: URL | string) {\n this.baseUrl = options.baseUrl.endsWith('/') ? options.baseUrl.slice(0, -1) : options.baseUrl\n this.token = options.token\n const defaultFetch =\n typeof globalThis.fetch === 'function' ? globalThis.fetch.bind(globalThis) : null\n if (options.fetchClient) {\n this.fetchClient = options.fetchClient\n } else if (defaultFetch) {\n this.fetchClient = defaultFetch as FetchClient\n } else {\n throw new Error(\n 'No fetch implementation available. Provide `fetchClient` in ApiClient options.'\n )\n }\n\n this.getRvFn = options.getRv\n this.setRvFn = options.setRv\n\n const url = this.resolveRequestUrl(requestUrl)\n this.vid = options.version || 'published'\n this.setRv(url?.searchParams.get('b10cks_rv') || options.rv || rv)\n }\n\n async get<T>(\n endpoint: Endpoint,\n params: Omit<IBBaseQueryParams, 'token'> = {}\n ): Promise<ApiResourceResponse<T>> {\n const url = this.buildUrl(endpoint, {\n vid: this.vid,\n ...params,\n rv: this.getRv(),\n token: this.token,\n })\n\n const payload = await this.fetchClient(url)\n const response = await this.parseResponse<ApiResourceResponse<T>>(payload)\n\n if (this.hasRevision(response)) {\n this.setRv(response.rv)\n }\n\n return response\n }\n\n async getAll<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T[]> {\n const firstResponse = await this.get<IBCollectionResponse<T> & { meta?: IBMeta }>(endpoint, {\n ...params,\n page: 1,\n })\n const normalizedFirstResponse = this.normalizeCollectionResponse<T>(firstResponse)\n\n if (normalizedFirstResponse.rv) {\n this.setRv(normalizedFirstResponse.rv)\n }\n\n if (!normalizedFirstResponse.meta || normalizedFirstResponse.meta.last_page <= 1) {\n return normalizedFirstResponse.data\n }\n\n const pageRequests = Array.from(\n { length: normalizedFirstResponse.meta.last_page - 1 },\n (_, i) => this.get<IBCollectionResponse<T>>(endpoint, { ...params, page: i + 2 })\n )\n\n const allResponses = await Promise.all(pageRequests)\n\n return normalizedFirstResponse.data.concat(\n allResponses.flatMap((response) => this.normalizeCollectionResponse<T>(response).data)\n )\n }\n\n setRv(value: string | number) {\n if (this.setRvFn) {\n this.setRvFn(value)\n } else {\n rv = value\n }\n }\n\n getRv() {\n if (this.getRvFn) {\n return this.getRvFn()\n }\n return rv\n }\n\n private async parseResponse<T>(payload: unknown): Promise<T> {\n if (this.isFetchResponse(payload)) {\n if (!payload.ok) {\n throw new Error(`Request failed with status ${payload.status}`)\n }\n\n return (await payload.json()) as T\n }\n\n return payload as T\n }\n\n private normalizeCollectionResponse<T>(response: ApiCollectionResponse<T>) {\n if (this.isCollectionResponseEnvelope(response)) {\n const nestedResponse = response.data\n\n return {\n data: nestedResponse.data,\n meta: (nestedResponse as IBCollectionResponse<T> & { meta?: IBMeta }).meta,\n rv: response.rv || nestedResponse.rv,\n }\n }\n\n if (Array.isArray(response)) {\n return { data: response, meta: undefined, rv: undefined }\n }\n\n if (typeof response === 'object' && response !== null && 'data' in response) {\n const {\n data,\n meta,\n rv: responseRv,\n } = response as {\n data: T[]\n meta?: IBMeta\n rv?: string | number\n }\n return { data, meta, rv: responseRv }\n }\n\n return { data: [], meta: undefined, rv: undefined }\n }\n\n private buildUrl(endpoint: string, params: Record<string, unknown>): string {\n const url = new URL(`${this.baseUrl}/v1/${endpoint}`)\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value))\n }\n })\n\n return url.toString()\n }\n\n private resolveRequestUrl(requestUrl?: URL | string): URL | null {\n if (!requestUrl) {\n return null\n }\n\n if (requestUrl instanceof URL) {\n return requestUrl\n }\n\n return new URL(requestUrl, 'http://localhost')\n }\n\n private isFetchResponse(value: unknown): value is Response {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'json' in value &&\n typeof (value as Response).json === 'function' &&\n 'ok' in value\n )\n }\n\n private hasRevision(value: unknown): value is { rv: string | number } {\n return typeof value === 'object' && value !== null && 'rv' in value\n }\n\n private isCollectionResponseEnvelope<T>(\n value: ApiCollectionResponse<T>\n ): value is IBResponse<IBCollectionResponse<T>> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'data' in value &&\n typeof value.data === 'object' &&\n value.data !== null &&\n 'data' in value.data &&\n Array.isArray(value.data.data)\n )\n }\n}\n"],"names":["B10cksDataApi","client","endpoint","params","response","options","fullSlug","source","forceRefreshOrOptions","allPages","forceRefresh","redirects","map","target","status_code","slug","language_iso","language","bypassCache","normalizedLanguage","cacheKey","value","fallbackRv","nextRv","createB10cksDataApi","PreviewBridge","eventType","callback","listeners","selectedItem","itemId","field","event","type","payload","callbacks","previewBridge","rv","ApiClient","requestUrl","defaultFetch","url","firstResponse","normalizedFirstResponse","pageRequests","_","i","allResponses","nestedResponse","data","meta","responseRv","key"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,61 +1,68 @@
1
- class f {
1
+ class d {
2
2
  constructor(t) {
3
3
  this.client = t;
4
4
  }
5
5
  redirectsCache = null;
6
6
  configCache = /* @__PURE__ */ new Map();
7
7
  async getResource(t, e = {}) {
8
- const n = await this.client.get(t, e);
9
- return this.unwrapResource(n);
8
+ const i = await this.client.get(t, e);
9
+ return this.unwrapResource(i);
10
10
  }
11
- async getCollection(t, e = {}) {
12
- return this.client.getAll(t, e);
11
+ async getCollection(t, e = {}, i = {}) {
12
+ if (i.allPages)
13
+ return this.client.getAll(t, e);
14
+ const n = await this.client.get(t, e);
15
+ return this.unwrapCollection(n);
13
16
  }
14
17
  async getContent(t, e = {}) {
15
18
  return this.getResource(`contents/${t}`, e);
16
19
  }
17
- async getContents(t = {}) {
18
- return this.getCollection("contents", t);
20
+ async getContents(t = {}, e = {}) {
21
+ return this.getCollection("contents", t, e);
19
22
  }
20
- async getBlocks(t = {}) {
21
- return this.getCollection("blocks", t);
23
+ async getBlocks(t = {}, e = {}) {
24
+ return this.getCollection("blocks", t, e);
22
25
  }
23
- async getDataEntries(t, e = {}) {
24
- return this.getCollection(`datasources/${t}/entries`, e);
26
+ async getSitemap(t = {}, e = {}) {
27
+ return this.getCollection("sitemap", t, e);
25
28
  }
26
- async getDataSources(t = {}) {
27
- return this.getCollection("datasources", t);
29
+ async getDataEntries(t, e = {}, i = {}) {
30
+ return this.getCollection(`datasources/${t}/entries`, e, i);
31
+ }
32
+ async getDataSources(t = {}, e = {}) {
33
+ return this.getCollection("datasources", t, e);
28
34
  }
29
35
  async getSpace(t = {}) {
30
36
  return this.getResource("spaces/me", t);
31
37
  }
32
38
  async getRedirects(t = {}, e = !1) {
33
- if (this.redirectsCache && !e)
39
+ const { allPages: i = !1, forceRefresh: n = !1 } = typeof e == "boolean" ? { allPages: !0, forceRefresh: e } : e;
40
+ if (i && this.redirectsCache && !n)
34
41
  return this.redirectsCache;
35
- const n = await this.getCollection("redirects", t), s = Object.fromEntries(
36
- n.map(({ source: i, target: a, status_code: r }) => [i, { target: a, status_code: r }])
42
+ const s = await this.getCollection("redirects", t, { allPages: i }), r = Object.fromEntries(
43
+ s.map(({ source: a, target: o, status_code: l }) => [a, { target: o, status_code: l }])
37
44
  );
38
- return this.redirectsCache = s, s;
45
+ return i && (this.redirectsCache = r), r;
39
46
  }
40
47
  async getConfig({
41
48
  slug: t = "_config",
42
49
  language_iso: e,
43
- language: n,
44
- bypassCache: s = !1,
45
- ...i
50
+ language: i,
51
+ bypassCache: n = !1,
52
+ ...s
46
53
  } = {}) {
47
- const a = e ?? n, r = JSON.stringify({ slug: t, language_iso: a, ...i });
48
- if (!s && this.configCache.has(r))
49
- return this.configCache.get(r);
50
- const d = (await this.getContent(t, {
51
- ...i,
52
- language_iso: a
54
+ const r = e ?? i, a = JSON.stringify({ slug: t, language_iso: r, ...s });
55
+ if (!n && this.configCache.has(a))
56
+ return this.configCache.get(a);
57
+ const l = (await this.getContent(t, {
58
+ ...s,
59
+ language_iso: r
53
60
  })).content ?? {};
54
- return s || this.configCache.set(r, d), d;
61
+ return n || this.configCache.set(a, l), l;
55
62
  }
56
63
  async syncRevision(t = 426713400) {
57
- const n = (await this.getSpace()).rv || t;
58
- return this.client.setRv(n), n;
64
+ const i = (await this.getSpace()).rv || t;
65
+ return this.client.setRv(i), i;
59
66
  }
60
67
  clearCache() {
61
68
  this.redirectsCache = null, this.configCache.clear();
@@ -63,18 +70,29 @@ class f {
63
70
  unwrapResource(t) {
64
71
  return typeof t == "object" && t !== null && "data" in t ? t.data : t;
65
72
  }
73
+ unwrapCollection(t) {
74
+ if (Array.isArray(t))
75
+ return t;
76
+ if (typeof t == "object" && t !== null && "data" in t) {
77
+ if (Array.isArray(t.data))
78
+ return t.data;
79
+ if (typeof t.data == "object" && t.data !== null && "data" in t.data && Array.isArray(t.data.data))
80
+ return t.data.data;
81
+ }
82
+ return [];
83
+ }
66
84
  }
67
- function u(c) {
68
- return new f(c);
85
+ function u(h) {
86
+ return new d(h);
69
87
  }
70
- class o {
88
+ class c {
71
89
  static instance;
72
90
  listeners = {};
73
91
  initialized = !1;
74
92
  constructor() {
75
93
  }
76
94
  static getInstance() {
77
- return o.instance || (o.instance = new o()), o.instance;
95
+ return c.instance || (c.instance = new c()), c.instance;
78
96
  }
79
97
  init() {
80
98
  !this.isInPreviewMode() || this.initialized || (window.addEventListener("message", this.handleMessage), this.initialized = !0);
@@ -91,9 +109,9 @@ class o {
91
109
  if (!this.isInPreviewMode())
92
110
  return () => {
93
111
  };
94
- const n = this.listeners[t] || /* @__PURE__ */ new Set();
95
- return this.listeners[t] = n, n.add(e), () => {
96
- n.delete(e);
112
+ const i = this.listeners[t] || /* @__PURE__ */ new Set();
113
+ return this.listeners[t] = i, i.add(e), () => {
114
+ i.delete(e);
97
115
  };
98
116
  }
99
117
  selectItem(t) {
@@ -105,11 +123,11 @@ class o {
105
123
  "*"
106
124
  );
107
125
  }
108
- updateField(t, e, n) {
126
+ updateField(t, e, i) {
109
127
  this.isInPreviewMode() && window.parent.postMessage(
110
128
  {
111
129
  type: "FIELD_UPDATE",
112
- payload: { itemId: t, field: e, value: n }
130
+ payload: { itemId: t, field: e, value: i }
113
131
  },
114
132
  "*"
115
133
  );
@@ -117,21 +135,21 @@ class o {
117
135
  handleMessage = (t) => {
118
136
  if (!t.data || typeof t.data != "object")
119
137
  return;
120
- const { type: e, payload: n } = t.data;
121
- !e || !n || this.notify(e, n);
138
+ const { type: e, payload: i } = t.data;
139
+ !e || !i || this.notify(e, i);
122
140
  };
123
141
  notify(t, e) {
124
- const n = this.listeners[t];
125
- if (n)
126
- for (const s of n)
127
- s(e);
142
+ const i = this.listeners[t];
143
+ if (i)
144
+ for (const n of i)
145
+ n(e);
128
146
  }
129
147
  }
130
- const g = o.getInstance(), R = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
148
+ const g = c.getInstance(), y = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
131
149
  __proto__: null
132
150
  }, Symbol.toStringTag, { value: "Module" }));
133
- let l = 0;
134
- class p {
151
+ let f = 0;
152
+ class R {
135
153
  baseUrl;
136
154
  token;
137
155
  vid;
@@ -140,48 +158,48 @@ class p {
140
158
  setRvFn;
141
159
  constructor(t, e) {
142
160
  this.baseUrl = t.baseUrl.endsWith("/") ? t.baseUrl.slice(0, -1) : t.baseUrl, this.token = t.token;
143
- const n = typeof globalThis.fetch == "function" ? globalThis.fetch.bind(globalThis) : null;
161
+ const i = typeof globalThis.fetch == "function" ? globalThis.fetch.bind(globalThis) : null;
144
162
  if (t.fetchClient)
145
163
  this.fetchClient = t.fetchClient;
146
- else if (n)
147
- this.fetchClient = n;
164
+ else if (i)
165
+ this.fetchClient = i;
148
166
  else
149
167
  throw new Error(
150
168
  "No fetch implementation available. Provide `fetchClient` in ApiClient options."
151
169
  );
152
170
  this.getRvFn = t.getRv, this.setRvFn = t.setRv;
153
- const s = this.resolveRequestUrl(e);
154
- this.vid = t.version || "published", this.setRv(s?.searchParams.get("b10cks_rv") || t.rv || l);
171
+ const n = this.resolveRequestUrl(e);
172
+ this.vid = t.version || "published", this.setRv(n?.searchParams.get("b10cks_rv") || t.rv || f);
155
173
  }
156
174
  async get(t, e = {}) {
157
- const n = this.buildUrl(t, {
175
+ const i = this.buildUrl(t, {
158
176
  vid: this.vid,
159
177
  ...e,
160
178
  rv: this.getRv(),
161
179
  token: this.token
162
- }), s = await this.fetchClient(n), i = await this.parseResponse(s);
163
- return this.hasRevision(i) && this.setRv(i.rv), i;
180
+ }), n = await this.fetchClient(i), s = await this.parseResponse(n);
181
+ return this.hasRevision(s) && this.setRv(s.rv), s;
164
182
  }
165
183
  async getAll(t, e = {}) {
166
- const n = await this.get(t, {
184
+ const i = await this.get(t, {
167
185
  ...e,
168
186
  page: 1
169
- }), s = this.normalizeCollectionResponse(n);
170
- if (s.rv && this.setRv(s.rv), !s.meta || s.meta.last_page <= 1)
171
- return s.data;
172
- const i = Array.from(
173
- { length: s.meta.last_page - 1 },
174
- (r, h) => this.get(t, { ...e, page: h + 2 })
175
- ), a = await Promise.all(i);
176
- return s.data.concat(
177
- a.flatMap((r) => this.normalizeCollectionResponse(r).data)
187
+ }), n = this.normalizeCollectionResponse(i);
188
+ if (n.rv && this.setRv(n.rv), !n.meta || n.meta.last_page <= 1)
189
+ return n.data;
190
+ const s = Array.from(
191
+ { length: n.meta.last_page - 1 },
192
+ (a, o) => this.get(t, { ...e, page: o + 2 })
193
+ ), r = await Promise.all(s);
194
+ return n.data.concat(
195
+ r.flatMap((a) => this.normalizeCollectionResponse(a).data)
178
196
  );
179
197
  }
180
198
  setRv(t) {
181
- this.setRvFn ? this.setRvFn(t) : l = t;
199
+ this.setRvFn ? this.setRvFn(t) : f = t;
182
200
  }
183
201
  getRv() {
184
- return this.getRvFn ? this.getRvFn() : l;
202
+ return this.getRvFn ? this.getRvFn() : f;
185
203
  }
186
204
  async parseResponse(t) {
187
205
  if (this.isFetchResponse(t)) {
@@ -205,18 +223,18 @@ class p {
205
223
  if (typeof t == "object" && t !== null && "data" in t) {
206
224
  const {
207
225
  data: e,
208
- meta: n,
209
- rv: s
226
+ meta: i,
227
+ rv: n
210
228
  } = t;
211
- return { data: e, meta: n, rv: s };
229
+ return { data: e, meta: i, rv: n };
212
230
  }
213
231
  return { data: [], meta: void 0, rv: void 0 };
214
232
  }
215
233
  buildUrl(t, e) {
216
- const n = new URL(`${this.baseUrl}/v1/${t}`);
217
- return Object.entries(e).forEach(([s, i]) => {
218
- i != null && n.searchParams.append(s, String(i));
219
- }), n.toString();
234
+ const i = new URL(`${this.baseUrl}/v1/${t}`);
235
+ return Object.entries(e).forEach(([n, s]) => {
236
+ s != null && i.searchParams.append(n, String(s));
237
+ }), i.toString();
220
238
  }
221
239
  resolveRequestUrl(t) {
222
240
  return t ? t instanceof URL ? t : new URL(t, "http://localhost") : null;
@@ -232,11 +250,11 @@ class p {
232
250
  }
233
251
  }
234
252
  export {
235
- p as ApiClient,
236
- f as B10cksDataApi,
237
- o as PreviewBridge,
253
+ R as ApiClient,
254
+ d as B10cksDataApi,
255
+ c as PreviewBridge,
238
256
  u as createB10cksDataApi,
239
257
  g as previewBridge,
240
- R as types
258
+ y as types
241
259
  };
242
260
  //# 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 Endpoint,\n IBBaseQueryParams,\n IBBlock,\n IBContent,\n IBContentQueryParams,\n IBDataEntry,\n IBDataSource,\n IBRedirect,\n IBSpace,\n} from './types'\n\ntype ApiQueryParams = Omit<IBBaseQueryParams, 'token'>\n\nexport interface DataApiClient {\n get<T>(\n endpoint: Endpoint,\n params?: ApiQueryParams\n ): Promise<T | { data: T; rv?: string | number }>\n getAll<T>(endpoint: Endpoint, params?: ApiQueryParams): Promise<T[]>\n setRv(value: string | number): void\n}\n\nexport type RedirectMap = Record<string, { target: string; status_code: number }>\n\nexport interface GetConfigOptions extends Omit<IBContentQueryParams, 'token' | 'full_slug'> {\n slug?: string\n language?: string\n bypassCache?: boolean\n}\n\nexport class B10cksDataApi {\n private redirectsCache: RedirectMap | null = null\n private readonly configCache = new Map<string, unknown>()\n\n constructor(private readonly client: DataApiClient) {}\n\n async getResource<T>(endpoint: Endpoint, params: ApiQueryParams = {}): Promise<T> {\n const response = await this.client.get<T>(endpoint, params)\n return this.unwrapResource(response)\n }\n\n async getCollection<T>(endpoint: Endpoint, params: ApiQueryParams = {}): Promise<T[]> {\n return this.client.getAll<T>(endpoint, params)\n }\n\n async getContent<T = Record<string, unknown>>(\n fullSlug: string,\n params: Omit<IBContentQueryParams, 'token' | 'full_slug'> = {}\n ): Promise<IBContent<T>> {\n return this.getResource<IBContent<T>>(`contents/${fullSlug}`, params)\n }\n\n async getContents<T = Record<string, unknown>>(\n params: Omit<IBContentQueryParams, 'token'> = {}\n ): Promise<IBContent<T>[]> {\n return this.getCollection<IBContent<T>>('contents', params)\n }\n\n async getBlocks(params: ApiQueryParams = {}): Promise<IBBlock[]> {\n return this.getCollection<IBBlock>('blocks', params)\n }\n\n async getDataEntries(source: string, params: ApiQueryParams = {}): Promise<IBDataEntry[]> {\n return this.getCollection<IBDataEntry>(`datasources/${source}/entries`, params)\n }\n\n async getDataSources(params: ApiQueryParams = {}): Promise<IBDataSource[]> {\n return this.getCollection<IBDataSource>('datasources', params)\n }\n\n async getSpace(params: ApiQueryParams = {}): Promise<IBSpace> {\n return this.getResource<IBSpace>('spaces/me', params)\n }\n\n async getRedirects(params: ApiQueryParams = {}, forceRefresh = false): Promise<RedirectMap> {\n if (this.redirectsCache && !forceRefresh) {\n return this.redirectsCache\n }\n\n const redirects = await this.getCollection<IBRedirect>('redirects', params)\n const map = Object.fromEntries(\n redirects.map(({ source, target, status_code }) => [source, { target, status_code }])\n )\n this.redirectsCache = map\n return map\n }\n\n async getConfig<T = Record<string, unknown>>({\n slug = '_config',\n language_iso,\n language,\n bypassCache = false,\n ...params\n }: GetConfigOptions = {}): Promise<T> {\n const normalizedLanguage = language_iso ?? language\n const cacheKey = JSON.stringify({ slug, language_iso: normalizedLanguage, ...params })\n if (!bypassCache && this.configCache.has(cacheKey)) {\n return this.configCache.get(cacheKey) as T\n }\n\n const configContent = await this.getContent<Record<string, unknown>>(slug, {\n ...params,\n language_iso: normalizedLanguage,\n })\n const value = (configContent.content ?? {}) as T\n\n if (!bypassCache) {\n this.configCache.set(cacheKey, value)\n }\n\n return value\n }\n\n async syncRevision(fallbackRv = 426713400): Promise<string | number> {\n const space = await this.getSpace()\n const nextRv = space.rv || fallbackRv\n this.client.setRv(nextRv)\n return nextRv\n }\n\n clearCache() {\n this.redirectsCache = null\n this.configCache.clear()\n }\n\n private unwrapResource<T>(response: T | { data: T }): T {\n if (typeof response === 'object' && response !== null && 'data' in response) {\n return response.data\n }\n\n return response\n }\n}\n\nexport function createB10cksDataApi(client: DataApiClient): B10cksDataApi {\n return new B10cksDataApi(client)\n}\n","export type ContentUpdateEvent = {\n content: Record<string, unknown>\n}\n\nexport type SelectUpdateEvent = {\n selectedItem: string\n}\n\nexport type FieldUpdateEvent = {\n itemId: string\n field: string\n value: string\n}\n\nexport type EventType = 'CONTENT_UPDATE' | 'SELECT_UPDATE' | 'HOVER_UPDATE' | 'FIELD_UPDATE'\n\nexport type EventPayloadMap = {\n CONTENT_UPDATE: ContentUpdateEvent\n SELECT_UPDATE: SelectUpdateEvent\n HOVER_UPDATE: SelectUpdateEvent\n FIELD_UPDATE: FieldUpdateEvent\n}\n\ntype EventCallback<T> = (payload: T) => void\n\nexport type BridgeEvent = {\n type: EventType\n payload: EventPayloadMap[EventType]\n b10cksId?: string\n}\n\nexport class PreviewBridge {\n private static instance: PreviewBridge\n private readonly listeners: Partial<Record<EventType, Set<EventCallback<unknown>>>> = {}\n private initialized = false\n\n private constructor() {}\n\n static getInstance() {\n if (!PreviewBridge.instance) {\n PreviewBridge.instance = new PreviewBridge()\n }\n return PreviewBridge.instance\n }\n\n init() {\n if (!this.isInPreviewMode() || this.initialized) {\n return\n }\n\n window.addEventListener('message', this.handleMessage)\n this.initialized = true\n }\n\n destroy() {\n if (this.initialized && typeof window !== 'undefined') {\n window.removeEventListener('message', this.handleMessage)\n }\n this.initialized = false\n for (const eventType of Object.keys(this.listeners) as EventType[]) {\n this.listeners[eventType]?.clear()\n }\n }\n\n isInPreviewMode(): boolean {\n return typeof window !== 'undefined' && window.self !== window.top\n }\n\n on<T extends EventType>(eventType: T, callback: EventCallback<EventPayloadMap[T]>): () => void {\n if (!this.isInPreviewMode()) {\n return () => {}\n }\n\n const listeners = this.listeners[eventType] || new Set<EventCallback<unknown>>()\n this.listeners[eventType] = listeners\n listeners.add(callback as EventCallback<unknown>)\n\n return () => {\n listeners.delete(callback as EventCallback<unknown>)\n }\n }\n\n selectItem(selectedItem: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'SELECT_UPDATE',\n payload: { selectedItem },\n },\n '*'\n )\n }\n\n updateField(itemId: string, field: string, value: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'FIELD_UPDATE',\n payload: { itemId, field, value },\n },\n '*'\n )\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event.data || typeof event.data !== 'object') {\n return\n }\n\n const { type, payload } = event.data as BridgeEvent\n if (!type || !payload) {\n return\n }\n\n this.notify(type, payload as never)\n }\n\n private notify<T extends EventType>(type: T, payload: EventPayloadMap[T]) {\n const callbacks = this.listeners[type]\n if (!callbacks) {\n return\n }\n\n for (const callback of callbacks) {\n ;(callback as EventCallback<EventPayloadMap[T]>)(payload)\n }\n }\n}\n\nexport const previewBridge = PreviewBridge.getInstance()\n","import type {\n B10cksApiClientOptions,\n Endpoint,\n FetchClient,\n IBBaseQueryParams,\n IBCollectionResponse,\n IBMeta,\n IBResponse,\n} from './types'\n\nexport interface B10cksApiClientRvOptions {\n getRv?: () => string | number\n setRv?: (value: string | number) => void\n}\n\nexport * from './data-api'\nexport * from './preview-bridge'\nexport type * from './types'\nexport * as types from './types'\n\nlet rv: string | number = 0\n\ntype ApiResourceResponse<T> = IBResponse<T> | T\ntype ApiCollectionResponse<T> =\n | IBCollectionResponse<T>\n | IBResponse<IBCollectionResponse<T>>\n | T[]\n | { data: T[]; meta?: IBMeta; rv?: string | number }\n\nexport class ApiClient {\n private readonly baseUrl: string\n readonly token: string\n private readonly vid: string\n private readonly fetchClient: FetchClient\n private readonly getRvFn?: () => string | number\n private readonly setRvFn?: (value: string | number) => void\n\n constructor(options: B10cksApiClientOptions, requestUrl?: URL | string) {\n this.baseUrl = options.baseUrl.endsWith('/') ? options.baseUrl.slice(0, -1) : options.baseUrl\n this.token = options.token\n const defaultFetch =\n typeof globalThis.fetch === 'function' ? globalThis.fetch.bind(globalThis) : null\n if (options.fetchClient) {\n this.fetchClient = options.fetchClient\n } else if (defaultFetch) {\n this.fetchClient = defaultFetch as FetchClient\n } else {\n throw new Error(\n 'No fetch implementation available. Provide `fetchClient` in ApiClient options.'\n )\n }\n\n this.getRvFn = options.getRv\n this.setRvFn = options.setRv\n\n const url = this.resolveRequestUrl(requestUrl)\n this.vid = options.version || 'published'\n this.setRv(url?.searchParams.get('b10cks_rv') || options.rv || rv)\n }\n\n async get<T>(\n endpoint: Endpoint,\n params: Omit<IBBaseQueryParams, 'token'> = {}\n ): Promise<ApiResourceResponse<T>> {\n const url = this.buildUrl(endpoint, {\n vid: this.vid,\n ...params,\n rv: this.getRv(),\n token: this.token,\n })\n\n const payload = await this.fetchClient(url)\n const response = await this.parseResponse<ApiResourceResponse<T>>(payload)\n\n if (this.hasRevision(response)) {\n this.setRv(response.rv)\n }\n\n return response\n }\n\n async getAll<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T[]> {\n const firstResponse = await this.get<IBCollectionResponse<T> & { meta?: IBMeta }>(endpoint, {\n ...params,\n page: 1,\n })\n const normalizedFirstResponse = this.normalizeCollectionResponse<T>(firstResponse)\n\n if (normalizedFirstResponse.rv) {\n this.setRv(normalizedFirstResponse.rv)\n }\n\n if (!normalizedFirstResponse.meta || normalizedFirstResponse.meta.last_page <= 1) {\n return normalizedFirstResponse.data\n }\n\n const pageRequests = Array.from(\n { length: normalizedFirstResponse.meta.last_page - 1 },\n (_, i) => this.get<IBCollectionResponse<T>>(endpoint, { ...params, page: i + 2 })\n )\n\n const allResponses = await Promise.all(pageRequests)\n\n return normalizedFirstResponse.data.concat(\n allResponses.flatMap((response) => this.normalizeCollectionResponse<T>(response).data)\n )\n }\n\n setRv(value: string | number) {\n if (this.setRvFn) {\n this.setRvFn(value)\n } else {\n rv = value\n }\n }\n\n getRv() {\n if (this.getRvFn) {\n return this.getRvFn()\n }\n return rv\n }\n\n private async parseResponse<T>(payload: unknown): Promise<T> {\n if (this.isFetchResponse(payload)) {\n if (!payload.ok) {\n throw new Error(`Request failed with status ${payload.status}`)\n }\n\n return (await payload.json()) as T\n }\n\n return payload as T\n }\n\n private normalizeCollectionResponse<T>(response: ApiCollectionResponse<T>) {\n if (this.isCollectionResponseEnvelope(response)) {\n const nestedResponse = response.data\n\n return {\n data: nestedResponse.data,\n meta: (nestedResponse as IBCollectionResponse<T> & { meta?: IBMeta }).meta,\n rv: response.rv || nestedResponse.rv,\n }\n }\n\n if (Array.isArray(response)) {\n return { data: response, meta: undefined, rv: undefined }\n }\n\n if (typeof response === 'object' && response !== null && 'data' in response) {\n const {\n data,\n meta,\n rv: responseRv,\n } = response as {\n data: T[]\n meta?: IBMeta\n rv?: string | number\n }\n return { data, meta, rv: responseRv }\n }\n\n return { data: [], meta: undefined, rv: undefined }\n }\n\n private buildUrl(endpoint: string, params: Record<string, unknown>): string {\n const url = new URL(`${this.baseUrl}/v1/${endpoint}`)\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value))\n }\n })\n\n return url.toString()\n }\n\n private resolveRequestUrl(requestUrl?: URL | string): URL | null {\n if (!requestUrl) {\n return null\n }\n\n if (requestUrl instanceof URL) {\n return requestUrl\n }\n\n return new URL(requestUrl, 'http://localhost')\n }\n\n private isFetchResponse(value: unknown): value is Response {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'json' in value &&\n typeof (value as Response).json === 'function' &&\n 'ok' in value\n )\n }\n\n private hasRevision(value: unknown): value is { rv: string | number } {\n return typeof value === 'object' && value !== null && 'rv' in value\n }\n\n private isCollectionResponseEnvelope<T>(\n value: ApiCollectionResponse<T>\n ): value is IBResponse<IBCollectionResponse<T>> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'data' in value &&\n typeof value.data === 'object' &&\n value.data !== null &&\n 'data' in value.data &&\n Array.isArray(value.data.data)\n )\n }\n}\n"],"names":["B10cksDataApi","client","endpoint","params","response","fullSlug","source","forceRefresh","redirects","map","target","status_code","slug","language_iso","language","bypassCache","normalizedLanguage","cacheKey","value","fallbackRv","nextRv","createB10cksDataApi","PreviewBridge","eventType","callback","listeners","selectedItem","itemId","field","event","type","payload","callbacks","previewBridge","rv","ApiClient","options","requestUrl","defaultFetch","url","firstResponse","normalizedFirstResponse","pageRequests","_","i","allResponses","nestedResponse","data","meta","responseRv","key"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/data-api.ts","../src/preview-bridge.ts","../src/index.ts"],"sourcesContent":["import type {\n IBCollectionResponse,\n Endpoint,\n IBBaseQueryParams,\n IBBlock,\n IBContent,\n IBContentQueryParams,\n IBDataEntry,\n IBDataSource,\n IBRedirect,\n IBSitemapEntry,\n IBSpace,\n} from './types'\n\ntype ApiQueryParams = Omit<IBBaseQueryParams, 'token'>\ntype ApiCollectionResponse<T> =\n | T[]\n | IBCollectionResponse<T>\n | { data: T[]; rv?: string | number }\n | { data: IBCollectionResponse<T>; rv?: string | number }\ntype ApiCollectionResult<T> =\n | ApiCollectionResponse<T>\n | { data: ApiCollectionResponse<T>; rv?: string | number }\n\nexport interface CollectionFetchOptions {\n allPages?: boolean\n}\n\nexport interface RedirectFetchOptions extends CollectionFetchOptions {\n forceRefresh?: boolean\n}\n\nexport interface DataApiClient {\n get<T>(\n endpoint: Endpoint,\n params?: ApiQueryParams\n ): Promise<T | { data: T; rv?: string | number }>\n getAll<T>(endpoint: Endpoint, params?: ApiQueryParams): Promise<T[]>\n setRv(value: string | number): void\n}\n\nexport type RedirectMap = Record<string, { target: string; status_code: number }>\n\nexport interface GetConfigOptions extends Omit<IBContentQueryParams, 'token' | 'full_slug'> {\n slug?: string\n language?: string\n bypassCache?: boolean\n}\n\nexport class B10cksDataApi {\n private redirectsCache: RedirectMap | null = null\n private readonly configCache = new Map<string, unknown>()\n\n constructor(private readonly client: DataApiClient) {}\n\n async getResource<T>(endpoint: Endpoint, params: ApiQueryParams = {}): Promise<T> {\n const response = await this.client.get<T>(endpoint, params)\n return this.unwrapResource(response)\n }\n\n async getCollection<T>(\n endpoint: Endpoint,\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<T[]> {\n if (options.allPages) {\n return this.client.getAll<T>(endpoint, params)\n }\n\n const response = await this.client.get<ApiCollectionResponse<T>>(endpoint, params)\n return this.unwrapCollection(response)\n }\n\n async getContent<T = Record<string, unknown>>(\n fullSlug: string,\n params: Omit<IBContentQueryParams, 'token' | 'full_slug'> = {}\n ): Promise<IBContent<T>> {\n return this.getResource<IBContent<T>>(`contents/${fullSlug}`, params)\n }\n\n async getContents<T = Record<string, unknown>>(\n params: Omit<IBContentQueryParams, 'token'> = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBContent<T>[]> {\n return this.getCollection<IBContent<T>>('contents', params, options)\n }\n\n async getBlocks(params: ApiQueryParams = {}, options: CollectionFetchOptions = {}): Promise<IBBlock[]> {\n return this.getCollection<IBBlock>('blocks', params, options)\n }\n\n async getSitemap(\n params: Omit<IBContentQueryParams, 'token'> = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBSitemapEntry[]> {\n return this.getCollection<IBSitemapEntry>('sitemap', params, options)\n }\n\n async getDataEntries(\n source: string,\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBDataEntry[]> {\n return this.getCollection<IBDataEntry>(`datasources/${source}/entries`, params, options)\n }\n\n async getDataSources(\n params: ApiQueryParams = {},\n options: CollectionFetchOptions = {}\n ): Promise<IBDataSource[]> {\n return this.getCollection<IBDataSource>('datasources', params, options)\n }\n\n async getSpace(params: ApiQueryParams = {}): Promise<IBSpace> {\n return this.getResource<IBSpace>('spaces/me', params)\n }\n\n async getRedirects(params?: ApiQueryParams, forceRefresh?: boolean): Promise<RedirectMap>\n async getRedirects(params?: ApiQueryParams, options?: RedirectFetchOptions): Promise<RedirectMap>\n async getRedirects(\n params: ApiQueryParams = {},\n forceRefreshOrOptions: boolean | RedirectFetchOptions = false\n ): Promise<RedirectMap> {\n const { allPages = false, forceRefresh = false } =\n typeof forceRefreshOrOptions === 'boolean'\n ? { allPages: true, forceRefresh: forceRefreshOrOptions }\n : forceRefreshOrOptions\n\n if (allPages && this.redirectsCache && !forceRefresh) {\n return this.redirectsCache\n }\n\n const redirects = await this.getCollection<IBRedirect>('redirects', params, { allPages })\n const map = Object.fromEntries(\n redirects.map(({ source, target, status_code }) => [source, { target, status_code }])\n )\n\n if (allPages) {\n this.redirectsCache = map\n }\n\n return map\n }\n\n async getConfig<T = Record<string, unknown>>({\n slug = '_config',\n language_iso,\n language,\n bypassCache = false,\n ...params\n }: GetConfigOptions = {}): Promise<T> {\n const normalizedLanguage = language_iso ?? language\n const cacheKey = JSON.stringify({ slug, language_iso: normalizedLanguage, ...params })\n if (!bypassCache && this.configCache.has(cacheKey)) {\n return this.configCache.get(cacheKey) as T\n }\n\n const configContent = await this.getContent<Record<string, unknown>>(slug, {\n ...params,\n language_iso: normalizedLanguage,\n })\n const value = (configContent.content ?? {}) as T\n\n if (!bypassCache) {\n this.configCache.set(cacheKey, value)\n }\n\n return value\n }\n\n async syncRevision(fallbackRv = 426713400): Promise<string | number> {\n const space = await this.getSpace()\n const nextRv = space.rv || fallbackRv\n this.client.setRv(nextRv)\n return nextRv\n }\n\n clearCache() {\n this.redirectsCache = null\n this.configCache.clear()\n }\n\n private unwrapResource<T>(response: T | { data: T }): T {\n if (typeof response === 'object' && response !== null && 'data' in response) {\n return response.data\n }\n\n return response\n }\n\n private unwrapCollection<T>(response: ApiCollectionResult<T>): T[] {\n if (Array.isArray(response)) {\n return response\n }\n\n if (typeof response === 'object' && response !== null && 'data' in response) {\n if (Array.isArray(response.data)) {\n return response.data\n }\n\n if (\n typeof response.data === 'object' &&\n response.data !== null &&\n 'data' in response.data &&\n Array.isArray(response.data.data)\n ) {\n return response.data.data\n }\n }\n\n return []\n }\n}\n\nexport function createB10cksDataApi(client: DataApiClient): B10cksDataApi {\n return new B10cksDataApi(client)\n}\n","export type ContentUpdateEvent = {\n content: Record<string, unknown>\n}\n\nexport type SelectUpdateEvent = {\n selectedItem: string\n}\n\nexport type FieldUpdateEvent = {\n itemId: string\n field: string\n value: string\n}\n\nexport type EventType = 'CONTENT_UPDATE' | 'SELECT_UPDATE' | 'HOVER_UPDATE' | 'FIELD_UPDATE'\n\nexport type EventPayloadMap = {\n CONTENT_UPDATE: ContentUpdateEvent\n SELECT_UPDATE: SelectUpdateEvent\n HOVER_UPDATE: SelectUpdateEvent\n FIELD_UPDATE: FieldUpdateEvent\n}\n\ntype EventCallback<T> = (payload: T) => void\n\nexport type BridgeEvent = {\n type: EventType\n payload: EventPayloadMap[EventType]\n b10cksId?: string\n}\n\nexport class PreviewBridge {\n private static instance: PreviewBridge\n private readonly listeners: Partial<Record<EventType, Set<EventCallback<unknown>>>> = {}\n private initialized = false\n\n private constructor() {}\n\n static getInstance() {\n if (!PreviewBridge.instance) {\n PreviewBridge.instance = new PreviewBridge()\n }\n return PreviewBridge.instance\n }\n\n init() {\n if (!this.isInPreviewMode() || this.initialized) {\n return\n }\n\n window.addEventListener('message', this.handleMessage)\n this.initialized = true\n }\n\n destroy() {\n if (this.initialized && typeof window !== 'undefined') {\n window.removeEventListener('message', this.handleMessage)\n }\n this.initialized = false\n for (const eventType of Object.keys(this.listeners) as EventType[]) {\n this.listeners[eventType]?.clear()\n }\n }\n\n isInPreviewMode(): boolean {\n return typeof window !== 'undefined' && window.self !== window.top\n }\n\n on<T extends EventType>(eventType: T, callback: EventCallback<EventPayloadMap[T]>): () => void {\n if (!this.isInPreviewMode()) {\n return () => {}\n }\n\n const listeners = this.listeners[eventType] || new Set<EventCallback<unknown>>()\n this.listeners[eventType] = listeners\n listeners.add(callback as EventCallback<unknown>)\n\n return () => {\n listeners.delete(callback as EventCallback<unknown>)\n }\n }\n\n selectItem(selectedItem: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'SELECT_UPDATE',\n payload: { selectedItem },\n },\n '*'\n )\n }\n\n updateField(itemId: string, field: string, value: string) {\n if (!this.isInPreviewMode()) {\n return\n }\n\n window.parent.postMessage(\n {\n type: 'FIELD_UPDATE',\n payload: { itemId, field, value },\n },\n '*'\n )\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event.data || typeof event.data !== 'object') {\n return\n }\n\n const { type, payload } = event.data as BridgeEvent\n if (!type || !payload) {\n return\n }\n\n this.notify(type, payload as never)\n }\n\n private notify<T extends EventType>(type: T, payload: EventPayloadMap[T]) {\n const callbacks = this.listeners[type]\n if (!callbacks) {\n return\n }\n\n for (const callback of callbacks) {\n ;(callback as EventCallback<EventPayloadMap[T]>)(payload)\n }\n }\n}\n\nexport const previewBridge = PreviewBridge.getInstance()\n","import type {\n B10cksApiClientOptions,\n Endpoint,\n FetchClient,\n IBBaseQueryParams,\n IBCollectionResponse,\n IBMeta,\n IBResponse,\n} from './types'\n\nexport interface B10cksApiClientRvOptions {\n getRv?: () => string | number\n setRv?: (value: string | number) => void\n}\n\nexport * from './data-api'\nexport * from './preview-bridge'\nexport type * from './types'\nexport * as types from './types'\n\nlet rv: string | number = 0\n\ntype ApiResourceResponse<T> = IBResponse<T> | T\ntype ApiCollectionResponse<T> =\n | IBCollectionResponse<T>\n | IBResponse<IBCollectionResponse<T>>\n | T[]\n | { data: T[]; meta?: IBMeta; rv?: string | number }\n\nexport class ApiClient {\n private readonly baseUrl: string\n readonly token: string\n private readonly vid: string\n private readonly fetchClient: FetchClient\n private readonly getRvFn?: () => string | number\n private readonly setRvFn?: (value: string | number) => void\n\n constructor(options: B10cksApiClientOptions, requestUrl?: URL | string) {\n this.baseUrl = options.baseUrl.endsWith('/') ? options.baseUrl.slice(0, -1) : options.baseUrl\n this.token = options.token\n const defaultFetch =\n typeof globalThis.fetch === 'function' ? globalThis.fetch.bind(globalThis) : null\n if (options.fetchClient) {\n this.fetchClient = options.fetchClient\n } else if (defaultFetch) {\n this.fetchClient = defaultFetch as FetchClient\n } else {\n throw new Error(\n 'No fetch implementation available. Provide `fetchClient` in ApiClient options.'\n )\n }\n\n this.getRvFn = options.getRv\n this.setRvFn = options.setRv\n\n const url = this.resolveRequestUrl(requestUrl)\n this.vid = options.version || 'published'\n this.setRv(url?.searchParams.get('b10cks_rv') || options.rv || rv)\n }\n\n async get<T>(\n endpoint: Endpoint,\n params: Omit<IBBaseQueryParams, 'token'> = {}\n ): Promise<ApiResourceResponse<T>> {\n const url = this.buildUrl(endpoint, {\n vid: this.vid,\n ...params,\n rv: this.getRv(),\n token: this.token,\n })\n\n const payload = await this.fetchClient(url)\n const response = await this.parseResponse<ApiResourceResponse<T>>(payload)\n\n if (this.hasRevision(response)) {\n this.setRv(response.rv)\n }\n\n return response\n }\n\n async getAll<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T[]> {\n const firstResponse = await this.get<IBCollectionResponse<T> & { meta?: IBMeta }>(endpoint, {\n ...params,\n page: 1,\n })\n const normalizedFirstResponse = this.normalizeCollectionResponse<T>(firstResponse)\n\n if (normalizedFirstResponse.rv) {\n this.setRv(normalizedFirstResponse.rv)\n }\n\n if (!normalizedFirstResponse.meta || normalizedFirstResponse.meta.last_page <= 1) {\n return normalizedFirstResponse.data\n }\n\n const pageRequests = Array.from(\n { length: normalizedFirstResponse.meta.last_page - 1 },\n (_, i) => this.get<IBCollectionResponse<T>>(endpoint, { ...params, page: i + 2 })\n )\n\n const allResponses = await Promise.all(pageRequests)\n\n return normalizedFirstResponse.data.concat(\n allResponses.flatMap((response) => this.normalizeCollectionResponse<T>(response).data)\n )\n }\n\n setRv(value: string | number) {\n if (this.setRvFn) {\n this.setRvFn(value)\n } else {\n rv = value\n }\n }\n\n getRv() {\n if (this.getRvFn) {\n return this.getRvFn()\n }\n return rv\n }\n\n private async parseResponse<T>(payload: unknown): Promise<T> {\n if (this.isFetchResponse(payload)) {\n if (!payload.ok) {\n throw new Error(`Request failed with status ${payload.status}`)\n }\n\n return (await payload.json()) as T\n }\n\n return payload as T\n }\n\n private normalizeCollectionResponse<T>(response: ApiCollectionResponse<T>) {\n if (this.isCollectionResponseEnvelope(response)) {\n const nestedResponse = response.data\n\n return {\n data: nestedResponse.data,\n meta: (nestedResponse as IBCollectionResponse<T> & { meta?: IBMeta }).meta,\n rv: response.rv || nestedResponse.rv,\n }\n }\n\n if (Array.isArray(response)) {\n return { data: response, meta: undefined, rv: undefined }\n }\n\n if (typeof response === 'object' && response !== null && 'data' in response) {\n const {\n data,\n meta,\n rv: responseRv,\n } = response as {\n data: T[]\n meta?: IBMeta\n rv?: string | number\n }\n return { data, meta, rv: responseRv }\n }\n\n return { data: [], meta: undefined, rv: undefined }\n }\n\n private buildUrl(endpoint: string, params: Record<string, unknown>): string {\n const url = new URL(`${this.baseUrl}/v1/${endpoint}`)\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, String(value))\n }\n })\n\n return url.toString()\n }\n\n private resolveRequestUrl(requestUrl?: URL | string): URL | null {\n if (!requestUrl) {\n return null\n }\n\n if (requestUrl instanceof URL) {\n return requestUrl\n }\n\n return new URL(requestUrl, 'http://localhost')\n }\n\n private isFetchResponse(value: unknown): value is Response {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'json' in value &&\n typeof (value as Response).json === 'function' &&\n 'ok' in value\n )\n }\n\n private hasRevision(value: unknown): value is { rv: string | number } {\n return typeof value === 'object' && value !== null && 'rv' in value\n }\n\n private isCollectionResponseEnvelope<T>(\n value: ApiCollectionResponse<T>\n ): value is IBResponse<IBCollectionResponse<T>> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'data' in value &&\n typeof value.data === 'object' &&\n value.data !== null &&\n 'data' in value.data &&\n Array.isArray(value.data.data)\n )\n }\n}\n"],"names":["B10cksDataApi","client","endpoint","params","response","options","fullSlug","source","forceRefreshOrOptions","allPages","forceRefresh","redirects","map","target","status_code","slug","language_iso","language","bypassCache","normalizedLanguage","cacheKey","value","fallbackRv","nextRv","createB10cksDataApi","PreviewBridge","eventType","callback","listeners","selectedItem","itemId","field","event","type","payload","callbacks","previewBridge","rv","ApiClient","requestUrl","defaultFetch","url","firstResponse","normalizedFirstResponse","pageRequests","_","i","allResponses","nestedResponse","data","meta","responseRv","key"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@b10cks/client",
3
- "version": "1.0.2",
3
+ "version": "1.2.0",
4
4
  "description": "Core b10cks API client",
5
5
  "license": "MIT",
6
6
  "author": "Michael Wallner @ Coder's Cantina",