@storyblok/api-client 0.3.1 → 1.0.0-alpha.2

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 (216) hide show
  1. package/README.md +3 -1
  2. package/dist/client.cjs +179 -0
  3. package/dist/client.cjs.map +1 -0
  4. package/dist/client.d.cts +567 -0
  5. package/dist/client.d.mts +567 -0
  6. package/dist/client.mjs +178 -0
  7. package/dist/client.mjs.map +1 -0
  8. package/dist/error.cjs.map +1 -1
  9. package/dist/error.d.cts +13 -2
  10. package/dist/error.d.mts +13 -2
  11. package/dist/error.mjs.map +1 -1
  12. package/dist/generated/capi/_internal.gen.d.cts +120 -0
  13. package/dist/generated/capi/_internal.gen.d.mts +120 -0
  14. package/dist/generated/{shared → capi}/client/client.gen.cjs +1 -1
  15. package/dist/generated/capi/client/client.gen.cjs.map +1 -0
  16. package/dist/generated/capi/client/client.gen.d.mts +1 -0
  17. package/dist/generated/{shared → capi}/client/client.gen.mjs +1 -1
  18. package/dist/generated/capi/client/client.gen.mjs.map +1 -0
  19. package/dist/generated/capi/client/index.d.mts +3 -0
  20. package/dist/generated/{shared → capi}/client/types.gen.d.cts +40 -4
  21. package/dist/generated/{shared → capi}/client/types.gen.d.mts +40 -4
  22. package/dist/generated/{shared → capi}/client/utils.gen.cjs +1 -1
  23. package/dist/generated/capi/client/utils.gen.cjs.map +1 -0
  24. package/dist/generated/{shared → capi}/client/utils.gen.d.cts +1 -1
  25. package/dist/generated/{shared → capi}/client/utils.gen.d.mts +1 -1
  26. package/dist/generated/{shared → capi}/client/utils.gen.mjs +1 -1
  27. package/dist/generated/capi/client/utils.gen.mjs.map +1 -0
  28. package/dist/generated/capi/client.gen.cjs +10 -0
  29. package/dist/generated/capi/client.gen.cjs.map +1 -0
  30. package/dist/generated/capi/client.gen.mjs +10 -0
  31. package/dist/generated/capi/client.gen.mjs.map +1 -0
  32. package/dist/generated/{shared → capi}/core/auth.gen.cjs +1 -1
  33. package/dist/generated/capi/core/auth.gen.cjs.map +1 -0
  34. package/dist/generated/{shared → capi}/core/auth.gen.d.cts +1 -1
  35. package/dist/generated/{shared → capi}/core/auth.gen.d.mts +1 -1
  36. package/dist/generated/{shared → capi}/core/auth.gen.mjs +1 -1
  37. package/dist/generated/capi/core/auth.gen.mjs.map +1 -0
  38. package/dist/generated/{shared → capi}/core/bodySerializer.gen.cjs +1 -1
  39. package/dist/generated/capi/core/bodySerializer.gen.cjs.map +1 -0
  40. package/dist/generated/{shared → capi}/core/bodySerializer.gen.d.cts +1 -1
  41. package/dist/generated/{shared → capi}/core/bodySerializer.gen.d.mts +1 -1
  42. package/dist/generated/{shared → capi}/core/bodySerializer.gen.mjs +1 -1
  43. package/dist/generated/capi/core/bodySerializer.gen.mjs.map +1 -0
  44. package/dist/generated/{shared → capi}/core/params.gen.cjs +1 -1
  45. package/dist/generated/capi/core/params.gen.cjs.map +1 -0
  46. package/dist/generated/{shared → capi}/core/params.gen.mjs +1 -1
  47. package/dist/generated/capi/core/params.gen.mjs.map +1 -0
  48. package/dist/generated/{shared → capi}/core/pathSerializer.gen.cjs +1 -1
  49. package/dist/generated/capi/core/pathSerializer.gen.cjs.map +1 -0
  50. package/dist/generated/{shared → capi}/core/pathSerializer.gen.d.cts +1 -1
  51. package/dist/generated/{shared → capi}/core/pathSerializer.gen.d.mts +1 -1
  52. package/dist/generated/{shared → capi}/core/pathSerializer.gen.mjs +1 -1
  53. package/dist/generated/capi/core/pathSerializer.gen.mjs.map +1 -0
  54. package/dist/generated/{shared → capi}/core/serverSentEvents.gen.cjs +1 -1
  55. package/dist/generated/capi/core/serverSentEvents.gen.cjs.map +1 -0
  56. package/dist/generated/{shared → capi}/core/serverSentEvents.gen.d.cts +5 -2
  57. package/dist/generated/{shared → capi}/core/serverSentEvents.gen.d.mts +5 -2
  58. package/dist/generated/{shared → capi}/core/serverSentEvents.gen.mjs +1 -1
  59. package/dist/generated/capi/core/serverSentEvents.gen.mjs.map +1 -0
  60. package/dist/generated/{shared → capi}/core/types.gen.d.cts +15 -2
  61. package/dist/generated/{shared → capi}/core/types.gen.d.mts +15 -2
  62. package/dist/generated/{shared → capi}/core/utils.gen.cjs +1 -1
  63. package/dist/generated/capi/core/utils.gen.cjs.map +1 -0
  64. package/dist/generated/{shared → capi}/core/utils.gen.mjs +1 -1
  65. package/dist/generated/capi/core/utils.gen.mjs.map +1 -0
  66. package/dist/generated/capi/sdk.gen.cjs +141 -0
  67. package/dist/generated/capi/sdk.gen.cjs.map +1 -0
  68. package/dist/generated/capi/sdk.gen.mjs +133 -0
  69. package/dist/generated/capi/sdk.gen.mjs.map +1 -0
  70. package/dist/generated/capi/types-aliased.gen.d.cts +181 -0
  71. package/dist/generated/capi/types-aliased.gen.d.mts +181 -0
  72. package/dist/generated/capi/types.gen.d.cts +919 -0
  73. package/dist/generated/capi/types.gen.d.mts +919 -0
  74. package/dist/generated/mapi/_internal.gen.d.cts +146 -0
  75. package/dist/generated/mapi/_internal.gen.d.mts +146 -0
  76. package/dist/generated/mapi/types.gen.d.cts +293 -0
  77. package/dist/generated/mapi/types.gen.d.mts +293 -0
  78. package/dist/generated/overlay/_internal.gen.d.cts +831 -0
  79. package/dist/generated/overlay/_internal.gen.d.mts +831 -0
  80. package/dist/generated/types/_utils.d.cts +7 -0
  81. package/dist/generated/types/_utils.d.mts +7 -0
  82. package/dist/generated/types/block.d.cts +29 -0
  83. package/dist/generated/types/block.d.mts +29 -0
  84. package/dist/generated/types/field.d.cts +64 -0
  85. package/dist/generated/types/field.d.mts +64 -0
  86. package/dist/generated/types/story.d.cts +19 -0
  87. package/dist/generated/types/story.d.mts +19 -0
  88. package/dist/index.cjs +2 -154
  89. package/dist/index.d.cts +8 -184
  90. package/dist/index.d.mts +8 -184
  91. package/dist/index.mjs +2 -151
  92. package/dist/resources/datasource-entries.cjs +2 -2
  93. package/dist/resources/datasource-entries.cjs.map +1 -1
  94. package/dist/resources/datasource-entries.mjs +2 -2
  95. package/dist/resources/datasource-entries.mjs.map +1 -1
  96. package/dist/resources/datasources.cjs +4 -4
  97. package/dist/resources/datasources.cjs.map +1 -1
  98. package/dist/resources/datasources.mjs +4 -4
  99. package/dist/resources/datasources.mjs.map +1 -1
  100. package/dist/resources/experiments.cjs +26 -0
  101. package/dist/resources/experiments.cjs.map +1 -0
  102. package/dist/resources/experiments.mjs +26 -0
  103. package/dist/resources/experiments.mjs.map +1 -0
  104. package/dist/resources/links.cjs +2 -2
  105. package/dist/resources/links.cjs.map +1 -1
  106. package/dist/resources/links.mjs +2 -2
  107. package/dist/resources/links.mjs.map +1 -1
  108. package/dist/resources/spaces.cjs +4 -4
  109. package/dist/resources/spaces.cjs.map +1 -1
  110. package/dist/resources/spaces.mjs +4 -4
  111. package/dist/resources/spaces.mjs.map +1 -1
  112. package/dist/resources/stories.cjs +16 -12
  113. package/dist/resources/stories.cjs.map +1 -1
  114. package/dist/resources/stories.d.cts +82 -4
  115. package/dist/resources/stories.d.mts +82 -4
  116. package/dist/resources/stories.mjs +16 -12
  117. package/dist/resources/stories.mjs.map +1 -1
  118. package/dist/resources/tags.cjs +2 -2
  119. package/dist/resources/tags.cjs.map +1 -1
  120. package/dist/resources/tags.mjs +2 -2
  121. package/dist/resources/tags.mjs.map +1 -1
  122. package/dist/utils/fetch-rel-uuids.cjs +2 -2
  123. package/dist/utils/fetch-rel-uuids.cjs.map +1 -1
  124. package/dist/utils/fetch-rel-uuids.mjs +2 -2
  125. package/dist/utils/fetch-rel-uuids.mjs.map +1 -1
  126. package/dist/utils/inline-relations.cjs.map +1 -1
  127. package/dist/utils/inline-relations.mjs.map +1 -1
  128. package/dist/utils/rate-limit.cjs +9 -5
  129. package/dist/utils/rate-limit.cjs.map +1 -1
  130. package/dist/utils/rate-limit.d.cts +4 -18
  131. package/dist/utils/rate-limit.d.mts +4 -18
  132. package/dist/utils/rate-limit.mjs +10 -4
  133. package/dist/utils/rate-limit.mjs.map +1 -1
  134. package/package.json +16 -12
  135. package/dist/generated/datasource_entries/client.gen.cjs +0 -10
  136. package/dist/generated/datasource_entries/client.gen.cjs.map +0 -1
  137. package/dist/generated/datasource_entries/client.gen.mjs +0 -10
  138. package/dist/generated/datasource_entries/client.gen.mjs.map +0 -1
  139. package/dist/generated/datasource_entries/sdk.gen.cjs +0 -21
  140. package/dist/generated/datasource_entries/sdk.gen.cjs.map +0 -1
  141. package/dist/generated/datasource_entries/sdk.gen.mjs +0 -21
  142. package/dist/generated/datasource_entries/sdk.gen.mjs.map +0 -1
  143. package/dist/generated/datasource_entries/types.gen.d.cts +0 -67
  144. package/dist/generated/datasource_entries/types.gen.d.mts +0 -67
  145. package/dist/generated/datasources/client.gen.cjs +0 -10
  146. package/dist/generated/datasources/client.gen.cjs.map +0 -1
  147. package/dist/generated/datasources/client.gen.mjs +0 -10
  148. package/dist/generated/datasources/client.gen.mjs.map +0 -1
  149. package/dist/generated/datasources/sdk.gen.cjs +0 -36
  150. package/dist/generated/datasources/sdk.gen.cjs.map +0 -1
  151. package/dist/generated/datasources/sdk.gen.mjs +0 -35
  152. package/dist/generated/datasources/sdk.gen.mjs.map +0 -1
  153. package/dist/generated/datasources/types.gen.d.cts +0 -109
  154. package/dist/generated/datasources/types.gen.d.mts +0 -109
  155. package/dist/generated/links/client.gen.cjs +0 -10
  156. package/dist/generated/links/client.gen.cjs.map +0 -1
  157. package/dist/generated/links/client.gen.mjs +0 -10
  158. package/dist/generated/links/client.gen.mjs.map +0 -1
  159. package/dist/generated/links/sdk.gen.cjs +0 -21
  160. package/dist/generated/links/sdk.gen.cjs.map +0 -1
  161. package/dist/generated/links/sdk.gen.mjs +0 -21
  162. package/dist/generated/links/sdk.gen.mjs.map +0 -1
  163. package/dist/generated/links/types.gen.d.cts +0 -142
  164. package/dist/generated/links/types.gen.d.mts +0 -142
  165. package/dist/generated/shared/client/client.gen.cjs.map +0 -1
  166. package/dist/generated/shared/client/client.gen.mjs.map +0 -1
  167. package/dist/generated/shared/client/utils.gen.cjs.map +0 -1
  168. package/dist/generated/shared/client/utils.gen.mjs.map +0 -1
  169. package/dist/generated/shared/core/auth.gen.cjs.map +0 -1
  170. package/dist/generated/shared/core/auth.gen.mjs.map +0 -1
  171. package/dist/generated/shared/core/bodySerializer.gen.cjs.map +0 -1
  172. package/dist/generated/shared/core/bodySerializer.gen.mjs.map +0 -1
  173. package/dist/generated/shared/core/params.gen.cjs.map +0 -1
  174. package/dist/generated/shared/core/params.gen.mjs.map +0 -1
  175. package/dist/generated/shared/core/pathSerializer.gen.cjs.map +0 -1
  176. package/dist/generated/shared/core/pathSerializer.gen.mjs.map +0 -1
  177. package/dist/generated/shared/core/serverSentEvents.gen.cjs.map +0 -1
  178. package/dist/generated/shared/core/serverSentEvents.gen.mjs.map +0 -1
  179. package/dist/generated/shared/core/utils.gen.cjs.map +0 -1
  180. package/dist/generated/shared/core/utils.gen.mjs.map +0 -1
  181. package/dist/generated/spaces/client.gen.cjs +0 -10
  182. package/dist/generated/spaces/client.gen.cjs.map +0 -1
  183. package/dist/generated/spaces/client.gen.mjs +0 -10
  184. package/dist/generated/spaces/client.gen.mjs.map +0 -1
  185. package/dist/generated/spaces/sdk.gen.cjs +0 -21
  186. package/dist/generated/spaces/sdk.gen.cjs.map +0 -1
  187. package/dist/generated/spaces/sdk.gen.mjs +0 -21
  188. package/dist/generated/spaces/sdk.gen.mjs.map +0 -1
  189. package/dist/generated/spaces/types.gen.d.cts +0 -34
  190. package/dist/generated/spaces/types.gen.d.mts +0 -34
  191. package/dist/generated/stories/client.gen.cjs +0 -10
  192. package/dist/generated/stories/client.gen.cjs.map +0 -1
  193. package/dist/generated/stories/client.gen.mjs +0 -10
  194. package/dist/generated/stories/client.gen.mjs.map +0 -1
  195. package/dist/generated/stories/sdk.gen.cjs +0 -36
  196. package/dist/generated/stories/sdk.gen.cjs.map +0 -1
  197. package/dist/generated/stories/sdk.gen.mjs +0 -35
  198. package/dist/generated/stories/sdk.gen.mjs.map +0 -1
  199. package/dist/generated/stories/types.gen.d.cts +0 -544
  200. package/dist/generated/stories/types.gen.d.mts +0 -544
  201. package/dist/generated/tags/client.gen.cjs +0 -10
  202. package/dist/generated/tags/client.gen.cjs.map +0 -1
  203. package/dist/generated/tags/client.gen.mjs +0 -10
  204. package/dist/generated/tags/client.gen.mjs.map +0 -1
  205. package/dist/generated/tags/sdk.gen.cjs +0 -21
  206. package/dist/generated/tags/sdk.gen.cjs.map +0 -1
  207. package/dist/generated/tags/sdk.gen.mjs +0 -21
  208. package/dist/generated/tags/sdk.gen.mjs.map +0 -1
  209. package/dist/generated/tags/types.gen.d.cts +0 -44
  210. package/dist/generated/tags/types.gen.d.mts +0 -44
  211. package/dist/index.cjs.map +0 -1
  212. package/dist/index.mjs.map +0 -1
  213. package/dist/types.d.cts +0 -37
  214. package/dist/types.d.mts +0 -37
  215. /package/dist/generated/{shared → capi}/client/index.cjs +0 -0
  216. /package/dist/generated/{shared → capi}/client/index.mjs +0 -0
