@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,24 @@
1
+ import {DEFAULT_CURRENCY_CODE} from '../constants'
2
+
3
+ type PriceObject = {
4
+ minVariantPrice: number
5
+ maxVariantPrice: number
6
+ }
7
+
8
+ const formatNumber = (val: number) => {
9
+ return new Intl.NumberFormat('en', {
10
+ currency: DEFAULT_CURRENCY_CODE,
11
+ style: 'currency',
12
+ }).format(val)
13
+ }
14
+
15
+ export const getPriceRange = (price: PriceObject) => {
16
+ if (!price || typeof price?.minVariantPrice === 'undefined') {
17
+ return 'No price found'
18
+ }
19
+ if (price.maxVariantPrice && price.minVariantPrice !== price.maxVariantPrice) {
20
+ return `${formatNumber(price.minVariantPrice)} – ${formatNumber(price.maxVariantPrice)}`
21
+ }
22
+
23
+ return formatNumber(price.minVariantPrice)
24
+ }
@@ -0,0 +1,22 @@
1
+ import {SHOPIFY_STORE_ID} from '../constants'
2
+
3
+ export const collectionUrl = (collectionId: number) => {
4
+ if (!SHOPIFY_STORE_ID) {
5
+ return null
6
+ }
7
+ return `https://admin.shopify.com/store/${SHOPIFY_STORE_ID}/collections/${collectionId}`
8
+ }
9
+
10
+ export const productUrl = (productId: number) => {
11
+ if (!SHOPIFY_STORE_ID) {
12
+ return null
13
+ }
14
+ return `https://admin.shopify.com/store/${SHOPIFY_STORE_ID}/products/${productId}`
15
+ }
16
+
17
+ export const productVariantUrl = (productId: number, productVariantId: number) => {
18
+ if (!SHOPIFY_STORE_ID) {
19
+ return null
20
+ }
21
+ return `https://admin.shopify.com/store/${SHOPIFY_STORE_ID}/products/${productId}/variants/${productVariantId}`
22
+ }
@@ -0,0 +1,18 @@
1
+ import {SlugRule} from 'sanity'
2
+
3
+ const MAX_LENGTH = 96
4
+
5
+ export const validateSlug = (Rule: SlugRule) => {
6
+ return Rule.required().custom((value) => {
7
+ const currentSlug = value && value.current
8
+ if (!currentSlug) {
9
+ return true
10
+ }
11
+
12
+ if (currentSlug.length >= MAX_LENGTH) {
13
+ return `Must be less than ${MAX_LENGTH} characters`
14
+ }
15
+
16
+ return true
17
+ })
18
+ }
@@ -0,0 +1,54 @@
1
+ # Sanity Studio for Shopify Storefronts
2
+
3
+ ## About
4
+
5
+ This Sanity Studio is configured for Shopify storefronts that use the official [Sanity Connect app](https://apps.shopify.com/sanity-connect) to sync content from Sanity to Shopify.
6
+
7
+ It contains examples of customizing your [structure](https://www.sanity.io/docs/structure-builder), [document actions](https://www.sanity.io/docs/document-actions) and [input components](https://www.sanity.io/docs/custom-input-widgets).
8
+
9
+ If you're building a headless storefront, you may want to check out our [starter Studio for headless storefronts](https://github.com/sanity-io/sanity-shopify-studio), which has a richer content model.
10
+
11
+ ## Features
12
+
13
+ This studio comes preconfigured with Shopify-friendly content schema types and a whole host of customizations to make managing Shopify data in your Sanity studio easier. It also comes bundled with our [Shopify asset plugin](https://github.com/sanity-io/sanity-plugin-shopify-assets), which enables you to choose assets from your Shopify store in your Sanity Studio.
14
+
15
+ Once you have sync'd content to your Shopify store, you can follow our documentation on how to [display content in Liquid](https://www.sanity.io/docs/displaying-sanity-content-in-liquid).
16
+
17
+ ## Setup
18
+
19
+ If you're reading this on GitHub, chances are you haven't initialized the studio locally yet. To do so, run the following shell command:
20
+
21
+ ```sh
22
+ # run a one-off initializing script:
23
+ npx @sanity/cli init --template shopify-online-storefront
24
+ ```
25
+
26
+ Make sure to run the tagged release! (`@sanity/cli`)
27
+
28
+ You'll need install [Sanity Connect](https://apps.shopify.com/sanity-connect) to your Shopify store, and [enable the sync to your Shopify store](https://www.sanity.io/docs/sanity-connect-for-shopify#1bcb10c66c21). to update `SHOPIFY_STORE_ID` in `constants.ts` to reflect your Shopify domain.
29
+
30
+ ## Local Development
31
+
32
+ ### Starting development server
33
+
34
+ ```sh
35
+ npm run dev
36
+ ```
37
+
38
+ ### Deploying the studio
39
+
40
+ ```sh
41
+ npm run deploy
42
+ ```
43
+
44
+ ### Upgrading Sanity Studio
45
+
46
+ ```sh
47
+ npm run upgrade
48
+ ```
49
+
50
+ If you have the [Sanity CLI](https://www.sanity.io/docs/cli) installed, you can also run this with `sanity start|deploy|upgrade`. It comes with additional useful functionality.
51
+
52
+ ## License
53
+
54
+ This repository is published under the [MIT](license) license.
@@ -0,0 +1,22 @@
1
+ import React from 'react'
2
+
3
+ const ShopifyIcon = () => {
4
+ return (
5
+ <svg width="18" height="20" viewBox="0 0 18 20" fill="none" xmlns="http://www.w3.org/2000/svg">
6
+ <path
7
+ d="M15.3269 3.85113C15.3132 3.75015 15.2258 3.69411 15.1531 3.688C15.081 3.6819 13.6693 3.66026 13.6693 3.66026C13.6693 3.66026 12.4887 2.50392 12.3722 2.38628C12.2555 2.26865 12.0277 2.30417 11.9392 2.3308C11.9381 2.33135 11.7175 2.40016 11.3461 2.51612C11.2839 2.31304 11.1927 2.06335 11.0622 1.81255C10.6419 1.00356 10.0263 0.575752 9.2825 0.574642C9.28142 0.574642 9.28092 0.574642 9.27975 0.574642C9.22808 0.574642 9.17692 0.579636 9.12517 0.584074C9.10317 0.557441 9.08117 0.531362 9.05808 0.505838C8.73408 0.156272 8.31869 -0.0140727 7.82082 0.000908712C6.86027 0.0286521 5.90357 0.72834 5.12787 1.97124C4.58212 2.84572 4.16677 3.94435 4.04904 4.79497C2.94601 5.13953 2.17471 5.38035 2.15766 5.3859C1.60091 5.56235 1.58331 5.57955 1.51069 6.10889C1.45677 6.50895 0 17.8704 0 17.8704L12.2082 20L17.4994 18.6733C17.4994 18.6733 15.3407 3.95212 15.3269 3.85113ZM10.7349 2.707C10.4537 2.79467 10.1342 2.89454 9.78758 3.00274C9.78042 2.51224 9.72267 1.82975 9.496 1.23992C10.2249 1.3792 10.5836 2.21095 10.7349 2.707ZM9.14883 3.20249C8.509 3.40225 7.81091 3.62031 7.11058 3.83892C7.30753 3.0782 7.68107 2.32081 8.13989 1.8242C8.31044 1.63943 8.54917 1.43358 8.832 1.31594C9.09767 1.87525 9.15542 2.66705 9.14883 3.20249ZM7.84007 0.645665C8.06562 0.640671 8.25542 0.690609 8.41775 0.798253C8.15805 0.9342 7.90718 1.12951 7.67172 1.38419C7.06162 2.04448 6.594 3.06932 6.4075 4.0581C5.826 4.23954 5.25715 4.41766 4.73342 4.58078C5.06405 3.02438 6.35743 0.688944 7.84007 0.645665Z"
8
+ fill="#95BF47"
9
+ />
10
+ <path
11
+ d="M9.276 6.43238L8.66142 8.75117C8.66142 8.75117 7.97598 8.43658 7.16342 8.48817C5.97181 8.56417 5.95916 9.32217 5.97126 9.51242C6.03618 10.5495 8.74125 10.7759 8.89308 13.2051C9.01242 15.1161 7.88796 16.4233 6.26779 16.5265C4.32303 16.6502 3.25246 15.4933 3.25246 15.4933L3.66452 13.7256C3.66452 13.7256 4.74224 14.5457 5.60487 14.4907C6.16821 14.4547 6.36957 13.9924 6.34921 13.6657C6.26448 12.3128 4.06172 12.3927 3.92253 10.17C3.80536 8.29951 5.02337 6.40408 7.71081 6.23318C8.74617 6.16604 9.276 6.43238 9.276 6.43238Z"
12
+ fill="white"
13
+ />
14
+ <path
15
+ d="M15.1536 3.68853C15.0815 3.68243 13.6698 3.66078 13.6698 3.66078C13.6698 3.66078 12.4893 2.50444 12.3726 2.38681C12.3292 2.34298 12.2703 2.32023 12.2087 2.31079L12.2093 19.9994L17.4999 18.6733C17.4999 18.6733 15.3412 3.95264 15.3274 3.85166C15.3137 3.75068 15.2257 3.69463 15.1536 3.68853Z"
16
+ fill="#5E8E3E"
17
+ />
18
+ </svg>
19
+ )
20
+ }
21
+
22
+ export default ShopifyIcon
@@ -0,0 +1,23 @@
1
+ import React from 'react'
2
+ import {WarningOutlineIcon} from '@sanity/icons'
3
+ import {Box, Card, Flex, Stack, Text} from '@sanity/ui'
4
+
5
+ export default function CollectionHiddenInput() {
6
+ return (
7
+ <Card padding={4} radius={2} shadow={1} tone="critical">
8
+ <Flex align="flex-start">
9
+ <Text>
10
+ <WarningOutlineIcon />
11
+ </Text>
12
+ <Box flex={1} marginLeft={3}>
13
+ <Box>
14
+ <Text weight="semibold">This collection is hidden</Text>
15
+ </Box>
16
+ <Stack marginTop={4} space={2}>
17
+ <Text size={1}>It has been deleted from Shopify.</Text>
18
+ </Stack>
19
+ </Box>
20
+ </Flex>
21
+ </Card>
22
+ )
23
+ }
@@ -0,0 +1,25 @@
1
+ import {
2
+ type SanityDocument,
3
+ type StringInputProps,
4
+ type StringSchemaType,
5
+ useFormValue,
6
+ } from 'sanity'
7
+ import get from 'lodash.get'
8
+
9
+ type Props = StringInputProps<StringSchemaType & {options?: {field?: string}}>
10
+
11
+ const PlaceholderStringInput = (props: Props) => {
12
+ const {schemaType} = props
13
+
14
+ const path = schemaType?.options?.field
15
+ const doc = useFormValue([]) as SanityDocument
16
+
17
+ const proxyValue = path ? (get(doc, path) as string) : ''
18
+
19
+ return props.renderDefault({
20
+ ...props,
21
+ elementProps: {placeholder: proxyValue, ...props.elementProps},
22
+ })
23
+ }
24
+
25
+ export default PlaceholderStringInput
@@ -0,0 +1,66 @@
1
+ import React from 'react'
2
+ import {WarningOutlineIcon} from '@sanity/icons'
3
+ import {type StringFieldProps, useFormValue} from 'sanity'
4
+ import {Box, Card, Flex, Stack, Text} from '@sanity/ui'
5
+
6
+ import {productUrl} from '../../utils/shopifyUrls'
7
+
8
+ type Store = {
9
+ id: number
10
+ status: string
11
+ isDeleted: boolean
12
+ }
13
+
14
+ export default function ProductHiddenInput(props: StringFieldProps) {
15
+ const store: Store = useFormValue(['store']) as Store
16
+
17
+ if (!store) {
18
+ return <></>
19
+ }
20
+
21
+ const shopifyProductUrl = productUrl(store?.id)
22
+ const isActive = store?.status === 'active'
23
+ const isDeleted = store?.isDeleted
24
+
25
+ let message
26
+ if (!isActive) {
27
+ message = (
28
+ <>
29
+ It does not have an <code>active</code> status in Shopify.
30
+ </>
31
+ )
32
+ }
33
+ if (isDeleted) {
34
+ message = 'It has been deleted from Shopify.'
35
+ }
36
+
37
+ return (
38
+ <Card padding={4} radius={2} shadow={1} tone="critical">
39
+ <Flex align="flex-start">
40
+ <Text size={2}>
41
+ <WarningOutlineIcon />
42
+ </Text>
43
+ <Box flex={1} marginLeft={3}>
44
+ <Box>
45
+ <Text size={2} weight="semibold">
46
+ This product is hidden
47
+ </Text>
48
+ </Box>
49
+ <Stack marginTop={4} space={2}>
50
+ <Text size={1}>{message}</Text>
51
+ </Stack>
52
+ {!isDeleted && shopifyProductUrl && (
53
+ <Box marginTop={4}>
54
+ <Text size={1}>
55
+ →{' '}
56
+ <a href={shopifyProductUrl} target="_blank" rel="noreferrer">
57
+ View this product on Shopify
58
+ </a>
59
+ </Text>
60
+ </Box>
61
+ )}
62
+ </Box>
63
+ </Flex>
64
+ </Card>
65
+ )
66
+ }
@@ -0,0 +1,25 @@
1
+ import React from 'react'
2
+ import {WarningOutlineIcon} from '@sanity/icons'
3
+ import {Box, Card, Flex, Stack, Text} from '@sanity/ui'
4
+
5
+ export default function ProductVariantHiddenInput() {
6
+ return (
7
+ <Card padding={4} radius={2} shadow={1} tone="critical">
8
+ <Flex align="flex-start">
9
+ <Text size={2}>
10
+ <WarningOutlineIcon />
11
+ </Text>
12
+ <Box flex={1} marginLeft={3}>
13
+ <Box>
14
+ <Text size={2} weight="semibold">
15
+ This variant is hidden
16
+ </Text>
17
+ </Box>
18
+ <Stack marginTop={4} space={2}>
19
+ <Text size={1}>It has been deleted from Shopify</Text>
20
+ </Stack>
21
+ </Box>
22
+ </Flex>
23
+ </Card>
24
+ )
25
+ }
@@ -0,0 +1,38 @@
1
+ import React from 'react'
2
+ import {LockIcon} from '@sanity/icons'
3
+ import {Box, Text, TextInput, Tooltip} from '@sanity/ui'
4
+ import {
5
+ type SanityDocument,
6
+ type StringInputProps,
7
+ type StringSchemaType,
8
+ useFormValue,
9
+ } from 'sanity'
10
+ import get from 'lodash.get'
11
+
12
+ type Props = StringInputProps<StringSchemaType & {options?: {field?: string}}>
13
+
14
+ const ProxyString = (props: Props) => {
15
+ const {schemaType} = props
16
+
17
+ const path = schemaType?.options?.field
18
+ const doc = useFormValue([]) as SanityDocument
19
+
20
+ const proxyValue = path ? (get(doc, path) as string) : ''
21
+
22
+ return (
23
+ <Tooltip
24
+ content={
25
+ <Box padding={2}>
26
+ <Text muted size={1}>
27
+ This value is set in Shopify (<code>{path}</code>)
28
+ </Text>
29
+ </Box>
30
+ }
31
+ portal
32
+ >
33
+ <TextInput iconRight={LockIcon} readOnly={true} value={proxyValue} />
34
+ </Tooltip>
35
+ )
36
+ }
37
+
38
+ export default ProxyString
@@ -0,0 +1,83 @@
1
+ import React from 'react'
2
+ import {CloseIcon, ImageIcon, LinkRemovedIcon} from '@sanity/icons'
3
+ import {forwardRef, useState} from 'react'
4
+
5
+ type Props = {
6
+ isActive?: boolean
7
+ isDeleted: boolean
8
+ type: 'collection' | 'product' | 'productVariant'
9
+ url: string
10
+ title: string
11
+ }
12
+
13
+ const ShopifyDocumentStatus = forwardRef<HTMLDivElement, Props>((props, ref) => {
14
+ const {isActive, isDeleted, title, type, url} = props
15
+
16
+ const [imageVisible, setImageVisible] = useState(true)
17
+
18
+ // Hide image on error / 404
19
+ const handleImageError = () => setImageVisible(false)
20
+
21
+ return (
22
+ <div
23
+ ref={ref}
24
+ style={{
25
+ alignItems: 'center',
26
+ borderRadius: 'inherit',
27
+ display: 'flex',
28
+ height: '100%',
29
+ justifyContent: 'center',
30
+ overflow: 'hidden',
31
+ width: '100%',
32
+ }}
33
+ >
34
+ {imageVisible && url ? (
35
+ <img
36
+ onError={handleImageError}
37
+ src={`${url}&width=400`}
38
+ style={{
39
+ height: '100%',
40
+ left: 0,
41
+ objectFit: 'contain',
42
+ position: 'absolute',
43
+ top: 0,
44
+ width: '100%',
45
+ }}
46
+ alt={`${title} preview`}
47
+ />
48
+ ) : (
49
+ <ImageIcon style={{position: 'absolute'}} />
50
+ )}
51
+
52
+ {/* Item has been deleted */}
53
+ {isDeleted ? (
54
+ <CloseIcon
55
+ style={{
56
+ background: 'rgba(255, 0, 0, 0.7)',
57
+ color: 'rgba(255, 255, 255, 0.85)',
58
+ height: '100%',
59
+ position: 'relative',
60
+ width: '100%',
61
+ }}
62
+ />
63
+ ) : (
64
+ <>
65
+ {/* Products only: item is no longer active */}
66
+ {type === 'product' && !isActive && (
67
+ <LinkRemovedIcon
68
+ style={{
69
+ background: 'rgba(0, 0, 0, 0.7)',
70
+ color: 'rgba(255, 255, 255, 0.85)',
71
+ height: '100%',
72
+ position: 'relative',
73
+ width: '100%',
74
+ }}
75
+ />
76
+ )}
77
+ </>
78
+ )}
79
+ </div>
80
+ )
81
+ })
82
+
83
+ export default ShopifyDocumentStatus
@@ -0,0 +1,18 @@
1
+ // Currency code (ISO 4217) to use when displaying prices in the studio
2
+ // https://en.wikipedia.org/wiki/ISO_4217
3
+ export const DEFAULT_CURRENCY_CODE = 'USD'
4
+
5
+ // Document types which:
6
+ // - cannot be created in the 'new document' menu
7
+ // - cannot be duplicated, unpublished or deleted
8
+ // - are from the Sanity Connect Shopify app - and can be linked to on Shopify
9
+ export const SHOPIFY_DOCUMENT_TYPES = ['product', 'productVariant', 'collection']
10
+
11
+ // API version to use when using the Sanity client within the studio
12
+ // https://www.sanity.io/help/studio-client-specify-api-version
13
+ export const SANITY_API_VERSION = '2023-02-07'
14
+
15
+ // Your Shopify store ID.
16
+ // This is your unique store URL (e.g. 'my-store-name.myshopify.com').
17
+ // Set this to enable helper links in document status banners and shortcut links on products and collections.
18
+ export const SHOPIFY_STORE_ID = '*.myshopify.com'
@@ -0,0 +1,45 @@
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 {SHOPIFY_DOCUMENT_TYPES} from '../../constants'
11
+
12
+ export const resolveDocumentActions: DocumentActionsResolver = (prev, {schemaType}) => {
13
+ if (SHOPIFY_DOCUMENT_TYPES.includes(schemaType)) {
14
+ prev = prev.filter(
15
+ (previousAction: DocumentActionComponent) =>
16
+ previousAction.action === 'publish' ||
17
+ previousAction.action === 'unpublish' ||
18
+ previousAction.action === 'discardChanges',
19
+ )
20
+
21
+ return [
22
+ ...prev,
23
+ shopifyDelete as DocumentActionComponent,
24
+ shopifyLink as DocumentActionComponent,
25
+ ]
26
+ }
27
+
28
+ return prev
29
+ }
30
+
31
+ export const resolveNewDocumentOptions: NewDocumentOptionsResolver = (prev) => {
32
+ const options = prev.filter((previousOption) => {
33
+ return !SHOPIFY_DOCUMENT_TYPES.includes(previousOption.templateId)
34
+ })
35
+
36
+ return options
37
+ }
38
+
39
+ export const shopifyDocumentActions = definePlugin({
40
+ name: 'custom-document-actions',
41
+ document: {
42
+ actions: resolveDocumentActions,
43
+ newDocumentOptions: resolveNewDocumentOptions,
44
+ },
45
+ })
@@ -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 {type DocumentActionDescription} from 'sanity'
3
+ import {collectionUrl, productUrl, productVariantUrl} from '../../utils/shopifyUrls'
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 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
+ }