@sanity/cli 6.0.0-alpha.3 → 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 (376) hide show
  1. package/dist/actions/auth/login/{index.js → login.js} +1 -1
  2. package/dist/actions/auth/login/{index.js.map → login.js.map} +1 -1
  3. package/dist/actions/dev/startStudioDevServer.js +3 -8
  4. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  5. package/dist/actions/dev/types.d.ts +1 -3
  6. package/dist/actions/dev/types.js.map +1 -1
  7. package/dist/actions/documents/validate.d.ts +0 -2
  8. package/dist/actions/documents/validate.js +21 -1
  9. package/dist/actions/documents/validate.js.map +1 -1
  10. package/dist/actions/exec/execScript.js +1 -1
  11. package/dist/actions/exec/execScript.js.map +1 -1
  12. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +1 -1
  13. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +1 -1
  14. package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
  15. package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
  16. package/dist/actions/manifest/extractManifest.js +1 -4
  17. package/dist/actions/manifest/extractManifest.js.map +1 -1
  18. package/dist/actions/organizations/getOrganizationChoices.d.ts +6 -0
  19. package/dist/actions/organizations/getOrganizationChoices.js +23 -0
  20. package/dist/actions/organizations/getOrganizationChoices.js.map +1 -0
  21. package/dist/actions/organizations/getOrganizationsWithAttachGrantInfo.d.ts +2 -0
  22. package/dist/actions/organizations/getOrganizationsWithAttachGrantInfo.js +9 -0
  23. package/dist/actions/organizations/getOrganizationsWithAttachGrantInfo.js.map +1 -0
  24. package/dist/actions/organizations/hasProjectAttachGrant.d.ts +1 -0
  25. package/dist/actions/organizations/hasProjectAttachGrant.js +24 -0
  26. package/dist/actions/organizations/hasProjectAttachGrant.js.map +1 -0
  27. package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
  28. package/dist/actions/schema/deleteSchemaAction.js +12 -17
  29. package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
  30. package/dist/actions/schema/deploySchemas.d.ts +15 -0
  31. package/dist/actions/schema/deploySchemas.js +98 -0
  32. package/dist/actions/schema/deploySchemas.js.map +1 -0
  33. package/dist/actions/schema/listSchemas.d.ts +12 -0
  34. package/dist/actions/schema/listSchemas.js +119 -0
  35. package/dist/actions/schema/listSchemas.js.map +1 -0
  36. package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
  37. package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
  38. package/dist/actions/schema/utils/debug.d.ts +2 -0
  39. package/dist/actions/schema/utils/debug.js +5 -0
  40. package/dist/actions/schema/utils/debug.js.map +1 -0
  41. package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
  42. package/dist/actions/schema/utils/manifestExtractor.js +12 -17
  43. package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
  44. package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
  45. package/dist/actions/schema/utils/manifestReader.js +6 -12
  46. package/dist/actions/schema/utils/manifestReader.js.map +1 -1
  47. package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
  48. package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
  49. package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
  50. package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
  51. package/dist/actions/schema/utils/schemaStoreValidation.js +40 -127
  52. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  53. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
  54. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
  55. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
  56. package/dist/actions/users/getMembersForProject.d.ts +1 -3
  57. package/dist/actions/users/getMembersForProject.js +6 -17
  58. package/dist/actions/users/getMembersForProject.js.map +1 -1
  59. package/dist/actions/users/types.d.ts +0 -11
  60. package/dist/actions/users/types.js.map +1 -1
  61. package/dist/commands/__tests__/debug.test.js +113 -220
  62. package/dist/commands/__tests__/debug.test.js.map +1 -1
  63. package/dist/commands/__tests__/deploy.test.js +325 -293
  64. package/dist/commands/__tests__/deploy.test.js.map +1 -1
  65. package/dist/commands/__tests__/dev.test.js +62 -19
  66. package/dist/commands/__tests__/dev.test.js.map +1 -1
  67. package/dist/commands/__tests__/init/init.authentication.test.js +73 -0
  68. package/dist/commands/__tests__/init/init.authentication.test.js.map +1 -0
  69. package/dist/commands/__tests__/init/init.create-new-project.test.js +195 -0
  70. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +1 -0
  71. package/dist/commands/__tests__/init/init.plan.test.js +279 -0
  72. package/dist/commands/__tests__/init/init.plan.test.js.map +1 -0
  73. package/dist/commands/__tests__/init/init.setup.test.js +335 -0
  74. package/dist/commands/__tests__/init/init.setup.test.js.map +1 -0
  75. package/dist/commands/__tests__/install.test.js +46 -22
  76. package/dist/commands/__tests__/install.test.js.map +1 -1
  77. package/dist/commands/__tests__/logout.test.js +8 -5
  78. package/dist/commands/__tests__/logout.test.js.map +1 -1
  79. package/dist/commands/__tests__/manage.test.js +29 -24
  80. package/dist/commands/__tests__/manage.test.js.map +1 -1
  81. package/dist/commands/__tests__/migration.test.js +119 -0
  82. package/dist/commands/__tests__/migration.test.js.map +1 -0
  83. package/dist/commands/__tests__/versions.test.js +22 -14
  84. package/dist/commands/__tests__/versions.test.js.map +1 -1
  85. package/dist/commands/backup/__tests__/disable.test.js +72 -75
  86. package/dist/commands/backup/__tests__/disable.test.js.map +1 -1
  87. package/dist/commands/backup/__tests__/download.test.js +169 -80
  88. package/dist/commands/backup/__tests__/download.test.js.map +1 -1
  89. package/dist/commands/backup/__tests__/enable.test.js +109 -140
  90. package/dist/commands/backup/__tests__/enable.test.js.map +1 -1
  91. package/dist/commands/backup/__tests__/list.test.js +84 -75
  92. package/dist/commands/backup/__tests__/list.test.js.map +1 -1
  93. package/dist/commands/backup/disable.js +5 -11
  94. package/dist/commands/backup/disable.js.map +1 -1
  95. package/dist/commands/backup/enable.js +5 -11
  96. package/dist/commands/backup/enable.js.map +1 -1
  97. package/dist/commands/backup/list.js +7 -8
  98. package/dist/commands/backup/list.js.map +1 -1
  99. package/dist/commands/cors/__tests__/add.test.js +68 -38
  100. package/dist/commands/cors/__tests__/add.test.js.map +1 -1
  101. package/dist/commands/cors/__tests__/delete.test.js +52 -37
  102. package/dist/commands/cors/__tests__/delete.test.js.map +1 -1
  103. package/dist/commands/cors/__tests__/list.test.js +80 -57
  104. package/dist/commands/cors/__tests__/list.test.js.map +1 -1
  105. package/dist/commands/cors/add.js +5 -13
  106. package/dist/commands/cors/add.js.map +1 -1
  107. package/dist/commands/cors/delete.js +7 -15
  108. package/dist/commands/cors/delete.js.map +1 -1
  109. package/dist/commands/cors/list.js +2 -10
  110. package/dist/commands/cors/list.js.map +1 -1
  111. package/dist/commands/dataset/__tests__/copy.test.js +197 -89
  112. package/dist/commands/dataset/__tests__/copy.test.js.map +1 -1
  113. package/dist/commands/dataset/__tests__/create.test.js +147 -117
  114. package/dist/commands/dataset/__tests__/create.test.js.map +1 -1
  115. package/dist/commands/dataset/__tests__/delete.test.js +75 -68
  116. package/dist/commands/dataset/__tests__/delete.test.js.map +1 -1
  117. package/dist/commands/dataset/__tests__/export.test.js +123 -83
  118. package/dist/commands/dataset/__tests__/export.test.js.map +1 -1
  119. package/dist/commands/dataset/__tests__/import.test.js +2 -2
  120. package/dist/commands/dataset/__tests__/import.test.js.map +1 -1
  121. package/dist/commands/dataset/__tests__/list.test.js +107 -65
  122. package/dist/commands/dataset/__tests__/list.test.js.map +1 -1
  123. package/dist/commands/dataset/alias/__tests__/create.test.js +114 -74
  124. package/dist/commands/dataset/alias/__tests__/create.test.js.map +1 -1
  125. package/dist/commands/dataset/alias/__tests__/delete.test.js +40 -29
  126. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +1 -1
  127. package/dist/commands/dataset/alias/__tests__/link.test.js +114 -74
  128. package/dist/commands/dataset/alias/__tests__/link.test.js.map +1 -1
  129. package/dist/commands/dataset/alias/__tests__/unlink.test.js +44 -29
  130. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +1 -1
  131. package/dist/commands/dataset/export.js +4 -4
  132. package/dist/commands/dataset/export.js.map +1 -1
  133. package/dist/commands/dataset/visibility/__tests__/get.test.js +48 -67
  134. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +1 -1
  135. package/dist/commands/dataset/visibility/__tests__/set.test.js +76 -123
  136. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +1 -1
  137. package/dist/commands/dev.js +0 -1
  138. package/dist/commands/dev.js.map +1 -1
  139. package/dist/commands/docs/__tests__/search.test.js +8 -7
  140. package/dist/commands/docs/__tests__/search.test.js.map +1 -1
  141. package/dist/commands/documents/__tests__/create.test.js +328 -265
  142. package/dist/commands/documents/__tests__/create.test.js.map +1 -1
  143. package/dist/commands/documents/__tests__/delete.test.js +119 -87
  144. package/dist/commands/documents/__tests__/delete.test.js.map +1 -1
  145. package/dist/commands/documents/__tests__/get.test.js +68 -95
  146. package/dist/commands/documents/__tests__/get.test.js.map +1 -1
  147. package/dist/commands/documents/__tests__/query.test.js +87 -192
  148. package/dist/commands/documents/__tests__/query.test.js.map +1 -1
  149. package/dist/commands/documents/__tests__/validate.test.js +52 -29
  150. package/dist/commands/documents/__tests__/validate.test.js.map +1 -1
  151. package/dist/commands/documents/create.d.ts +1 -0
  152. package/dist/commands/documents/create.js +10 -9
  153. package/dist/commands/documents/create.js.map +1 -1
  154. package/dist/commands/documents/delete.js +2 -3
  155. package/dist/commands/documents/delete.js.map +1 -1
  156. package/dist/commands/documents/get.js +2 -3
  157. package/dist/commands/documents/get.js.map +1 -1
  158. package/dist/commands/documents/query.js +2 -3
  159. package/dist/commands/documents/query.js.map +1 -1
  160. package/dist/commands/documents/validate.js +0 -20
  161. package/dist/commands/documents/validate.js.map +1 -1
  162. package/dist/commands/graphql/__tests__/list.test.js +57 -45
  163. package/dist/commands/graphql/__tests__/list.test.js.map +1 -1
  164. package/dist/commands/graphql/__tests__/undeploy.test.js +85 -59
  165. package/dist/commands/graphql/__tests__/undeploy.test.js.map +1 -1
  166. package/dist/commands/graphql/list.js +2 -2
  167. package/dist/commands/graphql/list.js.map +1 -1
  168. package/dist/commands/graphql/undeploy.js +4 -9
  169. package/dist/commands/graphql/undeploy.js.map +1 -1
  170. package/dist/commands/hook/__tests__/attempt.test.js +48 -33
  171. package/dist/commands/hook/__tests__/attempt.test.js.map +1 -1
  172. package/dist/commands/hook/__tests__/create.test.js +49 -51
  173. package/dist/commands/hook/__tests__/create.test.js.map +1 -1
  174. package/dist/commands/hook/__tests__/delete.test.js +43 -30
  175. package/dist/commands/hook/__tests__/delete.test.js.map +1 -1
  176. package/dist/commands/hook/__tests__/list.test.js +38 -31
  177. package/dist/commands/hook/__tests__/list.test.js.map +1 -1
  178. package/dist/commands/hook/__tests__/logs.test.js +68 -40
  179. package/dist/commands/hook/__tests__/logs.test.js.map +1 -1
  180. package/dist/commands/hook/create.js +2 -6
  181. package/dist/commands/hook/create.js.map +1 -1
  182. package/dist/commands/hook/delete.js +5 -17
  183. package/dist/commands/hook/delete.js.map +1 -1
  184. package/dist/commands/hook/list.js +2 -8
  185. package/dist/commands/hook/list.js.map +1 -1
  186. package/dist/commands/init.d.ts +4 -0
  187. package/dist/commands/init.js +151 -18
  188. package/dist/commands/init.js.map +1 -1
  189. package/dist/commands/login.js +1 -1
  190. package/dist/commands/login.js.map +1 -1
  191. package/dist/commands/manifest/__tests__/extract.test.js +22 -13
  192. package/dist/commands/manifest/__tests__/extract.test.js.map +1 -1
  193. package/dist/commands/media/__tests__/create-aspect.test.js +41 -28
  194. package/dist/commands/media/__tests__/create-aspect.test.js.map +1 -1
  195. package/dist/commands/media/__tests__/delete-aspect.test.js +44 -35
  196. package/dist/commands/media/__tests__/delete-aspect.test.js.map +1 -1
  197. package/dist/commands/media/__tests__/deploy-aspect.test.js +67 -80
  198. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +1 -1
  199. package/dist/commands/media/__tests__/export.test.js +365 -66
  200. package/dist/commands/media/__tests__/export.test.js.map +1 -1
  201. package/dist/commands/media/__tests__/import.test.js +171 -105
  202. package/dist/commands/media/__tests__/import.test.js.map +1 -1
  203. package/dist/commands/media/export.js +2 -2
  204. package/dist/commands/media/export.js.map +1 -1
  205. package/dist/commands/media/import.js +2 -2
  206. package/dist/commands/media/import.js.map +1 -1
  207. package/dist/commands/projects/__tests__/list.test.js +5 -4
  208. package/dist/commands/projects/__tests__/list.test.js.map +1 -1
  209. package/dist/commands/projects/list.js +2 -6
  210. package/dist/commands/projects/list.js.map +1 -1
  211. package/dist/commands/schema/__tests__/delete.test.js +396 -151
  212. package/dist/commands/schema/__tests__/delete.test.js.map +1 -1
  213. package/dist/commands/schema/__tests__/deploy.test.js +348 -0
  214. package/dist/commands/schema/__tests__/deploy.test.js.map +1 -0
  215. package/dist/commands/schema/__tests__/extract.test.js +19 -11
  216. package/dist/commands/schema/__tests__/extract.test.js.map +1 -1
  217. package/dist/commands/schema/__tests__/list.test.js +399 -0
  218. package/dist/commands/schema/__tests__/list.test.js.map +1 -0
  219. package/dist/commands/schema/__tests__/validate.test.js +27 -10
  220. package/dist/commands/schema/__tests__/validate.test.js.map +1 -1
  221. package/dist/commands/schema/delete.d.ts +1 -1
  222. package/dist/commands/schema/delete.js +20 -23
  223. package/dist/commands/schema/delete.js.map +1 -1
  224. package/dist/commands/schema/deploy.d.ts +16 -0
  225. package/dist/commands/schema/deploy.js +98 -0
  226. package/dist/commands/schema/deploy.js.map +1 -0
  227. package/dist/commands/schema/list.d.ts +15 -0
  228. package/dist/commands/schema/list.js +104 -0
  229. package/dist/commands/schema/list.js.map +1 -0
  230. package/dist/commands/telemetry/__tests__/disable.test.js +7 -5
  231. package/dist/commands/telemetry/__tests__/disable.test.js.map +1 -1
  232. package/dist/commands/telemetry/__tests__/enable.test.js +7 -5
  233. package/dist/commands/telemetry/__tests__/enable.test.js.map +1 -1
  234. package/dist/commands/telemetry/__tests__/status.test.js +7 -5
  235. package/dist/commands/telemetry/__tests__/status.test.js.map +1 -1
  236. package/dist/commands/tokens/__tests__/add.test.js +55 -40
  237. package/dist/commands/tokens/__tests__/add.test.js.map +1 -1
  238. package/dist/commands/tokens/__tests__/delete.test.js +72 -42
  239. package/dist/commands/tokens/__tests__/delete.test.js.map +1 -1
  240. package/dist/commands/tokens/__tests__/list.test.js +87 -60
  241. package/dist/commands/tokens/__tests__/list.test.js.map +1 -1
  242. package/dist/commands/tokens/add.js +3 -5
  243. package/dist/commands/tokens/add.js.map +1 -1
  244. package/dist/commands/users/__tests__/invite.test.js +100 -79
  245. package/dist/commands/users/__tests__/invite.test.js.map +1 -1
  246. package/dist/commands/users/__tests__/list.test.js +186 -180
  247. package/dist/commands/users/__tests__/list.test.js.map +1 -1
  248. package/dist/commands/users/invite.js +6 -17
  249. package/dist/commands/users/invite.js.map +1 -1
  250. package/dist/commands/users/list.js +4 -7
  251. package/dist/commands/users/list.js.map +1 -1
  252. package/dist/config/createCliConfig.d.ts +4 -4
  253. package/dist/services/backup.d.ts +8 -0
  254. package/dist/services/backup.js +19 -0
  255. package/dist/services/backup.js.map +1 -1
  256. package/dist/services/cors.d.ts +23 -0
  257. package/dist/services/cors.js +38 -0
  258. package/dist/services/cors.js.map +1 -0
  259. package/dist/services/graphql.d.ts +7 -0
  260. package/dist/services/graphql.js +11 -0
  261. package/dist/services/graphql.js.map +1 -1
  262. package/dist/services/hooks.d.ts +2 -0
  263. package/dist/services/hooks.js +19 -0
  264. package/dist/services/hooks.js.map +1 -1
  265. package/dist/services/organizations.d.ts +40 -0
  266. package/dist/services/organizations.js +41 -0
  267. package/dist/services/organizations.js.map +1 -0
  268. package/dist/services/projects.d.ts +31 -0
  269. package/dist/services/projects.js +71 -1
  270. package/dist/services/projects.js.map +1 -1
  271. package/dist/services/schemas.d.ts +4 -0
  272. package/dist/services/schemas.js +40 -0
  273. package/dist/services/schemas.js.map +1 -0
  274. package/dist/services/user.d.ts +10 -0
  275. package/dist/services/user.js +24 -0
  276. package/dist/services/user.js.map +1 -0
  277. package/dist/util/__tests__/getCliVersion.test.js +2 -2
  278. package/dist/util/__tests__/getCliVersion.test.js.map +1 -1
  279. package/dist/util/errorMessages.d.ts +1 -0
  280. package/dist/util/errorMessages.js +1 -0
  281. package/dist/util/errorMessages.js.map +1 -1
  282. package/dist/util/getCliVersion.js +1 -1
  283. package/dist/util/getCliVersion.js.map +1 -1
  284. package/dist/util/readPackageJson.d.ts +1 -15
  285. package/dist/util/readPackageJson.js +1 -1
  286. package/dist/util/readPackageJson.js.map +1 -1
  287. package/dist/util/uniqBy.d.ts +1 -0
  288. package/dist/util/uniqBy.js +14 -0
  289. package/dist/util/uniqBy.js.map +1 -0
  290. package/oclif.config.js +6 -1
  291. package/oclif.manifest.json +152 -158
  292. package/package.json +30 -31
  293. package/dist/actions/cors/constants.d.ts +0 -1
  294. package/dist/actions/cors/constants.js +0 -3
  295. package/dist/actions/cors/constants.js.map +0 -1
  296. package/dist/actions/cors/types.d.ts +0 -9
  297. package/dist/actions/cors/types.js +0 -3
  298. package/dist/actions/cors/types.js.map +0 -1
  299. package/dist/actions/migration/getMigrationRootDirectory.d.ts +0 -2
  300. package/dist/actions/migration/getMigrationRootDirectory.js +0 -14
  301. package/dist/actions/migration/getMigrationRootDirectory.js.map +0 -1
  302. package/dist/actions/migration/resolveMigrations.d.ts +0 -19
  303. package/dist/actions/migration/resolveMigrations.js +0 -43
  304. package/dist/actions/migration/resolveMigrations.js.map +0 -1
  305. package/dist/actions/migration/templates/__tests__/minimalAdvanced.test.js +0 -65
  306. package/dist/actions/migration/templates/__tests__/minimalAdvanced.test.js.map +0 -1
  307. package/dist/actions/migration/templates/__tests__/minimalSimple.test.js +0 -145
  308. package/dist/actions/migration/templates/__tests__/minimalSimple.test.js.map +0 -1
  309. package/dist/actions/migration/templates/__tests__/renameField.test.js +0 -63
  310. package/dist/actions/migration/templates/__tests__/renameField.test.js.map +0 -1
  311. package/dist/actions/migration/templates/__tests__/renameType.test.js +0 -61
  312. package/dist/actions/migration/templates/__tests__/renameType.test.js.map +0 -1
  313. package/dist/actions/migration/templates/__tests__/stringToPTE.test.js +0 -87
  314. package/dist/actions/migration/templates/__tests__/stringToPTE.test.js.map +0 -1
  315. package/dist/actions/migration/templates/index.d.ts +0 -5
  316. package/dist/actions/migration/templates/index.js +0 -7
  317. package/dist/actions/migration/templates/index.js.map +0 -1
  318. package/dist/actions/migration/templates/minimalAdvanced.d.ts +0 -4
  319. package/dist/actions/migration/templates/minimalAdvanced.js +0 -21
  320. package/dist/actions/migration/templates/minimalAdvanced.js.map +0 -1
  321. package/dist/actions/migration/templates/minimalSimple.d.ts +0 -4
  322. package/dist/actions/migration/templates/minimalSimple.js +0 -61
  323. package/dist/actions/migration/templates/minimalSimple.js.map +0 -1
  324. package/dist/actions/migration/templates/renameField.d.ts +0 -4
  325. package/dist/actions/migration/templates/renameField.js +0 -20
  326. package/dist/actions/migration/templates/renameField.js.map +0 -1
  327. package/dist/actions/migration/templates/renameType.d.ts +0 -4
  328. package/dist/actions/migration/templates/renameType.js +0 -19
  329. package/dist/actions/migration/templates/renameType.js.map +0 -1
  330. package/dist/actions/migration/templates/stringToPTE.d.ts +0 -4
  331. package/dist/actions/migration/templates/stringToPTE.js +0 -32
  332. package/dist/actions/migration/templates/stringToPTE.js.map +0 -1
  333. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
  334. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
  335. package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
  336. package/dist/actions/schema/schemaStoreConstants.js +0 -4
  337. package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
  338. package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
  339. package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
  340. package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
  341. package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
  342. package/dist/actions/schema/utils/schemaApiClient.js +0 -17
  343. package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
  344. package/dist/actions/users/apiVersion.d.ts +0 -6
  345. package/dist/actions/users/apiVersion.js +0 -7
  346. package/dist/actions/users/apiVersion.js.map +0 -1
  347. package/dist/commands/__tests__/init.test.js +0 -411
  348. package/dist/commands/__tests__/init.test.js.map +0 -1
  349. package/dist/commands/migration/__tests__/create.test.js +0 -296
  350. package/dist/commands/migration/__tests__/create.test.js.map +0 -1
  351. package/dist/commands/migration/__tests__/list.test.js +0 -166
  352. package/dist/commands/migration/__tests__/list.test.js.map +0 -1
  353. package/dist/commands/migration/__tests__/run.test.js +0 -481
  354. package/dist/commands/migration/__tests__/run.test.js.map +0 -1
  355. package/dist/commands/migration/create.d.ts +0 -17
  356. package/dist/commands/migration/create.js +0 -143
  357. package/dist/commands/migration/create.js.map +0 -1
  358. package/dist/commands/migration/list.d.ts +0 -9
  359. package/dist/commands/migration/list.js +0 -61
  360. package/dist/commands/migration/list.js.map +0 -1
  361. package/dist/commands/migration/run.d.ts +0 -26
  362. package/dist/commands/migration/run.js +0 -271
  363. package/dist/commands/migration/run.js.map +0 -1
  364. package/dist/util/migration/constants.d.ts +0 -3
  365. package/dist/util/migration/constants.js +0 -10
  366. package/dist/util/migration/constants.js.map +0 -1
  367. package/dist/util/migration/ensureApiVersionFormat.d.ts +0 -9
  368. package/dist/util/migration/ensureApiVersionFormat.js +0 -16
  369. package/dist/util/migration/ensureApiVersionFormat.js.map +0 -1
  370. package/dist/util/migration/prettyMutationFormatter.d.ts +0 -8
  371. package/dist/util/migration/prettyMutationFormatter.js +0 -141
  372. package/dist/util/migration/prettyMutationFormatter.js.map +0 -1
  373. package/dist/utils/migration/resolveMigrationScript.d.ts +0 -44
  374. package/dist/utils/migration/resolveMigrationScript.js +0 -74
  375. package/dist/utils/migration/resolveMigrationScript.js.map +0 -1
  376. /package/dist/actions/auth/login/{index.d.ts → login.d.ts} +0 -0
