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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/dist/actions/dataset/create.d.ts +49 -0
  2. package/dist/actions/dataset/create.js +48 -0
  3. package/dist/actions/dataset/create.js.map +1 -0
  4. package/dist/actions/dataset/determineDatasetAclMode.d.ts +37 -0
  5. package/dist/actions/dataset/determineDatasetAclMode.js +36 -0
  6. package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -0
  7. package/dist/actions/debug/gatherDebugInfo.js +15 -21
  8. package/dist/actions/debug/gatherDebugInfo.js.map +1 -1
  9. package/dist/actions/debug/types.d.ts +0 -2
  10. package/dist/actions/debug/types.js.map +1 -1
  11. package/dist/actions/deploy/deployApp.js +13 -0
  12. package/dist/actions/deploy/deployApp.js.map +1 -1
  13. package/dist/actions/init/remoteTemplate.js +1 -1
  14. package/dist/actions/init/remoteTemplate.js.map +1 -1
  15. package/dist/actions/manifest/extractAppManifest.d.ts +20 -0
  16. package/dist/actions/manifest/extractAppManifest.js +51 -0
  17. package/dist/actions/manifest/extractAppManifest.js.map +1 -0
  18. package/dist/actions/manifest/extractManifest.js +1 -1
  19. package/dist/actions/manifest/extractManifest.js.map +1 -1
  20. package/dist/actions/manifest/types.d.ts +6 -1
  21. package/dist/actions/manifest/types.js.map +1 -1
  22. package/dist/actions/media/importAspects.js +2 -1
  23. package/dist/actions/media/importAspects.js.map +1 -1
  24. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +1 -1
  25. package/dist/commands/dataset/create.d.ts +0 -2
  26. package/dist/commands/dataset/create.js +8 -54
  27. package/dist/commands/dataset/create.js.map +1 -1
  28. package/dist/commands/debug.js +5 -9
  29. package/dist/commands/debug.js.map +1 -1
  30. package/dist/commands/init.d.ts +6 -1
  31. package/dist/commands/init.js +358 -20
  32. package/dist/commands/init.js.map +1 -1
  33. package/dist/commands/manifest/extract.js +7 -8
  34. package/dist/commands/manifest/extract.js.map +1 -1
  35. package/dist/config/createCliConfig.d.ts +9 -0
  36. package/dist/prompts/init/promptForTypescript.d.ts +2 -0
  37. package/dist/prompts/init/promptForTypescript.js +15 -0
  38. package/dist/prompts/init/promptForTypescript.js.map +1 -0
  39. package/dist/prompts/promptForDatasetAclMode.d.ts +9 -0
  40. package/dist/prompts/promptForDatasetAclMode.js +27 -0
  41. package/dist/prompts/promptForDatasetAclMode.js.map +1 -0
  42. package/dist/prompts/promptForDatasetName.d.ts +1 -1
  43. package/dist/prompts/promptForDatasetName.js +4 -1
  44. package/dist/prompts/promptForDatasetName.js.map +1 -1
  45. package/dist/services/organizations.d.ts +3 -1
  46. package/dist/services/organizations.js +2 -1
  47. package/dist/services/organizations.js.map +1 -1
  48. package/dist/services/user.d.ts +5 -0
  49. package/dist/services/user.js +12 -1
  50. package/dist/services/user.js.map +1 -1
  51. package/dist/services/userApplications.d.ts +3 -1
  52. package/dist/services/userApplications.js +5 -1
  53. package/dist/services/userApplications.js.map +1 -1
  54. package/oclif.manifest.json +113 -113
  55. package/package.json +16 -12
  56. package/templates/app-quickstart/src/App.css +20 -0
  57. package/templates/app-quickstart/src/App.tsx +25 -0
  58. package/templates/app-quickstart/src/ExampleComponent.css +90 -0
  59. package/templates/app-quickstart/src/ExampleComponent.tsx +37 -0
  60. package/templates/app-sanity-ui/src/App.tsx +34 -0
  61. package/templates/app-sanity-ui/src/ExampleComponent.tsx +34 -0
  62. package/templates/app-sanity-ui/src/SanityUI.tsx +23 -0
  63. package/templates/blog/README.md +11 -0
  64. package/templates/blog/schemaTypes/author.js +50 -0
  65. package/templates/blog/schemaTypes/blockContent.js +67 -0
  66. package/templates/blog/schemaTypes/category.js +19 -0
  67. package/templates/blog/schemaTypes/index.js +6 -0
  68. package/templates/blog/schemaTypes/post.js +65 -0
  69. package/templates/blog/static/.gitkeep +1 -0
  70. package/templates/clean/README.md +9 -0
  71. package/templates/clean/schemaTypes/index.js +1 -0
  72. package/templates/clean/static/.gitkeep +1 -0
  73. package/templates/ecommerce/README.md +11 -0
  74. package/templates/ecommerce/plugins/.gitkeep +1 -0
  75. package/templates/ecommerce/plugins/barcode-input/BarcodeInput.js +62 -0
  76. package/templates/ecommerce/plugins/barcode-input/index.js +9 -0
  77. package/templates/ecommerce/plugins/barcode-input/schemaType.js +60 -0
  78. package/templates/ecommerce/schemaTypes/blockContent.js +67 -0
  79. package/templates/ecommerce/schemaTypes/category.js +39 -0
  80. package/templates/ecommerce/schemaTypes/index.js +23 -0
  81. package/templates/ecommerce/schemaTypes/locale/localeBlockContent.js +19 -0
  82. package/templates/ecommerce/schemaTypes/locale/localeString.js +19 -0
  83. package/templates/ecommerce/schemaTypes/locale/localeText.js +19 -0
  84. package/templates/ecommerce/schemaTypes/locale/supportedLanguages.js +5 -0
  85. package/templates/ecommerce/schemaTypes/product.js +83 -0
  86. package/templates/ecommerce/schemaTypes/productVariant.js +52 -0
  87. package/templates/ecommerce/schemaTypes/vendor.js +39 -0
  88. package/templates/ecommerce/static/.gitkeep +1 -0
  89. package/templates/get-started/README.md +9 -0
  90. package/templates/get-started/plugins/.gitkeep +1 -0
  91. package/templates/get-started/plugins/sanity-plugin-tutorial/CustomDefaultLayout.tsx +16 -0
  92. package/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +104 -0
  93. package/templates/get-started/plugins/sanity-plugin-tutorial/index.ts +11 -0
  94. package/templates/get-started/schemaTypes/index.ts +1 -0
  95. package/templates/get-started/static/.gitkeep +1 -0
  96. package/templates/moviedb/README.md +10 -0
  97. package/templates/moviedb/schemaTypes/blockContent.js +67 -0
  98. package/templates/moviedb/schemaTypes/castMember.js +37 -0
  99. package/templates/moviedb/schemaTypes/crewMember.js +52 -0
  100. package/templates/moviedb/schemaTypes/index.js +22 -0
  101. package/templates/moviedb/schemaTypes/movie.js +85 -0
  102. package/templates/moviedb/schemaTypes/person.js +37 -0
  103. package/templates/moviedb/schemaTypes/plotSummaries.js +20 -0
  104. package/templates/moviedb/schemaTypes/plotSummary.js +24 -0
  105. package/templates/moviedb/schemaTypes/screening.js +81 -0
  106. package/templates/moviedb/static/.gitkeep +1 -0
  107. package/templates/quickstart/README.md +9 -0
  108. package/templates/quickstart/schemaTypes/index.js +1 -0
  109. package/templates/quickstart/static/.gitkeep +1 -0
  110. package/templates/shared/gitignore.txt +29 -0
  111. package/templates/shared/tsconfig.json +17 -0
  112. package/templates/shopify/README.md +85 -0
  113. package/templates/shopify/components/hotspots/ProductTooltip.tsx +38 -0
  114. package/templates/shopify/components/icons/Shopify.tsx +20 -0
  115. package/templates/shopify/components/inputs/CollectionHidden.tsx +23 -0
  116. package/templates/shopify/components/inputs/PlaceholderString.tsx +20 -0
  117. package/templates/shopify/components/inputs/ProductHidden.tsx +64 -0
  118. package/templates/shopify/components/inputs/ProductVariantHidden.tsx +24 -0
  119. package/templates/shopify/components/inputs/ProxyString.tsx +32 -0
  120. package/templates/shopify/components/media/ColorTheme.tsx +38 -0
  121. package/templates/shopify/components/media/ShopifyDocumentStatus.tsx +82 -0
  122. package/templates/shopify/components/studio/Navbar.tsx +29 -0
  123. package/templates/shopify/constants.ts +61 -0
  124. package/templates/shopify/docs/features.md +158 -0
  125. package/templates/shopify/plugins/customDocumentActions/index.ts +55 -0
  126. package/templates/shopify/plugins/customDocumentActions/shopifyDelete.tsx +144 -0
  127. package/templates/shopify/plugins/customDocumentActions/shopifyLink.ts +39 -0
  128. package/templates/shopify/plugins/customDocumentActions/types.ts +14 -0
  129. package/templates/shopify/schemaTypes/documents/collection.tsx +142 -0
  130. package/templates/shopify/schemaTypes/documents/colorTheme.tsx +44 -0
  131. package/templates/shopify/schemaTypes/documents/page.ts +70 -0
  132. package/templates/shopify/schemaTypes/documents/product.tsx +132 -0
  133. package/templates/shopify/schemaTypes/documents/productVariant.tsx +67 -0
  134. package/templates/shopify/schemaTypes/index.ts +108 -0
  135. package/templates/shopify/schemaTypes/objects/collection/collectionGroupType.ts +27 -0
  136. package/templates/shopify/schemaTypes/objects/collection/collectionLinksType.ts +16 -0
  137. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorObjectType.tsx +48 -0
  138. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorType.tsx +50 -0
  139. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeObjectType.ts +40 -0
  140. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeType.ts +49 -0
  141. package/templates/shopify/schemaTypes/objects/global/footerType.ts +22 -0
  142. package/templates/shopify/schemaTypes/objects/global/menuLinksType.ts +21 -0
  143. package/templates/shopify/schemaTypes/objects/global/menuType.ts +17 -0
  144. package/templates/shopify/schemaTypes/objects/global/notFoundPageType.ts +37 -0
  145. package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +48 -0
  146. package/templates/shopify/schemaTypes/objects/hotspot/productHotspotsType.tsx +17 -0
  147. package/templates/shopify/schemaTypes/objects/hotspot/spotType.tsx +60 -0
  148. package/templates/shopify/schemaTypes/objects/link/linkEmailType.tsx +34 -0
  149. package/templates/shopify/schemaTypes/objects/link/linkExternalType.tsx +37 -0
  150. package/templates/shopify/schemaTypes/objects/link/linkInternalType.tsx +33 -0
  151. package/templates/shopify/schemaTypes/objects/link/linkProductType.tsx +60 -0
  152. package/templates/shopify/schemaTypes/objects/module/accordionGroupType.ts +33 -0
  153. package/templates/shopify/schemaTypes/objects/module/accordionType.ts +28 -0
  154. package/templates/shopify/schemaTypes/objects/module/callToActionType.tsx +85 -0
  155. package/templates/shopify/schemaTypes/objects/module/calloutType.ts +38 -0
  156. package/templates/shopify/schemaTypes/objects/module/collectionReferenceType.tsx +47 -0
  157. package/templates/shopify/schemaTypes/objects/module/gridItemType.ts +41 -0
  158. package/templates/shopify/schemaTypes/objects/module/gridType.ts +28 -0
  159. package/templates/shopify/schemaTypes/objects/module/heroType.tsx +40 -0
  160. package/templates/shopify/schemaTypes/objects/module/imageCallToActionType.tsx +19 -0
  161. package/templates/shopify/schemaTypes/objects/module/imageFeatureType.ts +80 -0
  162. package/templates/shopify/schemaTypes/objects/module/imageFeaturesType.tsx +51 -0
  163. package/templates/shopify/schemaTypes/objects/module/instagramType.ts +35 -0
  164. package/templates/shopify/schemaTypes/objects/module/productFeaturesType.tsx +50 -0
  165. package/templates/shopify/schemaTypes/objects/module/productReferenceType.tsx +42 -0
  166. package/templates/shopify/schemaTypes/objects/seoType.ts +31 -0
  167. package/templates/shopify/schemaTypes/objects/shopify/collectionRuleType.tsx +37 -0
  168. package/templates/shopify/schemaTypes/objects/shopify/inventoryType.ts +25 -0
  169. package/templates/shopify/schemaTypes/objects/shopify/optionType.tsx +31 -0
  170. package/templates/shopify/schemaTypes/objects/shopify/placeholderStringType.ts +11 -0
  171. package/templates/shopify/schemaTypes/objects/shopify/priceRangeType.ts +20 -0
  172. package/templates/shopify/schemaTypes/objects/shopify/productWithVariantType.tsx +142 -0
  173. package/templates/shopify/schemaTypes/objects/shopify/proxyStringType.ts +12 -0
  174. package/templates/shopify/schemaTypes/objects/shopify/shopType.ts +15 -0
  175. package/templates/shopify/schemaTypes/objects/shopify/shopifyCollectionType.ts +84 -0
  176. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductType.ts +131 -0
  177. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductVariantType.ts +121 -0
  178. package/templates/shopify/schemaTypes/portableText/portableTextSimpleType.tsx +45 -0
  179. package/templates/shopify/schemaTypes/portableText/portableTextType.tsx +52 -0
  180. package/templates/shopify/schemaTypes/singletons/homeType.ts +49 -0
  181. package/templates/shopify/schemaTypes/singletons/settingsType.ts +96 -0
  182. package/templates/shopify/static/.gitkeep +1 -0
  183. package/templates/shopify/structure/collectionStructure.ts +9 -0
  184. package/templates/shopify/structure/colorThemeStructure.ts +9 -0
  185. package/templates/shopify/structure/homeStructure.ts +9 -0
  186. package/templates/shopify/structure/index.ts +57 -0
  187. package/templates/shopify/structure/pageStructure.ts +11 -0
  188. package/templates/shopify/structure/productStructure.ts +51 -0
  189. package/templates/shopify/structure/settingStructure.ts +9 -0
  190. package/templates/shopify/utils/blocksToText.ts +20 -0
  191. package/templates/shopify/utils/defineStructure.ts +11 -0
  192. package/templates/shopify/utils/getPriceRange.ts +24 -0
  193. package/templates/shopify/utils/shopifyUrls.ts +22 -0
  194. package/templates/shopify/utils/validateSlug.ts +18 -0
  195. package/templates/shopify-online-storefront/README.md +54 -0
  196. package/templates/shopify-online-storefront/components/icons/Shopify.tsx +22 -0
  197. package/templates/shopify-online-storefront/components/inputs/CollectionHidden.tsx +23 -0
  198. package/templates/shopify-online-storefront/components/inputs/PlaceholderString.tsx +25 -0
  199. package/templates/shopify-online-storefront/components/inputs/ProductHidden.tsx +66 -0
  200. package/templates/shopify-online-storefront/components/inputs/ProductVariantHidden.tsx +25 -0
  201. package/templates/shopify-online-storefront/components/inputs/ProxyString.tsx +38 -0
  202. package/templates/shopify-online-storefront/components/media/ShopifyDocumentStatus.tsx +83 -0
  203. package/templates/shopify-online-storefront/constants.ts +18 -0
  204. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/index.ts +45 -0
  205. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyDelete.tsx +144 -0
  206. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyLink.ts +39 -0
  207. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/types.ts +14 -0
  208. package/templates/shopify-online-storefront/schemaTypes/blocks/blockContent.ts +32 -0
  209. package/templates/shopify-online-storefront/schemaTypes/documents/collection.tsx +83 -0
  210. package/templates/shopify-online-storefront/schemaTypes/documents/product.tsx +102 -0
  211. package/templates/shopify-online-storefront/schemaTypes/documents/productVariant.tsx +82 -0
  212. package/templates/shopify-online-storefront/schemaTypes/index.ts +43 -0
  213. package/templates/shopify-online-storefront/schemaTypes/objects/accordion.ts +31 -0
  214. package/templates/shopify-online-storefront/schemaTypes/objects/accordionGroup.ts +35 -0
  215. package/templates/shopify-online-storefront/schemaTypes/objects/callout.ts +40 -0
  216. package/templates/shopify-online-storefront/schemaTypes/objects/inventory.ts +30 -0
  217. package/templates/shopify-online-storefront/schemaTypes/objects/option.ts +30 -0
  218. package/templates/shopify-online-storefront/schemaTypes/objects/priceRange.ts +22 -0
  219. package/templates/shopify-online-storefront/schemaTypes/objects/proxyString.ts +11 -0
  220. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollection.ts +109 -0
  221. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollectionRule.tsx +45 -0
  222. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProduct.ts +165 -0
  223. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProductVariant.ts +151 -0
  224. package/templates/shopify-online-storefront/structure/collectionStructure.ts +9 -0
  225. package/templates/shopify-online-storefront/structure/index.ts +37 -0
  226. package/templates/shopify-online-storefront/structure/productStructure.ts +35 -0
  227. package/templates/shopify-online-storefront/utils/defineStructure.ts +11 -0
  228. package/templates/shopify-online-storefront/utils/getPriceRange.ts +24 -0
  229. package/templates/shopify-online-storefront/utils/shopifyUrls.ts +22 -0
  230. package/dist/actions/build/__tests__/buildApp.test.js +0 -367
  231. package/dist/actions/build/__tests__/buildApp.test.js.map +0 -1
  232. package/dist/actions/build/__tests__/buildStudio.test.js +0 -561
  233. package/dist/actions/build/__tests__/buildStudio.test.js.map +0 -1
  234. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js +0 -233
  235. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js.map +0 -1
  236. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js +0 -414
  237. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js.map +0 -1
  238. package/dist/actions/build/__tests__/determineBasePath.test.js +0 -24
  239. package/dist/actions/build/__tests__/determineBasePath.test.js.map +0 -1
  240. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js +0 -109
  241. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js.map +0 -1
  242. package/dist/actions/build/__tests__/getViteConfig.test.js +0 -493
  243. package/dist/actions/build/__tests__/getViteConfig.test.js.map +0 -1
  244. package/dist/actions/build/__tests__/renderDocument.test.js +0 -278
  245. package/dist/actions/build/__tests__/renderDocument.test.js.map +0 -1
  246. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js +0 -153
  247. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js.map +0 -1
  248. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js +0 -657
  249. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js.map +0 -1
  250. package/dist/actions/dataset/__tests__/validateDatasetName.test.js +0 -182
  251. package/dist/actions/dataset/__tests__/validateDatasetName.test.js.map +0 -1
  252. package/dist/actions/deploy/__tests__/checkDir.test.js +0 -120
  253. package/dist/actions/deploy/__tests__/checkDir.test.js.map +0 -1
  254. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js +0 -16
  255. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js.map +0 -1
  256. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js +0 -124
  257. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js.map +0 -1
  258. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +0 -274
  259. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +0 -1
  260. package/dist/actions/media/__tests__/importMedia.test.js +0 -182
  261. package/dist/actions/media/__tests__/importMedia.test.js.map +0 -1
  262. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js +0 -174
  263. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js.map +0 -1
  264. package/dist/actions/schema/__tests__/validateAction.test.js +0 -281
  265. package/dist/actions/schema/__tests__/validateAction.test.js.map +0 -1
  266. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js +0 -27
  267. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js.map +0 -1
  268. package/dist/actions/users/__tests__/validateEmail.test.js +0 -16
  269. package/dist/actions/users/__tests__/validateEmail.test.js.map +0 -1
  270. package/dist/commands/__tests__/blueprints.test.js +0 -54
  271. package/dist/commands/__tests__/blueprints.test.js.map +0 -1
  272. package/dist/commands/__tests__/build.test.js +0 -132
  273. package/dist/commands/__tests__/build.test.js.map +0 -1
  274. package/dist/commands/__tests__/codemod.test.js +0 -271
  275. package/dist/commands/__tests__/codemod.test.js.map +0 -1
  276. package/dist/commands/__tests__/debug.test.js +0 -590
  277. package/dist/commands/__tests__/debug.test.js.map +0 -1
  278. package/dist/commands/__tests__/deploy.test.js +0 -1945
  279. package/dist/commands/__tests__/deploy.test.js.map +0 -1
  280. package/dist/commands/__tests__/dev.test.js +0 -453
  281. package/dist/commands/__tests__/dev.test.js.map +0 -1
  282. package/dist/commands/__tests__/exec.test.js +0 -207
  283. package/dist/commands/__tests__/exec.test.js.map +0 -1
  284. package/dist/commands/__tests__/init/init.authentication.test.js +0 -73
  285. package/dist/commands/__tests__/init/init.authentication.test.js.map +0 -1
  286. package/dist/commands/__tests__/init/init.create-new-project.test.js +0 -195
  287. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +0 -1
  288. package/dist/commands/__tests__/init/init.plan.test.js +0 -279
  289. package/dist/commands/__tests__/init/init.plan.test.js.map +0 -1
  290. package/dist/commands/__tests__/init/init.setup.test.js +0 -335
  291. package/dist/commands/__tests__/init/init.setup.test.js.map +0 -1
  292. package/dist/commands/__tests__/install.test.js +0 -282
  293. package/dist/commands/__tests__/install.test.js.map +0 -1
  294. package/dist/commands/__tests__/learn.test.js +0 -29
  295. package/dist/commands/__tests__/learn.test.js.map +0 -1
  296. package/dist/commands/__tests__/logout.test.js +0 -91
  297. package/dist/commands/__tests__/logout.test.js.map +0 -1
  298. package/dist/commands/__tests__/manage.test.js +0 -110
  299. package/dist/commands/__tests__/manage.test.js.map +0 -1
  300. package/dist/commands/__tests__/migration.test.js +0 -119
  301. package/dist/commands/__tests__/migration.test.js.map +0 -1
  302. package/dist/commands/__tests__/preview.test.js +0 -261
  303. package/dist/commands/__tests__/preview.test.js.map +0 -1
  304. package/dist/commands/__tests__/start.test.js +0 -253
  305. package/dist/commands/__tests__/start.test.js.map +0 -1
  306. package/dist/commands/__tests__/undeploy.test.js +0 -382
  307. package/dist/commands/__tests__/undeploy.test.js.map +0 -1
  308. package/dist/commands/__tests__/versions.test.js +0 -142
  309. package/dist/commands/__tests__/versions.test.js.map +0 -1
  310. package/dist/commands/backup/__tests__/disable.test.js +0 -204
  311. package/dist/commands/backup/__tests__/disable.test.js.map +0 -1
  312. package/dist/commands/backup/__tests__/download.test.js +0 -768
  313. package/dist/commands/backup/__tests__/download.test.js.map +0 -1
  314. package/dist/commands/backup/__tests__/enable.test.js +0 -286
  315. package/dist/commands/backup/__tests__/enable.test.js.map +0 -1
  316. package/dist/commands/backup/__tests__/list.test.js +0 -330
  317. package/dist/commands/backup/__tests__/list.test.js.map +0 -1
  318. package/dist/commands/cors/__tests__/add.test.js +0 -376
  319. package/dist/commands/cors/__tests__/add.test.js.map +0 -1
  320. package/dist/commands/cors/__tests__/delete.test.js +0 -308
  321. package/dist/commands/cors/__tests__/delete.test.js.map +0 -1
  322. package/dist/commands/cors/__tests__/list.test.js +0 -241
  323. package/dist/commands/cors/__tests__/list.test.js.map +0 -1
  324. package/dist/commands/dataset/__tests__/copy.test.js +0 -628
  325. package/dist/commands/dataset/__tests__/copy.test.js.map +0 -1
  326. package/dist/commands/dataset/__tests__/create.test.js +0 -342
  327. package/dist/commands/dataset/__tests__/create.test.js.map +0 -1
  328. package/dist/commands/dataset/__tests__/delete.test.js +0 -231
  329. package/dist/commands/dataset/__tests__/delete.test.js.map +0 -1
  330. package/dist/commands/dataset/__tests__/export.test.js +0 -601
  331. package/dist/commands/dataset/__tests__/export.test.js.map +0 -1
  332. package/dist/commands/dataset/__tests__/import.test.js +0 -53
  333. package/dist/commands/dataset/__tests__/import.test.js.map +0 -1
  334. package/dist/commands/dataset/__tests__/list.test.js +0 -216
  335. package/dist/commands/dataset/__tests__/list.test.js.map +0 -1
  336. package/dist/commands/dataset/alias/__tests__/create.test.js +0 -339
  337. package/dist/commands/dataset/alias/__tests__/create.test.js.map +0 -1
  338. package/dist/commands/dataset/alias/__tests__/delete.test.js +0 -247
  339. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +0 -1
  340. package/dist/commands/dataset/alias/__tests__/link.test.js +0 -376
  341. package/dist/commands/dataset/alias/__tests__/link.test.js.map +0 -1
  342. package/dist/commands/dataset/alias/__tests__/unlink.test.js +0 -313
  343. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +0 -1
  344. package/dist/commands/dataset/visibility/__tests__/get.test.js +0 -128
  345. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +0 -1
  346. package/dist/commands/dataset/visibility/__tests__/set.test.js +0 -198
  347. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +0 -1
  348. package/dist/commands/docs/__tests__/browse.test.js +0 -29
  349. package/dist/commands/docs/__tests__/browse.test.js.map +0 -1
  350. package/dist/commands/docs/__tests__/read.test.js +0 -78
  351. package/dist/commands/docs/__tests__/read.test.js.map +0 -1
  352. package/dist/commands/docs/__tests__/search.test.js +0 -255
  353. package/dist/commands/docs/__tests__/search.test.js.map +0 -1
  354. package/dist/commands/documents/__tests__/create.test.js +0 -1030
  355. package/dist/commands/documents/__tests__/create.test.js.map +0 -1
  356. package/dist/commands/documents/__tests__/delete.test.js +0 -300
  357. package/dist/commands/documents/__tests__/delete.test.js.map +0 -1
  358. package/dist/commands/documents/__tests__/get.test.js +0 -182
  359. package/dist/commands/documents/__tests__/get.test.js.map +0 -1
  360. package/dist/commands/documents/__tests__/query.test.js +0 -300
  361. package/dist/commands/documents/__tests__/query.test.js.map +0 -1
  362. package/dist/commands/documents/__tests__/validate.test.js +0 -249
  363. package/dist/commands/documents/__tests__/validate.test.js.map +0 -1
  364. package/dist/commands/graphql/__tests__/list.test.js +0 -240
  365. package/dist/commands/graphql/__tests__/list.test.js.map +0 -1
  366. package/dist/commands/graphql/__tests__/undeploy.test.js +0 -410
  367. package/dist/commands/graphql/__tests__/undeploy.test.js.map +0 -1
  368. package/dist/commands/hook/__tests__/attempt.test.js +0 -275
  369. package/dist/commands/hook/__tests__/attempt.test.js.map +0 -1
  370. package/dist/commands/hook/__tests__/create.test.js +0 -119
  371. package/dist/commands/hook/__tests__/create.test.js.map +0 -1
  372. package/dist/commands/hook/__tests__/delete.test.js +0 -233
  373. package/dist/commands/hook/__tests__/delete.test.js.map +0 -1
  374. package/dist/commands/hook/__tests__/list.test.js +0 -145
  375. package/dist/commands/hook/__tests__/list.test.js.map +0 -1
  376. package/dist/commands/hook/__tests__/logs.test.js +0 -798
  377. package/dist/commands/hook/__tests__/logs.test.js.map +0 -1
  378. package/dist/commands/manifest/__tests__/extract.test.js +0 -132
  379. package/dist/commands/manifest/__tests__/extract.test.js.map +0 -1
  380. package/dist/commands/mcp/__tests__/configure.test.js +0 -397
  381. package/dist/commands/mcp/__tests__/configure.test.js.map +0 -1
  382. package/dist/commands/media/__tests__/create-aspect.test.js +0 -173
  383. package/dist/commands/media/__tests__/create-aspect.test.js.map +0 -1
  384. package/dist/commands/media/__tests__/delete-aspect.test.js +0 -342
  385. package/dist/commands/media/__tests__/delete-aspect.test.js.map +0 -1
  386. package/dist/commands/media/__tests__/deploy-aspect.test.js +0 -619
  387. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +0 -1
  388. package/dist/commands/media/__tests__/export.test.js +0 -697
  389. package/dist/commands/media/__tests__/export.test.js.map +0 -1
  390. package/dist/commands/media/__tests__/import.test.js +0 -347
  391. package/dist/commands/media/__tests__/import.test.js.map +0 -1
  392. package/dist/commands/openapi/__tests__/get.test.js +0 -149
  393. package/dist/commands/openapi/__tests__/get.test.js.map +0 -1
  394. package/dist/commands/openapi/__tests__/list.test.js +0 -113
  395. package/dist/commands/openapi/__tests__/list.test.js.map +0 -1
  396. package/dist/commands/projects/__tests__/list.test.js +0 -154
  397. package/dist/commands/projects/__tests__/list.test.js.map +0 -1
  398. package/dist/commands/schema/__tests__/delete.test.js +0 -454
  399. package/dist/commands/schema/__tests__/delete.test.js.map +0 -1
  400. package/dist/commands/schema/__tests__/deploy.test.js +0 -348
  401. package/dist/commands/schema/__tests__/deploy.test.js.map +0 -1
  402. package/dist/commands/schema/__tests__/extract.test.js +0 -121
  403. package/dist/commands/schema/__tests__/extract.test.js.map +0 -1
  404. package/dist/commands/schema/__tests__/list.test.js +0 -399
  405. package/dist/commands/schema/__tests__/list.test.js.map +0 -1
  406. package/dist/commands/schema/__tests__/validate.test.js +0 -121
  407. package/dist/commands/schema/__tests__/validate.test.js.map +0 -1
  408. package/dist/commands/telemetry/__tests__/disable.test.js +0 -147
  409. package/dist/commands/telemetry/__tests__/disable.test.js.map +0 -1
  410. package/dist/commands/telemetry/__tests__/enable.test.js +0 -133
  411. package/dist/commands/telemetry/__tests__/enable.test.js.map +0 -1
  412. package/dist/commands/telemetry/__tests__/status.test.js +0 -155
  413. package/dist/commands/telemetry/__tests__/status.test.js.map +0 -1
  414. package/dist/commands/tokens/__tests__/add.test.js +0 -435
  415. package/dist/commands/tokens/__tests__/add.test.js.map +0 -1
  416. package/dist/commands/tokens/__tests__/delete.test.js +0 -405
  417. package/dist/commands/tokens/__tests__/delete.test.js.map +0 -1
  418. package/dist/commands/tokens/__tests__/list.test.js +0 -395
  419. package/dist/commands/tokens/__tests__/list.test.js.map +0 -1
  420. package/dist/commands/users/__tests__/invite.test.js +0 -362
  421. package/dist/commands/users/__tests__/invite.test.js.map +0 -1
  422. package/dist/commands/users/__tests__/list.test.js +0 -407
  423. package/dist/commands/users/__tests__/list.test.js.map +0 -1
  424. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js +0 -77
  425. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js.map +0 -1
  426. package/dist/services/__tests__/datasetAliases.test.js +0 -131
  427. package/dist/services/__tests__/datasetAliases.test.js.map +0 -1
  428. package/dist/services/__tests__/datasets.test.js +0 -436
  429. package/dist/services/__tests__/datasets.test.js.map +0 -1
  430. package/dist/services/__tests__/graphql.test.js +0 -43
  431. package/dist/services/__tests__/graphql.test.js.map +0 -1
  432. package/dist/services/__tests__/mediaLibraries.test.js +0 -88
  433. package/dist/services/__tests__/mediaLibraries.test.js.map +0 -1
  434. package/dist/services/__tests__/projects.test.js +0 -41
  435. package/dist/services/__tests__/projects.test.js.map +0 -1
  436. package/dist/services/__tests__/userApplications.test.js +0 -113
  437. package/dist/services/__tests__/userApplications.test.js.map +0 -1
  438. package/dist/util/__tests__/appId.test.js +0 -31
  439. package/dist/util/__tests__/appId.test.js.map +0 -1
  440. package/dist/util/__tests__/cliClient.test.js +0 -184
  441. package/dist/util/__tests__/cliClient.test.js.map +0 -1
  442. package/dist/util/__tests__/compareDependencyVersions.test.js +0 -426
  443. package/dist/util/__tests__/compareDependencyVersions.test.js.map +0 -1
  444. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js +0 -74
  445. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js.map +0 -1
  446. package/dist/util/__tests__/findNdjsonEntry.test.js +0 -54
  447. package/dist/util/__tests__/findNdjsonEntry.test.js.map +0 -1
  448. package/dist/util/__tests__/getCliVersion.test.js +0 -28
  449. package/dist/util/__tests__/getCliVersion.test.js.map +0 -1
  450. package/dist/util/__tests__/getLocalPackageVersion.test.js +0 -84
  451. package/dist/util/__tests__/getLocalPackageVersion.test.js.map +0 -1
  452. package/dist/util/__tests__/getWorkspace.test.js +0 -37
  453. package/dist/util/__tests__/getWorkspace.test.js.map +0 -1
  454. package/dist/util/__tests__/readPackageJson.test.js +0 -69
  455. package/dist/util/__tests__/readPackageJson.test.js.map +0 -1
  456. package/dist/util/__tests__/warnAboutMissingAppId.test.js +0 -28
  457. package/dist/util/__tests__/warnAboutMissingAppId.test.js.map +0 -1
  458. package/dist/util/packageManager/__tests__/installPackages.test.js +0 -388
  459. package/dist/util/packageManager/__tests__/installPackages.test.js.map +0 -1
  460. package/dist/util/validation/ __tests__/validateDocuments.test.js +0 -274
  461. package/dist/util/validation/ __tests__/validateDocuments.test.js.map +0 -1
