@storyblok/management-api-client 1.0.0-alpha.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 (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 +208 -200
  5. package/dist/client.d.mts +208 -200
  6. package/dist/client.mjs +9 -9
  7. package/dist/client.mjs.map +1 -1
  8. package/dist/generated/mapi/_internal.gen.d.cts +541 -0
  9. package/dist/generated/mapi/_internal.gen.d.mts +541 -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 +1428 -0
  65. package/dist/generated/mapi/types-aliased.gen.d.mts +1428 -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 +30 -0
  73. package/dist/generated/types/block.d.mts +30 -0
  74. package/dist/generated/types/field.d.cts +75 -0
  75. package/dist/generated/types/field.d.mts +75 -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 +9 -4
  79. package/dist/index.d.mts +9 -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 +1 -1
  160. package/playground/integration-tests/test/types/components.test-d.ts +113 -0
  161. package/playground/integration-tests/test/types/resources.test-d.ts +364 -0
  162. package/playground/integration-tests/test/types/stories.test-d.ts +306 -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 +2 -2
  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
@@ -0,0 +1,24 @@
1
+ # @storyblok/mapi-integration-tests
2
+
3
+ Integration tests for [`@storyblok/management-api-client`](../../) paired with [`@storyblok/schema`](../../../schema).
4
+
5
+ This playground exists so the management-api-client package itself stays free of a runtime dependency on `@storyblok/schema`, while still letting us verify that the two packages line up.
6
+
7
+ ## Type tests
8
+
9
+ `test/types/*.test-d.ts` assert that `defineBlock` / `defineX*` payloads from `@storyblok/schema` are assignable to the corresponding MAPI request bodies, and that `.withTypes()` narrows responses correctly. They run in CI:
10
+
11
+ ```bash
12
+ pnpm --filter @storyblok/mapi-integration-tests test
13
+ pnpm --filter @storyblok/mapi-integration-tests test:types
14
+ ```
15
+
16
+ ## End-to-end tests
17
+
18
+ `test/specs/*.spec.e2e.ts` exercise a real round-trip against the Storyblok MAPI using a personal access token. Run manually only:
19
+
20
+ ```bash
21
+ pnpm --filter @storyblok/mapi-integration-tests test:e2e
22
+ ```
23
+
24
+ Requires `.env.qa-engineer-manual` at the repo root with `STORYBLOK_TOKEN` and `STORYBLOK_SPACE_ID`.
@@ -0,0 +1,5 @@
1
+ import { storyblokLintConfig } from '@storyblok/eslint-config';
2
+
3
+ export default storyblokLintConfig({}, {
4
+ ignores: ['**/*.md'],
5
+ });
@@ -0,0 +1,16 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -x "$basedir/node" ]; then
13
+ exec "$basedir/node" "$basedir/../eslint/bin/eslint.js" "$@"
14
+ else
15
+ exec node "$basedir/../eslint/bin/eslint.js" "$@"
16
+ fi
@@ -0,0 +1,16 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -x "$basedir/node" ]; then
13
+ exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
14
+ else
15
+ exec node "$basedir/../typescript/bin/tsc" "$@"
16
+ fi
@@ -0,0 +1,16 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -x "$basedir/node" ]; then
13
+ exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
14
+ else
15
+ exec node "$basedir/../typescript/bin/tsserver" "$@"
16
+ fi
@@ -0,0 +1,16 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -x "$basedir/node" ]; then
13
+ exec "$basedir/node" "$basedir/../vitest/vitest.mjs" "$@"
14
+ else
15
+ exec node "$basedir/../vitest/vitest.mjs" "$@"
16
+ fi
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@storyblok/mapi-integration-tests",
3
+ "type": "module",
4
+ "version": "0.0.0",
5
+ "private": true,
6
+ "description": "Integration tests for @storyblok/management-api-client paired with @storyblok/schema",
7
+ "scripts": {
8
+ "test": "vitest run",
9
+ "test:types": "tsc --noEmit --skipLibCheck",
10
+ "test:e2e": "vitest run -c vitest.config.e2e.ts",
11
+ "lint": "eslint .",
12
+ "lint:fix": "eslint . --fix"
13
+ },
14
+ "devDependencies": {
15
+ "@storyblok/eslint-config": "workspace:*",
16
+ "@storyblok/management-api-client": "workspace:*",
17
+ "@storyblok/schema": "workspace:*",
18
+ "@types/node": "^24.1.0",
19
+ "dotenv": "^17.3.1",
20
+ "eslint": "^9.39.2",
21
+ "typescript": "5.8.3",
22
+ "vitest": "^4.1.3"
23
+ }
24
+ }
@@ -1,7 +1,7 @@
1
- import { config } from 'dotenv';
2
1
  import { resolve } from 'node:path';
