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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/dist/actions/dataset/create.d.ts +49 -0
  2. package/dist/actions/dataset/create.js +48 -0
  3. package/dist/actions/dataset/create.js.map +1 -0
  4. package/dist/actions/dataset/determineDatasetAclMode.d.ts +37 -0
  5. package/dist/actions/dataset/determineDatasetAclMode.js +36 -0
  6. package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -0
  7. package/dist/actions/debug/gatherDebugInfo.js +15 -21
  8. package/dist/actions/debug/gatherDebugInfo.js.map +1 -1
  9. package/dist/actions/debug/types.d.ts +0 -2
  10. package/dist/actions/debug/types.js.map +1 -1
  11. package/dist/actions/deploy/deployApp.js +13 -0
  12. package/dist/actions/deploy/deployApp.js.map +1 -1
  13. package/dist/actions/dev/startStudioDevServer.js +3 -8
  14. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  15. package/dist/actions/dev/types.d.ts +1 -3
  16. package/dist/actions/dev/types.js.map +1 -1
  17. package/dist/actions/documents/validate.d.ts +0 -2
  18. package/dist/actions/documents/validate.js +21 -1
  19. package/dist/actions/documents/validate.js.map +1 -1
  20. package/dist/actions/exec/execScript.js +1 -1
  21. package/dist/actions/exec/execScript.js.map +1 -1
  22. package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
  23. package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
  24. package/dist/actions/init/remoteTemplate.js +1 -1
  25. package/dist/actions/init/remoteTemplate.js.map +1 -1
  26. package/dist/actions/manifest/extractAppManifest.d.ts +20 -0
  27. package/dist/actions/manifest/extractAppManifest.js +51 -0
  28. package/dist/actions/manifest/extractAppManifest.js.map +1 -0
  29. package/dist/actions/manifest/extractManifest.js +2 -5
  30. package/dist/actions/manifest/extractManifest.js.map +1 -1
  31. package/dist/actions/manifest/types.d.ts +6 -1
  32. package/dist/actions/manifest/types.js.map +1 -1
  33. package/dist/actions/media/importAspects.js +2 -1
  34. package/dist/actions/media/importAspects.js.map +1 -1
  35. package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
  36. package/dist/actions/schema/deleteSchemaAction.js +12 -17
  37. package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
  38. package/dist/actions/schema/deploySchemas.d.ts +15 -0
  39. package/dist/actions/schema/deploySchemas.js +98 -0
  40. package/dist/actions/schema/deploySchemas.js.map +1 -0
  41. package/dist/actions/schema/listSchemas.d.ts +12 -0
  42. package/dist/actions/schema/listSchemas.js +119 -0
  43. package/dist/actions/schema/listSchemas.js.map +1 -0
  44. package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
  45. package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
  46. package/dist/actions/schema/utils/debug.d.ts +2 -0
  47. package/dist/actions/schema/utils/debug.js +5 -0
  48. package/dist/actions/schema/utils/debug.js.map +1 -0
  49. package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
  50. package/dist/actions/schema/utils/manifestExtractor.js +12 -17
  51. package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
  52. package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
  53. package/dist/actions/schema/utils/manifestReader.js +6 -12
  54. package/dist/actions/schema/utils/manifestReader.js.map +1 -1
  55. package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
  56. package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
  57. package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
  58. package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
  59. package/dist/actions/schema/utils/schemaStoreValidation.js +38 -125
  60. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  61. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
  62. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
  63. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
  64. package/dist/actions/users/getMembersForProject.d.ts +1 -3
  65. package/dist/actions/users/getMembersForProject.js +6 -17
  66. package/dist/actions/users/getMembersForProject.js.map +1 -1
  67. package/dist/actions/users/types.d.ts +0 -11
  68. package/dist/actions/users/types.js.map +1 -1
  69. package/dist/commands/backup/disable.js +5 -11
  70. package/dist/commands/backup/disable.js.map +1 -1
  71. package/dist/commands/backup/enable.js +5 -11
  72. package/dist/commands/backup/enable.js.map +1 -1
  73. package/dist/commands/backup/list.js +7 -8
  74. package/dist/commands/backup/list.js.map +1 -1
  75. package/dist/commands/cors/add.js +5 -13
  76. package/dist/commands/cors/add.js.map +1 -1
  77. package/dist/commands/cors/delete.js +7 -15
  78. package/dist/commands/cors/delete.js.map +1 -1
  79. package/dist/commands/cors/list.js +2 -10
  80. package/dist/commands/cors/list.js.map +1 -1
  81. package/dist/commands/dataset/create.d.ts +0 -2
  82. package/dist/commands/dataset/create.js +8 -54
  83. package/dist/commands/dataset/create.js.map +1 -1
  84. package/dist/commands/dataset/export.js +4 -4
  85. package/dist/commands/dataset/export.js.map +1 -1
  86. package/dist/commands/debug.js +5 -9
  87. package/dist/commands/debug.js.map +1 -1
  88. package/dist/commands/dev.js +0 -1
  89. package/dist/commands/dev.js.map +1 -1
  90. package/dist/commands/documents/create.d.ts +1 -0
  91. package/dist/commands/documents/create.js +10 -9
  92. package/dist/commands/documents/create.js.map +1 -1
  93. package/dist/commands/documents/delete.js +2 -3
  94. package/dist/commands/documents/delete.js.map +1 -1
  95. package/dist/commands/documents/get.js +2 -3
  96. package/dist/commands/documents/get.js.map +1 -1
  97. package/dist/commands/documents/query.js +2 -3
  98. package/dist/commands/documents/query.js.map +1 -1
  99. package/dist/commands/documents/validate.js +0 -20
  100. package/dist/commands/documents/validate.js.map +1 -1
  101. package/dist/commands/graphql/list.js +2 -2
  102. package/dist/commands/graphql/list.js.map +1 -1
  103. package/dist/commands/graphql/undeploy.js +4 -9
  104. package/dist/commands/graphql/undeploy.js.map +1 -1
  105. package/dist/commands/hook/create.js +2 -6
  106. package/dist/commands/hook/create.js.map +1 -1
  107. package/dist/commands/hook/delete.js +5 -17
  108. package/dist/commands/hook/delete.js.map +1 -1
  109. package/dist/commands/hook/list.js +2 -8
  110. package/dist/commands/hook/list.js.map +1 -1
  111. package/dist/commands/init.d.ts +6 -1
  112. package/dist/commands/init.js +358 -20
  113. package/dist/commands/init.js.map +1 -1
  114. package/dist/commands/manifest/extract.js +7 -8
  115. package/dist/commands/manifest/extract.js.map +1 -1
  116. package/dist/commands/media/export.js +2 -2
  117. package/dist/commands/media/export.js.map +1 -1
  118. package/dist/commands/media/import.js +2 -2
  119. package/dist/commands/media/import.js.map +1 -1
  120. package/dist/commands/projects/list.js +2 -6
  121. package/dist/commands/projects/list.js.map +1 -1
  122. package/dist/commands/schema/delete.d.ts +1 -1
  123. package/dist/commands/schema/delete.js +20 -23
  124. package/dist/commands/schema/delete.js.map +1 -1
  125. package/dist/commands/schema/deploy.d.ts +16 -0
  126. package/dist/commands/schema/deploy.js +98 -0
  127. package/dist/commands/schema/deploy.js.map +1 -0
  128. package/dist/commands/schema/list.d.ts +15 -0
  129. package/dist/commands/schema/list.js +104 -0
  130. package/dist/commands/schema/list.js.map +1 -0
  131. package/dist/commands/tokens/add.js +3 -5
  132. package/dist/commands/tokens/add.js.map +1 -1
  133. package/dist/commands/users/invite.js +6 -17
  134. package/dist/commands/users/invite.js.map +1 -1
  135. package/dist/commands/users/list.js +4 -7
  136. package/dist/commands/users/list.js.map +1 -1
  137. package/dist/config/createCliConfig.d.ts +13 -4
  138. package/dist/prompts/init/promptForTypescript.d.ts +2 -0
  139. package/dist/prompts/init/promptForTypescript.js +15 -0
  140. package/dist/prompts/init/promptForTypescript.js.map +1 -0
  141. package/dist/prompts/promptForDatasetAclMode.d.ts +9 -0
  142. package/dist/prompts/promptForDatasetAclMode.js +27 -0
  143. package/dist/prompts/promptForDatasetAclMode.js.map +1 -0
  144. package/dist/prompts/promptForDatasetName.d.ts +1 -1
  145. package/dist/prompts/promptForDatasetName.js +4 -1
  146. package/dist/prompts/promptForDatasetName.js.map +1 -1
  147. package/dist/services/backup.d.ts +8 -0
  148. package/dist/services/backup.js +19 -0
  149. package/dist/services/backup.js.map +1 -1
  150. package/dist/services/cors.d.ts +23 -0
  151. package/dist/services/cors.js +38 -0
  152. package/dist/services/cors.js.map +1 -0
  153. package/dist/services/graphql.d.ts +7 -0
  154. package/dist/services/graphql.js +11 -0
  155. package/dist/services/graphql.js.map +1 -1
  156. package/dist/services/hooks.d.ts +2 -0
  157. package/dist/services/hooks.js +19 -0
  158. package/dist/services/hooks.js.map +1 -1
  159. package/dist/services/organizations.d.ts +4 -2
  160. package/dist/services/organizations.js +3 -2
  161. package/dist/services/organizations.js.map +1 -1
  162. package/dist/services/projects.d.ts +11 -0
  163. package/dist/services/projects.js +41 -0
  164. package/dist/services/projects.js.map +1 -1
  165. package/dist/services/schemas.d.ts +4 -0
  166. package/dist/services/schemas.js +40 -0
  167. package/dist/services/schemas.js.map +1 -0
  168. package/dist/services/user.d.ts +13 -0
  169. package/dist/services/user.js +27 -3
  170. package/dist/services/user.js.map +1 -1
  171. package/dist/services/userApplications.d.ts +3 -1
  172. package/dist/services/userApplications.js +5 -1
  173. package/dist/services/userApplications.js.map +1 -1
  174. package/dist/util/errorMessages.d.ts +1 -0
  175. package/dist/util/errorMessages.js +1 -0
  176. package/dist/util/errorMessages.js.map +1 -1
  177. package/dist/util/getCliVersion.js +1 -1
  178. package/dist/util/getCliVersion.js.map +1 -1
  179. package/dist/util/readPackageJson.d.ts +1 -15
  180. package/dist/util/readPackageJson.js +1 -1
  181. package/dist/util/readPackageJson.js.map +1 -1
  182. package/dist/util/uniqBy.d.ts +1 -0
  183. package/dist/util/uniqBy.js +14 -0
  184. package/dist/util/uniqBy.js.map +1 -0
  185. package/oclif.manifest.json +284 -139
  186. package/package.json +36 -33
  187. package/templates/app-quickstart/src/App.css +20 -0
  188. package/templates/app-quickstart/src/App.tsx +25 -0
  189. package/templates/app-quickstart/src/ExampleComponent.css +90 -0
  190. package/templates/app-quickstart/src/ExampleComponent.tsx +37 -0
  191. package/templates/app-sanity-ui/src/App.tsx +34 -0
  192. package/templates/app-sanity-ui/src/ExampleComponent.tsx +34 -0
  193. package/templates/app-sanity-ui/src/SanityUI.tsx +23 -0
  194. package/templates/blog/README.md +11 -0
  195. package/templates/blog/schemaTypes/author.js +50 -0
  196. package/templates/blog/schemaTypes/blockContent.js +67 -0
  197. package/templates/blog/schemaTypes/category.js +19 -0
  198. package/templates/blog/schemaTypes/index.js +6 -0
  199. package/templates/blog/schemaTypes/post.js +65 -0
  200. package/templates/blog/static/.gitkeep +1 -0
  201. package/templates/clean/README.md +9 -0
  202. package/templates/clean/schemaTypes/index.js +1 -0
  203. package/templates/clean/static/.gitkeep +1 -0
  204. package/templates/ecommerce/README.md +11 -0
  205. package/templates/ecommerce/plugins/.gitkeep +1 -0
  206. package/templates/ecommerce/plugins/barcode-input/BarcodeInput.js +62 -0
  207. package/templates/ecommerce/plugins/barcode-input/index.js +9 -0
  208. package/templates/ecommerce/plugins/barcode-input/schemaType.js +60 -0
  209. package/templates/ecommerce/schemaTypes/blockContent.js +67 -0
  210. package/templates/ecommerce/schemaTypes/category.js +39 -0
  211. package/templates/ecommerce/schemaTypes/index.js +23 -0
  212. package/templates/ecommerce/schemaTypes/locale/localeBlockContent.js +19 -0
  213. package/templates/ecommerce/schemaTypes/locale/localeString.js +19 -0
  214. package/templates/ecommerce/schemaTypes/locale/localeText.js +19 -0
  215. package/templates/ecommerce/schemaTypes/locale/supportedLanguages.js +5 -0
  216. package/templates/ecommerce/schemaTypes/product.js +83 -0
  217. package/templates/ecommerce/schemaTypes/productVariant.js +52 -0
  218. package/templates/ecommerce/schemaTypes/vendor.js +39 -0
  219. package/templates/ecommerce/static/.gitkeep +1 -0
  220. package/templates/get-started/README.md +9 -0
  221. package/templates/get-started/plugins/.gitkeep +1 -0
  222. package/templates/get-started/plugins/sanity-plugin-tutorial/CustomDefaultLayout.tsx +16 -0
  223. package/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +104 -0
  224. package/templates/get-started/plugins/sanity-plugin-tutorial/index.ts +11 -0
  225. package/templates/get-started/schemaTypes/index.ts +1 -0
  226. package/templates/get-started/static/.gitkeep +1 -0
  227. package/templates/moviedb/README.md +10 -0
  228. package/templates/moviedb/schemaTypes/blockContent.js +67 -0
  229. package/templates/moviedb/schemaTypes/castMember.js +37 -0
  230. package/templates/moviedb/schemaTypes/crewMember.js +52 -0
  231. package/templates/moviedb/schemaTypes/index.js +22 -0
  232. package/templates/moviedb/schemaTypes/movie.js +85 -0
  233. package/templates/moviedb/schemaTypes/person.js +37 -0
  234. package/templates/moviedb/schemaTypes/plotSummaries.js +20 -0
  235. package/templates/moviedb/schemaTypes/plotSummary.js +24 -0
  236. package/templates/moviedb/schemaTypes/screening.js +81 -0
  237. package/templates/moviedb/static/.gitkeep +1 -0
  238. package/templates/quickstart/README.md +9 -0
  239. package/templates/quickstart/schemaTypes/index.js +1 -0
  240. package/templates/quickstart/static/.gitkeep +1 -0
  241. package/templates/shared/gitignore.txt +29 -0
  242. package/templates/shared/tsconfig.json +17 -0
  243. package/templates/shopify/README.md +85 -0
  244. package/templates/shopify/components/hotspots/ProductTooltip.tsx +38 -0
  245. package/templates/shopify/components/icons/Shopify.tsx +20 -0
  246. package/templates/shopify/components/inputs/CollectionHidden.tsx +23 -0
  247. package/templates/shopify/components/inputs/PlaceholderString.tsx +20 -0
  248. package/templates/shopify/components/inputs/ProductHidden.tsx +64 -0
  249. package/templates/shopify/components/inputs/ProductVariantHidden.tsx +24 -0
  250. package/templates/shopify/components/inputs/ProxyString.tsx +32 -0
  251. package/templates/shopify/components/media/ColorTheme.tsx +38 -0
  252. package/templates/shopify/components/media/ShopifyDocumentStatus.tsx +82 -0
  253. package/templates/shopify/components/studio/Navbar.tsx +29 -0
  254. package/templates/shopify/constants.ts +61 -0
  255. package/templates/shopify/docs/features.md +158 -0
  256. package/templates/shopify/plugins/customDocumentActions/index.ts +55 -0
  257. package/templates/shopify/plugins/customDocumentActions/shopifyDelete.tsx +144 -0
  258. package/templates/shopify/plugins/customDocumentActions/shopifyLink.ts +39 -0
  259. package/templates/shopify/plugins/customDocumentActions/types.ts +14 -0
  260. package/templates/shopify/schemaTypes/documents/collection.tsx +142 -0
  261. package/templates/shopify/schemaTypes/documents/colorTheme.tsx +44 -0
  262. package/templates/shopify/schemaTypes/documents/page.ts +70 -0
  263. package/templates/shopify/schemaTypes/documents/product.tsx +132 -0
  264. package/templates/shopify/schemaTypes/documents/productVariant.tsx +67 -0
  265. package/templates/shopify/schemaTypes/index.ts +108 -0
  266. package/templates/shopify/schemaTypes/objects/collection/collectionGroupType.ts +27 -0
  267. package/templates/shopify/schemaTypes/objects/collection/collectionLinksType.ts +16 -0
  268. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorObjectType.tsx +48 -0
  269. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorType.tsx +50 -0
  270. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeObjectType.ts +40 -0
  271. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeType.ts +49 -0
  272. package/templates/shopify/schemaTypes/objects/global/footerType.ts +22 -0
  273. package/templates/shopify/schemaTypes/objects/global/menuLinksType.ts +21 -0
  274. package/templates/shopify/schemaTypes/objects/global/menuType.ts +17 -0
  275. package/templates/shopify/schemaTypes/objects/global/notFoundPageType.ts +37 -0
  276. package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +48 -0
  277. package/templates/shopify/schemaTypes/objects/hotspot/productHotspotsType.tsx +17 -0
  278. package/templates/shopify/schemaTypes/objects/hotspot/spotType.tsx +60 -0
  279. package/templates/shopify/schemaTypes/objects/link/linkEmailType.tsx +34 -0
  280. package/templates/shopify/schemaTypes/objects/link/linkExternalType.tsx +37 -0
  281. package/templates/shopify/schemaTypes/objects/link/linkInternalType.tsx +33 -0
  282. package/templates/shopify/schemaTypes/objects/link/linkProductType.tsx +60 -0
  283. package/templates/shopify/schemaTypes/objects/module/accordionGroupType.ts +33 -0
  284. package/templates/shopify/schemaTypes/objects/module/accordionType.ts +28 -0
  285. package/templates/shopify/schemaTypes/objects/module/callToActionType.tsx +85 -0
  286. package/templates/shopify/schemaTypes/objects/module/calloutType.ts +38 -0
  287. package/templates/shopify/schemaTypes/objects/module/collectionReferenceType.tsx +47 -0
  288. package/templates/shopify/schemaTypes/objects/module/gridItemType.ts +41 -0
  289. package/templates/shopify/schemaTypes/objects/module/gridType.ts +28 -0
  290. package/templates/shopify/schemaTypes/objects/module/heroType.tsx +40 -0
  291. package/templates/shopify/schemaTypes/objects/module/imageCallToActionType.tsx +19 -0
  292. package/templates/shopify/schemaTypes/objects/module/imageFeatureType.ts +80 -0
  293. package/templates/shopify/schemaTypes/objects/module/imageFeaturesType.tsx +51 -0
  294. package/templates/shopify/schemaTypes/objects/module/instagramType.ts +35 -0
  295. package/templates/shopify/schemaTypes/objects/module/productFeaturesType.tsx +50 -0
  296. package/templates/shopify/schemaTypes/objects/module/productReferenceType.tsx +42 -0
  297. package/templates/shopify/schemaTypes/objects/seoType.ts +31 -0
  298. package/templates/shopify/schemaTypes/objects/shopify/collectionRuleType.tsx +37 -0
  299. package/templates/shopify/schemaTypes/objects/shopify/inventoryType.ts +25 -0
  300. package/templates/shopify/schemaTypes/objects/shopify/optionType.tsx +31 -0
  301. package/templates/shopify/schemaTypes/objects/shopify/placeholderStringType.ts +11 -0
  302. package/templates/shopify/schemaTypes/objects/shopify/priceRangeType.ts +20 -0
  303. package/templates/shopify/schemaTypes/objects/shopify/productWithVariantType.tsx +142 -0
  304. package/templates/shopify/schemaTypes/objects/shopify/proxyStringType.ts +12 -0
  305. package/templates/shopify/schemaTypes/objects/shopify/shopType.ts +15 -0
  306. package/templates/shopify/schemaTypes/objects/shopify/shopifyCollectionType.ts +84 -0
  307. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductType.ts +131 -0
  308. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductVariantType.ts +121 -0
  309. package/templates/shopify/schemaTypes/portableText/portableTextSimpleType.tsx +45 -0
  310. package/templates/shopify/schemaTypes/portableText/portableTextType.tsx +52 -0
  311. package/templates/shopify/schemaTypes/singletons/homeType.ts +49 -0
  312. package/templates/shopify/schemaTypes/singletons/settingsType.ts +96 -0
  313. package/templates/shopify/static/.gitkeep +1 -0
  314. package/templates/shopify/structure/collectionStructure.ts +9 -0
  315. package/templates/shopify/structure/colorThemeStructure.ts +9 -0
  316. package/templates/shopify/structure/homeStructure.ts +9 -0
  317. package/templates/shopify/structure/index.ts +57 -0
  318. package/templates/shopify/structure/pageStructure.ts +11 -0
  319. package/templates/shopify/structure/productStructure.ts +51 -0
  320. package/templates/shopify/structure/settingStructure.ts +9 -0
  321. package/templates/shopify/utils/blocksToText.ts +20 -0
  322. package/templates/shopify/utils/defineStructure.ts +11 -0
  323. package/templates/shopify/utils/getPriceRange.ts +24 -0
  324. package/templates/shopify/utils/shopifyUrls.ts +22 -0
  325. package/templates/shopify/utils/validateSlug.ts +18 -0
  326. package/templates/shopify-online-storefront/README.md +54 -0
  327. package/templates/shopify-online-storefront/components/icons/Shopify.tsx +22 -0
  328. package/templates/shopify-online-storefront/components/inputs/CollectionHidden.tsx +23 -0
  329. package/templates/shopify-online-storefront/components/inputs/PlaceholderString.tsx +25 -0
  330. package/templates/shopify-online-storefront/components/inputs/ProductHidden.tsx +66 -0
  331. package/templates/shopify-online-storefront/components/inputs/ProductVariantHidden.tsx +25 -0
  332. package/templates/shopify-online-storefront/components/inputs/ProxyString.tsx +38 -0
  333. package/templates/shopify-online-storefront/components/media/ShopifyDocumentStatus.tsx +83 -0
  334. package/templates/shopify-online-storefront/constants.ts +18 -0
  335. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/index.ts +45 -0
  336. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyDelete.tsx +144 -0
  337. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyLink.ts +39 -0
  338. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/types.ts +14 -0
  339. package/templates/shopify-online-storefront/schemaTypes/blocks/blockContent.ts +32 -0
  340. package/templates/shopify-online-storefront/schemaTypes/documents/collection.tsx +83 -0
  341. package/templates/shopify-online-storefront/schemaTypes/documents/product.tsx +102 -0
  342. package/templates/shopify-online-storefront/schemaTypes/documents/productVariant.tsx +82 -0
  343. package/templates/shopify-online-storefront/schemaTypes/index.ts +43 -0
  344. package/templates/shopify-online-storefront/schemaTypes/objects/accordion.ts +31 -0
  345. package/templates/shopify-online-storefront/schemaTypes/objects/accordionGroup.ts +35 -0
  346. package/templates/shopify-online-storefront/schemaTypes/objects/callout.ts +40 -0
  347. package/templates/shopify-online-storefront/schemaTypes/objects/inventory.ts +30 -0
  348. package/templates/shopify-online-storefront/schemaTypes/objects/option.ts +30 -0
  349. package/templates/shopify-online-storefront/schemaTypes/objects/priceRange.ts +22 -0
  350. package/templates/shopify-online-storefront/schemaTypes/objects/proxyString.ts +11 -0
  351. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollection.ts +109 -0
  352. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollectionRule.tsx +45 -0
  353. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProduct.ts +165 -0
  354. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProductVariant.ts +151 -0
  355. package/templates/shopify-online-storefront/structure/collectionStructure.ts +9 -0
  356. package/templates/shopify-online-storefront/structure/index.ts +37 -0
  357. package/templates/shopify-online-storefront/structure/productStructure.ts +35 -0
  358. package/templates/shopify-online-storefront/utils/defineStructure.ts +11 -0
  359. package/templates/shopify-online-storefront/utils/getPriceRange.ts +24 -0
  360. package/templates/shopify-online-storefront/utils/shopifyUrls.ts +22 -0
  361. package/dist/actions/build/__tests__/buildApp.test.js +0 -367
  362. package/dist/actions/build/__tests__/buildApp.test.js.map +0 -1
  363. package/dist/actions/build/__tests__/buildStudio.test.js +0 -561
  364. package/dist/actions/build/__tests__/buildStudio.test.js.map +0 -1
  365. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js +0 -233
  366. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js.map +0 -1
  367. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js +0 -414
  368. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js.map +0 -1
  369. package/dist/actions/build/__tests__/determineBasePath.test.js +0 -24
  370. package/dist/actions/build/__tests__/determineBasePath.test.js.map +0 -1
  371. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js +0 -109
  372. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js.map +0 -1
  373. package/dist/actions/build/__tests__/getViteConfig.test.js +0 -493
  374. package/dist/actions/build/__tests__/getViteConfig.test.js.map +0 -1
  375. package/dist/actions/build/__tests__/renderDocument.test.js +0 -278
  376. package/dist/actions/build/__tests__/renderDocument.test.js.map +0 -1
  377. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js +0 -153
  378. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js.map +0 -1
  379. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js +0 -657
  380. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js.map +0 -1
  381. package/dist/actions/cors/constants.d.ts +0 -1
  382. package/dist/actions/cors/constants.js +0 -3
  383. package/dist/actions/cors/constants.js.map +0 -1
  384. package/dist/actions/cors/types.d.ts +0 -9
  385. package/dist/actions/cors/types.js +0 -3
  386. package/dist/actions/cors/types.js.map +0 -1
  387. package/dist/actions/dataset/__tests__/validateDatasetName.test.js +0 -182
  388. package/dist/actions/dataset/__tests__/validateDatasetName.test.js.map +0 -1
  389. package/dist/actions/deploy/__tests__/checkDir.test.js +0 -120
  390. package/dist/actions/deploy/__tests__/checkDir.test.js.map +0 -1
  391. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js +0 -16
  392. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js.map +0 -1
  393. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js +0 -124
  394. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js.map +0 -1
  395. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +0 -274
  396. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +0 -1
  397. package/dist/actions/media/__tests__/importMedia.test.js +0 -182
  398. package/dist/actions/media/__tests__/importMedia.test.js.map +0 -1
  399. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
  400. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
  401. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js +0 -174
  402. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js.map +0 -1
  403. package/dist/actions/schema/__tests__/validateAction.test.js +0 -281
  404. package/dist/actions/schema/__tests__/validateAction.test.js.map +0 -1
  405. package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
  406. package/dist/actions/schema/schemaStoreConstants.js +0 -4
  407. package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
  408. package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
  409. package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
  410. package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
  411. package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
  412. package/dist/actions/schema/utils/schemaApiClient.js +0 -17
  413. package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
  414. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js +0 -27
  415. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js.map +0 -1
  416. package/dist/actions/users/__tests__/validateEmail.test.js +0 -16
  417. package/dist/actions/users/__tests__/validateEmail.test.js.map +0 -1
  418. package/dist/actions/users/apiVersion.d.ts +0 -6
  419. package/dist/actions/users/apiVersion.js +0 -7
  420. package/dist/actions/users/apiVersion.js.map +0 -1
  421. package/dist/commands/__tests__/blueprints.test.js +0 -54
  422. package/dist/commands/__tests__/blueprints.test.js.map +0 -1
  423. package/dist/commands/__tests__/build.test.js +0 -132
  424. package/dist/commands/__tests__/build.test.js.map +0 -1
  425. package/dist/commands/__tests__/codemod.test.js +0 -271
  426. package/dist/commands/__tests__/codemod.test.js.map +0 -1
  427. package/dist/commands/__tests__/debug.test.js +0 -697
  428. package/dist/commands/__tests__/debug.test.js.map +0 -1
  429. package/dist/commands/__tests__/deploy.test.js +0 -1913
  430. package/dist/commands/__tests__/deploy.test.js.map +0 -1
  431. package/dist/commands/__tests__/dev.test.js +0 -410
  432. package/dist/commands/__tests__/dev.test.js.map +0 -1
  433. package/dist/commands/__tests__/exec.test.js +0 -207
  434. package/dist/commands/__tests__/exec.test.js.map +0 -1
  435. package/dist/commands/__tests__/init/init.authentication.test.js +0 -60
  436. package/dist/commands/__tests__/init/init.authentication.test.js.map +0 -1
  437. package/dist/commands/__tests__/init/init.create-new-project.test.js +0 -196
  438. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +0 -1
  439. package/dist/commands/__tests__/init/init.plan.test.js +0 -220
  440. package/dist/commands/__tests__/init/init.plan.test.js.map +0 -1
  441. package/dist/commands/__tests__/init/init.setup.test.js +0 -279
  442. package/dist/commands/__tests__/init/init.setup.test.js.map +0 -1
  443. package/dist/commands/__tests__/install.test.js +0 -258
  444. package/dist/commands/__tests__/install.test.js.map +0 -1
  445. package/dist/commands/__tests__/learn.test.js +0 -29
  446. package/dist/commands/__tests__/learn.test.js.map +0 -1
  447. package/dist/commands/__tests__/logout.test.js +0 -88
  448. package/dist/commands/__tests__/logout.test.js.map +0 -1
  449. package/dist/commands/__tests__/manage.test.js +0 -105
  450. package/dist/commands/__tests__/manage.test.js.map +0 -1
  451. package/dist/commands/__tests__/migration.test.js +0 -119
  452. package/dist/commands/__tests__/migration.test.js.map +0 -1
  453. package/dist/commands/__tests__/preview.test.js +0 -261
  454. package/dist/commands/__tests__/preview.test.js.map +0 -1
  455. package/dist/commands/__tests__/start.test.js +0 -253
  456. package/dist/commands/__tests__/start.test.js.map +0 -1
  457. package/dist/commands/__tests__/undeploy.test.js +0 -382
  458. package/dist/commands/__tests__/undeploy.test.js.map +0 -1
  459. package/dist/commands/__tests__/versions.test.js +0 -134
  460. package/dist/commands/__tests__/versions.test.js.map +0 -1
  461. package/dist/commands/backup/__tests__/disable.test.js +0 -207
  462. package/dist/commands/backup/__tests__/disable.test.js.map +0 -1
  463. package/dist/commands/backup/__tests__/download.test.js +0 -679
  464. package/dist/commands/backup/__tests__/download.test.js.map +0 -1
  465. package/dist/commands/backup/__tests__/enable.test.js +0 -317
  466. package/dist/commands/backup/__tests__/enable.test.js.map +0 -1
  467. package/dist/commands/backup/__tests__/list.test.js +0 -321
  468. package/dist/commands/backup/__tests__/list.test.js.map +0 -1
  469. package/dist/commands/cors/__tests__/add.test.js +0 -346
  470. package/dist/commands/cors/__tests__/add.test.js.map +0 -1
  471. package/dist/commands/cors/__tests__/delete.test.js +0 -293
  472. package/dist/commands/cors/__tests__/delete.test.js.map +0 -1
  473. package/dist/commands/cors/__tests__/list.test.js +0 -218
  474. package/dist/commands/cors/__tests__/list.test.js.map +0 -1
  475. package/dist/commands/dataset/__tests__/copy.test.js +0 -520
  476. package/dist/commands/dataset/__tests__/copy.test.js.map +0 -1
  477. package/dist/commands/dataset/__tests__/create.test.js +0 -312
  478. package/dist/commands/dataset/__tests__/create.test.js.map +0 -1
  479. package/dist/commands/dataset/__tests__/delete.test.js +0 -224
  480. package/dist/commands/dataset/__tests__/delete.test.js.map +0 -1
  481. package/dist/commands/dataset/__tests__/export.test.js +0 -561
  482. package/dist/commands/dataset/__tests__/export.test.js.map +0 -1
  483. package/dist/commands/dataset/__tests__/import.test.js +0 -53
  484. package/dist/commands/dataset/__tests__/import.test.js.map +0 -1
  485. package/dist/commands/dataset/__tests__/list.test.js +0 -174
  486. package/dist/commands/dataset/__tests__/list.test.js.map +0 -1
  487. package/dist/commands/dataset/alias/__tests__/create.test.js +0 -299
  488. package/dist/commands/dataset/alias/__tests__/create.test.js.map +0 -1
  489. package/dist/commands/dataset/alias/__tests__/delete.test.js +0 -236
  490. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +0 -1
  491. package/dist/commands/dataset/alias/__tests__/link.test.js +0 -336
  492. package/dist/commands/dataset/alias/__tests__/link.test.js.map +0 -1
  493. package/dist/commands/dataset/alias/__tests__/unlink.test.js +0 -298
  494. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +0 -1
  495. package/dist/commands/dataset/visibility/__tests__/get.test.js +0 -147
  496. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +0 -1
  497. package/dist/commands/dataset/visibility/__tests__/set.test.js +0 -245
  498. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +0 -1
  499. package/dist/commands/docs/__tests__/browse.test.js +0 -29
  500. package/dist/commands/docs/__tests__/browse.test.js.map +0 -1
  501. package/dist/commands/docs/__tests__/read.test.js +0 -78
  502. package/dist/commands/docs/__tests__/read.test.js.map +0 -1
  503. package/dist/commands/docs/__tests__/search.test.js +0 -254
  504. package/dist/commands/docs/__tests__/search.test.js.map +0 -1
  505. package/dist/commands/documents/__tests__/create.test.js +0 -967
  506. package/dist/commands/documents/__tests__/create.test.js.map +0 -1
  507. package/dist/commands/documents/__tests__/delete.test.js +0 -268
  508. package/dist/commands/documents/__tests__/delete.test.js.map +0 -1
  509. package/dist/commands/documents/__tests__/get.test.js +0 -209
  510. package/dist/commands/documents/__tests__/get.test.js.map +0 -1
  511. package/dist/commands/documents/__tests__/query.test.js +0 -405
  512. package/dist/commands/documents/__tests__/query.test.js.map +0 -1
  513. package/dist/commands/documents/__tests__/validate.test.js +0 -226
  514. package/dist/commands/documents/__tests__/validate.test.js.map +0 -1
  515. package/dist/commands/graphql/__tests__/list.test.js +0 -228
  516. package/dist/commands/graphql/__tests__/list.test.js.map +0 -1
  517. package/dist/commands/graphql/__tests__/undeploy.test.js +0 -384
  518. package/dist/commands/graphql/__tests__/undeploy.test.js.map +0 -1
  519. package/dist/commands/hook/__tests__/attempt.test.js +0 -260
  520. package/dist/commands/hook/__tests__/attempt.test.js.map +0 -1
  521. package/dist/commands/hook/__tests__/create.test.js +0 -121
  522. package/dist/commands/hook/__tests__/create.test.js.map +0 -1
  523. package/dist/commands/hook/__tests__/delete.test.js +0 -220
  524. package/dist/commands/hook/__tests__/delete.test.js.map +0 -1
  525. package/dist/commands/hook/__tests__/list.test.js +0 -138
  526. package/dist/commands/hook/__tests__/list.test.js.map +0 -1
  527. package/dist/commands/hook/__tests__/logs.test.js +0 -770
  528. package/dist/commands/hook/__tests__/logs.test.js.map +0 -1
  529. package/dist/commands/manifest/__tests__/extract.test.js +0 -123
  530. package/dist/commands/manifest/__tests__/extract.test.js.map +0 -1
  531. package/dist/commands/mcp/__tests__/configure.test.js +0 -397
  532. package/dist/commands/mcp/__tests__/configure.test.js.map +0 -1
  533. package/dist/commands/media/__tests__/create-aspect.test.js +0 -160
  534. package/dist/commands/media/__tests__/create-aspect.test.js.map +0 -1
  535. package/dist/commands/media/__tests__/delete-aspect.test.js +0 -333
  536. package/dist/commands/media/__tests__/delete-aspect.test.js.map +0 -1
  537. package/dist/commands/media/__tests__/deploy-aspect.test.js +0 -632
  538. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +0 -1
  539. package/dist/commands/media/__tests__/export.test.js +0 -398
  540. package/dist/commands/media/__tests__/export.test.js.map +0 -1
  541. package/dist/commands/media/__tests__/import.test.js +0 -281
  542. package/dist/commands/media/__tests__/import.test.js.map +0 -1
  543. package/dist/commands/openapi/__tests__/get.test.js +0 -149
  544. package/dist/commands/openapi/__tests__/get.test.js.map +0 -1
  545. package/dist/commands/openapi/__tests__/list.test.js +0 -113
  546. package/dist/commands/openapi/__tests__/list.test.js.map +0 -1
  547. package/dist/commands/projects/__tests__/list.test.js +0 -153
  548. package/dist/commands/projects/__tests__/list.test.js.map +0 -1
  549. package/dist/commands/schema/__tests__/delete.test.js +0 -209
  550. package/dist/commands/schema/__tests__/delete.test.js.map +0 -1
  551. package/dist/commands/schema/__tests__/extract.test.js +0 -113
  552. package/dist/commands/schema/__tests__/extract.test.js.map +0 -1
  553. package/dist/commands/schema/__tests__/validate.test.js +0 -104
  554. package/dist/commands/schema/__tests__/validate.test.js.map +0 -1
  555. package/dist/commands/telemetry/__tests__/disable.test.js +0 -145
  556. package/dist/commands/telemetry/__tests__/disable.test.js.map +0 -1
  557. package/dist/commands/telemetry/__tests__/enable.test.js +0 -131
  558. package/dist/commands/telemetry/__tests__/enable.test.js.map +0 -1
  559. package/dist/commands/telemetry/__tests__/status.test.js +0 -153
  560. package/dist/commands/telemetry/__tests__/status.test.js.map +0 -1
  561. package/dist/commands/tokens/__tests__/add.test.js +0 -420
  562. package/dist/commands/tokens/__tests__/add.test.js.map +0 -1
  563. package/dist/commands/tokens/__tests__/delete.test.js +0 -375
  564. package/dist/commands/tokens/__tests__/delete.test.js.map +0 -1
  565. package/dist/commands/tokens/__tests__/list.test.js +0 -368
  566. package/dist/commands/tokens/__tests__/list.test.js.map +0 -1
  567. package/dist/commands/users/__tests__/invite.test.js +0 -341
  568. package/dist/commands/users/__tests__/invite.test.js.map +0 -1
  569. package/dist/commands/users/__tests__/list.test.js +0 -401
  570. package/dist/commands/users/__tests__/list.test.js.map +0 -1
  571. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js +0 -77
  572. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js.map +0 -1
  573. package/dist/services/__tests__/datasetAliases.test.js +0 -131
  574. package/dist/services/__tests__/datasetAliases.test.js.map +0 -1
  575. package/dist/services/__tests__/datasets.test.js +0 -436
  576. package/dist/services/__tests__/datasets.test.js.map +0 -1
  577. package/dist/services/__tests__/graphql.test.js +0 -43
  578. package/dist/services/__tests__/graphql.test.js.map +0 -1
  579. package/dist/services/__tests__/mediaLibraries.test.js +0 -88
  580. package/dist/services/__tests__/mediaLibraries.test.js.map +0 -1
  581. package/dist/services/__tests__/projects.test.js +0 -41
  582. package/dist/services/__tests__/projects.test.js.map +0 -1
  583. package/dist/services/__tests__/userApplications.test.js +0 -113
  584. package/dist/services/__tests__/userApplications.test.js.map +0 -1
  585. package/dist/util/__tests__/appId.test.js +0 -31
  586. package/dist/util/__tests__/appId.test.js.map +0 -1
  587. package/dist/util/__tests__/cliClient.test.js +0 -184
  588. package/dist/util/__tests__/cliClient.test.js.map +0 -1
  589. package/dist/util/__tests__/compareDependencyVersions.test.js +0 -426
  590. package/dist/util/__tests__/compareDependencyVersions.test.js.map +0 -1
  591. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js +0 -74
  592. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js.map +0 -1
  593. package/dist/util/__tests__/findNdjsonEntry.test.js +0 -54
  594. package/dist/util/__tests__/findNdjsonEntry.test.js.map +0 -1
  595. package/dist/util/__tests__/getCliVersion.test.js +0 -28
  596. package/dist/util/__tests__/getCliVersion.test.js.map +0 -1
  597. package/dist/util/__tests__/getLocalPackageVersion.test.js +0 -84
  598. package/dist/util/__tests__/getLocalPackageVersion.test.js.map +0 -1
  599. package/dist/util/__tests__/getWorkspace.test.js +0 -37
  600. package/dist/util/__tests__/getWorkspace.test.js.map +0 -1
  601. package/dist/util/__tests__/readPackageJson.test.js +0 -69
  602. package/dist/util/__tests__/readPackageJson.test.js.map +0 -1
  603. package/dist/util/__tests__/warnAboutMissingAppId.test.js +0 -28
  604. package/dist/util/__tests__/warnAboutMissingAppId.test.js.map +0 -1
  605. package/dist/util/packageManager/__tests__/installPackages.test.js +0 -388
  606. package/dist/util/packageManager/__tests__/installPackages.test.js.map +0 -1
  607. package/dist/util/validation/ __tests__/validateDocuments.test.js +0 -274
  608. package/dist/util/validation/ __tests__/validateDocuments.test.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/commands/documents/__tests__/create.test.ts"],"sourcesContent":["import {randomUUID} from 'node:crypto'\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport {runCommand} from '@oclif/test'\nimport {getCliConfig, getProjectCliClient} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport {watch as chokidarWatch} from 'chokidar'\nimport {execa, execaSync} from 'execa'\nimport json5 from 'json5'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {CreateDocumentCommand} from '../create.js'\n\nvi.mock('node:fs/promises')\nvi.mock('node:os')\nvi.mock('chokidar', () => ({\n watch: vi.fn(),\n}))\nvi.mock('execa')\nvi.mock('json5')\n\nvi.mock('node:crypto', async () => {\n return {\n randomUUID: vi.fn(),\n }\n})\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(),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nvi.mock('../../../../../cli-core/src/services/apiClient.js', () => ({\n getProjectCliClient: vi.fn(),\n}))\n\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockGetProjectCliClient = vi.mocked(getProjectCliClient)\nconst mockFs = vi.mocked(fs)\nconst mockOs = vi.mocked(os)\nconst mockChokidarWatch = vi.mocked(chokidarWatch)\nconst mockExeca = vi.mocked(execa)\nconst mockExecaSync = vi.mocked(execaSync)\nconst mockJson5 = vi.mocked(json5)\nconst mockRandomUUID = vi.mocked(randomUUID)\n\nconst testProjectId = 'test-project'\nconst testDataset = 'production'\n\n// Helper to set environment variable for tests\nfunction withEditorEnv(testFn: () => Promise<void>) {\n return async () => {\n vi.stubEnv('EDITOR', 'vim')\n try {\n await testFn()\n } finally {\n vi.unstubAllEnvs()\n }\n }\n}\n\n// Base configuration used across tests\nconst baseConfig = {\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n}\n\n// Helper functions moved to outer scope to fix linting\nconst setupBaseMocks = (additionalConfig = {}) => {\n mockGetCliConfig.mockResolvedValue({...baseConfig, ...additionalConfig})\n}\n\nconst setupMocks = () => {\n setupBaseMocks()\n const mockClient = {\n transaction: vi.fn().mockReturnValue({\n commit: vi.fn().mockResolvedValue({\n results: [{id: 'test-doc', operation: 'create'}],\n }),\n }),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n return mockClient\n}\n\nconst setupEditorMocks = () => {\n setupBaseMocks()\n mockOs.tmpdir.mockReturnValue('/tmp')\n mockFs.mkdir.mockResolvedValue(undefined)\n mockFs.writeFile.mockResolvedValue(undefined)\n mockFs.unlink.mockResolvedValue(undefined)\n mockExecaSync.mockReturnValue(undefined as never)\n}\n\nconst setupWatchMocks = () => {\n setupBaseMocks()\n mockOs.tmpdir.mockReturnValue('/tmp')\n mockFs.mkdir.mockResolvedValue(undefined)\n mockFs.writeFile.mockResolvedValue(undefined)\n mockFs.unlink.mockResolvedValue(undefined)\n}\n\ndescribe('#documents:create', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['documents create', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Create one or more documents\n\n USAGE\n $ sanity documents create [FILE] [-d <value>] [--id <value>] [--json5]\n [--missing] [--replace] [--watch]\n\n ARGUMENTS\n [FILE] JSON file to create document(s) from\n\n FLAGS\n -d, --dataset=<value> Dataset to create document(s) in (overrides config)\n --id=<value> Specify a document ID to use. Will fetch remote\n document ID and populate editor.\n --json5 Use JSON5 file type to allow a \"simplified\" version of\n JSON\n --missing On duplicate document IDs, don't modify the target\n document(s)\n --replace On duplicate document IDs, replace existing document\n with specified document(s)\n --watch Write the documents whenever the target file or buffer\n changes\n\n DESCRIPTION\n Create one or more documents\n\n EXAMPLES\n Create the document specified in \"myDocument.json\"\n\n $ sanity documents create myDocument.json\n\n Open configured $EDITOR and create the specified document(s)\n\n $ sanity documents create\n\n Fetch document with the ID \"myDocId\" and open configured $EDITOR with the\n current document content (if any). Replace document with the edited version\n when the editor closes\n\n $ sanity documents create --id myDocId --replace\n\n Open configured $EDITOR and replace the document with the given content on\n each save. Use JSON5 file extension and parser for simplified syntax.\n\n $ sanity documents create --id myDocId --watch --replace --json5\n\n \"\n `)\n })\n\n test('creates document from JSON file and displays success message', async () => {\n const mockDoc = {\n _id: 'test-doc',\n _type: 'post',\n title: 'Test Post',\n }\n\n const mockTransaction = {\n commit: vi.fn().mockResolvedValue({\n results: [{id: 'test-doc', operation: 'create'}],\n }),\n }\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockClient = {\n transaction: vi.fn().mockReturnValue(mockTransaction),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n\n mockFs.readFile.mockResolvedValue(JSON.stringify(mockDoc))\n mockJson5.parse.mockReturnValue(mockDoc)\n\n const {stdout} = await testCommand(CreateDocumentCommand, ['test-doc.json'])\n\n expect(stdout).toContain('Created:')\n expect(stdout).toContain('test-doc')\n expect(mockFs.readFile).toHaveBeenCalledWith(\n path.resolve(process.cwd(), 'test-doc.json'),\n 'utf8',\n )\n expect(mockClient.transaction).toHaveBeenCalledWith([{create: mockDoc}])\n })\n\n test('creates document with replace flag', async () => {\n const mockDoc = {\n _id: 'test-doc',\n _type: 'post',\n title: 'Test Post',\n }\n\n const mockTransaction = {\n commit: vi.fn().mockResolvedValue({\n results: [{id: 'test-doc', operation: 'update'}],\n }),\n }\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockClient = {\n transaction: vi.fn().mockReturnValue(mockTransaction),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n\n mockFs.readFile.mockResolvedValue(JSON.stringify(mockDoc))\n mockJson5.parse.mockReturnValue(mockDoc)\n\n const {stdout} = await testCommand(CreateDocumentCommand, ['test-doc.json', '--replace'])\n\n expect(stdout).toContain('Upserted:')\n expect(stdout).toContain('test-doc')\n expect(mockClient.transaction).toHaveBeenCalledWith([{createOrReplace: mockDoc}])\n })\n\n test('creates document with missing flag', async () => {\n const mockDoc = {\n _id: 'test-doc',\n _type: 'post',\n title: 'Test Post',\n }\n\n const mockTransaction = {\n commit: vi.fn().mockResolvedValue({\n results: [{id: 'test-doc', operation: 'update'}],\n }),\n }\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockClient = {\n transaction: vi.fn().mockReturnValue(mockTransaction),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n\n mockFs.readFile.mockResolvedValue(JSON.stringify(mockDoc))\n mockJson5.parse.mockReturnValue(mockDoc)\n\n const {stdout} = await testCommand(CreateDocumentCommand, ['test-doc.json', '--missing'])\n\n expect(stdout).toContain('Skipped (already exists):')\n expect(stdout).toContain('test-doc')\n expect(mockClient.transaction).toHaveBeenCalledWith([{createIfNotExists: mockDoc}])\n })\n\n test(\n 'opens editor when no file specified and creates document from editor content',\n withEditorEnv(async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockClient = {\n getDocument: vi.fn().mockResolvedValue(null),\n transaction: vi.fn().mockReturnValue({\n commit: vi.fn().mockResolvedValue({\n results: [{id: 'generated-id', operation: 'create'}],\n }),\n }),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n\n mockOs.tmpdir.mockReturnValue('/tmp')\n mockFs.mkdir.mockResolvedValue(undefined)\n mockFs.writeFile.mockResolvedValue(undefined)\n mockFs.readFile.mockResolvedValue('{\"_id\": \"generated-id\", \"_type\": \"updated-type\"}')\n mockFs.unlink.mockResolvedValue(undefined)\n mockJson5.stringify.mockReturnValue('{\"_id\": \"generated-id\", \"_type\": \"specify-me\"}')\n mockJson5.parse.mockReturnValue({_id: 'generated-id', _type: 'updated-type'})\n mockExecaSync.mockReturnValue(undefined as never)\n\n const {stdout} = await testCommand(CreateDocumentCommand, [])\n\n expect(stdout).toContain('Created:')\n expect(mockFs.mkdir).toHaveBeenCalledWith('/tmp/sanity-cli', {\n mode: 0o700,\n recursive: true,\n })\n expect(mockExecaSync).toHaveBeenCalled()\n }),\n )\n\n test('uses custom dataset from --dataset flag instead of config', async () => {\n const mockDoc = {\n _id: 'test-doc',\n _type: 'post',\n title: 'Test Post',\n }\n\n setupMocks()\n mockFs.readFile.mockResolvedValue(JSON.stringify(mockDoc))\n mockJson5.parse.mockReturnValue(mockDoc)\n\n const {stdout} = await testCommand(CreateDocumentCommand, [\n 'test-doc.json',\n '--dataset',\n 'staging',\n ])\n\n expect(stdout).toContain('Created:')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith(\n expect.objectContaining({\n dataset: 'staging',\n }),\n )\n })\n\n test('throws error when both --replace and --missing flags are used', async () => {\n setupBaseMocks()\n\n const {error} = await testCommand(CreateDocumentCommand, [\n 'test-doc.json',\n '--replace',\n '--missing',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Cannot use both --replace and --missing')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('throws error when --id and file path are both provided', async () => {\n setupBaseMocks()\n\n const {error} = await testCommand(CreateDocumentCommand, ['test-doc.json', '--id', 'myDocId'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Cannot use --id when specifying a file path')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('throws error when no project ID is configured', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: 'production',\n projectId: undefined,\n },\n })\n\n const {error} = await testCommand(CreateDocumentCommand, ['test-doc.json'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('throws error when no dataset is configured and none provided', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: undefined,\n projectId: testProjectId,\n },\n })\n\n const {error} = await testCommand(CreateDocumentCommand, ['test-doc.json'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('No dataset specified')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('displays error message when file cannot be read', async () => {\n setupBaseMocks()\n mockGetProjectCliClient.mockResolvedValue({} as never)\n mockFs.readFile.mockRejectedValue(new Error('File not found'))\n\n const {error} = await testCommand(CreateDocumentCommand, ['nonexistent.json'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Failed to create documents')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('validates document has required _type property', async () => {\n const invalidDoc = {title: 'Test Post'} // Missing _type\n\n setupBaseMocks()\n mockGetProjectCliClient.mockResolvedValue({} as never)\n mockFs.readFile.mockResolvedValue(JSON.stringify(invalidDoc))\n mockJson5.parse.mockReturnValue(invalidDoc)\n\n const {error} = await testCommand(CreateDocumentCommand, ['invalid-doc.json'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Failed to create documents')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test(\n 'uses JSON5 when --json5 flag is provided',\n withEditorEnv(async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockClient = {\n getDocument: vi.fn().mockResolvedValue(null),\n transaction: vi.fn().mockReturnValue({\n commit: vi.fn().mockResolvedValue({\n results: [{id: 'generated-id', operation: 'create'}],\n }),\n }),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n\n mockOs.tmpdir.mockReturnValue('/tmp')\n mockFs.mkdir.mockResolvedValue(undefined)\n mockFs.writeFile.mockResolvedValue(undefined)\n mockFs.readFile.mockResolvedValue('{\"_id\": \"generated-id\", \"_type\": \"updated-type\"}')\n mockFs.unlink.mockResolvedValue(undefined)\n mockJson5.stringify.mockReturnValue('{\"_id\": \"generated-id\", \"_type\": \"specify-me\"}')\n mockJson5.parse.mockReturnValue({_id: 'generated-id', _type: 'updated-type'})\n mockExecaSync.mockReturnValue(undefined as never)\n\n await testCommand(CreateDocumentCommand, ['--json5'])\n\n expect(mockJson5.stringify).toHaveBeenCalled()\n expect(mockFs.writeFile).toHaveBeenCalledWith(\n expect.stringContaining('.json5'),\n expect.any(String),\n {\n encoding: 'utf8',\n mode: 0o600,\n },\n )\n }),\n )\n\n describe('validation', () => {\n test.each([\n ['non-object document', 'not an object', 'Document must be an object'],\n [\n 'document without _type',\n {title: 'Test'},\n 'Document must have a `_type` property of type string',\n ],\n ['document with empty _type', {_type: '', title: 'Test'}, 'Document _type cannot be empty'],\n [\n 'document with invalid _type format (starts with number)',\n {_type: '1invalid', title: 'Test'},\n 'Document _type must start with a letter',\n ],\n [\n 'document with invalid _type format (special chars)',\n {_type: 'invalid@type', title: 'Test'},\n 'Document _type must start with a letter and contain only alphanumeric characters',\n ],\n [\n 'document with empty _id',\n {_id: ' ', _type: 'test', title: 'Test'},\n 'Document _id cannot be empty',\n ],\n [\n 'document with invalid _id format',\n {_id: 'invalid@id', _type: 'test', title: 'Test'},\n 'Document _id can only contain alphanumeric characters',\n ],\n [\n 'document with _id too long',\n {_id: 'a'.repeat(201), _type: 'test', title: 'Test'},\n 'Document _id cannot be longer than 200 characters',\n ],\n ])('validates %s', async (description, doc, expectedErrorSubstring) => {\n setupMocks()\n mockFs.readFile.mockResolvedValue(JSON.stringify(doc))\n mockJson5.parse.mockReturnValue(doc)\n\n const {error} = await testCommand(CreateDocumentCommand, ['invalid-doc.json'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain(expectedErrorSubstring)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n [\n 'multiple documents with invalid first document',\n [{title: 'Invalid'}, {_type: 'valid', title: 'Valid'}],\n 'Document at index 0 must have a `_type` property of type string',\n ],\n [\n 'multiple documents with invalid second document',\n [{_type: 'valid', title: 'Valid'}, {title: 'Invalid'}],\n 'Document at index 1 must have a `_type` property of type string',\n ],\n ])('validates %s', async (description, docs, expectedErrorSubstring) => {\n setupMocks()\n mockFs.readFile.mockResolvedValue(JSON.stringify(docs))\n mockJson5.parse.mockReturnValue(docs)\n\n const {error} = await testCommand(CreateDocumentCommand, ['invalid-docs.json'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain(expectedErrorSubstring)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('allows documents with reserved fields but logs debug warning', async () => {\n const docWithReservedFields = {\n _createdAt: '2024-01-01T00:00:00Z',\n _id: 'test-doc',\n _rev: 'some-revision',\n _type: 'post',\n _updatedAt: '2024-01-02T00:00:00Z',\n title: 'Test Post',\n }\n\n setupMocks()\n const mockClient = {\n transaction: vi.fn().mockReturnValue({\n commit: vi.fn().mockResolvedValue({\n results: [{id: 'test-doc', operation: 'create'}],\n }),\n }),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n mockFs.readFile.mockResolvedValue(JSON.stringify(docWithReservedFields))\n mockJson5.parse.mockReturnValue(docWithReservedFields)\n\n // Should not throw error, but should proceed with document creation\n const {stdout} = await testCommand(CreateDocumentCommand, ['doc.json'])\n\n expect(stdout).toContain('Created:')\n expect(stdout).toContain('test-doc')\n expect(mockClient.transaction).toHaveBeenCalledWith([{create: docWithReservedFields}])\n })\n\n test('validates empty document array throws error', async () => {\n const emptyArray: unknown[] = []\n\n setupMocks()\n mockFs.readFile.mockResolvedValue(JSON.stringify(emptyArray))\n mockJson5.parse.mockReturnValue(emptyArray)\n\n const {error} = await testCommand(CreateDocumentCommand, ['empty-docs.json'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('No documents provided')\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n\n describe('batch operations', () => {\n test.each([\n ['create', 'create', 'Created:'],\n ['createOrReplace', 'replace', 'Upserted:'],\n ['createIfNotExists', 'missing', 'Skipped (already exists):'],\n ])('handles multiple documents with %s operation', async (operation, flag, expectedMessage) => {\n const mockDocs = [\n {_id: 'doc1', _type: 'post', title: 'Post 1'},\n {_id: 'doc2', _type: 'post', title: 'Post 2'},\n ]\n\n const mockTransaction = {\n commit: vi.fn().mockResolvedValue({\n results: [\n {id: 'doc1', operation: operation === 'createIfNotExists' ? 'update' : 'create'},\n {id: 'doc2', operation: operation === 'createIfNotExists' ? 'update' : 'create'},\n ],\n }),\n }\n\n setupMocks()\n const mockClient = {\n transaction: vi.fn().mockReturnValue(mockTransaction),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n mockFs.readFile.mockResolvedValue(JSON.stringify(mockDocs))\n mockJson5.parse.mockReturnValue(mockDocs)\n\n const args = ['docs.json']\n if (flag !== 'create') args.push(`--${flag}`)\n\n const {stdout} = await testCommand(CreateDocumentCommand, args)\n\n expect(stdout).toContain(expectedMessage)\n expect(stdout).toContain('doc1')\n expect(stdout).toContain('doc2')\n\n const expectedMutations = mockDocs.map((doc) => ({[operation]: doc}))\n expect(mockClient.transaction).toHaveBeenCalledWith(expectedMutations)\n })\n\n test('handles mixed results for createIfNotExists', async () => {\n const mockDocs = [\n {_id: 'doc1', _type: 'post', title: 'Post 1'},\n {_id: 'doc2', _type: 'post', title: 'Post 2'},\n {_id: 'doc3', _type: 'post', title: 'Post 3'},\n ]\n\n const mockTransaction = {\n commit: vi.fn().mockResolvedValue({\n results: [\n {id: 'doc1', operation: 'create'}, // Created\n {id: 'doc2', operation: 'update'}, // Skipped (already exists)\n {id: 'doc3', operation: 'create'}, // Created\n ],\n }),\n }\n\n setupMocks()\n const mockClient = {\n transaction: vi.fn().mockReturnValue(mockTransaction),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n mockFs.readFile.mockResolvedValue(JSON.stringify(mockDocs))\n mockJson5.parse.mockReturnValue(mockDocs)\n\n const {stdout} = await testCommand(CreateDocumentCommand, ['docs.json', '--missing'])\n\n expect(stdout).toContain('Created:')\n expect(stdout).toContain('doc1')\n expect(stdout).toContain('doc3')\n expect(stdout).toContain('Skipped (already exists):')\n expect(stdout).toContain('doc2')\n })\n })\n\n describe('editor workflow', () => {\n test(\n 'fetches existing document with --id flag',\n withEditorEnv(async () => {\n const existingDoc = {\n _id: 'existing-doc',\n _type: 'post',\n title: 'Existing Post',\n }\n\n const mockClient = {\n getDocument: vi.fn().mockResolvedValue(existingDoc),\n transaction: vi.fn().mockReturnValue({\n commit: vi.fn().mockResolvedValue({\n results: [{id: 'existing-doc', operation: 'update'}],\n }),\n }),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n\n setupEditorMocks()\n mockFs.readFile.mockResolvedValue(JSON.stringify({...existingDoc, title: 'Updated Post'}))\n mockJson5.parse.mockReturnValue({...existingDoc, title: 'Updated Post'})\n mockJson5.stringify.mockReturnValue(JSON.stringify(existingDoc, null, 2))\n\n const {stdout} = await testCommand(CreateDocumentCommand, ['--id', 'existing-doc'])\n\n expect(mockClient.getDocument).toHaveBeenCalledWith('existing-doc')\n expect(mockFs.writeFile).toHaveBeenCalledWith(\n expect.stringContaining('existing-doc.json'),\n JSON.stringify(existingDoc, null, 2),\n expect.objectContaining({mode: 0o600}),\n )\n expect(stdout).toContain('Created:')\n }),\n )\n\n test(\n 'handles no changes made in editor',\n withEditorEnv(async () => {\n const mockClient = {\n getDocument: vi.fn().mockResolvedValue(null),\n transaction: vi.fn(),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n\n setupEditorMocks()\n\n // Set up a predictable UUID so the test can verify no changes were made\n const testUuid = '123e4567-e89b-12d3-a456-426614174000'\n mockRandomUUID.mockReturnValue(testUuid)\n\n const defaultDoc = {\n _id: testUuid,\n _type: 'specify-me',\n }\n\n // First mock the writeFile call for initial template\n const writeFileContent = JSON.stringify(defaultDoc, null, 2)\n mockJson5.stringify.mockReturnValue(writeFileContent)\n\n // Set up the file read to return the exact same content structure\n mockFs.readFile.mockResolvedValue(writeFileContent)\n // Return the exact same object structure that was written\n mockJson5.parse.mockReturnValue(defaultDoc)\n\n await testCommand(CreateDocumentCommand, [])\n\n // The key test - transaction should not have been called since no changes were made\n expect(mockClient.transaction).not.toHaveBeenCalled()\n }),\n )\n\n test(\n 'handles write error with already exists hint',\n withEditorEnv(async () => {\n const mockDoc = {\n _id: 'test-doc',\n _type: 'post',\n title: 'Test Post',\n }\n\n const mockClient = {\n getDocument: vi.fn().mockResolvedValue(null),\n transaction: vi.fn().mockReturnValue({\n commit: vi.fn().mockRejectedValue(new Error('Document already exists')),\n }),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n\n setupEditorMocks()\n mockFs.readFile.mockResolvedValue(JSON.stringify(mockDoc))\n mockJson5.parse.mockReturnValue(mockDoc)\n mockJson5.stringify.mockReturnValue(\n JSON.stringify({_id: 'test-doc', _type: 'specify-me'}, null, 2),\n )\n\n const {error} = await testCommand(CreateDocumentCommand, [])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Failed to write documents: Document already exists')\n expect(error?.message).toContain('Perhaps you want to use `--replace` or `--missing`?')\n expect(error?.oclif?.exit).toBe(1)\n }),\n )\n\n test(\n 'handles file cleanup errors silently',\n withEditorEnv(async () => {\n const mockDoc = {\n _id: 'test-doc',\n _type: 'post',\n title: 'Test Post',\n }\n\n const mockClient = {\n getDocument: vi.fn().mockResolvedValue(null),\n transaction: vi.fn().mockReturnValue({\n commit: vi.fn().mockResolvedValue({\n results: [{id: 'test-doc', operation: 'create'}],\n }),\n }),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n\n setupEditorMocks()\n // Mock unlink to throw an error (should be caught silently)\n mockFs.unlink.mockRejectedValue(new Error('Permission denied'))\n mockFs.readFile.mockResolvedValue(JSON.stringify(mockDoc))\n mockJson5.parse.mockReturnValue(mockDoc)\n mockJson5.stringify.mockReturnValue(\n JSON.stringify({_id: 'test-doc', _type: 'specify-me'}, null, 2),\n )\n\n const {stdout} = await testCommand(CreateDocumentCommand, [])\n\n // Should still succeed despite file cleanup error\n expect(stdout).toContain('Created:')\n expect(stdout).toContain('test-doc')\n expect(mockFs.unlink).toHaveBeenCalled()\n }),\n )\n })\n\n describe('watch mode', () => {\n test(\n 'enables watch mode and logs appropriate messages',\n withEditorEnv(async () => {\n const mockWatcher = {\n on: vi.fn().mockReturnThis(),\n }\n mockChokidarWatch.mockReturnValue(mockWatcher as never)\n\n const mockClient = {\n getDocument: vi.fn().mockResolvedValue(null),\n transaction: vi.fn().mockReturnValue({\n commit: vi.fn().mockResolvedValue({\n results: [{id: 'test-doc', operation: 'create'}],\n }),\n }),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n\n setupWatchMocks()\n mockJson5.stringify.mockReturnValue(\n JSON.stringify({_id: 'test-doc', _type: 'specify-me'}, null, 2),\n )\n mockExeca.mockResolvedValue({} as never)\n\n const {stdout} = await testCommand(CreateDocumentCommand, ['--watch'])\n\n expect(stdout).toContain('Watch mode:')\n expect(stdout).toContain('Will write documents on each save.')\n expect(stdout).toContain('Press Ctrl + C to cancel watch mode.')\n expect(mockWatcher.on).toHaveBeenCalledWith('change', expect.any(Function))\n expect(mockExeca).toHaveBeenCalledWith('vim', expect.any(Array), {stdio: 'inherit'})\n expect(mockChokidarWatch).toHaveBeenCalledWith(expect.stringContaining('.json'))\n }),\n )\n\n test(\n 'handles file change events in watch mode',\n withEditorEnv(async () => {\n const mockDoc = {\n _id: 'test-doc',\n _type: 'post',\n title: 'Updated Post',\n }\n\n let changeHandler: () => Promise<void>\n const mockWatcher = {\n on: vi.fn().mockImplementation((event: string, handler: () => Promise<void>) => {\n if (event === 'change') {\n changeHandler = handler\n }\n return mockWatcher\n }),\n }\n mockChokidarWatch.mockReturnValue(mockWatcher as never)\n\n const mockClient = {\n getDocument: vi.fn().mockResolvedValue(null),\n transaction: vi.fn().mockReturnValue({\n commit: vi.fn().mockResolvedValue({\n results: [{id: 'test-doc', operation: 'create'}],\n }),\n }),\n }\n mockGetProjectCliClient.mockResolvedValue(mockClient as never)\n\n setupWatchMocks()\n mockJson5.stringify.mockReturnValue(\n JSON.stringify({_id: 'test-doc', _type: 'specify-me'}, null, 2),\n )\n mockExeca.mockResolvedValue({} as never)\n\n // Mock file read to return different content for file change\n mockFs.readFile.mockResolvedValue(JSON.stringify(mockDoc))\n mockJson5.parse.mockReturnValue(mockDoc)\n\n await testCommand(CreateDocumentCommand, ['--watch'])\n\n // Simulate file change\n expect(changeHandler!).toBeDefined()\n await changeHandler!()\n\n expect(mockClient.transaction).toHaveBeenCalledWith([{create: mockDoc}])\n }),\n )\n })\n})\n"],"names":["randomUUID","fs","os","path","runCommand","getCliConfig","getProjectCliClient","testCommand","watch","chokidarWatch","execa","execaSync","json5","afterEach","describe","expect","test","vi","NO_PROJECT_ID","CreateDocumentCommand","mock","fn","findProjectRoot","mockResolvedValue","directory","root","type","getCliToken","mockGetCliConfig","mocked","mockGetProjectCliClient","mockFs","mockOs","mockChokidarWatch","mockExeca","mockExecaSync","mockJson5","mockRandomUUID","testProjectId","testDataset","withEditorEnv","testFn","stubEnv","unstubAllEnvs","baseConfig","api","dataset","projectId","setupBaseMocks","additionalConfig","setupMocks","mockClient","transaction","mockReturnValue","commit","results","id","operation","setupEditorMocks","tmpdir","mkdir","undefined","writeFile","unlink","setupWatchMocks","clearAllMocks","stdout","toMatchInlineSnapshot","mockDoc","_id","_type","title","mockTransaction","readFile","JSON","stringify","parse","toContain","toHaveBeenCalledWith","resolve","process","cwd","create","createOrReplace","createIfNotExists","getDocument","mode","recursive","toHaveBeenCalled","objectContaining","error","toBeInstanceOf","Error","message","oclif","exit","toBe","toEqual","mockRejectedValue","invalidDoc","stringContaining","any","String","encoding","each","repeat","description","doc","expectedErrorSubstring","docs","docWithReservedFields","_createdAt","_rev","_updatedAt","emptyArray","flag","expectedMessage","mockDocs","args","push","expectedMutations","map","existingDoc","testUuid","defaultDoc","writeFileContent","not","mockWatcher","on","mockReturnThis","Function","Array","stdio","changeHandler","mockImplementation","event","handler","toBeDefined"],"mappings":"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"}