@@ -1,20 +1,25 @@
1
1
  // @Todo will remove by time migration of this command is complete
2
2
  /* eslint-disable @typescript-eslint/no-unused-vars */ import { Args, Flags } from '@oclif/core';
3
+ import { CLIError } from '@oclif/core/errors';
3
4
  import { getCliToken, SanityCommand, subdebug } from '@sanity/cli-core';
4
- import { confirm, input, logSymbols, select, spinner } from '@sanity/cli-core/ux';
5
+ import { chalk, confirm, input, logSymbols, select, Separator, spinner } from '@sanity/cli-core/ux';
5
6
  import { isHttpError } from '@sanity/client';
6
7
  import { frameworks } from '@vercel/frameworks';
7
8
  import { detectFrameworkRecord, LocalFileSystemDetector } from '@vercel/fs-detectors';
8
9
  import { getProviderName } from '../actions/auth/getProviderName.js';
9
10
  import { login } from '../actions/auth/login/login.js';
11
+ import { createDataset } from '../actions/dataset/create.js';
10
12
  import { determineAppTemplate } from '../actions/init/determineAppTemplate.js';
11
13
  import { checkIsRemoteTemplate, getGitHubRepoInfo } from '../actions/init/remoteTemplate.js';
12
14
  import { getOrganizationChoices } from '../actions/organizations/getOrganizationChoices.js';