@@ -1,14 +1,12 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { getCliConfig } from '@sanity/cli-core';
3
2
  import { select } from '@sanity/cli-core/ux';
4
- import { mockApi, testCommand } from '@sanity/cli-test';
3
+ import { createTestToken, mockApi, testCommand } from '@sanity/cli-test';
5
4
  import { MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME } from '@sanity/types';
6
5
  import nock from 'nock';
7
6
  import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
8
7
  import { MEDIA_LIBRARY_API_VERSION } from '../../../services/mediaLibraries.js';
9
8
  import { NO_MEDIA_LIBRARY_ASPECTS_PATH, NO_PROJECT_ID } from '../../../util/errorMessages.js';
10
9
  import { MediaDeployAspectCommand } from '../deploy-aspect.js';
11
- // Create hoisted mock functions
12
10
  const mockFsAccess = vi.hoisted(()=>vi.fn());
13
11
  const mockFsReaddir = vi.hoisted(()=>vi.fn());
14
12
  const mockTsImport = vi.hoisted(()=>vi.fn());
@@ -30,28 +28,24 @@ vi.mock('@sanity/cli-core/ux', async ()=>{
30
28
  select: vi.fn()
31
29
  };
32
30
  });
33
- vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
34
- findProjectRoot: vi.fn().mockResolvedValue({
35
- directory: '/test/project',
36
- root: '/test/project',
37
- type: 'studio'
38
- })
39
- }));
40
- vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
41
- getCliConfig: vi.fn().mockResolvedValue({
42
- api: {
43
- projectId: 'test-project-id'
44
- },
45
- mediaLibrary: {
46
- aspectsPath: '/test/project/aspects'
47
- }
48
- })
49
- }));
50
- vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
51
- getCliToken: vi.fn().mockResolvedValue('test-token')
52
- }));
53
31
  const mockSelect = vi.mocked(select);
