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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/dist/actions/dataset/create.d.ts +49 -0
  2. package/dist/actions/dataset/create.js +48 -0
  3. package/dist/actions/dataset/create.js.map +1 -0
  4. package/dist/actions/dataset/determineDatasetAclMode.d.ts +37 -0
  5. package/dist/actions/dataset/determineDatasetAclMode.js +36 -0
  6. package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -0
  7. package/dist/actions/debug/gatherDebugInfo.js +15 -21
  8. package/dist/actions/debug/gatherDebugInfo.js.map +1 -1
  9. package/dist/actions/debug/types.d.ts +0 -2
  10. package/dist/actions/debug/types.js.map +1 -1
  11. package/dist/actions/deploy/deployApp.js +13 -0
  12. package/dist/actions/deploy/deployApp.js.map +1 -1
  13. package/dist/actions/init/remoteTemplate.js +1 -1
  14. package/dist/actions/init/remoteTemplate.js.map +1 -1
  15. package/dist/actions/manifest/extractAppManifest.d.ts +20 -0
  16. package/dist/actions/manifest/extractAppManifest.js +51 -0
  17. package/dist/actions/manifest/extractAppManifest.js.map +1 -0
  18. package/dist/actions/manifest/extractManifest.js +1 -1
  19. package/dist/actions/manifest/extractManifest.js.map +1 -1
  20. package/dist/actions/manifest/types.d.ts +6 -1
  21. package/dist/actions/manifest/types.js.map +1 -1
  22. package/dist/actions/media/importAspects.js +2 -1
  23. package/dist/actions/media/importAspects.js.map +1 -1
  24. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +1 -1
  25. package/dist/commands/dataset/create.d.ts +0 -2
  26. package/dist/commands/dataset/create.js +8 -54
  27. package/dist/commands/dataset/create.js.map +1 -1
  28. package/dist/commands/debug.js +5 -9
  29. package/dist/commands/debug.js.map +1 -1
  30. package/dist/commands/init.d.ts +6 -1
  31. package/dist/commands/init.js +358 -20
  32. package/dist/commands/init.js.map +1 -1
  33. package/dist/commands/manifest/extract.js +7 -8
  34. package/dist/commands/manifest/extract.js.map +1 -1
  35. package/dist/config/createCliConfig.d.ts +9 -0
  36. package/dist/prompts/init/promptForTypescript.d.ts +2 -0
  37. package/dist/prompts/init/promptForTypescript.js +15 -0
  38. package/dist/prompts/init/promptForTypescript.js.map +1 -0
  39. package/dist/prompts/promptForDatasetAclMode.d.ts +9 -0
  40. package/dist/prompts/promptForDatasetAclMode.js +27 -0
  41. package/dist/prompts/promptForDatasetAclMode.js.map +1 -0
  42. package/dist/prompts/promptForDatasetName.d.ts +1 -1
  43. package/dist/prompts/promptForDatasetName.js +4 -1
  44. package/dist/prompts/promptForDatasetName.js.map +1 -1
  45. package/dist/services/organizations.d.ts +3 -1
  46. package/dist/services/organizations.js +2 -1
  47. package/dist/services/organizations.js.map +1 -1
  48. package/dist/services/user.d.ts +5 -0
  49. package/dist/services/user.js +12 -1
  50. package/dist/services/user.js.map +1 -1
  51. package/dist/services/userApplications.d.ts +3 -1
  52. package/dist/services/userApplications.js +5 -1
  53. package/dist/services/userApplications.js.map +1 -1
  54. package/oclif.manifest.json +113 -113
  55. package/package.json +16 -12
  56. package/templates/app-quickstart/src/App.css +20 -0
  57. package/templates/app-quickstart/src/App.tsx +25 -0
  58. package/templates/app-quickstart/src/ExampleComponent.css +90 -0
  59. package/templates/app-quickstart/src/ExampleComponent.tsx +37 -0
  60. package/templates/app-sanity-ui/src/App.tsx +34 -0
  61. package/templates/app-sanity-ui/src/ExampleComponent.tsx +34 -0
  62. package/templates/app-sanity-ui/src/SanityUI.tsx +23 -0
  63. package/templates/blog/README.md +11 -0
  64. package/templates/blog/schemaTypes/author.js +50 -0
  65. package/templates/blog/schemaTypes/blockContent.js +67 -0
  66. package/templates/blog/schemaTypes/category.js +19 -0
  67. package/templates/blog/schemaTypes/index.js +6 -0
  68. package/templates/blog/schemaTypes/post.js +65 -0
  69. package/templates/blog/static/.gitkeep +1 -0
  70. package/templates/clean/README.md +9 -0
  71. package/templates/clean/schemaTypes/index.js +1 -0
  72. package/templates/clean/static/.gitkeep +1 -0
  73. package/templates/ecommerce/README.md +11 -0
  74. package/templates/ecommerce/plugins/.gitkeep +1 -0
  75. package/templates/ecommerce/plugins/barcode-input/BarcodeInput.js +62 -0
  76. package/templates/ecommerce/plugins/barcode-input/index.js +9 -0
  77. package/templates/ecommerce/plugins/barcode-input/schemaType.js +60 -0
  78. package/templates/ecommerce/schemaTypes/blockContent.js +67 -0
  79. package/templates/ecommerce/schemaTypes/category.js +39 -0
  80. package/templates/ecommerce/schemaTypes/index.js +23 -0
  81. package/templates/ecommerce/schemaTypes/locale/localeBlockContent.js +19 -0
  82. package/templates/ecommerce/schemaTypes/locale/localeString.js +19 -0
  83. package/templates/ecommerce/schemaTypes/locale/localeText.js +19 -0
  84. package/templates/ecommerce/schemaTypes/locale/supportedLanguages.js +5 -0
  85. package/templates/ecommerce/schemaTypes/product.js +83 -0
  86. package/templates/ecommerce/schemaTypes/productVariant.js +52 -0
  87. package/templates/ecommerce/schemaTypes/vendor.js +39 -0
  88. package/templates/ecommerce/static/.gitkeep +1 -0
  89. package/templates/get-started/README.md +9 -0
  90. package/templates/get-started/plugins/.gitkeep +1 -0
  91. package/templates/get-started/plugins/sanity-plugin-tutorial/CustomDefaultLayout.tsx +16 -0
  92. package/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +104 -0
  93. package/templates/get-started/plugins/sanity-plugin-tutorial/index.ts +11 -0
  94. package/templates/get-started/schemaTypes/index.ts +1 -0
  95. package/templates/get-started/static/.gitkeep +1 -0
  96. package/templates/moviedb/README.md +10 -0
  97. package/templates/moviedb/schemaTypes/blockContent.js +67 -0
  98. package/templates/moviedb/schemaTypes/castMember.js +37 -0
  99. package/templates/moviedb/schemaTypes/crewMember.js +52 -0
  100. package/templates/moviedb/schemaTypes/index.js +22 -0
  101. package/templates/moviedb/schemaTypes/movie.js +85 -0
  102. package/templates/moviedb/schemaTypes/person.js +37 -0
  103. package/templates/moviedb/schemaTypes/plotSummaries.js +20 -0
  104. package/templates/moviedb/schemaTypes/plotSummary.js +24 -0
  105. package/templates/moviedb/schemaTypes/screening.js +81 -0
  106. package/templates/moviedb/static/.gitkeep +1 -0
  107. package/templates/quickstart/README.md +9 -0
  108. package/templates/quickstart/schemaTypes/index.js +1 -0
  109. package/templates/quickstart/static/.gitkeep +1 -0
  110. package/templates/shared/gitignore.txt +29 -0
  111. package/templates/shared/tsconfig.json +17 -0
  112. package/templates/shopify/README.md +85 -0
  113. package/templates/shopify/components/hotspots/ProductTooltip.tsx +38 -0
  114. package/templates/shopify/components/icons/Shopify.tsx +20 -0
  115. package/templates/shopify/components/inputs/CollectionHidden.tsx +23 -0
  116. package/templates/shopify/components/inputs/PlaceholderString.tsx +20 -0
  117. package/templates/shopify/components/inputs/ProductHidden.tsx +64 -0
  118. package/templates/shopify/components/inputs/ProductVariantHidden.tsx +24 -0
  119. package/templates/shopify/components/inputs/ProxyString.tsx +32 -0
  120. package/templates/shopify/components/media/ColorTheme.tsx +38 -0
  121. package/templates/shopify/components/media/ShopifyDocumentStatus.tsx +82 -0
  122. package/templates/shopify/components/studio/Navbar.tsx +29 -0
  123. package/templates/shopify/constants.ts +61 -0
  124. package/templates/shopify/docs/features.md +158 -0
  125. package/templates/shopify/plugins/customDocumentActions/index.ts +55 -0
  126. package/templates/shopify/plugins/customDocumentActions/shopifyDelete.tsx +144 -0
  127. package/templates/shopify/plugins/customDocumentActions/shopifyLink.ts +39 -0
  128. package/templates/shopify/plugins/customDocumentActions/types.ts +14 -0
  129. package/templates/shopify/schemaTypes/documents/collection.tsx +142 -0
  130. package/templates/shopify/schemaTypes/documents/colorTheme.tsx +44 -0
  131. package/templates/shopify/schemaTypes/documents/page.ts +70 -0
  132. package/templates/shopify/schemaTypes/documents/product.tsx +132 -0
  133. package/templates/shopify/schemaTypes/documents/productVariant.tsx +67 -0
  134. package/templates/shopify/schemaTypes/index.ts +108 -0
  135. package/templates/shopify/schemaTypes/objects/collection/collectionGroupType.ts +27 -0
  136. package/templates/shopify/schemaTypes/objects/collection/collectionLinksType.ts +16 -0
  137. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorObjectType.tsx +48 -0
  138. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorType.tsx +50 -0
  139. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeObjectType.ts +40 -0
  140. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeType.ts +49 -0
  141. package/templates/shopify/schemaTypes/objects/global/footerType.ts +22 -0
  142. package/templates/shopify/schemaTypes/objects/global/menuLinksType.ts +21 -0
  143. package/templates/shopify/schemaTypes/objects/global/menuType.ts +17 -0
  144. package/templates/shopify/schemaTypes/objects/global/notFoundPageType.ts +37 -0
  145. package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +48 -0
  146. package/templates/shopify/schemaTypes/objects/hotspot/productHotspotsType.tsx +17 -0
  147. package/templates/shopify/schemaTypes/objects/hotspot/spotType.tsx +60 -0
  148. package/templates/shopify/schemaTypes/objects/link/linkEmailType.tsx +34 -0
  149. package/templates/shopify/schemaTypes/objects/link/linkExternalType.tsx +37 -0
  150. package/templates/shopify/schemaTypes/objects/link/linkInternalType.tsx +33 -0
  151. package/templates/shopify/schemaTypes/objects/link/linkProductType.tsx +60 -0
  152. package/templates/shopify/schemaTypes/objects/module/accordionGroupType.ts +33 -0
  153. package/templates/shopify/schemaTypes/objects/module/accordionType.ts +28 -0
  154. package/templates/shopify/schemaTypes/objects/module/callToActionType.tsx +85 -0
  155. package/templates/shopify/schemaTypes/objects/module/calloutType.ts +38 -0
  156. package/templates/shopify/schemaTypes/objects/module/collectionReferenceType.tsx +47 -0
  157. package/templates/shopify/schemaTypes/objects/module/gridItemType.ts +41 -0
  158. package/templates/shopify/schemaTypes/objects/module/gridType.ts +28 -0
  159. package/templates/shopify/schemaTypes/objects/module/heroType.tsx +40 -0
  160. package/templates/shopify/schemaTypes/objects/module/imageCallToActionType.tsx +19 -0
  161. package/templates/shopify/schemaTypes/objects/module/imageFeatureType.ts +80 -0
  162. package/templates/shopify/schemaTypes/objects/module/imageFeaturesType.tsx +51 -0
  163. package/templates/shopify/schemaTypes/objects/module/instagramType.ts +35 -0
  164. package/templates/shopify/schemaTypes/objects/module/productFeaturesType.tsx +50 -0
  165. package/templates/shopify/schemaTypes/objects/module/productReferenceType.tsx +42 -0
  166. package/templates/shopify/schemaTypes/objects/seoType.ts +31 -0
  167. package/templates/shopify/schemaTypes/objects/shopify/collectionRuleType.tsx +37 -0
  168. package/templates/shopify/schemaTypes/objects/shopify/inventoryType.ts +25 -0
  169. package/templates/shopify/schemaTypes/objects/shopify/optionType.tsx +31 -0
  170. package/templates/shopify/schemaTypes/objects/shopify/placeholderStringType.ts +11 -0
  171. package/templates/shopify/schemaTypes/objects/shopify/priceRangeType.ts +20 -0
  172. package/templates/shopify/schemaTypes/objects/shopify/productWithVariantType.tsx +142 -0
  173. package/templates/shopify/schemaTypes/objects/shopify/proxyStringType.ts +12 -0
  174. package/templates/shopify/schemaTypes/objects/shopify/shopType.ts +15 -0
  175. package/templates/shopify/schemaTypes/objects/shopify/shopifyCollectionType.ts +84 -0
  176. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductType.ts +131 -0
  177. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductVariantType.ts +121 -0
  178. package/templates/shopify/schemaTypes/portableText/portableTextSimpleType.tsx +45 -0
  179. package/templates/shopify/schemaTypes/portableText/portableTextType.tsx +52 -0
  180. package/templates/shopify/schemaTypes/singletons/homeType.ts +49 -0
  181. package/templates/shopify/schemaTypes/singletons/settingsType.ts +96 -0
  182. package/templates/shopify/static/.gitkeep +1 -0
  183. package/templates/shopify/structure/collectionStructure.ts +9 -0
  184. package/templates/shopify/structure/colorThemeStructure.ts +9 -0
  185. package/templates/shopify/structure/homeStructure.ts +9 -0
  186. package/templates/shopify/structure/index.ts +57 -0
  187. package/templates/shopify/structure/pageStructure.ts +11 -0
  188. package/templates/shopify/structure/productStructure.ts +51 -0
  189. package/templates/shopify/structure/settingStructure.ts +9 -0
  190. package/templates/shopify/utils/blocksToText.ts +20 -0
  191. package/templates/shopify/utils/defineStructure.ts +11 -0
  192. package/templates/shopify/utils/getPriceRange.ts +24 -0
  193. package/templates/shopify/utils/shopifyUrls.ts +22 -0
  194. package/templates/shopify/utils/validateSlug.ts +18 -0
  195. package/templates/shopify-online-storefront/README.md +54 -0
  196. package/templates/shopify-online-storefront/components/icons/Shopify.tsx +22 -0
  197. package/templates/shopify-online-storefront/components/inputs/CollectionHidden.tsx +23 -0
  198. package/templates/shopify-online-storefront/components/inputs/PlaceholderString.tsx +25 -0
  199. package/templates/shopify-online-storefront/components/inputs/ProductHidden.tsx +66 -0
  200. package/templates/shopify-online-storefront/components/inputs/ProductVariantHidden.tsx +25 -0
  201. package/templates/shopify-online-storefront/components/inputs/ProxyString.tsx +38 -0
  202. package/templates/shopify-online-storefront/components/media/ShopifyDocumentStatus.tsx +83 -0
  203. package/templates/shopify-online-storefront/constants.ts +18 -0
  204. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/index.ts +45 -0
  205. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyDelete.tsx +144 -0
  206. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyLink.ts +39 -0
  207. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/types.ts +14 -0
  208. package/templates/shopify-online-storefront/schemaTypes/blocks/blockContent.ts +32 -0
  209. package/templates/shopify-online-storefront/schemaTypes/documents/collection.tsx +83 -0
  210. package/templates/shopify-online-storefront/schemaTypes/documents/product.tsx +102 -0
  211. package/templates/shopify-online-storefront/schemaTypes/documents/productVariant.tsx +82 -0
  212. package/templates/shopify-online-storefront/schemaTypes/index.ts +43 -0
  213. package/templates/shopify-online-storefront/schemaTypes/objects/accordion.ts +31 -0
  214. package/templates/shopify-online-storefront/schemaTypes/objects/accordionGroup.ts +35 -0
  215. package/templates/shopify-online-storefront/schemaTypes/objects/callout.ts +40 -0
  216. package/templates/shopify-online-storefront/schemaTypes/objects/inventory.ts +30 -0
  217. package/templates/shopify-online-storefront/schemaTypes/objects/option.ts +30 -0
  218. package/templates/shopify-online-storefront/schemaTypes/objects/priceRange.ts +22 -0
  219. package/templates/shopify-online-storefront/schemaTypes/objects/proxyString.ts +11 -0
  220. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollection.ts +109 -0
  221. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollectionRule.tsx +45 -0
  222. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProduct.ts +165 -0
  223. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProductVariant.ts +151 -0
  224. package/templates/shopify-online-storefront/structure/collectionStructure.ts +9 -0
  225. package/templates/shopify-online-storefront/structure/index.ts +37 -0
  226. package/templates/shopify-online-storefront/structure/productStructure.ts +35 -0
  227. package/templates/shopify-online-storefront/utils/defineStructure.ts +11 -0
  228. package/templates/shopify-online-storefront/utils/getPriceRange.ts +24 -0
  229. package/templates/shopify-online-storefront/utils/shopifyUrls.ts +22 -0
  230. package/dist/actions/build/__tests__/buildApp.test.js +0 -367
  231. package/dist/actions/build/__tests__/buildApp.test.js.map +0 -1
  232. package/dist/actions/build/__tests__/buildStudio.test.js +0 -561
  233. package/dist/actions/build/__tests__/buildStudio.test.js.map +0 -1
  234. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js +0 -233
  235. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js.map +0 -1
  236. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js +0 -414
  237. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js.map +0 -1
  238. package/dist/actions/build/__tests__/determineBasePath.test.js +0 -24
  239. package/dist/actions/build/__tests__/determineBasePath.test.js.map +0 -1
  240. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js +0 -109
  241. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js.map +0 -1
  242. package/dist/actions/build/__tests__/getViteConfig.test.js +0 -493
  243. package/dist/actions/build/__tests__/getViteConfig.test.js.map +0 -1
  244. package/dist/actions/build/__tests__/renderDocument.test.js +0 -278
  245. package/dist/actions/build/__tests__/renderDocument.test.js.map +0 -1
  246. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js +0 -153
  247. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js.map +0 -1
  248. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js +0 -657
  249. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js.map +0 -1
  250. package/dist/actions/dataset/__tests__/validateDatasetName.test.js +0 -182
  251. package/dist/actions/dataset/__tests__/validateDatasetName.test.js.map +0 -1
  252. package/dist/actions/deploy/__tests__/checkDir.test.js +0 -120
  253. package/dist/actions/deploy/__tests__/checkDir.test.js.map +0 -1
  254. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js +0 -16
  255. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js.map +0 -1
  256. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js +0 -124
  257. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js.map +0 -1
  258. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +0 -274
  259. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +0 -1
  260. package/dist/actions/media/__tests__/importMedia.test.js +0 -182
  261. package/dist/actions/media/__tests__/importMedia.test.js.map +0 -1
  262. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js +0 -174
  263. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js.map +0 -1
  264. package/dist/actions/schema/__tests__/validateAction.test.js +0 -281
  265. package/dist/actions/schema/__tests__/validateAction.test.js.map +0 -1
  266. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js +0 -27
  267. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js.map +0 -1
  268. package/dist/actions/users/__tests__/validateEmail.test.js +0 -16
  269. package/dist/actions/users/__tests__/validateEmail.test.js.map +0 -1
  270. package/dist/commands/__tests__/blueprints.test.js +0 -54
  271. package/dist/commands/__tests__/blueprints.test.js.map +0 -1
  272. package/dist/commands/__tests__/build.test.js +0 -132
  273. package/dist/commands/__tests__/build.test.js.map +0 -1
  274. package/dist/commands/__tests__/codemod.test.js +0 -271
  275. package/dist/commands/__tests__/codemod.test.js.map +0 -1
  276. package/dist/commands/__tests__/debug.test.js +0 -590
  277. package/dist/commands/__tests__/debug.test.js.map +0 -1
  278. package/dist/commands/__tests__/deploy.test.js +0 -1945
  279. package/dist/commands/__tests__/deploy.test.js.map +0 -1
  280. package/dist/commands/__tests__/dev.test.js +0 -453
  281. package/dist/commands/__tests__/dev.test.js.map +0 -1
  282. package/dist/commands/__tests__/exec.test.js +0 -207
  283. package/dist/commands/__tests__/exec.test.js.map +0 -1
  284. package/dist/commands/__tests__/init/init.authentication.test.js +0 -73
  285. package/dist/commands/__tests__/init/init.authentication.test.js.map +0 -1
  286. package/dist/commands/__tests__/init/init.create-new-project.test.js +0 -195
  287. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +0 -1
  288. package/dist/commands/__tests__/init/init.plan.test.js +0 -279
  289. package/dist/commands/__tests__/init/init.plan.test.js.map +0 -1
  290. package/dist/commands/__tests__/init/init.setup.test.js +0 -335
  291. package/dist/commands/__tests__/init/init.setup.test.js.map +0 -1
  292. package/dist/commands/__tests__/install.test.js +0 -282
  293. package/dist/commands/__tests__/install.test.js.map +0 -1
  294. package/dist/commands/__tests__/learn.test.js +0 -29
  295. package/dist/commands/__tests__/learn.test.js.map +0 -1
  296. package/dist/commands/__tests__/logout.test.js +0 -91
  297. package/dist/commands/__tests__/logout.test.js.map +0 -1
  298. package/dist/commands/__tests__/manage.test.js +0 -110
  299. package/dist/commands/__tests__/manage.test.js.map +0 -1
  300. package/dist/commands/__tests__/migration.test.js +0 -119
  301. package/dist/commands/__tests__/migration.test.js.map +0 -1
  302. package/dist/commands/__tests__/preview.test.js +0 -261
  303. package/dist/commands/__tests__/preview.test.js.map +0 -1
  304. package/dist/commands/__tests__/start.test.js +0 -253
  305. package/dist/commands/__tests__/start.test.js.map +0 -1
  306. package/dist/commands/__tests__/undeploy.test.js +0 -382
  307. package/dist/commands/__tests__/undeploy.test.js.map +0 -1
  308. package/dist/commands/__tests__/versions.test.js +0 -142
  309. package/dist/commands/__tests__/versions.test.js.map +0 -1
  310. package/dist/commands/backup/__tests__/disable.test.js +0 -204
  311. package/dist/commands/backup/__tests__/disable.test.js.map +0 -1
  312. package/dist/commands/backup/__tests__/download.test.js +0 -768
  313. package/dist/commands/backup/__tests__/download.test.js.map +0 -1
  314. package/dist/commands/backup/__tests__/enable.test.js +0 -286
  315. package/dist/commands/backup/__tests__/enable.test.js.map +0 -1
  316. package/dist/commands/backup/__tests__/list.test.js +0 -330
  317. package/dist/commands/backup/__tests__/list.test.js.map +0 -1
  318. package/dist/commands/cors/__tests__/add.test.js +0 -376
  319. package/dist/commands/cors/__tests__/add.test.js.map +0 -1
  320. package/dist/commands/cors/__tests__/delete.test.js +0 -308
  321. package/dist/commands/cors/__tests__/delete.test.js.map +0 -1
  322. package/dist/commands/cors/__tests__/list.test.js +0 -241
  323. package/dist/commands/cors/__tests__/list.test.js.map +0 -1
  324. package/dist/commands/dataset/__tests__/copy.test.js +0 -628
  325. package/dist/commands/dataset/__tests__/copy.test.js.map +0 -1
  326. package/dist/commands/dataset/__tests__/create.test.js +0 -342
  327. package/dist/commands/dataset/__tests__/create.test.js.map +0 -1
  328. package/dist/commands/dataset/__tests__/delete.test.js +0 -231
  329. package/dist/commands/dataset/__tests__/delete.test.js.map +0 -1
  330. package/dist/commands/dataset/__tests__/export.test.js +0 -601
  331. package/dist/commands/dataset/__tests__/export.test.js.map +0 -1
  332. package/dist/commands/dataset/__tests__/import.test.js +0 -53
  333. package/dist/commands/dataset/__tests__/import.test.js.map +0 -1
  334. package/dist/commands/dataset/__tests__/list.test.js +0 -216
  335. package/dist/commands/dataset/__tests__/list.test.js.map +0 -1
  336. package/dist/commands/dataset/alias/__tests__/create.test.js +0 -339
  337. package/dist/commands/dataset/alias/__tests__/create.test.js.map +0 -1
  338. package/dist/commands/dataset/alias/__tests__/delete.test.js +0 -247
  339. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +0 -1
  340. package/dist/commands/dataset/alias/__tests__/link.test.js +0 -376
  341. package/dist/commands/dataset/alias/__tests__/link.test.js.map +0 -1
  342. package/dist/commands/dataset/alias/__tests__/unlink.test.js +0 -313
  343. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +0 -1
  344. package/dist/commands/dataset/visibility/__tests__/get.test.js +0 -128
  345. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +0 -1
  346. package/dist/commands/dataset/visibility/__tests__/set.test.js +0 -198
  347. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +0 -1
  348. package/dist/commands/docs/__tests__/browse.test.js +0 -29
  349. package/dist/commands/docs/__tests__/browse.test.js.map +0 -1
  350. package/dist/commands/docs/__tests__/read.test.js +0 -78
  351. package/dist/commands/docs/__tests__/read.test.js.map +0 -1
  352. package/dist/commands/docs/__tests__/search.test.js +0 -255
  353. package/dist/commands/docs/__tests__/search.test.js.map +0 -1
  354. package/dist/commands/documents/__tests__/create.test.js +0 -1030
  355. package/dist/commands/documents/__tests__/create.test.js.map +0 -1
  356. package/dist/commands/documents/__tests__/delete.test.js +0 -300
  357. package/dist/commands/documents/__tests__/delete.test.js.map +0 -1
  358. package/dist/commands/documents/__tests__/get.test.js +0 -182
  359. package/dist/commands/documents/__tests__/get.test.js.map +0 -1
  360. package/dist/commands/documents/__tests__/query.test.js +0 -300
  361. package/dist/commands/documents/__tests__/query.test.js.map +0 -1
  362. package/dist/commands/documents/__tests__/validate.test.js +0 -249
  363. package/dist/commands/documents/__tests__/validate.test.js.map +0 -1
  364. package/dist/commands/graphql/__tests__/list.test.js +0 -240
  365. package/dist/commands/graphql/__tests__/list.test.js.map +0 -1
  366. package/dist/commands/graphql/__tests__/undeploy.test.js +0 -410
  367. package/dist/commands/graphql/__tests__/undeploy.test.js.map +0 -1
  368. package/dist/commands/hook/__tests__/attempt.test.js +0 -275
  369. package/dist/commands/hook/__tests__/attempt.test.js.map +0 -1
  370. package/dist/commands/hook/__tests__/create.test.js +0 -119
  371. package/dist/commands/hook/__tests__/create.test.js.map +0 -1
  372. package/dist/commands/hook/__tests__/delete.test.js +0 -233
  373. package/dist/commands/hook/__tests__/delete.test.js.map +0 -1
  374. package/dist/commands/hook/__tests__/list.test.js +0 -145
  375. package/dist/commands/hook/__tests__/list.test.js.map +0 -1
  376. package/dist/commands/hook/__tests__/logs.test.js +0 -798
  377. package/dist/commands/hook/__tests__/logs.test.js.map +0 -1
  378. package/dist/commands/manifest/__tests__/extract.test.js +0 -132
  379. package/dist/commands/manifest/__tests__/extract.test.js.map +0 -1
  380. package/dist/commands/mcp/__tests__/configure.test.js +0 -397
  381. package/dist/commands/mcp/__tests__/configure.test.js.map +0 -1
  382. package/dist/commands/media/__tests__/create-aspect.test.js +0 -173
  383. package/dist/commands/media/__tests__/create-aspect.test.js.map +0 -1
  384. package/dist/commands/media/__tests__/delete-aspect.test.js +0 -342
  385. package/dist/commands/media/__tests__/delete-aspect.test.js.map +0 -1
  386. package/dist/commands/media/__tests__/deploy-aspect.test.js +0 -619
  387. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +0 -1
  388. package/dist/commands/media/__tests__/export.test.js +0 -697
  389. package/dist/commands/media/__tests__/export.test.js.map +0 -1
  390. package/dist/commands/media/__tests__/import.test.js +0 -347
  391. package/dist/commands/media/__tests__/import.test.js.map +0 -1
  392. package/dist/commands/openapi/__tests__/get.test.js +0 -149
  393. package/dist/commands/openapi/__tests__/get.test.js.map +0 -1
  394. package/dist/commands/openapi/__tests__/list.test.js +0 -113
  395. package/dist/commands/openapi/__tests__/list.test.js.map +0 -1
  396. package/dist/commands/projects/__tests__/list.test.js +0 -154
  397. package/dist/commands/projects/__tests__/list.test.js.map +0 -1
  398. package/dist/commands/schema/__tests__/delete.test.js +0 -454
  399. package/dist/commands/schema/__tests__/delete.test.js.map +0 -1
  400. package/dist/commands/schema/__tests__/deploy.test.js +0 -348
  401. package/dist/commands/schema/__tests__/deploy.test.js.map +0 -1
  402. package/dist/commands/schema/__tests__/extract.test.js +0 -121
  403. package/dist/commands/schema/__tests__/extract.test.js.map +0 -1
  404. package/dist/commands/schema/__tests__/list.test.js +0 -399
  405. package/dist/commands/schema/__tests__/list.test.js.map +0 -1
  406. package/dist/commands/schema/__tests__/validate.test.js +0 -121
  407. package/dist/commands/schema/__tests__/validate.test.js.map +0 -1
  408. package/dist/commands/telemetry/__tests__/disable.test.js +0 -147
  409. package/dist/commands/telemetry/__tests__/disable.test.js.map +0 -1
  410. package/dist/commands/telemetry/__tests__/enable.test.js +0 -133
  411. package/dist/commands/telemetry/__tests__/enable.test.js.map +0 -1
  412. package/dist/commands/telemetry/__tests__/status.test.js +0 -155
  413. package/dist/commands/telemetry/__tests__/status.test.js.map +0 -1
  414. package/dist/commands/tokens/__tests__/add.test.js +0 -435
  415. package/dist/commands/tokens/__tests__/add.test.js.map +0 -1
  416. package/dist/commands/tokens/__tests__/delete.test.js +0 -405
  417. package/dist/commands/tokens/__tests__/delete.test.js.map +0 -1
  418. package/dist/commands/tokens/__tests__/list.test.js +0 -395
  419. package/dist/commands/tokens/__tests__/list.test.js.map +0 -1
  420. package/dist/commands/users/__tests__/invite.test.js +0 -362
  421. package/dist/commands/users/__tests__/invite.test.js.map +0 -1
  422. package/dist/commands/users/__tests__/list.test.js +0 -407
  423. package/dist/commands/users/__tests__/list.test.js.map +0 -1
  424. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js +0 -77
  425. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js.map +0 -1
  426. package/dist/services/__tests__/datasetAliases.test.js +0 -131
  427. package/dist/services/__tests__/datasetAliases.test.js.map +0 -1
  428. package/dist/services/__tests__/datasets.test.js +0 -436
  429. package/dist/services/__tests__/datasets.test.js.map +0 -1
  430. package/dist/services/__tests__/graphql.test.js +0 -43
  431. package/dist/services/__tests__/graphql.test.js.map +0 -1
  432. package/dist/services/__tests__/mediaLibraries.test.js +0 -88
  433. package/dist/services/__tests__/mediaLibraries.test.js.map +0 -1
  434. package/dist/services/__tests__/projects.test.js +0 -41
  435. package/dist/services/__tests__/projects.test.js.map +0 -1
  436. package/dist/services/__tests__/userApplications.test.js +0 -113
  437. package/dist/services/__tests__/userApplications.test.js.map +0 -1
  438. package/dist/util/__tests__/appId.test.js +0 -31
  439. package/dist/util/__tests__/appId.test.js.map +0 -1
  440. package/dist/util/__tests__/cliClient.test.js +0 -184
  441. package/dist/util/__tests__/cliClient.test.js.map +0 -1
  442. package/dist/util/__tests__/compareDependencyVersions.test.js +0 -426
  443. package/dist/util/__tests__/compareDependencyVersions.test.js.map +0 -1
  444. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js +0 -74
  445. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js.map +0 -1
  446. package/dist/util/__tests__/findNdjsonEntry.test.js +0 -54
  447. package/dist/util/__tests__/findNdjsonEntry.test.js.map +0 -1
  448. package/dist/util/__tests__/getCliVersion.test.js +0 -28
  449. package/dist/util/__tests__/getCliVersion.test.js.map +0 -1
  450. package/dist/util/__tests__/getLocalPackageVersion.test.js +0 -84
  451. package/dist/util/__tests__/getLocalPackageVersion.test.js.map +0 -1
  452. package/dist/util/__tests__/getWorkspace.test.js +0 -37
  453. package/dist/util/__tests__/getWorkspace.test.js.map +0 -1
  454. package/dist/util/__tests__/readPackageJson.test.js +0 -69
  455. package/dist/util/__tests__/readPackageJson.test.js.map +0 -1
  456. package/dist/util/__tests__/warnAboutMissingAppId.test.js +0 -28
  457. package/dist/util/__tests__/warnAboutMissingAppId.test.js.map +0 -1
  458. package/dist/util/packageManager/__tests__/installPackages.test.js +0 -388
  459. package/dist/util/packageManager/__tests__/installPackages.test.js.map +0 -1
  460. package/dist/util/validation/ __tests__/validateDocuments.test.js +0 -274
  461. package/dist/util/validation/ __tests__/validateDocuments.test.js.map +0 -1