@@ -1,268 +0,0 @@
1
- import { runCommand } from '@oclif/test';
2
- import { getCliConfig, getProjectCliClient } from '@sanity/cli-core';
3
- import { testCommand } from '@sanity/cli-test';
4
- import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
5
- import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
6
- import { DeleteDocumentCommand } from '../delete.js';
7
- // Mock the config functions
8
- vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
9
- findProjectRoot: vi.fn().mockResolvedValue({
10
- directory: '/test/path',
11
- root: '/test/path',
12
- type: 'studio'
13
- })
14
- }));
15
- vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
16
- getCliConfig: vi.fn().mockResolvedValue({
17
- api: {
18
- dataset: 'production',
19
- projectId: 'test-project'
20
- }
21
- })
22
- }));
23
- vi.mock('../../../../../cli-core/src/services/apiClient.js', ()=>({
24
- getProjectCliClient: vi.fn()
25
- }));
26
- vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
27
- getCliToken: vi.fn().mockResolvedValue('test-token')
28
- }));
29
- // Mock the project API client
30
- const mockTransaction = vi.fn();
31
- const mockCommit = vi.fn();
32
- const mockDelete = vi.fn();
33
- // Get the mocked functions
34
- const mockedGetCliConfig = vi.mocked(getCliConfig);
35
- const mockedGetProjectCliClient = vi.mocked(getProjectCliClient);
36
- describe('documents delete', ()=>{
37
- beforeEach(()=>{
38
- // Setup transaction chain
39
- mockDelete.mockReturnValue({
40
- commit: mockCommit,
41
- delete: mockDelete
42
- });
43
- mockTransaction.mockReturnValue({
44
- commit: mockCommit,
45
- delete: mockDelete
46
- });
47
- mockedGetProjectCliClient.mockResolvedValue({
48
- transaction: mockTransaction
49
- });
50
- });
51
- afterEach(()=>{
52
- vi.clearAllMocks();
53
- mockTransaction.mockReset();
54
- mockCommit.mockReset();
55
- mockDelete.mockReset();
56
- });
57
- test('--help works', async ()=>{
58
- const { stdout } = await runCommand([
59
- 'documents delete',
60
- '--help'
61
- ]);
62
- expect(stdout).toMatchInlineSnapshot(`
63
- "Delete one or more documents from the projects configured dataset
64
-
65
- USAGE
66
- $ sanity documents delete ID... [IDS...] [--dataset <value>]
67
-
68
- ARGUMENTS
69
- ID... Document ID to delete
70
- [IDS...] Additional document IDs to delete
71
-
72
- FLAGS
73
- --dataset=<value> NAME to override dataset
74
-
75
- DESCRIPTION
76
- Delete one or more documents from the projects configured dataset
77
-
78
- EXAMPLES
79
- Delete the document with the ID "myDocId"
80
-
81
- $ sanity documents delete myDocId
82
-
83
- ID wrapped in double or single quote works equally well
84
-
85
- $ sanity documents delete 'myDocId'
86
-
87
- Delete document with ID "someDocId" from dataset "blog"
88
-
89
- $ sanity documents delete --dataset=blog someDocId
90
-
91
- Delete the document with ID "doc1" and "doc2"
92
-
93
- $ sanity documents delete doc1 doc2
94
-
95
- "
96
- `);
97
- });
98
- test('deletes a single document successfully', async ()=>{
99
- mockCommit.mockResolvedValue({
100
- results: [
101
- {
102
- id: 'test-doc',
103
- operation: 'delete'
104
- }
105
- ]
106
- });
107
- const { stdout } = await testCommand(DeleteDocumentCommand, [
108
- 'test-doc'
109
- ]);
110
- expect(stdout).toContain('Deleted 1 document');
111
- expect(mockDelete).toHaveBeenCalledWith('test-doc');
112
- expect(mockCommit).toHaveBeenCalled();
113
- });
114
- test('deletes multiple documents successfully', async ()=>{
115
- mockCommit.mockResolvedValue({
116
- results: [
117
- {
118
- id: 'doc1',
119
- operation: 'delete'
120
- },
121
- {
122
- id: 'doc2',
123
- operation: 'delete'
124
- },
125
- {
126
- id: 'doc3',
127
- operation: 'delete'
128
- }
129
- ]
130
- });
131
- const { stdout } = await testCommand(DeleteDocumentCommand, [
132
- 'doc1',
133
- 'doc2',
134
- 'doc3'
135
- ]);
136
- expect(stdout).toContain('Deleted 3 documents');
137
- expect(mockDelete).toHaveBeenCalledWith('doc1');
138
- expect(mockDelete).toHaveBeenCalledWith('doc2');
139
- expect(mockDelete).toHaveBeenCalledWith('doc3');
140
- expect(mockCommit).toHaveBeenCalled();
141
- });
142
- test('handles documents not found', async ()=>{
143
- mockCommit.mockResolvedValue({
144
- results: [
145
- {
146
- id: 'doc1',
147
- operation: 'delete'
148
- }
149
- ]
150
- });
151
- const { error } = await testCommand(DeleteDocumentCommand, [
152
- 'doc1',
153
- 'nonexistent-doc'
154
- ]);
155
- expect(error).toBeInstanceOf(Error);
156
- expect(error?.message).toContain('Document not found: nonexistent-doc');
157
- expect(mockDelete).toHaveBeenCalledWith('doc1');
158
- expect(mockDelete).toHaveBeenCalledWith('nonexistent-doc');
159
- expect(mockCommit).toHaveBeenCalled();
160
- });
161
- test('uses custom dataset when --dataset flag is provided', async ()=>{
162
- mockCommit.mockResolvedValue({
163
- results: [
164
- {
165
- id: 'test-doc',
166
- operation: 'delete'
167
- }
168
- ]
169
- });
170
- await testCommand(DeleteDocumentCommand, [
171
- 'test-doc',
172
- '--dataset',
173
- 'staging'
174
- ]);
175
- expect(mockDelete).toHaveBeenCalledWith('test-doc');
176
- // Verify that the getProjectCliClient was called with the staging dataset
177
- expect(mockedGetProjectCliClient).toHaveBeenCalledWith(expect.objectContaining({
178
- dataset: 'staging',
179
- projectId: 'test-project'
180
- }));
181
- });
182
- test('throws error when no project ID is configured', async ()=>{
183
- mockedGetCliConfig.mockResolvedValue({
184
- api: {
185
- dataset: 'production',
186
- projectId: undefined
187
- }
188
- });
189
- const { error } = await testCommand(DeleteDocumentCommand, [
190
- 'test-doc'
191
- ]);
192
- expect(error).toBeInstanceOf(Error);
193
- expect(error?.message).toEqual(NO_PROJECT_ID);
194
- expect(error?.oclif?.exit).toBe(1);
195
- // Restore the original mock for other tests
196
- mockedGetCliConfig.mockResolvedValue({
197
- api: {
198
- dataset: 'production',
199
- projectId: 'test-project'
200
- }
201
- });
202
- });
203
- test('throws error when no dataset is configured and none provided', async ()=>{
204
- mockedGetCliConfig.mockResolvedValueOnce({
205
- api: {
206
- dataset: undefined,
207
- projectId: 'test-project'
208
- }
209
- });
210
- const { error } = await testCommand(DeleteDocumentCommand, [
211
- 'test-doc'
212
- ]);
213
- expect(error).toBeInstanceOf(Error);
214
- expect(error?.message).toContain('No dataset specified');
215
- expect(error?.oclif?.exit).toBe(1);
216
- });
217
- test('handles transaction errors gracefully', async ()=>{
218
- mockCommit.mockRejectedValue(new Error('Transaction failed'));
219
- const { error } = await testCommand(DeleteDocumentCommand, [
220
- 'test-doc'
221
- ]);
222
- expect(error).toBeInstanceOf(Error);
223
- expect(error?.message).toContain('Failed to delete 1 document: Transaction failed');
224
- expect(error?.oclif?.exit).toBe(1);
225
- expect(mockDelete).toHaveBeenCalledWith('test-doc');
226
- });
227
- test('requires document ID argument', async ()=>{
228
- const { error } = await testCommand(DeleteDocumentCommand, []);
229
- expect(error).toBeInstanceOf(Error);
230
- expect(error?.message).toContain('Missing 1 required arg');
231
- });
232
- test('shows singular message when deleting one document', async ()=>{
233
- mockCommit.mockResolvedValue({
234
- results: [
235
- {
236
- id: 'test-doc',
237
- operation: 'delete'
238
- }
239
- ]
240
- });
241
- const { stdout } = await testCommand(DeleteDocumentCommand, [
242
- 'test-doc'
243
- ]);
244
- expect(stdout).toContain('Deleted 1 document');
245
- expect(stdout).not.toContain('documents');
246
- });
247
- test('shows plural message when deleting multiple documents', async ()=>{
248
- mockCommit.mockResolvedValue({
249
- results: [
250
- {
251
- id: 'doc1',
252
- operation: 'delete'
253
- },
254
- {
255
- id: 'doc2',
256
- operation: 'delete'
257
- }
258
- ]
259
- });
260
- const { stdout } = await testCommand(DeleteDocumentCommand, [
261
- 'doc1',
262
- 'doc2'
263
- ]);
264
- expect(stdout).toContain('Deleted 2 documents');
265
- });
266
- });
267
-
268
- //# sourceMappingURL=delete.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/commands/documents/__tests__/delete.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig, getProjectCliClient} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {DeleteDocumentCommand} from '../delete.js'\n\n// Mock the config functions\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 dataset: 'production',\n projectId: 'test-project',\n },\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/services/apiClient.js', () => ({\n getProjectCliClient: vi.fn(),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\n// Mock the project API client\nconst mockTransaction = vi.fn()\nconst mockCommit = vi.fn()\nconst mockDelete = vi.fn()\n\n// Get the mocked functions\nconst mockedGetCliConfig = vi.mocked(getCliConfig)\nconst mockedGetProjectCliClient = vi.mocked(getProjectCliClient)\n\ndescribe('documents delete', () => {\n beforeEach(() => {\n // Setup transaction chain\n mockDelete.mockReturnValue({\n commit: mockCommit,\n delete: mockDelete,\n })\n mockTransaction.mockReturnValue({\n commit: mockCommit,\n delete: mockDelete,\n })\n\n mockedGetProjectCliClient.mockResolvedValue({\n transaction: mockTransaction,\n } as never)\n })\n\n afterEach(() => {\n vi.clearAllMocks()\n mockTransaction.mockReset()\n mockCommit.mockReset()\n mockDelete.mockReset()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['documents delete', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Delete one or more documents from the projects configured dataset\n\n USAGE\n $ sanity documents delete ID... [IDS...] [--dataset <value>]\n\n ARGUMENTS\n ID... Document ID to delete\n [IDS...] Additional document IDs to delete\n\n FLAGS\n --dataset=<value> NAME to override dataset\n\n DESCRIPTION\n Delete one or more documents from the projects configured dataset\n\n EXAMPLES\n Delete the document with the ID \"myDocId\"\n\n $ sanity documents delete myDocId\n\n ID wrapped in double or single quote works equally well\n\n $ sanity documents delete 'myDocId'\n\n Delete document with ID \"someDocId\" from dataset \"blog\"\n\n $ sanity documents delete --dataset=blog someDocId\n\n Delete the document with ID \"doc1\" and \"doc2\"\n\n $ sanity documents delete doc1 doc2\n\n \"\n `)\n })\n\n test('deletes a single document successfully', async () => {\n mockCommit.mockResolvedValue({\n results: [{id: 'test-doc', operation: 'delete'}],\n })\n\n const {stdout} = await testCommand(DeleteDocumentCommand, ['test-doc'])\n\n expect(stdout).toContain('Deleted 1 document')\n expect(mockDelete).toHaveBeenCalledWith('test-doc')\n expect(mockCommit).toHaveBeenCalled()\n })\n\n test('deletes multiple documents successfully', async () => {\n mockCommit.mockResolvedValue({\n results: [\n {id: 'doc1', operation: 'delete'},\n {id: 'doc2', operation: 'delete'},\n {id: 'doc3', operation: 'delete'},\n ],\n })\n\n const {stdout} = await testCommand(DeleteDocumentCommand, ['doc1', 'doc2', 'doc3'])\n\n expect(stdout).toContain('Deleted 3 documents')\n expect(mockDelete).toHaveBeenCalledWith('doc1')\n expect(mockDelete).toHaveBeenCalledWith('doc2')\n expect(mockDelete).toHaveBeenCalledWith('doc3')\n expect(mockCommit).toHaveBeenCalled()\n })\n\n test('handles documents not found', async () => {\n mockCommit.mockResolvedValue({\n results: [{id: 'doc1', operation: 'delete'}],\n })\n\n const {error} = await testCommand(DeleteDocumentCommand, ['doc1', 'nonexistent-doc'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Document not found: nonexistent-doc')\n expect(mockDelete).toHaveBeenCalledWith('doc1')\n expect(mockDelete).toHaveBeenCalledWith('nonexistent-doc')\n expect(mockCommit).toHaveBeenCalled()\n })\n\n test('uses custom dataset when --dataset flag is provided', async () => {\n mockCommit.mockResolvedValue({\n results: [{id: 'test-doc', operation: 'delete'}],\n })\n\n await testCommand(DeleteDocumentCommand, ['test-doc', '--dataset', 'staging'])\n\n expect(mockDelete).toHaveBeenCalledWith('test-doc')\n // Verify that the getProjectCliClient was called with the staging dataset\n expect(mockedGetProjectCliClient).toHaveBeenCalledWith(\n expect.objectContaining({\n dataset: 'staging',\n projectId: 'test-project',\n }),\n )\n })\n\n test('throws error when no project ID is configured', async () => {\n mockedGetCliConfig.mockResolvedValue({\n api: {\n dataset: 'production',\n projectId: undefined,\n },\n })\n\n const {error} = await testCommand(DeleteDocumentCommand, ['test-doc'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n\n // Restore the original mock for other tests\n mockedGetCliConfig.mockResolvedValue({\n api: {\n dataset: 'production',\n projectId: 'test-project',\n },\n })\n })\n\n test('throws error when no dataset is configured and none provided', async () => {\n mockedGetCliConfig.mockResolvedValueOnce({\n api: {\n dataset: undefined,\n projectId: 'test-project',\n },\n })\n\n const {error} = await testCommand(DeleteDocumentCommand, ['test-doc'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('No dataset specified')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles transaction errors gracefully', async () => {\n mockCommit.mockRejectedValue(new Error('Transaction failed'))\n\n const {error} = await testCommand(DeleteDocumentCommand, ['test-doc'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Failed to delete 1 document: Transaction failed')\n expect(error?.oclif?.exit).toBe(1)\n expect(mockDelete).toHaveBeenCalledWith('test-doc')\n })\n\n test('requires document ID argument', async () => {\n const {error} = await testCommand(DeleteDocumentCommand, [])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Missing 1 required arg')\n })\n\n test('shows singular message when deleting one document', async () => {\n mockCommit.mockResolvedValue({\n results: [{id: 'test-doc', operation: 'delete'}],\n })\n\n const {stdout} = await testCommand(DeleteDocumentCommand, ['test-doc'])\n\n expect(stdout).toContain('Deleted 1 document')\n expect(stdout).not.toContain('documents')\n })\n\n test('shows plural message when deleting multiple documents', async () => {\n mockCommit.mockResolvedValue({\n results: [\n {id: 'doc1', operation: 'delete'},\n {id: 'doc2', operation: 'delete'},\n ],\n })\n\n const {stdout} = await testCommand(DeleteDocumentCommand, ['doc1', 'doc2'])\n\n expect(stdout).toContain('Deleted 2 documents')\n })\n})\n"],"names":["runCommand","getCliConfig","getProjectCliClient","testCommand","afterEach","beforeEach","describe","expect","test","vi","NO_PROJECT_ID","DeleteDocumentCommand","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","api","dataset","projectId","getCliToken","mockTransaction","mockCommit","mockDelete","mockedGetCliConfig","mocked","mockedGetProjectCliClient","mockReturnValue","commit","delete","transaction","clearAllMocks","mockReset","stdout","toMatchInlineSnapshot","results","id","operation","toContain","toHaveBeenCalledWith","toHaveBeenCalled","error","toBeInstanceOf","Error","message","objectContaining","undefined","toEqual","oclif","exit","toBe","mockResolvedValueOnce","mockRejectedValue","not"],"mappings":"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"}
@@ -1,209 +0,0 @@
1
- import { runCommand } from '@oclif/test';
2
- import { getCliConfig, getProjectCliClient } from '@sanity/cli-core';
3
- import { chalk } from '@sanity/cli-core/ux';
4
- import { testCommand } from '@sanity/cli-test';
5
- import { afterEach, describe, expect, test, vi } from 'vitest';
6
- import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
7
- import { GetDocumentCommand } from '../get.js';
8
- // Mock the config functions
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()
18
- }));
19
- vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
20
- getCliToken: vi.fn().mockResolvedValue('test-token')
21
- }));
22
- vi.mock('../../../../../cli-core/src/services/apiClient.js', ()=>({
23
- getProjectCliClient: vi.fn()
24
- }));
25
- const mockGetCliConfig = vi.mocked(getCliConfig);
26
- const mockGetProjectCliClient = vi.mocked(getProjectCliClient);
27
- const testProjectId = 'test-project';
28
- const testDataset = 'production';
29
- describe('#documents:get', ()=>{
30
- afterEach(()=>{
31
- vi.clearAllMocks();
32
- });
33
- test('--help works', async ()=>{
34
- const { stdout } = await runCommand([
35
- 'documents get',
36
- '--help'
37
- ]);
38
- expect(stdout).toContain('Get and print a document by ID');
39
- expect(stdout).toContain('ARGUMENTS');
40
- expect(stdout).toContain('DOCUMENTID');
41
- });
42
- test('retrieves and displays a document successfully', async ()=>{
43
- const mockDoc = {
44
- _id: 'test-doc',
45
- _type: 'post',
46
- content: 'This is a test post',
47
- title: 'Test Post'
48
- };
49
- mockGetCliConfig.mockResolvedValue({
50
- api: {
51
- dataset: testDataset,
52
- projectId: testProjectId
53
- }
54
- });
55
- // Mock the getProjectApiClient to return a mock client with getDocument
56
- const mockGetDocument = vi.fn().mockResolvedValue(mockDoc);
57
- mockGetProjectCliClient.mockResolvedValue({
58
- getDocument: mockGetDocument
59
- });
60
- const { stdout } = await testCommand(GetDocumentCommand, [
61
- 'test-doc'
62
- ]);
63
- expect(stdout).toContain('"_id": "test-doc"');
64
- expect(stdout).toContain('"title": "Test Post"');
65
- expect(mockGetDocument).toHaveBeenCalledWith('test-doc');
66
- });
67
- test('displays colorized output when --pretty flag is used', async ()=>{
68
- const mockDoc = {
69
- _id: 'test-doc',
70
- _type: 'post',
71
- title: 'Test Post'
72
- };
73
- mockGetCliConfig.mockResolvedValue({
74
- api: {
75
- dataset: testDataset,
76
- projectId: testProjectId
77
- }
78
- });
79
- // Mock the getProjectApiClient to return a mock client with getDocument
80
- const mockGetDocument = vi.fn().mockResolvedValue(mockDoc);
81
- mockGetProjectCliClient.mockResolvedValue({
82
- getDocument: mockGetDocument
83
- });
84
- const originalChalkLevel = chalk.level;
85
- // Force colorization
86
- chalk.level = 3;
87
- const { stdout } = await testCommand(GetDocumentCommand, [
88
- 'test-doc',
89
- '--pretty'
90
- ], {
91
- capture: {
92
- stripAnsi: false
93
- }
94
- });
95
- // Reset chalk level
96
- chalk.level = originalChalkLevel;
97
- // Check that the output contains the document data
98
- expect(stdout).toContain('test-doc');
99
- expect(stdout).toContain('Test Post');
100
- expect(stdout).toContain('_id');
101
- expect(stdout).toContain('_type');
102
- expect(stdout).toContain('title');
103
- // eslint-disable-next-line no-control-regex
104
- expect(stdout).toMatch(/\u001B\[\d+m/);
105
- expect(mockGetDocument).toHaveBeenCalledWith('test-doc');
106
- });
107
- test('uses custom dataset when --dataset flag is provided', async ()=>{
108
- const mockDoc = {
109
- _id: 'test-doc',
110
- _type: 'post',
111
- title: 'Test Post'
112
- };
113
- mockGetCliConfig.mockResolvedValue({
114
- api: {
115
- dataset: testDataset,
116
- projectId: testProjectId
117
- }
118
- });
119
- // Mock the getProjectApiClient to return a mock client with getDocument
120
- const mockGetDocument = vi.fn().mockResolvedValue(mockDoc);
121
- mockGetProjectCliClient.mockResolvedValue({
122
- getDocument: mockGetDocument
123
- });
124
- const { stdout } = await testCommand(GetDocumentCommand, [
125
- 'test-doc',
126
- '--dataset',
127
- 'staging'
128
- ]);
129
- expect(stdout).toContain('"_id": "test-doc"');
130
- expect(stdout).toContain('"title": "Test Post"');
131
- expect(mockGetDocument).toHaveBeenCalledWith('test-doc');
132
- });
133
- test('throws error when document is not found', async ()=>{
134
- mockGetCliConfig.mockResolvedValue({
135
- api: {
136
- dataset: testDataset,
137
- projectId: testProjectId
138
- }
139
- });
140
- // Mock the getProjectApiClient to return a mock client with getDocument returning null
141
- const mockGetDocument = vi.fn().mockResolvedValue(null);
142
- mockGetProjectCliClient.mockResolvedValue({
143
- getDocument: mockGetDocument
144
- });
145
- const { error } = await testCommand(GetDocumentCommand, [
146
- 'nonexistent-doc'
147
- ]);
148
- expect(error).toBeInstanceOf(Error);
149
- expect(error?.message).toContain('Document "nonexistent-doc" not found');
150
- expect(error?.oclif?.exit).toBe(1);
151
- expect(mockGetDocument).toHaveBeenCalledWith('nonexistent-doc');
152
- });
153
- test('throws error when no project ID is configured', async ()=>{
154
- mockGetCliConfig.mockResolvedValue({
155
- api: {
156
- dataset: 'production',
157
- projectId: undefined
158
- }
159
- });
160
- const { error } = await testCommand(GetDocumentCommand, [
161
- 'test-doc'
162
- ]);
163
- expect(error).toBeInstanceOf(Error);
164
- expect(error?.message).toEqual(NO_PROJECT_ID);
165
- expect(error?.oclif?.exit).toBe(1);
166
- });
167
- test('throws error when no dataset is configured and none provided', async ()=>{
168
- mockGetCliConfig.mockResolvedValue({
169
- api: {
170
- dataset: undefined,
171
- projectId: testProjectId
172
- }
173
- });
174
- const { error } = await testCommand(GetDocumentCommand, [
175
- 'test-doc'
176
- ]);
177
- expect(error).toBeInstanceOf(Error);
178
- expect(error?.message).toContain('No dataset specified');
179
- expect(error?.oclif?.exit).toBe(1);
180
- });
181
- test('handles client errors gracefully', async ()=>{
182
- mockGetCliConfig.mockResolvedValue({
183
- api: {
184
- dataset: testDataset,
185
- projectId: testProjectId
186
- }
187
- });
188
- // Mock the getProjectApiClient to return a mock client with getDocument throwing an error
189
- const mockGetDocument = vi.fn().mockRejectedValue(new Error('Network error'));
190
- mockGetProjectCliClient.mockResolvedValue({
191
- getDocument: mockGetDocument
192
- });
193
- const { error } = await testCommand(GetDocumentCommand, [
194
- 'test-doc'
195
- ]);
196
- expect(error).toBeInstanceOf(Error);
197
- expect(error?.message).toContain('Failed to fetch document');
198
- expect(error?.oclif?.exit).toBe(1);
199
- expect(mockGetDocument).toHaveBeenCalledWith('test-doc');
200
- });
201
- test('requires document ID argument', async ()=>{
202
- const { error } = await testCommand(GetDocumentCommand, []);
203
- expect(error).toBeInstanceOf(Error);
204
- expect(error?.message).toContain('Missing 1 required arg');
205
- expect(error?.oclif?.exit).toBe(2);
206
- });
207
- });
208
-
209
- //# sourceMappingURL=get.test.js.map