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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/dist/actions/dataset/create.d.ts +49 -0
  2. package/dist/actions/dataset/create.js +48 -0
  3. package/dist/actions/dataset/create.js.map +1 -0
  4. package/dist/actions/dataset/determineDatasetAclMode.d.ts +37 -0
  5. package/dist/actions/dataset/determineDatasetAclMode.js +36 -0
  6. package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -0
  7. package/dist/actions/debug/gatherDebugInfo.js +15 -21
  8. package/dist/actions/debug/gatherDebugInfo.js.map +1 -1
  9. package/dist/actions/debug/types.d.ts +0 -2
  10. package/dist/actions/debug/types.js.map +1 -1
  11. package/dist/actions/deploy/deployApp.js +13 -0
  12. package/dist/actions/deploy/deployApp.js.map +1 -1
  13. package/dist/actions/dev/startStudioDevServer.js +3 -8
  14. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  15. package/dist/actions/dev/types.d.ts +1 -3
  16. package/dist/actions/dev/types.js.map +1 -1
  17. package/dist/actions/documents/validate.d.ts +0 -2
  18. package/dist/actions/documents/validate.js +21 -1
  19. package/dist/actions/documents/validate.js.map +1 -1
  20. package/dist/actions/exec/execScript.js +1 -1
  21. package/dist/actions/exec/execScript.js.map +1 -1
  22. package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
  23. package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
  24. package/dist/actions/init/remoteTemplate.js +1 -1
  25. package/dist/actions/init/remoteTemplate.js.map +1 -1
  26. package/dist/actions/manifest/extractAppManifest.d.ts +20 -0
  27. package/dist/actions/manifest/extractAppManifest.js +51 -0
  28. package/dist/actions/manifest/extractAppManifest.js.map +1 -0
  29. package/dist/actions/manifest/extractManifest.js +2 -5
  30. package/dist/actions/manifest/extractManifest.js.map +1 -1
  31. package/dist/actions/manifest/types.d.ts +6 -1
  32. package/dist/actions/manifest/types.js.map +1 -1
  33. package/dist/actions/media/importAspects.js +2 -1
  34. package/dist/actions/media/importAspects.js.map +1 -1
  35. package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
  36. package/dist/actions/schema/deleteSchemaAction.js +12 -17
  37. package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
  38. package/dist/actions/schema/deploySchemas.d.ts +15 -0
  39. package/dist/actions/schema/deploySchemas.js +98 -0
  40. package/dist/actions/schema/deploySchemas.js.map +1 -0
  41. package/dist/actions/schema/listSchemas.d.ts +12 -0
  42. package/dist/actions/schema/listSchemas.js +119 -0
  43. package/dist/actions/schema/listSchemas.js.map +1 -0
  44. package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
  45. package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
  46. package/dist/actions/schema/utils/debug.d.ts +2 -0
  47. package/dist/actions/schema/utils/debug.js +5 -0
  48. package/dist/actions/schema/utils/debug.js.map +1 -0
  49. package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
  50. package/dist/actions/schema/utils/manifestExtractor.js +12 -17
  51. package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
  52. package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
  53. package/dist/actions/schema/utils/manifestReader.js +6 -12
  54. package/dist/actions/schema/utils/manifestReader.js.map +1 -1
  55. package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
  56. package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
  57. package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
  58. package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
  59. package/dist/actions/schema/utils/schemaStoreValidation.js +38 -125
  60. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  61. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
  62. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
  63. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
  64. package/dist/actions/users/getMembersForProject.d.ts +1 -3
  65. package/dist/actions/users/getMembersForProject.js +6 -17
  66. package/dist/actions/users/getMembersForProject.js.map +1 -1
  67. package/dist/actions/users/types.d.ts +0 -11
  68. package/dist/actions/users/types.js.map +1 -1
  69. package/dist/commands/backup/disable.js +5 -11
  70. package/dist/commands/backup/disable.js.map +1 -1
  71. package/dist/commands/backup/enable.js +5 -11
  72. package/dist/commands/backup/enable.js.map +1 -1
  73. package/dist/commands/backup/list.js +7 -8
  74. package/dist/commands/backup/list.js.map +1 -1
  75. package/dist/commands/cors/add.js +5 -13
  76. package/dist/commands/cors/add.js.map +1 -1
  77. package/dist/commands/cors/delete.js +7 -15
  78. package/dist/commands/cors/delete.js.map +1 -1
  79. package/dist/commands/cors/list.js +2 -10
  80. package/dist/commands/cors/list.js.map +1 -1
  81. package/dist/commands/dataset/create.d.ts +0 -2
  82. package/dist/commands/dataset/create.js +8 -54
  83. package/dist/commands/dataset/create.js.map +1 -1
  84. package/dist/commands/dataset/export.js +4 -4
  85. package/dist/commands/dataset/export.js.map +1 -1
  86. package/dist/commands/debug.js +5 -9
  87. package/dist/commands/debug.js.map +1 -1
  88. package/dist/commands/dev.js +0 -1
  89. package/dist/commands/dev.js.map +1 -1
  90. package/dist/commands/documents/create.d.ts +1 -0
  91. package/dist/commands/documents/create.js +10 -9
  92. package/dist/commands/documents/create.js.map +1 -1
  93. package/dist/commands/documents/delete.js +2 -3
  94. package/dist/commands/documents/delete.js.map +1 -1
  95. package/dist/commands/documents/get.js +2 -3
  96. package/dist/commands/documents/get.js.map +1 -1
  97. package/dist/commands/documents/query.js +2 -3
  98. package/dist/commands/documents/query.js.map +1 -1
  99. package/dist/commands/documents/validate.js +0 -20
  100. package/dist/commands/documents/validate.js.map +1 -1
  101. package/dist/commands/graphql/list.js +2 -2
  102. package/dist/commands/graphql/list.js.map +1 -1
  103. package/dist/commands/graphql/undeploy.js +4 -9
  104. package/dist/commands/graphql/undeploy.js.map +1 -1
  105. package/dist/commands/hook/create.js +2 -6
  106. package/dist/commands/hook/create.js.map +1 -1
  107. package/dist/commands/hook/delete.js +5 -17
  108. package/dist/commands/hook/delete.js.map +1 -1
  109. package/dist/commands/hook/list.js +2 -8
  110. package/dist/commands/hook/list.js.map +1 -1
  111. package/dist/commands/init.d.ts +6 -1
  112. package/dist/commands/init.js +358 -20
  113. package/dist/commands/init.js.map +1 -1
  114. package/dist/commands/manifest/extract.js +7 -8
  115. package/dist/commands/manifest/extract.js.map +1 -1
  116. package/dist/commands/media/export.js +2 -2
  117. package/dist/commands/media/export.js.map +1 -1
  118. package/dist/commands/media/import.js +2 -2
  119. package/dist/commands/media/import.js.map +1 -1
  120. package/dist/commands/projects/list.js +2 -6
  121. package/dist/commands/projects/list.js.map +1 -1
  122. package/dist/commands/schema/delete.d.ts +1 -1
  123. package/dist/commands/schema/delete.js +20 -23
  124. package/dist/commands/schema/delete.js.map +1 -1
  125. package/dist/commands/schema/deploy.d.ts +16 -0
  126. package/dist/commands/schema/deploy.js +98 -0
  127. package/dist/commands/schema/deploy.js.map +1 -0
  128. package/dist/commands/schema/list.d.ts +15 -0
  129. package/dist/commands/schema/list.js +104 -0
  130. package/dist/commands/schema/list.js.map +1 -0
  131. package/dist/commands/tokens/add.js +3 -5
  132. package/dist/commands/tokens/add.js.map +1 -1
  133. package/dist/commands/users/invite.js +6 -17
  134. package/dist/commands/users/invite.js.map +1 -1
  135. package/dist/commands/users/list.js +4 -7
  136. package/dist/commands/users/list.js.map +1 -1
  137. package/dist/config/createCliConfig.d.ts +13 -4
  138. package/dist/prompts/init/promptForTypescript.d.ts +2 -0
  139. package/dist/prompts/init/promptForTypescript.js +15 -0
  140. package/dist/prompts/init/promptForTypescript.js.map +1 -0
  141. package/dist/prompts/promptForDatasetAclMode.d.ts +9 -0
  142. package/dist/prompts/promptForDatasetAclMode.js +27 -0
  143. package/dist/prompts/promptForDatasetAclMode.js.map +1 -0
  144. package/dist/prompts/promptForDatasetName.d.ts +1 -1
  145. package/dist/prompts/promptForDatasetName.js +4 -1
  146. package/dist/prompts/promptForDatasetName.js.map +1 -1
  147. package/dist/services/backup.d.ts +8 -0
  148. package/dist/services/backup.js +19 -0
  149. package/dist/services/backup.js.map +1 -1
  150. package/dist/services/cors.d.ts +23 -0
  151. package/dist/services/cors.js +38 -0
  152. package/dist/services/cors.js.map +1 -0
  153. package/dist/services/graphql.d.ts +7 -0
  154. package/dist/services/graphql.js +11 -0
  155. package/dist/services/graphql.js.map +1 -1
  156. package/dist/services/hooks.d.ts +2 -0
  157. package/dist/services/hooks.js +19 -0
  158. package/dist/services/hooks.js.map +1 -1
  159. package/dist/services/organizations.d.ts +4 -2
  160. package/dist/services/organizations.js +3 -2
  161. package/dist/services/organizations.js.map +1 -1
  162. package/dist/services/projects.d.ts +11 -0
  163. package/dist/services/projects.js +41 -0
  164. package/dist/services/projects.js.map +1 -1
  165. package/dist/services/schemas.d.ts +4 -0
  166. package/dist/services/schemas.js +40 -0
  167. package/dist/services/schemas.js.map +1 -0
  168. package/dist/services/user.d.ts +13 -0
  169. package/dist/services/user.js +27 -3
  170. package/dist/services/user.js.map +1 -1
  171. package/dist/services/userApplications.d.ts +3 -1
  172. package/dist/services/userApplications.js +5 -1
  173. package/dist/services/userApplications.js.map +1 -1
  174. package/dist/util/errorMessages.d.ts +1 -0
  175. package/dist/util/errorMessages.js +1 -0
  176. package/dist/util/errorMessages.js.map +1 -1
  177. package/dist/util/getCliVersion.js +1 -1
  178. package/dist/util/getCliVersion.js.map +1 -1
  179. package/dist/util/readPackageJson.d.ts +1 -15
  180. package/dist/util/readPackageJson.js +1 -1
  181. package/dist/util/readPackageJson.js.map +1 -1
  182. package/dist/util/uniqBy.d.ts +1 -0
  183. package/dist/util/uniqBy.js +14 -0
  184. package/dist/util/uniqBy.js.map +1 -0
  185. package/oclif.manifest.json +284 -139
  186. package/package.json +36 -33
  187. package/templates/app-quickstart/src/App.css +20 -0
  188. package/templates/app-quickstart/src/App.tsx +25 -0
  189. package/templates/app-quickstart/src/ExampleComponent.css +90 -0
  190. package/templates/app-quickstart/src/ExampleComponent.tsx +37 -0
  191. package/templates/app-sanity-ui/src/App.tsx +34 -0
  192. package/templates/app-sanity-ui/src/ExampleComponent.tsx +34 -0
  193. package/templates/app-sanity-ui/src/SanityUI.tsx +23 -0
  194. package/templates/blog/README.md +11 -0
  195. package/templates/blog/schemaTypes/author.js +50 -0
  196. package/templates/blog/schemaTypes/blockContent.js +67 -0
  197. package/templates/blog/schemaTypes/category.js +19 -0
  198. package/templates/blog/schemaTypes/index.js +6 -0
  199. package/templates/blog/schemaTypes/post.js +65 -0
  200. package/templates/blog/static/.gitkeep +1 -0
  201. package/templates/clean/README.md +9 -0
  202. package/templates/clean/schemaTypes/index.js +1 -0
  203. package/templates/clean/static/.gitkeep +1 -0
  204. package/templates/ecommerce/README.md +11 -0
  205. package/templates/ecommerce/plugins/.gitkeep +1 -0
  206. package/templates/ecommerce/plugins/barcode-input/BarcodeInput.js +62 -0
  207. package/templates/ecommerce/plugins/barcode-input/index.js +9 -0
  208. package/templates/ecommerce/plugins/barcode-input/schemaType.js +60 -0
  209. package/templates/ecommerce/schemaTypes/blockContent.js +67 -0
  210. package/templates/ecommerce/schemaTypes/category.js +39 -0
  211. package/templates/ecommerce/schemaTypes/index.js +23 -0
  212. package/templates/ecommerce/schemaTypes/locale/localeBlockContent.js +19 -0
  213. package/templates/ecommerce/schemaTypes/locale/localeString.js +19 -0
  214. package/templates/ecommerce/schemaTypes/locale/localeText.js +19 -0
  215. package/templates/ecommerce/schemaTypes/locale/supportedLanguages.js +5 -0
  216. package/templates/ecommerce/schemaTypes/product.js +83 -0
  217. package/templates/ecommerce/schemaTypes/productVariant.js +52 -0
  218. package/templates/ecommerce/schemaTypes/vendor.js +39 -0
  219. package/templates/ecommerce/static/.gitkeep +1 -0
  220. package/templates/get-started/README.md +9 -0
  221. package/templates/get-started/plugins/.gitkeep +1 -0
  222. package/templates/get-started/plugins/sanity-plugin-tutorial/CustomDefaultLayout.tsx +16 -0
  223. package/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +104 -0
  224. package/templates/get-started/plugins/sanity-plugin-tutorial/index.ts +11 -0
  225. package/templates/get-started/schemaTypes/index.ts +1 -0
  226. package/templates/get-started/static/.gitkeep +1 -0
  227. package/templates/moviedb/README.md +10 -0
  228. package/templates/moviedb/schemaTypes/blockContent.js +67 -0
  229. package/templates/moviedb/schemaTypes/castMember.js +37 -0
  230. package/templates/moviedb/schemaTypes/crewMember.js +52 -0
  231. package/templates/moviedb/schemaTypes/index.js +22 -0
  232. package/templates/moviedb/schemaTypes/movie.js +85 -0
  233. package/templates/moviedb/schemaTypes/person.js +37 -0
  234. package/templates/moviedb/schemaTypes/plotSummaries.js +20 -0
  235. package/templates/moviedb/schemaTypes/plotSummary.js +24 -0
  236. package/templates/moviedb/schemaTypes/screening.js +81 -0
  237. package/templates/moviedb/static/.gitkeep +1 -0
  238. package/templates/quickstart/README.md +9 -0
  239. package/templates/quickstart/schemaTypes/index.js +1 -0
  240. package/templates/quickstart/static/.gitkeep +1 -0
  241. package/templates/shared/gitignore.txt +29 -0
  242. package/templates/shared/tsconfig.json +17 -0
  243. package/templates/shopify/README.md +85 -0
  244. package/templates/shopify/components/hotspots/ProductTooltip.tsx +38 -0
  245. package/templates/shopify/components/icons/Shopify.tsx +20 -0
  246. package/templates/shopify/components/inputs/CollectionHidden.tsx +23 -0
  247. package/templates/shopify/components/inputs/PlaceholderString.tsx +20 -0
  248. package/templates/shopify/components/inputs/ProductHidden.tsx +64 -0
  249. package/templates/shopify/components/inputs/ProductVariantHidden.tsx +24 -0
  250. package/templates/shopify/components/inputs/ProxyString.tsx +32 -0
  251. package/templates/shopify/components/media/ColorTheme.tsx +38 -0
  252. package/templates/shopify/components/media/ShopifyDocumentStatus.tsx +82 -0
  253. package/templates/shopify/components/studio/Navbar.tsx +29 -0
  254. package/templates/shopify/constants.ts +61 -0
  255. package/templates/shopify/docs/features.md +158 -0
  256. package/templates/shopify/plugins/customDocumentActions/index.ts +55 -0
  257. package/templates/shopify/plugins/customDocumentActions/shopifyDelete.tsx +144 -0
  258. package/templates/shopify/plugins/customDocumentActions/shopifyLink.ts +39 -0
  259. package/templates/shopify/plugins/customDocumentActions/types.ts +14 -0
  260. package/templates/shopify/schemaTypes/documents/collection.tsx +142 -0
  261. package/templates/shopify/schemaTypes/documents/colorTheme.tsx +44 -0
  262. package/templates/shopify/schemaTypes/documents/page.ts +70 -0
  263. package/templates/shopify/schemaTypes/documents/product.tsx +132 -0
  264. package/templates/shopify/schemaTypes/documents/productVariant.tsx +67 -0
  265. package/templates/shopify/schemaTypes/index.ts +108 -0
  266. package/templates/shopify/schemaTypes/objects/collection/collectionGroupType.ts +27 -0
  267. package/templates/shopify/schemaTypes/objects/collection/collectionLinksType.ts +16 -0
  268. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorObjectType.tsx +48 -0
  269. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorType.tsx +50 -0
  270. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeObjectType.ts +40 -0
  271. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeType.ts +49 -0
  272. package/templates/shopify/schemaTypes/objects/global/footerType.ts +22 -0
  273. package/templates/shopify/schemaTypes/objects/global/menuLinksType.ts +21 -0
  274. package/templates/shopify/schemaTypes/objects/global/menuType.ts +17 -0
  275. package/templates/shopify/schemaTypes/objects/global/notFoundPageType.ts +37 -0
  276. package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +48 -0
  277. package/templates/shopify/schemaTypes/objects/hotspot/productHotspotsType.tsx +17 -0
  278. package/templates/shopify/schemaTypes/objects/hotspot/spotType.tsx +60 -0
  279. package/templates/shopify/schemaTypes/objects/link/linkEmailType.tsx +34 -0
  280. package/templates/shopify/schemaTypes/objects/link/linkExternalType.tsx +37 -0
  281. package/templates/shopify/schemaTypes/objects/link/linkInternalType.tsx +33 -0
  282. package/templates/shopify/schemaTypes/objects/link/linkProductType.tsx +60 -0
  283. package/templates/shopify/schemaTypes/objects/module/accordionGroupType.ts +33 -0
  284. package/templates/shopify/schemaTypes/objects/module/accordionType.ts +28 -0
  285. package/templates/shopify/schemaTypes/objects/module/callToActionType.tsx +85 -0
  286. package/templates/shopify/schemaTypes/objects/module/calloutType.ts +38 -0
  287. package/templates/shopify/schemaTypes/objects/module/collectionReferenceType.tsx +47 -0
  288. package/templates/shopify/schemaTypes/objects/module/gridItemType.ts +41 -0
  289. package/templates/shopify/schemaTypes/objects/module/gridType.ts +28 -0
  290. package/templates/shopify/schemaTypes/objects/module/heroType.tsx +40 -0
  291. package/templates/shopify/schemaTypes/objects/module/imageCallToActionType.tsx +19 -0
  292. package/templates/shopify/schemaTypes/objects/module/imageFeatureType.ts +80 -0
  293. package/templates/shopify/schemaTypes/objects/module/imageFeaturesType.tsx +51 -0
  294. package/templates/shopify/schemaTypes/objects/module/instagramType.ts +35 -0
  295. package/templates/shopify/schemaTypes/objects/module/productFeaturesType.tsx +50 -0
  296. package/templates/shopify/schemaTypes/objects/module/productReferenceType.tsx +42 -0
  297. package/templates/shopify/schemaTypes/objects/seoType.ts +31 -0
  298. package/templates/shopify/schemaTypes/objects/shopify/collectionRuleType.tsx +37 -0
  299. package/templates/shopify/schemaTypes/objects/shopify/inventoryType.ts +25 -0
  300. package/templates/shopify/schemaTypes/objects/shopify/optionType.tsx +31 -0
  301. package/templates/shopify/schemaTypes/objects/shopify/placeholderStringType.ts +11 -0
  302. package/templates/shopify/schemaTypes/objects/shopify/priceRangeType.ts +20 -0
  303. package/templates/shopify/schemaTypes/objects/shopify/productWithVariantType.tsx +142 -0
  304. package/templates/shopify/schemaTypes/objects/shopify/proxyStringType.ts +12 -0
  305. package/templates/shopify/schemaTypes/objects/shopify/shopType.ts +15 -0
  306. package/templates/shopify/schemaTypes/objects/shopify/shopifyCollectionType.ts +84 -0
  307. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductType.ts +131 -0
  308. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductVariantType.ts +121 -0
  309. package/templates/shopify/schemaTypes/portableText/portableTextSimpleType.tsx +45 -0
  310. package/templates/shopify/schemaTypes/portableText/portableTextType.tsx +52 -0
  311. package/templates/shopify/schemaTypes/singletons/homeType.ts +49 -0
  312. package/templates/shopify/schemaTypes/singletons/settingsType.ts +96 -0
  313. package/templates/shopify/static/.gitkeep +1 -0
  314. package/templates/shopify/structure/collectionStructure.ts +9 -0
  315. package/templates/shopify/structure/colorThemeStructure.ts +9 -0
  316. package/templates/shopify/structure/homeStructure.ts +9 -0
  317. package/templates/shopify/structure/index.ts +57 -0
  318. package/templates/shopify/structure/pageStructure.ts +11 -0
  319. package/templates/shopify/structure/productStructure.ts +51 -0
  320. package/templates/shopify/structure/settingStructure.ts +9 -0
  321. package/templates/shopify/utils/blocksToText.ts +20 -0
  322. package/templates/shopify/utils/defineStructure.ts +11 -0
  323. package/templates/shopify/utils/getPriceRange.ts +24 -0
  324. package/templates/shopify/utils/shopifyUrls.ts +22 -0
  325. package/templates/shopify/utils/validateSlug.ts +18 -0
  326. package/templates/shopify-online-storefront/README.md +54 -0
  327. package/templates/shopify-online-storefront/components/icons/Shopify.tsx +22 -0
  328. package/templates/shopify-online-storefront/components/inputs/CollectionHidden.tsx +23 -0
  329. package/templates/shopify-online-storefront/components/inputs/PlaceholderString.tsx +25 -0
  330. package/templates/shopify-online-storefront/components/inputs/ProductHidden.tsx +66 -0
  331. package/templates/shopify-online-storefront/components/inputs/ProductVariantHidden.tsx +25 -0
  332. package/templates/shopify-online-storefront/components/inputs/ProxyString.tsx +38 -0
  333. package/templates/shopify-online-storefront/components/media/ShopifyDocumentStatus.tsx +83 -0
  334. package/templates/shopify-online-storefront/constants.ts +18 -0
  335. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/index.ts +45 -0
  336. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyDelete.tsx +144 -0
  337. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyLink.ts +39 -0
  338. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/types.ts +14 -0
  339. package/templates/shopify-online-storefront/schemaTypes/blocks/blockContent.ts +32 -0
  340. package/templates/shopify-online-storefront/schemaTypes/documents/collection.tsx +83 -0
  341. package/templates/shopify-online-storefront/schemaTypes/documents/product.tsx +102 -0
  342. package/templates/shopify-online-storefront/schemaTypes/documents/productVariant.tsx +82 -0
  343. package/templates/shopify-online-storefront/schemaTypes/index.ts +43 -0
  344. package/templates/shopify-online-storefront/schemaTypes/objects/accordion.ts +31 -0
  345. package/templates/shopify-online-storefront/schemaTypes/objects/accordionGroup.ts +35 -0
  346. package/templates/shopify-online-storefront/schemaTypes/objects/callout.ts +40 -0
  347. package/templates/shopify-online-storefront/schemaTypes/objects/inventory.ts +30 -0
  348. package/templates/shopify-online-storefront/schemaTypes/objects/option.ts +30 -0
  349. package/templates/shopify-online-storefront/schemaTypes/objects/priceRange.ts +22 -0
  350. package/templates/shopify-online-storefront/schemaTypes/objects/proxyString.ts +11 -0
  351. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollection.ts +109 -0
  352. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollectionRule.tsx +45 -0
  353. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProduct.ts +165 -0
  354. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProductVariant.ts +151 -0
  355. package/templates/shopify-online-storefront/structure/collectionStructure.ts +9 -0
  356. package/templates/shopify-online-storefront/structure/index.ts +37 -0
  357. package/templates/shopify-online-storefront/structure/productStructure.ts +35 -0
  358. package/templates/shopify-online-storefront/utils/defineStructure.ts +11 -0
  359. package/templates/shopify-online-storefront/utils/getPriceRange.ts +24 -0
  360. package/templates/shopify-online-storefront/utils/shopifyUrls.ts +22 -0
  361. package/dist/actions/build/__tests__/buildApp.test.js +0 -367
  362. package/dist/actions/build/__tests__/buildApp.test.js.map +0 -1
  363. package/dist/actions/build/__tests__/buildStudio.test.js +0 -561
  364. package/dist/actions/build/__tests__/buildStudio.test.js.map +0 -1
  365. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js +0 -233
  366. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js.map +0 -1
  367. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js +0 -414
  368. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js.map +0 -1
  369. package/dist/actions/build/__tests__/determineBasePath.test.js +0 -24
  370. package/dist/actions/build/__tests__/determineBasePath.test.js.map +0 -1
  371. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js +0 -109
  372. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js.map +0 -1
  373. package/dist/actions/build/__tests__/getViteConfig.test.js +0 -493
  374. package/dist/actions/build/__tests__/getViteConfig.test.js.map +0 -1
  375. package/dist/actions/build/__tests__/renderDocument.test.js +0 -278
  376. package/dist/actions/build/__tests__/renderDocument.test.js.map +0 -1
  377. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js +0 -153
  378. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js.map +0 -1
  379. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js +0 -657
  380. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js.map +0 -1
  381. package/dist/actions/cors/constants.d.ts +0 -1
  382. package/dist/actions/cors/constants.js +0 -3
  383. package/dist/actions/cors/constants.js.map +0 -1
  384. package/dist/actions/cors/types.d.ts +0 -9
  385. package/dist/actions/cors/types.js +0 -3
  386. package/dist/actions/cors/types.js.map +0 -1
  387. package/dist/actions/dataset/__tests__/validateDatasetName.test.js +0 -182
  388. package/dist/actions/dataset/__tests__/validateDatasetName.test.js.map +0 -1
  389. package/dist/actions/deploy/__tests__/checkDir.test.js +0 -120
  390. package/dist/actions/deploy/__tests__/checkDir.test.js.map +0 -1
  391. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js +0 -16
  392. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js.map +0 -1
  393. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js +0 -124
  394. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js.map +0 -1
  395. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +0 -274
  396. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +0 -1
  397. package/dist/actions/media/__tests__/importMedia.test.js +0 -182
  398. package/dist/actions/media/__tests__/importMedia.test.js.map +0 -1
  399. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
  400. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
  401. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js +0 -174
  402. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js.map +0 -1
  403. package/dist/actions/schema/__tests__/validateAction.test.js +0 -281
  404. package/dist/actions/schema/__tests__/validateAction.test.js.map +0 -1
  405. package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
  406. package/dist/actions/schema/schemaStoreConstants.js +0 -4
  407. package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
  408. package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
  409. package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
  410. package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
  411. package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
  412. package/dist/actions/schema/utils/schemaApiClient.js +0 -17
  413. package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
  414. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js +0 -27
  415. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js.map +0 -1
  416. package/dist/actions/users/__tests__/validateEmail.test.js +0 -16
  417. package/dist/actions/users/__tests__/validateEmail.test.js.map +0 -1
  418. package/dist/actions/users/apiVersion.d.ts +0 -6
  419. package/dist/actions/users/apiVersion.js +0 -7
  420. package/dist/actions/users/apiVersion.js.map +0 -1
  421. package/dist/commands/__tests__/blueprints.test.js +0 -54
  422. package/dist/commands/__tests__/blueprints.test.js.map +0 -1
  423. package/dist/commands/__tests__/build.test.js +0 -132
  424. package/dist/commands/__tests__/build.test.js.map +0 -1
  425. package/dist/commands/__tests__/codemod.test.js +0 -271
  426. package/dist/commands/__tests__/codemod.test.js.map +0 -1
  427. package/dist/commands/__tests__/debug.test.js +0 -697
  428. package/dist/commands/__tests__/debug.test.js.map +0 -1
  429. package/dist/commands/__tests__/deploy.test.js +0 -1913
  430. package/dist/commands/__tests__/deploy.test.js.map +0 -1
  431. package/dist/commands/__tests__/dev.test.js +0 -410
  432. package/dist/commands/__tests__/dev.test.js.map +0 -1
  433. package/dist/commands/__tests__/exec.test.js +0 -207
  434. package/dist/commands/__tests__/exec.test.js.map +0 -1
  435. package/dist/commands/__tests__/init/init.authentication.test.js +0 -60
  436. package/dist/commands/__tests__/init/init.authentication.test.js.map +0 -1
  437. package/dist/commands/__tests__/init/init.create-new-project.test.js +0 -196
  438. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +0 -1
  439. package/dist/commands/__tests__/init/init.plan.test.js +0 -220
  440. package/dist/commands/__tests__/init/init.plan.test.js.map +0 -1
  441. package/dist/commands/__tests__/init/init.setup.test.js +0 -279
  442. package/dist/commands/__tests__/init/init.setup.test.js.map +0 -1
  443. package/dist/commands/__tests__/install.test.js +0 -258
  444. package/dist/commands/__tests__/install.test.js.map +0 -1
  445. package/dist/commands/__tests__/learn.test.js +0 -29
  446. package/dist/commands/__tests__/learn.test.js.map +0 -1
  447. package/dist/commands/__tests__/logout.test.js +0 -88
  448. package/dist/commands/__tests__/logout.test.js.map +0 -1
  449. package/dist/commands/__tests__/manage.test.js +0 -105
  450. package/dist/commands/__tests__/manage.test.js.map +0 -1
  451. package/dist/commands/__tests__/migration.test.js +0 -119
  452. package/dist/commands/__tests__/migration.test.js.map +0 -1
  453. package/dist/commands/__tests__/preview.test.js +0 -261
  454. package/dist/commands/__tests__/preview.test.js.map +0 -1
  455. package/dist/commands/__tests__/start.test.js +0 -253
  456. package/dist/commands/__tests__/start.test.js.map +0 -1
  457. package/dist/commands/__tests__/undeploy.test.js +0 -382
  458. package/dist/commands/__tests__/undeploy.test.js.map +0 -1
  459. package/dist/commands/__tests__/versions.test.js +0 -134
  460. package/dist/commands/__tests__/versions.test.js.map +0 -1
  461. package/dist/commands/backup/__tests__/disable.test.js +0 -207
  462. package/dist/commands/backup/__tests__/disable.test.js.map +0 -1
  463. package/dist/commands/backup/__tests__/download.test.js +0 -679
  464. package/dist/commands/backup/__tests__/download.test.js.map +0 -1
  465. package/dist/commands/backup/__tests__/enable.test.js +0 -317
  466. package/dist/commands/backup/__tests__/enable.test.js.map +0 -1
  467. package/dist/commands/backup/__tests__/list.test.js +0 -321
  468. package/dist/commands/backup/__tests__/list.test.js.map +0 -1
  469. package/dist/commands/cors/__tests__/add.test.js +0 -346
  470. package/dist/commands/cors/__tests__/add.test.js.map +0 -1
  471. package/dist/commands/cors/__tests__/delete.test.js +0 -293
  472. package/dist/commands/cors/__tests__/delete.test.js.map +0 -1
  473. package/dist/commands/cors/__tests__/list.test.js +0 -218
  474. package/dist/commands/cors/__tests__/list.test.js.map +0 -1
  475. package/dist/commands/dataset/__tests__/copy.test.js +0 -520
  476. package/dist/commands/dataset/__tests__/copy.test.js.map +0 -1
  477. package/dist/commands/dataset/__tests__/create.test.js +0 -312
  478. package/dist/commands/dataset/__tests__/create.test.js.map +0 -1
  479. package/dist/commands/dataset/__tests__/delete.test.js +0 -224
  480. package/dist/commands/dataset/__tests__/delete.test.js.map +0 -1
  481. package/dist/commands/dataset/__tests__/export.test.js +0 -561
  482. package/dist/commands/dataset/__tests__/export.test.js.map +0 -1
  483. package/dist/commands/dataset/__tests__/import.test.js +0 -53
  484. package/dist/commands/dataset/__tests__/import.test.js.map +0 -1
  485. package/dist/commands/dataset/__tests__/list.test.js +0 -174
  486. package/dist/commands/dataset/__tests__/list.test.js.map +0 -1
  487. package/dist/commands/dataset/alias/__tests__/create.test.js +0 -299
  488. package/dist/commands/dataset/alias/__tests__/create.test.js.map +0 -1
  489. package/dist/commands/dataset/alias/__tests__/delete.test.js +0 -236
  490. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +0 -1
  491. package/dist/commands/dataset/alias/__tests__/link.test.js +0 -336
  492. package/dist/commands/dataset/alias/__tests__/link.test.js.map +0 -1
  493. package/dist/commands/dataset/alias/__tests__/unlink.test.js +0 -298
  494. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +0 -1
  495. package/dist/commands/dataset/visibility/__tests__/get.test.js +0 -147
  496. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +0 -1
  497. package/dist/commands/dataset/visibility/__tests__/set.test.js +0 -245
  498. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +0 -1
  499. package/dist/commands/docs/__tests__/browse.test.js +0 -29
  500. package/dist/commands/docs/__tests__/browse.test.js.map +0 -1
  501. package/dist/commands/docs/__tests__/read.test.js +0 -78
  502. package/dist/commands/docs/__tests__/read.test.js.map +0 -1
  503. package/dist/commands/docs/__tests__/search.test.js +0 -254
  504. package/dist/commands/docs/__tests__/search.test.js.map +0 -1
  505. package/dist/commands/documents/__tests__/create.test.js +0 -967
  506. package/dist/commands/documents/__tests__/create.test.js.map +0 -1
  507. package/dist/commands/documents/__tests__/delete.test.js +0 -268
  508. package/dist/commands/documents/__tests__/delete.test.js.map +0 -1
  509. package/dist/commands/documents/__tests__/get.test.js +0 -209
  510. package/dist/commands/documents/__tests__/get.test.js.map +0 -1
  511. package/dist/commands/documents/__tests__/query.test.js +0 -405
  512. package/dist/commands/documents/__tests__/query.test.js.map +0 -1
  513. package/dist/commands/documents/__tests__/validate.test.js +0 -226
  514. package/dist/commands/documents/__tests__/validate.test.js.map +0 -1
  515. package/dist/commands/graphql/__tests__/list.test.js +0 -228
  516. package/dist/commands/graphql/__tests__/list.test.js.map +0 -1
  517. package/dist/commands/graphql/__tests__/undeploy.test.js +0 -384
  518. package/dist/commands/graphql/__tests__/undeploy.test.js.map +0 -1
  519. package/dist/commands/hook/__tests__/attempt.test.js +0 -260
  520. package/dist/commands/hook/__tests__/attempt.test.js.map +0 -1
  521. package/dist/commands/hook/__tests__/create.test.js +0 -121
  522. package/dist/commands/hook/__tests__/create.test.js.map +0 -1
  523. package/dist/commands/hook/__tests__/delete.test.js +0 -220
  524. package/dist/commands/hook/__tests__/delete.test.js.map +0 -1
  525. package/dist/commands/hook/__tests__/list.test.js +0 -138
  526. package/dist/commands/hook/__tests__/list.test.js.map +0 -1
  527. package/dist/commands/hook/__tests__/logs.test.js +0 -770
  528. package/dist/commands/hook/__tests__/logs.test.js.map +0 -1
  529. package/dist/commands/manifest/__tests__/extract.test.js +0 -123
  530. package/dist/commands/manifest/__tests__/extract.test.js.map +0 -1
  531. package/dist/commands/mcp/__tests__/configure.test.js +0 -397
  532. package/dist/commands/mcp/__tests__/configure.test.js.map +0 -1
  533. package/dist/commands/media/__tests__/create-aspect.test.js +0 -160
  534. package/dist/commands/media/__tests__/create-aspect.test.js.map +0 -1
  535. package/dist/commands/media/__tests__/delete-aspect.test.js +0 -333
  536. package/dist/commands/media/__tests__/delete-aspect.test.js.map +0 -1
  537. package/dist/commands/media/__tests__/deploy-aspect.test.js +0 -632
  538. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +0 -1
  539. package/dist/commands/media/__tests__/export.test.js +0 -398
  540. package/dist/commands/media/__tests__/export.test.js.map +0 -1
  541. package/dist/commands/media/__tests__/import.test.js +0 -281
  542. package/dist/commands/media/__tests__/import.test.js.map +0 -1
  543. package/dist/commands/openapi/__tests__/get.test.js +0 -149
  544. package/dist/commands/openapi/__tests__/get.test.js.map +0 -1
  545. package/dist/commands/openapi/__tests__/list.test.js +0 -113
  546. package/dist/commands/openapi/__tests__/list.test.js.map +0 -1
  547. package/dist/commands/projects/__tests__/list.test.js +0 -153
  548. package/dist/commands/projects/__tests__/list.test.js.map +0 -1
  549. package/dist/commands/schema/__tests__/delete.test.js +0 -209
  550. package/dist/commands/schema/__tests__/delete.test.js.map +0 -1
  551. package/dist/commands/schema/__tests__/extract.test.js +0 -113
  552. package/dist/commands/schema/__tests__/extract.test.js.map +0 -1
  553. package/dist/commands/schema/__tests__/validate.test.js +0 -104
  554. package/dist/commands/schema/__tests__/validate.test.js.map +0 -1
  555. package/dist/commands/telemetry/__tests__/disable.test.js +0 -145
  556. package/dist/commands/telemetry/__tests__/disable.test.js.map +0 -1
  557. package/dist/commands/telemetry/__tests__/enable.test.js +0 -131
  558. package/dist/commands/telemetry/__tests__/enable.test.js.map +0 -1
  559. package/dist/commands/telemetry/__tests__/status.test.js +0 -153
  560. package/dist/commands/telemetry/__tests__/status.test.js.map +0 -1
  561. package/dist/commands/tokens/__tests__/add.test.js +0 -420
  562. package/dist/commands/tokens/__tests__/add.test.js.map +0 -1
  563. package/dist/commands/tokens/__tests__/delete.test.js +0 -375
  564. package/dist/commands/tokens/__tests__/delete.test.js.map +0 -1
  565. package/dist/commands/tokens/__tests__/list.test.js +0 -368
  566. package/dist/commands/tokens/__tests__/list.test.js.map +0 -1
  567. package/dist/commands/users/__tests__/invite.test.js +0 -341
  568. package/dist/commands/users/__tests__/invite.test.js.map +0 -1
  569. package/dist/commands/users/__tests__/list.test.js +0 -401
  570. package/dist/commands/users/__tests__/list.test.js.map +0 -1
  571. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js +0 -77
  572. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js.map +0 -1
  573. package/dist/services/__tests__/datasetAliases.test.js +0 -131
  574. package/dist/services/__tests__/datasetAliases.test.js.map +0 -1
  575. package/dist/services/__tests__/datasets.test.js +0 -436
  576. package/dist/services/__tests__/datasets.test.js.map +0 -1
  577. package/dist/services/__tests__/graphql.test.js +0 -43
  578. package/dist/services/__tests__/graphql.test.js.map +0 -1
  579. package/dist/services/__tests__/mediaLibraries.test.js +0 -88
  580. package/dist/services/__tests__/mediaLibraries.test.js.map +0 -1
  581. package/dist/services/__tests__/projects.test.js +0 -41
  582. package/dist/services/__tests__/projects.test.js.map +0 -1
  583. package/dist/services/__tests__/userApplications.test.js +0 -113
  584. package/dist/services/__tests__/userApplications.test.js.map +0 -1
  585. package/dist/util/__tests__/appId.test.js +0 -31
  586. package/dist/util/__tests__/appId.test.js.map +0 -1
  587. package/dist/util/__tests__/cliClient.test.js +0 -184
  588. package/dist/util/__tests__/cliClient.test.js.map +0 -1
  589. package/dist/util/__tests__/compareDependencyVersions.test.js +0 -426
  590. package/dist/util/__tests__/compareDependencyVersions.test.js.map +0 -1
  591. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js +0 -74
  592. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js.map +0 -1
  593. package/dist/util/__tests__/findNdjsonEntry.test.js +0 -54
  594. package/dist/util/__tests__/findNdjsonEntry.test.js.map +0 -1
  595. package/dist/util/__tests__/getCliVersion.test.js +0 -28
  596. package/dist/util/__tests__/getCliVersion.test.js.map +0 -1
  597. package/dist/util/__tests__/getLocalPackageVersion.test.js +0 -84
  598. package/dist/util/__tests__/getLocalPackageVersion.test.js.map +0 -1
  599. package/dist/util/__tests__/getWorkspace.test.js +0 -37
  600. package/dist/util/__tests__/getWorkspace.test.js.map +0 -1
  601. package/dist/util/__tests__/readPackageJson.test.js +0 -69
  602. package/dist/util/__tests__/readPackageJson.test.js.map +0 -1
  603. package/dist/util/__tests__/warnAboutMissingAppId.test.js +0 -28
  604. package/dist/util/__tests__/warnAboutMissingAppId.test.js.map +0 -1
  605. package/dist/util/packageManager/__tests__/installPackages.test.js +0 -388
  606. package/dist/util/packageManager/__tests__/installPackages.test.js.map +0 -1
  607. package/dist/util/validation/ __tests__/validateDocuments.test.js +0 -274
  608. package/dist/util/validation/ __tests__/validateDocuments.test.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/commands/__tests__/dev.test.ts"],"sourcesContent":["import {readFile, writeFile} from 'node:fs/promises'\nimport {createServer} from 'node:http'\nimport {join} from 'node:path'\n\nimport {runCommand} from '@oclif/test'\nimport {confirm} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\nimport {testExample} from '~test/helpers/testExample.js'\n\nimport {checkRequiredDependencies} from '../../actions/build/checkRequiredDependencies.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js'\nimport {upgradePackages} from '../../util/packageManager/upgradePackages.js'\nimport {DevCommand} from '../dev.js'\n\nvi.mock('../../actions/build/checkRequiredDependencies.js', () => ({\n checkRequiredDependencies: vi.fn().mockResolvedValue({\n installedSanityVersion: '3.0.0',\n }),\n}))\n\nvi.mock('../../util/compareDependencyVersions.js', () => ({\n compareDependencyVersions: vi.fn().mockResolvedValue([]),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n confirm: vi.fn(),\n }\n})\n\nvi.mock('../../../../cli-core/src/util/isInteractive.js', () => ({\n isInteractive: vi.fn().mockReturnValue(true),\n}))\n\nvi.mock('../../util/packageManager/upgradePackages.js')\nvi.mock('../../util/packageManager/packageManagerChoice.js')\n\nconst mockCheckRequiredDependencies = vi.mocked(checkRequiredDependencies)\nconst mockCompareDependencyVersions = vi.mocked(compareDependencyVersions)\nconst mockConfirm = vi.mocked(confirm)\nconst mockUpgradePackages = vi.mocked(upgradePackages)\nconst mockGetPackageManagerChoice = vi.mocked(getPackageManagerChoice)\n\ntype Result = {\n close?: () => Promise<void>\n}\n\ndescribe('#dev', () => {\n afterEach(() => {\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n\n vi.clearAllMocks()\n })\n\n test('help text is correct', async () => {\n const {stdout} = await runCommand(['dev', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"Starts a local development server for Sanity Studio with live reloading\n\n USAGE\n $ sanity dev [--auto-updates] [--host <value>]\n [--load-in-dashboard] [--port <value>]\n\n FLAGS\n --[no-]auto-updates Automatically update Sanity Studio dependencies.\n --host=<value> [default: localhost] The local network interface at\n which to listen.\n --[no-]load-in-dashboard Load the app/studio in the Sanity dashboard.\n --port=<value> [default: 3333] TCP port to start server on.\n\n DESCRIPTION\n Starts a local development server for Sanity Studio with live reloading\n\n EXAMPLES\n $ sanity dev --host=0.0.0.0\n\n $ sanity dev --port=1942\n\n $ sanity dev --load-in-dashboard\n\n \"\n `)\n })\n\n test('shows an error for invalid flags', async () => {\n const {error} = await testCommand(DevCommand, ['--invalid'])\n\n expect(error?.message).toContain('Nonexistent flag: --invalid')\n })\n\n describe('basic-app', () => {\n test('should start the dev server for app', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const {error, result, stderr, stdout} = await testCommand(DevCommand, ['--port', '5333'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Dev server started on port 5333')\n expect(stdout).toContain('View your app in the Sanity dashboard here:')\n expect(stderr).toContain('Checking configuration files')\n await (result as Result).close?.()\n })\n\n test('should warn when --no-load-in-dashboard is used with app', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--no-load-in-dashboard', '--port', '5334'],\n {\n config: {root: cwd},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stderr).toContain('Apps cannot run without the Sanity dashboard')\n expect(stderr).toContain('Starting dev server with the --load-in-dashboard flag set to true')\n expect(stdout).toContain('Dev server started on port 5334')\n await (result as Result).close?.()\n })\n\n test('should automatically change port if conflicted', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n // Create a server on port 5338 to block it\n const server = createServer()\n await new Promise<void>((resolve) => {\n server.listen(5338, 'localhost', resolve)\n })\n\n try {\n const {error, result, stdout} = await testCommand(DevCommand, ['--port', '5338'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n // Should automatically pick a different port\n expect(stdout).toMatch(/Dev server started on port \\d{4}/)\n expect(stdout).not.toContain('Dev server started on port 5338')\n expect(stdout).toContain('View your app in the Sanity dashboard here:')\n await (result as Result).close?.()\n } finally {\n // Clean up the server\n await new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err)\n else resolve()\n })\n })\n }\n })\n\n test('should error when organizationId is missing from config', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n // Modify the config to remove organizationId\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n const modifiedConfig = existingConfig.replace(/organizationId: '[^']*',?/, '')\n await writeFile(configPath, modifiedConfig)\n\n const {error} = await testCommand(DevCommand, ['--port', '5341'], {\n config: {root: cwd},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Apps require an organization ID (orgId)')\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n\n describe('basic-studio', () => {\n test('should start the dev server for studio', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const {error, result, stderr, stdout} = await testCommand(DevCommand, ['--port', '5335'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Sanity Studio using vite@')\n expect(stdout).toContain('ready in')\n expect(stdout).toContain('ms and running at http://localhost:5335')\n expect(stderr).toContain('Checking configuration files')\n await (result as Result).close?.()\n })\n\n test('should start with custom host configuration', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const {error, result, stdout} = await testCommand(\n DevCommand,\n ['--host', '127.0.0.1', '--port', '5336'],\n {\n config: {root: cwd},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('http://127.0.0.1:5336')\n await (result as Result).close?.()\n })\n\n test('should start with load-in-dashboard', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project'\n\n // Need to modify the sanity config to include projectId for this test\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n\n // Add projectId to the config\n const modifiedConfig = existingConfig.replace(\n /projectId: '.*',/,\n `projectId: '${projectId}',`,\n )\n\n await writeFile(configPath, modifiedConfig)\n\n mockApi({\n apiVersion: 'v2025-08-25',\n uri: `/projects/${projectId}`,\n }).reply(200, {organizationId: 'test-org'})\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--load-in-dashboard', '--port', '5340'],\n {\n config: {root: cwd},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Dev server started on port 5340')\n expect(stdout).toContain('View your studio in the Sanity dashboard here:')\n expect(stdout).toContain('https://www.sanity.io/@test-org?dev=http%3A%2F%2Flocalhost%3A5340')\n expect(stderr).toContain('Checking configuration files')\n\n await (result as Result).close?.()\n })\n\n test('should error when projectId is missing with --load-in-dashboard', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n // Modify config to remove projectId\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n const modifiedConfig = existingConfig.replace(/projectId: '[^']*',/, '')\n await writeFile(configPath, modifiedConfig)\n\n const {error} = await testCommand(DevCommand, ['--load-in-dashboard', '--port', '5343'], {\n config: {root: cwd},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Project Id is required to load in dashboard')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should error when API fails to fetch organizationId', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project'\n const configPath = join(cwd, 'sanity.cli.ts')\n const existingConfig = await readFile(configPath, 'utf8')\n const modifiedConfig = existingConfig.replace(\n /projectId: '.*',/,\n `projectId: '${projectId}',`,\n )\n await writeFile(configPath, modifiedConfig)\n\n mockApi({\n apiVersion: 'v2025-08-25',\n uri: `/projects/${projectId}`,\n }).reply(404, {error: 'Project not found'})\n\n const {error} = await testCommand(DevCommand, ['--load-in-dashboard', '--port', '5344'], {\n config: {root: cwd},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Failed to get organization id from project id')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should start dev server successfully when user declines auto-updates', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockCompareDependencyVersions.mockResolvedValueOnce([\n {\n installed: '3.0.0',\n pkg: 'sanity',\n remote: '3.1.0',\n },\n ])\n mockConfirm.mockResolvedValueOnce(false) // User declines upgrade\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--auto-updates', '--port', '5346'],\n {\n config: {root: cwd},\n },\n )\n\n expect(error).toBeUndefined()\n // Check that the server started successfully with auto-updates flag\n expect(stdout).toMatch(/running at http:\\/\\/localhost:5346/)\n expect(stderr).toContain('Checking configuration files')\n await (result as Result).close?.()\n })\n\n test('should handle auto-updates with version mismatch and user accepts upgrade', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockCompareDependencyVersions.mockResolvedValueOnce([\n {\n installed: '3.0.0',\n pkg: 'sanity',\n remote: '3.1.0',\n },\n ])\n mockConfirm.mockResolvedValueOnce(true) // User accepts upgrade\n\n mockUpgradePackages.mockResolvedValueOnce(undefined)\n mockGetPackageManagerChoice.mockResolvedValueOnce({\n chosen: 'npm',\n mostOptimal: 'npm',\n })\n\n const {error, result, stderr, stdout} = await testCommand(\n DevCommand,\n ['--auto-updates', '--port', '5348'],\n {\n config: {root: cwd},\n },\n )\n\n expect(error).toBeUndefined()\n expect(stdout).toMatch(/running at http:\\/\\/localhost:5348/)\n expect(stderr).toContain('Checking configuration files')\n\n expect(mockUpgradePackages).toHaveBeenCalledWith(\n {\n packageManager: 'npm',\n packages: [['sanity', '3.1.0']],\n },\n {output: expect.any(Object), workDir: cwd},\n )\n\n await (result as Result).close?.()\n })\n\n test('should handle invalid Sanity version during auto-updates', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockCheckRequiredDependencies.mockResolvedValueOnce({\n installedSanityVersion: 'invalid-version',\n })\n\n const {error} = await testCommand(DevCommand, ['--auto-updates', '--port', '5347'], {\n config: {root: cwd},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Failed to parse installed Sanity version')\n })\n })\n\n test('should throw an error if port is already in use', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n // Create a server on port 5337 to block it\n const server = createServer()\n await new Promise<void>((resolve) => {\n server.listen(5337, 'localhost', resolve)\n })\n\n try {\n const {error} = await testCommand(DevCommand, ['--port', '5337'], {\n config: {root: cwd},\n })\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Port 5337 is already in use')\n expect(error?.oclif?.exit).toBe(1)\n } finally {\n // Clean up the server\n await new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err)\n else resolve()\n })\n })\n }\n })\n})\n"],"names":["readFile","writeFile","createServer","join","runCommand","confirm","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","testExample","checkRequiredDependencies","compareDependencyVersions","getPackageManagerChoice","upgradePackages","DevCommand","mock","fn","mockResolvedValue","installedSanityVersion","actual","importActual","isInteractive","mockReturnValue","mockCheckRequiredDependencies","mocked","mockCompareDependencyVersions","mockConfirm","mockUpgradePackages","mockGetPackageManagerChoice","pending","pendingMocks","cleanAll","toEqual","clearAllMocks","stdout","toMatchInlineSnapshot","error","message","toContain","cwd","process","result","stderr","config","root","toBeUndefined","close","server","Promise","resolve","listen","toMatch","not","reject","err","configPath","existingConfig","modifiedConfig","replace","toBeDefined","oclif","exit","toBe","projectId","apiVersion","uri","reply","organizationId","mockResolvedValueOnce","installed","pkg","remote","undefined","chosen","mostOptimal","toHaveBeenCalledWith","packageManager","packages","output","any","Object","workDir"],"mappings":"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"}
@@ -1,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,60 +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 mocks = vi.hoisted(()=>({
5
- getCliToken: vi.fn(),
6
- getCliUser: vi.fn().mockResolvedValue({
7
- email: 'test@example.com',
8
- id: 'user-123',
9
- name: 'Test User',
10
- provider: 'saml-123'
11
- }),
12
- login: vi.fn()
13
- }));
14
- vi.mock('@vercel/fs-detectors', ()=>({
15
- detectFrameworkRecord: vi.fn().mockResolvedValue({
16
- name: 'Next.js',
17
- slug: 'nextjs'
18
- }),
19
- LocalFileSystemDetector: vi.fn()
20
- }));
21
- vi.mock('../../../../../cli-core/src/util/isInteractive.js', ()=>({
22
- isInteractive: vi.fn().mockReturnValue(true)
23
- }));
24
- vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
25
- getCliToken: mocks.getCliToken
26
- }));
27
- vi.mock('../../../services/user.js', ()=>({
28
- getCliUser: mocks.getCliUser
29
- }));
30
- vi.mock('../../../actions/auth/login/login.js', ()=>({
31
- login: mocks.login
32
- }));
33
- describe('#init: authentication', ()=>{
34
- afterEach(()=>{
35
- vi.clearAllMocks();
36
- });
37
- test('user is authenticated with valid token', async ()=>{
38
- mocks.getCliToken.mockResolvedValue('test-token');
39
- const { error, stdout } = await testCommand(InitCommand, []);
40
- expect(error).toBeUndefined();
41
- expect(stdout).toContain('You are logged in as test@example.com using SAML');
42
- });
43
- test('throws error if user is authenticated with invalid token in unattended mode', async ()=>{
44
- mocks.getCliUser.mockRejectedValueOnce('Invalid token');
45
- const { error } = await testCommand(InitCommand, [
46
- '--yes',
47
- '--dataset=test',
48
- '--project==test'
49
- ]);
50
- expect(error?.message).toContain('Must be logged in to run this command in unattended mode, run `sanity login`');
51
- });
52
- test('calls login when token invalid and not in unattended mode', async ()=>{
53
- mocks.getCliUser.mockRejectedValueOnce('Invalid token');
54
- const { error } = await testCommand(InitCommand, []);
55
- expect(error).toBe(undefined);
56
- expect(mocks.login).toHaveBeenCalled();
57
- });
58
- });
59
-
60
- //# 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 mocks = vi.hoisted(() => ({\n getCliToken: vi.fn(),\n getCliUser: vi.fn().mockResolvedValue({\n email: 'test@example.com',\n id: 'user-123',\n name: 'Test User',\n provider: 'saml-123',\n }),\n login: vi.fn(),\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('../../../../../cli-core/src/util/isInteractive.js', () => ({\n isInteractive: vi.fn().mockReturnValue(true),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: mocks.getCliToken,\n}))\n\nvi.mock('../../../services/user.js', () => ({\n getCliUser: mocks.getCliUser,\n}))\n\nvi.mock('../../../actions/auth/login/login.js', () => ({\n login: mocks.login,\n}))\n\ndescribe('#init: authentication', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('user is authenticated with valid token', async () => {\n mocks.getCliToken.mockResolvedValue('test-token')\n\n const {error, stdout} = await testCommand(InitCommand, [])\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 mocks.getCliUser.mockRejectedValueOnce('Invalid token')\n\n const {error} = await testCommand(InitCommand, ['--yes', '--dataset=test', '--project==test'])\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 mocks.getCliUser.mockRejectedValueOnce('Invalid token')\n\n const {error} = await testCommand(InitCommand, [])\n\n expect(error).toBe(undefined)\n expect(mocks.login).toHaveBeenCalled()\n })\n})\n"],"names":["testCommand","afterEach","describe","expect","test","vi","InitCommand","mocks","hoisted","getCliToken","fn","getCliUser","mockResolvedValue","email","id","name","provider","login","mock","detectFrameworkRecord","slug","LocalFileSystemDetector","isInteractive","mockReturnValue","clearAllMocks","error","stdout","toBeUndefined","toContain","mockRejectedValueOnce","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,QAAQF,GAAGG,OAAO,CAAC,IAAO,CAAA;QAC9BC,aAAaJ,GAAGK,EAAE;QAClBC,YAAYN,GAAGK,EAAE,GAAGE,iBAAiB,CAAC;YACpCC,OAAO;YACPC,IAAI;YACJC,MAAM;YACNC,UAAU;QACZ;QACAC,OAAOZ,GAAGK,EAAE;IACd,CAAA;AAEAL,GAAGa,IAAI,CAAC,wBAAwB,IAAO,CAAA;QACrCC,uBAAuBd,GAAGK,EAAE,GAAGE,iBAAiB,CAAC;YAC/CG,MAAM;YACNK,MAAM;QACR;QACAC,yBAAyBhB,GAAGK,EAAE;IAChC,CAAA;AAEAL,GAAGa,IAAI,CAAC,qDAAqD,IAAO,CAAA;QAClEI,eAAejB,GAAGK,EAAE,GAAGa,eAAe,CAAC;IACzC,CAAA;AAEAlB,GAAGa,IAAI,CAAC,uDAAuD,IAAO,CAAA;QACpET,aAAaF,MAAME,WAAW;IAChC,CAAA;AAEAJ,GAAGa,IAAI,CAAC,6BAA6B,IAAO,CAAA;QAC1CP,YAAYJ,MAAMI,UAAU;IAC9B,CAAA;AAEAN,GAAGa,IAAI,CAAC,wCAAwC,IAAO,CAAA;QACrDD,OAAOV,MAAMU,KAAK;IACpB,CAAA;AAEAf,SAAS,yBAAyB;IAChCD,UAAU;QACRI,GAAGmB,aAAa;IAClB;IAEApB,KAAK,0CAA0C;QAC7CG,MAAME,WAAW,CAACG,iBAAiB,CAAC;QAEpC,MAAM,EAACa,KAAK,EAAEC,MAAM,EAAC,GAAG,MAAM1B,YAAYM,aAAa,EAAE;QAEzDH,OAAOsB,OAAOE,aAAa;QAC3BxB,OAAOuB,QAAQE,SAAS,CAAC;IAC3B;IAEAxB,KAAK,+EAA+E;QAClFG,MAAMI,UAAU,CAACkB,qBAAqB,CAAC;QAEvC,MAAM,EAACJ,KAAK,EAAC,GAAG,MAAMzB,YAAYM,aAAa;YAAC;YAAS;YAAkB;SAAkB;QAE7FH,OAAOsB,OAAOK,SAASF,SAAS,CAC9B;IAEJ;IAEAxB,KAAK,6DAA6D;QAChEG,MAAMI,UAAU,CAACkB,qBAAqB,CAAC;QAEvC,MAAM,EAACJ,KAAK,EAAC,GAAG,MAAMzB,YAAYM,aAAa,EAAE;QAEjDH,OAAOsB,OAAOM,IAAI,CAACC;QACnB7B,OAAOI,MAAMU,KAAK,EAAEgB,gBAAgB;IACtC;AACF"}
@@ -1,196 +0,0 @@
1
- import * as cliUX from '@sanity/cli-core/ux';
2
- import { testCommand } from '@sanity/cli-test';
3
- import { afterEach, describe, expect, test, vi } from 'vitest';
4
- import { InitCommand } from '../../init';
5
- const mocks = vi.hoisted(()=>({
6
- createDataset: vi.fn(),
7
- createOrganization: vi.fn(),
8
- createProject: vi.fn(),
9
- detectFrameworkRecord: vi.fn(),
10
- getOrganizationChoices: vi.fn(),
11
- getOrganizationsWithAttachGrantInfo: vi.fn(),
12
- input: vi.fn(),
13
- listOrganizations: vi.fn(),
14
- select: vi.fn(),
15
- spinner: 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('../../../../../cli-core/src/util/isInteractive.js', ()=>({
30
- isInteractive: vi.fn().mockReturnValue(true)
31
- }));
32
- vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
33
- getCliToken: vi.fn().mockResolvedValue('test-token')
34
- }));
35
- vi.mock('../../../services/user.js', ()=>({
36
- getCliUser: vi.fn().mockResolvedValue({
37
- email: 'test@example.com',
38
- id: 'user-123',
39
- name: 'Test User',
40
- provider: 'saml-123'
41
- })
42
- }));
43
- vi.mock('../../../actions/organizations/getOrganizationChoices.js', ()=>({
44
- getOrganizationChoices: mocks.getOrganizationChoices
45
- }));
46
- vi.mock('../../../actions/organizations/getOrganizationsWithAttachGrantInfo.js', ()=>({
47
- getOrganizationsWithAttachGrantInfo: mocks.getOrganizationsWithAttachGrantInfo
48
- }));
49
- vi.mock('../../../services/datasets.js', ()=>({
50
- createDataset: mocks.createDataset
51
- }));
52
- vi.mock('../../../services/organizations.js', ()=>({
53
- createOrganization: mocks.createOrganization,
54
- listOrganizations: mocks.listOrganizations
55
- }));
56
- vi.mock('../../../services/projects.js', ()=>({
57
- createProject: mocks.createProject
58
- }));
59
- describe('#init: create new project', ()=>{
60
- afterEach(()=>{
61
- vi.clearAllMocks();
62
- });
63
- test('prompts user to create new organization if they have none', async ()=>{
64
- // Mock no framework detection
65
- mocks.detectFrameworkRecord.mockResolvedValueOnce(null);
66
- // Mock listOrganizations to return empty array (user has no organizations)
67
- mocks.listOrganizations.mockResolvedValueOnce([]);
68
- // Mock input prompt for organization name
69
- mocks.input.mockResolvedValueOnce('My New Organization');
70
- // Mock createOrganization to return the created organization
71
- mocks.createOrganization.mockResolvedValueOnce({
72
- createdByUserId: 'user-123',
73
- defaultRoleName: null,
74
- features: [],
75
- id: 'org-123',
76
- members: [],
77
- name: 'My New Organization',
78
- slug: 'my-new-organization'
79
- });
80
- // Mock createProject to return the created project with correct structure
81
- mocks.createProject.mockResolvedValueOnce({
82
- displayName: 'Test Project',
83
- projectId: 'project-123'
84
- });
85
- // Mock createDataset
86
- mocks.createDataset.mockResolvedValueOnce(undefined);
87
- const spinnerSpy = vi.spyOn(cliUX, 'spinner');
88
- await testCommand(InitCommand, [
89
- '--create-project=Test Project',
90
- '--dataset=production',
91
- '--output-path=./test-project'
92
- ]);
93
- // Verify listOrganizations was called
94
- expect(mocks.listOrganizations).toHaveBeenCalled();
95
- // Verify input prompt was called with correct parameters
96
- expect(mocks.input).toHaveBeenCalledWith(expect.objectContaining({
97
- default: 'Test User',
98
- message: 'Organization name:'
99
- }));
100
- // Verify createOrganization was called with the input value
101
- expect(mocks.createOrganization).toHaveBeenCalledWith('My New Organization');
102
- // Verify createProject was called
103
- expect(mocks.createProject).toHaveBeenCalledWith(expect.objectContaining({
104
- displayName: 'Test Project',
105
- organizationId: 'org-123'
106
- }));
107
- // Verify createDataset was called
108
- expect(mocks.createDataset).toHaveBeenCalledWith(expect.objectContaining({
109
- aclMode: undefined,
110
- datasetName: 'production',
111
- projectId: 'project-123'
112
- }));
113
- // Verify spinner was called with correct text
114
- expect(spinnerSpy).toHaveBeenCalledWith('Creating organization');
115
- expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset');
116
- });
117
- test('prompts user to select then create a new organization', async ()=>{
118
- // Mock no framework detection
119
- mocks.detectFrameworkRecord.mockResolvedValueOnce(null);
120
- // Mock listOrganizations to return existing organizations
121
- mocks.listOrganizations.mockResolvedValueOnce([
122
- {
123
- id: 'existing-org-123',
124
- name: 'Existing Organization',
125
- slug: 'existing-organization'
126
- }
127
- ]);
128
- // Mock getOrganizationsWithAttachGrantInfo to return organizations with attach grant
129
- mocks.getOrganizationsWithAttachGrantInfo.mockResolvedValueOnce([
130
- {
131
- hasAttachGrant: true,
132
- organization: {
133
- id: 'existing-org-123',
134
- name: 'Existing Organization',
135
- slug: 'existing-organization'
136
- }
137
- }
138
- ]);
139
- // Mock getOrganizationChoices to return choices including create new option
140
- mocks.getOrganizationChoices.mockReturnValueOnce([
141
- {
142
- name: 'Existing Organization [existing-org-123]',
143
- value: 'existing-org-123'
144
- },
145
- {
146
- name: 'Create new organization',
147
- value: '-new-'
148
- }
149
- ]);
150
- // Mock select prompt - user chooses to create new organization
151
- mocks.select.mockResolvedValueOnce('-new-');
152
- // Mock input prompt for new organization name
153
- mocks.input.mockResolvedValueOnce('Brand New Organization');
154
- // Mock createOrganization to return the newly created organization
155
- mocks.createOrganization.mockResolvedValueOnce({
156
- createdByUserId: 'user-123',
157
- defaultRoleName: null,
158
- features: [],
159
- id: 'new-org-456',
160
- members: [],
161
- name: 'Brand New Organization',
162
- slug: 'brand-new-organization'
163
- });
164
- // Mock createProject to return the created project
165
- mocks.createProject.mockResolvedValueOnce({
166
- displayName: 'Test Project',
167
- projectId: 'project-123'
168
- });
169
- // Mock createDataset
170
- mocks.createDataset.mockResolvedValueOnce(undefined);
171
- const spinnerSpy = vi.spyOn(cliUX, 'spinner');
172
- await testCommand(InitCommand, [
173
- '--create-project=Test Project',
174
- '--dataset=production',
175
- '--output-path=./test-project'
176
- ]);
177
- // Verify createOrganization was called with the input value
178
- expect(mocks.createOrganization).toHaveBeenCalledWith('Brand New Organization');
179
- // Verify createProject was called
180
- expect(mocks.createProject).toHaveBeenCalledWith(expect.objectContaining({
181
- displayName: 'Test Project',
182
- organizationId: 'new-org-456'
183
- }));
184
- // Verify createDataset was called
185
- expect(mocks.createDataset).toHaveBeenCalledWith(expect.objectContaining({
186
- aclMode: undefined,
187
- datasetName: 'production',
188
- projectId: 'project-123'
189
- }));
190
- // Verify spinner was called with correct text
191
- expect(spinnerSpy).toHaveBeenCalledWith('Creating organization');
192
- expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset');
193
- });
194
- });
195
-
196
- //# 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 {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {InitCommand} from '../../init'\n\nconst mocks = vi.hoisted(() => ({\n createDataset: vi.fn(),\n createOrganization: vi.fn(),\n createProject: vi.fn(),\n detectFrameworkRecord: vi.fn(),\n getOrganizationChoices: vi.fn(),\n getOrganizationsWithAttachGrantInfo: vi.fn(),\n input: vi.fn(),\n listOrganizations: vi.fn(),\n select: vi.fn(),\n spinner: 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 // spinner: mocks.spinner,\n }\n})\n\nvi.mock('../../../../../cli-core/src/util/isInteractive.js', () => ({\n isInteractive: vi.fn().mockReturnValue(true),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nvi.mock('../../../services/user.js', () => ({\n getCliUser: vi.fn().mockResolvedValue({\n email: 'test@example.com',\n id: 'user-123',\n name: 'Test User',\n provider: 'saml-123',\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\nvi.mock('../../../services/datasets.js', () => ({\n createDataset: mocks.createDataset,\n}))\n\nvi.mock('../../../services/organizations.js', () => ({\n createOrganization: mocks.createOrganization,\n listOrganizations: mocks.listOrganizations,\n}))\n\nvi.mock('../../../services/projects.js', () => ({\n createProject: mocks.createProject,\n}))\n\ndescribe('#init: create new project', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('prompts user to create new organization if they have none', async () => {\n // Mock no framework detection\n mocks.detectFrameworkRecord.mockResolvedValueOnce(null)\n\n // Mock listOrganizations to return empty array (user has no organizations)\n mocks.listOrganizations.mockResolvedValueOnce([])\n\n // Mock input prompt for organization name\n mocks.input.mockResolvedValueOnce('My New Organization')\n\n // Mock createOrganization to return the created organization\n mocks.createOrganization.mockResolvedValueOnce({\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 // Mock createProject to return the created project with correct structure\n mocks.createProject.mockResolvedValueOnce({\n displayName: 'Test Project',\n projectId: 'project-123',\n })\n\n // Mock createDataset\n mocks.createDataset.mockResolvedValueOnce(undefined)\n\n const spinnerSpy = vi.spyOn(cliUX, 'spinner')\n\n await testCommand(InitCommand, [\n '--create-project=Test Project',\n '--dataset=production',\n '--output-path=./test-project',\n ])\n\n // Verify listOrganizations was called\n expect(mocks.listOrganizations).toHaveBeenCalled()\n\n // Verify input prompt was called with correct parameters\n expect(mocks.input).toHaveBeenCalledWith(\n expect.objectContaining({\n default: 'Test User',\n message: 'Organization name:',\n }),\n )\n\n // Verify createOrganization was called with the input value\n expect(mocks.createOrganization).toHaveBeenCalledWith('My New Organization')\n\n // Verify createProject was called\n expect(mocks.createProject).toHaveBeenCalledWith(\n expect.objectContaining({\n displayName: 'Test Project',\n organizationId: 'org-123',\n }),\n )\n\n // Verify createDataset was called\n expect(mocks.createDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n aclMode: undefined,\n datasetName: 'production',\n projectId: 'project-123',\n }),\n )\n\n // Verify spinner was called with correct text\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 // Mock no framework detection\n mocks.detectFrameworkRecord.mockResolvedValueOnce(null)\n\n // Mock listOrganizations to return existing organizations\n mocks.listOrganizations.mockResolvedValueOnce([\n {\n id: 'existing-org-123',\n name: 'Existing Organization',\n slug: 'existing-organization',\n },\n ])\n\n // Mock getOrganizationsWithAttachGrantInfo to return organizations with attach grant\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 // Mock getOrganizationChoices to return choices including create new option\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 // Mock select prompt - user chooses to create new organization\n mocks.select.mockResolvedValueOnce('-new-')\n\n // Mock input prompt for new organization name\n mocks.input.mockResolvedValueOnce('Brand New Organization')\n\n // Mock createOrganization to return the newly created organization\n mocks.createOrganization.mockResolvedValueOnce({\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 // Mock createProject to return the created project\n mocks.createProject.mockResolvedValueOnce({\n displayName: 'Test Project',\n projectId: 'project-123',\n })\n\n // Mock createDataset\n mocks.createDataset.mockResolvedValueOnce(undefined)\n\n const spinnerSpy = vi.spyOn(cliUX, 'spinner')\n\n await testCommand(InitCommand, [\n '--create-project=Test Project',\n '--dataset=production',\n '--output-path=./test-project',\n ])\n\n // Verify createOrganization was called with the input value\n expect(mocks.createOrganization).toHaveBeenCalledWith('Brand New Organization')\n\n // Verify createProject was called\n expect(mocks.createProject).toHaveBeenCalledWith(\n expect.objectContaining({\n displayName: 'Test Project',\n organizationId: 'new-org-456',\n }),\n )\n\n // Verify createDataset was called\n expect(mocks.createDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n aclMode: undefined,\n datasetName: 'production',\n projectId: 'project-123',\n }),\n )\n\n // Verify spinner was called with correct text\n expect(spinnerSpy).toHaveBeenCalledWith('Creating organization')\n expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset')\n })\n})\n"],"names":["cliUX","testCommand","afterEach","describe","expect","test","vi","InitCommand","mocks","hoisted","createDataset","fn","createOrganization","createProject","detectFrameworkRecord","getOrganizationChoices","getOrganizationsWithAttachGrantInfo","input","listOrganizations","select","spinner","mock","LocalFileSystemDetector","actual","importActual","isInteractive","mockReturnValue","getCliToken","mockResolvedValue","getCliUser","email","id","name","provider","clearAllMocks","mockResolvedValueOnce","createdByUserId","defaultRoleName","features","members","slug","displayName","projectId","undefined","spinnerSpy","spyOn","toHaveBeenCalled","toHaveBeenCalledWith","objectContaining","default","message","organizationId","aclMode","datasetName","hasAttachGrant","organization","mockReturnValueOnce","value"],"mappings":"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"}