@sanity/cli 6.0.0-alpha.5 → 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 (461) 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/init/remoteTemplate.js +1 -1
  14. package/dist/actions/init/remoteTemplate.js.map +1 -1
  15. package/dist/actions/manifest/extractAppManifest.d.ts +20 -0
  16. package/dist/actions/manifest/extractAppManifest.js +51 -0
  17. package/dist/actions/manifest/extractAppManifest.js.map +1 -0
  18. package/dist/actions/manifest/extractManifest.js +1 -1
  19. package/dist/actions/manifest/extractManifest.js.map +1 -1
  20. package/dist/actions/manifest/types.d.ts +6 -1
  21. package/dist/actions/manifest/types.js.map +1 -1
  22. package/dist/actions/media/importAspects.js +2 -1
  23. package/dist/actions/media/importAspects.js.map +1 -1
  24. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +1 -1
  25. package/dist/commands/dataset/create.d.ts +0 -2
  26. package/dist/commands/dataset/create.js +8 -54
  27. package/dist/commands/dataset/create.js.map +1 -1
  28. package/dist/commands/debug.js +5 -9
  29. package/dist/commands/debug.js.map +1 -1
  30. package/dist/commands/init.d.ts +6 -1
  31. package/dist/commands/init.js +358 -20
  32. package/dist/commands/init.js.map +1 -1
  33. package/dist/commands/manifest/extract.js +7 -8
  34. package/dist/commands/manifest/extract.js.map +1 -1
  35. package/dist/config/createCliConfig.d.ts +9 -0
  36. package/dist/prompts/init/promptForTypescript.d.ts +2 -0
  37. package/dist/prompts/init/promptForTypescript.js +15 -0
  38. package/dist/prompts/init/promptForTypescript.js.map +1 -0
  39. package/dist/prompts/promptForDatasetAclMode.d.ts +9 -0
  40. package/dist/prompts/promptForDatasetAclMode.js +27 -0
  41. package/dist/prompts/promptForDatasetAclMode.js.map +1 -0
  42. package/dist/prompts/promptForDatasetName.d.ts +1 -1
  43. package/dist/prompts/promptForDatasetName.js +4 -1
  44. package/dist/prompts/promptForDatasetName.js.map +1 -1
  45. package/dist/services/organizations.d.ts +3 -1
  46. package/dist/services/organizations.js +2 -1
  47. package/dist/services/organizations.js.map +1 -1
  48. package/dist/services/user.d.ts +5 -0
  49. package/dist/services/user.js +12 -1
  50. package/dist/services/user.js.map +1 -1
  51. package/dist/services/userApplications.d.ts +3 -1
  52. package/dist/services/userApplications.js +5 -1
  53. package/dist/services/userApplications.js.map +1 -1
  54. package/oclif.manifest.json +113 -113
  55. package/package.json +16 -12
  56. package/templates/app-quickstart/src/App.css +20 -0
  57. package/templates/app-quickstart/src/App.tsx +25 -0
  58. package/templates/app-quickstart/src/ExampleComponent.css +90 -0
  59. package/templates/app-quickstart/src/ExampleComponent.tsx +37 -0
  60. package/templates/app-sanity-ui/src/App.tsx +34 -0
  61. package/templates/app-sanity-ui/src/ExampleComponent.tsx +34 -0
  62. package/templates/app-sanity-ui/src/SanityUI.tsx +23 -0
  63. package/templates/blog/README.md +11 -0
  64. package/templates/blog/schemaTypes/author.js +50 -0
  65. package/templates/blog/schemaTypes/blockContent.js +67 -0
  66. package/templates/blog/schemaTypes/category.js +19 -0
  67. package/templates/blog/schemaTypes/index.js +6 -0
  68. package/templates/blog/schemaTypes/post.js +65 -0
  69. package/templates/blog/static/.gitkeep +1 -0
  70. package/templates/clean/README.md +9 -0
  71. package/templates/clean/schemaTypes/index.js +1 -0
  72. package/templates/clean/static/.gitkeep +1 -0
  73. package/templates/ecommerce/README.md +11 -0
  74. package/templates/ecommerce/plugins/.gitkeep +1 -0
  75. package/templates/ecommerce/plugins/barcode-input/BarcodeInput.js +62 -0
  76. package/templates/ecommerce/plugins/barcode-input/index.js +9 -0
  77. package/templates/ecommerce/plugins/barcode-input/schemaType.js +60 -0
  78. package/templates/ecommerce/schemaTypes/blockContent.js +67 -0
  79. package/templates/ecommerce/schemaTypes/category.js +39 -0
  80. package/templates/ecommerce/schemaTypes/index.js +23 -0
  81. package/templates/ecommerce/schemaTypes/locale/localeBlockContent.js +19 -0
  82. package/templates/ecommerce/schemaTypes/locale/localeString.js +19 -0
  83. package/templates/ecommerce/schemaTypes/locale/localeText.js +19 -0
  84. package/templates/ecommerce/schemaTypes/locale/supportedLanguages.js +5 -0
  85. package/templates/ecommerce/schemaTypes/product.js +83 -0
  86. package/templates/ecommerce/schemaTypes/productVariant.js +52 -0
  87. package/templates/ecommerce/schemaTypes/vendor.js +39 -0
  88. package/templates/ecommerce/static/.gitkeep +1 -0
  89. package/templates/get-started/README.md +9 -0
  90. package/templates/get-started/plugins/.gitkeep +1 -0
  91. package/templates/get-started/plugins/sanity-plugin-tutorial/CustomDefaultLayout.tsx +16 -0
  92. package/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +104 -0
  93. package/templates/get-started/plugins/sanity-plugin-tutorial/index.ts +11 -0
  94. package/templates/get-started/schemaTypes/index.ts +1 -0
  95. package/templates/get-started/static/.gitkeep +1 -0
  96. package/templates/moviedb/README.md +10 -0
  97. package/templates/moviedb/schemaTypes/blockContent.js +67 -0
  98. package/templates/moviedb/schemaTypes/castMember.js +37 -0
  99. package/templates/moviedb/schemaTypes/crewMember.js +52 -0
  100. package/templates/moviedb/schemaTypes/index.js +22 -0
  101. package/templates/moviedb/schemaTypes/movie.js +85 -0
  102. package/templates/moviedb/schemaTypes/person.js +37 -0
  103. package/templates/moviedb/schemaTypes/plotSummaries.js +20 -0
  104. package/templates/moviedb/schemaTypes/plotSummary.js +24 -0
  105. package/templates/moviedb/schemaTypes/screening.js +81 -0
  106. package/templates/moviedb/static/.gitkeep +1 -0
  107. package/templates/quickstart/README.md +9 -0
  108. package/templates/quickstart/schemaTypes/index.js +1 -0
  109. package/templates/quickstart/static/.gitkeep +1 -0
  110. package/templates/shared/gitignore.txt +29 -0
  111. package/templates/shared/tsconfig.json +17 -0
  112. package/templates/shopify/README.md +85 -0
  113. package/templates/shopify/components/hotspots/ProductTooltip.tsx +38 -0
  114. package/templates/shopify/components/icons/Shopify.tsx +20 -0
  115. package/templates/shopify/components/inputs/CollectionHidden.tsx +23 -0
  116. package/templates/shopify/components/inputs/PlaceholderString.tsx +20 -0
  117. package/templates/shopify/components/inputs/ProductHidden.tsx +64 -0
  118. package/templates/shopify/components/inputs/ProductVariantHidden.tsx +24 -0
  119. package/templates/shopify/components/inputs/ProxyString.tsx +32 -0
  120. package/templates/shopify/components/media/ColorTheme.tsx +38 -0
  121. package/templates/shopify/components/media/ShopifyDocumentStatus.tsx +82 -0
  122. package/templates/shopify/components/studio/Navbar.tsx +29 -0
  123. package/templates/shopify/constants.ts +61 -0
  124. package/templates/shopify/docs/features.md +158 -0
  125. package/templates/shopify/plugins/customDocumentActions/index.ts +55 -0
  126. package/templates/shopify/plugins/customDocumentActions/shopifyDelete.tsx +144 -0
  127. package/templates/shopify/plugins/customDocumentActions/shopifyLink.ts +39 -0
  128. package/templates/shopify/plugins/customDocumentActions/types.ts +14 -0
  129. package/templates/shopify/schemaTypes/documents/collection.tsx +142 -0
  130. package/templates/shopify/schemaTypes/documents/colorTheme.tsx +44 -0
  131. package/templates/shopify/schemaTypes/documents/page.ts +70 -0
  132. package/templates/shopify/schemaTypes/documents/product.tsx +132 -0
  133. package/templates/shopify/schemaTypes/documents/productVariant.tsx +67 -0
  134. package/templates/shopify/schemaTypes/index.ts +108 -0
  135. package/templates/shopify/schemaTypes/objects/collection/collectionGroupType.ts +27 -0
  136. package/templates/shopify/schemaTypes/objects/collection/collectionLinksType.ts +16 -0
  137. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorObjectType.tsx +48 -0
  138. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorType.tsx +50 -0
  139. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeObjectType.ts +40 -0
  140. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeType.ts +49 -0
  141. package/templates/shopify/schemaTypes/objects/global/footerType.ts +22 -0
  142. package/templates/shopify/schemaTypes/objects/global/menuLinksType.ts +21 -0
  143. package/templates/shopify/schemaTypes/objects/global/menuType.ts +17 -0
  144. package/templates/shopify/schemaTypes/objects/global/notFoundPageType.ts +37 -0
  145. package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +48 -0
  146. package/templates/shopify/schemaTypes/objects/hotspot/productHotspotsType.tsx +17 -0
  147. package/templates/shopify/schemaTypes/objects/hotspot/spotType.tsx +60 -0
  148. package/templates/shopify/schemaTypes/objects/link/linkEmailType.tsx +34 -0
  149. package/templates/shopify/schemaTypes/objects/link/linkExternalType.tsx +37 -0
  150. package/templates/shopify/schemaTypes/objects/link/linkInternalType.tsx +33 -0
  151. package/templates/shopify/schemaTypes/objects/link/linkProductType.tsx +60 -0
  152. package/templates/shopify/schemaTypes/objects/module/accordionGroupType.ts +33 -0
  153. package/templates/shopify/schemaTypes/objects/module/accordionType.ts +28 -0
  154. package/templates/shopify/schemaTypes/objects/module/callToActionType.tsx +85 -0
  155. package/templates/shopify/schemaTypes/objects/module/calloutType.ts +38 -0
  156. package/templates/shopify/schemaTypes/objects/module/collectionReferenceType.tsx +47 -0
  157. package/templates/shopify/schemaTypes/objects/module/gridItemType.ts +41 -0
  158. package/templates/shopify/schemaTypes/objects/module/gridType.ts +28 -0
  159. package/templates/shopify/schemaTypes/objects/module/heroType.tsx +40 -0
  160. package/templates/shopify/schemaTypes/objects/module/imageCallToActionType.tsx +19 -0
  161. package/templates/shopify/schemaTypes/objects/module/imageFeatureType.ts +80 -0
  162. package/templates/shopify/schemaTypes/objects/module/imageFeaturesType.tsx +51 -0
  163. package/templates/shopify/schemaTypes/objects/module/instagramType.ts +35 -0
  164. package/templates/shopify/schemaTypes/objects/module/productFeaturesType.tsx +50 -0
  165. package/templates/shopify/schemaTypes/objects/module/productReferenceType.tsx +42 -0
  166. package/templates/shopify/schemaTypes/objects/seoType.ts +31 -0
  167. package/templates/shopify/schemaTypes/objects/shopify/collectionRuleType.tsx +37 -0
  168. package/templates/shopify/schemaTypes/objects/shopify/inventoryType.ts +25 -0
  169. package/templates/shopify/schemaTypes/objects/shopify/optionType.tsx +31 -0
  170. package/templates/shopify/schemaTypes/objects/shopify/placeholderStringType.ts +11 -0
  171. package/templates/shopify/schemaTypes/objects/shopify/priceRangeType.ts +20 -0
  172. package/templates/shopify/schemaTypes/objects/shopify/productWithVariantType.tsx +142 -0
  173. package/templates/shopify/schemaTypes/objects/shopify/proxyStringType.ts +12 -0
  174. package/templates/shopify/schemaTypes/objects/shopify/shopType.ts +15 -0
  175. package/templates/shopify/schemaTypes/objects/shopify/shopifyCollectionType.ts +84 -0
  176. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductType.ts +131 -0
  177. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductVariantType.ts +121 -0
  178. package/templates/shopify/schemaTypes/portableText/portableTextSimpleType.tsx +45 -0
  179. package/templates/shopify/schemaTypes/portableText/portableTextType.tsx +52 -0
  180. package/templates/shopify/schemaTypes/singletons/homeType.ts +49 -0
  181. package/templates/shopify/schemaTypes/singletons/settingsType.ts +96 -0
  182. package/templates/shopify/static/.gitkeep +1 -0
  183. package/templates/shopify/structure/collectionStructure.ts +9 -0
  184. package/templates/shopify/structure/colorThemeStructure.ts +9 -0
  185. package/templates/shopify/structure/homeStructure.ts +9 -0
  186. package/templates/shopify/structure/index.ts +57 -0
  187. package/templates/shopify/structure/pageStructure.ts +11 -0
  188. package/templates/shopify/structure/productStructure.ts +51 -0
  189. package/templates/shopify/structure/settingStructure.ts +9 -0
  190. package/templates/shopify/utils/blocksToText.ts +20 -0
  191. package/templates/shopify/utils/defineStructure.ts +11 -0
  192. package/templates/shopify/utils/getPriceRange.ts +24 -0
  193. package/templates/shopify/utils/shopifyUrls.ts +22 -0
  194. package/templates/shopify/utils/validateSlug.ts +18 -0
  195. package/templates/shopify-online-storefront/README.md +54 -0
  196. package/templates/shopify-online-storefront/components/icons/Shopify.tsx +22 -0
  197. package/templates/shopify-online-storefront/components/inputs/CollectionHidden.tsx +23 -0
  198. package/templates/shopify-online-storefront/components/inputs/PlaceholderString.tsx +25 -0
  199. package/templates/shopify-online-storefront/components/inputs/ProductHidden.tsx +66 -0
  200. package/templates/shopify-online-storefront/components/inputs/ProductVariantHidden.tsx +25 -0
  201. package/templates/shopify-online-storefront/components/inputs/ProxyString.tsx +38 -0
  202. package/templates/shopify-online-storefront/components/media/ShopifyDocumentStatus.tsx +83 -0
  203. package/templates/shopify-online-storefront/constants.ts +18 -0
  204. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/index.ts +45 -0
  205. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyDelete.tsx +144 -0
  206. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyLink.ts +39 -0
  207. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/types.ts +14 -0
  208. package/templates/shopify-online-storefront/schemaTypes/blocks/blockContent.ts +32 -0
  209. package/templates/shopify-online-storefront/schemaTypes/documents/collection.tsx +83 -0
  210. package/templates/shopify-online-storefront/schemaTypes/documents/product.tsx +102 -0
  211. package/templates/shopify-online-storefront/schemaTypes/documents/productVariant.tsx +82 -0
  212. package/templates/shopify-online-storefront/schemaTypes/index.ts +43 -0
  213. package/templates/shopify-online-storefront/schemaTypes/objects/accordion.ts +31 -0
  214. package/templates/shopify-online-storefront/schemaTypes/objects/accordionGroup.ts +35 -0
  215. package/templates/shopify-online-storefront/schemaTypes/objects/callout.ts +40 -0
  216. package/templates/shopify-online-storefront/schemaTypes/objects/inventory.ts +30 -0
  217. package/templates/shopify-online-storefront/schemaTypes/objects/option.ts +30 -0
  218. package/templates/shopify-online-storefront/schemaTypes/objects/priceRange.ts +22 -0
  219. package/templates/shopify-online-storefront/schemaTypes/objects/proxyString.ts +11 -0
  220. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollection.ts +109 -0
  221. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollectionRule.tsx +45 -0
  222. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProduct.ts +165 -0
  223. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProductVariant.ts +151 -0
  224. package/templates/shopify-online-storefront/structure/collectionStructure.ts +9 -0
  225. package/templates/shopify-online-storefront/structure/index.ts +37 -0
  226. package/templates/shopify-online-storefront/structure/productStructure.ts +35 -0
  227. package/templates/shopify-online-storefront/utils/defineStructure.ts +11 -0
  228. package/templates/shopify-online-storefront/utils/getPriceRange.ts +24 -0
  229. package/templates/shopify-online-storefront/utils/shopifyUrls.ts +22 -0
  230. package/dist/actions/build/__tests__/buildApp.test.js +0 -367
  231. package/dist/actions/build/__tests__/buildApp.test.js.map +0 -1
  232. package/dist/actions/build/__tests__/buildStudio.test.js +0 -561
  233. package/dist/actions/build/__tests__/buildStudio.test.js.map +0 -1
  234. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js +0 -233
  235. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js.map +0 -1
  236. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js +0 -414
  237. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js.map +0 -1
  238. package/dist/actions/build/__tests__/determineBasePath.test.js +0 -24
  239. package/dist/actions/build/__tests__/determineBasePath.test.js.map +0 -1
  240. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js +0 -109
  241. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js.map +0 -1
  242. package/dist/actions/build/__tests__/getViteConfig.test.js +0 -493
  243. package/dist/actions/build/__tests__/getViteConfig.test.js.map +0 -1
  244. package/dist/actions/build/__tests__/renderDocument.test.js +0 -278
  245. package/dist/actions/build/__tests__/renderDocument.test.js.map +0 -1
  246. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js +0 -153
  247. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js.map +0 -1
  248. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js +0 -657
  249. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js.map +0 -1
  250. package/dist/actions/dataset/__tests__/validateDatasetName.test.js +0 -182
  251. package/dist/actions/dataset/__tests__/validateDatasetName.test.js.map +0 -1
  252. package/dist/actions/deploy/__tests__/checkDir.test.js +0 -120
  253. package/dist/actions/deploy/__tests__/checkDir.test.js.map +0 -1
  254. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js +0 -16
  255. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js.map +0 -1
  256. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js +0 -124
  257. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js.map +0 -1
  258. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +0 -274
  259. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +0 -1
  260. package/dist/actions/media/__tests__/importMedia.test.js +0 -182
  261. package/dist/actions/media/__tests__/importMedia.test.js.map +0 -1
  262. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js +0 -174
  263. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js.map +0 -1
  264. package/dist/actions/schema/__tests__/validateAction.test.js +0 -281
  265. package/dist/actions/schema/__tests__/validateAction.test.js.map +0 -1
  266. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js +0 -27
  267. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js.map +0 -1
  268. package/dist/actions/users/__tests__/validateEmail.test.js +0 -16
  269. package/dist/actions/users/__tests__/validateEmail.test.js.map +0 -1
  270. package/dist/commands/__tests__/blueprints.test.js +0 -54
  271. package/dist/commands/__tests__/blueprints.test.js.map +0 -1
  272. package/dist/commands/__tests__/build.test.js +0 -132
  273. package/dist/commands/__tests__/build.test.js.map +0 -1
  274. package/dist/commands/__tests__/codemod.test.js +0 -271
  275. package/dist/commands/__tests__/codemod.test.js.map +0 -1
  276. package/dist/commands/__tests__/debug.test.js +0 -590
  277. package/dist/commands/__tests__/debug.test.js.map +0 -1
  278. package/dist/commands/__tests__/deploy.test.js +0 -1945
  279. package/dist/commands/__tests__/deploy.test.js.map +0 -1
  280. package/dist/commands/__tests__/dev.test.js +0 -453
  281. package/dist/commands/__tests__/dev.test.js.map +0 -1
  282. package/dist/commands/__tests__/exec.test.js +0 -207
  283. package/dist/commands/__tests__/exec.test.js.map +0 -1
  284. package/dist/commands/__tests__/init/init.authentication.test.js +0 -73
  285. package/dist/commands/__tests__/init/init.authentication.test.js.map +0 -1
  286. package/dist/commands/__tests__/init/init.create-new-project.test.js +0 -195
  287. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +0 -1
  288. package/dist/commands/__tests__/init/init.plan.test.js +0 -279
  289. package/dist/commands/__tests__/init/init.plan.test.js.map +0 -1
  290. package/dist/commands/__tests__/init/init.setup.test.js +0 -335
  291. package/dist/commands/__tests__/init/init.setup.test.js.map +0 -1
  292. package/dist/commands/__tests__/install.test.js +0 -282
  293. package/dist/commands/__tests__/install.test.js.map +0 -1
  294. package/dist/commands/__tests__/learn.test.js +0 -29
  295. package/dist/commands/__tests__/learn.test.js.map +0 -1
  296. package/dist/commands/__tests__/logout.test.js +0 -91
  297. package/dist/commands/__tests__/logout.test.js.map +0 -1
  298. package/dist/commands/__tests__/manage.test.js +0 -110
  299. package/dist/commands/__tests__/manage.test.js.map +0 -1
  300. package/dist/commands/__tests__/migration.test.js +0 -119
  301. package/dist/commands/__tests__/migration.test.js.map +0 -1
  302. package/dist/commands/__tests__/preview.test.js +0 -261
  303. package/dist/commands/__tests__/preview.test.js.map +0 -1
  304. package/dist/commands/__tests__/start.test.js +0 -253
  305. package/dist/commands/__tests__/start.test.js.map +0 -1
  306. package/dist/commands/__tests__/undeploy.test.js +0 -382
  307. package/dist/commands/__tests__/undeploy.test.js.map +0 -1
  308. package/dist/commands/__tests__/versions.test.js +0 -142
  309. package/dist/commands/__tests__/versions.test.js.map +0 -1
  310. package/dist/commands/backup/__tests__/disable.test.js +0 -204
  311. package/dist/commands/backup/__tests__/disable.test.js.map +0 -1
  312. package/dist/commands/backup/__tests__/download.test.js +0 -768
  313. package/dist/commands/backup/__tests__/download.test.js.map +0 -1
  314. package/dist/commands/backup/__tests__/enable.test.js +0 -286
  315. package/dist/commands/backup/__tests__/enable.test.js.map +0 -1
  316. package/dist/commands/backup/__tests__/list.test.js +0 -330
  317. package/dist/commands/backup/__tests__/list.test.js.map +0 -1
  318. package/dist/commands/cors/__tests__/add.test.js +0 -376
  319. package/dist/commands/cors/__tests__/add.test.js.map +0 -1
  320. package/dist/commands/cors/__tests__/delete.test.js +0 -308
  321. package/dist/commands/cors/__tests__/delete.test.js.map +0 -1
  322. package/dist/commands/cors/__tests__/list.test.js +0 -241
  323. package/dist/commands/cors/__tests__/list.test.js.map +0 -1
  324. package/dist/commands/dataset/__tests__/copy.test.js +0 -628
  325. package/dist/commands/dataset/__tests__/copy.test.js.map +0 -1
  326. package/dist/commands/dataset/__tests__/create.test.js +0 -342
  327. package/dist/commands/dataset/__tests__/create.test.js.map +0 -1
  328. package/dist/commands/dataset/__tests__/delete.test.js +0 -231
  329. package/dist/commands/dataset/__tests__/delete.test.js.map +0 -1
  330. package/dist/commands/dataset/__tests__/export.test.js +0 -601
  331. package/dist/commands/dataset/__tests__/export.test.js.map +0 -1
  332. package/dist/commands/dataset/__tests__/import.test.js +0 -53
  333. package/dist/commands/dataset/__tests__/import.test.js.map +0 -1
  334. package/dist/commands/dataset/__tests__/list.test.js +0 -216
  335. package/dist/commands/dataset/__tests__/list.test.js.map +0 -1
  336. package/dist/commands/dataset/alias/__tests__/create.test.js +0 -339
  337. package/dist/commands/dataset/alias/__tests__/create.test.js.map +0 -1
  338. package/dist/commands/dataset/alias/__tests__/delete.test.js +0 -247
  339. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +0 -1
  340. package/dist/commands/dataset/alias/__tests__/link.test.js +0 -376
  341. package/dist/commands/dataset/alias/__tests__/link.test.js.map +0 -1
  342. package/dist/commands/dataset/alias/__tests__/unlink.test.js +0 -313
  343. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +0 -1
  344. package/dist/commands/dataset/visibility/__tests__/get.test.js +0 -128
  345. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +0 -1
  346. package/dist/commands/dataset/visibility/__tests__/set.test.js +0 -198
  347. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +0 -1
  348. package/dist/commands/docs/__tests__/browse.test.js +0 -29
  349. package/dist/commands/docs/__tests__/browse.test.js.map +0 -1
  350. package/dist/commands/docs/__tests__/read.test.js +0 -78
  351. package/dist/commands/docs/__tests__/read.test.js.map +0 -1
  352. package/dist/commands/docs/__tests__/search.test.js +0 -255
  353. package/dist/commands/docs/__tests__/search.test.js.map +0 -1
  354. package/dist/commands/documents/__tests__/create.test.js +0 -1030
  355. package/dist/commands/documents/__tests__/create.test.js.map +0 -1
  356. package/dist/commands/documents/__tests__/delete.test.js +0 -300
  357. package/dist/commands/documents/__tests__/delete.test.js.map +0 -1
  358. package/dist/commands/documents/__tests__/get.test.js +0 -182
  359. package/dist/commands/documents/__tests__/get.test.js.map +0 -1
  360. package/dist/commands/documents/__tests__/query.test.js +0 -300
  361. package/dist/commands/documents/__tests__/query.test.js.map +0 -1
  362. package/dist/commands/documents/__tests__/validate.test.js +0 -249
  363. package/dist/commands/documents/__tests__/validate.test.js.map +0 -1
  364. package/dist/commands/graphql/__tests__/list.test.js +0 -240
  365. package/dist/commands/graphql/__tests__/list.test.js.map +0 -1
  366. package/dist/commands/graphql/__tests__/undeploy.test.js +0 -410
  367. package/dist/commands/graphql/__tests__/undeploy.test.js.map +0 -1
  368. package/dist/commands/hook/__tests__/attempt.test.js +0 -275
  369. package/dist/commands/hook/__tests__/attempt.test.js.map +0 -1
  370. package/dist/commands/hook/__tests__/create.test.js +0 -119
  371. package/dist/commands/hook/__tests__/create.test.js.map +0 -1
  372. package/dist/commands/hook/__tests__/delete.test.js +0 -233
  373. package/dist/commands/hook/__tests__/delete.test.js.map +0 -1
  374. package/dist/commands/hook/__tests__/list.test.js +0 -145
  375. package/dist/commands/hook/__tests__/list.test.js.map +0 -1
  376. package/dist/commands/hook/__tests__/logs.test.js +0 -798
  377. package/dist/commands/hook/__tests__/logs.test.js.map +0 -1
  378. package/dist/commands/manifest/__tests__/extract.test.js +0 -132
  379. package/dist/commands/manifest/__tests__/extract.test.js.map +0 -1
  380. package/dist/commands/mcp/__tests__/configure.test.js +0 -397
  381. package/dist/commands/mcp/__tests__/configure.test.js.map +0 -1
  382. package/dist/commands/media/__tests__/create-aspect.test.js +0 -173
  383. package/dist/commands/media/__tests__/create-aspect.test.js.map +0 -1
  384. package/dist/commands/media/__tests__/delete-aspect.test.js +0 -342
  385. package/dist/commands/media/__tests__/delete-aspect.test.js.map +0 -1
  386. package/dist/commands/media/__tests__/deploy-aspect.test.js +0 -619
  387. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +0 -1
  388. package/dist/commands/media/__tests__/export.test.js +0 -697
  389. package/dist/commands/media/__tests__/export.test.js.map +0 -1
  390. package/dist/commands/media/__tests__/import.test.js +0 -347
  391. package/dist/commands/media/__tests__/import.test.js.map +0 -1
  392. package/dist/commands/openapi/__tests__/get.test.js +0 -149
  393. package/dist/commands/openapi/__tests__/get.test.js.map +0 -1
  394. package/dist/commands/openapi/__tests__/list.test.js +0 -113
  395. package/dist/commands/openapi/__tests__/list.test.js.map +0 -1
  396. package/dist/commands/projects/__tests__/list.test.js +0 -154
  397. package/dist/commands/projects/__tests__/list.test.js.map +0 -1
  398. package/dist/commands/schema/__tests__/delete.test.js +0 -454
  399. package/dist/commands/schema/__tests__/delete.test.js.map +0 -1
  400. package/dist/commands/schema/__tests__/deploy.test.js +0 -348
  401. package/dist/commands/schema/__tests__/deploy.test.js.map +0 -1
  402. package/dist/commands/schema/__tests__/extract.test.js +0 -121
  403. package/dist/commands/schema/__tests__/extract.test.js.map +0 -1
  404. package/dist/commands/schema/__tests__/list.test.js +0 -399
  405. package/dist/commands/schema/__tests__/list.test.js.map +0 -1
  406. package/dist/commands/schema/__tests__/validate.test.js +0 -121
  407. package/dist/commands/schema/__tests__/validate.test.js.map +0 -1
  408. package/dist/commands/telemetry/__tests__/disable.test.js +0 -147
  409. package/dist/commands/telemetry/__tests__/disable.test.js.map +0 -1
  410. package/dist/commands/telemetry/__tests__/enable.test.js +0 -133
  411. package/dist/commands/telemetry/__tests__/enable.test.js.map +0 -1
  412. package/dist/commands/telemetry/__tests__/status.test.js +0 -155
  413. package/dist/commands/telemetry/__tests__/status.test.js.map +0 -1
  414. package/dist/commands/tokens/__tests__/add.test.js +0 -435
  415. package/dist/commands/tokens/__tests__/add.test.js.map +0 -1
  416. package/dist/commands/tokens/__tests__/delete.test.js +0 -405
  417. package/dist/commands/tokens/__tests__/delete.test.js.map +0 -1
  418. package/dist/commands/tokens/__tests__/list.test.js +0 -395
  419. package/dist/commands/tokens/__tests__/list.test.js.map +0 -1
  420. package/dist/commands/users/__tests__/invite.test.js +0 -362
  421. package/dist/commands/users/__tests__/invite.test.js.map +0 -1
  422. package/dist/commands/users/__tests__/list.test.js +0 -407
  423. package/dist/commands/users/__tests__/list.test.js.map +0 -1
  424. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js +0 -77
  425. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js.map +0 -1
  426. package/dist/services/__tests__/datasetAliases.test.js +0 -131
  427. package/dist/services/__tests__/datasetAliases.test.js.map +0 -1
  428. package/dist/services/__tests__/datasets.test.js +0 -436
  429. package/dist/services/__tests__/datasets.test.js.map +0 -1
  430. package/dist/services/__tests__/graphql.test.js +0 -43
  431. package/dist/services/__tests__/graphql.test.js.map +0 -1
  432. package/dist/services/__tests__/mediaLibraries.test.js +0 -88
  433. package/dist/services/__tests__/mediaLibraries.test.js.map +0 -1
  434. package/dist/services/__tests__/projects.test.js +0 -41
  435. package/dist/services/__tests__/projects.test.js.map +0 -1
  436. package/dist/services/__tests__/userApplications.test.js +0 -113
  437. package/dist/services/__tests__/userApplications.test.js.map +0 -1
  438. package/dist/util/__tests__/appId.test.js +0 -31
  439. package/dist/util/__tests__/appId.test.js.map +0 -1
  440. package/dist/util/__tests__/cliClient.test.js +0 -184
  441. package/dist/util/__tests__/cliClient.test.js.map +0 -1
  442. package/dist/util/__tests__/compareDependencyVersions.test.js +0 -426
  443. package/dist/util/__tests__/compareDependencyVersions.test.js.map +0 -1
  444. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js +0 -74
  445. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js.map +0 -1
  446. package/dist/util/__tests__/findNdjsonEntry.test.js +0 -54
  447. package/dist/util/__tests__/findNdjsonEntry.test.js.map +0 -1
  448. package/dist/util/__tests__/getCliVersion.test.js +0 -28
  449. package/dist/util/__tests__/getCliVersion.test.js.map +0 -1
  450. package/dist/util/__tests__/getLocalPackageVersion.test.js +0 -84
  451. package/dist/util/__tests__/getLocalPackageVersion.test.js.map +0 -1
  452. package/dist/util/__tests__/getWorkspace.test.js +0 -37
  453. package/dist/util/__tests__/getWorkspace.test.js.map +0 -1
  454. package/dist/util/__tests__/readPackageJson.test.js +0 -69
  455. package/dist/util/__tests__/readPackageJson.test.js.map +0 -1
  456. package/dist/util/__tests__/warnAboutMissingAppId.test.js +0 -28
  457. package/dist/util/__tests__/warnAboutMissingAppId.test.js.map +0 -1
  458. package/dist/util/packageManager/__tests__/installPackages.test.js +0 -388
  459. package/dist/util/packageManager/__tests__/installPackages.test.js.map +0 -1
  460. package/dist/util/validation/ __tests__/validateDocuments.test.js +0 -274
  461. package/dist/util/validation/ __tests__/validateDocuments.test.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/commands/__tests__/init/init.setup.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {InitCommand} from '../../init'\n\nconst mocks = vi.hoisted(() => ({\n checkIsRemoteTemplate: vi.fn().mockReturnValue(false),\n detectFrameworkRecord: vi.fn(),\n getById: vi.fn(),\n getGitHubRepoInfo: vi.fn(),\n}))\n\nvi.mock('@vercel/fs-detectors', () => ({\n detectFrameworkRecord: mocks.detectFrameworkRecord,\n LocalFileSystemDetector: vi.fn(),\n}))\n\nvi.mock('../../../actions/init/remoteTemplate.js', () => ({\n checkIsRemoteTemplate: mocks.checkIsRemoteTemplate,\n getGitHubRepoInfo: mocks.getGitHubRepoInfo,\n}))\n\nvi.mock('@sanity/cli-core', async (importOriginal) => {\n const actual = await importOriginal<typeof import('@sanity/cli-core')>()\n return {\n ...actual,\n getGlobalCliClient: vi.fn().mockResolvedValue({\n users: {\n getById: mocks.getById,\n } as never,\n }),\n }\n})\n\n// Set default mock behavior for getById\nmocks.getById.mockResolvedValue({\n email: 'test@example.com',\n id: 'user-123',\n name: 'Test User',\n provider: 'saml-123',\n})\n\ndescribe('#init: oclif command setup', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand('init --help')\n\n expect(stdout).toMatchInlineSnapshot(String.raw`\n \"Initialize a new Sanity Studio, project and/or app\n\n USAGE\n $ sanity init [--json] [--auto-updates | --bare] [--coupon\n <code> | --project-plan <name>] [--dataset <name> | --dataset-default]\n [--env <filename> | ] [--git <message> | ] [--mcp]\n [--nextjs-add-config-files] [--nextjs-append-env] [--nextjs-embed-studio]\n [--organization <id>] [--output-path <path> | ] [--overwrite-files]\n [--package-manager <manager> | ] [--project <id> | --create-project <name>]\n [--provider <provider>] [--template <template> | ] [--typescript | ]\n [--visibility <mode>] [-y]\n\n FLAGS\n -y, --yes Unattended mode, answers \"yes\" to any\n \"yes/no\" prompt and otherwise uses defaults\n --[no-]auto-updates Enable auto updates of studio versions\n --bare Skip the Studio initialization and only print\n the selected project ID and dataset name to\n stdout\n --coupon=<code> Optionally select a coupon for a new project\n (cannot be used with --project-plan)\n --create-project=<name> Create a new project with the given name\n --dataset=<name> Dataset name for the studio\n --dataset-default Set up a project with a public dataset named\n \"production\"\n --env=<filename> Write environment variables to file\n --[no-]git=<message> Specify a commit message for initial commit,\n or disable git init\n --[no-]mcp Enable AI editor integration (MCP) setup\n --organization=<id> Organization ID to use for the project\n --output-path=<path> Path to write studio project to\n --overwrite-files Overwrite existing files\n --package-manager=<manager> Specify which package manager to use\n [allowed: npm, yarn, pnpm]\n --project=<id> Project ID to use for the studio\n --project-plan=<name> Optionally select a plan for a new project\n --provider=<provider> Login provider to use\n --template=<template> [default: clean] Project template to use\n [default: \"clean\"]\n --[no-]typescript Enable TypeScript support\n --visibility=<mode> Visibility mode for dataset\n\n GLOBAL FLAGS\n --json Format output as json.\n\n NEXT.JS FLAGS\n --[no-]nextjs-add-config-files Add config files to Next.js project\n --[no-]nextjs-append-env Append project ID and dataset to .env file\n --[no-]nextjs-embed-studio Embed the Studio in Next.js application\n\n DESCRIPTION\n Initialize a new Sanity Studio, project and/or app\n\n EXAMPLES\n $ sanity init\n\n Initialize a new project with a public dataset named \"production\"\n\n $ sanity init --dataset-default\n\n Initialize a project with the given project ID and dataset to the given path\n\n $ sanity init -y --project abc123 --dataset production --output-path \\\n ~/myproj\n\n Initialize a project with the given project ID and dataset using the moviedb\n template to the given path\n\n $ sanity init -y --project abc123 --dataset staging --template moviedb \\\n --output-path .\n\n Create a brand new project with name \"Movies Unlimited\"\n\n $ sanity init -y --create-project \"Movies Unlimited\" --dataset moviedb \\\n --visibility private --template moviedb --output-path \\\n /Users/espenh/movies-unlimited\n\n \"\n `)\n })\n\n test.each([\n {flag1: 'auto-updates', flag2: 'bare'},\n {flag1: 'coupon=123', flag2: 'project-plan=123'},\n {flag1: 'dataset=\"123', flag2: 'dataset-default'},\n {flag1: 'env=.env', flag2: 'bare'},\n {flag1: 'git=test', flag2: 'bare'},\n {flag1: 'no-git', flag2: 'git=test'},\n {flag1: 'output-path=/test-path', flag2: 'bare'},\n {flag1: 'package-manager=pnpm', flag2: 'bare'},\n {flag1: 'template=test', flag2: 'bare'},\n {flag1: 'typescript', flag2: 'bare'},\n {flag1: 'project=test', flag2: 'create-project=test'},\n ])('throws error when `$flag1` and `$flag2` flags are both passed', async ({flag1, flag2}) => {\n const {error} = await testCommand(InitCommand, [`--${flag1}`, `--${flag2}`], {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n })\n\n const [name1] = flag1.split('=')\n const [name2, value2 = 'true'] = flag2.split('=')\n\n expect(error?.message).toContain(\n `--${name2}=${value2} cannot also be provided when using --${name1}`,\n )\n })\n\n test.each([\n {flag: 'env', message: 'Env filename (`--env`) must start with `.env`', value: 'invalid.txt'},\n {\n flag: 'visibility',\n message: 'Expected --visibility=opaque to be one of: public, private',\n value: 'opaque',\n },\n {\n flag: 'package-manager',\n message: 'Expected --package-manager=pnm to be one of: npm, yarn, pnpm',\n value: 'pnm',\n },\n ])('throws error when `$flag` value is invalid', async ({flag, message, value}) => {\n const {error} = await testCommand(InitCommand, [`--${flag}=${value}`], {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n })\n\n expect(error?.message).toContain(message)\n })\n\n test('throws error when type argument is passed', async () => {\n const {error} = await testCommand(InitCommand, ['bad-argument'], {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n })\n\n expect(error?.message).toContain('Unknown init type \"bad-argument\"')\n })\n\n test('throws deprecation error when type argument is passed with `plugin`', async () => {\n const {error} = await testCommand(InitCommand, ['plugin'], {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n })\n\n expect(error?.message).toContain('Initializing plugins through the CLI is no longer supported')\n })\n\n test('throws error when `reconfigure` flag is passed', async () => {\n const {error} = await testCommand(InitCommand, ['--reconfigure'], {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n })\n\n expect(error?.message).toContain(\n '--reconfigure is deprecated - manual configuration is now required',\n )\n })\n\n test('throws error when framework and remote template are used together', async () => {\n mocks.detectFrameworkRecord.mockResolvedValueOnce({\n name: 'Next.js',\n slug: 'nextjs',\n })\n mocks.checkIsRemoteTemplate.mockReturnValueOnce(true)\n mocks.getGitHubRepoInfo.mockResolvedValueOnce({\n branch: 'main',\n owner: 'sanity-io',\n repo: 'sanity',\n })\n\n const {error} = await testCommand(\n InitCommand,\n ['--template=https://github.com/sanity-io/sanity'],\n {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n },\n )\n\n expect(error?.message).toContain(\n 'A remote template cannot be used with a detected framework. Detected: Next.js',\n )\n })\n\n test('throws error when in unattended mode and `dataset` is not set', async () => {\n const {error} = await testCommand(InitCommand, ['--yes'], {\n mocks: {\n token: 'test-token',\n },\n })\n\n expect(error?.message).toContain('`--dataset` must be specified in unattended mode')\n })\n\n test('throws error when `output-path` is not used in unattended mode with non-nextjs project', async () => {\n // Mock no framework or a non-Next.js framework\n mocks.detectFrameworkRecord.mockResolvedValueOnce(null)\n\n const {error} = await testCommand(\n InitCommand,\n ['--yes', '--dataset=production', '--project=test-project'],\n {\n mocks: {\n token: 'test-token',\n },\n },\n )\n\n // Should throw output-path error for non-Next.js projects\n expect(error?.message).toContain('`--output-path` must be specified in unattended mode')\n })\n\n test('throws error when in unattended mode and `project` and `create-project` not set', async () => {\n mocks.detectFrameworkRecord.mockResolvedValueOnce({\n name: 'Next.js',\n slug: 'nextjs',\n })\n\n const {error} = await testCommand(\n InitCommand,\n [\n '--yes',\n '--dataset=production',\n // Deliberately omitting --project and --create-project\n ],\n {\n mocks: {\n token: 'test-token',\n },\n },\n )\n\n expect(error?.message).toContain(\n '`--project <id>` or `--create-project <name>` must be specified in unattended mode',\n )\n })\n\n test('throws error when in unattended mode and `create-project` not set with `organization`', async () => {\n mocks.detectFrameworkRecord.mockResolvedValueOnce({\n name: 'Next.js',\n slug: 'nextjs',\n })\n\n const {error} = await testCommand(\n InitCommand,\n ['--yes', '--dataset=production', '--create-project=test'],\n {\n mocks: {\n token: 'test-token',\n },\n },\n )\n\n expect(error?.message).toContain(\n '--create-project is not supported in unattended mode without an organization, please specify an organization with `--organization <id>`',\n )\n })\n\n test('logs properly if app template flag is not valid', async () => {\n mocks.detectFrameworkRecord.mockResolvedValueOnce(null)\n\n const {stdout} = await testCommand(\n InitCommand,\n [\n '--template=invalid-template-name', // Not a valid app template\n ],\n {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n },\n )\n\n // When template is not an app template, it should log \"Fetching existing projects\"\n expect(stdout).toContain('Fetching existing projects')\n })\n})\n"],"names":["runCommand","testCommand","afterEach","describe","expect","test","vi","InitCommand","mocks","hoisted","checkIsRemoteTemplate","fn","mockReturnValue","detectFrameworkRecord","getById","getGitHubRepoInfo","mock","LocalFileSystemDetector","importOriginal","actual","getGlobalCliClient","mockResolvedValue","users","email","id","name","provider","clearAllMocks","stdout","toMatchInlineSnapshot","String","raw","each","flag1","flag2","error","isInteractive","token","name1","split","name2","value2","message","toContain","flag","value","mockResolvedValueOnce","slug","mockReturnValueOnce","branch","owner","repo"],"mappings":"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"}
