@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
@@ -2,9 +2,9 @@ import { readFile, writeFile } from 'node:fs/promises';
2
2
  import { createServer } from 'node:http';
3
3
  import { join } from 'node:path';
4
4
  import { runCommand } from '@oclif/test';
5
+ import { getProjectCliClient } from '@sanity/cli-core';
5
6
  import { confirm } from '@sanity/cli-core/ux';
6
- import { mockApi, testCommand } from '@sanity/cli-test';
7
- import nock from 'nock';
7
+ import { testCommand } from '@sanity/cli-test';
8
8
  import { afterEach, describe, expect, test, vi } from 'vitest';
9
9
  import { testExample } from '~test/helpers/testExample.js';
10
10
  import { checkRequiredDependencies } from '../../actions/build/checkRequiredDependencies.js';
@@ -27,21 +27,24 @@ vi.mock('@sanity/cli-core/ux', async ()=>{
27
27
  confirm: vi.fn()
28
28
  };
29
29
  });
30
- vi.mock('../../../../cli-core/src/util/isInteractive.js', ()=>({
31
- isInteractive: vi.fn().mockReturnValue(true)
32
- }));
33
30
  vi.mock('../../util/packageManager/upgradePackages.js');
34
31
  vi.mock('../../util/packageManager/packageManagerChoice.js');
32
+ vi.mock('@sanity/cli-core', async ()=>{
33
+ const actual = await vi.importActual('@sanity/cli-core');
34
+ return {
35
+ ...actual,
36
+ getProjectCliClient: vi.fn(),
37
+ isInteractive: vi.fn(()=>true)
38
+ };
39
+ });
35
40
  const mockCheckRequiredDependencies = vi.mocked(checkRequiredDependencies);
36
41
  const mockCompareDependencyVersions = vi.mocked(compareDependencyVersions);
37
42
  const mockConfirm = vi.mocked(confirm);
38
43
  const mockUpgradePackages = vi.mocked(upgradePackages);
39
44
  const mockGetPackageManagerChoice = vi.mocked(getPackageManagerChoice);
