@b10cks/client 0.9.6 → 0.10.1

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 ADDED
@@ -0,0 +1,58 @@
1
+ # @b10cks/client
2
+
3
+ Core API client for b10cks, a headless CMS and content management platform.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @b10cks/client
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { ApiClient } from '@b10cks/client'
15
+
16
+ const client = new ApiClient(
17
+ {
18
+ baseUrl: 'https://api.b10cks.com/api',
19
+ token: 'your-access-token',
20
+ fetchClient: fetch,
21
+ },
22
+ new URL(window.location.href)
23
+ )
24
+
25
+ // Fetch blocks
26
+ const blocks = await client.get('blocks')
27
+
28
+ // Fetch all contents with pagination
29
+ const contents = await client.getAll('contents')
30
+
31
+ // Fetch specific datasource entries
32
+ const entries = await client.get('datasources/my-datasource/entries')
33
+ ```
34
+
35
+ ## Features
36
+
37
+ - **Simple HTTP Client**: Type-safe API client for b10cks endpoints
38
+ - **Pagination Support**: Automatic handling of paginated responses
39
+ - **Revision Tracking**: Built-in support for revision (RV) and version (VID) parameters
40
+ - **Flexible Fetch**: Use any fetch implementation (browser, Node.js, custom)
41
+
42
+ ## API Methods
43
+
44
+ - `get<T>(endpoint, params)` - Fetch single page of data
45
+ - `getAll<T>(endpoint, params)` - Fetch all data across pages
46
+
47
+ ## Supported Endpoints
48
+
49
+ - `blocks` - Content blocks
50
+ - `contents` - Content items
51
+ - `contents/{id}` - Specific content
52
+ - `datasources` - Data sources
53
+ - `datasources/{id}/entries` - Datasource entries
54
+ - `spaces/me` - Current space info
55
+
56
+ ## License
57
+
58
+ MIT
package/dist/index.d.ts CHANGED
@@ -2,19 +2,30 @@ export declare class ApiClient {
2
2
  private readonly baseUrl;
3
3
  private readonly token;
4
4
  private readonly vid;
5
- private rv;
6
5
  private readonly fetchClient;
6
+ private readonly getRvFn?;
7
+ private readonly setRvFn?;
7
8
  constructor(options: B10cksApiClientOptions, url: URL);
8
9
  get<T>(endpoint: Endpoint, params?: Omit<IBBaseQueryParams, 'token'>): Promise<T>;
9
10
  getAll<T>(endpoint: Endpoint, params?: Omit<IBBaseQueryParams, 'token'>): Promise<T[]>;
11
+ setRv(value: string | number): void;
12
+ getRv(): string | number;
10
13
  private buildUrl;
11
14
  }
12
15
 
13
16
  export declare interface B10cksApiClientOptions {
14
17
  baseUrl: string;
15
18
  token: string;
19
+ rv?: string | number;
16
20
  version?: 'draft' | 'published';
17
21
  fetchClient: FetchClient;
22
+ getRv?: () => string | number;
23
+ setRv?: (value: string | number) => void;
24
+ }
25
+
26
+ export declare interface B10cksApiClientRvOptions {
27
+ getRv?: () => string | number;
28
+ setRv?: (value: string | number) => void;
18
29
  }
19
30
 
20
31
  export declare type Endpoint = 'blocks' | 'contents' | `contents/${string}` | `datasources/${string}/entries` | 'datasources' | 'spaces/me';
@@ -39,6 +50,7 @@ export declare interface IBBlock {
39
50
 
40
51
  declare interface IBCollectionResponse<T> {
41
52
  data: T[];
53
+ rv?: string | number;
42
54
  links: {
43
55
  first: string | null;
44
56
  last: string | null;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));class c{baseUrl;token;vid;rv=0;fetchClient;constructor(e,s){this.baseUrl=e.baseUrl.endsWith("/")?e.baseUrl.slice(0,-1):e.baseUrl,this.token=e.token,this.fetchClient=e.fetchClient,this.vid=s.searchParams.get("b10cks_vid")||e.version||"published",this.rv=s.searchParams.get("b10cks_rv")??this.rv}async get(e,s={}){const t=this.buildUrl(e,{vid:this.vid,...s,rv:this.rv,token:this.token}),r=await this.fetchClient(t);return r.rv&&(this.rv=r.rv),r}async getAll(e,s={}){const t=await this.get(e,{...s,page:1});if(!t.meta||t.meta.last_page<=1)return"data"in t?t.data:t;const r=Array.from({length:t.meta.last_page},(i,l)=>this.get(e,{...s,page:l+1}));return(await Promise.all(r)).flatMap(i=>i.data)}buildUrl(e,s){const t=new URL(`${this.baseUrl}/v1/${e}`);return Object.entries(s).forEach(([r,a])=>{a!=null&&t.searchParams.append(r,String(a))}),t.toString()}}exports.ApiClient=c;exports.types=n;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));let a=0;class v{baseUrl;token;vid;fetchClient;getRvFn;setRvFn;constructor(e,s){this.baseUrl=e.baseUrl.endsWith("/")?e.baseUrl.slice(0,-1):e.baseUrl,this.token=e.token,this.fetchClient=e.fetchClient,this.getRvFn=e.getRv,this.setRvFn=e.setRv,this.vid=s.searchParams.get("b10cks_vid")||e.version||"published",this.setRv(s.searchParams.get("b10cks_rv")||e.rv||a)}async get(e,s={}){const t=this.buildUrl(e,{vid:this.vid,...s,rv:this.getRv(),token:this.token}),r=await this.fetchClient(t);return r.rv&&this.setRv(r.rv),r}async getAll(e,s={}){const t=await this.get(e,{...s,page:1});if(t.rv&&this.setRv(t.rv),!t.meta||t.meta.last_page<=1)return"data"in t?t.data:t;const r=Array.from({length:t.meta.last_page},(n,l)=>this.get(e,{...s,page:l+1}));return(await Promise.all(r)).flatMap(n=>n.data)}setRv(e){this.setRvFn?this.setRvFn(e):a=e}getRv(){return this.getRvFn?this.getRvFn():a}buildUrl(e,s){const t=new URL(`${this.baseUrl}/v1/${e}`);return Object.entries(s).forEach(([r,i])=>{i!=null&&t.searchParams.append(r,String(i))}),t.toString()}}exports.ApiClient=v;exports.types=h;
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { B10cksApiClientOptions, IBBaseQueryParams, IBCollectionResponse, IBMeta, IBResponse, } from './types'\n\nexport type FetchClient = typeof fetch\nexport type Endpoint = 'blocks' | 'contents' | `contents/${string}` | `datasources/${string}/entries` | 'datasources' | 'spaces/me'\n\nexport * as types from './types'\nexport type { IBBlock, IBResponse, IBContent, B10cksApiClientOptions } from './types'\n\nexport class ApiClient {\n private readonly baseUrl: string\n private readonly token: string\n private readonly vid: string | null\n private rv: string | number = 0\n private readonly fetchClient: FetchClient\n\n constructor(options: B10cksApiClientOptions, url: URL) {\n this.baseUrl = options.baseUrl.endsWith('/') ? options.baseUrl.slice(0, -1) : options.baseUrl\n this.token = options.token\n this.fetchClient = options.fetchClient\n\n this.vid = url.searchParams.get('b10cks_vid') || options.version || 'published'\n this.rv = url.searchParams.get('b10cks_rv') ?? this.rv\n }\n\n async get<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T> {\n const url = this.buildUrl(endpoint, {\n vid: this.vid,\n ...params,\n rv: this.rv,\n token: this.token\n })\n\n const response = await this.fetchClient(url) as unknown as IBResponse<T>\n if (response.rv) {\n this.rv = response.rv\n }\n\n return response as T\n }\n\n async getAll<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T[]> {\n const response = await this.get<IBCollectionResponse<T> & { meta?: IBMeta }>(\n endpoint,\n { ...params, page: 1 }\n )\n\n if (!response.meta || response.meta.last_page <= 1) {\n return 'data' in response ? response.data : (response as unknown as T[])\n }\n\n const pageRequests = Array.from(\n { length: response.meta.last_page },\n (_, i) => this.get<IBCollectionResponse<T>>(endpoint, { ...params, page: i + 1 })\n )\n\n const allResponses = await Promise.all(pageRequests)\n\n return allResponses.flatMap(r => r.data)\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}"],"names":["ApiClient","options","url","endpoint","params","response","pageRequests","_","i","r","key","value"],"mappings":"mLAQO,MAAMA,CAAU,CACJ,QACA,MACA,IACT,GAAsB,EACb,YAEjB,YAAYC,EAAiCC,EAAU,CACrD,KAAK,QAAUD,EAAQ,QAAQ,SAAS,GAAG,EAAIA,EAAQ,QAAQ,MAAM,EAAG,EAAE,EAAIA,EAAQ,QACtF,KAAK,MAAQA,EAAQ,MACrB,KAAK,YAAcA,EAAQ,YAE3B,KAAK,IAAMC,EAAI,aAAa,IAAI,YAAY,GAAKD,EAAQ,SAAW,YACpE,KAAK,GAAKC,EAAI,aAAa,IAAI,WAAW,GAAK,KAAK,EACtD,CAEA,MAAM,IAAOC,EAAoBC,EAA2C,GAAgB,CAC1F,MAAMF,EAAM,KAAK,SAASC,EAAU,CAClC,IAAK,KAAK,IACV,GAAGC,EACH,GAAI,KAAK,GACT,MAAO,KAAK,KAAA,CACb,EAEKC,EAAW,MAAM,KAAK,YAAYH,CAAG,EAC3C,OAAIG,EAAS,KACX,KAAK,GAAKA,EAAS,IAGdA,CACT,CAEA,MAAM,OAAUF,EAAoBC,EAA2C,GAAkB,CAC/F,MAAMC,EAAW,MAAM,KAAK,IAC1BF,EACA,CAAE,GAAGC,EAAQ,KAAM,CAAA,CAAE,EAGvB,GAAI,CAACC,EAAS,MAAQA,EAAS,KAAK,WAAa,EAC/C,MAAO,SAAUA,EAAWA,EAAS,KAAQA,EAG/C,MAAMC,EAAe,MAAM,KACzB,CAAE,OAAQD,EAAS,KAAK,SAAA,EACxB,CAACE,EAAGC,IAAM,KAAK,IAA6BL,EAAU,CAAE,GAAGC,EAAQ,KAAMI,EAAI,CAAA,CAAG,CAAA,EAKlF,OAFqB,MAAM,QAAQ,IAAIF,CAAY,GAE/B,QAAQG,GAAKA,EAAE,IAAI,CACzC,CAEQ,SAASN,EAAkBC,EAAyC,CAC1E,MAAMF,EAAM,IAAI,IAAI,GAAG,KAAK,OAAO,OAAOC,CAAQ,EAAE,EAEpD,cAAO,QAAQC,CAAM,EAAE,QAAQ,CAAC,CAACM,EAAKC,CAAK,IAAM,CACpBA,GAAU,MACnCT,EAAI,aAAa,OAAOQ,EAAK,OAAOC,CAAK,CAAC,CAE9C,CAAC,EAEMT,EAAI,SAAA,CACb,CACF"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { B10cksApiClientOptions, IBBaseQueryParams, IBCollectionResponse, IBMeta, IBResponse } from './types'\n\nexport type FetchClient = typeof fetch\nexport type Endpoint =\n | 'blocks'\n | 'contents'\n | `contents/${string}`\n | `datasources/${string}/entries`\n | 'datasources'\n | 'spaces/me'\n\nexport interface B10cksApiClientRvOptions {\n getRv?: () => string | number\n setRv?: (value: string | number) => void\n}\n\nexport type { B10cksApiClientOptions, IBBlock, IBContent, IBResponse } from './types'\nexport * as types from './types'\n\nlet rv: string | number = 0\n\nexport class ApiClient {\n private readonly baseUrl: string\n private readonly token: string\n private readonly vid: string | null\n private readonly fetchClient: FetchClient\n private readonly getRvFn?: () => string | number\n private readonly setRvFn?: (value: string | number) => void\n\n constructor(options: B10cksApiClientOptions, url: URL) {\n this.baseUrl = options.baseUrl.endsWith('/') ? options.baseUrl.slice(0, -1) : options.baseUrl\n this.token = options.token\n this.fetchClient = options.fetchClient\n this.getRvFn = options.getRv\n this.setRvFn = options.setRv\n\n this.vid = url.searchParams.get('b10cks_vid') || options.version || 'published'\n this.setRv(url.searchParams.get('b10cks_rv') || options.rv || rv)\n }\n\n async get<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T> {\n const url = this.buildUrl(endpoint, {\n vid: this.vid,\n ...params,\n rv: this.getRv(),\n token: this.token,\n })\n\n const response = (await this.fetchClient(url)) as unknown as IBResponse<T>\n if (response.rv) {\n this.setRv(response.rv)\n }\n\n return response as T\n }\n\n async getAll<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T[]> {\n const response = await this.get<IBCollectionResponse<T> & { meta?: IBMeta }>(endpoint, { ...params, page: 1 })\n if (response.rv) {\n this.setRv(response.rv)\n }\n\n if (!response.meta || response.meta.last_page <= 1) {\n return 'data' in response ? response.data : (response as unknown as T[])\n }\n\n const pageRequests = Array.from({ length: response.meta.last_page }, (_, i) =>\n this.get<IBCollectionResponse<T>>(endpoint, { ...params, page: i + 1 })\n )\n\n const allResponses = await Promise.all(pageRequests)\n\n return allResponses.flatMap((r) => r.data)\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 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"],"names":["rv","ApiClient","options","url","endpoint","params","response","pageRequests","_","i","r","value","key"],"mappings":"mLAmBA,IAAIA,EAAsB,EAEnB,MAAMC,CAAU,CACJ,QACA,MACA,IACA,YACA,QACA,QAEjB,YAAYC,EAAiCC,EAAU,CACrD,KAAK,QAAUD,EAAQ,QAAQ,SAAS,GAAG,EAAIA,EAAQ,QAAQ,MAAM,EAAG,EAAE,EAAIA,EAAQ,QACtF,KAAK,MAAQA,EAAQ,MACrB,KAAK,YAAcA,EAAQ,YAC3B,KAAK,QAAUA,EAAQ,MACvB,KAAK,QAAUA,EAAQ,MAEvB,KAAK,IAAMC,EAAI,aAAa,IAAI,YAAY,GAAKD,EAAQ,SAAW,YACpE,KAAK,MAAMC,EAAI,aAAa,IAAI,WAAW,GAAKD,EAAQ,IAAMF,CAAE,CAClE,CAEA,MAAM,IAAOI,EAAoBC,EAA2C,GAAgB,CAC1F,MAAMF,EAAM,KAAK,SAASC,EAAU,CAClC,IAAK,KAAK,IACV,GAAGC,EACH,GAAI,KAAK,MAAA,EACT,MAAO,KAAK,KAAA,CACb,EAEKC,EAAY,MAAM,KAAK,YAAYH,CAAG,EAC5C,OAAIG,EAAS,IACX,KAAK,MAAMA,EAAS,EAAE,EAGjBA,CACT,CAEA,MAAM,OAAUF,EAAoBC,EAA2C,GAAkB,CAC/F,MAAMC,EAAW,MAAM,KAAK,IAAiDF,EAAU,CAAE,GAAGC,EAAQ,KAAM,EAAG,EAK7G,GAJIC,EAAS,IACX,KAAK,MAAMA,EAAS,EAAE,EAGpB,CAACA,EAAS,MAAQA,EAAS,KAAK,WAAa,EAC/C,MAAO,SAAUA,EAAWA,EAAS,KAAQA,EAG/C,MAAMC,EAAe,MAAM,KAAK,CAAE,OAAQD,EAAS,KAAK,SAAA,EAAa,CAACE,EAAGC,IACvE,KAAK,IAA6BL,EAAU,CAAE,GAAGC,EAAQ,KAAMI,EAAI,CAAA,CAAG,CAAA,EAKxE,OAFqB,MAAM,QAAQ,IAAIF,CAAY,GAE/B,QAASG,GAAMA,EAAE,IAAI,CAC3C,CAEA,MAAMC,EAAwB,CACxB,KAAK,QACP,KAAK,QAAQA,CAAK,EAElBX,EAAKW,CAET,CAEA,OAAQ,CACN,OAAI,KAAK,QACA,KAAK,QAAA,EAEPX,CACT,CAEQ,SAASI,EAAkBC,EAAyC,CAC1E,MAAMF,EAAM,IAAI,IAAI,GAAG,KAAK,OAAO,OAAOC,CAAQ,EAAE,EAEpD,cAAO,QAAQC,CAAM,EAAE,QAAQ,CAAC,CAACO,EAAKD,CAAK,IAAM,CACpBA,GAAU,MACnCR,EAAI,aAAa,OAAOS,EAAK,OAAOD,CAAK,CAAC,CAE9C,CAAC,EAEMR,EAAI,SAAA,CACb,CACF"}
package/dist/index.mjs CHANGED
@@ -1,46 +1,51 @@
1
- const c = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1
+ const v = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2
2
  __proto__: null
3
3
  }, Symbol.toStringTag, { value: "Module" }));
4
- class h {
4
+ let a = 0;
5
+ class c {
5
6
  baseUrl;
6
7
  token;
7
8
  vid;
8
- rv = 0;
9
9
  fetchClient;
10
- constructor(e, s) {
11
- this.baseUrl = e.baseUrl.endsWith("/") ? e.baseUrl.slice(0, -1) : e.baseUrl, this.token = e.token, this.fetchClient = e.fetchClient, this.vid = s.searchParams.get("b10cks_vid") || e.version || "published", this.rv = s.searchParams.get("b10cks_rv") ?? this.rv;
10
+ getRvFn;
11
+ setRvFn;
12
+ constructor(t, s) {
13
+ this.baseUrl = t.baseUrl.endsWith("/") ? t.baseUrl.slice(0, -1) : t.baseUrl, this.token = t.token, this.fetchClient = t.fetchClient, this.getRvFn = t.getRv, this.setRvFn = t.setRv, this.vid = s.searchParams.get("b10cks_vid") || t.version || "published", this.setRv(s.searchParams.get("b10cks_rv") || t.rv || a);
12
14
  }
13
- async get(e, s = {}) {
14
- const t = this.buildUrl(e, {
15
+ async get(t, s = {}) {
16
+ const e = this.buildUrl(t, {
15
17
  vid: this.vid,
16
18
  ...s,
17
- rv: this.rv,
19
+ rv: this.getRv(),
18
20
  token: this.token
19
- }), r = await this.fetchClient(t);
20
- return r.rv && (this.rv = r.rv), r;
21
+ }), r = await this.fetchClient(e);
22
+ return r.rv && this.setRv(r.rv), r;
21
23
  }
22
- async getAll(e, s = {}) {
23
- const t = await this.get(
24
- e,
25
- { ...s, page: 1 }
26
- );
27
- if (!t.meta || t.meta.last_page <= 1)
28
- return "data" in t ? t.data : t;
24
+ async getAll(t, s = {}) {
25
+ const e = await this.get(t, { ...s, page: 1 });
26
+ if (e.rv && this.setRv(e.rv), !e.meta || e.meta.last_page <= 1)
27
+ return "data" in e ? e.data : e;
29
28
  const r = Array.from(
30
- { length: t.meta.last_page },
31
- (i, l) => this.get(e, { ...s, page: l + 1 })
29
+ { length: e.meta.last_page },
30
+ (n, l) => this.get(t, { ...s, page: l + 1 })
32
31
  );
33
- return (await Promise.all(r)).flatMap((i) => i.data);
32
+ return (await Promise.all(r)).flatMap((n) => n.data);
33
+ }
34
+ setRv(t) {
35
+ this.setRvFn ? this.setRvFn(t) : a = t;
36
+ }
37
+ getRv() {
38
+ return this.getRvFn ? this.getRvFn() : a;
34
39
  }
35
- buildUrl(e, s) {
36
- const t = new URL(`${this.baseUrl}/v1/${e}`);
37
- return Object.entries(s).forEach(([r, a]) => {
38
- a != null && t.searchParams.append(r, String(a));
39
- }), t.toString();
40
+ buildUrl(t, s) {
41
+ const e = new URL(`${this.baseUrl}/v1/${t}`);
42
+ return Object.entries(s).forEach(([r, i]) => {
43
+ i != null && e.searchParams.append(r, String(i));
44
+ }), e.toString();
40
45
  }
41
46
  }
42
47
  export {
43
- h as ApiClient,
44
- c as types
48
+ c as ApiClient,
49
+ v as types
45
50
  };
46
51
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { B10cksApiClientOptions, IBBaseQueryParams, IBCollectionResponse, IBMeta, IBResponse, } from './types'\n\nexport type FetchClient = typeof fetch\nexport type Endpoint = 'blocks' | 'contents' | `contents/${string}` | `datasources/${string}/entries` | 'datasources' | 'spaces/me'\n\nexport * as types from './types'\nexport type { IBBlock, IBResponse, IBContent, B10cksApiClientOptions } from './types'\n\nexport class ApiClient {\n private readonly baseUrl: string\n private readonly token: string\n private readonly vid: string | null\n private rv: string | number = 0\n private readonly fetchClient: FetchClient\n\n constructor(options: B10cksApiClientOptions, url: URL) {\n this.baseUrl = options.baseUrl.endsWith('/') ? options.baseUrl.slice(0, -1) : options.baseUrl\n this.token = options.token\n this.fetchClient = options.fetchClient\n\n this.vid = url.searchParams.get('b10cks_vid') || options.version || 'published'\n this.rv = url.searchParams.get('b10cks_rv') ?? this.rv\n }\n\n async get<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T> {\n const url = this.buildUrl(endpoint, {\n vid: this.vid,\n ...params,\n rv: this.rv,\n token: this.token\n })\n\n const response = await this.fetchClient(url) as unknown as IBResponse<T>\n if (response.rv) {\n this.rv = response.rv\n }\n\n return response as T\n }\n\n async getAll<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T[]> {\n const response = await this.get<IBCollectionResponse<T> & { meta?: IBMeta }>(\n endpoint,\n { ...params, page: 1 }\n )\n\n if (!response.meta || response.meta.last_page <= 1) {\n return 'data' in response ? response.data : (response as unknown as T[])\n }\n\n const pageRequests = Array.from(\n { length: response.meta.last_page },\n (_, i) => this.get<IBCollectionResponse<T>>(endpoint, { ...params, page: i + 1 })\n )\n\n const allResponses = await Promise.all(pageRequests)\n\n return allResponses.flatMap(r => r.data)\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}"],"names":["ApiClient","options","url","endpoint","params","response","pageRequests","_","i","r","key","value"],"mappings":";;;AAQO,MAAMA,EAAU;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACT,KAAsB;AAAA,EACb;AAAA,EAEjB,YAAYC,GAAiCC,GAAU;AACrD,SAAK,UAAUD,EAAQ,QAAQ,SAAS,GAAG,IAAIA,EAAQ,QAAQ,MAAM,GAAG,EAAE,IAAIA,EAAQ,SACtF,KAAK,QAAQA,EAAQ,OACrB,KAAK,cAAcA,EAAQ,aAE3B,KAAK,MAAMC,EAAI,aAAa,IAAI,YAAY,KAAKD,EAAQ,WAAW,aACpE,KAAK,KAAKC,EAAI,aAAa,IAAI,WAAW,KAAK,KAAK;AAAA,EACtD;AAAA,EAEA,MAAM,IAAOC,GAAoBC,IAA2C,IAAgB;AAC1F,UAAMF,IAAM,KAAK,SAASC,GAAU;AAAA,MAClC,KAAK,KAAK;AAAA,MACV,GAAGC;AAAA,MACH,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,IAAA,CACb,GAEKC,IAAW,MAAM,KAAK,YAAYH,CAAG;AAC3C,WAAIG,EAAS,OACX,KAAK,KAAKA,EAAS,KAGdA;AAAA,EACT;AAAA,EAEA,MAAM,OAAUF,GAAoBC,IAA2C,IAAkB;AAC/F,UAAMC,IAAW,MAAM,KAAK;AAAA,MAC1BF;AAAA,MACA,EAAE,GAAGC,GAAQ,MAAM,EAAA;AAAA,IAAE;AAGvB,QAAI,CAACC,EAAS,QAAQA,EAAS,KAAK,aAAa;AAC/C,aAAO,UAAUA,IAAWA,EAAS,OAAQA;AAG/C,UAAMC,IAAe,MAAM;AAAA,MACzB,EAAE,QAAQD,EAAS,KAAK,UAAA;AAAA,MACxB,CAACE,GAAGC,MAAM,KAAK,IAA6BL,GAAU,EAAE,GAAGC,GAAQ,MAAMI,IAAI,EAAA,CAAG;AAAA,IAAA;AAKlF,YAFqB,MAAM,QAAQ,IAAIF,CAAY,GAE/B,QAAQ,CAAAG,MAAKA,EAAE,IAAI;AAAA,EACzC;AAAA,EAEQ,SAASN,GAAkBC,GAAyC;AAC1E,UAAMF,IAAM,IAAI,IAAI,GAAG,KAAK,OAAO,OAAOC,CAAQ,EAAE;AAEpD,kBAAO,QAAQC,CAAM,EAAE,QAAQ,CAAC,CAACM,GAAKC,CAAK,MAAM;AAC/C,MAA2BA,KAAU,QACnCT,EAAI,aAAa,OAAOQ,GAAK,OAAOC,CAAK,CAAC;AAAA,IAE9C,CAAC,GAEMT,EAAI,SAAA;AAAA,EACb;AACF;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { B10cksApiClientOptions, IBBaseQueryParams, IBCollectionResponse, IBMeta, IBResponse } from './types'\n\nexport type FetchClient = typeof fetch\nexport type Endpoint =\n | 'blocks'\n | 'contents'\n | `contents/${string}`\n | `datasources/${string}/entries`\n | 'datasources'\n | 'spaces/me'\n\nexport interface B10cksApiClientRvOptions {\n getRv?: () => string | number\n setRv?: (value: string | number) => void\n}\n\nexport type { B10cksApiClientOptions, IBBlock, IBContent, IBResponse } from './types'\nexport * as types from './types'\n\nlet rv: string | number = 0\n\nexport class ApiClient {\n private readonly baseUrl: string\n private readonly token: string\n private readonly vid: string | null\n private readonly fetchClient: FetchClient\n private readonly getRvFn?: () => string | number\n private readonly setRvFn?: (value: string | number) => void\n\n constructor(options: B10cksApiClientOptions, url: URL) {\n this.baseUrl = options.baseUrl.endsWith('/') ? options.baseUrl.slice(0, -1) : options.baseUrl\n this.token = options.token\n this.fetchClient = options.fetchClient\n this.getRvFn = options.getRv\n this.setRvFn = options.setRv\n\n this.vid = url.searchParams.get('b10cks_vid') || options.version || 'published'\n this.setRv(url.searchParams.get('b10cks_rv') || options.rv || rv)\n }\n\n async get<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T> {\n const url = this.buildUrl(endpoint, {\n vid: this.vid,\n ...params,\n rv: this.getRv(),\n token: this.token,\n })\n\n const response = (await this.fetchClient(url)) as unknown as IBResponse<T>\n if (response.rv) {\n this.setRv(response.rv)\n }\n\n return response as T\n }\n\n async getAll<T>(endpoint: Endpoint, params: Omit<IBBaseQueryParams, 'token'> = {}): Promise<T[]> {\n const response = await this.get<IBCollectionResponse<T> & { meta?: IBMeta }>(endpoint, { ...params, page: 1 })\n if (response.rv) {\n this.setRv(response.rv)\n }\n\n if (!response.meta || response.meta.last_page <= 1) {\n return 'data' in response ? response.data : (response as unknown as T[])\n }\n\n const pageRequests = Array.from({ length: response.meta.last_page }, (_, i) =>\n this.get<IBCollectionResponse<T>>(endpoint, { ...params, page: i + 1 })\n )\n\n const allResponses = await Promise.all(pageRequests)\n\n return allResponses.flatMap((r) => r.data)\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 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"],"names":["rv","ApiClient","options","url","endpoint","params","response","pageRequests","_","i","r","value","key"],"mappings":";;;AAmBA,IAAIA,IAAsB;AAEnB,MAAMC,EAAU;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAYC,GAAiCC,GAAU;AACrD,SAAK,UAAUD,EAAQ,QAAQ,SAAS,GAAG,IAAIA,EAAQ,QAAQ,MAAM,GAAG,EAAE,IAAIA,EAAQ,SACtF,KAAK,QAAQA,EAAQ,OACrB,KAAK,cAAcA,EAAQ,aAC3B,KAAK,UAAUA,EAAQ,OACvB,KAAK,UAAUA,EAAQ,OAEvB,KAAK,MAAMC,EAAI,aAAa,IAAI,YAAY,KAAKD,EAAQ,WAAW,aACpE,KAAK,MAAMC,EAAI,aAAa,IAAI,WAAW,KAAKD,EAAQ,MAAMF,CAAE;AAAA,EAClE;AAAA,EAEA,MAAM,IAAOI,GAAoBC,IAA2C,IAAgB;AAC1F,UAAMF,IAAM,KAAK,SAASC,GAAU;AAAA,MAClC,KAAK,KAAK;AAAA,MACV,GAAGC;AAAA,MACH,IAAI,KAAK,MAAA;AAAA,MACT,OAAO,KAAK;AAAA,IAAA,CACb,GAEKC,IAAY,MAAM,KAAK,YAAYH,CAAG;AAC5C,WAAIG,EAAS,MACX,KAAK,MAAMA,EAAS,EAAE,GAGjBA;AAAA,EACT;AAAA,EAEA,MAAM,OAAUF,GAAoBC,IAA2C,IAAkB;AAC/F,UAAMC,IAAW,MAAM,KAAK,IAAiDF,GAAU,EAAE,GAAGC,GAAQ,MAAM,GAAG;AAK7G,QAJIC,EAAS,MACX,KAAK,MAAMA,EAAS,EAAE,GAGpB,CAACA,EAAS,QAAQA,EAAS,KAAK,aAAa;AAC/C,aAAO,UAAUA,IAAWA,EAAS,OAAQA;AAG/C,UAAMC,IAAe,MAAM;AAAA,MAAK,EAAE,QAAQD,EAAS,KAAK,UAAA;AAAA,MAAa,CAACE,GAAGC,MACvE,KAAK,IAA6BL,GAAU,EAAE,GAAGC,GAAQ,MAAMI,IAAI,EAAA,CAAG;AAAA,IAAA;AAKxE,YAFqB,MAAM,QAAQ,IAAIF,CAAY,GAE/B,QAAQ,CAACG,MAAMA,EAAE,IAAI;AAAA,EAC3C;AAAA,EAEA,MAAMC,GAAwB;AAC5B,IAAI,KAAK,UACP,KAAK,QAAQA,CAAK,IAElBX,IAAKW;AAAA,EAET;AAAA,EAEA,QAAQ;AACN,WAAI,KAAK,UACA,KAAK,QAAA,IAEPX;AAAA,EACT;AAAA,EAEQ,SAASI,GAAkBC,GAAyC;AAC1E,UAAMF,IAAM,IAAI,IAAI,GAAG,KAAK,OAAO,OAAOC,CAAQ,EAAE;AAEpD,kBAAO,QAAQC,CAAM,EAAE,QAAQ,CAAC,CAACO,GAAKD,CAAK,MAAM;AAC/C,MAA2BA,KAAU,QACnCR,EAAI,aAAa,OAAOS,GAAK,OAAOD,CAAK,CAAC;AAAA,IAE9C,CAAC,GAEMR,EAAI,SAAA;AAAA,EACb;AACF;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@b10cks/client",
3
3
  "license": "MIT",
4
- "version": "0.9.6",
4
+ "version": "0.10.1",
5
5
  "author": "Michael Wallner @ Coder's Cantina",
6
6
  "description": "Core b10cks API client",
7
7
  "type": "module",
@@ -26,8 +26,8 @@
26
26
  "dist"
27
27
  ],
28
28
  "devDependencies": {
29
- "chalk": "^5.6.0",
30
- "vite": "^7.1.4",
29
+ "chalk": "^5.6.2",
30
+ "vite": "^7.2.4",
31
31
  "vite-plugin-banner": "^0.8.1",
32
32
  "vite-plugin-dts": "^4.5.4",
33
33
  "vitest": "^3.2.4"
@@ -44,7 +44,7 @@
44
44
  "build": "vite build",
45
45
  "dev": "vite build --watch",
46
46
  "test": "vitest",
47
- "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts --fix",
47
+ "lint": "biome lint --write .",
48
48
  "clean": "rm -rf dist"
49
49
  }
50
50
  }