@@ -0,0 +1,178 @@
1
+ import { createConfig } from "./generated/capi/client/utils.gen.mjs";
2
+ import { createClient } from "./generated/capi/client/client.gen.mjs";
3
+ import "./generated/capi/client/index.mjs";
4
+ import { createMemoryCacheProvider, createStrategy } from "./utils/cache.mjs";
5
+ import { ClientError } from "./error.mjs";
6
+ import { createThrottleManager } from "./utils/rate-limit.mjs";
7
+ import { createCacheKey, shouldUseCache } from "./utils/request.mjs";
8
+ import { applyCvToQuery, extractCv } from "./utils/cv.mjs";
9
+ import { createStoriesResource } from "./resources/stories.mjs";
10
+ import { createLinksResource } from "./resources/links.mjs";
11
+ import { createTagsResource } from "./resources/tags.mjs";
12
+ import { createDatasourcesResource } from "./resources/datasources.mjs";
13
+ import { createDatasourceEntriesResource } from "./resources/datasource-entries.mjs";
14
+ import { createSpacesResource } from "./resources/spaces.mjs";
15
+ import { createExperimentsResource } from "./resources/experiments.mjs";
16
+ import { getRegionBaseUrl } from "@storyblok/region-helper";
17
+
18
+ //#region src/client.ts
19
+ const createApiClientBase = (config) => {
20
+ const { accessToken, region = "eu", baseUrl, headers = {}, throwOnError = false, cache = {}, inlineRelations = false, retry, timeout = 3e4, rateLimit, fetch: customFetch } = config;
21
+ const retryOptions = {
22
+ limit: 3,
23
+ backoffLimit: 2e4,
24
+ jitter: true,
25
+ ...retry
26
+ };
27
+ const throttleManager = createThrottleManager(rateLimit ?? {});
28
+ const cacheProvider = cache.provider ?? createMemoryCacheProvider();
29
+ const swrOptions = cache.onRevalidationError ? { onRevalidationError: cache.onRevalidationError } : void 0;
30
+ const strategy = cache.strategy ? typeof cache.strategy === "string" ? createStrategy(cache.strategy, swrOptions) : cache.strategy : createStrategy("cache-first");
31
+ const cacheTtlMs = cache.ttlMs ?? 6e4;
32
+ const cacheFlush = cache.flush ?? "auto";
33
+ const cvMode = cache.cv ?? "auto";
34
+ let currentCv;
35
+ const client = createClient(createConfig({
36
+ auth: accessToken,
37
+ baseUrl: baseUrl || getRegionBaseUrl(region),
38
+ headers,
39
+ throwOnError,
40
+ kyOptions: {
41
+ throwHttpErrors: true,
42
+ timeout,
43
+ retry: retryOptions,
44
+ ...customFetch && { fetch: customFetch }
45
+ }
46
+ }));
47
+ client.interceptors.error.use((error, response) => new ClientError(response?.statusText || "API request failed", {
48
+ status: response?.status ?? 0,
49
+ statusText: response?.statusText ?? "",
50
+ data: error
51
+ }));
52
+ const security = [{
53
+ in: "query",
54
+ name: "token",
55
+ type: "apiKey"
56
+ }];
57
+ const updateCv = async (result) => {
58
+ const nextCv = extractCv(result.data);
59
+ if (nextCv === void 0) return true;
60
+ if (currentCv !== void 0 && nextCv < currentCv) return false;
61
+ if (cacheFlush === "auto" && currentCv !== void 0 && currentCv !== nextCv) await cacheProvider.flush();
62
+ currentCv = nextCv;
63
+ return true;
64
+ };
65
+ const cacheSuccessResult = async (key, result) => {
66
+ const shouldCacheResult = await updateCv(result);
67
+ if (result.error === void 0 && shouldCacheResult) await cacheProvider.set(key, {
68
+ value: result,
69
+ ttlMs: cacheTtlMs
70
+ });
71
+ return result;
72
+ };
73
+ const requestNetwork = async (method, path, query, options) => {
74
+ return client.request({
75
+ ...options,
76
+ method,
77
+ query,
78
+ security,
79
+ url: path
80
+ });
81
+ };
82
+ /**
83
+ * Wraps a raw SDK call to cast the `error: unknown` type returned by
84
+ * generated code to `ClientError` — the error interceptor ensures the
85
+ * runtime value IS a ClientError.
86
+ */
87
+ const asApiResponse = (p) => p;
88
+ const requestWithCache = async (method, path, rawQuery, fetchFn, cacheOptions) => {
89
+ const query = cvMode === "auto" && currentCv !== void 0 ? applyCvToQuery(rawQuery, currentCv) : rawQuery;
90
+ if (!shouldUseCache(method, path, rawQuery)) {
91
+ const networkResult = await fetchFn(query);
92
+ throttleManager.adaptToResponse(networkResult.response);
93
+ await updateCv(networkResult);
94
+ return networkResult;
95
+ }
96
+ const baseKey = createCacheKey(method, path, rawQuery);
97
+ const key = cacheOptions?.cacheKeyPrefix ? `${cacheOptions.cacheKeyPrefix}:${baseKey}` : baseKey;
98
+ const cachedResult = (await cacheProvider.get(key))?.value;
99
+ const loadNetwork = async () => {
100
+ const result = await fetchFn(query);
101
+ throttleManager.adaptToResponse(result.response);
102
+ return cacheSuccessResult(key, result);
103
+ };
104
+ return strategy({
105
+ key,
106
+ cachedResult,
107
+ loadNetwork
108
+ });
109
+ };
110
+ const request = async (method, path, options = {}) => {
111
+ const rawQuery = options.query || {};
112
+ return requestWithCache(method, path, rawQuery, (query) => {
113
+ return throttleManager.execute(path, rawQuery, () => requestNetwork(method, path, query, options));
114
+ });
115
+ };
116
+ const getRequest = (path, options = {}) => {
117
+ return request("GET", path, options);
118
+ };
119
+ const resourceDeps = {
120
+ client,
121
+ requestWithCache,
122
+ asApiResponse,
123
+ throttleManager
124
+ };
125
+ const stories = createStoriesResource({
126
+ ...resourceDeps,
127
+ inlineRelations
128
+ });
129
+ /**
130
+ * Flush the in-memory cache and reset the tracked cv.
131
+ *
132
+ * Call this explicitly when `cache.flush` is set to `'manual'`, e.g. after
133
+ * receiving a Storyblok webhook event that signals content has changed.
134
+ */
135
+ const flushCache = async () => {
136
+ await cacheProvider.flush();
137
+ currentCv = void 0;
138
+ };
139
+ return {
140
+ datasourceEntries: createDatasourceEntriesResource(resourceDeps),
141
+ datasources: createDatasourcesResource(resourceDeps),
142
+ experiments: createExperimentsResource(resourceDeps),
143
+ flushCache,
144
+ get: getRequest,
145
+ interceptors: client.interceptors,
146
+ links: createLinksResource(resourceDeps),
147
+ spaces: createSpacesResource(resourceDeps),
148
+ stories,
149
+ tags: createTagsResource(resourceDeps)
150
+ };
151
+ };
152
+ /**
153
+ * Creates a Storyblok Content Delivery API client.
154
+ *
155
+ * Use `.withTypes<YourTypes>()` on the returned client to enable discriminated
156
+ * union typing on `story.content` without including any schema values in your bundle.
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * import type { pageBlock, heroBlock } from './blocks';
161
+ *
162
+ * const client = createApiClient({ accessToken: 'your-token' })
163
+ * .withTypes<StoryblokTypes>();
164
+ * ```
165
+ */
166
+ const createApiClient = (config) => {
167
+ const self = {
168
+ ...createApiClientBase(config),
169
+ withTypes() {
170
+ return self;
171
+ }
172
+ };
173
+ return self;
174
+ };
175
+
176
+ //#endregion
177
+ export { createApiClient };
178
+ //# sourceMappingURL=client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.mjs","names":[],"sources":["../src/client.ts"],"sourcesContent":["import { createClient, createConfig } from './generated/capi/client';\nimport type { CacheProvider, CacheStrategy, CacheStrategyHandler } from './utils/cache';\nimport { createMemoryCacheProvider, createStrategy } from './utils/cache';\nimport { ClientError } from './error';\nimport type { RateLimitConfig, ThrottleManager } from './utils/rate-limit';\nimport { createThrottleManager } from './utils/rate-limit';\nimport { applyCvToQuery, extractCv } from './utils/cv';\nimport { createCacheKey, shouldUseCache } from './utils/request';\nimport { getRegionBaseUrl, type Region } from '@storyblok/region-helper';\nimport type { Block as Component } from './generated/types/block';\nimport type { RetryOptions } from 'ky';\nimport type { Client, RequestOptions } from './generated/capi/client';\nimport { createStoriesResource } from './resources/stories';\nimport { createLinksResource } from './resources/links';\nimport { createTagsResource } from './resources/tags';\nimport { createDatasourcesResource } from './resources/datasources';\nimport { createDatasourceEntriesResource } from './resources/datasource-entries';\nimport { createSpacesResource } from './resources/spaces';\nimport { createExperimentsResource } from './resources/experiments';\n\n// ---------------------------------------------------------------------------\n// Client types (co-located with runtime)\n// ---------------------------------------------------------------------------\n\nexport type ApiResponse<Data = unknown, ThrowOnError extends boolean = false> =\n ThrowOnError extends true\n ? { data: Data; error?: never; response: Response; request: Request }\n : { data?: Data; error?: ClientError; response: Response; request: Request };\n\nexport type HttpRequestOptions = Omit<\n RequestOptions,\n 'method' | 'security' | 'url'\n>;\n\nexport type HttpRequestMethod = <TData = unknown>(\n path: string,\n options?: HttpRequestOptions,\n) => Promise<ApiResponse<TData>>;\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('home', {\n * fetchOptions: {\n * cache: 'no-store',\n * next: { revalidate: 60, tags: ['home'] },\n * },\n * })\n * ```\n */\nexport type FetchOptions = Record<string, unknown>;\n\nexport interface RequestWithCacheOptions {\n /** Prefix added to the cache key to namespace entries (e.g. `'inline'`). */\n cacheKeyPrefix?: string;\n}\n\nexport interface ResourceDeps<DefaultThrowOnError extends boolean = false> {\n client: Client;\n requestWithCache: <TData, ThrowOnError extends boolean = DefaultThrowOnError>(\n method: 'GET',\n path: string,\n rawQuery: Record<string, unknown>,\n fetchFn: (query: Record<string, unknown>) => Promise<ApiResponse<TData, ThrowOnError>>,\n options?: RequestWithCacheOptions,\n ) => Promise<ApiResponse<TData, ThrowOnError>>;\n asApiResponse: <TData, ThrowOnError extends boolean = DefaultThrowOnError>(p: Promise<unknown>) => Promise<ApiResponse<TData, ThrowOnError>>;\n throttleManager: ThrottleManager;\n}\n\n// ---------------------------------------------------------------------------\n// Config types\n// ---------------------------------------------------------------------------\n\n/**\n * Cache configuration.\n *\n * **Note:** Requests with `version: 'draft'` always bypass the cache regardless\n * of the configured strategy. Only published content is cached.\n */\nexport interface CacheConfig {\n /** Custom cache provider. Defaults to an in-memory LRU cache (1 000 entries). */\n provider?: CacheProvider;\n /** Cache strategy for published requests. @default 'cache-first' */\n strategy?: CacheStrategy | CacheStrategyHandler;\n /** Time-to-live in milliseconds for cached entries. @default 60_000 */\n ttlMs?: number;\n /**\n * Controls how the `cv` (content version) query parameter is managed.\n *\n * - `'auto'` (default): automatically attach the tracked `cv` to\n * subsequent published requests for cache busting.\n * - `'manual'`: do not attach `cv` to outgoing requests. The client still\n * tracks cv internally for cache invalidation (flushing when cv changes),\n * but the query parameter is not sent. Useful for SSR with edge caching\n * where stable URLs are required.\n */\n cv?: 'auto' | 'manual';\n /**\n * Controls when the cache is flushed on cv change.\n *\n * - `'auto'` (default): automatically flush the cache whenever the API returns a new cv value.\n * - `'manual'`: never auto-flush; call `client.flushCache()` explicitly (e.g. on webhook trigger).\n */\n flush?: 'auto' | 'manual';\n /**\n * Called when SWR background revalidation fails.\n * Only relevant when `strategy` is `'swr'`.\n * @default console.warn\n */\n onRevalidationError?: (error: unknown) => void;\n}\n\nexport interface ContentApiClientConfig<\n ThrowOnError extends boolean = false,\n InlineRelations extends boolean = false,\n> {\n accessToken: string;\n region?: Region;\n baseUrl?: string;\n headers?: Record<string, string>;\n throwOnError?: ThrowOnError;\n cache?: CacheConfig;\n inlineRelations?: InlineRelations;\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 CDN rate limits.\n *\n * - `undefined` (default): auto-detect tier from path + `per_page` query param.\n * - `number`: fixed max concurrent requests per second (single queue).\n * - `{ maxConcurrency?: number; adaptToServerHeaders?: boolean }`: full config.\n * - `false`: disable rate limiting entirely.\n */\n rateLimit?: RateLimitConfig | number | false;\n /**\n * Custom `fetch` function to use for all requests.\n * Must be fully compatible with the Fetch API standard.\n *\n * Use cases:\n * - SSR framework fetch wrappers (e.g., Next.js `fetch` with caching)\n * - Custom instrumentation or logging around requests\n *\n * @default globalThis.fetch\n */\n fetch?: typeof globalThis.fetch;\n}\n\ntype StoryblokTypesConfig = { components: Component } | { blocks: Component };\n\ntype ResolveComponents<T extends StoryblokTypesConfig> =\n T extends { components: infer C extends Component } ? C\n : T extends { blocks: infer B extends Component } ? B\n : never;\n\n/**\n * The return type of `createApiClient`, parameterised by `TComponents` and `InlineRelations`\n * so that `.withTypes<T>()` can change the story response types without touching the\n * runtime object.\n */\nexport type ContentApiClient<\n TComponents extends Component = Component,\n InlineRelations extends boolean = false,\n ThrowOnError extends boolean = false,\n> = Omit<ReturnType<typeof createApiClientBase>, 'stories' | 'withTypes'> & {\n stories: ReturnType<typeof createStoriesResource<TComponents, InlineRelations, ThrowOnError>>;\n /**\n * Returns the same client instance cast to a version that narrows story content\n * to the provided component types. No runtime cost — the 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 = createApiClient({ accessToken: 'your-token' })\n * .withTypes<Schema>();\n * // story.content is now typed as a discriminated union\n * ```\n */\n withTypes: <T extends StoryblokTypesConfig>() => ContentApiClient<ResolveComponents<T>, InlineRelations, ThrowOnError>;\n};\n\n// ---------------------------------------------------------------------------\n// Client factory\n// ---------------------------------------------------------------------------\n\nexport const createApiClientBase = <\n ThrowOnError extends boolean = false,\n InlineRelations extends boolean = false,\n>(\n config: ContentApiClientConfig<ThrowOnError, InlineRelations>,\n) => {\n const {\n accessToken,\n region = 'eu',\n baseUrl,\n headers = {},\n throwOnError = false,\n cache = {},\n inlineRelations = false,\n retry,\n timeout = 30_000,\n rateLimit,\n fetch: customFetch,\n } = config;\n const retryOptions: RetryOptions = { limit: 3, backoffLimit: 20_000, jitter: true, ...retry };\n // `rateLimit` defaults to `{}` (auto-detect mode) when not supplied.\n const throttleManager = createThrottleManager(rateLimit ?? {});\n const cacheProvider = cache.provider ?? createMemoryCacheProvider();\n const swrOptions = cache.onRevalidationError ? { onRevalidationError: cache.onRevalidationError } : undefined;\n const strategy = cache.strategy\n ? typeof cache.strategy === 'string'\n ? createStrategy(cache.strategy, swrOptions)\n : cache.strategy\n : createStrategy('cache-first');\n const cacheTtlMs = cache.ttlMs ?? 60_000;\n const cacheFlush = cache.flush ?? 'auto';\n const cvMode = cache.cv ?? 'auto';\n let currentCv: number | undefined;\n\n const client: Client = createClient(\n createConfig({\n auth: accessToken,\n baseUrl: baseUrl || getRegionBaseUrl(region),\n headers,\n throwOnError,\n kyOptions: {\n // Enable `throwHttpErrors` to make retry work, even if `throwOnError`\n // is `false`. The client's error handling will still work because it\n // catches `HTTPError`.\n throwHttpErrors: true,\n timeout,\n retry: retryOptions,\n ...(customFetch && { fetch: customFetch }),\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 const security = [\n {\n in: 'query' as const,\n name: 'token',\n type: 'apiKey' as const,\n },\n ];\n\n const updateCv = async (result: ApiResponse): Promise<boolean> => {\n const nextCv = extractCv(result.data);\n if (nextCv === undefined) {\n return true;\n }\n\n // Guard against cv regression: SWR background revalidation may carry a\n // stale cv from a prior request; never move cv backward.\n if (currentCv !== undefined && nextCv < currentCv) {\n return false;\n }\n\n if (cacheFlush === 'auto' && currentCv !== undefined && currentCv !== nextCv) {\n await cacheProvider.flush();\n }\n\n currentCv = nextCv;\n return true;\n };\n\n const cacheSuccessResult = async <TResponse extends ApiResponse>(key: string, result: TResponse) => {\n const shouldCacheResult = await updateCv(result);\n if (result.error === undefined && shouldCacheResult) {\n await cacheProvider.set(key, {\n value: result,\n ttlMs: cacheTtlMs,\n });\n }\n return result;\n };\n\n const requestNetwork = async (\n method: 'GET',\n path: string,\n query: Record<string, unknown>,\n options: HttpRequestOptions,\n ): Promise<ApiResponse> => {\n return client.request<unknown, ClientError, boolean>({\n ...options,\n method,\n query,\n security,\n url: path,\n });\n };\n\n /**\n * Wraps a raw SDK call to cast the `error: unknown` type returned by\n * generated code to `ClientError` — the error interceptor ensures the\n * runtime value IS a ClientError.\n */\n const asApiResponse = <TData, ThrowOnError extends boolean = false>(\n p: Promise<unknown>,\n ): Promise<ApiResponse<TData, ThrowOnError>> => p as unknown as Promise<ApiResponse<TData, ThrowOnError>>;\n\n const requestWithCache = async <TData = unknown, ThrowOnError extends boolean = false>(\n method: 'GET',\n path: string,\n rawQuery: Record<string, unknown>,\n fetchFn: (query: Record<string, unknown>) => Promise<ApiResponse<TData, ThrowOnError>>,\n cacheOptions?: RequestWithCacheOptions,\n ): Promise<ApiResponse<TData, ThrowOnError>> => {\n const query = cvMode === 'auto' && currentCv !== undefined ? applyCvToQuery(rawQuery, currentCv) : rawQuery;\n const cacheEnabled = shouldUseCache(method, path, rawQuery);\n\n if (!cacheEnabled) {\n const networkResult = await fetchFn(query);\n throttleManager.adaptToResponse(networkResult.response);\n await updateCv(networkResult);\n return networkResult;\n }\n\n const baseKey = createCacheKey(method, path, rawQuery);\n const key = cacheOptions?.cacheKeyPrefix ? `${cacheOptions.cacheKeyPrefix}:${baseKey}` : baseKey;\n const cachedEntry = await cacheProvider.get<ApiResponse<TData, ThrowOnError>>(key);\n const cachedResult = cachedEntry?.value;\n\n const loadNetwork = async () => {\n const result = await fetchFn(query);\n throttleManager.adaptToResponse(result.response);\n return cacheSuccessResult(key, result);\n };\n\n return strategy({\n key,\n cachedResult,\n loadNetwork,\n });\n };\n\n const request = async (\n method: 'GET',\n path: string,\n options: HttpRequestOptions = {},\n ): Promise<ApiResponse> => {\n const rawQuery = options.query || {};\n\n return requestWithCache(method, path, rawQuery, (query) => {\n return throttleManager.execute(path, rawQuery, () => requestNetwork(method, path, query, options));\n });\n };\n\n const getRequest = (\n path: string,\n options: HttpRequestOptions = {},\n ) => {\n return request('GET', path, options);\n };\n\n const resourceDeps: ResourceDeps<ThrowOnError> = {\n client,\n requestWithCache,\n asApiResponse,\n throttleManager,\n };\n\n const stories = createStoriesResource<Component, InlineRelations, ThrowOnError>({\n ...resourceDeps,\n inlineRelations,\n });\n\n /**\n * Flush the in-memory cache and reset the tracked cv.\n *\n * Call this explicitly when `cache.flush` is set to `'manual'`, e.g. after\n * receiving a Storyblok webhook event that signals content has changed.\n */\n const flushCache = async (): Promise<void> => {\n await cacheProvider.flush();\n currentCv = undefined;\n };\n\n return {\n datasourceEntries: createDatasourceEntriesResource(resourceDeps),\n datasources: createDatasourcesResource(resourceDeps),\n experiments: createExperimentsResource(resourceDeps),\n flushCache,\n get: getRequest,\n interceptors: client.interceptors,\n links: createLinksResource(resourceDeps),\n spaces: createSpacesResource(resourceDeps),\n stories,\n tags: createTagsResource(resourceDeps),\n };\n};\n\n/**\n * Creates a Storyblok Content Delivery API client.\n *\n * Use `.withTypes<YourTypes>()` on the returned client to enable discriminated\n * union typing on `story.content` without including any schema values in your bundle.\n *\n * @example\n * ```ts\n * import type { pageBlock, heroBlock } from './blocks';\n *\n * const client = createApiClient({ accessToken: 'your-token' })\n * .withTypes<StoryblokTypes>();\n * ```\n */\nexport const createApiClient = <\n ThrowOnError extends boolean = false,\n InlineRelations extends boolean = false,\n>(\n config: ContentApiClientConfig<ThrowOnError, InlineRelations>,\n): ContentApiClient<Component, InlineRelations, ThrowOnError> => {\n const base = createApiClientBase(config);\n const self: ContentApiClient<Component, InlineRelations, ThrowOnError> = {\n ...base,\n withTypes<T extends StoryblokTypesConfig>(): ContentApiClient<ResolveComponents<T>, InlineRelations, ThrowOnError> {\n return self as unknown as ContentApiClient<ResolveComponents<T>, InlineRelations, ThrowOnError>;\n },\n };\n return self;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"error.cjs","names":[],"sources":["../src/error.ts"],"sourcesContent":["/**\n * Structured HTTP error thrown by the Content API client when `throwOnError: true`.\n */\nexport class ClientError extends Error {\n readonly response: { status: number; statusText: string; data: unknown };\n\n constructor(\n message: string,\n options: { status: number; statusText: string; data: unknown },\n ) {\n super(message);\n this.name = 'ClientError';\n this.response = {\n status: options.status,\n statusText: options.statusText,\n data: options.data,\n };\n }\n}\n"],"mappings":";;;;;AAGA,IAAa,cAAb,cAAiC,MAAM;CACrC,AAAS;CAET,YACE,SACA,SACA;AACA,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,WAAW;GACd,QAAQ,QAAQ;GAChB,YAAY,QAAQ;GACpB,MAAM,QAAQ;GACf"}
1
+ {"version":3,"file":"error.cjs","names":[],"sources":["../src/error.ts"],"sourcesContent":["/**\n * Common shape of error bodies returned by the Storyblok Content Delivery API.\n *\n * Most error responses include an `error` or `message` field with a\n * human-readable description.\n */\nexport interface ApiErrorBody {\n error?: string;\n message?: string;\n [key: string]: unknown;\n}\n\n/**\n * Structured HTTP error thrown by the Content API client when `throwOnError: true`.\n */\nexport class ClientError extends Error {\n readonly response: { status: number; statusText: string; data: ApiErrorBody | undefined };\n\n constructor(\n message: string,\n options: { status: number; statusText: string; data: unknown },\n ) {\n super(message);\n this.name = 'ClientError';\n this.response = {\n status: options.status,\n statusText: options.statusText,\n data: options.data as ApiErrorBody | undefined,\n };\n }\n}\n"],"mappings":";;;;;AAeA,IAAa,cAAb,cAAiC,MAAM;CACrC,AAAS;CAET,YACE,SACA,SACA;AACA,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,WAAW;GACd,QAAQ,QAAQ;GAChB,YAAY,QAAQ;GACpB,MAAM,QAAQ;GACf"}
package/dist/error.d.cts CHANGED
@@ -1,4 +1,15 @@
1
1
  //#region src/error.d.ts
