@sanity/cli 6.0.0-alpha.5 → 6.0.0-alpha.7

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 (527) hide show
  1. package/README.md +2907 -109
  2. package/dist/actions/dataset/create.d.ts +49 -0
  3. package/dist/actions/dataset/create.js +48 -0
  4. package/dist/actions/dataset/create.js.map +1 -0
  5. package/dist/actions/dataset/determineDatasetAclMode.d.ts +37 -0
  6. package/dist/actions/dataset/determineDatasetAclMode.js +36 -0
  7. package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -0
  8. package/dist/actions/debug/gatherDebugInfo.js +15 -21
  9. package/dist/actions/debug/gatherDebugInfo.js.map +1 -1
  10. package/dist/actions/debug/types.d.ts +0 -2
  11. package/dist/actions/debug/types.js.map +1 -1
  12. package/dist/actions/deploy/deployApp.js +13 -0
  13. package/dist/actions/deploy/deployApp.js.map +1 -1
  14. package/dist/actions/init/remoteTemplate.js +1 -1
  15. package/dist/actions/init/remoteTemplate.js.map +1 -1
  16. package/dist/actions/manifest/extractAppManifest.d.ts +20 -0
  17. package/dist/actions/manifest/extractAppManifest.js +51 -0
  18. package/dist/actions/manifest/extractAppManifest.js.map +1 -0
  19. package/dist/actions/manifest/extractManifest.js +1 -1
  20. package/dist/actions/manifest/extractManifest.js.map +1 -1
  21. package/dist/actions/manifest/types.d.ts +6 -1
  22. package/dist/actions/manifest/types.js.map +1 -1
  23. package/dist/actions/media/importAspects.js +2 -1
  24. package/dist/actions/media/importAspects.js.map +1 -1
  25. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +1 -1
  26. package/dist/actions/telemetry/resolveConsent.d.ts +1 -9
  27. package/dist/actions/telemetry/resolveConsent.js +2 -2
  28. package/dist/actions/telemetry/resolveConsent.js.map +1 -1
  29. package/dist/actions/telemetry/setConsent.d.ts +1 -4
  30. package/dist/actions/telemetry/setConsent.js +4 -8
  31. package/dist/actions/telemetry/setConsent.js.map +1 -1
  32. package/dist/commands/dataset/create.d.ts +0 -2
  33. package/dist/commands/dataset/create.js +8 -54
  34. package/dist/commands/dataset/create.js.map +1 -1
  35. package/dist/commands/debug.js +5 -9
  36. package/dist/commands/debug.js.map +1 -1
  37. package/dist/commands/init.d.ts +6 -1
  38. package/dist/commands/init.js +358 -20
  39. package/dist/commands/init.js.map +1 -1
  40. package/dist/commands/manifest/extract.js +7 -8
  41. package/dist/commands/manifest/extract.js.map +1 -1
  42. package/dist/commands/telemetry/disable.js +0 -1
  43. package/dist/commands/telemetry/disable.js.map +1 -1
  44. package/dist/commands/telemetry/enable.js +0 -1
  45. package/dist/commands/telemetry/enable.js.map +1 -1
  46. package/dist/commands/telemetry/status.js +1 -3
  47. package/dist/commands/telemetry/status.js.map +1 -1
  48. package/dist/config/createCliConfig.d.ts +9 -0
  49. package/dist/hooks/prerun/flushTelemetry.worker.d.ts +2 -0
  50. package/dist/hooks/prerun/flushTelemetry.worker.js +22 -0
  51. package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -0
  52. package/dist/hooks/prerun/setupTelemetry.js +65 -1
  53. package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
  54. package/dist/prompts/init/promptForTypescript.d.ts +2 -0
  55. package/dist/prompts/init/promptForTypescript.js +15 -0
  56. package/dist/prompts/init/promptForTypescript.js.map +1 -0
  57. package/dist/prompts/promptForDatasetAclMode.d.ts +9 -0
  58. package/dist/prompts/promptForDatasetAclMode.js +27 -0
  59. package/dist/prompts/promptForDatasetAclMode.js.map +1 -0
  60. package/dist/prompts/promptForDatasetName.d.ts +1 -1
  61. package/dist/prompts/promptForDatasetName.js +4 -1
  62. package/dist/prompts/promptForDatasetName.js.map +1 -1
  63. package/dist/services/organizations.d.ts +3 -1
  64. package/dist/services/organizations.js +2 -1
  65. package/dist/services/organizations.js.map +1 -1
  66. package/dist/services/telemetry.d.ts +2 -0
  67. package/dist/services/telemetry.js +20 -0
  68. package/dist/services/telemetry.js.map +1 -0
  69. package/dist/services/user.d.ts +5 -0
  70. package/dist/services/user.js +12 -1
  71. package/dist/services/user.js.map +1 -1
  72. package/dist/services/userApplications.d.ts +3 -1
  73. package/dist/services/userApplications.js +5 -1
  74. package/dist/services/userApplications.js.map +1 -1
  75. package/dist/telemetry/cli.telemetry.d.ts +20 -0
  76. package/dist/telemetry/cli.telemetry.js +8 -0
  77. package/dist/telemetry/cli.telemetry.js.map +1 -0
  78. package/dist/telemetry/store/cleanupOldTelemetryFiles.d.ts +5 -0
  79. package/dist/telemetry/store/cleanupOldTelemetryFiles.js +30 -0
  80. package/dist/telemetry/store/cleanupOldTelemetryFiles.js.map +1 -0
  81. package/dist/telemetry/store/createTelemetryStore.d.ts +39 -0
  82. package/dist/telemetry/store/createTelemetryStore.js +95 -0
  83. package/dist/telemetry/store/createTelemetryStore.js.map +1 -0
  84. package/dist/telemetry/store/createTraceId.d.ts +10 -0
  85. package/dist/telemetry/store/createTraceId.js +10 -0
  86. package/dist/telemetry/store/createTraceId.js.map +1 -0
  87. package/dist/telemetry/store/debug.d.ts +5 -0
  88. package/dist/telemetry/store/debug.js +7 -0
  89. package/dist/telemetry/store/debug.js.map +1 -0
  90. package/dist/telemetry/store/findTelemetryFiles.d.ts +13 -0
  91. package/dist/telemetry/store/findTelemetryFiles.js +34 -0
  92. package/dist/telemetry/store/findTelemetryFiles.js.map +1 -0
  93. package/dist/telemetry/store/flushTelemetryFiles.d.ts +20 -0
  94. package/dist/telemetry/store/flushTelemetryFiles.js +107 -0
  95. package/dist/telemetry/store/flushTelemetryFiles.js.map +1 -0
  96. package/dist/telemetry/store/generateTelemetryFilePath.d.ts +17 -0
  97. package/dist/telemetry/store/generateTelemetryFilePath.js +30 -0
  98. package/dist/telemetry/store/generateTelemetryFilePath.js.map +1 -0
  99. package/dist/telemetry/store/getTelemetryBaseInfo.d.ts +27 -0
  100. package/dist/telemetry/store/getTelemetryBaseInfo.js +34 -0
  101. package/dist/telemetry/store/getTelemetryBaseInfo.js.map +1 -0
  102. package/dist/telemetry/store/logger.d.ts +6 -0
  103. package/dist/telemetry/store/logger.js +54 -0
  104. package/dist/telemetry/store/logger.js.map +1 -0
  105. package/dist/telemetry/store/trace.d.ts +6 -0
  106. package/dist/telemetry/store/trace.js +150 -0
  107. package/dist/telemetry/store/trace.js.map +1 -0
  108. package/dist/telemetry/utils/readNDJSON.d.ts +10 -0
  109. package/dist/telemetry/utils/readNDJSON.js +18 -0
  110. package/dist/telemetry/utils/readNDJSON.js.map +1 -0
  111. package/dist/util/detectRuntime.d.ts +8 -0
  112. package/dist/util/detectRuntime.js +20 -0
  113. package/dist/util/detectRuntime.js.map +1 -0
  114. package/dist/util/isStaging.d.ts +7 -0
  115. package/dist/util/isStaging.js +10 -0
  116. package/dist/util/isStaging.js.map +1 -0
  117. package/dist/util/parseArguments.d.ts +35 -0
  118. package/dist/util/parseArguments.js +42 -0
  119. package/dist/util/parseArguments.js.map +1 -0
  120. package/oclif.manifest.json +7 -1
  121. package/package.json +25 -18
  122. package/templates/app-quickstart/src/App.css +20 -0
  123. package/templates/app-quickstart/src/App.tsx +25 -0
  124. package/templates/app-quickstart/src/ExampleComponent.css +90 -0
  125. package/templates/app-quickstart/src/ExampleComponent.tsx +37 -0
  126. package/templates/app-sanity-ui/src/App.tsx +34 -0
  127. package/templates/app-sanity-ui/src/ExampleComponent.tsx +34 -0
  128. package/templates/app-sanity-ui/src/SanityUI.tsx +23 -0
  129. package/templates/blog/README.md +11 -0
  130. package/templates/blog/schemaTypes/author.js +50 -0
  131. package/templates/blog/schemaTypes/blockContent.js +67 -0
  132. package/templates/blog/schemaTypes/category.js +19 -0
  133. package/templates/blog/schemaTypes/index.js +6 -0
  134. package/templates/blog/schemaTypes/post.js +65 -0
  135. package/templates/blog/static/.gitkeep +1 -0
  136. package/templates/clean/README.md +9 -0
  137. package/templates/clean/schemaTypes/index.js +1 -0
  138. package/templates/clean/static/.gitkeep +1 -0
  139. package/templates/ecommerce/README.md +11 -0
  140. package/templates/ecommerce/plugins/.gitkeep +1 -0
  141. package/templates/ecommerce/plugins/barcode-input/BarcodeInput.js +62 -0
  142. package/templates/ecommerce/plugins/barcode-input/index.js +9 -0
  143. package/templates/ecommerce/plugins/barcode-input/schemaType.js +60 -0
  144. package/templates/ecommerce/schemaTypes/blockContent.js +67 -0
  145. package/templates/ecommerce/schemaTypes/category.js +39 -0
  146. package/templates/ecommerce/schemaTypes/index.js +23 -0
  147. package/templates/ecommerce/schemaTypes/locale/localeBlockContent.js +19 -0
  148. package/templates/ecommerce/schemaTypes/locale/localeString.js +19 -0
  149. package/templates/ecommerce/schemaTypes/locale/localeText.js +19 -0
  150. package/templates/ecommerce/schemaTypes/locale/supportedLanguages.js +5 -0
  151. package/templates/ecommerce/schemaTypes/product.js +83 -0
  152. package/templates/ecommerce/schemaTypes/productVariant.js +52 -0
  153. package/templates/ecommerce/schemaTypes/vendor.js +39 -0
  154. package/templates/ecommerce/static/.gitkeep +1 -0
  155. package/templates/get-started/README.md +9 -0
  156. package/templates/get-started/plugins/.gitkeep +1 -0
  157. package/templates/get-started/plugins/sanity-plugin-tutorial/CustomDefaultLayout.tsx +16 -0
  158. package/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +104 -0
  159. package/templates/get-started/plugins/sanity-plugin-tutorial/index.ts +11 -0
  160. package/templates/get-started/schemaTypes/index.ts +1 -0
  161. package/templates/get-started/static/.gitkeep +1 -0
  162. package/templates/moviedb/README.md +10 -0
  163. package/templates/moviedb/schemaTypes/blockContent.js +67 -0
  164. package/templates/moviedb/schemaTypes/castMember.js +37 -0
  165. package/templates/moviedb/schemaTypes/crewMember.js +52 -0
  166. package/templates/moviedb/schemaTypes/index.js +22 -0
  167. package/templates/moviedb/schemaTypes/movie.js +85 -0
  168. package/templates/moviedb/schemaTypes/person.js +37 -0
  169. package/templates/moviedb/schemaTypes/plotSummaries.js +20 -0
  170. package/templates/moviedb/schemaTypes/plotSummary.js +24 -0
  171. package/templates/moviedb/schemaTypes/screening.js +81 -0
  172. package/templates/moviedb/static/.gitkeep +1 -0
  173. package/templates/quickstart/README.md +9 -0
  174. package/templates/quickstart/schemaTypes/index.js +1 -0
  175. package/templates/quickstart/static/.gitkeep +1 -0
  176. package/templates/shared/gitignore.txt +29 -0
  177. package/templates/shared/tsconfig.json +17 -0
  178. package/templates/shopify/README.md +85 -0
  179. package/templates/shopify/components/hotspots/ProductTooltip.tsx +38 -0
  180. package/templates/shopify/components/icons/Shopify.tsx +20 -0
  181. package/templates/shopify/components/inputs/CollectionHidden.tsx +23 -0
  182. package/templates/shopify/components/inputs/PlaceholderString.tsx +20 -0
  183. package/templates/shopify/components/inputs/ProductHidden.tsx +64 -0
  184. package/templates/shopify/components/inputs/ProductVariantHidden.tsx +24 -0
  185. package/templates/shopify/components/inputs/ProxyString.tsx +32 -0
  186. package/templates/shopify/components/media/ColorTheme.tsx +38 -0
  187. package/templates/shopify/components/media/ShopifyDocumentStatus.tsx +82 -0
  188. package/templates/shopify/components/studio/Navbar.tsx +29 -0
  189. package/templates/shopify/constants.ts +61 -0
  190. package/templates/shopify/docs/features.md +158 -0
  191. package/templates/shopify/plugins/customDocumentActions/index.ts +55 -0
  192. package/templates/shopify/plugins/customDocumentActions/shopifyDelete.tsx +144 -0
  193. package/templates/shopify/plugins/customDocumentActions/shopifyLink.ts +39 -0
  194. package/templates/shopify/plugins/customDocumentActions/types.ts +14 -0
  195. package/templates/shopify/schemaTypes/documents/collection.tsx +142 -0
  196. package/templates/shopify/schemaTypes/documents/colorTheme.tsx +44 -0
  197. package/templates/shopify/schemaTypes/documents/page.ts +70 -0
  198. package/templates/shopify/schemaTypes/documents/product.tsx +132 -0
  199. package/templates/shopify/schemaTypes/documents/productVariant.tsx +67 -0
  200. package/templates/shopify/schemaTypes/index.ts +108 -0
  201. package/templates/shopify/schemaTypes/objects/collection/collectionGroupType.ts +27 -0
  202. package/templates/shopify/schemaTypes/objects/collection/collectionLinksType.ts +16 -0
  203. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorObjectType.tsx +48 -0
  204. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorType.tsx +50 -0
  205. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeObjectType.ts +40 -0
  206. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeType.ts +49 -0
  207. package/templates/shopify/schemaTypes/objects/global/footerType.ts +22 -0
  208. package/templates/shopify/schemaTypes/objects/global/menuLinksType.ts +21 -0
  209. package/templates/shopify/schemaTypes/objects/global/menuType.ts +17 -0
  210. package/templates/shopify/schemaTypes/objects/global/notFoundPageType.ts +37 -0
  211. package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +48 -0
  212. package/templates/shopify/schemaTypes/objects/hotspot/productHotspotsType.tsx +17 -0
  213. package/templates/shopify/schemaTypes/objects/hotspot/spotType.tsx +60 -0
  214. package/templates/shopify/schemaTypes/objects/link/linkEmailType.tsx +34 -0
  215. package/templates/shopify/schemaTypes/objects/link/linkExternalType.tsx +37 -0
  216. package/templates/shopify/schemaTypes/objects/link/linkInternalType.tsx +33 -0
  217. package/templates/shopify/schemaTypes/objects/link/linkProductType.tsx +60 -0
  218. package/templates/shopify/schemaTypes/objects/module/accordionGroupType.ts +33 -0
  219. package/templates/shopify/schemaTypes/objects/module/accordionType.ts +28 -0
  220. package/templates/shopify/schemaTypes/objects/module/callToActionType.tsx +85 -0
  221. package/templates/shopify/schemaTypes/objects/module/calloutType.ts +38 -0
  222. package/templates/shopify/schemaTypes/objects/module/collectionReferenceType.tsx +47 -0
  223. package/templates/shopify/schemaTypes/objects/module/gridItemType.ts +41 -0
  224. package/templates/shopify/schemaTypes/objects/module/gridType.ts +28 -0
  225. package/templates/shopify/schemaTypes/objects/module/heroType.tsx +40 -0
  226. package/templates/shopify/schemaTypes/objects/module/imageCallToActionType.tsx +19 -0
  227. package/templates/shopify/schemaTypes/objects/module/imageFeatureType.ts +80 -0
  228. package/templates/shopify/schemaTypes/objects/module/imageFeaturesType.tsx +51 -0
  229. package/templates/shopify/schemaTypes/objects/module/instagramType.ts +35 -0
  230. package/templates/shopify/schemaTypes/objects/module/productFeaturesType.tsx +50 -0
  231. package/templates/shopify/schemaTypes/objects/module/productReferenceType.tsx +42 -0
  232. package/templates/shopify/schemaTypes/objects/seoType.ts +31 -0
  233. package/templates/shopify/schemaTypes/objects/shopify/collectionRuleType.tsx +37 -0
  234. package/templates/shopify/schemaTypes/objects/shopify/inventoryType.ts +25 -0
  235. package/templates/shopify/schemaTypes/objects/shopify/optionType.tsx +31 -0
  236. package/templates/shopify/schemaTypes/objects/shopify/placeholderStringType.ts +11 -0
  237. package/templates/shopify/schemaTypes/objects/shopify/priceRangeType.ts +20 -0
  238. package/templates/shopify/schemaTypes/objects/shopify/productWithVariantType.tsx +142 -0
  239. package/templates/shopify/schemaTypes/objects/shopify/proxyStringType.ts +12 -0
  240. package/templates/shopify/schemaTypes/objects/shopify/shopType.ts +15 -0
  241. package/templates/shopify/schemaTypes/objects/shopify/shopifyCollectionType.ts +84 -0
  242. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductType.ts +131 -0
  243. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductVariantType.ts +121 -0
  244. package/templates/shopify/schemaTypes/portableText/portableTextSimpleType.tsx +45 -0
  245. package/templates/shopify/schemaTypes/portableText/portableTextType.tsx +52 -0
  246. package/templates/shopify/schemaTypes/singletons/homeType.ts +49 -0
  247. package/templates/shopify/schemaTypes/singletons/settingsType.ts +96 -0
  248. package/templates/shopify/static/.gitkeep +1 -0
  249. package/templates/shopify/structure/collectionStructure.ts +9 -0
  250. package/templates/shopify/structure/colorThemeStructure.ts +9 -0
  251. package/templates/shopify/structure/homeStructure.ts +9 -0
  252. package/templates/shopify/structure/index.ts +57 -0
  253. package/templates/shopify/structure/pageStructure.ts +11 -0
  254. package/templates/shopify/structure/productStructure.ts +51 -0
  255. package/templates/shopify/structure/settingStructure.ts +9 -0
  256. package/templates/shopify/utils/blocksToText.ts +20 -0
  257. package/templates/shopify/utils/defineStructure.ts +11 -0
  258. package/templates/shopify/utils/getPriceRange.ts +24 -0
  259. package/templates/shopify/utils/shopifyUrls.ts +22 -0
  260. package/templates/shopify/utils/validateSlug.ts +18 -0
  261. package/templates/shopify-online-storefront/README.md +54 -0
  262. package/templates/shopify-online-storefront/components/icons/Shopify.tsx +22 -0
  263. package/templates/shopify-online-storefront/components/inputs/CollectionHidden.tsx +23 -0
  264. package/templates/shopify-online-storefront/components/inputs/PlaceholderString.tsx +25 -0
  265. package/templates/shopify-online-storefront/components/inputs/ProductHidden.tsx +66 -0
  266. package/templates/shopify-online-storefront/components/inputs/ProductVariantHidden.tsx +25 -0
  267. package/templates/shopify-online-storefront/components/inputs/ProxyString.tsx +38 -0
  268. package/templates/shopify-online-storefront/components/media/ShopifyDocumentStatus.tsx +83 -0
  269. package/templates/shopify-online-storefront/constants.ts +18 -0
  270. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/index.ts +45 -0
  271. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyDelete.tsx +144 -0
  272. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyLink.ts +39 -0
  273. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/types.ts +14 -0
  274. package/templates/shopify-online-storefront/schemaTypes/blocks/blockContent.ts +32 -0
  275. package/templates/shopify-online-storefront/schemaTypes/documents/collection.tsx +83 -0
  276. package/templates/shopify-online-storefront/schemaTypes/documents/product.tsx +102 -0
  277. package/templates/shopify-online-storefront/schemaTypes/documents/productVariant.tsx +82 -0
  278. package/templates/shopify-online-storefront/schemaTypes/index.ts +43 -0
  279. package/templates/shopify-online-storefront/schemaTypes/objects/accordion.ts +31 -0
  280. package/templates/shopify-online-storefront/schemaTypes/objects/accordionGroup.ts +35 -0
  281. package/templates/shopify-online-storefront/schemaTypes/objects/callout.ts +40 -0
  282. package/templates/shopify-online-storefront/schemaTypes/objects/inventory.ts +30 -0
  283. package/templates/shopify-online-storefront/schemaTypes/objects/option.ts +30 -0
  284. package/templates/shopify-online-storefront/schemaTypes/objects/priceRange.ts +22 -0
  285. package/templates/shopify-online-storefront/schemaTypes/objects/proxyString.ts +11 -0
  286. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollection.ts +109 -0
  287. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollectionRule.tsx +45 -0
  288. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProduct.ts +165 -0
  289. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProductVariant.ts +151 -0
  290. package/templates/shopify-online-storefront/structure/collectionStructure.ts +9 -0
  291. package/templates/shopify-online-storefront/structure/index.ts +37 -0
  292. package/templates/shopify-online-storefront/structure/productStructure.ts +35 -0
  293. package/templates/shopify-online-storefront/utils/defineStructure.ts +11 -0
  294. package/templates/shopify-online-storefront/utils/getPriceRange.ts +24 -0
  295. package/templates/shopify-online-storefront/utils/shopifyUrls.ts +22 -0
  296. package/dist/actions/build/__tests__/buildApp.test.js +0 -367
  297. package/dist/actions/build/__tests__/buildApp.test.js.map +0 -1
  298. package/dist/actions/build/__tests__/buildStudio.test.js +0 -561
  299. package/dist/actions/build/__tests__/buildStudio.test.js.map +0 -1
  300. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js +0 -233
  301. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js.map +0 -1
  302. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js +0 -414
  303. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js.map +0 -1
  304. package/dist/actions/build/__tests__/determineBasePath.test.js +0 -24
  305. package/dist/actions/build/__tests__/determineBasePath.test.js.map +0 -1
  306. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js +0 -109
  307. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js.map +0 -1
  308. package/dist/actions/build/__tests__/getViteConfig.test.js +0 -493
  309. package/dist/actions/build/__tests__/getViteConfig.test.js.map +0 -1
  310. package/dist/actions/build/__tests__/renderDocument.test.js +0 -278
  311. package/dist/actions/build/__tests__/renderDocument.test.js.map +0 -1
  312. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js +0 -153
  313. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js.map +0 -1
  314. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js +0 -657
  315. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js.map +0 -1
  316. package/dist/actions/dataset/__tests__/validateDatasetName.test.js +0 -182
  317. package/dist/actions/dataset/__tests__/validateDatasetName.test.js.map +0 -1
  318. package/dist/actions/deploy/__tests__/checkDir.test.js +0 -120
  319. package/dist/actions/deploy/__tests__/checkDir.test.js.map +0 -1
  320. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js +0 -16
  321. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js.map +0 -1
  322. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js +0 -124
  323. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js.map +0 -1
  324. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +0 -274
  325. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +0 -1
  326. package/dist/actions/media/__tests__/importMedia.test.js +0 -182
  327. package/dist/actions/media/__tests__/importMedia.test.js.map +0 -1
  328. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js +0 -174
  329. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js.map +0 -1
  330. package/dist/actions/schema/__tests__/validateAction.test.js +0 -281
  331. package/dist/actions/schema/__tests__/validateAction.test.js.map +0 -1
  332. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js +0 -27
  333. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js.map +0 -1
  334. package/dist/actions/users/__tests__/validateEmail.test.js +0 -16
  335. package/dist/actions/users/__tests__/validateEmail.test.js.map +0 -1
  336. package/dist/commands/__tests__/blueprints.test.js +0 -54
  337. package/dist/commands/__tests__/blueprints.test.js.map +0 -1
  338. package/dist/commands/__tests__/build.test.js +0 -132
  339. package/dist/commands/__tests__/build.test.js.map +0 -1
  340. package/dist/commands/__tests__/codemod.test.js +0 -271
  341. package/dist/commands/__tests__/codemod.test.js.map +0 -1
  342. package/dist/commands/__tests__/debug.test.js +0 -590
  343. package/dist/commands/__tests__/debug.test.js.map +0 -1
  344. package/dist/commands/__tests__/deploy.test.js +0 -1945
  345. package/dist/commands/__tests__/deploy.test.js.map +0 -1
  346. package/dist/commands/__tests__/dev.test.js +0 -453
  347. package/dist/commands/__tests__/dev.test.js.map +0 -1
  348. package/dist/commands/__tests__/exec.test.js +0 -207
  349. package/dist/commands/__tests__/exec.test.js.map +0 -1
  350. package/dist/commands/__tests__/init/init.authentication.test.js +0 -73
  351. package/dist/commands/__tests__/init/init.authentication.test.js.map +0 -1
  352. package/dist/commands/__tests__/init/init.create-new-project.test.js +0 -195
  353. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +0 -1
  354. package/dist/commands/__tests__/init/init.plan.test.js +0 -279
  355. package/dist/commands/__tests__/init/init.plan.test.js.map +0 -1
  356. package/dist/commands/__tests__/init/init.setup.test.js +0 -335
  357. package/dist/commands/__tests__/init/init.setup.test.js.map +0 -1
  358. package/dist/commands/__tests__/install.test.js +0 -282
  359. package/dist/commands/__tests__/install.test.js.map +0 -1
  360. package/dist/commands/__tests__/learn.test.js +0 -29
  361. package/dist/commands/__tests__/learn.test.js.map +0 -1
  362. package/dist/commands/__tests__/logout.test.js +0 -91
  363. package/dist/commands/__tests__/logout.test.js.map +0 -1
  364. package/dist/commands/__tests__/manage.test.js +0 -110
  365. package/dist/commands/__tests__/manage.test.js.map +0 -1
  366. package/dist/commands/__tests__/migration.test.js +0 -119
  367. package/dist/commands/__tests__/migration.test.js.map +0 -1
  368. package/dist/commands/__tests__/preview.test.js +0 -261
  369. package/dist/commands/__tests__/preview.test.js.map +0 -1
  370. package/dist/commands/__tests__/start.test.js +0 -253
  371. package/dist/commands/__tests__/start.test.js.map +0 -1
  372. package/dist/commands/__tests__/undeploy.test.js +0 -382
  373. package/dist/commands/__tests__/undeploy.test.js.map +0 -1
  374. package/dist/commands/__tests__/versions.test.js +0 -142
  375. package/dist/commands/__tests__/versions.test.js.map +0 -1
  376. package/dist/commands/backup/__tests__/disable.test.js +0 -204
  377. package/dist/commands/backup/__tests__/disable.test.js.map +0 -1
  378. package/dist/commands/backup/__tests__/download.test.js +0 -768
  379. package/dist/commands/backup/__tests__/download.test.js.map +0 -1
  380. package/dist/commands/backup/__tests__/enable.test.js +0 -286
  381. package/dist/commands/backup/__tests__/enable.test.js.map +0 -1
  382. package/dist/commands/backup/__tests__/list.test.js +0 -330
  383. package/dist/commands/backup/__tests__/list.test.js.map +0 -1
  384. package/dist/commands/cors/__tests__/add.test.js +0 -376
  385. package/dist/commands/cors/__tests__/add.test.js.map +0 -1
  386. package/dist/commands/cors/__tests__/delete.test.js +0 -308
  387. package/dist/commands/cors/__tests__/delete.test.js.map +0 -1
  388. package/dist/commands/cors/__tests__/list.test.js +0 -241
  389. package/dist/commands/cors/__tests__/list.test.js.map +0 -1
  390. package/dist/commands/dataset/__tests__/copy.test.js +0 -628
  391. package/dist/commands/dataset/__tests__/copy.test.js.map +0 -1
  392. package/dist/commands/dataset/__tests__/create.test.js +0 -342
  393. package/dist/commands/dataset/__tests__/create.test.js.map +0 -1
  394. package/dist/commands/dataset/__tests__/delete.test.js +0 -231
  395. package/dist/commands/dataset/__tests__/delete.test.js.map +0 -1
  396. package/dist/commands/dataset/__tests__/export.test.js +0 -601
  397. package/dist/commands/dataset/__tests__/export.test.js.map +0 -1
  398. package/dist/commands/dataset/__tests__/import.test.js +0 -53
  399. package/dist/commands/dataset/__tests__/import.test.js.map +0 -1
  400. package/dist/commands/dataset/__tests__/list.test.js +0 -216
  401. package/dist/commands/dataset/__tests__/list.test.js.map +0 -1
  402. package/dist/commands/dataset/alias/__tests__/create.test.js +0 -339
  403. package/dist/commands/dataset/alias/__tests__/create.test.js.map +0 -1
  404. package/dist/commands/dataset/alias/__tests__/delete.test.js +0 -247
  405. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +0 -1
  406. package/dist/commands/dataset/alias/__tests__/link.test.js +0 -376
  407. package/dist/commands/dataset/alias/__tests__/link.test.js.map +0 -1
  408. package/dist/commands/dataset/alias/__tests__/unlink.test.js +0 -313
  409. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +0 -1
  410. package/dist/commands/dataset/visibility/__tests__/get.test.js +0 -128
  411. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +0 -1
  412. package/dist/commands/dataset/visibility/__tests__/set.test.js +0 -198
  413. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +0 -1
  414. package/dist/commands/docs/__tests__/browse.test.js +0 -29
  415. package/dist/commands/docs/__tests__/browse.test.js.map +0 -1
  416. package/dist/commands/docs/__tests__/read.test.js +0 -78
  417. package/dist/commands/docs/__tests__/read.test.js.map +0 -1
  418. package/dist/commands/docs/__tests__/search.test.js +0 -255
  419. package/dist/commands/docs/__tests__/search.test.js.map +0 -1
  420. package/dist/commands/documents/__tests__/create.test.js +0 -1030
  421. package/dist/commands/documents/__tests__/create.test.js.map +0 -1
  422. package/dist/commands/documents/__tests__/delete.test.js +0 -300
  423. package/dist/commands/documents/__tests__/delete.test.js.map +0 -1
  424. package/dist/commands/documents/__tests__/get.test.js +0 -182
  425. package/dist/commands/documents/__tests__/get.test.js.map +0 -1
  426. package/dist/commands/documents/__tests__/query.test.js +0 -300
  427. package/dist/commands/documents/__tests__/query.test.js.map +0 -1
  428. package/dist/commands/documents/__tests__/validate.test.js +0 -249
  429. package/dist/commands/documents/__tests__/validate.test.js.map +0 -1
  430. package/dist/commands/graphql/__tests__/list.test.js +0 -240
  431. package/dist/commands/graphql/__tests__/list.test.js.map +0 -1
  432. package/dist/commands/graphql/__tests__/undeploy.test.js +0 -410
  433. package/dist/commands/graphql/__tests__/undeploy.test.js.map +0 -1
  434. package/dist/commands/hook/__tests__/attempt.test.js +0 -275
  435. package/dist/commands/hook/__tests__/attempt.test.js.map +0 -1
  436. package/dist/commands/hook/__tests__/create.test.js +0 -119
  437. package/dist/commands/hook/__tests__/create.test.js.map +0 -1
  438. package/dist/commands/hook/__tests__/delete.test.js +0 -233
  439. package/dist/commands/hook/__tests__/delete.test.js.map +0 -1
  440. package/dist/commands/hook/__tests__/list.test.js +0 -145
  441. package/dist/commands/hook/__tests__/list.test.js.map +0 -1
  442. package/dist/commands/hook/__tests__/logs.test.js +0 -798
  443. package/dist/commands/hook/__tests__/logs.test.js.map +0 -1
  444. package/dist/commands/manifest/__tests__/extract.test.js +0 -132
  445. package/dist/commands/manifest/__tests__/extract.test.js.map +0 -1
  446. package/dist/commands/mcp/__tests__/configure.test.js +0 -397
  447. package/dist/commands/mcp/__tests__/configure.test.js.map +0 -1
  448. package/dist/commands/media/__tests__/create-aspect.test.js +0 -173
  449. package/dist/commands/media/__tests__/create-aspect.test.js.map +0 -1
  450. package/dist/commands/media/__tests__/delete-aspect.test.js +0 -342
  451. package/dist/commands/media/__tests__/delete-aspect.test.js.map +0 -1
  452. package/dist/commands/media/__tests__/deploy-aspect.test.js +0 -619
  453. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +0 -1
  454. package/dist/commands/media/__tests__/export.test.js +0 -697
  455. package/dist/commands/media/__tests__/export.test.js.map +0 -1
  456. package/dist/commands/media/__tests__/import.test.js +0 -347
  457. package/dist/commands/media/__tests__/import.test.js.map +0 -1
  458. package/dist/commands/openapi/__tests__/get.test.js +0 -149
  459. package/dist/commands/openapi/__tests__/get.test.js.map +0 -1
  460. package/dist/commands/openapi/__tests__/list.test.js +0 -113
  461. package/dist/commands/openapi/__tests__/list.test.js.map +0 -1
  462. package/dist/commands/projects/__tests__/list.test.js +0 -154
  463. package/dist/commands/projects/__tests__/list.test.js.map +0 -1
  464. package/dist/commands/schema/__tests__/delete.test.js +0 -454
  465. package/dist/commands/schema/__tests__/delete.test.js.map +0 -1
  466. package/dist/commands/schema/__tests__/deploy.test.js +0 -348
  467. package/dist/commands/schema/__tests__/deploy.test.js.map +0 -1
  468. package/dist/commands/schema/__tests__/extract.test.js +0 -121
  469. package/dist/commands/schema/__tests__/extract.test.js.map +0 -1
  470. package/dist/commands/schema/__tests__/list.test.js +0 -399
  471. package/dist/commands/schema/__tests__/list.test.js.map +0 -1
  472. package/dist/commands/schema/__tests__/validate.test.js +0 -121
  473. package/dist/commands/schema/__tests__/validate.test.js.map +0 -1
  474. package/dist/commands/telemetry/__tests__/disable.test.js +0 -147
  475. package/dist/commands/telemetry/__tests__/disable.test.js.map +0 -1
  476. package/dist/commands/telemetry/__tests__/enable.test.js +0 -133
  477. package/dist/commands/telemetry/__tests__/enable.test.js.map +0 -1
  478. package/dist/commands/telemetry/__tests__/status.test.js +0 -155
  479. package/dist/commands/telemetry/__tests__/status.test.js.map +0 -1
  480. package/dist/commands/tokens/__tests__/add.test.js +0 -435
  481. package/dist/commands/tokens/__tests__/add.test.js.map +0 -1
  482. package/dist/commands/tokens/__tests__/delete.test.js +0 -405
  483. package/dist/commands/tokens/__tests__/delete.test.js.map +0 -1
  484. package/dist/commands/tokens/__tests__/list.test.js +0 -395
  485. package/dist/commands/tokens/__tests__/list.test.js.map +0 -1
  486. package/dist/commands/users/__tests__/invite.test.js +0 -362
  487. package/dist/commands/users/__tests__/invite.test.js.map +0 -1
  488. package/dist/commands/users/__tests__/list.test.js +0 -407
  489. package/dist/commands/users/__tests__/list.test.js.map +0 -1
  490. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js +0 -77
  491. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js.map +0 -1
  492. package/dist/services/__tests__/datasetAliases.test.js +0 -131
  493. package/dist/services/__tests__/datasetAliases.test.js.map +0 -1
  494. package/dist/services/__tests__/datasets.test.js +0 -436
  495. package/dist/services/__tests__/datasets.test.js.map +0 -1
  496. package/dist/services/__tests__/graphql.test.js +0 -43
  497. package/dist/services/__tests__/graphql.test.js.map +0 -1
  498. package/dist/services/__tests__/mediaLibraries.test.js +0 -88
  499. package/dist/services/__tests__/mediaLibraries.test.js.map +0 -1
  500. package/dist/services/__tests__/projects.test.js +0 -41
  501. package/dist/services/__tests__/projects.test.js.map +0 -1
  502. package/dist/services/__tests__/userApplications.test.js +0 -113
  503. package/dist/services/__tests__/userApplications.test.js.map +0 -1
  504. package/dist/util/__tests__/appId.test.js +0 -31
  505. package/dist/util/__tests__/appId.test.js.map +0 -1
  506. package/dist/util/__tests__/cliClient.test.js +0 -184
  507. package/dist/util/__tests__/cliClient.test.js.map +0 -1
  508. package/dist/util/__tests__/compareDependencyVersions.test.js +0 -426
  509. package/dist/util/__tests__/compareDependencyVersions.test.js.map +0 -1
  510. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js +0 -74
  511. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js.map +0 -1
  512. package/dist/util/__tests__/findNdjsonEntry.test.js +0 -54
  513. package/dist/util/__tests__/findNdjsonEntry.test.js.map +0 -1
  514. package/dist/util/__tests__/getCliVersion.test.js +0 -28
  515. package/dist/util/__tests__/getCliVersion.test.js.map +0 -1
  516. package/dist/util/__tests__/getLocalPackageVersion.test.js +0 -84
  517. package/dist/util/__tests__/getLocalPackageVersion.test.js.map +0 -1
  518. package/dist/util/__tests__/getWorkspace.test.js +0 -37
  519. package/dist/util/__tests__/getWorkspace.test.js.map +0 -1
  520. package/dist/util/__tests__/readPackageJson.test.js +0 -69
  521. package/dist/util/__tests__/readPackageJson.test.js.map +0 -1
  522. package/dist/util/__tests__/warnAboutMissingAppId.test.js +0 -28
  523. package/dist/util/__tests__/warnAboutMissingAppId.test.js.map +0 -1
  524. package/dist/util/packageManager/__tests__/installPackages.test.js +0 -388
  525. package/dist/util/packageManager/__tests__/installPackages.test.js.map +0 -1
  526. package/dist/util/validation/ __tests__/validateDocuments.test.js +0 -274
  527. package/dist/util/validation/ __tests__/validateDocuments.test.js.map +0 -1
