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

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 (527) hide show
  1. package/README.md +2907 -109
  2. package/dist/actions/dataset/create.d.ts +49 -0
  3. package/dist/actions/dataset/create.js +48 -0
  4. package/dist/actions/dataset/create.js.map +1 -0
  5. package/dist/actions/dataset/determineDatasetAclMode.d.ts +37 -0
  6. package/dist/actions/dataset/determineDatasetAclMode.js +36 -0
  7. package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -0
  8. package/dist/actions/debug/gatherDebugInfo.js +15 -21
  9. package/dist/actions/debug/gatherDebugInfo.js.map +1 -1
  10. package/dist/actions/debug/types.d.ts +0 -2
  11. package/dist/actions/debug/types.js.map +1 -1
  12. package/dist/actions/deploy/deployApp.js +13 -0
  13. package/dist/actions/deploy/deployApp.js.map +1 -1
  14. package/dist/actions/init/remoteTemplate.js +1 -1
  15. package/dist/actions/init/remoteTemplate.js.map +1 -1
  16. package/dist/actions/manifest/extractAppManifest.d.ts +20 -0
  17. package/dist/actions/manifest/extractAppManifest.js +51 -0
  18. package/dist/actions/manifest/extractAppManifest.js.map +1 -0
  19. package/dist/actions/manifest/extractManifest.js +1 -1
  20. package/dist/actions/manifest/extractManifest.js.map +1 -1
  21. package/dist/actions/manifest/types.d.ts +6 -1
  22. package/dist/actions/manifest/types.js.map +1 -1
  23. package/dist/actions/media/importAspects.js +2 -1
  24. package/dist/actions/media/importAspects.js.map +1 -1
  25. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +1 -1
  26. package/dist/actions/telemetry/resolveConsent.d.ts +1 -9
  27. package/dist/actions/telemetry/resolveConsent.js +2 -2
  28. package/dist/actions/telemetry/resolveConsent.js.map +1 -1
  29. package/dist/actions/telemetry/setConsent.d.ts +1 -4
  30. package/dist/actions/telemetry/setConsent.js +4 -8
  31. package/dist/actions/telemetry/setConsent.js.map +1 -1
  32. package/dist/commands/dataset/create.d.ts +0 -2
  33. package/dist/commands/dataset/create.js +8 -54
  34. package/dist/commands/dataset/create.js.map +1 -1
  35. package/dist/commands/debug.js +5 -9
  36. package/dist/commands/debug.js.map +1 -1
  37. package/dist/commands/init.d.ts +6 -1
  38. package/dist/commands/init.js +358 -20
  39. package/dist/commands/init.js.map +1 -1
  40. package/dist/commands/manifest/extract.js +7 -8
  41. package/dist/commands/manifest/extract.js.map +1 -1
  42. package/dist/commands/telemetry/disable.js +0 -1
  43. package/dist/commands/telemetry/disable.js.map +1 -1
  44. package/dist/commands/telemetry/enable.js +0 -1
  45. package/dist/commands/telemetry/enable.js.map +1 -1
  46. package/dist/commands/telemetry/status.js +1 -3
  47. package/dist/commands/telemetry/status.js.map +1 -1
  48. package/dist/config/createCliConfig.d.ts +9 -0
  49. package/dist/hooks/prerun/flushTelemetry.worker.d.ts +2 -0
  50. package/dist/hooks/prerun/flushTelemetry.worker.js +22 -0
  51. package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -0
  52. package/dist/hooks/prerun/setupTelemetry.js +65 -1
  53. package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
  54. package/dist/prompts/init/promptForTypescript.d.ts +2 -0
  55. package/dist/prompts/init/promptForTypescript.js +15 -0
  56. package/dist/prompts/init/promptForTypescript.js.map +1 -0
  57. package/dist/prompts/promptForDatasetAclMode.d.ts +9 -0
  58. package/dist/prompts/promptForDatasetAclMode.js +27 -0
  59. package/dist/prompts/promptForDatasetAclMode.js.map +1 -0
  60. package/dist/prompts/promptForDatasetName.d.ts +1 -1
  61. package/dist/prompts/promptForDatasetName.js +4 -1
  62. package/dist/prompts/promptForDatasetName.js.map +1 -1
  63. package/dist/services/organizations.d.ts +3 -1
  64. package/dist/services/organizations.js +2 -1
  65. package/dist/services/organizations.js.map +1 -1
  66. package/dist/services/telemetry.d.ts +2 -0
  67. package/dist/services/telemetry.js +20 -0
  68. package/dist/services/telemetry.js.map +1 -0
  69. package/dist/services/user.d.ts +5 -0
  70. package/dist/services/user.js +12 -1
  71. package/dist/services/user.js.map +1 -1
  72. package/dist/services/userApplications.d.ts +3 -1
  73. package/dist/services/userApplications.js +5 -1
  74. package/dist/services/userApplications.js.map +1 -1
  75. package/dist/telemetry/cli.telemetry.d.ts +20 -0
  76. package/dist/telemetry/cli.telemetry.js +8 -0
  77. package/dist/telemetry/cli.telemetry.js.map +1 -0
  78. package/dist/telemetry/store/cleanupOldTelemetryFiles.d.ts +5 -0
  79. package/dist/telemetry/store/cleanupOldTelemetryFiles.js +30 -0
  80. package/dist/telemetry/store/cleanupOldTelemetryFiles.js.map +1 -0
  81. package/dist/telemetry/store/createTelemetryStore.d.ts +39 -0
  82. package/dist/telemetry/store/createTelemetryStore.js +95 -0
  83. package/dist/telemetry/store/createTelemetryStore.js.map +1 -0
  84. package/dist/telemetry/store/createTraceId.d.ts +10 -0
  85. package/dist/telemetry/store/createTraceId.js +10 -0
  86. package/dist/telemetry/store/createTraceId.js.map +1 -0
  87. package/dist/telemetry/store/debug.d.ts +5 -0
  88. package/dist/telemetry/store/debug.js +7 -0
  89. package/dist/telemetry/store/debug.js.map +1 -0
  90. package/dist/telemetry/store/findTelemetryFiles.d.ts +13 -0
  91. package/dist/telemetry/store/findTelemetryFiles.js +34 -0
  92. package/dist/telemetry/store/findTelemetryFiles.js.map +1 -0
  93. package/dist/telemetry/store/flushTelemetryFiles.d.ts +20 -0
  94. package/dist/telemetry/store/flushTelemetryFiles.js +107 -0
  95. package/dist/telemetry/store/flushTelemetryFiles.js.map +1 -0
  96. package/dist/telemetry/store/generateTelemetryFilePath.d.ts +17 -0
  97. package/dist/telemetry/store/generateTelemetryFilePath.js +30 -0
  98. package/dist/telemetry/store/generateTelemetryFilePath.js.map +1 -0
  99. package/dist/telemetry/store/getTelemetryBaseInfo.d.ts +27 -0
  100. package/dist/telemetry/store/getTelemetryBaseInfo.js +34 -0
  101. package/dist/telemetry/store/getTelemetryBaseInfo.js.map +1 -0
  102. package/dist/telemetry/store/logger.d.ts +6 -0
  103. package/dist/telemetry/store/logger.js +54 -0
  104. package/dist/telemetry/store/logger.js.map +1 -0
  105. package/dist/telemetry/store/trace.d.ts +6 -0
  106. package/dist/telemetry/store/trace.js +150 -0
  107. package/dist/telemetry/store/trace.js.map +1 -0
  108. package/dist/telemetry/utils/readNDJSON.d.ts +10 -0
  109. package/dist/telemetry/utils/readNDJSON.js +18 -0
  110. package/dist/telemetry/utils/readNDJSON.js.map +1 -0
  111. package/dist/util/detectRuntime.d.ts +8 -0
  112. package/dist/util/detectRuntime.js +20 -0
  113. package/dist/util/detectRuntime.js.map +1 -0
  114. package/dist/util/isStaging.d.ts +7 -0
  115. package/dist/util/isStaging.js +10 -0
  116. package/dist/util/isStaging.js.map +1 -0
  117. package/dist/util/parseArguments.d.ts +35 -0
  118. package/dist/util/parseArguments.js +42 -0
  119. package/dist/util/parseArguments.js.map +1 -0
  120. package/oclif.manifest.json +7 -1
  121. package/package.json +25 -18
  122. package/templates/app-quickstart/src/App.css +20 -0
  123. package/templates/app-quickstart/src/App.tsx +25 -0
  124. package/templates/app-quickstart/src/ExampleComponent.css +90 -0
  125. package/templates/app-quickstart/src/ExampleComponent.tsx +37 -0
  126. package/templates/app-sanity-ui/src/App.tsx +34 -0
  127. package/templates/app-sanity-ui/src/ExampleComponent.tsx +34 -0
  128. package/templates/app-sanity-ui/src/SanityUI.tsx +23 -0
  129. package/templates/blog/README.md +11 -0
  130. package/templates/blog/schemaTypes/author.js +50 -0
  131. package/templates/blog/schemaTypes/blockContent.js +67 -0
  132. package/templates/blog/schemaTypes/category.js +19 -0
  133. package/templates/blog/schemaTypes/index.js +6 -0
  134. package/templates/blog/schemaTypes/post.js +65 -0
  135. package/templates/blog/static/.gitkeep +1 -0
  136. package/templates/clean/README.md +9 -0
  137. package/templates/clean/schemaTypes/index.js +1 -0
  138. package/templates/clean/static/.gitkeep +1 -0
  139. package/templates/ecommerce/README.md +11 -0
  140. package/templates/ecommerce/plugins/.gitkeep +1 -0
  141. package/templates/ecommerce/plugins/barcode-input/BarcodeInput.js +62 -0
  142. package/templates/ecommerce/plugins/barcode-input/index.js +9 -0
  143. package/templates/ecommerce/plugins/barcode-input/schemaType.js +60 -0
  144. package/templates/ecommerce/schemaTypes/blockContent.js +67 -0
  145. package/templates/ecommerce/schemaTypes/category.js +39 -0
  146. package/templates/ecommerce/schemaTypes/index.js +23 -0
  147. package/templates/ecommerce/schemaTypes/locale/localeBlockContent.js +19 -0
  148. package/templates/ecommerce/schemaTypes/locale/localeString.js +19 -0
  149. package/templates/ecommerce/schemaTypes/locale/localeText.js +19 -0
  150. package/templates/ecommerce/schemaTypes/locale/supportedLanguages.js +5 -0
  151. package/templates/ecommerce/schemaTypes/product.js +83 -0
  152. package/templates/ecommerce/schemaTypes/productVariant.js +52 -0
  153. package/templates/ecommerce/schemaTypes/vendor.js +39 -0
  154. package/templates/ecommerce/static/.gitkeep +1 -0
  155. package/templates/get-started/README.md +9 -0
  156. package/templates/get-started/plugins/.gitkeep +1 -0
  157. package/templates/get-started/plugins/sanity-plugin-tutorial/CustomDefaultLayout.tsx +16 -0
  158. package/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +104 -0
  159. package/templates/get-started/plugins/sanity-plugin-tutorial/index.ts +11 -0
  160. package/templates/get-started/schemaTypes/index.ts +1 -0
  161. package/templates/get-started/static/.gitkeep +1 -0
  162. package/templates/moviedb/README.md +10 -0
  163. package/templates/moviedb/schemaTypes/blockContent.js +67 -0
  164. package/templates/moviedb/schemaTypes/castMember.js +37 -0
  165. package/templates/moviedb/schemaTypes/crewMember.js +52 -0
  166. package/templates/moviedb/schemaTypes/index.js +22 -0
  167. package/templates/moviedb/schemaTypes/movie.js +85 -0
  168. package/templates/moviedb/schemaTypes/person.js +37 -0
  169. package/templates/moviedb/schemaTypes/plotSummaries.js +20 -0
  170. package/templates/moviedb/schemaTypes/plotSummary.js +24 -0
  171. package/templates/moviedb/schemaTypes/screening.js +81 -0
  172. package/templates/moviedb/static/.gitkeep +1 -0
  173. package/templates/quickstart/README.md +9 -0
  174. package/templates/quickstart/schemaTypes/index.js +1 -0
  175. package/templates/quickstart/static/.gitkeep +1 -0
  176. package/templates/shared/gitignore.txt +29 -0
  177. package/templates/shared/tsconfig.json +17 -0
  178. package/templates/shopify/README.md +85 -0
  179. package/templates/shopify/components/hotspots/ProductTooltip.tsx +38 -0
  180. package/templates/shopify/components/icons/Shopify.tsx +20 -0
  181. package/templates/shopify/components/inputs/CollectionHidden.tsx +23 -0
  182. package/templates/shopify/components/inputs/PlaceholderString.tsx +20 -0
  183. package/templates/shopify/components/inputs/ProductHidden.tsx +64 -0
  184. package/templates/shopify/components/inputs/ProductVariantHidden.tsx +24 -0
  185. package/templates/shopify/components/inputs/ProxyString.tsx +32 -0
  186. package/templates/shopify/components/media/ColorTheme.tsx +38 -0
  187. package/templates/shopify/components/media/ShopifyDocumentStatus.tsx +82 -0
  188. package/templates/shopify/components/studio/Navbar.tsx +29 -0
  189. package/templates/shopify/constants.ts +61 -0
  190. package/templates/shopify/docs/features.md +158 -0
  191. package/templates/shopify/plugins/customDocumentActions/index.ts +55 -0
  192. package/templates/shopify/plugins/customDocumentActions/shopifyDelete.tsx +144 -0
  193. package/templates/shopify/plugins/customDocumentActions/shopifyLink.ts +39 -0
  194. package/templates/shopify/plugins/customDocumentActions/types.ts +14 -0
  195. package/templates/shopify/schemaTypes/documents/collection.tsx +142 -0
  196. package/templates/shopify/schemaTypes/documents/colorTheme.tsx +44 -0
  197. package/templates/shopify/schemaTypes/documents/page.ts +70 -0
  198. package/templates/shopify/schemaTypes/documents/product.tsx +132 -0
  199. package/templates/shopify/schemaTypes/documents/productVariant.tsx +67 -0
  200. package/templates/shopify/schemaTypes/index.ts +108 -0
  201. package/templates/shopify/schemaTypes/objects/collection/collectionGroupType.ts +27 -0
  202. package/templates/shopify/schemaTypes/objects/collection/collectionLinksType.ts +16 -0
  203. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorObjectType.tsx +48 -0
  204. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorType.tsx +50 -0
  205. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeObjectType.ts +40 -0
  206. package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeType.ts +49 -0
  207. package/templates/shopify/schemaTypes/objects/global/footerType.ts +22 -0
  208. package/templates/shopify/schemaTypes/objects/global/menuLinksType.ts +21 -0
  209. package/templates/shopify/schemaTypes/objects/global/menuType.ts +17 -0
  210. package/templates/shopify/schemaTypes/objects/global/notFoundPageType.ts +37 -0
  211. package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +48 -0
  212. package/templates/shopify/schemaTypes/objects/hotspot/productHotspotsType.tsx +17 -0
  213. package/templates/shopify/schemaTypes/objects/hotspot/spotType.tsx +60 -0
  214. package/templates/shopify/schemaTypes/objects/link/linkEmailType.tsx +34 -0
  215. package/templates/shopify/schemaTypes/objects/link/linkExternalType.tsx +37 -0
  216. package/templates/shopify/schemaTypes/objects/link/linkInternalType.tsx +33 -0
  217. package/templates/shopify/schemaTypes/objects/link/linkProductType.tsx +60 -0
  218. package/templates/shopify/schemaTypes/objects/module/accordionGroupType.ts +33 -0
  219. package/templates/shopify/schemaTypes/objects/module/accordionType.ts +28 -0
  220. package/templates/shopify/schemaTypes/objects/module/callToActionType.tsx +85 -0
  221. package/templates/shopify/schemaTypes/objects/module/calloutType.ts +38 -0
  222. package/templates/shopify/schemaTypes/objects/module/collectionReferenceType.tsx +47 -0
  223. package/templates/shopify/schemaTypes/objects/module/gridItemType.ts +41 -0
  224. package/templates/shopify/schemaTypes/objects/module/gridType.ts +28 -0
  225. package/templates/shopify/schemaTypes/objects/module/heroType.tsx +40 -0
  226. package/templates/shopify/schemaTypes/objects/module/imageCallToActionType.tsx +19 -0
  227. package/templates/shopify/schemaTypes/objects/module/imageFeatureType.ts +80 -0
  228. package/templates/shopify/schemaTypes/objects/module/imageFeaturesType.tsx +51 -0
  229. package/templates/shopify/schemaTypes/objects/module/instagramType.ts +35 -0
  230. package/templates/shopify/schemaTypes/objects/module/productFeaturesType.tsx +50 -0
  231. package/templates/shopify/schemaTypes/objects/module/productReferenceType.tsx +42 -0
  232. package/templates/shopify/schemaTypes/objects/seoType.ts +31 -0
  233. package/templates/shopify/schemaTypes/objects/shopify/collectionRuleType.tsx +37 -0
  234. package/templates/shopify/schemaTypes/objects/shopify/inventoryType.ts +25 -0
  235. package/templates/shopify/schemaTypes/objects/shopify/optionType.tsx +31 -0
  236. package/templates/shopify/schemaTypes/objects/shopify/placeholderStringType.ts +11 -0
  237. package/templates/shopify/schemaTypes/objects/shopify/priceRangeType.ts +20 -0
  238. package/templates/shopify/schemaTypes/objects/shopify/productWithVariantType.tsx +142 -0
  239. package/templates/shopify/schemaTypes/objects/shopify/proxyStringType.ts +12 -0
  240. package/templates/shopify/schemaTypes/objects/shopify/shopType.ts +15 -0
  241. package/templates/shopify/schemaTypes/objects/shopify/shopifyCollectionType.ts +84 -0
  242. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductType.ts +131 -0
  243. package/templates/shopify/schemaTypes/objects/shopify/shopifyProductVariantType.ts +121 -0
  244. package/templates/shopify/schemaTypes/portableText/portableTextSimpleType.tsx +45 -0
  245. package/templates/shopify/schemaTypes/portableText/portableTextType.tsx +52 -0
  246. package/templates/shopify/schemaTypes/singletons/homeType.ts +49 -0
  247. package/templates/shopify/schemaTypes/singletons/settingsType.ts +96 -0
  248. package/templates/shopify/static/.gitkeep +1 -0
  249. package/templates/shopify/structure/collectionStructure.ts +9 -0
  250. package/templates/shopify/structure/colorThemeStructure.ts +9 -0
  251. package/templates/shopify/structure/homeStructure.ts +9 -0
  252. package/templates/shopify/structure/index.ts +57 -0
  253. package/templates/shopify/structure/pageStructure.ts +11 -0
  254. package/templates/shopify/structure/productStructure.ts +51 -0
  255. package/templates/shopify/structure/settingStructure.ts +9 -0
  256. package/templates/shopify/utils/blocksToText.ts +20 -0
  257. package/templates/shopify/utils/defineStructure.ts +11 -0
  258. package/templates/shopify/utils/getPriceRange.ts +24 -0
  259. package/templates/shopify/utils/shopifyUrls.ts +22 -0
  260. package/templates/shopify/utils/validateSlug.ts +18 -0
  261. package/templates/shopify-online-storefront/README.md +54 -0
  262. package/templates/shopify-online-storefront/components/icons/Shopify.tsx +22 -0
  263. package/templates/shopify-online-storefront/components/inputs/CollectionHidden.tsx +23 -0
  264. package/templates/shopify-online-storefront/components/inputs/PlaceholderString.tsx +25 -0
  265. package/templates/shopify-online-storefront/components/inputs/ProductHidden.tsx +66 -0
  266. package/templates/shopify-online-storefront/components/inputs/ProductVariantHidden.tsx +25 -0
  267. package/templates/shopify-online-storefront/components/inputs/ProxyString.tsx +38 -0
  268. package/templates/shopify-online-storefront/components/media/ShopifyDocumentStatus.tsx +83 -0
  269. package/templates/shopify-online-storefront/constants.ts +18 -0
  270. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/index.ts +45 -0
  271. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyDelete.tsx +144 -0
  272. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyLink.ts +39 -0
  273. package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/types.ts +14 -0
  274. package/templates/shopify-online-storefront/schemaTypes/blocks/blockContent.ts +32 -0
  275. package/templates/shopify-online-storefront/schemaTypes/documents/collection.tsx +83 -0
  276. package/templates/shopify-online-storefront/schemaTypes/documents/product.tsx +102 -0
  277. package/templates/shopify-online-storefront/schemaTypes/documents/productVariant.tsx +82 -0
  278. package/templates/shopify-online-storefront/schemaTypes/index.ts +43 -0
  279. package/templates/shopify-online-storefront/schemaTypes/objects/accordion.ts +31 -0
  280. package/templates/shopify-online-storefront/schemaTypes/objects/accordionGroup.ts +35 -0
  281. package/templates/shopify-online-storefront/schemaTypes/objects/callout.ts +40 -0
  282. package/templates/shopify-online-storefront/schemaTypes/objects/inventory.ts +30 -0
  283. package/templates/shopify-online-storefront/schemaTypes/objects/option.ts +30 -0
  284. package/templates/shopify-online-storefront/schemaTypes/objects/priceRange.ts +22 -0
  285. package/templates/shopify-online-storefront/schemaTypes/objects/proxyString.ts +11 -0
  286. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollection.ts +109 -0
  287. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollectionRule.tsx +45 -0
  288. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProduct.ts +165 -0
  289. package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProductVariant.ts +151 -0
  290. package/templates/shopify-online-storefront/structure/collectionStructure.ts +9 -0
  291. package/templates/shopify-online-storefront/structure/index.ts +37 -0
  292. package/templates/shopify-online-storefront/structure/productStructure.ts +35 -0
  293. package/templates/shopify-online-storefront/utils/defineStructure.ts +11 -0
  294. package/templates/shopify-online-storefront/utils/getPriceRange.ts +24 -0
  295. package/templates/shopify-online-storefront/utils/shopifyUrls.ts +22 -0
  296. package/dist/actions/build/__tests__/buildApp.test.js +0 -367
  297. package/dist/actions/build/__tests__/buildApp.test.js.map +0 -1
  298. package/dist/actions/build/__tests__/buildStudio.test.js +0 -561
  299. package/dist/actions/build/__tests__/buildStudio.test.js.map +0 -1
  300. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js +0 -233
  301. package/dist/actions/build/__tests__/checkRequiredDependencies.test.js.map +0 -1
  302. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js +0 -414
  303. package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js.map +0 -1
  304. package/dist/actions/build/__tests__/determineBasePath.test.js +0 -24
  305. package/dist/actions/build/__tests__/determineBasePath.test.js.map +0 -1
  306. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js +0 -109
  307. package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js.map +0 -1
  308. package/dist/actions/build/__tests__/getViteConfig.test.js +0 -493
  309. package/dist/actions/build/__tests__/getViteConfig.test.js.map +0 -1
  310. package/dist/actions/build/__tests__/renderDocument.test.js +0 -278
  311. package/dist/actions/build/__tests__/renderDocument.test.js.map +0 -1
  312. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js +0 -153
  313. package/dist/actions/build/__tests__/shouldAutoUpdate.test.js.map +0 -1
  314. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js +0 -657
  315. package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js.map +0 -1
  316. package/dist/actions/dataset/__tests__/validateDatasetName.test.js +0 -182
  317. package/dist/actions/dataset/__tests__/validateDatasetName.test.js.map +0 -1
  318. package/dist/actions/deploy/__tests__/checkDir.test.js +0 -120
  319. package/dist/actions/deploy/__tests__/checkDir.test.js.map +0 -1
  320. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js +0 -16
  321. package/dist/actions/docs/__tests__/normalizeDocsPath.test.js.map +0 -1
  322. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js +0 -124
  323. package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js.map +0 -1
  324. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +0 -274
  325. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +0 -1
  326. package/dist/actions/media/__tests__/importMedia.test.js +0 -182
  327. package/dist/actions/media/__tests__/importMedia.test.js.map +0 -1
  328. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js +0 -174
  329. package/dist/actions/schema/__tests__/formatSchemaValidation.test.js.map +0 -1
  330. package/dist/actions/schema/__tests__/validateAction.test.js +0 -281
  331. package/dist/actions/schema/__tests__/validateAction.test.js.map +0 -1
  332. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js +0 -27
  333. package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js.map +0 -1
  334. package/dist/actions/users/__tests__/validateEmail.test.js +0 -16
  335. package/dist/actions/users/__tests__/validateEmail.test.js.map +0 -1
  336. package/dist/commands/__tests__/blueprints.test.js +0 -54
  337. package/dist/commands/__tests__/blueprints.test.js.map +0 -1
  338. package/dist/commands/__tests__/build.test.js +0 -132
  339. package/dist/commands/__tests__/build.test.js.map +0 -1
  340. package/dist/commands/__tests__/codemod.test.js +0 -271
  341. package/dist/commands/__tests__/codemod.test.js.map +0 -1
  342. package/dist/commands/__tests__/debug.test.js +0 -590
  343. package/dist/commands/__tests__/debug.test.js.map +0 -1
  344. package/dist/commands/__tests__/deploy.test.js +0 -1945
  345. package/dist/commands/__tests__/deploy.test.js.map +0 -1
  346. package/dist/commands/__tests__/dev.test.js +0 -453
  347. package/dist/commands/__tests__/dev.test.js.map +0 -1
  348. package/dist/commands/__tests__/exec.test.js +0 -207
  349. package/dist/commands/__tests__/exec.test.js.map +0 -1
  350. package/dist/commands/__tests__/init/init.authentication.test.js +0 -73
  351. package/dist/commands/__tests__/init/init.authentication.test.js.map +0 -1
  352. package/dist/commands/__tests__/init/init.create-new-project.test.js +0 -195
  353. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +0 -1
  354. package/dist/commands/__tests__/init/init.plan.test.js +0 -279
  355. package/dist/commands/__tests__/init/init.plan.test.js.map +0 -1
  356. package/dist/commands/__tests__/init/init.setup.test.js +0 -335
  357. package/dist/commands/__tests__/init/init.setup.test.js.map +0 -1
  358. package/dist/commands/__tests__/install.test.js +0 -282
  359. package/dist/commands/__tests__/install.test.js.map +0 -1
  360. package/dist/commands/__tests__/learn.test.js +0 -29
  361. package/dist/commands/__tests__/learn.test.js.map +0 -1
  362. package/dist/commands/__tests__/logout.test.js +0 -91
  363. package/dist/commands/__tests__/logout.test.js.map +0 -1
  364. package/dist/commands/__tests__/manage.test.js +0 -110
  365. package/dist/commands/__tests__/manage.test.js.map +0 -1
  366. package/dist/commands/__tests__/migration.test.js +0 -119
  367. package/dist/commands/__tests__/migration.test.js.map +0 -1
  368. package/dist/commands/__tests__/preview.test.js +0 -261
  369. package/dist/commands/__tests__/preview.test.js.map +0 -1
  370. package/dist/commands/__tests__/start.test.js +0 -253
  371. package/dist/commands/__tests__/start.test.js.map +0 -1
  372. package/dist/commands/__tests__/undeploy.test.js +0 -382
  373. package/dist/commands/__tests__/undeploy.test.js.map +0 -1
  374. package/dist/commands/__tests__/versions.test.js +0 -142
  375. package/dist/commands/__tests__/versions.test.js.map +0 -1
  376. package/dist/commands/backup/__tests__/disable.test.js +0 -204
  377. package/dist/commands/backup/__tests__/disable.test.js.map +0 -1
  378. package/dist/commands/backup/__tests__/download.test.js +0 -768
  379. package/dist/commands/backup/__tests__/download.test.js.map +0 -1
  380. package/dist/commands/backup/__tests__/enable.test.js +0 -286
  381. package/dist/commands/backup/__tests__/enable.test.js.map +0 -1
  382. package/dist/commands/backup/__tests__/list.test.js +0 -330
  383. package/dist/commands/backup/__tests__/list.test.js.map +0 -1
  384. package/dist/commands/cors/__tests__/add.test.js +0 -376
  385. package/dist/commands/cors/__tests__/add.test.js.map +0 -1
  386. package/dist/commands/cors/__tests__/delete.test.js +0 -308
  387. package/dist/commands/cors/__tests__/delete.test.js.map +0 -1
  388. package/dist/commands/cors/__tests__/list.test.js +0 -241
  389. package/dist/commands/cors/__tests__/list.test.js.map +0 -1
  390. package/dist/commands/dataset/__tests__/copy.test.js +0 -628
  391. package/dist/commands/dataset/__tests__/copy.test.js.map +0 -1
  392. package/dist/commands/dataset/__tests__/create.test.js +0 -342
  393. package/dist/commands/dataset/__tests__/create.test.js.map +0 -1
  394. package/dist/commands/dataset/__tests__/delete.test.js +0 -231
  395. package/dist/commands/dataset/__tests__/delete.test.js.map +0 -1
  396. package/dist/commands/dataset/__tests__/export.test.js +0 -601
  397. package/dist/commands/dataset/__tests__/export.test.js.map +0 -1
  398. package/dist/commands/dataset/__tests__/import.test.js +0 -53
  399. package/dist/commands/dataset/__tests__/import.test.js.map +0 -1
  400. package/dist/commands/dataset/__tests__/list.test.js +0 -216
  401. package/dist/commands/dataset/__tests__/list.test.js.map +0 -1
  402. package/dist/commands/dataset/alias/__tests__/create.test.js +0 -339
  403. package/dist/commands/dataset/alias/__tests__/create.test.js.map +0 -1
  404. package/dist/commands/dataset/alias/__tests__/delete.test.js +0 -247
  405. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +0 -1
  406. package/dist/commands/dataset/alias/__tests__/link.test.js +0 -376
  407. package/dist/commands/dataset/alias/__tests__/link.test.js.map +0 -1
  408. package/dist/commands/dataset/alias/__tests__/unlink.test.js +0 -313
  409. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +0 -1
  410. package/dist/commands/dataset/visibility/__tests__/get.test.js +0 -128
  411. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +0 -1
  412. package/dist/commands/dataset/visibility/__tests__/set.test.js +0 -198
  413. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +0 -1
  414. package/dist/commands/docs/__tests__/browse.test.js +0 -29
  415. package/dist/commands/docs/__tests__/browse.test.js.map +0 -1
  416. package/dist/commands/docs/__tests__/read.test.js +0 -78
  417. package/dist/commands/docs/__tests__/read.test.js.map +0 -1
  418. package/dist/commands/docs/__tests__/search.test.js +0 -255
  419. package/dist/commands/docs/__tests__/search.test.js.map +0 -1
  420. package/dist/commands/documents/__tests__/create.test.js +0 -1030
  421. package/dist/commands/documents/__tests__/create.test.js.map +0 -1
  422. package/dist/commands/documents/__tests__/delete.test.js +0 -300
  423. package/dist/commands/documents/__tests__/delete.test.js.map +0 -1
  424. package/dist/commands/documents/__tests__/get.test.js +0 -182
  425. package/dist/commands/documents/__tests__/get.test.js.map +0 -1
  426. package/dist/commands/documents/__tests__/query.test.js +0 -300
  427. package/dist/commands/documents/__tests__/query.test.js.map +0 -1
  428. package/dist/commands/documents/__tests__/validate.test.js +0 -249
  429. package/dist/commands/documents/__tests__/validate.test.js.map +0 -1
  430. package/dist/commands/graphql/__tests__/list.test.js +0 -240
  431. package/dist/commands/graphql/__tests__/list.test.js.map +0 -1
  432. package/dist/commands/graphql/__tests__/undeploy.test.js +0 -410
  433. package/dist/commands/graphql/__tests__/undeploy.test.js.map +0 -1
  434. package/dist/commands/hook/__tests__/attempt.test.js +0 -275
  435. package/dist/commands/hook/__tests__/attempt.test.js.map +0 -1
  436. package/dist/commands/hook/__tests__/create.test.js +0 -119
  437. package/dist/commands/hook/__tests__/create.test.js.map +0 -1
  438. package/dist/commands/hook/__tests__/delete.test.js +0 -233
  439. package/dist/commands/hook/__tests__/delete.test.js.map +0 -1
  440. package/dist/commands/hook/__tests__/list.test.js +0 -145
  441. package/dist/commands/hook/__tests__/list.test.js.map +0 -1
  442. package/dist/commands/hook/__tests__/logs.test.js +0 -798
  443. package/dist/commands/hook/__tests__/logs.test.js.map +0 -1
  444. package/dist/commands/manifest/__tests__/extract.test.js +0 -132
  445. package/dist/commands/manifest/__tests__/extract.test.js.map +0 -1
  446. package/dist/commands/mcp/__tests__/configure.test.js +0 -397
  447. package/dist/commands/mcp/__tests__/configure.test.js.map +0 -1
  448. package/dist/commands/media/__tests__/create-aspect.test.js +0 -173
  449. package/dist/commands/media/__tests__/create-aspect.test.js.map +0 -1
  450. package/dist/commands/media/__tests__/delete-aspect.test.js +0 -342
  451. package/dist/commands/media/__tests__/delete-aspect.test.js.map +0 -1
  452. package/dist/commands/media/__tests__/deploy-aspect.test.js +0 -619
  453. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +0 -1
  454. package/dist/commands/media/__tests__/export.test.js +0 -697
  455. package/dist/commands/media/__tests__/export.test.js.map +0 -1
  456. package/dist/commands/media/__tests__/import.test.js +0 -347
  457. package/dist/commands/media/__tests__/import.test.js.map +0 -1
  458. package/dist/commands/openapi/__tests__/get.test.js +0 -149
  459. package/dist/commands/openapi/__tests__/get.test.js.map +0 -1
  460. package/dist/commands/openapi/__tests__/list.test.js +0 -113
  461. package/dist/commands/openapi/__tests__/list.test.js.map +0 -1
  462. package/dist/commands/projects/__tests__/list.test.js +0 -154
  463. package/dist/commands/projects/__tests__/list.test.js.map +0 -1
  464. package/dist/commands/schema/__tests__/delete.test.js +0 -454
  465. package/dist/commands/schema/__tests__/delete.test.js.map +0 -1
  466. package/dist/commands/schema/__tests__/deploy.test.js +0 -348
  467. package/dist/commands/schema/__tests__/deploy.test.js.map +0 -1
  468. package/dist/commands/schema/__tests__/extract.test.js +0 -121
  469. package/dist/commands/schema/__tests__/extract.test.js.map +0 -1
  470. package/dist/commands/schema/__tests__/list.test.js +0 -399
  471. package/dist/commands/schema/__tests__/list.test.js.map +0 -1
  472. package/dist/commands/schema/__tests__/validate.test.js +0 -121
  473. package/dist/commands/schema/__tests__/validate.test.js.map +0 -1
  474. package/dist/commands/telemetry/__tests__/disable.test.js +0 -147
  475. package/dist/commands/telemetry/__tests__/disable.test.js.map +0 -1
  476. package/dist/commands/telemetry/__tests__/enable.test.js +0 -133
  477. package/dist/commands/telemetry/__tests__/enable.test.js.map +0 -1
  478. package/dist/commands/telemetry/__tests__/status.test.js +0 -155
  479. package/dist/commands/telemetry/__tests__/status.test.js.map +0 -1
  480. package/dist/commands/tokens/__tests__/add.test.js +0 -435
  481. package/dist/commands/tokens/__tests__/add.test.js.map +0 -1
  482. package/dist/commands/tokens/__tests__/delete.test.js +0 -405
  483. package/dist/commands/tokens/__tests__/delete.test.js.map +0 -1
  484. package/dist/commands/tokens/__tests__/list.test.js +0 -395
  485. package/dist/commands/tokens/__tests__/list.test.js.map +0 -1
  486. package/dist/commands/users/__tests__/invite.test.js +0 -362
  487. package/dist/commands/users/__tests__/invite.test.js.map +0 -1
  488. package/dist/commands/users/__tests__/list.test.js +0 -407
  489. package/dist/commands/users/__tests__/list.test.js.map +0 -1
  490. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js +0 -77
  491. package/dist/hooks/prerun/__tests__/setupTelemetry.test.js.map +0 -1
  492. package/dist/services/__tests__/datasetAliases.test.js +0 -131
  493. package/dist/services/__tests__/datasetAliases.test.js.map +0 -1
  494. package/dist/services/__tests__/datasets.test.js +0 -436
  495. package/dist/services/__tests__/datasets.test.js.map +0 -1
  496. package/dist/services/__tests__/graphql.test.js +0 -43
  497. package/dist/services/__tests__/graphql.test.js.map +0 -1
  498. package/dist/services/__tests__/mediaLibraries.test.js +0 -88
  499. package/dist/services/__tests__/mediaLibraries.test.js.map +0 -1
  500. package/dist/services/__tests__/projects.test.js +0 -41
  501. package/dist/services/__tests__/projects.test.js.map +0 -1
  502. package/dist/services/__tests__/userApplications.test.js +0 -113
  503. package/dist/services/__tests__/userApplications.test.js.map +0 -1
  504. package/dist/util/__tests__/appId.test.js +0 -31
  505. package/dist/util/__tests__/appId.test.js.map +0 -1
  506. package/dist/util/__tests__/cliClient.test.js +0 -184
  507. package/dist/util/__tests__/cliClient.test.js.map +0 -1
  508. package/dist/util/__tests__/compareDependencyVersions.test.js +0 -426
  509. package/dist/util/__tests__/compareDependencyVersions.test.js.map +0 -1
  510. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js +0 -74
  511. package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js.map +0 -1
  512. package/dist/util/__tests__/findNdjsonEntry.test.js +0 -54
  513. package/dist/util/__tests__/findNdjsonEntry.test.js.map +0 -1
  514. package/dist/util/__tests__/getCliVersion.test.js +0 -28
  515. package/dist/util/__tests__/getCliVersion.test.js.map +0 -1
  516. package/dist/util/__tests__/getLocalPackageVersion.test.js +0 -84
  517. package/dist/util/__tests__/getLocalPackageVersion.test.js.map +0 -1
  518. package/dist/util/__tests__/getWorkspace.test.js +0 -37
  519. package/dist/util/__tests__/getWorkspace.test.js.map +0 -1
  520. package/dist/util/__tests__/readPackageJson.test.js +0 -69
  521. package/dist/util/__tests__/readPackageJson.test.js.map +0 -1
  522. package/dist/util/__tests__/warnAboutMissingAppId.test.js +0 -28
  523. package/dist/util/__tests__/warnAboutMissingAppId.test.js.map +0 -1
  524. package/dist/util/packageManager/__tests__/installPackages.test.js +0 -388
  525. package/dist/util/packageManager/__tests__/installPackages.test.js.map +0 -1
  526. package/dist/util/validation/ __tests__/validateDocuments.test.js +0 -274
  527. 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
+ }