@sleekcms/client 2.4.0 → 3.0.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
@@ -13,9 +13,9 @@ npm install @sleekcms/client
13
13
  ## Quick Start
14
14
 
15
15
  ```typescript
16
- import { createClient } from '@sleekcms/client';
16
+ import { createSyncClient } from '@sleekcms/client';
17
17
 
18
- const client = await createClient({
18
+ const client = await createSyncClient({
19
19
  siteToken: 'your-site-token',
20
20
  env: 'latest'
21
21
  });
@@ -34,11 +34,11 @@ const footer = client.getEntry('footer');
34
34
 
35
35
  ### Sync Client (Recommended for SSG)
36
36
 
37
- **`createClient()`** fetches all content upfront and returns a client with synchronous methods. Best for static site generation where you build once and want instant access to content.
37
+ **`createSyncClient()`** fetches all content upfront and returns a client with synchronous methods. Best for static site generation where you build once and want instant access to content.
38
38
 
39
39
  ```typescript
40
40
  // Async initialization, sync usage
41
- const client = await createClient({
41
+ const client = await createSyncClient({
42
42
  siteToken: 'your-site-token'
43
43
  });
44
44
 
@@ -59,7 +59,7 @@ const slugs = client.getSlugs('/blog');
59
59
  ```typescript
60
60
  const client = createAsyncClient({
61
61
  siteToken: 'your-site-token',
62
- cdn: true // optional: cache-friendly URLs
62
+ resolveEnv: true // optional: cache-friendly URLs
63
63
  });
64
64
 
65
65
  // All methods are async
@@ -78,8 +78,8 @@ const posts = await client.getPages('/blog');
78
78
  |--------|------|---------|-------------|
79
79
  | `siteToken` | `string` | required | Your site token from SleekCMS |
80
80
  | `env` | `string` | `'latest'` | Environment/alias name |
81
- | `cdn` | `boolean` | `false` | Resolve env name to bypass CDN cache. Adds latency. |
82
- | `lang` | `string` | - | Language code for internationalized content (e.g., `'en'`, `'es'`, `'fr'`) |
81
+ | `resolveEnv` | `boolean` | `false` | Env is an alias to version. This flag resolves env to version tag, so as to bypass CDN cache. Add's some latency.|
82
+ | `lang` | `string` | - | Language code for internationalized content |
83
83
  | `cache` | `SyncCacheAdapter \| AsyncCacheAdapter` | In-memory cache | Custom cache adapter for storing fetched content |
84
84
  | `cacheMinutes` | `number` | - | Cache expiration time in minutes. If not set, cache never expires |
85
85
 
@@ -87,7 +87,7 @@ const posts = await client.getPages('/blog');
87
87
 
88
88
  ```typescript
89
89
  // Fetch Spanish content
90
- const client = await createClient({
90
+ const client = await createSyncClient({
91
91
  siteToken: 'your-site-token',
92
92
  lang: 'es'
93
93
  });
@@ -103,7 +103,7 @@ The client includes built-in caching support to improve performance and reduce A
103
103
  ### Default In-Memory Cache
104
104
 
105
105
  ```typescript
106
- const client = await createClient({
106
+ const client = await createSyncClient({
107
107
  siteToken: 'your-site-token'
108
108
  });
109
109
  // Uses built-in memory cache automatically
@@ -112,7 +112,7 @@ const client = await createClient({
112
112
  ### Using localStorage
113
113
 
114
114
  ```typescript
115
- const client = await createClient({
115
+ const client = await createSyncClient({
116
116
  siteToken: 'your-site-token',
117
117
  cache: localStorage, // Use browser's localStorage
118
118
  cacheMinutes: 60*24 // Cache expires after 1 day
@@ -142,7 +142,7 @@ interface AsyncCacheAdapter {
142
142
  Use `cacheMinutes` to set when cached content expires:
143
143
 
144
144
  ```typescript
145
- const client = await createClient({
145
+ const client = await createSyncClient({
146
146
  siteToken: 'your-site-token',
147
147
  cache: localStorage,
148
148
  cacheMinutes: 60*24 // Cache expires after 1 day
@@ -228,10 +228,10 @@ const categories = client.getOptions('categories');
228
228
 
229
229
  ```typescript
230
230
  // app/blog/page.tsx
231
- import { createClient } from '@sleekcms/client';
231
+ import { createSyncClient } from '@sleekcms/client';
232
232
 
233
233
  export default async function BlogPage() {
234
- const client = await createClient({
234
+ const client = await createSyncClient({
235
235
  siteToken: process.env.SLEEKCMS_SITE_TOKEN!
236
236
  });
237
237
 
@@ -253,10 +253,10 @@ export default async function BlogPage() {
253
253
 
254
254
  ```typescript
255
255
  // app/blog/[slug]/page.tsx
256
- import { createClient } from '@sleekcms/client';
256
+ import { createSyncClient } from '@sleekcms/client';
257
257
 
258
258
  export async function generateStaticParams() {
259
- const client = await createClient({
259
+ const client = await createSyncClient({
260
260
  siteToken: process.env.SLEEKCMS_SITE_TOKEN!
261
261
  });
262
262
 
@@ -266,7 +266,7 @@ export async function generateStaticParams() {
266
266
  }
267
267
 
268
268
  export default async function Post({ params }: { params: { slug: string } }) {
269
- const client = await createClient({
269
+ const client = await createSyncClient({
270
270
  siteToken: process.env.SLEEKCMS_SITE_TOKEN!
271
271
  });
272
272
 
@@ -284,7 +284,7 @@ import { createAsyncClient } from '@sleekcms/client';
284
284
 
285
285
  const client = createAsyncClient({
286
286
  siteToken: process.env.SLEEKCMS_SITE_TOKEN,
287
- cdn: true
287
+ resolveEnv: true
288
288
  });
289
289
 
290
290
  export async function load() {
@@ -298,9 +298,9 @@ export async function load() {
298
298
  ```astro
299
299
  ---
300
300
  // src/pages/blog/index.astro
301
- import { createClient } from '@sleekcms/client';
301
+ import { createSyncClient } from '@sleekcms/client';
302
302
 
303
- const client = await createClient({
303
+ const client = await createSyncClient({
304
304
  siteToken: import.meta.env.SLEEKCMS_SITE_TOKEN
305
305
  });
306
306
 
package/index.cjs CHANGED
@@ -30,7 +30,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  var index_exports = {};
31
31
  __export(index_exports, {
32
32
  createAsyncClient: () => createAsyncClient,
33
- createClient: () => createClient
33
+ createSyncClient: () => createSyncClient
34
34
  });
35
35
  module.exports = __toCommonJS(index_exports);
36
36
 
@@ -77,16 +77,20 @@ async function fetchEnvTag({ siteToken, env }) {
77
77
  return env;
78
78
  }
79
79
  async function fetchSiteContent(options) {
80
- const { siteToken, env = "latest", cdn = false, search: search2, lang, cache, cacheMinutes } = options;
80
+ const { siteToken, env = "latest", resolveEnv = false, search: search2, lang, cache, cacheMinutes } = options;
81
81
  let url = getUrl({ siteToken, env, search: search2, lang });
82
- if (!cdn) {
82
+ if (!resolveEnv) {
83
83
  const cacheKey2 = `${siteToken}:${env}`;
84
84
  let tag = envTagCache.get(cacheKey2);
85
- if (!tag) {
86
- tag = await fetchEnvTag({ siteToken, env });
87
- envTagCache.set(cacheKey2, tag);
85
+ try {
86
+ if (!tag) {
87
+ tag = await fetchEnvTag({ siteToken, env });
88
+ envTagCache.set(cacheKey2, tag);
89
+ }
90
+ url = getUrl({ siteToken, env: tag, search: search2, lang });
91
+ } catch (error) {
92
+ console.warn("[SleekCMS] Failed to resolve env tag, using cached content instead.");
88
93
  }
89
- url = getUrl({ siteToken, env: tag, search: search2, lang });
90
94
  }
91
95
  const cacheKey = url;
92
96
  const fetchAndCache = async () => {
@@ -129,7 +133,11 @@ async function fetchSiteContent(options) {
129
133
  const expiryMs = cacheMinutes * 60 * 1e3;
130
134
  const age = now - cachedData._ts;
131
135
  if (age >= expiryMs) {
132
- return await fetchAndCache();
136
+ try {
137
+ return await fetchAndCache();
138
+ } catch (error) {
139
+ console.warn("[SleekCMS] Fetch failed, using expired cache:", error);
140
+ }
133
141
  }
134
142
  }
135
143
  return cachedData.data;
@@ -174,7 +182,7 @@ var MemoryCache = class {
174
182
  this.cache.set(key, value);
175
183
  }
176
184
  };
177
- async function createClient(options) {
185
+ async function createSyncClient(options) {
178
186
  const cache = options.cache ?? new MemoryCache();
179
187
  const data = await fetchSiteContent({ ...options, cache });
180
188
  function getContent(query) {
@@ -232,26 +240,26 @@ async function createClient(options) {
232
240
  };
233
241
  }
234
242
  function createAsyncClient(options) {
235
- const { siteToken, env = "latest", cdn, lang } = options;
243
+ const { siteToken, env = "latest", resolveEnv, lang } = options;
236
244
  const cache = options.cache ?? new MemoryCache();
237
245
  let syncClient = null;
238
246
  async function getContent(search2) {
239
247
  if (!search2 && !syncClient) {
240
- syncClient = await createClient({ siteToken, env, cdn, lang, cache });
248
+ syncClient = await createSyncClient({ siteToken, env, resolveEnv, lang, cache });
241
249
  }
242
250
  if (syncClient) return syncClient.getContent(search2);
243
251
  if (!search2) return null;
244
- return await fetchSiteContent({ siteToken, env, search: search2, lang, cache, cdn });
252
+ return await fetchSiteContent({ siteToken, env, search: search2, lang, cache, resolveEnv });
245
253
  }
246
254
  async function getPages(path) {
247
255
  if (syncClient) return syncClient.getPages(path);
248
- const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, cdn });
256
+ const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, resolveEnv });
249
257
  if (!path) return pages;
250
258
  else return filterPagesByPath(pages, path);
251
259
  }
252
260
  async function getPage(path) {
253
261
  if (syncClient) return syncClient.getPage(path);
254
- const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, cdn });
262
+ const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, resolveEnv });
255
263
  const page = pages == null ? void 0 : pages.find((p) => {
256
264
  const pth = typeof p._path === "string" ? p._path : "";
257
265
  return pth === path;
@@ -261,21 +269,21 @@ function createAsyncClient(options) {
261
269
  async function getEntry(handle) {
262
270
  if (syncClient) return syncClient.getEntry(handle);
263
271
  let search2 = `entries.${handle}`;
264
- return await fetchSiteContent({ siteToken, env, search: search2, lang, cache, cdn });
272
+ return await fetchSiteContent({ siteToken, env, search: search2, lang, cache, resolveEnv });
265
273
  }
266
274
  async function getSlugs(path) {
267
275
  if (syncClient) return syncClient.getSlugs(path);
268
- const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, cdn });
276
+ const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, resolveEnv });
269
277
  return extractSlugs(pages, path);
270
278
  }
271
279
  async function getImage(name) {
272
280
  if (syncClient) return syncClient.getImage(name);
273
- const images = await fetchSiteContent({ siteToken, env, search: "images", lang, cache, cdn });
281
+ const images = await fetchSiteContent({ siteToken, env, search: "images", lang, cache, resolveEnv });
274
282
  return images ? images[name] : null;
275
283
  }
276
284
  async function getOptions(name) {
277
285
  if (syncClient) return syncClient.getOptions(name);
278
- const options2 = await fetchSiteContent({ siteToken, env, search: "options", lang, cache, cdn });
286
+ const options2 = await fetchSiteContent({ siteToken, env, search: "options", lang, cache, resolveEnv });
279
287
  const optionSet = options2[name];
280
288
  return Array.isArray(optionSet) ? optionSet : null;
281
289
  }
@@ -301,5 +309,5 @@ function createAsyncClient(options) {
301
309
  // Annotate the CommonJS export names for ESM import in node:
302
310
  0 && (module.exports = {
303
311
  createAsyncClient,
304
- createClient
312
+ createSyncClient
305
313
  });
package/index.d.cts CHANGED
@@ -33,7 +33,7 @@ interface AsyncCacheAdapter {
33
33
  interface ClientOptions {
34
34
  siteToken: string;
35
35
  env?: string;
36
- cdn?: boolean;
36
+ resolveEnv?: boolean;
37
37
  lang?: string;
38
38
  cache?: SyncCacheAdapter | AsyncCacheAdapter;
39
39
  cacheMinutes?: number;
@@ -59,7 +59,7 @@ interface SleekAsyncClient {
59
59
  _getEnvTag(): Promise<string>;
60
60
  }
61
61
 
62
- declare function createClient(options: ClientOptions): Promise<SleekClient>;
62
+ declare function createSyncClient(options: ClientOptions): Promise<SleekClient>;
63
63
  declare function createAsyncClient(options: ClientOptions): SleekAsyncClient | any;
64
64
 
65
- export { type AsyncCacheAdapter, type ClientOptions, type Entry, type Image, type Options, type Page, type SleekAsyncClient, type SleekClient, type SleekSiteContent, type SyncCacheAdapter, createAsyncClient, createClient };
65
+ export { type AsyncCacheAdapter, type ClientOptions, type Entry, type Image, type Options, type Page, type SleekAsyncClient, type SleekClient, type SleekSiteContent, type SyncCacheAdapter, createAsyncClient, createSyncClient };
package/index.d.ts CHANGED
@@ -33,7 +33,7 @@ interface AsyncCacheAdapter {
33
33
  interface ClientOptions {
34
34
  siteToken: string;
35
35
  env?: string;
36
- cdn?: boolean;
36
+ resolveEnv?: boolean;
37
37
  lang?: string;
38
38
  cache?: SyncCacheAdapter | AsyncCacheAdapter;
39
39
  cacheMinutes?: number;
@@ -59,7 +59,7 @@ interface SleekAsyncClient {
59
59
  _getEnvTag(): Promise<string>;
60
60
  }
61
61
 
62
- declare function createClient(options: ClientOptions): Promise<SleekClient>;
62
+ declare function createSyncClient(options: ClientOptions): Promise<SleekClient>;
63
63
  declare function createAsyncClient(options: ClientOptions): SleekAsyncClient | any;
64
64
 
65
- export { type AsyncCacheAdapter, type ClientOptions, type Entry, type Image, type Options, type Page, type SleekAsyncClient, type SleekClient, type SleekSiteContent, type SyncCacheAdapter, createAsyncClient, createClient };
65
+ export { type AsyncCacheAdapter, type ClientOptions, type Entry, type Image, type Options, type Page, type SleekAsyncClient, type SleekClient, type SleekSiteContent, type SyncCacheAdapter, createAsyncClient, createSyncClient };
package/index.mjs CHANGED
@@ -41,16 +41,20 @@ async function fetchEnvTag({ siteToken, env }) {
41
41
  return env;
42
42
  }
43
43
  async function fetchSiteContent(options) {
44
- const { siteToken, env = "latest", cdn = false, search: search2, lang, cache, cacheMinutes } = options;
44
+ const { siteToken, env = "latest", resolveEnv = false, search: search2, lang, cache, cacheMinutes } = options;
45
45
  let url = getUrl({ siteToken, env, search: search2, lang });
46
- if (!cdn) {
46
+ if (!resolveEnv) {
47
47
  const cacheKey2 = `${siteToken}:${env}`;
48
48
  let tag = envTagCache.get(cacheKey2);
49
- if (!tag) {
50
- tag = await fetchEnvTag({ siteToken, env });
51
- envTagCache.set(cacheKey2, tag);
49
+ try {
50
+ if (!tag) {
51
+ tag = await fetchEnvTag({ siteToken, env });
52
+ envTagCache.set(cacheKey2, tag);
53
+ }
54
+ url = getUrl({ siteToken, env: tag, search: search2, lang });
55
+ } catch (error) {
56
+ console.warn("[SleekCMS] Failed to resolve env tag, using cached content instead.");
52
57
  }
53
- url = getUrl({ siteToken, env: tag, search: search2, lang });
54
58
  }
55
59
  const cacheKey = url;
56
60
  const fetchAndCache = async () => {
@@ -93,7 +97,11 @@ async function fetchSiteContent(options) {
93
97
  const expiryMs = cacheMinutes * 60 * 1e3;
94
98
  const age = now - cachedData._ts;
95
99
  if (age >= expiryMs) {
96
- return await fetchAndCache();
100
+ try {
101
+ return await fetchAndCache();
102
+ } catch (error) {
103
+ console.warn("[SleekCMS] Fetch failed, using expired cache:", error);
104
+ }
97
105
  }
98
106
  }
99
107
  return cachedData.data;
@@ -138,7 +146,7 @@ var MemoryCache = class {
138
146
  this.cache.set(key, value);
139
147
  }
140
148
  };
141
- async function createClient(options) {
149
+ async function createSyncClient(options) {
142
150
  const cache = options.cache ?? new MemoryCache();
143
151
  const data = await fetchSiteContent({ ...options, cache });
144
152
  function getContent(query) {
@@ -196,26 +204,26 @@ async function createClient(options) {
196
204
  };
197
205
  }
198
206
  function createAsyncClient(options) {
199
- const { siteToken, env = "latest", cdn, lang } = options;
207
+ const { siteToken, env = "latest", resolveEnv, lang } = options;
200
208
  const cache = options.cache ?? new MemoryCache();
201
209
  let syncClient = null;
202
210
  async function getContent(search2) {
203
211
  if (!search2 && !syncClient) {
204
- syncClient = await createClient({ siteToken, env, cdn, lang, cache });
212
+ syncClient = await createSyncClient({ siteToken, env, resolveEnv, lang, cache });
205
213
  }
206
214
  if (syncClient) return syncClient.getContent(search2);
207
215
  if (!search2) return null;
208
- return await fetchSiteContent({ siteToken, env, search: search2, lang, cache, cdn });
216
+ return await fetchSiteContent({ siteToken, env, search: search2, lang, cache, resolveEnv });
209
217
  }
210
218
  async function getPages(path) {
211
219
  if (syncClient) return syncClient.getPages(path);
212
- const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, cdn });
220
+ const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, resolveEnv });
213
221
  if (!path) return pages;
214
222
  else return filterPagesByPath(pages, path);
215
223
  }
216
224
  async function getPage(path) {
217
225
  if (syncClient) return syncClient.getPage(path);
218
- const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, cdn });
226
+ const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, resolveEnv });
219
227
  const page = pages == null ? void 0 : pages.find((p) => {
220
228
  const pth = typeof p._path === "string" ? p._path : "";
221
229
  return pth === path;
@@ -225,21 +233,21 @@ function createAsyncClient(options) {
225
233
  async function getEntry(handle) {
226
234
  if (syncClient) return syncClient.getEntry(handle);
227
235
  let search2 = `entries.${handle}`;
228
- return await fetchSiteContent({ siteToken, env, search: search2, lang, cache, cdn });
236
+ return await fetchSiteContent({ siteToken, env, search: search2, lang, cache, resolveEnv });
229
237
  }
230
238
  async function getSlugs(path) {
231
239
  if (syncClient) return syncClient.getSlugs(path);
232
- const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, cdn });
240
+ const pages = await fetchSiteContent({ siteToken, env, search: "pages", lang, cache, resolveEnv });
233
241
  return extractSlugs(pages, path);
234
242
  }
235
243
  async function getImage(name) {
236
244
  if (syncClient) return syncClient.getImage(name);
237
- const images = await fetchSiteContent({ siteToken, env, search: "images", lang, cache, cdn });
245
+ const images = await fetchSiteContent({ siteToken, env, search: "images", lang, cache, resolveEnv });
238
246
  return images ? images[name] : null;
239
247
  }
240
248
  async function getOptions(name) {
241
249
  if (syncClient) return syncClient.getOptions(name);
242
- const options2 = await fetchSiteContent({ siteToken, env, search: "options", lang, cache, cdn });
250
+ const options2 = await fetchSiteContent({ siteToken, env, search: "options", lang, cache, resolveEnv });
243
251
  const optionSet = options2[name];
244
252
  return Array.isArray(optionSet) ? optionSet : null;
245
253
  }
@@ -264,5 +272,5 @@ function createAsyncClient(options) {
264
272
  }
265
273
  export {
266
274
  createAsyncClient,
267
- createClient
275
+ createSyncClient
268
276
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleekcms/client",
3
- "version": "2.4.0",
3
+ "version": "3.0.0",
4
4
  "description": "Official SleekCMS content client for Node 18+ and browser",
5
5
  "type": "module",
6
6
  "main": "index.cjs",