@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,28 +1,34 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { getCliConfig } from '@sanity/cli-core';
2
+ import { getProjectCliClient } from '@sanity/cli-core';
3
3
  import { mockApi, testCommand } from '@sanity/cli-test';
4
4
  import nock from 'nock';
5
5
  import { afterEach, describe, expect, test, vi } from 'vitest';
6
- import { USERS_API_VERSION } from '../../../actions/users/apiVersion.js';
6
+ import { PROJECTS_API_VERSION } from '../../../services/projects.js';
7
+ import { USERS_API_VERSION } from '../../../services/user.js';
8
+ import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
7
9
  import { List } from '../list.js';
8
- vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', async ()=>{
10
+ const testProjectId = 'test-project';
11
+ const defaultMocks = {
12
+ cliConfig: {
13
+ api: {
14
+ projectId: testProjectId
15
+ }
16
+ },
17
+ projectRoot: {
18
+ directory: '/test/path',
19
+ path: '/test/path/sanity.config.ts',
20
+ type: 'studio'
21
+ },
22
+ token: 'test-token'
23
+ };
24
+ vi.mock('@sanity/cli-core', async ()=>{
25
+ const actual = await vi.importActual('@sanity/cli-core');
9
26
  return {
10
- findProjectRoot: vi.fn().mockResolvedValue({
11
- directory: '/test/path',
12
- root: '/test/path',
13
- type: 'studio'
14
- })
15
- };
16
- });
17
- vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', async ()=>{
18
- return {
19
- getCliConfig: vi.fn().mockResolvedValue({
20
- api: {
21
- projectId: 'test-project'
22
- }
23
- })
27
+ ...actual,
28
+ getProjectCliClient: vi.fn()
24
29
  };
25
30
  });
