@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,10 +1,9 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { getCliConfig } from '@sanity/cli-core';
3
2
  import { input, select } from '@sanity/cli-core/ux';
4
3
  import { mockApi, testCommand } from '@sanity/cli-test';
5
4
  import nock from 'nock';
6
5
  import { afterEach, describe, expect, test, vi } from 'vitest';
7
- import { USERS_API_VERSION } from '../../../actions/users/apiVersion.js';
6
+ import { PROJECTS_API_VERSION } from '../../../services/projects.js';
8
7
  import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
9
8
  import { UsersInviteCommand } from '../invite.js';
10
9
  vi.mock('@sanity/cli-core/ux', async ()=>{
@@ -15,24 +14,20 @@ vi.mock('@sanity/cli-core/ux', async ()=>{
15
14
  select: vi.fn()
16
15
  };
17
16
  });
18
- vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', async ()=>{
19
- return {
20
- findProjectRoot: vi.fn().mockResolvedValue({
21
- directory: '/test/path',
22
- root: '/test/path',
23
- type: 'studio'
24
- })
25
- };
26
- });
27
- vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', async ()=>{
28
- return {
29
- getCliConfig: vi.fn().mockResolvedValue({
30
- api: {
31
- projectId: 'test-project'
32
- }
33
- })
34
- };
35
- });
17
+ const testProjectId = 'test-project';
18
+ const defaultMocks = {
19
+ cliConfig: {
20
+ api: {
21
+ projectId: testProjectId
22
+ }
23
+ },
24
+ projectRoot: {
25
+ directory: '/test/path',
26
+ path: '/test/path/sanity.config.ts',
27
+ type: 'studio'
28
+ },
29
+ token: 'test-token'
30
+ };
36
31
  const mockRoles = [
37
32
  {
38
33
  appliesToRobots: false,
@@ -41,7 +36,7 @@ const mockRoles = [
41
36
  grants: {},
42
37
  isCustom: false,
43
38
  name: 'administrator',
44
- projectId: 'test-project',
39
+ projectId: testProjectId,
45
40
  title: 'Administrator'
46
41
  },
47
42
  {
@@ -51,7 +46,7 @@ const mockRoles = [
51
46
  grants: {},
52
47
  isCustom: false,
53
48
  name: 'developer',
54
- projectId: 'test-project',
49
+ projectId: testProjectId,
55
50
  title: 'Developer'
56
51
  },
57
52
  {
@@ -61,7 +56,7 @@ const mockRoles = [
61
56
  grants: {},
62
57
  isCustom: false,
63
58
  name: 'viewer',
64
- projectId: 'test-project',
59
+ projectId: testProjectId,
65
60
  title: 'Viewer'
66
61
  },
67
62
  {
@@ -71,7 +66,7 @@ const mockRoles = [
71
66
  grants: {},
72
67
  isCustom: false,
73
68
  name: 'robot',
74
- projectId: 'test-project',
69
+ projectId: testProjectId,
75
70
  title: 'Robot'
76
71
  }
77
72
  ];
@@ -92,77 +87,87 @@ describe('#invite', ()=>{
92
87
  });
93
88
  test('invites user with email and role provided via flags', async ()=>{
94
89
  mockApi({
95
- apiVersion: USERS_API_VERSION,
96
- uri: '/projects/test-project/roles'
90
+ apiVersion: PROJECTS_API_VERSION,
91
+ uri: `/projects/${testProjectId}/roles`
97
92
  }).reply(200, mockRoles);
98
93
  mockApi({
99
- apiVersion: USERS_API_VERSION,
94
+ apiVersion: PROJECTS_API_VERSION,
100
95
  method: 'post',
101
- uri: '/invitations/project/test-project'
96
+ uri: `/invitations/project/${testProjectId}`
102
97
  }).reply(200, {});
103
98
  const { stdout } = await testCommand(UsersInviteCommand, [
104
99
  'test@example.com',
105
100
  '--role',
106
101
  'developer'
107
- ]);
102
+ ], {
103
+ mocks: defaultMocks
104
+ });
108
105
  expect(stdout).toContain('Invitation sent to test@example.com');
109
106
  });
110
107
  test('invites user with email provided via args and role as flag', async ()=>{
111
108
  mockApi({
112
- apiVersion: USERS_API_VERSION,
113
- uri: '/projects/test-project/roles'
109
+ apiVersion: PROJECTS_API_VERSION,
110
+ uri: `/projects/${testProjectId}/roles`
114
111
  }).reply(200, mockRoles);
115
112
  mockApi({
116
- apiVersion: USERS_API_VERSION,
113
+ apiVersion: PROJECTS_API_VERSION,
117
114
  method: 'post',
118
- uri: '/invitations/project/test-project'
115
+ uri: `/invitations/project/${testProjectId}`
119
116
  }).reply(200, {});
120
117
  const { stdout } = await testCommand(UsersInviteCommand, [
121
118
  'user@example.com',
122
119
  '--role',
123
120
  'administrator'
124
- ]);
121
+ ], {
122
+ mocks: defaultMocks
123
+ });
125
124
  expect(stdout).toContain('Invitation sent to user@example.com');
126
125
  });