13
15
  import { getOrganizationsWithAttachGrantInfo } from '../actions/organizations/getOrganizationsWithAttachGrantInfo.js';
14
- import { createDataset } from '../services/datasets.js';
16
+ import { hasProjectAttachGrant } from '../actions/organizations/hasProjectAttachGrant.js';
17
+ import { promptForDatasetName } from '../prompts/promptForDatasetName.js';
18
+ import { createDataset as createDatasetService, listDatasets } from '../services/datasets.js';
19
+ import { getProjectFeatures } from '../services/getProjectFeatures.js';
15
20
  import { createOrganization, listOrganizations } from '../services/organizations.js';
16
21
  import { getPlanId, getPlanIdFromCoupon } from '../services/plans.js';
17
- import { createProject } from '../services/projects.js';
22
+ import { createProject, listProjects } from '../services/projects.js';
18
23
  import { getCliUser } from '../services/user.js';
19
24
  const debug = subdebug('init');
20
25
  export class InitCommand extends SanityCommand {
@@ -85,7 +90,7 @@ export class InitCommand extends SanityCommand {
85
90
  helpValue: '<filename>',
86
91
  parse: async (input)=>{
87
92
  if (!input.startsWith('.env')) {
88
- throw new Error('Env filename (`--env`) must start with `.env`');
93
+ throw new CLIError('Env filename (`--env`) must start with `.env`');
89
94
  }
90
95
  return input;
91
96
  }
@@ -249,12 +254,14 @@ export class InitCommand extends SanityCommand {
249
254
  }
250
255
  // Oclif doesn't support custom exclusive error messaging
251
256
  if (this.flags.project && this.flags.organization) {
252
- throw new Error('You have specified both a project and an organization. To move a project to an organization please visit https://www.sanity.io/manage');
257
+ this.error('You have specified both a project and an organization. To move a project to an organization please visit https://www.sanity.io/manage', {
258
+ exit: 1
259
+ });
253
260
  }
254
261
  const defaultConfig = this.flags['dataset-default'];
255
- let _showDefaultConfigPrompt = !defaultConfig;
262
+ let showDefaultConfigPrompt = !defaultConfig;
256
263
  if (this.flags.dataset || this.flags.visibility || this.flags['dataset-default'] || this.isUnattended()) {
257
- _showDefaultConfigPrompt = false;
264
+ showDefaultConfigPrompt = false;
258
265
  }
259
266
  const detectedFramework = await detectFrameworkRecord({
260
267
  frameworkList: frameworks,
@@ -313,29 +320,52 @@ export class InitCommand extends SanityCommand {
313
320
  this.log(`${logSymbols.success} Fetching existing projects`);
314
321
  this.log('');
315
322
  }
316
- const _newProjectId = createProjectName && await this.createProject({
323
+ const _newProjectId = createProjectName && await this.createProjectFromName({
317
324
  createProjectName,
318
325
  planId,
319
326
  user
320
327
  });
328
+ const { datasetName, projectId } = await this.getProjectDetails({
329
+ isAppTemplate,
330
+ planId,
331
+ showDefaultConfigPrompt,
332
+ user
333
+ });
334
+ // If user doesn't want to output any template code
335
+ if (this.flags.bare) {
336
+ this.log(`${logSymbols.success} Below are your project details`);
337
+ this.log('');
338
+ this.log(`Project ID: ${chalk.cyan(projectId)}`);
339
+ this.log(`Dataset: ${chalk.cyan(datasetName)}`);
340
+ this.log(`\nYou can find your project on Sanity Manage — https://www.sanity.io/manage/project/${projectId}\n`);
341
+ return;
342
+ }
321
343
  }
322
344
  checkFlagsInUnattendedMode({ createProjectName, isNextJs }) {
323
345
  debug('Unattended mode, validating required options');
324
346
  if (!this.flags['dataset']) {
325
- throw new Error(`\`--dataset\` must be specified in unattended mode`);
347
+ this.error(`\`--dataset\` must be specified in unattended mode`, {
348
+ exit: 1
349
+ });
326
350
  }
327
351
  // output-path is required in unattended mode when not using nextjs
328
352
  if (!isNextJs && !this.flags['output-path']) {
329
- throw new Error(`\`--output-path\` must be specified in unattended mode`);
353
+ this.error(`\`--output-path\` must be specified in unattended mode`, {
354
+ exit: 1
355
+ });
330
356
  }
331
357
  if (!this.flags.project && !createProjectName) {
332
- throw new Error('`--project <id>` or `--create-project <name>` must be specified in unattended mode');
358
+ this.error('`--project <id>` or `--create-project <name>` must be specified in unattended mode', {
359
+ exit: 1
360
+ });
333
361
  }
334
362
  if (createProjectName && !this.flags.organization) {
335
- throw new Error('--create-project is not supported in unattended mode without an organization, please specify an organization with `--organization <id>`');
363
+ this.error('--create-project is not supported in unattended mode without an organization, please specify an organization with `--organization <id>`', {
364
+ exit: 1
365
+ });
336
366
  }
337
367
  }
338
- async createProject({ createProjectName, planId, user }) {
368
+ async createProjectFromName({ createProjectName, planId, user }) {
339
369
  debug('--create-project specified, creating a new project');
340
370
  let orgForCreateProjectFlag = this.flags.organization;
341
371
  if (!orgForCreateProjectFlag) {
@@ -361,7 +391,7 @@ export class InitCommand extends SanityCommand {
361
391
  if (this.flags.dataset) {
362
392
  debug('--dataset specified, creating dataset (%s)', this.flags.dataset);
363
393
  const spin = spinner('Creating dataset').start();
364
- await createDataset({
394
+ await createDatasetService({
365
395
  aclMode: this.flags.visibility,
366
396
  datasetName: this.flags.dataset,
367
397
  projectId: createdProject.projectId
@@ -390,7 +420,9 @@ export class InitCommand extends SanityCommand {
390
420
  // trace.log({ step: 'login', alreadyLoggedIn: true })
391
421
  } else {
392
422
  if (this.isUnattended()) {
393
- throw new Error('Must be logged in to run this command in unattended mode, run `sanity login`');
423
+ this.error('Must be logged in to run this command in unattended mode, run `sanity login`', {
424
+ exit: 1
425
+ });
394
426
  }
395
427
  // @todo telemetry
396
428
  //trace.log({step: 'login'})
@@ -405,6 +437,220 @@ export class InitCommand extends SanityCommand {
405
437
  user
406
438
  };
407
439
  }
440
+ async getOrCreateDataset(opts) {
441
+ const visibility = this.flags.visibility;
442
+ const dataset = this.flags.dataset;
443
+ let defaultConfig = this.flags['dataset-default'];
444
+ if (dataset && this.isUnattended()) {
445
+ return {
446
+ datasetName: dataset,
447
+ userAction: 'none'
448
+ };
449
+ }
450
+ const [datasets, projectFeatures] = await Promise.all([
451
+ listDatasets(opts.projectId),
452
+ getProjectFeatures(opts.projectId)
453
+ ]);
454
+ if (dataset) {
455
+ debug('User has specified dataset through a flag (%s)', dataset);
456
+ const existing = datasets.find((ds)=>ds.name === dataset);
457
+ if (!existing) {
458
+ debug('Specified dataset not found, creating it');
459
+ await createDataset({
460
+ datasetName: dataset,
461
+ forcePublic: defaultConfig,
462
+ output: this.output,
463
+ projectFeatures,
464
+ projectId: opts.projectId,
465
+ visibility
466
+ });
467
+ }
468
+ return {
469
+ datasetName: dataset,
470
+ userAction: 'none'
471
+ };
472
+ }
473
+ const datasetInfo = '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".';
474
+ if (datasets.length === 0) {
475
+ debug('No datasets found for project, prompting for name');
476
+ if (opts.showDefaultConfigPrompt) {
477
+ this.log(datasetInfo);
478
+ defaultConfig = await this.promptForDefaultConfig();
479
+ }
480
+ const name = defaultConfig ? 'production' : await promptForDatasetName({
481
+ message: 'Name of your first dataset:'
482
+ });
483
+ await createDataset({
484
+ datasetName: name,
485
+ forcePublic: defaultConfig,
486
+ output: this.output,
487
+ projectFeatures,
488
+ projectId: opts.projectId,
489
+ visibility
490
+ });
491
+ return {
492
+ datasetName: name,
493
+ userAction: 'create'
494
+ };
495
+ }
496
+ debug(`User has ${datasets.length} dataset(s) already, showing list of choices`);
497
+ const datasetChoices = datasets.map((dataset)=>({
498
+ value: dataset.name
499
+ }));
500
+ const selected = await select({
501
+ choices: [
502
+ {
503
+ name: 'Create new dataset',
504
+ value: 'new'
505
+ },
506
+ new Separator(),
507
+ ...datasetChoices
508
+ ],
509
+ message: 'Select dataset to use'
510
+ });
511
+ if (selected === 'new') {
512
+ const existingDatasetNames = datasets.map((ds)=>ds.name);
513
+ debug('User wants to create a new dataset, prompting for name');
514
+ if (opts.showDefaultConfigPrompt && !existingDatasetNames.includes('production')) {
515
+ this.log(datasetInfo);
516
+ defaultConfig = await this.promptForDefaultConfig();
517
+ }
518
+ const newDatasetName = defaultConfig ? 'production' : await promptForDatasetName({
519
+ message: 'Dataset name:'
520
+ }, existingDatasetNames);
521
+ await createDataset({
522
+ datasetName: newDatasetName,
523
+ forcePublic: defaultConfig,
524
+ output: this.output,
525
+ projectFeatures,
526
+ projectId: opts.projectId,
527
+ visibility
528
+ });
529
+ return {
530
+ datasetName: newDatasetName,
531
+ userAction: 'create'
532
+ };
533
+ }
534
+ debug(`Returning selected dataset (${selected})`);
535
+ return {
536
+ datasetName: selected,
537
+ userAction: 'select'
538
+ };
539
+ }
540
+ async getOrCreateProject({ planId, user }) {
541
+ const projectId = this.flags.project;
542
+ const organizationId = this.flags.organization;
543
+ let projects;
544
+ let organizations;
545
+ try {
546
+ const [allProjects, allOrgs] = await Promise.all([
547
+ listProjects(),
548
+ listOrganizations()
549
+ ]);
550
+ projects = allProjects.toSorted((a, b)=>b.createdAt.localeCompare(a.createdAt));
551
+ organizations = allOrgs;
552
+ } catch (err) {
553
+ if (this.isUnattended() && projectId) {
554
+ return {
555
+ displayName: 'Unknown project',
556
+ isFirstProject: false,
557
+ projectId,
558
+ userAction: 'select'
559
+ };
560
+ }
561
+ this.error(`Failed to communicate with the Sanity API:\n${err.message}`, {
562
+ exit: 1
563
+ });
564
+ }
565
+ if (projects.length === 0 && this.isUnattended()) {
566
+ this.error('No projects found for current user', {
567
+ exit: 1
568
+ });
569
+ }
570
+ if (projectId) {
571
+ const project = projects.find((proj)=>proj.id === projectId);
572
+ if (!project && !this.isUnattended()) {
573
+ this.error(`Given project ID (${projectId}) not found, or you do not have access to it`, {
574
+ exit: 1
575
+ });
576
+ }
577
+ return {
578
+ displayName: project ? project.displayName : 'Unknown project',
579
+ isFirstProject: false,
580
+ projectId,
581
+ userAction: 'select'
582
+ };
583
+ }
584
+ if (organizationId) {
585
+ const organization = organizations.find((org)=>org.id === organizationId) || organizations.find((org)=>org.slug === organizationId);
586
+ if (!organization) {
587
+ this.error(`Given organization ID (${organizationId}) not found, or you do not have access to it`, {
588
+ exit: 1
589
+ });
590
+ }
591
+ if (!await hasProjectAttachGrant(organizationId)) {
592
+ this.error('You lack the necessary permissions to attach a project to this organization', {
593
+ exit: 1
594
+ });
595
+ }
596
+ }
597
+ // If the user has no projects or is using a coupon (which can only be applied to new projects)
598
+ // just ask for project details instead of showing a list of projects
599
+ const isUsersFirstProject = projects.length === 0;
600
+ if (isUsersFirstProject || this.flags.coupon) {
601
+ debug(isUsersFirstProject ? 'No projects found for user, prompting for name' : 'Using a coupon - skipping project selection');
602
+ const newProject = await this.promptForProjectCreation({
603
+ isUsersFirstProject,
604
+ organizationId,
605
+ organizations,
606
+ planId,
607
+ user
608
+ });
609
+ return {
610
+ ...newProject,
611
+ isFirstProject: isUsersFirstProject,
612
+ userAction: 'create'
613
+ };
614
+ }
615
+ debug(`User has ${projects.length} project(s) already, showing list of choices`);
616
+ const projectChoices = projects.map((project)=>({
617
+ name: `${project.displayName} (${project.id})`,
618
+ value: project.id
619
+ }));
620
+ const selected = await select({
621
+ choices: [
622
+ {
623
+ name: 'Create new project',
624
+ value: 'new'
625
+ },
626
+ new Separator(),
627
+ ...projectChoices
628
+ ],
629
+ message: 'Create a new project or select an existing one'
630
+ });
631
+ if (selected === 'new') {
632
+ debug('User wants to create a new project, prompting for name');
633
+ const newProject = await this.promptForProjectCreation({
634
+ isUsersFirstProject,
635
+ organizationId,
636
+ organizations,
637
+ planId,
638
+ user
639
+ });
640
+ return {
641
+ ...newProject,
642
+ isFirstProject: isUsersFirstProject,
643
+ userAction: 'create'
644
+ };
645
+ }
646
+ debug(`Returning selected project (${selected})`);
647
+ return {
648
+ displayName: projects.find((proj)=>proj.id === selected)?.displayName || '',
649
+ isFirstProject: isUsersFirstProject,
650
+ projectId: selected,
651
+ userAction: 'select'
652
+ };
653
+ }
408
654
  async getPlan() {
409
655
  const intendedPlan = this.flags['project-plan'];
410
656
  const intendedCoupon = this.flags.coupon;
@@ -416,6 +662,92 @@ export class InitCommand extends SanityCommand {
416
662
  return undefined;
417
663
  }
418
664
  }
665
+ async getProjectDetails({ isAppTemplate, planId, showDefaultConfigPrompt, user }) {
666
+ if (isAppTemplate) {
667
+ const organizations = await listOrganizations({
668
+ includeImplicitMemberships: 'true',
669
+ includeMembers: 'true'
670
+ });
671
+ const appOrganizationId = await this.promptUserForOrganization({
672
+ organizations,
673
+ user
674
+ });
675
+ return {
676
+ datasetName: '',
677
+ displayName: '',
678
+ isFirstProject: false,
679
+ organizationId: appOrganizationId,
680
+ projectId: ''
681
+ };
682
+ }
683
+ debug('Prompting user to select or create a project');
684
+ const project = await this.getOrCreateProject({
685
+ planId,
686
+ user
687
+ });
688
+ debug(`Project with name ${project.displayName} selected`);
689
+ // Now let's pick or create a dataset
690
+ debug('Prompting user to select or create a dataset');
691
+ const dataset = await this.getOrCreateDataset({
692
+ displayName: project.displayName,
693
+ projectId: project.projectId,
694
+ showDefaultConfigPrompt
695
+ });
696
+ debug(`Dataset with name ${dataset.datasetName} selected`);
697
+ // @todo
698
+ // trace.log({
699
+ // step: 'createOrSelectDataset',
700
+ // selectedOption: dataset.userAction,
701
+ // datasetName: dataset.datasetName,
702
+ // visibility: flags.visibility as 'private' | 'public',
703
+ // })
704
+ return {
705
+ datasetName: dataset.datasetName,
706
+ displayName: project.displayName,
707
+ isFirstProject: project.isFirstProject,
708
+ projectId: project.projectId
709
+ };
710
+ }
711
+ async promptForDefaultConfig() {
712
+ return confirm({
713
+ default: true,
714
+ message: 'Use the default dataset configuration?'
715
+ });
716
+ }
717
+ async promptForProjectCreation({ isUsersFirstProject, organizationId, organizations, planId, user }) {
718
+ const projectName = await input({
719
+ default: 'My Sanity Project',
720
+ message: 'Project name:',
721
+ validate (input) {
722
+ if (!input || input.trim() === '') {
723
+ return 'Project name cannot be empty';
724
+ }
725
+ if (input.length > 80) {
726
+ return 'Project name cannot be longer than 80 characters';
727
+ }
728
+ return true;
729
+ }
730
+ });
731
+ const organization = organizationId || await this.promptUserForOrganization({
732
+ organizations,
733
+ user
734
+ });
735
+ const newProject = await createProject({
736
+ displayName: projectName,
737
+ metadata: {
738
+ coupon: this.flags.coupon
739
+ },
740
+ organizationId: organization,
741
+ subscription: planId ? {
742
+ planId
743
+ } : undefined
744
+ });
745
+ return {
746
+ ...newProject,
747
+ isFirstProject: isUsersFirstProject,
748
+ userAction: 'create'
749
+ };
750
+ }
419
751
  async promptUserForNewOrganization(user) {
420
752
  const name = await input({
421
753
  default: user ? user.name : undefined,
@@ -472,7 +804,9 @@ export class InitCommand extends SanityCommand {
472
804
  } catch (err) {
473
805
  if (!isHttpError(err) || err.statusCode !== 404) {
474
806
  const message = err instanceof Error ? err.message : `${err}`;
475
- throw new Error(`Unable to validate coupon, please try again later:\n\n${message}`);
807
+ this.error(`Unable to validate coupon, please try again later:\n\n${message}`, {
808
+ exit: 1
809
+ });
476
810
  }
477
811
  const useDefaultPlan = this.isUnattended() || await confirm({
478
812
  default: true,
@@ -490,7 +824,9 @@ export class InitCommand extends SanityCommand {
490
824
  if (useDefaultPlan) {
491
825
  this.log('Using default plan.');
492
826
  } else {
493
- throw new Error(`Coupon "${intendedCoupon}" does not exist`);
827
+ this.error(`Coupon "${intendedCoupon}" does not exist`, {
828
+ exit: 1
829
+ });
494
830
  }
495
831
  }
496
832
  }
@@ -501,8 +837,8 @@ export class InitCommand extends SanityCommand {
501
837
  } catch (err) {
502
838
  if (!isHttpError(err) || err.statusCode !== 404) {
503
839
  const message = err instanceof Error ? err.message : `${err}`;
504
- throw new Error(`Unable to validate plan, please try again later:\n\n${message}`, {
505
- cause: err
840
+ this.error(`Unable to validate plan, please try again later:\n\n${message}`, {
841
+ exit: 1
506
842
  });
507
843
  }
508
844
  const useDefaultPlan = this.isUnattended() || await confirm({
@@ -521,7 +857,9 @@ export class InitCommand extends SanityCommand {
521
857
  if (useDefaultPlan) {
522
858
  this.log('Using default plan.');
523
859
  } else {
524
- throw new Error(`Plan id "${intendedPlan}" does not exist`);
860
+ this.error(`Plan id "${intendedPlan}" does not exist`, {
861
+ exit: 1
862
+ });
525
863
  }
526
864
  }
527
865
  }