@sanity/cli 6.0.0-alpha.4 → 6.0.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/dist/actions/dev/startStudioDevServer.js +3 -8
  2. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  3. package/dist/actions/dev/types.d.ts +1 -3
  4. package/dist/actions/dev/types.js.map +1 -1
  5. package/dist/actions/documents/validate.d.ts +0 -2
  6. package/dist/actions/documents/validate.js +21 -1
  7. package/dist/actions/documents/validate.js.map +1 -1
  8. package/dist/actions/exec/execScript.js +1 -1
  9. package/dist/actions/exec/execScript.js.map +1 -1
  10. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +1 -1
  11. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +1 -1
  12. package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
  13. package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
  14. package/dist/actions/manifest/extractManifest.js +1 -4
  15. package/dist/actions/manifest/extractManifest.js.map +1 -1
  16. package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
  17. package/dist/actions/schema/deleteSchemaAction.js +12 -17
  18. package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
  19. package/dist/actions/schema/deploySchemas.d.ts +15 -0
  20. package/dist/actions/schema/deploySchemas.js +98 -0
  21. package/dist/actions/schema/deploySchemas.js.map +1 -0
  22. package/dist/actions/schema/listSchemas.d.ts +12 -0
  23. package/dist/actions/schema/listSchemas.js +119 -0
  24. package/dist/actions/schema/listSchemas.js.map +1 -0
  25. package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
  26. package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
  27. package/dist/actions/schema/utils/debug.d.ts +2 -0
  28. package/dist/actions/schema/utils/debug.js +5 -0
  29. package/dist/actions/schema/utils/debug.js.map +1 -0
  30. package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
  31. package/dist/actions/schema/utils/manifestExtractor.js +12 -17
  32. package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
  33. package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
  34. package/dist/actions/schema/utils/manifestReader.js +6 -12
  35. package/dist/actions/schema/utils/manifestReader.js.map +1 -1
  36. package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
  37. package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
  38. package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
  39. package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
  40. package/dist/actions/schema/utils/schemaStoreValidation.js +38 -125
  41. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  42. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
  43. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
  44. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
  45. package/dist/actions/users/getMembersForProject.d.ts +1 -3
  46. package/dist/actions/users/getMembersForProject.js +6 -17
  47. package/dist/actions/users/getMembersForProject.js.map +1 -1
  48. package/dist/actions/users/types.d.ts +0 -11
  49. package/dist/actions/users/types.js.map +1 -1
  50. package/dist/commands/__tests__/debug.test.js +113 -220
  51. package/dist/commands/__tests__/debug.test.js.map +1 -1
  52. package/dist/commands/__tests__/deploy.test.js +325 -293
  53. package/dist/commands/__tests__/deploy.test.js.map +1 -1
  54. package/dist/commands/__tests__/dev.test.js +62 -19
  55. package/dist/commands/__tests__/dev.test.js.map +1 -1
  56. package/dist/commands/__tests__/init/init.authentication.test.js +40 -27
  57. package/dist/commands/__tests__/init/init.authentication.test.js.map +1 -1
  58. package/dist/commands/__tests__/init/init.create-new-project.test.js +84 -85
  59. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +1 -1
  60. package/dist/commands/__tests__/init/init.plan.test.js +103 -44
  61. package/dist/commands/__tests__/init/init.plan.test.js.map +1 -1
  62. package/dist/commands/__tests__/init/init.setup.test.js +85 -29
  63. package/dist/commands/__tests__/init/init.setup.test.js.map +1 -1
  64. package/dist/commands/__tests__/install.test.js +46 -22
  65. package/dist/commands/__tests__/install.test.js.map +1 -1
  66. package/dist/commands/__tests__/logout.test.js +8 -5
  67. package/dist/commands/__tests__/logout.test.js.map +1 -1
  68. package/dist/commands/__tests__/manage.test.js +29 -24
  69. package/dist/commands/__tests__/manage.test.js.map +1 -1
  70. package/dist/commands/__tests__/versions.test.js +22 -14
  71. package/dist/commands/__tests__/versions.test.js.map +1 -1
  72. package/dist/commands/backup/__tests__/disable.test.js +72 -75
  73. package/dist/commands/backup/__tests__/disable.test.js.map +1 -1
  74. package/dist/commands/backup/__tests__/download.test.js +166 -77
  75. package/dist/commands/backup/__tests__/download.test.js.map +1 -1
  76. package/dist/commands/backup/__tests__/enable.test.js +109 -140
  77. package/dist/commands/backup/__tests__/enable.test.js.map +1 -1
  78. package/dist/commands/backup/__tests__/list.test.js +84 -75
  79. package/dist/commands/backup/__tests__/list.test.js.map +1 -1
  80. package/dist/commands/backup/disable.js +5 -11
  81. package/dist/commands/backup/disable.js.map +1 -1
  82. package/dist/commands/backup/enable.js +5 -11
  83. package/dist/commands/backup/enable.js.map +1 -1
  84. package/dist/commands/backup/list.js +7 -8
  85. package/dist/commands/backup/list.js.map +1 -1
  86. package/dist/commands/cors/__tests__/add.test.js +68 -38
  87. package/dist/commands/cors/__tests__/add.test.js.map +1 -1
  88. package/dist/commands/cors/__tests__/delete.test.js +52 -37
  89. package/dist/commands/cors/__tests__/delete.test.js.map +1 -1
  90. package/dist/commands/cors/__tests__/list.test.js +80 -57
  91. package/dist/commands/cors/__tests__/list.test.js.map +1 -1
  92. package/dist/commands/cors/add.js +5 -13
  93. package/dist/commands/cors/add.js.map +1 -1
  94. package/dist/commands/cors/delete.js +7 -15
  95. package/dist/commands/cors/delete.js.map +1 -1
  96. package/dist/commands/cors/list.js +2 -10
  97. package/dist/commands/cors/list.js.map +1 -1
  98. package/dist/commands/dataset/__tests__/copy.test.js +197 -89
  99. package/dist/commands/dataset/__tests__/copy.test.js.map +1 -1
  100. package/dist/commands/dataset/__tests__/create.test.js +147 -117
  101. package/dist/commands/dataset/__tests__/create.test.js.map +1 -1
  102. package/dist/commands/dataset/__tests__/delete.test.js +75 -68
  103. package/dist/commands/dataset/__tests__/delete.test.js.map +1 -1
  104. package/dist/commands/dataset/__tests__/export.test.js +123 -83
  105. package/dist/commands/dataset/__tests__/export.test.js.map +1 -1
  106. package/dist/commands/dataset/__tests__/list.test.js +107 -65
  107. package/dist/commands/dataset/__tests__/list.test.js.map +1 -1
  108. package/dist/commands/dataset/alias/__tests__/create.test.js +114 -74
  109. package/dist/commands/dataset/alias/__tests__/create.test.js.map +1 -1
  110. package/dist/commands/dataset/alias/__tests__/delete.test.js +40 -29
  111. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +1 -1
  112. package/dist/commands/dataset/alias/__tests__/link.test.js +114 -74
  113. package/dist/commands/dataset/alias/__tests__/link.test.js.map +1 -1
  114. package/dist/commands/dataset/alias/__tests__/unlink.test.js +44 -29
  115. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +1 -1
  116. package/dist/commands/dataset/export.js +4 -4
  117. package/dist/commands/dataset/export.js.map +1 -1
  118. package/dist/commands/dataset/visibility/__tests__/get.test.js +48 -67
  119. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +1 -1
  120. package/dist/commands/dataset/visibility/__tests__/set.test.js +76 -123
  121. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +1 -1
  122. package/dist/commands/dev.js +0 -1
  123. package/dist/commands/dev.js.map +1 -1
  124. package/dist/commands/docs/__tests__/search.test.js +8 -7
  125. package/dist/commands/docs/__tests__/search.test.js.map +1 -1
  126. package/dist/commands/documents/__tests__/create.test.js +328 -265
  127. package/dist/commands/documents/__tests__/create.test.js.map +1 -1
  128. package/dist/commands/documents/__tests__/delete.test.js +119 -87
  129. package/dist/commands/documents/__tests__/delete.test.js.map +1 -1
  130. package/dist/commands/documents/__tests__/get.test.js +68 -95
  131. package/dist/commands/documents/__tests__/get.test.js.map +1 -1
  132. package/dist/commands/documents/__tests__/query.test.js +84 -189
  133. package/dist/commands/documents/__tests__/query.test.js.map +1 -1
  134. package/dist/commands/documents/__tests__/validate.test.js +52 -29
  135. package/dist/commands/documents/__tests__/validate.test.js.map +1 -1
  136. package/dist/commands/documents/create.d.ts +1 -0
  137. package/dist/commands/documents/create.js +10 -9
  138. package/dist/commands/documents/create.js.map +1 -1
  139. package/dist/commands/documents/delete.js +2 -3
  140. package/dist/commands/documents/delete.js.map +1 -1
  141. package/dist/commands/documents/get.js +2 -3
  142. package/dist/commands/documents/get.js.map +1 -1
  143. package/dist/commands/documents/query.js +2 -3
  144. package/dist/commands/documents/query.js.map +1 -1
  145. package/dist/commands/documents/validate.js +0 -20
  146. package/dist/commands/documents/validate.js.map +1 -1
  147. package/dist/commands/graphql/__tests__/list.test.js +57 -45
  148. package/dist/commands/graphql/__tests__/list.test.js.map +1 -1
  149. package/dist/commands/graphql/__tests__/undeploy.test.js +85 -59
  150. package/dist/commands/graphql/__tests__/undeploy.test.js.map +1 -1
  151. package/dist/commands/graphql/list.js +2 -2
  152. package/dist/commands/graphql/list.js.map +1 -1
  153. package/dist/commands/graphql/undeploy.js +4 -9
  154. package/dist/commands/graphql/undeploy.js.map +1 -1
  155. package/dist/commands/hook/__tests__/attempt.test.js +48 -33
  156. package/dist/commands/hook/__tests__/attempt.test.js.map +1 -1
  157. package/dist/commands/hook/__tests__/create.test.js +49 -51
  158. package/dist/commands/hook/__tests__/create.test.js.map +1 -1
  159. package/dist/commands/hook/__tests__/delete.test.js +43 -30
  160. package/dist/commands/hook/__tests__/delete.test.js.map +1 -1
  161. package/dist/commands/hook/__tests__/list.test.js +38 -31
  162. package/dist/commands/hook/__tests__/list.test.js.map +1 -1
  163. package/dist/commands/hook/__tests__/logs.test.js +68 -40
  164. package/dist/commands/hook/__tests__/logs.test.js.map +1 -1
  165. package/dist/commands/hook/create.js +2 -6
  166. package/dist/commands/hook/create.js.map +1 -1
  167. package/dist/commands/hook/delete.js +5 -17
  168. package/dist/commands/hook/delete.js.map +1 -1
  169. package/dist/commands/hook/list.js +2 -8
  170. package/dist/commands/hook/list.js.map +1 -1
  171. package/dist/commands/manifest/__tests__/extract.test.js +22 -13
  172. package/dist/commands/manifest/__tests__/extract.test.js.map +1 -1
  173. package/dist/commands/media/__tests__/create-aspect.test.js +41 -28
  174. package/dist/commands/media/__tests__/create-aspect.test.js.map +1 -1
  175. package/dist/commands/media/__tests__/delete-aspect.test.js +44 -35
  176. package/dist/commands/media/__tests__/delete-aspect.test.js.map +1 -1
  177. package/dist/commands/media/__tests__/deploy-aspect.test.js +67 -80
  178. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +1 -1
  179. package/dist/commands/media/__tests__/export.test.js +365 -66
  180. package/dist/commands/media/__tests__/export.test.js.map +1 -1
  181. package/dist/commands/media/__tests__/import.test.js +171 -105
  182. package/dist/commands/media/__tests__/import.test.js.map +1 -1
  183. package/dist/commands/media/export.js +2 -2
  184. package/dist/commands/media/export.js.map +1 -1
  185. package/dist/commands/media/import.js +2 -2
  186. package/dist/commands/media/import.js.map +1 -1
  187. package/dist/commands/projects/__tests__/list.test.js +5 -4
  188. package/dist/commands/projects/__tests__/list.test.js.map +1 -1
  189. package/dist/commands/projects/list.js +2 -6
  190. package/dist/commands/projects/list.js.map +1 -1
  191. package/dist/commands/schema/__tests__/delete.test.js +396 -151
  192. package/dist/commands/schema/__tests__/delete.test.js.map +1 -1
  193. package/dist/commands/schema/__tests__/deploy.test.js +348 -0
  194. package/dist/commands/schema/__tests__/deploy.test.js.map +1 -0
  195. package/dist/commands/schema/__tests__/extract.test.js +19 -11
  196. package/dist/commands/schema/__tests__/extract.test.js.map +1 -1
  197. package/dist/commands/schema/__tests__/list.test.js +399 -0
  198. package/dist/commands/schema/__tests__/list.test.js.map +1 -0
  199. package/dist/commands/schema/__tests__/validate.test.js +27 -10
  200. package/dist/commands/schema/__tests__/validate.test.js.map +1 -1
  201. package/dist/commands/schema/delete.d.ts +1 -1
  202. package/dist/commands/schema/delete.js +20 -23
  203. package/dist/commands/schema/delete.js.map +1 -1
  204. package/dist/commands/schema/deploy.d.ts +16 -0
  205. package/dist/commands/schema/deploy.js +98 -0
  206. package/dist/commands/schema/deploy.js.map +1 -0
  207. package/dist/commands/schema/list.d.ts +15 -0
  208. package/dist/commands/schema/list.js +104 -0
  209. package/dist/commands/schema/list.js.map +1 -0
  210. package/dist/commands/telemetry/__tests__/disable.test.js +7 -5
  211. package/dist/commands/telemetry/__tests__/disable.test.js.map +1 -1
  212. package/dist/commands/telemetry/__tests__/enable.test.js +7 -5
  213. package/dist/commands/telemetry/__tests__/enable.test.js.map +1 -1
  214. package/dist/commands/telemetry/__tests__/status.test.js +7 -5
  215. package/dist/commands/telemetry/__tests__/status.test.js.map +1 -1
  216. package/dist/commands/tokens/__tests__/add.test.js +55 -40
  217. package/dist/commands/tokens/__tests__/add.test.js.map +1 -1
  218. package/dist/commands/tokens/__tests__/delete.test.js +72 -42
  219. package/dist/commands/tokens/__tests__/delete.test.js.map +1 -1
  220. package/dist/commands/tokens/__tests__/list.test.js +87 -60
  221. package/dist/commands/tokens/__tests__/list.test.js.map +1 -1
  222. package/dist/commands/tokens/add.js +3 -5
  223. package/dist/commands/tokens/add.js.map +1 -1
  224. package/dist/commands/users/__tests__/invite.test.js +100 -79
  225. package/dist/commands/users/__tests__/invite.test.js.map +1 -1
  226. package/dist/commands/users/__tests__/list.test.js +186 -180
  227. package/dist/commands/users/__tests__/list.test.js.map +1 -1
  228. package/dist/commands/users/invite.js +6 -17
  229. package/dist/commands/users/invite.js.map +1 -1
  230. package/dist/commands/users/list.js +4 -7
  231. package/dist/commands/users/list.js.map +1 -1
  232. package/dist/config/createCliConfig.d.ts +4 -4
  233. package/dist/services/backup.d.ts +8 -0
  234. package/dist/services/backup.js +19 -0
  235. package/dist/services/backup.js.map +1 -1
  236. package/dist/services/cors.d.ts +23 -0
  237. package/dist/services/cors.js +38 -0
  238. package/dist/services/cors.js.map +1 -0
  239. package/dist/services/graphql.d.ts +7 -0
  240. package/dist/services/graphql.js +11 -0
  241. package/dist/services/graphql.js.map +1 -1
  242. package/dist/services/hooks.d.ts +2 -0
  243. package/dist/services/hooks.js +19 -0
  244. package/dist/services/hooks.js.map +1 -1
  245. package/dist/services/organizations.d.ts +1 -1
  246. package/dist/services/organizations.js +1 -1
  247. package/dist/services/organizations.js.map +1 -1
  248. package/dist/services/projects.d.ts +11 -0
  249. package/dist/services/projects.js +41 -0
  250. package/dist/services/projects.js.map +1 -1
  251. package/dist/services/schemas.d.ts +4 -0
  252. package/dist/services/schemas.js +40 -0
  253. package/dist/services/schemas.js.map +1 -0
  254. package/dist/services/user.d.ts +8 -0
  255. package/dist/services/user.js +15 -2
  256. package/dist/services/user.js.map +1 -1
  257. package/dist/util/__tests__/getCliVersion.test.js +2 -2
  258. package/dist/util/__tests__/getCliVersion.test.js.map +1 -1
  259. package/dist/util/errorMessages.d.ts +1 -0
  260. package/dist/util/errorMessages.js +1 -0
  261. package/dist/util/errorMessages.js.map +1 -1
  262. package/dist/util/getCliVersion.js +1 -1
  263. package/dist/util/getCliVersion.js.map +1 -1
  264. package/dist/util/readPackageJson.d.ts +1 -15
  265. package/dist/util/readPackageJson.js +1 -1
  266. package/dist/util/readPackageJson.js.map +1 -1
  267. package/dist/util/uniqBy.d.ts +1 -0
  268. package/dist/util/uniqBy.js +14 -0
  269. package/dist/util/uniqBy.js.map +1 -0
  270. package/oclif.manifest.json +172 -27
  271. package/package.json +27 -28
  272. package/dist/actions/cors/constants.d.ts +0 -1
  273. package/dist/actions/cors/constants.js +0 -3
  274. package/dist/actions/cors/constants.js.map +0 -1
  275. package/dist/actions/cors/types.d.ts +0 -9
  276. package/dist/actions/cors/types.js +0 -3
  277. package/dist/actions/cors/types.js.map +0 -1
  278. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
  279. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
  280. package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
  281. package/dist/actions/schema/schemaStoreConstants.js +0 -4
  282. package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
  283. package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
  284. package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
  285. package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
  286. package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
  287. package/dist/actions/schema/utils/schemaApiClient.js +0 -17
  288. package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
  289. package/dist/actions/users/apiVersion.d.ts +0 -6
  290. package/dist/actions/users/apiVersion.js +0 -7
  291. package/dist/actions/users/apiVersion.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/media/__tests__/export.test.ts"],"sourcesContent":["import fs from 'node:fs/promises'\n\nimport {runCommand} from '@oclif/test'\nimport {type CliConfig, getCliConfig, getGlobalCliClient} from '@sanity/cli-core'\nimport {input, select} from '@sanity/cli-core/ux'\nimport {testCommand} from '@sanity/cli-test'\nimport {exportDataset} from '@sanity/export'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {MediaExportCommand} from '../export.js'\n\nvi.mock('@sanity/export', () => ({\n exportDataset: vi.fn().mockResolvedValue(undefined),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n input: vi.fn(),\n select: vi.fn(),\n }\n})\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn(),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nvi.mock('../../../../../cli-core/src/services/apiClient.js', () => ({\n getGlobalCliClient: vi.fn(),\n getProjectCliClient: vi.fn(),\n}))\n\nvi.mock('node:fs/promises', () => ({\n default: {\n mkdir: vi.fn().mockResolvedValue(undefined),\n stat: vi.fn(),\n },\n}))\n\nconst mockExportDataset = vi.mocked(exportDataset)\nconst mockInput = vi.mocked(input)\nconst mockSelect = vi.mocked(select)\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockGetGlobalCliClient = vi.mocked(getGlobalCliClient)\nconst mockFs = vi.mocked(fs)\n\nconst TEST_CONFIG = {\n MEDIA_LIBRARY_ID: 'test-media-library',\n PROJECT_ID: 'test-project',\n} as const\n\nconst TEST_OUTPUTS = {\n EXISTING: 'existing.tar.gz',\n STDOUT: '-',\n SUBDIR: 'subdir/output.tar.gz',\n TAR_GZ: 'output.tar.gz',\n} as const\n\nconst ERROR_MESSAGES = {\n ALREADY_EXISTS: 'already exists',\n EXPORT_FAILED: 'Export failed',\n MEDIA_LIBRARY_NOT_FOUND: 'Media library with id',\n NO_MEDIA_LIBRARIES: 'No active media libraries found',\n USE_OVERWRITE: '--overwrite',\n} as const\n\nconst createTestContext = (\n overrides: {\n fileExists?: boolean\n inputValue?: string\n isFile?: boolean\n mediaLibraries?: Array<{id: string; organizationId: string; status: 'active' | 'inactive'}>\n projectId?: string\n selectValue?: string\n } = {},\n) => {\n const defaults = {\n fileExists: false,\n isFile: true,\n mediaLibraries: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n {id: 'another-library', organizationId: 'org-1', status: 'active' as const},\n ],\n projectId: TEST_CONFIG.PROJECT_ID,\n }\n\n const context = {...defaults, ...overrides}\n\n // Setup CLI config\n const apiConfig: CliConfig['api'] = {projectId: context.projectId}\n\n mockGetCliConfig.mockResolvedValue({api: apiConfig})\n\n // Setup client mock\n const mockClient = {\n config: () => ({projectId: context.projectId}),\n request: vi.fn().mockResolvedValue({\n data: context.mediaLibraries,\n }),\n }\n mockGetGlobalCliClient.mockResolvedValue(mockClient as never)\n\n // Setup fs.stat mock\n if (context.fileExists) {\n mockFs.stat.mockResolvedValue({\n isFile: () => context.isFile,\n } as never)\n } else {\n mockFs.stat.mockRejectedValue(new Error('ENOENT'))\n }\n\n // Setup prompt mocks\n if (context.inputValue) {\n mockInput.mockResolvedValue(context.inputValue)\n }\n if (context.selectValue) {\n mockSelect.mockResolvedValue(context.selectValue)\n }\n\n return context\n}\n\ndescribe('#media:export', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('should show help text correctly', async () => {\n const {stdout} = await runCommand(['media export --help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Export an archive of all file and image assets including their aspect data from the target media library. Video assets are excluded from the export.\n\n USAGE\n $ sanity media export [DESTINATION] [--asset-concurrency <value>]\n [--media-library-id <value>] [--no-compress] [--overwrite]\n\n ARGUMENTS\n [DESTINATION] Output destination file path\n\n FLAGS\n --asset-concurrency=<value> [default: 8] Concurrent number of asset downloads\n --media-library-id=<value> The id of the target media library\n --no-compress Skips compressing tarball entries (still\n generates a gzip file)\n --overwrite Overwrite any file with the same name\n\n DESCRIPTION\n Export an archive of all file and image assets including their aspect data\n from the target media library. Video assets are excluded from the export.\n\n EXAMPLES\n Export media library interactively\n\n $ sanity media export\n\n Export media library to output.tar.gz\n\n $ sanity media export output.tar.gz\n\n Export specific media library\n\n $ sanity media export --media-library-id my-library-id\n\n \"\n `)\n })\n\n test('should export with provided destination', async () => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n const {stderr, stdout} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ])\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Exporting from:')\n expect(stdout).toContain(TEST_CONFIG.PROJECT_ID)\n expect(stdout).toContain(TEST_CONFIG.MEDIA_LIBRARY_ID)\n expect(stdout).toContain('Export finished')\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n assetConcurrency: 8,\n compress: true,\n mediaLibraryId: TEST_CONFIG.MEDIA_LIBRARY_ID,\n outputPath: expect.stringContaining(TEST_OUTPUTS.TAR_GZ),\n }),\n )\n })\n\n test('should export with media library ID flag', async () => {\n createTestContext()\n\n const {stderr, stdout} = await testCommand(MediaExportCommand, [\n TEST_OUTPUTS.TAR_GZ,\n '--media-library-id',\n TEST_CONFIG.MEDIA_LIBRARY_ID,\n ])\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Export finished')\n\n expect(mockSelect).not.toHaveBeenCalled()\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n mediaLibraryId: TEST_CONFIG.MEDIA_LIBRARY_ID,\n }),\n )\n })\n\n test('should prompt for media library when not provided', async () => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ])\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library:',\n }),\n )\n })\n\n test('should prompt for destination when not provided', async () => {\n createTestContext({\n inputValue: TEST_OUTPUTS.TAR_GZ,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n await testCommand(MediaExportCommand, [])\n\n expect(mockInput).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Output path:',\n }),\n )\n })\n\n test('should error when file already exists without overwrite flag', async () => {\n createTestContext({\n fileExists: true,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n const {error} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.EXISTING])\n\n expect(error?.message).toContain(ERROR_MESSAGES.ALREADY_EXISTS)\n expect(error?.message).toContain(ERROR_MESSAGES.USE_OVERWRITE)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should overwrite file when overwrite flag is provided', async () => {\n createTestContext({\n fileExists: true,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n const {stderr, stdout} = await testCommand(MediaExportCommand, [\n TEST_OUTPUTS.EXISTING,\n '--overwrite',\n ])\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Export finished')\n })\n\n test('should use directory and append default filename', async () => {\n createTestContext({\n fileExists: true,\n isFile: false,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n await testCommand(MediaExportCommand, ['some-directory'])\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n outputPath: expect.stringContaining(`${TEST_CONFIG.MEDIA_LIBRARY_ID}-export.tar.gz`),\n }),\n )\n })\n\n test('should export to stdout when destination is -', async () => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.STDOUT])\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n outputPath: process.stdout,\n }),\n )\n })\n\n test.each([\n {\n args: [TEST_OUTPUTS.TAR_GZ],\n errorMessage: NO_PROJECT_ID,\n scenario: 'no project ID is found',\n setup: {projectId: ''},\n },\n {\n args: [TEST_OUTPUTS.TAR_GZ],\n errorMessage: ERROR_MESSAGES.NO_MEDIA_LIBRARIES,\n scenario: 'no media libraries found',\n setup: {mediaLibraries: []},\n },\n {\n additionalCheck: (error: Error) => expect(error.message).toContain('non-existent-library'),\n args: [TEST_OUTPUTS.TAR_GZ, '--media-library-id', 'non-existent-library'],\n errorMessage: ERROR_MESSAGES.MEDIA_LIBRARY_NOT_FOUND,\n scenario: 'media library ID not found',\n setup: {},\n },\n ])('should error when $scenario', async ({additionalCheck, args, errorMessage, setup}) => {\n createTestContext(setup)\n\n const {error} = await testCommand(MediaExportCommand, args)\n\n expect(error?.message).toContain(errorMessage)\n expect(error?.oclif?.exit).toBe(1)\n if (additionalCheck) {\n additionalCheck(error as Error)\n }\n })\n\n test.each([\n {\n args: ['--asset-concurrency', '16'],\n description: 'custom asset concurrency',\n expected: {assetConcurrency: 16},\n },\n {\n args: ['--no-compress'],\n description: 'disabled compression',\n expected: {compress: false},\n },\n ])('should pass $description flag correctly', async ({args, expected}) => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ, ...args])\n\n expect(mockExportDataset).toHaveBeenCalledWith(expect.objectContaining(expected))\n })\n\n test('should handle export failure', async () => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n mockExportDataset.mockRejectedValueOnce(new Error('Export operation failed'))\n\n const {error} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ])\n\n expect(error?.message).toContain(ERROR_MESSAGES.EXPORT_FAILED)\n expect(error?.message).toContain('Export operation failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should create subdirectories if they do not exist', async () => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.SUBDIR])\n\n expect(mockFs.mkdir).toHaveBeenCalledWith(\n expect.stringContaining('subdir'),\n expect.objectContaining({recursive: true}),\n )\n })\n\n test('should filter inactive media libraries', async () => {\n createTestContext({\n mediaLibraries: [\n {id: 'active-library', organizationId: 'org-1', status: 'active' as const},\n {id: 'inactive-library', organizationId: 'org-1', status: 'inactive' as const},\n ],\n selectValue: 'active-library',\n })\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ])\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n choices: expect.arrayContaining([expect.objectContaining({value: 'active-library'})]),\n }),\n )\n\n const selectCall = mockSelect.mock.calls[0][0]\n const choices = selectCall.choices.filter((choice: unknown) => typeof choice === 'object')\n expect(choices).not.toContainEqual(expect.objectContaining({value: 'inactive-library'}))\n })\n})\n"],"names":["fs","runCommand","getCliConfig","getGlobalCliClient","input","select","testCommand","exportDataset","afterEach","describe","expect","test","vi","NO_PROJECT_ID","MediaExportCommand","mock","fn","mockResolvedValue","undefined","actual","importActual","findProjectRoot","directory","root","type","getCliToken","getProjectCliClient","default","mkdir","stat","mockExportDataset","mocked","mockInput","mockSelect","mockGetCliConfig","mockGetGlobalCliClient","mockFs","TEST_CONFIG","MEDIA_LIBRARY_ID","PROJECT_ID","TEST_OUTPUTS","EXISTING","STDOUT","SUBDIR","TAR_GZ","ERROR_MESSAGES","ALREADY_EXISTS","EXPORT_FAILED","MEDIA_LIBRARY_NOT_FOUND","NO_MEDIA_LIBRARIES","USE_OVERWRITE","createTestContext","overrides","defaults","fileExists","isFile","mediaLibraries","id","organizationId","status","projectId","context","apiConfig","api","mockClient","config","request","data","mockRejectedValue","Error","inputValue","selectValue","clearAllMocks","stdout","toMatchInlineSnapshot","stderr","toBe","toContain","toHaveBeenCalledWith","objectContaining","assetConcurrency","compress","mediaLibraryId","outputPath","stringContaining","not","toHaveBeenCalled","message","error","oclif","exit","process","each","args","errorMessage","scenario","setup","additionalCheck","description","expected","mockRejectedValueOnce","recursive","choices","arrayContaining","value","selectCall","calls","filter","choice","toContainEqual"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/media/__tests__/export.test.ts"],"sourcesContent":["import fs from 'node:fs/promises'\n\nimport {runCommand} from '@oclif/test'\nimport {type CliConfig} from '@sanity/cli-core'\nimport {input, select} from '@sanity/cli-core/ux'\nimport {createTestToken, mockApi, testCommand} from '@sanity/cli-test'\nimport {exportDataset} from '@sanity/export'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {MEDIA_LIBRARY_API_VERSION} from '../../../services/mediaLibraries.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {MediaExportCommand} from '../export.js'\n\nvi.mock('@sanity/export', () => ({\n exportDataset: vi.fn().mockResolvedValue(undefined),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n input: vi.fn(),\n select: vi.fn(),\n }\n})\n\nvi.mock('node:fs/promises', () => ({\n default: {\n mkdir: vi.fn().mockResolvedValue(undefined),\n stat: vi.fn(),\n },\n}))\n\nconst mockExportDataset = vi.mocked(exportDataset)\nconst mockInput = vi.mocked(input)\nconst mockSelect = vi.mocked(select)\nconst mockFs = vi.mocked(fs)\n\nconst TEST_CONFIG = {\n MEDIA_LIBRARY_ID: 'test-media-library',\n PROJECT_ID: 'test-project',\n} as const\n\nconst TEST_OUTPUTS = {\n EXISTING: 'existing.tar.gz',\n STDOUT: '-',\n SUBDIR: 'subdir/output.tar.gz',\n TAR_GZ: 'output.tar.gz',\n} as const\n\nconst ERROR_MESSAGES = {\n ALREADY_EXISTS: 'already exists',\n EXPORT_FAILED: 'Export failed',\n MEDIA_LIBRARY_NOT_FOUND: 'Media library with id',\n NO_MEDIA_LIBRARIES: 'No active media libraries found',\n USE_OVERWRITE: '--overwrite',\n} as const\n\nconst defaultMocks = {\n cliConfig: {\n api: {projectId: TEST_CONFIG.PROJECT_ID} as CliConfig['api'],\n },\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n root: '/test/path',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\nconst createTestContext = (\n overrides: {\n fileExists?: boolean\n inputValue?: string\n isFile?: boolean\n mediaLibraries?: Array<{id: string; organizationId: string; status: 'active' | 'inactive'}>\n projectId?: string\n selectValue?: string\n } = {},\n) => {\n const defaults = {\n fileExists: false,\n isFile: true,\n mediaLibraries: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n {id: 'another-library', organizationId: 'org-1', status: 'active' as const},\n ],\n projectId: TEST_CONFIG.PROJECT_ID,\n }\n\n const context = {...defaults, ...overrides}\n\n // Setup fs.stat mock\n if (context.fileExists) {\n mockFs.stat.mockResolvedValue({\n isFile: () => context.isFile,\n } as never)\n } else {\n mockFs.stat.mockRejectedValue(new Error('ENOENT'))\n }\n\n // Setup prompt mocks\n if (context.inputValue) {\n mockInput.mockResolvedValue(context.inputValue)\n }\n if (context.selectValue) {\n mockSelect.mockResolvedValue(context.selectValue)\n }\n\n // Return context with mocks for testCommand\n return {\n ...context,\n mocks: {\n ...defaultMocks,\n cliConfig: {\n api: {projectId: context.projectId} as CliConfig['api'],\n },\n },\n }\n}\n\ndescribe('#media:export', () => {\n afterEach(() => {\n vi.clearAllMocks()\n vi.unstubAllEnvs()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('should show help text correctly', async () => {\n const {stdout} = await runCommand(['media export --help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Export an archive of all file and image assets including their aspect data from the target media library. Video assets are excluded from the export.\n\n USAGE\n $ sanity media export [DESTINATION] [--asset-concurrency <value>]\n [--media-library-id <value>] [--no-compress] [--overwrite]\n\n ARGUMENTS\n [DESTINATION] Output destination file path\n\n FLAGS\n --asset-concurrency=<value> [default: 8] Concurrent number of asset downloads\n --media-library-id=<value> The id of the target media library\n --no-compress Skips compressing tarball entries (still\n generates a gzip file)\n --overwrite Overwrite any file with the same name\n\n DESCRIPTION\n Export an archive of all file and image assets including their aspect data\n from the target media library. Video assets are excluded from the export.\n\n EXAMPLES\n Export media library interactively\n\n $ sanity media export\n\n Export media library to output.tar.gz\n\n $ sanity media export output.tar.gz\n\n Export specific media library\n\n $ sanity media export --media-library-id my-library-id\n\n \"\n `)\n })\n\n test('should export with provided destination', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: TEST_CONFIG.MEDIA_LIBRARY_ID, organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n mockSelect.mockResolvedValue(TEST_CONFIG.MEDIA_LIBRARY_ID)\n const ctx = createTestContext()\n\n const {stderr, stdout} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ], {\n mocks: ctx.mocks,\n })\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Exporting from:')\n expect(stdout).toContain(TEST_CONFIG.PROJECT_ID)\n expect(stdout).toContain(TEST_CONFIG.MEDIA_LIBRARY_ID)\n expect(stdout).toContain('Export finished')\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n assetConcurrency: 8,\n compress: true,\n mediaLibraryId: TEST_CONFIG.MEDIA_LIBRARY_ID,\n outputPath: expect.stringContaining(TEST_OUTPUTS.TAR_GZ),\n }),\n )\n })\n\n test('should export with media library ID flag', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext()\n\n const {stderr, stdout} = await testCommand(\n MediaExportCommand,\n [TEST_OUTPUTS.TAR_GZ, '--media-library-id', TEST_CONFIG.MEDIA_LIBRARY_ID],\n {mocks: ctx.mocks},\n )\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Export finished')\n\n expect(mockSelect).not.toHaveBeenCalled()\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n mediaLibraryId: TEST_CONFIG.MEDIA_LIBRARY_ID,\n }),\n )\n })\n\n test('should prompt for media library when not provided', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ], {mocks: ctx.mocks})\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library:',\n }),\n )\n })\n\n test('should prompt for destination when not provided', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({\n inputValue: TEST_OUTPUTS.TAR_GZ,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n await testCommand(MediaExportCommand, [], {mocks: ctx.mocks})\n\n expect(mockInput).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Output path:',\n }),\n )\n })\n\n test('should error when file already exists without overwrite flag', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({\n fileExists: true,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n const {error} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.EXISTING], {\n mocks: ctx.mocks,\n })\n\n expect(error?.message).toContain(ERROR_MESSAGES.ALREADY_EXISTS)\n expect(error?.message).toContain(ERROR_MESSAGES.USE_OVERWRITE)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should overwrite file when overwrite flag is provided', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({\n fileExists: true,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n const {stderr, stdout} = await testCommand(\n MediaExportCommand,\n [TEST_OUTPUTS.EXISTING, '--overwrite'],\n {mocks: ctx.mocks},\n )\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Export finished')\n })\n\n test('should use directory and append default filename', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({\n fileExists: true,\n isFile: false,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n await testCommand(MediaExportCommand, ['some-directory'], {mocks: ctx.mocks})\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n outputPath: expect.stringContaining(`${TEST_CONFIG.MEDIA_LIBRARY_ID}-export.tar.gz`),\n }),\n )\n })\n\n test('should export to stdout when destination is -', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.STDOUT], {mocks: ctx.mocks})\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n outputPath: process.stdout,\n }),\n )\n })\n\n test.each([\n {\n args: [TEST_OUTPUTS.TAR_GZ],\n errorMessage: NO_PROJECT_ID,\n scenario: 'no project ID is found',\n setup: {projectId: ''},\n },\n {\n args: [TEST_OUTPUTS.TAR_GZ],\n errorMessage: ERROR_MESSAGES.NO_MEDIA_LIBRARIES,\n scenario: 'no media libraries found',\n setup: {mediaLibraries: []},\n },\n {\n additionalCheck: (error: Error) => expect(error.message).toContain('non-existent-library'),\n args: [TEST_OUTPUTS.TAR_GZ, '--media-library-id', 'non-existent-library'],\n errorMessage: ERROR_MESSAGES.MEDIA_LIBRARY_NOT_FOUND,\n scenario: 'media library ID not found',\n setup: {},\n },\n ])('should error when $scenario', async ({additionalCheck, args, errorMessage, setup}) => {\n const ctx = createTestContext(setup)\n\n // Set up mock for API calls (skip if no projectId)\n if (ctx.projectId) {\n createTestToken('test-token')\n const data = ctx.mediaLibraries.filter((lib) => lib.status === 'active')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: ctx.projectId},\n uri: '/media-libraries',\n }).reply(200, {data})\n }\n\n const {error} = await testCommand(MediaExportCommand, args, {mocks: ctx.mocks})\n\n expect(error?.message).toContain(errorMessage)\n expect(error?.oclif?.exit).toBe(1)\n if (additionalCheck) {\n additionalCheck(error as Error)\n }\n })\n\n test.each([\n {\n args: ['--asset-concurrency', '16'],\n description: 'custom asset concurrency',\n expected: {assetConcurrency: 16},\n },\n {\n args: ['--no-compress'],\n description: 'disabled compression',\n expected: {compress: false},\n },\n ])('should pass $description flag correctly', async ({args, expected}) => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ, ...args], {mocks: ctx.mocks})\n\n expect(mockExportDataset).toHaveBeenCalledWith(expect.objectContaining(expected))\n })\n\n test('should handle export failure', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n mockExportDataset.mockRejectedValueOnce(new Error('Export operation failed'))\n\n const {error} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ], {\n mocks: ctx.mocks,\n })\n\n expect(error?.message).toContain(ERROR_MESSAGES.EXPORT_FAILED)\n expect(error?.message).toContain('Export operation failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should create subdirectories if they do not exist', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.SUBDIR], {mocks: ctx.mocks})\n\n expect(mockFs.mkdir).toHaveBeenCalledWith(\n expect.stringContaining('subdir'),\n expect.objectContaining({recursive: true}),\n )\n })\n\n test('should filter inactive media libraries', async () => {\n // Set up custom mock for this test with both active and inactive libraries\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'active-library', organizationId: 'org-1', status: 'active'},\n {id: 'inactive-library', organizationId: 'org-1', status: 'inactive'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({\n mediaLibraries: [\n {id: 'active-library', organizationId: 'org-1', status: 'active' as const},\n {id: 'inactive-library', organizationId: 'org-1', status: 'inactive' as const},\n ],\n selectValue: 'active-library',\n })\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ], {mocks: ctx.mocks})\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n choices: expect.arrayContaining([expect.objectContaining({value: 'active-library'})]),\n }),\n )\n\n const selectCall = mockSelect.mock.calls[0][0]\n const choices = selectCall.choices.filter((choice: unknown) => typeof choice === 'object')\n expect(choices).not.toContainEqual(expect.objectContaining({value: 'inactive-library'}))\n })\n})\n"],"names":["fs","runCommand","input","select","createTestToken","mockApi","testCommand","exportDataset","nock","afterEach","describe","expect","test","vi","MEDIA_LIBRARY_API_VERSION","NO_PROJECT_ID","MediaExportCommand","mock","fn","mockResolvedValue","undefined","actual","importActual","default","mkdir","stat","mockExportDataset","mocked","mockInput","mockSelect","mockFs","TEST_CONFIG","MEDIA_LIBRARY_ID","PROJECT_ID","TEST_OUTPUTS","EXISTING","STDOUT","SUBDIR","TAR_GZ","ERROR_MESSAGES","ALREADY_EXISTS","EXPORT_FAILED","MEDIA_LIBRARY_NOT_FOUND","NO_MEDIA_LIBRARIES","USE_OVERWRITE","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","root","type","token","createTestContext","overrides","defaults","fileExists","isFile","mediaLibraries","id","organizationId","status","context","mockRejectedValue","Error","inputValue","selectValue","mocks","clearAllMocks","unstubAllEnvs","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","apiVersion","method","query","uri","reply","data","ctx","stderr","toBe","toContain","toHaveBeenCalledWith","objectContaining","assetConcurrency","compress","mediaLibraryId","outputPath","stringContaining","not","toHaveBeenCalled","message","error","oclif","exit","process","each","args","errorMessage","scenario","setup","additionalCheck","filter","lib","description","expected","mockRejectedValueOnce","recursive","choices","arrayContaining","value","selectCall","calls","choice","toContainEqual"],"mappings":"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"}