127
126
  test('exits when role is not found', async ()=>{
128
127
  mockApi({
129
- apiVersion: USERS_API_VERSION,
130
- uri: '/projects/test-project/roles'
128
+ apiVersion: PROJECTS_API_VERSION,
129
+ uri: `/projects/${testProjectId}/roles`
131
130
  }).reply(200, mockRoles);
132
131
  const { error } = await testCommand(UsersInviteCommand, [
133
132
  'test@example.com',
134
133
  '--role',
135
134
  'invalid-role'
136
- ]);
135
+ ], {
136
+ mocks: defaultMocks
137
+ });
137
138
  expect(error).toBeInstanceOf(Error);
138
139
  expect(error?.message).toContain('Role name "invalid-role" not found');
139
140
  expect(error?.message).toContain('Available roles:');
140
141
  expect(error?.oclif?.exit).toBe(1);
141
142
  });
142
143
  test('exits when project ID is not found', async ()=>{
143
- vi.mocked(getCliConfig).mockResolvedValueOnce({
144
- api: {
145
- projectId: undefined
146
- }
147
- });
148
144
  const { error } = await testCommand(UsersInviteCommand, [
149
145
  'test@example.com',
150
146
  '--role',
151
147
  'developer'
152
- ]);
148
+ ], {
149
+ mocks: {
150
+ ...defaultMocks,
151
+ cliConfig: {
152
+ api: {
153
+ projectId: undefined
154
+ }
155
+ }
156
+ }
157
+ });
153
158
  expect(error).toBeInstanceOf(Error);
154
159
  expect(error?.message).toEqual(NO_PROJECT_ID);
155
160
  expect(error?.oclif?.exit).toBe(1);
156
161
  });
157
162
  test('handles 402 quota error', async ()=>{
158
163
  mockApi({
159
- apiVersion: USERS_API_VERSION,
160
- uri: '/projects/test-project/roles'
164
+ apiVersion: PROJECTS_API_VERSION,
165
+ uri: `/projects/${testProjectId}/roles`
161
166
  }).reply(200, mockRoles);
162
167
  mockApi({
163
- apiVersion: USERS_API_VERSION,
168
+ apiVersion: PROJECTS_API_VERSION,
164
169
  method: 'post',
165
- uri: '/invitations/project/test-project'
170
+ uri: `/invitations/project/${testProjectId}`
166
171
  }).reply(402, {
167
172
  message: 'Payment required'
168
173
  });
@@ -170,20 +175,22 @@ describe('#invite', ()=>{
170
175
  'test@example.com',
171
176
  '--role',
172
177
  'developer'
173
- ]);
178
+ ], {
179
+ mocks: defaultMocks
180
+ });
174
181
  expect(error).toBeInstanceOf(Error);
175
182
  expect(error?.message).toContain('Project is already at user quota, add billing details to the project in order to allow overage charges.');
176
183
  expect(error?.oclif?.exit).toBe(1);
177
184
  });
178
185
  test('handles API errors during invitation', async ()=>{
179
186
  mockApi({
180
- apiVersion: USERS_API_VERSION,
181
- uri: '/projects/test-project/roles'
187
+ apiVersion: PROJECTS_API_VERSION,
188
+ uri: `/projects/${testProjectId}/roles`
182
189
  }).reply(200, mockRoles);
183
190
  mockApi({
184
- apiVersion: USERS_API_VERSION,
191
+ apiVersion: PROJECTS_API_VERSION,
185
192
  method: 'post',
186
- uri: '/invitations/project/test-project'
193
+ uri: `/invitations/project/${testProjectId}`
187
194
  }).reply(500, {
188
195
  message: 'Internal server error'
189
196
  });
@@ -191,15 +198,17 @@ describe('#invite', ()=>{
191
198
  'test@example.com',
192
199
  '--role',
193
200
  'developer'
194
- ]);
201
+ ], {
202
+ mocks: defaultMocks
203
+ });
195
204
  expect(error).toBeInstanceOf(Error);
196
205
  expect(error?.message).toContain('Error inviting user');
197
206
  expect(error?.oclif?.exit).toBe(1);
198
207
  });
199
208
  test('handles API errors when fetching roles', async ()=>{
200
209
  mockApi({
201
- apiVersion: USERS_API_VERSION,
202
- uri: '/projects/test-project/roles'
210
+ apiVersion: PROJECTS_API_VERSION,
211
+ uri: `/projects/${testProjectId}/roles`
203
212
  }).reply(500, {
204
213
  message: 'Internal server error'
205
214
  });
@@ -207,21 +216,25 @@ describe('#invite', ()=>{
207
216
  'test@example.com',
208
217
  '--role',
209
218
  'developer'
210
- ]);
219
+ ], {
220
+ mocks: defaultMocks
221
+ });
211
222
  expect(error).toBeInstanceOf(Error);
