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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/dist/actions/dataset/create.d.ts +49 -0
  2. package/dist/actions/dataset/create.js +48 -0
  3. package/dist/actions/dataset/create.js.map +1 -0
  4. package/dist/actions/dataset/determineDatasetAclMode.d.ts +37 -0
  5. package/dist/actions/dataset/determineDatasetAclMode.js +36 -0
  6. package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -0
  7. package/dist/actions/debug/gatherDebugInfo.js +15 -21
  8. package/dist/actions/debug/gatherDebugInfo.js.map +1 -1
  9. package/dist/actions/debug/types.d.ts +0 -2
  10. package/dist/actions/debug/types.js.map +1 -1
  11. package/dist/actions/deploy/deployApp.js +13 -0
  12. package/dist/actions/deploy/deployApp.js.map +1 -1
  13. package/dist/actions/dev/startStudioDevServer.js +3 -8
  14. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  15. package/dist/actions/dev/types.d.ts +1 -3
  16. package/dist/actions/dev/types.js.map +1 -1
  17. package/dist/actions/documents/validate.d.ts +0 -2
  18. package/dist/actions/documents/validate.js +21 -1
  19. package/dist/actions/documents/validate.js.map +1 -1
  20. package/dist/actions/exec/execScript.js +1 -1
  21. package/dist/actions/exec/execScript.js.map +1 -1
  22. package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
  23. package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
  24. package/dist/actions/init/remoteTemplate.js +1 -1
  25. package/dist/actions/init/remoteTemplate.js.map +1 -1
  26. package/dist/actions/manifest/extractAppManifest.d.ts +20 -0
  27. package/dist/actions/manifest/extractAppManifest.js +51 -0
  28. package/dist/actions/manifest/extractAppManifest.js.map +1 -0
  29. package/dist/actions/manifest/extractManifest.js +2 -5
  30. package/dist/actions/manifest/extractManifest.js.map +1 -1
  31. package/dist/actions/manifest/types.d.ts +6 -1
  32. package/dist/actions/manifest/types.js.map +1 -1
  33. package/dist/actions/media/importAspects.js +2 -1
  34. package/dist/actions/media/importAspects.js.map +1 -1
  35. package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
  36. package/dist/actions/schema/deleteSchemaAction.js +12 -17
  37. package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
  38. package/dist/actions/schema/deploySchemas.d.ts +15 -0
  39. package/dist/actions/schema/deploySchemas.js +98 -0
  40. package/dist/actions/schema/deploySchemas.js.map +1 -0
  41. package/dist/actions/schema/listSchemas.d.ts +12 -0
  42. package/dist/actions/schema/listSchemas.js +119 -0
  43. package/dist/actions/schema/listSchemas.js.map +1 -0
  44. package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
  45. package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
  46. package/dist/actions/schema/utils/debug.d.ts +2 -0
  47. package/dist/actions/schema/utils/debug.js +5 -0
  48. package/dist/actions/schema/utils/debug.js.map +1 -0
  49. package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
  50. package/dist/actions/schema/utils/manifestExtractor.js +12 -17
  51. package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
  52. package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
  53. package/dist/actions/schema/utils/manifestReader.js +6 -12
  54. package/dist/actions/schema/utils/manifestReader.js.map +1 -1
  55. package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
  56. package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
  57. package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
  58. package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
  59. package/dist/actions/schema/utils/schemaStoreValidation.js +38 -125
  60. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  61. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
  62. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
  63. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
  64. package/dist/actions/users/getMembersForProject.d.ts +1 -3
  65. package/dist/actions/users/getMembersForProject.js +6 -17
  66. package/dist/actions/users/getMembersForProject.js.map +1 -1
  67. package/dist/actions/users/types.d.ts +0 -11
  68. package/dist/actions/users/types.js.map +1 -1
  69. package/dist/commands/backup/disable.js +5 -11
  70. package/dist/commands/backup/disable.js.map +1 -1
  71. package/dist/commands/backup/enable.js +5 -11
  72. package/dist/commands/backup/enable.js.map +1 -1
  73. package/dist/commands/backup/list.js +7 -8
  74. package/dist/commands/backup/list.js.map +1 -1
  75. package/dist/commands/cors/add.js +5 -13
  76. package/dist/commands/cors/add.js.map +1 -1
  77. package/dist/commands/cors/delete.js +7 -15
  78. package/dist/commands/cors/delete.js.map +1 -1
  79. package/dist/commands/cors/list.js +2 -10
  80. package/dist/commands/cors/list.js.map +1 -1
  81. package/dist/commands/dataset/create.d.ts +0 -2
  82. package/dist/commands/dataset/create.js +8 -54
  83. package/dist/commands/dataset/create.js.map +1 -1
  84. package/dist/commands/dataset/export.js +4 -4
  85. package/dist/commands/dataset/export.js.map +1 -1
  86. package/dist/commands/debug.js +5 -9
  87. package/dist/commands/debug.js.map +1 -1
  88. package/dist/commands/dev.js +0 -1
  89. package/dist/commands/dev.js.map +1 -1
  90. package/dist/commands/documents/create.d.ts +1 -0
  91. package/dist/commands/documents/create.js +10 -9
  92. package/dist/commands/documents/create.js.map +1 -1
  93. package/dist/commands/documents/delete.js +2 -3
  94. package/dist/commands/documents/delete.js.map +1 -1
  95. package/dist/commands/documents/get.js +2 -3
  96. package/dist/commands/documents/get.js.map +1 -1
  97. package/dist/commands/documents/query.js +2 -3
  98. package/dist/commands/documents/query.js.map +1 -1
  99. package/dist/commands/documents/validate.js +0 -20
  100. package/dist/commands/documents/validate.js.map +1 -1
  101. package/dist/commands/graphql/list.js +2 -2
  102. package/dist/commands/graphql/list.js.map +1 -1
  103. package/dist/commands/graphql/undeploy.js +4 -9
  104. package/dist/commands/graphql/undeploy.js.map +1 -1
  105. package/dist/commands/hook/create.js +2 -6
  106. package/dist/commands/hook/create.js.map +1 -1
  107. package/dist/commands/hook/delete.js +5 -17
  108. package/dist/commands/hook/delete.js.map +1 -1
  109. package/dist/commands/hook/list.js +2 -8
  110. package/dist/commands/hook/list.js.map +1 -1
  111. package/dist/commands/init.d.ts +6 -1
  112. package/dist/commands/init.js +358 -20
  113. package/dist/commands/init.js.map +1 -1
  114. package/dist/commands/manifest/extract.js +7 -8
  115. package/dist/commands/manifest/extract.js.map +1 -1
  116. package/dist/commands/media/export.js +2 -2
  117. package/dist/commands/media/export.js.map +1 -1
  118. package/dist/commands/media/import.js +2 -2
  119. package/dist/commands/media/import.js.map +1 -1
  120. package/dist/commands/projects/list.js +2 -6
  121. package/dist/commands/projects/list.js.map +1 -1
  122. package/dist/commands/schema/delete.d.ts +1 -1
  123. package/dist/commands/schema/delete.js +20 -23
  124. package/dist/commands/schema/delete.js.map +1 -1
  125. package/dist/commands/schema/deploy.d.ts +16 -0
  126. package/dist/commands/schema/deploy.js +98 -0
  127. package/dist/commands/schema/deploy.js.map +1 -0
  128. package/dist/commands/schema/list.d.ts +15 -0
  129. package/dist/commands/schema/list.js +104 -0
  130. package/dist/commands/schema/list.js.map +1 -0
  131. package/dist/commands/tokens/add.js +3 -5
  132. package/dist/commands/tokens/add.js.map +1 -1
  133. package/dist/commands/users/invite.js +6 -17
  134. package/dist/commands/users/invite.js.map +1 -1
  135. package/dist/commands/users/list.js +4 -7
  136. package/dist/commands/users/list.js.map +1 -1
  137. package/dist/config/createCliConfig.d.ts +13 -4
  138. package/dist/prompts/init/promptForTypescript.d.ts +2 -0
  139. package/dist/prompts/init/promptForTypescript.js +15 -0
  140. package/dist/prompts/init/promptForTypescript.js.map +1 -0
  141. package/dist/prompts/promptForDatasetAclMode.d.ts +9 -0
  142. package/dist/prompts/promptForDatasetAclMode.js +27 -0
  143. package/dist/prompts/promptForDatasetAclMode.js.map +1 -0
  144. package/dist/prompts/promptForDatasetName.d.ts +1 -1
  145. package/dist/prompts/promptForDatasetName.js +4 -1
  146. package/dist/prompts/promptForDatasetName.js.map +1 -1
  147. package/dist/services/backup.d.ts +8 -0
  148. package/dist/services/backup.js +19 -0
  149. package/dist/services/backup.js.map +1 -1
  150. package/dist/services/cors.d.ts +23 -0
  151. package/dist/services/cors.js +38 -0
  152. package/dist/services/cors.js.map +1 -0
  153. package/dist/services/graphql.d.ts +7 -0
  154. package/dist/services/graphql.js +11 -0
  155. package/dist/services/graphql.js.map +1 -1
  156. package/dist/services/hooks.d.ts +2 -0
  157. package/dist/services/hooks.js +19 -0
  158. package/dist/services/hooks.js.map +1 -1
  159. package/dist/services/organizations.d.ts +4 -2
  160. package/dist/services/organizations.js +3 -2
  161. package/dist/services/organizations.js.map +1 -1
  162. package/dist/services/projects.d.ts +11 -0
  163. package/dist/services/projects.js +41 -0
  164. package/dist/services/projects.js.map +1 -1
  165. package/dist/services/schemas.d.ts +4 -0
  166. package/dist/services/schemas.js +40 -0
  167. package/dist/services/schemas.js.map +1 -0
  168. package/dist/services/user.d.ts +13 -0
  169. package/dist/services/user.js +27 -3
  170. package/dist/services/user.js.map +1 -1
  171. package/dist/services/userApplications.d.ts +3 -1
  172. package/dist/services/userApplications.js +5 -1
  173. package/dist/services/userApplications.js.map +1 -1
  174. package/dist/util/errorMessages.d.ts +1 -0
  175. package/dist/util/errorMessages.js +1 -0
  176. package/dist/util/errorMessages.js.map +1 -1
  177. package/dist/util/getCliVersion.js +1 -1
  178. package/dist/util/getCliVersion.js.map +1 -1
  179. package/dist/util/readPackageJson.d.ts +1 -15
  180. package/dist/util/readPackageJson.js +1 -1
  181. package/dist/util/readPackageJson.js.map +1 -1
  182. package/dist/util/uniqBy.d.ts +1 -0
  183. package/dist/util/uniqBy.js +14 -0
  184. package/dist/util/uniqBy.js.map +1 -0
  185. package/oclif.manifest.json +284 -139
  186. package/package.json +36 -33
  187. package/templates/app-quickstart/src/App.css +20 -0
  188. package/templates/app-quickstart/src/App.tsx +25 -0
  189. package/templates/app-quickstart/src/ExampleComponent.css +90 -0
  190. package/templates/app-quickstart/src/ExampleComponent.tsx +37 -0
  191. package/templates/app-sanity-ui/src/App.tsx +34 -0
  192. package/templates/app-sanity-ui/src/ExampleComponent.tsx +34 -0
  193. package/templates/app-sanity-ui/src/SanityUI.tsx +23 -0
  194. package/templates/blog/README.md +11 -0
  195. package/templates/blog/schemaTypes/author.js +50 -0
  196. package/templates/blog/schemaTypes/blockContent.js +67 -0
  197. package/templates/blog/schemaTypes/category.js +19 -0
  198. package/templates/blog/schemaTypes/index.js +6 -0
  199. package/templates/blog/schemaTypes/post.js +65 -0
  200. package/templates/blog/static/.gitkeep +1 -0
  201. package/templates/clean/README.md +9 -0
  202. package/templates/clean/schemaTypes/index.js +1 -0
  203. package/templates/clean/static/.gitkeep +1 -0
  204. package/templates/ecommerce/README.md +11 -0
  205. package/templates/ecommerce/plugins/.gitkeep +1 -0
  206. package/templates/ecommerce/plugins/barcode-input/BarcodeInput.js +62 -0
  207. package/templates/ecommerce/plugins/barcode-input/index.js +9 -0
  208. package/templates/ecommerce/plugins/barcode-input/schemaType.js +60 -0
  209. package/templates/ecommerce/schemaTypes/blockContent.js +67 -0
  210. package/templates/ecommerce/schemaTypes/category.js +39 -0
  211. package/templates/ecommerce/schemaTypes/index.js +23 -0
  212. package/templates/ecommerce/schemaTypes/locale/localeBlockContent.js +19 -0
  213. package/templates/ecommerce/schemaTypes/locale/localeString.js +19 -0
  214. package/templates/ecommerce/schemaTypes/locale/localeText.js +19 -0
  215. package/templates/ecommerce/schemaTypes/locale/supportedLanguages.js +5 -0
  216. package/templates/ecommerce/schemaTypes/product.js +83 -0
  217. package/templates/ecommerce/schemaTypes/productVariant.js +52 -0
  218. package/templates/ecommerce/schemaTypes/vendor.js +39 -0
  219. package/templates/ecommerce/static/.gitkeep +1 -0
  220. package/templates/get-started/README.md +9 -0
  221. package/templates/get-started/plugins/.gitkeep +1 -0
  222. package/templates/get-started/plugins/sanity-plugin-tutorial/CustomDefaultLayout.tsx +16 -0
  223. package/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +104 -0
  224. package/templates/get-started/plugins/sanity-plugin-tutorial/index.ts +11 -0
  225. package/templates/get-started/schemaTypes/index.ts +1 -0
  226. package/templates/get-started/static/.gitkeep +1 -0
  227. package/templates/moviedb/README.md +10 -0
  228. package/templates/moviedb/schemaTypes/blockContent.js +67 -0
  229. package/templates/moviedb/schemaTypes/castMember.js +37 -0
  230. package/templates/moviedb/schemaTypes/crewMember.js +52 -0
  231. package/templates/moviedb/schemaTypes/index.js +22 -0
  232. package/templates/moviedb/schemaTypes/movie.js +85 -0
  233. package/templates/moviedb/schemaTypes/person.js +37 -0
  234. package/templates/moviedb/schemaTypes/plotSummaries.js +20 -0
  235. package/templates/moviedb/schemaTypes/plotSummary.js +24 -0
  236. package/templates/moviedb/schemaTypes/screening.js +81 -0
  237. package/templates/moviedb/static/.gitkeep +1 -0
  238. package/templates/quickstart/README.md +9 -0
  239. package/templates/quickstart/schemaTypes/index.js +1 -0
  240. package/templates/quickstart/static/.gitkeep +1 -0
  241. package/templates/shared/gitignore.txt +29 -0
  242. package/templates/shared/tsconfig.json +17 -0
  243. package/templates/shopify/README.md +85 -0
  244. package/templates/shopify/components/hotspots/ProductTooltip.tsx +38 -0
  245. package/templates/shopify/components/icons/Shopify.tsx +20 -0
  246. package/templates/shopify/components/inputs/CollectionHidden.tsx +23 -0
  247. package/templates/shopify/components/inputs/PlaceholderString.tsx +20 -0
  248. package/templates/shopify/components/inputs/ProductHidden.tsx +64 -0
  249. package/templates/shopify/components/inputs/ProductVariantHidden.tsx +24 -0
  250. package/templates/shopify/components/inputs/ProxyString.tsx +32 -0
  251. package/templates/shopify/components/media/ColorTheme.tsx +38 -0
  252. package/templates/shopify/components/media/ShopifyDocumentStatus.tsx +82 -0
  253. package/templates/shopify/components/studio/Navbar.tsx +29 -0
  254. package/templates/shopify/constants.ts +61 -0
  255. package/templates/shopify/docs/features.md +158 -0
  256. package/templates/shopify/plugins/customDocumentActions/index.ts +55 -0
  257. package/templates/shopify/plugins/customDocumentActions/shopifyDelete.tsx +144 -0
  258. package/templates/shopify/plugins/customDocumentActions/shopifyLink.ts +39 -0
  259. package/templates/shopify/plugins/customDocumentActions/types.ts +14 -0
  260. package/templates/shopify/schemaTypes/documents/collection.tsx +142 -0
  261. package/templates/shopify/schemaTypes/documents/colorTheme.tsx +44 -0
  262. package/templates/shopify/schemaTypes/documents/page.ts +70 -0
  263. package/templates/shopify/schemaTypes/documents/product.tsx +132 -0
  264. package/templates/shopify/schemaTypes/documents/productVariant.tsx +67 -0
  265. package/templates/shopify/schemaTypes/index.ts +108 -0
  266. package/templates/shopify/schemaTypes/objects/collection/collectionGroupType.ts +27 -0
  267. package/templates/shopify/schemaTypes/objects/collection/collectionLinksType.ts +16 -0
  268. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorObjectType.tsx +48 -0
  269. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorType.tsx +50 -0
  270. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeObjectType.ts +40 -0
  271. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeType.ts +49 -0
  272. package/templates/shopify/schemaTypes/objects/global/footerType.ts +22 -0
  273. package/templates/shopify/schemaTypes/objects/global/menuLinksType.ts +21 -0
  274. package/templates/shopify/schemaTypes/objects/global/menuType.ts +17 -0
  275. package/templates/shopify/schemaTypes/objects/global/notFoundPageType.ts +37 -0
  276. package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +48 -0
  277. package/templates/shopify/schemaTypes/objects/hotspot/productHotspotsType.tsx +17 -0
  278. package/templates/shopify/schemaTypes/objects/hotspot/spotType.tsx +60 -0
  279. package/templates/shopify/schemaTypes/objects/link/linkEmailType.tsx +34 -0
  280. package/templates/shopify/schemaTypes/objects/link/linkExternalType.tsx +37 -0
  281. package/templates/shopify/schemaTypes/objects/link/linkInternalType.tsx +33 -0
  282. package/templates/shopify/schemaTypes/objects/link/linkProductType.tsx +60 -0
  283. package/templates/shopify/schemaTypes/objects/module/accordionGroupType.ts +33 -0
  284. package/templates/shopify/schemaTypes/objects/module/accordionType.ts +28 -0
  285. package/templates/shopify/schemaTypes/objects/module/callToActionType.tsx +85 -0
  286. package/templates/shopify/schemaTypes/objects/module/calloutType.ts +38 -0
  287. package/templates/shopify/schemaTypes/objects/module/collectionReferenceType.tsx +47 -0
  288. package/templates/shopify/schemaTypes/objects/module/gridItemType.ts +41 -0
  289. package/templates/shopify/schemaTypes/objects/module/gridType.ts +28 -0
  290. package/templates/shopify/schemaTypes/objects/module/heroType.tsx +40 -0
  291. package/templates/shopify/schemaTypes/objects/module/imageCallToActionType.tsx +19 -0
  292. package/templates/shopify/schemaTypes/objects/module/imageFeatureType.ts +80 -0
  293. package/templates/shopify/schemaTypes/objects/module/imageFeaturesType.tsx +51 -0
  294. package/templates/shopify/schemaTypes/objects/module/instagramType.ts +35 -0
  295. package/templates/shopify/schemaTypes/objects/module/productFeaturesType.tsx +50 -0
  296. package/templates/shopify/schemaTypes/objects/module/productReferenceType.tsx +42 -0
  297. package/templates/shopify/schemaTypes/objects/seoType.ts +31 -0
  298. package/templates/shopify/schemaTypes/objects/shopify/collectionRuleType.tsx +37 -0
  299. package/templates/shopify/schemaTypes/objects/shopify/inventoryType.ts +25 -0
  300. package/templates/shopify/schemaTypes/objects/shopify/optionType.tsx +31 -0
  301. package/templates/shopify/schemaTypes/objects/shopify/placeholderStringType.ts +11 -0
  302. package/templates/shopify/schemaTypes/objects/shopify/priceRangeType.ts +20 -0
  303. package/templates/shopify/schemaTypes/objects/shopify/productWithVariantType.tsx +142 -0
  304. package/templates/shopify/schemaTypes/objects/shopify/proxyStringType.ts +12 -0
  305. package/templates/shopify/schemaTypes/objects/shopify/shopType.ts +15 -0
  306. package/templates/shopify/schemaTypes/objects/shopify/shopifyCollectionType.ts +84 -0
  307. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductType.ts +131 -0
  308. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductVariantType.ts +121 -0
  309. package/templates/shopify/schemaTypes/portableText/portableTextSimpleType.tsx +45 -0
  310. package/templates/shopify/schemaTypes/portableText/portableTextType.tsx +52 -0
  311. package/templates/shopify/schemaTypes/singletons/homeType.ts +49 -0
  312. package/templates/shopify/schemaTypes/singletons/settingsType.ts +96 -0
  313. package/templates/shopify/static/.gitkeep +1 -0
  314. package/templates/shopify/structure/collectionStructure.ts +9 -0
  315. package/templates/shopify/structure/colorThemeStructure.ts +9 -0
  316. package/templates/shopify/structure/homeStructure.ts +9 -0
  317. package/templates/shopify/structure/index.ts +57 -0
  318. package/templates/shopify/structure/pageStructure.ts +11 -0
  319. package/templates/shopify/structure/productStructure.ts +51 -0
  320. package/templates/shopify/structure/settingStructure.ts +9 -0
  321. package/templates/shopify/utils/blocksToText.ts +20 -0
  322. package/templates/shopify/utils/defineStructure.ts +11 -0
  323. package/templates/shopify/utils/getPriceRange.ts +24 -0
  324. package/templates/shopify/utils/shopifyUrls.ts +22 -0
  325. package/templates/shopify/utils/validateSlug.ts +18 -0
  326. package/templates/shopify-online-storefront/README.md +54 -0
  327. package/templates/shopify-online-storefront/components/icons/Shopify.tsx +22 -0
  328. package/templates/shopify-online-storefront/components/inputs/CollectionHidden.tsx +23 -0
  329. package/templates/shopify-online-storefront/components/inputs/PlaceholderString.tsx +25 -0
  330. package/templates/shopify-online-storefront/components/inputs/ProductHidden.tsx +66 -0
  331. package/templates/shopify-online-storefront/components/inputs/ProductVariantHidden.tsx +25 -0
  332. package/templates/shopify-online-storefront/components/inputs/ProxyString.tsx +38 -0
  333. package/templates/shopify-online-storefront/components/media/ShopifyDocumentStatus.tsx +83 -0
  334. package/templates/shopify-online-storefront/constants.ts +18 -0
  335. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/index.ts +45 -0
  336. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyDelete.tsx +144 -0
  337. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyLink.ts +39 -0
  338. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/types.ts +14 -0
  339. package/templates/shopify-online-storefront/schemaTypes/blocks/blockContent.ts +32 -0
  340. package/templates/shopify-online-storefront/schemaTypes/documents/collection.tsx +83 -0
  341. package/templates/shopify-online-storefront/schemaTypes/documents/product.tsx +102 -0
  342. package/templates/shopify-online-storefront/schemaTypes/documents/productVariant.tsx +82 -0
  343. package/templates/shopify-online-storefront/schemaTypes/index.ts +43 -0
  344. package/templates/shopify-online-storefront/schemaTypes/objects/accordion.ts +31 -0
  345. package/templates/shopify-online-storefront/schemaTypes/objects/accordionGroup.ts +35 -0
  346. package/templates/shopify-online-storefront/schemaTypes/objects/callout.ts +40 -0
  347. package/templates/shopify-online-storefront/schemaTypes/objects/inventory.ts +30 -0
  348. package/templates/shopify-online-storefront/schemaTypes/objects/option.ts +30 -0
  349. package/templates/shopify-online-storefront/schemaTypes/objects/priceRange.ts +22 -0
  350. package/templates/shopify-online-storefront/schemaTypes/objects/proxyString.ts +11 -0
  351. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollection.ts +109 -0
  352. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollectionRule.tsx +45 -0
  353. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProduct.ts +165 -0
  354. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProductVariant.ts +151 -0
  355. package/templates/shopify-online-storefront/structure/collectionStructure.ts +9 -0
  356. package/templates/shopify-online-storefront/structure/index.ts +37 -0
  357. package/templates/shopify-online-storefront/structure/productStructure.ts +35 -0
  358. package/templates/shopify-online-storefront/utils/defineStructure.ts +11 -0
  359. package/templates/shopify-online-storefront/utils/getPriceRange.ts +24 -0
  360. package/templates/shopify-online-storefront/utils/shopifyUrls.ts +22 -0
  361. package/dist/actions/build/__tests__/buildApp.test.js +0 -367
  362. package/dist/actions/build/__tests__/buildApp.test.js.map +0 -1
  363. package/dist/actions/build/__tests__/buildStudio.test.js +0 -561
  364. package/dist/actions/build/__tests__/buildStudio.test.js.map +0 -1
  365. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js +0 -233
  366. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js.map +0 -1
  367. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js +0 -414
  368. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js.map +0 -1
  369. package/dist/actions/build/__tests__/determineBasePath.test.js +0 -24
  370. package/dist/actions/build/__tests__/determineBasePath.test.js.map +0 -1
  371. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js +0 -109
  372. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js.map +0 -1
  373. package/dist/actions/build/__tests__/getViteConfig.test.js +0 -493
  374. package/dist/actions/build/__tests__/getViteConfig.test.js.map +0 -1
  375. package/dist/actions/build/__tests__/renderDocument.test.js +0 -278
  376. package/dist/actions/build/__tests__/renderDocument.test.js.map +0 -1
  377. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js +0 -153
  378. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js.map +0 -1
  379. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js +0 -657
  380. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js.map +0 -1
  381. package/dist/actions/cors/constants.d.ts +0 -1
  382. package/dist/actions/cors/constants.js +0 -3
  383. package/dist/actions/cors/constants.js.map +0 -1
  384. package/dist/actions/cors/types.d.ts +0 -9
  385. package/dist/actions/cors/types.js +0 -3
  386. package/dist/actions/cors/types.js.map +0 -1
  387. package/dist/actions/dataset/__tests__/validateDatasetName.test.js +0 -182
  388. package/dist/actions/dataset/__tests__/validateDatasetName.test.js.map +0 -1
  389. package/dist/actions/deploy/__tests__/checkDir.test.js +0 -120
  390. package/dist/actions/deploy/__tests__/checkDir.test.js.map +0 -1
  391. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js +0 -16
  392. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js.map +0 -1
  393. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js +0 -124
  394. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js.map +0 -1
  395. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +0 -274
  396. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +0 -1
  397. package/dist/actions/media/__tests__/importMedia.test.js +0 -182
  398. package/dist/actions/media/__tests__/importMedia.test.js.map +0 -1
  399. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
  400. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
  401. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js +0 -174
  402. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js.map +0 -1
  403. package/dist/actions/schema/__tests__/validateAction.test.js +0 -281
  404. package/dist/actions/schema/__tests__/validateAction.test.js.map +0 -1
  405. package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
  406. package/dist/actions/schema/schemaStoreConstants.js +0 -4
  407. package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
  408. package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
  409. package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
  410. package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
  411. package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
  412. package/dist/actions/schema/utils/schemaApiClient.js +0 -17
  413. package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
  414. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js +0 -27
  415. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js.map +0 -1
  416. package/dist/actions/users/__tests__/validateEmail.test.js +0 -16
  417. package/dist/actions/users/__tests__/validateEmail.test.js.map +0 -1
  418. package/dist/actions/users/apiVersion.d.ts +0 -6
  419. package/dist/actions/users/apiVersion.js +0 -7
  420. package/dist/actions/users/apiVersion.js.map +0 -1
  421. package/dist/commands/__tests__/blueprints.test.js +0 -54
  422. package/dist/commands/__tests__/blueprints.test.js.map +0 -1
  423. package/dist/commands/__tests__/build.test.js +0 -132
  424. package/dist/commands/__tests__/build.test.js.map +0 -1
  425. package/dist/commands/__tests__/codemod.test.js +0 -271
  426. package/dist/commands/__tests__/codemod.test.js.map +0 -1
  427. package/dist/commands/__tests__/debug.test.js +0 -697
  428. package/dist/commands/__tests__/debug.test.js.map +0 -1
  429. package/dist/commands/__tests__/deploy.test.js +0 -1913
  430. package/dist/commands/__tests__/deploy.test.js.map +0 -1
  431. package/dist/commands/__tests__/dev.test.js +0 -410
  432. package/dist/commands/__tests__/dev.test.js.map +0 -1
  433. package/dist/commands/__tests__/exec.test.js +0 -207
  434. package/dist/commands/__tests__/exec.test.js.map +0 -1
  435. package/dist/commands/__tests__/init/init.authentication.test.js +0 -60
  436. package/dist/commands/__tests__/init/init.authentication.test.js.map +0 -1
  437. package/dist/commands/__tests__/init/init.create-new-project.test.js +0 -196
  438. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +0 -1
  439. package/dist/commands/__tests__/init/init.plan.test.js +0 -220
  440. package/dist/commands/__tests__/init/init.plan.test.js.map +0 -1
  441. package/dist/commands/__tests__/init/init.setup.test.js +0 -279
  442. package/dist/commands/__tests__/init/init.setup.test.js.map +0 -1
  443. package/dist/commands/__tests__/install.test.js +0 -258
  444. package/dist/commands/__tests__/install.test.js.map +0 -1
  445. package/dist/commands/__tests__/learn.test.js +0 -29
  446. package/dist/commands/__tests__/learn.test.js.map +0 -1
  447. package/dist/commands/__tests__/logout.test.js +0 -88
  448. package/dist/commands/__tests__/logout.test.js.map +0 -1
  449. package/dist/commands/__tests__/manage.test.js +0 -105
  450. package/dist/commands/__tests__/manage.test.js.map +0 -1
  451. package/dist/commands/__tests__/migration.test.js +0 -119
  452. package/dist/commands/__tests__/migration.test.js.map +0 -1
  453. package/dist/commands/__tests__/preview.test.js +0 -261
  454. package/dist/commands/__tests__/preview.test.js.map +0 -1
  455. package/dist/commands/__tests__/start.test.js +0 -253
  456. package/dist/commands/__tests__/start.test.js.map +0 -1
  457. package/dist/commands/__tests__/undeploy.test.js +0 -382
  458. package/dist/commands/__tests__/undeploy.test.js.map +0 -1
  459. package/dist/commands/__tests__/versions.test.js +0 -134
  460. package/dist/commands/__tests__/versions.test.js.map +0 -1
  461. package/dist/commands/backup/__tests__/disable.test.js +0 -207
  462. package/dist/commands/backup/__tests__/disable.test.js.map +0 -1
  463. package/dist/commands/backup/__tests__/download.test.js +0 -679
  464. package/dist/commands/backup/__tests__/download.test.js.map +0 -1
  465. package/dist/commands/backup/__tests__/enable.test.js +0 -317
  466. package/dist/commands/backup/__tests__/enable.test.js.map +0 -1
  467. package/dist/commands/backup/__tests__/list.test.js +0 -321
  468. package/dist/commands/backup/__tests__/list.test.js.map +0 -1
  469. package/dist/commands/cors/__tests__/add.test.js +0 -346
  470. package/dist/commands/cors/__tests__/add.test.js.map +0 -1
  471. package/dist/commands/cors/__tests__/delete.test.js +0 -293
  472. package/dist/commands/cors/__tests__/delete.test.js.map +0 -1
  473. package/dist/commands/cors/__tests__/list.test.js +0 -218
  474. package/dist/commands/cors/__tests__/list.test.js.map +0 -1
  475. package/dist/commands/dataset/__tests__/copy.test.js +0 -520
  476. package/dist/commands/dataset/__tests__/copy.test.js.map +0 -1
  477. package/dist/commands/dataset/__tests__/create.test.js +0 -312
  478. package/dist/commands/dataset/__tests__/create.test.js.map +0 -1
  479. package/dist/commands/dataset/__tests__/delete.test.js +0 -224
  480. package/dist/commands/dataset/__tests__/delete.test.js.map +0 -1
  481. package/dist/commands/dataset/__tests__/export.test.js +0 -561
  482. package/dist/commands/dataset/__tests__/export.test.js.map +0 -1
  483. package/dist/commands/dataset/__tests__/import.test.js +0 -53
  484. package/dist/commands/dataset/__tests__/import.test.js.map +0 -1
  485. package/dist/commands/dataset/__tests__/list.test.js +0 -174
  486. package/dist/commands/dataset/__tests__/list.test.js.map +0 -1
  487. package/dist/commands/dataset/alias/__tests__/create.test.js +0 -299
  488. package/dist/commands/dataset/alias/__tests__/create.test.js.map +0 -1
  489. package/dist/commands/dataset/alias/__tests__/delete.test.js +0 -236
  490. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +0 -1
  491. package/dist/commands/dataset/alias/__tests__/link.test.js +0 -336
  492. package/dist/commands/dataset/alias/__tests__/link.test.js.map +0 -1
  493. package/dist/commands/dataset/alias/__tests__/unlink.test.js +0 -298
  494. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +0 -1
  495. package/dist/commands/dataset/visibility/__tests__/get.test.js +0 -147
  496. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +0 -1
  497. package/dist/commands/dataset/visibility/__tests__/set.test.js +0 -245
  498. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +0 -1
  499. package/dist/commands/docs/__tests__/browse.test.js +0 -29
  500. package/dist/commands/docs/__tests__/browse.test.js.map +0 -1
  501. package/dist/commands/docs/__tests__/read.test.js +0 -78
  502. package/dist/commands/docs/__tests__/read.test.js.map +0 -1
  503. package/dist/commands/docs/__tests__/search.test.js +0 -254
  504. package/dist/commands/docs/__tests__/search.test.js.map +0 -1
  505. package/dist/commands/documents/__tests__/create.test.js +0 -967
  506. package/dist/commands/documents/__tests__/create.test.js.map +0 -1
  507. package/dist/commands/documents/__tests__/delete.test.js +0 -268
  508. package/dist/commands/documents/__tests__/delete.test.js.map +0 -1
  509. package/dist/commands/documents/__tests__/get.test.js +0 -209
  510. package/dist/commands/documents/__tests__/get.test.js.map +0 -1
  511. package/dist/commands/documents/__tests__/query.test.js +0 -405
  512. package/dist/commands/documents/__tests__/query.test.js.map +0 -1
  513. package/dist/commands/documents/__tests__/validate.test.js +0 -226
  514. package/dist/commands/documents/__tests__/validate.test.js.map +0 -1
  515. package/dist/commands/graphql/__tests__/list.test.js +0 -228
  516. package/dist/commands/graphql/__tests__/list.test.js.map +0 -1
  517. package/dist/commands/graphql/__tests__/undeploy.test.js +0 -384
  518. package/dist/commands/graphql/__tests__/undeploy.test.js.map +0 -1
  519. package/dist/commands/hook/__tests__/attempt.test.js +0 -260
  520. package/dist/commands/hook/__tests__/attempt.test.js.map +0 -1
  521. package/dist/commands/hook/__tests__/create.test.js +0 -121
  522. package/dist/commands/hook/__tests__/create.test.js.map +0 -1
  523. package/dist/commands/hook/__tests__/delete.test.js +0 -220
  524. package/dist/commands/hook/__tests__/delete.test.js.map +0 -1
  525. package/dist/commands/hook/__tests__/list.test.js +0 -138
  526. package/dist/commands/hook/__tests__/list.test.js.map +0 -1
  527. package/dist/commands/hook/__tests__/logs.test.js +0 -770
  528. package/dist/commands/hook/__tests__/logs.test.js.map +0 -1
  529. package/dist/commands/manifest/__tests__/extract.test.js +0 -123
  530. package/dist/commands/manifest/__tests__/extract.test.js.map +0 -1
  531. package/dist/commands/mcp/__tests__/configure.test.js +0 -397
  532. package/dist/commands/mcp/__tests__/configure.test.js.map +0 -1
  533. package/dist/commands/media/__tests__/create-aspect.test.js +0 -160
  534. package/dist/commands/media/__tests__/create-aspect.test.js.map +0 -1
  535. package/dist/commands/media/__tests__/delete-aspect.test.js +0 -333
  536. package/dist/commands/media/__tests__/delete-aspect.test.js.map +0 -1
  537. package/dist/commands/media/__tests__/deploy-aspect.test.js +0 -632
  538. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +0 -1
  539. package/dist/commands/media/__tests__/export.test.js +0 -398
  540. package/dist/commands/media/__tests__/export.test.js.map +0 -1
  541. package/dist/commands/media/__tests__/import.test.js +0 -281
  542. package/dist/commands/media/__tests__/import.test.js.map +0 -1
  543. package/dist/commands/openapi/__tests__/get.test.js +0 -149
  544. package/dist/commands/openapi/__tests__/get.test.js.map +0 -1
  545. package/dist/commands/openapi/__tests__/list.test.js +0 -113
  546. package/dist/commands/openapi/__tests__/list.test.js.map +0 -1
  547. package/dist/commands/projects/__tests__/list.test.js +0 -153
  548. package/dist/commands/projects/__tests__/list.test.js.map +0 -1
  549. package/dist/commands/schema/__tests__/delete.test.js +0 -209
  550. package/dist/commands/schema/__tests__/delete.test.js.map +0 -1
  551. package/dist/commands/schema/__tests__/extract.test.js +0 -113
  552. package/dist/commands/schema/__tests__/extract.test.js.map +0 -1
  553. package/dist/commands/schema/__tests__/validate.test.js +0 -104
  554. package/dist/commands/schema/__tests__/validate.test.js.map +0 -1
  555. package/dist/commands/telemetry/__tests__/disable.test.js +0 -145
  556. package/dist/commands/telemetry/__tests__/disable.test.js.map +0 -1
  557. package/dist/commands/telemetry/__tests__/enable.test.js +0 -131
  558. package/dist/commands/telemetry/__tests__/enable.test.js.map +0 -1
  559. package/dist/commands/telemetry/__tests__/status.test.js +0 -153
  560. package/dist/commands/telemetry/__tests__/status.test.js.map +0 -1
  561. package/dist/commands/tokens/__tests__/add.test.js +0 -420
  562. package/dist/commands/tokens/__tests__/add.test.js.map +0 -1
  563. package/dist/commands/tokens/__tests__/delete.test.js +0 -375
  564. package/dist/commands/tokens/__tests__/delete.test.js.map +0 -1
  565. package/dist/commands/tokens/__tests__/list.test.js +0 -368
  566. package/dist/commands/tokens/__tests__/list.test.js.map +0 -1
  567. package/dist/commands/users/__tests__/invite.test.js +0 -341
  568. package/dist/commands/users/__tests__/invite.test.js.map +0 -1
  569. package/dist/commands/users/__tests__/list.test.js +0 -401
  570. package/dist/commands/users/__tests__/list.test.js.map +0 -1
  571. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js +0 -77
  572. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js.map +0 -1
  573. package/dist/services/__tests__/datasetAliases.test.js +0 -131
  574. package/dist/services/__tests__/datasetAliases.test.js.map +0 -1
  575. package/dist/services/__tests__/datasets.test.js +0 -436
  576. package/dist/services/__tests__/datasets.test.js.map +0 -1
  577. package/dist/services/__tests__/graphql.test.js +0 -43
  578. package/dist/services/__tests__/graphql.test.js.map +0 -1
  579. package/dist/services/__tests__/mediaLibraries.test.js +0 -88
  580. package/dist/services/__tests__/mediaLibraries.test.js.map +0 -1
  581. package/dist/services/__tests__/projects.test.js +0 -41
  582. package/dist/services/__tests__/projects.test.js.map +0 -1
  583. package/dist/services/__tests__/userApplications.test.js +0 -113
  584. package/dist/services/__tests__/userApplications.test.js.map +0 -1
  585. package/dist/util/__tests__/appId.test.js +0 -31
  586. package/dist/util/__tests__/appId.test.js.map +0 -1
  587. package/dist/util/__tests__/cliClient.test.js +0 -184
  588. package/dist/util/__tests__/cliClient.test.js.map +0 -1
  589. package/dist/util/__tests__/compareDependencyVersions.test.js +0 -426
  590. package/dist/util/__tests__/compareDependencyVersions.test.js.map +0 -1
  591. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js +0 -74
  592. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js.map +0 -1
  593. package/dist/util/__tests__/findNdjsonEntry.test.js +0 -54
  594. package/dist/util/__tests__/findNdjsonEntry.test.js.map +0 -1
  595. package/dist/util/__tests__/getCliVersion.test.js +0 -28
  596. package/dist/util/__tests__/getCliVersion.test.js.map +0 -1
  597. package/dist/util/__tests__/getLocalPackageVersion.test.js +0 -84
  598. package/dist/util/__tests__/getLocalPackageVersion.test.js.map +0 -1
  599. package/dist/util/__tests__/getWorkspace.test.js +0 -37
  600. package/dist/util/__tests__/getWorkspace.test.js.map +0 -1
  601. package/dist/util/__tests__/readPackageJson.test.js +0 -69
  602. package/dist/util/__tests__/readPackageJson.test.js.map +0 -1
  603. package/dist/util/__tests__/warnAboutMissingAppId.test.js +0 -28
  604. package/dist/util/__tests__/warnAboutMissingAppId.test.js.map +0 -1
  605. package/dist/util/packageManager/__tests__/installPackages.test.js +0 -388
  606. package/dist/util/packageManager/__tests__/installPackages.test.js.map +0 -1
  607. package/dist/util/validation/ __tests__/validateDocuments.test.js +0 -274
  608. package/dist/util/validation/ __tests__/validateDocuments.test.js.map +0 -1
