@storyblok/management-api-client 0.1.2 → 0.1.4

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.
@@ -1,7 +1,7 @@
1
1
  import { Client, Config } from "./types.mjs";
2
2
 
3
3
  //#region src/client/client.d.ts
4
- declare const createClient: (config?: Config) => Client;
4
+ declare const createClient: (config: Config) => Client;
5
5
  //#endregion
6
6
  export { createClient };
7
7
  //# sourceMappingURL=client.d.mts.map
@@ -1,7 +1,7 @@
1
1
  import { Client, Config } from "./types.js";
2
2
 
3
3
  //#region src/client/client.d.ts
4
- declare const createClient: (config?: Config) => Client;
4
+ declare const createClient: (config: Config) => Client;
5
5
  //#endregion
6
6
  export { createClient };
7
7
  //# sourceMappingURL=client.d.ts.map
@@ -3,7 +3,7 @@ const require_utils = require('./utils.js');
3
3
  const __storyblok_region_helper = require_rolldown_runtime.__toESM(require("@storyblok/region-helper"));
4
4
 
5
5
  //#region src/client/client.ts
6
- const createClient = (config = {}) => {
6
+ const createClient = (config) => {
7
7
  let _config = require_utils.mergeConfigs(require_utils.createConfig(), config);
8
8
  const getConfig = () => ({ ..._config });
9
9
  const setConfig = (config$1) => {
@@ -19,9 +19,9 @@ const createClient = (config = {}) => {
19
19
  headers: require_utils.mergeHeaders(_config.headers, options.headers)
20
20
  };
21
21
  if (!_config.baseUrl && options.path?.space_id) {
22
- const region = (0, __storyblok_region_helper.getRegion)(options.path.space_id);
22
+ const region = (0, __storyblok_region_helper.getRegion)(options.path.space_id, opts.region);
23
23
  if (region) opts.baseUrl = (0, __storyblok_region_helper.getManagementBaseUrl)(region, "https");
24
- }
24
+ } else if (opts.region) opts.baseUrl = (0, __storyblok_region_helper.getManagementBaseUrl)(opts.region, "https");
25
25
  if (opts.security) await require_utils.setAuthParams({
26
26
  ...opts,
27
27
  security: opts.security
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["config: Config","mergeConfigs","createConfig","config","createInterceptors","request: Client['request']","mergeHeaders","setAuthParams","buildUrl","requestInit: ReqInit","request","getParseAs","data: any","jsonError: unknown","fetchFn: any","url: string","retryConfig: { maxRetries: number; retryDelay: number }","attempt: number"],"sources":["../../src/client/client.ts"],"sourcesContent":["import { getManagementBaseUrl, getRegion } from '@storyblok/region-helper';\nimport type { Client, Config, RequestOptions } from './types';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils';\n\ntype ReqInit = Omit<RequestInit, 'body' | 'headers'> & {\n body?: any;\n headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<\n Request,\n Response,\n unknown,\n RequestOptions\n >();\n\n const request: Client['request'] = async (options) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n };\n\n // If the baseUrl is not set and we have a space_id, we can attempt toinfer the region\n if (!_config.baseUrl && options.path?.space_id) {\n const region = getRegion(options.path.space_id as number);\n if (region) {\n opts.baseUrl = getManagementBaseUrl(region, 'https');\n }\n }\n\n if (opts.security) {\n await setAuthParams({\n ...opts,\n security: opts.security,\n });\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body && opts.bodySerializer) {\n opts.body = opts.bodySerializer(opts.body);\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.body === '') {\n opts.headers.delete('Content-Type');\n }\n\n const url = buildUrl(opts);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n };\n\n let request = new Request(url, requestInit);\n\n for (const fn of interceptors.request._fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n \n // Execute with retry logic by recreating the request for each attempt\n let response = await executeWithRetry(_fetch, url, requestInit, {\n maxRetries: 3,\n retryDelay: 1000\n });\n\n for (const fn of interceptors.response._fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n if (\n response.status === 204 ||\n response.headers.get('Content-Length') === '0'\n ) {\n return opts.responseStyle === 'data'\n ? {}\n : {\n data: {},\n ...result,\n };\n }\n\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'json':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n const error = jsonError ?? textError;\n let finalError = error;\n\n for (const fn of interceptors.error._fns) {\n if (fn) {\n finalError = (await fn(error, response, request, opts)) as string;\n }\n }\n\n finalError = finalError || ({} as string);\n\n if (opts.throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return opts.responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n ...result,\n };\n };\n\n // Helper function to execute fetch with retry logic\n async function executeWithRetry(\n fetchFn: any,\n url: string,\n requestInit: ReqInit,\n retryConfig: { maxRetries: number; retryDelay: number },\n attempt: number = 0\n ): Promise<Response> {\n try {\n const request = new Request(url, requestInit);\n const response = await fetchFn(request);\n \n if (response.status === 429 && attempt < retryConfig.maxRetries) {\n const retryAfter = response.headers.get('retry-after');\n const delay = retryAfter ? parseInt(retryAfter) * 1000 : retryConfig.retryDelay;\n \n await new Promise(resolve => setTimeout(resolve, delay));\n \n // Use the original unconsumed request for retry\n return executeWithRetry(fetchFn, url, requestInit, retryConfig, attempt + 1);\n }\n \n return response;\n } catch (error) {\n // If it's a network error and we haven't exceeded retries, try again\n if (attempt < retryConfig.maxRetries) {\n const delay = retryConfig.retryDelay;\n await new Promise(resolve => setTimeout(resolve, delay));\n \n // Use the original unconsumed request for retry\n return executeWithRetry(fetchFn, url, requestInit, retryConfig, attempt + 1);\n }\n \n throw error;\n }\n }\n\n return {\n buildUrl,\n connect: (options) => request({ ...options, method: 'CONNECT' }),\n delete: (options) => request({ ...options, method: 'DELETE' }),\n get: (options) => request({ ...options, method: 'GET' }),\n getConfig,\n head: (options) => request({ ...options, method: 'HEAD' }),\n interceptors,\n options: (options) => request({ ...options, method: 'OPTIONS' }),\n patch: (options) => request({ ...options, method: 'PATCH' }),\n post: (options) => request({ ...options, method: 'POST' }),\n put: (options) => request({ ...options, method: 'PUT' }),\n request,\n setConfig,\n trace: (options) => request({ ...options, method: 'TRACE' }),\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["config: Config","mergeConfigs","createConfig","config","createInterceptors","request: Client['request']","mergeHeaders","setAuthParams","buildUrl","requestInit: ReqInit","request","getParseAs","data: any","jsonError: unknown","fetchFn: any","url: string","retryConfig: { maxRetries: number; retryDelay: number }","attempt: number"],"sources":["../../src/client/client.ts"],"sourcesContent":["import { getManagementBaseUrl, getRegion } from '@storyblok/region-helper';\nimport type { Client, Config, RequestOptions } from './types';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils';\n\ntype ReqInit = Omit<RequestInit, 'body' | 'headers'> & {\n body?: any;\n headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<\n Request,\n Response,\n unknown,\n RequestOptions\n >();\n\n const request: Client['request'] = async (options) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n };\n\n\n // If the baseUrl is not set and we have a space_id, we can attempt toinfer the region\n if (!_config.baseUrl && options.path?.space_id) {\n const region = getRegion(options.path.space_id as number, opts.region);\n if (region) {\n opts.baseUrl = getManagementBaseUrl(region, 'https');\n }\n } else if (opts.region) {\n opts.baseUrl = getManagementBaseUrl(opts.region, 'https');\n }\n\n if (opts.security) {\n await setAuthParams({\n ...opts,\n security: opts.security,\n });\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body && opts.bodySerializer) {\n opts.body = opts.bodySerializer(opts.body);\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.body === '') {\n opts.headers.delete('Content-Type');\n }\n\n const url = buildUrl(opts);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n };\n\n let request = new Request(url, requestInit);\n\n for (const fn of interceptors.request._fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n \n // Execute with retry logic by recreating the request for each attempt\n let response = await executeWithRetry(_fetch, url, requestInit, {\n maxRetries: 3,\n retryDelay: 1000\n });\n\n for (const fn of interceptors.response._fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n if (\n response.status === 204 ||\n response.headers.get('Content-Length') === '0'\n ) {\n return opts.responseStyle === 'data'\n ? {}\n : {\n data: {},\n ...result,\n };\n }\n\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'json':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n const error = jsonError ?? textError;\n let finalError = error;\n\n for (const fn of interceptors.error._fns) {\n if (fn) {\n finalError = (await fn(error, response, request, opts)) as string;\n }\n }\n\n finalError = finalError || ({} as string);\n\n if (opts.throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return opts.responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n ...result,\n };\n };\n\n // Helper function to execute fetch with retry logic\n async function executeWithRetry(\n fetchFn: any,\n url: string,\n requestInit: ReqInit,\n retryConfig: { maxRetries: number; retryDelay: number },\n attempt: number = 0\n ): Promise<Response> {\n try {\n const request = new Request(url, requestInit);\n const response = await fetchFn(request);\n \n if (response.status === 429 && attempt < retryConfig.maxRetries) {\n const retryAfter = response.headers.get('retry-after');\n const delay = retryAfter ? parseInt(retryAfter) * 1000 : retryConfig.retryDelay;\n \n await new Promise(resolve => setTimeout(resolve, delay));\n \n // Use the original unconsumed request for retry\n return executeWithRetry(fetchFn, url, requestInit, retryConfig, attempt + 1);\n }\n \n return response;\n } catch (error) {\n // If it's a network error and we haven't exceeded retries, try again\n if (attempt < retryConfig.maxRetries) {\n const delay = retryConfig.retryDelay;\n await new Promise(resolve => setTimeout(resolve, delay));\n \n // Use the original unconsumed request for retry\n return executeWithRetry(fetchFn, url, requestInit, retryConfig, attempt + 1);\n }\n \n throw error;\n }\n }\n\n return {\n buildUrl,\n connect: (options) => request({ ...options, method: 'CONNECT' }),\n delete: (options) => request({ ...options, method: 'DELETE' }),\n get: (options) => request({ ...options, method: 'GET' }),\n getConfig,\n head: (options) => request({ ...options, method: 'HEAD' }),\n interceptors,\n options: (options) => request({ ...options, method: 'OPTIONS' }),\n patch: (options) => request({ ...options, method: 'PATCH' }),\n post: (options) => request({ ...options, method: 'POST' }),\n put: (options) => request({ ...options, method: 'PUT' }),\n request,\n setConfig,\n trace: (options) => request({ ...options, method: 'TRACE' }),\n };\n};\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { buildUrl, createConfig, createInterceptors, getParseAs, mergeConfigs, m
2
2
  import { getManagementBaseUrl, getRegion } from "@storyblok/region-helper";
3
3
 
4
4
  //#region src/client/client.ts
5
- const createClient = (config = {}) => {
5
+ const createClient = (config) => {
6
6
  let _config = mergeConfigs(createConfig(), config);
7
7
  const getConfig = () => ({ ..._config });
8
8
  const setConfig = (config$1) => {
@@ -18,9 +18,9 @@ const createClient = (config = {}) => {
18
18
  headers: mergeHeaders(_config.headers, options.headers)
19
19
  };
20
20
  if (!_config.baseUrl && options.path?.space_id) {
21
- const region = getRegion(options.path.space_id);
21
+ const region = getRegion(options.path.space_id, opts.region);
22
22
  if (region) opts.baseUrl = getManagementBaseUrl(region, "https");
23
- }
23
+ } else if (opts.region) opts.baseUrl = getManagementBaseUrl(opts.region, "https");
24
24
  if (opts.security) await setAuthParams({
25
25
  ...opts,
26
26
  security: opts.security
@@ -1 +1 @@
1
- {"version":3,"file":"client.mjs","names":["config: Config","config","request: Client['request']","requestInit: ReqInit","request","data: any","jsonError: unknown","fetchFn: any","url: string","retryConfig: { maxRetries: number; retryDelay: number }","attempt: number"],"sources":["../../src/client/client.ts"],"sourcesContent":["import { getManagementBaseUrl, getRegion } from '@storyblok/region-helper';\nimport type { Client, Config, RequestOptions } from './types';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils';\n\ntype ReqInit = Omit<RequestInit, 'body' | 'headers'> & {\n body?: any;\n headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<\n Request,\n Response,\n unknown,\n RequestOptions\n >();\n\n const request: Client['request'] = async (options) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n };\n\n // If the baseUrl is not set and we have a space_id, we can attempt toinfer the region\n if (!_config.baseUrl && options.path?.space_id) {\n const region = getRegion(options.path.space_id as number);\n if (region) {\n opts.baseUrl = getManagementBaseUrl(region, 'https');\n }\n }\n\n if (opts.security) {\n await setAuthParams({\n ...opts,\n security: opts.security,\n });\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body && opts.bodySerializer) {\n opts.body = opts.bodySerializer(opts.body);\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.body === '') {\n opts.headers.delete('Content-Type');\n }\n\n const url = buildUrl(opts);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n };\n\n let request = new Request(url, requestInit);\n\n for (const fn of interceptors.request._fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n \n // Execute with retry logic by recreating the request for each attempt\n let response = await executeWithRetry(_fetch, url, requestInit, {\n maxRetries: 3,\n retryDelay: 1000\n });\n\n for (const fn of interceptors.response._fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n if (\n response.status === 204 ||\n response.headers.get('Content-Length') === '0'\n ) {\n return opts.responseStyle === 'data'\n ? {}\n : {\n data: {},\n ...result,\n };\n }\n\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'json':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n const error = jsonError ?? textError;\n let finalError = error;\n\n for (const fn of interceptors.error._fns) {\n if (fn) {\n finalError = (await fn(error, response, request, opts)) as string;\n }\n }\n\n finalError = finalError || ({} as string);\n\n if (opts.throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return opts.responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n ...result,\n };\n };\n\n // Helper function to execute fetch with retry logic\n async function executeWithRetry(\n fetchFn: any,\n url: string,\n requestInit: ReqInit,\n retryConfig: { maxRetries: number; retryDelay: number },\n attempt: number = 0\n ): Promise<Response> {\n try {\n const request = new Request(url, requestInit);\n const response = await fetchFn(request);\n \n if (response.status === 429 && attempt < retryConfig.maxRetries) {\n const retryAfter = response.headers.get('retry-after');\n const delay = retryAfter ? parseInt(retryAfter) * 1000 : retryConfig.retryDelay;\n \n await new Promise(resolve => setTimeout(resolve, delay));\n \n // Use the original unconsumed request for retry\n return executeWithRetry(fetchFn, url, requestInit, retryConfig, attempt + 1);\n }\n \n return response;\n } catch (error) {\n // If it's a network error and we haven't exceeded retries, try again\n if (attempt < retryConfig.maxRetries) {\n const delay = retryConfig.retryDelay;\n await new Promise(resolve => setTimeout(resolve, delay));\n \n // Use the original unconsumed request for retry\n return executeWithRetry(fetchFn, url, requestInit, retryConfig, attempt + 1);\n }\n \n throw error;\n }\n }\n\n return {\n buildUrl,\n connect: (options) => request({ ...options, method: 'CONNECT' }),\n delete: (options) => request({ ...options, method: 'DELETE' }),\n get: (options) => request({ ...options, method: 'GET' }),\n getConfig,\n head: (options) => request({ ...options, method: 'HEAD' }),\n interceptors,\n options: (options) => request({ ...options, method: 'OPTIONS' }),\n patch: (options) => request({ ...options, method: 'PATCH' }),\n post: (options) => request({ ...options, method: 'POST' }),\n put: (options) => request({ ...options, method: 'PUT' }),\n request,\n setConfig,\n trace: (options) => request({ ...options, method: 'TRACE' }),\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.mjs","names":["config: Config","config","request: Client['request']","requestInit: ReqInit","request","data: any","jsonError: unknown","fetchFn: any","url: string","retryConfig: { maxRetries: number; retryDelay: number }","attempt: number"],"sources":["../../src/client/client.ts"],"sourcesContent":["import { getManagementBaseUrl, getRegion } from '@storyblok/region-helper';\nimport type { Client, Config, RequestOptions } from './types';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils';\n\ntype ReqInit = Omit<RequestInit, 'body' | 'headers'> & {\n body?: any;\n headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<\n Request,\n Response,\n unknown,\n RequestOptions\n >();\n\n const request: Client['request'] = async (options) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n };\n\n\n // If the baseUrl is not set and we have a space_id, we can attempt toinfer the region\n if (!_config.baseUrl && options.path?.space_id) {\n const region = getRegion(options.path.space_id as number, opts.region);\n if (region) {\n opts.baseUrl = getManagementBaseUrl(region, 'https');\n }\n } else if (opts.region) {\n opts.baseUrl = getManagementBaseUrl(opts.region, 'https');\n }\n\n if (opts.security) {\n await setAuthParams({\n ...opts,\n security: opts.security,\n });\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body && opts.bodySerializer) {\n opts.body = opts.bodySerializer(opts.body);\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.body === '') {\n opts.headers.delete('Content-Type');\n }\n\n const url = buildUrl(opts);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n };\n\n let request = new Request(url, requestInit);\n\n for (const fn of interceptors.request._fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n \n // Execute with retry logic by recreating the request for each attempt\n let response = await executeWithRetry(_fetch, url, requestInit, {\n maxRetries: 3,\n retryDelay: 1000\n });\n\n for (const fn of interceptors.response._fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n if (\n response.status === 204 ||\n response.headers.get('Content-Length') === '0'\n ) {\n return opts.responseStyle === 'data'\n ? {}\n : {\n data: {},\n ...result,\n };\n }\n\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'json':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n const error = jsonError ?? textError;\n let finalError = error;\n\n for (const fn of interceptors.error._fns) {\n if (fn) {\n finalError = (await fn(error, response, request, opts)) as string;\n }\n }\n\n finalError = finalError || ({} as string);\n\n if (opts.throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return opts.responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n ...result,\n };\n };\n\n // Helper function to execute fetch with retry logic\n async function executeWithRetry(\n fetchFn: any,\n url: string,\n requestInit: ReqInit,\n retryConfig: { maxRetries: number; retryDelay: number },\n attempt: number = 0\n ): Promise<Response> {\n try {\n const request = new Request(url, requestInit);\n const response = await fetchFn(request);\n \n if (response.status === 429 && attempt < retryConfig.maxRetries) {\n const retryAfter = response.headers.get('retry-after');\n const delay = retryAfter ? parseInt(retryAfter) * 1000 : retryConfig.retryDelay;\n \n await new Promise(resolve => setTimeout(resolve, delay));\n \n // Use the original unconsumed request for retry\n return executeWithRetry(fetchFn, url, requestInit, retryConfig, attempt + 1);\n }\n \n return response;\n } catch (error) {\n // If it's a network error and we haven't exceeded retries, try again\n if (attempt < retryConfig.maxRetries) {\n const delay = retryConfig.retryDelay;\n await new Promise(resolve => setTimeout(resolve, delay));\n \n // Use the original unconsumed request for retry\n return executeWithRetry(fetchFn, url, requestInit, retryConfig, attempt + 1);\n }\n \n throw error;\n }\n }\n\n return {\n buildUrl,\n connect: (options) => request({ ...options, method: 'CONNECT' }),\n delete: (options) => request({ ...options, method: 'DELETE' }),\n get: (options) => request({ ...options, method: 'GET' }),\n getConfig,\n head: (options) => request({ ...options, method: 'HEAD' }),\n interceptors,\n options: (options) => request({ ...options, method: 'OPTIONS' }),\n patch: (options) => request({ ...options, method: 'PATCH' }),\n post: (options) => request({ ...options, method: 'POST' }),\n put: (options) => request({ ...options, method: 'PUT' }),\n request,\n setConfig,\n trace: (options) => request({ ...options, method: 'TRACE' }),\n };\n};\n"],"mappings":";;;;AAiBA,MAAa,eAAe,CAACA,WAA2B;CACtD,IAAI,UAAU,aAAa,cAAc,EAAE,OAAO;CAElD,MAAM,YAAY,OAAe,EAAE,GAAG,QAAS;CAE/C,MAAM,YAAY,CAACA,aAA2B;EAC5C,UAAU,aAAa,SAASC,SAAO;AACvC,SAAO,WAAW;CACnB;CAED,MAAM,eAAe,oBAKlB;CAEH,MAAMC,UAA6B,OAAO,YAAY;EACpD,MAAM,OAAO;GACX,GAAG;GACH,GAAG;GACH,OAAO,QAAQ,SAAS,QAAQ,SAAS,WAAW;GACpD,SAAS,aAAa,QAAQ,SAAS,QAAQ,QAAQ;EACxD;AAID,MAAI,CAAC,QAAQ,WAAW,QAAQ,MAAM,UAAU;GAC9C,MAAM,SAAS,UAAU,QAAQ,KAAK,UAAoB,KAAK,OAAO;AACtE,OAAI,QACF,KAAK,UAAU,qBAAqB,QAAQ,QAAQ;EAEvD,WAAU,KAAK,QACd,KAAK,UAAU,qBAAqB,KAAK,QAAQ,QAAQ;AAG3D,MAAI,KAAK,UACP,MAAM,cAAc;GAClB,GAAG;GACH,UAAU,KAAK;EAChB,EAAC;AAGJ,MAAI,KAAK,kBACP,MAAM,KAAK,iBAAiB,KAAK;AAGnC,MAAI,KAAK,QAAQ,KAAK,gBACpB,KAAK,OAAO,KAAK,eAAe,KAAK,KAAK;AAI5C,MAAI,KAAK,SAAS,UAAa,KAAK,SAAS,IAC3C,KAAK,QAAQ,OAAO,eAAe;EAGrC,MAAM,MAAM,SAAS,KAAK;EAC1B,MAAMC,cAAuB;GAC3B,UAAU;GACV,GAAG;EACJ;EAED,IAAIC,YAAU,IAAI,QAAQ,KAAK;AAE/B,OAAK,MAAM,MAAM,aAAa,QAAQ,KACpC,KAAI,IACFA,YAAU,MAAM,GAAGA,WAAS,KAAK;EAMrC,MAAM,SAAS,KAAK;EAGpB,IAAI,WAAW,MAAM,iBAAiB,QAAQ,KAAK,aAAa;GAC9D,YAAY;GACZ,YAAY;EACb,EAAC;AAEF,OAAK,MAAM,MAAM,aAAa,SAAS,KACrC,KAAI,IACF,WAAW,MAAM,GAAG,UAAUA,WAAS,KAAK;EAIhD,MAAM,SAAS;GACb;GACA;EACD;AAED,MAAI,SAAS,IAAI;AACf,OACE,SAAS,WAAW,OACpB,SAAS,QAAQ,IAAI,iBAAiB,KAAK,IAE3C,QAAO,KAAK,kBAAkB,SAC1B,CAAE,IACF;IACE,MAAM,CAAE;IACR,GAAG;GACJ;GAGP,MAAM,WACH,KAAK,YAAY,SACd,WAAW,SAAS,QAAQ,IAAI,eAAe,CAAC,GAChD,KAAK,YAAY;GAEvB,IAAIC;AACJ,WAAQ,SAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;KACH,OAAO,MAAM,SAAS,UAAU;AAChC;IACF,KAAK,SACH,QAAO,KAAK,kBAAkB,SAC1B,SAAS,OACT;KACE,MAAM,SAAS;KACf,GAAG;IACJ;GACR;AAED,OAAI,YAAY,QAAQ;AACtB,QAAI,KAAK,mBACP,MAAM,KAAK,kBAAkB,KAAK;AAGpC,QAAI,KAAK,qBACP,OAAO,MAAM,KAAK,oBAAoB,KAAK;GAE9C;AAED,UAAO,KAAK,kBAAkB,SAC1B,OACA;IACE;IACA,GAAG;GACJ;EACN;EAED,MAAM,YAAY,MAAM,SAAS,MAAM;EACvC,IAAIC;AAEJ,MAAI;GACF,YAAY,KAAK,MAAM,UAAU;EAClC,QAAO,CAEP;EAED,MAAM,QAAQ,aAAa;EAC3B,IAAI,aAAa;AAEjB,OAAK,MAAM,MAAM,aAAa,MAAM,KAClC,KAAI,IACF,aAAc,MAAM,GAAG,OAAO,UAAUF,WAAS,KAAK;EAI1D,aAAa,cAAe,CAAE;AAE9B,MAAI,KAAK,aACP,OAAM;AAIR,SAAO,KAAK,kBAAkB,SAC1B,SACA;GACE,OAAO;GACP,GAAG;EACJ;CACN;CAGD,eAAe,iBACbG,SACAC,KACAL,aACAM,aACAC,UAAkB,GACC;AACnB,MAAI;GACF,MAAMN,YAAU,IAAI,QAAQ,KAAK;GACjC,MAAM,WAAW,MAAM,QAAQA,UAAQ;AAEvC,OAAI,SAAS,WAAW,OAAO,UAAU,YAAY,YAAY;IAC/D,MAAM,aAAa,SAAS,QAAQ,IAAI,cAAc;IACtD,MAAM,QAAQ,aAAa,SAAS,WAAW,GAAG,MAAO,YAAY;IAErE,MAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,MAAM;AAGvD,WAAO,iBAAiB,SAAS,KAAK,aAAa,aAAa,UAAU,EAAE;GAC7E;AAED,UAAO;EACR,SAAQ,OAAO;AAEd,OAAI,UAAU,YAAY,YAAY;IACpC,MAAM,QAAQ,YAAY;IAC1B,MAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,MAAM;AAGvD,WAAO,iBAAiB,SAAS,KAAK,aAAa,aAAa,UAAU,EAAE;GAC7E;AAED,SAAM;EACP;CACF;AAED,QAAO;EACL;EACA,SAAS,CAAC,YAAY,QAAQ;GAAE,GAAG;GAAS,QAAQ;EAAW,EAAC;EAChE,QAAQ,CAAC,YAAY,QAAQ;GAAE,GAAG;GAAS,QAAQ;EAAU,EAAC;EAC9D,KAAK,CAAC,YAAY,QAAQ;GAAE,GAAG;GAAS,QAAQ;EAAO,EAAC;EACxD;EACA,MAAM,CAAC,YAAY,QAAQ;GAAE,GAAG;GAAS,QAAQ;EAAQ,EAAC;EAC1D;EACA,SAAS,CAAC,YAAY,QAAQ;GAAE,GAAG;GAAS,QAAQ;EAAW,EAAC;EAChE,OAAO,CAAC,YAAY,QAAQ;GAAE,GAAG;GAAS,QAAQ;EAAS,EAAC;EAC5D,MAAM,CAAC,YAAY,QAAQ;GAAE,GAAG;GAAS,QAAQ;EAAQ,EAAC;EAC1D,KAAK,CAAC,YAAY,QAAQ;GAAE,GAAG;GAAS,QAAQ;EAAO,EAAC;EACxD;EACA;EACA,OAAO,CAAC,YAAY,QAAQ;GAAE,GAAG;GAAS,QAAQ;EAAS,EAAC;CAC7D;AACF"}
@@ -1,6 +1,7 @@
1
1
  import { Auth } from "../core/auth.mjs";
2
2
  import { Client, Config } from "../core/types.mjs";
3
3
  import { Middleware } from "./utils.mjs";
4
+ import { Region } from "@storyblok/region-helper";
4
5
 
5
6
  //#region src/client/types.d.ts
6
7
  type ResponseStyle = 'data' | 'fields';
@@ -44,6 +45,12 @@ interface Config$1<T extends ClientOptions = ClientOptions> extends Omit<Request
44
45
  * @default false
45
46
  */
46
47
  throwOnError?: T['throwOnError'];
48
+ /**
49
+ * Fallback region to use for any requests that cannot infer the region from the path
50
+ *
51
+ * @default 'eu'
52
+ */
53
+ region?: Region;
47
54
  }
48
55
  interface RequestOptions<TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string> extends Config$1<{
49
56
  responseStyle: TResponseStyle;
@@ -1,6 +1,7 @@
1
1
  import { Auth } from "../core/auth.js";
2
2
  import { Client, Config } from "../core/types.js";
3
3
  import { Middleware } from "./utils.js";
4
+ import { Region } from "@storyblok/region-helper";
4
5
 
5
6
  //#region src/client/types.d.ts
6
7
  type ResponseStyle = 'data' | 'fields';
@@ -44,6 +45,12 @@ interface Config$1<T extends ClientOptions = ClientOptions> extends Omit<Request
44
45
  * @default false
45
46
  */
46
47
  throwOnError?: T['throwOnError'];
48
+ /**
49
+ * Fallback region to use for any requests that cannot infer the region from the path
50
+ *
51
+ * @default 'eu'
52
+ */
53
+ region?: Region;
47
54
  }
48
55
  interface RequestOptions<TResponseStyle extends ResponseStyle = 'fields', ThrowOnError extends boolean = boolean, Url extends string = string> extends Config$1<{
49
56
  responseStyle: TResponseStyle;
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- const require_rolldown_runtime = require('./_virtual/rolldown_runtime.js');
2
1
  const require_client = require('./client/client.js');
3
2
  require('./client/index.js');
4
3
  const require_sdk_registry_generated = require('./sdk-registry.generated.js');
@@ -12,7 +11,6 @@ const require_generated_datasource_entries_types_gen = require('./generated/data
12
11
  const require_generated_components_types_gen = require('./generated/components/types.gen.js');
13
12
  const require_generated_component_folders_types_gen = require('./generated/component_folders/types.gen.js');
14
13
  const require_generated_assets_types_gen = require('./generated/assets/types.gen.js');
15
- const __storyblok_region_helper = require_rolldown_runtime.__toESM(require("@storyblok/region-helper"));
16
14
 
17
15
  //#region src/index.ts
18
16
  var ManagementApiClient = class {
@@ -48,14 +46,15 @@ var ManagementApiClient = class {
48
46
  */
49
47
  setConfig(config) {
50
48
  const { region, baseUrl, headers } = config;
51
- let finalBaseUrl = baseUrl;
52
- if (region && !baseUrl) finalBaseUrl = (0, __storyblok_region_helper.getManagementBaseUrl)(region, "https");
53
- if (finalBaseUrl) this.client.setConfig({ baseUrl: finalBaseUrl });
54
- if (headers) this.client.setConfig({ headers: {
55
- "Content-Type": "application/json",
56
- ...getAuthHeader(this.config.token),
57
- ...headers
58
- } });
49
+ if (headers) this.client.setConfig({
50
+ baseUrl: baseUrl || this.config.baseUrl,
51
+ region: region || this.config.region,
52
+ headers: {
53
+ "Content-Type": "application/json",
54
+ ...getAuthHeader(this.config.token),
55
+ ...headers
56
+ }
57
+ });
59
58
  }
60
59
  /**
61
60
  * @param token - The token to set
@@ -64,18 +63,21 @@ var ManagementApiClient = class {
64
63
  */
65
64
  setToken(token) {
66
65
  this.config.token = token;
67
- this.client.setConfig({ headers: {
68
- "Content-Type": "application/json",
69
- ...getAuthHeader(token),
70
- ...this.config.headers
71
- } });
66
+ this.client.setConfig({
67
+ region: this.config.region ?? "eu",
68
+ headers: {
69
+ "Content-Type": "application/json",
70
+ ...getAuthHeader(token),
71
+ ...this.config.headers
72
+ }
73
+ });
72
74
  }
73
75
  };
74
76
  function createClientInstance(config) {
75
77
  const { token, region = "eu", baseUrl, headers = {}, throwOnError = false } = config;
76
- const finalBaseUrl = baseUrl || (0, __storyblok_region_helper.getManagementBaseUrl)(region, "https");
77
78
  return require_client.createClient({
78
- baseUrl: finalBaseUrl,
79
+ baseUrl,
80
+ region,
79
81
  headers: {
80
82
  "Content-Type": "application/json",
81
83
  ...getAuthHeader(token),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["config: ManagementApiClientConfig<ThrowOnError>","sdkRegistry","config: Partial<Omit<ManagementApiClientConfig, 'token'>>","token: PersonalAccessToken | OAuthToken","createClient"],"sources":["../src/index.ts"],"sourcesContent":["// Import generated SDKs with shared client support\nimport { createClient } from './client';\nimport type { Client } from './client/types';\nimport { getManagementBaseUrl, type Region } from '@storyblok/region-helper';\nimport { sdkRegistry, SdkRegistryInstance } from './sdk-registry.generated';\n\ntype PersonalAccessToken = {\n accessToken: string;\n}\n\ntype OAuthToken = {\n oauthToken: string;\n}\n\nexport interface ManagementApiClientConfig<ThrowOnError extends boolean = false> {\n token: PersonalAccessToken | OAuthToken;\n region?: Region;\n baseUrl?: string; // Override for custom endpoints\n headers?: Record<string, string>;\n throwOnError?: ThrowOnError;\n}\n\nexport interface ManagementApiClient<ThrowOnError extends boolean = false> extends SdkRegistryInstance {}\nexport class ManagementApiClient<ThrowOnError extends boolean = false> {\n protected client: Client;\n protected config: ManagementApiClientConfig<ThrowOnError>;\n protected sdkCache: Record<string, Promise<any>> = {};\n\n constructor(config: ManagementApiClientConfig<ThrowOnError>) {\n this.config = config;\n this.client = createClientInstance(config);\n\n Object.entries(sdkRegistry).forEach(([name, Sdk]) => {\n Object.defineProperty(this, name, {\n get: () => new Sdk({ client: this.client }),\n enumerable: true,\n configurable: true\n });\n });\n }\n\n\n /**\n * @returns The client's interceptors\n * @example\n * client.interceptors.request.use((request, options) => {\n * console.log('Request:', request);\n * return request;\n * });\n */\n public get interceptors(): Client['interceptors'] {\n return this.client.interceptors;\n }\n\n /**\n * @param config - The configuration to set\n * @example\n * client.setConfig({ region: 'eu' });\n */\n setConfig(config: Partial<Omit<ManagementApiClientConfig, 'token'>>): void {\n const { region, baseUrl, headers } = config;\n \n let finalBaseUrl = baseUrl;\n if (region && !baseUrl) {\n finalBaseUrl = getManagementBaseUrl(region, \"https\");\n }\n \n if (finalBaseUrl) {\n this.client.setConfig({ baseUrl: finalBaseUrl });\n }\n \n if (headers) {\n this.client.setConfig({ \n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(this.config.token),\n ...headers\n }\n });\n }\n }\n\n /**\n * @param token - The token to set\n * @example\n * client.setToken({ accessToken: '123' });\n */\n setToken(token: PersonalAccessToken | OAuthToken): void {\n this.config.token = token;\n this.client.setConfig({\n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(token),\n ...this.config.headers\n }\n });\n }\n}\n\n// Pure functions for client creation and setup\nfunction createClientInstance<ThrowOnError extends boolean = false>(\n config: ManagementApiClientConfig<ThrowOnError>\n): Client {\n const { token, region = \"eu\", baseUrl, headers = {}, throwOnError = false } = config;\n \n const finalBaseUrl = baseUrl || getManagementBaseUrl(region, 'https');\n \n return createClient({\n baseUrl: finalBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(token),\n ...headers\n },\n throwOnError: throwOnError ?? false\n });\n}\n\nfunction getAuthHeader(token: PersonalAccessToken | OAuthToken): Record<string, string> {\n return 'accessToken' in token ? {\n 'Authorization': token.accessToken\n } : {\n 'Authorization': token.oauthToken\n }\n}\n\n// Export client utilities\nexport { createClient } from './client';\nexport type { Client } from './client/types';\n\n// Export all generated types\nexport * from './types.generated';\n"],"mappings":";;;;;;;;;;;;;;;;;AAuBA,IAAa,sBAAb,MAAuE;CACrE,AAAU;CACV,AAAU;CACV,AAAU,WAAyC,CAAE;CAErD,YAAYA,QAAiD;EAC3D,KAAK,SAAS;EACd,KAAK,SAAS,qBAAqB,OAAO;EAE1C,OAAO,QAAQC,2CAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,IAAI,KAAK;GACnD,OAAO,eAAe,MAAM,MAAM;IAChC,KAAK,MAAM,IAAI,IAAI,EAAE,QAAQ,KAAK,OAAQ;IAC1C,YAAY;IACZ,cAAc;GACf,EAAC;EACH,EAAC;CACH;;;;;;;;;CAWD,IAAW,eAAuC;AAChD,SAAO,KAAK,OAAO;CACpB;;;;;;CAOD,UAAUC,QAAiE;EACzE,MAAM,EAAE,QAAQ,SAAS,SAAS,GAAG;EAErC,IAAI,eAAe;AACnB,MAAI,UAAU,CAAC,SACb,mEAAoC,QAAQ,QAAQ;AAGtD,MAAI,cACF,KAAK,OAAO,UAAU,EAAE,SAAS,aAAc,EAAC;AAGlD,MAAI,SACF,KAAK,OAAO,UAAU,EACpB,SAAS;GACP,gBAAgB;GAChB,GAAG,cAAc,KAAK,OAAO,MAAM;GACnC,GAAG;EACJ,EACF,EAAC;CAEL;;;;;;CAOD,SAASC,OAA+C;EACtD,KAAK,OAAO,QAAQ;EACpB,KAAK,OAAO,UAAU,EACpB,SAAS;GACP,gBAAgB;GAChB,GAAG,cAAc,MAAM;GACvB,GAAG,KAAK,OAAO;EAChB,EACF,EAAC;CACH;AACF;AAGD,SAAS,qBACPH,QACQ;CACR,MAAM,EAAE,OAAO,SAAS,MAAM,SAAS,UAAU,CAAE,GAAE,eAAe,OAAO,GAAG;CAE9E,MAAM,eAAe,+DAAgC,QAAQ,QAAQ;AAErE,QAAOI,4BAAa;EAClB,SAAS;EACT,SAAS;GACP,gBAAgB;GAChB,GAAG,cAAc,MAAM;GACvB,GAAG;EACJ;EACD,cAAc,gBAAgB;CAC/B,EAAC;AACH;AAED,SAAS,cAAcD,OAAiE;AACtF,QAAO,iBAAiB,QAAQ,EAC9B,iBAAiB,MAAM,YACxB,IAAG,EACF,iBAAiB,MAAM,WACxB;AACF"}
1
+ {"version":3,"file":"index.js","names":["config: ManagementApiClientConfig<ThrowOnError>","sdkRegistry","config: Partial<Omit<ManagementApiClientConfig, 'token'>>","token: PersonalAccessToken | OAuthToken","createClient"],"sources":["../src/index.ts"],"sourcesContent":["// Import generated SDKs with shared client support\nimport { createClient } from './client';\nimport type { Client } from './client/types';\nimport { getManagementBaseUrl, type Region } from '@storyblok/region-helper';\nimport { sdkRegistry, SdkRegistryInstance } from './sdk-registry.generated';\n\ntype PersonalAccessToken = {\n accessToken: string;\n}\n\ntype OAuthToken = {\n oauthToken: string;\n}\n\nexport interface ManagementApiClientConfig<ThrowOnError extends boolean = false> {\n token: PersonalAccessToken | OAuthToken;\n region?: Region;\n baseUrl?: string; // Override for custom endpoints\n headers?: Record<string, string>;\n throwOnError?: ThrowOnError;\n}\n\nexport interface ManagementApiClient<ThrowOnError extends boolean = false> extends SdkRegistryInstance {}\nexport class ManagementApiClient<ThrowOnError extends boolean = false> {\n protected client: Client;\n protected config: ManagementApiClientConfig<ThrowOnError>;\n protected sdkCache: Record<string, Promise<any>> = {};\n\n constructor(config: ManagementApiClientConfig<ThrowOnError>) {\n this.config = config;\n this.client = createClientInstance(config);\n\n Object.entries(sdkRegistry).forEach(([name, Sdk]) => {\n Object.defineProperty(this, name, {\n get: () => new Sdk({ client: this.client as any }),\n enumerable: true,\n configurable: true\n });\n });\n }\n\n\n /**\n * @returns The client's interceptors\n * @example\n * client.interceptors.request.use((request, options) => {\n * console.log('Request:', request);\n * return request;\n * });\n */\n public get interceptors(): Client['interceptors'] {\n return this.client.interceptors;\n }\n\n /**\n * @param config - The configuration to set\n * @example\n * client.setConfig({ region: 'eu' });\n */\n setConfig(config: Partial<Omit<ManagementApiClientConfig, 'token'>>): void {\n const { region, baseUrl, headers } = config;\n \n if (headers) {\n this.client.setConfig({\n baseUrl: baseUrl || this.config.baseUrl,\n region: region || this.config.region!,\n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(this.config.token),\n ...headers\n }\n });\n }\n }\n\n /**\n * @param token - The token to set\n * @example\n * client.setToken({ accessToken: '123' });\n */\n setToken(token: PersonalAccessToken | OAuthToken): void {\n this.config.token = token;\n this.client.setConfig({\n region: this.config.region ?? \"eu\",\n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(token),\n ...this.config.headers\n }\n });\n }\n}\n\n// Pure functions for client creation and setup\nfunction createClientInstance<ThrowOnError extends boolean = false>(\n config: ManagementApiClientConfig<ThrowOnError>\n): Client {\n const { token, region = \"eu\", baseUrl, headers = {}, throwOnError = false } = config;\n \n return createClient({\n baseUrl,\n region,\n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(token),\n ...headers\n },\n throwOnError: throwOnError ?? false\n });\n}\n\nfunction getAuthHeader(token: PersonalAccessToken | OAuthToken): Record<string, string> {\n return 'accessToken' in token ? {\n 'Authorization': token.accessToken\n } : {\n 'Authorization': token.oauthToken\n }\n}\n\n// Export client utilities\nexport { createClient } from './client';\nexport type { Client } from './client/types';\n\n// Export all generated types\nexport * from './types.generated';\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,IAAa,sBAAb,MAAuE;CACrE,AAAU;CACV,AAAU;CACV,AAAU,WAAyC,CAAE;CAErD,YAAYA,QAAiD;EAC3D,KAAK,SAAS;EACd,KAAK,SAAS,qBAAqB,OAAO;EAE1C,OAAO,QAAQC,2CAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,IAAI,KAAK;GACnD,OAAO,eAAe,MAAM,MAAM;IAChC,KAAK,MAAM,IAAI,IAAI,EAAE,QAAQ,KAAK,OAAe;IACjD,YAAY;IACZ,cAAc;GACf,EAAC;EACH,EAAC;CACH;;;;;;;;;CAWD,IAAW,eAAuC;AAChD,SAAO,KAAK,OAAO;CACpB;;;;;;CAOD,UAAUC,QAAiE;EACzE,MAAM,EAAE,QAAQ,SAAS,SAAS,GAAG;AAErC,MAAI,SACF,KAAK,OAAO,UAAU;GACpB,SAAS,WAAW,KAAK,OAAO;GAChC,QAAQ,UAAU,KAAK,OAAO;GAC9B,SAAS;IACP,gBAAgB;IAChB,GAAG,cAAc,KAAK,OAAO,MAAM;IACnC,GAAG;GACJ;EACF,EAAC;CAEL;;;;;;CAOD,SAASC,OAA+C;EACtD,KAAK,OAAO,QAAQ;EACpB,KAAK,OAAO,UAAU;GACpB,QAAQ,KAAK,OAAO,UAAU;GAC9B,SAAS;IACP,gBAAgB;IAChB,GAAG,cAAc,MAAM;IACvB,GAAG,KAAK,OAAO;GAChB;EACF,EAAC;CACH;AACF;AAGD,SAAS,qBACPH,QACQ;CACR,MAAM,EAAE,OAAO,SAAS,MAAM,SAAS,UAAU,CAAE,GAAE,eAAe,OAAO,GAAG;AAE9E,QAAOI,4BAAa;EAClB;EACA;EACA,SAAS;GACP,gBAAgB;GAChB,GAAG,cAAc,MAAM;GACvB,GAAG;EACJ;EACD,cAAc,gBAAgB;CAC/B,EAAC;AACH;AAED,SAAS,cAAcD,OAAiE;AACtF,QAAO,iBAAiB,QAAQ,EAC9B,iBAAiB,MAAM,YACxB,IAAG,EACF,iBAAiB,MAAM,WACxB;AACF"}
package/dist/index.mjs CHANGED
@@ -11,7 +11,6 @@ import { types_gen_exports as types_gen_exports$6 } from "./generated/datasource
11
11
  import { types_gen_exports as types_gen_exports$7 } from "./generated/components/types.gen.mjs";
12
12
  import { types_gen_exports as types_gen_exports$8 } from "./generated/component_folders/types.gen.mjs";
13
13
  import { types_gen_exports as types_gen_exports$9 } from "./generated/assets/types.gen.mjs";
14
- import { getManagementBaseUrl } from "@storyblok/region-helper";
15
14
 
16
15
  //#region src/index.ts
17
16
  var ManagementApiClient = class {
@@ -47,14 +46,15 @@ var ManagementApiClient = class {
47
46
  */
48
47
  setConfig(config) {
49
48
  const { region, baseUrl, headers } = config;
50
- let finalBaseUrl = baseUrl;
51
- if (region && !baseUrl) finalBaseUrl = getManagementBaseUrl(region, "https");
52
- if (finalBaseUrl) this.client.setConfig({ baseUrl: finalBaseUrl });
53
- if (headers) this.client.setConfig({ headers: {
54
- "Content-Type": "application/json",
55
- ...getAuthHeader(this.config.token),
56
- ...headers
57
- } });
49
+ if (headers) this.client.setConfig({
50
+ baseUrl: baseUrl || this.config.baseUrl,
51
+ region: region || this.config.region,
52
+ headers: {
53
+ "Content-Type": "application/json",
54
+ ...getAuthHeader(this.config.token),
55
+ ...headers
56
+ }
57
+ });
58
58
  }
59
59
  /**
60
60
  * @param token - The token to set
@@ -63,18 +63,21 @@ var ManagementApiClient = class {
63
63
  */
64
64
  setToken(token) {
65
65
  this.config.token = token;
66
- this.client.setConfig({ headers: {
67
- "Content-Type": "application/json",
68
- ...getAuthHeader(token),
69
- ...this.config.headers
70
- } });
66
+ this.client.setConfig({
67
+ region: this.config.region ?? "eu",
68
+ headers: {
69
+ "Content-Type": "application/json",
70
+ ...getAuthHeader(token),
71
+ ...this.config.headers
72
+ }
73
+ });
71
74
  }
72
75
  };
73
76
  function createClientInstance(config) {
74
77
  const { token, region = "eu", baseUrl, headers = {}, throwOnError = false } = config;
75
- const finalBaseUrl = baseUrl || getManagementBaseUrl(region, "https");
76
78
  return createClient({
77
- baseUrl: finalBaseUrl,
79
+ baseUrl,
80
+ region,
78
81
  headers: {
79
82
  "Content-Type": "application/json",
80
83
  ...getAuthHeader(token),
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["config: ManagementApiClientConfig<ThrowOnError>","config: Partial<Omit<ManagementApiClientConfig, 'token'>>","token: PersonalAccessToken | OAuthToken"],"sources":["../src/index.ts"],"sourcesContent":["// Import generated SDKs with shared client support\nimport { createClient } from './client';\nimport type { Client } from './client/types';\nimport { getManagementBaseUrl, type Region } from '@storyblok/region-helper';\nimport { sdkRegistry, SdkRegistryInstance } from './sdk-registry.generated';\n\ntype PersonalAccessToken = {\n accessToken: string;\n}\n\ntype OAuthToken = {\n oauthToken: string;\n}\n\nexport interface ManagementApiClientConfig<ThrowOnError extends boolean = false> {\n token: PersonalAccessToken | OAuthToken;\n region?: Region;\n baseUrl?: string; // Override for custom endpoints\n headers?: Record<string, string>;\n throwOnError?: ThrowOnError;\n}\n\nexport interface ManagementApiClient<ThrowOnError extends boolean = false> extends SdkRegistryInstance {}\nexport class ManagementApiClient<ThrowOnError extends boolean = false> {\n protected client: Client;\n protected config: ManagementApiClientConfig<ThrowOnError>;\n protected sdkCache: Record<string, Promise<any>> = {};\n\n constructor(config: ManagementApiClientConfig<ThrowOnError>) {\n this.config = config;\n this.client = createClientInstance(config);\n\n Object.entries(sdkRegistry).forEach(([name, Sdk]) => {\n Object.defineProperty(this, name, {\n get: () => new Sdk({ client: this.client }),\n enumerable: true,\n configurable: true\n });\n });\n }\n\n\n /**\n * @returns The client's interceptors\n * @example\n * client.interceptors.request.use((request, options) => {\n * console.log('Request:', request);\n * return request;\n * });\n */\n public get interceptors(): Client['interceptors'] {\n return this.client.interceptors;\n }\n\n /**\n * @param config - The configuration to set\n * @example\n * client.setConfig({ region: 'eu' });\n */\n setConfig(config: Partial<Omit<ManagementApiClientConfig, 'token'>>): void {\n const { region, baseUrl, headers } = config;\n \n let finalBaseUrl = baseUrl;\n if (region && !baseUrl) {\n finalBaseUrl = getManagementBaseUrl(region, \"https\");\n }\n \n if (finalBaseUrl) {\n this.client.setConfig({ baseUrl: finalBaseUrl });\n }\n \n if (headers) {\n this.client.setConfig({ \n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(this.config.token),\n ...headers\n }\n });\n }\n }\n\n /**\n * @param token - The token to set\n * @example\n * client.setToken({ accessToken: '123' });\n */\n setToken(token: PersonalAccessToken | OAuthToken): void {\n this.config.token = token;\n this.client.setConfig({\n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(token),\n ...this.config.headers\n }\n });\n }\n}\n\n// Pure functions for client creation and setup\nfunction createClientInstance<ThrowOnError extends boolean = false>(\n config: ManagementApiClientConfig<ThrowOnError>\n): Client {\n const { token, region = \"eu\", baseUrl, headers = {}, throwOnError = false } = config;\n \n const finalBaseUrl = baseUrl || getManagementBaseUrl(region, 'https');\n \n return createClient({\n baseUrl: finalBaseUrl,\n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(token),\n ...headers\n },\n throwOnError: throwOnError ?? false\n });\n}\n\nfunction getAuthHeader(token: PersonalAccessToken | OAuthToken): Record<string, string> {\n return 'accessToken' in token ? {\n 'Authorization': token.accessToken\n } : {\n 'Authorization': token.oauthToken\n }\n}\n\n// Export client utilities\nexport { createClient } from './client';\nexport type { Client } from './client/types';\n\n// Export all generated types\nexport * from './types.generated';\n"],"mappings":";;;;;;;;;;;;;;;;AAuBA,IAAa,sBAAb,MAAuE;CACrE,AAAU;CACV,AAAU;CACV,AAAU,WAAyC,CAAE;CAErD,YAAYA,QAAiD;EAC3D,KAAK,SAAS;EACd,KAAK,SAAS,qBAAqB,OAAO;EAE1C,OAAO,QAAQ,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,IAAI,KAAK;GACnD,OAAO,eAAe,MAAM,MAAM;IAChC,KAAK,MAAM,IAAI,IAAI,EAAE,QAAQ,KAAK,OAAQ;IAC1C,YAAY;IACZ,cAAc;GACf,EAAC;EACH,EAAC;CACH;;;;;;;;;CAWD,IAAW,eAAuC;AAChD,SAAO,KAAK,OAAO;CACpB;;;;;;CAOD,UAAUC,QAAiE;EACzE,MAAM,EAAE,QAAQ,SAAS,SAAS,GAAG;EAErC,IAAI,eAAe;AACnB,MAAI,UAAU,CAAC,SACb,eAAe,qBAAqB,QAAQ,QAAQ;AAGtD,MAAI,cACF,KAAK,OAAO,UAAU,EAAE,SAAS,aAAc,EAAC;AAGlD,MAAI,SACF,KAAK,OAAO,UAAU,EACpB,SAAS;GACP,gBAAgB;GAChB,GAAG,cAAc,KAAK,OAAO,MAAM;GACnC,GAAG;EACJ,EACF,EAAC;CAEL;;;;;;CAOD,SAASC,OAA+C;EACtD,KAAK,OAAO,QAAQ;EACpB,KAAK,OAAO,UAAU,EACpB,SAAS;GACP,gBAAgB;GAChB,GAAG,cAAc,MAAM;GACvB,GAAG,KAAK,OAAO;EAChB,EACF,EAAC;CACH;AACF;AAGD,SAAS,qBACPF,QACQ;CACR,MAAM,EAAE,OAAO,SAAS,MAAM,SAAS,UAAU,CAAE,GAAE,eAAe,OAAO,GAAG;CAE9E,MAAM,eAAe,WAAW,qBAAqB,QAAQ,QAAQ;AAErE,QAAO,aAAa;EAClB,SAAS;EACT,SAAS;GACP,gBAAgB;GAChB,GAAG,cAAc,MAAM;GACvB,GAAG;EACJ;EACD,cAAc,gBAAgB;CAC/B,EAAC;AACH;AAED,SAAS,cAAcE,OAAiE;AACtF,QAAO,iBAAiB,QAAQ,EAC9B,iBAAiB,MAAM,YACxB,IAAG,EACF,iBAAiB,MAAM,WACxB;AACF"}
1
+ {"version":3,"file":"index.mjs","names":["config: ManagementApiClientConfig<ThrowOnError>","config: Partial<Omit<ManagementApiClientConfig, 'token'>>","token: PersonalAccessToken | OAuthToken"],"sources":["../src/index.ts"],"sourcesContent":["// Import generated SDKs with shared client support\nimport { createClient } from './client';\nimport type { Client } from './client/types';\nimport { getManagementBaseUrl, type Region } from '@storyblok/region-helper';\nimport { sdkRegistry, SdkRegistryInstance } from './sdk-registry.generated';\n\ntype PersonalAccessToken = {\n accessToken: string;\n}\n\ntype OAuthToken = {\n oauthToken: string;\n}\n\nexport interface ManagementApiClientConfig<ThrowOnError extends boolean = false> {\n token: PersonalAccessToken | OAuthToken;\n region?: Region;\n baseUrl?: string; // Override for custom endpoints\n headers?: Record<string, string>;\n throwOnError?: ThrowOnError;\n}\n\nexport interface ManagementApiClient<ThrowOnError extends boolean = false> extends SdkRegistryInstance {}\nexport class ManagementApiClient<ThrowOnError extends boolean = false> {\n protected client: Client;\n protected config: ManagementApiClientConfig<ThrowOnError>;\n protected sdkCache: Record<string, Promise<any>> = {};\n\n constructor(config: ManagementApiClientConfig<ThrowOnError>) {\n this.config = config;\n this.client = createClientInstance(config);\n\n Object.entries(sdkRegistry).forEach(([name, Sdk]) => {\n Object.defineProperty(this, name, {\n get: () => new Sdk({ client: this.client as any }),\n enumerable: true,\n configurable: true\n });\n });\n }\n\n\n /**\n * @returns The client's interceptors\n * @example\n * client.interceptors.request.use((request, options) => {\n * console.log('Request:', request);\n * return request;\n * });\n */\n public get interceptors(): Client['interceptors'] {\n return this.client.interceptors;\n }\n\n /**\n * @param config - The configuration to set\n * @example\n * client.setConfig({ region: 'eu' });\n */\n setConfig(config: Partial<Omit<ManagementApiClientConfig, 'token'>>): void {\n const { region, baseUrl, headers } = config;\n \n if (headers) {\n this.client.setConfig({\n baseUrl: baseUrl || this.config.baseUrl,\n region: region || this.config.region!,\n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(this.config.token),\n ...headers\n }\n });\n }\n }\n\n /**\n * @param token - The token to set\n * @example\n * client.setToken({ accessToken: '123' });\n */\n setToken(token: PersonalAccessToken | OAuthToken): void {\n this.config.token = token;\n this.client.setConfig({\n region: this.config.region ?? \"eu\",\n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(token),\n ...this.config.headers\n }\n });\n }\n}\n\n// Pure functions for client creation and setup\nfunction createClientInstance<ThrowOnError extends boolean = false>(\n config: ManagementApiClientConfig<ThrowOnError>\n): Client {\n const { token, region = \"eu\", baseUrl, headers = {}, throwOnError = false } = config;\n \n return createClient({\n baseUrl,\n region,\n headers: {\n 'Content-Type': 'application/json',\n ...getAuthHeader(token),\n ...headers\n },\n throwOnError: throwOnError ?? false\n });\n}\n\nfunction getAuthHeader(token: PersonalAccessToken | OAuthToken): Record<string, string> {\n return 'accessToken' in token ? {\n 'Authorization': token.accessToken\n } : {\n 'Authorization': token.oauthToken\n }\n}\n\n// Export client utilities\nexport { createClient } from './client';\nexport type { Client } from './client/types';\n\n// Export all generated types\nexport * from './types.generated';\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,IAAa,sBAAb,MAAuE;CACrE,AAAU;CACV,AAAU;CACV,AAAU,WAAyC,CAAE;CAErD,YAAYA,QAAiD;EAC3D,KAAK,SAAS;EACd,KAAK,SAAS,qBAAqB,OAAO;EAE1C,OAAO,QAAQ,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,IAAI,KAAK;GACnD,OAAO,eAAe,MAAM,MAAM;IAChC,KAAK,MAAM,IAAI,IAAI,EAAE,QAAQ,KAAK,OAAe;IACjD,YAAY;IACZ,cAAc;GACf,EAAC;EACH,EAAC;CACH;;;;;;;;;CAWD,IAAW,eAAuC;AAChD,SAAO,KAAK,OAAO;CACpB;;;;;;CAOD,UAAUC,QAAiE;EACzE,MAAM,EAAE,QAAQ,SAAS,SAAS,GAAG;AAErC,MAAI,SACF,KAAK,OAAO,UAAU;GACpB,SAAS,WAAW,KAAK,OAAO;GAChC,QAAQ,UAAU,KAAK,OAAO;GAC9B,SAAS;IACP,gBAAgB;IAChB,GAAG,cAAc,KAAK,OAAO,MAAM;IACnC,GAAG;GACJ;EACF,EAAC;CAEL;;;;;;CAOD,SAASC,OAA+C;EACtD,KAAK,OAAO,QAAQ;EACpB,KAAK,OAAO,UAAU;GACpB,QAAQ,KAAK,OAAO,UAAU;GAC9B,SAAS;IACP,gBAAgB;IAChB,GAAG,cAAc,MAAM;IACvB,GAAG,KAAK,OAAO;GAChB;EACF,EAAC;CACH;AACF;AAGD,SAAS,qBACPF,QACQ;CACR,MAAM,EAAE,OAAO,SAAS,MAAM,SAAS,UAAU,CAAE,GAAE,eAAe,OAAO,GAAG;AAE9E,QAAO,aAAa;EAClB;EACA;EACA,SAAS;GACP,gBAAgB;GAChB,GAAG,cAAc,MAAM;GACvB,GAAG;EACJ;EACD,cAAc,gBAAgB;CAC/B,EAAC;AACH;AAED,SAAS,cAAcE,OAAiE;AACtF,QAAO,iBAAiB,QAAQ,EAC9B,iBAAiB,MAAM,YACxB,IAAG,EACF,iBAAiB,MAAM,WACxB;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@storyblok/management-api-client",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Storyblok Management API Client",
5
5
  "main": "./dist/index.js",
6
6
  "private": false,
@@ -32,7 +32,7 @@
32
32
  "author": "",
33
33
  "license": "MIT",
34
34
  "dependencies": {
35
- "@storyblok/region-helper": "1.3.0"
35
+ "@storyblok/region-helper": "1.3.1"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@hey-api/openapi-ts": "^0.80.1",