@b10cks/client 1.5.0 → 1.7.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 +23 -0
- package/dist/index.cjs +19 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +157 -1
- package/dist/index.mjs +613 -560
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -7
- package/dist/index.js +0 -19
- package/dist/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -158,9 +158,32 @@ interface B10cksApiClientOptions {
|
|
|
158
158
|
fetchClient?: FetchClient // Custom fetch implementation (required in environments without globalThis.fetch)
|
|
159
159
|
getRv?: () => string | number // Custom getter for the shared revision token
|
|
160
160
|
setRv?: (value: string | number) => void // Custom setter for the shared revision token
|
|
161
|
+
timeoutMs?: number // Per-request timeout; aborts and throws ApiError when exceeded (default: none)
|
|
162
|
+
retries?: number // Retry attempts for transient GET failures (network/429/5xx) with backoff (default: 0)
|
|
163
|
+
maxConcurrency?: number // Max pages fetched concurrently by getAll/allPages (default: 6)
|
|
161
164
|
}
|
|
162
165
|
```
|
|
163
166
|
|
|
167
|
+
## Error handling
|
|
168
|
+
|
|
169
|
+
Non-2xx responses and transport failures throw an `ApiError` carrying the HTTP `status` (0 for network/timeout errors), the requested `endpoint`, and a best-effort parsed `body`, so you can branch on the status without string-matching the message:
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
import { ApiError } from '@b10cks/client'
|
|
173
|
+
|
|
174
|
+
try {
|
|
175
|
+
const content = await dataApi.getContent('missing-page')
|
|
176
|
+
} catch (error) {
|
|
177
|
+
if (error instanceof ApiError && error.status === 404) {
|
|
178
|
+
// render a 404 page
|
|
179
|
+
} else {
|
|
180
|
+
throw error
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Set `retries` to automatically retry transient failures (network errors, HTTP 429 and 5xx) on idempotent GET requests with exponential backoff, and `timeoutMs` to bound each request.
|
|
186
|
+
|
|
164
187
|
## Low-level `ApiClient`
|
|
165
188
|
|
|
166
189
|
`ApiClient` implements the `DataApiClient` interface and can be used directly for one-off requests:
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r};function n(e){if(!e)return;if(e.type===`email`){let t=new URLSearchParams;e.subject&&t.set(`subject`,e.subject),e.body&&t.set(`body`,e.body),e.cc&&t.set(`cc`,e.cc),e.bcc&&t.set(`bcc`,e.bcc);let n=t.toString();return{href:`mailto:${e.email}${n?`?${n}`:``}`,target:`_self`}}if(e.type===`asset`)return;let t=e.target??`_self`,n=e.url??``;return`anchor`in e&&e.anchor&&(n=`${n.trimEnd()}#${e.anchor}`),{href:n,target:t}}function r(e){if(e!=null){if(typeof e==`boolean`||typeof e==`number`)return String(e);if(typeof e==`string`)return e;if(typeof e==`object`&&!Array.isArray(e)){let t=e;if(`null`in t)return`null:`;if(`!null`in t)return`!null:`;if(`between`in t){let e=t.between;if(!Array.isArray(e)||e.length!==2)return;let[n,r]=e;return`${n}...${r}`}for(let e of[`eq`,`neq`,`like`,`!like`,`^like`,`like$`,`lt`,`gt`,`lte`,`gte`,`in`,`!in`,`empty`,`!empty`])if(e in t){let n=t[e];return Array.isArray(n)?`${e}:${n.join(`,`)}`:`${e}:${String(n)}`}}}}function i(e){let t={};for(let[n,i]of Object.entries(e)){let e=r(i);e!==void 0&&(t[n]=e)}return t}function a(e,t,n){let r=t&&typeof t==`object`?i(t):{},a=Array.isArray(n)?{sort:n.join(`,`)}:n==null?{}:{sort:n};return{...e,...r,...a}}var o=128,s=class{client;redirectsCache=new Map;configCache=new Map;configInflight=new Map;constructor(e){this.client=e}async getResource(e,t={}){let n=await this.client.get(e,t);return this.unwrapResource(n)}async getCollection(e,t={},n={}){if(n.allPages)return this.client.getAll(e,t);let r=await this.client.get(e,t);return this.unwrapCollection(r)}async getContent(e,t={}){return this.getResource(`contents/${e}`,t)}async getContents(e={},t={}){let{filter:n,sort:r,...i}=e;return this.getCollection(`contents`,a(i,n,r),t)}async getBlock(e,t={}){return this.getResource(`blocks/${e}`,t)}async getBlocks(e={},t={}){let{filter:n,...r}=e;return this.getCollection(`blocks`,a(r,n,void 0),t)}async search(e){let t=await this.client.get(`search`,e);if(typeof t==`object`&&t&&`data`in t&&`meta`in t)return t;if(typeof t==`object`&&t&&`data`in t){let e=t.data;if(typeof e==`object`&&e&&`meta`in e&&`data`in e)return e}return t}async getSitemap(e={},t={}){return this.getCollection(`sitemap`,e,t)}async getDataEntries(e,t={},n={}){return this.getCollection(`datasources/${e}/entries`,t,n)}async getDataSources(e={},t={}){return this.getCollection(`datasources`,e,t)}async getSpace(e={}){return this.getResource(`spaces/me`,e)}async lookupRedirect(e){if(!this.client.post)throw Error(`lookupRedirect requires a client that supports POST. Use ApiClient from @b10cks/client.`);return this.client.post(`redirects/lookup`,{source:e})}async getRedirects(e={},t=!1){let{allPages:n=!1,forceRefresh:r=!1}=typeof t==`boolean`?{allPages:!0,forceRefresh:t}:t,i=JSON.stringify({params:e,rv:this.currentRv()});if(n&&!r){let e=this.redirectsCache.get(i);if(e)return e}let{filter:o,...s}=e,c=a(s,o,void 0),l=await this.getCollection(`redirects`,c,{allPages:n}),u=Object.fromEntries(l.map(({source:e,target:t,status_code:n})=>[e,{target:t,status_code:n}]));return n&&this.redirectsCache.set(i,u),u}currentRv(){return typeof this.client.getRv==`function`?this.client.getRv():``}async getConfig({slug:e=`_config`,language_iso:t,language:n,bypassCache:r=!1,...i}={}){let a=t??n,o=JSON.stringify({slug:e,language_iso:a,rv:this.currentRv(),...i});if(!r&&this.configCache.has(o))return this.configCache.get(o);let s=this.configInflight.get(o);if(!r&&s)return s;let c=this.getContent(e,{...i,language_iso:a}).then(e=>{let t=e.content??{};return r||this.setConfigCache(o,t),t}).finally(()=>{this.configInflight.delete(o)});return r||this.configInflight.set(o,c),c}setConfigCache(e,t){if(this.configCache.delete(e),this.configCache.set(e,t),this.configCache.size>o){let e=this.configCache.keys().next().value;e!==void 0&&this.configCache.delete(e)}}async syncRevision(e=426713400){let t=(await this.getSpace()).rv||e;return this.client.setRv(t),t}clearCache(){this.redirectsCache.clear(),this.configCache.clear(),this.configInflight.clear()}unwrapResource(e){return typeof e==`object`&&e&&`data`in e?e.data:e}unwrapCollection(e){if(Array.isArray(e))return e;if(typeof e==`object`&&e&&`data`in e){if(Array.isArray(e.data))return e.data;if(typeof e.data==`object`&&e.data!==null&&`data`in e.data&&Array.isArray(e.data.data))return e.data.data}return[]}};function c(e){return new s(e)}var l=new Set([`CONTENT_UPDATE`,`CONTENT_PATCH`,`SELECT_UPDATE`,`HOVER_UPDATE`,`FIELD_UPDATE`,`FIELD_SELECT`]),u=`B10CKS_BRIDGE_READY`,d=class e{static instance;listeners={};initialized=!1;allowedOrigins=null;parentOrigin=null;constructor(){}static getInstance(){return e.instance||=new e,e.instance}init(e={}){!this.isInPreviewMode()||this.initialized||(this.allowedOrigins=e.allowedOrigins??null,window.addEventListener(`message`,this.handleMessage),this.initialized=!0,window.parent.postMessage({type:u},`*`))}destroy(){this.initialized&&typeof window<`u`&&window.removeEventListener(`message`,this.handleMessage),this.initialized=!1,this.parentOrigin=null;for(let e of Object.keys(this.listeners))this.listeners[e]?.clear()}isInPreviewMode(){return typeof window<`u`&&window.self!==window.top}on(e,t){if(!this.isInPreviewMode())return()=>{};let n=this.listeners[e]||new Set;return this.listeners[e]=n,n.add(t),()=>{n.delete(t)}}selectItem(e){this.post(`SELECT_UPDATE`,{selectedItem:e})}selectField(e,t){this.post(`FIELD_SELECT`,{itemId:e,path:t})}updateField(e,t,n){this.post(`FIELD_UPDATE`,{itemId:e,field:t,value:n})}updateFieldAt(e,t,n){this.post(`FIELD_UPDATE`,{itemId:e,path:t,value:n})}post(e,t){this.isInPreviewMode()&&window.parent.postMessage({type:e,payload:t},this.parentOrigin??`*`)}handleMessage=e=>{if(!this.isOriginTrusted(e.origin)||!e.data||typeof e.data!=`object`)return;let{type:t,payload:n}=e.data;!t||!l.has(t)||!n||(!this.parentOrigin&&e.origin&&e.origin!==`null`&&(this.parentOrigin=e.origin),this.notify(t,n))};isOriginTrusted(e){return this.parentOrigin?e===this.parentOrigin:this.allowedOrigins?this.allowedOrigins.includes(e):!0}notify(e,t){let n=this.listeners[e];if(n)for(let e of n)e(t)}},f=d.getInstance(),p=`b10cks-preview-style`,m=`--b10cks-scroll-offset`;function h(){if(typeof document>`u`||document.getElementById(p))return;let e=document.createElement(`style`);e.id=p,e.textContent=`
|
|
2
|
+
.b10cks-preview { scroll-margin-top: var(${m}, 0px); }
|
|
3
|
+
.b10cks-hover,
|
|
4
|
+
.b10cks-preview:hover {
|
|
5
|
+
outline: 2px dashed rgba(59, 130, 246, 0.5);
|
|
6
|
+
outline-offset: 2px;
|
|
7
|
+
}
|
|
8
|
+
.b10cks-selected {
|
|
9
|
+
outline: 2px solid rgb(59, 130, 246) !important;
|
|
10
|
+
outline-offset: 2px;
|
|
11
|
+
}
|
|
12
|
+
`,document.head.appendChild(e)}function g(e){if(typeof document>`u`)return;let t=typeof e==`number`?`${e}px`:e;document.documentElement.style.setProperty(m,t)}function _(e,t){if(!f.isInPreviewMode()||!t.id)return()=>{};h();let{id:n,onSelectChange:r,onHoverChange:i,scrollOnSelect:a=!0}=t;e.classList.add(`b10cks-preview`);let o=e=>{e.preventDefault(),e.stopPropagation(),f.selectItem(n)},s=({selectedItem:t})=>{let i=t===n;e.classList.toggle(`b10cks-selected`,i),i&&a&&y(e),r?.(i)},c=({selectedItem:t})=>{let r=t===n;e.classList.toggle(`b10cks-hover`,r),i?.(r)};e.addEventListener(`click`,o);let l=f.on(`SELECT_UPDATE`,s),u=f.on(`HOVER_UPDATE`,c);return()=>{e.removeEventListener(`click`,o),l(),u(),e.classList.remove(`b10cks-preview`,`b10cks-selected`,`b10cks-hover`)}}function v(e,t){if(!f.isInPreviewMode()||!t.id)return()=>{};let{id:n,field:r,path:i,mode:a=`inline`}=t;if(a===`select`){h(),e.classList.add(`b10cks-preview`);let t=e=>{e.preventDefault(),e.stopPropagation(),i?f.selectField(n,i):f.selectItem(n)};return e.addEventListener(`click`,t),()=>{e.removeEventListener(`click`,t),e.classList.remove(`b10cks-preview`)}}e.setAttribute(`contenteditable`,`true`);let o=e=>{let t=e.target.innerText;i?f.updateFieldAt(n,i,t):f.updateField(n,r??``,t)};return e.addEventListener(`input`,o),()=>{e.removeEventListener(`input`,o),e.removeAttribute(`contenteditable`)}}function y(e){typeof e.scrollIntoView==`function`&&e.scrollIntoView({block:`nearest`,behavior:`smooth`})}function b(e,t){let n=e;for(let e of t){if(typeof n!=`object`||!n)return;n=n[e]}return n}function x(e,t,n){if(t.length===0)return n;let[r,...i]=t;if(r===void 0)return n;if(typeof r==`number`){let t=Array.isArray(e)?e.slice():[];return t[r]=x(t[r],i,n),t}let a=e&&typeof e==`object`&&!Array.isArray(e)?{...e}:{};return a[r]=x(a[r],i,n),a}var S=class{content;listeners=new Set;constructor(e){this.content=e}subscribe=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)});getSnapshot=()=>this.content;setContent(e){this.content=e,this.emit()}patch(e,t){this.content=x(this.content,e,t),this.emit()}emit(){for(let e of this.listeners)e()}};function C(e){let t=f.on(`CONTENT_UPDATE`,({content:t})=>{e.setContent(t)}),n=f.on(`CONTENT_PATCH`,({path:t,value:n})=>{e.patch(t,n)});return()=>{t(),n()}}function w(e){return(e??``).trim().replace(/^\/+|\/+$/g,``)}function T(e,t){let n=w(e),r=w(t);if(!r)return n&&n!==`home`?`/${n}`:`/`;if(!n||n===`home`)return`/${r}`;let i=`${r}/`;return n===r||n.startsWith(i)?`/${n}`:`/${r}/${n}`}function E(e,t){if(!t)return null;try{return new URL(e,t).toString()}catch{return null}}function D(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function O(e,t={}){let{siteUrl:n,locale:r}=t,i=new Set;return e.filter(e=>{if(r&&e.language_iso!==r||e.meta?.robots?.toLowerCase().includes(`noindex`))return!1;let t=T(e.full_slug,e.language_iso),a=n?E(t,n)??t:t;return i.has(a)?!1:(i.add(a),!0)})}function k(e,t){return[`<?xml version="1.0" encoding="UTF-8"?>`,`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`,e.map(e=>{let n=T(e.full_slug,e.language_iso),r=t?E(n,t):n;if(!r)return``;let i=[` <url>`,` <loc>${D(r)}</loc>`];return e.published_at&&i.push(` <lastmod>${D(e.published_at)}</lastmod>`),i.push(` </url>`),i.join(`
|
|
13
|
+
`)}).filter(Boolean).join(`
|
|
14
|
+
`),`</urlset>`].join(`
|
|
15
|
+
`)}function A(e,t){return[`<?xml version="1.0" encoding="UTF-8"?>`,`<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`,e.map(e=>{let n=t?E(e,t):e;return n?[` <sitemap>`,` <loc>${D(n)}</loc>`,` </sitemap>`].join(`
|
|
16
|
+
`):``}).filter(Boolean).join(`
|
|
17
|
+
`),`</sitemapindex>`].join(`
|
|
18
|
+
`)}var j=t({}),M=class extends Error{status;endpoint;body;constructor(e,t,n,r){super(e),this.status=t,this.endpoint=n,this.body=r,this.name=`ApiError`}},N=e=>e===429||e>=500&&e<=599,P=e=>new Promise(t=>setTimeout(t,e)),F=class{baseUrl;token;vid;fetchClient;getRvFn;setRvFn;timeoutMs;retries;maxConcurrency;rvValue=0;constructor(e,t){this.baseUrl=e.baseUrl.endsWith(`/`)?e.baseUrl.slice(0,-1):e.baseUrl,this.token=e.token;let n=typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):null;if(e.fetchClient)this.fetchClient=e.fetchClient;else if(n)this.fetchClient=n;else throw Error("No fetch implementation available. Provide `fetchClient` in ApiClient options.");this.getRvFn=e.getRv,this.setRvFn=e.setRv,this.timeoutMs=e.timeoutMs,this.retries=Math.max(0,e.retries??0),this.maxConcurrency=Math.max(1,e.maxConcurrency??6);let r=this.resolveRequestUrl(t);this.vid=e.version||`published`,this.setRv(r?.searchParams.get(`b10cks_rv`)||e.rv||0)}async get(e,t={}){let n=this.buildUrl(e,{vid:this.vid,rv:this.getRv(),...t,token:this.token}),r=await this.requestWithRetry(n,e);return this.hasRevision(r)&&this.setRv(r.rv),r}async post(e,t,n={}){let r=this.buildUrl(e,{vid:this.vid,rv:this.getRv(),...n,token:this.token}),i=await this.fetchWithTimeout(r,{method:`POST`,headers:{"Content-Type":`application/json`},body:t===void 0?void 0:JSON.stringify(t)});return this.parseResponse(i,e)}async fetchWithTimeout(e,t){if(!this.timeoutMs)return this.fetchClient(e,t);let n=new AbortController,r=setTimeout(()=>n.abort(),this.timeoutMs);try{return await this.fetchClient(e,{...t,signal:n.signal})}catch(t){throw t instanceof Error&&t.name===`AbortError`?new M(`Request timed out after ${this.timeoutMs}ms`,0,e):t}finally{clearTimeout(r)}}async requestWithRetry(e,t){let n;for(let r=0;r<=this.retries;r++)try{let n=await this.fetchWithTimeout(e);return await this.parseResponse(n,t)}catch(e){if(n=e,!(r<this.retries&&(!(e instanceof M)||e.status===0||N(e.status))))throw e;await P(200*2**r)}throw n}async getAll(e,t={}){let n=await this.get(e,{...t,page:1}),r=this.normalizeCollectionResponse(n);if(r.rv&&this.setRv(r.rv),!r.meta||r.meta.last_page<=1)return r.data;let i=Array.from({length:r.meta.last_page-1},(e,t)=>t+2),a=await this.mapWithConcurrency(i,n=>this.get(e,{...t,page:n}));return r.data.concat(a.flatMap(e=>this.normalizeCollectionResponse(e).data))}async mapWithConcurrency(e,t){let n=Array.from({length:e.length}),r=0,i=async()=>{for(;r<e.length;){let i=r++;n[i]=await t(e[i])}},a=Array.from({length:Math.min(this.maxConcurrency,e.length)},()=>i());return await Promise.all(a),n}setRv(e){this.setRvFn?this.setRvFn(e):this.rvValue=e}getRv(){return this.getRvFn?this.getRvFn():this.rvValue}async parseResponse(e,t){if(this.isFetchResponse(e)){if(!e.ok){let n=await this.readErrorBody(e);throw new M(`Request to "${t}" failed with status ${e.status}`,e.status,t,n)}return await e.json()}return e}async readErrorBody(e){try{let t=await e.text();if(!t)return;try{return JSON.parse(t)}catch{return t}}catch{return}}normalizeCollectionResponse(e){if(this.isCollectionResponseEnvelope(e)){let t=e.data;return{data:t.data,meta:t.meta,rv:e.rv||t.rv}}if(Array.isArray(e))return{data:e,meta:void 0,rv:void 0};if(typeof e==`object`&&e&&`data`in e){let{data:t,meta:n,rv:r}=e;return{data:t,meta:n,rv:r}}return{data:[],meta:void 0,rv:void 0}}buildUrl(e,t){let n=new URL(`${this.baseUrl}/v1/${e}`);return Object.entries(t).forEach(([e,t])=>{t!=null&&n.searchParams.append(e,String(t))}),n.toString()}resolveRequestUrl(e){return e?e instanceof URL?e:new URL(e,`http://localhost`):null}isFetchResponse(e){return typeof e==`object`&&!!e&&`json`in e&&typeof e.json==`function`&&`ok`in e}hasRevision(e){return typeof e==`object`&&!!e&&`rv`in e&&e.rv!=null}isCollectionResponseEnvelope(e){return typeof e==`object`&&!!e&&`data`in e&&typeof e.data==`object`&&e.data!==null&&`data`in e.data&&Array.isArray(e.data.data)}};exports.ApiClient=F,exports.ApiError=M,exports.B10cksDataApi=s,exports.PreviewBridge=d,exports.PreviewStore=S,exports.attachEditable=_,exports.attachEditableField=v,exports.bindPreviewStore=C,exports.buildLocalizedPath=T,exports.createB10cksDataApi=c,exports.ensurePreviewStyles=h,exports.filterSitemapEntries=O,exports.getAtPath=b,exports.normalizePathSegment=w,exports.previewBridge=f,exports.renderSitemapIndex=A,exports.renderSitemapXml=k,exports.resolveB10cksLink=n,exports.serializeFilter=i,exports.setAtPath=x,exports.setPreviewScrollOffset=g,Object.defineProperty(exports,"types",{enumerable:!0,get:function(){return j}});
|
|
19
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/content.ts","../src/data-api.ts","../src/preview-bridge.ts","../src/editable.ts","../src/preview-store.ts","../src/sitemap.ts","../src/types.ts","../src/index.ts"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,9 @@ export declare class ApiClient {
|
|
|
5
5
|
private readonly fetchClient;
|
|
6
6
|
private readonly getRvFn?;
|
|
7
7
|
private readonly setRvFn?;
|
|
8
|
+
private readonly timeoutMs?;
|
|
9
|
+
private readonly retries;
|
|
10
|
+
private readonly maxConcurrency;
|
|
8
11
|
/**
|
|
9
12
|
* Per-instance revision store, used when no `getRv`/`setRv` callbacks are
|
|
10
13
|
* supplied. Kept on the instance (not module scope) so concurrent requests
|
|
@@ -15,10 +18,19 @@ export declare class ApiClient {
|
|
|
15
18
|
constructor(options: B10cksApiClientOptions, requestUrl?: URL | string);
|
|
16
19
|
get<T>(endpoint: Endpoint, params?: Omit<IBBaseQueryParams, 'token'> & Record<string, unknown>): Promise<ApiResourceResponse<T>>;
|
|
17
20
|
post<T>(endpoint: string, body?: unknown, params?: Omit<IBBaseQueryParams, 'token'> & Record<string, unknown>): Promise<T>;
|
|
21
|
+
private fetchWithTimeout;
|
|
22
|
+
private requestWithRetry;
|
|
18
23
|
getAll<T>(endpoint: Endpoint, params?: Omit<IBBaseQueryParams, 'token'> & Record<string, unknown>): Promise<T[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Runs `task` over `items` preserving order, with at most `maxConcurrency`
|
|
26
|
+
* requests in flight, so paginated fan-out cannot open hundreds of sockets
|
|
27
|
+
* at once and trip API rate limits.
|
|
28
|
+
*/
|
|
29
|
+
private mapWithConcurrency;
|
|
19
30
|
setRv(value: string | number): void;
|
|
20
31
|
getRv(): string | number;
|
|
21
32
|
private parseResponse;
|
|
33
|
+
private readErrorBody;
|
|
22
34
|
private normalizeCollectionResponse;
|
|
23
35
|
private buildUrl;
|
|
24
36
|
private resolveRequestUrl;
|
|
@@ -27,6 +39,19 @@ export declare class ApiClient {
|
|
|
27
39
|
private isCollectionResponseEnvelope;
|
|
28
40
|
}
|
|
29
41
|
|
|
42
|
+
/**
|
|
43
|
+
* Error thrown for non-2xx API responses and transport failures. Carries the
|
|
44
|
+
* HTTP `status` (0 for network/timeout errors), the requested `endpoint`, and a
|
|
45
|
+
* best-effort parsed `body` so callers can branch on status (e.g. render a 404
|
|
46
|
+
* page) without string-matching the message.
|
|
47
|
+
*/
|
|
48
|
+
export declare class ApiError extends Error {
|
|
49
|
+
readonly status: number;
|
|
50
|
+
readonly endpoint: string;
|
|
51
|
+
readonly body?: unknown | undefined;
|
|
52
|
+
constructor(message: string, status: number, endpoint: string, body?: unknown | undefined);
|
|
53
|
+
}
|
|
54
|
+
|
|
30
55
|
declare type ApiQueryParams = Omit<IBBaseQueryParams, 'token'> & Record<string, unknown>;
|
|
31
56
|
|
|
32
57
|
declare type ApiResourceResponse<T> = IBResponse<T> | T;
|
|
@@ -77,6 +102,21 @@ export declare interface B10cksApiClientOptions {
|
|
|
77
102
|
fetchClient?: FetchClient;
|
|
78
103
|
getRv?: () => string | number;
|
|
79
104
|
setRv?: (value: string | number) => void;
|
|
105
|
+
/**
|
|
106
|
+
* Per-request timeout in milliseconds. When exceeded the request is aborted
|
|
107
|
+
* and rejected with an {@link ApiError}. Defaults to no timeout.
|
|
108
|
+
*/
|
|
109
|
+
timeoutMs?: number;
|
|
110
|
+
/**
|
|
111
|
+
* Number of retry attempts for transient failures (network errors, HTTP 429
|
|
112
|
+
* and 5xx) on idempotent GET requests, using exponential backoff. Defaults
|
|
113
|
+
* to 0 (no retries).
|
|
114
|
+
*/
|
|
115
|
+
retries?: number;
|
|
116
|
+
/**
|
|
117
|
+
* Maximum number of pages fetched concurrently by `getAll`. Defaults to 6.
|
|
118
|
+
*/
|
|
119
|
+
maxConcurrency?: number;
|
|
80
120
|
}
|
|
81
121
|
|
|
82
122
|
export declare interface B10cksApiClientRvOptions {
|
|
@@ -84,10 +124,117 @@ export declare interface B10cksApiClientRvOptions {
|
|
|
84
124
|
setRv?: (value: string | number) => void;
|
|
85
125
|
}
|
|
86
126
|
|
|
127
|
+
/**
|
|
128
|
+
* WCAG contrast stats derived from an asset's dominant color, so consumers
|
|
129
|
+
* can pick accessible overlay/text colors for content rendered on top of
|
|
130
|
+
* the image without recomputing contrast client-side.
|
|
131
|
+
*/
|
|
132
|
+
export declare interface B10cksAssetA11y {
|
|
133
|
+
/** `'dark'` = treat the image as a dark surface (use light overlays/text). */
|
|
134
|
+
scheme: 'dark' | 'light';
|
|
135
|
+
/** WCAG relative luminance of the dominant color (0–1). */
|
|
136
|
+
luminance: number;
|
|
137
|
+
/** Contrast ratio of white text against the dominant color (1–21). */
|
|
138
|
+
contrast_white: number;
|
|
139
|
+
/** Contrast ratio of black text against the dominant color (1–21). */
|
|
140
|
+
contrast_black: number;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** EXIF subset extracted from JPEG/TIFF uploads. */
|
|
144
|
+
export declare interface B10cksAssetExif {
|
|
145
|
+
make?: string | null;
|
|
146
|
+
model?: string | null;
|
|
147
|
+
exposure?: string | number | null;
|
|
148
|
+
aperture?: string | number | null;
|
|
149
|
+
iso?: string | number | null;
|
|
150
|
+
dateTaken?: string | null;
|
|
151
|
+
orientation?: number | null;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** ID3-style tags extracted from audio uploads. */
|
|
155
|
+
export declare interface B10cksAssetMediaTags {
|
|
156
|
+
title?: string | null;
|
|
157
|
+
artist?: string | null;
|
|
158
|
+
album?: string | null;
|
|
159
|
+
year?: string | null;
|
|
160
|
+
genre?: string | null;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Metadata extracted from an asset at upload time. Which fields are present
|
|
165
|
+
* depends on the file type (image, video, audio, document); content delivery
|
|
166
|
+
* additionally whitelists to `width`, `height`, `duration`, `thumbnails`,
|
|
167
|
+
* `dominant_color` and `a11y`. Custom metadata supplied at upload is carried
|
|
168
|
+
* through via the index signature.
|
|
169
|
+
*/
|
|
170
|
+
export declare interface B10cksAssetMetadata {
|
|
171
|
+
type?: 'image' | 'video' | 'audio' | 'document' | 'file';
|
|
172
|
+
/** Format refinement, e.g. `'svg'`, `'pdf'` or the source mime type. */
|
|
173
|
+
subtype?: string;
|
|
174
|
+
original_filename?: string;
|
|
175
|
+
width?: number;
|
|
176
|
+
height?: number;
|
|
177
|
+
/** `width / height`, rounded to 4 decimals. */
|
|
178
|
+
aspectRatio?: number;
|
|
179
|
+
/** Dominant color as `#rrggbb` — usable as a loading placeholder. */
|
|
180
|
+
dominant_color?: string;
|
|
181
|
+
/** Up to 5 representative colors, most dominant first (`palette[0] === dominant_color`). */
|
|
182
|
+
palette?: string[];
|
|
183
|
+
/** True for multi-frame GIF/WebP images. */
|
|
184
|
+
animated?: boolean;
|
|
185
|
+
a11y?: B10cksAssetA11y;
|
|
186
|
+
exif?: B10cksAssetExif;
|
|
187
|
+
/** Duration in seconds (video/audio). */
|
|
188
|
+
duration?: number;
|
|
189
|
+
fps?: number;
|
|
190
|
+
bitrate?: number;
|
|
191
|
+
codec?: string;
|
|
192
|
+
thumbnails?: B10cksAssetThumbnail[];
|
|
193
|
+
channels?: number;
|
|
194
|
+
sample_rate?: number;
|
|
195
|
+
tags?: B10cksAssetMediaTags;
|
|
196
|
+
[key: string]: unknown;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** A generated video preview frame. */
|
|
200
|
+
export declare interface B10cksAssetThumbnail {
|
|
201
|
+
path: string;
|
|
202
|
+
/** Storage-prefixed path, present when delivered via the API. */
|
|
203
|
+
full_path?: string;
|
|
204
|
+
/** Frame position in seconds. */
|
|
205
|
+
position: number;
|
|
206
|
+
/** Frame position as `mm:ss` / `hh:mm:ss`. */
|
|
207
|
+
position_formatted: string;
|
|
208
|
+
/** Dominant color of this frame as `#rrggbb`. */
|
|
209
|
+
dominant_color?: string;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** An asset field value as delivered inside content payloads. */
|
|
213
|
+
export declare interface B10cksAssetValue {
|
|
214
|
+
type: 'asset';
|
|
215
|
+
id: string;
|
|
216
|
+
url?: string;
|
|
217
|
+
full_path?: string;
|
|
218
|
+
filename?: string;
|
|
219
|
+
extension?: string;
|
|
220
|
+
mime_type?: string;
|
|
221
|
+
size?: number;
|
|
222
|
+
metadata?: B10cksAssetMetadata;
|
|
223
|
+
data?: Record<string, unknown> & {
|
|
224
|
+
focus?: {
|
|
225
|
+
x: number;
|
|
226
|
+
y: number;
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
[key: string]: unknown;
|
|
230
|
+
}
|
|
231
|
+
|
|
87
232
|
export declare class B10cksDataApi {
|
|
88
233
|
private readonly client;
|
|
89
|
-
private redirectsCache;
|
|
234
|
+
private readonly redirectsCache;
|
|
90
235
|
private readonly configCache;
|
|
236
|
+
/** In-flight config requests, keyed like `configCache`, to dedupe stampedes. */
|
|
237
|
+
private readonly configInflight;
|
|
91
238
|
constructor(client: DataApiClient);
|
|
92
239
|
getResource<T>(endpoint: Endpoint, params?: ApiQueryParams): Promise<T>;
|
|
93
240
|
getCollection<T>(endpoint: Endpoint, params?: ApiQueryParams, options?: CollectionFetchOptions): Promise<T[]>;
|
|
@@ -103,7 +250,9 @@ export declare class B10cksDataApi {
|
|
|
103
250
|
lookupRedirect(source: string): Promise<IBRedirectLookupResult | false>;
|
|
104
251
|
getRedirects(params?: IBGetRedirectsParams, forceRefresh?: boolean): Promise<RedirectMap>;
|
|
105
252
|
getRedirects(params?: IBGetRedirectsParams, options?: RedirectFetchOptions): Promise<RedirectMap>;
|
|
253
|
+
private currentRv;
|
|
106
254
|
getConfig<T = Record<string, unknown>>({ slug, language_iso, language, bypassCache, ...params }?: GetConfigOptions): Promise<T>;
|
|
255
|
+
private setConfigCache;
|
|
107
256
|
syncRevision(fallbackRv?: number): Promise<string | number>;
|
|
108
257
|
clearCache(): void;
|
|
109
258
|
private unwrapResource;
|
|
@@ -189,6 +338,7 @@ export declare interface DataApiClient {
|
|
|
189
338
|
getAll<T>(endpoint: Endpoint, params?: ApiQueryParams): Promise<T[]>;
|
|
190
339
|
post?<T>(endpoint: string, body?: unknown, params?: ApiQueryParams): Promise<T>;
|
|
191
340
|
setRv(value: string | number): void;
|
|
341
|
+
getRv?(): string | number;
|
|
192
342
|
}
|
|
193
343
|
|
|
194
344
|
export declare type DateFilter = string | {
|
|
@@ -661,6 +811,12 @@ export declare namespace types {
|
|
|
661
811
|
IBRedirect,
|
|
662
812
|
IBContentQueryParams,
|
|
663
813
|
B10cksLink,
|
|
814
|
+
B10cksAssetA11y,
|
|
815
|
+
B10cksAssetThumbnail,
|
|
816
|
+
B10cksAssetExif,
|
|
817
|
+
B10cksAssetMediaTags,
|
|
818
|
+
B10cksAssetMetadata,
|
|
819
|
+
B10cksAssetValue,
|
|
664
820
|
B10cksApiClientOptions,
|
|
665
821
|
StringFilter,
|
|
666
822
|
IdFilter,
|