@@ -1,520 +0,0 @@
1
- import { runCommand } from '@oclif/test';
2
- import { select } from '@sanity/cli-core/ux';
3
- import { testCommand } from '@sanity/cli-test';
4
- import { of, throwError } from 'rxjs';
5
- import { afterEach, describe, expect, test, vi } from 'vitest';
6
- import { getCliConfig } from '../../../../../cli-core/src/config/cli/getCliConfig.js';
7
- import * as datasetsService from '../../../services/datasets.js';
8
- import { CopyDatasetCommand } from '../copy.js';
9
- vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
10
- findProjectRoot: vi.fn().mockResolvedValue({
11
- directory: '/test/path',
12
- root: '/test/path',
13
- type: 'studio'
14
- })
15
- }));
16
- vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
17
- getCliConfig: vi.fn().mockResolvedValue({
18
- api: {
19
- projectId: 'test-project'
20
- }
21
- })
22
- }));
23
- vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
24
- getCliToken: vi.fn().mockResolvedValue('test-token')
25
- }));
26
- vi.mock('@sanity/cli-core/ux', async ()=>{
27
- const actual = await vi.importActual('@sanity/cli-core/ux');
28
- return {
29
- ...actual,
30
- input: vi.fn(),
31
- select: vi.fn()
32
- };
33
- });
34
- vi.mock('../../../services/datasets.js', ()=>({
35
- copyDataset: vi.fn(),
36
- followCopyJobProgress: vi.fn(),
37
- listDatasetCopyJobs: vi.fn(),
38
- listDatasets: vi.fn()
39
- }));
40
- const mockGetCliConfig = vi.mocked(getCliConfig);
41
- const mockSelect = vi.mocked(select);
42
- const mockCopyDataset = vi.mocked(datasetsService.copyDataset);
43
- const mockFollowCopyJobProgress = vi.mocked(datasetsService.followCopyJobProgress);
44
- const mockListDatasetCopyJobs = vi.mocked(datasetsService.listDatasetCopyJobs);
45
- const mockListDatasets = vi.mocked(datasetsService.listDatasets);
46
- // Helper to create mock datasets
47
- function createMockDataset(name) {
48
- return {
49
- aclMode: 'public',
50
- addonFor: null,
51
- createdAt: '2023-01-01T00:00:00Z',
52
- createdByUserId: 'test-user',
53
- datasetProfile: 'default',
54
- features: [],
55
- name,
56
- tags: []
57
- };
58
- }
59
- describe('#dataset:copy', ()=>{
60
- afterEach(()=>{
61
- vi.clearAllMocks();
62
- });
63
- test('help works', async ()=>{
64
- const { stdout } = await runCommand([
65
- 'dataset copy',
66
- '--help'
67
- ]);
68
- expect(stdout).toMatchInlineSnapshot(`
69
- "Manages dataset copying, including starting a new copy job, listing copy jobs and following the progress of a running copy job
70
-
71
- USAGE
72
- $ sanity dataset copy [SOURCE] [TARGET] [--attach <value> | --list |
73
- --detach | --skip-history] [--limit <value> ] [--offset <value> ]
74
-
75
- ARGUMENTS
76
- [SOURCE] Name of the dataset to copy from
77
- [TARGET] Name of the dataset to copy to
78
-
79
- FLAGS
80
- --attach=<value> Attach to the running copy process to show progress
81
- --detach Start the copy without waiting for it to finish
82
- --limit=<value> Maximum number of jobs returned (default 10, max 1000)
83
- --list Lists all dataset copy jobs
84
- --offset=<value> Start position in the list of jobs (default 0)
85
- --skip-history Don't preserve document history on copy
86
-
87
- DESCRIPTION
88
- Manages dataset copying, including starting a new copy job, listing copy jobs
89
- and following the progress of a running copy job
90
-
91
- EXAMPLES
92
- Interactively copy a dataset
93
-
94
- $ sanity dataset copy
95
-
96
- Copy from source-dataset (prompts for target)
97
-
98
- $ sanity dataset copy source-dataset
99
-
100
- Copy from source-dataset to target-dataset
101
-
102
- $ sanity dataset copy source-dataset target-dataset
103
-
104
- Copy without preserving document history (faster for large datasets)
105
-
106
- $ sanity dataset copy --skip-history source target
107
-
108
- Start copy job without waiting for completion
109
-
110
- $ sanity dataset copy --detach source target
111
-
112
- Attach to a running copy job to follow progress
113
-
114
- $ sanity dataset copy --attach <job-id>
115
-
116
- List all dataset copy jobs
117
-
118
- $ sanity dataset copy --list
119
-
120
- List copy jobs with pagination
121
-
122
- $ sanity dataset copy --list --offset 2 --limit 10
123
-
124
- "
125
- `);
126
- });
127
- describe('list mode', ()=>{
128
- test('lists copy jobs successfully', async ()=>{
129
- mockListDatasetCopyJobs.mockResolvedValue([
130
- {
131
- createdAt: '2023-01-01T00:00:00Z',
132
- id: 'job-1',
133
- sourceDataset: 'production',
134
- state: 'completed',
135
- targetDataset: 'backup',
136
- updatedAt: '2023-01-01T00:05:00Z',
137
- withHistory: true
138
- },
139
- {
140
- createdAt: '2023-01-02T00:00:00Z',
141
- id: 'job-2',
142
- sourceDataset: 'staging',
143
- state: 'failed',
144
- targetDataset: 'test',
145
- updatedAt: '2023-01-02T00:02:00Z',
146
- withHistory: false
147
- }
148
- ]);
149
- const { stdout } = await testCommand(CopyDatasetCommand, [
150
- '--list'
151
- ]);
152
- expect(mockListDatasetCopyJobs).toHaveBeenCalledWith({
153
- limit: undefined,
154
- offset: undefined,
155
- projectId: 'test-project'
156
- });
157
- expect(stdout).toContain('Dataset copy jobs');
158
- expect(stdout).toContain('job-1');
159
- expect(stdout).toContain('job-2');
160
- expect(stdout).toContain('production');
161
- expect(stdout).toContain('staging');
162
- });
163
- test('lists copy jobs with offset and limit', async ()=>{
164
- mockListDatasetCopyJobs.mockResolvedValue([]);
165
- await testCommand(CopyDatasetCommand, [
166
- '--list',
167
- '--offset',
168
- '2',
169
- '--limit',
170
- '10'
171
- ]);
172
- expect(mockListDatasetCopyJobs).toHaveBeenCalledWith({
173
- limit: 10,
174
- offset: 2,
175
- projectId: 'test-project'
176
- });
177
- });
178
- test('shows message when no copy jobs exist', async ()=>{
179
- mockListDatasetCopyJobs.mockResolvedValue([]);
180
- const { stdout } = await testCommand(CopyDatasetCommand, [
181
- '--list'
182
- ]);
183
- expect(stdout).toContain("This project doesn't have any dataset copy jobs");
184
- });
185
- test('handles errors when listing copy jobs', async ()=>{
186
- mockListDatasetCopyJobs.mockRejectedValue(new Error('API Error'));
187
- const { error } = await testCommand(CopyDatasetCommand, [
188
- '--list'
189
- ]);
190
- expect(error?.message).toContain('Failed to list dataset copy jobs: API Error');
191
- expect(error?.oclif?.exit).toBe(1);
192
- });
193
- });
194
- describe('attach mode', ()=>{
195
- test('attaches to running job and shows progress', async ()=>{
196
- mockFollowCopyJobProgress.mockReturnValue(of({
197
- progress: 25,
198
- type: 'progress'
199
- }, {
200
- progress: 50,
201
- type: 'progress'
202
- }, {
203
- progress: 75,
204
- type: 'progress'
205
- }, {
206
- progress: 100,
207
- type: 'progress'
208
- }));
209
- const { stdout } = await testCommand(CopyDatasetCommand, [
210
- '--attach',
211
- 'job-123'
212
- ]);
213
- expect(mockFollowCopyJobProgress).toHaveBeenCalledWith({
214
- jobId: 'job-123',
215
- projectId: 'test-project'
216
- });
217
- expect(stdout).toContain('Job job-123 completed');
218
- });
219
- test('handles progress tracking errors', async ()=>{
220
- mockFollowCopyJobProgress.mockReturnValue(throwError(()=>new Error('Connection lost')));
221
- const { error } = await testCommand(CopyDatasetCommand, [
222
- '--attach',
223
- 'job-123'
224
- ]);
225
- expect(error?.message).toContain('Failed to attach to copy job: Connection lost');
226
- expect(error?.oclif?.exit).toBe(1);
227
- });
228
- test('rejects whitespace-only jobId', async ()=>{
229
- const { error } = await testCommand(CopyDatasetCommand, [
230
- '--attach',
231
- ' '
232
- ]);
233
- expect(error?.message).toContain('Please supply a valid jobId');
234
- expect(error?.oclif?.exit).toBe(1);
235
- });
236
- test('handles JSON parse errors from EventSource', async ()=>{
237
- mockFollowCopyJobProgress.mockReturnValue(throwError(()=>new Error('Invalid JSON received from server: Unexpected token')));
238
- const { error } = await testCommand(CopyDatasetCommand, [
239
- '--attach',
240
- 'job-123'
241
- ]);
242
- expect(error?.message).toContain('Invalid JSON received from server');
243
- expect(error?.oclif?.exit).toBe(1);
244
- });
245
- test('handles EventSource reconnection', async ()=>{
246
- mockFollowCopyJobProgress.mockReturnValue(of({
247
- progress: 25,
248
- type: 'progress'
249
- }, {
250
- type: 'reconnect'
251
- }, {
252
- progress: 50,
253
- type: 'progress'
254
- }));
255
- const { stdout } = await testCommand(CopyDatasetCommand, [
256
- '--attach',
257
- 'job-123'
258
- ]);
259
- expect(mockFollowCopyJobProgress).toHaveBeenCalledWith({
260
- jobId: 'job-123',
261
- projectId: 'test-project'
262
- });
263
- expect(stdout).toContain('Job job-123 completed');
264
- });
265
- test('handles channel_error from EventSource', async ()=>{
266
- mockFollowCopyJobProgress.mockReturnValue(throwError(()=>new Error('Copy job failed: Channel closed unexpectedly')));
267
- const { error } = await testCommand(CopyDatasetCommand, [
268
- '--attach',
269
- 'job-123'
270
- ]);
271
- expect(error?.message).toContain('Copy job failed');
272
- expect(error?.oclif?.exit).toBe(1);
273
- });
274
- });
275
- describe('copy mode', ()=>{
276
- test('copies dataset with provided arguments', async ()=>{
277
- mockListDatasets.mockResolvedValue([
278
- createMockDataset('production'),
279
- createMockDataset('staging')
280
- ]);
281
- mockCopyDataset.mockResolvedValue({
282
- jobId: 'job-456'
283
- });
284
- mockFollowCopyJobProgress.mockReturnValue(of({
285
- progress: 100,
286
- type: 'progress'
287
- }));
288
- const { stdout } = await testCommand(CopyDatasetCommand, [
289
- 'production',
290
- 'backup'
291
- ]);
292
- expect(mockCopyDataset).toHaveBeenCalledWith({
293
- projectId: 'test-project',
294
- skipHistory: false,
295
- sourceDataset: 'production',
296
- targetDataset: 'backup'
297
- });
298
- expect(stdout).toContain('Copying dataset production to backup');
299
- expect(stdout).toContain('Job job-456 started');
300
- expect(stdout).toContain('Job job-456 completed');
301
- });
302
- test('prompts for source dataset when not provided', async ()=>{
303
- mockListDatasets.mockResolvedValue([
304
- createMockDataset('production'),
305
- createMockDataset('staging')
306
- ]);
307
- mockSelect.mockResolvedValueOnce('production');
308
- mockSelect.mockResolvedValueOnce('backup');
309
- mockCopyDataset.mockResolvedValue({
310
- jobId: 'job-789'
311
- });
312
- mockFollowCopyJobProgress.mockReturnValue(of({
313
- progress: 100,
314
- type: 'progress'
315
- }));
316
- await testCommand(CopyDatasetCommand, []);
317
- expect(mockSelect).toHaveBeenCalledWith({
318
- choices: expect.arrayContaining([
319
- expect.objectContaining({
320
- value: 'production'
321
- }),
322
- expect.objectContaining({
323
- value: 'staging'
324
- })
325
- ]),
326
- message: 'Select the dataset name:'
327
- });
328
- });
329
- test.each([
330
- {
331
- args: [
332
- 'Invalid-Dataset',
333
- 'backup'
334
- ],
335
- description: 'source dataset name is invalid',
336
- expectedError: 'must be all lowercase',
337
- setupMocks: ()=>{
338
- // No additional mocks needed - validation happens before dataset fetch
339
- }
340
- },
341
- {
342
- args: [
343
- 'nonexistent',
344
- 'backup'
345
- ],
346
- description: 'source dataset does not exist',
347
- expectedError: 'Source dataset "nonexistent" doesn\'t exist',
348
- setupMocks: ()=>{
349
- mockListDatasets.mockResolvedValue([
350
- createMockDataset('production'),
351
- createMockDataset('staging')
352
- ]);
353
- }
354
- },
355
- {
356
- args: [
357
- 'production',
358
- 'Invalid-Dataset'
359
- ],
360
- description: 'target dataset name is invalid',
361
- expectedError: 'must be all lowercase',
362
- setupMocks: ()=>{
363
- mockListDatasets.mockResolvedValue([
364
- createMockDataset('production'),
365
- createMockDataset('staging')
366
- ]);
367
- }
368
- },
369
- {
370
- args: [
371
- 'production',
372
- 'staging'
373
- ],
374
- description: 'target dataset already exists',
375
- expectedError: 'Target dataset "staging" already exists',
376
- setupMocks: ()=>{
377
- mockListDatasets.mockResolvedValue([
378
- createMockDataset('production'),
379
- createMockDataset('staging')
380
- ]);
381
- }
382
- }
383
- ])('errors when $description', async ({ args, expectedError, setupMocks })=>{
384
- setupMocks();
385
- const { error } = await testCommand(CopyDatasetCommand, args);
386
- expect(error?.message).toContain(expectedError);
387
- expect(error?.oclif?.exit).toBe(1);
388
- });
389
- test('copies dataset with skip-history flag', async ()=>{
390
- mockListDatasets.mockResolvedValue([
391
- createMockDataset('production'),
392
- createMockDataset('staging')
393
- ]);
394
- mockCopyDataset.mockResolvedValue({
395
- jobId: 'job-skip'
396
- });
397
- mockFollowCopyJobProgress.mockReturnValue(of({
398
- progress: 100,
399
- type: 'progress'
400
- }));
401
- await testCommand(CopyDatasetCommand, [
402
- 'production',
403
- 'backup',
404
- '--skip-history'
405
- ]);
406
- expect(mockCopyDataset).toHaveBeenCalledWith({
407
- projectId: 'test-project',
408
- skipHistory: true,
409
- sourceDataset: 'production',
410
- targetDataset: 'backup'
411
- });
412
- });
413
- test('copies dataset with detach flag (does not wait for completion)', async ()=>{
414
- mockListDatasets.mockResolvedValue([
415
- createMockDataset('production'),
416
- createMockDataset('staging')
417
- ]);
418
- mockCopyDataset.mockResolvedValue({
419
- jobId: 'job-detach'
420
- });
421
- const { stdout } = await testCommand(CopyDatasetCommand, [
422
- 'production',
423
- 'backup',
424
- '--detach'
425
- ]);
426
- expect(mockCopyDataset).toHaveBeenCalledWith({
427
- projectId: 'test-project',
428
- skipHistory: false,
429
- sourceDataset: 'production',
430
- targetDataset: 'backup'
431
- });
432
- expect(stdout).toContain('Job job-detach started');
433
- expect(stdout).not.toContain('Job job-detach completed');
434
- expect(mockFollowCopyJobProgress).not.toHaveBeenCalled();
435
- });
436
- test('handles copy dataset errors', async ()=>{
437
- mockListDatasets.mockResolvedValue([
438
- createMockDataset('production'),
439
- createMockDataset('staging')
440
- ]);
441
- mockCopyDataset.mockRejectedValue(new Error('Insufficient permissions'));
442
- const { error } = await testCommand(CopyDatasetCommand, [
443
- 'production',
444
- 'backup'
445
- ]);
446
- expect(error?.message).toContain('Dataset copying failed: Insufficient permissions');
447
- expect(error?.oclif?.exit).toBe(1);
448
- });
449
- test('handles fetch datasets error', async ()=>{
450
- mockListDatasets.mockRejectedValue(new Error('Network error'));
451
- const { error } = await testCommand(CopyDatasetCommand, [
452
- 'production',
453
- 'backup'
454
- ]);
455
- expect(error?.message).toContain('Failed to fetch datasets: Network error');
456
- expect(error?.oclif?.exit).toBe(1);
457
- });
458
- });
459
- describe('flag validation', ()=>{
460
- test.each([
461
- {
462
- desc: '--list with --attach',
463
- flags: [
464
- '--list',
465
- '--attach',
466
- 'job-123'
467
- ]
468
- },
469
- {
470
- desc: '--list with --detach',
471
- flags: [
472
- '--list',
473
- '--detach'
474
- ]
475
- },
476
- {
477
- desc: '--attach with --detach',
478
- flags: [
479
- '--attach',
480
- 'job-123',
481
- '--detach'
482
- ]
483
- }
484
- ])('errors when using mutually exclusive flags: $desc', async ({ flags })=>{
485
- const { error } = await testCommand(CopyDatasetCommand, flags);
486
- expect(error?.message).toContain('cannot also be provided when using');
487
- expect(error?.oclif?.exit).toBe(2);
488
- });
489
- test.each([
490
- {
491
- flag: '--offset',
492
- value: '2'
493
- },
494
- {
495
- flag: '--limit',
496
- value: '10'
497
- }
498
- ])('errors when $flag is used without --list', async ({ flag, value })=>{
499
- const { error } = await testCommand(CopyDatasetCommand, [
500
- flag,
501
- value
502
- ]);
503
- expect(error?.message).toContain('--list');
504
- expect(error?.oclif?.exit).toBe(2);
505
- });
506
- });
507
- test('errors when no project ID is found', async ()=>{
508
- mockGetCliConfig.mockResolvedValueOnce({
509
- api: undefined
510
- });
511
- const { error } = await testCommand(CopyDatasetCommand, [
512
- 'production',
513
- 'backup'
514
- ]);
515
- expect(error?.message).toContain('sanity.cli.ts does not contain a project identifier');
516
- expect(error?.oclif?.exit).toBe(1);
517
- });
518
- });
519
-
520
- //# sourceMappingURL=copy.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/commands/dataset/__tests__/copy.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {select} from '@sanity/cli-core/ux'\nimport {testCommand} from '@sanity/cli-test'\nimport {of, throwError} from 'rxjs'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {getCliConfig} from '../../../../../cli-core/src/config/cli/getCliConfig.js'\nimport * as datasetsService from '../../../services/datasets.js'\nimport {CopyDatasetCommand} from '../copy.js'\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn().mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n input: vi.fn(),\n select: vi.fn(),\n }\n})\n\nvi.mock('../../../services/datasets.js', () => ({\n copyDataset: vi.fn(),\n followCopyJobProgress: vi.fn(),\n listDatasetCopyJobs: vi.fn(),\n listDatasets: vi.fn(),\n}))\n\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockSelect = vi.mocked(select)\nconst mockCopyDataset = vi.mocked(datasetsService.copyDataset)\nconst mockFollowCopyJobProgress = vi.mocked(datasetsService.followCopyJobProgress)\nconst mockListDatasetCopyJobs = vi.mocked(datasetsService.listDatasetCopyJobs)\nconst mockListDatasets = vi.mocked(datasetsService.listDatasets)\n\n// Helper to create mock datasets\nfunction createMockDataset(name: string) {\n return {\n aclMode: 'public' as const,\n addonFor: null,\n createdAt: '2023-01-01T00:00:00Z',\n createdByUserId: 'test-user',\n datasetProfile: 'default',\n features: [],\n name,\n tags: [],\n }\n}\n\ndescribe('#dataset:copy', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('help works', async () => {\n const {stdout} = await runCommand(['dataset copy', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Manages dataset copying, including starting a new copy job, listing copy jobs and following the progress of a running copy job\n\n USAGE\n $ sanity dataset copy [SOURCE] [TARGET] [--attach <value> | --list |\n --detach | --skip-history] [--limit <value> ] [--offset <value> ]\n\n ARGUMENTS\n [SOURCE] Name of the dataset to copy from\n [TARGET] Name of the dataset to copy to\n\n FLAGS\n --attach=<value> Attach to the running copy process to show progress\n --detach Start the copy without waiting for it to finish\n --limit=<value> Maximum number of jobs returned (default 10, max 1000)\n --list Lists all dataset copy jobs\n --offset=<value> Start position in the list of jobs (default 0)\n --skip-history Don't preserve document history on copy\n\n DESCRIPTION\n Manages dataset copying, including starting a new copy job, listing copy jobs\n and following the progress of a running copy job\n\n EXAMPLES\n Interactively copy a dataset\n\n $ sanity dataset copy\n\n Copy from source-dataset (prompts for target)\n\n $ sanity dataset copy source-dataset\n\n Copy from source-dataset to target-dataset\n\n $ sanity dataset copy source-dataset target-dataset\n\n Copy without preserving document history (faster for large datasets)\n\n $ sanity dataset copy --skip-history source target\n\n Start copy job without waiting for completion\n\n $ sanity dataset copy --detach source target\n\n Attach to a running copy job to follow progress\n\n $ sanity dataset copy --attach <job-id>\n\n List all dataset copy jobs\n\n $ sanity dataset copy --list\n\n List copy jobs with pagination\n\n $ sanity dataset copy --list --offset 2 --limit 10\n\n \"\n `)\n })\n\n describe('list mode', () => {\n test('lists copy jobs successfully', async () => {\n mockListDatasetCopyJobs.mockResolvedValue([\n {\n createdAt: '2023-01-01T00:00:00Z',\n id: 'job-1',\n sourceDataset: 'production',\n state: 'completed',\n targetDataset: 'backup',\n updatedAt: '2023-01-01T00:05:00Z',\n withHistory: true,\n },\n {\n createdAt: '2023-01-02T00:00:00Z',\n id: 'job-2',\n sourceDataset: 'staging',\n state: 'failed',\n targetDataset: 'test',\n updatedAt: '2023-01-02T00:02:00Z',\n withHistory: false,\n },\n ])\n\n const {stdout} = await testCommand(CopyDatasetCommand, ['--list'])\n\n expect(mockListDatasetCopyJobs).toHaveBeenCalledWith({\n limit: undefined,\n offset: undefined,\n projectId: 'test-project',\n })\n expect(stdout).toContain('Dataset copy jobs')\n expect(stdout).toContain('job-1')\n expect(stdout).toContain('job-2')\n expect(stdout).toContain('production')\n expect(stdout).toContain('staging')\n })\n\n test('lists copy jobs with offset and limit', async () => {\n mockListDatasetCopyJobs.mockResolvedValue([])\n\n await testCommand(CopyDatasetCommand, ['--list', '--offset', '2', '--limit', '10'])\n\n expect(mockListDatasetCopyJobs).toHaveBeenCalledWith({\n limit: 10,\n offset: 2,\n projectId: 'test-project',\n })\n })\n\n test('shows message when no copy jobs exist', async () => {\n mockListDatasetCopyJobs.mockResolvedValue([])\n\n const {stdout} = await testCommand(CopyDatasetCommand, ['--list'])\n\n expect(stdout).toContain(\"This project doesn't have any dataset copy jobs\")\n })\n\n test('handles errors when listing copy jobs', async () => {\n mockListDatasetCopyJobs.mockRejectedValue(new Error('API Error'))\n\n const {error} = await testCommand(CopyDatasetCommand, ['--list'])\n\n expect(error?.message).toContain('Failed to list dataset copy jobs: API Error')\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n\n describe('attach mode', () => {\n test('attaches to running job and shows progress', async () => {\n mockFollowCopyJobProgress.mockReturnValue(\n of(\n {progress: 25, type: 'progress'},\n {progress: 50, type: 'progress'},\n {progress: 75, type: 'progress'},\n {progress: 100, type: 'progress'},\n ),\n )\n\n const {stdout} = await testCommand(CopyDatasetCommand, ['--attach', 'job-123'])\n\n expect(mockFollowCopyJobProgress).toHaveBeenCalledWith({\n jobId: 'job-123',\n projectId: 'test-project',\n })\n expect(stdout).toContain('Job job-123 completed')\n })\n\n test('handles progress tracking errors', async () => {\n mockFollowCopyJobProgress.mockReturnValue(throwError(() => new Error('Connection lost')))\n\n const {error} = await testCommand(CopyDatasetCommand, ['--attach', 'job-123'])\n\n expect(error?.message).toContain('Failed to attach to copy job: Connection lost')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('rejects whitespace-only jobId', async () => {\n const {error} = await testCommand(CopyDatasetCommand, ['--attach', ' '])\n\n expect(error?.message).toContain('Please supply a valid jobId')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles JSON parse errors from EventSource', async () => {\n mockFollowCopyJobProgress.mockReturnValue(\n throwError(() => new Error('Invalid JSON received from server: Unexpected token')),\n )\n\n const {error} = await testCommand(CopyDatasetCommand, ['--attach', 'job-123'])\n\n expect(error?.message).toContain('Invalid JSON received from server')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles EventSource reconnection', async () => {\n mockFollowCopyJobProgress.mockReturnValue(\n of({progress: 25, type: 'progress'}, {type: 'reconnect'}, {progress: 50, type: 'progress'}),\n )\n\n const {stdout} = await testCommand(CopyDatasetCommand, ['--attach', 'job-123'])\n\n expect(mockFollowCopyJobProgress).toHaveBeenCalledWith({\n jobId: 'job-123',\n projectId: 'test-project',\n })\n expect(stdout).toContain('Job job-123 completed')\n })\n\n test('handles channel_error from EventSource', async () => {\n mockFollowCopyJobProgress.mockReturnValue(\n throwError(() => new Error('Copy job failed: Channel closed unexpectedly')),\n )\n\n const {error} = await testCommand(CopyDatasetCommand, ['--attach', 'job-123'])\n\n expect(error?.message).toContain('Copy job failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n\n describe('copy mode', () => {\n test('copies dataset with provided arguments', async () => {\n mockListDatasets.mockResolvedValue([\n createMockDataset('production'),\n createMockDataset('staging'),\n ])\n mockCopyDataset.mockResolvedValue({jobId: 'job-456'})\n mockFollowCopyJobProgress.mockReturnValue(of({progress: 100, type: 'progress'}))\n\n const {stdout} = await testCommand(CopyDatasetCommand, ['production', 'backup'])\n\n expect(mockCopyDataset).toHaveBeenCalledWith({\n projectId: 'test-project',\n skipHistory: false,\n sourceDataset: 'production',\n targetDataset: 'backup',\n })\n expect(stdout).toContain('Copying dataset production to backup')\n expect(stdout).toContain('Job job-456 started')\n expect(stdout).toContain('Job job-456 completed')\n })\n\n test('prompts for source dataset when not provided', async () => {\n mockListDatasets.mockResolvedValue([\n createMockDataset('production'),\n createMockDataset('staging'),\n ])\n mockSelect.mockResolvedValueOnce('production')\n mockSelect.mockResolvedValueOnce('backup')\n mockCopyDataset.mockResolvedValue({jobId: 'job-789'})\n mockFollowCopyJobProgress.mockReturnValue(of({progress: 100, type: 'progress'}))\n\n await testCommand(CopyDatasetCommand, [])\n\n expect(mockSelect).toHaveBeenCalledWith({\n choices: expect.arrayContaining([\n expect.objectContaining({value: 'production'}),\n expect.objectContaining({value: 'staging'}),\n ]),\n message: 'Select the dataset name:',\n })\n })\n\n test.each([\n {\n args: ['Invalid-Dataset', 'backup'],\n description: 'source dataset name is invalid',\n expectedError: 'must be all lowercase',\n setupMocks: () => {\n // No additional mocks needed - validation happens before dataset fetch\n },\n },\n {\n args: ['nonexistent', 'backup'],\n description: 'source dataset does not exist',\n expectedError: 'Source dataset \"nonexistent\" doesn\\'t exist',\n setupMocks: () => {\n mockListDatasets.mockResolvedValue([\n createMockDataset('production'),\n createMockDataset('staging'),\n ])\n },\n },\n {\n args: ['production', 'Invalid-Dataset'],\n description: 'target dataset name is invalid',\n expectedError: 'must be all lowercase',\n setupMocks: () => {\n mockListDatasets.mockResolvedValue([\n createMockDataset('production'),\n createMockDataset('staging'),\n ])\n },\n },\n {\n args: ['production', 'staging'],\n description: 'target dataset already exists',\n expectedError: 'Target dataset \"staging\" already exists',\n setupMocks: () => {\n mockListDatasets.mockResolvedValue([\n createMockDataset('production'),\n createMockDataset('staging'),\n ])\n },\n },\n ])('errors when $description', async ({args, expectedError, setupMocks}) => {\n setupMocks()\n\n const {error} = await testCommand(CopyDatasetCommand, args)\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('copies dataset with skip-history flag', async () => {\n mockListDatasets.mockResolvedValue([\n createMockDataset('production'),\n createMockDataset('staging'),\n ])\n mockCopyDataset.mockResolvedValue({jobId: 'job-skip'})\n mockFollowCopyJobProgress.mockReturnValue(of({progress: 100, type: 'progress'}))\n\n await testCommand(CopyDatasetCommand, ['production', 'backup', '--skip-history'])\n\n expect(mockCopyDataset).toHaveBeenCalledWith({\n projectId: 'test-project',\n skipHistory: true,\n sourceDataset: 'production',\n targetDataset: 'backup',\n })\n })\n\n test('copies dataset with detach flag (does not wait for completion)', async () => {\n mockListDatasets.mockResolvedValue([\n createMockDataset('production'),\n createMockDataset('staging'),\n ])\n mockCopyDataset.mockResolvedValue({jobId: 'job-detach'})\n\n const {stdout} = await testCommand(CopyDatasetCommand, ['production', 'backup', '--detach'])\n\n expect(mockCopyDataset).toHaveBeenCalledWith({\n projectId: 'test-project',\n skipHistory: false,\n sourceDataset: 'production',\n targetDataset: 'backup',\n })\n expect(stdout).toContain('Job job-detach started')\n expect(stdout).not.toContain('Job job-detach completed')\n expect(mockFollowCopyJobProgress).not.toHaveBeenCalled()\n })\n\n test('handles copy dataset errors', async () => {\n mockListDatasets.mockResolvedValue([\n createMockDataset('production'),\n createMockDataset('staging'),\n ])\n mockCopyDataset.mockRejectedValue(new Error('Insufficient permissions'))\n\n const {error} = await testCommand(CopyDatasetCommand, ['production', 'backup'])\n\n expect(error?.message).toContain('Dataset copying failed: Insufficient permissions')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles fetch datasets error', async () => {\n mockListDatasets.mockRejectedValue(new Error('Network error'))\n\n const {error} = await testCommand(CopyDatasetCommand, ['production', 'backup'])\n\n expect(error?.message).toContain('Failed to fetch datasets: Network error')\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n\n describe('flag validation', () => {\n test.each([\n {desc: '--list with --attach', flags: ['--list', '--attach', 'job-123']},\n {desc: '--list with --detach', flags: ['--list', '--detach']},\n {desc: '--attach with --detach', flags: ['--attach', 'job-123', '--detach']},\n ])('errors when using mutually exclusive flags: $desc', async ({flags}) => {\n const {error} = await testCommand(CopyDatasetCommand, flags)\n\n expect(error?.message).toContain('cannot also be provided when using')\n expect(error?.oclif?.exit).toBe(2)\n })\n\n test.each([\n {flag: '--offset', value: '2'},\n {flag: '--limit', value: '10'},\n ])('errors when $flag is used without --list', async ({flag, value}) => {\n const {error} = await testCommand(CopyDatasetCommand, [flag, value])\n\n expect(error?.message).toContain('--list')\n expect(error?.oclif?.exit).toBe(2)\n })\n })\n\n test('errors when no project ID is found', async () => {\n mockGetCliConfig.mockResolvedValueOnce({\n api: undefined,\n } as ReturnType<typeof getCliConfig> extends Promise<infer T> ? T : never)\n\n const {error} = await testCommand(CopyDatasetCommand, ['production', 'backup'])\n\n expect(error?.message).toContain('sanity.cli.ts does not contain a project identifier')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","select","testCommand","of","throwError","afterEach","describe","expect","test","vi","getCliConfig","datasetsService","CopyDatasetCommand","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","api","projectId","getCliToken","actual","importActual","input","copyDataset","followCopyJobProgress","listDatasetCopyJobs","listDatasets","mockGetCliConfig","mocked","mockSelect","mockCopyDataset","mockFollowCopyJobProgress","mockListDatasetCopyJobs","mockListDatasets","createMockDataset","name","aclMode","addonFor","createdAt","createdByUserId","datasetProfile","features","tags","clearAllMocks","stdout","toMatchInlineSnapshot","id","sourceDataset","state","targetDataset","updatedAt","withHistory","toHaveBeenCalledWith","limit","undefined","offset","toContain","mockRejectedValue","Error","error","message","oclif","exit","toBe","mockReturnValue","progress","jobId","skipHistory","mockResolvedValueOnce","choices","arrayContaining","objectContaining","value","each","args","description","expectedError","setupMocks","not","toHaveBeenCalled","desc","flags","flag"],"mappings":"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"}