@@ -1,282 +0,0 @@
1
- import { runCommand } from '@oclif/test';
2
- import { testCommand } from '@sanity/cli-test';
3
- import { afterEach, describe, expect, test, vi } from 'vitest';
4
- import { installDeclaredPackages, installNewPackages } from '../../util/packageManager/installPackages.js';
5
- import { getPackageManagerChoice } from '../../util/packageManager/packageManagerChoice.js';
6
- import { Install } from '../install.js';
7
- vi.mock('../../util/packageManager/packageManagerChoice.js', ()=>({
8
- getPackageManagerChoice: vi.fn()
9
- }));
10
- vi.mock('../../util/packageManager/installPackages.js', ()=>({
11
- installDeclaredPackages: vi.fn(),
12
- installNewPackages: vi.fn()
13
- }));
14
- const mockGetPackageManagerChoice = vi.mocked(getPackageManagerChoice);
15
- const mockInstallDeclaredPackages = vi.mocked(installDeclaredPackages);
16
- const mockInstallNewPackages = vi.mocked(installNewPackages);
17
- const defaultMocks = {
18
- projectRoot: {
19
- directory: '/test/project',
20
- path: '/test/project/sanity.config.ts',
21
- type: 'studio'
22
- }
23
- };
24
- afterEach(()=>{
25
- vi.clearAllMocks();
26
- });
27
- describe('#install', ()=>{
28
- test('help text is correct', async ()=>{
29
- const { stdout } = await runCommand('install --help');
30
- expect(stdout).toMatchInlineSnapshot(`
31
- "Installs dependencies for Sanity Studio project
32
-
33
- USAGE
34
- $ sanity install [PACKAGES...]
35
-
36
- ARGUMENTS
37
- [PACKAGES...] Packages to install
38
-
39
- DESCRIPTION
40
- Installs dependencies for Sanity Studio project
41
-
42
- EXAMPLES
43
- $ sanity install
44
-
45
- $ sanity install @sanity/vision
46
-
47
- $ sanity install some-package another-package
48
-
49
- "
50
- `);
51
- });
52
- describe('install declared packages (no arguments)', ()=>{
53
- test('installs declared packages with npm', async ()=>{
54
- mockGetPackageManagerChoice.mockResolvedValueOnce({
55
- chosen: 'npm',
56
- mostOptimal: 'npm'
57
- });
58
- mockInstallDeclaredPackages.mockResolvedValueOnce();
59
- const { error } = await testCommand(Install, [], {
60
- mocks: defaultMocks
61
- });
62
- expect(error).toBeUndefined();
63
- expect(mockGetPackageManagerChoice).toHaveBeenCalledWith('/test/project', {
64
- interactive: true
65
- });
66
- expect(mockInstallDeclaredPackages).toHaveBeenCalledWith('/test/project', 'npm', expect.objectContaining({
67
- workDir: '/test/project'
68
- }));
69
- expect(mockInstallNewPackages).not.toHaveBeenCalled();
70
- });
71
- test('installs declared packages with yarn', async ()=>{
72
- mockGetPackageManagerChoice.mockResolvedValueOnce({
73
- chosen: 'yarn',
74
- mostOptimal: 'yarn'
75
- });
76
- mockInstallDeclaredPackages.mockResolvedValueOnce();
77
- const { error } = await testCommand(Install, [], {
78
- mocks: defaultMocks
79
- });
80
- expect(error).toBeUndefined();
81
- expect(mockInstallDeclaredPackages).toHaveBeenCalledWith('/test/project', 'yarn', expect.objectContaining({
82
- workDir: '/test/project'
83
- }));
84
- });
85
- test('installs declared packages with pnpm', async ()=>{
86
- mockGetPackageManagerChoice.mockResolvedValueOnce({
87
- chosen: 'pnpm',
88
- mostOptimal: 'pnpm'
89
- });
90
- mockInstallDeclaredPackages.mockResolvedValueOnce();
91
- const { error } = await testCommand(Install, [], {
92
- mocks: defaultMocks
93
- });
94
- expect(error).toBeUndefined();
95
- expect(mockInstallDeclaredPackages).toHaveBeenCalledWith('/test/project', 'pnpm', expect.objectContaining({
96
- workDir: '/test/project'
97
- }));
98
- });
99
- test('installs declared packages with bun', async ()=>{
100
- mockGetPackageManagerChoice.mockResolvedValueOnce({
101
- chosen: 'bun',
102
- mostOptimal: 'bun'
103
- });
104
- mockInstallDeclaredPackages.mockResolvedValueOnce();
105
- const { error } = await testCommand(Install, [], {
106
- mocks: defaultMocks
107
- });
108
- expect(error).toBeUndefined();
109
- expect(mockInstallDeclaredPackages).toHaveBeenCalledWith('/test/project', 'bun', expect.objectContaining({
110
- workDir: '/test/project'
111
- }));
112
- });
113
- test('handles manual package manager selection', async ()=>{
114
- mockGetPackageManagerChoice.mockResolvedValueOnce({
115
- chosen: 'manual',
116
- mostOptimal: 'npm'
117
- });
118
- mockInstallDeclaredPackages.mockResolvedValueOnce();
119
- const { error } = await testCommand(Install, [], {
120
- mocks: defaultMocks
121
- });
122
- expect(error).toBeUndefined();
123
- expect(mockInstallDeclaredPackages).toHaveBeenCalledWith('/test/project', 'manual', expect.objectContaining({
124
- workDir: '/test/project'
125
- }));
126
- });
127
- });
128
- describe('install specific packages (with arguments)', ()=>{
129
- test('installs single package', async ()=>{
130
- mockGetPackageManagerChoice.mockResolvedValueOnce({
131
- chosen: 'npm',
132
- mostOptimal: 'npm'
133
- });
134
- mockInstallNewPackages.mockResolvedValueOnce();
135
- const { error } = await testCommand(Install, [
136
- '@sanity/vision'
137
- ], {
138
- mocks: defaultMocks
139
- });
140
- expect(error).toBeUndefined();
141
- expect(mockInstallNewPackages).toHaveBeenCalledWith({
142
- packageManager: 'npm',
143
- packages: [
144
- '@sanity/vision'
145
- ]
146
- }, expect.objectContaining({
147
- workDir: '/test/project'
148
- }));
149
- expect(mockInstallDeclaredPackages).not.toHaveBeenCalled();
150
- });
151
- test('installs multiple packages', async ()=>{
152
- mockGetPackageManagerChoice.mockResolvedValueOnce({
153
- chosen: 'yarn',
154
- mostOptimal: 'yarn'
155
- });
156
- mockInstallNewPackages.mockResolvedValueOnce();
157
- const { error } = await testCommand(Install, [
158
- '@sanity/vision',
159
- 'react-icons',
160
- 'lodash'
161
- ], {
162
- mocks: defaultMocks
163
- });
164
- expect(error).toBeUndefined();
165
- expect(mockInstallNewPackages).toHaveBeenCalledWith({
166
- packageManager: 'yarn',
167
- packages: [
168
- '@sanity/vision',
169
- 'react-icons',
170
- 'lodash'
171
- ]
172
- }, expect.objectContaining({
173
- workDir: '/test/project'
174
- }));
175
- expect(mockInstallDeclaredPackages).not.toHaveBeenCalled();
176
- });
177
- test('installs packages with different package managers', async ()=>{
178
- mockGetPackageManagerChoice.mockResolvedValueOnce({
179
- chosen: 'pnpm',
180
- mostOptimal: 'pnpm'
181
- });
182
- mockInstallNewPackages.mockResolvedValueOnce();
183
- const { error } = await testCommand(Install, [
184
- 'some-package'
185
- ], {
186
- mocks: defaultMocks
187
- });
188
- expect(error).toBeUndefined();
189
- expect(mockInstallNewPackages).toHaveBeenCalledWith({
190
- packageManager: 'pnpm',
191
- packages: [
192
- 'some-package'
193
- ]
194
- }, expect.objectContaining({
195
- workDir: '/test/project'
196
- }));
197
- });
198
- });
199
- describe('error handling', ()=>{
200
- test('handles package manager choice failure', async ()=>{
201
- mockGetPackageManagerChoice.mockRejectedValueOnce(new Error('Failed to detect package manager'));
202
- const { error } = await testCommand(Install, [], {
203
- mocks: defaultMocks
204
- });
205
- expect(error).toBeDefined();
206
- expect(error?.message).toContain('Failed to detect package manager');
207
- expect(mockInstallDeclaredPackages).not.toHaveBeenCalled();
208
- expect(mockInstallNewPackages).not.toHaveBeenCalled();
209
- });
210
- test('handles declared packages installation failure', async ()=>{
211
- mockGetPackageManagerChoice.mockResolvedValueOnce({
212
- chosen: 'npm',
213
- mostOptimal: 'npm'
214
- });
215
- mockInstallDeclaredPackages.mockRejectedValueOnce(new Error('Installation failed'));
216
- const { error } = await testCommand(Install, [], {
217
- mocks: defaultMocks
218
- });
219
- expect(error).toBeDefined();
220
- expect(error?.message).toContain('Installation failed');
221
- });
222
- test('handles new packages installation failure', async ()=>{
223
- mockGetPackageManagerChoice.mockResolvedValueOnce({
224
- chosen: 'npm',
225
- mostOptimal: 'npm'
226
- });
227
- mockInstallNewPackages.mockRejectedValueOnce(new Error('Package not found'));
228
- const { error } = await testCommand(Install, [
229
- 'nonexistent-package'
230
- ], {
231
- mocks: defaultMocks
232
- });
233
- expect(error).toBeDefined();
234
- expect(error?.message).toContain('Package not found');
235
- });
236
- });
237
- describe('integration with project root', ()=>{
238
- test('passes correct working directory to functions', async ()=>{
239
- mockGetPackageManagerChoice.mockResolvedValueOnce({
240
- chosen: 'npm',
241
- mostOptimal: 'npm'
242
- });
243
- mockInstallDeclaredPackages.mockResolvedValueOnce();
244
- await testCommand(Install, [], {
245
- mocks: defaultMocks
246
- });
247
- expect(mockGetPackageManagerChoice).toHaveBeenCalledWith('/test/project', {
248
- interactive: true
249
- });
250
- expect(mockInstallDeclaredPackages).toHaveBeenCalledWith('/test/project', 'npm', expect.objectContaining({
251
- workDir: '/test/project'
252
- }));
253
- });
254
- test('provides output object to install functions', async ()=>{
255
- mockGetPackageManagerChoice.mockResolvedValueOnce({
256
- chosen: 'npm',
257
- mostOptimal: 'npm'
258
- });
259
- mockInstallNewPackages.mockResolvedValueOnce();
260
- await testCommand(Install, [
261
- 'test-package'
262
- ], {
263
- mocks: defaultMocks
264
- });
265
- expect(mockInstallNewPackages).toHaveBeenCalledWith({
266
- packageManager: 'npm',
267
- packages: [
268
- 'test-package'
269
- ]
270
- }, expect.objectContaining({
271
- output: expect.objectContaining({
272
- error: expect.any(Function),
273
- log: expect.any(Function),
274
- warn: expect.any(Function)
275
- }),
276
- workDir: '/test/project'
277
- }));
278
- });
279
- });
280
- });
281
-
282
- //# sourceMappingURL=install.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/commands/__tests__/install.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {\n installDeclaredPackages,\n installNewPackages,\n} from '../../util/packageManager/installPackages.js'\nimport {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js'\nimport {Install} from '../install.js'\n\nvi.mock('../../util/packageManager/packageManagerChoice.js', () => ({\n getPackageManagerChoice: vi.fn(),\n}))\n\nvi.mock('../../util/packageManager/installPackages.js', () => ({\n installDeclaredPackages: vi.fn(),\n installNewPackages: vi.fn(),\n}))\n\nconst mockGetPackageManagerChoice = vi.mocked(getPackageManagerChoice)\nconst mockInstallDeclaredPackages = vi.mocked(installDeclaredPackages)\nconst mockInstallNewPackages = vi.mocked(installNewPackages)\n\nconst defaultMocks = {\n projectRoot: {\n directory: '/test/project',\n path: '/test/project/sanity.config.ts',\n type: 'studio' as const,\n },\n}\n\nafterEach(() => {\n vi.clearAllMocks()\n})\n\ndescribe('#install', () => {\n test('help text is correct', async () => {\n const {stdout} = await runCommand('install --help')\n expect(stdout).toMatchInlineSnapshot(`\n \"Installs dependencies for Sanity Studio project\n\n USAGE\n $ sanity install [PACKAGES...]\n\n ARGUMENTS\n [PACKAGES...] Packages to install\n\n DESCRIPTION\n Installs dependencies for Sanity Studio project\n\n EXAMPLES\n $ sanity install\n\n $ sanity install @sanity/vision\n\n $ sanity install some-package another-package\n\n \"\n `)\n })\n\n describe('install declared packages (no arguments)', () => {\n test('installs declared packages with npm', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'npm',\n mostOptimal: 'npm',\n })\n mockInstallDeclaredPackages.mockResolvedValueOnce()\n\n const {error} = await testCommand(Install, [], {mocks: defaultMocks})\n\n expect(error).toBeUndefined()\n expect(mockGetPackageManagerChoice).toHaveBeenCalledWith('/test/project', {\n interactive: true,\n })\n expect(mockInstallDeclaredPackages).toHaveBeenCalledWith(\n '/test/project',\n 'npm',\n expect.objectContaining({\n workDir: '/test/project',\n }),\n )\n expect(mockInstallNewPackages).not.toHaveBeenCalled()\n })\n\n test('installs declared packages with yarn', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'yarn',\n mostOptimal: 'yarn',\n })\n mockInstallDeclaredPackages.mockResolvedValueOnce()\n\n const {error} = await testCommand(Install, [], {mocks: defaultMocks})\n\n expect(error).toBeUndefined()\n expect(mockInstallDeclaredPackages).toHaveBeenCalledWith(\n '/test/project',\n 'yarn',\n expect.objectContaining({\n workDir: '/test/project',\n }),\n )\n })\n\n test('installs declared packages with pnpm', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'pnpm',\n mostOptimal: 'pnpm',\n })\n mockInstallDeclaredPackages.mockResolvedValueOnce()\n\n const {error} = await testCommand(Install, [], {mocks: defaultMocks})\n\n expect(error).toBeUndefined()\n expect(mockInstallDeclaredPackages).toHaveBeenCalledWith(\n '/test/project',\n 'pnpm',\n expect.objectContaining({\n workDir: '/test/project',\n }),\n )\n })\n\n test('installs declared packages with bun', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'bun',\n mostOptimal: 'bun',\n })\n mockInstallDeclaredPackages.mockResolvedValueOnce()\n\n const {error} = await testCommand(Install, [], {mocks: defaultMocks})\n\n expect(error).toBeUndefined()\n expect(mockInstallDeclaredPackages).toHaveBeenCalledWith(\n '/test/project',\n 'bun',\n expect.objectContaining({\n workDir: '/test/project',\n }),\n )\n })\n\n test('handles manual package manager selection', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'manual',\n mostOptimal: 'npm',\n })\n mockInstallDeclaredPackages.mockResolvedValueOnce()\n\n const {error} = await testCommand(Install, [], {mocks: defaultMocks})\n\n expect(error).toBeUndefined()\n expect(mockInstallDeclaredPackages).toHaveBeenCalledWith(\n '/test/project',\n 'manual',\n expect.objectContaining({\n workDir: '/test/project',\n }),\n )\n })\n })\n\n describe('install specific packages (with arguments)', () => {\n test('installs single package', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'npm',\n mostOptimal: 'npm',\n })\n mockInstallNewPackages.mockResolvedValueOnce()\n\n const {error} = await testCommand(Install, ['@sanity/vision'], {mocks: defaultMocks})\n\n expect(error).toBeUndefined()\n expect(mockInstallNewPackages).toHaveBeenCalledWith(\n {\n packageManager: 'npm',\n packages: ['@sanity/vision'],\n },\n expect.objectContaining({\n workDir: '/test/project',\n }),\n )\n expect(mockInstallDeclaredPackages).not.toHaveBeenCalled()\n })\n\n test('installs multiple packages', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'yarn',\n mostOptimal: 'yarn',\n })\n mockInstallNewPackages.mockResolvedValueOnce()\n\n const {error} = await testCommand(Install, ['@sanity/vision', 'react-icons', 'lodash'], {\n mocks: defaultMocks,\n })\n\n expect(error).toBeUndefined()\n expect(mockInstallNewPackages).toHaveBeenCalledWith(\n {\n packageManager: 'yarn',\n packages: ['@sanity/vision', 'react-icons', 'lodash'],\n },\n expect.objectContaining({\n workDir: '/test/project',\n }),\n )\n expect(mockInstallDeclaredPackages).not.toHaveBeenCalled()\n })\n\n test('installs packages with different package managers', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'pnpm',\n mostOptimal: 'pnpm',\n })\n mockInstallNewPackages.mockResolvedValueOnce()\n\n const {error} = await testCommand(Install, ['some-package'], {mocks: defaultMocks})\n\n expect(error).toBeUndefined()\n expect(mockInstallNewPackages).toHaveBeenCalledWith(\n {\n packageManager: 'pnpm',\n packages: ['some-package'],\n },\n expect.objectContaining({\n workDir: '/test/project',\n }),\n )\n })\n })\n\n describe('error handling', () => {\n test('handles package manager choice failure', async () => {\n mockGetPackageManagerChoice.mockRejectedValueOnce(\n new Error('Failed to detect package manager'),\n )\n\n const {error} = await testCommand(Install, [], {mocks: defaultMocks})\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Failed to detect package manager')\n expect(mockInstallDeclaredPackages).not.toHaveBeenCalled()\n expect(mockInstallNewPackages).not.toHaveBeenCalled()\n })\n\n test('handles declared packages installation failure', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'npm',\n mostOptimal: 'npm',\n })\n mockInstallDeclaredPackages.mockRejectedValueOnce(new Error('Installation failed'))\n\n const {error} = await testCommand(Install, [], {mocks: defaultMocks})\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Installation failed')\n })\n\n test('handles new packages installation failure', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'npm',\n mostOptimal: 'npm',\n })\n mockInstallNewPackages.mockRejectedValueOnce(new Error('Package not found'))\n\n const {error} = await testCommand(Install, ['nonexistent-package'], {mocks: defaultMocks})\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Package not found')\n })\n })\n\n describe('integration with project root', () => {\n test('passes correct working directory to functions', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'npm',\n mostOptimal: 'npm',\n })\n mockInstallDeclaredPackages.mockResolvedValueOnce()\n\n await testCommand(Install, [], {mocks: defaultMocks})\n\n expect(mockGetPackageManagerChoice).toHaveBeenCalledWith('/test/project', {\n interactive: true,\n })\n expect(mockInstallDeclaredPackages).toHaveBeenCalledWith(\n '/test/project',\n 'npm',\n expect.objectContaining({\n workDir: '/test/project',\n }),\n )\n })\n\n test('provides output object to install functions', async () => {\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'npm',\n mostOptimal: 'npm',\n })\n mockInstallNewPackages.mockResolvedValueOnce()\n\n await testCommand(Install, ['test-package'], {mocks: defaultMocks})\n\n expect(mockInstallNewPackages).toHaveBeenCalledWith(\n {\n packageManager: 'npm',\n packages: ['test-package'],\n },\n expect.objectContaining({\n output: expect.objectContaining({\n error: expect.any(Function),\n log: expect.any(Function),\n warn: expect.any(Function),\n }),\n workDir: '/test/project',\n }),\n )\n })\n })\n})\n"],"names":["runCommand","testCommand","afterEach","describe","expect","test","vi","installDeclaredPackages","installNewPackages","getPackageManagerChoice","Install","mock","fn","mockGetPackageManagerChoice","mocked","mockInstallDeclaredPackages","mockInstallNewPackages","defaultMocks","projectRoot","directory","path","type","clearAllMocks","stdout","toMatchInlineSnapshot","mockResolvedValueOnce","chosen","mostOptimal","error","mocks","toBeUndefined","toHaveBeenCalledWith","interactive","objectContaining","workDir","not","toHaveBeenCalled","packageManager","packages","mockRejectedValueOnce","Error","toBeDefined","message","toContain","output","any","Function","log","warn"],"mappings":"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"}
@@ -1,29 +0,0 @@
1
- import { runCommand } from '@oclif/test';
2
- import { testCommand } from '@sanity/cli-test';
3
- import open from 'open';
4
- import { describe, expect, test } from 'vitest';
5
- import { LearnCommand } from '../learn.js';
6
- describe('#learn', ()=>{
7
- test('command runs', async ()=>{
8
- const { stdout } = await testCommand(LearnCommand);
9
- expect(stdout).toContain('Opening https://www.sanity.io/learn');
10
- // Mocked in test setup
11
- expect(open).toHaveBeenCalledWith('https://www.sanity.io/learn');
12
- });
13
- test('help text is correct', async ()=>{
14
- const { stdout } = await runCommand('learn --help');
15
- expect(stdout).toMatchInlineSnapshot(`
16
- "Opens Sanity Learn in your web browser
17
-
18
- USAGE
19
- $ sanity learn
20
-
21
- DESCRIPTION
22
- Opens Sanity Learn in your web browser
23
-
24
- "
25
- `);
26
- });
27
- });
28
-
29
- //# sourceMappingURL=learn.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/commands/__tests__/learn.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport open from 'open'\nimport {describe, expect, test} from 'vitest'\n\nimport {LearnCommand} from '../learn.js'\n\ndescribe('#learn', () => {\n test('command runs', async () => {\n const {stdout} = await testCommand(LearnCommand)\n\n expect(stdout).toContain('Opening https://www.sanity.io/learn')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/learn')\n })\n\n test('help text is correct', async () => {\n const {stdout} = await runCommand('learn --help')\n expect(stdout).toMatchInlineSnapshot(`\n \"Opens Sanity Learn in your web browser\n\n USAGE\n $ sanity learn\n\n DESCRIPTION\n Opens Sanity Learn in your web browser\n\n \"\n `)\n })\n})\n"],"names":["runCommand","testCommand","open","describe","expect","test","LearnCommand","stdout","toContain","toHaveBeenCalledWith","toMatchInlineSnapshot"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,OAAOC,UAAU,OAAM;AACvB,SAAQC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,QAAO,SAAQ;AAE7C,SAAQC,YAAY,QAAO,cAAa;AAExCH,SAAS,UAAU;IACjBE,KAAK,gBAAgB;QACnB,MAAM,EAACE,MAAM,EAAC,GAAG,MAAMN,YAAYK;QAEnCF,OAAOG,QAAQC,SAAS,CAAC;QACzB,uBAAuB;QACvBJ,OAAOF,MAAMO,oBAAoB,CAAC;IACpC;IAEAJ,KAAK,wBAAwB;QAC3B,MAAM,EAACE,MAAM,EAAC,GAAG,MAAMP,WAAW;QAClCI,OAAOG,QAAQG,qBAAqB,CAAC,CAAC;;;;;;;;;;IAUtC,CAAC;IACH;AACF"}
@@ -1,91 +0,0 @@
1
- import { runCommand } from '@oclif/test';
2
- import { getCliToken, setConfig } from '@sanity/cli-core';
3
- import { mockApi, testCommand } from '@sanity/cli-test';
4
- import nock from 'nock';
5
- import { afterEach, describe, expect, test, vi } from 'vitest';
6
- import { AUTH_API_VERSION } from '../../services/auth.js';
7
- import { LogoutCommand } from '../logout.js';
8
- vi.mock('@sanity/cli-core', async ()=>{
9
- const actual = await vi.importActual('@sanity/cli-core');
10
- return {
11
- ...actual,
12
- getCliToken: vi.fn(),
13
- setConfig: vi.fn()
14
- };
15
- });
16
- const mockedGetCliToken = vi.mocked(getCliToken);
17
- const mockedSetConfig = vi.mocked(setConfig);
18
- afterEach(()=>{
19
- vi.clearAllMocks();
20
- const pending = nock.pendingMocks();
21
- nock.cleanAll();
22
- expect(pending, 'pending mocks').toEqual([]);
23
- });
24
- describe('#logout', ()=>{
25
- test('--help works', async ()=>{
26
- const { stdout } = await runCommand([
27
- 'logout',
28
- '--help'
29
- ]);
30
- expect(stdout).toMatchInlineSnapshot(`
31
- "Logs out the CLI from the current user session
32
-
33
- USAGE
34
- $ sanity logout
35
-
36
- DESCRIPTION
37
- Logs out the CLI from the current user session
38
-
39
- "
40
- `);
41
- });
42
- test('logs out successfully if a token exists', async ()=>{
43
- mockedGetCliToken.mockResolvedValueOnce('test-token');
44
- mockApi({
45
- apiVersion: AUTH_API_VERSION,
46
- method: 'post',
47
- uri: '/auth/logout'
48
- }).reply(200);
49
- const { stdout } = await testCommand(LogoutCommand);
50
- expect(stdout).toContain('Logged out successfully');
51
- expect(mockedSetConfig).toHaveBeenCalledWith('authToken', undefined);
52
- expect(mockedSetConfig).toHaveBeenCalledWith('telemetryConsent', undefined);
53
- });
54
- test('logs out successfully when session is expired (401)', async ()=>{
55
- mockedGetCliToken.mockResolvedValueOnce('test-token');
56
- mockApi({
57
- apiVersion: AUTH_API_VERSION,
58
- method: 'post',
59
- uri: '/auth/logout'
60
- }).reply(401, {
61
- message: 'Unauthorized',
62
- statusCode: 401
63
- });
64
- const { stdout } = await testCommand(LogoutCommand);
65
- expect(stdout).toContain('Logged out successfully');
66
- expect(mockedSetConfig).toHaveBeenCalledWith('authToken', undefined);
67
- expect(mockedSetConfig).toHaveBeenCalledWith('telemetryConsent', undefined);
68
- });
69
- test('shows an error if no token exists', async ()=>{
70
- mockedGetCliToken.mockResolvedValueOnce('');
71
- const { stdout } = await testCommand(LogoutCommand);
72
- expect(stdout).toContain('No login credentials found');
73
- expect(mockedSetConfig).not.toHaveBeenCalled();
74
- });
75
- test('throws error on API failure (non-401)', async ()=>{
76
- mockedGetCliToken.mockResolvedValueOnce('test-token');
77
- mockApi({
78
- apiVersion: AUTH_API_VERSION,
79
- method: 'post',
80
- uri: '/auth/logout'
81
- }).reply(500, {
82
- message: 'Internal Server Error'
83
- });
84
- const { error } = await testCommand(LogoutCommand);
85
- expect(error).toBeDefined();
86
- expect(error?.message).toContain('Failed to logout');
87
- expect(mockedSetConfig).not.toHaveBeenCalled();
88
- });
89
- });
90
-
91
- //# sourceMappingURL=logout.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/commands/__tests__/logout.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliToken, setConfig} from '@sanity/cli-core'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {AUTH_API_VERSION} from '../../services/auth.js'\nimport {LogoutCommand} from '../logout.js'\n\nvi.mock('@sanity/cli-core', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core')>('@sanity/cli-core')\n return {\n ...actual,\n getCliToken: vi.fn(),\n setConfig: vi.fn(),\n }\n})\n\nconst mockedGetCliToken = vi.mocked(getCliToken)\nconst mockedSetConfig = vi.mocked(setConfig)\n\nafterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n})\n\ndescribe('#logout', () => {\n test('--help works', async () => {\n const {stdout} = await runCommand(['logout', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Logs out the CLI from the current user session\n\n USAGE\n $ sanity logout\n\n DESCRIPTION\n Logs out the CLI from the current user session\n\n \"\n `)\n })\n\n test('logs out successfully if a token exists', async () => {\n mockedGetCliToken.mockResolvedValueOnce('test-token')\n\n mockApi({\n apiVersion: AUTH_API_VERSION,\n method: 'post',\n uri: '/auth/logout',\n }).reply(200)\n\n const {stdout} = await testCommand(LogoutCommand)\n\n expect(stdout).toContain('Logged out successfully')\n expect(mockedSetConfig).toHaveBeenCalledWith('authToken', undefined)\n expect(mockedSetConfig).toHaveBeenCalledWith('telemetryConsent', undefined)\n })\n\n test('logs out successfully when session is expired (401)', async () => {\n mockedGetCliToken.mockResolvedValueOnce('test-token')\n\n mockApi({\n apiVersion: AUTH_API_VERSION,\n method: 'post',\n uri: '/auth/logout',\n }).reply(401, {\n message: 'Unauthorized',\n statusCode: 401,\n })\n\n const {stdout} = await testCommand(LogoutCommand)\n\n expect(stdout).toContain('Logged out successfully')\n expect(mockedSetConfig).toHaveBeenCalledWith('authToken', undefined)\n expect(mockedSetConfig).toHaveBeenCalledWith('telemetryConsent', undefined)\n })\n\n test('shows an error if no token exists', async () => {\n mockedGetCliToken.mockResolvedValueOnce('')\n\n const {stdout} = await testCommand(LogoutCommand)\n\n expect(stdout).toContain('No login credentials found')\n expect(mockedSetConfig).not.toHaveBeenCalled()\n })\n\n test('throws error on API failure (non-401)', async () => {\n mockedGetCliToken.mockResolvedValueOnce('test-token')\n\n mockApi({\n apiVersion: AUTH_API_VERSION,\n method: 'post',\n uri: '/auth/logout',\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(LogoutCommand)\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Failed to logout')\n expect(mockedSetConfig).not.toHaveBeenCalled()\n })\n})\n"],"names":["runCommand","getCliToken","setConfig","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","AUTH_API_VERSION","LogoutCommand","mock","actual","importActual","fn","mockedGetCliToken","mocked","mockedSetConfig","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","mockResolvedValueOnce","apiVersion","method","uri","reply","toContain","toHaveBeenCalledWith","undefined","message","statusCode","not","toHaveBeenCalled","error","toBeDefined"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,WAAW,EAAEC,SAAS,QAAO,mBAAkB;AACvD,SAAQC,OAAO,EAAEC,WAAW,QAAO,mBAAkB;AACrD,OAAOC,UAAU,OAAM;AACvB,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,gBAAgB,QAAO,yBAAwB;AACvD,SAAQC,aAAa,QAAO,eAAc;AAE1CF,GAAGG,IAAI,CAAC,oBAAoB;IAC1B,MAAMC,SAAS,MAAMJ,GAAGK,YAAY,CAAoC;IACxE,OAAO;QACL,GAAGD,MAAM;QACTb,aAAaS,GAAGM,EAAE;QAClBd,WAAWQ,GAAGM,EAAE;IAClB;AACF;AAEA,MAAMC,oBAAoBP,GAAGQ,MAAM,CAACjB;AACpC,MAAMkB,kBAAkBT,GAAGQ,MAAM,CAAChB;AAElCI,UAAU;IACRI,GAAGU,aAAa;IAChB,MAAMC,UAAUhB,KAAKiB,YAAY;IACjCjB,KAAKkB,QAAQ;IACbf,OAAOa,SAAS,iBAAiBG,OAAO,CAAC,EAAE;AAC7C;AAEAjB,SAAS,WAAW;IAClBE,KAAK,gBAAgB;QACnB,MAAM,EAACgB,MAAM,EAAC,GAAG,MAAMzB,WAAW;YAAC;YAAU;SAAS;QAEtDQ,OAAOiB,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;IAUtC,CAAC;IACH;IAEAjB,KAAK,2CAA2C;QAC9CQ,kBAAkBU,qBAAqB,CAAC;QAExCxB,QAAQ;YACNyB,YAAYjB;YACZkB,QAAQ;YACRC,KAAK;QACP,GAAGC,KAAK,CAAC;QAET,MAAM,EAACN,MAAM,EAAC,GAAG,MAAMrB,YAAYQ;QAEnCJ,OAAOiB,QAAQO,SAAS,CAAC;QACzBxB,OAAOW,iBAAiBc,oBAAoB,CAAC,aAAaC;QAC1D1B,OAAOW,iBAAiBc,oBAAoB,CAAC,oBAAoBC;IACnE;IAEAzB,KAAK,uDAAuD;QAC1DQ,kBAAkBU,qBAAqB,CAAC;QAExCxB,QAAQ;YACNyB,YAAYjB;YACZkB,QAAQ;YACRC,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK;YACZI,SAAS;YACTC,YAAY;QACd;QAEA,MAAM,EAACX,MAAM,EAAC,GAAG,MAAMrB,YAAYQ;QAEnCJ,OAAOiB,QAAQO,SAAS,CAAC;QACzBxB,OAAOW,iBAAiBc,oBAAoB,CAAC,aAAaC;QAC1D1B,OAAOW,iBAAiBc,oBAAoB,CAAC,oBAAoBC;IACnE;IAEAzB,KAAK,qCAAqC;QACxCQ,kBAAkBU,qBAAqB,CAAC;QAExC,MAAM,EAACF,MAAM,EAAC,GAAG,MAAMrB,YAAYQ;QAEnCJ,OAAOiB,QAAQO,SAAS,CAAC;QACzBxB,OAAOW,iBAAiBkB,GAAG,CAACC,gBAAgB;IAC9C;IAEA7B,KAAK,yCAAyC;QAC5CQ,kBAAkBU,qBAAqB,CAAC;QAExCxB,QAAQ;YACNyB,YAAYjB;YACZkB,QAAQ;YACRC,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK;YAACI,SAAS;QAAuB;QAE/C,MAAM,EAACI,KAAK,EAAC,GAAG,MAAMnC,YAAYQ;QAElCJ,OAAO+B,OAAOC,WAAW;QACzBhC,OAAO+B,OAAOJ,SAASH,SAAS,CAAC;QACjCxB,OAAOW,iBAAiBkB,GAAG,CAACC,gBAAgB;IAC9C;AACF"}
@@ -1,110 +0,0 @@
1
- import { runCommand } from '@oclif/test';
2
- import { getStudioConfig } from '@sanity/cli-core';
3
- import { testCommand } from '@sanity/cli-test';
4
- import open from 'open';
5
- import { afterEach, describe, expect, test, vi } from 'vitest';
6
- import { ManageCommand } from '../manage.js';
7
- vi.mock('@sanity/cli-core', async ()=>{
8
- const actual = await vi.importActual('@sanity/cli-core');
9
- return {
10
- ...actual,
11
- getStudioConfig: vi.fn()
12
- };
13
- });
14
- const defaultMocks = {
15
- cliConfig: {},
16
- projectRoot: {
17
- directory: '/test/path',
18
- path: '/test/path/sanity.config.ts',
19
- type: 'studio'
20
- }
21
- };
22
- afterEach(()=>{
23
- vi.clearAllMocks();
24
- });
25
- describe('#manage', ()=>{
26
- test('--help works', async ()=>{
27
- const { stdout } = await runCommand([
28
- 'manage',
29
- '--help'
30
- ]);
31
- expect(stdout).toMatchInlineSnapshot(`
32
- "Opens project management interface in your web browser
33
-
34
- USAGE
35
- $ sanity manage
36
-
37
- DESCRIPTION
38
- Opens project management interface in your web browser
39
-
40
- "
41
- `);
42
- });
43
- test('open link to project management interface if cli config has projectId', async ()=>{
44
- const { stdout } = await testCommand(ManageCommand, [], {
45
- mocks: {
46
- ...defaultMocks,
47
- cliConfig: {
48
- api: {
49
- projectId: 'test-project-id'
50
- }
51
- }
52
- }
53
- });
54
- expect(stdout).toContain('Opening https://www.sanity.io/manage/project/test-project-id');
55
- // Mocked in test setup
56
- expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/project/test-project-id');
57
- });
58
- test('open link to project management interface if studio config has projectId', async ()=>{
59
- vi.mocked(getStudioConfig).mockResolvedValueOnce({
60
- basePath: 'test-base-path',
61
- dataset: 'test-dataset',
62
- name: 'test-name',
63
- projectId: 'test-project-id',
64
- schema: {
65
- types: []
66
- },
67
- unstable_sources: []
68
- });
69
- const { stdout } = await testCommand(ManageCommand, [], {
70
- mocks: defaultMocks
71
- });
72
- expect(stdout).toContain('Opening https://www.sanity.io/manage/project/test-project-id');
73
- // Mocked in test setup
74
- expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/project/test-project-id');
75
- });
76
- test('open root link to manage page if studio config is array', async ()=>{
77
- vi.mocked(getStudioConfig).mockResolvedValueOnce([
78
- {
79
- basePath: 'test-base-path',
80
- dataset: 'test-dataset',
81
- name: 'test-name',
82
- projectId: 'test-project-id',
83
- schema: {
84
- _original: {
85
- types: []
86
- }
87
- },
88
- title: 'test-title',
89
- unstable_sources: []
90
- }
91
- ]);
92
- const { stdout } = await testCommand(ManageCommand, [], {
93
- mocks: defaultMocks
94
- });
95
- expect(stdout).toContain('Opening https://www.sanity.io/manage/');
96
- // Mocked in test setup
97
- expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/');
98
- });
99
- test('opens root manage page if no projectId is found', async ()=>{
100
- vi.mocked(getStudioConfig).mockResolvedValueOnce({});
101
- const { stdout } = await testCommand(ManageCommand, [], {
102
- mocks: defaultMocks
103
- });
104
- expect(stdout).toContain('Opening https://www.sanity.io/manage/');
105
- // Mocked in test setup
106
- expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/');
107
- });
108
- });
109
-
110
- //# sourceMappingURL=manage.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/commands/__tests__/manage.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getStudioConfig} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport open from 'open'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {ManageCommand} from '../manage.js'\n\nvi.mock('@sanity/cli-core', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core')>('@sanity/cli-core')\n return {\n ...actual,\n getStudioConfig: vi.fn(),\n }\n})\n\nconst defaultMocks = {\n cliConfig: {},\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n type: 'studio' as const,\n },\n}\n\nafterEach(() => {\n vi.clearAllMocks()\n})\n\ndescribe('#manage', () => {\n test('--help works', async () => {\n const {stdout} = await runCommand(['manage', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Opens project management interface in your web browser\n\n USAGE\n $ sanity manage\n\n DESCRIPTION\n Opens project management interface in your web browser\n\n \"\n `)\n })\n\n test('open link to project management interface if cli config has projectId', async () => {\n const {stdout} = await testCommand(ManageCommand, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {\n api: {\n projectId: 'test-project-id',\n },\n },\n },\n })\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/project/test-project-id')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/project/test-project-id')\n })\n\n test('open link to project management interface if studio config has projectId', async () => {\n vi.mocked(getStudioConfig).mockResolvedValueOnce({\n basePath: 'test-base-path',\n dataset: 'test-dataset',\n name: 'test-name',\n projectId: 'test-project-id',\n schema: {\n types: [],\n },\n unstable_sources: [],\n })\n\n const {stdout} = await testCommand(ManageCommand, [], {mocks: defaultMocks})\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/project/test-project-id')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/project/test-project-id')\n })\n\n test('open root link to manage page if studio config is array', async () => {\n vi.mocked(getStudioConfig).mockResolvedValueOnce([\n {\n basePath: 'test-base-path',\n dataset: 'test-dataset',\n name: 'test-name',\n projectId: 'test-project-id',\n schema: {\n _original: {\n types: [],\n },\n },\n title: 'test-title',\n unstable_sources: [],\n },\n ])\n\n const {stdout} = await testCommand(ManageCommand, [], {mocks: defaultMocks})\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/')\n })\n\n test('opens root manage page if no projectId is found', async () => {\n vi.mocked(getStudioConfig).mockResolvedValueOnce({} as never)\n\n const {stdout} = await testCommand(ManageCommand, [], {mocks: defaultMocks})\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/')\n })\n})\n"],"names":["runCommand","getStudioConfig","testCommand","open","afterEach","describe","expect","test","vi","ManageCommand","mock","actual","importActual","fn","defaultMocks","cliConfig","projectRoot","directory","path","type","clearAllMocks","stdout","toMatchInlineSnapshot","mocks","api","projectId","toContain","toHaveBeenCalledWith","mocked","mockResolvedValueOnce","basePath","dataset","name","schema","types","unstable_sources","_original","title"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,eAAe,QAAO,mBAAkB;AAChD,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,OAAOC,UAAU,OAAM;AACvB,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,aAAa,QAAO,eAAc;AAE1CD,GAAGE,IAAI,CAAC,oBAAoB;IAC1B,MAAMC,SAAS,MAAMH,GAAGI,YAAY,CAAoC;IACxE,OAAO;QACL,GAAGD,MAAM;QACTV,iBAAiBO,GAAGK,EAAE;IACxB;AACF;AAEA,MAAMC,eAAe;IACnBC,WAAW,CAAC;IACZC,aAAa;QACXC,WAAW;QACXC,MAAM;QACNC,MAAM;IACR;AACF;AAEAf,UAAU;IACRI,GAAGY,aAAa;AAClB;AAEAf,SAAS,WAAW;IAClBE,KAAK,gBAAgB;QACnB,MAAM,EAACc,MAAM,EAAC,GAAG,MAAMrB,WAAW;YAAC;YAAU;SAAS;QAEtDM,OAAOe,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;IAUtC,CAAC;IACH;IAEAf,KAAK,yEAAyE;QAC5E,MAAM,EAACc,MAAM,EAAC,GAAG,MAAMnB,YAAYO,eAAe,EAAE,EAAE;YACpDc,OAAO;gBACL,GAAGT,YAAY;gBACfC,WAAW;oBACTS,KAAK;wBACHC,WAAW;oBACb;gBACF;YACF;QACF;QAEAnB,OAAOe,QAAQK,SAAS,CAAC;QACzB,uBAAuB;QACvBpB,OAAOH,MAAMwB,oBAAoB,CAAC;IACpC;IAEApB,KAAK,4EAA4E;QAC/EC,GAAGoB,MAAM,CAAC3B,iBAAiB4B,qBAAqB,CAAC;YAC/CC,UAAU;YACVC,SAAS;YACTC,MAAM;YACNP,WAAW;YACXQ,QAAQ;gBACNC,OAAO,EAAE;YACX;YACAC,kBAAkB,EAAE;QACtB;QAEA,MAAM,EAACd,MAAM,EAAC,GAAG,MAAMnB,YAAYO,eAAe,EAAE,EAAE;YAACc,OAAOT;QAAY;QAE1ER,OAAOe,QAAQK,SAAS,CAAC;QACzB,uBAAuB;QACvBpB,OAAOH,MAAMwB,oBAAoB,CAAC;IACpC;IAEApB,KAAK,2DAA2D;QAC9DC,GAAGoB,MAAM,CAAC3B,iBAAiB4B,qBAAqB,CAAC;YAC/C;gBACEC,UAAU;gBACVC,SAAS;gBACTC,MAAM;gBACNP,WAAW;gBACXQ,QAAQ;oBACNG,WAAW;wBACTF,OAAO,EAAE;oBACX;gBACF;gBACAG,OAAO;gBACPF,kBAAkB,EAAE;YACtB;SACD;QAED,MAAM,EAACd,MAAM,EAAC,GAAG,MAAMnB,YAAYO,eAAe,EAAE,EAAE;YAACc,OAAOT;QAAY;QAE1ER,OAAOe,QAAQK,SAAS,CAAC;QACzB,uBAAuB;QACvBpB,OAAOH,MAAMwB,oBAAoB,CAAC;IACpC;IAEApB,KAAK,mDAAmD;QACtDC,GAAGoB,MAAM,CAAC3B,iBAAiB4B,qBAAqB,CAAC,CAAC;QAElD,MAAM,EAACR,MAAM,EAAC,GAAG,MAAMnB,YAAYO,eAAe,EAAE,EAAE;YAACc,OAAOT;QAAY;QAE1ER,OAAOe,QAAQK,SAAS,CAAC;QACzB,uBAAuB;QACvBpB,OAAOH,MAAMwB,oBAAoB,CAAC;IACpC;AACF"}