212
223
  expect(error?.message).toContain('Error fetching roles');
213
224
  expect(error?.oclif?.exit).toBe(1);
214
225
  });
215
226
  test('exits when trying to assign role that does not apply to users', async ()=>{
216
227
  mockApi({
217
- apiVersion: USERS_API_VERSION,
218
- uri: '/projects/test-project/roles'
228
+ apiVersion: PROJECTS_API_VERSION,
229
+ uri: `/projects/${testProjectId}/roles`
219
230
  }).reply(200, mockRoles);
220
231
  const { error } = await testCommand(UsersInviteCommand, [
221
232
  'test@example.com',
222
233
  '--role',
223
234
  'robot'
224
- ]);
235
+ ], {
236
+ mocks: defaultMocks
237
+ });
225
238
  expect(error).toBeInstanceOf(Error);
226
239
  expect(error?.message).toContain('Role name "robot" not found');
227
240
  expect(error?.message).toContain('Available roles:');
@@ -229,36 +242,40 @@ describe('#invite', ()=>{
229
242
  });
230
243
  test('role names are case insensitive', async ()=>{
231
244
  mockApi({
232
- apiVersion: USERS_API_VERSION,
233
- uri: '/projects/test-project/roles'
245
+ apiVersion: PROJECTS_API_VERSION,
246
+ uri: `/projects/${testProjectId}/roles`
234
247
  }).reply(200, mockRoles);
235
248
  mockApi({
236
- apiVersion: USERS_API_VERSION,
249
+ apiVersion: PROJECTS_API_VERSION,
237
250
  method: 'post',
238
- uri: '/invitations/project/test-project'
251
+ uri: `/invitations/project/${testProjectId}`
239
252
  }).reply(200, {});
240
253
  const { stdout } = await testCommand(UsersInviteCommand, [
241
254
  'test@example.com',
242
255
  '--role',
243
256
  'DEVELOPER'
244
- ]);
257
+ ], {
258
+ mocks: defaultMocks
259
+ });
245
260
  expect(stdout).toContain('Invitation sent to test@example.com');
246
261
  });