@@ -1,19 +1,15 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { testCommand } from '@sanity/cli-test';
2
+ import { mockApi, testCommand } from '@sanity/cli-test';
3
+ import nock from 'nock';
3
4
  import { of, throwError } from 'rxjs';
4
5
  import { afterEach, describe, expect, test, vi } from 'vitest';
6
+ import { MEDIA_LIBRARY_API_VERSION } from '../../../services/mediaLibraries.js';
5
7
  import { MediaImportCommand } from '../import.js';
6
8
  const mocks = vi.hoisted(()=>({
7
- getCliConfig: vi.fn(),
8
- getMediaLibraries: vi.fn(),
9
- getProjectCliClient: vi.fn(),
10
9
  importer: vi.fn(),
11
10
  select: vi.fn(),
12
11
  spinner: vi.fn()
13
12
  }));
14
- vi.mock('../../../services/mediaLibraries.js', ()=>({
15
- getMediaLibraries: mocks.getMediaLibraries
16
- }));
17
13
  vi.mock('@sanity/cli-core/ux', async ()=>{
18
14
  const actual = await vi.importActual('@sanity/cli-core/ux');
19
15
  return {
@@ -22,38 +18,31 @@ vi.mock('@sanity/cli-core/ux', async ()=>{
22
18
  spinner: mocks.spinner
23
19
  };
24
20
  });
25
- vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
26
- findProjectRoot: vi.fn().mockResolvedValue({
27
- directory: '/test/path',
28
- root: '/test/path',
29
- type: 'studio'
30
- })
31
- }));
32
- vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
33
- getCliConfig: mocks.getCliConfig
34
- }));
35
- vi.mock('../../../../../cli-core/src/services/apiClient.js', ()=>({
36
- getProjectCliClient: mocks.getProjectCliClient
37
- }));
38
21
  vi.mock('../../../actions/media/importMedia.js', ()=>({
39
22
  importer: mocks.importer
40
23
  }));
