@storyblok/management-api-client 1.0.0-alpha.3 → 1.0.0-alpha.5

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.
Files changed (50) hide show
  1. package/dist/client.cjs +6 -0
  2. package/dist/client.cjs.map +1 -1
  3. package/dist/client.d.cts +134 -11
  4. package/dist/client.d.mts +134 -11
  5. package/dist/client.mjs +6 -0
  6. package/dist/client.mjs.map +1 -1
  7. package/dist/generated/mapi/types-aliased.gen.d.cts +2 -2
  8. package/dist/generated/mapi/types-aliased.gen.d.mts +2 -2
  9. package/dist/generated/mapi/types.gen.d.cts +2 -2
  10. package/dist/generated/mapi/types.gen.d.mts +2 -2
  11. package/dist/generated/types/block.d.cts +6 -0
  12. package/dist/generated/types/block.d.mts +6 -0
  13. package/dist/generated/types/field.d.cts +53 -18
  14. package/dist/generated/types/field.d.mts +53 -18
  15. package/dist/generated/types/mapi-story.d.cts +6 -6
  16. package/dist/generated/types/mapi-story.d.mts +6 -6
  17. package/dist/index.d.cts +4 -1
  18. package/dist/index.d.mts +4 -1
  19. package/dist/resources/assets.cjs +1 -0
  20. package/dist/resources/assets.cjs.map +1 -1
  21. package/dist/resources/assets.mjs +1 -1
  22. package/dist/resources/assets.mjs.map +1 -1
  23. package/dist/resources/datasource-entries.cjs +2 -1
  24. package/dist/resources/datasource-entries.cjs.map +1 -1
  25. package/dist/resources/datasource-entries.mjs +2 -1
  26. package/dist/resources/datasource-entries.mjs.map +1 -1
  27. package/dist/resources/shared-asset-folders.cjs +81 -0
  28. package/dist/resources/shared-asset-folders.cjs.map +1 -0
  29. package/dist/resources/shared-asset-folders.d.cts +41 -0
  30. package/dist/resources/shared-asset-folders.d.mts +41 -0
  31. package/dist/resources/shared-asset-folders.mjs +81 -0
  32. package/dist/resources/shared-asset-folders.mjs.map +1 -0
  33. package/dist/resources/shared-assets.cjs +197 -0
  34. package/dist/resources/shared-assets.cjs.map +1 -0
  35. package/dist/resources/shared-assets.d.cts +29 -0
  36. package/dist/resources/shared-assets.d.mts +28 -0
  37. package/dist/resources/shared-assets.mjs +197 -0
  38. package/dist/resources/shared-assets.mjs.map +1 -0
  39. package/dist/resources/shared-internal-tags.cjs +73 -0
  40. package/dist/resources/shared-internal-tags.cjs.map +1 -0
  41. package/dist/resources/shared-internal-tags.d.cts +32 -0
  42. package/dist/resources/shared-internal-tags.d.mts +32 -0
  43. package/dist/resources/shared-internal-tags.mjs +73 -0
  44. package/dist/resources/shared-internal-tags.mjs.map +1 -0
  45. package/dist/resources/stories.cjs.map +1 -1
  46. package/dist/resources/stories.d.cts +26 -26
  47. package/dist/resources/stories.d.mts +26 -26
  48. package/dist/resources/stories.mjs.map +1 -1
  49. package/package.json +3 -3
  50. package/playground/integration-tests/test/types/stories.test-d.ts +39 -2
package/dist/client.cjs CHANGED
@@ -14,6 +14,9 @@ const require_datasources = require('./resources/datasources.cjs');
14
14
  const require_experiments = require('./resources/experiments.cjs');
15
15
  const require_internal_tags = require('./resources/internal-tags.cjs');
16
16
  const require_presets = require('./resources/presets.cjs');
17
+ const require_shared_asset_folders = require('./resources/shared-asset-folders.cjs');
18
+ const require_shared_assets = require('./resources/shared-assets.cjs');
19
+ const require_shared_internal_tags = require('./resources/shared-internal-tags.cjs');
17
20
  const require_spaces = require('./resources/spaces.cjs');
18
21
  const require_stories = require('./resources/stories.cjs');
19
22
  const require_users = require('./resources/users.cjs');