247
262
  test('prompts for email when not provided as argument', async ()=>{
248
263
  vi.mocked(input).mockResolvedValueOnce('prompted@example.com');
249
264
  mockApi({
250
- apiVersion: USERS_API_VERSION,
251
- uri: '/projects/test-project/roles'
265
+ apiVersion: PROJECTS_API_VERSION,
266
+ uri: `/projects/${testProjectId}/roles`
252
267
  }).reply(200, mockRoles);
253
268
  mockApi({
254
- apiVersion: USERS_API_VERSION,
269
+ apiVersion: PROJECTS_API_VERSION,
255
270
  method: 'post',
256
- uri: '/invitations/project/test-project'
271
+ uri: `/invitations/project/${testProjectId}`
257
272
  }).reply(200, {});
258
273
  const { stdout } = await testCommand(UsersInviteCommand, [
259
274
  '--role',
260
275
  'developer'
261
- ]);
276
+ ], {
277
+ mocks: defaultMocks
278
+ });
262
279
  expect(input).toHaveBeenCalledWith({
263
280
  message: 'Email to invite:',
264
281
  transformer: expect.any(Function),
@@ -269,17 +286,19 @@ describe('#invite', ()=>{
269
286
  test('prompts for role when not provided as flag', async ()=>{
270
287
  vi.mocked(select).mockResolvedValueOnce('administrator');
271
288
  mockApi({
272
- apiVersion: USERS_API_VERSION,
273
- uri: '/projects/test-project/roles'
289
+ apiVersion: PROJECTS_API_VERSION,
290
+ uri: `/projects/${testProjectId}/roles`
274
291
  }).reply(200, mockRoles);
275
292
  mockApi({
276
- apiVersion: USERS_API_VERSION,
293
+ apiVersion: PROJECTS_API_VERSION,
277
294
  method: 'post',
278
- uri: '/invitations/project/test-project'
295
+ uri: `/invitations/project/${testProjectId}`
279
296
  }).reply(200, {});
280
297
  const { stdout } = await testCommand(UsersInviteCommand, [
281
298
  'prompted@example.com'
282
- ]);
299
+ ], {
300
+ mocks: defaultMocks
301
+ });
283
302
  expect(select).toHaveBeenCalledWith({
284
303
  choices: [
285
304
  {
@@ -303,15 +322,17 @@ describe('#invite', ()=>{
303
322
  vi.mocked(input).mockResolvedValueOnce('interactive@example.com');
304
323
  vi.mocked(select).mockResolvedValueOnce('viewer');
305
324
  mockApi({
306
- apiVersion: USERS_API_VERSION,
307
- uri: '/projects/test-project/roles'
325
+ apiVersion: PROJECTS_API_VERSION,
326
+ uri: `/projects/${testProjectId}/roles`
308
327
  }).reply(200, mockRoles);
309
328
  mockApi({
310
- apiVersion: USERS_API_VERSION,
329
+ apiVersion: PROJECTS_API_VERSION,
311
330
  method: 'post',
312
- uri: '/invitations/project/test-project'
331
+ uri: `/invitations/project/${testProjectId}`
313
332
  }).reply(200, {});
314
- const { stdout } = await testCommand(UsersInviteCommand, []);
333
+ const { stdout } = await testCommand(UsersInviteCommand, [], {
334
+ mocks: defaultMocks
335
+ });
315
336
  expect(input).toHaveBeenCalledWith({
316
337
  message: 'Email to invite:',
317
338
  transformer: expect.any(Function),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/users/__tests__/invite.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {input, select} from '@sanity/cli-core/ux'\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 {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {UsersInviteCommand} from '../invite.js'\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n input: vi.fn(),\n select: vi.fn(),\n }\n})\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', 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\nconst mockRoles = [\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Full access to project',\n grants: {},\n isCustom: false,\n name: 'administrator',\n projectId: 'test-project',\n title: 'Administrator',\n },\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Can edit content and publish',\n grants: {},\n isCustom: false,\n name: 'developer',\n projectId: 'test-project',\n title: 'Developer',\n },\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Read-only access',\n grants: {},\n isCustom: false,\n name: 'viewer',\n projectId: 'test-project',\n title: 'Viewer',\n },\n {\n appliesToRobots: true,\n appliesToUsers: false,\n description: 'For API tokens',\n grants: {},\n isCustom: false,\n name: 'robot',\n projectId: 'test-project',\n title: 'Robot',\n },\n]\n\ndescribe('#invite', () => {\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 invite', '--help'])\n\n expect(stdout).toContain('Invite a new user to the project')\n expect(stdout).toContain('--role')\n })\n\n test('invites user with email and role provided via flags', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'developer',\n ])\n\n expect(stdout).toContain('Invitation sent to test@example.com')\n })\n\n test('invites user with email provided via args and role as flag', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, [\n 'user@example.com',\n '--role',\n 'administrator',\n ])\n\n expect(stdout).toContain('Invitation sent to user@example.com')\n })\n\n test('exits when role is not found', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'invalid-role',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Role name \"invalid-role\" not found')\n expect(error?.message).toContain('Available roles:')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('exits when project ID is not found', async () => {\n vi.mocked(getCliConfig).mockResolvedValueOnce({\n api: {\n projectId: undefined,\n },\n })\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'developer',\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 test('handles 402 quota error', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(402, {message: 'Payment required'})\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'developer',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain(\n 'Project is already at user quota, add billing details to the project in order to allow overage charges.',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors during invitation', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(500, {message: 'Internal server error'})\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'developer',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Error inviting user')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors when fetching roles', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(500, {message: 'Internal server error'})\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'developer',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Error fetching roles')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('exits when trying to assign role that does not apply to users', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'robot', // This role does not apply to users\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Role name \"robot\" not found')\n expect(error?.message).toContain('Available roles:')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('role names are case insensitive', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'DEVELOPER', // Uppercase should work\n ])\n\n expect(stdout).toContain('Invitation sent to test@example.com')\n })\n\n test('prompts for email when not provided as argument', async () => {\n vi.mocked(input).mockResolvedValueOnce('prompted@example.com')\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, ['--role', 'developer'])\n\n expect(input).toHaveBeenCalledWith({\n message: 'Email to invite:',\n transformer: expect.any(Function),\n validate: expect.any(Function),\n })\n expect(stdout).toContain('Invitation sent to prompted@example.com')\n })\n\n test('prompts for role when not provided as flag', async () => {\n vi.mocked(select).mockResolvedValueOnce('administrator')\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, ['prompted@example.com'])\n\n expect(select).toHaveBeenCalledWith({\n choices: [\n {\n name: 'Administrator (Full access to project)',\n value: 'administrator',\n },\n {\n name: 'Developer (Can edit content and publish)',\n value: 'developer',\n },\n {\n name: 'Viewer (Read-only access)',\n value: 'viewer',\n },\n ],\n message: 'Which role should the user have?',\n })\n expect(stdout).toContain('Invitation sent to prompted@example.com')\n })\n\n test('prompts for both email and role when neither is provided', async () => {\n vi.mocked(input).mockResolvedValueOnce('interactive@example.com')\n vi.mocked(select).mockResolvedValueOnce('viewer')\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, [])\n\n expect(input).toHaveBeenCalledWith({\n message: 'Email to invite:',\n transformer: expect.any(Function),\n validate: expect.any(Function),\n })\n expect(select).toHaveBeenCalledWith({\n choices: [\n {\n name: 'Administrator (Full access to project)',\n value: 'administrator',\n },\n {\n name: 'Developer (Can edit content and publish)',\n value: 'developer',\n },\n {\n name: 'Viewer (Read-only access)',\n value: 'viewer',\n },\n ],\n message: 'Which role should the user have?',\n })\n expect(stdout).toContain('Invitation sent to interactive@example.com')\n })\n})\n"],"names":["runCommand","getCliConfig","input","select","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","USERS_API_VERSION","NO_PROJECT_ID","UsersInviteCommand","mock","actual","importActual","fn","findProjectRoot","mockResolvedValue","directory","root","type","api","projectId","mockRoles","appliesToRobots","appliesToUsers","description","grants","isCustom","name","title","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toContain","apiVersion","uri","reply","method","error","toBeInstanceOf","Error","message","oclif","exit","toBe","mocked","mockResolvedValueOnce","undefined","toHaveBeenCalledWith","transformer","any","Function","validate","choices","value"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,YAAY,QAAO,mBAAkB;AAC7C,SAAQC,KAAK,EAAEC,MAAM,QAAO,sBAAqB;AACjD,SAAQC,OAAO,EAAEC,WAAW,QAAO,mBAAkB;AACrD,OAAOC,UAAU,OAAM;AACvB,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,iBAAiB,QAAO,uCAAsC;AACtE,SAAQC,aAAa,QAAO,iCAAgC;AAC5D,SAAQC,kBAAkB,QAAO,eAAc;AAE/CH,GAAGI,IAAI,CAAC,uBAAuB;IAC7B,MAAMC,SAAS,MAAML,GAAGM,YAAY,CAAuC;IAC3E,OAAO;QACL,GAAGD,MAAM;QACTd,OAAOS,GAAGO,EAAE;QACZf,QAAQQ,GAAGO,EAAE;IACf;AACF;AAEAP,GAAGI,IAAI,CAAC,yDAAyD;IAC/D,OAAO;QACLI,iBAAiBR,GAAGO,EAAE,GAAGE,iBAAiB,CAAC;YACzCC,WAAW;YACXC,MAAM;YACNC,MAAM;QACR;IACF;AACF;AAEAZ,GAAGI,IAAI,CAAC,0DAA0D;IAChE,OAAO;QACLd,cAAcU,GAAGO,EAAE,GAAGE,iBAAiB,CAAC;YACtCI,KAAK;gBACHC,WAAW;YACb;QACF;IACF;AACF;AAEA,MAAMC,YAAY;IAChB;QACEC,iBAAiB;QACjBC,gBAAgB;QAChBC,aAAa;QACbC,QAAQ,CAAC;QACTC,UAAU;QACVC,MAAM;QACNP,WAAW;QACXQ,OAAO;IACT;IACA;QACEN,iBAAiB;QACjBC,gBAAgB;QAChBC,aAAa;QACbC,QAAQ,CAAC;QACTC,UAAU;QACVC,MAAM;QACNP,WAAW;QACXQ,OAAO;IACT;IACA;QACEN,iBAAiB;QACjBC,gBAAgB;QAChBC,aAAa;QACbC,QAAQ,CAAC;QACTC,UAAU;QACVC,MAAM;QACNP,WAAW;QACXQ,OAAO;IACT;IACA;QACEN,iBAAiB;QACjBC,gBAAgB;QAChBC,aAAa;QACbC,QAAQ,CAAC;QACTC,UAAU;QACVC,MAAM;QACNP,WAAW;QACXQ,OAAO;IACT;CACD;AAEDzB,SAAS,WAAW;IAClBD,UAAU;QACRI,GAAGuB,aAAa;QAChB,MAAMC,UAAU7B,KAAK8B,YAAY;QACjC9B,KAAK+B,QAAQ;QACb5B,OAAO0B,SAAS,iBAAiBG,OAAO,CAAC,EAAE;IAC7C;IAEA5B,KAAK,gBAAgB;QACnB,MAAM,EAAC6B,MAAM,EAAC,GAAG,MAAMvC,WAAW;YAAC;YAAgB;SAAS;QAE5DS,OAAO8B,QAAQC,SAAS,CAAC;QACzB/B,OAAO8B,QAAQC,SAAS,CAAC;IAC3B;IAEA9B,KAAK,uDAAuD;QAC1DN,QAAQ;YACNqC,YAAY7B;YACZ8B,KAAK;QACP,GAAGC,KAAK,CAAC,KAAKjB;QAEdtB,QAAQ;YACNqC,YAAY7B;YACZgC,QAAQ;YACRF,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK,CAAC;QAEf,MAAM,EAACJ,MAAM,EAAC,GAAG,MAAMlC,YAAYS,oBAAoB;YACrD;YACA;YACA;SACD;QAEDL,OAAO8B,QAAQC,SAAS,CAAC;IAC3B;IAEA9B,KAAK,8DAA8D;QACjEN,QAAQ;YACNqC,YAAY7B;YACZ8B,KAAK;QACP,GAAGC,KAAK,CAAC,KAAKjB;QAEdtB,QAAQ;YACNqC,YAAY7B;YACZgC,QAAQ;YACRF,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK,CAAC;QAEf,MAAM,EAACJ,MAAM,EAAC,GAAG,MAAMlC,YAAYS,oBAAoB;YACrD;YACA;YACA;SACD;QAEDL,OAAO8B,QAAQC,SAAS,CAAC;IAC3B;IAEA9B,KAAK,gCAAgC;QACnCN,QAAQ;YACNqC,YAAY7B;YACZ8B,KAAK;QACP,GAAGC,KAAK,CAAC,KAAKjB;QAEd,MAAM,EAACmB,KAAK,EAAC,GAAG,MAAMxC,YAAYS,oBAAoB;YACpD;YACA;YACA;SACD;QAEDL,OAAOoC,OAAOC,cAAc,CAACC;QAC7BtC,OAAOoC,OAAOG,SAASR,SAAS,CAAC;QACjC/B,OAAOoC,OAAOG,SAASR,SAAS,CAAC;QACjC/B,OAAOoC,OAAOI,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAzC,KAAK,sCAAsC;QACzCC,GAAGyC,MAAM,CAACnD,cAAcoD,qBAAqB,CAAC;YAC5C7B,KAAK;gBACHC,WAAW6B;YACb;QACF;QAEA,MAAM,EAACT,KAAK,EAAC,GAAG,MAAMxC,YAAYS,oBAAoB;YACpD;YACA;YACA;SACD;QAEDL,OAAOoC,OAAOC,cAAc,CAACC;QAC7BtC,OAAOoC,OAAOG,SAASV,OAAO,CAACzB;QAC/BJ,OAAOoC,OAAOI,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAzC,KAAK,2BAA2B;QAC9BN,QAAQ;YACNqC,YAAY7B;YACZ8B,KAAK;QACP,GAAGC,KAAK,CAAC,KAAKjB;QAEdtB,QAAQ;YACNqC,YAAY7B;YACZgC,QAAQ;YACRF,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK;YAACK,SAAS;QAAkB;QAE1C,MAAM,EAACH,KAAK,EAAC,GAAG,MAAMxC,YAAYS,oBAAoB;YACpD;YACA;YACA;SACD;QAEDL,OAAOoC,OAAOC,cAAc,CAACC;QAC7BtC,OAAOoC,OAAOG,SAASR,SAAS,CAC9B;QAEF/B,OAAOoC,OAAOI,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAzC,KAAK,wCAAwC;QAC3CN,QAAQ;YACNqC,YAAY7B;YACZ8B,KAAK;QACP,GAAGC,KAAK,CAAC,KAAKjB;QAEdtB,QAAQ;YACNqC,YAAY7B;YACZgC,QAAQ;YACRF,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK;YAACK,SAAS;QAAuB;QAE/C,MAAM,EAACH,KAAK,EAAC,GAAG,MAAMxC,YAAYS,oBAAoB;YACpD;YACA;YACA;SACD;QAEDL,OAAOoC,OAAOC,cAAc,CAACC;QAC7BtC,OAAOoC,OAAOG,SAASR,SAAS,CAAC;QACjC/B,OAAOoC,OAAOI,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAzC,KAAK,0CAA0C;QAC7CN,QAAQ;YACNqC,YAAY7B;YACZ8B,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK;YAACK,SAAS;QAAuB;QAE/C,MAAM,EAACH,KAAK,EAAC,GAAG,MAAMxC,YAAYS,oBAAoB;YACpD;YACA;YACA;SACD;QAEDL,OAAOoC,OAAOC,cAAc,CAACC;QAC7BtC,OAAOoC,OAAOG,SAASR,SAAS,CAAC;QACjC/B,OAAOoC,OAAOI,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAzC,KAAK,iEAAiE;QACpEN,QAAQ;YACNqC,YAAY7B;YACZ8B,KAAK;QACP,GAAGC,KAAK,CAAC,KAAKjB;QAEd,MAAM,EAACmB,KAAK,EAAC,GAAG,MAAMxC,YAAYS,oBAAoB;YACpD;YACA;YACA;SACD;QAEDL,OAAOoC,OAAOC,cAAc,CAACC;QAC7BtC,OAAOoC,OAAOG,SAASR,SAAS,CAAC;QACjC/B,OAAOoC,OAAOG,SAASR,SAAS,CAAC;QACjC/B,OAAOoC,OAAOI,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAzC,KAAK,mCAAmC;QACtCN,QAAQ;YACNqC,YAAY7B;YACZ8B,KAAK;QACP,GAAGC,KAAK,CAAC,KAAKjB;QAEdtB,QAAQ;YACNqC,YAAY7B;YACZgC,QAAQ;YACRF,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK,CAAC;QAEf,MAAM,EAACJ,MAAM,EAAC,GAAG,MAAMlC,YAAYS,oBAAoB;YACrD;YACA;YACA;SACD;QAEDL,OAAO8B,QAAQC,SAAS,CAAC;IAC3B;IAEA9B,KAAK,mDAAmD;QACtDC,GAAGyC,MAAM,CAAClD,OAAOmD,qBAAqB,CAAC;QAEvCjD,QAAQ;YACNqC,YAAY7B;YACZ8B,KAAK;QACP,GAAGC,KAAK,CAAC,KAAKjB;QAEdtB,QAAQ;YACNqC,YAAY7B;YACZgC,QAAQ;YACRF,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK,CAAC;QAEf,MAAM,EAACJ,MAAM,EAAC,GAAG,MAAMlC,YAAYS,oBAAoB;YAAC;YAAU;SAAY;QAE9EL,OAAOP,OAAOqD,oBAAoB,CAAC;YACjCP,SAAS;YACTQ,aAAa/C,OAAOgD,GAAG,CAACC;YACxBC,UAAUlD,OAAOgD,GAAG,CAACC;QACvB;QACAjD,OAAO8B,QAAQC,SAAS,CAAC;IAC3B;IAEA9B,KAAK,8CAA8C;QACjDC,GAAGyC,MAAM,CAACjD,QAAQkD,qBAAqB,CAAC;QAExCjD,QAAQ;YACNqC,YAAY7B;YACZ8B,KAAK;QACP,GAAGC,KAAK,CAAC,KAAKjB;QAEdtB,QAAQ;YACNqC,YAAY7B;YACZgC,QAAQ;YACRF,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK,CAAC;QAEf,MAAM,EAACJ,MAAM,EAAC,GAAG,MAAMlC,YAAYS,oBAAoB;YAAC;SAAuB;QAE/EL,OAAON,QAAQoD,oBAAoB,CAAC;YAClCK,SAAS;gBACP;oBACE5B,MAAM;oBACN6B,OAAO;gBACT;gBACA;oBACE7B,MAAM;oBACN6B,OAAO;gBACT;gBACA;oBACE7B,MAAM;oBACN6B,OAAO;gBACT;aACD;YACDb,SAAS;QACX;QACAvC,OAAO8B,QAAQC,SAAS,CAAC;IAC3B;IAEA9B,KAAK,4DAA4D;QAC/DC,GAAGyC,MAAM,CAAClD,OAAOmD,qBAAqB,CAAC;QACvC1C,GAAGyC,MAAM,CAACjD,QAAQkD,qBAAqB,CAAC;QAExCjD,QAAQ;YACNqC,YAAY7B;YACZ8B,KAAK;QACP,GAAGC,KAAK,CAAC,KAAKjB;QAEdtB,QAAQ;YACNqC,YAAY7B;YACZgC,QAAQ;YACRF,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK,CAAC;QAEf,MAAM,EAACJ,MAAM,EAAC,GAAG,MAAMlC,YAAYS,oBAAoB,EAAE;QAEzDL,OAAOP,OAAOqD,oBAAoB,CAAC;YACjCP,SAAS;YACTQ,aAAa/C,OAAOgD,GAAG,CAACC;YACxBC,UAAUlD,OAAOgD,GAAG,CAACC;QACvB;QACAjD,OAAON,QAAQoD,oBAAoB,CAAC;YAClCK,SAAS;gBACP;oBACE5B,MAAM;oBACN6B,OAAO;gBACT;gBACA;oBACE7B,MAAM;oBACN6B,OAAO;gBACT;gBACA;oBACE7B,MAAM;oBACN6B,OAAO;gBACT;aACD;YACDb,SAAS;QACX;QACAvC,OAAO8B,QAAQC,SAAS,CAAC;IAC3B;AACF"}
1
+ {"version":3,"sources":["../../../../src/commands/users/__tests__/invite.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {input, select} from '@sanity/cli-core/ux'\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 {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {UsersInviteCommand} from '../invite.js'\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n input: vi.fn(),\n select: vi.fn(),\n }\n})\n\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\nconst mockRoles = [\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Full access to project',\n grants: {},\n isCustom: false,\n name: 'administrator',\n projectId: testProjectId,\n title: 'Administrator',\n },\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Can edit content and publish',\n grants: {},\n isCustom: false,\n name: 'developer',\n projectId: testProjectId,\n title: 'Developer',\n },\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Read-only access',\n grants: {},\n isCustom: false,\n name: 'viewer',\n projectId: testProjectId,\n title: 'Viewer',\n },\n {\n appliesToRobots: true,\n appliesToUsers: false,\n description: 'For API tokens',\n grants: {},\n isCustom: false,\n name: 'robot',\n projectId: testProjectId,\n title: 'Robot',\n },\n]\n\ndescribe('#invite', () => {\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 invite', '--help'])\n\n expect(stdout).toContain('Invite a new user to the project')\n expect(stdout).toContain('--role')\n })\n\n test('invites user with email and role provided via flags', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'developer'],\n {mocks: defaultMocks},\n )\n\n expect(stdout).toContain('Invitation sent to test@example.com')\n })\n\n test('invites user with email provided via args and role as flag', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(\n UsersInviteCommand,\n ['user@example.com', '--role', 'administrator'],\n {mocks: defaultMocks},\n )\n\n expect(stdout).toContain('Invitation sent to user@example.com')\n })\n\n test('exits when role is not found', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n const {error} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'invalid-role'],\n {mocks: defaultMocks},\n )\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Role name \"invalid-role\" not found')\n expect(error?.message).toContain('Available roles:')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('exits when project ID is not found', async () => {\n const {error} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'developer'],\n {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\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 test('handles 402 quota error', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(402, {message: 'Payment required'})\n\n const {error} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'developer'],\n {mocks: defaultMocks},\n )\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain(\n 'Project is already at user quota, add billing details to the project in order to allow overage charges.',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors during invitation', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(500, {message: 'Internal server error'})\n\n const {error} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'developer'],\n {mocks: defaultMocks},\n )\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Error inviting user')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors when fetching roles', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(500, {message: 'Internal server error'})\n\n const {error} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'developer'],\n {mocks: defaultMocks},\n )\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Error fetching roles')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('exits when trying to assign role that does not apply to users', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n const {error} = await testCommand(\n UsersInviteCommand,\n [\n 'test@example.com',\n '--role',\n 'robot', // This role does not apply to users\n ],\n {mocks: defaultMocks},\n )\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Role name \"robot\" not found')\n expect(error?.message).toContain('Available roles:')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('role names are case insensitive', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(\n UsersInviteCommand,\n [\n 'test@example.com',\n '--role',\n 'DEVELOPER', // Uppercase should work\n ],\n {mocks: defaultMocks},\n )\n\n expect(stdout).toContain('Invitation sent to test@example.com')\n })\n\n test('prompts for email when not provided as argument', async () => {\n vi.mocked(input).mockResolvedValueOnce('prompted@example.com')\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, ['--role', 'developer'], {\n mocks: defaultMocks,\n })\n\n expect(input).toHaveBeenCalledWith({\n message: 'Email to invite:',\n transformer: expect.any(Function),\n validate: expect.any(Function),\n })\n expect(stdout).toContain('Invitation sent to prompted@example.com')\n })\n\n test('prompts for role when not provided as flag', async () => {\n vi.mocked(select).mockResolvedValueOnce('administrator')\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, ['prompted@example.com'], {\n mocks: defaultMocks,\n })\n\n expect(select).toHaveBeenCalledWith({\n choices: [\n {\n name: 'Administrator (Full access to project)',\n value: 'administrator',\n },\n {\n name: 'Developer (Can edit content and publish)',\n value: 'developer',\n },\n {\n name: 'Viewer (Read-only access)',\n value: 'viewer',\n },\n ],\n message: 'Which role should the user have?',\n })\n expect(stdout).toContain('Invitation sent to prompted@example.com')\n })\n\n test('prompts for both email and role when neither is provided', async () => {\n vi.mocked(input).mockResolvedValueOnce('interactive@example.com')\n vi.mocked(select).mockResolvedValueOnce('viewer')\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, [], {mocks: defaultMocks})\n\n expect(input).toHaveBeenCalledWith({\n message: 'Email to invite:',\n transformer: expect.any(Function),\n validate: expect.any(Function),\n })\n expect(select).toHaveBeenCalledWith({\n choices: [\n {\n name: 'Administrator (Full access to project)',\n value: 'administrator',\n },\n {\n name: 'Developer (Can edit content and publish)',\n value: 'developer',\n },\n {\n name: 'Viewer (Read-only access)',\n value: 'viewer',\n },\n ],\n message: 'Which role should the user have?',\n })\n expect(stdout).toContain('Invitation sent to interactive@example.com')\n })\n})\n"],"names":["runCommand","input","select","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","PROJECTS_API_VERSION","NO_PROJECT_ID","UsersInviteCommand","mock","actual","importActual","fn","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","mockRoles","appliesToRobots","appliesToUsers","description","grants","isCustom","name","title","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toContain","apiVersion","uri","reply","method","mocks","error","toBeInstanceOf","Error","message","oclif","exit","toBe","undefined","mocked","mockResolvedValueOnce","toHaveBeenCalledWith","transformer","any","Function","validate","choices","value"],"mappings":"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"}