@@ -1,207 +0,0 @@
1
- import { copyFile, mkdir, rm } from 'node:fs/promises';
2
- import { tmpdir } from 'node:os';
3
- import { join, resolve } from 'node:path';
4
- import { runCommand } from '@oclif/test';
5
- import { setConfig } from '@sanity/cli-core';
6
- import { testCommand } from '@sanity/cli-test';
7
- import { execa } from 'execa';
8
- import { beforeEach, describe, expect, test } from 'vitest';
9
- import { testExample } from '~test/helpers/testExample.js';
10
- import { ExecCommand } from '../exec.js';
11
- // Environment vars to set in setupTestAuth
12
- const TEST_TOKEN = process.env.SANITY_API_TOKEN?.trim();
13
- const TEST_CONFIG_DIR = join(tmpdir(), 'sanity-cli-test-exec');
14
- const TEST_CONFIG_PATH = join(TEST_CONFIG_DIR, 'config.json');
15
- // Test example and fixture directory paths
16
- let exampleDir;
17
- let fixtureDir;
18
- let scriptPath;
19
- // Helper to set up test authentication config
20
- async function setupTestAuth(token) {
21
- await mkdir(TEST_CONFIG_DIR, {
22
- recursive: true
23
- });
24
- // Use cli-core's setConfig to write token to config file
25
- // Need to set env vars so it writes to the test config path
26
- const originalConfigPath = process.env.SANITY_CLI_CONFIG_PATH;
27
- process.env.SANITY_CLI_CONFIG_PATH = TEST_CONFIG_PATH;
28
- try {
29
- await setConfig('authToken', token);
30
- } finally{
31
- // Restore original env vars
32
- if (originalConfigPath) {
33
- process.env.SANITY_CLI_CONFIG_PATH = originalConfigPath;
34
- } else {
35
- delete process.env.SANITY_CLI_CONFIG_PATH;
36
- }
37
- }
38
- return {
39
- cleanup: ()=>rm(TEST_CONFIG_DIR, {
40
- force: true,
41
- recursive: true
42
- })
43
- };
44
- }
45
- // Helper to run sanity exec command and capture output
46
- async function runExecCommand(cwd, scriptPath, flags = [], customEnv) {
47
- // Get repo root - go up from packages/@sanity/cli/src/commands/__tests__
48
- const repoRoot = resolve(import.meta.dirname, '../../../../../../');
49
- const cliPath = join(repoRoot, 'packages/@sanity/cli/bin/run.js');
50
- try {
51
- const result = await execa('node', [
52
- cliPath,
53
- 'exec',
54
- scriptPath,
55
- ...flags
56
- ], {
57
- cwd,
58
- env: {
59
- ...process.env,
60
- SANITY_BASE_PATH: cwd,
61
- ...customEnv
62
- },
63
- reject: false
64
- });
65
- return {
66
- exitCode: result.exitCode,
67
- stderr: result.stderr,
68
- stdout: result.stdout
69
- };
70
- } catch (error) {
71
- if (error instanceof Error) {
72
- throw new Error(`Command failed: ${error.message}`);
73
- }
74
- throw error;
75
- }
76
- }
77
- describe('#exec', ()=>{
78
- beforeEach(async ()=>{
79
- exampleDir = await testExample('basic-studio');
80
- fixtureDir = resolve(import.meta.dirname, '../../../test/__fixtures__');
81
- scriptPath = join(exampleDir, 'test-script.ts');
82
- await copyFile(join(fixtureDir, 'exec-script.ts'), scriptPath);
83
- });
84
- test('help text is correct', async ()=>{
85
- const { stdout } = await runCommand('exec --help');
86
- expect(stdout).toMatchInlineSnapshot(`
87
- "Executes a script within the Sanity Studio context
88
-
89
- USAGE
90
- $ sanity exec SCRIPT... [--mock-browser-env] [--with-user-token]
91
-
92
- ARGUMENTS
93
- SCRIPT... Path to the script to execute
94
-
95
- FLAGS
96
- --mock-browser-env Mocks a browser-like environment using jsdom
97
- --with-user-token Prime access token from CLI config into getCliClient()
98
-
99
- DESCRIPTION
100
- Executes a script within the Sanity Studio context
101
-
102
- EXAMPLES
103
- Run the script at some/script.js in Sanity context
104
-
105
- $ sanity exec some/script.js
106
-
107
- Run the script at migrations/fullname.ts and configure \`getCliClient()\` from
108
- \`sanity/cli\` to include the current user's token
109
-
110
- $ sanity exec migrations/fullname.ts --with-user-token
111
-
112
- Run the script at scripts/browserScript.js in a mock browser environment
113
-
114
- $ sanity exec scripts/browserScript.js --mock-browser-env
115
-
116
- Pass arbitrary arguments to scripts by separating them with a \`--\`.
117
- Arguments are available in \`process.argv\` as they would in regular node
118
- scripts (eg the following command would yield a \`process.argv\` of:
119
- \`['/path/to/node', '/path/to/myscript.js', '--dry-run',
120
- 'positional-argument']\`)
121
-
122
- $ sanity exec --mock-browser-env myscript.js -- --dry-run \\
123
- positional-argument
124
-
125
- "
126
- `);
127
- });
128
- test('shows an error for invalid flags', async ()=>{
129
- const { error } = await testCommand(ExecCommand, [
130
- scriptPath,
131
- '--invalid'
132
- ], {
133
- config: {
134
- root: exampleDir
135
- }
136
- });
137
- expect(error?.message).toContain('Nonexistent flag: --invalid');
138
- });
139
- test('validates that script argument is required', async ()=>{
140
- const { error } = await testCommand(ExecCommand, []);
141
- expect(error?.message).toContain('Missing 1 required arg');
142
- expect(error?.message).toContain('script');
143
- });
144
- test('validates that script file exists', async ()=>{
145
- const nonExistentScript = join(exampleDir, 'non-existent-script.ts');
146
- const { error } = await testCommand(ExecCommand, [
147
- nonExistentScript
148
- ], {
149
- config: {
150
- root: exampleDir
151
- }
152
- });
153
- expect(error?.message).toContain('No file found at');
154
- });
155
- describe('integration tests', ()=>{
156
- test('executes script successfully', async ()=>{
157
- const { exitCode, stdout } = await runExecCommand(exampleDir, scriptPath);
158
- expect(exitCode).toBe(0);
159
- // Parse the JSON output
160
- const data = JSON.parse(stdout.trim());
161
- expect(data.success).toBe(true);
162
- expect(data.env.SANITY_BASE_PATH).toBe(exampleDir);
163
- // Without token, API returns empty object rather than throwing error
164
- expect(data.user).toEqual({});
165
- });
166
- test.skipIf(!TEST_TOKEN)('executes script with --with-user-token flag', async ()=>{
167
- if (!TEST_TOKEN) return; // TypeScript guard
168
- // Set up test auth config with token
169
- const { cleanup } = await setupTestAuth(TEST_TOKEN);
170
- try {
171
- const { exitCode, stdout } = await runExecCommand(exampleDir, scriptPath, [
172
- '--with-user-token'
173
- ], {
174
- SANITY_CLI_CONFIG_PATH: TEST_CONFIG_PATH,
175
- SANITY_INTERNAL_ENV: 'staging'
176
- });
177
- expect(exitCode).toBe(0);
178
- // Parse the JSON output
179
- const data = JSON.parse(stdout.trim());
180
- expect(data.success).toBe(true);
181
- expect(data.env.SANITY_BASE_PATH).toBe(exampleDir);
182
- expect(data.user.id).toBeDefined();
183
- expect(data.user.email).toBeDefined();
184
- expect(data.user.id).not.toBe('unknown');
185
- expect(data.user.email).not.toBe('unknown');
186
- } finally{
187
- // Clean up test config
188
- await cleanup();
189
- }
190
- });
191
- test('executes script with --mock-browser-env flag', async ()=>{
192
- const { exitCode, stdout } = await runExecCommand(exampleDir, scriptPath, [
193
- '--mock-browser-env'
194
- ]);
195
- expect(exitCode).toBe(0);
196
- // Parse the JSON output
197
- const data = JSON.parse(stdout.trim());
198
- expect(data.success).toBe(true);
199
- // injected by mockBrowserEnvironment
200
- expect(data.browser.intersectionObserver).toBe(true);
201
- // injected by the command itself
202
- expect(data.env.SANITY_BASE_PATH).toBe(exampleDir);
203
- });
204
- });
205
- });
206
-
207
- //# sourceMappingURL=exec.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/commands/__tests__/exec.test.ts"],"sourcesContent":["import {copyFile, mkdir, rm} from 'node:fs/promises'\nimport {tmpdir} from 'node:os'\nimport {join, resolve} from 'node:path'\n\nimport {runCommand} from '@oclif/test'\nimport {setConfig} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport {execa} from 'execa'\nimport {beforeEach, describe, expect, test} from 'vitest'\nimport {testExample} from '~test/helpers/testExample.js'\n\nimport {ExecCommand} from '../exec.js'\n\n// Environment vars to set in setupTestAuth\nconst TEST_TOKEN = process.env.SANITY_API_TOKEN?.trim()\nconst TEST_CONFIG_DIR = join(tmpdir(), 'sanity-cli-test-exec')\nconst TEST_CONFIG_PATH = join(TEST_CONFIG_DIR, 'config.json')\n\n// Test example and fixture directory paths\nlet exampleDir: string\nlet fixtureDir: string\nlet scriptPath: string\n\n// Helper to set up test authentication config\nasync function setupTestAuth(token: string): Promise<{cleanup: () => Promise<void>}> {\n await mkdir(TEST_CONFIG_DIR, {recursive: true})\n\n // Use cli-core's setConfig to write token to config file\n // Need to set env vars so it writes to the test config path\n const originalConfigPath = process.env.SANITY_CLI_CONFIG_PATH\n\n process.env.SANITY_CLI_CONFIG_PATH = TEST_CONFIG_PATH\n\n try {\n await setConfig('authToken', token)\n } finally {\n // Restore original env vars\n if (originalConfigPath) {\n process.env.SANITY_CLI_CONFIG_PATH = originalConfigPath\n } else {\n delete process.env.SANITY_CLI_CONFIG_PATH\n }\n }\n\n return {cleanup: () => rm(TEST_CONFIG_DIR, {force: true, recursive: true})}\n}\n\n// Helper to run sanity exec command and capture output\nasync function runExecCommand(\n cwd: string,\n scriptPath: string,\n flags: string[] = [],\n customEnv?: Record<string, string>,\n): Promise<{exitCode: number | undefined; stderr: string; stdout: string}> {\n // Get repo root - go up from packages/@sanity/cli/src/commands/__tests__\n const repoRoot = resolve(import.meta.dirname, '../../../../../../')\n const cliPath = join(repoRoot, 'packages/@sanity/cli/bin/run.js')\n\n try {\n const result = await execa('node', [cliPath, 'exec', scriptPath, ...flags], {\n cwd,\n env: {...process.env, SANITY_BASE_PATH: cwd, ...customEnv},\n reject: false,\n })\n\n return {\n exitCode: result.exitCode,\n stderr: result.stderr,\n stdout: result.stdout,\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Command failed: ${error.message}`)\n }\n throw error\n }\n}\n\ndescribe('#exec', () => {\n beforeEach(async () => {\n exampleDir = await testExample('basic-studio')\n fixtureDir = resolve(import.meta.dirname, '../../../test/__fixtures__')\n scriptPath = join(exampleDir, 'test-script.ts')\n await copyFile(join(fixtureDir, 'exec-script.ts'), scriptPath)\n })\n\n test('help text is correct', async () => {\n const {stdout} = await runCommand('exec --help')\n expect(stdout).toMatchInlineSnapshot(`\n \"Executes a script within the Sanity Studio context\n\n USAGE\n $ sanity exec SCRIPT... [--mock-browser-env] [--with-user-token]\n\n ARGUMENTS\n SCRIPT... Path to the script to execute\n\n FLAGS\n --mock-browser-env Mocks a browser-like environment using jsdom\n --with-user-token Prime access token from CLI config into getCliClient()\n\n DESCRIPTION\n Executes a script within the Sanity Studio context\n\n EXAMPLES\n Run the script at some/script.js in Sanity context\n\n $ sanity exec some/script.js\n\n Run the script at migrations/fullname.ts and configure \\`getCliClient()\\` from\n \\`sanity/cli\\` to include the current user's token\n\n $ sanity exec migrations/fullname.ts --with-user-token\n\n Run the script at scripts/browserScript.js in a mock browser environment\n\n $ sanity exec scripts/browserScript.js --mock-browser-env\n\n Pass arbitrary arguments to scripts by separating them with a \\`--\\`.\n Arguments are available in \\`process.argv\\` as they would in regular node\n scripts (eg the following command would yield a \\`process.argv\\` of:\n \\`['/path/to/node', '/path/to/myscript.js', '--dry-run',\n 'positional-argument']\\`)\n\n $ sanity exec --mock-browser-env myscript.js -- --dry-run \\\\\n positional-argument\n\n \"\n `)\n })\n\n test('shows an error for invalid flags', async () => {\n const {error} = await testCommand(ExecCommand, [scriptPath, '--invalid'], {\n config: {root: exampleDir},\n })\n\n expect(error?.message).toContain('Nonexistent flag: --invalid')\n })\n\n test('validates that script argument is required', async () => {\n const {error} = await testCommand(ExecCommand, [])\n\n expect(error?.message).toContain('Missing 1 required arg')\n expect(error?.message).toContain('script')\n })\n\n test('validates that script file exists', async () => {\n const nonExistentScript = join(exampleDir, 'non-existent-script.ts')\n\n const {error} = await testCommand(ExecCommand, [nonExistentScript], {\n config: {root: exampleDir},\n })\n\n expect(error?.message).toContain('No file found at')\n })\n\n describe('integration tests', () => {\n test('executes script successfully', async () => {\n const {exitCode, stdout} = await runExecCommand(exampleDir, scriptPath)\n\n expect(exitCode).toBe(0)\n\n // Parse the JSON output\n const data = JSON.parse(stdout.trim())\n expect(data.success).toBe(true)\n expect(data.env.SANITY_BASE_PATH).toBe(exampleDir)\n // Without token, API returns empty object rather than throwing error\n expect(data.user).toEqual({})\n })\n\n test.skipIf(!TEST_TOKEN)('executes script with --with-user-token flag', async () => {\n if (!TEST_TOKEN) return // TypeScript guard\n\n // Set up test auth config with token\n const {cleanup} = await setupTestAuth(TEST_TOKEN)\n\n try {\n const {exitCode, stdout} = await runExecCommand(\n exampleDir,\n scriptPath,\n ['--with-user-token'],\n {\n SANITY_CLI_CONFIG_PATH: TEST_CONFIG_PATH,\n SANITY_INTERNAL_ENV: 'staging',\n },\n )\n\n expect(exitCode).toBe(0)\n\n // Parse the JSON output\n const data = JSON.parse(stdout.trim())\n expect(data.success).toBe(true)\n expect(data.env.SANITY_BASE_PATH).toBe(exampleDir)\n expect(data.user.id).toBeDefined()\n expect(data.user.email).toBeDefined()\n expect(data.user.id).not.toBe('unknown')\n expect(data.user.email).not.toBe('unknown')\n } finally {\n // Clean up test config\n await cleanup()\n }\n })\n\n test('executes script with --mock-browser-env flag', async () => {\n const {exitCode, stdout} = await runExecCommand(exampleDir, scriptPath, [\n '--mock-browser-env',\n ])\n\n expect(exitCode).toBe(0)\n\n // Parse the JSON output\n const data = JSON.parse(stdout.trim())\n expect(data.success).toBe(true)\n // injected by mockBrowserEnvironment\n expect(data.browser.intersectionObserver).toBe(true)\n // injected by the command itself\n expect(data.env.SANITY_BASE_PATH).toBe(exampleDir)\n })\n })\n})\n"],"names":["copyFile","mkdir","rm","tmpdir","join","resolve","runCommand","setConfig","testCommand","execa","beforeEach","describe","expect","test","testExample","ExecCommand","TEST_TOKEN","process","env","SANITY_API_TOKEN","trim","TEST_CONFIG_DIR","TEST_CONFIG_PATH","exampleDir","fixtureDir","scriptPath","setupTestAuth","token","recursive","originalConfigPath","SANITY_CLI_CONFIG_PATH","cleanup","force","runExecCommand","cwd","flags","customEnv","repoRoot","dirname","cliPath","result","SANITY_BASE_PATH","reject","exitCode","stderr","stdout","error","Error","message","toMatchInlineSnapshot","config","root","toContain","nonExistentScript","toBe","data","JSON","parse","success","user","toEqual","skipIf","SANITY_INTERNAL_ENV","id","toBeDefined","email","not","browser","intersectionObserver"],"mappings":"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"}
@@ -1,73 +0,0 @@
1
- import { testCommand } from '@sanity/cli-test';
2
- import { afterEach, describe, expect, test, vi } from 'vitest';
3
- import { InitCommand } from '../../init';
4
- const mockGetById = vi.hoisted(()=>vi.fn());
5
- const mockLogin = vi.hoisted(()=>vi.fn());
6
- vi.mock('@sanity/cli-core', async (importOriginal)=>{
7
- const actual = await importOriginal();
8
- return {
9
- ...actual,
10
- getGlobalCliClient: vi.fn().mockResolvedValue({
11
- users: {
12
- getById: mockGetById
13
- }
14
- })
15
- };
16
- });
17
- vi.mock('@vercel/fs-detectors', ()=>({
18
- detectFrameworkRecord: vi.fn().mockResolvedValue({
19
- name: 'Next.js',
20
- slug: 'nextjs'
21
- }),
22
- LocalFileSystemDetector: vi.fn()
23
- }));
24
- vi.mock('../../../actions/auth/login/login.js', ()=>({
25
- login: mockLogin
26
- }));
27
- describe('#init: authentication', ()=>{
28
- afterEach(()=>{
29
- vi.clearAllMocks();
30
- });
31
- test('user is authenticated with valid token', async ()=>{
32
- mockGetById.mockResolvedValue({
33
- email: 'test@example.com',
34
- id: 'user-123',
35
- name: 'Test User',
36
- provider: 'saml-123'
37
- });
38
- const { error, stdout } = await testCommand(InitCommand, [], {
39
- mocks: {
40
- isInteractive: true,
41
- token: 'test-token'
42
- }
43
- });
44
- expect(error).toBeUndefined();
45
- expect(stdout).toContain('You are logged in as test@example.com using SAML');
46
- });
47
- test('throws error if user is authenticated with invalid token in unattended mode', async ()=>{
48
- mockGetById.mockRejectedValueOnce(new Error('Invalid token'));
49
- const { error } = await testCommand(InitCommand, [
50
- '--yes',
51
- '--dataset=test',
52
- '--project==test'
53
- ], {
54
- mocks: {
55
- token: 'test-token'
56
- }
57
- });
58
- expect(error?.message).toContain('Must be logged in to run this command in unattended mode, run `sanity login`');
59
- });
60
- test('calls login when token invalid and not in unattended mode', async ()=>{
61
- mockGetById.mockRejectedValueOnce(new Error('Invalid token'));
62
- const { error } = await testCommand(InitCommand, [], {
63
- mocks: {
64
- isInteractive: true,
65
- token: 'test-token'
66
- }
67
- });
68
- expect(error).toBe(undefined);
69
- expect(mockLogin).toHaveBeenCalled();
70
- });
71
- });
72
-
73
- //# sourceMappingURL=init.authentication.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/commands/__tests__/init/init.authentication.test.ts"],"sourcesContent":["import {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {InitCommand} from '../../init'\n\nconst mockGetById = vi.hoisted(() => vi.fn())\nconst mockLogin = vi.hoisted(() => vi.fn())\n\nvi.mock('@sanity/cli-core', async (importOriginal) => {\n const actual = await importOriginal<typeof import('@sanity/cli-core')>()\n return {\n ...actual,\n getGlobalCliClient: vi.fn().mockResolvedValue({\n users: {\n getById: mockGetById,\n } as never,\n }),\n }\n})\n\nvi.mock('@vercel/fs-detectors', () => ({\n detectFrameworkRecord: vi.fn().mockResolvedValue({\n name: 'Next.js',\n slug: 'nextjs',\n }),\n LocalFileSystemDetector: vi.fn(),\n}))\n\nvi.mock('../../../actions/auth/login/login.js', () => ({\n login: mockLogin,\n}))\n\ndescribe('#init: authentication', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('user is authenticated with valid token', async () => {\n mockGetById.mockResolvedValue({\n email: 'test@example.com',\n id: 'user-123',\n name: 'Test User',\n provider: 'saml-123',\n })\n\n const {error, stdout} = await testCommand(InitCommand, [], {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('You are logged in as test@example.com using SAML')\n })\n\n test('throws error if user is authenticated with invalid token in unattended mode', async () => {\n mockGetById.mockRejectedValueOnce(new Error('Invalid token'))\n\n const {error} = await testCommand(InitCommand, ['--yes', '--dataset=test', '--project==test'], {\n mocks: {\n token: 'test-token',\n },\n })\n\n expect(error?.message).toContain(\n 'Must be logged in to run this command in unattended mode, run `sanity login`',\n )\n })\n\n test('calls login when token invalid and not in unattended mode', async () => {\n mockGetById.mockRejectedValueOnce(new Error('Invalid token'))\n\n const {error} = await testCommand(InitCommand, [], {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n })\n\n expect(error).toBe(undefined)\n expect(mockLogin).toHaveBeenCalled()\n })\n})\n"],"names":["testCommand","afterEach","describe","expect","test","vi","InitCommand","mockGetById","hoisted","fn","mockLogin","mock","importOriginal","actual","getGlobalCliClient","mockResolvedValue","users","getById","detectFrameworkRecord","name","slug","LocalFileSystemDetector","login","clearAllMocks","email","id","provider","error","stdout","mocks","isInteractive","token","toBeUndefined","toContain","mockRejectedValueOnce","Error","message","toBe","undefined","toHaveBeenCalled"],"mappings":"AAAA,SAAQA,WAAW,QAAO,mBAAkB;AAC5C,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,WAAW,QAAO,aAAY;AAEtC,MAAMC,cAAcF,GAAGG,OAAO,CAAC,IAAMH,GAAGI,EAAE;AAC1C,MAAMC,YAAYL,GAAGG,OAAO,CAAC,IAAMH,GAAGI,EAAE;AAExCJ,GAAGM,IAAI,CAAC,oBAAoB,OAAOC;IACjC,MAAMC,SAAS,MAAMD;IACrB,OAAO;QACL,GAAGC,MAAM;QACTC,oBAAoBT,GAAGI,EAAE,GAAGM,iBAAiB,CAAC;YAC5CC,OAAO;gBACLC,SAASV;YACX;QACF;IACF;AACF;AAEAF,GAAGM,IAAI,CAAC,wBAAwB,IAAO,CAAA;QACrCO,uBAAuBb,GAAGI,EAAE,GAAGM,iBAAiB,CAAC;YAC/CI,MAAM;YACNC,MAAM;QACR;QACAC,yBAAyBhB,GAAGI,EAAE;IAChC,CAAA;AAEAJ,GAAGM,IAAI,CAAC,wCAAwC,IAAO,CAAA;QACrDW,OAAOZ;IACT,CAAA;AAEAR,SAAS,yBAAyB;IAChCD,UAAU;QACRI,GAAGkB,aAAa;IAClB;IAEAnB,KAAK,0CAA0C;QAC7CG,YAAYQ,iBAAiB,CAAC;YAC5BS,OAAO;YACPC,IAAI;YACJN,MAAM;YACNO,UAAU;QACZ;QAEA,MAAM,EAACC,KAAK,EAAEC,MAAM,EAAC,GAAG,MAAM5B,YAAYM,aAAa,EAAE,EAAE;YACzDuB,OAAO;gBACLC,eAAe;gBACfC,OAAO;YACT;QACF;QAEA5B,OAAOwB,OAAOK,aAAa;QAC3B7B,OAAOyB,QAAQK,SAAS,CAAC;IAC3B;IAEA7B,KAAK,+EAA+E;QAClFG,YAAY2B,qBAAqB,CAAC,IAAIC,MAAM;QAE5C,MAAM,EAACR,KAAK,EAAC,GAAG,MAAM3B,YAAYM,aAAa;YAAC;YAAS;YAAkB;SAAkB,EAAE;YAC7FuB,OAAO;gBACLE,OAAO;YACT;QACF;QAEA5B,OAAOwB,OAAOS,SAASH,SAAS,CAC9B;IAEJ;IAEA7B,KAAK,6DAA6D;QAChEG,YAAY2B,qBAAqB,CAAC,IAAIC,MAAM;QAE5C,MAAM,EAACR,KAAK,EAAC,GAAG,MAAM3B,YAAYM,aAAa,EAAE,EAAE;YACjDuB,OAAO;gBACLC,eAAe;gBACfC,OAAO;YACT;QACF;QAEA5B,OAAOwB,OAAOU,IAAI,CAACC;QACnBnC,OAAOO,WAAW6B,gBAAgB;IACpC;AACF"}
@@ -1,195 +0,0 @@
1
- import * as cliUX from '@sanity/cli-core/ux';
2
- import { createTestClient, mockApi, testCommand } from '@sanity/cli-test';
3
- import nock from 'nock';
4
- import { afterEach, describe, expect, test, vi } from 'vitest';
5
- import { ORGANIZATIONS_API_VERSION } from '../../../services/organizations.js';
6
- import { CREATE_PROJECT_API_VERSION } from '../../../services/projects.js';
7
- import { InitCommand } from '../../init';
8
- const mocks = vi.hoisted(()=>({
9
- datasetsCreate: vi.fn(),
10
- detectFrameworkRecord: vi.fn(),
11
- getOrganizationChoices: vi.fn(),
12
- getOrganizationsWithAttachGrantInfo: vi.fn(),
13
- input: vi.fn(),
14
- select: vi.fn(),
15
- usersGetById: vi.fn()
16
- }));
17
- vi.mock('@vercel/fs-detectors', ()=>({
18
- detectFrameworkRecord: mocks.detectFrameworkRecord,
19
- LocalFileSystemDetector: vi.fn()
20
- }));
21
- vi.mock('@sanity/cli-core/ux', async ()=>{
22
- const actual = await vi.importActual('@sanity/cli-core/ux');
23
- return {
24
- ...actual,
25
- input: mocks.input,
26
- select: mocks.select
27
- };
28
- });
29
- vi.mock('@sanity/cli-core', async (importOriginal)=>{
30
- const actual = await importOriginal();
31
- const testClient = createTestClient({
32
- apiVersion: 'v2025-05-14',
33
- token: 'test-token'
34
- });
35
- return {
36
- ...actual,
37
- getGlobalCliClient: vi.fn().mockResolvedValue({
38
- datasets: {
39
- create: mocks.datasetsCreate
40
- },
41
- request: testClient.request,
42
- users: {
43
- getById: mocks.usersGetById
44
- }
45
- }),
46
- getProjectCliClient: vi.fn().mockResolvedValue({
47
- datasets: {
48
- create: mocks.datasetsCreate
49
- }
50
- })
51
- };
52
- });
53
- vi.mock('../../../actions/organizations/getOrganizationChoices.js', ()=>({
54
- getOrganizationChoices: mocks.getOrganizationChoices
55
- }));
56
- vi.mock('../../../actions/organizations/getOrganizationsWithAttachGrantInfo.js', ()=>({
57
- getOrganizationsWithAttachGrantInfo: mocks.getOrganizationsWithAttachGrantInfo
58
- }));
59
- mocks.usersGetById.mockResolvedValue({
60
- email: 'test@example.com',
61
- id: 'user-123',
62
- name: 'Test User',
63
- provider: 'saml-123'
64
- });
65
- describe('#init: create new project', ()=>{
66
- afterEach(()=>{
67
- vi.clearAllMocks();
68
- const pending = nock.pendingMocks();
69
- nock.cleanAll();
70
- expect(pending, 'pending mocks').toEqual([]);
71
- });
72
- test('prompts user to create new organization if they have none', async ()=>{
73
- mocks.detectFrameworkRecord.mockResolvedValueOnce(null);
74
- mockApi({
75
- apiVersion: ORGANIZATIONS_API_VERSION,
76
- method: 'get',
77
- uri: '/organizations'
78
- }).reply(200, []);
79
- mocks.input.mockResolvedValueOnce('My New Organization');
80
- mockApi({
81
- apiVersion: ORGANIZATIONS_API_VERSION,
82
- method: 'post',
83
- uri: '/organizations'
84
- }).reply(200, {
85
- createdByUserId: 'user-123',
86
- defaultRoleName: null,
87
- features: [],
88
- id: 'org-123',
89
- members: [],
90
- name: 'My New Organization',
91
- slug: 'my-new-organization'
92
- });
93
- mockApi({
94
- apiVersion: CREATE_PROJECT_API_VERSION,
95
- method: 'post',
96
- uri: '/projects'
97
- }).reply(200, {
98
- displayName: 'Test Project',
99
- projectId: 'project-123'
100
- });
101
- mocks.datasetsCreate.mockResolvedValueOnce(undefined);
102
- const spinnerSpy = vi.spyOn(cliUX, 'spinner');
103
- await testCommand(InitCommand, [
104
- '--create-project=Test Project',
105
- '--dataset=production',
106
- '--output-path=./test-project'
107
- ], {
108
- mocks: {
109
- isInteractive: true,
110
- token: 'test-token'
111
- }
112
- });
113
- expect(mocks.input).toHaveBeenCalledWith(expect.objectContaining({
114
- default: 'Test User',
115
- message: 'Organization name:'
116
- }));
117
- expect(mocks.datasetsCreate).toHaveBeenCalledWith('production');
118
- expect(spinnerSpy).toHaveBeenCalledWith('Creating organization');
119
- expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset');
120
- });
121
- test('prompts user to select then create a new organization', async ()=>{
122
- mocks.detectFrameworkRecord.mockResolvedValueOnce(null);
123
- mockApi({
124
- apiVersion: ORGANIZATIONS_API_VERSION,
125
- method: 'get',
126
- uri: '/organizations'
127
- }).reply(200, [
128
- {
129
- id: 'existing-org-123',
130
- name: 'Existing Organization',
131
- slug: 'existing-organization'
132
- }
133
- ]);
134
- mocks.getOrganizationsWithAttachGrantInfo.mockResolvedValueOnce([
135
- {
136
- hasAttachGrant: true,
137
- organization: {
138
- id: 'existing-org-123',
139
- name: 'Existing Organization',
140
- slug: 'existing-organization'
141
- }
142
- }
143
- ]);
144
- mocks.getOrganizationChoices.mockReturnValueOnce([
145
- {
146
- name: 'Existing Organization [existing-org-123]',
147
- value: 'existing-org-123'
148
- },
149
- {
150
- name: 'Create new organization',
151
- value: '-new-'
152
- }
153
- ]);
154
- mocks.select.mockResolvedValueOnce('-new-');
155
- mocks.input.mockResolvedValueOnce('Brand New Organization');
156
- mockApi({
157
- apiVersion: ORGANIZATIONS_API_VERSION,
158
- method: 'post',
159
- uri: '/organizations'
160
- }).reply(200, {
161
- createdByUserId: 'user-123',
162
- defaultRoleName: null,
163
- features: [],
164
- id: 'new-org-456',
165
- members: [],
166
- name: 'Brand New Organization',
167
- slug: 'brand-new-organization'
168
- });
169
- mockApi({
170
- apiVersion: CREATE_PROJECT_API_VERSION,
171
- method: 'post',
172
- uri: '/projects'
173
- }).reply(200, {
174
- displayName: 'Test Project',
175
- projectId: 'project-123'
176
- });
177
- mocks.datasetsCreate.mockResolvedValueOnce(undefined);
178
- const spinnerSpy = vi.spyOn(cliUX, 'spinner');
179
- await testCommand(InitCommand, [
180
- '--create-project=Test Project',
181
- '--dataset=production',
182
- '--output-path=./test-project'
183
- ], {
184
- mocks: {
185
- isInteractive: true,
186
- token: 'test-token'
187
- }
188
- });
189
- expect(mocks.datasetsCreate).toHaveBeenCalledWith('production');
190
- expect(spinnerSpy).toHaveBeenCalledWith('Creating organization');
191
- expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset');
192
- });
193
- });
194
-
195
- //# sourceMappingURL=init.create-new-project.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/commands/__tests__/init/init.create-new-project.test.ts"],"sourcesContent":["import * as cliUX from '@sanity/cli-core/ux'\nimport {createTestClient, mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {ORGANIZATIONS_API_VERSION} from '../../../services/organizations.js'\nimport {CREATE_PROJECT_API_VERSION} from '../../../services/projects.js'\nimport {InitCommand} from '../../init'\n\nconst mocks = vi.hoisted(() => ({\n datasetsCreate: vi.fn(),\n detectFrameworkRecord: vi.fn(),\n getOrganizationChoices: vi.fn(),\n getOrganizationsWithAttachGrantInfo: vi.fn(),\n input: vi.fn(),\n select: vi.fn(),\n usersGetById: vi.fn(),\n}))\n\nvi.mock('@vercel/fs-detectors', () => ({\n detectFrameworkRecord: mocks.detectFrameworkRecord,\n LocalFileSystemDetector: vi.fn(),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual('@sanity/cli-core/ux')\n\n return {\n ...actual,\n input: mocks.input,\n select: mocks.select,\n }\n})\n\nvi.mock('@sanity/cli-core', async (importOriginal) => {\n const actual = await importOriginal<typeof import('@sanity/cli-core')>()\n const testClient = createTestClient({\n apiVersion: 'v2025-05-14',\n token: 'test-token',\n })\n\n return {\n ...actual,\n getGlobalCliClient: vi.fn().mockResolvedValue({\n datasets: {\n create: mocks.datasetsCreate,\n } as never,\n request: testClient.request,\n users: {\n getById: mocks.usersGetById,\n } as never,\n }),\n getProjectCliClient: vi.fn().mockResolvedValue({\n datasets: {\n create: mocks.datasetsCreate,\n } as never,\n }),\n }\n})\n\nvi.mock('../../../actions/organizations/getOrganizationChoices.js', () => ({\n getOrganizationChoices: mocks.getOrganizationChoices,\n}))\n\nvi.mock('../../../actions/organizations/getOrganizationsWithAttachGrantInfo.js', () => ({\n getOrganizationsWithAttachGrantInfo: mocks.getOrganizationsWithAttachGrantInfo,\n}))\n\nmocks.usersGetById.mockResolvedValue({\n email: 'test@example.com',\n id: 'user-123',\n name: 'Test User',\n provider: 'saml-123',\n})\n\ndescribe('#init: create new project', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('prompts user to create new organization if they have none', async () => {\n mocks.detectFrameworkRecord.mockResolvedValueOnce(null)\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'get',\n uri: '/organizations',\n }).reply(200, [])\n\n mocks.input.mockResolvedValueOnce('My New Organization')\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'post',\n uri: '/organizations',\n }).reply(200, {\n createdByUserId: 'user-123',\n defaultRoleName: null,\n features: [],\n id: 'org-123',\n members: [],\n name: 'My New Organization',\n slug: 'my-new-organization',\n })\n\n mockApi({\n apiVersion: CREATE_PROJECT_API_VERSION,\n method: 'post',\n uri: '/projects',\n }).reply(200, {\n displayName: 'Test Project',\n projectId: 'project-123',\n })\n\n mocks.datasetsCreate.mockResolvedValueOnce(undefined)\n\n const spinnerSpy = vi.spyOn(cliUX, 'spinner')\n\n await testCommand(\n InitCommand,\n ['--create-project=Test Project', '--dataset=production', '--output-path=./test-project'],\n {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n },\n )\n\n expect(mocks.input).toHaveBeenCalledWith(\n expect.objectContaining({\n default: 'Test User',\n message: 'Organization name:',\n }),\n )\n\n expect(mocks.datasetsCreate).toHaveBeenCalledWith('production')\n\n expect(spinnerSpy).toHaveBeenCalledWith('Creating organization')\n expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset')\n })\n\n test('prompts user to select then create a new organization', async () => {\n mocks.detectFrameworkRecord.mockResolvedValueOnce(null)\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'get',\n uri: '/organizations',\n }).reply(200, [\n {\n id: 'existing-org-123',\n name: 'Existing Organization',\n slug: 'existing-organization',\n },\n ])\n\n mocks.getOrganizationsWithAttachGrantInfo.mockResolvedValueOnce([\n {\n hasAttachGrant: true,\n organization: {\n id: 'existing-org-123',\n name: 'Existing Organization',\n slug: 'existing-organization',\n },\n },\n ])\n\n mocks.getOrganizationChoices.mockReturnValueOnce([\n {name: 'Existing Organization [existing-org-123]', value: 'existing-org-123'},\n {name: 'Create new organization', value: '-new-'},\n ])\n\n mocks.select.mockResolvedValueOnce('-new-')\n\n mocks.input.mockResolvedValueOnce('Brand New Organization')\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'post',\n uri: '/organizations',\n }).reply(200, {\n createdByUserId: 'user-123',\n defaultRoleName: null,\n features: [],\n id: 'new-org-456',\n members: [],\n name: 'Brand New Organization',\n slug: 'brand-new-organization',\n })\n\n mockApi({\n apiVersion: CREATE_PROJECT_API_VERSION,\n method: 'post',\n uri: '/projects',\n }).reply(200, {\n displayName: 'Test Project',\n projectId: 'project-123',\n })\n\n mocks.datasetsCreate.mockResolvedValueOnce(undefined)\n\n const spinnerSpy = vi.spyOn(cliUX, 'spinner')\n\n await testCommand(\n InitCommand,\n ['--create-project=Test Project', '--dataset=production', '--output-path=./test-project'],\n {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n },\n )\n\n expect(mocks.datasetsCreate).toHaveBeenCalledWith('production')\n\n expect(spinnerSpy).toHaveBeenCalledWith('Creating organization')\n expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset')\n })\n})\n"],"names":["cliUX","createTestClient","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","ORGANIZATIONS_API_VERSION","CREATE_PROJECT_API_VERSION","InitCommand","mocks","hoisted","datasetsCreate","fn","detectFrameworkRecord","getOrganizationChoices","getOrganizationsWithAttachGrantInfo","input","select","usersGetById","mock","LocalFileSystemDetector","actual","importActual","importOriginal","testClient","apiVersion","token","getGlobalCliClient","mockResolvedValue","datasets","create","request","users","getById","getProjectCliClient","email","id","name","provider","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","mockResolvedValueOnce","method","uri","reply","createdByUserId","defaultRoleName","features","members","slug","displayName","projectId","undefined","spinnerSpy","spyOn","isInteractive","toHaveBeenCalledWith","objectContaining","default","message","hasAttachGrant","organization","mockReturnValueOnce","value"],"mappings":"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"}