@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 +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"}
@@ -9,8 +9,10 @@ export declare function createCliConfig(config: CliConfig): {
9
9
  } | undefined;
10
10
  app?: {
11
11
  entry?: string | undefined;
12
+ icon?: string | undefined;
12
13
  id?: string | undefined;
13
14
  organizationId?: string | undefined;
15
+ title?: string | undefined;
14
16
  } | undefined;
15
17
  autoUpdates?: boolean | undefined;
16
18
  deployment?: {
@@ -61,4 +63,11 @@ export declare function createCliConfig(config: CliConfig): {
61
63
  } | undefined;
62
64
  studioHost?: string | undefined;
63
65
  vite?: import("@sanity/cli-core").UserViteConfig | undefined;
66
+ typegen?: {
67
+ path: string | string[];
68
+ schema: string;
69
+ generates: string;
70
+ formatGeneratedCode: boolean;
71
+ overloadClientMethods: boolean;
72
+ } | undefined;
64
73
  };
@@ -0,0 +1,2 @@
1
+ export declare function promptForTypeScript(): Promise<boolean>;
2
+ export declare function promptImplicitReconfigure(): Promise<boolean>;
@@ -0,0 +1,15 @@
1
+ import { confirm } from '@sanity/cli-core/ux';
2
+ export function promptForTypeScript() {
3
+ return confirm({
4
+ default: true,
5
+ message: 'Do you want to use TypeScript?'
6
+ });
7
+ }
8
+ export function promptImplicitReconfigure() {
9
+ return confirm({
10
+ default: true,
11
+ message: 'The current folder contains a configured Sanity studio. Would you like to reconfigure it?'
12
+ });
13
+ }
14
+
15
+ //# sourceMappingURL=promptForTypescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/prompts/init/promptForTypescript.ts"],"sourcesContent":["import {confirm} from '@sanity/cli-core/ux'\n\nexport function promptForTypeScript(): Promise<boolean> {\n return confirm({\n default: true,\n message: 'Do you want to use TypeScript?',\n })\n}\n\nexport function promptImplicitReconfigure(): Promise<boolean> {\n return confirm({\n default: true,\n message:\n 'The current folder contains a configured Sanity studio. Would you like to reconfigure it?',\n })\n}\n"],"names":["confirm","promptForTypeScript","default","message","promptImplicitReconfigure"],"mappings":"AAAA,SAAQA,OAAO,QAAO,sBAAqB;AAE3C,OAAO,SAASC;IACd,OAAOD,QAAQ;QACbE,SAAS;QACTC,SAAS;IACX;AACF;AAEA,OAAO,SAASC;IACd,OAAOJ,QAAQ;QACbE,SAAS;QACTC,SACE;IACJ;AACF"}
@@ -0,0 +1,9 @@
1
+ import { type Output } from '@sanity/cli-core';
2
+ import { type DatasetAclMode } from '@sanity/client';
3
+ /**
4
+ * Prompts the user to select a dataset ACL mode (visibility)
5
+ *
6
+ * @param output - Optional output instance for logging additional information
7
+ * @returns Promise resolving to the selected ACL mode
8
+ */
9
+ export declare function promptForDatasetAclMode(output?: Output): Promise<DatasetAclMode>;
@@ -0,0 +1,27 @@
1
+ import { select } from '@sanity/cli-core/ux';
2
+ /**
3
+ * Prompts the user to select a dataset ACL mode (visibility)
4
+ *
5
+ * @param output - Optional output instance for logging additional information
6
+ * @returns Promise resolving to the selected ACL mode
7
+ */ export async function promptForDatasetAclMode(output) {
8
+ const mode = await select({
9
+ choices: [
10
+ {
11
+ name: 'Public (world readable)',
12
+ value: 'public'
13
+ },
14
+ {
15
+ name: 'Private (Authenticated user or token needed)',
16
+ value: 'private'
17
+ }
18
+ ],
19
+ message: 'Dataset visibility'
20
+ });
21
+ if (mode === 'private' && output) {
22
+ output.warn('Please note that while documents are private, assets (files and images) are still public');
23
+ }
24
+ return mode;
25
+ }
26
+
27
+ //# sourceMappingURL=promptForDatasetAclMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/prompts/promptForDatasetAclMode.ts"],"sourcesContent":["import {type Output} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport {type DatasetAclMode} from '@sanity/client'\n\n/**\n * Prompts the user to select a dataset ACL mode (visibility)\n *\n * @param output - Optional output instance for logging additional information\n * @returns Promise resolving to the selected ACL mode\n */\nexport async function promptForDatasetAclMode(output?: Output): Promise<DatasetAclMode> {\n const mode = await select({\n choices: [\n {\n name: 'Public (world readable)',\n value: 'public' as const,\n },\n {\n name: 'Private (Authenticated user or token needed)',\n value: 'private' as const,\n },\n ],\n message: 'Dataset visibility',\n })\n\n if (mode === 'private' && output) {\n output.warn(\n 'Please note that while documents are private, assets (files and images) are still public',\n )\n }\n\n return mode\n}\n"],"names":["select","promptForDatasetAclMode","output","mode","choices","name","value","message","warn"],"mappings":"AACA,SAAQA,MAAM,QAAO,sBAAqB;AAG1C;;;;;CAKC,GACD,OAAO,eAAeC,wBAAwBC,MAAe;IAC3D,MAAMC,OAAO,MAAMH,OAAO;QACxBI,SAAS;YACP;gBACEC,MAAM;gBACNC,OAAO;YACT;YACA;gBACED,MAAM;gBACNC,OAAO;YACT;SACD;QACDC,SAAS;IACX;IAEA,IAAIJ,SAAS,aAAaD,QAAQ;QAChCA,OAAOM,IAAI,CACT;IAEJ;IAEA,OAAOL;AACT"}
@@ -1,4 +1,4 @@
1
1
  export declare function promptForDatasetName(options?: {
2
2
  default?: string;
3
3
  message?: string;
4
- }): Promise<string>;
4
+ }, existingDatasets?: string[]): Promise<string>;
@@ -1,10 +1,13 @@
1
1
  import { input } from '@sanity/cli-core/ux';