31
+ const mockGetProjectCliClient = vi.mocked(getProjectCliClient);
26
32
  describe('#list', ()=>{
27
33
  afterEach(()=>{
28
34
  vi.clearAllMocks();
@@ -38,29 +44,27 @@ describe('#list', ()=>{
38
44
  expect(stdout).toContain('List all users of the project');
39
45
  });
40
46
  test('displays users correctly', async ()=>{
41
- mockApi({
42
- apiVersion: USERS_API_VERSION,
43
- query: {
44
- includeFeatures: 'false'
45
- },
46
- uri: '/projects/test-project'
47
- }).reply(200, {
48
- members: [
49
- {
50
- id: 'user1',
51
- isRobot: false,
52
- role: 'developer'
53
- },
54
- {
55
- id: 'user2',
56
- isRobot: false,
57
- role: 'admin'
58
- }
59
- ]
47
+ mockGetProjectCliClient.mockResolvedValue({
48
+ projects: {
49
+ getById: vi.fn().mockResolvedValue({
50
+ members: [
51
+ {
52
+ id: 'user1',
53
+ isRobot: false,
54
+ role: 'developer'
55
+ },
56
+ {
57
+ id: 'user2',
58
+ isRobot: false,
59
+ role: 'admin'
60
+ }
61
+ ]
62
+ })
63
+ }
60
64
  });
61
65
  mockApi({
62
- apiVersion: USERS_API_VERSION,
63
- uri: '/invitations/project/test-project'
66
+ apiVersion: PROJECTS_API_VERSION,
67
+ uri: `/invitations/project/${testProjectId}`
64
68
  }).reply(200, []);
65
69
  mockApi({
66
70
  apiVersion: USERS_API_VERSION,
@@ -77,33 +81,33 @@ describe('#list', ()=>{
77
81
  id: 'user2'
78
82
  }
79
83
  ]);
80
- const { stdout } = await testCommand(List);
84
+ const { stdout } = await testCommand(List, [], {
85
+ mocks: defaultMocks
86
+ });
81
87
  expect(stdout).toMatchSnapshot();
82
88
  });
83
89
  test('displays pending invitations correctly', async ()=>{
84
- mockApi({
85
- apiVersion: USERS_API_VERSION,
86
- query: {
87
- includeFeatures: 'false'
88
- },
89
- uri: '/projects/test-project'
90
- }).reply(200, {
91
- members: [
92
- {
93
- id: 'user1',
94
- isRobot: false,
95
- role: 'developer'
96
- },
97
- {
98
- id: 'user2',
99
- isRobot: false,
100
- role: 'admin'
101
- }
102
- ]
90
+ mockGetProjectCliClient.mockResolvedValue({
91
+ projects: {
92
+ getById: vi.fn().mockResolvedValue({
93
+ members: [
94
+ {
95
+ id: 'user1',
96
+ isRobot: false,
97
+ role: 'developer'
98
+ },
99
+ {
100
+ id: 'user2',
101
+ isRobot: false,
102
+ role: 'admin'
103
+ }
104
+ ]
105
+ })
106
+ }
103
107
  });
104
108
  mockApi({
105
- apiVersion: USERS_API_VERSION,
106
- uri: '/invitations/project/test-project'
109
+ apiVersion: PROJECTS_API_VERSION,
110
+ uri: `/invitations/project/${testProjectId}`
107
111
  }).reply(200, [
108
112
  {
109
113
  createdAt: '2023-02-01',
@@ -130,56 +134,51 @@ describe('#list', ()=>{
130
134
  id: 'user2'
131
135
  }
132
136
  ]);
133
- const { stdout } = await testCommand(List);
137
+ const { stdout } = await testCommand(List, [], {
138
+ mocks: defaultMocks
139
+ });
134
140
  expect(stdout).toMatchSnapshot();
135
141
  });
136
142
  test('displays an error if the API request fails', async ()=>{
143
+ // Wait for 50ms to ensure the Promise.all is called
144
+ setTimeout(()=>mockGetProjectCliClient.mockRejectedValue(new Error('Internal server error')), 50);
137
145
  mockApi({
138
- apiVersion: USERS_API_VERSION,
139
- query: {
140
- includeFeatures: 'false'
141
- },
142
- uri: '/projects/test-project'
143
- }).reply(500, {
144
- message: 'Internal Server Error'
145
- });
146
- mockApi({
147
- apiVersion: USERS_API_VERSION,
148
- uri: '/invitations/project/test-project'
146
+ apiVersion: PROJECTS_API_VERSION,
147
+ uri: `/invitations/project/${testProjectId}`
149
148
  }).reply(200, []);
150
- const { error } = await testCommand(List);
149
+ const { error } = await testCommand(List, [], {
150
+ mocks: defaultMocks
151
+ });
151
152
  expect(error).toBeInstanceOf(Error);
152
- expect(error?.message).toContain('Error fetching members for test-project');
153
+ expect(error?.message).toContain(`Error fetching members for ${testProjectId}`);
153
154
  });
154
155
  test('sorts by role when --sort role is specified', async ()=>{
155
- mockApi({
156
- apiVersion: USERS_API_VERSION,
157
- query: {
158
- includeFeatures: 'false'
159
- },
160
- uri: '/projects/test-project'
161
- }).reply(200, {
162
- members: [
163
- {
164
- id: 'user1',
165
- isRobot: false,
166
- role: 'developer'
167
- },
168
- {
169
- id: 'user2',
170
- isRobot: false,
171
- role: 'admin'
172
- },
173
- {
174
- id: 'user3',
175
- isRobot: false,
176
- role: 'viewer'
177
- }
178
- ]
156
+ mockGetProjectCliClient.mockResolvedValue({
157
+ projects: {
158
+ getById: vi.fn().mockResolvedValue({
159
+ members: [
160
+ {
161
+ id: 'user1',
162
+ isRobot: false,
163
+ role: 'developer'
164
+ },
165
+ {
166
+ id: 'user2',
167
+ isRobot: false,
168
+ role: 'admin'
169
+ },
170
+ {
171
+ id: 'user3',
172
+ isRobot: false,
173
+ role: 'viewer'
174
+ }
175
+ ]
176
+ })
177
+ }
179
178
  });
180
179
  mockApi({
181
- apiVersion: USERS_API_VERSION,
182
- uri: '/invitations/project/test-project'
180
+ apiVersion: PROJECTS_API_VERSION,
181
+ uri: `/invitations/project/${testProjectId}`
183
182
  }).reply(200, []);
184
183
  mockApi({
185
184
  apiVersion: USERS_API_VERSION,
@@ -204,7 +203,9 @@ describe('#list', ()=>{
204
203
  const { stdout } = await testCommand(List, [
205
204
  '--sort',
206
205
  'role'
207
- ]);
206
+ ], {
207
+ mocks: defaultMocks
208
+ });
208
209
  // Check that we have all the roles in the output
209
210
  expect(stdout).toMatchSnapshot();
210
211
  // Split by lines and remove empty lines
@@ -222,34 +223,32 @@ describe('#list', ()=>{
222
223
  expect(developerIndex).toBeLessThan(viewerIndex);
223
224
  });
224
225
  test('sorts in descending order when --order desc is specified', async ()=>{
225
- mockApi({
226
- apiVersion: USERS_API_VERSION,
227
- query: {
228
- includeFeatures: 'false'
229
- },
230
- uri: '/projects/test-project'
231
- }).reply(200, {
232
- members: [
233
- {
234
- id: 'user1',
235
- isRobot: false,
236
- role: 'developer'
237
- },
238
- {
239
- id: 'user2',
240
- isRobot: false,
241
- role: 'admin'
242
- },
243
- {
244
- id: 'user3',
245
- isRobot: false,
246
- role: 'viewer'
247
- }
248
- ]
226
+ mockGetProjectCliClient.mockResolvedValue({
227
+ projects: {
228
+ getById: vi.fn().mockResolvedValue({
229
+ members: [
230
+ {
231
+ id: 'user1',
232
+ isRobot: false,
233
+ role: 'developer'
234
+ },
235
+ {
236
+ id: 'user2',
237
+ isRobot: false,
238
+ role: 'admin'
239
+ },
240
+ {
241
+ id: 'user3',
242
+ isRobot: false,
243
+ role: 'viewer'
244
+ }
245
+ ]
246
+ })
247
+ }
249
248
  });
250
249
  mockApi({
251
- apiVersion: USERS_API_VERSION,
252
- uri: '/invitations/project/test-project'
250
+ apiVersion: PROJECTS_API_VERSION,
251
+ uri: `/invitations/project/${testProjectId}`
253
252
  }).reply(200, []);
254
253
  mockApi({
255
254
  apiVersion: USERS_API_VERSION,
@@ -274,7 +273,9 @@ describe('#list', ()=>{
274
273
  const { stdout } = await testCommand(List, [
275
274
  '--order',
276
275
  'desc'
277
- ]);
276
+ ], {
277
+ mocks: defaultMocks
278
+ });
278
279
  // Check that we have all the dates in the output
279
280
  expect(stdout).toContain('2023-01-01');
280
281
  expect(stdout).toContain('2023-01-02');
@@ -292,25 +293,23 @@ describe('#list', ()=>{
292
293
  expect(line2023_01_02).toBeLessThan(line2023_01_01);
293
294
  });
294
295
  test('excludes invitations when --no-invitations is specified', async ()=>{
295
- mockApi({
296
- apiVersion: USERS_API_VERSION,
297
- query: {
298
- includeFeatures: 'false'
299
- },
300
- uri: '/projects/test-project'
301
- }).reply(200, {
302
- members: [
303
- {
304
- id: 'user1',
305
- isRobot: false,
306
- role: 'developer'
307
- },
308
- {
309
- id: 'user2',
310
- isRobot: false,
311
- role: 'admin'
312
- }
313
- ]
296
+ mockGetProjectCliClient.mockResolvedValue({
297
+ projects: {
298
+ getById: vi.fn().mockResolvedValue({
299
+ members: [
300
+ {
301
+ id: 'user1',
302
+ isRobot: false,
303
+ role: 'developer'
304
+ },
305
+ {
306
+ id: 'user2',
307
+ isRobot: false,
308
+ role: 'admin'
309
+ }
310
+ ]
311
+ })
312
+ }
314
313
  });
315
314
  mockApi({
316
315
  apiVersion: USERS_API_VERSION,
@@ -329,40 +328,40 @@ describe('#list', ()=>{
329
328
  ]);
330
329
  const { stdout } = await testCommand(List, [
331
330
  '--no-invitations'
332
- ]);
331
+ ], {
332
+ mocks: defaultMocks
333
+ });
333
334
  // Check that pending invitation is not in the output
334
335
  expect(stdout).not.toContain('pending@example.com');
335
336
  expect(stdout).not.toContain('viewer');
336
337
  });
337
338
  test('excludes robots when --no-robots is specified', async ()=>{
338
- mockApi({
339
- apiVersion: USERS_API_VERSION,
340
- query: {
341
- includeFeatures: 'false'
342
- },
343
- uri: '/projects/test-project'
344
- }).reply(200, {
345
- members: [
346
- {
347
- id: 'user1',
348
- isRobot: false,
349
- role: 'developer'
350
- },
351
- {
352
- id: 'user2',
353
- isRobot: false,
354
- role: 'admin'
355
- },
356
- {
357
- id: 'robot1',
358
- isRobot: true,
359
- role: 'viewer'
360
- }
361
- ]
339
+ mockGetProjectCliClient.mockResolvedValue({
340
+ projects: {
341
+ getById: vi.fn().mockResolvedValue({
342
+ members: [
343
+ {
344
+ id: 'user1',
345
+ isRobot: false,
346
+ role: 'developer'
347
+ },
348
+ {
349
+ id: 'user2',
350
+ isRobot: false,
351
+ role: 'admin'
352
+ },
353
+ {
354
+ id: 'robot1',
355
+ isRobot: true,
356
+ role: 'viewer'
357
+ }
358
+ ]
359
+ })
360
+ }
362
361
  });
363
362
  mockApi({
364
- apiVersion: USERS_API_VERSION,
365
- uri: '/invitations/project/test-project'
363
+ apiVersion: PROJECTS_API_VERSION,
364
+ uri: `/invitations/project/${testProjectId}`
366
365
  }).reply(200, []);
367
366
  mockApi({
368
367
  apiVersion: USERS_API_VERSION,
@@ -381,20 +380,27 @@ describe('#list', ()=>{
381
380
  ]);
382
381
  const { stdout } = await testCommand(List, [
383
382
  '--no-robots'
384
- ]);
383
+ ], {
384
+ mocks: defaultMocks
385
+ });
385
386
  // Check that robot is not in the output
386
387
  expect(stdout).not.toContain('robot1');
387
388
  expect(stdout).not.toContain('Robot One');
388
389
  });
389
390
  test('throws error when no project ID is found', async ()=>{
390
- vi.mocked(getCliConfig).mockResolvedValueOnce({
391
- api: {
392
- projectId: undefined
391
+ const { error } = await testCommand(List, [], {
392
+ mocks: {
393
+ ...defaultMocks,
394
+ cliConfig: {
395
+ api: {
396
+ projectId: undefined
397
+ }
398
+ }
393
399
  }
394
400
  });
395
- const { error } = await testCommand(List);
396
401
  expect(error).toBeInstanceOf(Error);
397
- expect(error?.message).toEqual('No project ID found');
402
+ expect(error?.message).toEqual(NO_PROJECT_ID);
403
+ expect(error?.oclif?.exit).toBe(1);
398
404
  });
399
405
  });
400
406
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/users/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {USERS_API_VERSION} from '../../../actions/users/apiVersion.js'\nimport {List} from '../list.js'\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', async () => {\n return {\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n }\n})\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', async () => {\n return {\n getCliConfig: vi.fn().mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n }),\n }\n})\n\ndescribe('#list', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['users list', '--help'])\n\n expect(stdout).toContain('List all users of the project')\n })\n\n test('displays users correctly', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n query: {includeFeatures: 'false'},\n uri: '/projects/test-project',\n }).reply(200, {\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n ],\n })\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/invitations/project/test-project',\n }).reply(200, [])\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n ])\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toMatchSnapshot()\n })\n\n test('displays pending invitations correctly', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n query: {includeFeatures: 'false'},\n uri: '/projects/test-project',\n }).reply(200, {\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n ],\n })\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/invitations/project/test-project',\n }).reply(200, [\n {\n createdAt: '2023-02-01',\n email: 'pending@example.com',\n id: 'invite1',\n invitedByUser: {id: 'user2'},\n role: 'viewer',\n },\n ])\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n ])\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toMatchSnapshot()\n })\n\n test('displays an error if the API request fails', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n query: {includeFeatures: 'false'},\n uri: '/projects/test-project',\n }).reply(500, {message: 'Internal Server Error'})\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/invitations/project/test-project',\n }).reply(200, [])\n\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Error fetching members for test-project')\n })\n\n test('sorts by role when --sort role is specified', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n query: {includeFeatures: 'false'},\n uri: '/projects/test-project',\n }).reply(200, {\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n {id: 'user3', isRobot: false, role: 'viewer'},\n ],\n })\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/invitations/project/test-project',\n }).reply(200, [])\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2,user3',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n {createdAt: '2023-01-03', displayName: 'User Three', id: 'user3'},\n ])\n\n const {stdout} = await testCommand(List, ['--sort', 'role'])\n\n // Check that we have all the roles in the output\n expect(stdout).toMatchSnapshot()\n\n // Split by lines and remove empty lines\n const lines = stdout.split('\\n').filter(Boolean)\n\n // Find the indices of lines containing each role\n const adminIndex = lines.findIndex((line) => line.includes('admin'))\n const developerIndex = lines.findIndex((line) => line.includes('developer'))\n const viewerIndex = lines.findIndex((line) => line.includes('viewer'))\n\n // Verify they all exist\n expect(adminIndex).toBeGreaterThan(-1)\n expect(developerIndex).toBeGreaterThan(-1)\n expect(viewerIndex).toBeGreaterThan(-1)\n\n // Now check the sort order (admin should come first alphabetically)\n expect(adminIndex).toBeLessThan(developerIndex)\n expect(developerIndex).toBeLessThan(viewerIndex)\n })\n\n test('sorts in descending order when --order desc is specified', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n query: {includeFeatures: 'false'},\n uri: '/projects/test-project',\n }).reply(200, {\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n {id: 'user3', isRobot: false, role: 'viewer'},\n ],\n })\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/invitations/project/test-project',\n }).reply(200, [])\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2,user3',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n {createdAt: '2023-01-03', displayName: 'User Three', id: 'user3'},\n ])\n\n const {stdout} = await testCommand(List, ['--order', 'desc'])\n\n // Check that we have all the dates in the output\n expect(stdout).toContain('2023-01-01')\n expect(stdout).toContain('2023-01-02')\n expect(stdout).toContain('2023-01-03')\n\n // By default, it sorts by date, so we need to check the reverse chronological order\n const lines = stdout.split('\\n').filter(Boolean)\n\n const line2023_01_03 = lines.findIndex((line) => line.includes('2023-01-03'))\n const line2023_01_02 = lines.findIndex((line) => line.includes('2023-01-02'))\n const line2023_01_01 = lines.findIndex((line) => line.includes('2023-01-01'))\n\n expect(line2023_01_03).toBeGreaterThan(0) // First line is header\n expect(line2023_01_02).toBeGreaterThan(0)\n expect(line2023_01_01).toBeGreaterThan(0)\n\n // Check the order\n expect(line2023_01_03).toBeLessThan(line2023_01_02)\n expect(line2023_01_02).toBeLessThan(line2023_01_01)\n })\n\n test('excludes invitations when --no-invitations is specified', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n query: {includeFeatures: 'false'},\n uri: '/projects/test-project',\n }).reply(200, {\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n ],\n })\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n ])\n\n const {stdout} = await testCommand(List, ['--no-invitations'])\n\n // Check that pending invitation is not in the output\n expect(stdout).not.toContain('pending@example.com')\n expect(stdout).not.toContain('viewer')\n })\n\n test('excludes robots when --no-robots is specified', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n query: {includeFeatures: 'false'},\n uri: '/projects/test-project',\n }).reply(200, {\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n {id: 'robot1', isRobot: true, role: 'viewer'},\n ],\n })\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/invitations/project/test-project',\n }).reply(200, [])\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n ])\n\n const {stdout} = await testCommand(List, ['--no-robots'])\n\n // Check that robot is not in the output\n expect(stdout).not.toContain('robot1')\n expect(stdout).not.toContain('Robot One')\n })\n\n test('throws error when no project ID is found', async () => {\n vi.mocked(getCliConfig).mockResolvedValueOnce({\n api: {\n projectId: undefined,\n },\n })\n\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual('No project ID found')\n })\n})\n"],"names":["runCommand","getCliConfig","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","USERS_API_VERSION","List","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","api","projectId","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toContain","apiVersion","query","includeFeatures","uri","reply","members","id","isRobot","role","createdAt","displayName","toMatchSnapshot","email","invitedByUser","message","error","toBeInstanceOf","Error","lines","split","filter","Boolean","adminIndex","findIndex","line","includes","developerIndex","viewerIndex","toBeGreaterThan","toBeLessThan","line2023_01_03","line2023_01_02","line2023_01_01","not","mocked","mockResolvedValueOnce","undefined"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/users/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getProjectCliClient} from '@sanity/cli-core'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {PROJECTS_API_VERSION} from '../../../services/projects.js'\nimport {USERS_API_VERSION} from '../../../services/user.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {List} from '../list.js'\n\nconst testProjectId = 'test-project'\n\nconst defaultMocks = {\n cliConfig: {api: {projectId: testProjectId}},\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\nvi.mock('@sanity/cli-core', async () => {\n const actual = await vi.importActual('@sanity/cli-core')\n return {\n ...actual,\n getProjectCliClient: vi.fn(),\n }\n})\n\nconst mockGetProjectCliClient = vi.mocked(getProjectCliClient)\n\ndescribe('#list', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['users list', '--help'])\n\n expect(stdout).toContain('List all users of the project')\n })\n\n test('displays users correctly', async () => {\n mockGetProjectCliClient.mockResolvedValue({\n projects: {\n getById: vi.fn().mockResolvedValue({\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n ],\n }),\n },\n } as never)\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n ])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toMatchSnapshot()\n })\n\n test('displays pending invitations correctly', async () => {\n mockGetProjectCliClient.mockResolvedValue({\n projects: {\n getById: vi.fn().mockResolvedValue({\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n ],\n }),\n },\n } as never)\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, [\n {\n createdAt: '2023-02-01',\n email: 'pending@example.com',\n id: 'invite1',\n invitedByUser: {id: 'user2'},\n role: 'viewer',\n },\n ])\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n ])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toMatchSnapshot()\n })\n\n test('displays an error if the API request fails', async () => {\n // Wait for 50ms to ensure the Promise.all is called\n setTimeout(\n () => mockGetProjectCliClient.mockRejectedValue(new Error('Internal server error')),\n 50,\n )\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, [])\n\n const {error} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain(`Error fetching members for ${testProjectId}`)\n })\n\n test('sorts by role when --sort role is specified', async () => {\n mockGetProjectCliClient.mockResolvedValue({\n projects: {\n getById: vi.fn().mockResolvedValue({\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n {id: 'user3', isRobot: false, role: 'viewer'},\n ],\n }),\n },\n } as never)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2,user3',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n {createdAt: '2023-01-03', displayName: 'User Three', id: 'user3'},\n ])\n\n const {stdout} = await testCommand(List, ['--sort', 'role'], {mocks: defaultMocks})\n\n // Check that we have all the roles in the output\n expect(stdout).toMatchSnapshot()\n\n // Split by lines and remove empty lines\n const lines = stdout.split('\\n').filter(Boolean)\n\n // Find the indices of lines containing each role\n const adminIndex = lines.findIndex((line) => line.includes('admin'))\n const developerIndex = lines.findIndex((line) => line.includes('developer'))\n const viewerIndex = lines.findIndex((line) => line.includes('viewer'))\n\n // Verify they all exist\n expect(adminIndex).toBeGreaterThan(-1)\n expect(developerIndex).toBeGreaterThan(-1)\n expect(viewerIndex).toBeGreaterThan(-1)\n\n // Now check the sort order (admin should come first alphabetically)\n expect(adminIndex).toBeLessThan(developerIndex)\n expect(developerIndex).toBeLessThan(viewerIndex)\n })\n\n test('sorts in descending order when --order desc is specified', async () => {\n mockGetProjectCliClient.mockResolvedValue({\n projects: {\n getById: vi.fn().mockResolvedValue({\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n {id: 'user3', isRobot: false, role: 'viewer'},\n ],\n }),\n },\n } as never)\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2,user3',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n {createdAt: '2023-01-03', displayName: 'User Three', id: 'user3'},\n ])\n\n const {stdout} = await testCommand(List, ['--order', 'desc'], {mocks: defaultMocks})\n\n // Check that we have all the dates in the output\n expect(stdout).toContain('2023-01-01')\n expect(stdout).toContain('2023-01-02')\n expect(stdout).toContain('2023-01-03')\n\n // By default, it sorts by date, so we need to check the reverse chronological order\n const lines = stdout.split('\\n').filter(Boolean)\n\n const line2023_01_03 = lines.findIndex((line) => line.includes('2023-01-03'))\n const line2023_01_02 = lines.findIndex((line) => line.includes('2023-01-02'))\n const line2023_01_01 = lines.findIndex((line) => line.includes('2023-01-01'))\n\n expect(line2023_01_03).toBeGreaterThan(0) // First line is header\n expect(line2023_01_02).toBeGreaterThan(0)\n expect(line2023_01_01).toBeGreaterThan(0)\n\n // Check the order\n expect(line2023_01_03).toBeLessThan(line2023_01_02)\n expect(line2023_01_02).toBeLessThan(line2023_01_01)\n })\n\n test('excludes invitations when --no-invitations is specified', async () => {\n mockGetProjectCliClient.mockResolvedValue({\n projects: {\n getById: vi.fn().mockResolvedValue({\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n ],\n }),\n },\n } as never)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n ])\n\n const {stdout} = await testCommand(List, ['--no-invitations'], {mocks: defaultMocks})\n\n // Check that pending invitation is not in the output\n expect(stdout).not.toContain('pending@example.com')\n expect(stdout).not.toContain('viewer')\n })\n\n test('excludes robots when --no-robots is specified', async () => {\n mockGetProjectCliClient.mockResolvedValue({\n projects: {\n getById: vi.fn().mockResolvedValue({\n members: [\n {id: 'user1', isRobot: false, role: 'developer'},\n {id: 'user2', isRobot: false, role: 'admin'},\n {id: 'robot1', isRobot: true, role: 'viewer'},\n ],\n }),\n },\n } as never)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/users/user1,user2',\n }).reply(200, [\n {createdAt: '2023-01-01', displayName: 'User One', id: 'user1'},\n {createdAt: '2023-01-02', displayName: 'User Two', id: 'user2'},\n ])\n\n const {stdout} = await testCommand(List, ['--no-robots'], {mocks: defaultMocks})\n\n // Check that robot is not in the output\n expect(stdout).not.toContain('robot1')\n expect(stdout).not.toContain('Robot One')\n })\n\n test('throws error when no project ID is found', async () => {\n const {error} = await testCommand(List, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","getProjectCliClient","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","PROJECTS_API_VERSION","USERS_API_VERSION","NO_PROJECT_ID","List","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","mock","actual","importActual","fn","mockGetProjectCliClient","mocked","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toContain","mockResolvedValue","projects","getById","members","id","isRobot","role","apiVersion","uri","reply","createdAt","displayName","mocks","toMatchSnapshot","email","invitedByUser","setTimeout","mockRejectedValue","Error","error","toBeInstanceOf","message","lines","split","filter","Boolean","adminIndex","findIndex","line","includes","developerIndex","viewerIndex","toBeGreaterThan","toBeLessThan","line2023_01_03","line2023_01_02","line2023_01_01","not","undefined","oclif","exit","toBe"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { Args, Flags } from '@oclif/core';
2
2
  import { SanityCommand, subdebug } from '@sanity/cli-core';
3
3
  import { input, select } from '@sanity/cli-core/ux';
4
- import { USERS_API_VERSION } from '../../actions/users/apiVersion.js';
5
4
  import { validateEmail } from '../../actions/users/validateEmail.js';
5
+ import { getProjectRoles, inviteUser } from '../../services/projects.js';
6
6
  import { NO_PROJECT_ID } from '../../util/errorMessages.js';
7
7
  const QUOTA_ERROR_MESSAGE = 'Project is already at user quota, add billing details to the project in order to allow overage charges.';
8
8
  const usersInviteDebug = subdebug('users:invite');
@@ -37,10 +37,6 @@ export class UsersInviteCommand extends SanityCommand {
37
37
  async run() {
38
38
  const { email: selectedEmail } = this.args;
39
39
  const { role: selectedRole } = this.flags;
40
- const client = await this.getGlobalApiClient({
41
- apiVersion: USERS_API_VERSION,
42
- requireUser: true
43
- });
44
40
  const projectId = await this.getProjectId();
45
41
  if (!projectId) {
46
42
  this.error(NO_PROJECT_ID, {
@@ -49,9 +45,7 @@ export class UsersInviteCommand extends SanityCommand {
49
45
  }
50
46
  let roles;
51
47
  try {
52
- roles = (await client.request({
53
- uri: `/projects/${projectId}/roles`
54
- })).filter((role)=>role.appliesToUsers);
48
+ roles = (await getProjectRoles(projectId)).filter((role)=>role.appliesToUsers);
55
49
  } catch (error) {
56
50
  usersInviteDebug('Error fetching roles', error);
57
51
  this.error('Error fetching roles', {
@@ -67,15 +61,10 @@ export class UsersInviteCommand extends SanityCommand {
67
61
  });
68
62
  }
69
63
  try {
70
- await client.request({
71
- body: {
72
- email,
73
- role: role.name
74
- },
75
- maxRedirects: 0,
76
- method: 'POST',
77
- uri: `/invitations/project/${projectId}`,
78
- useGlobalApi: true
64
+ await inviteUser({
65
+ email,
66
+ projectId,
67
+ role: role.name
79
68
  });
80
69
  this.log(`Invitation sent to ${email}`);
81
70
  } catch (error) {