@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 +1 @@
1
- {"version":3,"sources":["../../src/commands/init.ts"],"sourcesContent":["// @Todo will remove by time migration of this command is complete\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {Args, Command, Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {getCliToken, SanityCommand, type SanityOrgUser, subdebug} from '@sanity/cli-core'\nimport {confirm, input, logSymbols, select, spinner} from '@sanity/cli-core/ux'\nimport {type DatasetAclMode, isHttpError} from '@sanity/client'\nimport {type Framework, frameworks} from '@vercel/frameworks'\nimport {detectFrameworkRecord, LocalFileSystemDetector} from '@vercel/fs-detectors'\n\nimport {getProviderName} from '../actions/auth/getProviderName.js'\nimport {login} from '../actions/auth/login/login.js'\nimport {determineAppTemplate} from '../actions/init/determineAppTemplate.js'\nimport {\n checkIsRemoteTemplate,\n getGitHubRepoInfo,\n type RepoInfo,\n} from '../actions/init/remoteTemplate.js'\nimport {getOrganizationChoices} from '../actions/organizations/getOrganizationChoices.js'\nimport {getOrganizationsWithAttachGrantInfo} from '../actions/organizations/getOrganizationsWithAttachGrantInfo.js'\nimport {createDataset} from '../services/datasets.js'\nimport {\n createOrganization,\n listOrganizations,\n type OrganizationCreateResponse,\n type ProjectOrganization,\n} from '../services/organizations.js'\nimport {getPlanId, getPlanIdFromCoupon} from '../services/plans.js'\nimport {createProject} from '../services/projects.js'\nimport {getCliUser} from '../services/user.js'\n\nconst debug = subdebug('init')\n\nexport class InitCommand extends SanityCommand<typeof InitCommand> {\n static override args = {type: Args.string({hidden: true})}\n static override description = 'Initialize a new Sanity Studio, project and/or app'\n static override enableJsonFlag = true\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n {\n command: '<%= config.bin %> <%= command.id %> --dataset-default',\n description: 'Initialize a new project with a public dataset named \"production\"',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --project abc123 --dataset production --output-path ~/myproj',\n description: 'Initialize a project with the given project ID and dataset to the given path',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --project abc123 --dataset staging --template moviedb --output-path .',\n description:\n 'Initialize a project with the given project ID and dataset using the moviedb template to the given path',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --create-project \"Movies Unlimited\" --dataset moviedb --visibility private --template moviedb --output-path /Users/espenh/movies-unlimited',\n description: 'Create a brand new project with name \"Movies Unlimited\"',\n },\n ] satisfies Array<Command.Example>\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Enable auto updates of studio versions',\n exclusive: ['bare'],\n }),\n bare: Flags.boolean({\n description:\n 'Skip the Studio initialization and only print the selected project ID and dataset name to stdout',\n }),\n coupon: Flags.string({\n description:\n 'Optionally select a coupon for a new project (cannot be used with --project-plan)',\n exclusive: ['project-plan'],\n helpValue: '<code>',\n }),\n 'create-project': Flags.string({\n description: 'Create a new project with the given name',\n helpValue: '<name>',\n }),\n dataset: Flags.string({\n description: 'Dataset name for the studio',\n exclusive: ['dataset-default'],\n helpValue: '<name>',\n }),\n 'dataset-default': Flags.boolean({\n description: 'Set up a project with a public dataset named \"production\"',\n }),\n env: Flags.string({\n description: 'Write environment variables to file',\n exclusive: ['bare'],\n helpValue: '<filename>',\n parse: async (input) => {\n if (!input.startsWith('.env')) {\n throw new Error('Env filename (`--env`) must start with `.env`')\n }\n return input\n },\n }),\n 'from-create': Flags.boolean({\n description: 'Internal flag to indicate that the command is run from create-sanity',\n hidden: true,\n }),\n git: Flags.string({\n default: undefined,\n description: 'Specify a commit message for initial commit, or disable git init',\n exclusive: ['bare'],\n // oclif doesn't indent correctly with custom help labels, thus leading space :/\n helpLabel: ' --[no-]git',\n helpValue: '<message>',\n }),\n mcp: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Enable AI editor integration (MCP) setup',\n }),\n 'nextjs-add-config-files': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Add config files to Next.js project',\n helpGroup: 'Next.js',\n }),\n 'nextjs-append-env': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Append project ID and dataset to .env file',\n helpGroup: 'Next.js',\n }),\n 'nextjs-embed-studio': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Embed the Studio in Next.js application',\n helpGroup: 'Next.js',\n }),\n // oclif doesn't support a boolean/string flag combination, but listing both a\n // `--git` and a `--no-git` flag in help breaks conventions, so we hide this one,\n // but use it to \"combine\" the two in the actual logic.\n 'no-git': Flags.boolean({\n description: 'Disable git initialization',\n exclusive: ['git'],\n hidden: true,\n }),\n organization: Flags.string({\n description: 'Organization ID to use for the project',\n helpValue: '<id>',\n }),\n 'output-path': Flags.string({\n description: 'Path to write studio project to',\n exclusive: ['bare'],\n helpValue: '<path>',\n }),\n 'overwrite-files': Flags.boolean({\n default: false,\n description: 'Overwrite existing files',\n }),\n 'package-manager': Flags.string({\n description: 'Specify which package manager to use [allowed: npm, yarn, pnpm]',\n exclusive: ['bare'],\n helpValue: '<manager>',\n options: ['npm', 'yarn', 'pnpm'],\n }),\n project: Flags.string({\n aliases: ['project-id'],\n description: 'Project ID to use for the studio',\n exclusive: ['create-project'],\n helpValue: '<id>',\n }),\n 'project-plan': Flags.string({\n description: 'Optionally select a plan for a new project',\n helpValue: '<name>',\n }),\n provider: Flags.string({\n description: 'Login provider to use',\n helpValue: '<provider>',\n }),\n reconfigure: Flags.boolean({\n deprecated: {message: 'This flag is no longer supported', version: '3.0.0'},\n description: 'Reconfigure an existing project',\n hidden: true,\n }),\n template: Flags.string({\n default: 'clean',\n description: 'Project template to use [default: \"clean\"]',\n exclusive: ['bare'],\n helpValue: '<template>',\n }),\n // Porting over a beta flag\n // Oclif doesn't seem to support something in beta so hiding for now\n 'template-token': Flags.string({\n description: 'Used for accessing private GitHub repo templates',\n hidden: true,\n }),\n typescript: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Enable TypeScript support',\n exclusive: ['bare'],\n }),\n visibility: Flags.string({\n description: 'Visibility mode for dataset',\n helpValue: '<mode>',\n options: ['public', 'private'],\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Unattended mode, answers \"yes\" to any \"yes/no\" prompt and otherwise uses defaults',\n }),\n } satisfies FlagInput\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(InitCommand)\n const createProjectName = this.flags['create-project']\n // For backwards \"compatibility\" - we used to allow `sanity init plugin`,\n // and no longer do - but instead of printing an error about an unknown\n // _command_, we want to acknowledge that the user is trying to do something\n // that no longer exists but might have at some point in the past.\n if (args.type) {\n this.error(\n args.type === 'plugin'\n ? 'Initializing plugins through the CLI is no longer supported'\n : `Unknown init type \"${args.type}\"`,\n {exit: 1},\n )\n }\n\n // @todo\n //const trace = telemetry.trace(CLIInitStepCompleted)\n\n // Slightly more helpful message for removed flags rather than just saying the flag\n // does not exist.\n if (this.flags.reconfigure) {\n this.error('--reconfigure is deprecated - manual configuration is now required', {exit: 1})\n }\n\n // Oclif doesn't support custom exclusive error messaging\n if (this.flags.project && this.flags.organization) {\n throw new Error(\n 'You have specified both a project and an organization. To move a project to an organization please visit https://www.sanity.io/manage',\n )\n }\n\n const defaultConfig = this.flags['dataset-default']\n let _showDefaultConfigPrompt = !defaultConfig\n if (\n this.flags.dataset ||\n this.flags.visibility ||\n this.flags['dataset-default'] ||\n this.isUnattended()\n ) {\n _showDefaultConfigPrompt = false\n }\n\n const detectedFramework: Framework | null = await detectFrameworkRecord({\n frameworkList: frameworks as readonly Framework[],\n fs: new LocalFileSystemDetector(process.cwd()),\n })\n const isNextJs = detectedFramework?.slug === 'nextjs'\n\n let remoteTemplateInfo: RepoInfo | undefined\n if (flags.template && checkIsRemoteTemplate(flags.template)) {\n remoteTemplateInfo = await getGitHubRepoInfo(flags.template, flags['template-token'])\n }\n\n if (detectedFramework && detectedFramework.slug !== 'sanity' && remoteTemplateInfo) {\n this.error(\n `A remote template cannot be used with a detected framework. Detected: ${detectedFramework.name}`,\n {exit: 1},\n )\n }\n\n // Checks flags are present when in unattended mode\n if (this.isUnattended()) {\n this.checkFlagsInUnattendedMode({createProjectName, isNextJs})\n }\n\n // @todo\n // trace.start()\n // trace.log({\n // step: 'start',\n // flags: {\n // defaultConfig,\n // unattended,\n // plan: intendedPlan,\n // coupon: intendedCoupon,\n // reconfigure,\n // git: commitMessage,\n // bare: bareOutput,\n // env,\n // },\n // })\n\n // Plan can be set through `--project-plan`, or implied through `--coupon`.\n // As coupons can expire and project plans might change/be removed, we need to\n // verify that the passed flags are valid. The complexity of this is hidden in the\n // below plan methods, eventually returning a plan ID or undefined if we are told to\n // use the default plan.\n\n const planId = await this.getPlan()\n\n let envFilenameDefault = '.env'\n if (detectedFramework && detectedFramework.slug === 'nextjs') {\n envFilenameDefault = '.env.local'\n }\n const _envFilename = typeof flags.env === 'string' ? flags.env : envFilenameDefault\n\n // If the user isn't already autenticated, make it so\n const {user} = await this.ensureAuthenticated()\n\n // skip project / dataset prompting\n const template = this.flags.template\n const isAppTemplate = template ? determineAppTemplate(template) : false // Default to false\n if (!isAppTemplate) {\n this.log(`${logSymbols.success} Fetching existing projects`)\n this.log('')\n }\n\n const _newProjectId =\n createProjectName && (await this.createProject({createProjectName, planId, user}))\n }\n\n private checkFlagsInUnattendedMode({\n createProjectName,\n isNextJs,\n }: {\n createProjectName: string | undefined\n isNextJs: boolean\n }) {\n debug('Unattended mode, validating required options')\n\n if (!this.flags['dataset']) {\n throw new Error(`\\`--dataset\\` must be specified in unattended mode`)\n }\n\n // output-path is required in unattended mode when not using nextjs\n if (!isNextJs && !this.flags['output-path']) {\n throw new Error(`\\`--output-path\\` must be specified in unattended mode`)\n }\n\n if (!this.flags.project && !createProjectName) {\n throw new Error(\n '`--project <id>` or `--create-project <name>` must be specified in unattended mode',\n )\n }\n\n if (createProjectName && !this.flags.organization) {\n throw new Error(\n '--create-project is not supported in unattended mode without an organization, please specify an organization with `--organization <id>`',\n )\n }\n }\n\n private async createProject({\n createProjectName,\n planId,\n user,\n }: {\n createProjectName: string\n planId: string | undefined\n user: SanityOrgUser\n }): Promise<string> {\n debug('--create-project specified, creating a new project')\n\n let orgForCreateProjectFlag = this.flags.organization\n\n if (!orgForCreateProjectFlag) {\n debug('no organization specified, selecting one')\n const organizations = await listOrganizations()\n orgForCreateProjectFlag = await this.promptUserForOrganization({organizations, user})\n }\n\n debug('creating a new project')\n const createdProject = await createProject({\n displayName: createProjectName.trim(),\n metadata: {coupon: this.flags.coupon},\n organizationId: orgForCreateProjectFlag,\n subscription: planId ? {planId} : undefined,\n })\n\n debug('Project with ID %s created', createdProject.projectId)\n if (this.flags.dataset) {\n debug('--dataset specified, creating dataset (%s)', this.flags.dataset)\n const spin = spinner('Creating dataset').start()\n await createDataset({\n aclMode: this.flags.visibility as DatasetAclMode,\n datasetName: this.flags.dataset,\n projectId: createdProject.projectId,\n })\n spin.succeed()\n }\n\n return createdProject.projectId\n }\n\n // @todo do we actually need to be authenticated for init? check flags and determine.\n private async ensureAuthenticated(): Promise<{user: SanityOrgUser}> {\n let isAuthenticated = (await getCliToken()) !== undefined\n debug(isAuthenticated ? 'User already has a token' : 'User has no token')\n\n let user: SanityOrgUser | undefined\n if (isAuthenticated) {\n // It _appears_ we are authenticated, but the token might be invalid/expired,\n // so we need to verify that we can actually make an authenticated request.\n try {\n user = await getCliUser()\n } catch {\n // assume that any error means that the token is invalid\n isAuthenticated = false\n }\n }\n\n if (isAuthenticated) {\n // @todo telemetry\n // trace.log({ step: 'login', alreadyLoggedIn: true })\n } else {\n if (this.isUnattended()) {\n throw new Error(\n 'Must be logged in to run this command in unattended mode, run `sanity login`',\n )\n }\n\n // @todo telemetry\n //trace.log({step: 'login'})\n\n // @todo trigger login action, then get and return user info\n await login({output: this.output})\n }\n\n user = await getCliUser()\n\n this.log(\n `${logSymbols.success} You are logged in as ${user.email} using ${getProviderName(user.provider)}`,\n )\n return {user}\n }\n\n private async getPlan(): Promise<string | undefined> {\n const intendedPlan = this.flags['project-plan']\n const intendedCoupon = this.flags.coupon\n\n if (intendedCoupon) {\n return this.verifyCoupon(intendedCoupon)\n } else if (intendedPlan) {\n return this.verifyPlan(intendedPlan)\n } else {\n return undefined\n }\n }\n\n private async promptUserForNewOrganization(\n user: SanityOrgUser,\n ): Promise<OrganizationCreateResponse> {\n const name = await input({\n default: user ? user.name : undefined,\n message: 'Organization name:',\n validate(input) {\n if (input.length === 0) {\n return 'Organization name cannot be empty'\n } else if (input.length > 100) {\n return 'Organization name cannot be longer than 100 characters'\n }\n return true\n },\n })\n\n const spin = spinner('Creating organization').start()\n const organization = await createOrganization(name)\n spin.succeed()\n\n return organization\n }\n\n private async promptUserForOrganization({\n organizations,\n user,\n }: {\n organizations: ProjectOrganization[]\n user: SanityOrgUser\n }) {\n // If the user has no organizations, prompt them to create one with the same name as\n // their user, but allow them to customize it if they want\n if (organizations.length === 0) {\n const newOrganization = await this.promptUserForNewOrganization(user)\n return newOrganization.id\n }\n\n // If the user has organizations, let them choose from them, but also allow them to\n // create a new one in case they do not have access to any of them, or they want to\n // create a personal/other organization.\n debug(`User has ${organizations.length} organization(s), checking attach access`)\n const withGrantInfo = await getOrganizationsWithAttachGrantInfo(organizations)\n const withAttach = withGrantInfo.filter(({hasAttachGrant}) => hasAttachGrant)\n\n debug('User has attach access to %d organizations.', withAttach.length)\n const organizationChoices = getOrganizationChoices(withAttach)\n\n // If the user only has a single organization (and they have attach access to it),\n // we'll default to that one. Otherwise, we'll default to the organization with the\n // same name as the user if it exists.\n const defaultOrganizationId =\n withAttach.length === 1\n ? withAttach[0].organization.id\n : organizations.find((org) => org.name === user?.name)?.id\n\n const chosenOrg = await select({\n choices: organizationChoices,\n default: defaultOrganizationId || undefined,\n message: 'Select organization:',\n })\n\n if (chosenOrg === '-new-') {\n const newOrganization = await this.promptUserForNewOrganization(user)\n return newOrganization.id\n }\n\n return chosenOrg || undefined\n }\n\n private async verifyCoupon(intendedCoupon: string): Promise<string | undefined> {\n try {\n const planId = await getPlanIdFromCoupon(intendedCoupon)\n this.log(`Coupon \"${intendedCoupon}\" validated!\\n`)\n return planId\n } catch (err: unknown) {\n if (!isHttpError(err) || err.statusCode !== 404) {\n const message = err instanceof Error ? err.message : `${err}`\n throw new Error(`Unable to validate coupon, please try again later:\\n\\n${message}`)\n }\n\n const useDefaultPlan =\n this.isUnattended() ||\n (await confirm({\n default: true,\n message: `Coupon \"${intendedCoupon}\" is not available, use default plan instead?`,\n }))\n\n if (this.isUnattended()) {\n this.warn(`Coupon \"${intendedCoupon}\" is not available - using default plan`)\n }\n\n // @todo\n // trace.log({\n // step: 'useDefaultPlanCoupon',\n // selectedOption: useDefaultPlan ? 'yes' : 'no',\n // coupon: intendedCoupon,\n // })\n\n if (useDefaultPlan) {\n this.log('Using default plan.')\n } else {\n throw new Error(`Coupon \"${intendedCoupon}\" does not exist`)\n }\n }\n }\n\n private async verifyPlan(intendedPlan: string): Promise<string | undefined> {\n try {\n const planId = await getPlanId(intendedPlan)\n return planId\n } catch (err: unknown) {\n if (!isHttpError(err) || err.statusCode !== 404) {\n const message = err instanceof Error ? err.message : `${err}`\n throw new Error(`Unable to validate plan, please try again later:\\n\\n${message}`, {\n cause: err,\n })\n }\n\n const useDefaultPlan =\n this.isUnattended() ||\n (await confirm({\n default: true,\n message: `Project plan \"${intendedPlan}\" does not exist, use default plan instead?`,\n }))\n\n if (this.isUnattended()) {\n this.warn(`Project plan \"${intendedPlan}\" does not exist - using default plan`)\n }\n\n // @todo\n // trace.log({\n // step: 'useDefaultPlanId',\n // selectedOption: useDefaultPlan ? 'yes' : 'no',\n // planId: intendedPlan,\n // })\n\n if (useDefaultPlan) {\n this.log('Using default plan.')\n } else {\n throw new Error(`Plan id \"${intendedPlan}\" does not exist`)\n }\n }\n }\n}\n"],"names":["Args","Flags","getCliToken","SanityCommand","subdebug","confirm","input","logSymbols","select","spinner","isHttpError","frameworks","detectFrameworkRecord","LocalFileSystemDetector","getProviderName","login","determineAppTemplate","checkIsRemoteTemplate","getGitHubRepoInfo","getOrganizationChoices","getOrganizationsWithAttachGrantInfo","createDataset","createOrganization","listOrganizations","getPlanId","getPlanIdFromCoupon","createProject","getCliUser","debug","InitCommand","args","type","string","hidden","description","enableJsonFlag","examples","command","flags","boolean","allowNo","default","exclusive","bare","coupon","helpValue","dataset","env","parse","startsWith","Error","git","undefined","helpLabel","mcp","helpGroup","organization","options","project","aliases","provider","reconfigure","deprecated","message","version","template","typescript","visibility","yes","char","run","createProjectName","error","exit","defaultConfig","_showDefaultConfigPrompt","isUnattended","detectedFramework","frameworkList","fs","process","cwd","isNextJs","slug","remoteTemplateInfo","name","checkFlagsInUnattendedMode","planId","getPlan","envFilenameDefault","_envFilename","user","ensureAuthenticated","isAppTemplate","log","success","_newProjectId","orgForCreateProjectFlag","organizations","promptUserForOrganization","createdProject","displayName","trim","metadata","organizationId","subscription","projectId","spin","start","aclMode","datasetName","succeed","isAuthenticated","output","email","intendedPlan","intendedCoupon","verifyCoupon","verifyPlan","promptUserForNewOrganization","validate","length","newOrganization","id","withGrantInfo","withAttach","filter","hasAttachGrant","organizationChoices","defaultOrganizationId","find","org","chosenOrg","choices","err","statusCode","useDefaultPlan","warn","cause"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/commands/init.ts"],"sourcesContent":["// @Todo will remove by time migration of this command is complete\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {Args, Command, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {getCliToken, SanityCommand, type SanityOrgUser, subdebug} from '@sanity/cli-core'\nimport {chalk, confirm, input, logSymbols, select, Separator, spinner} from '@sanity/cli-core/ux'\nimport {type DatasetAclMode, isHttpError} from '@sanity/client'\nimport {type Framework, frameworks} from '@vercel/frameworks'\nimport {detectFrameworkRecord, LocalFileSystemDetector} from '@vercel/fs-detectors'\n\nimport {getProviderName} from '../actions/auth/getProviderName.js'\nimport {login} from '../actions/auth/login/login.js'\nimport {createDataset} from '../actions/dataset/create.js'\nimport {determineAppTemplate} from '../actions/init/determineAppTemplate.js'\nimport {\n checkIsRemoteTemplate,\n getGitHubRepoInfo,\n type RepoInfo,\n} from '../actions/init/remoteTemplate.js'\nimport {getOrganizationChoices} from '../actions/organizations/getOrganizationChoices.js'\nimport {getOrganizationsWithAttachGrantInfo} from '../actions/organizations/getOrganizationsWithAttachGrantInfo.js'\nimport {hasProjectAttachGrant} from '../actions/organizations/hasProjectAttachGrant.js'\nimport {promptForDatasetName} from '../prompts/promptForDatasetName.js'\nimport {createDataset as createDatasetService, listDatasets} from '../services/datasets.js'\nimport {getProjectFeatures} from '../services/getProjectFeatures.js'\nimport {\n createOrganization,\n listOrganizations,\n type OrganizationCreateResponse,\n type ProjectOrganization,\n} from '../services/organizations.js'\nimport {getPlanId, getPlanIdFromCoupon} from '../services/plans.js'\nimport {createProject, listProjects} from '../services/projects.js'\nimport {getCliUser} from '../services/user.js'\n\nconst debug = subdebug('init')\n\nexport class InitCommand extends SanityCommand<typeof InitCommand> {\n static override args = {type: Args.string({hidden: true})}\n static override description = 'Initialize a new Sanity Studio, project and/or app'\n static override enableJsonFlag = true\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n {\n command: '<%= config.bin %> <%= command.id %> --dataset-default',\n description: 'Initialize a new project with a public dataset named \"production\"',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --project abc123 --dataset production --output-path ~/myproj',\n description: 'Initialize a project with the given project ID and dataset to the given path',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --project abc123 --dataset staging --template moviedb --output-path .',\n description:\n 'Initialize a project with the given project ID and dataset using the moviedb template to the given path',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --create-project \"Movies Unlimited\" --dataset moviedb --visibility private --template moviedb --output-path /Users/espenh/movies-unlimited',\n description: 'Create a brand new project with name \"Movies Unlimited\"',\n },\n ] satisfies Array<Command.Example>\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Enable auto updates of studio versions',\n exclusive: ['bare'],\n }),\n bare: Flags.boolean({\n description:\n 'Skip the Studio initialization and only print the selected project ID and dataset name to stdout',\n }),\n coupon: Flags.string({\n description:\n 'Optionally select a coupon for a new project (cannot be used with --project-plan)',\n exclusive: ['project-plan'],\n helpValue: '<code>',\n }),\n 'create-project': Flags.string({\n description: 'Create a new project with the given name',\n helpValue: '<name>',\n }),\n dataset: Flags.string({\n description: 'Dataset name for the studio',\n exclusive: ['dataset-default'],\n helpValue: '<name>',\n }),\n 'dataset-default': Flags.boolean({\n description: 'Set up a project with a public dataset named \"production\"',\n }),\n env: Flags.string({\n description: 'Write environment variables to file',\n exclusive: ['bare'],\n helpValue: '<filename>',\n parse: async (input) => {\n if (!input.startsWith('.env')) {\n throw new CLIError('Env filename (`--env`) must start with `.env`')\n }\n return input\n },\n }),\n 'from-create': Flags.boolean({\n description: 'Internal flag to indicate that the command is run from create-sanity',\n hidden: true,\n }),\n git: Flags.string({\n default: undefined,\n description: 'Specify a commit message for initial commit, or disable git init',\n exclusive: ['bare'],\n // oclif doesn't indent correctly with custom help labels, thus leading space :/\n helpLabel: ' --[no-]git',\n helpValue: '<message>',\n }),\n mcp: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Enable AI editor integration (MCP) setup',\n }),\n 'nextjs-add-config-files': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Add config files to Next.js project',\n helpGroup: 'Next.js',\n }),\n 'nextjs-append-env': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Append project ID and dataset to .env file',\n helpGroup: 'Next.js',\n }),\n 'nextjs-embed-studio': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Embed the Studio in Next.js application',\n helpGroup: 'Next.js',\n }),\n // oclif doesn't support a boolean/string flag combination, but listing both a\n // `--git` and a `--no-git` flag in help breaks conventions, so we hide this one,\n // but use it to \"combine\" the two in the actual logic.\n 'no-git': Flags.boolean({\n description: 'Disable git initialization',\n exclusive: ['git'],\n hidden: true,\n }),\n organization: Flags.string({\n description: 'Organization ID to use for the project',\n helpValue: '<id>',\n }),\n 'output-path': Flags.string({\n description: 'Path to write studio project to',\n exclusive: ['bare'],\n helpValue: '<path>',\n }),\n 'overwrite-files': Flags.boolean({\n default: false,\n description: 'Overwrite existing files',\n }),\n 'package-manager': Flags.string({\n description: 'Specify which package manager to use [allowed: npm, yarn, pnpm]',\n exclusive: ['bare'],\n helpValue: '<manager>',\n options: ['npm', 'yarn', 'pnpm'],\n }),\n project: Flags.string({\n aliases: ['project-id'],\n description: 'Project ID to use for the studio',\n exclusive: ['create-project'],\n helpValue: '<id>',\n }),\n 'project-plan': Flags.string({\n description: 'Optionally select a plan for a new project',\n helpValue: '<name>',\n }),\n provider: Flags.string({\n description: 'Login provider to use',\n helpValue: '<provider>',\n }),\n reconfigure: Flags.boolean({\n deprecated: {message: 'This flag is no longer supported', version: '3.0.0'},\n description: 'Reconfigure an existing project',\n hidden: true,\n }),\n template: Flags.string({\n default: 'clean',\n description: 'Project template to use [default: \"clean\"]',\n exclusive: ['bare'],\n helpValue: '<template>',\n }),\n // Porting over a beta flag\n // Oclif doesn't seem to support something in beta so hiding for now\n 'template-token': Flags.string({\n description: 'Used for accessing private GitHub repo templates',\n hidden: true,\n }),\n typescript: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Enable TypeScript support',\n exclusive: ['bare'],\n }),\n visibility: Flags.string({\n description: 'Visibility mode for dataset',\n helpValue: '<mode>',\n options: ['public', 'private'],\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Unattended mode, answers \"yes\" to any \"yes/no\" prompt and otherwise uses defaults',\n }),\n } satisfies FlagInput\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(InitCommand)\n const createProjectName = this.flags['create-project']\n // For backwards \"compatibility\" - we used to allow `sanity init plugin`,\n // and no longer do - but instead of printing an error about an unknown\n // _command_, we want to acknowledge that the user is trying to do something\n // that no longer exists but might have at some point in the past.\n if (args.type) {\n this.error(\n args.type === 'plugin'\n ? 'Initializing plugins through the CLI is no longer supported'\n : `Unknown init type \"${args.type}\"`,\n {exit: 1},\n )\n }\n\n // @todo\n //const trace = telemetry.trace(CLIInitStepCompleted)\n\n // Slightly more helpful message for removed flags rather than just saying the flag\n // does not exist.\n if (this.flags.reconfigure) {\n this.error('--reconfigure is deprecated - manual configuration is now required', {exit: 1})\n }\n\n // Oclif doesn't support custom exclusive error messaging\n if (this.flags.project && this.flags.organization) {\n this.error(\n 'You have specified both a project and an organization. To move a project to an organization please visit https://www.sanity.io/manage',\n {exit: 1},\n )\n }\n\n const defaultConfig = this.flags['dataset-default']\n let showDefaultConfigPrompt = !defaultConfig\n if (\n this.flags.dataset ||\n this.flags.visibility ||\n this.flags['dataset-default'] ||\n this.isUnattended()\n ) {\n showDefaultConfigPrompt = false\n }\n\n const detectedFramework: Framework | null = await detectFrameworkRecord({\n frameworkList: frameworks as readonly Framework[],\n fs: new LocalFileSystemDetector(process.cwd()),\n })\n const isNextJs = detectedFramework?.slug === 'nextjs'\n\n let remoteTemplateInfo: RepoInfo | undefined\n if (flags.template && checkIsRemoteTemplate(flags.template)) {\n remoteTemplateInfo = await getGitHubRepoInfo(flags.template, flags['template-token'])\n }\n\n if (detectedFramework && detectedFramework.slug !== 'sanity' && remoteTemplateInfo) {\n this.error(\n `A remote template cannot be used with a detected framework. Detected: ${detectedFramework.name}`,\n {exit: 1},\n )\n }\n\n // Checks flags are present when in unattended mode\n if (this.isUnattended()) {\n this.checkFlagsInUnattendedMode({createProjectName, isNextJs})\n }\n\n // @todo\n // trace.start()\n // trace.log({\n // step: 'start',\n // flags: {\n // defaultConfig,\n // unattended,\n // plan: intendedPlan,\n // coupon: intendedCoupon,\n // reconfigure,\n // git: commitMessage,\n // bare: bareOutput,\n // env,\n // },\n // })\n\n // Plan can be set through `--project-plan`, or implied through `--coupon`.\n // As coupons can expire and project plans might change/be removed, we need to\n // verify that the passed flags are valid. The complexity of this is hidden in the\n // below plan methods, eventually returning a plan ID or undefined if we are told to\n // use the default plan.\n\n const planId = await this.getPlan()\n\n let envFilenameDefault = '.env'\n if (detectedFramework && detectedFramework.slug === 'nextjs') {\n envFilenameDefault = '.env.local'\n }\n const _envFilename = typeof flags.env === 'string' ? flags.env : envFilenameDefault\n\n // If the user isn't already autenticated, make it so\n const {user} = await this.ensureAuthenticated()\n\n // skip project / dataset prompting\n const template = this.flags.template\n const isAppTemplate = template ? determineAppTemplate(template) : false // Default to false\n if (!isAppTemplate) {\n this.log(`${logSymbols.success} Fetching existing projects`)\n this.log('')\n }\n\n const _newProjectId =\n createProjectName && (await this.createProjectFromName({createProjectName, planId, user}))\n\n const {datasetName, projectId} = await this.getProjectDetails({\n isAppTemplate,\n planId,\n showDefaultConfigPrompt,\n user,\n })\n\n // If user doesn't want to output any template code\n if (this.flags.bare) {\n this.log(`${logSymbols.success} Below are your project details`)\n this.log('')\n this.log(`Project ID: ${chalk.cyan(projectId)}`)\n this.log(`Dataset: ${chalk.cyan(datasetName)}`)\n this.log(\n `\\nYou can find your project on Sanity Manage — https://www.sanity.io/manage/project/${projectId}\\n`,\n )\n return\n }\n }\n\n private checkFlagsInUnattendedMode({\n createProjectName,\n isNextJs,\n }: {\n createProjectName: string | undefined\n isNextJs: boolean\n }) {\n debug('Unattended mode, validating required options')\n\n if (!this.flags['dataset']) {\n this.error(`\\`--dataset\\` must be specified in unattended mode`, {exit: 1})\n }\n\n // output-path is required in unattended mode when not using nextjs\n if (!isNextJs && !this.flags['output-path']) {\n this.error(`\\`--output-path\\` must be specified in unattended mode`, {exit: 1})\n }\n\n if (!this.flags.project && !createProjectName) {\n this.error(\n '`--project <id>` or `--create-project <name>` must be specified in unattended mode',\n {exit: 1},\n )\n }\n\n if (createProjectName && !this.flags.organization) {\n this.error(\n '--create-project is not supported in unattended mode without an organization, please specify an organization with `--organization <id>`',\n {exit: 1},\n )\n }\n }\n\n private async createProjectFromName({\n createProjectName,\n planId,\n user,\n }: {\n createProjectName: string\n planId: string | undefined\n user: SanityOrgUser\n }): Promise<string> {\n debug('--create-project specified, creating a new project')\n\n let orgForCreateProjectFlag = this.flags.organization\n\n if (!orgForCreateProjectFlag) {\n debug('no organization specified, selecting one')\n const organizations = await listOrganizations()\n orgForCreateProjectFlag = await this.promptUserForOrganization({organizations, user})\n }\n\n debug('creating a new project')\n const createdProject = await createProject({\n displayName: createProjectName.trim(),\n metadata: {coupon: this.flags.coupon},\n organizationId: orgForCreateProjectFlag,\n subscription: planId ? {planId} : undefined,\n })\n\n debug('Project with ID %s created', createdProject.projectId)\n if (this.flags.dataset) {\n debug('--dataset specified, creating dataset (%s)', this.flags.dataset)\n const spin = spinner('Creating dataset').start()\n await createDatasetService({\n aclMode: this.flags.visibility as DatasetAclMode,\n datasetName: this.flags.dataset,\n projectId: createdProject.projectId,\n })\n spin.succeed()\n }\n\n return createdProject.projectId\n }\n\n // @todo do we actually need to be authenticated for init? check flags and determine.\n private async ensureAuthenticated(): Promise<{user: SanityOrgUser}> {\n let isAuthenticated = (await getCliToken()) !== undefined\n debug(isAuthenticated ? 'User already has a token' : 'User has no token')\n\n let user: SanityOrgUser | undefined\n if (isAuthenticated) {\n // It _appears_ we are authenticated, but the token might be invalid/expired,\n // so we need to verify that we can actually make an authenticated request.\n try {\n user = await getCliUser()\n } catch {\n // assume that any error means that the token is invalid\n isAuthenticated = false\n }\n }\n\n if (isAuthenticated) {\n // @todo telemetry\n // trace.log({ step: 'login', alreadyLoggedIn: true })\n } else {\n if (this.isUnattended()) {\n this.error('Must be logged in to run this command in unattended mode, run `sanity login`', {\n exit: 1,\n })\n }\n\n // @todo telemetry\n //trace.log({step: 'login'})\n\n // @todo trigger login action, then get and return user info\n await login({output: this.output})\n }\n\n user = await getCliUser()\n\n this.log(\n `${logSymbols.success} You are logged in as ${user.email} using ${getProviderName(user.provider)}`,\n )\n return {user}\n }\n\n private async getOrCreateDataset(opts: {\n displayName: string\n projectId: string\n showDefaultConfigPrompt: boolean\n }): Promise<{datasetName: string; userAction: 'create' | 'none' | 'select'}> {\n const visibility = this.flags.visibility\n const dataset = this.flags.dataset\n let defaultConfig = this.flags['dataset-default']\n\n if (dataset && this.isUnattended()) {\n return {datasetName: dataset, userAction: 'none'}\n }\n\n const [datasets, projectFeatures] = await Promise.all([\n listDatasets(opts.projectId),\n getProjectFeatures(opts.projectId),\n ])\n\n if (dataset) {\n debug('User has specified dataset through a flag (%s)', dataset)\n const existing = datasets.find((ds) => ds.name === dataset)\n if (!existing) {\n debug('Specified dataset not found, creating it')\n await createDataset({\n datasetName: dataset,\n forcePublic: defaultConfig,\n output: this.output,\n projectFeatures,\n projectId: opts.projectId,\n visibility,\n })\n }\n\n return {datasetName: dataset, userAction: 'none'}\n }\n\n const datasetInfo =\n 'Your content will be stored in a dataset that can be public or private, depending on\\nwhether you want to query your content with or without authentication.\\nThe default dataset configuration has a public dataset named \"production\".'\n\n if (datasets.length === 0) {\n debug('No datasets found for project, prompting for name')\n if (opts.showDefaultConfigPrompt) {\n this.log(datasetInfo)\n defaultConfig = await this.promptForDefaultConfig()\n }\n const name = defaultConfig\n ? 'production'\n : await promptForDatasetName({\n message: 'Name of your first dataset:',\n })\n await createDataset({\n datasetName: name,\n forcePublic: defaultConfig,\n output: this.output,\n projectFeatures,\n projectId: opts.projectId,\n visibility,\n })\n return {datasetName: name, userAction: 'create'}\n }\n\n debug(`User has ${datasets.length} dataset(s) already, showing list of choices`)\n const datasetChoices = datasets.map((dataset) => ({value: dataset.name}))\n\n const selected = await select({\n choices: [{name: 'Create new dataset', value: 'new'}, new Separator(), ...datasetChoices],\n message: 'Select dataset to use',\n })\n\n if (selected === 'new') {\n const existingDatasetNames = datasets.map((ds) => ds.name)\n debug('User wants to create a new dataset, prompting for name')\n if (opts.showDefaultConfigPrompt && !existingDatasetNames.includes('production')) {\n this.log(datasetInfo)\n defaultConfig = await this.promptForDefaultConfig()\n }\n\n const newDatasetName = defaultConfig\n ? 'production'\n : await promptForDatasetName(\n {\n message: 'Dataset name:',\n },\n existingDatasetNames,\n )\n await createDataset({\n datasetName: newDatasetName,\n forcePublic: defaultConfig,\n output: this.output,\n projectFeatures,\n projectId: opts.projectId,\n visibility,\n })\n return {datasetName: newDatasetName, userAction: 'create'}\n }\n\n debug(`Returning selected dataset (${selected})`)\n return {datasetName: selected, userAction: 'select'}\n }\n\n private async getOrCreateProject({\n planId,\n user,\n }: {\n planId: string | undefined\n user: SanityOrgUser\n }): Promise<{\n displayName: string\n isFirstProject: boolean\n projectId: string\n userAction: 'create' | 'select'\n }> {\n const projectId = this.flags.project\n const organizationId = this.flags.organization\n let projects\n let organizations: ProjectOrganization[]\n\n try {\n const [allProjects, allOrgs] = await Promise.all([listProjects(), listOrganizations()])\n projects = allProjects.toSorted((a, b) => b.createdAt.localeCompare(a.createdAt))\n organizations = allOrgs\n } catch (err) {\n if (this.isUnattended() && projectId) {\n return {\n displayName: 'Unknown project',\n isFirstProject: false,\n projectId,\n userAction: 'select',\n }\n }\n this.error(`Failed to communicate with the Sanity API:\\n${err.message}`, {exit: 1})\n }\n\n if (projects.length === 0 && this.isUnattended()) {\n this.error('No projects found for current user', {exit: 1})\n }\n\n if (projectId) {\n const project = projects.find((proj) => proj.id === projectId)\n if (!project && !this.isUnattended()) {\n this.error(`Given project ID (${projectId}) not found, or you do not have access to it`, {\n exit: 1,\n })\n }\n\n return {\n displayName: project ? project.displayName : 'Unknown project',\n isFirstProject: false,\n projectId,\n userAction: 'select',\n }\n }\n\n if (organizationId) {\n const organization =\n organizations.find((org) => org.id === organizationId) ||\n organizations.find((org) => org.slug === organizationId)\n\n if (!organization) {\n this.error(\n `Given organization ID (${organizationId}) not found, or you do not have access to it`,\n {exit: 1},\n )\n }\n\n if (!(await hasProjectAttachGrant(organizationId))) {\n this.error('You lack the necessary permissions to attach a project to this organization', {\n exit: 1,\n })\n }\n }\n\n // If the user has no projects or is using a coupon (which can only be applied to new projects)\n // just ask for project details instead of showing a list of projects\n const isUsersFirstProject = projects.length === 0\n if (isUsersFirstProject || this.flags.coupon) {\n debug(\n isUsersFirstProject\n ? 'No projects found for user, prompting for name'\n : 'Using a coupon - skipping project selection',\n )\n\n const newProject = await this.promptForProjectCreation({\n isUsersFirstProject,\n organizationId,\n organizations,\n planId,\n user,\n })\n\n return {\n ...newProject,\n isFirstProject: isUsersFirstProject,\n userAction: 'create',\n }\n }\n\n debug(`User has ${projects.length} project(s) already, showing list of choices`)\n\n const projectChoices = projects.map((project) => ({\n name: `${project.displayName} (${project.id})`,\n value: project.id,\n }))\n\n const selected = await select({\n choices: [{name: 'Create new project', value: 'new'}, new Separator(), ...projectChoices],\n message: 'Create a new project or select an existing one',\n })\n\n if (selected === 'new') {\n debug('User wants to create a new project, prompting for name')\n\n const newProject = await this.promptForProjectCreation({\n isUsersFirstProject,\n organizationId,\n organizations,\n planId,\n user,\n })\n\n return {\n ...newProject,\n isFirstProject: isUsersFirstProject,\n userAction: 'create',\n }\n }\n\n debug(`Returning selected project (${selected})`)\n return {\n displayName: projects.find((proj) => proj.id === selected)?.displayName || '',\n isFirstProject: isUsersFirstProject,\n projectId: selected,\n userAction: 'select',\n }\n }\n\n private async getPlan(): Promise<string | undefined> {\n const intendedPlan = this.flags['project-plan']\n const intendedCoupon = this.flags.coupon\n\n if (intendedCoupon) {\n return this.verifyCoupon(intendedCoupon)\n } else if (intendedPlan) {\n return this.verifyPlan(intendedPlan)\n } else {\n return undefined\n }\n }\n\n private async getProjectDetails({\n isAppTemplate,\n planId,\n showDefaultConfigPrompt,\n user,\n }: {\n isAppTemplate: boolean\n planId: string | undefined\n showDefaultConfigPrompt: boolean\n user: SanityOrgUser\n }): Promise<{\n datasetName: string\n displayName: string\n isFirstProject: boolean\n organizationId?: string\n projectId: string\n schemaUrl?: string\n }> {\n if (isAppTemplate) {\n const organizations = await listOrganizations({\n includeImplicitMemberships: 'true',\n includeMembers: 'true',\n })\n\n const appOrganizationId = await this.promptUserForOrganization({organizations, user})\n\n return {\n datasetName: '',\n displayName: '',\n isFirstProject: false,\n organizationId: appOrganizationId,\n projectId: '',\n }\n }\n\n debug('Prompting user to select or create a project')\n const project = await this.getOrCreateProject({planId, user})\n debug(`Project with name ${project.displayName} selected`)\n\n // Now let's pick or create a dataset\n debug('Prompting user to select or create a dataset')\n const dataset = await this.getOrCreateDataset({\n displayName: project.displayName,\n projectId: project.projectId,\n showDefaultConfigPrompt,\n })\n debug(`Dataset with name ${dataset.datasetName} selected`)\n\n // @todo\n // trace.log({\n // step: 'createOrSelectDataset',\n // selectedOption: dataset.userAction,\n // datasetName: dataset.datasetName,\n // visibility: flags.visibility as 'private' | 'public',\n // })\n\n return {\n datasetName: dataset.datasetName,\n displayName: project.displayName,\n isFirstProject: project.isFirstProject,\n projectId: project.projectId,\n }\n }\n\n private async promptForDefaultConfig(): Promise<boolean> {\n return confirm({\n default: true,\n message: 'Use the default dataset configuration?',\n })\n }\n\n private async promptForProjectCreation({\n isUsersFirstProject,\n organizationId,\n organizations,\n planId,\n user,\n }: {\n isUsersFirstProject: boolean\n organizationId: string | undefined\n organizations: ProjectOrganization[]\n planId: string | undefined\n user: SanityOrgUser\n }) {\n const projectName = await input({\n default: 'My Sanity Project',\n message: 'Project name:',\n validate(input) {\n if (!input || input.trim() === '') {\n return 'Project name cannot be empty'\n }\n\n if (input.length > 80) {\n return 'Project name cannot be longer than 80 characters'\n }\n\n return true\n },\n })\n\n const organization =\n organizationId || (await this.promptUserForOrganization({organizations, user}))\n\n const newProject = await createProject({\n displayName: projectName,\n metadata: {coupon: this.flags.coupon},\n organizationId: organization,\n subscription: planId ? {planId} : undefined,\n })\n\n return {\n ...newProject,\n isFirstProject: isUsersFirstProject,\n userAction: 'create',\n }\n }\n\n private async promptUserForNewOrganization(\n user: SanityOrgUser,\n ): Promise<OrganizationCreateResponse> {\n const name = await input({\n default: user ? user.name : undefined,\n message: 'Organization name:',\n validate(input) {\n if (input.length === 0) {\n return 'Organization name cannot be empty'\n } else if (input.length > 100) {\n return 'Organization name cannot be longer than 100 characters'\n }\n return true\n },\n })\n\n const spin = spinner('Creating organization').start()\n const organization = await createOrganization(name)\n spin.succeed()\n\n return organization\n }\n\n private async promptUserForOrganization({\n organizations,\n user,\n }: {\n organizations: ProjectOrganization[]\n user: SanityOrgUser\n }) {\n // If the user has no organizations, prompt them to create one with the same name as\n // their user, but allow them to customize it if they want\n if (organizations.length === 0) {\n const newOrganization = await this.promptUserForNewOrganization(user)\n return newOrganization.id\n }\n\n // If the user has organizations, let them choose from them, but also allow them to\n // create a new one in case they do not have access to any of them, or they want to\n // create a personal/other organization.\n debug(`User has ${organizations.length} organization(s), checking attach access`)\n const withGrantInfo = await getOrganizationsWithAttachGrantInfo(organizations)\n const withAttach = withGrantInfo.filter(({hasAttachGrant}) => hasAttachGrant)\n\n debug('User has attach access to %d organizations.', withAttach.length)\n const organizationChoices = getOrganizationChoices(withAttach)\n\n // If the user only has a single organization (and they have attach access to it),\n // we'll default to that one. Otherwise, we'll default to the organization with the\n // same name as the user if it exists.\n const defaultOrganizationId =\n withAttach.length === 1\n ? withAttach[0].organization.id\n : organizations.find((org) => org.name === user?.name)?.id\n\n const chosenOrg = await select({\n choices: organizationChoices,\n default: defaultOrganizationId || undefined,\n message: 'Select organization:',\n })\n\n if (chosenOrg === '-new-') {\n const newOrganization = await this.promptUserForNewOrganization(user)\n return newOrganization.id\n }\n\n return chosenOrg || undefined\n }\n\n private async verifyCoupon(intendedCoupon: string): Promise<string | undefined> {\n try {\n const planId = await getPlanIdFromCoupon(intendedCoupon)\n this.log(`Coupon \"${intendedCoupon}\" validated!\\n`)\n return planId\n } catch (err: unknown) {\n if (!isHttpError(err) || err.statusCode !== 404) {\n const message = err instanceof Error ? err.message : `${err}`\n this.error(`Unable to validate coupon, please try again later:\\n\\n${message}`, {exit: 1})\n }\n\n const useDefaultPlan =\n this.isUnattended() ||\n (await confirm({\n default: true,\n message: `Coupon \"${intendedCoupon}\" is not available, use default plan instead?`,\n }))\n\n if (this.isUnattended()) {\n this.warn(`Coupon \"${intendedCoupon}\" is not available - using default plan`)\n }\n\n // @todo\n // trace.log({\n // step: 'useDefaultPlanCoupon',\n // selectedOption: useDefaultPlan ? 'yes' : 'no',\n // coupon: intendedCoupon,\n // })\n\n if (useDefaultPlan) {\n this.log('Using default plan.')\n } else {\n this.error(`Coupon \"${intendedCoupon}\" does not exist`, {exit: 1})\n }\n }\n }\n\n private async verifyPlan(intendedPlan: string): Promise<string | undefined> {\n try {\n const planId = await getPlanId(intendedPlan)\n return planId\n } catch (err: unknown) {\n if (!isHttpError(err) || err.statusCode !== 404) {\n const message = err instanceof Error ? err.message : `${err}`\n this.error(`Unable to validate plan, please try again later:\\n\\n${message}`, {exit: 1})\n }\n\n const useDefaultPlan =\n this.isUnattended() ||\n (await confirm({\n default: true,\n message: `Project plan \"${intendedPlan}\" does not exist, use default plan instead?`,\n }))\n\n if (this.isUnattended()) {\n this.warn(`Project plan \"${intendedPlan}\" does not exist - using default plan`)\n }\n\n // @todo\n // trace.log({\n // step: 'useDefaultPlanId',\n // selectedOption: useDefaultPlan ? 'yes' : 'no',\n // planId: intendedPlan,\n // })\n\n if (useDefaultPlan) {\n this.log('Using default plan.')\n } else {\n this.error(`Plan id \"${intendedPlan}\" does not exist`, {exit: 1})\n }\n }\n }\n}\n"],"names":["Args","Flags","CLIError","getCliToken","SanityCommand","subdebug","chalk","confirm","input","logSymbols","select","Separator","spinner","isHttpError","frameworks","detectFrameworkRecord","LocalFileSystemDetector","getProviderName","login","createDataset","determineAppTemplate","checkIsRemoteTemplate","getGitHubRepoInfo","getOrganizationChoices","getOrganizationsWithAttachGrantInfo","hasProjectAttachGrant","promptForDatasetName","createDatasetService","listDatasets","getProjectFeatures","createOrganization","listOrganizations","getPlanId","getPlanIdFromCoupon","createProject","listProjects","getCliUser","debug","InitCommand","args","type","string","hidden","description","enableJsonFlag","examples","command","flags","boolean","allowNo","default","exclusive","bare","coupon","helpValue","dataset","env","parse","startsWith","git","undefined","helpLabel","mcp","helpGroup","organization","options","project","aliases","provider","reconfigure","deprecated","message","version","template","typescript","visibility","yes","char","run","createProjectName","error","exit","defaultConfig","showDefaultConfigPrompt","isUnattended","detectedFramework","frameworkList","fs","process","cwd","isNextJs","slug","remoteTemplateInfo","name","checkFlagsInUnattendedMode","planId","getPlan","envFilenameDefault","_envFilename","user","ensureAuthenticated","isAppTemplate","log","success","_newProjectId","createProjectFromName","datasetName","projectId","getProjectDetails","cyan","orgForCreateProjectFlag","organizations","promptUserForOrganization","createdProject","displayName","trim","metadata","organizationId","subscription","spin","start","aclMode","succeed","isAuthenticated","output","email","getOrCreateDataset","opts","userAction","datasets","projectFeatures","Promise","all","existing","find","ds","forcePublic","datasetInfo","length","promptForDefaultConfig","datasetChoices","map","value","selected","choices","existingDatasetNames","includes","newDatasetName","getOrCreateProject","projects","allProjects","allOrgs","toSorted","a","b","createdAt","localeCompare","err","isFirstProject","proj","id","org","isUsersFirstProject","newProject","promptForProjectCreation","projectChoices","intendedPlan","intendedCoupon","verifyCoupon","verifyPlan","includeImplicitMemberships","includeMembers","appOrganizationId","projectName","validate","promptUserForNewOrganization","newOrganization","withGrantInfo","withAttach","filter","hasAttachGrant","organizationChoices","defaultOrganizationId","chosenOrg","statusCode","Error","useDefaultPlan","warn"],"mappings":"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"}
@@ -27,14 +27,13 @@ export class ExtractManifestCommand extends SanityCommand {
27
27
  async run() {
28
28
  const { flags } = await this.parse(ExtractManifestCommand);
29
29
  const workDir = (await this.getProjectRoot()).directory;
30
- try {
31
- await extractManifestSafe({
32
- flags,
33
- output: this.output,
34
- workDir
35
- });
36
- } catch (error) {
37
- this.error(`Failed to extract manifest:\n${error}`, {
30
+ const error = await extractManifestSafe({
31
+ flags,
32
+ output: this.output,
33
+ workDir
34
+ });
35
+ if (error) {
36
+ this.error(`Failed to extract manifest:\n${error.message}`, {
38
37
  exit: 1
39
38
  });
40
39
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/manifest/extract.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {extractManifestSafe} from '../../actions/manifest/extractManifest.js'\n\nconst description = `\nExtracts the studio configuration as one or more JSON manifest files.\n\n**Note**: This command is experimental and subject to change. It is currently intended for use with Create only.\n`.trim()\n\nexport class ExtractManifestCommand extends SanityCommand<typeof ExtractManifestCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Extracts manifests',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --path /public/static',\n description: 'Extracts manifests into /public/static',\n },\n ]\n\n static override flags = {\n path: Flags.string({\n default: '/dist/static',\n description: 'Optional path to specify destination directory of the manifest files',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ExtractManifestCommand)\n const workDir = (await this.getProjectRoot()).directory\n\n try {\n await extractManifestSafe({\n flags,\n output: this.output,\n workDir,\n })\n } catch (error) {\n this.error(`Failed to extract manifest:\\n${error}`, {exit: 1})\n }\n }\n}\n"],"names":["Flags","SanityCommand","extractManifestSafe","description","trim","ExtractManifestCommand","examples","command","flags","path","string","default","run","parse","workDir","getProjectRoot","directory","output","error","exit"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,mBAAmB,QAAO,4CAA2C;AAE7E,MAAMC,cAAc,CAAC;;;;AAIrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,+BAA+BJ;IAC1C,OAAgBE,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtBC,MAAMT,MAAMU,MAAM,CAAC;YACjBC,SAAS;YACTR,aAAa;QACf;IACF,EAAC;IAED,MAAaS,MAAqB;QAChC,MAAM,EAACJ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACK,KAAK,CAACR;QACjC,MAAMS,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGC,SAAS;QAEvD,IAAI;YACF,MAAMd,oBAAoB;gBACxBM;gBACAS,QAAQ,IAAI,CAACA,MAAM;gBACnBH;YACF;QACF,EAAE,OAAOI,OAAO;YACd,IAAI,CAACA,KAAK,CAAC,CAAC,6BAA6B,EAAEA,OAAO,EAAE;gBAACC,MAAM;YAAC;QAC9D;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/manifest/extract.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {extractManifestSafe} from '../../actions/manifest/extractManifest.js'\n\nconst description = `\nExtracts the studio configuration as one or more JSON manifest files.\n\n**Note**: This command is experimental and subject to change. It is currently intended for use with Create only.\n`.trim()\n\nexport class ExtractManifestCommand extends SanityCommand<typeof ExtractManifestCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Extracts manifests',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --path /public/static',\n description: 'Extracts manifests into /public/static',\n },\n ]\n\n static override flags = {\n path: Flags.string({\n default: '/dist/static',\n description: 'Optional path to specify destination directory of the manifest files',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ExtractManifestCommand)\n const workDir = (await this.getProjectRoot()).directory\n\n const error = await extractManifestSafe({\n flags,\n output: this.output,\n workDir,\n })\n\n if (error) {\n this.error(`Failed to extract manifest:\\n${error.message}`, {exit: 1})\n }\n }\n}\n"],"names":["Flags","SanityCommand","extractManifestSafe","description","trim","ExtractManifestCommand","examples","command","flags","path","string","default","run","parse","workDir","getProjectRoot","directory","error","output","message","exit"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,mBAAmB,QAAO,4CAA2C;AAE7E,MAAMC,cAAc,CAAC;;;;AAIrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,+BAA+BJ;IAC1C,OAAgBE,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtBC,MAAMT,MAAMU,MAAM,CAAC;YACjBC,SAAS;YACTR,aAAa;QACf;IACF,EAAC;IAED,MAAaS,MAAqB;QAChC,MAAM,EAACJ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACK,KAAK,CAACR;QACjC,MAAMS,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGC,SAAS;QAEvD,MAAMC,QAAQ,MAAMf,oBAAoB;YACtCM;YACAU,QAAQ,IAAI,CAACA,MAAM;YACnBJ;QACF;QAEA,IAAIG,OAAO;YACT,IAAI,CAACA,KAAK,CAAC,CAAC,6BAA6B,EAAEA,MAAME,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QACtE;IACF;AACF"}
@@ -1,7 +1,7 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { Args, Flags } from '@oclif/core';
4
- import { SanityCommand, subdebug } from '@sanity/cli-core';
4
+ import { getProjectCliClient, SanityCommand, subdebug } from '@sanity/cli-core';
5
5
  import { input, spinner } from '@sanity/cli-core/ux';
6
6
  import { exportDataset } from '@sanity/export';
7
7
  import boxen from 'boxen';
@@ -59,7 +59,7 @@ export class MediaExportCommand extends SanityCommand {
59
59
  exit: 1
60
60
  });
61
61
  }
62
- const projectClient = await this.getProjectApiClient({
62
+ const projectClient = await getProjectCliClient({
63
63
  apiVersion: 'v2025-02-19',
64
64
  projectId,
65
65
  requireUser: true
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/export.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {type Writable} from 'node:stream'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input, spinner} from '@sanity/cli-core/ux'\nimport {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport boxen from 'boxen'\nimport prettyMs from 'pretty-ms'\n\nimport {promptForMediaLibrary} from '../../prompts/promptForMediaLibrary.js'\nimport {getMediaLibraries} from '../../services/mediaLibraries.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('media:export')\n\nexport class MediaExportCommand extends SanityCommand<typeof MediaExportCommand> {\n static override args = {\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description =\n 'Export an archive of all file and image assets including their aspect data from the target media library. Video assets are excluded from the export.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Export media library interactively',\n },\n {\n command: '<%= config.bin %> <%= command.id %> output.tar.gz',\n description: 'Export media library to output.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --media-library-id my-library-id',\n description: 'Export specific media library',\n },\n ]\n\n static override flags = {\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(MediaExportCommand)\n const {destination: targetDestination} = args\n\n const projectId = await this.getProjectId()\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {\n exit: 1,\n })\n }\n\n const projectClient = await this.getProjectApiClient({\n apiVersion: 'v2025-02-19',\n projectId,\n requireUser: true,\n })\n\n let mediaLibraries\n try {\n mediaLibraries = await getMediaLibraries(projectId)\n } catch (error) {\n exportDebug('Error listing media libraries', error)\n this.error(\n `Failed to list media libraries:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n\n if (mediaLibraries.length === 0) {\n this.error('No active media libraries found in this project', {exit: 1})\n }\n\n let mediaLibraryId = flags['media-library-id']\n if (!mediaLibraryId) {\n try {\n mediaLibraryId = await promptForMediaLibrary({mediaLibraries})\n } catch (error) {\n exportDebug('Error selecting media library', error)\n this.error(\n `Failed to select media library:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) {\n this.error(`Media library with id \"${mediaLibraryId}\" not found`, {exit: 1})\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\nmediaLibraryId: ${mediaLibraryId.padEnd(37)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = await this.promptForDestination({mediaLibraryId})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, mediaLibraryId, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: 1})\n }\n\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n client: projectClient,\n compress: !flags['no-compress'],\n mediaLibraryId,\n onProgress,\n outputPath,\n }\n\n const start = Date.now()\n try {\n await exportDataset(exportOptions)\n succeed()\n this.log(`Export finished (${prettyMs(Date.now() - start)})`)\n } catch (error) {\n fail()\n const err = error instanceof Error ? error : new Error(String(error))\n exportDebug('Export failed', err)\n this.error(`Export failed: ${err.message}`, {exit: 1})\n }\n }\n\n private createProgressHandler() {\n let currentSpinner: ReturnType<typeof spinner> | null = null\n let currentStep = ''\n\n const onProgress = (progress: ExportProgress) => {\n if (progress.step !== currentStep) {\n succeed()\n\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\n currentSpinner.text = `${progress.step} (${progress.current}/${progress.total})`\n }\n }\n\n const succeed = () => {\n currentSpinner?.succeed()\n }\n\n const fail = () => {\n currentSpinner?.fail()\n }\n\n return {fail, onProgress, succeed}\n }\n\n private async getOutputPath(\n destination: string,\n mediaLibraryId: string,\n flags: {overwrite?: boolean},\n ): Promise<string | Writable> {\n if (destination === '-') {\n return process.stdout\n }\n\n const dstPath = path.isAbsolute(destination)\n ? destination\n : path.resolve(process.cwd(), destination)\n\n const dstStats = await fs.stat(dstPath).catch(noop)\n const looksLikeFile = dstStats ? dstStats.isFile() : path.basename(dstPath).includes('.')\n\n if (!dstStats) {\n const createPath = looksLikeFile ? path.dirname(dstPath) : dstPath\n try {\n await fs.mkdir(createPath, {recursive: true})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: 1,\n })\n }\n }\n\n const finalPath = looksLikeFile\n ? dstPath\n : path.join(dstPath, `${mediaLibraryId}-export.tar.gz`)\n const finalPathStats = await fs.stat(finalPath).catch(noop)\n\n if (!flags.overwrite && finalPathStats && finalPathStats.isFile()) {\n this.error(`File \"${finalPath}\" already exists. Use --overwrite flag to overwrite it.`, {\n exit: 1,\n })\n }\n\n return finalPath\n }\n\n private promptForDestination(options: {\n mediaLibraryId: string\n workDir?: string\n }): Promise<string> {\n const {mediaLibraryId, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${mediaLibraryId}-export.tar.gz`)\n\n return input({\n default: defaultPath,\n message: 'Output path:',\n transformer: (value: string) => absolutify(value.trim()),\n validate: (value: string) => {\n const trimmed = value.trim()\n if (!trimmed) {\n return 'Please provide a valid output path'\n }\n return true\n },\n })\n }\n}\n"],"names":["fs","path","Args","Flags","SanityCommand","subdebug","input","spinner","exportDataset","boxen","prettyMs","promptForMediaLibrary","getMediaLibraries","absolutify","NO_PROJECT_ID","noop","exportDebug","MediaExportCommand","args","destination","string","description","examples","command","flags","integer","default","boolean","overwrite","run","parse","targetDestination","projectId","getProjectId","error","exit","projectClient","getProjectApiClient","apiVersion","requireUser","mediaLibraries","Error","message","length","mediaLibraryId","some","library","id","log","padEnd","borderColor","borderStyle","destinationPath","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","client","compress","start","Date","now","err","String","currentSpinner","currentStep","progress","step","update","text","current","total","process","stdout","dstPath","isAbsolute","resolve","cwd","dstStats","stat","catch","looksLikeFile","isFile","basename","includes","createPath","dirname","mkdir","recursive","finalPath","join","finalPathStats","options","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/media/export.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {type Writable} from 'node:stream'\n\nimport {Args, Flags} from '@oclif/core'\nimport {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input, spinner} from '@sanity/cli-core/ux'\nimport {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport boxen from 'boxen'\nimport prettyMs from 'pretty-ms'\n\nimport {promptForMediaLibrary} from '../../prompts/promptForMediaLibrary.js'\nimport {getMediaLibraries} from '../../services/mediaLibraries.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('media:export')\n\nexport class MediaExportCommand extends SanityCommand<typeof MediaExportCommand> {\n static override args = {\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description =\n 'Export an archive of all file and image assets including their aspect data from the target media library. Video assets are excluded from the export.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Export media library interactively',\n },\n {\n command: '<%= config.bin %> <%= command.id %> output.tar.gz',\n description: 'Export media library to output.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --media-library-id my-library-id',\n description: 'Export specific media library',\n },\n ]\n\n static override flags = {\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(MediaExportCommand)\n const {destination: targetDestination} = args\n\n const projectId = await this.getProjectId()\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {\n exit: 1,\n })\n }\n\n const projectClient = await getProjectCliClient({\n apiVersion: 'v2025-02-19',\n projectId,\n requireUser: true,\n })\n\n let mediaLibraries\n try {\n mediaLibraries = await getMediaLibraries(projectId)\n } catch (error) {\n exportDebug('Error listing media libraries', error)\n this.error(\n `Failed to list media libraries:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n\n if (mediaLibraries.length === 0) {\n this.error('No active media libraries found in this project', {exit: 1})\n }\n\n let mediaLibraryId = flags['media-library-id']\n if (!mediaLibraryId) {\n try {\n mediaLibraryId = await promptForMediaLibrary({mediaLibraries})\n } catch (error) {\n exportDebug('Error selecting media library', error)\n this.error(\n `Failed to select media library:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) {\n this.error(`Media library with id \"${mediaLibraryId}\" not found`, {exit: 1})\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\nmediaLibraryId: ${mediaLibraryId.padEnd(37)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = await this.promptForDestination({mediaLibraryId})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, mediaLibraryId, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: 1})\n }\n\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n client: projectClient,\n compress: !flags['no-compress'],\n mediaLibraryId,\n onProgress,\n outputPath,\n }\n\n const start = Date.now()\n try {\n await exportDataset(exportOptions)\n succeed()\n this.log(`Export finished (${prettyMs(Date.now() - start)})`)\n } catch (error) {\n fail()\n const err = error instanceof Error ? error : new Error(String(error))\n exportDebug('Export failed', err)\n this.error(`Export failed: ${err.message}`, {exit: 1})\n }\n }\n\n private createProgressHandler() {\n let currentSpinner: ReturnType<typeof spinner> | null = null\n let currentStep = ''\n\n const onProgress = (progress: ExportProgress) => {\n if (progress.step !== currentStep) {\n succeed()\n\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\n currentSpinner.text = `${progress.step} (${progress.current}/${progress.total})`\n }\n }\n\n const succeed = () => {\n currentSpinner?.succeed()\n }\n\n const fail = () => {\n currentSpinner?.fail()\n }\n\n return {fail, onProgress, succeed}\n }\n\n private async getOutputPath(\n destination: string,\n mediaLibraryId: string,\n flags: {overwrite?: boolean},\n ): Promise<string | Writable> {\n if (destination === '-') {\n return process.stdout\n }\n\n const dstPath = path.isAbsolute(destination)\n ? destination\n : path.resolve(process.cwd(), destination)\n\n const dstStats = await fs.stat(dstPath).catch(noop)\n const looksLikeFile = dstStats ? dstStats.isFile() : path.basename(dstPath).includes('.')\n\n if (!dstStats) {\n const createPath = looksLikeFile ? path.dirname(dstPath) : dstPath\n try {\n await fs.mkdir(createPath, {recursive: true})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: 1,\n })\n }\n }\n\n const finalPath = looksLikeFile\n ? dstPath\n : path.join(dstPath, `${mediaLibraryId}-export.tar.gz`)\n const finalPathStats = await fs.stat(finalPath).catch(noop)\n\n if (!flags.overwrite && finalPathStats && finalPathStats.isFile()) {\n this.error(`File \"${finalPath}\" already exists. Use --overwrite flag to overwrite it.`, {\n exit: 1,\n })\n }\n\n return finalPath\n }\n\n private promptForDestination(options: {\n mediaLibraryId: string\n workDir?: string\n }): Promise<string> {\n const {mediaLibraryId, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${mediaLibraryId}-export.tar.gz`)\n\n return input({\n default: defaultPath,\n message: 'Output path:',\n transformer: (value: string) => absolutify(value.trim()),\n validate: (value: string) => {\n const trimmed = value.trim()\n if (!trimmed) {\n return 'Please provide a valid output path'\n }\n return true\n },\n })\n }\n}\n"],"names":["fs","path","Args","Flags","getProjectCliClient","SanityCommand","subdebug","input","spinner","exportDataset","boxen","prettyMs","promptForMediaLibrary","getMediaLibraries","absolutify","NO_PROJECT_ID","noop","exportDebug","MediaExportCommand","args","destination","string","description","examples","command","flags","integer","default","boolean","overwrite","run","parse","targetDestination","projectId","getProjectId","error","exit","projectClient","apiVersion","requireUser","mediaLibraries","Error","message","length","mediaLibraryId","some","library","id","log","padEnd","borderColor","borderStyle","destinationPath","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","client","compress","start","Date","now","err","String","currentSpinner","currentStep","progress","step","update","text","current","total","process","stdout","dstPath","isAbsolute","resolve","cwd","dstStats","stat","catch","looksLikeFile","isFile","basename","includes","createPath","dirname","mkdir","recursive","finalPath","join","finalPathStats","options","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Args, Flags } from '@oclif/core';
2
- import { SanityCommand } from '@sanity/cli-core';
2
+ import { getProjectCliClient, SanityCommand } from '@sanity/cli-core';
3
3
  import { chalk, spinner } from '@sanity/cli-core/ux';
4
4
  import boxen from 'boxen';
5
5
  import { pipe, scan, tap } from 'rxjs';
@@ -82,7 +82,7 @@ export class MediaImportCommand extends SanityCommand {
82
82
  exit: 1
83
83
  });
84
84
  }
85
- const projectClient = await this.getProjectApiClient({
85
+ const projectClient = await getProjectCliClient({
86
86
  apiVersion: 'v2025-02-19',
87
87
  dataset,
88
88
  perspective: 'drafts',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/import.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {chalk, spinner} from '@sanity/cli-core/ux'\nimport {SanityClient} from '@sanity/client'\nimport boxen from 'boxen'\nimport {type OperatorFunction, pipe, scan, tap} from 'rxjs'\n\nimport {importer, type State} from '../../actions/media/importMedia.js'\nimport {importMediaDebug} from '../../actions/media/importMediaDebug.js'\nimport {promptForMediaLibrary} from '../../prompts/promptForMediaLibrary.js'\nimport {getMediaLibraries} from '../../services/mediaLibraries.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nexport class MediaImportCommand extends SanityCommand<typeof MediaImportCommand> {\n static override args = {\n source: Args.string({\n description: 'Image file or folder to import from',\n required: true,\n }),\n }\n\n static override description = 'Import a set of assets to the target media library.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> products',\n description: 'Import all assets from the \"products\" directory',\n },\n {\n command: '<%= config.bin %> <%= command.id %> gallery.tar.gz',\n description: 'Import all assets from \"gallery\" archive',\n },\n {\n command: '<%= config.bin %> <%= command.id %> products --replace-aspects',\n description: 'Import all assets from the \"products\" directory and replace aspects',\n },\n ]\n\n static override flags = {\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n }),\n 'replace-aspects': Flags.boolean({\n description:\n 'Replace existing aspect data. All versions will be replaced (e.g. published and draft aspect data)',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(MediaImportCommand)\n const {source} = args\n const replaceAspects = flags['replace-aspects']\n\n const projectId = await this.getProjectId()\n const cliConfig = await this.getCliConfig()\n const dataset = cliConfig.api?.dataset\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {\n exit: 1,\n })\n }\n\n let mediaLibraries\n try {\n mediaLibraries = await getMediaLibraries(projectId)\n } catch (error) {\n importMediaDebug('Error listing media libraries', error)\n this.error(\n `Failed to list media libraries:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n\n if (mediaLibraries.length === 0) {\n this.error('No active media libraries found in this project', {exit: 1})\n }\n\n let mediaLibraryId = flags['media-library-id']\n if (!mediaLibraryId) {\n try {\n mediaLibraryId = await promptForMediaLibrary({mediaLibraries})\n } catch (error) {\n importMediaDebug('Error selecting media library', error)\n this.error(\n `Failed to select media library:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) {\n this.error(`Media library with id \"${mediaLibraryId}\" not found`, {exit: 1})\n }\n\n const projectClient = await this.getProjectApiClient({\n apiVersion: 'v2025-02-19',\n dataset,\n perspective: 'drafts',\n projectId,\n requestTagPrefix: 'sanity.mediaLibraryCli.import',\n requireUser: true,\n '~experimental_resource': {\n id: mediaLibraryId,\n type: 'media-library',\n },\n })\n\n this.log(\n boxen(\n `\n Importing to media library: ${mediaLibraryId.padEnd(37)}\n Importing from path: ${source}\n `,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n const spin = spinner('Beginning import…').start()\n\n await this.importAssets({projectClient, replaceAspects, source, spin})\n }\n\n private async importAssets(options: {\n projectClient: SanityClient\n replaceAspects: boolean\n source: string\n spin: ReturnType<typeof spinner>\n }): Promise<void> {\n const {projectClient, replaceAspects, source, spin} = options\n\n return new Promise<void>((resolve, reject) => {\n const subscription = importer({\n client: projectClient,\n replaceAspects,\n sourcePath: source,\n spinner: spin,\n })\n .pipe(this.reportResult(spin))\n .subscribe({\n complete: () => {\n resolve()\n },\n error: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n spin.stop()\n reject(new Error(message))\n },\n })\n\n // Cleanup on Ctrl+C\n process.once('SIGINT', () => {\n subscription.unsubscribe()\n spin.fail('Import interrupted.')\n process.exit(130)\n })\n }).catch((error) => {\n this.error(chalk.red(error.message), {exit: 1})\n })\n }\n\n private reportResult(\n spin: ReturnType<typeof spinner>,\n ): OperatorFunction<State, [number, State | undefined]> {\n let previousState: State | undefined\n\n return pipe(\n scan<State, [number, State | undefined]>(\n (processedAssetsCount, state) => [processedAssetsCount[0] + 1, state],\n [0, undefined],\n ),\n tap({\n complete: () => spin.succeed(`Imported ${previousState?.fileCount} assets`),\n next: ([processedAssetsCount, state]) => {\n previousState = state\n spin.text = `${processedAssetsCount} of ${state?.fileCount} assets imported ${chalk.dim(state?.asset.originalFilename)}`\n },\n }),\n )\n }\n}\n"],"names":["Args","Flags","SanityCommand","chalk","spinner","boxen","pipe","scan","tap","importer","importMediaDebug","promptForMediaLibrary","getMediaLibraries","NO_PROJECT_ID","MediaImportCommand","args","source","string","description","required","examples","command","flags","boolean","run","parse","replaceAspects","projectId","getProjectId","cliConfig","getCliConfig","dataset","api","error","exit","mediaLibraries","Error","message","length","mediaLibraryId","some","library","id","projectClient","getProjectApiClient","apiVersion","perspective","requestTagPrefix","requireUser","type","log","padEnd","borderColor","borderStyle","spin","start","importAssets","options","Promise","resolve","reject","subscription","client","sourcePath","reportResult","subscribe","complete","String","stop","process","once","unsubscribe","fail","catch","red","previousState","processedAssetsCount","state","undefined","succeed","fileCount","next","text","dim","asset","originalFilename"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/media/import.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {getProjectCliClient, SanityCommand} from '@sanity/cli-core'\nimport {chalk, spinner} from '@sanity/cli-core/ux'\nimport {SanityClient} from '@sanity/client'\nimport boxen from 'boxen'\nimport {type OperatorFunction, pipe, scan, tap} from 'rxjs'\n\nimport {importer, type State} from '../../actions/media/importMedia.js'\nimport {importMediaDebug} from '../../actions/media/importMediaDebug.js'\nimport {promptForMediaLibrary} from '../../prompts/promptForMediaLibrary.js'\nimport {getMediaLibraries} from '../../services/mediaLibraries.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nexport class MediaImportCommand extends SanityCommand<typeof MediaImportCommand> {\n static override args = {\n source: Args.string({\n description: 'Image file or folder to import from',\n required: true,\n }),\n }\n\n static override description = 'Import a set of assets to the target media library.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> products',\n description: 'Import all assets from the \"products\" directory',\n },\n {\n command: '<%= config.bin %> <%= command.id %> gallery.tar.gz',\n description: 'Import all assets from \"gallery\" archive',\n },\n {\n command: '<%= config.bin %> <%= command.id %> products --replace-aspects',\n description: 'Import all assets from the \"products\" directory and replace aspects',\n },\n ]\n\n static override flags = {\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n }),\n 'replace-aspects': Flags.boolean({\n description:\n 'Replace existing aspect data. All versions will be replaced (e.g. published and draft aspect data)',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(MediaImportCommand)\n const {source} = args\n const replaceAspects = flags['replace-aspects']\n\n const projectId = await this.getProjectId()\n const cliConfig = await this.getCliConfig()\n const dataset = cliConfig.api?.dataset\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {\n exit: 1,\n })\n }\n\n let mediaLibraries\n try {\n mediaLibraries = await getMediaLibraries(projectId)\n } catch (error) {\n importMediaDebug('Error listing media libraries', error)\n this.error(\n `Failed to list media libraries:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n\n if (mediaLibraries.length === 0) {\n this.error('No active media libraries found in this project', {exit: 1})\n }\n\n let mediaLibraryId = flags['media-library-id']\n if (!mediaLibraryId) {\n try {\n mediaLibraryId = await promptForMediaLibrary({mediaLibraries})\n } catch (error) {\n importMediaDebug('Error selecting media library', error)\n this.error(\n `Failed to select media library:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) {\n this.error(`Media library with id \"${mediaLibraryId}\" not found`, {exit: 1})\n }\n\n const projectClient = await getProjectCliClient({\n apiVersion: 'v2025-02-19',\n dataset,\n perspective: 'drafts',\n projectId,\n requestTagPrefix: 'sanity.mediaLibraryCli.import',\n requireUser: true,\n '~experimental_resource': {\n id: mediaLibraryId,\n type: 'media-library',\n },\n })\n\n this.log(\n boxen(\n `\n Importing to media library: ${mediaLibraryId.padEnd(37)}\n Importing from path: ${source}\n `,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n const spin = spinner('Beginning import…').start()\n\n await this.importAssets({projectClient, replaceAspects, source, spin})\n }\n\n private async importAssets(options: {\n projectClient: SanityClient\n replaceAspects: boolean\n source: string\n spin: ReturnType<typeof spinner>\n }): Promise<void> {\n const {projectClient, replaceAspects, source, spin} = options\n\n return new Promise<void>((resolve, reject) => {\n const subscription = importer({\n client: projectClient,\n replaceAspects,\n sourcePath: source,\n spinner: spin,\n })\n .pipe(this.reportResult(spin))\n .subscribe({\n complete: () => {\n resolve()\n },\n error: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n spin.stop()\n reject(new Error(message))\n },\n })\n\n // Cleanup on Ctrl+C\n process.once('SIGINT', () => {\n subscription.unsubscribe()\n spin.fail('Import interrupted.')\n process.exit(130)\n })\n }).catch((error) => {\n this.error(chalk.red(error.message), {exit: 1})\n })\n }\n\n private reportResult(\n spin: ReturnType<typeof spinner>,\n ): OperatorFunction<State, [number, State | undefined]> {\n let previousState: State | undefined\n\n return pipe(\n scan<State, [number, State | undefined]>(\n (processedAssetsCount, state) => [processedAssetsCount[0] + 1, state],\n [0, undefined],\n ),\n tap({\n complete: () => spin.succeed(`Imported ${previousState?.fileCount} assets`),\n next: ([processedAssetsCount, state]) => {\n previousState = state\n spin.text = `${processedAssetsCount} of ${state?.fileCount} assets imported ${chalk.dim(state?.asset.originalFilename)}`\n },\n }),\n )\n }\n}\n"],"names":["Args","Flags","getProjectCliClient","SanityCommand","chalk","spinner","boxen","pipe","scan","tap","importer","importMediaDebug","promptForMediaLibrary","getMediaLibraries","NO_PROJECT_ID","MediaImportCommand","args","source","string","description","required","examples","command","flags","boolean","run","parse","replaceAspects","projectId","getProjectId","cliConfig","getCliConfig","dataset","api","error","exit","mediaLibraries","Error","message","length","mediaLibraryId","some","library","id","projectClient","apiVersion","perspective","requestTagPrefix","requireUser","type","log","padEnd","borderColor","borderStyle","spin","start","importAssets","options","Promise","resolve","reject","subscription","client","sourcePath","reportResult","subscribe","complete","String","stop","process","once","unsubscribe","fail","catch","red","previousState","processedAssetsCount","state","undefined","succeed","fileCount","next","text","dim","asset","originalFilename"],"mappings":"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"}
@@ -2,6 +2,7 @@ import { Flags } from '@oclif/core';
2
2
  import { SanityCommand, subdebug } from '@sanity/cli-core';
3
3
  import { chalk } from '@sanity/cli-core/ux';
4
4
  import { size, sortBy } from 'lodash-es';
5
+ import { listProjects } from '../../services/projects.js';
5
6
  const sortFields = [
6
7
  'id',
7
8
  'members',
@@ -9,7 +10,6 @@ const sortFields = [
9
10
  'url',
10
11
  'created'
11
12
  ];
12
- const LIST_PROJECTS_API_VERSION = 'v2025-05-15';
13
13
  const projectsDebug = subdebug('projects');
14
14
  export class List extends SanityCommand {
15
15
  static description = 'Lists projects connected to your user';
@@ -38,12 +38,8 @@ export class List extends SanityCommand {
38
38
  };
39
39
  async run() {
40
40
  const { order, sort } = this.flags;
41
- const client = await this.getGlobalApiClient({
42
- apiVersion: LIST_PROJECTS_API_VERSION,
43
- requireUser: true
44
- });
45
41
  try {
46
- const projects = await client.projects.list();
42
+ const projects = await listProjects();
47
43
  const ordered = sortBy(projects.map(({ createdAt, displayName, id, members = [] })=>{
48
44
  const manage = `https://www.sanity.io/manage/project/${id}`;
49
45
  return [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/projects/list.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\nimport {size, sortBy} from 'lodash-es'\n\nconst sortFields = ['id', 'members', 'name', 'url', 'created']\n\nconst LIST_PROJECTS_API_VERSION = 'v2025-05-15'\nconst projectsDebug = subdebug('projects')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'Lists projects connected to your user'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List projects',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sort=members --order=asc',\n description: 'List all users of the project, but exclude pending invitations and robots',\n },\n ]\n\n static override flags = {\n order: Flags.string({\n default: 'desc',\n options: ['asc', 'desc'],\n }),\n sort: Flags.string({\n default: 'created',\n options: sortFields,\n }),\n }\n\n public async run() {\n const {order, sort} = this.flags\n\n const client = await this.getGlobalApiClient({\n apiVersion: LIST_PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n try {\n const projects = await client.projects.list()\n const ordered = sortBy(\n projects.map(({createdAt, displayName, id, members = []}) => {\n const manage = `https://www.sanity.io/manage/project/${id}`\n return [id, members.length, displayName, manage, createdAt].map(String)\n }),\n [sortFields.indexOf(sort)],\n )\n\n const rows = order === 'asc' ? ordered : ordered.toReversed()\n\n // Initialize maxWidths with the width of each header\n const maxWidths = sortFields.map((str) => size(str))\n\n // Calculate maximum width for each column\n for (const row of rows) {\n for (const [i, element] of row.entries()) {\n maxWidths[i] = Math.max(size(element), maxWidths[i])\n }\n }\n\n const printRow = (row: string[]) =>\n row.map((col, i) => `${col}`.padEnd(maxWidths[i])).join(' ')\n\n this.log(chalk.cyan(printRow(sortFields)))\n for (const row of rows) this.log(printRow(row))\n } catch (error) {\n projectsDebug('Error listing projects', error)\n this.error('Failed to list projects', {exit: 1})\n }\n }\n}\n"],"names":["Flags","SanityCommand","subdebug","chalk","size","sortBy","sortFields","LIST_PROJECTS_API_VERSION","projectsDebug","List","description","examples","command","flags","order","string","default","options","sort","run","client","getGlobalApiClient","apiVersion","requireUser","projects","list","ordered","map","createdAt","displayName","id","members","manage","length","String","indexOf","rows","toReversed","maxWidths","str","row","i","element","entries","Math","max","printRow","col","padEnd","join","log","cyan","error","exit"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,KAAK,QAAO,sBAAqB;AACzC,SAAQC,IAAI,EAAEC,MAAM,QAAO,YAAW;AAEtC,MAAMC,aAAa;IAAC;IAAM;IAAW;IAAQ;IAAO;CAAU;AAE9D,MAAMC,4BAA4B;AAClC,MAAMC,gBAAgBN,SAAS;AAE/B,OAAO,MAAMO,aAAaR;IACxB,OAAgBS,cAAc,wCAAuC;IACrE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtBC,OAAOd,MAAMe,MAAM,CAAC;YAClBC,SAAS;YACTC,SAAS;gBAAC;gBAAO;aAAO;QAC1B;QACAC,MAAMlB,MAAMe,MAAM,CAAC;YACjBC,SAAS;YACTC,SAASX;QACX;IACF,EAAC;IAED,MAAaa,MAAM;QACjB,MAAM,EAACL,KAAK,EAAEI,IAAI,EAAC,GAAG,IAAI,CAACL,KAAK;QAEhC,MAAMO,SAAS,MAAM,IAAI,CAACC,kBAAkB,CAAC;YAC3CC,YAAYf;YACZgB,aAAa;QACf;QAEA,IAAI;YACF,MAAMC,WAAW,MAAMJ,OAAOI,QAAQ,CAACC,IAAI;YAC3C,MAAMC,UAAUrB,OACdmB,SAASG,GAAG,CAAC,CAAC,EAACC,SAAS,EAAEC,WAAW,EAAEC,EAAE,EAAEC,UAAU,EAAE,EAAC;gBACtD,MAAMC,SAAS,CAAC,qCAAqC,EAAEF,IAAI;gBAC3D,OAAO;oBAACA;oBAAIC,QAAQE,MAAM;oBAAEJ;oBAAaG;oBAAQJ;iBAAU,CAACD,GAAG,CAACO;YAClE,IACA;gBAAC5B,WAAW6B,OAAO,CAACjB;aAAM;YAG5B,MAAMkB,OAAOtB,UAAU,QAAQY,UAAUA,QAAQW,UAAU;YAE3D,qDAAqD;YACrD,MAAMC,YAAYhC,WAAWqB,GAAG,CAAC,CAACY,MAAQnC,KAAKmC;YAE/C,0CAA0C;YAC1C,KAAK,MAAMC,OAAOJ,KAAM;gBACtB,KAAK,MAAM,CAACK,GAAGC,QAAQ,IAAIF,IAAIG,OAAO,GAAI;oBACxCL,SAAS,CAACG,EAAE,GAAGG,KAAKC,GAAG,CAACzC,KAAKsC,UAAUJ,SAAS,CAACG,EAAE;gBACrD;YACF;YAEA,MAAMK,WAAW,CAACN,MAChBA,IAAIb,GAAG,CAAC,CAACoB,KAAKN,IAAM,GAAGM,KAAK,CAACC,MAAM,CAACV,SAAS,CAACG,EAAE,GAAGQ,IAAI,CAAC;YAE1D,IAAI,CAACC,GAAG,CAAC/C,MAAMgD,IAAI,CAACL,SAASxC;YAC7B,KAAK,MAAMkC,OAAOJ,KAAM,IAAI,CAACc,GAAG,CAACJ,SAASN;QAC5C,EAAE,OAAOY,OAAO;YACd5C,cAAc,0BAA0B4C;YACxC,IAAI,CAACA,KAAK,CAAC,2BAA2B;gBAACC,MAAM;YAAC;QAChD;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/projects/list.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\nimport {size, sortBy} from 'lodash-es'\n\nimport {listProjects} from '../../services/projects.js'\n\nconst sortFields = ['id', 'members', 'name', 'url', 'created']\n\nconst projectsDebug = subdebug('projects')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'Lists projects connected to your user'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List projects',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sort=members --order=asc',\n description: 'List all users of the project, but exclude pending invitations and robots',\n },\n ]\n\n static override flags = {\n order: Flags.string({\n default: 'desc',\n options: ['asc', 'desc'],\n }),\n sort: Flags.string({\n default: 'created',\n options: sortFields,\n }),\n }\n\n public async run() {\n const {order, sort} = this.flags\n\n try {\n const projects = await listProjects()\n const ordered = sortBy(\n projects.map(({createdAt, displayName, id, members = []}) => {\n const manage = `https://www.sanity.io/manage/project/${id}`\n return [id, members.length, displayName, manage, createdAt].map(String)\n }),\n [sortFields.indexOf(sort)],\n )\n\n const rows = order === 'asc' ? ordered : ordered.toReversed()\n\n // Initialize maxWidths with the width of each header\n const maxWidths = sortFields.map((str) => size(str))\n\n // Calculate maximum width for each column\n for (const row of rows) {\n for (const [i, element] of row.entries()) {\n maxWidths[i] = Math.max(size(element), maxWidths[i])\n }\n }\n\n const printRow = (row: string[]) =>\n row.map((col, i) => `${col}`.padEnd(maxWidths[i])).join(' ')\n\n this.log(chalk.cyan(printRow(sortFields)))\n for (const row of rows) this.log(printRow(row))\n } catch (error) {\n projectsDebug('Error listing projects', error)\n this.error('Failed to list projects', {exit: 1})\n }\n }\n}\n"],"names":["Flags","SanityCommand","subdebug","chalk","size","sortBy","listProjects","sortFields","projectsDebug","List","description","examples","command","flags","order","string","default","options","sort","run","projects","ordered","map","createdAt","displayName","id","members","manage","length","String","indexOf","rows","toReversed","maxWidths","str","row","i","element","entries","Math","max","printRow","col","padEnd","join","log","cyan","error","exit"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,KAAK,QAAO,sBAAqB;AACzC,SAAQC,IAAI,EAAEC,MAAM,QAAO,YAAW;AAEtC,SAAQC,YAAY,QAAO,6BAA4B;AAEvD,MAAMC,aAAa;IAAC;IAAM;IAAW;IAAQ;IAAO;CAAU;AAE9D,MAAMC,gBAAgBN,SAAS;AAE/B,OAAO,MAAMO,aAAaR;IACxB,OAAgBS,cAAc,wCAAuC;IACrE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtBC,OAAOd,MAAMe,MAAM,CAAC;YAClBC,SAAS;YACTC,SAAS;gBAAC;gBAAO;aAAO;QAC1B;QACAC,MAAMlB,MAAMe,MAAM,CAAC;YACjBC,SAAS;YACTC,SAASV;QACX;IACF,EAAC;IAED,MAAaY,MAAM;QACjB,MAAM,EAACL,KAAK,EAAEI,IAAI,EAAC,GAAG,IAAI,CAACL,KAAK;QAEhC,IAAI;YACF,MAAMO,WAAW,MAAMd;YACvB,MAAMe,UAAUhB,OACde,SAASE,GAAG,CAAC,CAAC,EAACC,SAAS,EAAEC,WAAW,EAAEC,EAAE,EAAEC,UAAU,EAAE,EAAC;gBACtD,MAAMC,SAAS,CAAC,qCAAqC,EAAEF,IAAI;gBAC3D,OAAO;oBAACA;oBAAIC,QAAQE,MAAM;oBAAEJ;oBAAaG;oBAAQJ;iBAAU,CAACD,GAAG,CAACO;YAClE,IACA;gBAACtB,WAAWuB,OAAO,CAACZ;aAAM;YAG5B,MAAMa,OAAOjB,UAAU,QAAQO,UAAUA,QAAQW,UAAU;YAE3D,qDAAqD;YACrD,MAAMC,YAAY1B,WAAWe,GAAG,CAAC,CAACY,MAAQ9B,KAAK8B;YAE/C,0CAA0C;YAC1C,KAAK,MAAMC,OAAOJ,KAAM;gBACtB,KAAK,MAAM,CAACK,GAAGC,QAAQ,IAAIF,IAAIG,OAAO,GAAI;oBACxCL,SAAS,CAACG,EAAE,GAAGG,KAAKC,GAAG,CAACpC,KAAKiC,UAAUJ,SAAS,CAACG,EAAE;gBACrD;YACF;YAEA,MAAMK,WAAW,CAACN,MAChBA,IAAIb,GAAG,CAAC,CAACoB,KAAKN,IAAM,GAAGM,KAAK,CAACC,MAAM,CAACV,SAAS,CAACG,EAAE,GAAGQ,IAAI,CAAC;YAE1D,IAAI,CAACC,GAAG,CAAC1C,MAAM2C,IAAI,CAACL,SAASlC;YAC7B,KAAK,MAAM4B,OAAOJ,KAAM,IAAI,CAACc,GAAG,CAACJ,SAASN;QAC5C,EAAE,OAAOY,OAAO;YACdvC,cAAc,0BAA0BuC;YACxC,IAAI,CAACA,KAAK,CAAC,2BAA2B;gBAACC,MAAM;YAAC;QAChD;IACF;AACF"}
@@ -9,7 +9,7 @@ export declare class DeleteSchemaCommand extends SanityCommand<typeof DeleteSche
9
9
  dataset: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
10
  'extract-manifest': import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
11
  ids: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
- 'manifest-dir': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ 'manifest-dir': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
13
  verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
14
  };
15
15
  run(): Promise<void>;
@@ -1,7 +1,8 @@
1
1
  import { Flags } from '@oclif/core';
2
- import { SanityCommand, subdebug } from '@sanity/cli-core';
2
+ import { parseStringFlag, SanityCommand, subdebug } from '@sanity/cli-core';
3
3
  import { deleteSchemaAction } from '../../actions/schema/deleteSchemaAction.js';
4
- import { createManifestExtractor } from '../../actions/schema/utils/manifestExtractor.js';
4
+ import { parseIds } from '../../actions/schema/utils/schemaStoreValidation.js';
5
+ import { NO_DATASET_ID, NO_PROJECT_ID } from '../../util/errorMessages.js';
5
6
  const deleteSchemaDebug = subdebug('schema:delete');
6
7
  export class DeleteSchemaCommand extends SanityCommand {
7
8
  static description = 'Delete schema documents by id';
@@ -21,7 +22,8 @@ export class DeleteSchemaCommand extends SanityCommand {
21
22
  ];
22
23
  static flags = {
23
24
  dataset: Flags.string({
24
- description: 'Delete schemas from a specific dataset'
25
+ description: 'Delete schemas from a specific dataset',
26
+ parse: async (input)=>parseStringFlag('dataset', input)
25
27
  }),
26
28
  'extract-manifest': Flags.boolean({
27
29
  allowNo: true,
@@ -32,7 +34,8 @@ export class DeleteSchemaCommand extends SanityCommand {
32
34
  description: 'Comma-separated list of schema ids to delete',
33
35
  required: true
34
36
  }),
35
- 'manifest-dir': Flags.string({
37
+ 'manifest-dir': Flags.directory({
38
+ default: './dist/static',
36
39
  description: 'Directory containing manifest file'
37
40
  }),
38
41
  verbose: Flags.boolean({
@@ -42,38 +45,32 @@ export class DeleteSchemaCommand extends SanityCommand {
42
45
  };
43
46
  async run() {
44
47
  const { flags } = await this.parse(DeleteSchemaCommand);
48
+ const { dataset } = flags;
45
49
  deleteSchemaDebug('Running schema delete with flags: %O', flags);
50
+ const ids = parseIds(flags.ids);
46
51
  try {
47
52
  const workDir = (await this.getProjectRoot()).directory;
48
53
  const cliConfig = await this.getCliConfig();
49
54
  const projectId = await this.getProjectId();
50
- const dataset = cliConfig.api?.dataset;
55
+ const cliDataset = cliConfig.api?.dataset;
51
56
  if (!projectId) {
52
- this.error('No project ID found. Please run this command from a Sanity project directory.', {
57
+ this.error(NO_PROJECT_ID, {
53
58
  exit: 1
54
59
  });
55
60
  }
56
- if (!dataset) {
57
- this.error('No dataset found. Please configure a dataset in your sanity.config.ts.', {
61
+ if (!cliDataset) {
62
+ this.error(NO_DATASET_ID, {
58
63
  exit: 1
59
64
  });
60
65
  }
61
- const result = await deleteSchemaAction(flags, {
62
- apiClient: async ()=>{
63
- const client = await this.getGlobalApiClient({
64
- apiVersion: 'v2025-03-01',
65
- requireUser: true
66
- });
67
- return client.withConfig({
68
- dataset,
69
- projectId
70
- });
71
- },
72
- manifestExtractor: createManifestExtractor({
73
- output: this.output,
74
- workDir
75
- }),
66
+ const result = await deleteSchemaAction({
67
+ dataset,
68
+ extractManifest: flags['extract-manifest'],
69
+ ids,
70
+ manifestDir: flags['manifest-dir'],
76
71
  output: this.output,
72
+ projectId,
73
+ verbose: flags['verbose'],
77
74
  workDir
78
75
  });
79
76
  if (result === 'failure') {