2
2
  import { validateDatasetName } from '../actions/dataset/validateDatasetName.js';
3
- export function promptForDatasetName(options = {}) {
3
+ export function promptForDatasetName(options = {}, existingDatasets = []) {
4
4
  return input({
5
5
  default: options.default,
6
6
  message: options.message || 'Dataset name:',
7
7
  validate: (name)=>{
8
+ if (existingDatasets.includes(name)) {
9
+ return 'Dataset name already exists';
10
+ }
8
11
  const err = validateDatasetName(name);
9
12
  if (err) {
10
13
  return err;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/prompts/promptForDatasetName.ts"],"sourcesContent":["import {input} from '@sanity/cli-core/ux'\n\nimport {validateDatasetName} from '../actions/dataset/validateDatasetName.js'\n\nexport function promptForDatasetName(\n options: {default?: string; message?: string} = {},\n): Promise<string> {\n return input({\n default: options.default,\n message: options.message || 'Dataset name:',\n validate: (name) => {\n const err = validateDatasetName(name)\n if (err) {\n return err\n }\n\n return true\n },\n })\n}\n"],"names":["input","validateDatasetName","promptForDatasetName","options","default","message","validate","name","err"],"mappings":"AAAA,SAAQA,KAAK,QAAO,sBAAqB;AAEzC,SAAQC,mBAAmB,QAAO,4CAA2C;AAE7E,OAAO,SAASC,qBACdC,UAAgD,CAAC,CAAC;IAElD,OAAOH,MAAM;QACXI,SAASD,QAAQC,OAAO;QACxBC,SAASF,QAAQE,OAAO,IAAI;QAC5BC,UAAU,CAACC;YACT,MAAMC,MAAMP,oBAAoBM;YAChC,IAAIC,KAAK;gBACP,OAAOA;YACT;YAEA,OAAO;QACT;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/prompts/promptForDatasetName.ts"],"sourcesContent":["import {input} from '@sanity/cli-core/ux'\n\nimport {validateDatasetName} from '../actions/dataset/validateDatasetName.js'\n\nexport function promptForDatasetName(\n options: {default?: string; message?: string} = {},\n existingDatasets: string[] = [],\n): Promise<string> {\n return input({\n default: options.default,\n message: options.message || 'Dataset name:',\n validate: (name) => {\n if (existingDatasets.includes(name)) {\n return 'Dataset name already exists'\n }\n\n const err = validateDatasetName(name)\n if (err) {\n return err\n }\n\n return true\n },\n })\n}\n"],"names":["input","validateDatasetName","promptForDatasetName","options","existingDatasets","default","message","validate","name","includes","err"],"mappings":"AAAA,SAAQA,KAAK,QAAO,sBAAqB;AAEzC,SAAQC,mBAAmB,QAAO,4CAA2C;AAE7E,OAAO,SAASC,qBACdC,UAAgD,CAAC,CAAC,EAClDC,mBAA6B,EAAE;IAE/B,OAAOJ,MAAM;QACXK,SAASF,QAAQE,OAAO;QACxBC,SAASH,QAAQG,OAAO,IAAI;QAC5BC,UAAU,CAACC;YACT,IAAIJ,iBAAiBK,QAAQ,CAACD,OAAO;gBACnC,OAAO;YACT;YAEA,MAAME,MAAMT,oBAAoBO;YAChC,IAAIE,KAAK;gBACP,OAAOA;YACT;YAEA,OAAO;QACT;IACF;AACF"}
@@ -1,3 +1,4 @@
1
+ import { RawRequestOptions } from '@sanity/client';
1
2
  export declare const ORGANIZATIONS_API_VERSION = "v2025-05-14";
2
3
  export interface ProjectOrganization {
3
4
  id: string;
@@ -25,10 +26,11 @@ interface OrganizationGrant {
25
26
  interface OrganizationGrantsResponse {
26
27
  [key: string]: OrganizationGrant[];
27
28
  }
29
+ type OrganizationRequestQuery = RawRequestOptions['query'];
28
30
  /**
29
31
  * List all organizations the user has access to
30
32
  */
31
- export declare function listOrganizations(): Promise<ProjectOrganization[]>;
33
+ export declare function listOrganizations(query?: OrganizationRequestQuery): Promise<ProjectOrganization[]>;
32
34
  /**
33
35
  * Create a new organization
34
36
  */
@@ -2,12 +2,13 @@ import { getGlobalCliClient } from '@sanity/cli-core';
2
2
  export const ORGANIZATIONS_API_VERSION = 'v2025-05-14';
3
3
  /**
4
4
  * List all organizations the user has access to
5
- */ export async function listOrganizations() {
5
+ */ export async function listOrganizations(query) {
6
6
  const client = await getGlobalCliClient({
7
7
  apiVersion: ORGANIZATIONS_API_VERSION,
8
8
  requireUser: true
9
9
  });
10
10
  return client.request({
11
+ query,
11
12
  uri: '/organizations'
12
13
  });
13
14
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/services/organizations.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\n\nexport const ORGANIZATIONS_API_VERSION = 'v2025-05-14'\n\nexport interface ProjectOrganization {\n id: string\n name: string\n slug: string\n}\n\nexport interface OrganizationCreateResponse {\n createdByUserId: string\n defaultRoleName: string | null\n features: unknown[]\n id: string\n members: unknown[]\n name: string\n slug: string | null\n}\n\nexport interface OrganizationWithGrant {\n hasAttachGrant: boolean\n organization: ProjectOrganization\n}\n\ninterface OrganizationGrant {\n grants: {name: string}[]\n}\n\ninterface OrganizationGrantsResponse {\n [key: string]: OrganizationGrant[]\n}\n\n/**\n * List all organizations the user has access to\n */\nexport async function listOrganizations(): Promise<ProjectOrganization[]> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<ProjectOrganization[]>({\n uri: '/organizations',\n })\n}\n\n/**\n * Create a new organization\n */\nexport async function createOrganization(name: string): Promise<OrganizationCreateResponse> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<OrganizationCreateResponse>({\n body: {name},\n method: 'post',\n uri: '/organizations',\n })\n}\n\n/**\n * Get organization grants for a specific organization\n */\nexport async function getOrganizationGrants(\n organizationId: string,\n): Promise<OrganizationGrantsResponse> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<OrganizationGrantsResponse>({\n uri: `organizations/${organizationId}/grants`,\n })\n}\n"],"names":["getGlobalCliClient","ORGANIZATIONS_API_VERSION","listOrganizations","client","apiVersion","requireUser","request","uri","createOrganization","name","body","method","getOrganizationGrants","organizationId"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AAEnD,OAAO,MAAMC,4BAA4B,cAAa;AA+BtD;;CAEC,GACD,OAAO,eAAeC;IACpB,MAAMC,SAAS,MAAMH,mBAAmB;QACtCI,YAAYH;QACZI,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAAwB;QAC3CC,KAAK;IACP;AACF;AAEA;;CAEC,GACD,OAAO,eAAeC,mBAAmBC,IAAY;IACnD,MAAMN,SAAS,MAAMH,mBAAmB;QACtCI,YAAYH;QACZI,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAA6B;QAChDI,MAAM;YAACD;QAAI;QACXE,QAAQ;QACRJ,KAAK;IACP;AACF;AAEA;;CAEC,GACD,OAAO,eAAeK,sBACpBC,cAAsB;IAEtB,MAAMV,SAAS,MAAMH,mBAAmB;QACtCI,YAAYH;QACZI,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAA6B;QAChDC,KAAK,CAAC,cAAc,EAAEM,eAAe,OAAO,CAAC;IAC/C;AACF"}
1
+ {"version":3,"sources":["../../src/services/organizations.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\nimport {RawRequestOptions} from '@sanity/client'\n\nexport const ORGANIZATIONS_API_VERSION = 'v2025-05-14'\n\nexport interface ProjectOrganization {\n id: string\n name: string\n slug: string\n}\n\nexport interface OrganizationCreateResponse {\n createdByUserId: string\n defaultRoleName: string | null\n features: unknown[]\n id: string\n members: unknown[]\n name: string\n slug: string | null\n}\n\nexport interface OrganizationWithGrant {\n hasAttachGrant: boolean\n organization: ProjectOrganization\n}\n\ninterface OrganizationGrant {\n grants: {name: string}[]\n}\n\ninterface OrganizationGrantsResponse {\n [key: string]: OrganizationGrant[]\n}\n\ntype OrganizationRequestQuery = RawRequestOptions['query']\n\n/**\n * List all organizations the user has access to\n */\nexport async function listOrganizations(\n query?: OrganizationRequestQuery,\n): Promise<ProjectOrganization[]> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<ProjectOrganization[]>({\n query,\n uri: '/organizations',\n })\n}\n\n/**\n * Create a new organization\n */\nexport async function createOrganization(name: string): Promise<OrganizationCreateResponse> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<OrganizationCreateResponse>({\n body: {name},\n method: 'post',\n uri: '/organizations',\n })\n}\n\n/**\n * Get organization grants for a specific organization\n */\nexport async function getOrganizationGrants(\n organizationId: string,\n): Promise<OrganizationGrantsResponse> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<OrganizationGrantsResponse>({\n uri: `organizations/${organizationId}/grants`,\n })\n}\n"],"names":["getGlobalCliClient","ORGANIZATIONS_API_VERSION","listOrganizations","query","client","apiVersion","requireUser","request","uri","createOrganization","name","body","method","getOrganizationGrants","organizationId"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AAGnD,OAAO,MAAMC,4BAA4B,cAAa;AAiCtD;;CAEC,GACD,OAAO,eAAeC,kBACpBC,KAAgC;IAEhC,MAAMC,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAAwB;QAC3CJ;QACAK,KAAK;IACP;AACF;AAEA;;CAEC,GACD,OAAO,eAAeC,mBAAmBC,IAAY;IACnD,MAAMN,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAA6B;QAChDI,MAAM;YAACD;QAAI;QACXE,QAAQ;QACRJ,KAAK;IACP;AACF;AAEA;;CAEC,GACD,OAAO,eAAeK,sBACpBC,cAAsB;IAEtB,MAAMV,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAA6B;QAChDC,KAAK,CAAC,cAAc,EAAEM,eAAe,OAAO,CAAC;IAC/C;AACF"}
@@ -8,3 +8,8 @@ import { type User } from '../actions/users/types.js';
8
8
  export declare const USERS_API_VERSION = "v2025-08-30";
9
9
  export declare function getCliUser(): Promise<SanityOrgUser>;
10
10
  export declare function getMembers(memberIds: string[]): Promise<User | User[]>;
11
+ /**
12
+ * Get the user for a project
13
+ * @param projectId - The ID of the project
14
+ */
15
+ export declare function getProjectUser(projectId: string): Promise<import("@sanity/client").CurrentSanityUser>;
@@ -1,4 +1,4 @@
1
- import { getGlobalCliClient } from '@sanity/cli-core';
1
+ import { getGlobalCliClient, getProjectCliClient } from '@sanity/cli-core';
2
2
  /**
3
3
  * The API version to use for the users list command
4
4
  *
@@ -20,5 +20,16 @@ export async function getMembers(memberIds) {
20
20
  uri: `/users/${memberIds.join(',')}`
21
21
  });
22
22
  }
23
+ /**
24
+ * Get the user for a project
25
+ * @param projectId - The ID of the project
26
+ */ export async function getProjectUser(projectId) {
27
+ const client = await getProjectCliClient({
28
+ apiVersion: USERS_API_VERSION,
29
+ projectId,
30
+ requireUser: true
31
+ });
32
+ return client.users.getById('me');
33
+ }
23
34
 
24
35
  //# sourceMappingURL=user.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/services/user.ts"],"sourcesContent":["import {getGlobalCliClient, type SanityOrgUser} from '@sanity/cli-core'\n\nimport {type User} from '../actions/users/types.js'\n\n/**\n * The API version to use for the users list command\n *\n * @internal\n */\nexport const USERS_API_VERSION = 'v2025-08-30'\n\nexport async function getCliUser() {\n const client = await getGlobalCliClient({\n apiVersion: USERS_API_VERSION,\n requireUser: true,\n })\n\n return client.users.getById('me') as unknown as SanityOrgUser\n}\n\nexport async function getMembers(memberIds: string[]) {\n const client = await getGlobalCliClient({\n apiVersion: USERS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<User | User[]>({uri: `/users/${memberIds.join(',')}`})\n}\n"],"names":["getGlobalCliClient","USERS_API_VERSION","getCliUser","client","apiVersion","requireUser","users","getById","getMembers","memberIds","request","uri","join"],"mappings":"AAAA,SAAQA,kBAAkB,QAA2B,mBAAkB;AAIvE;;;;CAIC,GACD,OAAO,MAAMC,oBAAoB,cAAa;AAE9C,OAAO,eAAeC;IACpB,MAAMC,SAAS,MAAMH,mBAAmB;QACtCI,YAAYH;QACZI,aAAa;IACf;IAEA,OAAOF,OAAOG,KAAK,CAACC,OAAO,CAAC;AAC9B;AAEA,OAAO,eAAeC,WAAWC,SAAmB;IAClD,MAAMN,SAAS,MAAMH,mBAAmB;QACtCI,YAAYH;QACZI,aAAa;IACf;IAEA,OAAOF,OAAOO,OAAO,CAAgB;QAACC,KAAK,CAAC,OAAO,EAAEF,UAAUG,IAAI,CAAC,MAAM;IAAA;AAC5E"}
1
+ {"version":3,"sources":["../../src/services/user.ts"],"sourcesContent":["import {getGlobalCliClient, getProjectCliClient, type SanityOrgUser} from '@sanity/cli-core'\n\nimport {type User} from '../actions/users/types.js'\n\n/**\n * The API version to use for the users list command\n *\n * @internal\n */\nexport const USERS_API_VERSION = 'v2025-08-30'\n\nexport async function getCliUser() {\n const client = await getGlobalCliClient({\n apiVersion: USERS_API_VERSION,\n requireUser: true,\n })\n\n return client.users.getById('me') as unknown as SanityOrgUser\n}\n\nexport async function getMembers(memberIds: string[]) {\n const client = await getGlobalCliClient({\n apiVersion: USERS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<User | User[]>({uri: `/users/${memberIds.join(',')}`})\n}\n\n/**\n * Get the user for a project\n * @param projectId - The ID of the project\n */\nexport async function getProjectUser(projectId: string) {\n const client = await getProjectCliClient({\n apiVersion: USERS_API_VERSION,\n projectId,\n requireUser: true,\n })\n\n return client.users.getById('me')\n}\n"],"names":["getGlobalCliClient","getProjectCliClient","USERS_API_VERSION","getCliUser","client","apiVersion","requireUser","users","getById","getMembers","memberIds","request","uri","join","getProjectUser","projectId"],"mappings":"AAAA,SAAQA,kBAAkB,EAAEC,mBAAmB,QAA2B,mBAAkB;AAI5F;;;;CAIC,GACD,OAAO,MAAMC,oBAAoB,cAAa;AAE9C,OAAO,eAAeC;IACpB,MAAMC,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYH;QACZI,aAAa;IACf;IAEA,OAAOF,OAAOG,KAAK,CAACC,OAAO,CAAC;AAC9B;AAEA,OAAO,eAAeC,WAAWC,SAAmB;IAClD,MAAMN,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYH;QACZI,aAAa;IACf;IAEA,OAAOF,OAAOO,OAAO,CAAgB;QAACC,KAAK,CAAC,OAAO,EAAEF,UAAUG,IAAI,CAAC,MAAM;IAAA;AAC5E;AAEA;;;CAGC,GACD,OAAO,eAAeC,eAAeC,SAAiB;IACpD,MAAMX,SAAS,MAAMH,oBAAoB;QACvCI,YAAYH;QACZa;QACAT,aAAa;IACf;IAEA,OAAOF,OAAOG,KAAK,CAACC,OAAO,CAAC;AAC9B"}
@@ -1,4 +1,5 @@
1
1
  import { type Gzip } from 'node:zlib';
2
+ import { type AppManifest } from '../actions/manifest/types.js';
2
3
  export declare const USER_APPLICATIONS_API_VERSION = "v2024-08-01";
3
4
  interface ActiveDeployment {
4
5
  createdAt: string;
@@ -67,9 +68,10 @@ interface CreateDeploymentOptions {
67
68
  tarball: Gzip;
68
69
  version: string;
69
70
  isApp?: boolean;
71
+ manifest?: AppManifest;
70
72
  projectId?: string;
71
73
  }
72
- export declare function createDeployment({ applicationId, isApp, isAutoUpdating, projectId, tarball, version, }: CreateDeploymentOptions): Promise<{
74
+ export declare function createDeployment({ applicationId, isApp, isAutoUpdating, manifest, projectId, tarball, version, }: CreateDeploymentOptions): Promise<{
73
75
  location: string;
74
76
  }>;
75
77
  export {};
@@ -1,6 +1,7 @@
1
1
  import { PassThrough } from 'node:stream';
2
2
  import { debug, getGlobalCliClient } from '@sanity/cli-core';
3
3
  import FormData from 'form-data';
4
+ import { appManifestHasData } from '../actions/manifest/extractAppManifest.js';
4
5
  export const USER_APPLICATIONS_API_VERSION = 'v2024-08-01';
5
6
  export async function getUserApplication({ appHost, appId, isSdkApp, projectId }) {
6
7
  let query;
@@ -123,7 +124,7 @@ export async function createUserApplication(options) {
123
124
  uri
124
125
  });
125
126
  }
126
- export async function createDeployment({ applicationId, isApp, isAutoUpdating, projectId, tarball, version }) {
127
+ export async function createDeployment({ applicationId, isApp, isAutoUpdating, manifest, projectId, tarball, version }) {
127
128
  const client = await getGlobalCliClient({
128
129
  apiVersion: USER_APPLICATIONS_API_VERSION,
129
130
  requireUser: true
@@ -131,6 +132,9 @@ export async function createDeployment({ applicationId, isApp, isAutoUpdating, p
131
132
  const formData = new FormData();
132
133
  formData.append('isAutoUpdating', isAutoUpdating.toString());
133
134
  formData.append('version', version);
135
+ if (isApp && appManifestHasData(manifest)) {
136
+ formData.append('manifest', JSON.stringify(manifest));
137
+ }
134
138
  formData.append('tarball', tarball, {
135
139
  contentType: 'application/gzip',
136
140
  filename: 'app.tar.gz'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/services/userApplications.ts"],"sourcesContent":["import {PassThrough} from 'node:stream'\nimport {type Gzip} from 'node:zlib'\n\nimport {debug, getGlobalCliClient} from '@sanity/cli-core'\nimport FormData from 'form-data'\n\nexport const USER_APPLICATIONS_API_VERSION = 'v2024-08-01'\n\ninterface ActiveDeployment {\n createdAt: string\n deployedAt: string\n deployedBy: string\n isActiveDeployment: boolean\n isAutoUpdating: boolean | null\n size: string | null\n updatedAt: string\n version: string\n}\n\nexport interface UserApplication {\n appHost: string\n createdAt: string\n id: string\n organizationId: string | null\n projectId: string | null\n title: string | null\n type: 'coreApp' | 'studio'\n updatedAt: string\n urlType: 'external' | 'internal'\n\n activeDeployment?: ActiveDeployment | null\n}\n\ntype GetUserApplicationOptions =\n | {appHost?: never; appId: string; isSdkApp: true; projectId?: never}\n | {appHost?: string; appId?: string; isSdkApp: false; projectId: string}\n\nexport async function getUserApplication({\n appHost,\n appId,\n isSdkApp,\n projectId,\n}: GetUserApplicationOptions): Promise<UserApplication | null> {\n let query: Record<string, string | string[]> | undefined\n let uri: string\n\n // set the uri\n if (isSdkApp) {\n uri = appId ? `/user-applications/${appId}` : '/user-applications'\n } else {\n uri = appId\n ? `/projects/${projectId}/user-applications/${appId}`\n : `/projects/${projectId}/user-applications`\n }\n\n // set the query\n if (isSdkApp) {\n query = {appType: 'coreApp'}\n } else if (!appId) {\n // In practice, this function isn't called if we don't have at least one of appHost or appId,\n // so the default case won't be called. But leaving this ternary in for now (from old CLI code) just in case.\n query = appHost ? {appHost, appType: 'studio'} : {default: 'true'}\n }\n\n const client = await getGlobalCliClient({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n requireUser: true,\n })\n\n try {\n const options = query ? {query, uri} : {uri}\n return await client.request(options)\n } catch (err) {\n if (err?.statusCode === 404) {\n return null\n }\n\n debug('Error getting user application', err)\n throw err\n }\n}\n\ninterface DeleteUserApplicationOptions {\n applicationId: string\n appType: 'coreApp' | 'studio'\n}\n\nexport async function deleteUserApplication({\n applicationId,\n appType,\n}: DeleteUserApplicationOptions): Promise<void> {\n const client = await getGlobalCliClient({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n requireUser: true,\n })\n\n await client.request({\n method: 'DELETE',\n query: {appType},\n uri: `/user-applications/${applicationId}`,\n })\n}\n\nexport async function getUserApplications(options: {\n appType: 'studio'\n projectId: string\n}): Promise<UserApplication[]>\nexport async function getUserApplications(options: {\n appType: 'coreApp'\n organizationId: string\n}): Promise<UserApplication[]>\nexport async function getUserApplications(\n options:\n | {\n appType: 'coreApp'\n organizationId?: string\n }\n | {\n appType: 'studio'\n projectId?: string\n },\n): Promise<UserApplication[] | null> {\n const {appType} = options\n const client = await getGlobalCliClient({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n requireUser: true,\n })\n\n if (appType === 'studio') {\n const {projectId} = options as {appType: 'studio'; projectId?: string}\n return await client.request({\n query: {appType: 'studio'},\n uri: `/projects/${projectId}/user-applications`,\n })\n }\n\n const {organizationId} = options as {appType: 'coreApp'; organizationId?: string}\n\n try {\n return await client.request({\n query: {appType: 'coreApp', organizationId: organizationId!},\n uri: `/user-applications`,\n })\n } catch (error) {\n // User doesn't have permission to view applications for the org,\n // or the organization ID doesn’t exist\n if (error?.statusCode === 403) {\n throw error\n }\n\n debug('Error finding user applications', error)\n return null\n }\n}\n\nexport async function createUserApplication(options: {\n appType: 'coreApp'\n body: Pick<UserApplication, 'appHost' | 'type' | 'urlType'> & {\n title?: string\n }\n organizationId?: string\n}): Promise<UserApplication>\nexport async function createUserApplication(options: {\n appType: 'studio'\n body: Pick<UserApplication, 'appHost' | 'type' | 'urlType'> & {\n title?: string\n }\n projectId: string\n}): Promise<UserApplication>\nexport async function createUserApplication(options: {\n appType: 'coreApp' | 'studio'\n body: Pick<UserApplication, 'appHost' | 'type' | 'urlType'> & {\n title?: string\n }\n organizationId?: string\n projectId?: string\n}): Promise<UserApplication> {\n const {appType, body} = options\n\n const client = await getGlobalCliClient({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n requireUser: true,\n })\n\n let uri\n let query\n\n // If we have an organizationId, we're creating a core app\n if (appType === 'coreApp') {\n const {organizationId} = options as {appType: 'coreApp'; organizationId?: string}\n uri = '/user-applications'\n query = {appType: 'coreApp', organizationId: organizationId!}\n } else {\n const {projectId} = options as {appType: 'studio'; projectId?: string}\n uri = `/projects/${projectId}/user-applications`\n query = {appType: 'studio'}\n }\n\n return client.request({body, method: 'POST', query, uri})\n}\n\ninterface CreateDeploymentOptions {\n applicationId: string\n isAutoUpdating: boolean\n tarball: Gzip\n version: string\n\n isApp?: boolean\n\n projectId?: string\n}\n\nexport async function createDeployment({\n applicationId,\n isApp,\n isAutoUpdating,\n projectId,\n tarball,\n version,\n}: CreateDeploymentOptions): Promise<{location: string}> {\n const client = await getGlobalCliClient({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n requireUser: true,\n })\n\n const formData = new FormData()\n formData.append('isAutoUpdating', isAutoUpdating.toString())\n formData.append('version', version)\n formData.append('tarball', tarball, {contentType: 'application/gzip', filename: 'app.tar.gz'})\n\n let uri\n let query\n\n if (isApp) {\n uri = `/user-applications/${applicationId}/deployments`\n query = {appType: 'coreApp'}\n } else {\n uri = `/projects/${projectId}/user-applications/${applicationId}/deployments`\n query = {appType: 'studio'}\n }\n\n return client.request({\n body: formData.pipe(new PassThrough()),\n headers: formData.getHeaders(),\n method: 'POST',\n query,\n uri,\n })\n}\n"],"names":["PassThrough","debug","getGlobalCliClient","FormData","USER_APPLICATIONS_API_VERSION","getUserApplication","appHost","appId","isSdkApp","projectId","query","uri","appType","default","client","apiVersion","requireUser","options","request","err","statusCode","deleteUserApplication","applicationId","method","getUserApplications","organizationId","error","createUserApplication","body","createDeployment","isApp","isAutoUpdating","tarball","version","formData","append","toString","contentType","filename","pipe","headers","getHeaders"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/services/userApplications.ts"],"sourcesContent":["import {PassThrough} from 'node:stream'\nimport {type Gzip} from 'node:zlib'\n\nimport {debug, getGlobalCliClient} from '@sanity/cli-core'\nimport FormData from 'form-data'\n\nimport {appManifestHasData} from '../actions/manifest/extractAppManifest.js'\nimport {type AppManifest} from '../actions/manifest/types.js'\n\nexport const USER_APPLICATIONS_API_VERSION = 'v2024-08-01'\n\ninterface ActiveDeployment {\n createdAt: string\n deployedAt: string\n deployedBy: string\n isActiveDeployment: boolean\n isAutoUpdating: boolean | null\n size: string | null\n updatedAt: string\n version: string\n}\n\nexport interface UserApplication {\n appHost: string\n createdAt: string\n id: string\n organizationId: string | null\n projectId: string | null\n title: string | null\n type: 'coreApp' | 'studio'\n updatedAt: string\n urlType: 'external' | 'internal'\n\n activeDeployment?: ActiveDeployment | null\n}\n\ntype GetUserApplicationOptions =\n | {appHost?: never; appId: string; isSdkApp: true; projectId?: never}\n | {appHost?: string; appId?: string; isSdkApp: false; projectId: string}\n\nexport async function getUserApplication({\n appHost,\n appId,\n isSdkApp,\n projectId,\n}: GetUserApplicationOptions): Promise<UserApplication | null> {\n let query: Record<string, string | string[]> | undefined\n let uri: string\n\n // set the uri\n if (isSdkApp) {\n uri = appId ? `/user-applications/${appId}` : '/user-applications'\n } else {\n uri = appId\n ? `/projects/${projectId}/user-applications/${appId}`\n : `/projects/${projectId}/user-applications`\n }\n\n // set the query\n if (isSdkApp) {\n query = {appType: 'coreApp'}\n } else if (!appId) {\n // In practice, this function isn't called if we don't have at least one of appHost or appId,\n // so the default case won't be called. But leaving this ternary in for now (from old CLI code) just in case.\n query = appHost ? {appHost, appType: 'studio'} : {default: 'true'}\n }\n\n const client = await getGlobalCliClient({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n requireUser: true,\n })\n\n try {\n const options = query ? {query, uri} : {uri}\n return await client.request(options)\n } catch (err) {\n if (err?.statusCode === 404) {\n return null\n }\n\n debug('Error getting user application', err)\n throw err\n }\n}\n\ninterface DeleteUserApplicationOptions {\n applicationId: string\n appType: 'coreApp' | 'studio'\n}\n\nexport async function deleteUserApplication({\n applicationId,\n appType,\n}: DeleteUserApplicationOptions): Promise<void> {\n const client = await getGlobalCliClient({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n requireUser: true,\n })\n\n await client.request({\n method: 'DELETE',\n query: {appType},\n uri: `/user-applications/${applicationId}`,\n })\n}\n\nexport async function getUserApplications(options: {\n appType: 'studio'\n projectId: string\n}): Promise<UserApplication[]>\nexport async function getUserApplications(options: {\n appType: 'coreApp'\n organizationId: string\n}): Promise<UserApplication[]>\nexport async function getUserApplications(\n options:\n | {\n appType: 'coreApp'\n organizationId?: string\n }\n | {\n appType: 'studio'\n projectId?: string\n },\n): Promise<UserApplication[] | null> {\n const {appType} = options\n const client = await getGlobalCliClient({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n requireUser: true,\n })\n\n if (appType === 'studio') {\n const {projectId} = options as {appType: 'studio'; projectId?: string}\n return await client.request({\n query: {appType: 'studio'},\n uri: `/projects/${projectId}/user-applications`,\n })\n }\n\n const {organizationId} = options as {appType: 'coreApp'; organizationId?: string}\n\n try {\n return await client.request({\n query: {appType: 'coreApp', organizationId: organizationId!},\n uri: `/user-applications`,\n })\n } catch (error) {\n // User doesn't have permission to view applications for the org,\n // or the organization ID doesn’t exist\n if (error?.statusCode === 403) {\n throw error\n }\n\n debug('Error finding user applications', error)\n return null\n }\n}\n\nexport async function createUserApplication(options: {\n appType: 'coreApp'\n body: Pick<UserApplication, 'appHost' | 'type' | 'urlType'> & {\n title?: string\n }\n organizationId?: string\n}): Promise<UserApplication>\nexport async function createUserApplication(options: {\n appType: 'studio'\n body: Pick<UserApplication, 'appHost' | 'type' | 'urlType'> & {\n title?: string\n }\n projectId: string\n}): Promise<UserApplication>\nexport async function createUserApplication(options: {\n appType: 'coreApp' | 'studio'\n body: Pick<UserApplication, 'appHost' | 'type' | 'urlType'> & {\n title?: string\n }\n organizationId?: string\n projectId?: string\n}): Promise<UserApplication> {\n const {appType, body} = options\n\n const client = await getGlobalCliClient({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n requireUser: true,\n })\n\n let uri\n let query\n\n // If we have an organizationId, we're creating a core app\n if (appType === 'coreApp') {\n const {organizationId} = options as {appType: 'coreApp'; organizationId?: string}\n uri = '/user-applications'\n query = {appType: 'coreApp', organizationId: organizationId!}\n } else {\n const {projectId} = options as {appType: 'studio'; projectId?: string}\n uri = `/projects/${projectId}/user-applications`\n query = {appType: 'studio'}\n }\n\n return client.request({body, method: 'POST', query, uri})\n}\n\ninterface CreateDeploymentOptions {\n applicationId: string\n isAutoUpdating: boolean\n tarball: Gzip\n version: string\n\n isApp?: boolean\n\n manifest?: AppManifest\n\n projectId?: string\n}\n\nexport async function createDeployment({\n applicationId,\n isApp,\n isAutoUpdating,\n manifest,\n projectId,\n tarball,\n version,\n}: CreateDeploymentOptions): Promise<{location: string}> {\n const client = await getGlobalCliClient({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n requireUser: true,\n })\n\n const formData = new FormData()\n formData.append('isAutoUpdating', isAutoUpdating.toString())\n formData.append('version', version)\n if (isApp && appManifestHasData(manifest)) {\n formData.append('manifest', JSON.stringify(manifest))\n }\n\n formData.append('tarball', tarball, {contentType: 'application/gzip', filename: 'app.tar.gz'})\n\n let uri\n let query\n\n if (isApp) {\n uri = `/user-applications/${applicationId}/deployments`\n query = {appType: 'coreApp'}\n } else {\n uri = `/projects/${projectId}/user-applications/${applicationId}/deployments`\n query = {appType: 'studio'}\n }\n\n return client.request({\n body: formData.pipe(new PassThrough()),\n headers: formData.getHeaders(),\n method: 'POST',\n query,\n uri,\n })\n}\n"],"names":["PassThrough","debug","getGlobalCliClient","FormData","appManifestHasData","USER_APPLICATIONS_API_VERSION","getUserApplication","appHost","appId","isSdkApp","projectId","query","uri","appType","default","client","apiVersion","requireUser","options","request","err","statusCode","deleteUserApplication","applicationId","method","getUserApplications","organizationId","error","createUserApplication","body","createDeployment","isApp","isAutoUpdating","manifest","tarball","version","formData","append","toString","JSON","stringify","contentType","filename","pipe","headers","getHeaders"],"mappings":"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"}