41
- const mockGetMediaLibraries = mocks.getMediaLibraries;
42
- const mockGetCliConfig = mocks.getCliConfig;
43
- const mockGetProjectCliClient = mocks.getProjectCliClient;
44
24
  const mockSelect = mocks.select;
45
25
  const mockSpinner = mocks.spinner;
46
- // Setup CLI config
47
- const apiConfig = {
48
- projectId: '1234'
26
+ const defaultMocks = {
27
+ cliConfig: {
28
+ api: {
29
+ projectId: '1234'
30
+ }
31
+ },
32
+ projectRoot: {
33
+ directory: '/test/path',
34
+ path: '/test/path/sanity.config.ts',
35
+ root: '/test/path',
36
+ type: 'studio'
37
+ },
38
+ token: 'test-token'
49
39
  };
50
- mockGetCliConfig.mockResolvedValue({
51
- api: apiConfig
52
- });
53
- mockGetProjectCliClient.mockResolvedValue({});
54
40
  describe('#media:import', ()=>{
55
41
  afterEach(()=>{
56
42
  vi.clearAllMocks();
43
+ const pending = nock.pendingMocks();
44
+ nock.cleanAll();
45
+ expect(pending, 'pending mocks').toEqual([]);
57
46
  });
58
47
  test('should show help text correctly', async ()=>{
59
48
  const { stdout } = await runCommand([
@@ -96,97 +85,161 @@ describe('#media:import', ()=>{
96
85
  `);
97
86
  });
98
87
  test('show console error when no projectId is found', async ()=>{
99
- mockGetCliConfig.mockResolvedValueOnce({
100
- api: {}
101
- });
102
88
  const { error } = await testCommand(MediaImportCommand, [
103
89
  'test-source'
104
- ]);
90
+ ], {
91
+ mocks: {
92
+ ...defaultMocks,
93
+ cliConfig: {
94
+ api: {}
95
+ }
96
+ }
97
+ });
105
98
  expect(error?.message).toContain('does not contain a project identifier');
106
99
  expect(error?.oclif?.exit).toBe(1);
107
100
  });
108
101
  test('show console error when getMediaLibraries fails', async ()=>{
109
- mockGetMediaLibraries.mockRejectedValue(new Error('API request failed'));
102
+ mockApi({
103
+ apiVersion: MEDIA_LIBRARY_API_VERSION,
104
+ method: 'get',
105
+ query: {
106
+ projectId: '1234'
107
+ },
108
+ uri: '/media-libraries'
109
+ }).reply(500, {
110
+ error: 'API request failed'
111
+ });
110
112
  const { error } = await testCommand(MediaImportCommand, [
111
113
  'test-source'
112
- ]);
114
+ ], {
115
+ mocks: defaultMocks
116
+ });
113
117
  expect(error?.message).toContain('Failed to list media libraries');
114
118
  expect(error?.message).toContain('API request failed');
115
119
  expect(error?.oclif?.exit).toBe(1);
116
120
  });
117
121
  test('show console error when no active media libraries are found', async ()=>{
118
- mockGetMediaLibraries.mockResolvedValue([]);
122
+ mockApi({
123
+ apiVersion: MEDIA_LIBRARY_API_VERSION,
124
+ method: 'get',
125
+ query: {
126
+ projectId: '1234'
127
+ },
128
+ uri: '/media-libraries'
129
+ }).reply(200, {
130
+ data: []
131
+ });
119
132
  const { error } = await testCommand(MediaImportCommand, [
120
133
  'test-source'
121
- ]);
134
+ ], {
135
+ mocks: defaultMocks
136
+ });
122
137
  expect(error?.message).toContain('No active media libraries found in this project');
123
138
  expect(error?.oclif?.exit).toBe(1);
124
139
  });
125
140
  test('prompt user when there is no media flag', async ()=>{
126
- const mediaLibraries = [
127
- {
128
- id: 'test-media-library',
129
- organizationId: 'org-1',
130
- status: 'active'
141
+ mockApi({
142
+ apiVersion: MEDIA_LIBRARY_API_VERSION,
143
+ method: 'get',
144
+ query: {
145
+ projectId: '1234'
131
146
  },
132
- {
133
- id: 'another-library',
134
- organizationId: 'org-1',
135
- status: 'active'
136
- }
137
- ];
138
- mockGetMediaLibraries.mockResolvedValue(mediaLibraries);
147
+ uri: '/media-libraries'
148
+ }).reply(200, {
149
+ data: [
150
+ {
151
+ id: 'test-media-library',
152
+ organizationId: 'org-1',
153
+ status: 'active'
154
+ },
155
+ {
156
+ id: 'another-library',
157
+ organizationId: 'org-1',
158
+ status: 'active'
159
+ }
160
+ ]
161
+ });
139
162
  mockSelect.mockResolvedValue('test-media-library');
140
163
  await testCommand(MediaImportCommand, [
141
164
  'test-source'
142
- ]);
165
+ ], {
166
+ mocks: defaultMocks
167
+ });
143
168
  expect(mockSelect).toHaveBeenCalledWith(expect.objectContaining({
144
169
  message: 'Select media library:'
145
170
  }));
146
171
  });
147
172
  test('show console error when there is an error selecting a media library', async ()=>{
148
- const mediaLibraries = [
149
- {
150
- id: 'test-media-library',
151
- organizationId: 'org-1',
152
- status: 'active'
153
- }
154
- ];
155
- mockGetMediaLibraries.mockResolvedValue(mediaLibraries);
173
+ mockApi({
174
+ apiVersion: MEDIA_LIBRARY_API_VERSION,
175
+ method: 'get',
176
+ query: {
177
+ projectId: '1234'
178
+ },
179
+ uri: '/media-libraries'
180
+ }).reply(200, {
181
+ data: [
182
+ {
183
+ id: 'test-media-library',
184
+ organizationId: 'org-1',
185
+ status: 'active'
186
+ }
187
+ ]
188
+ });
156
189
  mockSelect.mockRejectedValue(new Error('User cancelled selection'));
157
190
  const { error } = await testCommand(MediaImportCommand, [
158
191
  'test-source'
159
- ]);
192
+ ], {
193
+ mocks: defaultMocks
194
+ });
160
195
  expect(error?.message).toContain('Failed to select media library');
161
196
  expect(error?.message).toContain('User cancelled selection');
162
197
  expect(error?.oclif?.exit).toBe(1);
163
198
  });
164
199
  test('show console error when the media library id flag is not valid', async ()=>{
165
- const mediaLibraries = [
166
- {
167
- id: 'test-media-library',
168
- organizationId: 'org-1',
169
- status: 'active'
170
- }
171
- ];
172
- mockGetMediaLibraries.mockResolvedValue(mediaLibraries);
200
+ mockApi({
201
+ apiVersion: MEDIA_LIBRARY_API_VERSION,
202
+ method: 'get',
203
+ query: {
204
+ projectId: '1234'
205
+ },
206
+ uri: '/media-libraries'
207
+ }).reply(200, {
208
+ data: [
209
+ {
210
+ id: 'test-media-library',
211
+ organizationId: 'org-1',
212
+ status: 'active'
213
+ }
214
+ ]
215
+ });
173
216
  const { error } = await testCommand(MediaImportCommand, [
174
217
  'test-source',
175
218
  '--media-library-id',
176
219
  'non-existent-library'
177
- ]);
220
+ ], {
221
+ mocks: defaultMocks
222
+ });
178
223
  expect(error?.message).toContain('Media library with id "non-existent-library" not found');
179
224
  expect(error?.oclif?.exit).toBe(1);
180
225
  });
181
226
  test('getProjectApiClient is instantiated with the correct values', async ()=>{
182
- const mediaLibraries = [
183
- {
184
- id: 'test-media-library',
185
- organizationId: 'org-1',
186
- status: 'active'
187
- }
188
- ];
189
- mockGetMediaLibraries.mockResolvedValue(mediaLibraries);
227
+ mockApi({
228
+ apiVersion: MEDIA_LIBRARY_API_VERSION,
229
+ method: 'get',
230
+ query: {
231
+ projectId: '1234'
232
+ },
233
+ uri: '/media-libraries'
234
+ }).reply(200, {
235
+ data: [
236
+ {
237
+ id: 'test-media-library',
238
+ organizationId: 'org-1',
239
+ status: 'active'
240
+ }
241
+ ]
242
+ });
190
243
  const mockSpinnerInstance = {
191
244
  start: vi.fn().mockReturnThis(),
192
245
  stop: vi.fn().mockReturnThis(),
@@ -197,28 +250,28 @@ describe('#media:import', ()=>{
197
250
  'test-source',
198
251
  '--media-library-id',
199
252
  'test-media-library'
200
- ]);
201
- expect(mockGetProjectCliClient).toHaveBeenCalledWith({
202
- apiVersion: 'v2025-02-19',
203
- dataset: undefined,
204
- perspective: 'drafts',
205
- projectId: '1234',
206
- requestTagPrefix: 'sanity.mediaLibraryCli.import',
207
- requireUser: true,
208
- '~experimental_resource': {
209
- id: 'test-media-library',
210
- type: 'media-library'
211
- }
253
+ ], {
254
+ mocks: defaultMocks
212
255
  });
256
+ expect(mockSpinnerInstance.start).toHaveBeenCalled();
213
257
  });
214
258
  test('show success message when cli imports asset successfully', async ()=>{
215
- mockGetMediaLibraries.mockResolvedValue([
216
- {
217
- id: 'test-media-library',
218
- organizationId: 'org-1',
219
- status: 'active'
220
- }
221
- ]);
259
+ mockApi({
260
+ apiVersion: MEDIA_LIBRARY_API_VERSION,
261
+ method: 'get',
262
+ query: {
263
+ projectId: '1234'
264
+ },
265
+ uri: '/media-libraries'
266
+ }).reply(200, {
267
+ data: [
268
+ {
269
+ id: 'test-media-library',
270
+ organizationId: 'org-1',
271
+ status: 'active'
272
+ }
273
+ ]
274
+ });
222
275
  const mockSpinnerInstance = {
223
276
  start: vi.fn().mockReturnThis(),
224
277
  succeed: vi.fn().mockReturnThis(),
@@ -246,19 +299,30 @@ describe('#media:import', ()=>{
246
299
  'test-source',
247
300
  '--media-library-id',
248
301
  'test-media-library'
249
- ]);
302
+ ], {
303
+ mocks: defaultMocks
304
+ });
250
305
  expect(mockSpinner).toHaveBeenCalledWith('Beginning import…');
251
306
  expect(mockSpinnerInstance.start).toHaveBeenCalled();
252
307
  expect(mockSpinnerInstance.succeed).toHaveBeenCalledWith('Imported 3 assets');
253
308
  });
254
309
  test('show failure in console if importer fails', async ()=>{
255
- mockGetMediaLibraries.mockResolvedValue([
256
- {
257
- id: 'test-media-library',
258
- organizationId: 'org-1',
259
- status: 'active'
260
- }
261
- ]);
310
+ mockApi({
311
+ apiVersion: MEDIA_LIBRARY_API_VERSION,
312
+ method: 'get',
313
+ query: {
314
+ projectId: '1234'
315
+ },
316
+ uri: '/media-libraries'
317
+ }).reply(200, {
318
+ data: [
319
+ {
320
+ id: 'test-media-library',
321
+ organizationId: 'org-1',
322
+ status: 'active'
323
+ }
324
+ ]
325
+ });
262
326
  const mockSpinnerInstance = {
263
327
  start: vi.fn().mockReturnThis(),
264
328
  stop: vi.fn().mockReturnThis()
@@ -270,7 +334,9 @@ describe('#media:import', ()=>{
270
334
  'test-source',
271
335
  '--media-library-id',
272
336
  'test-media-library'
273
- ]);
337
+ ], {
338
+ mocks: defaultMocks
339
+ });
274
340
  expect(mockSpinnerInstance.stop).toHaveBeenCalled();
275
341
  expect(error).toBeDefined();
276
342
  expect(error?.message).toBe('Failed to upload asset');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/media/__tests__/import.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {type CliConfig} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport {SanityClient} from '@sanity/client'\nimport {of, throwError} from 'rxjs'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {MediaImportCommand} from '../import.js'\n\nconst mocks = vi.hoisted(() => ({\n getCliConfig: vi.fn(),\n getMediaLibraries: vi.fn(),\n getProjectCliClient: vi.fn(),\n importer: vi.fn(),\n select: vi.fn(),\n spinner: vi.fn(),\n}))\n\nvi.mock('../../../services/mediaLibraries.js', () => ({\n getMediaLibraries: mocks.getMediaLibraries,\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n select: mocks.select,\n spinner: mocks.spinner,\n }\n})\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: mocks.getCliConfig,\n}))\n\nvi.mock('../../../../../cli-core/src/services/apiClient.js', () => ({\n getProjectCliClient: mocks.getProjectCliClient,\n}))\n\nvi.mock('../../../actions/media/importMedia.js', () => ({\n importer: mocks.importer,\n}))\n\nconst mockGetMediaLibraries = mocks.getMediaLibraries\nconst mockGetCliConfig = mocks.getCliConfig\nconst mockGetProjectCliClient = mocks.getProjectCliClient\nconst mockSelect = mocks.select\nconst mockSpinner = mocks.spinner\n\n// Setup CLI config\nconst apiConfig: CliConfig['api'] = {projectId: '1234'}\nmockGetCliConfig.mockResolvedValue({api: apiConfig})\nmockGetProjectCliClient.mockResolvedValue({} as SanityClient)\n\ndescribe('#media:import', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('should show help text correctly', async () => {\n const {stdout} = await runCommand(['media', 'import', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Import a set of assets to the target media library.\n\n USAGE\n $ sanity media import SOURCE [--media-library-id <value>]\n [--replace-aspects]\n\n ARGUMENTS\n SOURCE Image file or folder to import from\n\n FLAGS\n --media-library-id=<value> The id of the target media library\n --replace-aspects Replace existing aspect data. All versions will be\n replaced (e.g. published and draft aspect data)\n\n DESCRIPTION\n Import a set of assets to the target media library.\n\n EXAMPLES\n Import all assets from the \"products\" directory\n\n $ sanity media import products\n\n Import all assets from \"gallery\" archive\n\n $ sanity media import gallery.tar.gz\n\n Import all assets from the \"products\" directory and replace aspects\n\n $ sanity media import products --replace-aspects\n\n \"\n `)\n })\n\n test('show console error when no projectId is found', async () => {\n mockGetCliConfig.mockResolvedValueOnce({api: {}})\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'])\n\n expect(error?.message).toContain('does not contain a project identifier')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when getMediaLibraries fails', async () => {\n mockGetMediaLibraries.mockRejectedValue(new Error('API request failed'))\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'])\n\n expect(error?.message).toContain('Failed to list media libraries')\n expect(error?.message).toContain('API request failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when no active media libraries are found', async () => {\n mockGetMediaLibraries.mockResolvedValue([])\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'])\n\n expect(error?.message).toContain('No active media libraries found in this project')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('prompt user when there is no media flag', async () => {\n const mediaLibraries = [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n {id: 'another-library', organizationId: 'org-1', status: 'active' as const},\n ]\n mockGetMediaLibraries.mockResolvedValue(mediaLibraries)\n mockSelect.mockResolvedValue('test-media-library')\n\n await testCommand(MediaImportCommand, ['test-source'])\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library:',\n }),\n )\n })\n\n test('show console error when there is an error selecting a media library', async () => {\n const mediaLibraries = [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n ]\n mockGetMediaLibraries.mockResolvedValue(mediaLibraries)\n mockSelect.mockRejectedValue(new Error('User cancelled selection'))\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'])\n\n expect(error?.message).toContain('Failed to select media library')\n expect(error?.message).toContain('User cancelled selection')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when the media library id flag is not valid', async () => {\n const mediaLibraries = [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n ]\n mockGetMediaLibraries.mockResolvedValue(mediaLibraries)\n\n const {error} = await testCommand(MediaImportCommand, [\n 'test-source',\n '--media-library-id',\n 'non-existent-library',\n ])\n\n expect(error?.message).toContain('Media library with id \"non-existent-library\" not found')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('getProjectApiClient is instantiated with the correct values', async () => {\n const mediaLibraries = [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n ]\n mockGetMediaLibraries.mockResolvedValue(mediaLibraries)\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n stop: vi.fn().mockReturnThis(),\n succeed: vi.fn().mockReturnThis(),\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n await testCommand(MediaImportCommand, [\n 'test-source',\n '--media-library-id',\n 'test-media-library',\n ])\n\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: 'v2025-02-19',\n dataset: undefined,\n perspective: 'drafts',\n projectId: '1234',\n requestTagPrefix: 'sanity.mediaLibraryCli.import',\n requireUser: true,\n '~experimental_resource': {\n id: 'test-media-library',\n type: 'media-library',\n },\n })\n })\n\n test('show success message when cli imports asset successfully', async () => {\n mockGetMediaLibraries.mockResolvedValue([\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n ])\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n succeed: vi.fn().mockReturnThis(),\n text: '',\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n // Mock importer to emit 3 assets\n mocks.importer.mockReturnValue(\n of(\n {asset: {originalFilename: 'img1.jpg'}, fileCount: 3},\n {asset: {originalFilename: 'img2.jpg'}, fileCount: 3},\n {asset: {originalFilename: 'img3.jpg'}, fileCount: 3},\n ),\n )\n\n await testCommand(MediaImportCommand, [\n 'test-source',\n '--media-library-id',\n 'test-media-library',\n ])\n\n expect(mockSpinner).toHaveBeenCalledWith('Beginning import…')\n expect(mockSpinnerInstance.start).toHaveBeenCalled()\n expect(mockSpinnerInstance.succeed).toHaveBeenCalledWith('Imported 3 assets')\n })\n\n test('show failure in console if importer fails', async () => {\n mockGetMediaLibraries.mockResolvedValue([\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n ])\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n stop: vi.fn().mockReturnThis(),\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n // Mock importer to throw an error\n mocks.importer.mockReturnValue(throwError(() => new Error('Failed to upload asset')))\n\n const {error} = await testCommand(MediaImportCommand, [\n 'test-source',\n '--media-library-id',\n 'test-media-library',\n ])\n\n expect(mockSpinnerInstance.stop).toHaveBeenCalled()\n expect(error).toBeDefined()\n expect(error?.message).toBe('Failed to upload asset')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","testCommand","of","throwError","afterEach","describe","expect","test","vi","MediaImportCommand","mocks","hoisted","getCliConfig","fn","getMediaLibraries","getProjectCliClient","importer","select","spinner","mock","actual","importActual","findProjectRoot","mockResolvedValue","directory","root","type","mockGetMediaLibraries","mockGetCliConfig","mockGetProjectCliClient","mockSelect","mockSpinner","apiConfig","projectId","api","clearAllMocks","stdout","toMatchInlineSnapshot","mockResolvedValueOnce","error","message","toContain","oclif","exit","toBe","mockRejectedValue","Error","mediaLibraries","id","organizationId","status","toHaveBeenCalledWith","objectContaining","mockSpinnerInstance","start","mockReturnThis","stop","succeed","mockReturnValue","apiVersion","dataset","undefined","perspective","requestTagPrefix","requireUser","text","asset","originalFilename","fileCount","toHaveBeenCalled","toBeDefined"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/media/__tests__/import.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {type CliConfig} from '@sanity/cli-core'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {of, throwError} from 'rxjs'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {MEDIA_LIBRARY_API_VERSION} from '../../../services/mediaLibraries.js'\nimport {MediaImportCommand} from '../import.js'\n\nconst mocks = vi.hoisted(() => ({\n importer: vi.fn(),\n select: vi.fn(),\n spinner: vi.fn(),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n select: mocks.select,\n spinner: mocks.spinner,\n }\n})\n\nvi.mock('../../../actions/media/importMedia.js', () => ({\n importer: mocks.importer,\n}))\n\nconst mockSelect = mocks.select\nconst mockSpinner = mocks.spinner\n\nconst defaultMocks = {\n cliConfig: {\n api: {projectId: '1234'} as CliConfig['api'],\n },\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n root: '/test/path',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\ndescribe('#media:import', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('should show help text correctly', async () => {\n const {stdout} = await runCommand(['media', 'import', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Import a set of assets to the target media library.\n\n USAGE\n $ sanity media import SOURCE [--media-library-id <value>]\n [--replace-aspects]\n\n ARGUMENTS\n SOURCE Image file or folder to import from\n\n FLAGS\n --media-library-id=<value> The id of the target media library\n --replace-aspects Replace existing aspect data. All versions will be\n replaced (e.g. published and draft aspect data)\n\n DESCRIPTION\n Import a set of assets to the target media library.\n\n EXAMPLES\n Import all assets from the \"products\" directory\n\n $ sanity media import products\n\n Import all assets from \"gallery\" archive\n\n $ sanity media import gallery.tar.gz\n\n Import all assets from the \"products\" directory and replace aspects\n\n $ sanity media import products --replace-aspects\n\n \"\n `)\n })\n\n test('show console error when no projectId is found', async () => {\n const {error} = await testCommand(MediaImportCommand, ['test-source'], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {}},\n },\n })\n\n expect(error?.message).toContain('does not contain a project identifier')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when getMediaLibraries fails', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(500, {error: 'API request failed'})\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'], {mocks: defaultMocks})\n\n expect(error?.message).toContain('Failed to list media libraries')\n expect(error?.message).toContain('API request failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when no active media libraries are found', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {data: []})\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'], {mocks: defaultMocks})\n\n expect(error?.message).toContain('No active media libraries found in this project')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('prompt user when there is no media flag', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n mockSelect.mockResolvedValue('test-media-library')\n\n await testCommand(MediaImportCommand, ['test-source'], {mocks: defaultMocks})\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library:',\n }),\n )\n })\n\n test('show console error when there is an error selecting a media library', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-media-library', organizationId: 'org-1', status: 'active'}],\n })\n mockSelect.mockRejectedValue(new Error('User cancelled selection'))\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'], {mocks: defaultMocks})\n\n expect(error?.message).toContain('Failed to select media library')\n expect(error?.message).toContain('User cancelled selection')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when the media library id flag is not valid', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-media-library', organizationId: 'org-1', status: 'active'}],\n })\n\n const {error} = await testCommand(\n MediaImportCommand,\n ['test-source', '--media-library-id', 'non-existent-library'],\n {mocks: defaultMocks},\n )\n\n expect(error?.message).toContain('Media library with id \"non-existent-library\" not found')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('getProjectApiClient is instantiated with the correct values', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-media-library', organizationId: 'org-1', status: 'active'}],\n })\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n stop: vi.fn().mockReturnThis(),\n succeed: vi.fn().mockReturnThis(),\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n await testCommand(\n MediaImportCommand,\n ['test-source', '--media-library-id', 'test-media-library'],\n {mocks: defaultMocks},\n )\n\n expect(mockSpinnerInstance.start).toHaveBeenCalled()\n })\n\n test('show success message when cli imports asset successfully', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-media-library', organizationId: 'org-1', status: 'active'}],\n })\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n succeed: vi.fn().mockReturnThis(),\n text: '',\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n // Mock importer to emit 3 assets\n mocks.importer.mockReturnValue(\n of(\n {asset: {originalFilename: 'img1.jpg'}, fileCount: 3},\n {asset: {originalFilename: 'img2.jpg'}, fileCount: 3},\n {asset: {originalFilename: 'img3.jpg'}, fileCount: 3},\n ),\n )\n\n await testCommand(\n MediaImportCommand,\n ['test-source', '--media-library-id', 'test-media-library'],\n {mocks: defaultMocks},\n )\n\n expect(mockSpinner).toHaveBeenCalledWith('Beginning import…')\n expect(mockSpinnerInstance.start).toHaveBeenCalled()\n expect(mockSpinnerInstance.succeed).toHaveBeenCalledWith('Imported 3 assets')\n })\n\n test('show failure in console if importer fails', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-media-library', organizationId: 'org-1', status: 'active'}],\n })\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n stop: vi.fn().mockReturnThis(),\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n // Mock importer to throw an error\n mocks.importer.mockReturnValue(throwError(() => new Error('Failed to upload asset')))\n\n const {error} = await testCommand(\n MediaImportCommand,\n ['test-source', '--media-library-id', 'test-media-library'],\n {mocks: defaultMocks},\n )\n\n expect(mockSpinnerInstance.stop).toHaveBeenCalled()\n expect(error).toBeDefined()\n expect(error?.message).toBe('Failed to upload asset')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","mockApi","testCommand","nock","of","throwError","afterEach","describe","expect","test","vi","MEDIA_LIBRARY_API_VERSION","MediaImportCommand","mocks","hoisted","importer","fn","select","spinner","mock","actual","importActual","mockSelect","mockSpinner","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","root","type","token","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","error","message","toContain","oclif","exit","toBe","apiVersion","method","query","uri","reply","data","id","organizationId","status","mockResolvedValue","toHaveBeenCalledWith","objectContaining","mockRejectedValue","Error","mockSpinnerInstance","start","mockReturnThis","stop","succeed","mockReturnValue","toHaveBeenCalled","text","asset","originalFilename","fileCount","toBeDefined"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { Args, Flags } from '@oclif/core';
4
- import { SanityCommand, subdebug } from '@sanity/cli-core';
4
+ import { getProjectCliClient, SanityCommand, subdebug } from '@sanity/cli-core';
5
5
  import { input, spinner } from '@sanity/cli-core/ux';
6
6
  import { exportDataset } from '@sanity/export';
7
7
  import boxen from 'boxen';
@@ -59,7 +59,7 @@ export class MediaExportCommand extends SanityCommand {
59
59
  exit: 1
60
60
  });
61
61
  }
62
- const projectClient = await this.getProjectApiClient({
62
+ const projectClient = await getProjectCliClient({
63
63
  apiVersion: 'v2025-02-19',
64
64
  projectId,
65
65
  requireUser: true