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

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 (294) hide show
  1. package/README.md +3 -1
  2. package/dist/client.cjs +9 -9
  3. package/dist/client.cjs.map +1 -1
  4. package/dist/client.d.cts +217 -203
  5. package/dist/client.d.mts +217 -203
  6. package/dist/client.mjs +9 -9
  7. package/dist/client.mjs.map +1 -1
  8. package/dist/generated/mapi/_internal.gen.d.cts +371 -0
  9. package/dist/generated/mapi/_internal.gen.d.mts +371 -0
  10. package/dist/generated/{shared → mapi}/client/client.gen.cjs +1 -1
  11. package/dist/generated/mapi/client/client.gen.cjs.map +1 -0
  12. package/dist/generated/{shared → mapi}/client/client.gen.mjs +1 -1
  13. package/dist/generated/mapi/client/client.gen.mjs.map +1 -0
  14. package/dist/generated/{shared → mapi}/client/types.gen.d.cts +1 -1
  15. package/dist/generated/{shared → mapi}/client/types.gen.d.mts +1 -1
  16. package/dist/generated/{shared → mapi}/client/utils.gen.cjs +1 -1
  17. package/dist/generated/mapi/client/utils.gen.cjs.map +1 -0
  18. package/dist/generated/{shared → mapi}/client/utils.gen.d.cts +1 -1
  19. package/dist/generated/{shared → mapi}/client/utils.gen.d.mts +1 -1
  20. package/dist/generated/{shared → mapi}/client/utils.gen.mjs +1 -1
  21. package/dist/generated/mapi/client/utils.gen.mjs.map +1 -0
  22. package/dist/generated/mapi/client.gen.cjs +10 -0
  23. package/dist/generated/mapi/client.gen.cjs.map +1 -0
  24. package/dist/generated/mapi/client.gen.mjs +10 -0
  25. package/dist/generated/mapi/client.gen.mjs.map +1 -0
  26. package/dist/generated/{shared → mapi}/core/auth.gen.cjs +1 -1
  27. package/dist/generated/mapi/core/auth.gen.cjs.map +1 -0
  28. package/dist/generated/{shared → mapi}/core/auth.gen.d.cts +1 -1
  29. package/dist/generated/{shared → mapi}/core/auth.gen.d.mts +1 -1
  30. package/dist/generated/{shared → mapi}/core/auth.gen.mjs +1 -1
  31. package/dist/generated/mapi/core/auth.gen.mjs.map +1 -0
  32. package/dist/generated/{shared → mapi}/core/bodySerializer.gen.cjs +1 -1
  33. package/dist/generated/mapi/core/bodySerializer.gen.cjs.map +1 -0
  34. package/dist/generated/{shared → mapi}/core/bodySerializer.gen.d.cts +1 -1
  35. package/dist/generated/{shared → mapi}/core/bodySerializer.gen.d.mts +1 -1
  36. package/dist/generated/{shared → mapi}/core/bodySerializer.gen.mjs +1 -1
  37. package/dist/generated/mapi/core/bodySerializer.gen.mjs.map +1 -0
  38. package/dist/generated/{shared → mapi}/core/params.gen.cjs +1 -1
  39. package/dist/generated/mapi/core/params.gen.cjs.map +1 -0
  40. package/dist/generated/{shared → mapi}/core/params.gen.mjs +1 -1
  41. package/dist/generated/mapi/core/params.gen.mjs.map +1 -0
  42. package/dist/generated/{shared → mapi}/core/pathSerializer.gen.cjs +1 -1
  43. package/dist/generated/mapi/core/pathSerializer.gen.cjs.map +1 -0
  44. package/dist/generated/{shared → mapi}/core/pathSerializer.gen.d.cts +1 -1
  45. package/dist/generated/{shared → mapi}/core/pathSerializer.gen.d.mts +1 -1
  46. package/dist/generated/{shared → mapi}/core/pathSerializer.gen.mjs +1 -1
  47. package/dist/generated/mapi/core/pathSerializer.gen.mjs.map +1 -0
  48. package/dist/generated/{shared → mapi}/core/serverSentEvents.gen.cjs +1 -1
  49. package/dist/generated/mapi/core/serverSentEvents.gen.cjs.map +1 -0
  50. package/dist/generated/{shared → mapi}/core/serverSentEvents.gen.d.cts +1 -1
  51. package/dist/generated/{shared → mapi}/core/serverSentEvents.gen.d.mts +1 -1
  52. package/dist/generated/{shared → mapi}/core/serverSentEvents.gen.mjs +1 -1
  53. package/dist/generated/mapi/core/serverSentEvents.gen.mjs.map +1 -0
  54. package/dist/generated/{shared → mapi}/core/types.gen.d.cts +1 -1
  55. package/dist/generated/{shared → mapi}/core/types.gen.d.mts +1 -1
  56. package/dist/generated/{shared → mapi}/core/utils.gen.cjs +1 -1
  57. package/dist/generated/mapi/core/utils.gen.cjs.map +1 -0
  58. package/dist/generated/{shared → mapi}/core/utils.gen.mjs +1 -1
  59. package/dist/generated/mapi/core/utils.gen.mjs.map +1 -0
  60. package/dist/generated/mapi/sdk.gen.cjs +1477 -0
  61. package/dist/generated/mapi/sdk.gen.cjs.map +1 -0
  62. package/dist/generated/mapi/sdk.gen.mjs +1399 -0
  63. package/dist/generated/mapi/sdk.gen.mjs.map +1 -0
  64. package/dist/generated/mapi/types-aliased.gen.d.cts +1598 -0
  65. package/dist/generated/mapi/types-aliased.gen.d.mts +1598 -0
  66. package/dist/generated/mapi/types.gen.d.cts +5075 -0
  67. package/dist/generated/mapi/types.gen.d.mts +5075 -0
  68. package/dist/generated/{components/types.gen.d.cts → overlay/_internal.gen.d.cts} +281 -457
  69. package/dist/generated/{components/types.gen.d.mts → overlay/_internal.gen.d.mts} +281 -457
  70. package/dist/generated/types/_utils.d.cts +7 -0
  71. package/dist/generated/types/_utils.d.mts +7 -0
  72. package/dist/generated/types/block.d.cts +49 -0
  73. package/dist/generated/types/block.d.mts +49 -0
  74. package/dist/generated/types/field.d.cts +87 -0
  75. package/dist/generated/types/field.d.mts +87 -0
  76. package/dist/generated/types/mapi-story.d.cts +29 -0
  77. package/dist/generated/types/mapi-story.d.mts +29 -0
  78. package/dist/index.d.cts +8 -4
  79. package/dist/index.d.mts +8 -4
  80. package/dist/resources/asset-folders.cjs +9 -9
  81. package/dist/resources/asset-folders.cjs.map +1 -1
  82. package/dist/resources/asset-folders.mjs +9 -9
  83. package/dist/resources/asset-folders.mjs.map +1 -1
  84. package/dist/resources/assets.cjs +64 -46
  85. package/dist/resources/assets.cjs.map +1 -1
  86. package/dist/resources/assets.d.cts +23 -28
  87. package/dist/resources/assets.d.mts +23 -28
  88. package/dist/resources/assets.mjs +64 -46
  89. package/dist/resources/assets.mjs.map +1 -1
  90. package/dist/resources/component-folders.cjs +9 -9
  91. package/dist/resources/component-folders.cjs.map +1 -1
  92. package/dist/resources/component-folders.mjs +9 -9
  93. package/dist/resources/component-folders.mjs.map +1 -1
  94. package/dist/resources/components.cjs +28 -20
  95. package/dist/resources/components.cjs.map +1 -1
  96. package/dist/resources/components.d.cts +76 -0
  97. package/dist/resources/components.d.mts +76 -0
  98. package/dist/resources/components.mjs +28 -20
  99. package/dist/resources/components.mjs.map +1 -1
  100. package/dist/resources/datasource-entries.cjs +28 -34
  101. package/dist/resources/datasource-entries.cjs.map +1 -1
  102. package/dist/resources/datasource-entries.mjs +29 -35
  103. package/dist/resources/datasource-entries.mjs.map +1 -1
  104. package/dist/resources/datasources.cjs +27 -9
  105. package/dist/resources/datasources.cjs.map +1 -1
  106. package/dist/resources/datasources.mjs +27 -9
  107. package/dist/resources/datasources.mjs.map +1 -1
  108. package/dist/resources/experiments.cjs +299 -0
  109. package/dist/resources/experiments.cjs.map +1 -0
  110. package/dist/resources/experiments.mjs +299 -0
  111. package/dist/resources/experiments.mjs.map +1 -0
  112. package/dist/resources/internal-tags.cjs +7 -7
  113. package/dist/resources/internal-tags.cjs.map +1 -1
  114. package/dist/resources/internal-tags.mjs +7 -7
  115. package/dist/resources/internal-tags.mjs.map +1 -1
  116. package/dist/resources/presets.cjs +9 -9
  117. package/dist/resources/presets.cjs.map +1 -1
  118. package/dist/resources/presets.mjs +9 -9
  119. package/dist/resources/presets.mjs.map +1 -1
  120. package/dist/resources/shared.cjs +15 -0
  121. package/dist/resources/shared.cjs.map +1 -1
  122. package/dist/resources/shared.mjs +15 -1
  123. package/dist/resources/shared.mjs.map +1 -1
  124. package/dist/resources/spaces.cjs +8 -7
  125. package/dist/resources/spaces.cjs.map +1 -1
  126. package/dist/resources/spaces.d.cts +8 -0
  127. package/dist/resources/spaces.d.mts +7 -0
  128. package/dist/resources/spaces.mjs +8 -7
  129. package/dist/resources/spaces.mjs.map +1 -1
  130. package/dist/resources/stories.cjs +20 -16
  131. package/dist/resources/stories.cjs.map +1 -1
  132. package/dist/resources/stories.d.cts +30 -42
  133. package/dist/resources/stories.d.mts +30 -42
  134. package/dist/resources/stories.mjs +20 -16
  135. package/dist/resources/stories.mjs.map +1 -1
  136. package/dist/resources/users.cjs +3 -3
  137. package/dist/resources/users.cjs.map +1 -1
  138. package/dist/resources/users.mjs +3 -3
  139. package/dist/resources/users.mjs.map +1 -1
  140. package/dist/utils/query-serializer.cjs +54 -0
  141. package/dist/utils/query-serializer.cjs.map +1 -0
  142. package/dist/utils/query-serializer.mjs +54 -0
  143. package/dist/utils/query-serializer.mjs.map +1 -0
  144. package/dist/utils/rate-limit.cjs +15 -74
  145. package/dist/utils/rate-limit.cjs.map +1 -1
  146. package/dist/utils/rate-limit.d.cts +5 -6
  147. package/dist/utils/rate-limit.d.mts +5 -6
  148. package/dist/utils/rate-limit.mjs +15 -74
  149. package/dist/utils/rate-limit.mjs.map +1 -1
  150. package/package.json +13 -13
  151. package/playground/integration-tests/README.md +24 -0
  152. package/playground/integration-tests/eslint.config.js +5 -0
  153. package/playground/integration-tests/node_modules/.bin/eslint +16 -0
  154. package/playground/integration-tests/node_modules/.bin/tsc +16 -0
  155. package/playground/integration-tests/node_modules/.bin/tsserver +16 -0
  156. package/playground/integration-tests/node_modules/.bin/vitest +16 -0
  157. package/playground/integration-tests/package.json +24 -0
  158. package/{test → playground/integration-tests/test}/setup.e2e.ts +2 -2
  159. package/{test → playground/integration-tests/test}/specs/mapi-round-trip.spec.e2e.ts +31 -41
  160. package/playground/integration-tests/test/types/components.test-d.ts +74 -0
  161. package/playground/integration-tests/test/types/resources.test-d.ts +212 -0
  162. package/playground/integration-tests/test/types/stories.test-d.ts +273 -0
  163. package/{vitest.config.e2e.ts → playground/integration-tests/vitest.config.e2e.ts} +1 -2
  164. package/playground/integration-tests/vitest.config.ts +13 -0
  165. package/test/GUIDE.md +4 -4
  166. package/vitest.config.ts +2 -0
  167. package/dist/generated/asset_folders/client.gen.cjs +0 -10
  168. package/dist/generated/asset_folders/client.gen.cjs.map +0 -1
  169. package/dist/generated/asset_folders/client.gen.mjs +0 -10
  170. package/dist/generated/asset_folders/client.gen.mjs.map +0 -1
  171. package/dist/generated/asset_folders/sdk.gen.cjs +0 -99
  172. package/dist/generated/asset_folders/sdk.gen.cjs.map +0 -1
  173. package/dist/generated/asset_folders/sdk.gen.mjs +0 -95
  174. package/dist/generated/asset_folders/sdk.gen.mjs.map +0 -1
  175. package/dist/generated/asset_folders/types.gen.d.cts +0 -130
  176. package/dist/generated/asset_folders/types.gen.d.mts +0 -130
  177. package/dist/generated/assets/client.gen.cjs +0 -10
  178. package/dist/generated/assets/client.gen.cjs.map +0 -1
  179. package/dist/generated/assets/client.gen.mjs +0 -10
  180. package/dist/generated/assets/client.gen.mjs.map +0 -1
  181. package/dist/generated/assets/sdk.gen.cjs +0 -179
  182. package/dist/generated/assets/sdk.gen.cjs.map +0 -1
  183. package/dist/generated/assets/sdk.gen.mjs +0 -171
  184. package/dist/generated/assets/sdk.gen.mjs.map +0 -1
  185. package/dist/generated/assets/types.gen.d.cts +0 -343
  186. package/dist/generated/assets/types.gen.d.mts +0 -343
  187. package/dist/generated/component_folders/client.gen.cjs +0 -10
  188. package/dist/generated/component_folders/client.gen.cjs.map +0 -1
  189. package/dist/generated/component_folders/client.gen.mjs +0 -10
  190. package/dist/generated/component_folders/client.gen.mjs.map +0 -1
  191. package/dist/generated/component_folders/sdk.gen.cjs +0 -99
  192. package/dist/generated/component_folders/sdk.gen.cjs.map +0 -1
  193. package/dist/generated/component_folders/sdk.gen.mjs +0 -95
  194. package/dist/generated/component_folders/sdk.gen.mjs.map +0 -1
  195. package/dist/generated/component_folders/types.gen.d.cts +0 -102
  196. package/dist/generated/component_folders/types.gen.d.mts +0 -102
  197. package/dist/generated/components/client.gen.cjs +0 -10
  198. package/dist/generated/components/client.gen.cjs.map +0 -1
  199. package/dist/generated/components/client.gen.mjs +0 -10
  200. package/dist/generated/components/client.gen.mjs.map +0 -1
  201. package/dist/generated/components/sdk.gen.cjs +0 -171
  202. package/dist/generated/components/sdk.gen.cjs.map +0 -1
  203. package/dist/generated/components/sdk.gen.mjs +0 -163
  204. package/dist/generated/components/sdk.gen.mjs.map +0 -1
  205. package/dist/generated/datasource_entries/client.gen.cjs +0 -10
  206. package/dist/generated/datasource_entries/client.gen.cjs.map +0 -1
  207. package/dist/generated/datasource_entries/client.gen.mjs +0 -10
  208. package/dist/generated/datasource_entries/client.gen.mjs.map +0 -1
  209. package/dist/generated/datasource_entries/sdk.gen.cjs +0 -89
  210. package/dist/generated/datasource_entries/sdk.gen.cjs.map +0 -1
  211. package/dist/generated/datasource_entries/sdk.gen.mjs +0 -85
  212. package/dist/generated/datasource_entries/sdk.gen.mjs.map +0 -1
  213. package/dist/generated/datasource_entries/types.gen.d.cts +0 -130
  214. package/dist/generated/datasource_entries/types.gen.d.mts +0 -130
  215. package/dist/generated/datasources/client.gen.cjs +0 -10
  216. package/dist/generated/datasources/client.gen.cjs.map +0 -1
  217. package/dist/generated/datasources/client.gen.mjs +0 -10
  218. package/dist/generated/datasources/client.gen.mjs.map +0 -1
  219. package/dist/generated/datasources/sdk.gen.cjs +0 -89
  220. package/dist/generated/datasources/sdk.gen.cjs.map +0 -1
  221. package/dist/generated/datasources/sdk.gen.mjs +0 -85
  222. package/dist/generated/datasources/sdk.gen.mjs.map +0 -1
  223. package/dist/generated/datasources/types.gen.d.cts +0 -165
  224. package/dist/generated/datasources/types.gen.d.mts +0 -165
  225. package/dist/generated/internal_tags/client.gen.cjs +0 -10
  226. package/dist/generated/internal_tags/client.gen.cjs.map +0 -1
  227. package/dist/generated/internal_tags/client.gen.mjs +0 -10
  228. package/dist/generated/internal_tags/client.gen.mjs.map +0 -1
  229. package/dist/generated/internal_tags/sdk.gen.cjs +0 -74
  230. package/dist/generated/internal_tags/sdk.gen.cjs.map +0 -1
  231. package/dist/generated/internal_tags/sdk.gen.mjs +0 -71
  232. package/dist/generated/internal_tags/sdk.gen.mjs.map +0 -1
  233. package/dist/generated/internal_tags/types.gen.d.cts +0 -102
  234. package/dist/generated/internal_tags/types.gen.d.mts +0 -102
  235. package/dist/generated/presets/client.gen.cjs +0 -10
  236. package/dist/generated/presets/client.gen.cjs.map +0 -1
  237. package/dist/generated/presets/client.gen.mjs +0 -10
  238. package/dist/generated/presets/client.gen.mjs.map +0 -1
  239. package/dist/generated/presets/sdk.gen.cjs +0 -99
  240. package/dist/generated/presets/sdk.gen.cjs.map +0 -1
  241. package/dist/generated/presets/sdk.gen.mjs +0 -95
  242. package/dist/generated/presets/sdk.gen.mjs.map +0 -1
  243. package/dist/generated/presets/types.gen.d.cts +0 -171
  244. package/dist/generated/presets/types.gen.d.mts +0 -171
  245. package/dist/generated/shared/client/client.gen.cjs.map +0 -1
  246. package/dist/generated/shared/client/client.gen.mjs.map +0 -1
  247. package/dist/generated/shared/client/utils.gen.cjs.map +0 -1
  248. package/dist/generated/shared/client/utils.gen.mjs.map +0 -1
  249. package/dist/generated/shared/core/auth.gen.cjs.map +0 -1
  250. package/dist/generated/shared/core/auth.gen.mjs.map +0 -1
  251. package/dist/generated/shared/core/bodySerializer.gen.cjs.map +0 -1
  252. package/dist/generated/shared/core/bodySerializer.gen.mjs.map +0 -1
  253. package/dist/generated/shared/core/params.gen.cjs.map +0 -1
  254. package/dist/generated/shared/core/params.gen.mjs.map +0 -1
  255. package/dist/generated/shared/core/pathSerializer.gen.cjs.map +0 -1
  256. package/dist/generated/shared/core/pathSerializer.gen.mjs.map +0 -1
  257. package/dist/generated/shared/core/serverSentEvents.gen.cjs.map +0 -1
  258. package/dist/generated/shared/core/serverSentEvents.gen.mjs.map +0 -1
  259. package/dist/generated/shared/core/utils.gen.cjs.map +0 -1
  260. package/dist/generated/shared/core/utils.gen.mjs.map +0 -1
  261. package/dist/generated/spaces/client.gen.cjs +0 -10
  262. package/dist/generated/spaces/client.gen.cjs.map +0 -1
  263. package/dist/generated/spaces/client.gen.mjs +0 -10
  264. package/dist/generated/spaces/client.gen.mjs.map +0 -1
  265. package/dist/generated/spaces/sdk.gen.cjs +0 -99
  266. package/dist/generated/spaces/sdk.gen.cjs.map +0 -1
  267. package/dist/generated/spaces/sdk.gen.mjs +0 -95
  268. package/dist/generated/spaces/sdk.gen.mjs.map +0 -1
  269. package/dist/generated/spaces/types.gen.d.cts +0 -504
  270. package/dist/generated/spaces/types.gen.d.mts +0 -504
  271. package/dist/generated/stories/client.gen.cjs +0 -10
  272. package/dist/generated/stories/client.gen.cjs.map +0 -1
  273. package/dist/generated/stories/client.gen.mjs +0 -10
  274. package/dist/generated/stories/client.gen.mjs.map +0 -1
  275. package/dist/generated/stories/sdk.gen.cjs +0 -138
  276. package/dist/generated/stories/sdk.gen.cjs.map +0 -1
  277. package/dist/generated/stories/sdk.gen.mjs +0 -131
  278. package/dist/generated/stories/sdk.gen.mjs.map +0 -1
  279. package/dist/generated/stories/types.gen.d.cts +0 -1314
  280. package/dist/generated/stories/types.gen.d.mts +0 -1314
  281. package/dist/generated/users/client.gen.cjs +0 -10
  282. package/dist/generated/users/client.gen.cjs.map +0 -1
  283. package/dist/generated/users/client.gen.mjs +0 -10
  284. package/dist/generated/users/client.gen.mjs.map +0 -1
  285. package/dist/generated/users/sdk.gen.cjs +0 -44
  286. package/dist/generated/users/sdk.gen.cjs.map +0 -1
  287. package/dist/generated/users/sdk.gen.mjs +0 -43
  288. package/dist/generated/users/sdk.gen.mjs.map +0 -1
  289. package/dist/generated/users/types.gen.d.cts +0 -249
  290. package/dist/generated/users/types.gen.d.mts +0 -249
  291. /package/dist/generated/{shared → mapi}/client/client.gen.d.mts +0 -0
  292. /package/dist/generated/{shared → mapi}/client/index.cjs +0 -0
  293. /package/dist/generated/{shared → mapi}/client/index.d.mts +0 -0
  294. /package/dist/generated/{shared → mapi}/client/index.mjs +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"stories.mjs","names":["storiesApi.list","storiesApi.get","storiesApi.create","storiesApi.update","storiesApi.delete_","storiesApi.duplicate","storiesApi.publish","storiesApi.versions"],"sources":["../../src/resources/stories.ts"],"sourcesContent":["import * as storiesApi from '../generated/stories/sdk.gen';\nimport type {\n CreateData,\n CreateResponses,\n DeleteResponses,\n DuplicateData,\n DuplicateResponses,\n GetData,\n GetResponses,\n ListData,\n ListResponses,\n PublishData,\n PublishResponses,\n StoryCreateRequest,\n StoryMapi,\n StoryUpdateRequest,\n UpdateData,\n UpdateResponses,\n VersionsData,\n VersionsResponses,\n} from '../generated/stories/types.gen';\nimport type { ApiResponse, FetchOptions, MapiResourceDeps } from '../client';\nimport { resolveSpaceId, type SpaceIdPathOverride } from './shared';\nimport type { Block as Component, MapiStory, StoryCreate as MapiStoryCreate, StoryUpdate as MapiStoryUpdate } from '@storyblok/schema';\n\nexport type StoryListQuery = NonNullable<ListData['query']>;\n\n/**\n * Resolves to a component-narrowed story type when `TComponents` is a specific\n * Component union, or falls back to the generated `StoryMapi` when no components\n * are provided (i.e. `TComponents` is the default base `Component` type).\n *\n * Delegates to `MapiStory<TComponents>` single-generic mode which internally\n * handles the `RootComponents` filtering and discriminated union construction.\n */\ntype StoryResult<TComponents extends Component> =\n Component extends TComponents\n ? StoryMapi // fallback: no components provided\n : MapiStory<TComponents>;\n\ntype GetResponse<TComponents extends Component> =\n Omit<GetResponses[200], 'story'> & { story?: StoryResult<TComponents> };\n\ntype ListResponse<TComponents extends Component> =\n Omit<ListResponses[200], 'stories'> & { stories?: Array<StoryResult<TComponents>> };\n\ntype CreateResponse<TComponents extends Component> =\n Omit<CreateResponses[201], 'story'> & { story?: StoryResult<TComponents> };\n\ntype UpdateResponse<TComponents extends Component> =\n Omit<UpdateResponses[200], 'story'> & { story?: StoryResult<TComponents> };\n\ntype DuplicateResponse<TComponents extends Component> =\n Omit<DuplicateResponses[200], 'story'> & { story?: StoryResult<TComponents> };\n\ntype PublishResponse<TComponents extends Component> =\n Omit<PublishResponses[200], 'story'> & { story?: StoryResult<TComponents> };\n\n/**\n * Component-narrowed body for story creation. When `TComponents` is provided,\n * `body.story.content` is typed to the narrowed union of root component content types.\n * Falls back to the generated `StoryCreateRequest` when no components are provided.\n */\ntype CreateBody<TComponents extends Component> =\n Component extends TComponents\n ? CreateData['body']\n : Omit<StoryCreateRequest, 'story'> & {\n story: MapiStoryCreate<TComponents>;\n };\n\n/**\n * Component-narrowed body for story updates. When `TComponents` is provided,\n * `body.story.content` is typed to the narrowed union of root component content types.\n * Falls back to the generated `StoryUpdateRequest` when no components are provided.\n */\ntype UpdateBody<TComponents extends Component> =\n Component extends TComponents\n ? UpdateData['body']\n : Omit<StoryUpdateRequest, 'story'> & {\n story: MapiStoryUpdate<TComponents>;\n };\n\nexport function createStoriesResource<\n TComponents extends Component = Component,\n DefaultThrowOnError extends boolean = false,\n>(deps: MapiResourceDeps<DefaultThrowOnError>) {\n const { client, spaceId, wrapRequest } = deps;\n const getSpaceId = (path?: SpaceIdPathOverride['path']) => resolveSpaceId(spaceId, path);\n\n return {\n list<ThrowOnError extends boolean = DefaultThrowOnError>(options: { query?: ListData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<ListResponse<TComponents>, ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<ListResponse<TComponents>, ThrowOnError>(() =>\n storiesApi.list({ client, path: { space_id: resolvedSpaceId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n get<ThrowOnError extends boolean = DefaultThrowOnError>(storyId: number | string, options: { query?: GetData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<GetResponse<TComponents>, ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<GetResponse<TComponents>, ThrowOnError>(() =>\n storiesApi.get({ client, path: { space_id: resolvedSpaceId, story_id: storyId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n create<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: CreateBody<TComponents>; query?: CreateData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<CreateResponse<TComponents>, ThrowOnError>> {\n const { body, query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<CreateResponse<TComponents>, ThrowOnError>(() =>\n storiesApi.create({ client, path: { space_id: resolvedSpaceId }, body: body as CreateData['body'], query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n update<ThrowOnError extends boolean = DefaultThrowOnError>(\n storyId: number | string,\n options: { body: UpdateBody<TComponents>; query?: UpdateData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride,\n ): Promise<ApiResponse<UpdateResponse<TComponents>, ThrowOnError>> {\n const { body, query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<UpdateResponse<TComponents>, ThrowOnError>(() =>\n storiesApi.update({ client, path: { space_id: resolvedSpaceId, story_id: storyId }, body: body as UpdateData['body'], query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n delete<ThrowOnError extends boolean = DefaultThrowOnError>(storyId: number | string, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<DeleteResponses[200], ThrowOnError>> {\n const { signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<DeleteResponses[200], ThrowOnError>(() =>\n storiesApi.delete_({ client, path: { space_id: resolvedSpaceId, story_id: storyId }, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n duplicate<ThrowOnError extends boolean = DefaultThrowOnError>(\n storyId: number | string,\n options: { body: DuplicateData['body']; query?: DuplicateData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride,\n ): Promise<ApiResponse<DuplicateResponse<TComponents>, ThrowOnError>> {\n const { body, query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<DuplicateResponse<TComponents>, ThrowOnError>(() =>\n storiesApi.duplicate({ client, path: { space_id: resolvedSpaceId, story_id: storyId }, body, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n publish<ThrowOnError extends boolean = DefaultThrowOnError>(\n storyId: number | string,\n options: { query?: PublishData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {},\n ): Promise<ApiResponse<PublishResponse<TComponents>, ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<PublishResponse<TComponents>, ThrowOnError>(() =>\n storiesApi.publish({ client, path: { space_id: resolvedSpaceId, story_id: storyId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n versions<ThrowOnError extends boolean = DefaultThrowOnError>(\n options: { query?: VersionsData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {},\n ): Promise<ApiResponse<VersionsResponses[200], ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<VersionsResponses[200], ThrowOnError>(() =>\n storiesApi.versions({ client, path: { space_id: resolvedSpaceId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stories.mjs","names":["mapi.listStories","mapi.getStoryById","mapi.createStory","mapi.updateStory","mapi.deleteStory","mapi.duplicateStory","mapi.publishStory","mapi.listVersions"],"sources":["../../src/resources/stories.ts"],"sourcesContent":["import * as mapi from '../generated/mapi/sdk.gen';\nimport type {\n CreateStoryData,\n CreateStoryResponses,\n DeleteStoryResponses,\n DuplicateStoryData,\n DuplicateStoryResponses,\n GetStoryByIdData,\n GetStoryByIdResponses,\n ListStoriesData,\n ListStoriesResponses,\n ListVersionsData,\n ListVersionsResponses,\n PublishStoryData,\n PublishStoryResponses,\n UpdateStoryData,\n UpdateStoryRequest,\n UpdateStoryResponses,\n} from '../generated/mapi/types.gen';\nimport type { Block as Component } from '../generated/types/block';\nimport type { MapiStory, StoryCreate, StoryUpdate } from '../generated/types/mapi-story';\nimport type { ApiResponse, FetchOptions, MapiResourceDeps } from '../client';\nimport { resolveSpaceId, type SpaceIdPathOverride } from './shared';\n\nexport type StoryListQuery = NonNullable<ListStoriesData['query']>;\n\n/**\n * Resolves to a component-narrowed story type when `TComponents` is a specific\n * Component union, or falls back to the generated `MapiStory` when no components\n * are provided (i.e. `TComponents` is the default base `Component` type).\n */\ntype StoryResult<TComponents extends Component> =\n Component extends TComponents\n ? MapiStory\n : MapiStory<TComponents>;\n\ntype GetResponse<TComponents extends Component> =\n Omit<GetStoryByIdResponses[200], 'story'> & { story?: StoryResult<TComponents> };\n\ntype ListResponse<TComponents extends Component> =\n Omit<ListStoriesResponses[200], 'stories'> & { stories?: Array<StoryResult<TComponents>> };\n\ntype CreateResponse<TComponents extends Component> =\n Omit<CreateStoryResponses[201], 'story'> & { story?: StoryResult<TComponents> };\n\ntype UpdateResponse<TComponents extends Component> =\n Omit<UpdateStoryResponses[200], 'story'> & { story?: StoryResult<TComponents> };\n\ntype DuplicateResponse<TComponents extends Component> =\n Omit<DuplicateStoryResponses[200], 'story'> & { story?: StoryResult<TComponents> };\n\ntype PublishResponse<TComponents extends Component> =\n Omit<PublishStoryResponses[200], 'story'> & { story?: StoryResult<TComponents> };\n\ntype CreateBody<TComponents extends Component> =\n Component extends TComponents\n ? CreateStoryData['body']\n : Omit<UpdateStoryRequest, 'story'> & {\n story: StoryCreate<TComponents>;\n };\n\ntype UpdateBody<TComponents extends Component> =\n Component extends TComponents\n ? UpdateStoryData['body']\n : Omit<UpdateStoryRequest, 'story'> & {\n story: StoryUpdate<TComponents>;\n };\n\nexport function createStoriesResource<\n TComponents extends Component = Component,\n DefaultThrowOnError extends boolean = false,\n>(deps: MapiResourceDeps<DefaultThrowOnError>) {\n const { client, spaceId, wrapRequest } = deps;\n const getSpaceId = (path?: SpaceIdPathOverride['path']) => resolveSpaceId(spaceId, path);\n\n return {\n list<ThrowOnError extends boolean = DefaultThrowOnError>(options: { query?: ListStoriesData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<ListResponse<TComponents>, ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<ListResponse<TComponents>, ThrowOnError>(() =>\n mapi.listStories({ client, path: { space_id: resolvedSpaceId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n get<ThrowOnError extends boolean = DefaultThrowOnError>(storyId: number, options: { query?: GetStoryByIdData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<GetResponse<TComponents>, ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<GetResponse<TComponents>, ThrowOnError>(() =>\n mapi.getStoryById({ client, path: { space_id: resolvedSpaceId, id: storyId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n create<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: CreateBody<TComponents>; query?: CreateStoryData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<CreateResponse<TComponents>, ThrowOnError>> {\n const { body, query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<CreateResponse<TComponents>, ThrowOnError>(() =>\n mapi.createStory({ client, path: { space_id: resolvedSpaceId }, body: body as CreateStoryData['body'], query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n update<ThrowOnError extends boolean = DefaultThrowOnError>(\n storyId: number,\n options: { body: UpdateBody<TComponents>; query?: UpdateStoryData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride,\n ): Promise<ApiResponse<UpdateResponse<TComponents>, ThrowOnError>> {\n const { body, query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<UpdateResponse<TComponents>, ThrowOnError>(() =>\n mapi.updateStory({ client, path: { space_id: resolvedSpaceId, id: storyId }, body: body as UpdateStoryData['body'], query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n delete<ThrowOnError extends boolean = DefaultThrowOnError>(storyId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<DeleteStoryResponses[200], ThrowOnError>> {\n const { signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<DeleteStoryResponses[200], ThrowOnError>(() =>\n mapi.deleteStory({ client, path: { space_id: resolvedSpaceId, id: storyId }, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n duplicate<ThrowOnError extends boolean = DefaultThrowOnError>(\n storyId: number,\n options: { body: DuplicateStoryData['body']; query?: DuplicateStoryData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride,\n ): Promise<ApiResponse<DuplicateResponse<TComponents>, ThrowOnError>> {\n const { body, query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<DuplicateResponse<TComponents>, ThrowOnError>(() =>\n mapi.duplicateStory({ client, path: { space_id: resolvedSpaceId, id: storyId }, body, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n publish<ThrowOnError extends boolean = DefaultThrowOnError>(\n storyId: number,\n options: { query?: PublishStoryData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {},\n ): Promise<ApiResponse<PublishResponse<TComponents>, ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<PublishResponse<TComponents>, ThrowOnError>(() =>\n mapi.publishStory({ client, path: { space_id: resolvedSpaceId, id: storyId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n versions<ThrowOnError extends boolean = DefaultThrowOnError>(\n storyId: number,\n options: { query?: Omit<ListVersionsData['query'], 'model' | 'model_id'>; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {},\n ): Promise<ApiResponse<ListVersionsResponses[200], ThrowOnError>> {\n const { query, signal, path, throwOnError, fetchOptions } = options;\n const resolvedSpaceId = getSpaceId(path);\n return wrapRequest<ListVersionsResponses[200], ThrowOnError>(() =>\n mapi.listVersions({ client, path: { space_id: resolvedSpaceId }, query: { ...query, model: 'stories', model_id: storyId }, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n };\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- const require_sdk_gen = require('../generated/users/sdk.gen.cjs');
1
+ const require_sdk_gen = require('../generated/mapi/sdk.gen.cjs');
2
2
 
3
3
  //#region src/resources/users.ts
4
4
  function createUsersResource(deps) {
@@ -6,7 +6,7 @@ function createUsersResource(deps) {
6
6
  return {
7
7
  me(options = {}) {
8
8
  const { signal, throwOnError, fetchOptions } = options;
9
- return wrapRequest(() => require_sdk_gen.me({
9
+ return wrapRequest(() => require_sdk_gen.getCurrentUser({
10
10
  client,
11
11
  signal,
12
12
  ...throwOnError === void 0 ? {} : { throwOnError },
@@ -18,7 +18,7 @@ function createUsersResource(deps) {
18
18
  },
19
19
  updateMe(options) {
20
20
  const { body, signal, throwOnError, fetchOptions } = options;
21
- return wrapRequest(() => require_sdk_gen.updateMe({
21
+ return wrapRequest(() => require_sdk_gen.updateCurrentUser({
22
22
  client,
23
23
  body,
24
24
  signal,
@@ -1 +1 @@
1
- {"version":3,"file":"users.cjs","names":[],"sources":["../../src/resources/users.ts"],"sourcesContent":["import * as usersApi from '../generated/users/sdk.gen';\nimport type {\n MeResponses,\n UpdateMeData,\n UpdateMeResponses,\n} from '../generated/users/types.gen';\nimport type { ApiResponse, FetchOptions, MapiResourceDeps } from '../client';\n\nexport function createUsersResource<DefaultThrowOnError extends boolean = false>(deps: Omit<MapiResourceDeps<DefaultThrowOnError>, 'spaceId'>) {\n const { client, wrapRequest } = deps;\n\n return {\n me<ThrowOnError extends boolean = DefaultThrowOnError>(options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {}): Promise<ApiResponse<MeResponses[200], ThrowOnError>> {\n const { signal, throwOnError, fetchOptions } = options;\n return wrapRequest<MeResponses[200], ThrowOnError>(() =>\n usersApi.me({ client, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n updateMe<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: UpdateMeData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions }): Promise<ApiResponse<UpdateMeResponses[200], ThrowOnError>> {\n const { body, signal, throwOnError, fetchOptions } = options;\n return wrapRequest<UpdateMeResponses[200], ThrowOnError>(() =>\n usersApi.updateMe({ client, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n };\n}\n"],"mappings":";;;AAQA,SAAgB,oBAAiE,MAA8D;CAC7I,MAAM,EAAE,QAAQ,gBAAgB;AAEhC,QAAO;EACL,GAAuD,UAA8F,EAAE,EAAwD;GAC7M,MAAM,EAAE,QAAQ,cAAc,iBAAiB;AAC/C,UAAO,qCACO;IAAE;IAAQ;IAAQ,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IAAG,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAAG,CAAC,EAAE,aAAa;;EAEzM,SAA6D,SAAqL;GAChP,MAAM,EAAE,MAAM,QAAQ,cAAc,iBAAiB;AACrD,UAAO,2CACa;IAAE;IAAQ;IAAM;IAAQ,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IAAG,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAAG,CAAC,EAAE,aAAa;;EAEtN"}
1
+ {"version":3,"file":"users.cjs","names":[],"sources":["../../src/resources/users.ts"],"sourcesContent":["import * as mapi from '../generated/mapi/sdk.gen';\nimport type {\n GetCurrentUserResponses,\n UpdateCurrentUserData,\n UpdateCurrentUserResponses,\n} from '../generated/mapi/types.gen';\nimport type { ApiResponse, FetchOptions, MapiResourceDeps } from '../client';\n\nexport function createUsersResource<DefaultThrowOnError extends boolean = false>(deps: Omit<MapiResourceDeps<DefaultThrowOnError>, 'spaceId'>) {\n const { client, wrapRequest } = deps;\n\n return {\n me<ThrowOnError extends boolean = DefaultThrowOnError>(options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {}): Promise<ApiResponse<GetCurrentUserResponses[200], ThrowOnError>> {\n const { signal, throwOnError, fetchOptions } = options;\n return wrapRequest<GetCurrentUserResponses[200], ThrowOnError>(() =>\n mapi.getCurrentUser({ client, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n updateMe<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: UpdateCurrentUserData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions }): Promise<ApiResponse<UpdateCurrentUserResponses[200], ThrowOnError>> {\n const { body, signal, throwOnError, fetchOptions } = options;\n return wrapRequest<UpdateCurrentUserResponses[200], ThrowOnError>(() =>\n mapi.updateCurrentUser({ client, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n };\n}\n"],"mappings":";;;AAQA,SAAgB,oBAAiE,MAA8D;CAC7I,MAAM,EAAE,QAAQ,gBAAgB;AAEhC,QAAO;EACL,GAAuD,UAA8F,EAAE,EAAoE;GACzN,MAAM,EAAE,QAAQ,cAAc,iBAAiB;AAC/C,UAAO,iDACe;IAAE;IAAQ;IAAQ,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IAAG,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAAG,CAAC,EAAE,aAAa;;EAEjN,SAA6D,SAAuM;GAClQ,MAAM,EAAE,MAAM,QAAQ,cAAc,iBAAiB;AACrD,UAAO,oDACkB;IAAE;IAAQ;IAAM;IAAQ,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IAAG,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAAG,CAAC,EAAE,aAAa;;EAE3N"}
@@ -1,4 +1,4 @@
1
- import { me, updateMe } from "../generated/users/sdk.gen.mjs";
1
+ import { getCurrentUser, updateCurrentUser } from "../generated/mapi/sdk.gen.mjs";
2
2
 
3
3
  //#region src/resources/users.ts
4
4
  function createUsersResource(deps) {
@@ -6,7 +6,7 @@ function createUsersResource(deps) {
6
6
  return {
7
7
  me(options = {}) {
8
8
  const { signal, throwOnError, fetchOptions } = options;
9
- return wrapRequest(() => me({
9
+ return wrapRequest(() => getCurrentUser({
10
10
  client,
11
11
  signal,
12
12
  ...throwOnError === void 0 ? {} : { throwOnError },
@@ -18,7 +18,7 @@ function createUsersResource(deps) {
18
18
  },
19
19
  updateMe(options) {
20
20
  const { body, signal, throwOnError, fetchOptions } = options;
21
- return wrapRequest(() => updateMe({
21
+ return wrapRequest(() => updateCurrentUser({
22
22
  client,
23
23
  body,
24
24
  signal,
@@ -1 +1 @@
1
- {"version":3,"file":"users.mjs","names":["usersApi.me","usersApi.updateMe"],"sources":["../../src/resources/users.ts"],"sourcesContent":["import * as usersApi from '../generated/users/sdk.gen';\nimport type {\n MeResponses,\n UpdateMeData,\n UpdateMeResponses,\n} from '../generated/users/types.gen';\nimport type { ApiResponse, FetchOptions, MapiResourceDeps } from '../client';\n\nexport function createUsersResource<DefaultThrowOnError extends boolean = false>(deps: Omit<MapiResourceDeps<DefaultThrowOnError>, 'spaceId'>) {\n const { client, wrapRequest } = deps;\n\n return {\n me<ThrowOnError extends boolean = DefaultThrowOnError>(options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {}): Promise<ApiResponse<MeResponses[200], ThrowOnError>> {\n const { signal, throwOnError, fetchOptions } = options;\n return wrapRequest<MeResponses[200], ThrowOnError>(() =>\n usersApi.me({ client, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n updateMe<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: UpdateMeData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions }): Promise<ApiResponse<UpdateMeResponses[200], ThrowOnError>> {\n const { body, signal, throwOnError, fetchOptions } = options;\n return wrapRequest<UpdateMeResponses[200], ThrowOnError>(() =>\n usersApi.updateMe({ client, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n };\n}\n"],"mappings":";;;AAQA,SAAgB,oBAAiE,MAA8D;CAC7I,MAAM,EAAE,QAAQ,gBAAgB;AAEhC,QAAO;EACL,GAAuD,UAA8F,EAAE,EAAwD;GAC7M,MAAM,EAAE,QAAQ,cAAc,iBAAiB;AAC/C,UAAO,kBACLA,GAAY;IAAE;IAAQ;IAAQ,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IAAG,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAAG,CAAC,EAAE,aAAa;;EAEzM,SAA6D,SAAqL;GAChP,MAAM,EAAE,MAAM,QAAQ,cAAc,iBAAiB;AACrD,UAAO,kBACLC,SAAkB;IAAE;IAAQ;IAAM;IAAQ,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IAAG,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAAG,CAAC,EAAE,aAAa;;EAEtN"}
1
+ {"version":3,"file":"users.mjs","names":["mapi.getCurrentUser","mapi.updateCurrentUser"],"sources":["../../src/resources/users.ts"],"sourcesContent":["import * as mapi from '../generated/mapi/sdk.gen';\nimport type {\n GetCurrentUserResponses,\n UpdateCurrentUserData,\n UpdateCurrentUserResponses,\n} from '../generated/mapi/types.gen';\nimport type { ApiResponse, FetchOptions, MapiResourceDeps } from '../client';\n\nexport function createUsersResource<DefaultThrowOnError extends boolean = false>(deps: Omit<MapiResourceDeps<DefaultThrowOnError>, 'spaceId'>) {\n const { client, wrapRequest } = deps;\n\n return {\n me<ThrowOnError extends boolean = DefaultThrowOnError>(options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {}): Promise<ApiResponse<GetCurrentUserResponses[200], ThrowOnError>> {\n const { signal, throwOnError, fetchOptions } = options;\n return wrapRequest<GetCurrentUserResponses[200], ThrowOnError>(() =>\n mapi.getCurrentUser({ client, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n updateMe<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: UpdateCurrentUserData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions }): Promise<ApiResponse<UpdateCurrentUserResponses[200], ThrowOnError>> {\n const { body, signal, throwOnError, fetchOptions } = options;\n return wrapRequest<UpdateCurrentUserResponses[200], ThrowOnError>(() =>\n mapi.updateCurrentUser({ client, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n },\n };\n}\n"],"mappings":";;;AAQA,SAAgB,oBAAiE,MAA8D;CAC7I,MAAM,EAAE,QAAQ,gBAAgB;AAEhC,QAAO;EACL,GAAuD,UAA8F,EAAE,EAAoE;GACzN,MAAM,EAAE,QAAQ,cAAc,iBAAiB;AAC/C,UAAO,kBACLA,eAAoB;IAAE;IAAQ;IAAQ,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IAAG,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAAG,CAAC,EAAE,aAAa;;EAEjN,SAA6D,SAAuM;GAClQ,MAAM,EAAE,MAAM,QAAQ,cAAc,iBAAiB;AACrD,UAAO,kBACLC,kBAAuB;IAAE;IAAQ;IAAM;IAAQ,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IAAG,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAAG,CAAC,EAAE,aAAa;;EAE3N"}
@@ -0,0 +1,54 @@
1
+ const require_pathSerializer_gen = require('../generated/mapi/core/pathSerializer.gen.cjs');
2
+
3
+ //#region src/utils/query-serializer.ts
4
+ /**
5
+ * Query serializer for the Management API client.
6
+ *
7
+ * Behaves identically to the generated default for primitives, primitive
8
+ * arrays, and dates, but additionally serializes **nested objects** (and arrays
9
+ * of objects) into bracket notation — e.g. `filter_query[component][in]=hero`.
10
+ *
11
+ * The generated default serializer throws on this nesting ("Deeply-nested
12
+ * arrays/objects aren't supported. Provide your own `querySerializer()`"), yet
13
+ * MAPI requires `filter_query` as a nested hash and rejects flat strings. This
14
+ * mirrors the bracket serialization used by `storyblok-js-client`.
15
+ */
16
+ function serialize(name, value, parts) {
17
+ if (value === void 0 || value === null) return;
18
+ if (value instanceof Date) {
19
+ parts.push(`${name}=${value.toISOString()}`);
20
+ return;
21
+ }
22
+ if (Array.isArray(value)) {
23
+ if (value.some((item) => item !== null && typeof item === "object")) {
24
+ for (const item of value) serialize(`${name}[]`, item, parts);
25
+ return;
26
+ }
27
+ const serialized = require_pathSerializer_gen.serializeArrayParam({
28
+ explode: true,
29
+ name,
30
+ style: "form",
31
+ value
32
+ });
33
+ if (serialized) parts.push(serialized);
34
+ return;
35
+ }
36
+ if (typeof value === "object") {
37
+ for (const [key, child] of Object.entries(value)) serialize(`${name}[${key}]`, child, parts);
38
+ return;
39
+ }
40
+ const serialized = require_pathSerializer_gen.serializePrimitiveParam({
41
+ name,
42
+ value
43
+ });
44
+ if (serialized) parts.push(serialized);
45
+ }
46
+ const querySerializer = (query) => {
47
+ const parts = [];
48
+ for (const [name, value] of Object.entries(query)) serialize(name, value, parts);
49
+ return parts.join("&");
50
+ };
51
+
52
+ //#endregion
53
+ exports.querySerializer = querySerializer;
54
+ //# sourceMappingURL=query-serializer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-serializer.cjs","names":["serializeArrayParam","serializePrimitiveParam"],"sources":["../../src/utils/query-serializer.ts"],"sourcesContent":["import type { QuerySerializer } from '../generated/mapi/core/bodySerializer.gen';\nimport { serializeArrayParam, serializePrimitiveParam } from '../generated/mapi/core/pathSerializer.gen';\n\n/**\n * Query serializer for the Management API client.\n *\n * Behaves identically to the generated default for primitives, primitive\n * arrays, and dates, but additionally serializes **nested objects** (and arrays\n * of objects) into bracket notation — e.g. `filter_query[component][in]=hero`.\n *\n * The generated default serializer throws on this nesting (\"Deeply-nested\n * arrays/objects aren't supported. Provide your own `querySerializer()`\"), yet\n * MAPI requires `filter_query` as a nested hash and rejects flat strings. This\n * mirrors the bracket serialization used by `storyblok-js-client`.\n */\nfunction serialize(name: string, value: unknown, parts: string[]): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (value instanceof Date) {\n parts.push(`${name}=${value.toISOString()}`);\n return;\n }\n\n if (Array.isArray(value)) {\n // Arrays containing objects (e.g. `filter_query.__or`) need per-item\n // bracket recursion; the default serializer cannot express them.\n if (value.some(item => item !== null && typeof item === 'object')) {\n for (const item of value) {\n serialize(`${name}[]`, item, parts);\n }\n return;\n }\n // Primitive arrays keep the generated default form (`name=a&name=b`).\n const serialized = serializeArrayParam({ explode: true, name, style: 'form', value });\n if (serialized) {\n parts.push(serialized);\n }\n return;\n }\n\n if (typeof value === 'object') {\n for (const [key, child] of Object.entries(value)) {\n serialize(`${name}[${key}]`, child, parts);\n }\n return;\n }\n\n const serialized = serializePrimitiveParam({ name, value: value as string });\n if (serialized) {\n parts.push(serialized);\n }\n}\n\nexport const querySerializer: QuerySerializer = (query) => {\n const parts: string[] = [];\n for (const [name, value] of Object.entries(query)) {\n serialize(name, value, parts);\n }\n return parts.join('&');\n};\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAS,UAAU,MAAc,OAAgB,OAAuB;AACtE,KAAI,UAAU,UAAa,UAAU,KACnC;AAGF,KAAI,iBAAiB,MAAM;AACzB,QAAM,KAAK,GAAG,KAAK,GAAG,MAAM,aAAa,GAAG;AAC5C;;AAGF,KAAI,MAAM,QAAQ,MAAM,EAAE;AAGxB,MAAI,MAAM,MAAK,SAAQ,SAAS,QAAQ,OAAO,SAAS,SAAS,EAAE;AACjE,QAAK,MAAM,QAAQ,MACjB,WAAU,GAAG,KAAK,KAAK,MAAM,MAAM;AAErC;;EAGF,MAAM,aAAaA,+CAAoB;GAAE,SAAS;GAAM;GAAM,OAAO;GAAQ;GAAO,CAAC;AACrF,MAAI,WACF,OAAM,KAAK,WAAW;AAExB;;AAGF,KAAI,OAAO,UAAU,UAAU;AAC7B,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,WAAU,GAAG,KAAK,GAAG,IAAI,IAAI,OAAO,MAAM;AAE5C;;CAGF,MAAM,aAAaC,mDAAwB;EAAE;EAAa;EAAiB,CAAC;AAC5E,KAAI,WACF,OAAM,KAAK,WAAW;;AAI1B,MAAa,mBAAoC,UAAU;CACzD,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,CAC/C,WAAU,MAAM,OAAO,MAAM;AAE/B,QAAO,MAAM,KAAK,IAAI"}
@@ -0,0 +1,54 @@
1
+ import { serializeArrayParam, serializePrimitiveParam } from "../generated/mapi/core/pathSerializer.gen.mjs";
2
+
3
+ //#region src/utils/query-serializer.ts
4
+ /**
5
+ * Query serializer for the Management API client.
6
+ *
7
+ * Behaves identically to the generated default for primitives, primitive
8
+ * arrays, and dates, but additionally serializes **nested objects** (and arrays
9
+ * of objects) into bracket notation — e.g. `filter_query[component][in]=hero`.
10
+ *
11
+ * The generated default serializer throws on this nesting ("Deeply-nested
12
+ * arrays/objects aren't supported. Provide your own `querySerializer()`"), yet
13
+ * MAPI requires `filter_query` as a nested hash and rejects flat strings. This
14
+ * mirrors the bracket serialization used by `storyblok-js-client`.
15
+ */
16
+ function serialize(name, value, parts) {
17
+ if (value === void 0 || value === null) return;
18
+ if (value instanceof Date) {
19
+ parts.push(`${name}=${value.toISOString()}`);
20
+ return;
21
+ }
22
+ if (Array.isArray(value)) {
23
+ if (value.some((item) => item !== null && typeof item === "object")) {
24
+ for (const item of value) serialize(`${name}[]`, item, parts);
25
+ return;
26
+ }
27
+ const serialized = serializeArrayParam({
28
+ explode: true,
29
+ name,
30
+ style: "form",
31
+ value
32
+ });
33
+ if (serialized) parts.push(serialized);
34
+ return;
35
+ }
36
+ if (typeof value === "object") {
37
+ for (const [key, child] of Object.entries(value)) serialize(`${name}[${key}]`, child, parts);
38
+ return;
39
+ }
40
+ const serialized = serializePrimitiveParam({
41
+ name,
42
+ value
43
+ });
44
+ if (serialized) parts.push(serialized);
45
+ }
46
+ const querySerializer = (query) => {
47
+ const parts = [];
48
+ for (const [name, value] of Object.entries(query)) serialize(name, value, parts);
49
+ return parts.join("&");
50
+ };
51
+
52
+ //#endregion
53
+ export { querySerializer };
54
+ //# sourceMappingURL=query-serializer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-serializer.mjs","names":[],"sources":["../../src/utils/query-serializer.ts"],"sourcesContent":["import type { QuerySerializer } from '../generated/mapi/core/bodySerializer.gen';\nimport { serializeArrayParam, serializePrimitiveParam } from '../generated/mapi/core/pathSerializer.gen';\n\n/**\n * Query serializer for the Management API client.\n *\n * Behaves identically to the generated default for primitives, primitive\n * arrays, and dates, but additionally serializes **nested objects** (and arrays\n * of objects) into bracket notation — e.g. `filter_query[component][in]=hero`.\n *\n * The generated default serializer throws on this nesting (\"Deeply-nested\n * arrays/objects aren't supported. Provide your own `querySerializer()`\"), yet\n * MAPI requires `filter_query` as a nested hash and rejects flat strings. This\n * mirrors the bracket serialization used by `storyblok-js-client`.\n */\nfunction serialize(name: string, value: unknown, parts: string[]): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (value instanceof Date) {\n parts.push(`${name}=${value.toISOString()}`);\n return;\n }\n\n if (Array.isArray(value)) {\n // Arrays containing objects (e.g. `filter_query.__or`) need per-item\n // bracket recursion; the default serializer cannot express them.\n if (value.some(item => item !== null && typeof item === 'object')) {\n for (const item of value) {\n serialize(`${name}[]`, item, parts);\n }\n return;\n }\n // Primitive arrays keep the generated default form (`name=a&name=b`).\n const serialized = serializeArrayParam({ explode: true, name, style: 'form', value });\n if (serialized) {\n parts.push(serialized);\n }\n return;\n }\n\n if (typeof value === 'object') {\n for (const [key, child] of Object.entries(value)) {\n serialize(`${name}[${key}]`, child, parts);\n }\n return;\n }\n\n const serialized = serializePrimitiveParam({ name, value: value as string });\n if (serialized) {\n parts.push(serialized);\n }\n}\n\nexport const querySerializer: QuerySerializer = (query) => {\n const parts: string[] = [];\n for (const [name, value] of Object.entries(query)) {\n serialize(name, value, parts);\n }\n return parts.join('&');\n};\n"],"mappings":";;;;;;;;;;;;;;;AAeA,SAAS,UAAU,MAAc,OAAgB,OAAuB;AACtE,KAAI,UAAU,UAAa,UAAU,KACnC;AAGF,KAAI,iBAAiB,MAAM;AACzB,QAAM,KAAK,GAAG,KAAK,GAAG,MAAM,aAAa,GAAG;AAC5C;;AAGF,KAAI,MAAM,QAAQ,MAAM,EAAE;AAGxB,MAAI,MAAM,MAAK,SAAQ,SAAS,QAAQ,OAAO,SAAS,SAAS,EAAE;AACjE,QAAK,MAAM,QAAQ,MACjB,WAAU,GAAG,KAAK,KAAK,MAAM,MAAM;AAErC;;EAGF,MAAM,aAAa,oBAAoB;GAAE,SAAS;GAAM;GAAM,OAAO;GAAQ;GAAO,CAAC;AACrF,MAAI,WACF,OAAM,KAAK,WAAW;AAExB;;AAGF,KAAI,OAAO,UAAU,UAAU;AAC7B,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,WAAU,GAAG,KAAK,GAAG,IAAI,IAAI,OAAO,MAAM;AAE5C;;CAGF,MAAM,aAAa,wBAAwB;EAAE;EAAa;EAAiB,CAAC;AAC5E,KAAI,WACF,OAAM,KAAK,WAAW;;AAI1B,MAAa,mBAAoC,UAAU;CACzD,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,CAC/C,WAAU,MAAM,OAAO,MAAM;AAE/B,QAAO,MAAM,KAAK,IAAI"}
@@ -1,85 +1,26 @@
1
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
+ let async_sema = require("async-sema");
1
3
 
2
4
  //#region src/utils/rate-limit.ts
3
- const DEFAULT_MAX_CONCURRENT = 6;
5
+ const DEFAULT_REQUESTS_PER_SECOND = 6;
4
6
  const MAX_RATE_LIMIT = 1e3;
5
7
  /**
6
- * Concurrency limiter: allows up to `initialLimit` requests to be in-flight
7
- * at the same time. A slot is freed as soon as the request's promise settles
8
- * (resolves or rejects), so throughput scales with how quickly requests
9
- * complete rather than being artificially capped at N per second.
10
- */
11
- function createThrottle(initialLimit) {
12
- let limit = initialLimit;
13
- let activeCount = 0;
14
- const queue = [];
15
- const tryNext = () => {
16
- while (queue.length > 0 && activeCount < limit) {
17
- activeCount++;
18
- queue.shift()();
19
- }
20
- };
21
- const execute = (fn) => {
22
- return new Promise((resolve, reject) => {
23
- queue.push(() => {
24
- fn().then((value) => {
25
- activeCount--;
26
- tryNext();
27
- resolve(value);
28
- }, (error) => {
29
- activeCount--;
30
- tryNext();
31
- reject(error);
32
- });
33
- });
34
- tryNext();
35
- });
36
- };
37
- const setLimit = (n) => {
38
- limit = n;
39
- tryNext();
40
- };
41
- return {
42
- execute,
43
- setLimit
44
- };
45
- }
46
- /**
47
- * Extracts the quota (`q=`) value from the `X-RateLimit-Policy` response header.
48
- * Returns `undefined` if the header is absent or unparseable.
49
- *
50
- * Example header: `"concurrent-requests";q=30`
51
- */
52
- function parseRateLimitPolicyHeader(response) {
53
- const policy = response.headers.get("x-ratelimit-policy");
54
- if (!policy) return;
55
- const match = policy.match(/q=(\d+)/);
56
- if (!match) return;
57
- return Math.min(Number.parseInt(match[1], 10), MAX_RATE_LIMIT);
58
- }
59
- /**
60
8
  * Creates a `ThrottleManager` from the user-supplied `rateLimit` config.
61
9
  *
62
- * - `false` -> no throttling (passthrough)
63
- * - `number` -> fixed single queue at that concurrency
64
- * - `{ maxConcurrency: n }` -> fixed single queue at n concurrent requests
65
- * - `{}` / `undefined` (default)-> single queue at DEFAULT_MAX_CONCURRENT
10
+ * - `false` -> no throttling (passthrough)
11
+ * - `number` -> N requests per second
12
+ * - `{ requestsPerSecond: n }` -> N requests per second
13
+ * - `{}` / `undefined` (default) -> DEFAULT_REQUESTS_PER_SECOND per second
66
14
  */
67
15
  function createThrottleManager(config) {
68
- if (config === false) return {
69
- execute: (fn) => fn(),
70
- adaptToResponse: () => {}
71
- };
72
- const { maxConcurrency = DEFAULT_MAX_CONCURRENT, adaptToServerHeaders = true } = typeof config === "number" ? { maxConcurrency: config } : config;
73
- const cappedLimit = Math.min(maxConcurrency, MAX_RATE_LIMIT);
74
- const throttle = createThrottle(cappedLimit);
75
- return {
76
- execute: (fn) => throttle.execute(fn),
77
- adaptToResponse: (response) => {
78
- if (!adaptToServerHeaders || response === void 0) return;
79
- const serverLimit = parseRateLimitPolicyHeader(response);
80
- if (serverLimit !== void 0) throttle.setLimit(Math.min(cappedLimit, serverLimit));
81
- }
82
- };
16
+ if (config === false) return { execute: (fn) => fn() };
17
+ const { requestsPerSecond, maxConcurrency } = typeof config === "number" ? { requestsPerSecond: config } : config;
18
+ const rps = requestsPerSecond ?? maxConcurrency ?? DEFAULT_REQUESTS_PER_SECOND;
19
+ const rl = (0, async_sema.RateLimit)(Math.min(rps, MAX_RATE_LIMIT));
20
+ return { execute: async (fn) => {
21
+ await rl();
22
+ return fn();
23
+ } };
83
24
  }
84
25
 
85
26
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.cjs","names":[],"sources":["../../src/utils/rate-limit.ts"],"sourcesContent":["const DEFAULT_MAX_CONCURRENT = 6;\nconst MAX_RATE_LIMIT = 1_000;\n\nexport interface RateLimitConfig {\n /**\n * Maximum number of concurrent in-flight requests.\n * Defaults to 6. Capped at 1000.\n */\n maxConcurrency?: number;\n /**\n * Dynamically adjust the rate limit based on the `X-RateLimit-Policy`\n * response header returned by the Storyblok API.\n * @default true\n */\n adaptToServerHeaders?: boolean;\n}\n\nexport interface ThrottleManager {\n execute: <T>(fn: () => Promise<T>) => Promise<T>;\n adaptToResponse: (response: Response | undefined) => void;\n}\n\ninterface Throttle {\n execute: <T>(fn: () => Promise<T>) => Promise<T>;\n setLimit: (n: number) => void;\n}\n\n/**\n * Concurrency limiter: allows up to `initialLimit` requests to be in-flight\n * at the same time. A slot is freed as soon as the request's promise settles\n * (resolves or rejects), so throughput scales with how quickly requests\n * complete rather than being artificially capped at N per second.\n */\nexport function createThrottle(initialLimit: number): Throttle {\n let limit = initialLimit;\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n const tryNext = () => {\n while (queue.length > 0 && activeCount < limit) {\n activeCount++;\n const run = queue.shift()!;\n run();\n }\n };\n\n const execute = <T>(fn: () => Promise<T>): Promise<T> => {\n return new Promise<T>((resolve, reject) => {\n queue.push(() => {\n fn().then(\n (value) => {\n activeCount--;\n tryNext();\n resolve(value);\n },\n (error) => {\n activeCount--;\n tryNext();\n reject(error);\n },\n );\n });\n tryNext();\n });\n };\n\n const setLimit = (n: number) => {\n limit = n;\n // If the limit increased, unblock any waiting requests.\n tryNext();\n };\n\n return { execute, setLimit };\n}\n\n/**\n * Extracts the quota (`q=`) value from the `X-RateLimit-Policy` response header.\n * Returns `undefined` if the header is absent or unparseable.\n *\n * Example header: `\"concurrent-requests\";q=30`\n */\nexport function parseRateLimitPolicyHeader(response: Response): number | undefined {\n const policy = response.headers.get('x-ratelimit-policy');\n if (!policy) {\n return undefined;\n }\n const match = policy.match(/q=(\\d+)/);\n if (!match) {\n return undefined;\n }\n return Math.min(Number.parseInt(match[1], 10), MAX_RATE_LIMIT);\n}\n\n/**\n * Creates a `ThrottleManager` from the user-supplied `rateLimit` config.\n *\n * - `false` -> no throttling (passthrough)\n * - `number` -> fixed single queue at that concurrency\n * - `{ maxConcurrency: n }` -> fixed single queue at n concurrent requests\n * - `{}` / `undefined` (default)-> single queue at DEFAULT_MAX_CONCURRENT\n */\nexport function createThrottleManager(config: RateLimitConfig | number | false): ThrottleManager {\n // Disabled - every request goes straight through.\n if (config === false) {\n return {\n execute: fn => fn(),\n adaptToResponse: () => {},\n };\n }\n\n const resolvedConfig: RateLimitConfig = typeof config === 'number' ? { maxConcurrency: config } : config;\n const { maxConcurrency = DEFAULT_MAX_CONCURRENT, adaptToServerHeaders = true } = resolvedConfig;\n\n const cappedLimit = Math.min(maxConcurrency, MAX_RATE_LIMIT);\n const throttle = createThrottle(cappedLimit);\n\n return {\n execute: fn => throttle.execute(fn),\n adaptToResponse: (response) => {\n if (!adaptToServerHeaders || response === undefined) {\n return;\n }\n const serverLimit = parseRateLimitPolicyHeader(response);\n if (serverLimit !== undefined) {\n // Never exceed the user-configured ceiling.\n throttle.setLimit(Math.min(cappedLimit, serverLimit));\n }\n },\n };\n}\n"],"mappings":";;AAAA,MAAM,yBAAyB;AAC/B,MAAM,iBAAiB;;;;;;;AAgCvB,SAAgB,eAAe,cAAgC;CAC7D,IAAI,QAAQ;CACZ,IAAI,cAAc;CAClB,MAAM,QAA2B,EAAE;CAEnC,MAAM,gBAAgB;AACpB,SAAO,MAAM,SAAS,KAAK,cAAc,OAAO;AAC9C;AAEA,GADY,MAAM,OAAO,EACpB;;;CAIT,MAAM,WAAc,OAAqC;AACvD,SAAO,IAAI,SAAY,SAAS,WAAW;AACzC,SAAM,WAAW;AACf,QAAI,CAAC,MACF,UAAU;AACT;AACA,cAAS;AACT,aAAQ,MAAM;QAEf,UAAU;AACT;AACA,cAAS;AACT,YAAO,MAAM;MAEhB;KACD;AACF,YAAS;IACT;;CAGJ,MAAM,YAAY,MAAc;AAC9B,UAAQ;AAER,WAAS;;AAGX,QAAO;EAAE;EAAS;EAAU;;;;;;;;AAS9B,SAAgB,2BAA2B,UAAwC;CACjF,MAAM,SAAS,SAAS,QAAQ,IAAI,qBAAqB;AACzD,KAAI,CAAC,OACH;CAEF,MAAM,QAAQ,OAAO,MAAM,UAAU;AACrC,KAAI,CAAC,MACH;AAEF,QAAO,KAAK,IAAI,OAAO,SAAS,MAAM,IAAI,GAAG,EAAE,eAAe;;;;;;;;;;AAWhE,SAAgB,sBAAsB,QAA2D;AAE/F,KAAI,WAAW,MACb,QAAO;EACL,UAAS,OAAM,IAAI;EACnB,uBAAuB;EACxB;CAIH,MAAM,EAAE,iBAAiB,wBAAwB,uBAAuB,SADhC,OAAO,WAAW,WAAW,EAAE,gBAAgB,QAAQ,GAAG;CAGlG,MAAM,cAAc,KAAK,IAAI,gBAAgB,eAAe;CAC5D,MAAM,WAAW,eAAe,YAAY;AAE5C,QAAO;EACL,UAAS,OAAM,SAAS,QAAQ,GAAG;EACnC,kBAAkB,aAAa;AAC7B,OAAI,CAAC,wBAAwB,aAAa,OACxC;GAEF,MAAM,cAAc,2BAA2B,SAAS;AACxD,OAAI,gBAAgB,OAElB,UAAS,SAAS,KAAK,IAAI,aAAa,YAAY,CAAC;;EAG1D"}
1
+ {"version":3,"file":"rate-limit.cjs","names":[],"sources":["../../src/utils/rate-limit.ts"],"sourcesContent":["import { RateLimit } from 'async-sema';\n\nconst DEFAULT_REQUESTS_PER_SECOND = 6;\nconst MAX_RATE_LIMIT = 1_000;\n\nexport interface RateLimitConfig {\n /**\n * Maximum number of MAPI requests to start per second.\n * Defaults to 6. Capped at 1000.\n */\n requestsPerSecond?: number;\n /**\n * @deprecated Use `requestsPerSecond` instead.\n * @todo(next-major): Remove this field.\n */\n maxConcurrency?: number;\n}\n\nexport interface ThrottleManager {\n execute: <T>(fn: () => Promise<T>) => Promise<T>;\n}\n\n/**\n * Creates a `ThrottleManager` from the user-supplied `rateLimit` config.\n *\n * - `false` -> no throttling (passthrough)\n * - `number` -> N requests per second\n * - `{ requestsPerSecond: n }` -> N requests per second\n * - `{}` / `undefined` (default) -> DEFAULT_REQUESTS_PER_SECOND per second\n */\nexport function createThrottleManager(config: RateLimitConfig | number | false): ThrottleManager {\n if (config === false) {\n return { execute: fn => fn() };\n }\n\n const resolvedConfig: RateLimitConfig = typeof config === 'number' ? { requestsPerSecond: config } : config;\n const { requestsPerSecond, maxConcurrency } = resolvedConfig;\n const rps = requestsPerSecond ?? maxConcurrency ?? DEFAULT_REQUESTS_PER_SECOND;\n const rl = RateLimit(Math.min(rps, MAX_RATE_LIMIT));\n\n return {\n execute: async (fn) => {\n await rl();\n return fn();\n },\n };\n}\n"],"mappings":";;;;AAEA,MAAM,8BAA8B;AACpC,MAAM,iBAAiB;;;;;;;;;AA2BvB,SAAgB,sBAAsB,QAA2D;AAC/F,KAAI,WAAW,MACb,QAAO,EAAE,UAAS,OAAM,IAAI,EAAE;CAIhC,MAAM,EAAE,mBAAmB,mBADa,OAAO,WAAW,WAAW,EAAE,mBAAmB,QAAQ,GAAG;CAErG,MAAM,MAAM,qBAAqB,kBAAkB;CACnD,MAAM,+BAAe,KAAK,IAAI,KAAK,eAAe,CAAC;AAEnD,QAAO,EACL,SAAS,OAAO,OAAO;AACrB,QAAM,IAAI;AACV,SAAO,IAAI;IAEd"}
@@ -1,16 +1,15 @@
1
1
  //#region src/utils/rate-limit.d.ts
2
2
  interface RateLimitConfig {
3
3
  /**
4
- * Maximum number of concurrent in-flight requests.
4
+ * Maximum number of MAPI requests to start per second.
5
5
  * Defaults to 6. Capped at 1000.
6
6
  */
7
- maxConcurrency?: number;
7
+ requestsPerSecond?: number;
8
8
  /**
9
- * Dynamically adjust the rate limit based on the `X-RateLimit-Policy`
10
- * response header returned by the Storyblok API.
11
- * @default true
9
+ * @deprecated Use `requestsPerSecond` instead.
10
+ * @todo(next-major): Remove this field.
12
11
  */
13
- adaptToServerHeaders?: boolean;
12
+ maxConcurrency?: number;
14
13
  }
15
14
  //#endregion
16
15
  export { RateLimitConfig };
@@ -1,16 +1,15 @@
1
1
  //#region src/utils/rate-limit.d.ts
2
2
  interface RateLimitConfig {
3
3
  /**
4
- * Maximum number of concurrent in-flight requests.
4
+ * Maximum number of MAPI requests to start per second.
5
5
  * Defaults to 6. Capped at 1000.
6
6
  */
7
- maxConcurrency?: number;
7
+ requestsPerSecond?: number;
8
8
  /**
9
- * Dynamically adjust the rate limit based on the `X-RateLimit-Policy`
10
- * response header returned by the Storyblok API.
11
- * @default true
9
+ * @deprecated Use `requestsPerSecond` instead.
10
+ * @todo(next-major): Remove this field.
12
11
  */
13
- adaptToServerHeaders?: boolean;
12
+ maxConcurrency?: number;
14
13
  }
15
14
  //#endregion
16
15
  export { RateLimitConfig };
@@ -1,84 +1,25 @@
1
+ import { RateLimit } from "async-sema";
2
+
1
3
  //#region src/utils/rate-limit.ts
2
- const DEFAULT_MAX_CONCURRENT = 6;
4
+ const DEFAULT_REQUESTS_PER_SECOND = 6;
3
5
  const MAX_RATE_LIMIT = 1e3;
4
6
  /**
5
- * Concurrency limiter: allows up to `initialLimit` requests to be in-flight
6
- * at the same time. A slot is freed as soon as the request's promise settles
7
- * (resolves or rejects), so throughput scales with how quickly requests
8
- * complete rather than being artificially capped at N per second.
9
- */
10
- function createThrottle(initialLimit) {
11
- let limit = initialLimit;
12
- let activeCount = 0;
13
- const queue = [];
14
- const tryNext = () => {
15
- while (queue.length > 0 && activeCount < limit) {
16
- activeCount++;
17
- queue.shift()();
18
- }
19
- };
20
- const execute = (fn) => {
21
- return new Promise((resolve, reject) => {
22
- queue.push(() => {
23
- fn().then((value) => {
24
- activeCount--;
25
- tryNext();
26
- resolve(value);
27
- }, (error) => {
28
- activeCount--;
29
- tryNext();
30
- reject(error);
31
- });
32
- });
33
- tryNext();
34
- });
35
- };
36
- const setLimit = (n) => {
37
- limit = n;
38
- tryNext();
39
- };
40
- return {
41
- execute,
42
- setLimit
43
- };
44
- }
45
- /**
46
- * Extracts the quota (`q=`) value from the `X-RateLimit-Policy` response header.
47
- * Returns `undefined` if the header is absent or unparseable.
48
- *
49
- * Example header: `"concurrent-requests";q=30`
50
- */
51
- function parseRateLimitPolicyHeader(response) {
52
- const policy = response.headers.get("x-ratelimit-policy");
53
- if (!policy) return;
54
- const match = policy.match(/q=(\d+)/);
55
- if (!match) return;
56
- return Math.min(Number.parseInt(match[1], 10), MAX_RATE_LIMIT);
57
- }
58
- /**
59
7
  * Creates a `ThrottleManager` from the user-supplied `rateLimit` config.
60
8
  *
61
- * - `false` -> no throttling (passthrough)
62
- * - `number` -> fixed single queue at that concurrency
63
- * - `{ maxConcurrency: n }` -> fixed single queue at n concurrent requests
64
- * - `{}` / `undefined` (default)-> single queue at DEFAULT_MAX_CONCURRENT
9
+ * - `false` -> no throttling (passthrough)
10
+ * - `number` -> N requests per second
11
+ * - `{ requestsPerSecond: n }` -> N requests per second
12
+ * - `{}` / `undefined` (default) -> DEFAULT_REQUESTS_PER_SECOND per second
65
13
  */
66
14
  function createThrottleManager(config) {
67
- if (config === false) return {
68
- execute: (fn) => fn(),
69
- adaptToResponse: () => {}
70
- };
71
- const { maxConcurrency = DEFAULT_MAX_CONCURRENT, adaptToServerHeaders = true } = typeof config === "number" ? { maxConcurrency: config } : config;
72
- const cappedLimit = Math.min(maxConcurrency, MAX_RATE_LIMIT);
73
- const throttle = createThrottle(cappedLimit);
74
- return {
75
- execute: (fn) => throttle.execute(fn),
76
- adaptToResponse: (response) => {
77
- if (!adaptToServerHeaders || response === void 0) return;
78
- const serverLimit = parseRateLimitPolicyHeader(response);
79
- if (serverLimit !== void 0) throttle.setLimit(Math.min(cappedLimit, serverLimit));
80
- }
81
- };
15
+ if (config === false) return { execute: (fn) => fn() };
16
+ const { requestsPerSecond, maxConcurrency } = typeof config === "number" ? { requestsPerSecond: config } : config;
17
+ const rps = requestsPerSecond ?? maxConcurrency ?? DEFAULT_REQUESTS_PER_SECOND;
18
+ const rl = RateLimit(Math.min(rps, MAX_RATE_LIMIT));
19
+ return { execute: async (fn) => {
20
+ await rl();
21
+ return fn();
22
+ } };
82
23
  }
83
24
 
84
25
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.mjs","names":[],"sources":["../../src/utils/rate-limit.ts"],"sourcesContent":["const DEFAULT_MAX_CONCURRENT = 6;\nconst MAX_RATE_LIMIT = 1_000;\n\nexport interface RateLimitConfig {\n /**\n * Maximum number of concurrent in-flight requests.\n * Defaults to 6. Capped at 1000.\n */\n maxConcurrency?: number;\n /**\n * Dynamically adjust the rate limit based on the `X-RateLimit-Policy`\n * response header returned by the Storyblok API.\n * @default true\n */\n adaptToServerHeaders?: boolean;\n}\n\nexport interface ThrottleManager {\n execute: <T>(fn: () => Promise<T>) => Promise<T>;\n adaptToResponse: (response: Response | undefined) => void;\n}\n\ninterface Throttle {\n execute: <T>(fn: () => Promise<T>) => Promise<T>;\n setLimit: (n: number) => void;\n}\n\n/**\n * Concurrency limiter: allows up to `initialLimit` requests to be in-flight\n * at the same time. A slot is freed as soon as the request's promise settles\n * (resolves or rejects), so throughput scales with how quickly requests\n * complete rather than being artificially capped at N per second.\n */\nexport function createThrottle(initialLimit: number): Throttle {\n let limit = initialLimit;\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n const tryNext = () => {\n while (queue.length > 0 && activeCount < limit) {\n activeCount++;\n const run = queue.shift()!;\n run();\n }\n };\n\n const execute = <T>(fn: () => Promise<T>): Promise<T> => {\n return new Promise<T>((resolve, reject) => {\n queue.push(() => {\n fn().then(\n (value) => {\n activeCount--;\n tryNext();\n resolve(value);\n },\n (error) => {\n activeCount--;\n tryNext();\n reject(error);\n },\n );\n });\n tryNext();\n });\n };\n\n const setLimit = (n: number) => {\n limit = n;\n // If the limit increased, unblock any waiting requests.\n tryNext();\n };\n\n return { execute, setLimit };\n}\n\n/**\n * Extracts the quota (`q=`) value from the `X-RateLimit-Policy` response header.\n * Returns `undefined` if the header is absent or unparseable.\n *\n * Example header: `\"concurrent-requests\";q=30`\n */\nexport function parseRateLimitPolicyHeader(response: Response): number | undefined {\n const policy = response.headers.get('x-ratelimit-policy');\n if (!policy) {\n return undefined;\n }\n const match = policy.match(/q=(\\d+)/);\n if (!match) {\n return undefined;\n }\n return Math.min(Number.parseInt(match[1], 10), MAX_RATE_LIMIT);\n}\n\n/**\n * Creates a `ThrottleManager` from the user-supplied `rateLimit` config.\n *\n * - `false` -> no throttling (passthrough)\n * - `number` -> fixed single queue at that concurrency\n * - `{ maxConcurrency: n }` -> fixed single queue at n concurrent requests\n * - `{}` / `undefined` (default)-> single queue at DEFAULT_MAX_CONCURRENT\n */\nexport function createThrottleManager(config: RateLimitConfig | number | false): ThrottleManager {\n // Disabled - every request goes straight through.\n if (config === false) {\n return {\n execute: fn => fn(),\n adaptToResponse: () => {},\n };\n }\n\n const resolvedConfig: RateLimitConfig = typeof config === 'number' ? { maxConcurrency: config } : config;\n const { maxConcurrency = DEFAULT_MAX_CONCURRENT, adaptToServerHeaders = true } = resolvedConfig;\n\n const cappedLimit = Math.min(maxConcurrency, MAX_RATE_LIMIT);\n const throttle = createThrottle(cappedLimit);\n\n return {\n execute: fn => throttle.execute(fn),\n adaptToResponse: (response) => {\n if (!adaptToServerHeaders || response === undefined) {\n return;\n }\n const serverLimit = parseRateLimitPolicyHeader(response);\n if (serverLimit !== undefined) {\n // Never exceed the user-configured ceiling.\n throttle.setLimit(Math.min(cappedLimit, serverLimit));\n }\n },\n };\n}\n"],"mappings":";AAAA,MAAM,yBAAyB;AAC/B,MAAM,iBAAiB;;;;;;;AAgCvB,SAAgB,eAAe,cAAgC;CAC7D,IAAI,QAAQ;CACZ,IAAI,cAAc;CAClB,MAAM,QAA2B,EAAE;CAEnC,MAAM,gBAAgB;AACpB,SAAO,MAAM,SAAS,KAAK,cAAc,OAAO;AAC9C;AAEA,GADY,MAAM,OAAO,EACpB;;;CAIT,MAAM,WAAc,OAAqC;AACvD,SAAO,IAAI,SAAY,SAAS,WAAW;AACzC,SAAM,WAAW;AACf,QAAI,CAAC,MACF,UAAU;AACT;AACA,cAAS;AACT,aAAQ,MAAM;QAEf,UAAU;AACT;AACA,cAAS;AACT,YAAO,MAAM;MAEhB;KACD;AACF,YAAS;IACT;;CAGJ,MAAM,YAAY,MAAc;AAC9B,UAAQ;AAER,WAAS;;AAGX,QAAO;EAAE;EAAS;EAAU;;;;;;;;AAS9B,SAAgB,2BAA2B,UAAwC;CACjF,MAAM,SAAS,SAAS,QAAQ,IAAI,qBAAqB;AACzD,KAAI,CAAC,OACH;CAEF,MAAM,QAAQ,OAAO,MAAM,UAAU;AACrC,KAAI,CAAC,MACH;AAEF,QAAO,KAAK,IAAI,OAAO,SAAS,MAAM,IAAI,GAAG,EAAE,eAAe;;;;;;;;;;AAWhE,SAAgB,sBAAsB,QAA2D;AAE/F,KAAI,WAAW,MACb,QAAO;EACL,UAAS,OAAM,IAAI;EACnB,uBAAuB;EACxB;CAIH,MAAM,EAAE,iBAAiB,wBAAwB,uBAAuB,SADhC,OAAO,WAAW,WAAW,EAAE,gBAAgB,QAAQ,GAAG;CAGlG,MAAM,cAAc,KAAK,IAAI,gBAAgB,eAAe;CAC5D,MAAM,WAAW,eAAe,YAAY;AAE5C,QAAO;EACL,UAAS,OAAM,SAAS,QAAQ,GAAG;EACnC,kBAAkB,aAAa;AAC7B,OAAI,CAAC,wBAAwB,aAAa,OACxC;GAEF,MAAM,cAAc,2BAA2B,SAAS;AACxD,OAAI,gBAAgB,OAElB,UAAS,SAAS,KAAK,IAAI,aAAa,YAAY,CAAC;;EAG1D"}
1
+ {"version":3,"file":"rate-limit.mjs","names":[],"sources":["../../src/utils/rate-limit.ts"],"sourcesContent":["import { RateLimit } from 'async-sema';\n\nconst DEFAULT_REQUESTS_PER_SECOND = 6;\nconst MAX_RATE_LIMIT = 1_000;\n\nexport interface RateLimitConfig {\n /**\n * Maximum number of MAPI requests to start per second.\n * Defaults to 6. Capped at 1000.\n */\n requestsPerSecond?: number;\n /**\n * @deprecated Use `requestsPerSecond` instead.\n * @todo(next-major): Remove this field.\n */\n maxConcurrency?: number;\n}\n\nexport interface ThrottleManager {\n execute: <T>(fn: () => Promise<T>) => Promise<T>;\n}\n\n/**\n * Creates a `ThrottleManager` from the user-supplied `rateLimit` config.\n *\n * - `false` -> no throttling (passthrough)\n * - `number` -> N requests per second\n * - `{ requestsPerSecond: n }` -> N requests per second\n * - `{}` / `undefined` (default) -> DEFAULT_REQUESTS_PER_SECOND per second\n */\nexport function createThrottleManager(config: RateLimitConfig | number | false): ThrottleManager {\n if (config === false) {\n return { execute: fn => fn() };\n }\n\n const resolvedConfig: RateLimitConfig = typeof config === 'number' ? { requestsPerSecond: config } : config;\n const { requestsPerSecond, maxConcurrency } = resolvedConfig;\n const rps = requestsPerSecond ?? maxConcurrency ?? DEFAULT_REQUESTS_PER_SECOND;\n const rl = RateLimit(Math.min(rps, MAX_RATE_LIMIT));\n\n return {\n execute: async (fn) => {\n await rl();\n return fn();\n },\n };\n}\n"],"mappings":";;;AAEA,MAAM,8BAA8B;AACpC,MAAM,iBAAiB;;;;;;;;;AA2BvB,SAAgB,sBAAsB,QAA2D;AAC/F,KAAI,WAAW,MACb,QAAO,EAAE,UAAS,OAAM,IAAI,EAAE;CAIhC,MAAM,EAAE,mBAAmB,mBADa,OAAO,WAAW,WAAW,EAAE,mBAAmB,QAAQ,GAAG;CAErG,MAAM,MAAM,qBAAqB,kBAAkB;CACnD,MAAM,KAAK,UAAU,KAAK,IAAI,KAAK,eAAe,CAAC;AAEnD,QAAO,EACL,SAAS,OAAO,OAAO;AACrB,QAAM,IAAI;AACV,SAAO,IAAI;IAEd"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@storyblok/management-api-client",
3
3
  "type": "module",
4
- "version": "1.0.0-alpha.1",
4
+ "version": "1.0.0-alpha.3",
5
5
  "private": false,
6
6
  "description": "Storyblok Management API Client",
7
7
  "author": "",
@@ -30,38 +30,39 @@
30
30
  "access": "public"
31
31
  },
32
32
  "dependencies": {
33
+ "async-sema": "^3.1.1",
33
34
  "ky": "^1.14.3",
34
- "@storyblok/region-helper": "1.4.0",
35
- "@storyblok/schema": "1.0.0-alpha.0"
35
+ "@storyblok/region-helper": "1.4.1"
36
36
  },
37
37
  "devDependencies": {
38
- "@hey-api/openapi-ts": "^0.92.3",
39
- "@msw/source": "^0.6.1",
40
38
  "@types/node": "^24.1.0",
41
- "dotenv": "^17.3.1",
42
39
  "eslint": "^9.39.2",
43
- "glob": "^13.0.6",
44
40
  "msw": "^2.12.9",
45
41
  "pathe": "^2.0.3",
46
42
  "tsdown": "^0.20.3",
47
43
  "tsx": "^4.20.3",
48
44
  "vitest": "^4.1.3",
49
- "@storyblok/openapi": "2.1.0-alpha.0",
50
- "@storyblok/eslint-config": "0.5.0"
45
+ "@storyblok/eslint-config": "0.5.1",
46
+ "@storyblok/openapi-codegen": "0.0.1"
51
47
  },
52
48
  "nx": {
53
49
  "targets": {
54
50
  "generate": {
55
- "dependsOn": [
56
- "^build"
51
+ "inputs": [
52
+ "{projectRoot}/scripts/generate.ts",
53
+ "{projectRoot}/package.json",
54
+ "openapiCodegen"
57
55
  ],
58
56
  "outputs": [
59
57
  "{projectRoot}/src/generated/**"
58
+ ],
59
+ "cache": true,
60
+ "dependsOn": [
61
+ "@storyblok/openapi-codegen:build"
60
62
  ]
61
63
  },
62
64
  "build": {
63
65
  "dependsOn": [
64
- "generate",
65
66
  "^build"
66
67
  ],
67
68
  "outputs": [
@@ -75,7 +76,6 @@
75
76
  "build": "tsdown",
76
77
  "test": "vitest run",
77
78
  "test:types": "tsc --noEmit --skipLibCheck",
78
- "test:e2e": "vitest run -c vitest.config.e2e.ts",
79
79
  "coverage": "vitest run --coverage",
80
80
  "lint": "eslint .",
81
81
  "lint:fix": "eslint . --fix"