54
- const mockGetCliConfig = vi.mocked(getCliConfig);
32
+ const defaultMocks = {
33
+ cliConfig: {
34
+ api: {
35
+ projectId: 'test-project-id'
36
+ },
37
+ mediaLibrary: {
38
+ aspectsPath: '/test/project/aspects'
39
+ }
40
+ },
41
+ projectRoot: {
42
+ directory: '/test/project',
43
+ path: '/test/project/sanity.config.ts',
44
+ root: '/test/project',
45
+ type: 'studio'
46
+ },
47
+ token: 'test-token'
48
+ };
55
49
  /**
56
50
  * Helper to create a mock aspect definition with valid schema
57
51
  */ function createMockAspect(id) {
@@ -136,19 +130,11 @@ const mockGetCliConfig = vi.mocked(getCliConfig);
136
130
  }
137
131
  describe('#media:deploy-aspect', ()=>{
138
132
  beforeEach(()=>{
139
- vi.clearAllMocks();
140
133
  setupDefaultMocks();
141
- // Reset getCliConfig mock to default
142
- mockGetCliConfig.mockResolvedValue({
143
- api: {
144
- projectId: 'test-project-id'
145
- },
146
- mediaLibrary: {
147
- aspectsPath: '/test/project/aspects'
148
- }
149
- });
150
134
  });
151
135
  afterEach(()=>{
136
+ vi.clearAllMocks();
137
+ vi.unstubAllEnvs();
152
138
  const pending = nock.pendingMocks();
153
139
  nock.cleanAll();
154
140
  expect(pending, 'pending mocks').toEqual([]);
@@ -200,7 +186,9 @@ describe('#media:deploy-aspect', ()=>{
200
186
  expectedError: 'Specified both an aspect name and `--all`.'
201
187
  }
202
188
  ])('should error if $description', async ({ args, expectedError })=>{
203
- const { error } = await testCommand(MediaDeployAspectCommand, args);
189
+ const { error } = await testCommand(MediaDeployAspectCommand, args, {
190
+ mocks: defaultMocks
191
+ });
204
192
  expect(error?.message).toContain(expectedError);
205
193
  expect(error?.oclif?.exit).toBe(1);
206
194
  });
@@ -224,28 +212,30 @@ describe('#media:deploy-aspect', ()=>{
224
212
  expectedError: NO_MEDIA_LIBRARY_ASPECTS_PATH
225
213
  }
226
214
  ])('should error if $description', async ({ config, expectedError })=>{
227
- mockGetCliConfig.mockResolvedValue(config);
228
215
  const { error } = await testCommand(MediaDeployAspectCommand, [
229
216
  'myAspect'
230
- ]);
217
+ ], {
218
+ mocks: {
219
+ ...defaultMocks,
220
+ cliConfig: config
221
+ }
222
+ });
231
223
  expect(error?.message).toContain(expectedError);
232
224
  expect(error?.oclif?.exit).toBe(1);
233
225
  });