45
+ const mockGetProjectCliClient = vi.mocked(getProjectCliClient);
40
46
  describe('#dev', ()=>{
41
47
  afterEach(()=>{
42
- const pending = nock.pendingMocks();
43
- nock.cleanAll();
44
- expect(pending, 'pending mocks').toEqual([]);
45
48
  vi.clearAllMocks();
46
49
  });
47
50
  test('help text is correct', async ()=>{
@@ -79,7 +82,11 @@ describe('#dev', ()=>{
79
82
  test('shows an error for invalid flags', async ()=>{
80
83
  const { error } = await testCommand(DevCommand, [
81
84
  '--invalid'
82
- ]);
85
+ ], {
86
+ mocks: {
87
+ isInteractive: true
88
+ }
89
+ });
83
90
  expect(error?.message).toContain('Nonexistent flag: --invalid');
84
91
  });
85
92
  describe('basic-app', ()=>{
@@ -92,6 +99,9 @@ describe('#dev', ()=>{
92
99
  ], {
93
100
  config: {
94
101
  root: cwd
102
+ },
103
+ mocks: {
104
+ isInteractive: true
95
105
  }
96
106
  });
97
107
  expect(error).toBeUndefined();
@@ -110,6 +120,9 @@ describe('#dev', ()=>{
110
120
  ], {
111
121
  config: {
112
122
  root: cwd
123
+ },
124
+ mocks: {
125
+ isInteractive: true
113
126
  }
114
127
  });
115
128
  expect(error).toBeUndefined();
@@ -133,6 +146,9 @@ describe('#dev', ()=>{
133
146
  ], {
134
147
  config: {
135
148
  root: cwd
149
+ },
150
+ mocks: {
151
+ isInteractive: true
136
152
  }
137
153
  });
138
154
  expect(error).toBeUndefined();
@@ -165,6 +181,9 @@ describe('#dev', ()=>{
165
181
  ], {
166
182
  config: {
167
183
  root: cwd
184
+ },
185
+ mocks: {
186
+ isInteractive: true
168
187
  }
169
188
  });
170
189
  expect(error).toBeDefined();
@@ -182,6 +201,9 @@ describe('#dev', ()=>{
182
201
  ], {
183
202
  config: {
184
203
  root: cwd
204
+ },
205
+ mocks: {
206
+ isInteractive: true
185
207
  }
186
208
  });
187
209
  expect(error).toBeUndefined();
@@ -202,6 +224,9 @@ describe('#dev', ()=>{
202
224
  ], {
203
225
  config: {
204
226
  root: cwd
227
+ },
228
+ mocks: {
229
+ isInteractive: true
205
230
  }
206
231
  });
207
232
  expect(error).toBeUndefined();
@@ -218,11 +243,12 @@ describe('#dev', ()=>{
218
243
  // Add projectId to the config
219
244
  const modifiedConfig = existingConfig.replace(/projectId: '.*',/, `projectId: '${projectId}',`);
220
245
  await writeFile(configPath, modifiedConfig);
221
- mockApi({
222
- apiVersion: 'v2025-08-25',
223
- uri: `/projects/${projectId}`
224
- }).reply(200, {
225
- organizationId: 'test-org'
246
+ mockGetProjectCliClient.mockResolvedValue({
247
+ projects: {
248
+ getById: vi.fn().mockResolvedValue({
249
+ organizationId: 'test-org'
250
+ })
251
+ }
226
252
  });
227
253
  const { error, result, stderr, stdout } = await testCommand(DevCommand, [
228
254
  '--load-in-dashboard',
@@ -231,6 +257,9 @@ describe('#dev', ()=>{
231
257
  ], {
232
258
  config: {
233
259
  root: cwd
260
+ },
261
+ mocks: {
262
+ isInteractive: true
234
263
  }
235
264
  });
236
265
  expect(error).toBeUndefined();
@@ -255,6 +284,9 @@ describe('#dev', ()=>{
255
284
  ], {
256
285
  config: {
257
286
  root: cwd
287
+ },
288
+ mocks: {
289
+ isInteractive: true
258
290
  }
259
291
  });
260
292
  expect(error).toBeDefined();
@@ -269,11 +301,10 @@ describe('#dev', ()=>{
269
301
  const existingConfig = await readFile(configPath, 'utf8');
270
302
  const modifiedConfig = existingConfig.replace(/projectId: '.*',/, `projectId: '${projectId}',`);
271
303
  await writeFile(configPath, modifiedConfig);
272
- mockApi({
273
- apiVersion: 'v2025-08-25',
274
- uri: `/projects/${projectId}`
275
- }).reply(404, {
276
- error: 'Project not found'
304
+ mockGetProjectCliClient.mockResolvedValue({
305
+ projects: {
306
+ getById: vi.fn().mockRejectedValue(new Error('Project not found'))
307
+ }
277
308
  });
278
309
  const { error } = await testCommand(DevCommand, [
279
310
  '--load-in-dashboard',
@@ -282,6 +313,9 @@ describe('#dev', ()=>{
282
313
  ], {
283
314
  config: {
284
315
  root: cwd
316
+ },
317
+ mocks: {
318
+ isInteractive: true
285
319
  }
286
320
  });
287
321
  expect(error).toBeDefined();
@@ -337,6 +371,9 @@ describe('#dev', ()=>{
337
371
  ], {
338
372
  config: {
339
373
  root: cwd
374
+ },
375
+ mocks: {
376
+ isInteractive: true
340
377
  }
341
378
  });
342
379
  expect(error).toBeUndefined();
@@ -369,6 +406,9 @@ describe('#dev', ()=>{
369
406
  ], {
370
407
  config: {
371
408
  root: cwd
409
+ },
410
+ mocks: {
411
+ isInteractive: true
372
412
  }
373
413
  });
374
414
  expect(error).toBeDefined();
@@ -390,6 +430,9 @@ describe('#dev', ()=>{
390
430
  ], {
391
431
  config: {
392
432
  root: cwd
433
+ },
434
+ mocks: {
435
+ isInteractive: true
393
436
  }
394
437
  });
395
438
  expect(error).toBeDefined();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/__tests__/dev.test.ts"],"sourcesContent":["import {readFile, writeFile} from 'node:fs/promises'\nimport {createServer} from 'node:http'\nimport {join} from 'node:path'\n\nimport {runCommand} from '@oclif/test'\nimport {confirm} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\nimport {testExample} from '~test/helpers/testExample.js'\n\nimport {checkRequiredDependencies} from '../../actions/build/checkRequiredDependencies.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js'\nimport {upgradePackages} from '../../util/packageManager/upgradePackages.js'\nimport {DevCommand} from '../dev.js'\n\nvi.mock('../../actions/build/checkRequiredDependencies.js', () => ({\n checkRequiredDependencies: vi.fn().mockResolvedValue({\n installedSanityVersion: '3.0.0',\n }),\n}))\n\nvi.mock('../../util/compareDependencyVersions.js', () => ({\n compareDependencyVersions: vi.fn().mockResolvedValue([]),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n confirm: vi.fn(),\n }\n})\n\nvi.mock('../../../../cli-core/src/util/isInteractive.js', () => ({\n isInteractive: vi.fn().mockReturnValue(true),\n}))\n\nvi.mock('../../util/packageManager/upgradePackages.js')\nvi.mock('../../util/packageManager/packageManagerChoice.js')\n\nconst mockCheckRequiredDependencies = vi.mocked(checkRequiredDependencies)\nconst mockCompareDependencyVersions = vi.mocked(compareDependencyVersions)\nconst mockConfirm = vi.mocked(confirm)\nconst mockUpgradePackages = vi.mocked(upgradePackages)\nconst mockGetPackageManagerChoice = vi.mocked(getPackageManagerChoice)\n\ntype Result = {\n close?: () => Promise<void>\n}\n\ndescribe('#dev', () => {\n afterEach(() => {\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n\n vi.clearAllMocks()\n })\n\n test('help text is correct', async () => {\n const {stdout} = await runCommand(['dev', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"Starts a local development server for Sanity Studio with live reloading\n\n USAGE\n $ sanity dev [--auto-updates] [--host <value>]\n [--load-in-dashboard] [--port <value>]\n\n FLAGS\n --[no-]auto-updates Automatically update Sanity Studio dependencies.\n --host=<value> [default: localhost] The local network interface at\n which to listen.\n --[no-]load-in-dashboard Load the app/studio in the Sanity dashboard.\n --port=<value> [default: 3333] TCP port to start server on.\n\n DESCRIPTION\n Starts a local development server for Sanity Studio with live reloading\n\n EXAMPLES\n $ sanity dev --host=0.0.0.0\n\n $ sanity dev --port=1942\n\n $ sanity dev --load-in-dashboard\n\n \"\n `)\n })\n\n test('shows an error for invalid flags', async () => {\n const {error} = await testCommand(DevCommand, ['--invalid'])\n\n expect(error?.message).toContain('Nonexistent flag: --invalid')\n })\n\n describe('basic-app', () => {\n test('should start the dev server for app', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const {error, result, stderr, stdout} = await testCommand(DevCommand, ['--port', '5333'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Dev server started on port 5333')\n expect(stdout).toContain('View your app in the Sanity dashboard here:')\n expect(stderr).toContain('Checking configuration files')\n await (result as Result).close?.()\n })\n\n test('should warn when --no-load-in-dashboard is used with app', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--no-load-in-dashboard', '--port', '5334'],\n {\n config: {root: cwd},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stderr).toContain('Apps cannot run without the Sanity dashboard')\n expect(stderr).toContain('Starting dev server with the --load-in-dashboard flag set to true')\n expect(stdout).toContain('Dev server started on port 5334')\n await (result as Result).close?.()\n })\n\n test('should automatically change port if conflicted', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n // Create a server on port 5338 to block it\n const server = createServer()\n await new Promise<void>((resolve) => {\n server.listen(5338, 'localhost', resolve)\n })\n\n try {\n const {error, result, stdout} = await testCommand(DevCommand, ['--port', '5338'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n // Should automatically pick a different port\n expect(stdout).toMatch(/Dev server started on port \\d{4}/)\n expect(stdout).not.toContain('Dev server started on port 5338')\n expect(stdout).toContain('View your app in the Sanity dashboard here:')\n await (result as Result).close?.()\n } finally {\n // Clean up the server\n await new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err)\n else resolve()\n })\n })\n }\n })\n\n test('should error when organizationId is missing from config', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n // Modify the config to remove organizationId\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n const modifiedConfig = existingConfig.replace(/organizationId: '[^']*',?/, '')\n await writeFile(configPath, modifiedConfig)\n\n const {error} = await testCommand(DevCommand, ['--port', '5341'], {\n config: {root: cwd},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Apps require an organization ID (orgId)')\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n\n describe('basic-studio', () => {\n test('should start the dev server for studio', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const {error, result, stderr, stdout} = await testCommand(DevCommand, ['--port', '5335'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Sanity Studio using vite@')\n expect(stdout).toContain('ready in')\n expect(stdout).toContain('ms and running at http://localhost:5335')\n expect(stderr).toContain('Checking configuration files')\n await (result as Result).close?.()\n })\n\n test('should start with custom host configuration', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const {error, result, stdout} = await testCommand(\n DevCommand,\n ['--host', '127.0.0.1', '--port', '5336'],\n {\n config: {root: cwd},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('http://127.0.0.1:5336')\n await (result as Result).close?.()\n })\n\n test('should start with load-in-dashboard', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project'\n\n // Need to modify the sanity config to include projectId for this test\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n\n // Add projectId to the config\n const modifiedConfig = existingConfig.replace(\n /projectId: '.*',/,\n `projectId: '${projectId}',`,\n )\n\n await writeFile(configPath, modifiedConfig)\n\n mockApi({\n apiVersion: 'v2025-08-25',\n uri: `/projects/${projectId}`,\n }).reply(200, {organizationId: 'test-org'})\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--load-in-dashboard', '--port', '5340'],\n {\n config: {root: cwd},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Dev server started on port 5340')\n expect(stdout).toContain('View your studio in the Sanity dashboard here:')\n expect(stdout).toContain('https://www.sanity.io/@test-org?dev=http%3A%2F%2Flocalhost%3A5340')\n expect(stderr).toContain('Checking configuration files')\n\n await (result as Result).close?.()\n })\n\n test('should error when projectId is missing with --load-in-dashboard', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n // Modify config to remove projectId\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n const modifiedConfig = existingConfig.replace(/projectId: '[^']*',/, '')\n await writeFile(configPath, modifiedConfig)\n\n const {error} = await testCommand(DevCommand, ['--load-in-dashboard', '--port', '5343'], {\n config: {root: cwd},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Project Id is required to load in dashboard')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should error when API fails to fetch organizationId', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project'\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n const modifiedConfig = existingConfig.replace(\n /projectId: '.*',/,\n `projectId: '${projectId}',`,\n )\n await writeFile(configPath, modifiedConfig)\n\n mockApi({\n apiVersion: 'v2025-08-25',\n uri: `/projects/${projectId}`,\n }).reply(404, {error: 'Project not found'})\n\n const {error} = await testCommand(DevCommand, ['--load-in-dashboard', '--port', '5344'], {\n config: {root: cwd},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Failed to get organization id from project id')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should start dev server successfully when user declines auto-updates', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockCompareDependencyVersions.mockResolvedValueOnce([\n {\n installed: '3.0.0',\n pkg: 'sanity',\n remote: '3.1.0',\n },\n ])\n mockConfirm.mockResolvedValueOnce(false) // User declines upgrade\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--auto-updates', '--port', '5346'],\n {\n config: {root: cwd},\n },\n )\n\n expect(error).toBeUndefined()\n // Check that the server started successfully with auto-updates flag\n expect(stdout).toMatch(/running at http:\\/\\/localhost:5346/)\n expect(stderr).toContain('Checking configuration files')\n await (result as Result).close?.()\n })\n\n test('should handle auto-updates with version mismatch and user accepts upgrade', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockCompareDependencyVersions.mockResolvedValueOnce([\n {\n installed: '3.0.0',\n pkg: 'sanity',\n remote: '3.1.0',\n },\n ])\n mockConfirm.mockResolvedValueOnce(true) // User accepts upgrade\n\n mockUpgradePackages.mockResolvedValueOnce(undefined)\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'npm',\n mostOptimal: 'npm',\n })\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--auto-updates', '--port', '5348'],\n {\n config: {root: cwd},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stdout).toMatch(/running at http:\\/\\/localhost:5348/)\n expect(stderr).toContain('Checking configuration files')\n\n expect(mockUpgradePackages).toHaveBeenCalledWith(\n {\n packageManager: 'npm',\n packages: [['sanity', '3.1.0']],\n },\n {output: expect.any(Object), workDir: cwd},\n )\n\n await (result as Result).close?.()\n })\n\n test('should handle invalid Sanity version during auto-updates', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockCheckRequiredDependencies.mockResolvedValueOnce({\n installedSanityVersion: 'invalid-version',\n })\n\n const {error} = await testCommand(DevCommand, ['--auto-updates', '--port', '5347'], {\n config: {root: cwd},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Failed to parse installed Sanity version')\n })\n })\n\n test('should throw an error if port is already in use', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n // Create a server on port 5337 to block it\n const server = createServer()\n await new Promise<void>((resolve) => {\n server.listen(5337, 'localhost', resolve)\n })\n\n try {\n const {error} = await testCommand(DevCommand, ['--port', '5337'], {\n config: {root: cwd},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Port 5337 is already in use')\n expect(error?.oclif?.exit).toBe(1)\n } finally {\n // Clean up the server\n await new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err)\n else resolve()\n })\n })\n }\n })\n})\n"],"names":["readFile","writeFile","createServer","join","runCommand","confirm","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","testExample","checkRequiredDependencies","compareDependencyVersions","getPackageManagerChoice","upgradePackages","DevCommand","mock","fn","mockResolvedValue","installedSanityVersion","actual","importActual","isInteractive","mockReturnValue","mockCheckRequiredDependencies","mocked","mockCompareDependencyVersions","mockConfirm","mockUpgradePackages","mockGetPackageManagerChoice","pending","pendingMocks","cleanAll","toEqual","clearAllMocks","stdout","toMatchInlineSnapshot","error","message","toContain","cwd","process","result","stderr","config","root","toBeUndefined","close","server","Promise","resolve","listen","toMatch","not","reject","err","configPath","existingConfig","modifiedConfig","replace","toBeDefined","oclif","exit","toBe","projectId","apiVersion","uri","reply","organizationId","mockResolvedValueOnce","installed","pkg","remote","undefined","chosen","mostOptimal","toHaveBeenCalledWith","packageManager","packages","output","any","Object","workDir"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/__tests__/dev.test.ts"],"sourcesContent":["import {readFile, writeFile} from 'node:fs/promises'\nimport {createServer} from 'node:http'\nimport {join} from 'node:path'\n\nimport {runCommand} from '@oclif/test'\nimport {getProjectCliClient} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\nimport {testExample} from '~test/helpers/testExample.js'\n\nimport {checkRequiredDependencies} from '../../actions/build/checkRequiredDependencies.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js'\nimport {upgradePackages} from '../../util/packageManager/upgradePackages.js'\nimport {DevCommand} from '../dev.js'\n\nvi.mock('../../actions/build/checkRequiredDependencies.js', () => ({\n checkRequiredDependencies: vi.fn().mockResolvedValue({\n installedSanityVersion: '3.0.0',\n }),\n}))\n\nvi.mock('../../util/compareDependencyVersions.js', () => ({\n compareDependencyVersions: vi.fn().mockResolvedValue([]),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n confirm: vi.fn(),\n }\n})\n\nvi.mock('../../util/packageManager/upgradePackages.js')\nvi.mock('../../util/packageManager/packageManagerChoice.js')\n\nvi.mock('@sanity/cli-core', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core')>('@sanity/cli-core')\n return {\n ...actual,\n getProjectCliClient: vi.fn(),\n isInteractive: vi.fn(() => true),\n }\n})\n\nconst mockCheckRequiredDependencies = vi.mocked(checkRequiredDependencies)\nconst mockCompareDependencyVersions = vi.mocked(compareDependencyVersions)\nconst mockConfirm = vi.mocked(confirm)\nconst mockUpgradePackages = vi.mocked(upgradePackages)\nconst mockGetPackageManagerChoice = vi.mocked(getPackageManagerChoice)\nconst mockGetProjectCliClient = vi.mocked(getProjectCliClient)\n\ntype Result = {\n close?: () => Promise<void>\n}\n\ndescribe('#dev', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('help text is correct', async () => {\n const {stdout} = await runCommand(['dev', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"Starts a local development server for Sanity Studio with live reloading\n\n USAGE\n $ sanity dev [--auto-updates] [--host <value>]\n [--load-in-dashboard] [--port <value>]\n\n FLAGS\n --[no-]auto-updates Automatically update Sanity Studio dependencies.\n --host=<value> [default: localhost] The local network interface at\n which to listen.\n --[no-]load-in-dashboard Load the app/studio in the Sanity dashboard.\n --port=<value> [default: 3333] TCP port to start server on.\n\n DESCRIPTION\n Starts a local development server for Sanity Studio with live reloading\n\n EXAMPLES\n $ sanity dev --host=0.0.0.0\n\n $ sanity dev --port=1942\n\n $ sanity dev --load-in-dashboard\n\n \"\n `)\n })\n\n test('shows an error for invalid flags', async () => {\n const {error} = await testCommand(DevCommand, ['--invalid'], {\n mocks: {isInteractive: true},\n })\n\n expect(error?.message).toContain('Nonexistent flag: --invalid')\n })\n\n describe('basic-app', () => {\n test('should start the dev server for app', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const {error, result, stderr, stdout} = await testCommand(DevCommand, ['--port', '5333'], {\n config: {root: cwd},\n mocks: {isInteractive: true},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Dev server started on port 5333')\n expect(stdout).toContain('View your app in the Sanity dashboard here:')\n expect(stderr).toContain('Checking configuration files')\n await (result as Result).close?.()\n })\n\n test('should warn when --no-load-in-dashboard is used with app', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--no-load-in-dashboard', '--port', '5334'],\n {\n config: {root: cwd},\n mocks: {isInteractive: true},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stderr).toContain('Apps cannot run without the Sanity dashboard')\n expect(stderr).toContain('Starting dev server with the --load-in-dashboard flag set to true')\n expect(stdout).toContain('Dev server started on port 5334')\n await (result as Result).close?.()\n })\n\n test('should automatically change port if conflicted', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n // Create a server on port 5338 to block it\n const server = createServer()\n await new Promise<void>((resolve) => {\n server.listen(5338, 'localhost', resolve)\n })\n\n try {\n const {error, result, stdout} = await testCommand(DevCommand, ['--port', '5338'], {\n config: {root: cwd},\n mocks: {isInteractive: true},\n })\n\n expect(error).toBeUndefined()\n // Should automatically pick a different port\n expect(stdout).toMatch(/Dev server started on port \\d{4}/)\n expect(stdout).not.toContain('Dev server started on port 5338')\n expect(stdout).toContain('View your app in the Sanity dashboard here:')\n await (result as Result).close?.()\n } finally {\n // Clean up the server\n await new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err)\n else resolve()\n })\n })\n }\n })\n\n test('should error when organizationId is missing from config', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n // Modify the config to remove organizationId\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n const modifiedConfig = existingConfig.replace(/organizationId: '[^']*',?/, '')\n await writeFile(configPath, modifiedConfig)\n\n const {error} = await testCommand(DevCommand, ['--port', '5341'], {\n config: {root: cwd},\n mocks: {isInteractive: true},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Apps require an organization ID (orgId)')\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n\n describe('basic-studio', () => {\n test('should start the dev server for studio', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const {error, result, stderr, stdout} = await testCommand(DevCommand, ['--port', '5335'], {\n config: {root: cwd},\n mocks: {isInteractive: true},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Sanity Studio using vite@')\n expect(stdout).toContain('ready in')\n expect(stdout).toContain('ms and running at http://localhost:5335')\n expect(stderr).toContain('Checking configuration files')\n await (result as Result).close?.()\n })\n\n test('should start with custom host configuration', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const {error, result, stdout} = await testCommand(\n DevCommand,\n ['--host', '127.0.0.1', '--port', '5336'],\n {\n config: {root: cwd},\n mocks: {isInteractive: true},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('http://127.0.0.1:5336')\n await (result as Result).close?.()\n })\n\n test('should start with load-in-dashboard', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project'\n\n // Need to modify the sanity config to include projectId for this test\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n\n // Add projectId to the config\n const modifiedConfig = existingConfig.replace(\n /projectId: '.*',/,\n `projectId: '${projectId}',`,\n )\n\n await writeFile(configPath, modifiedConfig)\n\n mockGetProjectCliClient.mockResolvedValue({\n projects: {\n getById: vi.fn().mockResolvedValue({organizationId: 'test-org'}),\n },\n } as never)\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--load-in-dashboard', '--port', '5340'],\n {\n config: {root: cwd},\n mocks: {isInteractive: true},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Dev server started on port 5340')\n expect(stdout).toContain('View your studio in the Sanity dashboard here:')\n expect(stdout).toContain('https://www.sanity.io/@test-org?dev=http%3A%2F%2Flocalhost%3A5340')\n expect(stderr).toContain('Checking configuration files')\n\n await (result as Result).close?.()\n })\n\n test('should error when projectId is missing with --load-in-dashboard', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n // Modify config to remove projectId\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n const modifiedConfig = existingConfig.replace(/projectId: '[^']*',/, '')\n await writeFile(configPath, modifiedConfig)\n\n const {error} = await testCommand(DevCommand, ['--load-in-dashboard', '--port', '5343'], {\n config: {root: cwd},\n mocks: {isInteractive: true},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Project Id is required to load in dashboard')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should error when API fails to fetch organizationId', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project'\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n const modifiedConfig = existingConfig.replace(\n /projectId: '.*',/,\n `projectId: '${projectId}',`,\n )\n await writeFile(configPath, modifiedConfig)\n\n mockGetProjectCliClient.mockResolvedValue({\n projects: {\n getById: vi.fn().mockRejectedValue(new Error('Project not found')),\n },\n } as never)\n\n const {error} = await testCommand(DevCommand, ['--load-in-dashboard', '--port', '5344'], {\n config: {root: cwd},\n mocks: {isInteractive: true},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Failed to get organization id from project id')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should start dev server successfully when user declines auto-updates', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockCompareDependencyVersions.mockResolvedValueOnce([\n {\n installed: '3.0.0',\n pkg: 'sanity',\n remote: '3.1.0',\n },\n ])\n mockConfirm.mockResolvedValueOnce(false) // User declines upgrade\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--auto-updates', '--port', '5346'],\n {\n config: {root: cwd},\n },\n )\n\n expect(error).toBeUndefined()\n // Check that the server started successfully with auto-updates flag\n expect(stdout).toMatch(/running at http:\\/\\/localhost:5346/)\n expect(stderr).toContain('Checking configuration files')\n await (result as Result).close?.()\n })\n\n test('should handle auto-updates with version mismatch and user accepts upgrade', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockCompareDependencyVersions.mockResolvedValueOnce([\n {\n installed: '3.0.0',\n pkg: 'sanity',\n remote: '3.1.0',\n },\n ])\n mockConfirm.mockResolvedValueOnce(true) // User accepts upgrade\n\n mockUpgradePackages.mockResolvedValueOnce(undefined)\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'npm',\n mostOptimal: 'npm',\n })\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--auto-updates', '--port', '5348'],\n {\n config: {root: cwd},\n mocks: {isInteractive: true},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stdout).toMatch(/running at http:\\/\\/localhost:5348/)\n expect(stderr).toContain('Checking configuration files')\n\n expect(mockUpgradePackages).toHaveBeenCalledWith(\n {\n packageManager: 'npm',\n packages: [['sanity', '3.1.0']],\n },\n {output: expect.any(Object), workDir: cwd},\n )\n\n await (result as Result).close?.()\n })\n\n test('should handle invalid Sanity version during auto-updates', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockCheckRequiredDependencies.mockResolvedValueOnce({\n installedSanityVersion: 'invalid-version',\n })\n\n const {error} = await testCommand(DevCommand, ['--auto-updates', '--port', '5347'], {\n config: {root: cwd},\n mocks: {isInteractive: true},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Failed to parse installed Sanity version')\n })\n })\n\n test('should throw an error if port is already in use', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n // Create a server on port 5337 to block it\n const server = createServer()\n await new Promise<void>((resolve) => {\n server.listen(5337, 'localhost', resolve)\n })\n\n try {\n const {error} = await testCommand(DevCommand, ['--port', '5337'], {\n config: {root: cwd},\n mocks: {isInteractive: true},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Port 5337 is already in use')\n expect(error?.oclif?.exit).toBe(1)\n } finally {\n // Clean up the server\n await new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err)\n else resolve()\n })\n })\n }\n })\n})\n"],"names":["readFile","writeFile","createServer","join","runCommand","getProjectCliClient","confirm","testCommand","afterEach","describe","expect","test","vi","testExample","checkRequiredDependencies","compareDependencyVersions","getPackageManagerChoice","upgradePackages","DevCommand","mock","fn","mockResolvedValue","installedSanityVersion","actual","importActual","isInteractive","mockCheckRequiredDependencies","mocked","mockCompareDependencyVersions","mockConfirm","mockUpgradePackages","mockGetPackageManagerChoice","mockGetProjectCliClient","clearAllMocks","stdout","toMatchInlineSnapshot","error","mocks","message","toContain","cwd","process","result","stderr","config","root","toBeUndefined","close","server","Promise","resolve","listen","toMatch","not","reject","err","configPath","existingConfig","modifiedConfig","replace","toBeDefined","oclif","exit","toBe","projectId","projects","getById","organizationId","mockRejectedValue","Error","mockResolvedValueOnce","installed","pkg","remote","undefined","chosen","mostOptimal","toHaveBeenCalledWith","packageManager","packages","output","any","Object","workDir"],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { testCommand } from '@sanity/cli-test';
2
+ import { afterEach, describe, expect, test, vi } from 'vitest';
3
+ import { InitCommand } from '../../init';
4
+ const mockGetById = vi.hoisted(()=>vi.fn());
5
+ const mockLogin = vi.hoisted(()=>vi.fn());
6
+ vi.mock('@sanity/cli-core', async (importOriginal)=>{
7
+ const actual = await importOriginal();
8
+ return {
9
+ ...actual,
10
+ getGlobalCliClient: vi.fn().mockResolvedValue({
11
+ users: {
12
+ getById: mockGetById
13
+ }
14
+ })
15
+ };
16
+ });
17
+ vi.mock('@vercel/fs-detectors', ()=>({
18
+ detectFrameworkRecord: vi.fn().mockResolvedValue({
19
+ name: 'Next.js',
20
+ slug: 'nextjs'
21
+ }),
22
+ LocalFileSystemDetector: vi.fn()
23
+ }));
24
+ vi.mock('../../../actions/auth/login/login.js', ()=>({
25
+ login: mockLogin
26
+ }));
27
+ describe('#init: authentication', ()=>{
28
+ afterEach(()=>{
29
+ vi.clearAllMocks();
30
+ });
31
+ test('user is authenticated with valid token', async ()=>{
32
+ mockGetById.mockResolvedValue({
33
+ email: 'test@example.com',
34
+ id: 'user-123',
35
+ name: 'Test User',
36
+ provider: 'saml-123'
37
+ });
38
+ const { error, stdout } = await testCommand(InitCommand, [], {
39
+ mocks: {
40
+ isInteractive: true,
41
+ token: 'test-token'
42
+ }
43
+ });
44
+ expect(error).toBeUndefined();
45
+ expect(stdout).toContain('You are logged in as test@example.com using SAML');
46
+ });
47
+ test('throws error if user is authenticated with invalid token in unattended mode', async ()=>{
48
+ mockGetById.mockRejectedValueOnce(new Error('Invalid token'));
49
+ const { error } = await testCommand(InitCommand, [
50
+ '--yes',
51
+ '--dataset=test',
52
+ '--project==test'
53
+ ], {
54
+ mocks: {
55
+ token: 'test-token'
56
+ }
57
+ });
58
+ expect(error?.message).toContain('Must be logged in to run this command in unattended mode, run `sanity login`');
59
+ });
60
+ test('calls login when token invalid and not in unattended mode', async ()=>{
61
+ mockGetById.mockRejectedValueOnce(new Error('Invalid token'));
62
+ const { error } = await testCommand(InitCommand, [], {
63
+ mocks: {
64
+ isInteractive: true,
65
+ token: 'test-token'
66
+ }
67
+ });
68
+ expect(error).toBe(undefined);
69
+ expect(mockLogin).toHaveBeenCalled();
70
+ });
71
+ });
72
+
73
+ //# sourceMappingURL=init.authentication.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/commands/__tests__/init/init.authentication.test.ts"],"sourcesContent":["import {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {InitCommand} from '../../init'\n\nconst mockGetById = vi.hoisted(() => vi.fn())\nconst mockLogin = vi.hoisted(() => vi.fn())\n\nvi.mock('@sanity/cli-core', async (importOriginal) => {\n const actual = await importOriginal<typeof import('@sanity/cli-core')>()\n return {\n ...actual,\n getGlobalCliClient: vi.fn().mockResolvedValue({\n users: {\n getById: mockGetById,\n } as never,\n }),\n }\n})\n\nvi.mock('@vercel/fs-detectors', () => ({\n detectFrameworkRecord: vi.fn().mockResolvedValue({\n name: 'Next.js',\n slug: 'nextjs',\n }),\n LocalFileSystemDetector: vi.fn(),\n}))\n\nvi.mock('../../../actions/auth/login/login.js', () => ({\n login: mockLogin,\n}))\n\ndescribe('#init: authentication', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('user is authenticated with valid token', async () => {\n mockGetById.mockResolvedValue({\n email: 'test@example.com',\n id: 'user-123',\n name: 'Test User',\n provider: 'saml-123',\n })\n\n const {error, stdout} = await testCommand(InitCommand, [], {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('You are logged in as test@example.com using SAML')\n })\n\n test('throws error if user is authenticated with invalid token in unattended mode', async () => {\n mockGetById.mockRejectedValueOnce(new Error('Invalid token'))\n\n const {error} = await testCommand(InitCommand, ['--yes', '--dataset=test', '--project==test'], {\n mocks: {\n token: 'test-token',\n },\n })\n\n expect(error?.message).toContain(\n 'Must be logged in to run this command in unattended mode, run `sanity login`',\n )\n })\n\n test('calls login when token invalid and not in unattended mode', async () => {\n mockGetById.mockRejectedValueOnce(new Error('Invalid token'))\n\n const {error} = await testCommand(InitCommand, [], {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n })\n\n expect(error).toBe(undefined)\n expect(mockLogin).toHaveBeenCalled()\n })\n})\n"],"names":["testCommand","afterEach","describe","expect","test","vi","InitCommand","mockGetById","hoisted","fn","mockLogin","mock","importOriginal","actual","getGlobalCliClient","mockResolvedValue","users","getById","detectFrameworkRecord","name","slug","LocalFileSystemDetector","login","clearAllMocks","email","id","provider","error","stdout","mocks","isInteractive","token","toBeUndefined","toContain","mockRejectedValueOnce","Error","message","toBe","undefined","toHaveBeenCalled"],"mappings":"AAAA,SAAQA,WAAW,QAAO,mBAAkB;AAC5C,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,WAAW,QAAO,aAAY;AAEtC,MAAMC,cAAcF,GAAGG,OAAO,CAAC,IAAMH,GAAGI,EAAE;AAC1C,MAAMC,YAAYL,GAAGG,OAAO,CAAC,IAAMH,GAAGI,EAAE;AAExCJ,GAAGM,IAAI,CAAC,oBAAoB,OAAOC;IACjC,MAAMC,SAAS,MAAMD;IACrB,OAAO;QACL,GAAGC,MAAM;QACTC,oBAAoBT,GAAGI,EAAE,GAAGM,iBAAiB,CAAC;YAC5CC,OAAO;gBACLC,SAASV;YACX;QACF;IACF;AACF;AAEAF,GAAGM,IAAI,CAAC,wBAAwB,IAAO,CAAA;QACrCO,uBAAuBb,GAAGI,EAAE,GAAGM,iBAAiB,CAAC;YAC/CI,MAAM;YACNC,MAAM;QACR;QACAC,yBAAyBhB,GAAGI,EAAE;IAChC,CAAA;AAEAJ,GAAGM,IAAI,CAAC,wCAAwC,IAAO,CAAA;QACrDW,OAAOZ;IACT,CAAA;AAEAR,SAAS,yBAAyB;IAChCD,UAAU;QACRI,GAAGkB,aAAa;IAClB;IAEAnB,KAAK,0CAA0C;QAC7CG,YAAYQ,iBAAiB,CAAC;YAC5BS,OAAO;YACPC,IAAI;YACJN,MAAM;YACNO,UAAU;QACZ;QAEA,MAAM,EAACC,KAAK,EAAEC,MAAM,EAAC,GAAG,MAAM5B,YAAYM,aAAa,EAAE,EAAE;YACzDuB,OAAO;gBACLC,eAAe;gBACfC,OAAO;YACT;QACF;QAEA5B,OAAOwB,OAAOK,aAAa;QAC3B7B,OAAOyB,QAAQK,SAAS,CAAC;IAC3B;IAEA7B,KAAK,+EAA+E;QAClFG,YAAY2B,qBAAqB,CAAC,IAAIC,MAAM;QAE5C,MAAM,EAACR,KAAK,EAAC,GAAG,MAAM3B,YAAYM,aAAa;YAAC;YAAS;YAAkB;SAAkB,EAAE;YAC7FuB,OAAO;gBACLE,OAAO;YACT;QACF;QAEA5B,OAAOwB,OAAOS,SAASH,SAAS,CAC9B;IAEJ;IAEA7B,KAAK,6DAA6D;QAChEG,YAAY2B,qBAAqB,CAAC,IAAIC,MAAM;QAE5C,MAAM,EAACR,KAAK,EAAC,GAAG,MAAM3B,YAAYM,aAAa,EAAE,EAAE;YACjDuB,OAAO;gBACLC,eAAe;gBACfC,OAAO;YACT;QACF;QAEA5B,OAAOwB,OAAOU,IAAI,CAACC;QACnBnC,OAAOO,WAAW6B,gBAAgB;IACpC;AACF"}
@@ -0,0 +1,195 @@
1
+ import * as cliUX from '@sanity/cli-core/ux';
2
+ import { createTestClient, mockApi, testCommand } from '@sanity/cli-test';
3
+ import nock from 'nock';
4
+ import { afterEach, describe, expect, test, vi } from 'vitest';
5
+ import { ORGANIZATIONS_API_VERSION } from '../../../services/organizations.js';
6
+ import { CREATE_PROJECT_API_VERSION } from '../../../services/projects.js';
7
+ import { InitCommand } from '../../init';
8
+ const mocks = vi.hoisted(()=>({
9
+ datasetsCreate: vi.fn(),
10
+ detectFrameworkRecord: vi.fn(),
11
+ getOrganizationChoices: vi.fn(),
12
+ getOrganizationsWithAttachGrantInfo: vi.fn(),
13
+ input: vi.fn(),
14
+ select: vi.fn(),
15
+ usersGetById: vi.fn()
16
+ }));
17
+ vi.mock('@vercel/fs-detectors', ()=>({
18
+ detectFrameworkRecord: mocks.detectFrameworkRecord,
19
+ LocalFileSystemDetector: vi.fn()
20
+ }));
21
+ vi.mock('@sanity/cli-core/ux', async ()=>{
22
+ const actual = await vi.importActual('@sanity/cli-core/ux');
23
+ return {
24
+ ...actual,
25
+ input: mocks.input,
26
+ select: mocks.select
27
+ };
28
+ });
29
+ vi.mock('@sanity/cli-core', async (importOriginal)=>{
30
+ const actual = await importOriginal();
31
+ const testClient = createTestClient({
32
+ apiVersion: 'v2025-05-14',
33
+ token: 'test-token'
34
+ });
35
+ return {
36
+ ...actual,
37
+ getGlobalCliClient: vi.fn().mockResolvedValue({
38
+ datasets: {
39
+ create: mocks.datasetsCreate
40
+ },
41
+ request: testClient.request,
42
+ users: {
43
+ getById: mocks.usersGetById
44
+ }
45
+ }),
46
+ getProjectCliClient: vi.fn().mockResolvedValue({
47
+ datasets: {
48
+ create: mocks.datasetsCreate
49
+ }
50
+ })
51
+ };
52
+ });
53
+ vi.mock('../../../actions/organizations/getOrganizationChoices.js', ()=>({
54
+ getOrganizationChoices: mocks.getOrganizationChoices
55
+ }));
56
+ vi.mock('../../../actions/organizations/getOrganizationsWithAttachGrantInfo.js', ()=>({
57
+ getOrganizationsWithAttachGrantInfo: mocks.getOrganizationsWithAttachGrantInfo
58
+ }));
59
+ mocks.usersGetById.mockResolvedValue({
60
+ email: 'test@example.com',
61
+ id: 'user-123',
62
+ name: 'Test User',
63
+ provider: 'saml-123'
64
+ });
65
+ describe('#init: create new project', ()=>{
66
+ afterEach(()=>{
67
+ vi.clearAllMocks();
68
+ const pending = nock.pendingMocks();
69
+ nock.cleanAll();
70
+ expect(pending, 'pending mocks').toEqual([]);
71
+ });
72
+ test('prompts user to create new organization if they have none', async ()=>{
73
+ mocks.detectFrameworkRecord.mockResolvedValueOnce(null);
74
+ mockApi({
75
+ apiVersion: ORGANIZATIONS_API_VERSION,
76
+ method: 'get',
77
+ uri: '/organizations'
78
+ }).reply(200, []);
79
+ mocks.input.mockResolvedValueOnce('My New Organization');
80
+ mockApi({
81
+ apiVersion: ORGANIZATIONS_API_VERSION,
82
+ method: 'post',
83
+ uri: '/organizations'
84
+ }).reply(200, {
85
+ createdByUserId: 'user-123',
86
+ defaultRoleName: null,
87
+ features: [],
88
+ id: 'org-123',
89
+ members: [],
90
+ name: 'My New Organization',
91
+ slug: 'my-new-organization'
92
+ });
93
+ mockApi({
94
+ apiVersion: CREATE_PROJECT_API_VERSION,
95
+ method: 'post',
96
+ uri: '/projects'
97
+ }).reply(200, {
98
+ displayName: 'Test Project',
99
+ projectId: 'project-123'
100
+ });
101
+ mocks.datasetsCreate.mockResolvedValueOnce(undefined);
102
+ const spinnerSpy = vi.spyOn(cliUX, 'spinner');
103
+ await testCommand(InitCommand, [
104
+ '--create-project=Test Project',
105
+ '--dataset=production',
106
+ '--output-path=./test-project'
107
+ ], {
108
+ mocks: {
109
+ isInteractive: true,
110
+ token: 'test-token'
111
+ }
112
+ });
113
+ expect(mocks.input).toHaveBeenCalledWith(expect.objectContaining({
114
+ default: 'Test User',
115
+ message: 'Organization name:'
116
+ }));
117
+ expect(mocks.datasetsCreate).toHaveBeenCalledWith('production');
118
+ expect(spinnerSpy).toHaveBeenCalledWith('Creating organization');
119
+ expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset');
120
+ });
121
+ test('prompts user to select then create a new organization', async ()=>{
122
+ mocks.detectFrameworkRecord.mockResolvedValueOnce(null);
123
+ mockApi({
124
+ apiVersion: ORGANIZATIONS_API_VERSION,
125
+ method: 'get',
126
+ uri: '/organizations'
127
+ }).reply(200, [
128
+ {
129
+ id: 'existing-org-123',
130
+ name: 'Existing Organization',
131
+ slug: 'existing-organization'
132
+ }
133
+ ]);
134
+ mocks.getOrganizationsWithAttachGrantInfo.mockResolvedValueOnce([
135
+ {
136
+ hasAttachGrant: true,
137
+ organization: {
138
+ id: 'existing-org-123',
139
+ name: 'Existing Organization',
140
+ slug: 'existing-organization'
141
+ }
142
+ }
143
+ ]);
144
+ mocks.getOrganizationChoices.mockReturnValueOnce([
145
+ {
146
+ name: 'Existing Organization [existing-org-123]',
147
+ value: 'existing-org-123'
148
+ },
149
+ {
150
+ name: 'Create new organization',
151
+ value: '-new-'
152
+ }
153
+ ]);
154
+ mocks.select.mockResolvedValueOnce('-new-');
155
+ mocks.input.mockResolvedValueOnce('Brand New Organization');
156
+ mockApi({
157
+ apiVersion: ORGANIZATIONS_API_VERSION,
158
+ method: 'post',
159
+ uri: '/organizations'
160
+ }).reply(200, {
161
+ createdByUserId: 'user-123',
162
+ defaultRoleName: null,
163
+ features: [],
164
+ id: 'new-org-456',
165
+ members: [],
166
+ name: 'Brand New Organization',
167
+ slug: 'brand-new-organization'
168
+ });
169
+ mockApi({
170
+ apiVersion: CREATE_PROJECT_API_VERSION,
171
+ method: 'post',
172
+ uri: '/projects'
173
+ }).reply(200, {
174
+ displayName: 'Test Project',
175
+ projectId: 'project-123'
176
+ });
177
+ mocks.datasetsCreate.mockResolvedValueOnce(undefined);
178
+ const spinnerSpy = vi.spyOn(cliUX, 'spinner');
179
+ await testCommand(InitCommand, [
180
+ '--create-project=Test Project',
181
+ '--dataset=production',
182
+ '--output-path=./test-project'
183
+ ], {
184
+ mocks: {
185
+ isInteractive: true,
186
+ token: 'test-token'
187
+ }
188
+ });
189
+ expect(mocks.datasetsCreate).toHaveBeenCalledWith('production');
190
+ expect(spinnerSpy).toHaveBeenCalledWith('Creating organization');
191
+ expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset');
192
+ });
193
+ });
194
+
195
+ //# sourceMappingURL=init.create-new-project.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/commands/__tests__/init/init.create-new-project.test.ts"],"sourcesContent":["import * as cliUX from '@sanity/cli-core/ux'\nimport {createTestClient, mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {ORGANIZATIONS_API_VERSION} from '../../../services/organizations.js'\nimport {CREATE_PROJECT_API_VERSION} from '../../../services/projects.js'\nimport {InitCommand} from '../../init'\n\nconst mocks = vi.hoisted(() => ({\n datasetsCreate: vi.fn(),\n detectFrameworkRecord: vi.fn(),\n getOrganizationChoices: vi.fn(),\n getOrganizationsWithAttachGrantInfo: vi.fn(),\n input: vi.fn(),\n select: vi.fn(),\n usersGetById: vi.fn(),\n}))\n\nvi.mock('@vercel/fs-detectors', () => ({\n detectFrameworkRecord: mocks.detectFrameworkRecord,\n LocalFileSystemDetector: vi.fn(),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual('@sanity/cli-core/ux')\n\n return {\n ...actual,\n input: mocks.input,\n select: mocks.select,\n }\n})\n\nvi.mock('@sanity/cli-core', async (importOriginal) => {\n const actual = await importOriginal<typeof import('@sanity/cli-core')>()\n const testClient = createTestClient({\n apiVersion: 'v2025-05-14',\n token: 'test-token',\n })\n\n return {\n ...actual,\n getGlobalCliClient: vi.fn().mockResolvedValue({\n datasets: {\n create: mocks.datasetsCreate,\n } as never,\n request: testClient.request,\n users: {\n getById: mocks.usersGetById,\n } as never,\n }),\n getProjectCliClient: vi.fn().mockResolvedValue({\n datasets: {\n create: mocks.datasetsCreate,\n } as never,\n }),\n }\n})\n\nvi.mock('../../../actions/organizations/getOrganizationChoices.js', () => ({\n getOrganizationChoices: mocks.getOrganizationChoices,\n}))\n\nvi.mock('../../../actions/organizations/getOrganizationsWithAttachGrantInfo.js', () => ({\n getOrganizationsWithAttachGrantInfo: mocks.getOrganizationsWithAttachGrantInfo,\n}))\n\nmocks.usersGetById.mockResolvedValue({\n email: 'test@example.com',\n id: 'user-123',\n name: 'Test User',\n provider: 'saml-123',\n})\n\ndescribe('#init: create new project', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('prompts user to create new organization if they have none', async () => {\n mocks.detectFrameworkRecord.mockResolvedValueOnce(null)\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'get',\n uri: '/organizations',\n }).reply(200, [])\n\n mocks.input.mockResolvedValueOnce('My New Organization')\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'post',\n uri: '/organizations',\n }).reply(200, {\n createdByUserId: 'user-123',\n defaultRoleName: null,\n features: [],\n id: 'org-123',\n members: [],\n name: 'My New Organization',\n slug: 'my-new-organization',\n })\n\n mockApi({\n apiVersion: CREATE_PROJECT_API_VERSION,\n method: 'post',\n uri: '/projects',\n }).reply(200, {\n displayName: 'Test Project',\n projectId: 'project-123',\n })\n\n mocks.datasetsCreate.mockResolvedValueOnce(undefined)\n\n const spinnerSpy = vi.spyOn(cliUX, 'spinner')\n\n await testCommand(\n InitCommand,\n ['--create-project=Test Project', '--dataset=production', '--output-path=./test-project'],\n {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n },\n )\n\n expect(mocks.input).toHaveBeenCalledWith(\n expect.objectContaining({\n default: 'Test User',\n message: 'Organization name:',\n }),\n )\n\n expect(mocks.datasetsCreate).toHaveBeenCalledWith('production')\n\n expect(spinnerSpy).toHaveBeenCalledWith('Creating organization')\n expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset')\n })\n\n test('prompts user to select then create a new organization', async () => {\n mocks.detectFrameworkRecord.mockResolvedValueOnce(null)\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'get',\n uri: '/organizations',\n }).reply(200, [\n {\n id: 'existing-org-123',\n name: 'Existing Organization',\n slug: 'existing-organization',\n },\n ])\n\n mocks.getOrganizationsWithAttachGrantInfo.mockResolvedValueOnce([\n {\n hasAttachGrant: true,\n organization: {\n id: 'existing-org-123',\n name: 'Existing Organization',\n slug: 'existing-organization',\n },\n },\n ])\n\n mocks.getOrganizationChoices.mockReturnValueOnce([\n {name: 'Existing Organization [existing-org-123]', value: 'existing-org-123'},\n {name: 'Create new organization', value: '-new-'},\n ])\n\n mocks.select.mockResolvedValueOnce('-new-')\n\n mocks.input.mockResolvedValueOnce('Brand New Organization')\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'post',\n uri: '/organizations',\n }).reply(200, {\n createdByUserId: 'user-123',\n defaultRoleName: null,\n features: [],\n id: 'new-org-456',\n members: [],\n name: 'Brand New Organization',\n slug: 'brand-new-organization',\n })\n\n mockApi({\n apiVersion: CREATE_PROJECT_API_VERSION,\n method: 'post',\n uri: '/projects',\n }).reply(200, {\n displayName: 'Test Project',\n projectId: 'project-123',\n })\n\n mocks.datasetsCreate.mockResolvedValueOnce(undefined)\n\n const spinnerSpy = vi.spyOn(cliUX, 'spinner')\n\n await testCommand(\n InitCommand,\n ['--create-project=Test Project', '--dataset=production', '--output-path=./test-project'],\n {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n },\n )\n\n expect(mocks.datasetsCreate).toHaveBeenCalledWith('production')\n\n expect(spinnerSpy).toHaveBeenCalledWith('Creating organization')\n expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset')\n })\n})\n"],"names":["cliUX","createTestClient","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","ORGANIZATIONS_API_VERSION","CREATE_PROJECT_API_VERSION","InitCommand","mocks","hoisted","datasetsCreate","fn","detectFrameworkRecord","getOrganizationChoices","getOrganizationsWithAttachGrantInfo","input","select","usersGetById","mock","LocalFileSystemDetector","actual","importActual","importOriginal","testClient","apiVersion","token","getGlobalCliClient","mockResolvedValue","datasets","create","request","users","getById","getProjectCliClient","email","id","name","provider","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","mockResolvedValueOnce","method","uri","reply","createdByUserId","defaultRoleName","features","members","slug","displayName","projectId","undefined","spinnerSpy","spyOn","isInteractive","toHaveBeenCalledWith","objectContaining","default","message","hasAttachGrant","organization","mockReturnValueOnce","value"],"mappings":"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"}