@@ -165,6 +168,9 @@ function buildResources(deps, client) {
165
168
  post: httpPost,
166
169
  presets: require_presets.createPresetsResource(deps),
167
170
  put: httpPut,
171
+ sharedAssetFolders: require_shared_asset_folders.createSharedAssetFoldersResource(deps),
172
+ sharedAssets: require_shared_assets.createSharedAssetsResource(deps),
173
+ sharedInternalTags: require_shared_internal_tags.createSharedInternalTagsResource(deps),
168
174
  spaces: require_spaces.createSpacesResource(deps),
169
175
  users: require_users.createUsersResource({
170
176
  client,
@@ -1 +1 @@
1
- {"version":3,"file":"client.cjs","names":["createThrottleManager","createClient","createConfig","ClientError","createAssetFoldersResource","createAssetsResource","createComponentFoldersResource","createDatasourceEntriesResource","createDatasourcesResource","createExperimentsResource","createInternalTagsResource","createPresetsResource","createSpacesResource","createUsersResource","createComponentsResource","createStoriesResource"],"sources":["../src/client.ts"],"sourcesContent":["import type { Client, ResolvedRequestOptions, RetryOptions } from './generated/mapi/client';\nimport type { Middleware } from './generated/mapi/client/utils.gen';\nimport { createClient, createConfig } from './generated/mapi/client';\nimport { getManagementBaseUrl } from '@storyblok/region-helper';\nimport type { Region } from '@storyblok/region-helper';\nimport type { Block } from './generated/types/block';\nimport { ClientError } from './error';\nimport type { RateLimitConfig } from './utils/rate-limit';\nimport { createThrottleManager } from './utils/rate-limit';\nimport { querySerializer } from './utils/query-serializer';\nimport { createAssetFoldersResource } from './resources/asset-folders';\nimport { createAssetsResource } from './resources/assets';\nimport { createComponentFoldersResource } from './resources/component-folders';\nimport { createComponentsResource } from './resources/components';\nimport { createDatasourceEntriesResource } from './resources/datasource-entries';\nimport { createDatasourcesResource } from './resources/datasources';\nimport { createExperimentsResource } from './resources/experiments';\nimport { createInternalTagsResource } from './resources/internal-tags';\nimport { createPresetsResource } from './resources/presets';\nimport { createSpacesResource } from './resources/spaces';\nimport { createStoriesResource } from './resources/stories';\nimport { createUsersResource } from './resources/users';\n\n// ---------------------------------------------------------------------------\n// Client types (co-located with runtime)\n// ---------------------------------------------------------------------------\n\nexport type ApiResponse<T, ThrowOnError extends boolean = false> =\n ThrowOnError extends true\n ? { data: T; error?: never; response: Response; request: Request }\n : | { data: T; error: undefined; response: Response; request: Request }\n | { data: undefined; error: ClientError; response: Response; request: Request };\n\nexport interface RequestConfigOverrides {\n throwOnError?: boolean;\n}\n\n/**\n * Arbitrary options forwarded to the underlying `fetch()` call.\n *\n * Standard `RequestInit` properties (`cache`, `credentials`, `mode`, …) and\n * non-standard, vendor-specific properties (Next.js `next`, Cloudflare `cf`, …)\n * are both supported.\n *\n * @example\n * ```ts\n * client.stories.get(123, {\n * fetchOptions: {\n * cache: 'no-store',\n * next: { revalidate: 60 },\n * },\n * })\n * ```\n */\nexport type FetchOptions = Record<string, unknown>;\n\nexport interface HttpRequestOptions {\n query?: Record<string, unknown>;\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n throwOnError?: RequestConfigOverrides['throwOnError'];\n fetchOptions?: FetchOptions;\n}\n\n/**\n * Dependencies injected into every resource factory.\n */\nexport interface MapiResourceDeps<DefaultThrowOnError extends boolean = false> {\n client: Client;\n spaceId?: number;\n wrapRequest: <TData, ThrowOnError extends boolean = DefaultThrowOnError>(fn: () => Promise<unknown>, throwOnError?: ThrowOnError) => Promise<ApiResponse<TData, ThrowOnError>>;\n}\n\ntype TokenConfig =\n | {\n /** Personal access token for authentication. */\n personalAccessToken: string;\n oauthToken?: never;\n }\n | {\n personalAccessToken?: never;\n /** OAuth bearer token for authentication. */\n oauthToken: string;\n }\n | {\n personalAccessToken?: undefined;\n oauthToken?: undefined;\n };\n\nexport type ManagementApiClientConfig<\n ThrowOnError extends boolean = false,\n> = TokenConfig & {\n /**\n * The Storyblok space ID. Used as the default for space-scoped endpoints.\n * You can also override it per request via `path.space_id`.\n */\n spaceId?: number;\n /**\n * Storyblok region. Determines the base URL.\n * @default 'eu'\n */\n region?: Region;\n /**\n * Override the base URL entirely (e.g. for testing).\n */\n baseUrl?: string;\n /**\n * Additional request headers.\n */\n headers?: Record<string, string>;\n /**\n * Throw on HTTP errors instead of returning them.\n * @default false\n */\n throwOnError?: ThrowOnError;\n /**\n * Retry configuration for failed requests.\n */\n retry?: RetryOptions;\n /**\n * Request timeout in milliseconds.\n * @default 30_000\n */\n timeout?: number;\n /**\n * Preventive rate limiting to avoid hitting the Storyblok Management API rate limits.\n *\n * - `undefined` (default): single bucket at maxConcurrency: 6.\n * - `number`: fixed max concurrent requests per second.\n * - `{ maxConcurrency?: number; adaptToServerHeaders?: boolean }`: full config.\n * - `false`: disable rate limiting entirely.\n */\n rateLimit?: RateLimitConfig | number | false;\n};\n\n// ---------------------------------------------------------------------------\n// Client factory\n// ---------------------------------------------------------------------------\n\nfunction getAuthorizationHeader(config: ManagementApiClientConfig<boolean>): string | undefined {\n if (config.personalAccessToken) {\n return config.personalAccessToken;\n }\n if (config.oauthToken) {\n return config.oauthToken.startsWith('Bearer ')\n ? config.oauthToken\n : `Bearer ${config.oauthToken}`;\n }\n return undefined;\n}\n\nconst createManagementApiClientBase = <DefaultThrowOnError extends boolean = false>(\n config: ManagementApiClientConfig<DefaultThrowOnError>,\n): {\n deps: MapiResourceDeps<DefaultThrowOnError>;\n resources: Omit<ReturnType<typeof buildResources<DefaultThrowOnError>>, never>;\n} => {\n const {\n spaceId,\n region = 'eu',\n baseUrl,\n headers = {},\n throwOnError = false,\n retry = {\n limit: 12,\n backoffLimit: 20_000,\n methods: ['get', 'post', 'put', 'delete', 'patch', 'head', 'options', 'trace'],\n statusCodes: [429],\n },\n timeout = 30_000,\n rateLimit,\n } = config;\n\n const throttleManager = createThrottleManager(rateLimit ?? {});\n const authHeader = getAuthorizationHeader(config);\n\n const client: Client = createClient(\n createConfig({\n baseUrl: baseUrl || getManagementBaseUrl(region),\n headers: {\n ...(authHeader ? { Authorization: authHeader } : {}),\n ...headers,\n },\n // Default serializer throws on nested objects; MAPI needs `filter_query`\n // serialized as a nested hash (`filter_query[field][op]=value`).\n querySerializer,\n throwOnError,\n kyOptions: {\n throwHttpErrors: true,\n timeout,\n retry,\n },\n }),\n );\n\n client.interceptors.error.use(\n (error: unknown, response: Response) =>\n new ClientError(response?.statusText || 'API request failed', {\n status: response?.status ?? 0,\n statusText: response?.statusText ?? '',\n data: error,\n }),\n );\n\n function wrapRequest<TData, CurrentThrowOnError extends boolean = DefaultThrowOnError>(\n fn: () => Promise<unknown>,\n _throwOnError?: CurrentThrowOnError,\n ): Promise<ApiResponse<TData, CurrentThrowOnError>> {\n return throttleManager.execute(\n () => fn() as Promise<ApiResponse<TData, CurrentThrowOnError>>,\n );\n }\n\n const deps: MapiResourceDeps<DefaultThrowOnError> = { client, spaceId, wrapRequest };\n return { deps, resources: buildResources(deps, client) };\n};\n\nfunction buildResources<DefaultThrowOnError extends boolean = false>(\n deps: MapiResourceDeps<DefaultThrowOnError>,\n client: Client,\n) {\n /**\n * Escape hatch: send a GET request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpGet = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.get({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a POST request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPost = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.post({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a PUT request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPut = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.put({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a PATCH request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPatch = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.patch({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a DELETE request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpDelete = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.delete({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n return {\n assetFolders: createAssetFoldersResource(deps),\n assets: createAssetsResource(deps),\n componentFolders: createComponentFoldersResource(deps),\n datasourceEntries: createDatasourceEntriesResource(deps),\n datasources: createDatasourcesResource(deps),\n experiments: createExperimentsResource(deps),\n delete: httpDelete,\n get: httpGet,\n patch: httpPatch,\n interceptors: client.interceptors as Middleware<Request, Response, unknown, ResolvedRequestOptions>,\n internalTags: createInternalTagsResource(deps),\n post: httpPost,\n presets: createPresetsResource(deps),\n put: httpPut,\n spaces: createSpacesResource(deps),\n users: createUsersResource<DefaultThrowOnError>({ client, wrapRequest: deps.wrapRequest }),\n };\n}\n\ntype StoryblokTypesConfig = { components: Block } | { blocks: Block };\n\ntype ResolveComponents<T extends StoryblokTypesConfig> =\n T extends { components: infer C extends Block } ? C\n : T extends { blocks: infer B extends Block } ? B\n : never;\n\n/**\n * The return type of `createManagementApiClient`, parameterised by `TBlocks` so that\n * `.stories` methods can narrow story content types without touching the runtime object.\n * Component *definitions* (`.components`) are wire-shaped and not narrowed by `TBlocks`.\n */\nexport type ManagementApiClient<\n TBlocks extends Block = Block,\n DefaultThrowOnError extends boolean = false,\n> = ReturnType<typeof buildResources<DefaultThrowOnError>> & {\n components: ReturnType<typeof createComponentsResource<DefaultThrowOnError>>;\n stories: ReturnType<typeof createStoriesResource<TBlocks, DefaultThrowOnError>>;\n /**\n * Returns the same client instance cast to a version that narrows story content\n * to the provided component types. No runtime cost — type parameter is erased.\n *\n * Accepts either `{ components: ... }` or `{ blocks: ... }` — the latter matches the\n * `Schema` type produced by `@storyblok/schema`'s `InferSchema`.\n *\n * @example\n * ```ts\n * import type { Schema } from './schema';\n *\n * const client = createManagementApiClient({ personalAccessToken: '...' })\n * .withTypes<Schema>();\n * ```\n */\n withTypes: <T extends StoryblokTypesConfig>() => ManagementApiClient<ResolveComponents<T>, DefaultThrowOnError>;\n};\n\nexport const createManagementApiClient = <\n DefaultThrowOnError extends boolean = false,\n>(\n config: ManagementApiClientConfig<DefaultThrowOnError>,\n): ManagementApiClient<Block, DefaultThrowOnError> => {\n const { deps, resources } = createManagementApiClientBase(config);\n const self: ManagementApiClient<Block, DefaultThrowOnError> = {\n ...resources,\n components: createComponentsResource<DefaultThrowOnError>(deps),\n stories: createStoriesResource<Block, DefaultThrowOnError>(deps),\n withTypes<T extends StoryblokTypesConfig>() {\n return self as unknown as ManagementApiClient<ResolveComponents<T>, DefaultThrowOnError>;\n },\n };\n return self;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.cjs","names":["createThrottleManager","createClient","createConfig","ClientError","createAssetFoldersResource","createAssetsResource","createComponentFoldersResource","createDatasourceEntriesResource","createDatasourcesResource","createExperimentsResource","createInternalTagsResource","createPresetsResource","createSharedAssetFoldersResource","createSharedAssetsResource","createSharedInternalTagsResource","createSpacesResource","createUsersResource","createComponentsResource","createStoriesResource"],"sources":["../src/client.ts"],"sourcesContent":["import type { Client, ResolvedRequestOptions, RetryOptions } from './generated/mapi/client';\nimport type { Middleware } from './generated/mapi/client/utils.gen';\nimport { createClient, createConfig } from './generated/mapi/client';\nimport { getManagementBaseUrl } from '@storyblok/region-helper';\nimport type { Region } from '@storyblok/region-helper';\nimport type { Block } from './generated/types/block';\nimport { ClientError } from './error';\nimport type { RateLimitConfig } from './utils/rate-limit';\nimport { createThrottleManager } from './utils/rate-limit';\nimport { querySerializer } from './utils/query-serializer';\nimport { createAssetFoldersResource } from './resources/asset-folders';\nimport { createAssetsResource } from './resources/assets';\nimport { createComponentFoldersResource } from './resources/component-folders';\nimport { createComponentsResource } from './resources/components';\nimport { createDatasourceEntriesResource } from './resources/datasource-entries';\nimport { createDatasourcesResource } from './resources/datasources';\nimport { createExperimentsResource } from './resources/experiments';\nimport { createInternalTagsResource } from './resources/internal-tags';\nimport { createPresetsResource } from './resources/presets';\nimport { createSharedAssetFoldersResource } from './resources/shared-asset-folders';\nimport { createSharedAssetsResource } from './resources/shared-assets';\nimport { createSharedInternalTagsResource } from './resources/shared-internal-tags';\nimport { createSpacesResource } from './resources/spaces';\nimport { createStoriesResource } from './resources/stories';\nimport { createUsersResource } from './resources/users';\n\n// ---------------------------------------------------------------------------\n// Client types (co-located with runtime)\n// ---------------------------------------------------------------------------\n\nexport type ApiResponse<T, ThrowOnError extends boolean = false> =\n ThrowOnError extends true\n ? { data: T; error?: never; response: Response; request: Request }\n : | { data: T; error: undefined; response: Response; request: Request }\n | { data: undefined; error: ClientError; response: Response; request: Request };\n\nexport interface RequestConfigOverrides {\n throwOnError?: boolean;\n}\n\n/**\n * Arbitrary options forwarded to the underlying `fetch()` call.\n *\n * Standard `RequestInit` properties (`cache`, `credentials`, `mode`, …) and\n * non-standard, vendor-specific properties (Next.js `next`, Cloudflare `cf`, …)\n * are both supported.\n *\n * @example\n * ```ts\n * client.stories.get(123, {\n * fetchOptions: {\n * cache: 'no-store',\n * next: { revalidate: 60 },\n * },\n * })\n * ```\n */\nexport type FetchOptions = Record<string, unknown>;\n\nexport interface HttpRequestOptions {\n query?: Record<string, unknown>;\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n throwOnError?: RequestConfigOverrides['throwOnError'];\n fetchOptions?: FetchOptions;\n}\n\n/**\n * Dependencies injected into every resource factory.\n */\nexport interface MapiResourceDeps<DefaultThrowOnError extends boolean = false> {\n client: Client;\n spaceId?: number;\n wrapRequest: <TData, ThrowOnError extends boolean = DefaultThrowOnError>(fn: () => Promise<unknown>, throwOnError?: ThrowOnError) => Promise<ApiResponse<TData, ThrowOnError>>;\n}\n\ntype TokenConfig =\n | {\n /** Personal access token for authentication. */\n personalAccessToken: string;\n oauthToken?: never;\n }\n | {\n personalAccessToken?: never;\n /** OAuth bearer token for authentication. */\n oauthToken: string;\n }\n | {\n personalAccessToken?: undefined;\n oauthToken?: undefined;\n };\n\nexport type ManagementApiClientConfig<\n ThrowOnError extends boolean = false,\n> = TokenConfig & {\n /**\n * The Storyblok space ID. Used as the default for space-scoped endpoints.\n * You can also override it per request via `path.space_id`.\n */\n spaceId?: number;\n /**\n * Storyblok region. Determines the base URL.\n * @default 'eu'\n */\n region?: Region;\n /**\n * Override the base URL entirely (e.g. for testing).\n */\n baseUrl?: string;\n /**\n * Additional request headers.\n */\n headers?: Record<string, string>;\n /**\n * Throw on HTTP errors instead of returning them.\n * @default false\n */\n throwOnError?: ThrowOnError;\n /**\n * Retry configuration for failed requests.\n */\n retry?: RetryOptions;\n /**\n * Request timeout in milliseconds.\n * @default 30_000\n */\n timeout?: number;\n /**\n * Preventive rate limiting to avoid hitting the Storyblok Management API rate limits.\n *\n * - `undefined` (default): single bucket at maxConcurrency: 6.\n * - `number`: fixed max concurrent requests per second.\n * - `{ maxConcurrency?: number; adaptToServerHeaders?: boolean }`: full config.\n * - `false`: disable rate limiting entirely.\n */\n rateLimit?: RateLimitConfig | number | false;\n};\n\n// ---------------------------------------------------------------------------\n// Client factory\n// ---------------------------------------------------------------------------\n\nfunction getAuthorizationHeader(config: ManagementApiClientConfig<boolean>): string | undefined {\n if (config.personalAccessToken) {\n return config.personalAccessToken;\n }\n if (config.oauthToken) {\n return config.oauthToken.startsWith('Bearer ')\n ? config.oauthToken\n : `Bearer ${config.oauthToken}`;\n }\n return undefined;\n}\n\nconst createManagementApiClientBase = <DefaultThrowOnError extends boolean = false>(\n config: ManagementApiClientConfig<DefaultThrowOnError>,\n): {\n deps: MapiResourceDeps<DefaultThrowOnError>;\n resources: Omit<ReturnType<typeof buildResources<DefaultThrowOnError>>, never>;\n} => {\n const {\n spaceId,\n region = 'eu',\n baseUrl,\n headers = {},\n throwOnError = false,\n retry = {\n limit: 12,\n backoffLimit: 20_000,\n methods: ['get', 'post', 'put', 'delete', 'patch', 'head', 'options', 'trace'],\n statusCodes: [429],\n },\n timeout = 30_000,\n rateLimit,\n } = config;\n\n const throttleManager = createThrottleManager(rateLimit ?? {});\n const authHeader = getAuthorizationHeader(config);\n\n const client: Client = createClient(\n createConfig({\n baseUrl: baseUrl || getManagementBaseUrl(region),\n headers: {\n ...(authHeader ? { Authorization: authHeader } : {}),\n ...headers,\n },\n // Default serializer throws on nested objects; MAPI needs `filter_query`\n // serialized as a nested hash (`filter_query[field][op]=value`).\n querySerializer,\n throwOnError,\n kyOptions: {\n throwHttpErrors: true,\n timeout,\n retry,\n },\n }),\n );\n\n client.interceptors.error.use(\n (error: unknown, response: Response) =>\n new ClientError(response?.statusText || 'API request failed', {\n status: response?.status ?? 0,\n statusText: response?.statusText ?? '',\n data: error,\n }),\n );\n\n function wrapRequest<TData, CurrentThrowOnError extends boolean = DefaultThrowOnError>(\n fn: () => Promise<unknown>,\n _throwOnError?: CurrentThrowOnError,\n ): Promise<ApiResponse<TData, CurrentThrowOnError>> {\n return throttleManager.execute(\n () => fn() as Promise<ApiResponse<TData, CurrentThrowOnError>>,\n );\n }\n\n const deps: MapiResourceDeps<DefaultThrowOnError> = { client, spaceId, wrapRequest };\n return { deps, resources: buildResources(deps, client) };\n};\n\nfunction buildResources<DefaultThrowOnError extends boolean = false>(\n deps: MapiResourceDeps<DefaultThrowOnError>,\n client: Client,\n) {\n /**\n * Escape hatch: send a GET request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpGet = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.get({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a POST request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPost = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.post({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a PUT request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPut = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.put({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a PATCH request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPatch = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.patch({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a DELETE request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpDelete = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.delete({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n return {\n assetFolders: createAssetFoldersResource(deps),\n assets: createAssetsResource(deps),\n componentFolders: createComponentFoldersResource(deps),\n datasourceEntries: createDatasourceEntriesResource(deps),\n datasources: createDatasourcesResource(deps),\n experiments: createExperimentsResource(deps),\n delete: httpDelete,\n get: httpGet,\n patch: httpPatch,\n interceptors: client.interceptors as Middleware<Request, Response, unknown, ResolvedRequestOptions>,\n internalTags: createInternalTagsResource(deps),\n post: httpPost,\n presets: createPresetsResource(deps),\n put: httpPut,\n sharedAssetFolders: createSharedAssetFoldersResource(deps),\n sharedAssets: createSharedAssetsResource(deps),\n sharedInternalTags: createSharedInternalTagsResource(deps),\n spaces: createSpacesResource(deps),\n users: createUsersResource<DefaultThrowOnError>({ client, wrapRequest: deps.wrapRequest }),\n };\n}\n\ntype StoryblokTypesConfig = { components: Block } | { blocks: Block };\n\ntype ResolveComponents<T extends StoryblokTypesConfig> =\n T extends { components: infer C extends Block } ? C\n : T extends { blocks: infer B extends Block } ? B\n : never;\n\n/** Extracts the `fieldType → value` plugin map from a Schema, defaulting to an empty map. */\ntype ResolveFieldPlugins<T> = T extends { fieldPlugins: infer P } ? P : Record<never, never>;\n\n/**\n * The return type of `createManagementApiClient`, parameterised by `TBlocks` so that\n * `.stories` methods can narrow story content types without touching the runtime object.\n * Component *definitions* (`.components`) are wire-shaped and not narrowed by `TBlocks`.\n */\nexport type ManagementApiClient<\n TBlocks extends Block = Block,\n TFieldPlugins = Record<never, never>,\n DefaultThrowOnError extends boolean = false,\n> = ReturnType<typeof buildResources<DefaultThrowOnError>> & {\n components: ReturnType<typeof createComponentsResource<DefaultThrowOnError>>;\n stories: ReturnType<typeof createStoriesResource<TBlocks, TFieldPlugins, DefaultThrowOnError>>;\n /**\n * Returns the same client instance cast to a version that narrows story content\n * to the provided component types. No runtime cost — type parameter is erased.\n *\n * Accepts either `{ components: ... }` or `{ blocks: ... }` — the latter matches the\n * `Schema` type produced by `@storyblok/schema`'s `InferSchema`.\n *\n * @example\n * ```ts\n * import type { Schema } from './schema';\n *\n * const client = createManagementApiClient({ personalAccessToken: '...' })\n * .withTypes<Schema>();\n * ```\n */\n withTypes: <T extends StoryblokTypesConfig>() => ManagementApiClient<ResolveComponents<T>, ResolveFieldPlugins<T>, DefaultThrowOnError>;\n};\n\nexport const createManagementApiClient = <\n DefaultThrowOnError extends boolean = false,\n>(\n config: ManagementApiClientConfig<DefaultThrowOnError>,\n): ManagementApiClient<Block, Record<never, never>, DefaultThrowOnError> => {\n const { deps, resources } = createManagementApiClientBase(config);\n const self: ManagementApiClient<Block, Record<never, never>, DefaultThrowOnError> = {\n ...resources,\n components: createComponentsResource<DefaultThrowOnError>(deps),\n stories: createStoriesResource<Block, Record<never, never>, DefaultThrowOnError>(deps),\n withTypes<T extends StoryblokTypesConfig>() {\n return self as unknown as ManagementApiClient<ResolveComponents<T>, ResolveFieldPlugins<T>, DefaultThrowOnError>;\n },\n };\n return self;\n};\n"],"mappings":"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"}
package/dist/client.d.cts CHANGED
@@ -2,13 +2,16 @@ import { ActivateExperimentData, ActivateExperimentResponses, Asset, AssetFolder
2
2
  import { Middleware } from "./generated/mapi/client/utils.gen.cjs";
3
3
  import { Client, ResolvedRequestOptions, RetryOptions } from "./generated/mapi/client/types.gen.cjs";
4
4
  import { SpaceIdPathOverride } from "./resources/shared.cjs";
5
- import { Asset as Asset$1 } from "./generated/mapi/types-aliased.gen.cjs";
5
+ import { Asset as Asset$1, AssetUpdate } from "./generated/mapi/types-aliased.gen.cjs";
6
6
  import { AssetCreate, AssetUploadRequest, ListAssetsResult } from "./resources/assets.cjs";
7
7
  import { Block } from "./generated/types/block.cjs";
8
8
  import { ClientError } from "./error.cjs";
9
9
  import { RateLimitConfig } from "./utils/rate-limit.cjs";
10
10
  import { createComponentsResource } from "./resources/components.cjs";
11
11
  import { createStoriesResource } from "./resources/stories.cjs";
12
+ import { SharedAssetFolderCreate, SharedAssetFolderGetResponse, SharedAssetFolderListResponse, SharedAssetFolderUpdate } from "./resources/shared-asset-folders.cjs";
13
+ import { SharedAssetCreate, SharedAssetListQuery, SharedAssetListResponse, SharedAssetUploadRequest } from "./resources/shared-assets.cjs";
14
+ import { SharedInternalTagCreate, SharedInternalTagListQuery, SharedInternalTagListResponse, SharedInternalTagMutateResponse } from "./resources/shared-internal-tags.cjs";
12
15
  import { Region } from "@storyblok/region-helper";
13
16
 
14
17
  //#region src/client.d.ts
@@ -299,6 +302,9 @@ declare function buildResources<DefaultThrowOnError extends boolean = false>(dep
299
302
  } & SpaceIdPathOverride): Promise<ApiResponse<DatasourceEntryShowResponse, ThrowOnError>>;
300
303
  update<ThrowOnError extends boolean = DefaultThrowOnError>(datasourceEntryId: number, options: {
301
304
  body: PartialUpdateDatasourceEntryData["body"];
305
+ query?: {
306
+ dimension_id?: number;
307
+ } | undefined;
302
308
  signal?: AbortSignal;
303
309
  throwOnError?: ThrowOnError | undefined;
304
310
  fetchOptions?: FetchOptions;
@@ -412,12 +418,7 @@ declare function buildResources<DefaultThrowOnError extends boolean = false>(dep
412
418
  fetchOptions?: FetchOptions;
413
419
  } & SpaceIdPathOverride): Promise<ApiResponse<CompleteExperimentWithWinnerResponses[200], ThrowOnError>>;
414
420
  selectWinner<ThrowOnError extends boolean = false>(experimentId: number | string, variantId: number, options?: {
415
- signal?
416
- /**
417
- * Escape hatch: send a PUT request to any MAPI endpoint not yet wrapped
418
- * in a dedicated resource method.
419
- */
420
- : AbortSignal;
421
+ signal?: AbortSignal;
421
422
  throwOnError?: ThrowOnError;
422
423
  fetchOptions?: FetchOptions;
423
424
  } & SpaceIdPathOverride): Promise<ApiResponse<SelectExperimentWinnerResponses[200], ThrowOnError>>;
@@ -538,6 +539,124 @@ declare function buildResources<DefaultThrowOnError extends boolean = false>(dep
538
539
  }, ThrowOnError>>;
539
540
  };
540
541
  put: <TData = unknown>(path: string, options?: HttpRequestOptions) => Promise<ApiResponse<TData, DefaultThrowOnError>>;
542
+ sharedAssetFolders: {
543
+ list<ThrowOnError extends boolean = false>(options?: {
544
+ query?: {
545
+ search?: string;
546
+ with_parent?: string;
547
+ by_ids?: string;
548
+ } | undefined;
549
+ signal?: AbortSignal;
550
+ throwOnError?: ThrowOnError | undefined;
551
+ fetchOptions?: FetchOptions;
552
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedAssetFolderListResponse, ThrowOnError>>;
553
+ get<ThrowOnError extends boolean = false>(folderId: number | string, options?: {
554
+ signal?: AbortSignal;
555
+ throwOnError?: ThrowOnError | undefined;
556
+ fetchOptions?: FetchOptions;
557
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedAssetFolderGetResponse, ThrowOnError>>;
558
+ create<ThrowOnError extends boolean = false>(options: {
559
+ body: {
560
+ shared_asset_folder: SharedAssetFolderCreate;
561
+ };
562
+ signal?: AbortSignal;
563
+ throwOnError?: ThrowOnError | undefined;
564
+ fetchOptions?: FetchOptions;
565
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedAssetFolderGetResponse, ThrowOnError>>;
566
+ update<ThrowOnError extends boolean = false>(folderId: number | string, options: {
567
+ body: {
568
+ shared_asset_folder: SharedAssetFolderUpdate;
569
+ };
570
+ signal?: AbortSignal;
571
+ throwOnError?: ThrowOnError | undefined;
572
+ fetchOptions?: FetchOptions;
573
+ } & SpaceIdPathOverride): Promise<ApiResponse<void, ThrowOnError>>;
574
+ delete<ThrowOnError extends boolean = false>(folderId: number | string, options?: {
575
+ query?: {
576
+ recursive?: boolean;
577
+ } | undefined;
578
+ signal?: AbortSignal;
579
+ throwOnError?: ThrowOnError | undefined;
580
+ fetchOptions?: FetchOptions;
581
+ } & SpaceIdPathOverride): Promise<ApiResponse<void, ThrowOnError>>;
582
+ };
583
+ sharedAssets: {
584
+ list<ThrowOnError extends boolean = false>(options?: {
585
+ query?: SharedAssetListQuery;
586
+ signal?: AbortSignal;
587
+ throwOnError?: ThrowOnError | undefined;
588
+ fetchOptions?: FetchOptions;
589
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedAssetListResponse, ThrowOnError>>;
590
+ get<ThrowOnError extends boolean = false>(assetId: number | string, options?: {
591
+ signal?: AbortSignal;
592
+ throwOnError?: ThrowOnError | undefined;
593
+ fetchOptions?: FetchOptions;
594
+ } & SpaceIdPathOverride): Promise<ApiResponse<Asset$1, ThrowOnError>>;
595
+ upload(options: {
596
+ body: SharedAssetUploadRequest;
597
+ file: Blob | ArrayBuffer;
598
+ signal?: AbortSignal;
599
+ fetchOptions?: FetchOptions;
600
+ } & SpaceIdPathOverride): Promise<Asset$1>;
601
+ create(options: {
602
+ body: SharedAssetCreate;
603
+ file: Blob | ArrayBuffer;
604
+ signal?: AbortSignal;
605
+ fetchOptions?: FetchOptions;
606
+ } & SpaceIdPathOverride): Promise<Asset$1>;
607
+ update(assetId: number | string, options: ({
608
+ body: {
609
+ asset: AssetUpdate;
610
+ };
611
+ file?: undefined;
612
+ } | {
613
+ body: {
614
+ asset: AssetUpdate;
615
+ short_filename: string;
616
+ };
617
+ file: Blob | ArrayBuffer;
618
+ }) & {
619
+ signal?: AbortSignal;
620
+ fetchOptions?: FetchOptions;
621
+ } & SpaceIdPathOverride): Promise<void>;
622
+ delete<ThrowOnError extends boolean = false>(assetId: number | string, options?: {
623
+ signal?: AbortSignal;
624
+ throwOnError?: ThrowOnError | undefined;
625
+ fetchOptions?: FetchOptions;
626
+ } & SpaceIdPathOverride): Promise<ApiResponse<Asset$1, ThrowOnError>>;
627
+ };
628
+ sharedInternalTags: {
629
+ list<ThrowOnError extends boolean = false>(options: {
630
+ query: SharedInternalTagListQuery;
631
+ signal?: AbortSignal;
632
+ throwOnError?: ThrowOnError | undefined;
633
+ fetchOptions?: FetchOptions;
634
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedInternalTagListResponse, ThrowOnError>>;
635
+ create<ThrowOnError extends boolean = false>(options: {
636
+ body: {
637
+ shared_internal_tag: SharedInternalTagCreate;
638
+ };
639
+ signal?: AbortSignal;
640
+ throwOnError?: ThrowOnError | undefined;
641
+ fetchOptions?: FetchOptions;
642
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedInternalTagMutateResponse, ThrowOnError>>;
643
+ update<ThrowOnError extends boolean = false>(tagId: number, options: {
644
+ body: {
645
+ shared_internal_tag: SharedInternalTagCreate;
646
+ };
647
+ signal?: AbortSignal;
648
+ throwOnError?: ThrowOnError | undefined;
649
+ fetchOptions?: FetchOptions;
650
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedInternalTagMutateResponse, ThrowOnError>>;
651
+ delete<ThrowOnError extends boolean = false>(tagId: number, options: {
652
+ query: {
653
+ asset_folder_id: number;
654
+ };
655
+ signal?: AbortSignal;
656
+ throwOnError?: ThrowOnError | undefined;
657
+ fetchOptions?: FetchOptions;
658
+ } & SpaceIdPathOverride): Promise<ApiResponse<void, ThrowOnError>>;
659
+ };
541
660
  spaces: {
542
661
  list<ThrowOnError extends boolean = DefaultThrowOnError>(options?: {
543
662
  query?: ListSpacesData["query"];
@@ -607,14 +726,18 @@ type ResolveComponents<T extends StoryblokTypesConfig> = T extends {
607
726
  } ? C : T extends {
608
727
  blocks: infer B extends Block;
609
728
  } ? B : never;
729
+ /** Extracts the `fieldType → value` plugin map from a Schema, defaulting to an empty map. */
730
+ type ResolveFieldPlugins<T> = T extends {
731
+ fieldPlugins: infer P;
732
+ } ? P : Record<never, never>;
610
733
  /**
611
734
  * The return type of `createManagementApiClient`, parameterised by `TBlocks` so that
612
735
  * `.stories` methods can narrow story content types without touching the runtime object.
613
736
  * Component *definitions* (`.components`) are wire-shaped and not narrowed by `TBlocks`.
614
737
  */
615
- type ManagementApiClient<TBlocks extends Block = Block, DefaultThrowOnError extends boolean = false> = ReturnType<typeof buildResources<DefaultThrowOnError>> & {
738
+ type ManagementApiClient<TBlocks extends Block = Block, TFieldPlugins = Record<never, never>, DefaultThrowOnError extends boolean = false> = ReturnType<typeof buildResources<DefaultThrowOnError>> & {
616
739
  components: ReturnType<typeof createComponentsResource<DefaultThrowOnError>>;
617
- stories: ReturnType<typeof createStoriesResource<TBlocks, DefaultThrowOnError>>;
740
+ stories: ReturnType<typeof createStoriesResource<TBlocks, TFieldPlugins, DefaultThrowOnError>>;
618
741
  /**
619
742
  * Returns the same client instance cast to a version that narrows story content
620
743
  * to the provided component types. No runtime cost — type parameter is erased.
@@ -630,9 +753,9 @@ type ManagementApiClient<TBlocks extends Block = Block, DefaultThrowOnError exte
630
753
  * .withTypes<Schema>();
631
754
  * ```
632
755
  */
633
- withTypes: <T extends StoryblokTypesConfig>() => ManagementApiClient<ResolveComponents<T>, DefaultThrowOnError>;
756
+ withTypes: <T extends StoryblokTypesConfig>() => ManagementApiClient<ResolveComponents<T>, ResolveFieldPlugins<T>, DefaultThrowOnError>;
634
757
  };
635
- declare const createManagementApiClient: <DefaultThrowOnError extends boolean = false>(config: ManagementApiClientConfig<DefaultThrowOnError>) => ManagementApiClient<Block, DefaultThrowOnError>;
758
+ declare const createManagementApiClient: <DefaultThrowOnError extends boolean = false>(config: ManagementApiClientConfig<DefaultThrowOnError>) => ManagementApiClient<Block, Record<never, never>, DefaultThrowOnError>;
636
759
  //#endregion
637
760
  export { ApiResponse, FetchOptions, HttpRequestOptions, ManagementApiClient, ManagementApiClientConfig, MapiResourceDeps, RequestConfigOverrides, createManagementApiClient };
638
761
  //# sourceMappingURL=client.d.cts.map
package/dist/client.d.mts CHANGED
@@ -2,13 +2,16 @@ import { ActivateExperimentData, ActivateExperimentResponses, Asset, AssetFolder
2
2
  import { Middleware } from "./generated/mapi/client/utils.gen.mjs";
3
3
  import { Client, ResolvedRequestOptions, RetryOptions } from "./generated/mapi/client/types.gen.mjs";
4
4
  import { SpaceIdPathOverride } from "./resources/shared.mjs";
5
- import { Asset as Asset$1 } from "./generated/mapi/types-aliased.gen.mjs";
5
+ import { Asset as Asset$1, AssetUpdate } from "./generated/mapi/types-aliased.gen.mjs";
6
6
  import { AssetCreate, AssetUploadRequest, ListAssetsResult } from "./resources/assets.mjs";
7
7
  import { Block } from "./generated/types/block.mjs";
8
8
  import { ClientError } from "./error.mjs";
9
9
  import { RateLimitConfig } from "./utils/rate-limit.mjs";
10
10
  import { createComponentsResource } from "./resources/components.mjs";
11
11
  import { createStoriesResource } from "./resources/stories.mjs";
12
+ import { SharedAssetFolderCreate, SharedAssetFolderGetResponse, SharedAssetFolderListResponse, SharedAssetFolderUpdate } from "./resources/shared-asset-folders.mjs";
13
+ import { SharedAssetCreate, SharedAssetListQuery, SharedAssetListResponse, SharedAssetUploadRequest } from "./resources/shared-assets.mjs";
14
+ import { SharedInternalTagCreate, SharedInternalTagListQuery, SharedInternalTagListResponse, SharedInternalTagMutateResponse } from "./resources/shared-internal-tags.mjs";
12
15
  import { Region } from "@storyblok/region-helper";
13
16
 
14
17
  //#region src/client.d.ts
@@ -299,6 +302,9 @@ declare function buildResources<DefaultThrowOnError extends boolean = false>(dep
299
302
  } & SpaceIdPathOverride): Promise<ApiResponse<DatasourceEntryShowResponse, ThrowOnError>>;
300
303
  update<ThrowOnError extends boolean = DefaultThrowOnError>(datasourceEntryId: number, options: {
301
304
  body: PartialUpdateDatasourceEntryData["body"];
305
+ query?: {
306
+ dimension_id?: number;
307
+ } | undefined;
302
308
  signal?: AbortSignal;
303
309
  throwOnError?: ThrowOnError | undefined;
304
310
  fetchOptions?: FetchOptions;
@@ -412,12 +418,7 @@ declare function buildResources<DefaultThrowOnError extends boolean = false>(dep
412
418
  fetchOptions?: FetchOptions;
413
419
  } & SpaceIdPathOverride): Promise<ApiResponse<CompleteExperimentWithWinnerResponses[200], ThrowOnError>>;
414
420
  selectWinner<ThrowOnError extends boolean = false>(experimentId: number | string, variantId: number, options?: {
415
- signal?
416
- /**
417
- * Escape hatch: send a PUT request to any MAPI endpoint not yet wrapped
418
- * in a dedicated resource method.
419
- */
420
- : AbortSignal;
421
+ signal?: AbortSignal;
421
422
  throwOnError?: ThrowOnError;
422
423
  fetchOptions?: FetchOptions;
423
424
  } & SpaceIdPathOverride): Promise<ApiResponse<SelectExperimentWinnerResponses[200], ThrowOnError>>;
@@ -538,6 +539,124 @@ declare function buildResources<DefaultThrowOnError extends boolean = false>(dep
538
539
  }, ThrowOnError>>;
539
540
  };
540
541
  put: <TData = unknown>(path: string, options?: HttpRequestOptions) => Promise<ApiResponse<TData, DefaultThrowOnError>>;
542
+ sharedAssetFolders: {
543
+ list<ThrowOnError extends boolean = false>(options?: {
544
+ query?: {
545
+ search?: string;
546
+ with_parent?: string;
547
+ by_ids?: string;
548
+ } | undefined;
549
+ signal?: AbortSignal;
550
+ throwOnError?: ThrowOnError | undefined;
551
+ fetchOptions?: FetchOptions;
552
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedAssetFolderListResponse, ThrowOnError>>;
553
+ get<ThrowOnError extends boolean = false>(folderId: number | string, options?: {
554
+ signal?: AbortSignal;
555
+ throwOnError?: ThrowOnError | undefined;
556
+ fetchOptions?: FetchOptions;
557
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedAssetFolderGetResponse, ThrowOnError>>;
558
+ create<ThrowOnError extends boolean = false>(options: {
559
+ body: {
560
+ shared_asset_folder: SharedAssetFolderCreate;
561
+ };
562
+ signal?: AbortSignal;
563
+ throwOnError?: ThrowOnError | undefined;
564
+ fetchOptions?: FetchOptions;
565
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedAssetFolderGetResponse, ThrowOnError>>;
566
+ update<ThrowOnError extends boolean = false>(folderId: number | string, options: {
567
+ body: {
568
+ shared_asset_folder: SharedAssetFolderUpdate;
569
+ };
570
+ signal?: AbortSignal;
571
+ throwOnError?: ThrowOnError | undefined;
572
+ fetchOptions?: FetchOptions;
573
+ } & SpaceIdPathOverride): Promise<ApiResponse<void, ThrowOnError>>;
574
+ delete<ThrowOnError extends boolean = false>(folderId: number | string, options?: {
575
+ query?: {
576
+ recursive?: boolean;
577
+ } | undefined;
578
+ signal?: AbortSignal;
579
+ throwOnError?: ThrowOnError | undefined;
580
+ fetchOptions?: FetchOptions;
581
+ } & SpaceIdPathOverride): Promise<ApiResponse<void, ThrowOnError>>;
582
+ };
583
+ sharedAssets: {
584
+ list<ThrowOnError extends boolean = false>(options?: {
585
+ query?: SharedAssetListQuery;
586
+ signal?: AbortSignal;
587
+ throwOnError?: ThrowOnError | undefined;
588
+ fetchOptions?: FetchOptions;
589
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedAssetListResponse, ThrowOnError>>;
590
+ get<ThrowOnError extends boolean = false>(assetId: number | string, options?: {
591
+ signal?: AbortSignal;
592
+ throwOnError?: ThrowOnError | undefined;
593
+ fetchOptions?: FetchOptions;
594
+ } & SpaceIdPathOverride): Promise<ApiResponse<Asset$1, ThrowOnError>>;
595
+ upload(options: {
596
+ body: SharedAssetUploadRequest;
597
+ file: Blob | ArrayBuffer;
598
+ signal?: AbortSignal;
599
+ fetchOptions?: FetchOptions;
600
+ } & SpaceIdPathOverride): Promise<Asset$1>;
601
+ create(options: {
602
+ body: SharedAssetCreate;
603
+ file: Blob | ArrayBuffer;
604
+ signal?: AbortSignal;
605
+ fetchOptions?: FetchOptions;
606
+ } & SpaceIdPathOverride): Promise<Asset$1>;
607
+ update(assetId: number | string, options: ({
608
+ body: {
609
+ asset: AssetUpdate;
610
+ };
611
+ file?: undefined;
612
+ } | {
613
+ body: {
614
+ asset: AssetUpdate;
615
+ short_filename: string;
616
+ };
617
+ file: Blob | ArrayBuffer;
618
+ }) & {
619
+ signal?: AbortSignal;
620
+ fetchOptions?: FetchOptions;
621
+ } & SpaceIdPathOverride): Promise<void>;
622
+ delete<ThrowOnError extends boolean = false>(assetId: number | string, options?: {
623
+ signal?: AbortSignal;
624
+ throwOnError?: ThrowOnError | undefined;
625
+ fetchOptions?: FetchOptions;
626
+ } & SpaceIdPathOverride): Promise<ApiResponse<Asset$1, ThrowOnError>>;
627
+ };
628
+ sharedInternalTags: {
629
+ list<ThrowOnError extends boolean = false>(options: {
630
+ query: SharedInternalTagListQuery;
631
+ signal?: AbortSignal;
632
+ throwOnError?: ThrowOnError | undefined;
633
+ fetchOptions?: FetchOptions;
634
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedInternalTagListResponse, ThrowOnError>>;
635
+ create<ThrowOnError extends boolean = false>(options: {
636
+ body: {
637
+ shared_internal_tag: SharedInternalTagCreate;
638
+ };
639
+ signal?: AbortSignal;
640
+ throwOnError?: ThrowOnError | undefined;
641
+ fetchOptions?: FetchOptions;
642
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedInternalTagMutateResponse, ThrowOnError>>;
643
+ update<ThrowOnError extends boolean = false>(tagId: number, options: {
644
+ body: {
645
+ shared_internal_tag: SharedInternalTagCreate;
646
+ };
647
+ signal?: AbortSignal;
648
+ throwOnError?: ThrowOnError | undefined;
649
+ fetchOptions?: FetchOptions;
650
+ } & SpaceIdPathOverride): Promise<ApiResponse<SharedInternalTagMutateResponse, ThrowOnError>>;
651
+ delete<ThrowOnError extends boolean = false>(tagId: number, options: {
652
+ query: {
653
+ asset_folder_id: number;
654
+ };
655
+ signal?: AbortSignal;
656
+ throwOnError?: ThrowOnError | undefined;
657
+ fetchOptions?: FetchOptions;
658
+ } & SpaceIdPathOverride): Promise<ApiResponse<void, ThrowOnError>>;
659
+ };
541
660
  spaces: {
542
661
  list<ThrowOnError extends boolean = DefaultThrowOnError>(options?: {
543
662
  query?: ListSpacesData["query"];
@@ -607,14 +726,18 @@ type ResolveComponents<T extends StoryblokTypesConfig> = T extends {
607
726
  } ? C : T extends {
608
727
  blocks: infer B extends Block;
609
728
  } ? B : never;
729
+ /** Extracts the `fieldType → value` plugin map from a Schema, defaulting to an empty map. */
730
+ type ResolveFieldPlugins<T> = T extends {
731
+ fieldPlugins: infer P;
732
+ } ? P : Record<never, never>;
610
733
  /**
611
734
  * The return type of `createManagementApiClient`, parameterised by `TBlocks` so that
612
735
  * `.stories` methods can narrow story content types without touching the runtime object.
613
736
  * Component *definitions* (`.components`) are wire-shaped and not narrowed by `TBlocks`.
614
737
  */
615
- type ManagementApiClient<TBlocks extends Block = Block, DefaultThrowOnError extends boolean = false> = ReturnType<typeof buildResources<DefaultThrowOnError>> & {
738
+ type ManagementApiClient<TBlocks extends Block = Block, TFieldPlugins = Record<never, never>, DefaultThrowOnError extends boolean = false> = ReturnType<typeof buildResources<DefaultThrowOnError>> & {
616
739
  components: ReturnType<typeof createComponentsResource<DefaultThrowOnError>>;
617
- stories: ReturnType<typeof createStoriesResource<TBlocks, DefaultThrowOnError>>;
740
+ stories: ReturnType<typeof createStoriesResource<TBlocks, TFieldPlugins, DefaultThrowOnError>>;
618
741
  /**
619
742
  * Returns the same client instance cast to a version that narrows story content
620
743
  * to the provided component types. No runtime cost — type parameter is erased.
@@ -630,9 +753,9 @@ type ManagementApiClient<TBlocks extends Block = Block, DefaultThrowOnError exte
630
753
  * .withTypes<Schema>();
631
754
  * ```
632
755
  */
633
- withTypes: <T extends StoryblokTypesConfig>() => ManagementApiClient<ResolveComponents<T>, DefaultThrowOnError>;
756
+ withTypes: <T extends StoryblokTypesConfig>() => ManagementApiClient<ResolveComponents<T>, ResolveFieldPlugins<T>, DefaultThrowOnError>;
634
757
  };
635
- declare const createManagementApiClient: <DefaultThrowOnError extends boolean = false>(config: ManagementApiClientConfig<DefaultThrowOnError>) => ManagementApiClient<Block, DefaultThrowOnError>;
758
+ declare const createManagementApiClient: <DefaultThrowOnError extends boolean = false>(config: ManagementApiClientConfig<DefaultThrowOnError>) => ManagementApiClient<Block, Record<never, never>, DefaultThrowOnError>;
636
759
  //#endregion
637
760
  export { ApiResponse, FetchOptions, HttpRequestOptions, ManagementApiClient, ManagementApiClientConfig, MapiResourceDeps, RequestConfigOverrides, createManagementApiClient };
638
761
  //# sourceMappingURL=client.d.mts.map
package/dist/client.mjs CHANGED
@@ -13,6 +13,9 @@ import { createDatasourcesResource } from "./resources/datasources.mjs";
13
13
  import { createExperimentsResource } from "./resources/experiments.mjs";
14
14
  import { createInternalTagsResource } from "./resources/internal-tags.mjs";
15
15
  import { createPresetsResource } from "./resources/presets.mjs";
16
+ import { createSharedAssetFoldersResource } from "./resources/shared-asset-folders.mjs";
17
+ import { createSharedAssetsResource } from "./resources/shared-assets.mjs";
18
+ import { createSharedInternalTagsResource } from "./resources/shared-internal-tags.mjs";
16
19
  import { createSpacesResource } from "./resources/spaces.mjs";
17
20
  import { createStoriesResource } from "./resources/stories.mjs";
18
21
  import { createUsersResource } from "./resources/users.mjs";
@@ -164,6 +167,9 @@ function buildResources(deps, client) {
164
167
  post: httpPost,
165
168
  presets: createPresetsResource(deps),
166
169
  put: httpPut,
170
+ sharedAssetFolders: createSharedAssetFoldersResource(deps),
171
+ sharedAssets: createSharedAssetsResource(deps),
172
+ sharedInternalTags: createSharedInternalTagsResource(deps),
167
173
  spaces: createSpacesResource(deps),
168
174
  users: createUsersResource({
169
175
  client,
@@ -1 +1 @@
1
- {"version":3,"file":"client.mjs","names":[],"sources":["../src/client.ts"],"sourcesContent":["import type { Client, ResolvedRequestOptions, RetryOptions } from './generated/mapi/client';\nimport type { Middleware } from './generated/mapi/client/utils.gen';\nimport { createClient, createConfig } from './generated/mapi/client';\nimport { getManagementBaseUrl } from '@storyblok/region-helper';\nimport type { Region } from '@storyblok/region-helper';\nimport type { Block } from './generated/types/block';\nimport { ClientError } from './error';\nimport type { RateLimitConfig } from './utils/rate-limit';\nimport { createThrottleManager } from './utils/rate-limit';\nimport { querySerializer } from './utils/query-serializer';\nimport { createAssetFoldersResource } from './resources/asset-folders';\nimport { createAssetsResource } from './resources/assets';\nimport { createComponentFoldersResource } from './resources/component-folders';\nimport { createComponentsResource } from './resources/components';\nimport { createDatasourceEntriesResource } from './resources/datasource-entries';\nimport { createDatasourcesResource } from './resources/datasources';\nimport { createExperimentsResource } from './resources/experiments';\nimport { createInternalTagsResource } from './resources/internal-tags';\nimport { createPresetsResource } from './resources/presets';\nimport { createSpacesResource } from './resources/spaces';\nimport { createStoriesResource } from './resources/stories';\nimport { createUsersResource } from './resources/users';\n\n// ---------------------------------------------------------------------------\n// Client types (co-located with runtime)\n// ---------------------------------------------------------------------------\n\nexport type ApiResponse<T, ThrowOnError extends boolean = false> =\n ThrowOnError extends true\n ? { data: T; error?: never; response: Response; request: Request }\n : | { data: T; error: undefined; response: Response; request: Request }\n | { data: undefined; error: ClientError; response: Response; request: Request };\n\nexport interface RequestConfigOverrides {\n throwOnError?: boolean;\n}\n\n/**\n * Arbitrary options forwarded to the underlying `fetch()` call.\n *\n * Standard `RequestInit` properties (`cache`, `credentials`, `mode`, …) and\n * non-standard, vendor-specific properties (Next.js `next`, Cloudflare `cf`, …)\n * are both supported.\n *\n * @example\n * ```ts\n * client.stories.get(123, {\n * fetchOptions: {\n * cache: 'no-store',\n * next: { revalidate: 60 },\n * },\n * })\n * ```\n */\nexport type FetchOptions = Record<string, unknown>;\n\nexport interface HttpRequestOptions {\n query?: Record<string, unknown>;\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n throwOnError?: RequestConfigOverrides['throwOnError'];\n fetchOptions?: FetchOptions;\n}\n\n/**\n * Dependencies injected into every resource factory.\n */\nexport interface MapiResourceDeps<DefaultThrowOnError extends boolean = false> {\n client: Client;\n spaceId?: number;\n wrapRequest: <TData, ThrowOnError extends boolean = DefaultThrowOnError>(fn: () => Promise<unknown>, throwOnError?: ThrowOnError) => Promise<ApiResponse<TData, ThrowOnError>>;\n}\n\ntype TokenConfig =\n | {\n /** Personal access token for authentication. */\n personalAccessToken: string;\n oauthToken?: never;\n }\n | {\n personalAccessToken?: never;\n /** OAuth bearer token for authentication. */\n oauthToken: string;\n }\n | {\n personalAccessToken?: undefined;\n oauthToken?: undefined;\n };\n\nexport type ManagementApiClientConfig<\n ThrowOnError extends boolean = false,\n> = TokenConfig & {\n /**\n * The Storyblok space ID. Used as the default for space-scoped endpoints.\n * You can also override it per request via `path.space_id`.\n */\n spaceId?: number;\n /**\n * Storyblok region. Determines the base URL.\n * @default 'eu'\n */\n region?: Region;\n /**\n * Override the base URL entirely (e.g. for testing).\n */\n baseUrl?: string;\n /**\n * Additional request headers.\n */\n headers?: Record<string, string>;\n /**\n * Throw on HTTP errors instead of returning them.\n * @default false\n */\n throwOnError?: ThrowOnError;\n /**\n * Retry configuration for failed requests.\n */\n retry?: RetryOptions;\n /**\n * Request timeout in milliseconds.\n * @default 30_000\n */\n timeout?: number;\n /**\n * Preventive rate limiting to avoid hitting the Storyblok Management API rate limits.\n *\n * - `undefined` (default): single bucket at maxConcurrency: 6.\n * - `number`: fixed max concurrent requests per second.\n * - `{ maxConcurrency?: number; adaptToServerHeaders?: boolean }`: full config.\n * - `false`: disable rate limiting entirely.\n */\n rateLimit?: RateLimitConfig | number | false;\n};\n\n// ---------------------------------------------------------------------------\n// Client factory\n// ---------------------------------------------------------------------------\n\nfunction getAuthorizationHeader(config: ManagementApiClientConfig<boolean>): string | undefined {\n if (config.personalAccessToken) {\n return config.personalAccessToken;\n }\n if (config.oauthToken) {\n return config.oauthToken.startsWith('Bearer ')\n ? config.oauthToken\n : `Bearer ${config.oauthToken}`;\n }\n return undefined;\n}\n\nconst createManagementApiClientBase = <DefaultThrowOnError extends boolean = false>(\n config: ManagementApiClientConfig<DefaultThrowOnError>,\n): {\n deps: MapiResourceDeps<DefaultThrowOnError>;\n resources: Omit<ReturnType<typeof buildResources<DefaultThrowOnError>>, never>;\n} => {\n const {\n spaceId,\n region = 'eu',\n baseUrl,\n headers = {},\n throwOnError = false,\n retry = {\n limit: 12,\n backoffLimit: 20_000,\n methods: ['get', 'post', 'put', 'delete', 'patch', 'head', 'options', 'trace'],\n statusCodes: [429],\n },\n timeout = 30_000,\n rateLimit,\n } = config;\n\n const throttleManager = createThrottleManager(rateLimit ?? {});\n const authHeader = getAuthorizationHeader(config);\n\n const client: Client = createClient(\n createConfig({\n baseUrl: baseUrl || getManagementBaseUrl(region),\n headers: {\n ...(authHeader ? { Authorization: authHeader } : {}),\n ...headers,\n },\n // Default serializer throws on nested objects; MAPI needs `filter_query`\n // serialized as a nested hash (`filter_query[field][op]=value`).\n querySerializer,\n throwOnError,\n kyOptions: {\n throwHttpErrors: true,\n timeout,\n retry,\n },\n }),\n );\n\n client.interceptors.error.use(\n (error: unknown, response: Response) =>\n new ClientError(response?.statusText || 'API request failed', {\n status: response?.status ?? 0,\n statusText: response?.statusText ?? '',\n data: error,\n }),\n );\n\n function wrapRequest<TData, CurrentThrowOnError extends boolean = DefaultThrowOnError>(\n fn: () => Promise<unknown>,\n _throwOnError?: CurrentThrowOnError,\n ): Promise<ApiResponse<TData, CurrentThrowOnError>> {\n return throttleManager.execute(\n () => fn() as Promise<ApiResponse<TData, CurrentThrowOnError>>,\n );\n }\n\n const deps: MapiResourceDeps<DefaultThrowOnError> = { client, spaceId, wrapRequest };\n return { deps, resources: buildResources(deps, client) };\n};\n\nfunction buildResources<DefaultThrowOnError extends boolean = false>(\n deps: MapiResourceDeps<DefaultThrowOnError>,\n client: Client,\n) {\n /**\n * Escape hatch: send a GET request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpGet = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.get({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a POST request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPost = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.post({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a PUT request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPut = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.put({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a PATCH request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPatch = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.patch({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a DELETE request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpDelete = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.delete({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n return {\n assetFolders: createAssetFoldersResource(deps),\n assets: createAssetsResource(deps),\n componentFolders: createComponentFoldersResource(deps),\n datasourceEntries: createDatasourceEntriesResource(deps),\n datasources: createDatasourcesResource(deps),\n experiments: createExperimentsResource(deps),\n delete: httpDelete,\n get: httpGet,\n patch: httpPatch,\n interceptors: client.interceptors as Middleware<Request, Response, unknown, ResolvedRequestOptions>,\n internalTags: createInternalTagsResource(deps),\n post: httpPost,\n presets: createPresetsResource(deps),\n put: httpPut,\n spaces: createSpacesResource(deps),\n users: createUsersResource<DefaultThrowOnError>({ client, wrapRequest: deps.wrapRequest }),\n };\n}\n\ntype StoryblokTypesConfig = { components: Block } | { blocks: Block };\n\ntype ResolveComponents<T extends StoryblokTypesConfig> =\n T extends { components: infer C extends Block } ? C\n : T extends { blocks: infer B extends Block } ? B\n : never;\n\n/**\n * The return type of `createManagementApiClient`, parameterised by `TBlocks` so that\n * `.stories` methods can narrow story content types without touching the runtime object.\n * Component *definitions* (`.components`) are wire-shaped and not narrowed by `TBlocks`.\n */\nexport type ManagementApiClient<\n TBlocks extends Block = Block,\n DefaultThrowOnError extends boolean = false,\n> = ReturnType<typeof buildResources<DefaultThrowOnError>> & {\n components: ReturnType<typeof createComponentsResource<DefaultThrowOnError>>;\n stories: ReturnType<typeof createStoriesResource<TBlocks, DefaultThrowOnError>>;\n /**\n * Returns the same client instance cast to a version that narrows story content\n * to the provided component types. No runtime cost — type parameter is erased.\n *\n * Accepts either `{ components: ... }` or `{ blocks: ... }` — the latter matches the\n * `Schema` type produced by `@storyblok/schema`'s `InferSchema`.\n *\n * @example\n * ```ts\n * import type { Schema } from './schema';\n *\n * const client = createManagementApiClient({ personalAccessToken: '...' })\n * .withTypes<Schema>();\n * ```\n */\n withTypes: <T extends StoryblokTypesConfig>() => ManagementApiClient<ResolveComponents<T>, DefaultThrowOnError>;\n};\n\nexport const createManagementApiClient = <\n DefaultThrowOnError extends boolean = false,\n>(\n config: ManagementApiClientConfig<DefaultThrowOnError>,\n): ManagementApiClient<Block, DefaultThrowOnError> => {\n const { deps, resources } = createManagementApiClientBase(config);\n const self: ManagementApiClient<Block, DefaultThrowOnError> = {\n ...resources,\n components: createComponentsResource<DefaultThrowOnError>(deps),\n stories: createStoriesResource<Block, DefaultThrowOnError>(deps),\n withTypes<T extends StoryblokTypesConfig>() {\n return self as unknown as ManagementApiClient<ResolveComponents<T>, DefaultThrowOnError>;\n },\n };\n return self;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.mjs","names":[],"sources":["../src/client.ts"],"sourcesContent":["import type { Client, ResolvedRequestOptions, RetryOptions } from './generated/mapi/client';\nimport type { Middleware } from './generated/mapi/client/utils.gen';\nimport { createClient, createConfig } from './generated/mapi/client';\nimport { getManagementBaseUrl } from '@storyblok/region-helper';\nimport type { Region } from '@storyblok/region-helper';\nimport type { Block } from './generated/types/block';\nimport { ClientError } from './error';\nimport type { RateLimitConfig } from './utils/rate-limit';\nimport { createThrottleManager } from './utils/rate-limit';\nimport { querySerializer } from './utils/query-serializer';\nimport { createAssetFoldersResource } from './resources/asset-folders';\nimport { createAssetsResource } from './resources/assets';\nimport { createComponentFoldersResource } from './resources/component-folders';\nimport { createComponentsResource } from './resources/components';\nimport { createDatasourceEntriesResource } from './resources/datasource-entries';\nimport { createDatasourcesResource } from './resources/datasources';\nimport { createExperimentsResource } from './resources/experiments';\nimport { createInternalTagsResource } from './resources/internal-tags';\nimport { createPresetsResource } from './resources/presets';\nimport { createSharedAssetFoldersResource } from './resources/shared-asset-folders';\nimport { createSharedAssetsResource } from './resources/shared-assets';\nimport { createSharedInternalTagsResource } from './resources/shared-internal-tags';\nimport { createSpacesResource } from './resources/spaces';\nimport { createStoriesResource } from './resources/stories';\nimport { createUsersResource } from './resources/users';\n\n// ---------------------------------------------------------------------------\n// Client types (co-located with runtime)\n// ---------------------------------------------------------------------------\n\nexport type ApiResponse<T, ThrowOnError extends boolean = false> =\n ThrowOnError extends true\n ? { data: T; error?: never; response: Response; request: Request }\n : | { data: T; error: undefined; response: Response; request: Request }\n | { data: undefined; error: ClientError; response: Response; request: Request };\n\nexport interface RequestConfigOverrides {\n throwOnError?: boolean;\n}\n\n/**\n * Arbitrary options forwarded to the underlying `fetch()` call.\n *\n * Standard `RequestInit` properties (`cache`, `credentials`, `mode`, …) and\n * non-standard, vendor-specific properties (Next.js `next`, Cloudflare `cf`, …)\n * are both supported.\n *\n * @example\n * ```ts\n * client.stories.get(123, {\n * fetchOptions: {\n * cache: 'no-store',\n * next: { revalidate: 60 },\n * },\n * })\n * ```\n */\nexport type FetchOptions = Record<string, unknown>;\n\nexport interface HttpRequestOptions {\n query?: Record<string, unknown>;\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n throwOnError?: RequestConfigOverrides['throwOnError'];\n fetchOptions?: FetchOptions;\n}\n\n/**\n * Dependencies injected into every resource factory.\n */\nexport interface MapiResourceDeps<DefaultThrowOnError extends boolean = false> {\n client: Client;\n spaceId?: number;\n wrapRequest: <TData, ThrowOnError extends boolean = DefaultThrowOnError>(fn: () => Promise<unknown>, throwOnError?: ThrowOnError) => Promise<ApiResponse<TData, ThrowOnError>>;\n}\n\ntype TokenConfig =\n | {\n /** Personal access token for authentication. */\n personalAccessToken: string;\n oauthToken?: never;\n }\n | {\n personalAccessToken?: never;\n /** OAuth bearer token for authentication. */\n oauthToken: string;\n }\n | {\n personalAccessToken?: undefined;\n oauthToken?: undefined;\n };\n\nexport type ManagementApiClientConfig<\n ThrowOnError extends boolean = false,\n> = TokenConfig & {\n /**\n * The Storyblok space ID. Used as the default for space-scoped endpoints.\n * You can also override it per request via `path.space_id`.\n */\n spaceId?: number;\n /**\n * Storyblok region. Determines the base URL.\n * @default 'eu'\n */\n region?: Region;\n /**\n * Override the base URL entirely (e.g. for testing).\n */\n baseUrl?: string;\n /**\n * Additional request headers.\n */\n headers?: Record<string, string>;\n /**\n * Throw on HTTP errors instead of returning them.\n * @default false\n */\n throwOnError?: ThrowOnError;\n /**\n * Retry configuration for failed requests.\n */\n retry?: RetryOptions;\n /**\n * Request timeout in milliseconds.\n * @default 30_000\n */\n timeout?: number;\n /**\n * Preventive rate limiting to avoid hitting the Storyblok Management API rate limits.\n *\n * - `undefined` (default): single bucket at maxConcurrency: 6.\n * - `number`: fixed max concurrent requests per second.\n * - `{ maxConcurrency?: number; adaptToServerHeaders?: boolean }`: full config.\n * - `false`: disable rate limiting entirely.\n */\n rateLimit?: RateLimitConfig | number | false;\n};\n\n// ---------------------------------------------------------------------------\n// Client factory\n// ---------------------------------------------------------------------------\n\nfunction getAuthorizationHeader(config: ManagementApiClientConfig<boolean>): string | undefined {\n if (config.personalAccessToken) {\n return config.personalAccessToken;\n }\n if (config.oauthToken) {\n return config.oauthToken.startsWith('Bearer ')\n ? config.oauthToken\n : `Bearer ${config.oauthToken}`;\n }\n return undefined;\n}\n\nconst createManagementApiClientBase = <DefaultThrowOnError extends boolean = false>(\n config: ManagementApiClientConfig<DefaultThrowOnError>,\n): {\n deps: MapiResourceDeps<DefaultThrowOnError>;\n resources: Omit<ReturnType<typeof buildResources<DefaultThrowOnError>>, never>;\n} => {\n const {\n spaceId,\n region = 'eu',\n baseUrl,\n headers = {},\n throwOnError = false,\n retry = {\n limit: 12,\n backoffLimit: 20_000,\n methods: ['get', 'post', 'put', 'delete', 'patch', 'head', 'options', 'trace'],\n statusCodes: [429],\n },\n timeout = 30_000,\n rateLimit,\n } = config;\n\n const throttleManager = createThrottleManager(rateLimit ?? {});\n const authHeader = getAuthorizationHeader(config);\n\n const client: Client = createClient(\n createConfig({\n baseUrl: baseUrl || getManagementBaseUrl(region),\n headers: {\n ...(authHeader ? { Authorization: authHeader } : {}),\n ...headers,\n },\n // Default serializer throws on nested objects; MAPI needs `filter_query`\n // serialized as a nested hash (`filter_query[field][op]=value`).\n querySerializer,\n throwOnError,\n kyOptions: {\n throwHttpErrors: true,\n timeout,\n retry,\n },\n }),\n );\n\n client.interceptors.error.use(\n (error: unknown, response: Response) =>\n new ClientError(response?.statusText || 'API request failed', {\n status: response?.status ?? 0,\n statusText: response?.statusText ?? '',\n data: error,\n }),\n );\n\n function wrapRequest<TData, CurrentThrowOnError extends boolean = DefaultThrowOnError>(\n fn: () => Promise<unknown>,\n _throwOnError?: CurrentThrowOnError,\n ): Promise<ApiResponse<TData, CurrentThrowOnError>> {\n return throttleManager.execute(\n () => fn() as Promise<ApiResponse<TData, CurrentThrowOnError>>,\n );\n }\n\n const deps: MapiResourceDeps<DefaultThrowOnError> = { client, spaceId, wrapRequest };\n return { deps, resources: buildResources(deps, client) };\n};\n\nfunction buildResources<DefaultThrowOnError extends boolean = false>(\n deps: MapiResourceDeps<DefaultThrowOnError>,\n client: Client,\n) {\n /**\n * Escape hatch: send a GET request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpGet = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.get({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a POST request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPost = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.post({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a PUT request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPut = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.put({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a PATCH request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpPatch = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.patch({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n /**\n * Escape hatch: send a DELETE request to any MAPI endpoint not yet wrapped\n * in a dedicated resource method.\n */\n const httpDelete = <TData = unknown>(\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse<TData, DefaultThrowOnError>> => {\n const { fetchOptions, ...rest } = options;\n return deps.wrapRequest<TData>(() =>\n client.delete({ url: path, ...rest, ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }),\n );\n };\n\n return {\n assetFolders: createAssetFoldersResource(deps),\n assets: createAssetsResource(deps),\n componentFolders: createComponentFoldersResource(deps),\n datasourceEntries: createDatasourceEntriesResource(deps),\n datasources: createDatasourcesResource(deps),\n experiments: createExperimentsResource(deps),\n delete: httpDelete,\n get: httpGet,\n patch: httpPatch,\n interceptors: client.interceptors as Middleware<Request, Response, unknown, ResolvedRequestOptions>,\n internalTags: createInternalTagsResource(deps),\n post: httpPost,\n presets: createPresetsResource(deps),\n put: httpPut,\n sharedAssetFolders: createSharedAssetFoldersResource(deps),\n sharedAssets: createSharedAssetsResource(deps),\n sharedInternalTags: createSharedInternalTagsResource(deps),\n spaces: createSpacesResource(deps),\n users: createUsersResource<DefaultThrowOnError>({ client, wrapRequest: deps.wrapRequest }),\n };\n}\n\ntype StoryblokTypesConfig = { components: Block } | { blocks: Block };\n\ntype ResolveComponents<T extends StoryblokTypesConfig> =\n T extends { components: infer C extends Block } ? C\n : T extends { blocks: infer B extends Block } ? B\n : never;\n\n/** Extracts the `fieldType → value` plugin map from a Schema, defaulting to an empty map. */\ntype ResolveFieldPlugins<T> = T extends { fieldPlugins: infer P } ? P : Record<never, never>;\n\n/**\n * The return type of `createManagementApiClient`, parameterised by `TBlocks` so that\n * `.stories` methods can narrow story content types without touching the runtime object.\n * Component *definitions* (`.components`) are wire-shaped and not narrowed by `TBlocks`.\n */\nexport type ManagementApiClient<\n TBlocks extends Block = Block,\n TFieldPlugins = Record<never, never>,\n DefaultThrowOnError extends boolean = false,\n> = ReturnType<typeof buildResources<DefaultThrowOnError>> & {\n components: ReturnType<typeof createComponentsResource<DefaultThrowOnError>>;\n stories: ReturnType<typeof createStoriesResource<TBlocks, TFieldPlugins, DefaultThrowOnError>>;\n /**\n * Returns the same client instance cast to a version that narrows story content\n * to the provided component types. No runtime cost — type parameter is erased.\n *\n * Accepts either `{ components: ... }` or `{ blocks: ... }` — the latter matches the\n * `Schema` type produced by `@storyblok/schema`'s `InferSchema`.\n *\n * @example\n * ```ts\n * import type { Schema } from './schema';\n *\n * const client = createManagementApiClient({ personalAccessToken: '...' })\n * .withTypes<Schema>();\n * ```\n */\n withTypes: <T extends StoryblokTypesConfig>() => ManagementApiClient<ResolveComponents<T>, ResolveFieldPlugins<T>, DefaultThrowOnError>;\n};\n\nexport const createManagementApiClient = <\n DefaultThrowOnError extends boolean = false,\n>(\n config: ManagementApiClientConfig<DefaultThrowOnError>,\n): ManagementApiClient<Block, Record<never, never>, DefaultThrowOnError> => {\n const { deps, resources } = createManagementApiClientBase(config);\n const self: ManagementApiClient<Block, Record<never, never>, DefaultThrowOnError> = {\n ...resources,\n components: createComponentsResource<DefaultThrowOnError>(deps),\n stories: createStoriesResource<Block, Record<never, never>, DefaultThrowOnError>(deps),\n withTypes<T extends StoryblokTypesConfig>() {\n return self as unknown as ManagementApiClient<ResolveComponents<T>, ResolveFieldPlugins<T>, DefaultThrowOnError>;\n },\n };\n return self;\n};\n"],"mappings":"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"}
@@ -181,7 +181,7 @@ type ComponentCreate = {
181
181
  /**
182
182
  * UUID
183
183
  */
184
- component_group_uuid?: string;
184
+ component_group_uuid?: string | null;
185
185
  /**
186
186
  * Component color for UI display
187
187
  */
@@ -266,7 +266,7 @@ type ComponentUpdate = {
266
266
  /**
267
267
  * UUID
268
268
  */
269
- component_group_uuid?: string;
269
+ component_group_uuid?: string | null;
270
270
  /**
271
271
  * Component color for UI display
272
272
  */