234
226
  test('should successfully deploy a single aspect', async ()=>{
235
- // Setup filesystem to return a single aspect file
236
227
  setupFileSystemMock([
237
228
  {
238
229
  filename: 'myAspect.ts',
239
230
  isFile: true
240
231
  }
241
232
  ]);
242
- // Setup tsImport to return the aspect definition
243
233
  setupTsImportMock({
244
234
  'myAspect.ts': {
245
235
  aspect: createMockAspect('myAspect')
246
236
  }
247
237
  });
248
- // Mock the media libraries API call
238
+ createTestToken('test-token');
249
239
  mockApi({
250
240
  apiVersion: MEDIA_LIBRARY_API_VERSION,
251
241
  method: 'get',
@@ -262,8 +252,6 @@ describe('#media:deploy-aspect', ()=>{
262
252
  }
263
253
  ]
264
254
  });
265
- mockSelect.mockResolvedValue('test-library-id');
266
- // Mock deploy API call
267
255
  mockApi({
268
256
  apiVersion: MEDIA_LIBRARY_API_VERSION,
269
257
  method: 'post',
@@ -276,9 +264,12 @@ describe('#media:deploy-aspect', ()=>{
276
264
  }
277
265
  ]
278
266
  });
267
+ mockSelect.mockResolvedValue('test-library-id');
279
268
  const { stdout } = await testCommand(MediaDeployAspectCommand, [
280
269
  'myAspect'
281
- ]);
270
+ ], {
271
+ mocks: defaultMocks
272
+ });
282
273
  expect(mockFsReaddir).toHaveBeenCalledWith('/test/project/aspects', {
283
274
  withFileTypes: true
284
275
  });
@@ -288,7 +279,6 @@ describe('#media:deploy-aspect', ()=>{
288
279
  expect(stdout).toContain('myAspect');
289
280
  });
