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

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 (608) hide show
  1. package/dist/actions/dataset/create.d.ts +49 -0
  2. package/dist/actions/dataset/create.js +48 -0
  3. package/dist/actions/dataset/create.js.map +1 -0
  4. package/dist/actions/dataset/determineDatasetAclMode.d.ts +37 -0
  5. package/dist/actions/dataset/determineDatasetAclMode.js +36 -0
  6. package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -0
  7. package/dist/actions/debug/gatherDebugInfo.js +15 -21
  8. package/dist/actions/debug/gatherDebugInfo.js.map +1 -1
  9. package/dist/actions/debug/types.d.ts +0 -2
  10. package/dist/actions/debug/types.js.map +1 -1
  11. package/dist/actions/deploy/deployApp.js +13 -0
  12. package/dist/actions/deploy/deployApp.js.map +1 -1
  13. package/dist/actions/dev/startStudioDevServer.js +3 -8
  14. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  15. package/dist/actions/dev/types.d.ts +1 -3
  16. package/dist/actions/dev/types.js.map +1 -1
  17. package/dist/actions/documents/validate.d.ts +0 -2
  18. package/dist/actions/documents/validate.js +21 -1
  19. package/dist/actions/documents/validate.js.map +1 -1
  20. package/dist/actions/exec/execScript.js +1 -1
  21. package/dist/actions/exec/execScript.js.map +1 -1
  22. package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
  23. package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
  24. package/dist/actions/init/remoteTemplate.js +1 -1
  25. package/dist/actions/init/remoteTemplate.js.map +1 -1
  26. package/dist/actions/manifest/extractAppManifest.d.ts +20 -0
  27. package/dist/actions/manifest/extractAppManifest.js +51 -0
  28. package/dist/actions/manifest/extractAppManifest.js.map +1 -0
  29. package/dist/actions/manifest/extractManifest.js +2 -5
  30. package/dist/actions/manifest/extractManifest.js.map +1 -1
  31. package/dist/actions/manifest/types.d.ts +6 -1
  32. package/dist/actions/manifest/types.js.map +1 -1
  33. package/dist/actions/media/importAspects.js +2 -1
  34. package/dist/actions/media/importAspects.js.map +1 -1
  35. package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
  36. package/dist/actions/schema/deleteSchemaAction.js +12 -17
  37. package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
  38. package/dist/actions/schema/deploySchemas.d.ts +15 -0
  39. package/dist/actions/schema/deploySchemas.js +98 -0
  40. package/dist/actions/schema/deploySchemas.js.map +1 -0
  41. package/dist/actions/schema/listSchemas.d.ts +12 -0
  42. package/dist/actions/schema/listSchemas.js +119 -0
  43. package/dist/actions/schema/listSchemas.js.map +1 -0
  44. package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
  45. package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
  46. package/dist/actions/schema/utils/debug.d.ts +2 -0
  47. package/dist/actions/schema/utils/debug.js +5 -0
  48. package/dist/actions/schema/utils/debug.js.map +1 -0
  49. package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
  50. package/dist/actions/schema/utils/manifestExtractor.js +12 -17
  51. package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
  52. package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
  53. package/dist/actions/schema/utils/manifestReader.js +6 -12
  54. package/dist/actions/schema/utils/manifestReader.js.map +1 -1
  55. package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
  56. package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
  57. package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
  58. package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
  59. package/dist/actions/schema/utils/schemaStoreValidation.js +38 -125
  60. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  61. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
  62. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
  63. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
  64. package/dist/actions/users/getMembersForProject.d.ts +1 -3
  65. package/dist/actions/users/getMembersForProject.js +6 -17
  66. package/dist/actions/users/getMembersForProject.js.map +1 -1
  67. package/dist/actions/users/types.d.ts +0 -11
  68. package/dist/actions/users/types.js.map +1 -1
  69. package/dist/commands/backup/disable.js +5 -11
  70. package/dist/commands/backup/disable.js.map +1 -1
  71. package/dist/commands/backup/enable.js +5 -11
  72. package/dist/commands/backup/enable.js.map +1 -1
  73. package/dist/commands/backup/list.js +7 -8
  74. package/dist/commands/backup/list.js.map +1 -1
  75. package/dist/commands/cors/add.js +5 -13
  76. package/dist/commands/cors/add.js.map +1 -1
  77. package/dist/commands/cors/delete.js +7 -15
  78. package/dist/commands/cors/delete.js.map +1 -1
  79. package/dist/commands/cors/list.js +2 -10
  80. package/dist/commands/cors/list.js.map +1 -1
  81. package/dist/commands/dataset/create.d.ts +0 -2
  82. package/dist/commands/dataset/create.js +8 -54
  83. package/dist/commands/dataset/create.js.map +1 -1
  84. package/dist/commands/dataset/export.js +4 -4
  85. package/dist/commands/dataset/export.js.map +1 -1
  86. package/dist/commands/debug.js +5 -9
  87. package/dist/commands/debug.js.map +1 -1
  88. package/dist/commands/dev.js +0 -1
  89. package/dist/commands/dev.js.map +1 -1
  90. package/dist/commands/documents/create.d.ts +1 -0
  91. package/dist/commands/documents/create.js +10 -9
  92. package/dist/commands/documents/create.js.map +1 -1
  93. package/dist/commands/documents/delete.js +2 -3
  94. package/dist/commands/documents/delete.js.map +1 -1
  95. package/dist/commands/documents/get.js +2 -3
  96. package/dist/commands/documents/get.js.map +1 -1
  97. package/dist/commands/documents/query.js +2 -3
  98. package/dist/commands/documents/query.js.map +1 -1
  99. package/dist/commands/documents/validate.js +0 -20
  100. package/dist/commands/documents/validate.js.map +1 -1
  101. package/dist/commands/graphql/list.js +2 -2
  102. package/dist/commands/graphql/list.js.map +1 -1
  103. package/dist/commands/graphql/undeploy.js +4 -9
  104. package/dist/commands/graphql/undeploy.js.map +1 -1
  105. package/dist/commands/hook/create.js +2 -6
  106. package/dist/commands/hook/create.js.map +1 -1
  107. package/dist/commands/hook/delete.js +5 -17
  108. package/dist/commands/hook/delete.js.map +1 -1
  109. package/dist/commands/hook/list.js +2 -8
  110. package/dist/commands/hook/list.js.map +1 -1
  111. package/dist/commands/init.d.ts +6 -1
  112. package/dist/commands/init.js +358 -20
  113. package/dist/commands/init.js.map +1 -1
  114. package/dist/commands/manifest/extract.js +7 -8
  115. package/dist/commands/manifest/extract.js.map +1 -1
  116. package/dist/commands/media/export.js +2 -2
  117. package/dist/commands/media/export.js.map +1 -1
  118. package/dist/commands/media/import.js +2 -2
  119. package/dist/commands/media/import.js.map +1 -1
  120. package/dist/commands/projects/list.js +2 -6
  121. package/dist/commands/projects/list.js.map +1 -1
  122. package/dist/commands/schema/delete.d.ts +1 -1
  123. package/dist/commands/schema/delete.js +20 -23
  124. package/dist/commands/schema/delete.js.map +1 -1
  125. package/dist/commands/schema/deploy.d.ts +16 -0
  126. package/dist/commands/schema/deploy.js +98 -0
  127. package/dist/commands/schema/deploy.js.map +1 -0
  128. package/dist/commands/schema/list.d.ts +15 -0
  129. package/dist/commands/schema/list.js +104 -0
  130. package/dist/commands/schema/list.js.map +1 -0
  131. package/dist/commands/tokens/add.js +3 -5
  132. package/dist/commands/tokens/add.js.map +1 -1
  133. package/dist/commands/users/invite.js +6 -17
  134. package/dist/commands/users/invite.js.map +1 -1
  135. package/dist/commands/users/list.js +4 -7
  136. package/dist/commands/users/list.js.map +1 -1
  137. package/dist/config/createCliConfig.d.ts +13 -4
  138. package/dist/prompts/init/promptForTypescript.d.ts +2 -0
  139. package/dist/prompts/init/promptForTypescript.js +15 -0
  140. package/dist/prompts/init/promptForTypescript.js.map +1 -0
  141. package/dist/prompts/promptForDatasetAclMode.d.ts +9 -0
  142. package/dist/prompts/promptForDatasetAclMode.js +27 -0
  143. package/dist/prompts/promptForDatasetAclMode.js.map +1 -0
  144. package/dist/prompts/promptForDatasetName.d.ts +1 -1
  145. package/dist/prompts/promptForDatasetName.js +4 -1
  146. package/dist/prompts/promptForDatasetName.js.map +1 -1
  147. package/dist/services/backup.d.ts +8 -0
  148. package/dist/services/backup.js +19 -0
  149. package/dist/services/backup.js.map +1 -1
  150. package/dist/services/cors.d.ts +23 -0
  151. package/dist/services/cors.js +38 -0
  152. package/dist/services/cors.js.map +1 -0
  153. package/dist/services/graphql.d.ts +7 -0
  154. package/dist/services/graphql.js +11 -0
  155. package/dist/services/graphql.js.map +1 -1
  156. package/dist/services/hooks.d.ts +2 -0
  157. package/dist/services/hooks.js +19 -0
  158. package/dist/services/hooks.js.map +1 -1
  159. package/dist/services/organizations.d.ts +4 -2
  160. package/dist/services/organizations.js +3 -2
  161. package/dist/services/organizations.js.map +1 -1
  162. package/dist/services/projects.d.ts +11 -0
  163. package/dist/services/projects.js +41 -0
  164. package/dist/services/projects.js.map +1 -1
  165. package/dist/services/schemas.d.ts +4 -0
  166. package/dist/services/schemas.js +40 -0
  167. package/dist/services/schemas.js.map +1 -0
  168. package/dist/services/user.d.ts +13 -0
  169. package/dist/services/user.js +27 -3
  170. package/dist/services/user.js.map +1 -1
  171. package/dist/services/userApplications.d.ts +3 -1
  172. package/dist/services/userApplications.js +5 -1
  173. package/dist/services/userApplications.js.map +1 -1
  174. package/dist/util/errorMessages.d.ts +1 -0
  175. package/dist/util/errorMessages.js +1 -0
  176. package/dist/util/errorMessages.js.map +1 -1
  177. package/dist/util/getCliVersion.js +1 -1
  178. package/dist/util/getCliVersion.js.map +1 -1
  179. package/dist/util/readPackageJson.d.ts +1 -15
  180. package/dist/util/readPackageJson.js +1 -1
  181. package/dist/util/readPackageJson.js.map +1 -1
  182. package/dist/util/uniqBy.d.ts +1 -0
  183. package/dist/util/uniqBy.js +14 -0
  184. package/dist/util/uniqBy.js.map +1 -0
  185. package/oclif.manifest.json +284 -139
  186. package/package.json +36 -33
  187. package/templates/app-quickstart/src/App.css +20 -0
  188. package/templates/app-quickstart/src/App.tsx +25 -0
  189. package/templates/app-quickstart/src/ExampleComponent.css +90 -0
  190. package/templates/app-quickstart/src/ExampleComponent.tsx +37 -0
  191. package/templates/app-sanity-ui/src/App.tsx +34 -0
  192. package/templates/app-sanity-ui/src/ExampleComponent.tsx +34 -0
  193. package/templates/app-sanity-ui/src/SanityUI.tsx +23 -0
  194. package/templates/blog/README.md +11 -0
  195. package/templates/blog/schemaTypes/author.js +50 -0
  196. package/templates/blog/schemaTypes/blockContent.js +67 -0
  197. package/templates/blog/schemaTypes/category.js +19 -0
  198. package/templates/blog/schemaTypes/index.js +6 -0
  199. package/templates/blog/schemaTypes/post.js +65 -0
  200. package/templates/blog/static/.gitkeep +1 -0
  201. package/templates/clean/README.md +9 -0
  202. package/templates/clean/schemaTypes/index.js +1 -0
  203. package/templates/clean/static/.gitkeep +1 -0
  204. package/templates/ecommerce/README.md +11 -0
  205. package/templates/ecommerce/plugins/.gitkeep +1 -0
  206. package/templates/ecommerce/plugins/barcode-input/BarcodeInput.js +62 -0
  207. package/templates/ecommerce/plugins/barcode-input/index.js +9 -0
  208. package/templates/ecommerce/plugins/barcode-input/schemaType.js +60 -0
  209. package/templates/ecommerce/schemaTypes/blockContent.js +67 -0
  210. package/templates/ecommerce/schemaTypes/category.js +39 -0
  211. package/templates/ecommerce/schemaTypes/index.js +23 -0
  212. package/templates/ecommerce/schemaTypes/locale/localeBlockContent.js +19 -0
  213. package/templates/ecommerce/schemaTypes/locale/localeString.js +19 -0
  214. package/templates/ecommerce/schemaTypes/locale/localeText.js +19 -0
  215. package/templates/ecommerce/schemaTypes/locale/supportedLanguages.js +5 -0
  216. package/templates/ecommerce/schemaTypes/product.js +83 -0
  217. package/templates/ecommerce/schemaTypes/productVariant.js +52 -0
  218. package/templates/ecommerce/schemaTypes/vendor.js +39 -0
  219. package/templates/ecommerce/static/.gitkeep +1 -0
  220. package/templates/get-started/README.md +9 -0
  221. package/templates/get-started/plugins/.gitkeep +1 -0
  222. package/templates/get-started/plugins/sanity-plugin-tutorial/CustomDefaultLayout.tsx +16 -0
  223. package/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +104 -0
  224. package/templates/get-started/plugins/sanity-plugin-tutorial/index.ts +11 -0
  225. package/templates/get-started/schemaTypes/index.ts +1 -0
  226. package/templates/get-started/static/.gitkeep +1 -0
  227. package/templates/moviedb/README.md +10 -0
  228. package/templates/moviedb/schemaTypes/blockContent.js +67 -0
  229. package/templates/moviedb/schemaTypes/castMember.js +37 -0
  230. package/templates/moviedb/schemaTypes/crewMember.js +52 -0
  231. package/templates/moviedb/schemaTypes/index.js +22 -0
  232. package/templates/moviedb/schemaTypes/movie.js +85 -0
  233. package/templates/moviedb/schemaTypes/person.js +37 -0
  234. package/templates/moviedb/schemaTypes/plotSummaries.js +20 -0
  235. package/templates/moviedb/schemaTypes/plotSummary.js +24 -0
  236. package/templates/moviedb/schemaTypes/screening.js +81 -0
  237. package/templates/moviedb/static/.gitkeep +1 -0
  238. package/templates/quickstart/README.md +9 -0
  239. package/templates/quickstart/schemaTypes/index.js +1 -0
  240. package/templates/quickstart/static/.gitkeep +1 -0
  241. package/templates/shared/gitignore.txt +29 -0
  242. package/templates/shared/tsconfig.json +17 -0
  243. package/templates/shopify/README.md +85 -0
  244. package/templates/shopify/components/hotspots/ProductTooltip.tsx +38 -0
  245. package/templates/shopify/components/icons/Shopify.tsx +20 -0
  246. package/templates/shopify/components/inputs/CollectionHidden.tsx +23 -0
  247. package/templates/shopify/components/inputs/PlaceholderString.tsx +20 -0
  248. package/templates/shopify/components/inputs/ProductHidden.tsx +64 -0
  249. package/templates/shopify/components/inputs/ProductVariantHidden.tsx +24 -0
  250. package/templates/shopify/components/inputs/ProxyString.tsx +32 -0
  251. package/templates/shopify/components/media/ColorTheme.tsx +38 -0
  252. package/templates/shopify/components/media/ShopifyDocumentStatus.tsx +82 -0
  253. package/templates/shopify/components/studio/Navbar.tsx +29 -0
  254. package/templates/shopify/constants.ts +61 -0
  255. package/templates/shopify/docs/features.md +158 -0
  256. package/templates/shopify/plugins/customDocumentActions/index.ts +55 -0
  257. package/templates/shopify/plugins/customDocumentActions/shopifyDelete.tsx +144 -0
  258. package/templates/shopify/plugins/customDocumentActions/shopifyLink.ts +39 -0
  259. package/templates/shopify/plugins/customDocumentActions/types.ts +14 -0
  260. package/templates/shopify/schemaTypes/documents/collection.tsx +142 -0
  261. package/templates/shopify/schemaTypes/documents/colorTheme.tsx +44 -0
  262. package/templates/shopify/schemaTypes/documents/page.ts +70 -0
  263. package/templates/shopify/schemaTypes/documents/product.tsx +132 -0
  264. package/templates/shopify/schemaTypes/documents/productVariant.tsx +67 -0
  265. package/templates/shopify/schemaTypes/index.ts +108 -0
  266. package/templates/shopify/schemaTypes/objects/collection/collectionGroupType.ts +27 -0
  267. package/templates/shopify/schemaTypes/objects/collection/collectionLinksType.ts +16 -0
  268. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorObjectType.tsx +48 -0
  269. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorType.tsx +50 -0
  270. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeObjectType.ts +40 -0
  271. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeType.ts +49 -0
  272. package/templates/shopify/schemaTypes/objects/global/footerType.ts +22 -0
  273. package/templates/shopify/schemaTypes/objects/global/menuLinksType.ts +21 -0
  274. package/templates/shopify/schemaTypes/objects/global/menuType.ts +17 -0
  275. package/templates/shopify/schemaTypes/objects/global/notFoundPageType.ts +37 -0
  276. package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +48 -0
  277. package/templates/shopify/schemaTypes/objects/hotspot/productHotspotsType.tsx +17 -0
  278. package/templates/shopify/schemaTypes/objects/hotspot/spotType.tsx +60 -0
  279. package/templates/shopify/schemaTypes/objects/link/linkEmailType.tsx +34 -0
  280. package/templates/shopify/schemaTypes/objects/link/linkExternalType.tsx +37 -0
  281. package/templates/shopify/schemaTypes/objects/link/linkInternalType.tsx +33 -0
  282. package/templates/shopify/schemaTypes/objects/link/linkProductType.tsx +60 -0
  283. package/templates/shopify/schemaTypes/objects/module/accordionGroupType.ts +33 -0
  284. package/templates/shopify/schemaTypes/objects/module/accordionType.ts +28 -0
  285. package/templates/shopify/schemaTypes/objects/module/callToActionType.tsx +85 -0
  286. package/templates/shopify/schemaTypes/objects/module/calloutType.ts +38 -0
  287. package/templates/shopify/schemaTypes/objects/module/collectionReferenceType.tsx +47 -0
  288. package/templates/shopify/schemaTypes/objects/module/gridItemType.ts +41 -0
  289. package/templates/shopify/schemaTypes/objects/module/gridType.ts +28 -0
  290. package/templates/shopify/schemaTypes/objects/module/heroType.tsx +40 -0
  291. package/templates/shopify/schemaTypes/objects/module/imageCallToActionType.tsx +19 -0
  292. package/templates/shopify/schemaTypes/objects/module/imageFeatureType.ts +80 -0
  293. package/templates/shopify/schemaTypes/objects/module/imageFeaturesType.tsx +51 -0
  294. package/templates/shopify/schemaTypes/objects/module/instagramType.ts +35 -0
  295. package/templates/shopify/schemaTypes/objects/module/productFeaturesType.tsx +50 -0
  296. package/templates/shopify/schemaTypes/objects/module/productReferenceType.tsx +42 -0
  297. package/templates/shopify/schemaTypes/objects/seoType.ts +31 -0
  298. package/templates/shopify/schemaTypes/objects/shopify/collectionRuleType.tsx +37 -0
  299. package/templates/shopify/schemaTypes/objects/shopify/inventoryType.ts +25 -0
  300. package/templates/shopify/schemaTypes/objects/shopify/optionType.tsx +31 -0
  301. package/templates/shopify/schemaTypes/objects/shopify/placeholderStringType.ts +11 -0
  302. package/templates/shopify/schemaTypes/objects/shopify/priceRangeType.ts +20 -0
  303. package/templates/shopify/schemaTypes/objects/shopify/productWithVariantType.tsx +142 -0
  304. package/templates/shopify/schemaTypes/objects/shopify/proxyStringType.ts +12 -0
  305. package/templates/shopify/schemaTypes/objects/shopify/shopType.ts +15 -0
  306. package/templates/shopify/schemaTypes/objects/shopify/shopifyCollectionType.ts +84 -0
  307. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductType.ts +131 -0
  308. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductVariantType.ts +121 -0
  309. package/templates/shopify/schemaTypes/portableText/portableTextSimpleType.tsx +45 -0
  310. package/templates/shopify/schemaTypes/portableText/portableTextType.tsx +52 -0
  311. package/templates/shopify/schemaTypes/singletons/homeType.ts +49 -0
  312. package/templates/shopify/schemaTypes/singletons/settingsType.ts +96 -0
  313. package/templates/shopify/static/.gitkeep +1 -0
  314. package/templates/shopify/structure/collectionStructure.ts +9 -0
  315. package/templates/shopify/structure/colorThemeStructure.ts +9 -0
  316. package/templates/shopify/structure/homeStructure.ts +9 -0
  317. package/templates/shopify/structure/index.ts +57 -0
  318. package/templates/shopify/structure/pageStructure.ts +11 -0
  319. package/templates/shopify/structure/productStructure.ts +51 -0
  320. package/templates/shopify/structure/settingStructure.ts +9 -0
  321. package/templates/shopify/utils/blocksToText.ts +20 -0
  322. package/templates/shopify/utils/defineStructure.ts +11 -0
  323. package/templates/shopify/utils/getPriceRange.ts +24 -0
  324. package/templates/shopify/utils/shopifyUrls.ts +22 -0
  325. package/templates/shopify/utils/validateSlug.ts +18 -0
  326. package/templates/shopify-online-storefront/README.md +54 -0
  327. package/templates/shopify-online-storefront/components/icons/Shopify.tsx +22 -0
  328. package/templates/shopify-online-storefront/components/inputs/CollectionHidden.tsx +23 -0
  329. package/templates/shopify-online-storefront/components/inputs/PlaceholderString.tsx +25 -0
  330. package/templates/shopify-online-storefront/components/inputs/ProductHidden.tsx +66 -0
  331. package/templates/shopify-online-storefront/components/inputs/ProductVariantHidden.tsx +25 -0
  332. package/templates/shopify-online-storefront/components/inputs/ProxyString.tsx +38 -0
  333. package/templates/shopify-online-storefront/components/media/ShopifyDocumentStatus.tsx +83 -0
  334. package/templates/shopify-online-storefront/constants.ts +18 -0
  335. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/index.ts +45 -0
  336. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyDelete.tsx +144 -0
  337. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyLink.ts +39 -0
  338. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/types.ts +14 -0
  339. package/templates/shopify-online-storefront/schemaTypes/blocks/blockContent.ts +32 -0
  340. package/templates/shopify-online-storefront/schemaTypes/documents/collection.tsx +83 -0
  341. package/templates/shopify-online-storefront/schemaTypes/documents/product.tsx +102 -0
  342. package/templates/shopify-online-storefront/schemaTypes/documents/productVariant.tsx +82 -0
  343. package/templates/shopify-online-storefront/schemaTypes/index.ts +43 -0
  344. package/templates/shopify-online-storefront/schemaTypes/objects/accordion.ts +31 -0
  345. package/templates/shopify-online-storefront/schemaTypes/objects/accordionGroup.ts +35 -0
  346. package/templates/shopify-online-storefront/schemaTypes/objects/callout.ts +40 -0
  347. package/templates/shopify-online-storefront/schemaTypes/objects/inventory.ts +30 -0
  348. package/templates/shopify-online-storefront/schemaTypes/objects/option.ts +30 -0
  349. package/templates/shopify-online-storefront/schemaTypes/objects/priceRange.ts +22 -0
  350. package/templates/shopify-online-storefront/schemaTypes/objects/proxyString.ts +11 -0
  351. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollection.ts +109 -0
  352. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollectionRule.tsx +45 -0
  353. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProduct.ts +165 -0
  354. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProductVariant.ts +151 -0
  355. package/templates/shopify-online-storefront/structure/collectionStructure.ts +9 -0
  356. package/templates/shopify-online-storefront/structure/index.ts +37 -0
  357. package/templates/shopify-online-storefront/structure/productStructure.ts +35 -0
  358. package/templates/shopify-online-storefront/utils/defineStructure.ts +11 -0
  359. package/templates/shopify-online-storefront/utils/getPriceRange.ts +24 -0
  360. package/templates/shopify-online-storefront/utils/shopifyUrls.ts +22 -0
  361. package/dist/actions/build/__tests__/buildApp.test.js +0 -367
  362. package/dist/actions/build/__tests__/buildApp.test.js.map +0 -1
  363. package/dist/actions/build/__tests__/buildStudio.test.js +0 -561
  364. package/dist/actions/build/__tests__/buildStudio.test.js.map +0 -1
  365. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js +0 -233
  366. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js.map +0 -1
  367. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js +0 -414
  368. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js.map +0 -1
  369. package/dist/actions/build/__tests__/determineBasePath.test.js +0 -24
  370. package/dist/actions/build/__tests__/determineBasePath.test.js.map +0 -1
  371. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js +0 -109
  372. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js.map +0 -1
  373. package/dist/actions/build/__tests__/getViteConfig.test.js +0 -493
  374. package/dist/actions/build/__tests__/getViteConfig.test.js.map +0 -1
  375. package/dist/actions/build/__tests__/renderDocument.test.js +0 -278
  376. package/dist/actions/build/__tests__/renderDocument.test.js.map +0 -1
  377. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js +0 -153
  378. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js.map +0 -1
  379. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js +0 -657
  380. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js.map +0 -1
  381. package/dist/actions/cors/constants.d.ts +0 -1
  382. package/dist/actions/cors/constants.js +0 -3
  383. package/dist/actions/cors/constants.js.map +0 -1
  384. package/dist/actions/cors/types.d.ts +0 -9
  385. package/dist/actions/cors/types.js +0 -3
  386. package/dist/actions/cors/types.js.map +0 -1
  387. package/dist/actions/dataset/__tests__/validateDatasetName.test.js +0 -182
  388. package/dist/actions/dataset/__tests__/validateDatasetName.test.js.map +0 -1
  389. package/dist/actions/deploy/__tests__/checkDir.test.js +0 -120
  390. package/dist/actions/deploy/__tests__/checkDir.test.js.map +0 -1
  391. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js +0 -16
  392. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js.map +0 -1
  393. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js +0 -124
  394. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js.map +0 -1
  395. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +0 -274
  396. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +0 -1
  397. package/dist/actions/media/__tests__/importMedia.test.js +0 -182
  398. package/dist/actions/media/__tests__/importMedia.test.js.map +0 -1
  399. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
  400. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
  401. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js +0 -174
  402. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js.map +0 -1
  403. package/dist/actions/schema/__tests__/validateAction.test.js +0 -281
  404. package/dist/actions/schema/__tests__/validateAction.test.js.map +0 -1
  405. package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
  406. package/dist/actions/schema/schemaStoreConstants.js +0 -4
  407. package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
  408. package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
  409. package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
  410. package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
  411. package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
  412. package/dist/actions/schema/utils/schemaApiClient.js +0 -17
  413. package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
  414. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js +0 -27
  415. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js.map +0 -1
  416. package/dist/actions/users/__tests__/validateEmail.test.js +0 -16
  417. package/dist/actions/users/__tests__/validateEmail.test.js.map +0 -1
  418. package/dist/actions/users/apiVersion.d.ts +0 -6
  419. package/dist/actions/users/apiVersion.js +0 -7
  420. package/dist/actions/users/apiVersion.js.map +0 -1
  421. package/dist/commands/__tests__/blueprints.test.js +0 -54
  422. package/dist/commands/__tests__/blueprints.test.js.map +0 -1
  423. package/dist/commands/__tests__/build.test.js +0 -132
  424. package/dist/commands/__tests__/build.test.js.map +0 -1
  425. package/dist/commands/__tests__/codemod.test.js +0 -271
  426. package/dist/commands/__tests__/codemod.test.js.map +0 -1
  427. package/dist/commands/__tests__/debug.test.js +0 -697
  428. package/dist/commands/__tests__/debug.test.js.map +0 -1
  429. package/dist/commands/__tests__/deploy.test.js +0 -1913
  430. package/dist/commands/__tests__/deploy.test.js.map +0 -1
  431. package/dist/commands/__tests__/dev.test.js +0 -410
  432. package/dist/commands/__tests__/dev.test.js.map +0 -1
  433. package/dist/commands/__tests__/exec.test.js +0 -207
  434. package/dist/commands/__tests__/exec.test.js.map +0 -1
  435. package/dist/commands/__tests__/init/init.authentication.test.js +0 -60
  436. package/dist/commands/__tests__/init/init.authentication.test.js.map +0 -1
  437. package/dist/commands/__tests__/init/init.create-new-project.test.js +0 -196
  438. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +0 -1
  439. package/dist/commands/__tests__/init/init.plan.test.js +0 -220
  440. package/dist/commands/__tests__/init/init.plan.test.js.map +0 -1
  441. package/dist/commands/__tests__/init/init.setup.test.js +0 -279
  442. package/dist/commands/__tests__/init/init.setup.test.js.map +0 -1
  443. package/dist/commands/__tests__/install.test.js +0 -258
  444. package/dist/commands/__tests__/install.test.js.map +0 -1
  445. package/dist/commands/__tests__/learn.test.js +0 -29
  446. package/dist/commands/__tests__/learn.test.js.map +0 -1
  447. package/dist/commands/__tests__/logout.test.js +0 -88
  448. package/dist/commands/__tests__/logout.test.js.map +0 -1
  449. package/dist/commands/__tests__/manage.test.js +0 -105
  450. package/dist/commands/__tests__/manage.test.js.map +0 -1
  451. package/dist/commands/__tests__/migration.test.js +0 -119
  452. package/dist/commands/__tests__/migration.test.js.map +0 -1
  453. package/dist/commands/__tests__/preview.test.js +0 -261
  454. package/dist/commands/__tests__/preview.test.js.map +0 -1
  455. package/dist/commands/__tests__/start.test.js +0 -253
  456. package/dist/commands/__tests__/start.test.js.map +0 -1
  457. package/dist/commands/__tests__/undeploy.test.js +0 -382
  458. package/dist/commands/__tests__/undeploy.test.js.map +0 -1
  459. package/dist/commands/__tests__/versions.test.js +0 -134
  460. package/dist/commands/__tests__/versions.test.js.map +0 -1
  461. package/dist/commands/backup/__tests__/disable.test.js +0 -207
  462. package/dist/commands/backup/__tests__/disable.test.js.map +0 -1
  463. package/dist/commands/backup/__tests__/download.test.js +0 -679
  464. package/dist/commands/backup/__tests__/download.test.js.map +0 -1
  465. package/dist/commands/backup/__tests__/enable.test.js +0 -317
  466. package/dist/commands/backup/__tests__/enable.test.js.map +0 -1
  467. package/dist/commands/backup/__tests__/list.test.js +0 -321
  468. package/dist/commands/backup/__tests__/list.test.js.map +0 -1
  469. package/dist/commands/cors/__tests__/add.test.js +0 -346
  470. package/dist/commands/cors/__tests__/add.test.js.map +0 -1
  471. package/dist/commands/cors/__tests__/delete.test.js +0 -293
  472. package/dist/commands/cors/__tests__/delete.test.js.map +0 -1
  473. package/dist/commands/cors/__tests__/list.test.js +0 -218
  474. package/dist/commands/cors/__tests__/list.test.js.map +0 -1
  475. package/dist/commands/dataset/__tests__/copy.test.js +0 -520
  476. package/dist/commands/dataset/__tests__/copy.test.js.map +0 -1
  477. package/dist/commands/dataset/__tests__/create.test.js +0 -312
  478. package/dist/commands/dataset/__tests__/create.test.js.map +0 -1
  479. package/dist/commands/dataset/__tests__/delete.test.js +0 -224
  480. package/dist/commands/dataset/__tests__/delete.test.js.map +0 -1
  481. package/dist/commands/dataset/__tests__/export.test.js +0 -561
  482. package/dist/commands/dataset/__tests__/export.test.js.map +0 -1
  483. package/dist/commands/dataset/__tests__/import.test.js +0 -53
  484. package/dist/commands/dataset/__tests__/import.test.js.map +0 -1
  485. package/dist/commands/dataset/__tests__/list.test.js +0 -174
  486. package/dist/commands/dataset/__tests__/list.test.js.map +0 -1
  487. package/dist/commands/dataset/alias/__tests__/create.test.js +0 -299
  488. package/dist/commands/dataset/alias/__tests__/create.test.js.map +0 -1
  489. package/dist/commands/dataset/alias/__tests__/delete.test.js +0 -236
  490. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +0 -1
  491. package/dist/commands/dataset/alias/__tests__/link.test.js +0 -336
  492. package/dist/commands/dataset/alias/__tests__/link.test.js.map +0 -1
  493. package/dist/commands/dataset/alias/__tests__/unlink.test.js +0 -298
  494. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +0 -1
  495. package/dist/commands/dataset/visibility/__tests__/get.test.js +0 -147
  496. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +0 -1
  497. package/dist/commands/dataset/visibility/__tests__/set.test.js +0 -245
  498. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +0 -1
  499. package/dist/commands/docs/__tests__/browse.test.js +0 -29
  500. package/dist/commands/docs/__tests__/browse.test.js.map +0 -1
  501. package/dist/commands/docs/__tests__/read.test.js +0 -78
  502. package/dist/commands/docs/__tests__/read.test.js.map +0 -1
  503. package/dist/commands/docs/__tests__/search.test.js +0 -254
  504. package/dist/commands/docs/__tests__/search.test.js.map +0 -1
  505. package/dist/commands/documents/__tests__/create.test.js +0 -967
  506. package/dist/commands/documents/__tests__/create.test.js.map +0 -1
  507. package/dist/commands/documents/__tests__/delete.test.js +0 -268
  508. package/dist/commands/documents/__tests__/delete.test.js.map +0 -1
  509. package/dist/commands/documents/__tests__/get.test.js +0 -209
  510. package/dist/commands/documents/__tests__/get.test.js.map +0 -1
  511. package/dist/commands/documents/__tests__/query.test.js +0 -405
  512. package/dist/commands/documents/__tests__/query.test.js.map +0 -1
  513. package/dist/commands/documents/__tests__/validate.test.js +0 -226
  514. package/dist/commands/documents/__tests__/validate.test.js.map +0 -1
  515. package/dist/commands/graphql/__tests__/list.test.js +0 -228
  516. package/dist/commands/graphql/__tests__/list.test.js.map +0 -1
  517. package/dist/commands/graphql/__tests__/undeploy.test.js +0 -384
  518. package/dist/commands/graphql/__tests__/undeploy.test.js.map +0 -1
  519. package/dist/commands/hook/__tests__/attempt.test.js +0 -260
  520. package/dist/commands/hook/__tests__/attempt.test.js.map +0 -1
  521. package/dist/commands/hook/__tests__/create.test.js +0 -121
  522. package/dist/commands/hook/__tests__/create.test.js.map +0 -1
  523. package/dist/commands/hook/__tests__/delete.test.js +0 -220
  524. package/dist/commands/hook/__tests__/delete.test.js.map +0 -1
  525. package/dist/commands/hook/__tests__/list.test.js +0 -138
  526. package/dist/commands/hook/__tests__/list.test.js.map +0 -1
  527. package/dist/commands/hook/__tests__/logs.test.js +0 -770
  528. package/dist/commands/hook/__tests__/logs.test.js.map +0 -1
  529. package/dist/commands/manifest/__tests__/extract.test.js +0 -123
  530. package/dist/commands/manifest/__tests__/extract.test.js.map +0 -1
  531. package/dist/commands/mcp/__tests__/configure.test.js +0 -397
  532. package/dist/commands/mcp/__tests__/configure.test.js.map +0 -1
  533. package/dist/commands/media/__tests__/create-aspect.test.js +0 -160
  534. package/dist/commands/media/__tests__/create-aspect.test.js.map +0 -1
  535. package/dist/commands/media/__tests__/delete-aspect.test.js +0 -333
  536. package/dist/commands/media/__tests__/delete-aspect.test.js.map +0 -1
  537. package/dist/commands/media/__tests__/deploy-aspect.test.js +0 -632
  538. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +0 -1
  539. package/dist/commands/media/__tests__/export.test.js +0 -398
  540. package/dist/commands/media/__tests__/export.test.js.map +0 -1
  541. package/dist/commands/media/__tests__/import.test.js +0 -281
  542. package/dist/commands/media/__tests__/import.test.js.map +0 -1
  543. package/dist/commands/openapi/__tests__/get.test.js +0 -149
  544. package/dist/commands/openapi/__tests__/get.test.js.map +0 -1
  545. package/dist/commands/openapi/__tests__/list.test.js +0 -113
  546. package/dist/commands/openapi/__tests__/list.test.js.map +0 -1
  547. package/dist/commands/projects/__tests__/list.test.js +0 -153
  548. package/dist/commands/projects/__tests__/list.test.js.map +0 -1
  549. package/dist/commands/schema/__tests__/delete.test.js +0 -209
  550. package/dist/commands/schema/__tests__/delete.test.js.map +0 -1
  551. package/dist/commands/schema/__tests__/extract.test.js +0 -113
  552. package/dist/commands/schema/__tests__/extract.test.js.map +0 -1
  553. package/dist/commands/schema/__tests__/validate.test.js +0 -104
  554. package/dist/commands/schema/__tests__/validate.test.js.map +0 -1
  555. package/dist/commands/telemetry/__tests__/disable.test.js +0 -145
  556. package/dist/commands/telemetry/__tests__/disable.test.js.map +0 -1
  557. package/dist/commands/telemetry/__tests__/enable.test.js +0 -131
  558. package/dist/commands/telemetry/__tests__/enable.test.js.map +0 -1
  559. package/dist/commands/telemetry/__tests__/status.test.js +0 -153
  560. package/dist/commands/telemetry/__tests__/status.test.js.map +0 -1
  561. package/dist/commands/tokens/__tests__/add.test.js +0 -420
  562. package/dist/commands/tokens/__tests__/add.test.js.map +0 -1
  563. package/dist/commands/tokens/__tests__/delete.test.js +0 -375
  564. package/dist/commands/tokens/__tests__/delete.test.js.map +0 -1
  565. package/dist/commands/tokens/__tests__/list.test.js +0 -368
  566. package/dist/commands/tokens/__tests__/list.test.js.map +0 -1
  567. package/dist/commands/users/__tests__/invite.test.js +0 -341
  568. package/dist/commands/users/__tests__/invite.test.js.map +0 -1
  569. package/dist/commands/users/__tests__/list.test.js +0 -401
  570. package/dist/commands/users/__tests__/list.test.js.map +0 -1
  571. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js +0 -77
  572. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js.map +0 -1
  573. package/dist/services/__tests__/datasetAliases.test.js +0 -131
  574. package/dist/services/__tests__/datasetAliases.test.js.map +0 -1
  575. package/dist/services/__tests__/datasets.test.js +0 -436
  576. package/dist/services/__tests__/datasets.test.js.map +0 -1
  577. package/dist/services/__tests__/graphql.test.js +0 -43
  578. package/dist/services/__tests__/graphql.test.js.map +0 -1
  579. package/dist/services/__tests__/mediaLibraries.test.js +0 -88
  580. package/dist/services/__tests__/mediaLibraries.test.js.map +0 -1
  581. package/dist/services/__tests__/projects.test.js +0 -41
  582. package/dist/services/__tests__/projects.test.js.map +0 -1
  583. package/dist/services/__tests__/userApplications.test.js +0 -113
  584. package/dist/services/__tests__/userApplications.test.js.map +0 -1
  585. package/dist/util/__tests__/appId.test.js +0 -31
  586. package/dist/util/__tests__/appId.test.js.map +0 -1
  587. package/dist/util/__tests__/cliClient.test.js +0 -184
  588. package/dist/util/__tests__/cliClient.test.js.map +0 -1
  589. package/dist/util/__tests__/compareDependencyVersions.test.js +0 -426
  590. package/dist/util/__tests__/compareDependencyVersions.test.js.map +0 -1
  591. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js +0 -74
  592. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js.map +0 -1
  593. package/dist/util/__tests__/findNdjsonEntry.test.js +0 -54
  594. package/dist/util/__tests__/findNdjsonEntry.test.js.map +0 -1
  595. package/dist/util/__tests__/getCliVersion.test.js +0 -28
  596. package/dist/util/__tests__/getCliVersion.test.js.map +0 -1
  597. package/dist/util/__tests__/getLocalPackageVersion.test.js +0 -84
  598. package/dist/util/__tests__/getLocalPackageVersion.test.js.map +0 -1
  599. package/dist/util/__tests__/getWorkspace.test.js +0 -37
  600. package/dist/util/__tests__/getWorkspace.test.js.map +0 -1
  601. package/dist/util/__tests__/readPackageJson.test.js +0 -69
  602. package/dist/util/__tests__/readPackageJson.test.js.map +0 -1
  603. package/dist/util/__tests__/warnAboutMissingAppId.test.js +0 -28
  604. package/dist/util/__tests__/warnAboutMissingAppId.test.js.map +0 -1
  605. package/dist/util/packageManager/__tests__/installPackages.test.js +0 -388
  606. package/dist/util/packageManager/__tests__/installPackages.test.js.map +0 -1
  607. package/dist/util/validation/ __tests__/validateDocuments.test.js +0 -274
  608. package/dist/util/validation/ __tests__/validateDocuments.test.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/commands/__tests__/deploy.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {confirm, input, select} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\nimport {testExample} from '~test/helpers/testExample.js'\n\nimport {buildApp} from '../../actions/build/buildApp.js'\nimport {buildStudio} from '../../actions/build/buildStudio.js'\nimport {checkDir} from '../../actions/deploy/checkDir.js'\nimport {USER_APPLICATIONS_API_VERSION} from '../../services/userApplications.js'\nimport {dirIsEmptyOrNonExistent} from '../../util/dirIsEmptyOrNonExistent.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {DeployCommand} from '../deploy.js'\n\nvi.mock('../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn(),\n}))\n\nvi.mock('../../util/readModuleVersion.js', () => ({\n readModuleVersion: vi.fn(),\n}))\n\nvi.mock('../../actions/build/buildApp.js', () => ({\n buildApp: vi.fn(),\n}))\n\nvi.mock('../../actions/build/buildStudio.js', () => ({\n buildStudio: vi.fn(),\n}))\n\nvi.mock('../../actions/deploy/checkDir.js', () => ({\n checkDir: vi.fn(),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n confirm: vi.fn(),\n input: vi.fn(),\n select: vi.fn(),\n }\n})\n\nvi.mock('../../util/dirIsEmptyOrNonExistent.js', () => ({\n dirIsEmptyOrNonExistent: vi.fn(() => true),\n}))\n\nvi.mock('tar-fs', () => ({\n pack: vi.fn(() => {\n return {\n pipe: vi.fn(),\n }\n }),\n}))\n\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockSelect = vi.mocked(select)\nconst mockConfirm = vi.mocked(confirm)\nconst mockInput = vi.mocked(input)\nconst mockCheckDir = vi.mocked(checkDir)\nconst mockDirIsEmptyOrNonExistent = vi.mocked(dirIsEmptyOrNonExistent)\nconst mockReadModuleVersion = vi.mocked(readModuleVersion)\nconst mockBuildStudio = vi.mocked(buildStudio)\nconst mockBuildApp = vi.mocked(buildApp)\n\ndescribe('#deploy', () => {\n beforeEach(async () => {\n // Set up default mocks\n mockReadModuleVersion.mockImplementation(async (sourceDir, moduleName) => {\n if (moduleName === 'sanity') return '3.0.0' // for studio deployments\n if (moduleName === '@sanity/sdk-react') return '1.0.0' // for app deployments\n return '1.0.0'\n })\n mockCheckDir.mockResolvedValue()\n })\n\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('help text is correct', async () => {\n const {stdout} = await runCommand('deploy --help')\n expect(stdout).toMatchInlineSnapshot(`\n \"Builds and deploys Sanity Studio or application to Sanity hosting\n\n USAGE\n $ sanity deploy [SOURCEDIR] [--auto-updates] [--build] [--minify]\n [--schema-required] [--source-maps] [--verbose] [-y]\n\n ARGUMENTS\n [SOURCEDIR] Source directory\n\n FLAGS\n -y, --yes Unattended mode, answers \"yes\" to any \"yes/no\" prompt\n and otherwise uses defaults\n --[no-]auto-updates Automatically update the studio to the latest version\n --[no-]build Don't build the studio prior to deploy, instead\n deploying the version currently in \\`dist/\\`\n --[no-]minify Skip minifying built JavaScript (speeds up build,\n increases size of bundle)\n --schema-required Fail-fast deployment if schema store fails\n --source-maps Enable source maps for built bundles (increases size\n of bundle)\n --verbose Enable verbose logging\n\n DESCRIPTION\n Builds and deploys Sanity Studio or application to Sanity hosting\n\n EXAMPLES\n Build the studio\n\n $ sanity deploy\n\n Deploys non-minified build with source maps\n\n $ sanity deploy --no-minify --source-maps\n\n Fail fast on schema store fails - for when other services rely on the stored\n schema\n\n $ sanity deploy --schema-required\n\n \"\n `)\n })\n test('shows an error for invalid flags', async () => {\n const {error} = await testCommand(DeployCommand, ['--invalid'])\n\n expect(error?.message).toContain('Nonexistent flag: --invalid')\n })\n\n test(\"should prompt to confirm deleting source directory if it's not empty\", async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n mockConfirm.mockResolvedValue(true)\n mockDirIsEmptyOrNonExistent.mockResolvedValue(false)\n\n const appId = 'app-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId: 'org-id',\n },\n deployment: {\n appId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${appId}`,\n }).reply(200, {\n appHost: 'existing-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: appId,\n organizationId: 'org-id',\n projectId: null,\n title: 'Existing App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${appId}/deployments`,\n }).reply(200, {\n id: 'deployment-id',\n })\n\n const {error} = await testCommand(DeployCommand, ['build'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(mockConfirm).toHaveBeenCalledWith({\n default: false,\n message: '\"./build\" is not empty, do you want to proceed?',\n })\n })\n\n test(\"should cancel the deployment if the user doesn't want to proceed\", async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n mockConfirm.mockResolvedValue(false)\n\n const appId = 'app-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId: 'org-id',\n },\n deployment: {\n appId,\n },\n })\n\n const {error} = await testCommand(DeployCommand, ['build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Cancelled.')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n describe('app', () => {\n test('should re-deploy app if it already exists', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const appId = 'app-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId: 'org-id',\n },\n deployment: {\n appId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${appId}`,\n }).reply(200, {\n appHost: 'existing-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: appId,\n organizationId: 'org-id',\n projectId: null,\n title: 'Existing App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${appId}/deployments`,\n }).reply(200, {\n id: 'deployment-id',\n })\n\n const {error, stderr, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n\n expect(stderr).toContain('Checking application info')\n expect(stderr).toContain('Verifying local content')\n expect(stderr).toContain('Deploying...')\n\n expect(stdout).toContain('Success! Application deployed')\n })\n\n test('should handle missing @sanity/sdk-react version', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const appId = 'app-id'\n const organizationId = 'org-id'\n\n mockReadModuleVersion.mockResolvedValue(null)\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId,\n },\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Failed to find installed @sanity/sdk-react version')\n })\n\n test('should create new user application if none exists', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n const newAppId = 'new-app-id'\n const deploymentId = 'deployment-id'\n\n mockInput.mockResolvedValue('Test App')\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, {\n appHost: 'generated-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: newAppId,\n organizationId,\n projectId: null,\n title: 'Test App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${newAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Application deployed')\n expect(stdout).toContain(\n `Add the deployment.appId to your sanity.cli.js or sanity.cli.ts file:`,\n )\n expect(stdout).toContain(`deployment: {\n appId: '${newAppId}',`)\n expect(mockInput).toHaveBeenCalledWith({\n message: 'Enter a title for your application:',\n validate: expect.any(Function),\n })\n })\n\n test('should skip build when --no-build flag is used', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const existingAppId = 'existing-app-id'\n const organizationId = 'org-id'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: existingAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}`,\n }).reply(200, {\n appHost: 'existing-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId,\n organizationId,\n projectId: null,\n title: 'Existing App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Application deployed')\n expect(mockBuildApp).not.toHaveBeenCalled()\n })\n\n test('should handle directory check errors', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const existingAppId = 'existing-app-id'\n const organizationId = 'org-id'\n\n mockCheckDir.mockRejectedValue(new Error('Directory check failed'))\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: existingAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}`,\n }).reply(200, {\n appHost: 'existing-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId,\n organizationId,\n projectId: null,\n title: 'Existing App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error checking directory')\n })\n\n test('should error when fetching user applications if user doesn’t have org access', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const appId = 'some-app-id'\n const organizationId = 'org-without-access'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId,\n },\n })\n\n // Simulate API returning 403 Forbidden for the given org\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${appId}`,\n }).reply(403, {\n error: 'Forbidden',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n `You don’t have permission to view applications for the configured organization ID (\"${organizationId}\")`,\n )\n })\n\n test('should handle user-applications endpoint errors', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const existingAppId = 'existing-app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: existingAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}`,\n }).reply(500, {\n error: 'Internal server error',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error deploying application')\n })\n\n test('should handle deployment API errors', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const existingAppId = 'existing-app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: existingAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}`,\n }).reply(200, {\n appHost: 'existing-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId,\n organizationId,\n projectId: null,\n title: 'Existing App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}/deployments`,\n }).reply(500, {\n error: 'Internal server error',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error deploying application')\n })\n\n test('should show an error if deployment.appId is configured but the application does not exist', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const nonExistentAppId = 'non-existent-app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: nonExistentAppId,\n },\n })\n\n // Simulate API returning no user application for the given app.id\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${nonExistentAppId}`,\n }).reply(404, {\n error: 'Not found',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n 'The `appId` provided in your configuration’s `deployment` object cannot be found in your organization',\n )\n })\n\n test('should show an error if deployment.appId and app.id (deprecated) are both in use', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const appId = 'app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n id: appId,\n organizationId,\n },\n deployment: {\n appId: appId,\n },\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n 'Found both app.id (deprecated) and deployment.appId in your application configuration.\\n\\nPlease remove app.id from your sanity.cli.js or sanity.cli.ts file.',\n )\n })\n\n test('should show a warning if app.id (deprecated) is used', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const appId = 'app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n id: appId,\n organizationId,\n },\n })\n\n const {stderr} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(stderr).toContain('The `app.id` config has moved to `deployment.appId`.')\n })\n\n test('should handle app creation with retry when host is taken', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n const newAppId = 'new-app-id'\n const deploymentId = 'deployment-id'\n\n mockInput.mockResolvedValue('Test App')\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n })\n .once()\n .reply(409, {\n message: 'App host already taken',\n statusCode: 409,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n })\n .once()\n .reply(200, {\n appHost: 'generated-host-2',\n createdAt: '2024-01-01T00:00:00Z',\n id: newAppId,\n organizationId,\n projectId: null,\n title: 'Test App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${newAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Application deployed')\n })\n\n test('should handle app creation failure with non-retryable error', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n\n mockInput.mockResolvedValue('Test App')\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(500, {\n message: 'Internal server error',\n statusCode: 500,\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error deploying application')\n })\n\n test('should handle findUserApplicationForApp API errors', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const existingAppId = 'existing-app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: existingAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}`,\n }).reply(500, {\n error: 'Internal server error',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error deploying application')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should test input validation for app title', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n const newAppId = 'new-app-id'\n const deploymentId = 'deployment-id'\n\n mockInput.mockResolvedValue('Valid App Title')\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, {\n appHost: 'generated-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: newAppId,\n organizationId,\n projectId: null,\n title: 'Valid App Title',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${newAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n\n expect(mockInput).toHaveBeenCalledWith({\n message: 'Enter a title for your application:',\n validate: expect.any(Function),\n })\n })\n\n test('should allow selecting from list of apps', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n const existingAppId1 = 'existing-app-id-1'\n const existingAppId2 = 'existing-app-id-2'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [\n {\n appHost: 'existing-host-1',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId1,\n organizationId,\n projectId: null,\n title: 'Existing App 1',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n {\n appHost: 'existing-host-2',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId2,\n organizationId,\n projectId: null,\n title: 'Existing App 2',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n ])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId2}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n mockSelect.mockResolvedValue('existing-host-2')\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Application deployed')\n expect(stdout).toContain(\n `Add the deployment.appId to your sanity.cli.js or sanity.cli.ts file:`,\n )\n expect(stdout).toContain(`deployment: {\n appId: '${existingAppId2}',`)\n })\n\n test('should allow creating a new app by selecting from list of apps', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n const existingAppId1 = 'existing-app-id-1'\n const existingAppId2 = 'existing-app-id-2'\n const newAppId = 'new-app-id'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [\n {\n appHost: 'existing-host-1',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId1,\n organizationId,\n projectId: null,\n title: 'Existing App 1',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n {\n appHost: 'existing-host-2',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId2,\n organizationId,\n projectId: null,\n title: 'Existing App 2',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n ])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, {\n appHost: 'generated-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: newAppId,\n organizationId,\n projectId: null,\n title: 'Test App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${newAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n mockSelect.mockResolvedValue('NEW_APP')\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Application deployed')\n expect(stdout).toContain(\n `Add the deployment.appId to your sanity.cli.js or sanity.cli.ts file:`,\n )\n expect(stdout).toContain(`deployment: {\n appId: '${newAppId}',`)\n })\n\n test('should throw an error if organizationId is not set', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId: undefined,\n },\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n 'sanity.cli.ts does not contain an organization identifier (\"app.organizationId\"), which is required for the Sanity CLI to communicate with the Sanity API',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n\n describe('studio', () => {\n test('should handle missing sanity version', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockReadModuleVersion.mockResolvedValue(null)\n\n mockGetCliConfig.mockResolvedValue({\n studioHost: 'existing-studio',\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Failed to find installed sanity version')\n })\n\n test('should handle directory check errors', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'existing-studio'\n const studioAppId = 'studio-app-id'\n\n mockCheckDir.mockRejectedValue(new Error('Directory check failed'))\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: studioHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'Existing Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error checking directory')\n })\n\n test('should re-deploy studio if it already exists', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'existing-studio'\n const studioAppId = 'studio-app-id'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: studioHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'Existing Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stderr, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stderr).toContain('Checking project info')\n expect(stderr).toContain('Verifying local content')\n expect(stderr).toContain('Deploying to sanity.studio')\n expect(stdout).toContain('Success! Studio deployed')\n })\n\n test('should create new studio hostname when studioHost is provided but does not exist', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: 'test-project-id',\n },\n studioHost: 'new-studio-host',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: 'new-studio-host',\n appType: 'studio',\n },\n uri: `/projects/test-project-id/user-applications`,\n }).reply(404, {\n message: 'Not found',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/test-project-id/user-applications`,\n }).reply(200, {\n appHost: 'new-studio-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: 'new-studio-app-id',\n projectId: 'test-project-id',\n title: 'New Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/test-project-id/user-applications/new-studio-app-id/deployments`,\n }).reply(200, {\n id: 'deployment-id',\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed')\n expect(stdout).toContain('Your project has not been assigned a studio hostname')\n expect(stdout).toContain('Creating https://new-studio-host.sanity.studio')\n })\n\n test('should handle studio hostname creation failure when name is taken', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'taken-studio-host'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(404, {\n message: 'Not found',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(409, {\n message: 'Studio hostname already taken',\n statusCode: 409,\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Studio hostname already taken')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should allow selecting from existing studio hostnames', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n })\n\n const studioOneId = 'studio-one-id'\n const studioTwoId = 'studio-two-id'\n const deploymentId = 'deployment-id'\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, [\n {\n appHost: 'studio-one',\n createdAt: '2024-01-01T00:00:00Z',\n id: studioOneId,\n projectId,\n title: 'Studio One',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n {\n appHost: 'studio-two',\n createdAt: '2024-01-01T00:00:00Z',\n id: studioTwoId,\n projectId,\n title: 'Studio Two',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n ])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioTwoId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n location: 'https://studio-two.sanity.studio',\n })\n\n mockSelect.mockResolvedValue('studio-two')\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed to https://studio-two.sanity.studio')\n expect(mockSelect).toHaveBeenCalledWith({\n choices: [\n {name: 'Create new studio hostname', value: 'NEW_STUDIO'},\n expect.any(Object), // Separator\n {name: 'Studio One', value: 'studio-one'},\n {name: 'Studio Two', value: 'studio-two'},\n ],\n message: 'Select existing studio hostname, or create a new one',\n })\n })\n\n test('should allow creating new studio hostname from selection menu', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const existingStudioId = 'existing-studio-id'\n const newStudioFromMenuId = 'new-studio-from-menu-id'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n })\n .once()\n .reply(200, [\n {\n appHost: 'existing-studio',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingStudioId,\n projectId,\n title: 'Existing Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n ])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: 'new-studio-from-menu',\n createdAt: '2024-01-01T00:00:00Z',\n id: newStudioFromMenuId,\n projectId,\n title: 'New Studio From Menu',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${newStudioFromMenuId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n mockSelect.mockResolvedValue('NEW_STUDIO')\n mockInput.mockImplementation(({validate}) => {\n const promise = (async () => {\n if (validate) {\n await validate('new-studio-from-menu')\n }\n return 'new-studio-from-menu'\n })() as Promise<string> & {cancel: () => void}\n\n promise.cancel = () => {}\n return promise\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed')\n expect(mockInput).toHaveBeenCalledWith({\n message: 'Studio hostname (<value>.sanity.studio):',\n validate: expect.any(Function),\n })\n })\n\n test('should handle input validation with retry for studio hostname creation', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const validStudioId = 'valid-studio-id'\n const deploymentId = 'deployment-id'\n\n mockInput.mockImplementation(({validate}) => {\n const promise = (async () => {\n if (validate) {\n // First attempt with a name that will be taken (triggers 409)\n let result = await validate('taken-name')\n if (result !== true) {\n // Name was taken, try again with a valid name (triggers 200)\n result = await validate('valid-name')\n }\n }\n return 'valid-name'\n })() as Promise<string> & {cancel: () => void}\n\n promise.cancel = () => {}\n return promise\n })\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, [])\n\n // First API call fails (hostname taken)\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n })\n .once()\n .reply(409, {\n message: 'Studio hostname already taken',\n statusCode: 409,\n })\n\n // Second API call succeeds\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n })\n .once()\n .reply(200, {\n appHost: 'valid-name',\n createdAt: '2024-01-01T00:00:00Z',\n id: validStudioId,\n projectId,\n title: 'Valid Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${validStudioId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed')\n })\n\n test('should handle input validation fails with unknown error', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n\n mockInput.mockImplementation(({validate}) => {\n const promise = (async () => {\n if (validate) {\n // First attempt with a name that will be taken (triggers 409)\n let result = await validate('taken-name')\n if (result !== true) {\n // Name was taken, try again with a valid name (triggers 200)\n result = await validate('valid-name')\n }\n }\n return 'valid-name'\n })() as Promise<string> & {cancel: () => void}\n\n promise.cancel = () => {}\n return promise\n })\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, [])\n\n // First API call fails (hostname taken)\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n })\n .once()\n .reply(500, {\n message: 'Internal server error',\n statusCode: 500,\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error creating user application')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should throw error when no projectId is configured', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockGetCliConfig.mockResolvedValue({\n api: {},\n studioHost: 'some-studio',\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n 'sanity.cli.ts does not contain a project identifier (\"api.projectId\"), which is required for the Sanity CLI to communicate with the Sanity API',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should log a warning if the deprecated auto-updates flag is used', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const {stderr} = await testCommand(DeployCommand, ['--auto-updates'], {\n config: {root: cwd},\n })\n\n expect(stderr).toContain('Warning: The --auto-updates flag is deprecated')\n })\n\n test('should throw an error when both the current and deprecated autoUpdates config are used', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockGetCliConfig.mockResolvedValue({\n autoUpdates: true,\n deployment: {\n autoUpdates: true,\n },\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n 'Found both `autoUpdates` (deprecated) and `deployment.autoUpdates` in sanity.cli.',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle general API errors when finding user application', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'existing-studio'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(500, {\n error: 'Internal server error',\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error finding user application')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle deployment API errors for studio', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'existing-studio'\n const studioAppId = 'studio-app-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: studioHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'Existing Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioAppId}/deployments`,\n }).reply(500, {\n error: 'Internal server error',\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error deploying studio')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle fatal errors during studio hostname creation', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'new-studio-host'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(404, {\n message: 'Not found',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(500, {\n message: 'Internal server error',\n statusCode: 500,\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error creating user application from config')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle no existing studio applications scenario', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const newStudioId = 'new-studio-id'\n const deploymentId = 'deployment-id'\n\n mockInput.mockImplementation(({validate}) => {\n const promise = (async () => {\n if (validate) {\n await validate('new-studio-name')\n }\n return 'new-studio-name'\n })() as Promise<string> & {cancel: () => void}\n\n promise.cancel = () => {}\n return promise\n })\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: 'new-studio-name',\n createdAt: '2024-01-01T00:00:00Z',\n id: newStudioId,\n projectId,\n title: 'New Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${newStudioId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed')\n expect(mockInput).toHaveBeenCalledWith({\n message: 'Studio hostname (<value>.sanity.studio):',\n validate: expect.any(Function),\n })\n })\n\n test('should skip build when --no-build flag is used for studio', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'existing-studio'\n const studioAppId = 'studio-app-id'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: studioHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'Existing Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed')\n expect(mockBuildStudio).not.toHaveBeenCalled()\n })\n\n test('should deploy studio using deployment.appId', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioAppId = 'studio-app-id'\n const appHost = 'my-studio'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n deployment: {\n appId: studioAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n uri: `/projects/${projectId}/user-applications/${studioAppId}`,\n }).reply(200, {\n appHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'My Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n location: `https://${appHost}.sanity.studio`,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain(`Success! Studio deployed to https://${appHost}.sanity.studio`)\n })\n\n test('should prioritize deployment.appId over studioHost when both are configured', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioAppId = 'studio-app-id'\n const studioHost = 'my-studio-host'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n deployment: {\n appId: studioAppId,\n },\n studioHost,\n })\n\n // Should call by appId, NOT by appHost\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n uri: `/projects/${projectId}/user-applications/${studioAppId}`,\n }).reply(200, {\n appHost: studioHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'My Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n location: `https://${studioHost}.sanity.studio`,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain(`Success! Studio deployed to https://${studioHost}.sanity.studio`)\n })\n\n test('should handle error when deployment.appId does not exist for the org', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioAppId = 'non-existent-app-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n deployment: {\n appId: studioAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n uri: `/projects/${projectId}/user-applications/${studioAppId}`,\n }).reply(404, {\n message: 'Application not found',\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error finding user application')\n expect(error?.message).toContain(`Cannot find app with app ID ${studioAppId}`)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should not fall back to studioHost when deployment.appId is configured but does not exist', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioAppId = 'non-existent-app-id'\n const studioHost = 'valid-studio-host'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n deployment: {\n appId: studioAppId,\n },\n studioHost, // This should NOT be used as fallback\n })\n\n // appId lookup fails\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n uri: `/projects/${projectId}/user-applications/${studioAppId}`,\n }).reply(404, {\n message: 'Application not found',\n })\n\n // Should NOT make a call to studioHost - if it does, this mock will remain unused\n // and cause the test to fail due to pending mocks check\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error finding user application')\n expect(error?.message).toContain(`Cannot find app with app ID ${studioAppId}`)\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n})\n"],"names":["runCommand","getCliConfig","confirm","input","select","mockApi","testCommand","nock","afterEach","beforeEach","describe","expect","test","vi","testExample","buildApp","buildStudio","checkDir","USER_APPLICATIONS_API_VERSION","dirIsEmptyOrNonExistent","readModuleVersion","DeployCommand","mock","fn","actual","importActual","pack","pipe","mockGetCliConfig","mocked","mockSelect","mockConfirm","mockInput","mockCheckDir","mockDirIsEmptyOrNonExistent","mockReadModuleVersion","mockBuildStudio","mockBuildApp","mockImplementation","sourceDir","moduleName","mockResolvedValue","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","error","message","toContain","cwd","process","appId","app","organizationId","deployment","apiVersion","query","appType","uri","reply","appHost","createdAt","id","projectId","title","type","updatedAt","urlType","method","config","root","toBeUndefined","toHaveBeenCalledWith","default","oclif","exit","toBe","stderr","newAppId","deploymentId","validate","any","Function","existingAppId","not","toHaveBeenCalled","mockRejectedValue","Error","nonExistentAppId","once","statusCode","existingAppId1","existingAppId2","undefined","studioHost","studioAppId","api","studioOneId","studioTwoId","location","choices","name","value","Object","existingStudioId","newStudioFromMenuId","promise","cancel","validStudioId","result","autoUpdates","newStudioId"],"mappings":"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"}
@@ -1,410 +0,0 @@
1
- import { readFile, writeFile } from 'node:fs/promises';
2
- import { createServer } from 'node:http';
3
- import { join } from 'node:path';
4
- import { runCommand } from '@oclif/test';
5
- import { confirm } from '@sanity/cli-core/ux';
6
- import { mockApi, testCommand } from '@sanity/cli-test';
7
- import nock from 'nock';
8
- import { afterEach, describe, expect, test, vi } from 'vitest';
9
- import { testExample } from '~test/helpers/testExample.js';
10
- import { checkRequiredDependencies } from '../../actions/build/checkRequiredDependencies.js';
11
- import { compareDependencyVersions } from '../../util/compareDependencyVersions.js';
12
- import { getPackageManagerChoice } from '../../util/packageManager/packageManagerChoice.js';
13
- import { upgradePackages } from '../../util/packageManager/upgradePackages.js';
14
- import { DevCommand } from '../dev.js';
15
- vi.mock('../../actions/build/checkRequiredDependencies.js', ()=>({
16
- checkRequiredDependencies: vi.fn().mockResolvedValue({
17
- installedSanityVersion: '3.0.0'
18
- })
19
- }));
20
- vi.mock('../../util/compareDependencyVersions.js', ()=>({
21
- compareDependencyVersions: vi.fn().mockResolvedValue([])
22
- }));
23
- vi.mock('@sanity/cli-core/ux', async ()=>{
24
- const actual = await vi.importActual('@sanity/cli-core/ux');
25
- return {
26
- ...actual,
27
- confirm: vi.fn()
28
- };
29
- });
30
- vi.mock('../../../../cli-core/src/util/isInteractive.js', ()=>({
31
- isInteractive: vi.fn().mockReturnValue(true)
32
- }));
33
- vi.mock('../../util/packageManager/upgradePackages.js');
34
- vi.mock('../../util/packageManager/packageManagerChoice.js');
35
- const mockCheckRequiredDependencies = vi.mocked(checkRequiredDependencies);
36
- const mockCompareDependencyVersions = vi.mocked(compareDependencyVersions);
37
- const mockConfirm = vi.mocked(confirm);
38
- const mockUpgradePackages = vi.mocked(upgradePackages);
39
- const mockGetPackageManagerChoice = vi.mocked(getPackageManagerChoice);
40
- describe('#dev', ()=>{
41
- afterEach(()=>{
42
- const pending = nock.pendingMocks();
43
- nock.cleanAll();
44
- expect(pending, 'pending mocks').toEqual([]);
45
- vi.clearAllMocks();
46
- });
47
- test('help text is correct', async ()=>{
48
- const { stdout } = await runCommand([
49
- 'dev',
50
- '--help'
51
- ]);
52
- expect(stdout).toMatchInlineSnapshot(`
53
- "Starts a local development server for Sanity Studio with live reloading
54
-
55
- USAGE
56
- $ sanity dev [--auto-updates] [--host <value>]
57
- [--load-in-dashboard] [--port <value>]
58
-
59
- FLAGS
60
- --[no-]auto-updates Automatically update Sanity Studio dependencies.
61
- --host=<value> [default: localhost] The local network interface at
62
- which to listen.
63
- --[no-]load-in-dashboard Load the app/studio in the Sanity dashboard.
64
- --port=<value> [default: 3333] TCP port to start server on.
65
-
66
- DESCRIPTION
67
- Starts a local development server for Sanity Studio with live reloading
68
-
69
- EXAMPLES
70
- $ sanity dev --host=0.0.0.0
71
-
72
- $ sanity dev --port=1942
73
-
74
- $ sanity dev --load-in-dashboard
75
-
76
- "
77
- `);
78
- });
79
- test('shows an error for invalid flags', async ()=>{
80
- const { error } = await testCommand(DevCommand, [
81
- '--invalid'
82
- ]);
83
- expect(error?.message).toContain('Nonexistent flag: --invalid');
84
- });
85
- describe('basic-app', ()=>{
86
- test('should start the dev server for app', async ()=>{
87
- const cwd = await testExample('basic-app');
88
- process.cwd = ()=>cwd;
89
- const { error, result, stderr, stdout } = await testCommand(DevCommand, [
90
- '--port',
91
- '5333'
92
- ], {
93
- config: {
94
- root: cwd
95
- }
96
- });
97
- expect(error).toBeUndefined();
98
- expect(stdout).toContain('Dev server started on port 5333');
99
- expect(stdout).toContain('View your app in the Sanity dashboard here:');
100
- expect(stderr).toContain('Checking configuration files');
101
- await result.close?.();
102
- });
103
- test('should warn when --no-load-in-dashboard is used with app', async ()=>{
104
- const cwd = await testExample('basic-app');
105
- process.cwd = ()=>cwd;
106
- const { error, result, stderr, stdout } = await testCommand(DevCommand, [
107
- '--no-load-in-dashboard',
108
- '--port',
109
- '5334'
110
- ], {
111
- config: {
112
- root: cwd
113
- }
114
- });
115
- expect(error).toBeUndefined();
116
- expect(stderr).toContain('Apps cannot run without the Sanity dashboard');
117
- expect(stderr).toContain('Starting dev server with the --load-in-dashboard flag set to true');
118
- expect(stdout).toContain('Dev server started on port 5334');
119
- await result.close?.();
120
- });
121
- test('should automatically change port if conflicted', async ()=>{
122
- const cwd = await testExample('basic-app');
123
- process.cwd = ()=>cwd;
124
- // Create a server on port 5338 to block it
125
- const server = createServer();
126
- await new Promise((resolve)=>{
127
- server.listen(5338, 'localhost', resolve);
128
- });
129
- try {
130
- const { error, result, stdout } = await testCommand(DevCommand, [
131
- '--port',
132
- '5338'
133
- ], {
134
- config: {
135
- root: cwd
136
- }
137
- });
138
- expect(error).toBeUndefined();
139
- // Should automatically pick a different port
140
- expect(stdout).toMatch(/Dev server started on port \d{4}/);
141
- expect(stdout).not.toContain('Dev server started on port 5338');
142
- expect(stdout).toContain('View your app in the Sanity dashboard here:');
143
- await result.close?.();
144
- } finally{
145
- // Clean up the server
146
- await new Promise((resolve, reject)=>{
147
- server.close((err)=>{
148
- if (err) reject(err);
149
- else resolve();
150
- });
151
- });
152
- }
153
- });
154
- test('should error when organizationId is missing from config', async ()=>{
155
- const cwd = await testExample('basic-app');
156
- process.cwd = ()=>cwd;
157
- // Modify the config to remove organizationId
158
- const configPath = join(cwd, 'sanity.cli.ts');
159
- const existingConfig = await readFile(configPath, 'utf8');
160
- const modifiedConfig = existingConfig.replace(/organizationId: '[^']*',?/, '');
161
- await writeFile(configPath, modifiedConfig);
162
- const { error } = await testCommand(DevCommand, [
163
- '--port',
164
- '5341'
165
- ], {
166
- config: {
167
- root: cwd
168
- }
169
- });
170
- expect(error).toBeDefined();
171
- expect(error?.message).toContain('Apps require an organization ID (orgId)');
172
- expect(error?.oclif?.exit).toBe(1);
173
- });
174
- });
175
- describe('basic-studio', ()=>{
176
- test('should start the dev server for studio', async ()=>{
177
- const cwd = await testExample('basic-studio');
178
- process.cwd = ()=>cwd;
179
- const { error, result, stderr, stdout } = await testCommand(DevCommand, [
180
- '--port',
181
- '5335'
182
- ], {
183
- config: {
184
- root: cwd
185
- }
186
- });
187
- expect(error).toBeUndefined();
188
- expect(stdout).toContain('Sanity Studio using vite@');
189
- expect(stdout).toContain('ready in');
190
- expect(stdout).toContain('ms and running at http://localhost:5335');
191
- expect(stderr).toContain('Checking configuration files');
192
- await result.close?.();
193
- });
194
- test('should start with custom host configuration', async ()=>{
195
- const cwd = await testExample('basic-studio');
196
- process.cwd = ()=>cwd;
197
- const { error, result, stdout } = await testCommand(DevCommand, [
198
- '--host',
199
- '127.0.0.1',
200
- '--port',
201
- '5336'
202
- ], {
203
- config: {
204
- root: cwd
205
- }
206
- });
207
- expect(error).toBeUndefined();
208
- expect(stdout).toContain('http://127.0.0.1:5336');
209
- await result.close?.();
210
- });
211
- test('should start with load-in-dashboard', async ()=>{
212
- const cwd = await testExample('basic-studio');
213
- process.cwd = ()=>cwd;
214
- const projectId = 'test-project';
215
- // Need to modify the sanity config to include projectId for this test
216
- const configPath = join(cwd, 'sanity.cli.ts');
217
- const existingConfig = await readFile(configPath, 'utf8');
218
- // Add projectId to the config
219
- const modifiedConfig = existingConfig.replace(/projectId: '.*',/, `projectId: '${projectId}',`);
220
- await writeFile(configPath, modifiedConfig);
221
- mockApi({
222
- apiVersion: 'v2025-08-25',
223
- uri: `/projects/${projectId}`
224
- }).reply(200, {
225
- organizationId: 'test-org'
226
- });
227
- const { error, result, stderr, stdout } = await testCommand(DevCommand, [
228
- '--load-in-dashboard',
229
- '--port',
230
- '5340'
231
- ], {
232
- config: {
233
- root: cwd
234
- }
235
- });
236
- expect(error).toBeUndefined();
237
- expect(stdout).toContain('Dev server started on port 5340');
238
- expect(stdout).toContain('View your studio in the Sanity dashboard here:');
239
- expect(stdout).toContain('https://www.sanity.io/@test-org?dev=http%3A%2F%2Flocalhost%3A5340');
240
- expect(stderr).toContain('Checking configuration files');
241
- await result.close?.();
242
- });
243
- test('should error when projectId is missing with --load-in-dashboard', async ()=>{
244
- const cwd = await testExample('basic-studio');
245
- process.cwd = ()=>cwd;
246
- // Modify config to remove projectId
247
- const configPath = join(cwd, 'sanity.cli.ts');
248
- const existingConfig = await readFile(configPath, 'utf8');
249
- const modifiedConfig = existingConfig.replace(/projectId: '[^']*',/, '');
250
- await writeFile(configPath, modifiedConfig);
251
- const { error } = await testCommand(DevCommand, [
252
- '--load-in-dashboard',
253
- '--port',
254
- '5343'
255
- ], {
256
- config: {
257
- root: cwd
258
- }
259
- });
260
- expect(error).toBeDefined();
261
- expect(error?.message).toContain('Project Id is required to load in dashboard');
262
- expect(error?.oclif?.exit).toBe(1);
263
- });
264
- test('should error when API fails to fetch organizationId', async ()=>{
265
- const cwd = await testExample('basic-studio');
266
- process.cwd = ()=>cwd;
267
- const projectId = 'test-project';
268
- const configPath = join(cwd, 'sanity.cli.ts');
269
- const existingConfig = await readFile(configPath, 'utf8');
270
- const modifiedConfig = existingConfig.replace(/projectId: '.*',/, `projectId: '${projectId}',`);
271
- await writeFile(configPath, modifiedConfig);
272
- mockApi({
273
- apiVersion: 'v2025-08-25',
274
- uri: `/projects/${projectId}`
275
- }).reply(404, {
276
- error: 'Project not found'
277
- });
278
- const { error } = await testCommand(DevCommand, [
279
- '--load-in-dashboard',
280
- '--port',
281
- '5344'
282
- ], {
283
- config: {
284
- root: cwd
285
- }
286
- });
287
- expect(error).toBeDefined();
288
- expect(error?.message).toContain('Failed to get organization id from project id');
289
- expect(error?.oclif?.exit).toBe(1);
290
- });
291
- test('should start dev server successfully when user declines auto-updates', async ()=>{
292
- const cwd = await testExample('basic-studio');
293
- process.cwd = ()=>cwd;
294
- mockCompareDependencyVersions.mockResolvedValueOnce([
295
- {
296
- installed: '3.0.0',
297
- pkg: 'sanity',
298
- remote: '3.1.0'
299
- }
300
- ]);
301
- mockConfirm.mockResolvedValueOnce(false); // User declines upgrade
302
- const { error, result, stderr, stdout } = await testCommand(DevCommand, [
303
- '--auto-updates',
304
- '--port',
305
- '5346'
306
- ], {
307
- config: {
308
- root: cwd
309
- }
310
- });
311
- expect(error).toBeUndefined();
312
- // Check that the server started successfully with auto-updates flag
313
- expect(stdout).toMatch(/running at http:\/\/localhost:5346/);
314
- expect(stderr).toContain('Checking configuration files');
315
- await result.close?.();
316
- });
317
- test('should handle auto-updates with version mismatch and user accepts upgrade', async ()=>{
318
- const cwd = await testExample('basic-studio');
319
- process.cwd = ()=>cwd;
320
- mockCompareDependencyVersions.mockResolvedValueOnce([
321
- {
322
- installed: '3.0.0',
323
- pkg: 'sanity',
324
- remote: '3.1.0'
325
- }
326
- ]);
327
- mockConfirm.mockResolvedValueOnce(true); // User accepts upgrade
328
- mockUpgradePackages.mockResolvedValueOnce(undefined);
329
- mockGetPackageManagerChoice.mockResolvedValueOnce({
330
- chosen: 'npm',
331
- mostOptimal: 'npm'
332
- });
333
- const { error, result, stderr, stdout } = await testCommand(DevCommand, [
334
- '--auto-updates',
335
- '--port',
336
- '5348'
337
- ], {
338
- config: {
339
- root: cwd
340
- }
341
- });
342
- expect(error).toBeUndefined();
343
- expect(stdout).toMatch(/running at http:\/\/localhost:5348/);
344
- expect(stderr).toContain('Checking configuration files');
345
- expect(mockUpgradePackages).toHaveBeenCalledWith({
346
- packageManager: 'npm',
347
- packages: [
348
- [
349
- 'sanity',
350
- '3.1.0'
351
- ]
352
- ]
353
- }, {
354
- output: expect.any(Object),
355
- workDir: cwd
356
- });
357
- await result.close?.();
358
- });
359
- test('should handle invalid Sanity version during auto-updates', async ()=>{
360
- const cwd = await testExample('basic-studio');
361
- process.cwd = ()=>cwd;
362
- mockCheckRequiredDependencies.mockResolvedValueOnce({
363
- installedSanityVersion: 'invalid-version'
364
- });
365
- const { error } = await testCommand(DevCommand, [
366
- '--auto-updates',
367
- '--port',
368
- '5347'
369
- ], {
370
- config: {
371
- root: cwd
372
- }
373
- });
374
- expect(error).toBeDefined();
375
- expect(error?.message).toContain('Failed to parse installed Sanity version');
376
- });
377
- });
378
- test('should throw an error if port is already in use', async ()=>{
379
- const cwd = await testExample('basic-studio');
380
- process.cwd = ()=>cwd;
381
- // Create a server on port 5337 to block it
382
- const server = createServer();
383
- await new Promise((resolve)=>{
384
- server.listen(5337, 'localhost', resolve);
385
- });
386
- try {
387
- const { error } = await testCommand(DevCommand, [
388
- '--port',
389
- '5337'
390
- ], {
391
- config: {
392
- root: cwd
393
- }
394
- });
395
- expect(error).toBeDefined();
396
- expect(error?.message).toContain('Port 5337 is already in use');
397
- expect(error?.oclif?.exit).toBe(1);
398
- } finally{
399
- // Clean up the server
400
- await new Promise((resolve, reject)=>{
401
- server.close((err)=>{
402
- if (err) reject(err);
403
- else resolve();
404
- });
405
- });
406
- }
407
- });
408
- });
409
-
410
- //# sourceMappingURL=dev.test.js.map