@@ -0,0 +1,158 @@
1
+ # Studio features
2
+
3
+ ## Shopify friendly content schema types
4
+
5
+ This studio is built to accommodate both collections and products coming from a Shopify Store.
6
+
7
+ You can use the official [Sanity Connect app on Shopify][sanity-shopify] to sync your Shopify collection and products with your dataset. All your data will be available over APIs that you can access with [`@sanity/client`][docs-js-client] or the [HTTP API][docs-http-api].
8
+
9
+ Inside `/schemaTypes` you'll find schema definitions for all the content types. They are organized in folders:
10
+
11
+ - `/schemaTypes/annotations/`: Annotations let editors mark up inline text in the block content editor with rich objects. These can be used to augment editorial content with product information.
12
+ - `/schemaTypes/documents/`: Document types determines the shape of the JSON documents that's stored in your content lake. This is where you define the content forms for things like collections, products, product variants, as well as articles.
13
+ - `/schemaTypes/objects/`: General purpose & re-usable content structures, such as links, custom product options and modules.
14
+
15
+ ## Structure
16
+
17
+ Sanity Studio will automatically list all your [document types][docs-document-types] out of the box. Sometimes you want a more streamlined editor experience. That's why you'll find a custom [structure][docs-structure] that's defined in `/structure`. It does the following things:
18
+
19
+ - Groups product information and variants by individual products for more convenient editing
20
+ - Creates a singleton document for controlling a homepage with custom editorial modules.
21
+ - Creates a singleton document for settings to control navigation and global content
22
+ - Lists general purpose pages for other editorial content
23
+
24
+ ## Custom modules
25
+
26
+ ### Call to action
27
+
28
+ <p><img width="600" src="https://user-images.githubusercontent.com/209129/173630522-1251875d-175d-430a-bdc7-8923ebe08044.png"></p>
29
+
30
+ `/schemaTypes/objects/module/callToAction.tsx`
31
+
32
+ ### Callout
33
+
34
+ <p><img width="600"src="https://user-images.githubusercontent.com/209129/173630517-003a6942-b45e-48d4-8ec6-d87365e957c7.png"></p>
35
+
36
+ `/schemaTypes/objects/module/callout.tsx`
37
+
38
+ ### Collection
39
+
40
+ <p><img width="600" src="https://user-images.githubusercontent.com/209129/173630535-73eab084-f424-435f-b426-7fbc9baed152.png"></p>
41
+
42
+ `/schemaTypes/objects/module/collection.tsx`
43
+
44
+ ### Image
45
+
46
+ <p><img width="600" src="https://user-images.githubusercontent.com/209129/174492490-aefa1a0d-40ea-473d-be73-ba6326d66ee8.png"></p>
47
+
48
+ `/schemaTypes/objects/module/image.ts`
49
+
50
+ ### Instagram
51
+
52
+ <p><img width="600" src="https://user-images.githubusercontent.com/209129/173630524-b8b7253f-704a-4935-9b66-1c5673477b1c.png"></p>
53
+
54
+ `/schemaTypes/objects/module/instagram.ts`
55
+
56
+ ### Product
57
+
58
+ <p><img width="600" src="https://user-images.githubusercontent.com/209129/173630533-b4a202bd-6385-4eef-a7e2-c67ba596dad1.png"></p>
59
+
60
+ `/schemaTypes/objects/module/product.tsx`
61
+
62
+ ## Custom document actions
63
+
64
+ Custom document actions let you override the default behavior of the publish button. The included document actions adds to the menu that you can find by pushing the chevron right to a document's publish button.
65
+
66
+ You can find these in `/plugins/customDocumentActions/`.
67
+
68
+ Read more about [document actions][docs-document-actions].
69
+
70
+ ### Delete product and variants
71
+
72
+ <p><img width="400" src="https://user-images.githubusercontent.com/209129/173621376-66dc614d-a8ef-4d05-9e23-56806bf63a60.png"></p>
73
+
74
+ `/plugins/customDocumentActions/shopifyDelete.tsx`
75
+
76
+ Delete a product document including all its associated variants in your Sanity Content Lake. Without this document action, one would have to delete all variant documents one-by-one.
77
+
78
+ ### Edit in Shopify shortcut
79
+
80
+ <p><img width="280" src="https://user-images.githubusercontent.com/209129/173621897-cfe069e9-4719-4433-b78b-f932d079fce3.png"></p>
81
+
82
+ `/plugins/customDocumentActions/shopifyLink.ts`
83
+
84
+ A shortcut to edit the current product or product variant in Shopify in a new window. You'll need to set your Shopify admin domain in `constants.ts`.
85
+
86
+ ## Custom input and preview components
87
+
88
+ ### Placeholder string input
89
+
90
+ <p><img width="450" alt="image" src="https://user-images.githubusercontent.com/209129/173622133-30b1c1c4-f512-404b-a28f-56ce456e33c8.png"></p>
91
+
92
+ `/components/inputs/PlaceholderString.tsx`
93
+
94
+ A simple wrapper around a regular [string input](string-input) that uses the value of another field as a placeholder.
95
+
96
+ **Usage:**
97
+
98
+ ```javascript
99
+ defineField({
100
+ name: 'title',
101
+ type: 'placeholderString',
102
+ options: { field: 'store.title' }
103
+ }),
104
+ ```
105
+
106
+ ### Shopify document status (for collections, products and product variants)
107
+
108
+ <p><img width="476" src="https://user-images.githubusercontent.com/209129/141304763-8b08d0d8-93d6-4c26-bde3-224857d45468.png" /></p>
109
+
110
+ `/components/inputs/CollectionHidden.tsx`
111
+ `/components/inputs/ProductHidden.tsx`
112
+ `/components/inputs/ProductVariantHidden.tsx`
113
+
114
+ Display-only input fields that show the corresponding document's status in Shopify.
115
+
116
+ For instance, if a product has been deleted from Shopify or has its status set to `draft` or `active`.
117
+
118
+ ### Proxy string input
119
+
120
+ <p><img width="450" src="https://user-images.githubusercontent.com/209129/173626714-1e18da84-27ce-46aa-8fc6-b286797544e4.png"></p>
121
+
122
+ `/components/inputs/ProxyString.tsx`
123
+
124
+ A simple wrapper around a regular [String input field](string-input) that displays the value of another field as a read-only input.
125
+
126
+ Since we are using certain product fields from Shopify as the source of truth (such as product title, slug and preview images) and store these in a separate `store` object, these proxy string inputs are used to better surface deeply nested fields to editors.
127
+
128
+ **Usage**
129
+
130
+ ```javascript
131
+ defineField({
132
+ title: 'Slug',
133
+ name: 'slugProxy',
134
+ type: 'proxyString',
135
+ options: {field: 'store.slug.current'},
136
+ })
137
+ ```
138
+
139
+ ### Shopify document status (preview component)
140
+
141
+ <p><img width="320" alt="image 5" src="https://user-images.githubusercontent.com/209129/173627554-91c60bb4-dac7-460b-b5c6-de45d3cfa9b0.png"></p>
142
+
143
+ `/components/media/ShopifyDocumentStatus.tsx`
144
+
145
+ A custom preview component that will display collection, product and product variant images defined in `store.previewImageUrl`.
146
+
147
+ By default, Sanity Connect will populate these fields with the default image from Shopify. These images are not re-uploaded into your dataset and instead reference Shopify's CDN directly.
148
+
149
+ This preview component also has visual states for when a product is _unavailable_ in Shopify (e.g. if it has a non-active status), or if it's been removed from Shopify altogether.
150
+
151
+ Sanity Connect will never delete your collection, product and product variant documents.
152
+
153
+ [docs-structure]: https://www.sanity.io/docs/structure-builder
154
+ [docs-document-actions]: https://www.sanity.io/docs/document-actions
155
+ [docs-document-types]: https://www.sanity.io/docs/schema-types
156
+ [docs-http-api]: https://www.sanity.io/docs/http-api
157
+ [docs-js-client]: https://www.sanity.io/docs/js-client
158
+ [sanity-shopify]: https://apps.shopify.com/sanity-connect
@@ -0,0 +1,55 @@
1
+ import {
2
+ definePlugin,
3
+ DocumentActionComponent,
4
+ DocumentActionsResolver,
5
+ NewDocumentOptionsResolver,
6
+ } from 'sanity'
7
+ import shopifyDelete from './shopifyDelete'
8
+ import shopifyLink from './shopifyLink'
9
+
10
+ import {LOCKED_DOCUMENT_TYPES, SHOPIFY_DOCUMENT_TYPES} from '../../constants'
11
+
12
+ export const resolveDocumentActions: DocumentActionsResolver = (prev, {schemaType}) => {
13
+ if (LOCKED_DOCUMENT_TYPES.includes(schemaType)) {
14
+ prev = prev.filter(
15
+ (previousAction: DocumentActionComponent) =>
16
+ previousAction.action === 'publish' || previousAction.action === 'discardChanges',
17
+ )
18
+ }
19
+
20
+ if (SHOPIFY_DOCUMENT_TYPES.includes(schemaType)) {
21
+ prev = prev.filter(
22
+ (previousAction: DocumentActionComponent) =>
23
+ previousAction.action === 'publish' ||
24
+ previousAction.action === 'unpublish' ||
25
+ previousAction.action === 'discardChanges',
26
+ )
27
+
28
+ return [
29
+ ...prev,
30
+ shopifyDelete as DocumentActionComponent,
31
+ shopifyLink as DocumentActionComponent,
32
+ ]
33
+ }
34
+
35
+ return prev
36
+ }
37
+
38
+ export const resolveNewDocumentOptions: NewDocumentOptionsResolver = (prev) => {
39
+ const options = prev.filter((previousOption) => {
40
+ return (
41
+ !LOCKED_DOCUMENT_TYPES.includes(previousOption.templateId) &&
42
+ !SHOPIFY_DOCUMENT_TYPES.includes(previousOption.templateId)
43
+ )
44
+ })
45
+
46
+ return options
47
+ }
48
+
49
+ export const customDocumentActions = definePlugin({
50
+ name: 'custom-document-actions',
51
+ document: {
52
+ actions: resolveDocumentActions,
53
+ newDocumentOptions: resolveNewDocumentOptions,
54
+ },
55
+ })
@@ -0,0 +1,144 @@
1
+ import React, {useState} from 'react'
2
+ import {TrashIcon} from '@sanity/icons'
3
+ import {Stack, Text, useToast} from '@sanity/ui'
4
+ import {
5
+ type DocumentActionDescription,
6
+ type DocumentActionConfirmDialogProps,
7
+ useClient,
8
+ } from 'sanity'
9
+ import {useRouter} from 'sanity/router'
10
+ import type {ShopifyDocument, ShopifyDocumentActionProps} from './types'
11
+ import {SANITY_API_VERSION} from '../../constants'
12
+
13
+ export default (props: ShopifyDocumentActionProps): DocumentActionDescription | undefined => {
14
+ const {
15
+ draft,
16
+ type,
17
+ published,
18
+ }: {
19
+ draft: ShopifyDocument
20
+ published: ShopifyDocument
21
+ type: string
22
+ } = props
23
+
24
+ const [dialogOpen, setDialogOpen] = useState(false)
25
+
26
+ const router = useRouter()
27
+ const toast = useToast()
28
+ const client = useClient({apiVersion: SANITY_API_VERSION})
29
+
30
+ let dialog: DocumentActionConfirmDialogProps | null = null
31
+
32
+ if (type === 'product') {
33
+ dialog = {
34
+ message: (
35
+ <Stack space={4}>
36
+ <Text>Delete the current product and all associated variants in your dataset.</Text>
37
+ <Text weight="medium">No content on Shopify will be deleted.</Text>
38
+ </Stack>
39
+ ),
40
+ onCancel: () => setDialogOpen(false),
41
+ onConfirm: async () => {
42
+ const productId = published?.store?.id
43
+
44
+ // Find product variant documents with matching Shopify Product ID
45
+ let productVariantIds: string[] = []
46
+ if (productId) {
47
+ productVariantIds = await client.fetch(
48
+ `*[
49
+ _type == "productVariant"
50
+ && store.productId == $productId
51
+ ]._id`,
52
+ {productId},
53
+ )
54
+ }
55
+
56
+ // Delete current document (including draft)
57
+ const transaction = client.transaction()
58
+ if (published?._id) {
59
+ transaction.delete(published._id)
60
+ }
61
+ if (draft?._id) {
62
+ transaction.delete(draft._id)
63
+ }
64
+
65
+ // Delete all product variants with matching IDs
66
+ productVariantIds?.forEach((documentId) => {
67
+ if (documentId) {
68
+ transaction.delete(documentId)
69
+ transaction.delete(`drafts.${documentId}`)
70
+ }
71
+ })
72
+
73
+ try {
74
+ await transaction.commit()
75
+ // Navigate back to products root
76
+ router.navigateUrl({path: '/structure/products'})
77
+ } catch (err) {
78
+ let message = 'Unknown Error'
79
+ if (err instanceof Error) message = err.message
80
+
81
+ toast.push({
82
+ status: 'error',
83
+ title: message,
84
+ })
85
+ } finally {
86
+ setDialogOpen(false)
87
+ }
88
+ },
89
+ type: 'confirm',
90
+ }
91
+ }
92
+
93
+ if (type === 'collection') {
94
+ dialog = {
95
+ message: (
96
+ <Stack space={4}>
97
+ <Text>Delete the current collection in your dataset.</Text>
98
+ <Text weight="medium">No content on Shopify will be deleted.</Text>
99
+ </Stack>
100
+ ),
101
+ onCancel: () => setDialogOpen(false),
102
+ onConfirm: async () => {
103
+ // Delete current document (including draft)
104
+ const transaction = client.transaction()
105
+ if (published?._id) {
106
+ transaction.delete(published._id)
107
+ }
108
+ if (draft?._id) {
109
+ transaction.delete(draft._id)
110
+ }
111
+
112
+ try {
113
+ await transaction.commit()
114
+ // Navigate back to collections root
115
+ router.navigateUrl({path: '/structure/collections'})
116
+ } catch (err) {
117
+ let message = 'Unknown Error'
118
+ if (err instanceof Error) message = err.message
119
+
120
+ toast.push({
121
+ status: 'error',
122
+ title: message,
123
+ })
124
+ } finally {
125
+ setDialogOpen(false)
126
+ }
127
+ },
128
+ type: 'confirm',
129
+ }
130
+ }
131
+
132
+ if (!dialog) {
133
+ return
134
+ }
135
+
136
+ return {
137
+ tone: 'critical',
138
+ dialog: dialogOpen && dialog,
139
+ icon: TrashIcon,
140
+ label: 'Delete',
141
+ onHandle: () => setDialogOpen(true),
142
+ shortcut: 'Ctrl+Alt+D',
143
+ }
144
+ }
@@ -0,0 +1,39 @@
1
+ import {EarthGlobeIcon} from '@sanity/icons'
2
+ import {collectionUrl, productUrl, productVariantUrl} from '../../utils/shopifyUrls'
3
+ import {type DocumentActionDescription} from 'sanity'
4
+ import type {ShopifyDocument, ShopifyDocumentActionProps} from './types'
5
+
6
+ export default (props: ShopifyDocumentActionProps): DocumentActionDescription | undefined => {
7
+ const {published, type}: {published: ShopifyDocument; type: string} = props
8
+
9
+ if (!published || published?.store?.isDeleted) {
10
+ return
11
+ }
12
+
13
+ let url: string | null = null
14
+
15
+ if (type === 'collection') {
16
+ url = collectionUrl(published?.store?.id)
17
+ }
18
+ if (type === 'product') {
19
+ url = productUrl(published?.store?.id)
20
+ }
21
+ if (type === 'productVariant') {
22
+ url = productVariantUrl(published?.store?.productId, published?.store?.id)
23
+ }
24
+
25
+ if (!url) {
26
+ return
27
+ }
28
+
29
+ if (published && !published?.store?.isDeleted) {
30
+ return {
31
+ label: 'Edit in Shopify',
32
+ icon: EarthGlobeIcon,
33
+ onHandle: () => {
34
+ url ? window.open(url) : void 'No URL'
35
+ },
36
+ shortcut: 'Ctrl+Alt+E',
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,14 @@
1
+ import {type DocumentActionProps, type DocumentActionDescription, type SanityDocument} from 'sanity'
2
+
3
+ export type ShopifyDocument = SanityDocument & {
4
+ store: {
5
+ id: number
6
+ productId: number
7
+ isDeleted: boolean
8
+ }
9
+ }
10
+
11
+ export interface ShopifyDocumentActionProps extends DocumentActionProps {
12
+ published: ShopifyDocument
13
+ draft: ShopifyDocument
14
+ }
@@ -0,0 +1,142 @@
1
+ import {defineArrayMember, defineField, defineType} from 'sanity'
2
+ import {PackageIcon} from '@sanity/icons'
3
+ import {getExtension} from '@sanity/asset-utils'
4
+ import pluralize from 'pluralize-esm'
5
+ import CollectionHiddenInput from '../../components/inputs/CollectionHidden'
6
+ import ShopifyDocumentStatus from '../../components/media/ShopifyDocumentStatus'
7
+ import {GROUPS} from '../../constants'
8
+
9
+ export const collectionType = defineType({
10
+ name: 'collection',
11
+ title: 'Collection',
12
+ type: 'document',
13
+ icon: PackageIcon,
14
+ groups: GROUPS,
15
+ fields: [
16
+ defineField({
17
+ name: 'hidden',
18
+ type: 'string',
19
+ components: {
20
+ field: CollectionHiddenInput,
21
+ },
22
+ hidden: ({parent}) => {
23
+ const isDeleted = parent?.store?.isDeleted
24
+ return !isDeleted
25
+ },
26
+ }),
27
+ defineField({
28
+ name: 'titleProxy',
29
+ title: 'Title',
30
+ type: 'proxyString',
31
+ options: {field: 'store.title'},
32
+ }),
33
+ defineField({
34
+ name: 'slugProxy',
35
+ title: 'Slug',
36
+ type: 'proxyString',
37
+ options: {field: 'store.slug.current'},
38
+ }),
39
+ defineField({
40
+ name: 'colorTheme',
41
+ type: 'reference',
42
+ to: [{type: 'colorTheme'}],
43
+ group: 'theme',
44
+ }),
45
+ defineField({
46
+ name: 'vector',
47
+ title: 'Vector artwork',
48
+ type: 'image',
49
+ description: 'Displayed in collection links using color theme',
50
+ options: {
51
+ accept: 'image/svg+xml',
52
+ },
53
+ group: 'theme',
54
+ validation: (Rule) =>
55
+ Rule.custom((image) => {
56
+ if (!image?.asset?._ref) {
57
+ return true
58
+ }
59
+
60
+ const format = getExtension(image.asset._ref)
61
+
62
+ if (format !== 'svg') {
63
+ return 'Image must be an SVG'
64
+ }
65
+ return true
66
+ }),
67
+ }),
68
+ defineField({
69
+ name: 'showHero',
70
+ type: 'boolean',
71
+ description: 'If disabled, page title will be displayed instead',
72
+ group: 'editorial',
73
+ }),
74
+ defineField({
75
+ name: 'hero',
76
+ type: 'hero',
77
+ hidden: ({document}) => !document?.showHero,
78
+ group: 'editorial',
79
+ }),
80
+ defineField({
81
+ name: 'modules',
82
+ type: 'array',
83
+ description: 'Editorial modules to associate with this collection',
84
+ of: [
85
+ defineArrayMember({type: 'callout'}),
86
+ defineArrayMember({type: 'callToAction'}),
87
+ defineArrayMember({type: 'image'}),
88
+ defineArrayMember({type: 'instagram'}),
89
+ ],
90
+ group: 'editorial',
91
+ }),
92
+ defineField({
93
+ name: 'store',
94
+ title: 'Shopify',
95
+ type: 'shopifyCollection',
96
+ description: 'Collection data from Shopify (read-only)',
97
+ group: 'shopifySync',
98
+ }),
99
+ defineField({
100
+ name: 'seo',
101
+ title: 'SEO',
102
+ type: 'seo',
103
+ group: 'seo',
104
+ }),
105
+ ],
106
+ orderings: [
107
+ {
108
+ name: 'titleAsc',
109
+ title: 'Title (A-Z)',
110
+ by: [{field: 'store.title', direction: 'asc'}],
111
+ },
112
+ {
113
+ name: 'titleDesc',
114
+ title: 'Title (Z-A)',
115
+ by: [{field: 'store.title', direction: 'desc'}],
116
+ },
117
+ ],
118
+ preview: {
119
+ select: {
120
+ imageUrl: 'store.imageUrl',
121
+ isDeleted: 'store.isDeleted',
122
+ rules: 'store.rules',
123
+ title: 'store.title',
124
+ },
125
+ prepare({imageUrl, isDeleted, rules, title}) {
126
+ const ruleCount = rules?.length || 0
127
+
128
+ return {
129
+ media: (
130
+ <ShopifyDocumentStatus
131
+ isDeleted={isDeleted}
132
+ type="collection"
133
+ url={imageUrl}
134
+ title={title}
135
+ />
136
+ ),
137
+ subtitle: ruleCount > 0 ? `Automated (${pluralize('rule', ruleCount, true)})` : 'Manual',
138
+ title,
139
+ }
140
+ },
141
+ },
142
+ })
@@ -0,0 +1,44 @@
1
+ import {IceCreamIcon} from '@sanity/icons'
2
+ import {defineField, defineType} from 'sanity'
3
+
4
+ import ColorTheme from '../../components/media/ColorTheme'
5
+
6
+ export const colorThemeType = defineType({
7
+ name: 'colorTheme',
8
+ title: 'Color theme',
9
+ type: 'document',
10
+ icon: IceCreamIcon,
11
+ fields: [
12
+ defineField({
13
+ name: 'title',
14
+ type: 'string',
15
+ validation: (Rule) => Rule.required(),
16
+ }),
17
+ defineField({
18
+ name: 'text',
19
+ type: 'color',
20
+ options: {disableAlpha: true},
21
+ validation: (Rule) => Rule.required(),
22
+ }),
23
+ defineField({
24
+ name: 'background',
25
+ type: 'color',
26
+ options: {disableAlpha: true},
27
+ validation: (Rule) => Rule.required(),
28
+ }),
29
+ ],
30
+ preview: {
31
+ select: {
32
+ backgroundColor: 'background.hex',
33
+ textColor: 'text.hex',
34
+ title: 'title',
35
+ },
36
+ prepare({backgroundColor, textColor, title}) {
37
+ return {
38
+ media: <ColorTheme background={backgroundColor} text={textColor} />,
39
+ subtitle: `${textColor || '(No color)'} / ${backgroundColor || '(No color)'}`,
40
+ title,
41
+ }
42
+ },
43
+ },
44
+ })
@@ -0,0 +1,70 @@
1
+ import {DocumentIcon} from '@sanity/icons'
2
+ import {defineField} from 'sanity'
3
+
4
+ import {validateSlug} from '../../utils/validateSlug'
5
+ import {GROUPS} from '../../constants'
6
+
7
+ export const pageType = defineField({
8
+ name: 'page',
9
+ title: 'Page',
10
+ type: 'document',
11
+ icon: DocumentIcon,
12
+ groups: GROUPS,
13
+ fields: [
14
+ defineField({
15
+ name: 'title',
16
+ group: 'editorial',
17
+ type: 'string',
18
+ validation: (Rule) => Rule.required(),
19
+ }),
20
+ defineField({
21
+ name: 'slug',
22
+ group: 'editorial',
23
+ type: 'slug',
24
+ options: {source: 'title'},
25
+ validation: validateSlug,
26
+ }),
27
+ defineField({
28
+ name: 'colorTheme',
29
+ type: 'reference',
30
+ to: [{type: 'colorTheme'}],
31
+ group: 'theme',
32
+ }),
33
+ defineField({
34
+ name: 'showHero',
35
+ type: 'boolean',
36
+ description: 'If disabled, page title will be displayed instead',
37
+ initialValue: false,
38
+ group: 'editorial',
39
+ }),
40
+ defineField({
41
+ name: 'hero',
42
+ type: 'hero',
43
+ hidden: ({document}) => !document?.showHero,
44
+ group: 'editorial',
45
+ }),
46
+ defineField({
47
+ name: 'body',
48
+ type: 'portableText',
49
+ group: 'editorial',
50
+ }),
51
+ defineField({
52
+ name: 'seo',
53
+ title: 'SEO',
54
+ type: 'seo',
55
+ group: 'seo',
56
+ }),
57
+ ],
58
+ preview: {
59
+ select: {
60
+ seoImage: 'seo.image',
61
+ title: 'title',
62
+ },
63
+ prepare({seoImage, title}) {
64
+ return {
65
+ media: seoImage ?? DocumentIcon,
66
+ title,
67
+ }
68
+ },
69
+ },
70
+ })