290
281
  test('should deploy all aspects with --all flag', async ()=>{
291
- // Setup filesystem to return multiple aspect files
292
282
  setupFileSystemMock([
293
283
  {
294
284
  filename: 'aspect1.ts',
@@ -299,7 +289,6 @@ describe('#media:deploy-aspect', ()=>{
299
289
  isFile: true
300
290
  }
301
291
  ]);
302
- // Setup tsImport to return aspect definitions for both files
303
292
  setupTsImportMock({
304
293
  'aspect1.ts': {
305
294
  aspect: createMockAspect('aspect1')
@@ -308,7 +297,7 @@ describe('#media:deploy-aspect', ()=>{
308
297
  aspect: createMockAspect('aspect2')
309
298
  }
310
299
  });
311
- // Mock the media libraries API call
300
+ createTestToken('test-token');
312
301
  mockApi({
313
302
  apiVersion: MEDIA_LIBRARY_API_VERSION,
314
303
  method: 'get',
@@ -325,8 +314,6 @@ describe('#media:deploy-aspect', ()=>{
325
314
  }
326
315
  ]
327
316
  });
328
- mockSelect.mockResolvedValue('test-library-id');
329
- // Mock deploy API call
330
317
  mockApi({
331
318
  apiVersion: MEDIA_LIBRARY_API_VERSION,
332
319
  method: 'post',
@@ -343,29 +330,30 @@ describe('#media:deploy-aspect', ()=>{
343
330
  }
344
331
  ]
345
332
  });
333
+ mockSelect.mockResolvedValue('test-library-id');
346
334
  const { stdout } = await testCommand(MediaDeployAspectCommand, [
347
335
  '--all'
348
- ]);
336
+ ], {
337
+ mocks: defaultMocks
338
+ });
349
339
  expect(stdout).toContain('✓');
350
340
  expect(stdout).toContain('Deployed 2 aspects');
351
341
  expect(stdout).toContain('aspect1');
352
342
  expect(stdout).toContain('aspect2');
353
343
  });
354
344
  test('should use --media-library-id flag when provided', async ()=>{
355
- // Setup filesystem to return a single aspect file
356
345
  setupFileSystemMock([
357
346
  {
358
347
  filename: 'myAspect.ts',
359
348
  isFile: true
360
349
  }
361
350
  ]);
362
- // Setup tsImport to return the aspect definition
363
351
  setupTsImportMock({
364
352
  'myAspect.ts': {
365
353
  aspect: createMockAspect('myAspect')
366
354
  }
367
355
  });
368
- // Mock deploy API call
356
+ createTestToken('test-token');
369
357
  mockApi({
370
358
  apiVersion: MEDIA_LIBRARY_API_VERSION,
371
359
  method: 'post',
@@ -382,11 +370,12 @@ describe('#media:deploy-aspect', ()=>{
382
370
  'myAspect',
383
371
  '--media-library-id',
384
372
  'custom-library-id'
385
- ]);
373
+ ], {
374
+ mocks: defaultMocks
375
+ });
386
376
  expect(mockSelect).not.toHaveBeenCalled();
387
377
  });
388
378
  test('should error if aspect is not found', async ()=>{
389
- // Setup filesystem with aspect files that don't match the requested name
390
379
  setupFileSystemMock([
391
380
  {
392
381
  filename: 'someOtherAspect.ts',
@@ -397,7 +386,6 @@ describe('#media:deploy-aspect', ()=>{
397
386
  isFile: true
398
387
  }
399
388
  ]);
400
- // Setup tsImport to return aspects with different IDs
401
389
  setupTsImportMock({
402
390
  'anotherAspect.ts': {
403
391
  aspect: createMockAspect('anotherAspect')
@@ -406,7 +394,7 @@ describe('#media:deploy-aspect', ()=>{
406
394
  aspect: createMockAspect('someOtherAspect')
407
395
  }
408
396
  });
409
- // Mock the media libraries API call
397
+ createTestToken('test-token');
410
398
  mockApi({
411
399
  apiVersion: MEDIA_LIBRARY_API_VERSION,
412
400
  method: 'get',
@@ -426,13 +414,14 @@ describe('#media:deploy-aspect', ()=>{
426
414
  mockSelect.mockResolvedValue('test-library-id');
427
415
  const { error } = await testCommand(MediaDeployAspectCommand, [
428
416
  'nonExistentAspect'
429
- ]);
417
+ ], {
418
+ mocks: defaultMocks
419
+ });
430
420
  expect(error?.message).toContain('Could not find aspect');
431
421
  expect(error?.message).toContain('nonExistentAspect');
432
422
  expect(error?.oclif?.exit).toBe(1);
433
423
  });
434
424
  test('should skip invalid aspects and deploy only valid ones', async ()=>{
435
- // Setup filesystem with both valid and invalid aspect files
436
425
  setupFileSystemMock([
437
426
  {
438
427
  filename: 'invalidAspect.ts',
@@ -443,7 +432,6 @@ describe('#media:deploy-aspect', ()=>{
443
432
  isFile: true
444
433
  }
445
434
  ]);
446
- // Setup tsImport to return aspect definitions (one invalid, one valid)
447
435
  setupTsImportMock({
448
436
  'invalidAspect.ts': {
449
437
  aspect: createInvalidMockAspect('invalidAspect')
@@ -452,7 +440,7 @@ describe('#media:deploy-aspect', ()=>{
452
440
  aspect: createMockAspect('validAspect')
453
441
  }
454
442
  });
455
- // Mock the media libraries API call
443
+ createTestToken('test-token');
456
444
  mockApi({
457
445
  apiVersion: MEDIA_LIBRARY_API_VERSION,
458
446
  method: 'get',
@@ -469,8 +457,6 @@ describe('#media:deploy-aspect', ()=>{
469
457
  }
470
458
  ]
471
459
  });
472
- mockSelect.mockResolvedValue('test-library-id');
473
- // Mock deploy API call
474
460
  mockApi({
475
461
  apiVersion: MEDIA_LIBRARY_API_VERSION,
476
462
  method: 'post',
@@ -483,29 +469,30 @@ describe('#media:deploy-aspect', ()=>{
483
469
  }
484
470
  ]
485
471
  });
472
+ mockSelect.mockResolvedValue('test-library-id');
486
473
  const { stderr, stdout } = await testCommand(MediaDeployAspectCommand, [
487
474
  '--all'
488
- ]);
475
+ ], {
476
+ mocks: defaultMocks
477
+ });
489
478
  expect(stderr).toContain('Skipped 1 invalid aspect');
490
479
  expect(stderr).toContain('invalidAspect');
491
480
  expect(stdout).toContain('Deployed 1 aspect');
492
481
  expect(stdout).toContain('validAspect');
493
482
  });
494
483
  test('should warn if no valid aspects to deploy', async ()=>{
495
- // Setup filesystem with only invalid aspect files
496
484
  setupFileSystemMock([
497
485
  {
498
486
  filename: 'invalidAspect.ts',
499
487
  isFile: true
500
488
  }
501
489
  ]);
502
- // Setup tsImport to return an invalid aspect definition
503
490
  setupTsImportMock({
504
491
  'invalidAspect.ts': {
505
492
  aspect: createInvalidMockAspect('invalidAspect')
506
493
  }
507
494
  });
508
- // Mock the media libraries API call
495
+ createTestToken('test-token');
509
496
  mockApi({
510
497
  apiVersion: MEDIA_LIBRARY_API_VERSION,
511
498
  method: 'get',
@@ -525,25 +512,25 @@ describe('#media:deploy-aspect', ()=>{
525
512
  mockSelect.mockResolvedValue('test-library-id');
526
513
  const { stderr } = await testCommand(MediaDeployAspectCommand, [
527
514
  '--all'
528
- ]);
515
+ ], {
516
+ mocks: defaultMocks
517
+ });
529
518
  expect(stderr).toContain('Skipped 1 invalid aspect');
530
519
  expect(stderr).toContain('No valid aspects to deploy');
531
520
  });
532
521
  test('should handle API errors gracefully', async ()=>{
533
- // Setup filesystem to return a single aspect file
534
522
  setupFileSystemMock([
535
523
  {
536
524
  filename: 'myAspect.ts',
537
525
  isFile: true
538
526
  }
539
527
  ]);
540
- // Setup tsImport to return the aspect definition
541
528
  setupTsImportMock({
542
529
  'myAspect.ts': {
543
530
  aspect: createMockAspect('myAspect')
544
531
  }
545
532
  });
546
- // Mock the media libraries API call
533
+ createTestToken('test-token');
547
534
  mockApi({
548
535
  apiVersion: MEDIA_LIBRARY_API_VERSION,
549
536
  method: 'get',
@@ -560,36 +547,35 @@ describe('#media:deploy-aspect', ()=>{
560
547
  }
561
548
  ]
562
549
  });
563
- mockSelect.mockResolvedValue('test-library-id');
564
- // Mock deploy API call to fail
565
550
  mockApi({
566
551
  apiVersion: MEDIA_LIBRARY_API_VERSION,
567
552
  method: 'post',
568
553
  uri: '/media-libraries/test-library-id/mutate'
569
554
  }).reply(500, {
570
- message: 'Internal server error'
555
+ error: 'Internal server error'
571
556
  });
557
+ mockSelect.mockResolvedValue('test-library-id');
572
558
  const { error } = await testCommand(MediaDeployAspectCommand, [
573
559
  'myAspect'
574
- ]);
560
+ ], {
561
+ mocks: defaultMocks
562
+ });
575
563
  expect(error?.message).toContain('Failed to deploy aspects');
576
564
  expect(error?.oclif?.exit).toBe(1);
577
565
  });
578
566
  test('should fetch and present media libraries for selection', async ()=>{
579
- // Setup filesystem to return a single aspect file
580
567
  setupFileSystemMock([
581
568
  {
582
569
  filename: 'myAspect.ts',
583
570
  isFile: true
584
571
  }
585
572
  ]);
586
- // Setup tsImport to return the aspect definition
587
573
  setupTsImportMock({
588
574
  'myAspect.ts': {
589
575
  aspect: createMockAspect('myAspect')
590
576
  }
591
577
  });
592
- // Mock the media libraries API call
578
+ createTestToken('test-token');
593
579
  mockApi({
594
580
  apiVersion: MEDIA_LIBRARY_API_VERSION,
595
581
  method: 'get',
@@ -606,8 +592,6 @@ describe('#media:deploy-aspect', ()=>{
606
592
  }
607
593
  ]
608
594
  });
609
- mockSelect.mockResolvedValue('selected-library-id');
610
- // Mock deploy API call
611
595
  mockApi({
612
596
  apiVersion: MEDIA_LIBRARY_API_VERSION,
613
597
  method: 'post',
@@ -620,9 +604,12 @@ describe('#media:deploy-aspect', ()=>{
620
604
  }
621
605
  ]
622
606
  });
607
+ mockSelect.mockResolvedValue('selected-library-id');
623
608
  await testCommand(MediaDeployAspectCommand, [
624
609
  'myAspect'
625
- ]);
610
+ ], {
611
+ mocks: defaultMocks
612
+ });
626
613
  expect(mockSelect).toHaveBeenCalledWith(expect.objectContaining({
627
614
  message: 'Select media library'
628
615
  }));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/media/__tests__/deploy-aspect.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport {\n MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n type MediaLibraryAssetAspectDocument,\n} from '@sanity/types'\nimport nock from 'nock'\nimport {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport {MEDIA_LIBRARY_API_VERSION} from '../../../services/mediaLibraries.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH, NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {MediaDeployAspectCommand} from '../deploy-aspect.js'\n\n// Create hoisted mock functions\nconst mockFsAccess = vi.hoisted(() => vi.fn())\nconst mockFsReaddir = vi.hoisted(() => vi.fn())\nconst mockTsImport = vi.hoisted(() => vi.fn())\nconst mockGetTsconfig = vi.hoisted(() => vi.fn())\n\nvi.mock('node:fs/promises', () => ({\n access: mockFsAccess,\n readdir: mockFsReaddir,\n}))\n\nvi.mock('tsx/esm/api', () => ({\n tsImport: mockTsImport,\n}))\n\nvi.mock('get-tsconfig', () => ({\n getTsconfig: mockGetTsconfig,\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: vi.fn(),\n }\n})\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/project',\n root: '/test/project',\n type: 'studio',\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn().mockResolvedValue({\n api: {\n projectId: 'test-project-id',\n },\n mediaLibrary: {\n aspectsPath: '/test/project/aspects',\n },\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nconst mockSelect = vi.mocked(select)\nconst mockGetCliConfig = vi.mocked(getCliConfig)\n\n/**\n * Helper to create a mock aspect definition with valid schema\n */\nfunction createMockAspect(id: string): MediaLibraryAssetAspectDocument {\n return {\n _createdAt: new Date().toISOString(),\n _id: id,\n _rev: 'mock-revision',\n _type: MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n _updatedAt: new Date().toISOString(),\n definition: {\n fields: [\n {\n name: 'testField',\n title: 'Test Field',\n type: 'string',\n },\n ],\n name: id,\n title: id,\n type: 'object',\n },\n } as MediaLibraryAssetAspectDocument\n}\n\n/**\n * Helper to create an invalid aspect definition\n * Uses unsupported field types (image/file) which are not allowed in aspects\n */\nfunction createInvalidMockAspect(id: string): MediaLibraryAssetAspectDocument {\n return {\n _createdAt: new Date().toISOString(),\n _id: id,\n _rev: 'mock-revision',\n _type: MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n _updatedAt: new Date().toISOString(),\n definition: {\n fields: [\n {\n name: 'invalidImageField',\n title: 'Invalid Image Field',\n type: 'image', // Image type is not allowed in aspects\n },\n ],\n name: id,\n title: id,\n type: 'object',\n },\n } as MediaLibraryAssetAspectDocument\n}\n\n/**\n * Helper to setup filesystem mocks for aspect files\n */\nfunction setupFileSystemMock(files: Array<{filename: string; isFile: boolean}>) {\n mockFsAccess.mockResolvedValue(undefined)\n mockFsReaddir.mockResolvedValue(\n files.map((file) => ({\n isFile: () => file.isFile,\n name: file.filename,\n })),\n )\n}\n\n/**\n * Helper to setup tsImport mock to return aspect definitions\n */\nfunction setupTsImportMock(\n imports: Record<\n string,\n {\n aspect: unknown\n errorMessage?: string\n shouldFail?: boolean\n }\n >,\n) {\n mockTsImport.mockImplementation(async (filePath: string) => {\n const filename = filePath.split('/').pop() || ''\n const importConfig = imports[filename]\n\n if (!importConfig) {\n throw new Error(`No mock configured for ${filename}`)\n }\n\n if (importConfig.shouldFail) {\n throw new Error(importConfig.errorMessage || 'Import failed')\n }\n\n return {\n default: importConfig.aspect,\n }\n })\n}\n\n/**\n * Setup default mocks for a successful test scenario\n */\nfunction setupDefaultMocks() {\n mockFsAccess.mockResolvedValue(undefined)\n mockFsReaddir.mockResolvedValue([])\n mockGetTsconfig.mockReturnValue({path: '/test/tsconfig.json'} as never)\n}\n\ndescribe('#media:deploy-aspect', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n setupDefaultMocks()\n // Reset getCliConfig mock to default\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: 'test-project-id',\n },\n mediaLibrary: {\n aspectsPath: '/test/project/aspects',\n },\n })\n })\n\n afterEach(() => {\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 deploy-aspect --help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Deploy an aspect\n\n USAGE\n $ sanity media deploy-aspect [ASPECTNAME] [--all] [--media-library-id <value>]\n\n ARGUMENTS\n [ASPECTNAME] Name of the aspect to deploy\n\n FLAGS\n --all Deploy all aspects\n --media-library-id=<value> The id of the target media library\n\n DESCRIPTION\n Deploy an aspect\n\n EXAMPLES\n Deploy the aspect named \"someAspect\"\n\n $ sanity media deploy-aspect someAspect\n\n Deploy all aspects\n\n $ sanity media deploy-aspect --all\n\n \"\n `)\n })\n\n test.each([\n {\n args: [],\n description: 'neither aspect name nor --all flag is provided',\n expectedError:\n 'Specify an aspect name, or use the `--all` option to deploy all aspect definitions.',\n },\n {\n args: ['myAspect', '--all'],\n description: 'both aspect name and --all flag are provided',\n expectedError: 'Specified both an aspect name and `--all`.',\n },\n ])('should error if $description', async ({args, expectedError}) => {\n const {error} = await testCommand(MediaDeployAspectCommand, args)\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n {\n config: {\n mediaLibrary: {\n aspectsPath: '/test/project/aspects',\n },\n },\n description: 'project ID is not configured',\n expectedError: NO_PROJECT_ID,\n },\n {\n config: {\n api: {\n projectId: 'test-project-id',\n },\n },\n description: 'media library aspects path is not configured',\n expectedError: NO_MEDIA_LIBRARY_ASPECTS_PATH,\n },\n ])('should error if $description', async ({config, expectedError}) => {\n mockGetCliConfig.mockResolvedValue(config)\n\n const {error} = await testCommand(MediaDeployAspectCommand, ['myAspect'])\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should successfully deploy a single aspect', async () => {\n // Setup filesystem to return a single aspect file\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n // Setup tsImport to return the aspect definition\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n // Mock deploy API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n const {stdout} = await testCommand(MediaDeployAspectCommand, ['myAspect'])\n\n expect(mockFsReaddir).toHaveBeenCalledWith('/test/project/aspects', {withFileTypes: true})\n expect(mockTsImport).toHaveBeenCalled()\n expect(stdout).toContain('✓')\n expect(stdout).toContain('Deployed 1 aspect')\n expect(stdout).toContain('myAspect')\n })\n\n test('should deploy all aspects with --all flag', async () => {\n // Setup filesystem to return multiple aspect files\n setupFileSystemMock([\n {filename: 'aspect1.ts', isFile: true},\n {filename: 'aspect2.ts', isFile: true},\n ])\n\n // Setup tsImport to return aspect definitions for both files\n setupTsImportMock({\n 'aspect1.ts': {\n aspect: createMockAspect('aspect1'),\n },\n 'aspect2.ts': {\n aspect: createMockAspect('aspect2'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n // Mock deploy API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [\n {id: 'aspect1', operation: 'created'},\n {id: 'aspect2', operation: 'created'},\n ],\n })\n\n const {stdout} = await testCommand(MediaDeployAspectCommand, ['--all'])\n\n expect(stdout).toContain('✓')\n expect(stdout).toContain('Deployed 2 aspects')\n expect(stdout).toContain('aspect1')\n expect(stdout).toContain('aspect2')\n })\n\n test('should use --media-library-id flag when provided', async () => {\n // Setup filesystem to return a single aspect file\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n // Setup tsImport to return the aspect definition\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n // Mock deploy API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/custom-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n await testCommand(MediaDeployAspectCommand, [\n 'myAspect',\n '--media-library-id',\n 'custom-library-id',\n ])\n\n expect(mockSelect).not.toHaveBeenCalled()\n })\n\n test('should error if aspect is not found', async () => {\n // Setup filesystem with aspect files that don't match the requested name\n setupFileSystemMock([\n {filename: 'someOtherAspect.ts', isFile: true},\n {filename: 'anotherAspect.ts', isFile: true},\n ])\n\n // Setup tsImport to return aspects with different IDs\n setupTsImportMock({\n 'anotherAspect.ts': {\n aspect: createMockAspect('anotherAspect'),\n },\n 'someOtherAspect.ts': {\n aspect: createMockAspect('someOtherAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {error} = await testCommand(MediaDeployAspectCommand, ['nonExistentAspect'])\n\n expect(error?.message).toContain('Could not find aspect')\n expect(error?.message).toContain('nonExistentAspect')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should skip invalid aspects and deploy only valid ones', async () => {\n // Setup filesystem with both valid and invalid aspect files\n setupFileSystemMock([\n {filename: 'invalidAspect.ts', isFile: true},\n {filename: 'validAspect.ts', isFile: true},\n ])\n\n // Setup tsImport to return aspect definitions (one invalid, one valid)\n setupTsImportMock({\n 'invalidAspect.ts': {\n aspect: createInvalidMockAspect('invalidAspect'),\n },\n 'validAspect.ts': {\n aspect: createMockAspect('validAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n // Mock deploy API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [{id: 'validAspect', operation: 'created'}],\n })\n\n const {stderr, stdout} = await testCommand(MediaDeployAspectCommand, ['--all'])\n\n expect(stderr).toContain('Skipped 1 invalid aspect')\n expect(stderr).toContain('invalidAspect')\n expect(stdout).toContain('Deployed 1 aspect')\n expect(stdout).toContain('validAspect')\n })\n\n test('should warn if no valid aspects to deploy', async () => {\n // Setup filesystem with only invalid aspect files\n setupFileSystemMock([{filename: 'invalidAspect.ts', isFile: true}])\n\n // Setup tsImport to return an invalid aspect definition\n setupTsImportMock({\n 'invalidAspect.ts': {\n aspect: createInvalidMockAspect('invalidAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {stderr} = await testCommand(MediaDeployAspectCommand, ['--all'])\n\n expect(stderr).toContain('Skipped 1 invalid aspect')\n expect(stderr).toContain('No valid aspects to deploy')\n })\n\n test('should handle API errors gracefully', async () => {\n // Setup filesystem to return a single aspect file\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n // Setup tsImport to return the aspect definition\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n // Mock deploy API call to fail\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(500, {message: 'Internal server error'})\n\n const {error} = await testCommand(MediaDeployAspectCommand, ['myAspect'])\n\n expect(error?.message).toContain('Failed to deploy aspects')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fetch and present media libraries for selection', async () => {\n // Setup filesystem to return a single aspect file\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n // Setup tsImport to return the aspect definition\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'selected-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('selected-library-id')\n\n // Mock deploy API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/selected-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n await testCommand(MediaDeployAspectCommand, ['myAspect'])\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library',\n }),\n )\n })\n})\n"],"names":["runCommand","getCliConfig","select","mockApi","testCommand","MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME","nock","afterEach","beforeEach","describe","expect","test","vi","MEDIA_LIBRARY_API_VERSION","NO_MEDIA_LIBRARY_ASPECTS_PATH","NO_PROJECT_ID","MediaDeployAspectCommand","mockFsAccess","hoisted","fn","mockFsReaddir","mockTsImport","mockGetTsconfig","mock","access","readdir","tsImport","getTsconfig","actual","importActual","findProjectRoot","mockResolvedValue","directory","root","type","api","projectId","mediaLibrary","aspectsPath","getCliToken","mockSelect","mocked","mockGetCliConfig","createMockAspect","id","_createdAt","Date","toISOString","_id","_rev","_type","_updatedAt","definition","fields","name","title","createInvalidMockAspect","setupFileSystemMock","files","undefined","map","file","isFile","filename","setupTsImportMock","imports","mockImplementation","filePath","split","pop","importConfig","Error","shouldFail","errorMessage","default","aspect","setupDefaultMocks","mockReturnValue","path","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","each","args","description","expectedError","error","message","toContain","oclif","exit","toBe","config","apiVersion","method","query","uri","reply","data","organizationId","status","results","operation","toHaveBeenCalledWith","withFileTypes","toHaveBeenCalled","not","stderr","objectContaining"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/media/__tests__/deploy-aspect.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {select} from '@sanity/cli-core/ux'\nimport {createTestToken, mockApi, testCommand} from '@sanity/cli-test'\nimport {\n MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n type MediaLibraryAssetAspectDocument,\n} from '@sanity/types'\nimport nock from 'nock'\nimport {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport {MEDIA_LIBRARY_API_VERSION} from '../../../services/mediaLibraries.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH, NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {MediaDeployAspectCommand} from '../deploy-aspect.js'\n\nconst mockFsAccess = vi.hoisted(() => vi.fn())\nconst mockFsReaddir = vi.hoisted(() => vi.fn())\nconst mockTsImport = vi.hoisted(() => vi.fn())\nconst mockGetTsconfig = vi.hoisted(() => vi.fn())\n\nvi.mock('node:fs/promises', () => ({\n access: mockFsAccess,\n readdir: mockFsReaddir,\n}))\n\nvi.mock('tsx/esm/api', () => ({\n tsImport: mockTsImport,\n}))\n\nvi.mock('get-tsconfig', () => ({\n getTsconfig: mockGetTsconfig,\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: vi.fn(),\n }\n})\n\nconst mockSelect = vi.mocked(select)\n\nconst defaultMocks = {\n cliConfig: {\n api: {\n projectId: 'test-project-id',\n },\n mediaLibrary: {\n aspectsPath: '/test/project/aspects',\n },\n },\n projectRoot: {\n directory: '/test/project',\n path: '/test/project/sanity.config.ts',\n root: '/test/project',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\n/**\n * Helper to create a mock aspect definition with valid schema\n */\nfunction createMockAspect(id: string): MediaLibraryAssetAspectDocument {\n return {\n _createdAt: new Date().toISOString(),\n _id: id,\n _rev: 'mock-revision',\n _type: MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n _updatedAt: new Date().toISOString(),\n definition: {\n fields: [\n {\n name: 'testField',\n title: 'Test Field',\n type: 'string',\n },\n ],\n name: id,\n title: id,\n type: 'object',\n },\n } as MediaLibraryAssetAspectDocument\n}\n\n/**\n * Helper to create an invalid aspect definition\n * Uses unsupported field types (image/file) which are not allowed in aspects\n */\nfunction createInvalidMockAspect(id: string): MediaLibraryAssetAspectDocument {\n return {\n _createdAt: new Date().toISOString(),\n _id: id,\n _rev: 'mock-revision',\n _type: MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n _updatedAt: new Date().toISOString(),\n definition: {\n fields: [\n {\n name: 'invalidImageField',\n title: 'Invalid Image Field',\n type: 'image', // Image type is not allowed in aspects\n },\n ],\n name: id,\n title: id,\n type: 'object',\n },\n } as MediaLibraryAssetAspectDocument\n}\n\n/**\n * Helper to setup filesystem mocks for aspect files\n */\nfunction setupFileSystemMock(files: Array<{filename: string; isFile: boolean}>) {\n mockFsAccess.mockResolvedValue(undefined)\n mockFsReaddir.mockResolvedValue(\n files.map((file) => ({\n isFile: () => file.isFile,\n name: file.filename,\n })),\n )\n}\n\n/**\n * Helper to setup tsImport mock to return aspect definitions\n */\nfunction setupTsImportMock(\n imports: Record<\n string,\n {\n aspect: unknown\n errorMessage?: string\n shouldFail?: boolean\n }\n >,\n) {\n mockTsImport.mockImplementation(async (filePath: string) => {\n const filename = filePath.split('/').pop() || ''\n const importConfig = imports[filename]\n\n if (!importConfig) {\n throw new Error(`No mock configured for ${filename}`)\n }\n\n if (importConfig.shouldFail) {\n throw new Error(importConfig.errorMessage || 'Import failed')\n }\n\n return {\n default: importConfig.aspect,\n }\n })\n}\n\n/**\n * Setup default mocks for a successful test scenario\n */\nfunction setupDefaultMocks() {\n mockFsAccess.mockResolvedValue(undefined)\n mockFsReaddir.mockResolvedValue([])\n mockGetTsconfig.mockReturnValue({path: '/test/tsconfig.json'} as never)\n}\n\ndescribe('#media:deploy-aspect', () => {\n beforeEach(() => {\n setupDefaultMocks()\n })\n\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 deploy-aspect --help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Deploy an aspect\n\n USAGE\n $ sanity media deploy-aspect [ASPECTNAME] [--all] [--media-library-id <value>]\n\n ARGUMENTS\n [ASPECTNAME] Name of the aspect to deploy\n\n FLAGS\n --all Deploy all aspects\n --media-library-id=<value> The id of the target media library\n\n DESCRIPTION\n Deploy an aspect\n\n EXAMPLES\n Deploy the aspect named \"someAspect\"\n\n $ sanity media deploy-aspect someAspect\n\n Deploy all aspects\n\n $ sanity media deploy-aspect --all\n\n \"\n `)\n })\n\n test.each([\n {\n args: [],\n description: 'neither aspect name nor --all flag is provided',\n expectedError:\n 'Specify an aspect name, or use the `--all` option to deploy all aspect definitions.',\n },\n {\n args: ['myAspect', '--all'],\n description: 'both aspect name and --all flag are provided',\n expectedError: 'Specified both an aspect name and `--all`.',\n },\n ])('should error if $description', async ({args, expectedError}) => {\n const {error} = await testCommand(MediaDeployAspectCommand, args, {mocks: defaultMocks})\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n {\n config: {\n mediaLibrary: {\n aspectsPath: '/test/project/aspects',\n },\n },\n description: 'project ID is not configured',\n expectedError: NO_PROJECT_ID,\n },\n {\n config: {\n api: {\n projectId: 'test-project-id',\n },\n },\n description: 'media library aspects path is not configured',\n expectedError: NO_MEDIA_LIBRARY_ASPECTS_PATH,\n },\n ])('should error if $description', async ({config, expectedError}) => {\n const {error} = await testCommand(MediaDeployAspectCommand, ['myAspect'], {\n mocks: {\n ...defaultMocks,\n cliConfig: config,\n },\n })\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should successfully deploy a single aspect', async () => {\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {stdout} = await testCommand(MediaDeployAspectCommand, ['myAspect'], {\n mocks: defaultMocks,\n })\n\n expect(mockFsReaddir).toHaveBeenCalledWith('/test/project/aspects', {withFileTypes: true})\n expect(mockTsImport).toHaveBeenCalled()\n expect(stdout).toContain('✓')\n expect(stdout).toContain('Deployed 1 aspect')\n expect(stdout).toContain('myAspect')\n })\n\n test('should deploy all aspects with --all flag', async () => {\n setupFileSystemMock([\n {filename: 'aspect1.ts', isFile: true},\n {filename: 'aspect2.ts', isFile: true},\n ])\n\n setupTsImportMock({\n 'aspect1.ts': {\n aspect: createMockAspect('aspect1'),\n },\n 'aspect2.ts': {\n aspect: createMockAspect('aspect2'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [\n {id: 'aspect1', operation: 'created'},\n {id: 'aspect2', operation: 'created'},\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {stdout} = await testCommand(MediaDeployAspectCommand, ['--all'], {mocks: defaultMocks})\n\n expect(stdout).toContain('✓')\n expect(stdout).toContain('Deployed 2 aspects')\n expect(stdout).toContain('aspect1')\n expect(stdout).toContain('aspect2')\n })\n\n test('should use --media-library-id flag when provided', async () => {\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/custom-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n await testCommand(\n MediaDeployAspectCommand,\n ['myAspect', '--media-library-id', 'custom-library-id'],\n {mocks: defaultMocks},\n )\n\n expect(mockSelect).not.toHaveBeenCalled()\n })\n\n test('should error if aspect is not found', async () => {\n setupFileSystemMock([\n {filename: 'someOtherAspect.ts', isFile: true},\n {filename: 'anotherAspect.ts', isFile: true},\n ])\n\n setupTsImportMock({\n 'anotherAspect.ts': {\n aspect: createMockAspect('anotherAspect'),\n },\n 'someOtherAspect.ts': {\n aspect: createMockAspect('someOtherAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {error} = await testCommand(MediaDeployAspectCommand, ['nonExistentAspect'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Could not find aspect')\n expect(error?.message).toContain('nonExistentAspect')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should skip invalid aspects and deploy only valid ones', async () => {\n setupFileSystemMock([\n {filename: 'invalidAspect.ts', isFile: true},\n {filename: 'validAspect.ts', isFile: true},\n ])\n\n setupTsImportMock({\n 'invalidAspect.ts': {\n aspect: createInvalidMockAspect('invalidAspect'),\n },\n 'validAspect.ts': {\n aspect: createMockAspect('validAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [{id: 'validAspect', operation: 'created'}],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {stderr, stdout} = await testCommand(MediaDeployAspectCommand, ['--all'], {\n mocks: defaultMocks,\n })\n\n expect(stderr).toContain('Skipped 1 invalid aspect')\n expect(stderr).toContain('invalidAspect')\n expect(stdout).toContain('Deployed 1 aspect')\n expect(stdout).toContain('validAspect')\n })\n\n test('should warn if no valid aspects to deploy', async () => {\n setupFileSystemMock([{filename: 'invalidAspect.ts', isFile: true}])\n\n setupTsImportMock({\n 'invalidAspect.ts': {\n aspect: createInvalidMockAspect('invalidAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {stderr} = await testCommand(MediaDeployAspectCommand, ['--all'], {mocks: defaultMocks})\n\n expect(stderr).toContain('Skipped 1 invalid aspect')\n expect(stderr).toContain('No valid aspects to deploy')\n })\n\n test('should handle API errors gracefully', async () => {\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(500, {\n error: 'Internal server error',\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {error} = await testCommand(MediaDeployAspectCommand, ['myAspect'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Failed to deploy aspects')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fetch and present media libraries for selection', async () => {\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'selected-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/selected-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n mockSelect.mockResolvedValue('selected-library-id')\n\n await testCommand(MediaDeployAspectCommand, ['myAspect'], {mocks: defaultMocks})\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library',\n }),\n )\n })\n})\n"],"names":["runCommand","select","createTestToken","mockApi","testCommand","MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME","nock","afterEach","beforeEach","describe","expect","test","vi","MEDIA_LIBRARY_API_VERSION","NO_MEDIA_LIBRARY_ASPECTS_PATH","NO_PROJECT_ID","MediaDeployAspectCommand","mockFsAccess","hoisted","fn","mockFsReaddir","mockTsImport","mockGetTsconfig","mock","access","readdir","tsImport","getTsconfig","actual","importActual","mockSelect","mocked","defaultMocks","cliConfig","api","projectId","mediaLibrary","aspectsPath","projectRoot","directory","path","root","type","token","createMockAspect","id","_createdAt","Date","toISOString","_id","_rev","_type","_updatedAt","definition","fields","name","title","createInvalidMockAspect","setupFileSystemMock","files","mockResolvedValue","undefined","map","file","isFile","filename","setupTsImportMock","imports","mockImplementation","filePath","split","pop","importConfig","Error","shouldFail","errorMessage","default","aspect","setupDefaultMocks","mockReturnValue","clearAllMocks","unstubAllEnvs","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","each","args","description","expectedError","error","mocks","message","toContain","oclif","exit","toBe","config","apiVersion","method","query","uri","reply","data","organizationId","status","results","operation","toHaveBeenCalledWith","withFileTypes","toHaveBeenCalled","not","stderr","objectContaining"],"mappings":"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"}