2
+ /**
3
+ * Common shape of error bodies returned by the Storyblok Content Delivery API.
4
+ *
5
+ * Most error responses include an `error` or `message` field with a
6
+ * human-readable description.
7
+ */
8
+ interface ApiErrorBody {
9
+ error?: string;
10
+ message?: string;
11
+ [key: string]: unknown;
12
+ }
2
13
  /**
3
14
  * Structured HTTP error thrown by the Content API client when `throwOnError: true`.
4
15
  */
@@ -6,7 +17,7 @@ declare class ClientError extends Error {
6
17
  readonly response: {
7
18
  status: number;
8
19
  statusText: string;
9
- data: unknown;
20
+ data: ApiErrorBody | undefined;
10
21
  };
11
22
  constructor(message: string, options: {
12
23
  status: number;
@@ -15,5 +26,5 @@ declare class ClientError extends Error {
15
26
  });
16
27
  }
17
28
  //#endregion
18
- export { ClientError };
29
+ export { ApiErrorBody, ClientError };
19
30
  //# sourceMappingURL=error.d.cts.map
package/dist/error.d.mts CHANGED
@@ -1,4 +1,15 @@
1
1
  //#region src/error.d.ts
2
+ /**
3
+ * Common shape of error bodies returned by the Storyblok Content Delivery API.
4
+ *
5
+ * Most error responses include an `error` or `message` field with a
6
+ * human-readable description.
7
+ */
8
+ interface ApiErrorBody {
9
+ error?: string;
10
+ message?: string;
11
+ [key: string]: unknown;
12
+ }
2
13
  /**
3
14
  * Structured HTTP error thrown by the Content API client when `throwOnError: true`.
4
15
  */
@@ -6,7 +17,7 @@ declare class ClientError extends Error {
6
17
  readonly response: {
7
18
  status: number;
8
19
  statusText: string;
9
- data: unknown;
20
+ data: ApiErrorBody | undefined;
10
21
  };
11
22
  constructor(message: string, options: {
12
23
  status: number;
@@ -15,5 +26,5 @@ declare class ClientError extends Error {
15
26
  });
16
27
  }
17
28
  //#endregion
18
- export { ClientError };
29
+ export { ApiErrorBody, ClientError };
19
30
  //# sourceMappingURL=error.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.mjs","names":[],"sources":["../src/error.ts"],"sourcesContent":["/**\n * Structured HTTP error thrown by the Content API client when `throwOnError: true`.\n */\nexport class ClientError extends Error {\n readonly response: { status: number; statusText: string; data: unknown };\n\n constructor(\n message: string,\n options: { status: number; statusText: string; data: unknown },\n ) {\n super(message);\n this.name = 'ClientError';\n this.response = {\n status: options.status,\n statusText: options.statusText,\n data: options.data,\n };\n }\n}\n"],"mappings":";;;;AAGA,IAAa,cAAb,cAAiC,MAAM;CACrC,AAAS;CAET,YACE,SACA,SACA;AACA,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,WAAW;GACd,QAAQ,QAAQ;GAChB,YAAY,QAAQ;GACpB,MAAM,QAAQ;GACf"}
1
+ {"version":3,"file":"error.mjs","names":[],"sources":["../src/error.ts"],"sourcesContent":["/**\n * Common shape of error bodies returned by the Storyblok Content Delivery API.\n *\n * Most error responses include an `error` or `message` field with a\n * human-readable description.\n */\nexport interface ApiErrorBody {\n error?: string;\n message?: string;\n [key: string]: unknown;\n}\n\n/**\n * Structured HTTP error thrown by the Content API client when `throwOnError: true`.\n */\nexport class ClientError extends Error {\n readonly response: { status: number; statusText: string; data: ApiErrorBody | undefined };\n\n constructor(\n message: string,\n options: { status: number; statusText: string; data: unknown },\n ) {\n super(message);\n this.name = 'ClientError';\n this.response = {\n status: options.status,\n statusText: options.statusText,\n data: options.data as ApiErrorBody | undefined,\n };\n }\n}\n"],"mappings":";;;;AAeA,IAAa,cAAb,cAAiC,MAAM;CACrC,AAAS;CAET,YACE,SACA,SACA;AACA,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,WAAW;GACd,QAAQ,QAAQ;GAChB,YAAY,QAAQ;GACpB,MAAM,QAAQ;GACf"}
@@ -0,0 +1,120 @@
1
+ //#region src/generated/capi/_internal.gen.d.ts
2
+ type CapiStory = ({
3
+ version?: 'draft';
4
+ } & DraftStory) | ({
5
+ version?: 'published';
6
+ } & PublishedStory);
7
+ type DraftStory = {
8
+ name: string;
9
+ /**
10
+ * Creation timestamp (format is ISO 8601 standard in UTC).
11
+ */
12
+ created_at: string;
13
+ /**
14
+ * Latest update timestamp (format is ISO 8601 standard in UTC).
15
+ */
16
+ updated_at?: string | null;
17
+ /**
18
+ * Latest publication timestamp (format is ISO 8601 standard in UTC).
19
+ */
20
+ published_at: string | null;
21
+ alternates: Array<StoryAlternate>;
22
+ id: number;
23
+ uuid: string;
24
+ /**
25
+ * Dynamic component data rendered by Storyblok, structure varies by component.
26
+ */
27
+ content: {
28
+ _uid?: string;
29
+ component?: string;
30
+ [key: string]: unknown | string | undefined;
31
+ };
32
+ slug: string;
33
+ full_slug: string;
34
+ default_full_slug: string | null;
35
+ sort_by_date: string | null;
36
+ position: number;
37
+ tag_list: Array<string>;
38
+ is_startpage: boolean;
39
+ parent_id: number;
40
+ /**
41
+ * Custom metadata for the story.
42
+ */
43
+ meta_data: {
44
+ [key: string]: unknown;
45
+ } | null;
46
+ group_id: string;
47
+ first_published_at: string | null;
48
+ release_id: number | null;
49
+ lang: string;
50
+ path: string | null;
51
+ translated_slugs: Array<{
52
+ path: string;
53
+ name: string | null;
54
+ lang: string;
55
+ published: string | null;
56
+ }> | null;
57
+ };
58
+ type PublishedStory = {
59
+ name: string;
60
+ /**
61
+ * Creation timestamp (format is ISO 8601 standard in UTC).
62
+ */
63
+ created_at: string;
64
+ /**
65
+ * Latest update timestamp (format is ISO 8601 standard in UTC).
66
+ */
67
+ updated_at?: string | null;
68
+ /**
69
+ * Latest publication timestamp (format is ISO 8601 standard in UTC).
70
+ */
71
+ published_at: string | null;
72
+ id: number;
73
+ uuid: string;
74
+ /**
75
+ * Dynamic component data rendered by Storyblok, structure varies by component.
76
+ */
77
+ content: {
78
+ _uid?: string;
79
+ component?: string;
80
+ [key: string]: unknown | string | undefined;
81
+ };
82
+ slug: string;
83
+ full_slug: string;
84
+ sort_by_date: string | null;
85
+ position: number;
86
+ tag_list: Array<string>;
87
+ is_startpage: boolean;
88
+ parent_id: number;
89
+ /**
90
+ * Custom metadata for the story.
91
+ */
92
+ meta_data: {
93
+ [key: string]: unknown;
94
+ } | null;
95
+ group_id: string;
96
+ first_published_at: string | null;
97
+ release_id?: number | null;
98
+ lang: string;
99
+ path: string | null;
100
+ alternates: Array<StoryAlternate>;
101
+ default_full_slug: string | null;
102
+ translated_slugs: Array<{
103
+ path: string;
104
+ name: string | null;
105
+ lang: string;
106
+ published: string | null;
107
+ }> | null;
108
+ };
109
+ type StoryAlternate = {
110
+ id: number;
111
+ name: string;
112
+ slug: string;
113
+ published: boolean | null;
114
+ full_slug: string;
115
+ is_folder: boolean;
116
+ parent_id: number;
117
+ };
118
+ //#endregion
119
+ export { CapiStory, StoryAlternate };
120
+ //# sourceMappingURL=_internal.gen.d.cts.map
@@ -0,0 +1,120 @@
1
+ //#region src/generated/capi/_internal.gen.d.ts
2
+ type CapiStory = ({
3
+ version?: 'draft';
4
+ } & DraftStory) | ({
5
+ version?: 'published';
6
+ } & PublishedStory);
7
+ type DraftStory = {
8
+ name: string;
9
+ /**
10
+ * Creation timestamp (format is ISO 8601 standard in UTC).
11
+ */
12
+ created_at: string;
13
+ /**
14
+ * Latest update timestamp (format is ISO 8601 standard in UTC).
15
+ */
16
+ updated_at?: string | null;
17
+ /**
18
+ * Latest publication timestamp (format is ISO 8601 standard in UTC).
19
+ */
20
+ published_at: string | null;
21
+ alternates: Array<StoryAlternate>;
22
+ id: number;
23
+ uuid: string;
24
+ /**
25
+ * Dynamic component data rendered by Storyblok, structure varies by component.
26
+ */
27
+ content: {
28
+ _uid?: string;
29
+ component?: string;
30
+ [key: string]: unknown | string | undefined;
31
+ };
32
+ slug: string;
33
+ full_slug: string;
34
+ default_full_slug: string | null;
35
+ sort_by_date: string | null;
36
+ position: number;
37
+ tag_list: Array<string>;
38
+ is_startpage: boolean;
39
+ parent_id: number;
40
+ /**
41
+ * Custom metadata for the story.
42
+ */
43
+ meta_data: {
44
+ [key: string]: unknown;
45
+ } | null;
46
+ group_id: string;
47
+ first_published_at: string | null;
48
+ release_id: number | null;
49
+ lang: string;
50
+ path: string | null;
51
+ translated_slugs: Array<{
52
+ path: string;
53
+ name: string | null;
54
+ lang: string;
55
+ published: string | null;
56
+ }> | null;
57
+ };
58
+ type PublishedStory = {
59
+ name: string;
60
+ /**
61
+ * Creation timestamp (format is ISO 8601 standard in UTC).
62
+ */
63
+ created_at: string;
64
+ /**
65
+ * Latest update timestamp (format is ISO 8601 standard in UTC).
66
+ */
67
+ updated_at?: string | null;
68
+ /**
69
+ * Latest publication timestamp (format is ISO 8601 standard in UTC).
70
+ */
71
+ published_at: string | null;
72
+ id: number;
73
+ uuid: string;
74
+ /**
75
+ * Dynamic component data rendered by Storyblok, structure varies by component.
76
+ */
77
+ content: {
78
+ _uid?: string;
79
+ component?: string;
80
+ [key: string]: unknown | string | undefined;
81
+ };
82
+ slug: string;
83
+ full_slug: string;
84
+ sort_by_date: string | null;
85
+ position: number;
86
+ tag_list: Array<string>;
87
+ is_startpage: boolean;
88
+ parent_id: number;
89
+ /**
90
+ * Custom metadata for the story.
91
+ */
92
+ meta_data: {
93
+ [key: string]: unknown;
94
+ } | null;
95
+ group_id: string;
96
+ first_published_at: string | null;
97
+ release_id?: number | null;
98
+ lang: string;
99
+ path: string | null;
100
+ alternates: Array<StoryAlternate>;
101
+ default_full_slug: string | null;
102
+ translated_slugs: Array<{
103
+ path: string;
104
+ name: string | null;
105
+ lang: string;
106
+ published: string | null;
107
+ }> | null;
108
+ };
109
+ type StoryAlternate = {
110
+ id: number;
111
+ name: string;
112
+ slug: string;
113
+ published: boolean | null;
114
+ full_slug: string;
115
+ is_folder: boolean;
116
+ parent_id: number;
117
+ };
118
+ //#endregion
119
+ export { CapiStory, StoryAlternate };
120
+ //# sourceMappingURL=_internal.gen.d.mts.map
@@ -5,7 +5,7 @@ const require_utils_gen$1 = require('./utils.gen.cjs');
5
5
  let ky = require("ky");
6
6
  ky = require_runtime.__toESM(ky);
7
7
 
8
- //#region src/generated/shared/client/client.gen.ts
8
+ //#region src/generated/capi/client/client.gen.ts
9
9
  const createClient = (config = {}) => {
10
10
  let _config = require_utils_gen$1.mergeConfigs(require_utils_gen$1.createConfig(), config);
11
11
  const getConfig = () => ({ ..._config });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.gen.cjs","names":["mergeConfigs","createConfig","createInterceptors","mergeHeaders","setAuthParams","buildUrl","getValidRequestBody","getParseAs","createSseClient"],"sources":["../../../../src/generated/capi/client/client.gen.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { HTTPError, Options as KyOptions } from 'ky';\nimport ky from 'ky';\n\nimport { createSseClient } from '../core/serverSentEvents.gen';\nimport type { HttpMethod } from '../core/types.gen';\nimport { getValidRequestBody } from '../core/utils.gen';\nimport type { Client, Config, RequestOptions, ResolvedRequestOptions, RetryOptions } from './types.gen';\nimport type { Middleware } from './utils.gen';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils.gen';\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<Request, Response, unknown, ResolvedRequestOptions>();\n\n const beforeRequest = async (options: RequestOptions) => {\n const opts = {\n ..._config,\n ...options,\n headers: mergeHeaders(_config.headers, options.headers),\n ky: options.ky ?? _config.ky ?? ky,\n serializedBody: undefined,\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 !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body);\n }\n\n if (opts.body === undefined || opts.serializedBody === '') {\n opts.headers.delete('Content-Type');\n }\n\n const url = buildUrl(opts);\n\n return { opts, url };\n };\n\n const parseErrorResponse = async (\n response: Response,\n request: Request,\n opts: ResolvedRequestOptions,\n interceptorsMiddleware: Middleware<Request, Response, unknown, ResolvedRequestOptions>,\n ) => {\n const result = {\n request,\n response,\n };\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n jsonError = undefined;\n }\n\n const error = jsonError ?? textError;\n let finalError = error;\n\n for (const fn of interceptorsMiddleware.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 return opts.responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n ...result,\n };\n };\n\n const request: Client['request'] = async (options) => {\n // @ts-expect-error\n const { opts, url } = await beforeRequest(options);\n\n const kyInstance = opts.ky!;\n\n const validBody = getValidRequestBody(opts);\n\n const kyOptions: KyOptions = {\n body: validBody as BodyInit,\n cache: opts.cache,\n credentials: opts.credentials,\n headers: opts.headers,\n integrity: opts.integrity,\n keepalive: opts.keepalive,\n method: opts.method as KyOptions['method'],\n mode: opts.mode,\n redirect: 'follow',\n referrer: opts.referrer,\n referrerPolicy: opts.referrerPolicy,\n signal: opts.signal,\n throwHttpErrors: opts.throwOnError ?? false,\n timeout: opts.timeout,\n ...opts.kyOptions,\n };\n\n if (opts.retry && typeof opts.retry === 'object') {\n const retryOpts = opts.retry as RetryOptions;\n kyOptions.retry = {\n limit: retryOpts.limit ?? 2,\n methods: retryOpts.methods as Array<\n 'get' | 'post' | 'put' | 'patch' | 'head' | 'delete' | 'options' | 'trace'\n >,\n statusCodes: retryOpts.statusCodes,\n };\n }\n\n let request = new Request(url, {\n body: kyOptions.body as BodyInit,\n headers: kyOptions.headers as HeadersInit,\n method: kyOptions.method,\n });\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n let response: Response;\n\n try {\n response = await kyInstance(request, kyOptions);\n } catch (error) {\n if (error && typeof error === 'object' && 'response' in error) {\n const httpError = error as HTTPError;\n response = httpError.response;\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n return parseErrorResponse(response, request, opts, interceptors);\n }\n\n throw error;\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 const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n if (response.status === 204 || response.headers.get('Content-Length') === '0') {\n let emptyData: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'text':\n emptyData = await response[parseAs]();\n break;\n case 'formData':\n emptyData = new FormData();\n break;\n case 'stream':\n emptyData = response.body;\n break;\n case 'json':\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === 'data'\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'json': {\n // Some servers return 200 with no Content-Length and empty body.\n // response.json() would throw; read as text and parse if non-empty.\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n break;\n }\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 return parseErrorResponse(response, request, opts, interceptors);\n };\n\n const makeMethodFn = (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn = (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n fetch: globalThis.fetch,\n headers: opts.headers as unknown as Record<string, string>,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n serializedBody: getValidRequestBody(opts) as BodyInit | null | undefined,\n url,\n });\n };\n\n return {\n buildUrl,\n connect: makeMethodFn('CONNECT'),\n delete: makeMethodFn('DELETE'),\n get: makeMethodFn('GET'),\n getConfig,\n head: makeMethodFn('HEAD'),\n interceptors,\n options: makeMethodFn('OPTIONS'),\n patch: makeMethodFn('PATCH'),\n post: makeMethodFn('POST'),\n put: makeMethodFn('PUT'),\n request,\n setConfig,\n sse: {\n connect: makeSseFn('CONNECT'),\n delete: makeSseFn('DELETE'),\n get: makeSseFn('GET'),\n head: makeSseFn('HEAD'),\n options: makeSseFn('OPTIONS'),\n patch: makeSseFn('PATCH'),\n post: makeSseFn('POST'),\n put: makeSseFn('PUT'),\n trace: makeSseFn('TRACE'),\n },\n trace: makeMethodFn('TRACE'),\n } as Client;\n};\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { };
@@ -3,7 +3,7 @@ import { getValidRequestBody } from "../core/utils.gen.mjs";
3
3
  import { buildUrl, createConfig, createInterceptors, getParseAs, mergeConfigs, mergeHeaders, setAuthParams } from "./utils.gen.mjs";
4
4
  import ky from "ky";
5
5
 
6
- //#region src/generated/shared/client/client.gen.ts
6
+ //#region src/generated/capi/client/client.gen.ts
7
7
  const createClient = (config = {}) => {
8
8
  let _config = mergeConfigs(createConfig(), config);
9
9
  const getConfig = () => ({ ..._config });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.gen.mjs","names":[],"sources":["../../../../src/generated/capi/client/client.gen.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { HTTPError, Options as KyOptions } from 'ky';\nimport ky from 'ky';\n\nimport { createSseClient } from '../core/serverSentEvents.gen';\nimport type { HttpMethod } from '../core/types.gen';\nimport { getValidRequestBody } from '../core/utils.gen';\nimport type { Client, Config, RequestOptions, ResolvedRequestOptions, RetryOptions } from './types.gen';\nimport type { Middleware } from './utils.gen';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils.gen';\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<Request, Response, unknown, ResolvedRequestOptions>();\n\n const beforeRequest = async (options: RequestOptions) => {\n const opts = {\n ..._config,\n ...options,\n headers: mergeHeaders(_config.headers, options.headers),\n ky: options.ky ?? _config.ky ?? ky,\n serializedBody: undefined,\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 !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body);\n }\n\n if (opts.body === undefined || opts.serializedBody === '') {\n opts.headers.delete('Content-Type');\n }\n\n const url = buildUrl(opts);\n\n return { opts, url };\n };\n\n const parseErrorResponse = async (\n response: Response,\n request: Request,\n opts: ResolvedRequestOptions,\n interceptorsMiddleware: Middleware<Request, Response, unknown, ResolvedRequestOptions>,\n ) => {\n const result = {\n request,\n response,\n };\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n jsonError = undefined;\n }\n\n const error = jsonError ?? textError;\n let finalError = error;\n\n for (const fn of interceptorsMiddleware.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 return opts.responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n ...result,\n };\n };\n\n const request: Client['request'] = async (options) => {\n // @ts-expect-error\n const { opts, url } = await beforeRequest(options);\n\n const kyInstance = opts.ky!;\n\n const validBody = getValidRequestBody(opts);\n\n const kyOptions: KyOptions = {\n body: validBody as BodyInit,\n cache: opts.cache,\n credentials: opts.credentials,\n headers: opts.headers,\n integrity: opts.integrity,\n keepalive: opts.keepalive,\n method: opts.method as KyOptions['method'],\n mode: opts.mode,\n redirect: 'follow',\n referrer: opts.referrer,\n referrerPolicy: opts.referrerPolicy,\n signal: opts.signal,\n throwHttpErrors: opts.throwOnError ?? false,\n timeout: opts.timeout,\n ...opts.kyOptions,\n };\n\n if (opts.retry && typeof opts.retry === 'object') {\n const retryOpts = opts.retry as RetryOptions;\n kyOptions.retry = {\n limit: retryOpts.limit ?? 2,\n methods: retryOpts.methods as Array<\n 'get' | 'post' | 'put' | 'patch' | 'head' | 'delete' | 'options' | 'trace'\n >,\n statusCodes: retryOpts.statusCodes,\n };\n }\n\n let request = new Request(url, {\n body: kyOptions.body as BodyInit,\n headers: kyOptions.headers as HeadersInit,\n method: kyOptions.method,\n });\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n let response: Response;\n\n try {\n response = await kyInstance(request, kyOptions);\n } catch (error) {\n if (error && typeof error === 'object' && 'response' in error) {\n const httpError = error as HTTPError;\n response = httpError.response;\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n return parseErrorResponse(response, request, opts, interceptors);\n }\n\n throw error;\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 const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n if (response.status === 204 || response.headers.get('Content-Length') === '0') {\n let emptyData: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'text':\n emptyData = await response[parseAs]();\n break;\n case 'formData':\n emptyData = new FormData();\n break;\n case 'stream':\n emptyData = response.body;\n break;\n case 'json':\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === 'data'\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'json': {\n // Some servers return 200 with no Content-Length and empty body.\n // response.json() would throw; read as text and parse if non-empty.\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n break;\n }\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 return parseErrorResponse(response, request, opts, interceptors);\n };\n\n const makeMethodFn = (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn = (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n fetch: globalThis.fetch,\n headers: opts.headers as unknown as Record<string, string>,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n serializedBody: getValidRequestBody(opts) as BodyInit | null | undefined,\n url,\n });\n };\n\n return {\n buildUrl,\n connect: makeMethodFn('CONNECT'),\n delete: makeMethodFn('DELETE'),\n get: makeMethodFn('GET'),\n getConfig,\n head: makeMethodFn('HEAD'),\n interceptors,\n options: makeMethodFn('OPTIONS'),\n patch: makeMethodFn('PATCH'),\n post: makeMethodFn('POST'),\n put: makeMethodFn('PUT'),\n request,\n setConfig,\n sse: {\n connect: makeSseFn('CONNECT'),\n delete: makeSseFn('DELETE'),\n get: makeSseFn('GET'),\n head: makeSseFn('HEAD'),\n options: makeSseFn('OPTIONS'),\n patch: makeSseFn('PATCH'),\n post: makeSseFn('POST'),\n put: makeSseFn('PUT'),\n trace: makeSseFn('TRACE'),\n },\n trace: makeMethodFn('TRACE'),\n } as Client;\n};\n"],"mappings":";;;;;;AAoBA,MAAa,gBAAgB,SAAiB,EAAE,KAAa;CAC3D,IAAI,UAAU,aAAa,cAAc,EAAE,OAAO;CAElD,MAAM,mBAA2B,EAAE,GAAG,SAAS;CAE/C,MAAM,aAAa,WAA2B;AAC5C,YAAU,aAAa,SAAS,OAAO;AACvC,SAAO,WAAW;;CAGpB,MAAM,eAAe,oBAAwE;CAE7F,MAAM,gBAAgB,OAAO,YAA4B;EACvD,MAAM,OAAO;GACX,GAAG;GACH,GAAG;GACH,SAAS,aAAa,QAAQ,SAAS,QAAQ,QAAQ;GACvD,IAAI,QAAQ,MAAM,QAAQ,MAAM;GAChC,gBAAgB;GACjB;AAED,MAAI,KAAK,SACP,OAAM,cAAc;GAClB,GAAG;GACH,UAAU,KAAK;GAChB,CAAC;AAGJ,MAAI,KAAK,iBACP,OAAM,KAAK,iBAAiB,KAAK;AAGnC,MAAI,KAAK,SAAS,UAAa,KAAK,eAClC,MAAK,iBAAiB,KAAK,eAAe,KAAK,KAAK;AAGtD,MAAI,KAAK,SAAS,UAAa,KAAK,mBAAmB,GACrD,MAAK,QAAQ,OAAO,eAAe;AAKrC,SAAO;GAAE;GAAM,KAFH,SAAS,KAAK;GAEN;;CAGtB,MAAM,qBAAqB,OACzB,UACA,SACA,MACA,2BACG;EACH,MAAM,SAAS;GACb;GACA;GACD;EAED,MAAM,YAAY,MAAM,SAAS,MAAM;EACvC,IAAI;AAEJ,MAAI;AACF,eAAY,KAAK,MAAM,UAAU;UAC3B;AACN,eAAY;;EAGd,MAAM,QAAQ,aAAa;EAC3B,IAAI,aAAa;AAEjB,OAAK,MAAM,MAAM,uBAAuB,MAAM,IAC5C,KAAI,GACF,cAAc,MAAM,GAAG,OAAO,UAAU,SAAS,KAAK;AAI1D,eAAa,cAAe,EAAE;AAE9B,MAAI,KAAK,aACP,OAAM;AAGR,SAAO,KAAK,kBAAkB,SAC1B,SACA;GACE,OAAO;GACP,GAAG;GACJ;;CAGP,MAAM,UAA6B,OAAO,YAAY;EAEpD,MAAM,EAAE,MAAM,QAAQ,MAAM,cAAc,QAAQ;EAElD,MAAM,aAAa,KAAK;EAIxB,MAAM,YAAuB;GAC3B,MAHgB,oBAAoB,KAAK;GAIzC,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,SAAS,KAAK;GACd,WAAW,KAAK;GAChB,WAAW,KAAK;GAChB,QAAQ,KAAK;GACb,MAAM,KAAK;GACX,UAAU;GACV,UAAU,KAAK;GACf,gBAAgB,KAAK;GACrB,QAAQ,KAAK;GACb,iBAAiB,KAAK,gBAAgB;GACtC,SAAS,KAAK;GACd,GAAG,KAAK;GACT;AAED,MAAI,KAAK,SAAS,OAAO,KAAK,UAAU,UAAU;GAChD,MAAM,YAAY,KAAK;AACvB,aAAU,QAAQ;IAChB,OAAO,UAAU,SAAS;IAC1B,SAAS,UAAU;IAGnB,aAAa,UAAU;IACxB;;EAGH,IAAI,UAAU,IAAI,QAAQ,KAAK;GAC7B,MAAM,UAAU;GAChB,SAAS,UAAU;GACnB,QAAQ,UAAU;GACnB,CAAC;AAEF,OAAK,MAAM,MAAM,aAAa,QAAQ,IACpC,KAAI,GACF,WAAU,MAAM,GAAG,SAAS,KAAK;EAIrC,IAAI;AAEJ,MAAI;AACF,cAAW,MAAM,WAAW,SAAS,UAAU;WACxC,OAAO;AACd,OAAI,SAAS,OAAO,UAAU,YAAY,cAAc,OAAO;AAE7D,eADkB,MACG;AAErB,SAAK,MAAM,MAAM,aAAa,SAAS,IACrC,KAAI,GACF,YAAW,MAAM,GAAG,UAAU,SAAS,KAAK;AAIhD,WAAO,mBAAmB,UAAU,SAAS,MAAM,aAAa;;AAGlE,SAAM;;AAGR,OAAK,MAAM,MAAM,aAAa,SAAS,IACrC,KAAI,GACF,YAAW,MAAM,GAAG,UAAU,SAAS,KAAK;EAIhD,MAAM,SAAS;GACb;GACA;GACD;AAED,MAAI,SAAS,IAAI;GACf,MAAM,WACH,KAAK,YAAY,SACd,WAAW,SAAS,QAAQ,IAAI,eAAe,CAAC,GAChD,KAAK,YAAY;AAEvB,OAAI,SAAS,WAAW,OAAO,SAAS,QAAQ,IAAI,iBAAiB,KAAK,KAAK;IAC7E,IAAI;AACJ,YAAQ,SAAR;KACE,KAAK;KACL,KAAK;KACL,KAAK;AACH,kBAAY,MAAM,SAAS,UAAU;AACrC;KACF,KAAK;AACH,kBAAY,IAAI,UAAU;AAC1B;KACF,KAAK;AACH,kBAAY,SAAS;AACrB;KAEF;AACE,kBAAY,EAAE;AACd;;AAEJ,WAAO,KAAK,kBAAkB,SAC1B,YACA;KACE,MAAM;KACN,GAAG;KACJ;;GAGP,IAAI;AACJ,WAAQ,SAAR;IACE,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACH,YAAO,MAAM,SAAS,UAAU;AAChC;IACF,KAAK,QAAQ;KAGX,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,YAAO,OAAO,KAAK,MAAM,KAAK,GAAG,EAAE;AACnC;;IAEF,KAAK,SACH,QAAO,KAAK,kBAAkB,SAC1B,SAAS,OACT;KACE,MAAM,SAAS;KACf,GAAG;KACJ;;AAGT,OAAI,YAAY,QAAQ;AACtB,QAAI,KAAK,kBACP,OAAM,KAAK,kBAAkB,KAAK;AAGpC,QAAI,KAAK,oBACP,QAAO,MAAM,KAAK,oBAAoB,KAAK;;AAI/C,UAAO,KAAK,kBAAkB,SAC1B,OACA;IACE;IACA,GAAG;IACJ;;AAGP,SAAO,mBAAmB,UAAU,SAAS,MAAM,aAAa;;CAGlE,MAAM,gBAAgB,YAAmC,YACvD,QAAQ;EAAE,GAAG;EAAS;EAAQ,CAAC;CAEjC,MAAM,aAAa,WAAkC,OAAO,YAA4B;EACtF,MAAM,EAAE,MAAM,QAAQ,MAAM,cAAc,QAAQ;AAClD,SAAO,gBAAgB;GACrB,GAAG;GACH,MAAM,KAAK;GACX,OAAO,WAAW;GAClB,SAAS,KAAK;GACd;GACA,WAAW,OAAO,KAAK,SAAS;IAC9B,IAAI,UAAU,IAAI,QAAQ,KAAK,KAAK;AACpC,SAAK,MAAM,MAAM,aAAa,QAAQ,IACpC,KAAI,GACF,WAAU,MAAM,GAAG,SAAS,KAAK;AAGrC,WAAO;;GAET,gBAAgB,oBAAoB,KAAK;GACzC;GACD,CAAC;;AAGJ,QAAO;EACL;EACA,SAAS,aAAa,UAAU;EAChC,QAAQ,aAAa,SAAS;EAC9B,KAAK,aAAa,MAAM;EACxB;EACA,MAAM,aAAa,OAAO;EAC1B;EACA,SAAS,aAAa,UAAU;EAChC,OAAO,aAAa,QAAQ;EAC5B,MAAM,aAAa,OAAO;EAC1B,KAAK,aAAa,MAAM;EACxB;EACA;EACA,KAAK;GACH,SAAS,UAAU,UAAU;GAC7B,QAAQ,UAAU,SAAS;GAC3B,KAAK,UAAU,MAAM;GACrB,MAAM,UAAU,OAAO;GACvB,SAAS,UAAU,UAAU;GAC7B,OAAO,UAAU,QAAQ;GACzB,MAAM,UAAU,OAAO;GACvB,KAAK,UAAU,MAAM;GACrB,OAAO,UAAU,QAAQ;GAC1B;EACD,OAAO,aAAa,QAAQ;EAC7B"}
@@ -0,0 +1,3 @@
1
+ import { Auth } from "../core/auth.gen.mjs";
2
+ import { QuerySerializerOptions } from "../core/bodySerializer.gen.mjs";
3
+ import { Client, ClientOptions, Config, Options, RequestOptions, RequestResult, ResolvedRequestOptions, ResponseStyle, RetryOptions, TDataShape } from "./types.gen.mjs";