2
+ import { config } from 'dotenv';
3
3
 
4
- config({ path: resolve(import.meta.dirname, '../../../.env.qa-engineer-manual') });
4
+ config({ path: resolve(import.meta.dirname, '../../../../../.env.qa-engineer-manual') });
5
5
 
6
6
  if (!process.env.STORYBLOK_TOKEN || !process.env.STORYBLOK_SPACE_ID) {
7
7
  throw new Error(
@@ -9,7 +9,7 @@
9
9
  * 4. Zod schemas generated from the OpenAPI spec accept real API responses.
10
10
  *
11
11
  * Run manually (never in CI):
12
- * pnpm --filter @storyblok/management-api-client test:e2e
12
+ * pnpm --filter @storyblok/mapi-integration-tests test:e2e
13
13
  *
14
14
  * Requires .env.qa-engineer-manual at the repo root with:
15
15
  * STORYBLOK_TOKEN=<personal-access-token>
@@ -0,0 +1,113 @@
1
+ import { defineBlock, defineBlockCreate, defineBlockUpdate, defineField } from '@storyblok/schema';
2
+ import { type Component as ComponentMapi, createManagementApiClient } from '@storyblok/management-api-client';
3
+ import { describe, expectTypeOf, it } from 'vitest';
4
+
5
+ // Nestable block — not a root story type
6
+ const teaserComponent = defineBlock({
7
+ name: 'teaser',
8
+ schema: [
9
+ defineField('text', { type: 'text' }),
10
+ defineField('image', { type: 'asset' }),
11
+ ],
12
+ });
13
+
14
+ // Root content type, not nestable
15
+ const _pageComponent = defineBlock({
16
+ name: 'page',
17
+ is_root: true,
18
+ is_nestable: false,
19
+ schema: [
20
+ defineField('headline', { type: 'text', required: true }),
21
+ defineField('body', { type: 'richtext' }),
22
+ defineField('teasers', { type: 'bloks', component_whitelist: [teaserComponent.name] }),
23
+ ],
24
+ });
25
+
26
+ const CLIENT_CONFIG = { personalAccessToken: 'test-token', spaceId: 12345 };
27
+
28
+ describe('components.create body type compatibility', () => {
29
+ it('should produce a defineBlockCreate result assignable to components.create body', () => {
30
+ const createPayload = defineBlockCreate({
31
+ name: 'article',
32
+ schema: {
33
+ title: { type: 'text', pos: 1 },
34
+ },
35
+ });
36
+
37
+ type CreateBody = Parameters<ReturnType<typeof createManagementApiClient>['components']['create']>[0]['body'];
38
+ type ComponentCreateInput = NonNullable<CreateBody['component']>;
39
+
40
+ expectTypeOf(createPayload).toExtend<ComponentCreateInput>();
41
+ });
42
+
43
+ it('should produce a defineBlockUpdate result assignable to components.update body', () => {
44
+ const updatePayload = defineBlockUpdate({
45
+ display_name: 'Article',
46
+ });
47
+
48
+ type UpdateBody = Parameters<ReturnType<typeof createManagementApiClient>['components']['update']>[1]['body'];
49
+ type ComponentUpdateInput = NonNullable<UpdateBody['component']>;
50
+
51
+ expectTypeOf(updatePayload).toExtend<ComponentUpdateInput>();
52
+ });
53
+ });
54
+
55
+ describe('components.get response shape', () => {
56
+ it('should return a Component from components.get matching the wire shape', async () => {
57
+ const client = createManagementApiClient(CLIENT_CONFIG);
58
+ const result = await client.components.get(123);
59
+
60
+ if (result.data?.component) {
61
+ // components.get() returns the wrapper Component (= Block), matching the wire shape
62
+ expectTypeOf(result.data.component.id).toEqualTypeOf<ComponentMapi['id']>();
63
+ expectTypeOf(result.data.component.name).toEqualTypeOf<ComponentMapi['name']>();
64
+ expectTypeOf(result.data.component).toHaveProperty('schema');
65
+ }
66
+ });
67
+ });
68
+
69
+ describe('components.create body type rejection', () => {
70
+ it('should reject a component create payload with wrong schema field type', () => {
71
+ const createPayload = defineBlockCreate({
72
+ name: 'article',
73
+ schema: {
74
+ // @ts-expect-error: schema value must be a field definition, not a string
75
+ title: 'invalid',
76
+ },
77
+ });
78
+ void createPayload;
79
+ });
80
+ });
81
+
82
+ describe('defineBlock result used in .withTypes() interface', () => {
83
+ interface StoryblokTypes {
84
+ components: typeof _pageComponent | typeof teaserComponent;
85
+ }
86
+
87
+ it('should narrow story content to page or teaser after withTypes', async () => {
88
+ const client = createManagementApiClient(CLIENT_CONFIG).withTypes<StoryblokTypes>();
89
+ const result = await client.stories.get(123);
90
+
91
+ if (result.data?.story) {
92
+ // Only page is a root component (is_root: true); teaser is nestable-only
93
+ expectTypeOf(result.data.story.content.component).toEqualTypeOf<'page'>();
94
+ }
95
+ });
96
+
97
+ it('should narrow bloks field on page to whitelisted teasers', async () => {
98
+ const client = createManagementApiClient(CLIENT_CONFIG).withTypes<StoryblokTypes>();
99
+ const result = await client.stories.get(123);
100
+
101
+ if (result.data?.story) {
102
+ const story = result.data.story;
103
+ if (story.content.component === 'page') {
104
+ if (story.content.teasers) {
105
+ for (const teaser of story.content.teasers) {
106
+ // teasers whitelists only the teaser component
107
+ expectTypeOf(teaser.component).toEqualTypeOf<'teaser'>();
108
+ }
109
+ }
110
+ }
111
+ }
112
+ });
113
+ });
@@ -0,0 +1,364 @@
1
+ import {
2
+ defineAssetFolderCreate,
3
+ defineAssetFolderUpdate,
4
+ defineBlockFolderCreate,
5
+ defineBlockFolderUpdate,
6
+ defineDatasourceCreate,
7
+ defineDatasourceEntryCreate,
8
+ defineDatasourceEntryUpdate,
9
+ defineDatasourceUpdate,
10
+ defineInternalTagCreate,
11
+ defineInternalTagUpdate,
12
+ definePresetCreate,
13
+ definePresetUpdate,
14
+ defineSpaceCreate,
15
+ defineSpaceUpdate,
16
+ defineUserUpdate,
17
+ } from '@storyblok/schema';
18
+ import { createManagementApiClient } from '@storyblok/management-api-client';
19
+ import { describe, expectTypeOf, it } from 'vitest';
20
+
21
+ const CLIENT_CONFIG = { personalAccessToken: 'test-token', spaceId: 12345 };
22
+
23
+ describe('datasources type tests', () => {
24
+ it('should produce a defineDatasourceCreate result assignable to datasources.create body', () => {
25
+ const payload = defineDatasourceCreate({ name: 'Categories', slug: 'categories' });
26
+
27
+ type CreateBody = Parameters<ReturnType<typeof createManagementApiClient>['datasources']['create']>[0]['body'];
28
+ type InnerType = NonNullable<CreateBody['datasource']>;
29
+
30
+ expectTypeOf(payload).toExtend<InnerType>();
31
+ });
32
+
33
+ it('should produce a defineDatasourceUpdate result assignable to datasources.update body', () => {
34
+ const payload = defineDatasourceUpdate({ name: 'Updated Categories' });
35
+
36
+ type UpdateBody = Parameters<ReturnType<typeof createManagementApiClient>['datasources']['update']>[1]['body'];
37
+ type InnerType = NonNullable<UpdateBody['datasource']>;
38
+
39
+ expectTypeOf(payload).toExtend<InnerType>();
40
+ });
41
+
42
+ it('should return datasource in response from create', async () => {
43
+ const client = createManagementApiClient(CLIENT_CONFIG);
44
+ const result = await client.datasources.create({
45
+ body: { datasource: { name: 'Test', slug: 'test' } },
46
+ });
47
+ if (result.data) {
48
+ expectTypeOf(result.data).toHaveProperty('datasource');
49
+ }
50
+ });
51
+
52
+ it('should return datasource in response from get', async () => {
53
+ const client = createManagementApiClient(CLIENT_CONFIG);
54
+ const result = await client.datasources.get(1);
55
+ if (result.data) {
56
+ expectTypeOf(result.data).toHaveProperty('datasource');
57
+ }
58
+ });
59
+
60
+ it('should return datasources array in response from list', async () => {
61
+ const client = createManagementApiClient(CLIENT_CONFIG);
62
+ const result = await client.datasources.list();
63
+ if (result.data) {
64
+ expectTypeOf(result.data).toHaveProperty('datasources');
65
+ }
66
+ });
67
+ });
68
+
69
+ describe('datasource entries type tests', () => {
70
+ it('should produce a defineDatasourceEntryCreate result assignable to datasourceEntries.create body', () => {
71
+ const payload = defineDatasourceEntryCreate({ name: 'red', value: '#ff0000', datasource_id: 42 });
72
+
73
+ type CreateBody = Parameters<ReturnType<typeof createManagementApiClient>['datasourceEntries']['create']>[0]['body'];
74
+ type InnerType = NonNullable<CreateBody['datasource_entry']>;
75
+
76
+ expectTypeOf(payload).toExtend<InnerType>();
77
+ });
78
+
79
+ it('should produce a defineDatasourceEntryUpdate result assignable to datasourceEntries.update body', () => {
80
+ const payload = defineDatasourceEntryUpdate({ value: '#00ff00' });
81
+
82
+ type UpdateBody = Parameters<ReturnType<typeof createManagementApiClient>['datasourceEntries']['update']>[1]['body'];
83
+ type InnerType = NonNullable<UpdateBody['datasource_entry']>;
84
+
85
+ expectTypeOf(payload).toExtend<InnerType>();
86
+ });
87
+
88
+ it('should return datasource_entry in response from create', async () => {
89
+ const client = createManagementApiClient(CLIENT_CONFIG);
90
+ const result = await client.datasourceEntries.create({
91
+ body: { datasource_entry: { name: 'red', value: '#ff0000', datasource_id: 42 } },
92
+ });
93
+ if (result.data) {
94
+ expectTypeOf(result.data).toHaveProperty('datasource_entry');
95
+ }
96
+ });
97
+
98
+ it('should return datasource_entry in response from get', async () => {
99
+ const client = createManagementApiClient(CLIENT_CONFIG);
100
+ const result = await client.datasourceEntries.get(1);
101
+ if (result.data) {
102
+ expectTypeOf(result.data).toHaveProperty('datasource_entry');
103
+ }
104
+ });
105
+
106
+ it('should return datasource_entries array in response from list', async () => {
107
+ const client = createManagementApiClient(CLIENT_CONFIG);
108
+ const result = await client.datasourceEntries.list();
109
+ if (result.data) {
110
+ expectTypeOf(result.data).toHaveProperty('datasource_entries');
111
+ }
112
+ });
113
+ });
114
+
115
+ describe('asset folders type tests', () => {
116
+ it('should produce a defineAssetFolderCreate result assignable to assetFolders.create body', () => {
117
+ const payload = defineAssetFolderCreate({ name: 'Images' });
118
+
119
+ type CreateBody = Parameters<ReturnType<typeof createManagementApiClient>['assetFolders']['create']>[0]['body'];
120
+ type InnerType = NonNullable<CreateBody['asset_folder']>;
121
+
122
+ expectTypeOf(payload).toExtend<InnerType>();
123
+ });
124
+
125
+ it('should produce a defineAssetFolderUpdate result assignable to assetFolders.update body', () => {
126
+ const payload = defineAssetFolderUpdate({ name: 'Updated Images' });
127
+
128
+ type UpdateBody = Parameters<ReturnType<typeof createManagementApiClient>['assetFolders']['update']>[1]['body'];
129
+ type InnerType = NonNullable<UpdateBody['asset_folder']>;
130
+
131
+ expectTypeOf(payload).toExtend<InnerType>();
132
+ });
133
+
134
+ it('should return asset_folder in response from create', async () => {
135
+ const client = createManagementApiClient(CLIENT_CONFIG);
136
+ const result = await client.assetFolders.create({
137
+ body: { asset_folder: { name: 'Photos' } },
138
+ });
139
+ if (result.data) {
140
+ expectTypeOf(result.data).toHaveProperty('asset_folder');
141
+ }
142
+ });
143
+
144
+ it('should return asset_folder in response from get', async () => {
145
+ const client = createManagementApiClient(CLIENT_CONFIG);
146
+ const result = await client.assetFolders.get(1);
147
+ if (result.data) {
148
+ expectTypeOf(result.data).toHaveProperty('asset_folder');
149
+ }
150
+ });
151
+
152
+ it('should return asset_folders array in response from list', async () => {
153
+ const client = createManagementApiClient(CLIENT_CONFIG);
154
+ const result = await client.assetFolders.list();
155
+ if (result.data) {
156
+ expectTypeOf(result.data).toHaveProperty('asset_folders');
157
+ }
158
+ });
159
+ });
160
+
161
+ describe('component folders type tests', () => {
162
+ it('should produce a defineBlockFolderCreate result assignable to componentFolders.create body', () => {
163
+ const payload = defineBlockFolderCreate({ name: 'Layout' });
164
+
165
+ type CreateBody = Parameters<ReturnType<typeof createManagementApiClient>['componentFolders']['create']>[0]['body'];
166
+ type InnerType = NonNullable<CreateBody['component_group']>;
167
+
168
+ expectTypeOf(payload).toExtend<InnerType>();
169
+ });
170
+
171
+ it('should produce a defineBlockFolderUpdate result assignable to componentFolders.update body', () => {
172
+ const payload = defineBlockFolderUpdate({ name: 'Updated Layout' });
173
+
174
+ type UpdateBody = Parameters<ReturnType<typeof createManagementApiClient>['componentFolders']['update']>[1]['body'];
175
+ type InnerType = NonNullable<UpdateBody['component_group']>;
176
+
177
+ expectTypeOf(payload).toExtend<InnerType>();
178
+ });
179
+
180
+ it('should return component_group in response from create', async () => {
181
+ const client = createManagementApiClient(CLIENT_CONFIG);
182
+ const result = await client.componentFolders.create({
183
+ body: { component_group: { name: 'Layout' } },
184
+ });
185
+ if (result.data) {
186
+ expectTypeOf(result.data).toHaveProperty('component_group');
187
+ }
188
+ });
189
+
190
+ it('should return component_group in response from get', async () => {
191
+ const client = createManagementApiClient(CLIENT_CONFIG);
192
+ const result = await client.componentFolders.get(1);
193
+ if (result.data) {
194
+ expectTypeOf(result.data).toHaveProperty('component_group');
195
+ }
196
+ });
197
+
198
+ it('should return component_groups array in response from list', async () => {
199
+ const client = createManagementApiClient(CLIENT_CONFIG);
200
+ const result = await client.componentFolders.list();
201
+ if (result.data) {
202
+ expectTypeOf(result.data).toHaveProperty('component_groups');
203
+ }
204
+ });
205
+ });
206
+
207
+ describe('internal tags type tests', () => {
208
+ it('should produce a defineInternalTagCreate result assignable to internalTags.create body', () => {
209
+ const payload = defineInternalTagCreate({ name: 'hero', object_type: 'asset' });
210
+
211
+ type CreateBody = Parameters<ReturnType<typeof createManagementApiClient>['internalTags']['create']>[0]['body'];
212
+ type InnerType = NonNullable<CreateBody['internal_tag']>;
213
+
214
+ expectTypeOf(payload).toExtend<InnerType>();
215
+ });
216
+
217
+ it('should produce a defineInternalTagUpdate result assignable to internalTags.update body', () => {
218
+ const payload = defineInternalTagUpdate({ name: 'hero-image' });
219
+
220
+ type UpdateBody = Parameters<ReturnType<typeof createManagementApiClient>['internalTags']['update']>[1]['body'];
221
+ type InnerType = NonNullable<UpdateBody['internal_tag']>;
222
+
223
+ expectTypeOf(payload).toExtend<InnerType>();
224
+ });
225
+
226
+ it('should return internal_tag in response from create', async () => {
227
+ const client = createManagementApiClient(CLIENT_CONFIG);
228
+ const result = await client.internalTags.create({
229
+ body: { internal_tag: { name: 'hero' } },
230
+ });
231
+ if (result.data) {
232
+ expectTypeOf(result.data).toHaveProperty('internal_tag');
233
+ }
234
+ });
235
+
236
+ it('should return internal_tags array in response from list', async () => {
237
+ const client = createManagementApiClient(CLIENT_CONFIG);
238
+ const result = await client.internalTags.list();
239
+ if (result.data) {
240
+ expectTypeOf(result.data).toHaveProperty('internal_tags');
241
+ }
242
+ });
243
+ });
244
+
245
+ describe('presets type tests', () => {
246
+ it('should produce a definePresetCreate result assignable to presets.create body', () => {
247
+ const payload = definePresetCreate({ name: 'Hero Dark', component_id: 42 });
248
+
249
+ type CreateBody = Parameters<ReturnType<typeof createManagementApiClient>['presets']['create']>[0]['body'];
250
+ type InnerType = NonNullable<CreateBody['preset']>;
251
+
252
+ expectTypeOf(payload).toExtend<InnerType>();
253
+ });
254
+
255
+ it('should produce a definePresetUpdate result assignable to presets.update body', () => {
256
+ const payload = definePresetUpdate({ name: 'Hero Light' });
257
+
258
+ type UpdateBody = Parameters<ReturnType<typeof createManagementApiClient>['presets']['update']>[1]['body'];
259
+ type InnerType = NonNullable<UpdateBody['preset']>;
260
+
261
+ expectTypeOf(payload).toExtend<InnerType>();
262
+ });
263
+
264
+ it('should return preset in response from create', async () => {
265
+ const client = createManagementApiClient(CLIENT_CONFIG);
266
+ const result = await client.presets.create({
267
+ body: { preset: { name: 'Hero Dark', component_id: 42 } },
268
+ });
269
+ if (result.data) {
270
+ expectTypeOf(result.data).toHaveProperty('preset');
271
+ }
272
+ });
273
+
274
+ it('should return preset in response from get', async () => {
275
+ const client = createManagementApiClient(CLIENT_CONFIG);
276
+ const result = await client.presets.get(1);
277
+ if (result.data) {
278
+ expectTypeOf(result.data).toHaveProperty('preset');
279
+ }
280
+ });
281
+
282
+ it('should return presets array in response from list', async () => {
283
+ const client = createManagementApiClient(CLIENT_CONFIG);
284
+ const result = await client.presets.list();
285
+ if (result.data) {
286
+ expectTypeOf(result.data).toHaveProperty('presets');
287
+ }
288
+ });
289
+ });
290
+
291
+ describe('spaces type tests', () => {
292
+ it('should produce a defineSpaceCreate result assignable to spaces.create body', () => {
293
+ const payload = defineSpaceCreate({ name: 'My New Space' });
294
+
295
+ type CreateBody = Parameters<ReturnType<typeof createManagementApiClient>['spaces']['create']>[0]['body'];
296
+ type InnerType = CreateBody['space'];
297
+
298
+ expectTypeOf(payload).toExtend<InnerType>();
299
+ });
300
+
301
+ it('should produce a defineSpaceUpdate result assignable to spaces.update body', () => {
302
+ const payload = defineSpaceUpdate({ name: 'Updated Space Name' });
303
+
304
+ type UpdateBody = Parameters<ReturnType<typeof createManagementApiClient>['spaces']['update']>[0]['body'];
305
+ type InnerType = UpdateBody['space'];
306
+
307
+ expectTypeOf(payload).toExtend<InnerType>();
308
+ });
309
+
310
+ it('should return space in response from create', async () => {
311
+ const client = createManagementApiClient(CLIENT_CONFIG);
312
+ const result = await client.spaces.create({
313
+ body: { space: { name: 'Test Space' } },
314
+ });
315
+ if (result.data) {
316
+ expectTypeOf(result.data).toHaveProperty('space');
317
+ }
318
+ });
319
+
320
+ it('should return space in response from get', async () => {
321
+ const client = createManagementApiClient(CLIENT_CONFIG);
322
+ const result = await client.spaces.get();
323
+ if (result.data) {
324
+ expectTypeOf(result.data).toHaveProperty('space');
325
+ }
326
+ });
327
+
328
+ it('should return spaces array in response from list', async () => {
329
+ const client = createManagementApiClient(CLIENT_CONFIG);
330
+ const result = await client.spaces.list();
331
+ if (result.data) {
332
+ expectTypeOf(result.data).toHaveProperty('spaces');
333
+ }
334
+ });
335
+ });
336
+
337
+ describe('users type tests', () => {
338
+ it('should produce a defineUserUpdate result assignable to users.updateMe body', () => {
339
+ const payload = defineUserUpdate({ firstname: 'Jane', lastname: 'Doe' });
340
+
341
+ type UpdateBody = Parameters<ReturnType<typeof createManagementApiClient>['users']['updateMe']>[0]['body'];
342
+ type InnerType = UpdateBody['user'];
343
+
344
+ expectTypeOf(payload).toExtend<InnerType>();
345
+ });
346
+
347
+ it('should return user in response from updateMe', async () => {
348
+ const client = createManagementApiClient(CLIENT_CONFIG);
349
+ const result = await client.users.updateMe({
350
+ body: { user: { firstname: 'Jane' } },
351
+ });
352
+ if (result.data) {
353
+ expectTypeOf(result.data).toHaveProperty('user');
354
+ }
355
+ });
356
+
357
+ it('should return user in response from me', async () => {
358
+ const client = createManagementApiClient(CLIENT_CONFIG);
359
+ const result = await client.users.me();
360
+ if (result.data) {
361
+ expectTypeOf(result.data).toHaveProperty('user');
362
+ }
363
+ });
364
+ });