@sanity/cli 6.0.0-alpha.4 → 6.0.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/dataset/create.d.ts +49 -0
- package/dist/actions/dataset/create.js +48 -0
- package/dist/actions/dataset/create.js.map +1 -0
- package/dist/actions/dataset/determineDatasetAclMode.d.ts +37 -0
- package/dist/actions/dataset/determineDatasetAclMode.js +36 -0
- package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -0
- package/dist/actions/debug/gatherDebugInfo.js +15 -21
- package/dist/actions/debug/gatherDebugInfo.js.map +1 -1
- package/dist/actions/debug/types.d.ts +0 -2
- package/dist/actions/debug/types.js.map +1 -1
- package/dist/actions/deploy/deployApp.js +13 -0
- package/dist/actions/deploy/deployApp.js.map +1 -1
- package/dist/actions/dev/startStudioDevServer.js +3 -8
- package/dist/actions/dev/startStudioDevServer.js.map +1 -1
- package/dist/actions/dev/types.d.ts +1 -3
- package/dist/actions/dev/types.js.map +1 -1
- package/dist/actions/documents/validate.d.ts +0 -2
- package/dist/actions/documents/validate.js +21 -1
- package/dist/actions/documents/validate.js.map +1 -1
- package/dist/actions/exec/execScript.js +1 -1
- package/dist/actions/exec/execScript.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
- package/dist/actions/init/remoteTemplate.js +1 -1
- package/dist/actions/init/remoteTemplate.js.map +1 -1
- package/dist/actions/manifest/extractAppManifest.d.ts +20 -0
- package/dist/actions/manifest/extractAppManifest.js +51 -0
- package/dist/actions/manifest/extractAppManifest.js.map +1 -0
- package/dist/actions/manifest/extractManifest.js +2 -5
- package/dist/actions/manifest/extractManifest.js.map +1 -1
- package/dist/actions/manifest/types.d.ts +6 -1
- package/dist/actions/manifest/types.js.map +1 -1
- package/dist/actions/media/importAspects.js +2 -1
- package/dist/actions/media/importAspects.js.map +1 -1
- package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
- package/dist/actions/schema/deleteSchemaAction.js +12 -17
- package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
- package/dist/actions/schema/deploySchemas.d.ts +15 -0
- package/dist/actions/schema/deploySchemas.js +98 -0
- package/dist/actions/schema/deploySchemas.js.map +1 -0
- package/dist/actions/schema/listSchemas.d.ts +12 -0
- package/dist/actions/schema/listSchemas.js +119 -0
- package/dist/actions/schema/listSchemas.js.map +1 -0
- package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
- package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
- package/dist/actions/schema/utils/debug.d.ts +2 -0
- package/dist/actions/schema/utils/debug.js +5 -0
- package/dist/actions/schema/utils/debug.js.map +1 -0
- package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
- package/dist/actions/schema/utils/manifestExtractor.js +12 -17
- package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
- package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
- package/dist/actions/schema/utils/manifestReader.js +6 -12
- package/dist/actions/schema/utils/manifestReader.js.map +1 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
- package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
- package/dist/actions/schema/utils/schemaStoreValidation.js +38 -125
- package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
- package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
- package/dist/actions/users/getMembersForProject.d.ts +1 -3
- package/dist/actions/users/getMembersForProject.js +6 -17
- package/dist/actions/users/getMembersForProject.js.map +1 -1
- package/dist/actions/users/types.d.ts +0 -11
- package/dist/actions/users/types.js.map +1 -1
- package/dist/commands/backup/disable.js +5 -11
- package/dist/commands/backup/disable.js.map +1 -1
- package/dist/commands/backup/enable.js +5 -11
- package/dist/commands/backup/enable.js.map +1 -1
- package/dist/commands/backup/list.js +7 -8
- package/dist/commands/backup/list.js.map +1 -1
- package/dist/commands/cors/add.js +5 -13
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +7 -15
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +2 -10
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/dataset/create.d.ts +0 -2
- package/dist/commands/dataset/create.js +8 -54
- package/dist/commands/dataset/create.js.map +1 -1
- package/dist/commands/dataset/export.js +4 -4
- package/dist/commands/dataset/export.js.map +1 -1
- package/dist/commands/debug.js +5 -9
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/dev.js +0 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/documents/create.d.ts +1 -0
- package/dist/commands/documents/create.js +10 -9
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +2 -3
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +2 -3
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +2 -3
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +0 -20
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/graphql/list.js +2 -2
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/graphql/undeploy.js +4 -9
- package/dist/commands/graphql/undeploy.js.map +1 -1
- package/dist/commands/hook/create.js +2 -6
- package/dist/commands/hook/create.js.map +1 -1
- package/dist/commands/hook/delete.js +5 -17
- package/dist/commands/hook/delete.js.map +1 -1
- package/dist/commands/hook/list.js +2 -8
- package/dist/commands/hook/list.js.map +1 -1
- package/dist/commands/init.d.ts +6 -1
- package/dist/commands/init.js +358 -20
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/manifest/extract.js +7 -8
- package/dist/commands/manifest/extract.js.map +1 -1
- package/dist/commands/media/export.js +2 -2
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/media/import.js +2 -2
- package/dist/commands/media/import.js.map +1 -1
- package/dist/commands/projects/list.js +2 -6
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/schema/delete.d.ts +1 -1
- package/dist/commands/schema/delete.js +20 -23
- package/dist/commands/schema/delete.js.map +1 -1
- package/dist/commands/schema/deploy.d.ts +16 -0
- package/dist/commands/schema/deploy.js +98 -0
- package/dist/commands/schema/deploy.js.map +1 -0
- package/dist/commands/schema/list.d.ts +15 -0
- package/dist/commands/schema/list.js +104 -0
- package/dist/commands/schema/list.js.map +1 -0
- package/dist/commands/tokens/add.js +3 -5
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/commands/users/invite.js +6 -17
- package/dist/commands/users/invite.js.map +1 -1
- package/dist/commands/users/list.js +4 -7
- package/dist/commands/users/list.js.map +1 -1
- package/dist/config/createCliConfig.d.ts +13 -4
- package/dist/prompts/init/promptForTypescript.d.ts +2 -0
- package/dist/prompts/init/promptForTypescript.js +15 -0
- package/dist/prompts/init/promptForTypescript.js.map +1 -0
- package/dist/prompts/promptForDatasetAclMode.d.ts +9 -0
- package/dist/prompts/promptForDatasetAclMode.js +27 -0
- package/dist/prompts/promptForDatasetAclMode.js.map +1 -0
- package/dist/prompts/promptForDatasetName.d.ts +1 -1
- package/dist/prompts/promptForDatasetName.js +4 -1
- package/dist/prompts/promptForDatasetName.js.map +1 -1
- package/dist/services/backup.d.ts +8 -0
- package/dist/services/backup.js +19 -0
- package/dist/services/backup.js.map +1 -1
- package/dist/services/cors.d.ts +23 -0
- package/dist/services/cors.js +38 -0
- package/dist/services/cors.js.map +1 -0
- package/dist/services/graphql.d.ts +7 -0
- package/dist/services/graphql.js +11 -0
- package/dist/services/graphql.js.map +1 -1
- package/dist/services/hooks.d.ts +2 -0
- package/dist/services/hooks.js +19 -0
- package/dist/services/hooks.js.map +1 -1
- package/dist/services/organizations.d.ts +4 -2
- package/dist/services/organizations.js +3 -2
- package/dist/services/organizations.js.map +1 -1
- package/dist/services/projects.d.ts +11 -0
- package/dist/services/projects.js +41 -0
- package/dist/services/projects.js.map +1 -1
- package/dist/services/schemas.d.ts +4 -0
- package/dist/services/schemas.js +40 -0
- package/dist/services/schemas.js.map +1 -0
- package/dist/services/user.d.ts +13 -0
- package/dist/services/user.js +27 -3
- package/dist/services/user.js.map +1 -1
- package/dist/services/userApplications.d.ts +3 -1
- package/dist/services/userApplications.js +5 -1
- package/dist/services/userApplications.js.map +1 -1
- package/dist/util/errorMessages.d.ts +1 -0
- package/dist/util/errorMessages.js +1 -0
- package/dist/util/errorMessages.js.map +1 -1
- package/dist/util/getCliVersion.js +1 -1
- package/dist/util/getCliVersion.js.map +1 -1
- package/dist/util/readPackageJson.d.ts +1 -15
- package/dist/util/readPackageJson.js +1 -1
- package/dist/util/readPackageJson.js.map +1 -1
- package/dist/util/uniqBy.d.ts +1 -0
- package/dist/util/uniqBy.js +14 -0
- package/dist/util/uniqBy.js.map +1 -0
- package/oclif.manifest.json +284 -139
- package/package.json +36 -33
- package/templates/app-quickstart/src/App.css +20 -0
- package/templates/app-quickstart/src/App.tsx +25 -0
- package/templates/app-quickstart/src/ExampleComponent.css +90 -0
- package/templates/app-quickstart/src/ExampleComponent.tsx +37 -0
- package/templates/app-sanity-ui/src/App.tsx +34 -0
- package/templates/app-sanity-ui/src/ExampleComponent.tsx +34 -0
- package/templates/app-sanity-ui/src/SanityUI.tsx +23 -0
- package/templates/blog/README.md +11 -0
- package/templates/blog/schemaTypes/author.js +50 -0
- package/templates/blog/schemaTypes/blockContent.js +67 -0
- package/templates/blog/schemaTypes/category.js +19 -0
- package/templates/blog/schemaTypes/index.js +6 -0
- package/templates/blog/schemaTypes/post.js +65 -0
- package/templates/blog/static/.gitkeep +1 -0
- package/templates/clean/README.md +9 -0
- package/templates/clean/schemaTypes/index.js +1 -0
- package/templates/clean/static/.gitkeep +1 -0
- package/templates/ecommerce/README.md +11 -0
- package/templates/ecommerce/plugins/.gitkeep +1 -0
- package/templates/ecommerce/plugins/barcode-input/BarcodeInput.js +62 -0
- package/templates/ecommerce/plugins/barcode-input/index.js +9 -0
- package/templates/ecommerce/plugins/barcode-input/schemaType.js +60 -0
- package/templates/ecommerce/schemaTypes/blockContent.js +67 -0
- package/templates/ecommerce/schemaTypes/category.js +39 -0
- package/templates/ecommerce/schemaTypes/index.js +23 -0
- package/templates/ecommerce/schemaTypes/locale/localeBlockContent.js +19 -0
- package/templates/ecommerce/schemaTypes/locale/localeString.js +19 -0
- package/templates/ecommerce/schemaTypes/locale/localeText.js +19 -0
- package/templates/ecommerce/schemaTypes/locale/supportedLanguages.js +5 -0
- package/templates/ecommerce/schemaTypes/product.js +83 -0
- package/templates/ecommerce/schemaTypes/productVariant.js +52 -0
- package/templates/ecommerce/schemaTypes/vendor.js +39 -0
- package/templates/ecommerce/static/.gitkeep +1 -0
- package/templates/get-started/README.md +9 -0
- package/templates/get-started/plugins/.gitkeep +1 -0
- package/templates/get-started/plugins/sanity-plugin-tutorial/CustomDefaultLayout.tsx +16 -0
- package/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +104 -0
- package/templates/get-started/plugins/sanity-plugin-tutorial/index.ts +11 -0
- package/templates/get-started/schemaTypes/index.ts +1 -0
- package/templates/get-started/static/.gitkeep +1 -0
- package/templates/moviedb/README.md +10 -0
- package/templates/moviedb/schemaTypes/blockContent.js +67 -0
- package/templates/moviedb/schemaTypes/castMember.js +37 -0
- package/templates/moviedb/schemaTypes/crewMember.js +52 -0
- package/templates/moviedb/schemaTypes/index.js +22 -0
- package/templates/moviedb/schemaTypes/movie.js +85 -0
- package/templates/moviedb/schemaTypes/person.js +37 -0
- package/templates/moviedb/schemaTypes/plotSummaries.js +20 -0
- package/templates/moviedb/schemaTypes/plotSummary.js +24 -0
- package/templates/moviedb/schemaTypes/screening.js +81 -0
- package/templates/moviedb/static/.gitkeep +1 -0
- package/templates/quickstart/README.md +9 -0
- package/templates/quickstart/schemaTypes/index.js +1 -0
- package/templates/quickstart/static/.gitkeep +1 -0
- package/templates/shared/gitignore.txt +29 -0
- package/templates/shared/tsconfig.json +17 -0
- package/templates/shopify/README.md +85 -0
- package/templates/shopify/components/hotspots/ProductTooltip.tsx +38 -0
- package/templates/shopify/components/icons/Shopify.tsx +20 -0
- package/templates/shopify/components/inputs/CollectionHidden.tsx +23 -0
- package/templates/shopify/components/inputs/PlaceholderString.tsx +20 -0
- package/templates/shopify/components/inputs/ProductHidden.tsx +64 -0
- package/templates/shopify/components/inputs/ProductVariantHidden.tsx +24 -0
- package/templates/shopify/components/inputs/ProxyString.tsx +32 -0
- package/templates/shopify/components/media/ColorTheme.tsx +38 -0
- package/templates/shopify/components/media/ShopifyDocumentStatus.tsx +82 -0
- package/templates/shopify/components/studio/Navbar.tsx +29 -0
- package/templates/shopify/constants.ts +61 -0
- package/templates/shopify/docs/features.md +158 -0
- package/templates/shopify/plugins/customDocumentActions/index.ts +55 -0
- package/templates/shopify/plugins/customDocumentActions/shopifyDelete.tsx +144 -0
- package/templates/shopify/plugins/customDocumentActions/shopifyLink.ts +39 -0
- package/templates/shopify/plugins/customDocumentActions/types.ts +14 -0
- package/templates/shopify/schemaTypes/documents/collection.tsx +142 -0
- package/templates/shopify/schemaTypes/documents/colorTheme.tsx +44 -0
- package/templates/shopify/schemaTypes/documents/page.ts +70 -0
- package/templates/shopify/schemaTypes/documents/product.tsx +132 -0
- package/templates/shopify/schemaTypes/documents/productVariant.tsx +67 -0
- package/templates/shopify/schemaTypes/index.ts +108 -0
- package/templates/shopify/schemaTypes/objects/collection/collectionGroupType.ts +27 -0
- package/templates/shopify/schemaTypes/objects/collection/collectionLinksType.ts +16 -0
- package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorObjectType.tsx +48 -0
- package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorType.tsx +50 -0
- package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeObjectType.ts +40 -0
- package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionSizeType.ts +49 -0
- package/templates/shopify/schemaTypes/objects/global/footerType.ts +22 -0
- package/templates/shopify/schemaTypes/objects/global/menuLinksType.ts +21 -0
- package/templates/shopify/schemaTypes/objects/global/menuType.ts +17 -0
- package/templates/shopify/schemaTypes/objects/global/notFoundPageType.ts +37 -0
- package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +48 -0
- package/templates/shopify/schemaTypes/objects/hotspot/productHotspotsType.tsx +17 -0
- package/templates/shopify/schemaTypes/objects/hotspot/spotType.tsx +60 -0
- package/templates/shopify/schemaTypes/objects/link/linkEmailType.tsx +34 -0
- package/templates/shopify/schemaTypes/objects/link/linkExternalType.tsx +37 -0
- package/templates/shopify/schemaTypes/objects/link/linkInternalType.tsx +33 -0
- package/templates/shopify/schemaTypes/objects/link/linkProductType.tsx +60 -0
- package/templates/shopify/schemaTypes/objects/module/accordionGroupType.ts +33 -0
- package/templates/shopify/schemaTypes/objects/module/accordionType.ts +28 -0
- package/templates/shopify/schemaTypes/objects/module/callToActionType.tsx +85 -0
- package/templates/shopify/schemaTypes/objects/module/calloutType.ts +38 -0
- package/templates/shopify/schemaTypes/objects/module/collectionReferenceType.tsx +47 -0
- package/templates/shopify/schemaTypes/objects/module/gridItemType.ts +41 -0
- package/templates/shopify/schemaTypes/objects/module/gridType.ts +28 -0
- package/templates/shopify/schemaTypes/objects/module/heroType.tsx +40 -0
- package/templates/shopify/schemaTypes/objects/module/imageCallToActionType.tsx +19 -0
- package/templates/shopify/schemaTypes/objects/module/imageFeatureType.ts +80 -0
- package/templates/shopify/schemaTypes/objects/module/imageFeaturesType.tsx +51 -0
- package/templates/shopify/schemaTypes/objects/module/instagramType.ts +35 -0
- package/templates/shopify/schemaTypes/objects/module/productFeaturesType.tsx +50 -0
- package/templates/shopify/schemaTypes/objects/module/productReferenceType.tsx +42 -0
- package/templates/shopify/schemaTypes/objects/seoType.ts +31 -0
- package/templates/shopify/schemaTypes/objects/shopify/collectionRuleType.tsx +37 -0
- package/templates/shopify/schemaTypes/objects/shopify/inventoryType.ts +25 -0
- package/templates/shopify/schemaTypes/objects/shopify/optionType.tsx +31 -0
- package/templates/shopify/schemaTypes/objects/shopify/placeholderStringType.ts +11 -0
- package/templates/shopify/schemaTypes/objects/shopify/priceRangeType.ts +20 -0
- package/templates/shopify/schemaTypes/objects/shopify/productWithVariantType.tsx +142 -0
- package/templates/shopify/schemaTypes/objects/shopify/proxyStringType.ts +12 -0
- package/templates/shopify/schemaTypes/objects/shopify/shopType.ts +15 -0
- package/templates/shopify/schemaTypes/objects/shopify/shopifyCollectionType.ts +84 -0
- package/templates/shopify/schemaTypes/objects/shopify/shopifyProductType.ts +131 -0
- package/templates/shopify/schemaTypes/objects/shopify/shopifyProductVariantType.ts +121 -0
- package/templates/shopify/schemaTypes/portableText/portableTextSimpleType.tsx +45 -0
- package/templates/shopify/schemaTypes/portableText/portableTextType.tsx +52 -0
- package/templates/shopify/schemaTypes/singletons/homeType.ts +49 -0
- package/templates/shopify/schemaTypes/singletons/settingsType.ts +96 -0
- package/templates/shopify/static/.gitkeep +1 -0
- package/templates/shopify/structure/collectionStructure.ts +9 -0
- package/templates/shopify/structure/colorThemeStructure.ts +9 -0
- package/templates/shopify/structure/homeStructure.ts +9 -0
- package/templates/shopify/structure/index.ts +57 -0
- package/templates/shopify/structure/pageStructure.ts +11 -0
- package/templates/shopify/structure/productStructure.ts +51 -0
- package/templates/shopify/structure/settingStructure.ts +9 -0
- package/templates/shopify/utils/blocksToText.ts +20 -0
- package/templates/shopify/utils/defineStructure.ts +11 -0
- package/templates/shopify/utils/getPriceRange.ts +24 -0
- package/templates/shopify/utils/shopifyUrls.ts +22 -0
- package/templates/shopify/utils/validateSlug.ts +18 -0
- package/templates/shopify-online-storefront/README.md +54 -0
- package/templates/shopify-online-storefront/components/icons/Shopify.tsx +22 -0
- package/templates/shopify-online-storefront/components/inputs/CollectionHidden.tsx +23 -0
- package/templates/shopify-online-storefront/components/inputs/PlaceholderString.tsx +25 -0
- package/templates/shopify-online-storefront/components/inputs/ProductHidden.tsx +66 -0
- package/templates/shopify-online-storefront/components/inputs/ProductVariantHidden.tsx +25 -0
- package/templates/shopify-online-storefront/components/inputs/ProxyString.tsx +38 -0
- package/templates/shopify-online-storefront/components/media/ShopifyDocumentStatus.tsx +83 -0
- package/templates/shopify-online-storefront/constants.ts +18 -0
- package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/index.ts +45 -0
- package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyDelete.tsx +144 -0
- package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyLink.ts +39 -0
- package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/types.ts +14 -0
- package/templates/shopify-online-storefront/schemaTypes/blocks/blockContent.ts +32 -0
- package/templates/shopify-online-storefront/schemaTypes/documents/collection.tsx +83 -0
- package/templates/shopify-online-storefront/schemaTypes/documents/product.tsx +102 -0
- package/templates/shopify-online-storefront/schemaTypes/documents/productVariant.tsx +82 -0
- package/templates/shopify-online-storefront/schemaTypes/index.ts +43 -0
- package/templates/shopify-online-storefront/schemaTypes/objects/accordion.ts +31 -0
- package/templates/shopify-online-storefront/schemaTypes/objects/accordionGroup.ts +35 -0
- package/templates/shopify-online-storefront/schemaTypes/objects/callout.ts +40 -0
- package/templates/shopify-online-storefront/schemaTypes/objects/inventory.ts +30 -0
- package/templates/shopify-online-storefront/schemaTypes/objects/option.ts +30 -0
- package/templates/shopify-online-storefront/schemaTypes/objects/priceRange.ts +22 -0
- package/templates/shopify-online-storefront/schemaTypes/objects/proxyString.ts +11 -0
- package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollection.ts +109 -0
- package/templates/shopify-online-storefront/schemaTypes/objects/shopifyCollectionRule.tsx +45 -0
- package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProduct.ts +165 -0
- package/templates/shopify-online-storefront/schemaTypes/objects/shopifyProductVariant.ts +151 -0
- package/templates/shopify-online-storefront/structure/collectionStructure.ts +9 -0
- package/templates/shopify-online-storefront/structure/index.ts +37 -0
- package/templates/shopify-online-storefront/structure/productStructure.ts +35 -0
- package/templates/shopify-online-storefront/utils/defineStructure.ts +11 -0
- package/templates/shopify-online-storefront/utils/getPriceRange.ts +24 -0
- package/templates/shopify-online-storefront/utils/shopifyUrls.ts +22 -0
- package/dist/actions/build/__tests__/buildApp.test.js +0 -367
- package/dist/actions/build/__tests__/buildApp.test.js.map +0 -1
- package/dist/actions/build/__tests__/buildStudio.test.js +0 -561
- package/dist/actions/build/__tests__/buildStudio.test.js.map +0 -1
- package/dist/actions/build/__tests__/checkRequiredDependencies.test.js +0 -233
- package/dist/actions/build/__tests__/checkRequiredDependencies.test.js.map +0 -1
- package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js +0 -414
- package/dist/actions/build/__tests__/checkStudioDependencyVersions.test.js.map +0 -1
- package/dist/actions/build/__tests__/determineBasePath.test.js +0 -24
- package/dist/actions/build/__tests__/determineBasePath.test.js.map +0 -1
- package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js +0 -109
- package/dist/actions/build/__tests__/getAutoUpdatesImportMap.test.js.map +0 -1
- package/dist/actions/build/__tests__/getViteConfig.test.js +0 -493
- package/dist/actions/build/__tests__/getViteConfig.test.js.map +0 -1
- package/dist/actions/build/__tests__/renderDocument.test.js +0 -278
- package/dist/actions/build/__tests__/renderDocument.test.js.map +0 -1
- package/dist/actions/build/__tests__/shouldAutoUpdate.test.js +0 -153
- package/dist/actions/build/__tests__/shouldAutoUpdate.test.js.map +0 -1
- package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js +0 -657
- package/dist/actions/build/renderDocumentWorker/__tests__/renderDocumentWorker.test.js.map +0 -1
- package/dist/actions/cors/constants.d.ts +0 -1
- package/dist/actions/cors/constants.js +0 -3
- package/dist/actions/cors/constants.js.map +0 -1
- package/dist/actions/cors/types.d.ts +0 -9
- package/dist/actions/cors/types.js +0 -3
- package/dist/actions/cors/types.js.map +0 -1
- package/dist/actions/dataset/__tests__/validateDatasetName.test.js +0 -182
- package/dist/actions/dataset/__tests__/validateDatasetName.test.js.map +0 -1
- package/dist/actions/deploy/__tests__/checkDir.test.js +0 -120
- package/dist/actions/deploy/__tests__/checkDir.test.js.map +0 -1
- package/dist/actions/docs/__tests__/normalizeDocsPath.test.js +0 -16
- package/dist/actions/docs/__tests__/normalizeDocsPath.test.js.map +0 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js +0 -124
- package/dist/actions/documents/validation/reporters/prettyReporter/__tests__/formatDocumentValidation.test.js.map +0 -1
- package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +0 -274
- package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +0 -1
- package/dist/actions/media/__tests__/importMedia.test.js +0 -182
- package/dist/actions/media/__tests__/importMedia.test.js.map +0 -1
- package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
- package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
- package/dist/actions/schema/__tests__/formatSchemaValidation.test.js +0 -174
- package/dist/actions/schema/__tests__/formatSchemaValidation.test.js.map +0 -1
- package/dist/actions/schema/__tests__/validateAction.test.js +0 -281
- package/dist/actions/schema/__tests__/validateAction.test.js.map +0 -1
- package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
- package/dist/actions/schema/schemaStoreConstants.js +0 -4
- package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
- package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
- package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
- package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
- package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
- package/dist/actions/schema/utils/schemaApiClient.js +0 -17
- package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
- package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js +0 -27
- package/dist/actions/telemetry/__tests__/fetchTelemetryConsent.test.js.map +0 -1
- package/dist/actions/users/__tests__/validateEmail.test.js +0 -16
- package/dist/actions/users/__tests__/validateEmail.test.js.map +0 -1
- package/dist/actions/users/apiVersion.d.ts +0 -6
- package/dist/actions/users/apiVersion.js +0 -7
- package/dist/actions/users/apiVersion.js.map +0 -1
- package/dist/commands/__tests__/blueprints.test.js +0 -54
- package/dist/commands/__tests__/blueprints.test.js.map +0 -1
- package/dist/commands/__tests__/build.test.js +0 -132
- package/dist/commands/__tests__/build.test.js.map +0 -1
- package/dist/commands/__tests__/codemod.test.js +0 -271
- package/dist/commands/__tests__/codemod.test.js.map +0 -1
- package/dist/commands/__tests__/debug.test.js +0 -697
- package/dist/commands/__tests__/debug.test.js.map +0 -1
- package/dist/commands/__tests__/deploy.test.js +0 -1913
- package/dist/commands/__tests__/deploy.test.js.map +0 -1
- package/dist/commands/__tests__/dev.test.js +0 -410
- package/dist/commands/__tests__/dev.test.js.map +0 -1
- package/dist/commands/__tests__/exec.test.js +0 -207
- package/dist/commands/__tests__/exec.test.js.map +0 -1
- package/dist/commands/__tests__/init/init.authentication.test.js +0 -60
- package/dist/commands/__tests__/init/init.authentication.test.js.map +0 -1
- package/dist/commands/__tests__/init/init.create-new-project.test.js +0 -196
- package/dist/commands/__tests__/init/init.create-new-project.test.js.map +0 -1
- package/dist/commands/__tests__/init/init.plan.test.js +0 -220
- package/dist/commands/__tests__/init/init.plan.test.js.map +0 -1
- package/dist/commands/__tests__/init/init.setup.test.js +0 -279
- package/dist/commands/__tests__/init/init.setup.test.js.map +0 -1
- package/dist/commands/__tests__/install.test.js +0 -258
- package/dist/commands/__tests__/install.test.js.map +0 -1
- package/dist/commands/__tests__/learn.test.js +0 -29
- package/dist/commands/__tests__/learn.test.js.map +0 -1
- package/dist/commands/__tests__/logout.test.js +0 -88
- package/dist/commands/__tests__/logout.test.js.map +0 -1
- package/dist/commands/__tests__/manage.test.js +0 -105
- package/dist/commands/__tests__/manage.test.js.map +0 -1
- package/dist/commands/__tests__/migration.test.js +0 -119
- package/dist/commands/__tests__/migration.test.js.map +0 -1
- package/dist/commands/__tests__/preview.test.js +0 -261
- package/dist/commands/__tests__/preview.test.js.map +0 -1
- package/dist/commands/__tests__/start.test.js +0 -253
- package/dist/commands/__tests__/start.test.js.map +0 -1
- package/dist/commands/__tests__/undeploy.test.js +0 -382
- package/dist/commands/__tests__/undeploy.test.js.map +0 -1
- package/dist/commands/__tests__/versions.test.js +0 -134
- package/dist/commands/__tests__/versions.test.js.map +0 -1
- package/dist/commands/backup/__tests__/disable.test.js +0 -207
- package/dist/commands/backup/__tests__/disable.test.js.map +0 -1
- package/dist/commands/backup/__tests__/download.test.js +0 -679
- package/dist/commands/backup/__tests__/download.test.js.map +0 -1
- package/dist/commands/backup/__tests__/enable.test.js +0 -317
- package/dist/commands/backup/__tests__/enable.test.js.map +0 -1
- package/dist/commands/backup/__tests__/list.test.js +0 -321
- package/dist/commands/backup/__tests__/list.test.js.map +0 -1
- package/dist/commands/cors/__tests__/add.test.js +0 -346
- package/dist/commands/cors/__tests__/add.test.js.map +0 -1
- package/dist/commands/cors/__tests__/delete.test.js +0 -293
- package/dist/commands/cors/__tests__/delete.test.js.map +0 -1
- package/dist/commands/cors/__tests__/list.test.js +0 -218
- package/dist/commands/cors/__tests__/list.test.js.map +0 -1
- package/dist/commands/dataset/__tests__/copy.test.js +0 -520
- package/dist/commands/dataset/__tests__/copy.test.js.map +0 -1
- package/dist/commands/dataset/__tests__/create.test.js +0 -312
- package/dist/commands/dataset/__tests__/create.test.js.map +0 -1
- package/dist/commands/dataset/__tests__/delete.test.js +0 -224
- package/dist/commands/dataset/__tests__/delete.test.js.map +0 -1
- package/dist/commands/dataset/__tests__/export.test.js +0 -561
- package/dist/commands/dataset/__tests__/export.test.js.map +0 -1
- package/dist/commands/dataset/__tests__/import.test.js +0 -53
- package/dist/commands/dataset/__tests__/import.test.js.map +0 -1
- package/dist/commands/dataset/__tests__/list.test.js +0 -174
- package/dist/commands/dataset/__tests__/list.test.js.map +0 -1
- package/dist/commands/dataset/alias/__tests__/create.test.js +0 -299
- package/dist/commands/dataset/alias/__tests__/create.test.js.map +0 -1
- package/dist/commands/dataset/alias/__tests__/delete.test.js +0 -236
- package/dist/commands/dataset/alias/__tests__/delete.test.js.map +0 -1
- package/dist/commands/dataset/alias/__tests__/link.test.js +0 -336
- package/dist/commands/dataset/alias/__tests__/link.test.js.map +0 -1
- package/dist/commands/dataset/alias/__tests__/unlink.test.js +0 -298
- package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +0 -1
- package/dist/commands/dataset/visibility/__tests__/get.test.js +0 -147
- package/dist/commands/dataset/visibility/__tests__/get.test.js.map +0 -1
- package/dist/commands/dataset/visibility/__tests__/set.test.js +0 -245
- package/dist/commands/dataset/visibility/__tests__/set.test.js.map +0 -1
- package/dist/commands/docs/__tests__/browse.test.js +0 -29
- package/dist/commands/docs/__tests__/browse.test.js.map +0 -1
- package/dist/commands/docs/__tests__/read.test.js +0 -78
- package/dist/commands/docs/__tests__/read.test.js.map +0 -1
- package/dist/commands/docs/__tests__/search.test.js +0 -254
- package/dist/commands/docs/__tests__/search.test.js.map +0 -1
- package/dist/commands/documents/__tests__/create.test.js +0 -967
- package/dist/commands/documents/__tests__/create.test.js.map +0 -1
- package/dist/commands/documents/__tests__/delete.test.js +0 -268
- package/dist/commands/documents/__tests__/delete.test.js.map +0 -1
- package/dist/commands/documents/__tests__/get.test.js +0 -209
- package/dist/commands/documents/__tests__/get.test.js.map +0 -1
- package/dist/commands/documents/__tests__/query.test.js +0 -405
- package/dist/commands/documents/__tests__/query.test.js.map +0 -1
- package/dist/commands/documents/__tests__/validate.test.js +0 -226
- package/dist/commands/documents/__tests__/validate.test.js.map +0 -1
- package/dist/commands/graphql/__tests__/list.test.js +0 -228
- package/dist/commands/graphql/__tests__/list.test.js.map +0 -1
- package/dist/commands/graphql/__tests__/undeploy.test.js +0 -384
- package/dist/commands/graphql/__tests__/undeploy.test.js.map +0 -1
- package/dist/commands/hook/__tests__/attempt.test.js +0 -260
- package/dist/commands/hook/__tests__/attempt.test.js.map +0 -1
- package/dist/commands/hook/__tests__/create.test.js +0 -121
- package/dist/commands/hook/__tests__/create.test.js.map +0 -1
- package/dist/commands/hook/__tests__/delete.test.js +0 -220
- package/dist/commands/hook/__tests__/delete.test.js.map +0 -1
- package/dist/commands/hook/__tests__/list.test.js +0 -138
- package/dist/commands/hook/__tests__/list.test.js.map +0 -1
- package/dist/commands/hook/__tests__/logs.test.js +0 -770
- package/dist/commands/hook/__tests__/logs.test.js.map +0 -1
- package/dist/commands/manifest/__tests__/extract.test.js +0 -123
- package/dist/commands/manifest/__tests__/extract.test.js.map +0 -1
- package/dist/commands/mcp/__tests__/configure.test.js +0 -397
- package/dist/commands/mcp/__tests__/configure.test.js.map +0 -1
- package/dist/commands/media/__tests__/create-aspect.test.js +0 -160
- package/dist/commands/media/__tests__/create-aspect.test.js.map +0 -1
- package/dist/commands/media/__tests__/delete-aspect.test.js +0 -333
- package/dist/commands/media/__tests__/delete-aspect.test.js.map +0 -1
- package/dist/commands/media/__tests__/deploy-aspect.test.js +0 -632
- package/dist/commands/media/__tests__/deploy-aspect.test.js.map +0 -1
- package/dist/commands/media/__tests__/export.test.js +0 -398
- package/dist/commands/media/__tests__/export.test.js.map +0 -1
- package/dist/commands/media/__tests__/import.test.js +0 -281
- package/dist/commands/media/__tests__/import.test.js.map +0 -1
- package/dist/commands/openapi/__tests__/get.test.js +0 -149
- package/dist/commands/openapi/__tests__/get.test.js.map +0 -1
- package/dist/commands/openapi/__tests__/list.test.js +0 -113
- package/dist/commands/openapi/__tests__/list.test.js.map +0 -1
- package/dist/commands/projects/__tests__/list.test.js +0 -153
- package/dist/commands/projects/__tests__/list.test.js.map +0 -1
- package/dist/commands/schema/__tests__/delete.test.js +0 -209
- package/dist/commands/schema/__tests__/delete.test.js.map +0 -1
- package/dist/commands/schema/__tests__/extract.test.js +0 -113
- package/dist/commands/schema/__tests__/extract.test.js.map +0 -1
- package/dist/commands/schema/__tests__/validate.test.js +0 -104
- package/dist/commands/schema/__tests__/validate.test.js.map +0 -1
- package/dist/commands/telemetry/__tests__/disable.test.js +0 -145
- package/dist/commands/telemetry/__tests__/disable.test.js.map +0 -1
- package/dist/commands/telemetry/__tests__/enable.test.js +0 -131
- package/dist/commands/telemetry/__tests__/enable.test.js.map +0 -1
- package/dist/commands/telemetry/__tests__/status.test.js +0 -153
- package/dist/commands/telemetry/__tests__/status.test.js.map +0 -1
- package/dist/commands/tokens/__tests__/add.test.js +0 -420
- package/dist/commands/tokens/__tests__/add.test.js.map +0 -1
- package/dist/commands/tokens/__tests__/delete.test.js +0 -375
- package/dist/commands/tokens/__tests__/delete.test.js.map +0 -1
- package/dist/commands/tokens/__tests__/list.test.js +0 -368
- package/dist/commands/tokens/__tests__/list.test.js.map +0 -1
- package/dist/commands/users/__tests__/invite.test.js +0 -341
- package/dist/commands/users/__tests__/invite.test.js.map +0 -1
- package/dist/commands/users/__tests__/list.test.js +0 -401
- package/dist/commands/users/__tests__/list.test.js.map +0 -1
- package/dist/hooks/prerun/__tests__/setupTelemetry.test.js +0 -77
- package/dist/hooks/prerun/__tests__/setupTelemetry.test.js.map +0 -1
- package/dist/services/__tests__/datasetAliases.test.js +0 -131
- package/dist/services/__tests__/datasetAliases.test.js.map +0 -1
- package/dist/services/__tests__/datasets.test.js +0 -436
- package/dist/services/__tests__/datasets.test.js.map +0 -1
- package/dist/services/__tests__/graphql.test.js +0 -43
- package/dist/services/__tests__/graphql.test.js.map +0 -1
- package/dist/services/__tests__/mediaLibraries.test.js +0 -88
- package/dist/services/__tests__/mediaLibraries.test.js.map +0 -1
- package/dist/services/__tests__/projects.test.js +0 -41
- package/dist/services/__tests__/projects.test.js.map +0 -1
- package/dist/services/__tests__/userApplications.test.js +0 -113
- package/dist/services/__tests__/userApplications.test.js.map +0 -1
- package/dist/util/__tests__/appId.test.js +0 -31
- package/dist/util/__tests__/appId.test.js.map +0 -1
- package/dist/util/__tests__/cliClient.test.js +0 -184
- package/dist/util/__tests__/cliClient.test.js.map +0 -1
- package/dist/util/__tests__/compareDependencyVersions.test.js +0 -426
- package/dist/util/__tests__/compareDependencyVersions.test.js.map +0 -1
- package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js +0 -74
- package/dist/util/__tests__/extractDocumentsFromNdjsonOrTarball.test.js.map +0 -1
- package/dist/util/__tests__/findNdjsonEntry.test.js +0 -54
- package/dist/util/__tests__/findNdjsonEntry.test.js.map +0 -1
- package/dist/util/__tests__/getCliVersion.test.js +0 -28
- package/dist/util/__tests__/getCliVersion.test.js.map +0 -1
- package/dist/util/__tests__/getLocalPackageVersion.test.js +0 -84
- package/dist/util/__tests__/getLocalPackageVersion.test.js.map +0 -1
- package/dist/util/__tests__/getWorkspace.test.js +0 -37
- package/dist/util/__tests__/getWorkspace.test.js.map +0 -1
- package/dist/util/__tests__/readPackageJson.test.js +0 -69
- package/dist/util/__tests__/readPackageJson.test.js.map +0 -1
- package/dist/util/__tests__/warnAboutMissingAppId.test.js +0 -28
- package/dist/util/__tests__/warnAboutMissingAppId.test.js.map +0 -1
- package/dist/util/packageManager/__tests__/installPackages.test.js +0 -388
- package/dist/util/packageManager/__tests__/installPackages.test.js.map +0 -1
- package/dist/util/validation/ __tests__/validateDocuments.test.js +0 -274
- package/dist/util/validation/ __tests__/validateDocuments.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/dataset/export.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {type Writable} from 'node:stream'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input, spinner} from '@sanity/cli-core/ux'\nimport {type DatasetsResponse} from '@sanity/client'\nimport {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport boxen from 'boxen'\nimport prettyMs from 'pretty-ms'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('dataset:export')\n\nexport class DatasetExportCommand extends SanityCommand<typeof DatasetExportCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the dataset to export',\n }),\n // Args are order dependent\n // eslint-disable-next-line perfectionist/sort-objects\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description =\n 'Export dataset to local filesystem as a gzipped tarball. Assets failing with HTTP status codes 401, 403 and 404 upon download are ignored and excluded from export.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> moviedb localPath.tar.gz',\n description: 'Export dataset \"moviedb\" to localPath.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> moviedb assetless.tar.gz --no-assets',\n description: 'Export dataset without assets',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --raw',\n description: 'Export raw documents without asset reference rewriting',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --types products,shops',\n description: 'Export specific document types',\n },\n ]\n\n static override flags = {\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n mode: Flags.string({\n default: 'stream',\n description:\n 'Mode to export documents with `cursor` might be more performant for larger datasets, but might not be as accurate if the dataset is being modified during export',\n options: ['stream', 'cursor'],\n }),\n 'no-assets': Flags.boolean({\n default: false,\n description: 'Export only non-asset documents and remove references to image assets',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n 'no-drafts': Flags.boolean({\n default: false,\n description: 'Export only published versions of documents',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n raw: Flags.boolean({\n default: false,\n description: 'Extract only documents, without rewriting asset references',\n }),\n types: Flags.string({\n description: 'Defines which document types to export (comma-separated)',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DatasetExportCommand)\n const {destination: targetDestination, name: targetDataset} = args\n\n // Get project configuration\n const cliConfig = await this.getCliConfig()\n const projectId = await this.getProjectId()\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {\n exit: 1,\n })\n }\n\n // Get the project API client\n const projectClient = await this.getProjectApiClient({\n apiVersion: '2023-05-26',\n projectId,\n requireUser: true,\n })\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await projectClient.datasets.list()\n } catch (error) {\n exportDebug('Error listing datasets', error)\n this.error(`Failed to list datasets:\\n${error instanceof Error ? error.message : error}`, {\n exit: 1,\n })\n }\n\n // Determine dataset name\n let dataset = targetDataset\n try {\n if (!dataset) {\n // Get default dataset from config\n const defaultDataset = cliConfig.api?.dataset\n if (defaultDataset) {\n dataset = defaultDataset\n this.log(`Using default dataset: ${dataset}`)\n } else {\n dataset = await promptForDataset({allowCreation: false, datasets})\n }\n }\n } catch (error) {\n exportDebug('Error selecting dataset', error)\n this.error(`Failed to select dataset:\\n${error instanceof Error ? error.message : error}`, {\n exit: 1,\n })\n }\n\n // Validate dataset name\n const dsError = validateDatasetName(dataset)\n if (dsError) {\n this.error(dsError, {exit: 1})\n }\n\n // Verify existence of dataset before trying to export from it\n if (!datasets.some((set) => set.name === dataset)) {\n this.error(`Dataset with name \"${dataset}\" not found`, {exit: 1})\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\ndataset: ${dataset.padEnd(46)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n // Determine output path\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = await this.promptForDestination({dataset})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, dataset, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: 1})\n }\n\n // Prepare export options\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n assets: !flags['no-assets'],\n client: projectClient,\n compress: !flags['no-compress'],\n dataset,\n drafts: !flags['no-drafts'],\n mode: flags.mode === 'cursor' || flags.mode === 'stream' ? flags.mode : undefined,\n onProgress,\n outputPath,\n raw: flags.raw,\n types: flags.types ? flags.types.split(',') : undefined,\n }\n\n const start = Date.now()\n try {\n await exportDataset(exportOptions)\n succeed()\n this.log(`Export finished (${prettyMs(Date.now() - start)})`)\n } catch (error) {\n fail()\n const err = error instanceof Error ? error : new Error(String(error))\n exportDebug('Export failed', err)\n this.error(`Export failed: ${err.message}`, {exit: 1})\n }\n }\n\n private createProgressHandler() {\n let currentSpinner: ReturnType<typeof spinner> | null = null\n let currentStep = ''\n\n const onProgress = (progress: ExportProgress) => {\n if (progress.step !== currentStep) {\n // Complete previous step\n succeed()\n\n // Start new step\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\n // Update current step with progress info\n currentSpinner.text = `${progress.step} (${progress.current}/${progress.total})`\n }\n }\n\n const succeed = () => {\n currentSpinner?.succeed()\n }\n\n const fail = () => {\n currentSpinner?.fail()\n }\n\n return {fail, onProgress, succeed}\n }\n\n private async getOutputPath(\n destination: string,\n dataset: string,\n flags: {overwrite?: boolean},\n ): Promise<string | Writable> {\n if (destination === '-') {\n return process.stdout\n }\n\n const dstPath = path.isAbsolute(destination)\n ? destination\n : path.resolve(process.cwd(), destination)\n\n const dstStats = await fs.stat(dstPath).catch(noop)\n const looksLikeFile = dstStats ? dstStats.isFile() : path.basename(dstPath).includes('.')\n\n if (!dstStats) {\n const createPath = looksLikeFile ? path.dirname(dstPath) : dstPath\n try {\n await fs.mkdir(createPath, {recursive: true})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n const errorWithCode = err as Error & {code?: string}\n if (errorWithCode.code === 'EACCES') {\n this.error(\n `Permission denied: Cannot create directory \"${createPath}\". Please check write permissions.`,\n {\n exit: 1,\n },\n )\n } else {\n this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: 1,\n })\n }\n }\n }\n\n const finalPath = looksLikeFile ? dstPath : path.join(dstPath, `${dataset}.tar.gz`)\n const finalPathStats = await fs.stat(finalPath).catch(noop)\n\n if (!flags.overwrite && finalPathStats && finalPathStats.isFile()) {\n this.error(`File \"${finalPath}\" already exists. Use --overwrite flag to overwrite it.`, {\n exit: 1,\n })\n }\n\n return finalPath\n }\n\n private promptForDestination(options: {dataset: string; workDir?: string}): Promise<string> {\n const {dataset, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${dataset}.tar.gz`)\n\n return input({\n default: defaultPath,\n message: 'Output path:',\n transformer: (value: string) => absolutify(value.trim()),\n validate: (value: string) => {\n const trimmed = value.trim()\n if (!trimmed) {\n return 'Please provide a valid output path'\n }\n return true\n },\n })\n }\n}\n"],"names":["fs","path","Args","Flags","SanityCommand","subdebug","input","spinner","exportDataset","boxen","prettyMs","validateDatasetName","promptForDataset","absolutify","NO_PROJECT_ID","noop","exportDebug","DatasetExportCommand","args","name","string","description","destination","examples","command","flags","integer","default","mode","options","boolean","overwrite","raw","types","run","parse","targetDestination","targetDataset","cliConfig","getCliConfig","projectId","getProjectId","error","exit","projectClient","getProjectApiClient","apiVersion","requireUser","datasets","list","Error","message","dataset","defaultDataset","api","log","allowCreation","dsError","some","set","padEnd","borderColor","borderStyle","destinationPath","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","assets","client","compress","drafts","undefined","split","start","Date","now","err","String","currentSpinner","currentStep","progress","step","update","text","current","total","process","stdout","dstPath","isAbsolute","resolve","cwd","dstStats","stat","catch","looksLikeFile","isFile","basename","includes","createPath","dirname","mkdir","recursive","errorWithCode","code","finalPath","join","finalPathStats","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/dataset/export.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {type Writable} from 'node:stream'\n\nimport {Args, Flags} from '@oclif/core'\nimport {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input, spinner} from '@sanity/cli-core/ux'\nimport {type DatasetsResponse} from '@sanity/client'\nimport {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport boxen from 'boxen'\nimport prettyMs from 'pretty-ms'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('dataset:export')\n\nexport class DatasetExportCommand extends SanityCommand<typeof DatasetExportCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the dataset to export',\n }),\n // Args are order dependent\n // eslint-disable-next-line perfectionist/sort-objects\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description =\n 'Export dataset to local filesystem as a gzipped tarball. Assets failing with HTTP status codes 401, 403 and 404 upon download are ignored and excluded from export.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> moviedb localPath.tar.gz',\n description: 'Export dataset \"moviedb\" to localPath.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> moviedb assetless.tar.gz --no-assets',\n description: 'Export dataset without assets',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --raw',\n description: 'Export raw documents without asset reference rewriting',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --types products,shops',\n description: 'Export specific document types',\n },\n ]\n\n static override flags = {\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n mode: Flags.string({\n default: 'stream',\n description:\n 'Mode to export documents with `cursor` might be more performant for larger datasets, but might not be as accurate if the dataset is being modified during export',\n options: ['stream', 'cursor'],\n }),\n 'no-assets': Flags.boolean({\n default: false,\n description: 'Export only non-asset documents and remove references to image assets',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n 'no-drafts': Flags.boolean({\n default: false,\n description: 'Export only published versions of documents',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n raw: Flags.boolean({\n default: false,\n description: 'Extract only documents, without rewriting asset references',\n }),\n types: Flags.string({\n description: 'Defines which document types to export (comma-separated)',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DatasetExportCommand)\n const {destination: targetDestination, name: targetDataset} = args\n\n // Get project configuration\n const cliConfig = await this.getCliConfig()\n const projectId = await this.getProjectId()\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {\n exit: 1,\n })\n }\n\n const projectClient = await getProjectCliClient({\n apiVersion: '2023-05-26',\n projectId,\n requireUser: true,\n })\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await listDatasets(projectId)\n } catch (error) {\n exportDebug('Error listing datasets', error)\n this.error(`Failed to list datasets:\\n${error instanceof Error ? error.message : error}`, {\n exit: 1,\n })\n }\n\n // Determine dataset name\n let dataset = targetDataset\n try {\n if (!dataset) {\n // Get default dataset from config\n const defaultDataset = cliConfig.api?.dataset\n if (defaultDataset) {\n dataset = defaultDataset\n this.log(`Using default dataset: ${dataset}`)\n } else {\n dataset = await promptForDataset({allowCreation: false, datasets})\n }\n }\n } catch (error) {\n exportDebug('Error selecting dataset', error)\n this.error(`Failed to select dataset:\\n${error instanceof Error ? error.message : error}`, {\n exit: 1,\n })\n }\n\n // Validate dataset name\n const dsError = validateDatasetName(dataset)\n if (dsError) {\n this.error(dsError, {exit: 1})\n }\n\n // Verify existence of dataset before trying to export from it\n if (!datasets.some((set) => set.name === dataset)) {\n this.error(`Dataset with name \"${dataset}\" not found`, {exit: 1})\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\ndataset: ${dataset.padEnd(46)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n // Determine output path\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = await this.promptForDestination({dataset})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, dataset, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: 1})\n }\n\n // Prepare export options\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n assets: !flags['no-assets'],\n client: projectClient,\n compress: !flags['no-compress'],\n dataset,\n drafts: !flags['no-drafts'],\n mode: flags.mode === 'cursor' || flags.mode === 'stream' ? flags.mode : undefined,\n onProgress,\n outputPath,\n raw: flags.raw,\n types: flags.types ? flags.types.split(',') : undefined,\n }\n\n const start = Date.now()\n try {\n await exportDataset(exportOptions)\n succeed()\n this.log(`Export finished (${prettyMs(Date.now() - start)})`)\n } catch (error) {\n fail()\n const err = error instanceof Error ? error : new Error(String(error))\n exportDebug('Export failed', err)\n this.error(`Export failed: ${err.message}`, {exit: 1})\n }\n }\n\n private createProgressHandler() {\n let currentSpinner: ReturnType<typeof spinner> | null = null\n let currentStep = ''\n\n const onProgress = (progress: ExportProgress) => {\n if (progress.step !== currentStep) {\n // Complete previous step\n succeed()\n\n // Start new step\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\n // Update current step with progress info\n currentSpinner.text = `${progress.step} (${progress.current}/${progress.total})`\n }\n }\n\n const succeed = () => {\n currentSpinner?.succeed()\n }\n\n const fail = () => {\n currentSpinner?.fail()\n }\n\n return {fail, onProgress, succeed}\n }\n\n private async getOutputPath(\n destination: string,\n dataset: string,\n flags: {overwrite?: boolean},\n ): Promise<string | Writable> {\n if (destination === '-') {\n return process.stdout\n }\n\n const dstPath = path.isAbsolute(destination)\n ? destination\n : path.resolve(process.cwd(), destination)\n\n const dstStats = await fs.stat(dstPath).catch(noop)\n const looksLikeFile = dstStats ? dstStats.isFile() : path.basename(dstPath).includes('.')\n\n if (!dstStats) {\n const createPath = looksLikeFile ? path.dirname(dstPath) : dstPath\n try {\n await fs.mkdir(createPath, {recursive: true})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n const errorWithCode = err as Error & {code?: string}\n if (errorWithCode.code === 'EACCES') {\n this.error(\n `Permission denied: Cannot create directory \"${createPath}\". Please check write permissions.`,\n {\n exit: 1,\n },\n )\n } else {\n this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: 1,\n })\n }\n }\n }\n\n const finalPath = looksLikeFile ? dstPath : path.join(dstPath, `${dataset}.tar.gz`)\n const finalPathStats = await fs.stat(finalPath).catch(noop)\n\n if (!flags.overwrite && finalPathStats && finalPathStats.isFile()) {\n this.error(`File \"${finalPath}\" already exists. Use --overwrite flag to overwrite it.`, {\n exit: 1,\n })\n }\n\n return finalPath\n }\n\n private promptForDestination(options: {dataset: string; workDir?: string}): Promise<string> {\n const {dataset, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${dataset}.tar.gz`)\n\n return input({\n default: defaultPath,\n message: 'Output path:',\n transformer: (value: string) => absolutify(value.trim()),\n validate: (value: string) => {\n const trimmed = value.trim()\n if (!trimmed) {\n return 'Please provide a valid output path'\n }\n return true\n },\n })\n }\n}\n"],"names":["fs","path","Args","Flags","getProjectCliClient","SanityCommand","subdebug","input","spinner","exportDataset","boxen","prettyMs","validateDatasetName","promptForDataset","listDatasets","absolutify","NO_PROJECT_ID","noop","exportDebug","DatasetExportCommand","args","name","string","description","destination","examples","command","flags","integer","default","mode","options","boolean","overwrite","raw","types","run","parse","targetDestination","targetDataset","cliConfig","getCliConfig","projectId","getProjectId","error","exit","projectClient","apiVersion","requireUser","datasets","Error","message","dataset","defaultDataset","api","log","allowCreation","dsError","some","set","padEnd","borderColor","borderStyle","destinationPath","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","assets","client","compress","drafts","undefined","split","start","Date","now","err","String","currentSpinner","currentStep","progress","step","update","text","current","total","process","stdout","dstPath","isAbsolute","resolve","cwd","dstStats","stat","catch","looksLikeFile","isFile","basename","includes","createPath","dirname","mkdir","recursive","errorWithCode","code","finalPath","join","finalPathStats","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
|
package/dist/commands/debug.js
CHANGED
|
@@ -6,7 +6,6 @@ import { omit, padStart } from 'lodash-es';
|
|
|
6
6
|
import { gatherDebugInfo } from '../actions/debug/gatherDebugInfo.js';
|
|
7
7
|
import { getGlobalConfigLocation } from '../actions/debug/getGlobalConfigLocation.js';
|
|
8
8
|
import { getDisplayName, getFormatters } from '../actions/versions/getFormatters.js';
|
|
9
|
-
const DEBUG_API_VERSION = '2025-08-06';
|
|
10
9
|
export class Debug extends SanityCommand {
|
|
11
10
|
static description = 'Provides diagnostic info for Sanity Studio troubleshooting';
|
|
12
11
|
static examples = [
|
|
@@ -24,13 +23,8 @@ export class Debug extends SanityCommand {
|
|
|
24
23
|
try {
|
|
25
24
|
const projectRoot = await this.getProjectRoot();
|
|
26
25
|
const cliConfig = await this.getCliConfig();
|
|
27
|
-
const client = await this.getGlobalApiClient({
|
|
28
|
-
apiVersion: DEBUG_API_VERSION,
|
|
29
|
-
requireUser: true
|
|
30
|
-
});
|
|
31
26
|
const { auth, globalConfig, project, projectConfig, user, versions } = await gatherDebugInfo({
|
|
32
27
|
cliConfig,
|
|
33
|
-
client,
|
|
34
28
|
includeSecrets: flags.secrets,
|
|
35
29
|
projectRoot
|
|
36
30
|
});
|
|
@@ -39,9 +33,10 @@ export class Debug extends SanityCommand {
|
|
|
39
33
|
this.log(` ${chalk.red(user.message)}\n`);
|
|
40
34
|
} else if (user) {
|
|
41
35
|
printKeyValue({
|
|
42
|
-
Email: user.email,
|
|
43
36
|
ID: user.id,
|
|
44
37
|
Name: user.name,
|
|
38
|
+
// eslint-disable-next-line perfectionist/sort-objects
|
|
39
|
+
Email: user.email,
|
|
45
40
|
Roles: project && 'userRoles' in project ? project.userRoles : undefined
|
|
46
41
|
});
|
|
47
42
|
}
|
|
@@ -49,8 +44,9 @@ export class Debug extends SanityCommand {
|
|
|
49
44
|
if (project && 'id' in project) {
|
|
50
45
|
this.log('Project:');
|
|
51
46
|
printKeyValue({
|
|
52
|
-
|
|
53
|
-
|
|
47
|
+
ID: project.id,
|
|
48
|
+
// eslint-disable-next-line perfectionist/sort-objects
|
|
49
|
+
'Display name': project.displayName
|
|
54
50
|
});
|
|
55
51
|
}
|
|
56
52
|
// Auth info
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/debug.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {Flags} from '@oclif/core'\nimport {formatObject, printKeyValue, SanityCommand} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\nimport {omit, padStart} from 'lodash-es'\n\nimport {gatherDebugInfo} from '../actions/debug/gatherDebugInfo.js'\nimport {getGlobalConfigLocation} from '../actions/debug/getGlobalConfigLocation.js'\nimport {getDisplayName, getFormatters} from '../actions/versions/getFormatters.js'\n\
|
|
1
|
+
{"version":3,"sources":["../../src/commands/debug.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {Flags} from '@oclif/core'\nimport {formatObject, printKeyValue, SanityCommand} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\nimport {omit, padStart} from 'lodash-es'\n\nimport {gatherDebugInfo} from '../actions/debug/gatherDebugInfo.js'\nimport {getGlobalConfigLocation} from '../actions/debug/getGlobalConfigLocation.js'\nimport {getDisplayName, getFormatters} from '../actions/versions/getFormatters.js'\n\nexport class Debug extends SanityCommand<typeof Debug> {\n static override description = 'Provides diagnostic info for Sanity Studio troubleshooting'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n '<%= config.bin %> <%= command.id %> --secrets',\n ]\n\n static override flags = {\n secrets: Flags.boolean({\n default: false,\n description: 'Include API keys in output',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = this\n\n try {\n const projectRoot = await this.getProjectRoot()\n const cliConfig = await this.getCliConfig()\n\n const {auth, globalConfig, project, projectConfig, user, versions} = await gatherDebugInfo({\n cliConfig,\n includeSecrets: flags.secrets,\n projectRoot,\n })\n\n this.output.log('\\nUser:')\n if (user instanceof Error) {\n this.log(` ${chalk.red(user.message)}\\n`)\n } else if (user) {\n printKeyValue({\n ID: user.id,\n Name: user.name,\n // eslint-disable-next-line perfectionist/sort-objects\n Email: user.email,\n Roles: project && 'userRoles' in project ? project.userRoles : undefined,\n })\n }\n\n // Project info (API-based)\n if (project && 'id' in project) {\n this.log('Project:')\n printKeyValue({\n ID: project.id,\n // eslint-disable-next-line perfectionist/sort-objects\n 'Display name': project.displayName,\n })\n }\n\n // Auth info\n if (auth.hasToken) {\n this.log('Authentication:')\n printKeyValue({\n 'Auth token': flags.secrets ? auth.authToken : `<redacted>`,\n 'User type': globalConfig.authType || 'normal',\n })\n\n if (!flags.secrets) {\n this.log(' (run with --secrets to reveal token)\\n')\n }\n }\n\n // Global configuration (user home dir config file)\n this.log(`Global config (${chalk.yellow(getGlobalConfigLocation())}):`)\n const globalCfg = omit(globalConfig, ['authType', 'authToken'])\n this.log(` ${formatObject(globalCfg).replaceAll('\\n', '\\n ')}\\n`)\n\n // Project configuration (projectDir/sanity.json)\n if (projectConfig) {\n const configLocation = projectConfig\n ? ` (${chalk.yellow(path.relative(process.cwd(), projectRoot.path))})`\n : ''\n\n this.log(`Project config${configLocation}:`)\n this.log(` ${formatObject(projectConfig).replaceAll('\\n', '\\n ')}`)\n }\n\n // Print installed package versions\n if (versions) {\n this.log('\\nPackage versions:')\n\n const {formatName, versionLength} = getFormatters(versions)\n for (const mod of versions) {\n const version = padStart(mod.installed || '<missing>', versionLength)\n const latest =\n mod.installed === mod.latest\n ? chalk.green('(up to date)')\n : `(latest: ${chalk.yellow(mod.latest)})`\n\n this.log(`${formatName(getDisplayName(mod))} ${version} ${latest}`)\n }\n\n this.log('')\n }\n } catch (error) {\n this.error(\n `Failed to gather debug information: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n }\n}\n"],"names":["path","Flags","formatObject","printKeyValue","SanityCommand","chalk","omit","padStart","gatherDebugInfo","getGlobalConfigLocation","getDisplayName","getFormatters","Debug","description","examples","flags","secrets","boolean","default","run","projectRoot","getProjectRoot","cliConfig","getCliConfig","auth","globalConfig","project","projectConfig","user","versions","includeSecrets","output","log","Error","red","message","ID","id","Name","name","Email","email","Roles","userRoles","undefined","displayName","hasToken","authToken","authType","yellow","globalCfg","replaceAll","configLocation","relative","process","cwd","formatName","versionLength","mod","version","installed","latest","green","error"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAE5B,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,YAAY,EAAEC,aAAa,EAAEC,aAAa,QAAO,mBAAkB;AAC3E,SAAQC,KAAK,QAAO,sBAAqB;AACzC,SAAQC,IAAI,EAAEC,QAAQ,QAAO,YAAW;AAExC,SAAQC,eAAe,QAAO,sCAAqC;AACnE,SAAQC,uBAAuB,QAAO,8CAA6C;AACnF,SAAQC,cAAc,EAAEC,aAAa,QAAO,uCAAsC;AAElF,OAAO,MAAMC,cAAcR;IACzB,OAAgBS,cAAc,6DAA4D;IAE1F,OAAgBC,WAAW;QACzB;QACA;KACD,CAAA;IAED,OAAgBC,QAAQ;QACtBC,SAASf,MAAMgB,OAAO,CAAC;YACrBC,SAAS;YACTL,aAAa;QACf;IACF,EAAC;IAED,MAAaM,MAAqB;QAChC,MAAM,EAACJ,KAAK,EAAC,GAAG,IAAI;QAEpB,IAAI;YACF,MAAMK,cAAc,MAAM,IAAI,CAACC,cAAc;YAC7C,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY;YAEzC,MAAM,EAACC,IAAI,EAAEC,YAAY,EAAEC,OAAO,EAAEC,aAAa,EAAEC,IAAI,EAAEC,QAAQ,EAAC,GAAG,MAAMrB,gBAAgB;gBACzFc;gBACAQ,gBAAgBf,MAAMC,OAAO;gBAC7BI;YACF;YAEA,IAAI,CAACW,MAAM,CAACC,GAAG,CAAC;YAChB,IAAIJ,gBAAgBK,OAAO;gBACzB,IAAI,CAACD,GAAG,CAAC,CAAC,EAAE,EAAE3B,MAAM6B,GAAG,CAACN,KAAKO,OAAO,EAAE,EAAE,CAAC;YAC3C,OAAO,IAAIP,MAAM;gBACfzB,cAAc;oBACZiC,IAAIR,KAAKS,EAAE;oBACXC,MAAMV,KAAKW,IAAI;oBACf,sDAAsD;oBACtDC,OAAOZ,KAAKa,KAAK;oBACjBC,OAAOhB,WAAW,eAAeA,UAAUA,QAAQiB,SAAS,GAAGC;gBACjE;YACF;YAEA,2BAA2B;YAC3B,IAAIlB,WAAW,QAAQA,SAAS;gBAC9B,IAAI,CAACM,GAAG,CAAC;gBACT7B,cAAc;oBACZiC,IAAIV,QAAQW,EAAE;oBACd,sDAAsD;oBACtD,gBAAgBX,QAAQmB,WAAW;gBACrC;YACF;YAEA,YAAY;YACZ,IAAIrB,KAAKsB,QAAQ,EAAE;gBACjB,IAAI,CAACd,GAAG,CAAC;gBACT7B,cAAc;oBACZ,cAAcY,MAAMC,OAAO,GAAGQ,KAAKuB,SAAS,GAAG,CAAC,UAAU,CAAC;oBAC3D,aAAatB,aAAauB,QAAQ,IAAI;gBACxC;gBAEA,IAAI,CAACjC,MAAMC,OAAO,EAAE;oBAClB,IAAI,CAACgB,GAAG,CAAC;gBACX;YACF;YAEA,mDAAmD;YACnD,IAAI,CAACA,GAAG,CAAC,CAAC,eAAe,EAAE3B,MAAM4C,MAAM,CAACxC,2BAA2B,EAAE,CAAC;YACtE,MAAMyC,YAAY5C,KAAKmB,cAAc;gBAAC;gBAAY;aAAY;YAC9D,IAAI,CAACO,GAAG,CAAC,CAAC,EAAE,EAAE9B,aAAagD,WAAWC,UAAU,CAAC,MAAM,QAAQ,EAAE,CAAC;YAElE,iDAAiD;YACjD,IAAIxB,eAAe;gBACjB,MAAMyB,iBAAiBzB,gBACnB,CAAC,EAAE,EAAEtB,MAAM4C,MAAM,CAACjD,KAAKqD,QAAQ,CAACC,QAAQC,GAAG,IAAInC,YAAYpB,IAAI,GAAG,CAAC,CAAC,GACpE;gBAEJ,IAAI,CAACgC,GAAG,CAAC,CAAC,cAAc,EAAEoB,eAAe,CAAC,CAAC;gBAC3C,IAAI,CAACpB,GAAG,CAAC,CAAC,EAAE,EAAE9B,aAAayB,eAAewB,UAAU,CAAC,MAAM,SAAS;YACtE;YAEA,mCAAmC;YACnC,IAAItB,UAAU;gBACZ,IAAI,CAACG,GAAG,CAAC;gBAET,MAAM,EAACwB,UAAU,EAAEC,aAAa,EAAC,GAAG9C,cAAckB;gBAClD,KAAK,MAAM6B,OAAO7B,SAAU;oBAC1B,MAAM8B,UAAUpD,SAASmD,IAAIE,SAAS,IAAI,aAAaH;oBACvD,MAAMI,SACJH,IAAIE,SAAS,KAAKF,IAAIG,MAAM,GACxBxD,MAAMyD,KAAK,CAAC,kBACZ,CAAC,SAAS,EAAEzD,MAAM4C,MAAM,CAACS,IAAIG,MAAM,EAAE,CAAC,CAAC;oBAE7C,IAAI,CAAC7B,GAAG,CAAC,GAAGwB,WAAW9C,eAAegD,MAAM,CAAC,EAAEC,QAAQ,CAAC,EAAEE,QAAQ;gBACpE;gBAEA,IAAI,CAAC7B,GAAG,CAAC;YACX;QACF,EAAE,OAAO+B,OAAO;YACd,IAAI,CAACA,KAAK,CACR,CAAC,oCAAoC,EAAEA,iBAAiB9B,QAAQ8B,MAAM5B,OAAO,GAAG,iBAAiB;QAErG;IACF;AACF"}
|
package/dist/commands/dev.js
CHANGED
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/dev.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\n\nimport {devAction} from '../actions/dev/devAction.js'\nimport {devDebug} from '../actions/dev/devDebug.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\n\nexport class DevCommand extends SanityCommand<typeof DevCommand> {\n static override description =\n 'Starts a local development server for Sanity Studio with live reloading'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %> --host=0.0.0.0',\n '<%= config.bin %> <%= command.id %> --port=1942',\n '<%= config.bin %> <%= command.id %> --load-in-dashboard',\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n description: 'Automatically update Sanity Studio dependencies.',\n }),\n host: Flags.string({\n default: 'localhost',\n description: 'The local network interface at which to listen.',\n }),\n 'load-in-dashboard': Flags.boolean({\n allowNo: true,\n description: 'Load the app/studio in the Sanity dashboard.',\n }),\n port: Flags.string({\n default: '3333',\n description: 'TCP port to start server on.',\n }),\n }\n\n public async run(): Promise<{close?: () => Promise<void>}> {\n const {flags} = await this.parse(DevCommand)\n\n const workDir = (await this.getProjectRoot()).directory\n const cliConfig = await this.getCliConfig()\n const isApp = determineIsApp(cliConfig)\n\n // load-in-dashboard is defaulted to true for apps.\n if (isApp && flags['load-in-dashboard'] === undefined) {\n flags['load-in-dashboard'] = true\n } else if (flags['load-in-dashboard'] === undefined) {\n // For non-apps, load-in-dashboard is defaulted to false.\n flags['load-in-dashboard'] = false\n }\n\n try {\n const result = await devAction({\n
|
|
1
|
+
{"version":3,"sources":["../../src/commands/dev.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\n\nimport {devAction} from '../actions/dev/devAction.js'\nimport {devDebug} from '../actions/dev/devDebug.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\n\nexport class DevCommand extends SanityCommand<typeof DevCommand> {\n static override description =\n 'Starts a local development server for Sanity Studio with live reloading'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %> --host=0.0.0.0',\n '<%= config.bin %> <%= command.id %> --port=1942',\n '<%= config.bin %> <%= command.id %> --load-in-dashboard',\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n description: 'Automatically update Sanity Studio dependencies.',\n }),\n host: Flags.string({\n default: 'localhost',\n description: 'The local network interface at which to listen.',\n }),\n 'load-in-dashboard': Flags.boolean({\n allowNo: true,\n description: 'Load the app/studio in the Sanity dashboard.',\n }),\n port: Flags.string({\n default: '3333',\n description: 'TCP port to start server on.',\n }),\n }\n\n public async run(): Promise<{close?: () => Promise<void>}> {\n const {flags} = await this.parse(DevCommand)\n\n const workDir = (await this.getProjectRoot()).directory\n const cliConfig = await this.getCliConfig()\n const isApp = determineIsApp(cliConfig)\n\n // load-in-dashboard is defaulted to true for apps.\n if (isApp && flags['load-in-dashboard'] === undefined) {\n flags['load-in-dashboard'] = true\n } else if (flags['load-in-dashboard'] === undefined) {\n // For non-apps, load-in-dashboard is defaulted to false.\n flags['load-in-dashboard'] = false\n }\n\n try {\n const result = await devAction({\n cliConfig,\n flags,\n isApp,\n output: this.output,\n workDir,\n })\n return result\n } catch (error) {\n devDebug(`Failed to start dev server`, error)\n this.output.error(chalk.red.bgBlack(`Failed to start dev server: ${error.message}`), {\n exit: 1,\n })\n }\n }\n}\n"],"names":["Flags","SanityCommand","chalk","devAction","devDebug","determineIsApp","DevCommand","description","examples","flags","boolean","allowNo","host","string","default","port","run","parse","workDir","getProjectRoot","directory","cliConfig","getCliConfig","isApp","undefined","result","output","error","red","bgBlack","message","exit"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAC9C,SAAQC,KAAK,QAAO,sBAAqB;AAEzC,SAAQC,SAAS,QAAO,8BAA6B;AACrD,SAAQC,QAAQ,QAAO,6BAA4B;AACnD,SAAQC,cAAc,QAAO,4BAA2B;AAExD,OAAO,MAAMC,mBAAmBL;IAC9B,OAAgBM,cACd,0EAAyE;IAE3E,OAAgBC,WAAW;QACzB;QACA;QACA;KACD,CAAA;IAED,OAAgBC,QAAQ;QACtB,gBAAgBT,MAAMU,OAAO,CAAC;YAC5BC,SAAS;YACTJ,aAAa;QACf;QACAK,MAAMZ,MAAMa,MAAM,CAAC;YACjBC,SAAS;YACTP,aAAa;QACf;QACA,qBAAqBP,MAAMU,OAAO,CAAC;YACjCC,SAAS;YACTJ,aAAa;QACf;QACAQ,MAAMf,MAAMa,MAAM,CAAC;YACjBC,SAAS;YACTP,aAAa;QACf;IACF,EAAC;IAED,MAAaS,MAA8C;QACzD,MAAM,EAACP,KAAK,EAAC,GAAG,MAAM,IAAI,CAACQ,KAAK,CAACX;QAEjC,MAAMY,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGC,SAAS;QACvD,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,MAAMC,QAAQlB,eAAegB;QAE7B,mDAAmD;QACnD,IAAIE,SAASd,KAAK,CAAC,oBAAoB,KAAKe,WAAW;YACrDf,KAAK,CAAC,oBAAoB,GAAG;QAC/B,OAAO,IAAIA,KAAK,CAAC,oBAAoB,KAAKe,WAAW;YACnD,yDAAyD;YACzDf,KAAK,CAAC,oBAAoB,GAAG;QAC/B;QAEA,IAAI;YACF,MAAMgB,SAAS,MAAMtB,UAAU;gBAC7BkB;gBACAZ;gBACAc;gBACAG,QAAQ,IAAI,CAACA,MAAM;gBACnBR;YACF;YACA,OAAOO;QACT,EAAE,OAAOE,OAAO;YACdvB,SAAS,CAAC,0BAA0B,CAAC,EAAEuB;YACvC,IAAI,CAACD,MAAM,CAACC,KAAK,CAACzB,MAAM0B,GAAG,CAACC,OAAO,CAAC,CAAC,4BAA4B,EAAEF,MAAMG,OAAO,EAAE,GAAG;gBACnFC,MAAM;YACR;QACF;IACF;AACF"}
|
|
@@ -17,6 +17,7 @@ export declare class CreateDocumentCommand extends SanityCommand<typeof CreateDo
|
|
|
17
17
|
replace: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
18
|
watch: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
19
19
|
};
|
|
20
|
+
private client;
|
|
20
21
|
run(): Promise<void>;
|
|
21
22
|
private getErrorMessage;
|
|
22
23
|
/**
|
|
@@ -3,7 +3,7 @@ import fs from 'node:fs/promises';
|
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { Args, Flags } from '@oclif/core';
|
|
6
|
-
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
6
|
+
import { getProjectCliClient, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
7
7
|
import { watch as chokidarWatch } from 'chokidar';
|
|
8
8
|
import { execa, execaSync } from 'execa';
|
|
9
9
|
import json5 from 'json5';
|
|
@@ -60,6 +60,7 @@ export class CreateDocumentCommand extends SanityCommand {
|
|
|
60
60
|
description: 'Write the documents whenever the target file or buffer changes'
|
|
61
61
|
})
|
|
62
62
|
};
|
|
63
|
+
client;
|
|
63
64
|
async run() {
|
|
64
65
|
const { args, flags } = await this.parse(CreateDocumentCommand);
|
|
65
66
|
const { file } = args;
|
|
@@ -77,7 +78,7 @@ export class CreateDocumentCommand extends SanityCommand {
|
|
|
77
78
|
});
|
|
78
79
|
}
|
|
79
80
|
const targetDataset = dataset || cliConfig.api?.dataset;
|
|
80
|
-
|
|
81
|
+
this.client = await getProjectCliClient({
|
|
81
82
|
apiVersion: DOCUMENTS_API_VERSION,
|
|
82
83
|
dataset: targetDataset,
|
|
83
84
|
projectId,
|
|
@@ -101,7 +102,7 @@ export class CreateDocumentCommand extends SanityCommand {
|
|
|
101
102
|
try {
|
|
102
103
|
const contentPath = path.resolve(process.cwd(), file);
|
|
103
104
|
const content = json5.parse(await fs.readFile(contentPath, 'utf8'));
|
|
104
|
-
const result = await this.writeDocuments(content, operation
|
|
105
|
+
const result = await this.writeDocuments(content, operation);
|
|
105
106
|
this.log(this.getResultMessage(result, operation));
|
|
106
107
|
return;
|
|
107
108
|
} catch (error) {
|
|
@@ -119,7 +120,7 @@ export class CreateDocumentCommand extends SanityCommand {
|
|
|
119
120
|
// Add UUID prefix to prevent predictable file names and potential conflicts
|
|
120
121
|
const tmpFile = path.join(os.tmpdir(), 'sanity-cli', `${randomUUID()}-${docId}.${ext}`);
|
|
121
122
|
const stringify = useJson5 ? json5.stringify : JSON.stringify;
|
|
122
|
-
const defaultValue = id && await client.getDocument(id) || {
|
|
123
|
+
const defaultValue = id && await this.client.getDocument(id) || {
|
|
123
124
|
_id: docId,
|
|
124
125
|
_type: 'specify-me'
|
|
125
126
|
};
|
|
@@ -135,7 +136,7 @@ export class CreateDocumentCommand extends SanityCommand {
|
|
|
135
136
|
mode: 0o600
|
|
136
137
|
});
|
|
137
138
|
const editor = getEditor();
|
|
138
|
-
const readAndPerformCreatesFromFile = this.readAndPerformCreatesFromFile.bind(this, operation
|
|
139
|
+
const readAndPerformCreatesFromFile = this.readAndPerformCreatesFromFile.bind(this, operation);
|
|
139
140
|
if (watch) {
|
|
140
141
|
// If we're in watch mode, we want to run the creation on each change (if it validates)
|
|
141
142
|
registerUnlinkOnSigInt(tmpFile);
|
|
@@ -216,7 +217,7 @@ export class CreateDocumentCommand extends SanityCommand {
|
|
|
216
217
|
}
|
|
217
218
|
/**
|
|
218
219
|
* Reads and processes documents from a file for creation
|
|
219
|
-
*/ async readAndPerformCreatesFromFile(operation,
|
|
220
|
+
*/ async readAndPerformCreatesFromFile(operation, filePath, defaultValue) {
|
|
220
221
|
let content;
|
|
221
222
|
try {
|
|
222
223
|
content = json5.parse(await fs.readFile(filePath, 'utf8'));
|
|
@@ -232,7 +233,7 @@ export class CreateDocumentCommand extends SanityCommand {
|
|
|
232
233
|
return;
|
|
233
234
|
}
|
|
234
235
|
try {
|
|
235
|
-
const writeResult = await this.writeDocuments(content, operation
|
|
236
|
+
const writeResult = await this.writeDocuments(content, operation);
|
|
236
237
|
this.log(this.getResultMessage(writeResult, operation));
|
|
237
238
|
} catch (err) {
|
|
238
239
|
const error = err;
|
|
@@ -298,7 +299,7 @@ export class CreateDocumentCommand extends SanityCommand {
|
|
|
298
299
|
}
|
|
299
300
|
/**
|
|
300
301
|
* Writes documents to Sanity using the specified operation
|
|
301
|
-
*/ async writeDocuments(documents, operation
|
|
302
|
+
*/ async writeDocuments(documents, operation) {
|
|
302
303
|
const docs = Array.isArray(documents) ? documents : [
|
|
303
304
|
documents
|
|
304
305
|
];
|
|
@@ -330,7 +331,7 @@ export class CreateDocumentCommand extends SanityCommand {
|
|
|
330
331
|
}
|
|
331
332
|
throw new Error(`Unsupported operation ${operation}`);
|
|
332
333
|
});
|
|
333
|
-
return client.transaction(mutations).commit();
|
|
334
|
+
return this.client.transaction(mutations).commit();
|
|
334
335
|
}
|
|
335
336
|
}
|
|
336
337
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/documents/create.ts"],"sourcesContent":["import {randomUUID} from 'node:crypto'\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {type MultipleMutationResult, type Mutation} from '@sanity/client'\nimport {watch as chokidarWatch} from 'chokidar'\nimport {execa, execaSync} from 'execa'\nimport json5 from 'json5'\nimport {isEqual, isPlainObject} from 'lodash-es'\n\nimport {DOCUMENTS_API_VERSION} from '../../actions/documents/constants.js'\nimport {getEditor, registerUnlinkOnSigInt} from '../../actions/documents/editor.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\nimport {isIdentifiedSanityDocument, isSanityDocumentish} from '../../util/isSanityDocumentish.js'\n\nexport type MutationOperationName = 'create' | 'createIfNotExists' | 'createOrReplace'\n\nconst createDocumentDebug = subdebug('documents:create')\n\nexport class CreateDocumentCommand extends SanityCommand<typeof CreateDocumentCommand> {\n static override args = {\n file: Args.string({\n description: 'JSON file to create document(s) from',\n required: false,\n }),\n }\n\n static override description = 'Create one or more documents'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> myDocument.json',\n description: 'Create the document specified in \"myDocument.json\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Open configured $EDITOR and create the specified document(s)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --id myDocId --replace',\n description:\n 'Fetch document with the ID \"myDocId\" and open configured $EDITOR with the current document content (if any). Replace document with the edited version when the editor closes',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --id myDocId --watch --replace --json5',\n description:\n 'Open configured $EDITOR and replace the document with the given content on each save. Use JSON5 file extension and parser for simplified syntax.',\n },\n ]\n\n static override flags = {\n dataset: Flags.string({\n char: 'd',\n description: 'Dataset to create document(s) in (overrides config)',\n }),\n id: Flags.string({\n description:\n 'Specify a document ID to use. Will fetch remote document ID and populate editor.',\n }),\n json5: Flags.boolean({\n description: 'Use JSON5 file type to allow a \"simplified\" version of JSON',\n }),\n missing: Flags.boolean({\n description: \"On duplicate document IDs, don't modify the target document(s)\",\n }),\n replace: Flags.boolean({\n description:\n 'On duplicate document IDs, replace existing document with specified document(s)',\n }),\n watch: Flags.boolean({\n description: 'Write the documents whenever the target file or buffer changes',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CreateDocumentCommand)\n const {file} = args\n const {dataset, id, json5: useJson5, missing, replace, watch} = flags\n const cliConfig = await this.getCliConfig()\n const projectId = await this.getProjectId()\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n if (!cliConfig.api?.dataset && !dataset) {\n this.error(\n 'No dataset specified. Either configure a dataset in sanity.cli.ts or use the --dataset flag',\n {exit: 1},\n )\n }\n\n const targetDataset = dataset || cliConfig.api?.dataset\n\n const client = await this.getProjectApiClient({\n apiVersion: DOCUMENTS_API_VERSION,\n dataset: targetDataset,\n projectId,\n requireUser: true,\n })\n\n if (replace && missing) {\n this.error('Cannot use both --replace and --missing', {exit: 1})\n }\n\n if (id && file) {\n this.error('Cannot use --id when specifying a file path', {exit: 1})\n }\n\n let operation: MutationOperationName = 'create'\n if (replace || missing) {\n operation = replace ? 'createOrReplace' : 'createIfNotExists'\n }\n\n if (file) {\n try {\n const contentPath = path.resolve(process.cwd(), file)\n const content = json5.parse(await fs.readFile(contentPath, 'utf8'))\n const result = await this.writeDocuments(content, operation, client)\n this.log(this.getResultMessage(result, operation))\n return\n } catch (error) {\n const err = error as Error\n createDocumentDebug(`Error creating documents from file ${file}`, err)\n this.error(`Failed to create documents: ${err.message}`, {exit: 1})\n }\n }\n\n try {\n // Create a temporary file and use that as source, opening an editor on it\n const docId = id || randomUUID()\n const ext = useJson5 ? 'json5' : 'json'\n // Add UUID prefix to prevent predictable file names and potential conflicts\n const tmpFile = path.join(os.tmpdir(), 'sanity-cli', `${randomUUID()}-${docId}.${ext}`)\n const stringify = useJson5 ? json5.stringify : JSON.stringify\n const defaultValue = (id && (await client.getDocument(id))) || {\n _id: docId,\n _type: 'specify-me',\n }\n\n // Create temp directory with restricted permissions (owner only)\n const tempDir = path.join(os.tmpdir(), 'sanity-cli')\n await fs.mkdir(tempDir, {\n mode: 0o700, // rwx------ (owner read/write/execute only)\n recursive: true,\n })\n\n // Write file with restricted permissions (owner read/write only)\n await fs.writeFile(tmpFile, stringify(defaultValue, null, 2), {\n encoding: 'utf8',\n mode: 0o600, // rw------- (owner read/write only)\n })\n\n const editor = getEditor()\n const readAndPerformCreatesFromFile = this.readAndPerformCreatesFromFile.bind(\n this,\n operation,\n client,\n )\n\n if (watch) {\n // If we're in watch mode, we want to run the creation on each change (if it validates)\n registerUnlinkOnSigInt(tmpFile)\n this.log(`Watch mode: ${tmpFile}`)\n this.log('Watch mode: Will write documents on each save.')\n this.log('Watch mode: Press Ctrl + C to cancel watch mode.')\n\n // Add race condition protection\n let isProcessing = false\n chokidarWatch(tmpFile).on('change', async () => {\n if (isProcessing) {\n return // Skip if already processing\n }\n isProcessing = true\n\n this.log('')\n try {\n await readAndPerformCreatesFromFile(tmpFile, defaultValue)\n } finally {\n isProcessing = false\n }\n })\n execa(editor.bin, [...editor.args, tmpFile], {stdio: 'inherit'})\n } else {\n // While in normal mode, we just want to wait for the editor to close and run the thing once\n execaSync(editor.bin, [...editor.args, tmpFile], {stdio: 'inherit'})\n await readAndPerformCreatesFromFile(tmpFile, defaultValue)\n await fs.unlink(tmpFile).catch(() => {})\n }\n } catch (error) {\n const err = error as Error\n createDocumentDebug('Error in editor workflow', err)\n this.error(`Failed to create documents: ${err.message}`, {exit: 1})\n }\n }\n\n private getErrorMessage(message: string, index: number, isSingle: boolean): string {\n return isSingle ? `Document ${message}` : `Document at index ${index} ${message}`\n }\n\n /**\n * Formats the result message for document operations\n */\n private getResultMessage(\n result: MultipleMutationResult,\n operation: MutationOperationName,\n ): string {\n const joiner = '\\n - '\n if (operation === 'createOrReplace') {\n return `Upserted:\\n - ${result.results.map((res) => res.id).join(joiner)}`\n }\n\n if (operation === 'create') {\n return `Created:\\n - ${result.results.map((res) => res.id).join(joiner)}`\n }\n\n // \"Missing\" (createIfNotExists)\n const created: string[] = []\n const skipped: string[] = []\n for (const res of result.results) {\n if (res.operation === 'update') {\n skipped.push(res.id)\n } else {\n created.push(res.id)\n }\n }\n\n if (created.length > 0 && skipped.length > 0) {\n return [\n `Created:\\n - ${created.join(joiner)}`,\n `Skipped (already exists):${joiner}${skipped.join(joiner)}`,\n ].join('\\n\\n')\n } else if (created.length > 0) {\n return `Created:\\n - ${created.join(joiner)}`\n }\n\n return `Skipped (already exists):\\n - ${skipped.join(joiner)}`\n }\n\n /**\n * Reads and processes documents from a file for creation\n */\n private async readAndPerformCreatesFromFile(\n operation: MutationOperationName,\n client: Awaited<ReturnType<typeof this.getProjectApiClient>>,\n filePath: string,\n defaultValue: unknown,\n ): Promise<void> {\n let content\n try {\n content = json5.parse(await fs.readFile(filePath, 'utf8'))\n } catch (err) {\n const error = err as Error\n createDocumentDebug(`Failed to read input file ${filePath}`, error)\n this.log(`Failed to read input: ${error.message}`)\n return\n }\n\n if (isEqual(content, defaultValue)) {\n this.log('Value not modified, doing nothing.')\n this.log('Modify document to trigger creation.')\n return\n }\n\n try {\n const writeResult = await this.writeDocuments(content, operation, client)\n this.log(this.getResultMessage(writeResult, operation))\n } catch (err) {\n const error = err as Error\n createDocumentDebug(`Failed to write documents`, error)\n let errorMessage = `Failed to write documents: ${error.message}`\n if (error.message.includes('already exists')) {\n errorMessage += '\\nPerhaps you want to use `--replace` or `--missing`?'\n }\n this.error(errorMessage, {exit: 1})\n }\n }\n\n /**\n * Validates a document for Sanity requirements\n */\n private validateDocument(doc: unknown, index: number, arr: unknown[]): void {\n const isSingle = arr.length === 1\n\n if (!isPlainObject(doc)) {\n throw new Error(this.getErrorMessage('must be an object', index, isSingle))\n }\n\n if (!isSanityDocumentish(doc)) {\n throw new Error(\n this.getErrorMessage('must have a `_type` property of type string', index, isSingle),\n )\n }\n\n // Enhanced validations for Sanity document constraints\n const docObj = doc as Record<string, unknown>\n\n // Validate _type is non-empty\n const typeValue = docObj._type?.toString().trim()\n if (!typeValue) {\n throw new Error(this.getErrorMessage('_type cannot be empty', index, isSingle))\n }\n\n // Validate _type format (alphanumeric, underscore, hyphen, dot)\n if (!/^[a-zA-Z][a-zA-Z0-9_.-]*$/.test(typeValue)) {\n throw new Error(\n this.getErrorMessage(\n '_type must start with a letter and contain only alphanumeric characters, underscores, hyphens, and dots',\n index,\n isSingle,\n ),\n )\n }\n\n // Validate _id format if present\n if (docObj._id && typeof docObj._id === 'string') {\n const idValue = docObj._id.trim()\n if (!idValue) {\n throw new Error(this.getErrorMessage('_id cannot be empty', index, isSingle))\n }\n\n // Sanity document IDs can contain alphanumeric chars, hyphens, underscores, and dots\n if (!/^[a-zA-Z0-9_.-]+$/.test(idValue)) {\n throw new Error(\n this.getErrorMessage(\n '_id can only contain alphanumeric characters, underscores, hyphens, and dots',\n index,\n isSingle,\n ),\n )\n }\n\n // Check length constraints (Sanity has reasonable limits)\n if (idValue.length > 200) {\n throw new Error(\n this.getErrorMessage('_id cannot be longer than 200 characters', index, isSingle),\n )\n }\n }\n\n // Warn about reserved fields (these are managed by Sanity)\n const reservedFields = ['_rev', '_updatedAt', '_createdAt']\n for (const field of reservedFields) {\n if (field in docObj) {\n // Note: We don't throw an error here as these might be present in fetched documents\n // that are being re-uploaded, but we could add a debug warning\n createDocumentDebug(\n `Warning: Document ${index} contains reserved field '${field}' which will be ignored by Sanity`,\n )\n }\n }\n }\n\n /**\n * Writes documents to Sanity using the specified operation\n */\n private async writeDocuments(\n documents: {_id?: string; _type: string} | {_id?: string; _type: string}[],\n operation: MutationOperationName,\n client: Awaited<ReturnType<typeof this.getProjectApiClient>>,\n ): Promise<MultipleMutationResult> {\n const docs = Array.isArray(documents) ? documents : [documents]\n if (docs.length === 0) {\n throw new Error('No documents provided')\n }\n\n const mutations = docs.map((doc, index): Mutation => {\n this.validateDocument(doc, index, docs)\n if (operation === 'create') {\n return {create: doc}\n }\n\n if (operation === 'createIfNotExists') {\n if (isIdentifiedSanityDocument(doc)) {\n return {createIfNotExists: doc}\n }\n\n throw new Error(`Missing required _id attribute for ${operation}`)\n }\n\n if (operation === 'createOrReplace') {\n if (isIdentifiedSanityDocument(doc)) {\n return {createOrReplace: doc}\n }\n\n throw new Error(`Missing required _id attribute for ${operation}`)\n }\n\n throw new Error(`Unsupported operation ${operation}`)\n })\n\n return client.transaction(mutations).commit()\n }\n}\n"],"names":["randomUUID","fs","os","path","Args","Flags","SanityCommand","subdebug","watch","chokidarWatch","execa","execaSync","json5","isEqual","isPlainObject","DOCUMENTS_API_VERSION","getEditor","registerUnlinkOnSigInt","NO_PROJECT_ID","isIdentifiedSanityDocument","isSanityDocumentish","createDocumentDebug","CreateDocumentCommand","args","file","string","description","required","examples","command","flags","dataset","char","id","boolean","missing","replace","run","parse","useJson5","cliConfig","getCliConfig","projectId","getProjectId","error","exit","api","targetDataset","client","getProjectApiClient","apiVersion","requireUser","operation","contentPath","resolve","process","cwd","content","readFile","result","writeDocuments","log","getResultMessage","err","message","docId","ext","tmpFile","join","tmpdir","stringify","JSON","defaultValue","getDocument","_id","_type","tempDir","mkdir","mode","recursive","writeFile","encoding","editor","readAndPerformCreatesFromFile","bind","isProcessing","on","bin","stdio","unlink","catch","getErrorMessage","index","isSingle","joiner","results","map","res","created","skipped","push","length","filePath","writeResult","errorMessage","includes","validateDocument","doc","arr","Error","docObj","typeValue","toString","trim","test","idValue","reservedFields","field","documents","docs","Array","isArray","mutations","create","createIfNotExists","createOrReplace","transaction","commit"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,OAAOC,QAAQ,mBAAkB;AACjC,OAAOC,QAAQ,UAAS;AACxB,OAAOC,UAAU,YAAW;AAE5B,SAAQC,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAQC,SAASC,aAAa,QAAO,WAAU;AAC/C,SAAQC,KAAK,EAAEC,SAAS,QAAO,QAAO;AACtC,OAAOC,WAAW,QAAO;AACzB,SAAQC,OAAO,EAAEC,aAAa,QAAO,YAAW;AAEhD,SAAQC,qBAAqB,QAAO,uCAAsC;AAC1E,SAAQC,SAAS,EAAEC,sBAAsB,QAAO,oCAAmC;AACnF,SAAQC,aAAa,QAAO,8BAA6B;AACzD,SAAQC,0BAA0B,EAAEC,mBAAmB,QAAO,oCAAmC;AAIjG,MAAMC,sBAAsBd,SAAS;AAErC,OAAO,MAAMe,8BAA8BhB;IACzC,OAAgBiB,OAAO;QACrBC,MAAMpB,KAAKqB,MAAM,CAAC;YAChBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,+BAA8B;IAE5D,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aACE;QACJ;QACA;YACEG,SAAS;YACTH,aACE;QACJ;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtBC,SAAS1B,MAAMoB,MAAM,CAAC;YACpBO,MAAM;YACNN,aAAa;QACf;QACAO,IAAI5B,MAAMoB,MAAM,CAAC;YACfC,aACE;QACJ;QACAd,OAAOP,MAAM6B,OAAO,CAAC;YACnBR,aAAa;QACf;QACAS,SAAS9B,MAAM6B,OAAO,CAAC;YACrBR,aAAa;QACf;QACAU,SAAS/B,MAAM6B,OAAO,CAAC;YACrBR,aACE;QACJ;QACAlB,OAAOH,MAAM6B,OAAO,CAAC;YACnBR,aAAa;QACf;IACF,EAAC;IAED,MAAaW,MAAqB;QAChC,MAAM,EAACd,IAAI,EAAEO,KAAK,EAAC,GAAG,MAAM,IAAI,CAACQ,KAAK,CAAChB;QACvC,MAAM,EAACE,IAAI,EAAC,GAAGD;QACf,MAAM,EAACQ,OAAO,EAAEE,EAAE,EAAErB,OAAO2B,QAAQ,EAAEJ,OAAO,EAAEC,OAAO,EAAE5B,KAAK,EAAC,GAAGsB;QAChE,MAAMU,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY;QAEzC,IAAI,CAACD,WAAW;YACd,IAAI,CAACE,KAAK,CAAC1B,eAAe;gBAAC2B,MAAM;YAAC;QACpC;QAEA,IAAI,CAACL,UAAUM,GAAG,EAAEf,WAAW,CAACA,SAAS;YACvC,IAAI,CAACa,KAAK,CACR,+FACA;gBAACC,MAAM;YAAC;QAEZ;QAEA,MAAME,gBAAgBhB,WAAWS,UAAUM,GAAG,EAAEf;QAEhD,MAAMiB,SAAS,MAAM,IAAI,CAACC,mBAAmB,CAAC;YAC5CC,YAAYnC;YACZgB,SAASgB;YACTL;YACAS,aAAa;QACf;QAEA,IAAIf,WAAWD,SAAS;YACtB,IAAI,CAACS,KAAK,CAAC,2CAA2C;gBAACC,MAAM;YAAC;QAChE;QAEA,IAAIZ,MAAMT,MAAM;YACd,IAAI,CAACoB,KAAK,CAAC,+CAA+C;gBAACC,MAAM;YAAC;QACpE;QAEA,IAAIO,YAAmC;QACvC,IAAIhB,WAAWD,SAAS;YACtBiB,YAAYhB,UAAU,oBAAoB;QAC5C;QAEA,IAAIZ,MAAM;YACR,IAAI;gBACF,MAAM6B,cAAclD,KAAKmD,OAAO,CAACC,QAAQC,GAAG,IAAIhC;gBAChD,MAAMiC,UAAU7C,MAAM0B,KAAK,CAAC,MAAMrC,GAAGyD,QAAQ,CAACL,aAAa;gBAC3D,MAAMM,SAAS,MAAM,IAAI,CAACC,cAAc,CAACH,SAASL,WAAWJ;gBAC7D,IAAI,CAACa,GAAG,CAAC,IAAI,CAACC,gBAAgB,CAACH,QAAQP;gBACvC;YACF,EAAE,OAAOR,OAAO;gBACd,MAAMmB,MAAMnB;gBACZvB,oBAAoB,CAAC,mCAAmC,EAAEG,MAAM,EAAEuC;gBAClE,IAAI,CAACnB,KAAK,CAAC,CAAC,4BAA4B,EAAEmB,IAAIC,OAAO,EAAE,EAAE;oBAACnB,MAAM;gBAAC;YACnE;QACF;QAEA,IAAI;YACF,0EAA0E;YAC1E,MAAMoB,QAAQhC,MAAMjC;YACpB,MAAMkE,MAAM3B,WAAW,UAAU;YACjC,4EAA4E;YAC5E,MAAM4B,UAAUhE,KAAKiE,IAAI,CAAClE,GAAGmE,MAAM,IAAI,cAAc,GAAGrE,aAAa,CAAC,EAAEiE,MAAM,CAAC,EAAEC,KAAK;YACtF,MAAMI,YAAY/B,WAAW3B,MAAM0D,SAAS,GAAGC,KAAKD,SAAS;YAC7D,MAAME,eAAe,AAACvC,MAAO,MAAMe,OAAOyB,WAAW,CAACxC,OAAS;gBAC7DyC,KAAKT;gBACLU,OAAO;YACT;YAEA,iEAAiE;YACjE,MAAMC,UAAUzE,KAAKiE,IAAI,CAAClE,GAAGmE,MAAM,IAAI;YACvC,MAAMpE,GAAG4E,KAAK,CAACD,SAAS;gBACtBE,MAAM;gBACNC,WAAW;YACb;YAEA,iEAAiE;YACjE,MAAM9E,GAAG+E,SAAS,CAACb,SAASG,UAAUE,cAAc,MAAM,IAAI;gBAC5DS,UAAU;gBACVH,MAAM;YACR;YAEA,MAAMI,SAASlE;YACf,MAAMmE,gCAAgC,IAAI,CAACA,6BAA6B,CAACC,IAAI,CAC3E,IAAI,EACJhC,WACAJ;YAGF,IAAIxC,OAAO;gBACT,uFAAuF;gBACvFS,uBAAuBkD;gBACvB,IAAI,CAACN,GAAG,CAAC,CAAC,YAAY,EAAEM,SAAS;gBACjC,IAAI,CAACN,GAAG,CAAC;gBACT,IAAI,CAACA,GAAG,CAAC;gBAET,gCAAgC;gBAChC,IAAIwB,eAAe;gBACnB5E,cAAc0D,SAASmB,EAAE,CAAC,UAAU;oBAClC,IAAID,cAAc;wBAChB,QAAO,6BAA6B;oBACtC;oBACAA,eAAe;oBAEf,IAAI,CAACxB,GAAG,CAAC;oBACT,IAAI;wBACF,MAAMsB,8BAA8BhB,SAASK;oBAC/C,SAAU;wBACRa,eAAe;oBACjB;gBACF;gBACA3E,MAAMwE,OAAOK,GAAG,EAAE;uBAAIL,OAAO3D,IAAI;oBAAE4C;iBAAQ,EAAE;oBAACqB,OAAO;gBAAS;YAChE,OAAO;gBACL,4FAA4F;gBAC5F7E,UAAUuE,OAAOK,GAAG,EAAE;uBAAIL,OAAO3D,IAAI;oBAAE4C;iBAAQ,EAAE;oBAACqB,OAAO;gBAAS;gBAClE,MAAML,8BAA8BhB,SAASK;gBAC7C,MAAMvE,GAAGwF,MAAM,CAACtB,SAASuB,KAAK,CAAC,KAAO;YACxC;QACF,EAAE,OAAO9C,OAAO;YACd,MAAMmB,MAAMnB;YACZvB,oBAAoB,4BAA4B0C;YAChD,IAAI,CAACnB,KAAK,CAAC,CAAC,4BAA4B,EAAEmB,IAAIC,OAAO,EAAE,EAAE;gBAACnB,MAAM;YAAC;QACnE;IACF;IAEQ8C,gBAAgB3B,OAAe,EAAE4B,KAAa,EAAEC,QAAiB,EAAU;QACjF,OAAOA,WAAW,CAAC,SAAS,EAAE7B,SAAS,GAAG,CAAC,kBAAkB,EAAE4B,MAAM,CAAC,EAAE5B,SAAS;IACnF;IAEA;;GAEC,GACD,AAAQF,iBACNH,MAA8B,EAC9BP,SAAgC,EACxB;QACR,MAAM0C,SAAS;QACf,IAAI1C,cAAc,mBAAmB;YACnC,OAAO,CAAC,eAAe,EAAEO,OAAOoC,OAAO,CAACC,GAAG,CAAC,CAACC,MAAQA,IAAIhE,EAAE,EAAEmC,IAAI,CAAC0B,SAAS;QAC7E;QAEA,IAAI1C,cAAc,UAAU;YAC1B,OAAO,CAAC,cAAc,EAAEO,OAAOoC,OAAO,CAACC,GAAG,CAAC,CAACC,MAAQA,IAAIhE,EAAE,EAAEmC,IAAI,CAAC0B,SAAS;QAC5E;QAEA,gCAAgC;QAChC,MAAMI,UAAoB,EAAE;QAC5B,MAAMC,UAAoB,EAAE;QAC5B,KAAK,MAAMF,OAAOtC,OAAOoC,OAAO,CAAE;YAChC,IAAIE,IAAI7C,SAAS,KAAK,UAAU;gBAC9B+C,QAAQC,IAAI,CAACH,IAAIhE,EAAE;YACrB,OAAO;gBACLiE,QAAQE,IAAI,CAACH,IAAIhE,EAAE;YACrB;QACF;QAEA,IAAIiE,QAAQG,MAAM,GAAG,KAAKF,QAAQE,MAAM,GAAG,GAAG;YAC5C,OAAO;gBACL,CAAC,cAAc,EAAEH,QAAQ9B,IAAI,CAAC0B,SAAS;gBACvC,CAAC,yBAAyB,EAAEA,SAASK,QAAQ/B,IAAI,CAAC0B,SAAS;aAC5D,CAAC1B,IAAI,CAAC;QACT,OAAO,IAAI8B,QAAQG,MAAM,GAAG,GAAG;YAC7B,OAAO,CAAC,cAAc,EAAEH,QAAQ9B,IAAI,CAAC0B,SAAS;QAChD;QAEA,OAAO,CAAC,+BAA+B,EAAEK,QAAQ/B,IAAI,CAAC0B,SAAS;IACjE;IAEA;;GAEC,GACD,MAAcX,8BACZ/B,SAAgC,EAChCJ,MAA4D,EAC5DsD,QAAgB,EAChB9B,YAAqB,EACN;QACf,IAAIf;QACJ,IAAI;YACFA,UAAU7C,MAAM0B,KAAK,CAAC,MAAMrC,GAAGyD,QAAQ,CAAC4C,UAAU;QACpD,EAAE,OAAOvC,KAAK;YACZ,MAAMnB,QAAQmB;YACd1C,oBAAoB,CAAC,0BAA0B,EAAEiF,UAAU,EAAE1D;YAC7D,IAAI,CAACiB,GAAG,CAAC,CAAC,sBAAsB,EAAEjB,MAAMoB,OAAO,EAAE;YACjD;QACF;QAEA,IAAInD,QAAQ4C,SAASe,eAAe;YAClC,IAAI,CAACX,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAAC;YACT;QACF;QAEA,IAAI;YACF,MAAM0C,cAAc,MAAM,IAAI,CAAC3C,cAAc,CAACH,SAASL,WAAWJ;YAClE,IAAI,CAACa,GAAG,CAAC,IAAI,CAACC,gBAAgB,CAACyC,aAAanD;QAC9C,EAAE,OAAOW,KAAK;YACZ,MAAMnB,QAAQmB;YACd1C,oBAAoB,CAAC,yBAAyB,CAAC,EAAEuB;YACjD,IAAI4D,eAAe,CAAC,2BAA2B,EAAE5D,MAAMoB,OAAO,EAAE;YAChE,IAAIpB,MAAMoB,OAAO,CAACyC,QAAQ,CAAC,mBAAmB;gBAC5CD,gBAAgB;YAClB;YACA,IAAI,CAAC5D,KAAK,CAAC4D,cAAc;gBAAC3D,MAAM;YAAC;QACnC;IACF;IAEA;;GAEC,GACD,AAAQ6D,iBAAiBC,GAAY,EAAEf,KAAa,EAAEgB,GAAc,EAAQ;QAC1E,MAAMf,WAAWe,IAAIP,MAAM,KAAK;QAEhC,IAAI,CAACvF,cAAc6F,MAAM;YACvB,MAAM,IAAIE,MAAM,IAAI,CAAClB,eAAe,CAAC,qBAAqBC,OAAOC;QACnE;QAEA,IAAI,CAACzE,oBAAoBuF,MAAM;YAC7B,MAAM,IAAIE,MACR,IAAI,CAAClB,eAAe,CAAC,+CAA+CC,OAAOC;QAE/E;QAEA,uDAAuD;QACvD,MAAMiB,SAASH;QAEf,8BAA8B;QAC9B,MAAMI,YAAYD,OAAOnC,KAAK,EAAEqC,WAAWC;QAC3C,IAAI,CAACF,WAAW;YACd,MAAM,IAAIF,MAAM,IAAI,CAAClB,eAAe,CAAC,yBAAyBC,OAAOC;QACvE;QAEA,gEAAgE;QAChE,IAAI,CAAC,4BAA4BqB,IAAI,CAACH,YAAY;YAChD,MAAM,IAAIF,MACR,IAAI,CAAClB,eAAe,CAClB,2GACAC,OACAC;QAGN;QAEA,iCAAiC;QACjC,IAAIiB,OAAOpC,GAAG,IAAI,OAAOoC,OAAOpC,GAAG,KAAK,UAAU;YAChD,MAAMyC,UAAUL,OAAOpC,GAAG,CAACuC,IAAI;YAC/B,IAAI,CAACE,SAAS;gBACZ,MAAM,IAAIN,MAAM,IAAI,CAAClB,eAAe,CAAC,uBAAuBC,OAAOC;YACrE;YAEA,qFAAqF;YACrF,IAAI,CAAC,oBAAoBqB,IAAI,CAACC,UAAU;gBACtC,MAAM,IAAIN,MACR,IAAI,CAAClB,eAAe,CAClB,gFACAC,OACAC;YAGN;YAEA,0DAA0D;YAC1D,IAAIsB,QAAQd,MAAM,GAAG,KAAK;gBACxB,MAAM,IAAIQ,MACR,IAAI,CAAClB,eAAe,CAAC,4CAA4CC,OAAOC;YAE5E;QACF;QAEA,2DAA2D;QAC3D,MAAMuB,iBAAiB;YAAC;YAAQ;YAAc;SAAa;QAC3D,KAAK,MAAMC,SAASD,eAAgB;YAClC,IAAIC,SAASP,QAAQ;gBACnB,oFAAoF;gBACpF,+DAA+D;gBAC/DzF,oBACE,CAAC,kBAAkB,EAAEuE,MAAM,0BAA0B,EAAEyB,MAAM,iCAAiC,CAAC;YAEnG;QACF;IACF;IAEA;;GAEC,GACD,MAAczD,eACZ0D,SAA0E,EAC1ElE,SAAgC,EAChCJ,MAA4D,EAC3B;QACjC,MAAMuE,OAAOC,MAAMC,OAAO,CAACH,aAAaA,YAAY;YAACA;SAAU;QAC/D,IAAIC,KAAKlB,MAAM,KAAK,GAAG;YACrB,MAAM,IAAIQ,MAAM;QAClB;QAEA,MAAMa,YAAYH,KAAKvB,GAAG,CAAC,CAACW,KAAKf;YAC/B,IAAI,CAACc,gBAAgB,CAACC,KAAKf,OAAO2B;YAClC,IAAInE,cAAc,UAAU;gBAC1B,OAAO;oBAACuE,QAAQhB;gBAAG;YACrB;YAEA,IAAIvD,cAAc,qBAAqB;gBACrC,IAAIjC,2BAA2BwF,MAAM;oBACnC,OAAO;wBAACiB,mBAAmBjB;oBAAG;gBAChC;gBAEA,MAAM,IAAIE,MAAM,CAAC,mCAAmC,EAAEzD,WAAW;YACnE;YAEA,IAAIA,cAAc,mBAAmB;gBACnC,IAAIjC,2BAA2BwF,MAAM;oBACnC,OAAO;wBAACkB,iBAAiBlB;oBAAG;gBAC9B;gBAEA,MAAM,IAAIE,MAAM,CAAC,mCAAmC,EAAEzD,WAAW;YACnE;YAEA,MAAM,IAAIyD,MAAM,CAAC,sBAAsB,EAAEzD,WAAW;QACtD;QAEA,OAAOJ,OAAO8E,WAAW,CAACJ,WAAWK,MAAM;IAC7C;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/documents/create.ts"],"sourcesContent":["import {randomUUID} from 'node:crypto'\nimport fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {type MultipleMutationResult, type Mutation} from '@sanity/client'\nimport {watch as chokidarWatch} from 'chokidar'\nimport {execa, execaSync} from 'execa'\nimport json5 from 'json5'\nimport {isEqual, isPlainObject} from 'lodash-es'\n\nimport {DOCUMENTS_API_VERSION} from '../../actions/documents/constants.js'\nimport {getEditor, registerUnlinkOnSigInt} from '../../actions/documents/editor.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\nimport {isIdentifiedSanityDocument, isSanityDocumentish} from '../../util/isSanityDocumentish.js'\n\nexport type MutationOperationName = 'create' | 'createIfNotExists' | 'createOrReplace'\n\nconst createDocumentDebug = subdebug('documents:create')\n\nexport class CreateDocumentCommand extends SanityCommand<typeof CreateDocumentCommand> {\n static override args = {\n file: Args.string({\n description: 'JSON file to create document(s) from',\n required: false,\n }),\n }\n\n static override description = 'Create one or more documents'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> myDocument.json',\n description: 'Create the document specified in \"myDocument.json\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Open configured $EDITOR and create the specified document(s)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --id myDocId --replace',\n description:\n 'Fetch document with the ID \"myDocId\" and open configured $EDITOR with the current document content (if any). Replace document with the edited version when the editor closes',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --id myDocId --watch --replace --json5',\n description:\n 'Open configured $EDITOR and replace the document with the given content on each save. Use JSON5 file extension and parser for simplified syntax.',\n },\n ]\n\n static override flags = {\n dataset: Flags.string({\n char: 'd',\n description: 'Dataset to create document(s) in (overrides config)',\n }),\n id: Flags.string({\n description:\n 'Specify a document ID to use. Will fetch remote document ID and populate editor.',\n }),\n json5: Flags.boolean({\n description: 'Use JSON5 file type to allow a \"simplified\" version of JSON',\n }),\n missing: Flags.boolean({\n description: \"On duplicate document IDs, don't modify the target document(s)\",\n }),\n replace: Flags.boolean({\n description:\n 'On duplicate document IDs, replace existing document with specified document(s)',\n }),\n watch: Flags.boolean({\n description: 'Write the documents whenever the target file or buffer changes',\n }),\n }\n\n private client!: Awaited<ReturnType<typeof getProjectCliClient>>\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CreateDocumentCommand)\n const {file} = args\n const {dataset, id, json5: useJson5, missing, replace, watch} = flags\n const cliConfig = await this.getCliConfig()\n const projectId = await this.getProjectId()\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n if (!cliConfig.api?.dataset && !dataset) {\n this.error(\n 'No dataset specified. Either configure a dataset in sanity.cli.ts or use the --dataset flag',\n {exit: 1},\n )\n }\n\n const targetDataset = dataset || cliConfig.api?.dataset\n\n this.client = await getProjectCliClient({\n apiVersion: DOCUMENTS_API_VERSION,\n dataset: targetDataset,\n projectId,\n requireUser: true,\n })\n\n if (replace && missing) {\n this.error('Cannot use both --replace and --missing', {exit: 1})\n }\n\n if (id && file) {\n this.error('Cannot use --id when specifying a file path', {exit: 1})\n }\n\n let operation: MutationOperationName = 'create'\n if (replace || missing) {\n operation = replace ? 'createOrReplace' : 'createIfNotExists'\n }\n\n if (file) {\n try {\n const contentPath = path.resolve(process.cwd(), file)\n const content = json5.parse(await fs.readFile(contentPath, 'utf8'))\n const result = await this.writeDocuments(content, operation)\n this.log(this.getResultMessage(result, operation))\n return\n } catch (error) {\n const err = error as Error\n createDocumentDebug(`Error creating documents from file ${file}`, err)\n this.error(`Failed to create documents: ${err.message}`, {exit: 1})\n }\n }\n\n try {\n // Create a temporary file and use that as source, opening an editor on it\n const docId = id || randomUUID()\n const ext = useJson5 ? 'json5' : 'json'\n // Add UUID prefix to prevent predictable file names and potential conflicts\n const tmpFile = path.join(os.tmpdir(), 'sanity-cli', `${randomUUID()}-${docId}.${ext}`)\n const stringify = useJson5 ? json5.stringify : JSON.stringify\n const defaultValue = (id && (await this.client.getDocument(id))) || {\n _id: docId,\n _type: 'specify-me',\n }\n\n // Create temp directory with restricted permissions (owner only)\n const tempDir = path.join(os.tmpdir(), 'sanity-cli')\n await fs.mkdir(tempDir, {\n mode: 0o700, // rwx------ (owner read/write/execute only)\n recursive: true,\n })\n\n // Write file with restricted permissions (owner read/write only)\n await fs.writeFile(tmpFile, stringify(defaultValue, null, 2), {\n encoding: 'utf8',\n mode: 0o600, // rw------- (owner read/write only)\n })\n\n const editor = getEditor()\n const readAndPerformCreatesFromFile = this.readAndPerformCreatesFromFile.bind(this, operation)\n\n if (watch) {\n // If we're in watch mode, we want to run the creation on each change (if it validates)\n registerUnlinkOnSigInt(tmpFile)\n this.log(`Watch mode: ${tmpFile}`)\n this.log('Watch mode: Will write documents on each save.')\n this.log('Watch mode: Press Ctrl + C to cancel watch mode.')\n\n // Add race condition protection\n let isProcessing = false\n chokidarWatch(tmpFile).on('change', async () => {\n if (isProcessing) {\n return // Skip if already processing\n }\n isProcessing = true\n\n this.log('')\n try {\n await readAndPerformCreatesFromFile(tmpFile, defaultValue)\n } finally {\n isProcessing = false\n }\n })\n execa(editor.bin, [...editor.args, tmpFile], {stdio: 'inherit'})\n } else {\n // While in normal mode, we just want to wait for the editor to close and run the thing once\n execaSync(editor.bin, [...editor.args, tmpFile], {stdio: 'inherit'})\n await readAndPerformCreatesFromFile(tmpFile, defaultValue)\n await fs.unlink(tmpFile).catch(() => {})\n }\n } catch (error) {\n const err = error as Error\n createDocumentDebug('Error in editor workflow', err)\n this.error(`Failed to create documents: ${err.message}`, {exit: 1})\n }\n }\n\n private getErrorMessage(message: string, index: number, isSingle: boolean): string {\n return isSingle ? `Document ${message}` : `Document at index ${index} ${message}`\n }\n\n /**\n * Formats the result message for document operations\n */\n private getResultMessage(\n result: MultipleMutationResult,\n operation: MutationOperationName,\n ): string {\n const joiner = '\\n - '\n if (operation === 'createOrReplace') {\n return `Upserted:\\n - ${result.results.map((res) => res.id).join(joiner)}`\n }\n\n if (operation === 'create') {\n return `Created:\\n - ${result.results.map((res) => res.id).join(joiner)}`\n }\n\n // \"Missing\" (createIfNotExists)\n const created: string[] = []\n const skipped: string[] = []\n for (const res of result.results) {\n if (res.operation === 'update') {\n skipped.push(res.id)\n } else {\n created.push(res.id)\n }\n }\n\n if (created.length > 0 && skipped.length > 0) {\n return [\n `Created:\\n - ${created.join(joiner)}`,\n `Skipped (already exists):${joiner}${skipped.join(joiner)}`,\n ].join('\\n\\n')\n } else if (created.length > 0) {\n return `Created:\\n - ${created.join(joiner)}`\n }\n\n return `Skipped (already exists):\\n - ${skipped.join(joiner)}`\n }\n\n /**\n * Reads and processes documents from a file for creation\n */\n private async readAndPerformCreatesFromFile(\n operation: MutationOperationName,\n filePath: string,\n defaultValue: unknown,\n ): Promise<void> {\n let content\n try {\n content = json5.parse(await fs.readFile(filePath, 'utf8'))\n } catch (err) {\n const error = err as Error\n createDocumentDebug(`Failed to read input file ${filePath}`, error)\n this.log(`Failed to read input: ${error.message}`)\n return\n }\n\n if (isEqual(content, defaultValue)) {\n this.log('Value not modified, doing nothing.')\n this.log('Modify document to trigger creation.')\n return\n }\n\n try {\n const writeResult = await this.writeDocuments(content, operation)\n this.log(this.getResultMessage(writeResult, operation))\n } catch (err) {\n const error = err as Error\n createDocumentDebug(`Failed to write documents`, error)\n let errorMessage = `Failed to write documents: ${error.message}`\n if (error.message.includes('already exists')) {\n errorMessage += '\\nPerhaps you want to use `--replace` or `--missing`?'\n }\n this.error(errorMessage, {exit: 1})\n }\n }\n\n /**\n * Validates a document for Sanity requirements\n */\n private validateDocument(doc: unknown, index: number, arr: unknown[]): void {\n const isSingle = arr.length === 1\n\n if (!isPlainObject(doc)) {\n throw new Error(this.getErrorMessage('must be an object', index, isSingle))\n }\n\n if (!isSanityDocumentish(doc)) {\n throw new Error(\n this.getErrorMessage('must have a `_type` property of type string', index, isSingle),\n )\n }\n\n // Enhanced validations for Sanity document constraints\n const docObj = doc as Record<string, unknown>\n\n // Validate _type is non-empty\n const typeValue = docObj._type?.toString().trim()\n if (!typeValue) {\n throw new Error(this.getErrorMessage('_type cannot be empty', index, isSingle))\n }\n\n // Validate _type format (alphanumeric, underscore, hyphen, dot)\n if (!/^[a-zA-Z][a-zA-Z0-9_.-]*$/.test(typeValue)) {\n throw new Error(\n this.getErrorMessage(\n '_type must start with a letter and contain only alphanumeric characters, underscores, hyphens, and dots',\n index,\n isSingle,\n ),\n )\n }\n\n // Validate _id format if present\n if (docObj._id && typeof docObj._id === 'string') {\n const idValue = docObj._id.trim()\n if (!idValue) {\n throw new Error(this.getErrorMessage('_id cannot be empty', index, isSingle))\n }\n\n // Sanity document IDs can contain alphanumeric chars, hyphens, underscores, and dots\n if (!/^[a-zA-Z0-9_.-]+$/.test(idValue)) {\n throw new Error(\n this.getErrorMessage(\n '_id can only contain alphanumeric characters, underscores, hyphens, and dots',\n index,\n isSingle,\n ),\n )\n }\n\n // Check length constraints (Sanity has reasonable limits)\n if (idValue.length > 200) {\n throw new Error(\n this.getErrorMessage('_id cannot be longer than 200 characters', index, isSingle),\n )\n }\n }\n\n // Warn about reserved fields (these are managed by Sanity)\n const reservedFields = ['_rev', '_updatedAt', '_createdAt']\n for (const field of reservedFields) {\n if (field in docObj) {\n // Note: We don't throw an error here as these might be present in fetched documents\n // that are being re-uploaded, but we could add a debug warning\n createDocumentDebug(\n `Warning: Document ${index} contains reserved field '${field}' which will be ignored by Sanity`,\n )\n }\n }\n }\n\n /**\n * Writes documents to Sanity using the specified operation\n */\n private async writeDocuments(\n documents: {_id?: string; _type: string} | {_id?: string; _type: string}[],\n operation: MutationOperationName,\n ): Promise<MultipleMutationResult> {\n const docs = Array.isArray(documents) ? documents : [documents]\n if (docs.length === 0) {\n throw new Error('No documents provided')\n }\n\n const mutations = docs.map((doc, index): Mutation => {\n this.validateDocument(doc, index, docs)\n if (operation === 'create') {\n return {create: doc}\n }\n\n if (operation === 'createIfNotExists') {\n if (isIdentifiedSanityDocument(doc)) {\n return {createIfNotExists: doc}\n }\n\n throw new Error(`Missing required _id attribute for ${operation}`)\n }\n\n if (operation === 'createOrReplace') {\n if (isIdentifiedSanityDocument(doc)) {\n return {createOrReplace: doc}\n }\n\n throw new Error(`Missing required _id attribute for ${operation}`)\n }\n\n throw new Error(`Unsupported operation ${operation}`)\n })\n\n return this.client.transaction(mutations).commit()\n }\n}\n"],"names":["randomUUID","fs","os","path","Args","Flags","getProjectCliClient","SanityCommand","subdebug","watch","chokidarWatch","execa","execaSync","json5","isEqual","isPlainObject","DOCUMENTS_API_VERSION","getEditor","registerUnlinkOnSigInt","NO_PROJECT_ID","isIdentifiedSanityDocument","isSanityDocumentish","createDocumentDebug","CreateDocumentCommand","args","file","string","description","required","examples","command","flags","dataset","char","id","boolean","missing","replace","client","run","parse","useJson5","cliConfig","getCliConfig","projectId","getProjectId","error","exit","api","targetDataset","apiVersion","requireUser","operation","contentPath","resolve","process","cwd","content","readFile","result","writeDocuments","log","getResultMessage","err","message","docId","ext","tmpFile","join","tmpdir","stringify","JSON","defaultValue","getDocument","_id","_type","tempDir","mkdir","mode","recursive","writeFile","encoding","editor","readAndPerformCreatesFromFile","bind","isProcessing","on","bin","stdio","unlink","catch","getErrorMessage","index","isSingle","joiner","results","map","res","created","skipped","push","length","filePath","writeResult","errorMessage","includes","validateDocument","doc","arr","Error","docObj","typeValue","toString","trim","test","idValue","reservedFields","field","documents","docs","Array","isArray","mutations","create","createIfNotExists","createOrReplace","transaction","commit"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { getProjectCliClient, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
3
3
|
import { DOCUMENTS_API_VERSION } from '../../actions/documents/constants.js';
|
|
4
4
|
import { NO_PROJECT_ID } from '../../util/errorMessages.js';
|
|
5
5
|
const deleteDocumentDebug = subdebug('documents:delete');
|
|
@@ -70,8 +70,7 @@ export class DeleteDocumentCommand extends SanityCommand {
|
|
|
70
70
|
}
|
|
71
71
|
const targetDataset = dataset || cliConfig.api?.dataset;
|
|
72
72
|
try {
|
|
73
|
-
|
|
74
|
-
const projectClient = await this.getProjectApiClient({
|
|
73
|
+
const projectClient = await getProjectCliClient({
|
|
75
74
|
apiVersion: DOCUMENTS_API_VERSION,
|
|
76
75
|
dataset: targetDataset,
|
|
77
76
|
projectId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/documents/delete.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {DOCUMENTS_API_VERSION} from '../../actions/documents/constants.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst deleteDocumentDebug = subdebug('documents:delete')\n\nexport class DeleteDocumentCommand extends SanityCommand<typeof DeleteDocumentCommand> {\n static override args = {\n id: Args.string({\n description: 'Document ID to delete',\n required: true,\n }),\n ids: Args.string({\n description: 'Additional document IDs to delete',\n required: false,\n }),\n }\n\n static override description = 'Delete one or more documents from the projects configured dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> myDocId',\n description: 'Delete the document with the ID \"myDocId\"',\n },\n {\n command: \"<%= config.bin %> <%= command.id %> 'myDocId'\",\n description: 'ID wrapped in double or single quote works equally well',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset=blog someDocId',\n description: 'Delete document with ID \"someDocId\" from dataset \"blog\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> doc1 doc2',\n description: 'Delete the document with ID \"doc1\" and \"doc2\"',\n },\n ]\n\n static override flags = {\n dataset: Flags.string({\n description: 'NAME to override dataset',\n }),\n }\n\n // Disable strict mode to allow for more flexible input\n // This is needed for supporting multiple document IDs\n static override strict = false\n\n public async run(): Promise<void> {\n const {args, argv, flags} = await this.parse(DeleteDocumentCommand)\n const {id} = args\n const {dataset} = flags\n\n // Collect all document IDs from args and argv\n const ids = [id, ...argv.slice(1)].filter(Boolean) as string[]\n\n if (ids.length === 0) {\n this.error('Document ID must be specified', {exit: 1})\n }\n\n // Get project configuration\n const cliConfig = await this.getCliConfig()\n const projectId = await this.getProjectId()\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n if (!cliConfig.api?.dataset && !dataset) {\n this.error(\n 'No dataset specified. Either configure a dataset in sanity.cli.ts or use the --dataset flag',\n {exit: 1},\n )\n }\n\n const targetDataset = dataset || cliConfig.api?.dataset\n\n try {\n
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/documents/delete.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {DOCUMENTS_API_VERSION} from '../../actions/documents/constants.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst deleteDocumentDebug = subdebug('documents:delete')\n\nexport class DeleteDocumentCommand extends SanityCommand<typeof DeleteDocumentCommand> {\n static override args = {\n id: Args.string({\n description: 'Document ID to delete',\n required: true,\n }),\n ids: Args.string({\n description: 'Additional document IDs to delete',\n required: false,\n }),\n }\n\n static override description = 'Delete one or more documents from the projects configured dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> myDocId',\n description: 'Delete the document with the ID \"myDocId\"',\n },\n {\n command: \"<%= config.bin %> <%= command.id %> 'myDocId'\",\n description: 'ID wrapped in double or single quote works equally well',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset=blog someDocId',\n description: 'Delete document with ID \"someDocId\" from dataset \"blog\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> doc1 doc2',\n description: 'Delete the document with ID \"doc1\" and \"doc2\"',\n },\n ]\n\n static override flags = {\n dataset: Flags.string({\n description: 'NAME to override dataset',\n }),\n }\n\n // Disable strict mode to allow for more flexible input\n // This is needed for supporting multiple document IDs\n static override strict = false\n\n public async run(): Promise<void> {\n const {args, argv, flags} = await this.parse(DeleteDocumentCommand)\n const {id} = args\n const {dataset} = flags\n\n // Collect all document IDs from args and argv\n const ids = [id, ...argv.slice(1)].filter(Boolean) as string[]\n\n if (ids.length === 0) {\n this.error('Document ID must be specified', {exit: 1})\n }\n\n // Get project configuration\n const cliConfig = await this.getCliConfig()\n const projectId = await this.getProjectId()\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n if (!cliConfig.api?.dataset && !dataset) {\n this.error(\n 'No dataset specified. Either configure a dataset in sanity.cli.ts or use the --dataset flag',\n {exit: 1},\n )\n }\n\n const targetDataset = dataset || cliConfig.api?.dataset\n\n try {\n const projectClient = await getProjectCliClient({\n apiVersion: DOCUMENTS_API_VERSION,\n dataset: targetDataset,\n projectId,\n requireUser: true,\n })\n\n const transaction = projectClient.transaction()\n for (const id of ids) {\n transaction.delete(id)\n }\n const {results} = await transaction.commit()\n const deleted = results.filter((res) => res.operation === 'delete').map((res) => res.id)\n const notFound = ids.filter((id) => !deleted.includes(id))\n\n if (deleted.length > 0) {\n this.log(`Deleted ${deleted.length} ${deleted.length === 1 ? 'document' : 'documents'}`)\n }\n\n if (notFound.length > 0) {\n this.error(\n `${notFound.length === 1 ? 'Document' : 'Documents'} not found: ${notFound.join(', ')}`,\n {\n exit: 1,\n },\n )\n }\n } catch (error) {\n const err = error as Error\n deleteDocumentDebug(`Error deleting documents ${ids.join(', ')}`, err)\n this.error(\n `Failed to delete ${ids.length} ${ids.length === 1 ? 'document' : 'documents'}: ${err.message}`,\n {\n exit: 1,\n },\n )\n }\n }\n}\n"],"names":["Args","Flags","getProjectCliClient","SanityCommand","subdebug","DOCUMENTS_API_VERSION","NO_PROJECT_ID","deleteDocumentDebug","DeleteDocumentCommand","args","id","string","description","required","ids","examples","command","flags","dataset","strict","run","argv","parse","slice","filter","Boolean","length","error","exit","cliConfig","getCliConfig","projectId","getProjectId","api","targetDataset","projectClient","apiVersion","requireUser","transaction","delete","results","commit","deleted","res","operation","map","notFound","includes","log","join","err","message"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { colorizeJson, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { colorizeJson, getProjectCliClient, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
3
3
|
import { DOCUMENTS_API_VERSION } from '../../actions/documents/constants.js';
|
|
4
4
|
import { NO_PROJECT_ID } from '../../util/errorMessages.js';
|
|
5
5
|
const getDocumentDebug = subdebug('documents:get');
|
|
@@ -54,8 +54,7 @@ export class GetDocumentCommand extends SanityCommand {
|
|
|
54
54
|
}
|
|
55
55
|
const targetDataset = dataset || cliConfig.api?.dataset;
|
|
56
56
|
try {
|
|
57
|
-
|
|
58
|
-
const projectClient = await this.getProjectApiClient({
|
|
57
|
+
const projectClient = await getProjectCliClient({
|
|
59
58
|
apiVersion: DOCUMENTS_API_VERSION,
|
|
60
59
|
dataset: targetDataset,
|
|
61
60
|
projectId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/documents/get.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {colorizeJson, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {DOCUMENTS_API_VERSION} from '../../actions/documents/constants.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst getDocumentDebug = subdebug('documents:get')\n\nexport class GetDocumentCommand extends SanityCommand<typeof GetDocumentCommand> {\n static override args = {\n documentId: Args.string({\n description: 'Document ID to retrieve',\n required: true,\n }),\n }\n\n static override description = 'Get and print a document by ID'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> myDocId',\n description: 'Get the document with ID \"myDocId\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> myDocId --pretty',\n description: 'Get document with colorized JSON output',\n },\n {\n command: '<%= config.bin %> <%= command.id %> myDocId --dataset production',\n description: 'Get document from a specific dataset',\n },\n ]\n\n static override flags = {\n dataset: Flags.string({\n char: 'd',\n description: 'Dataset to get document from (overrides config)',\n }),\n pretty: Flags.boolean({\n default: false,\n description: 'Colorize JSON output',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(GetDocumentCommand)\n const {documentId} = args\n const {dataset, pretty} = flags\n\n // Get project configuration\n const cliConfig = await this.getCliConfig()\n const projectId = await this.getProjectId()\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n if (!cliConfig.api?.dataset && !dataset) {\n this.error(\n 'No dataset specified. Either configure a dataset in sanity.cli.ts or use the --dataset flag',\n {exit: 1},\n )\n }\n\n const targetDataset = dataset || cliConfig.api?.dataset\n\n try {\n
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/documents/get.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {colorizeJson, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {DOCUMENTS_API_VERSION} from '../../actions/documents/constants.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst getDocumentDebug = subdebug('documents:get')\n\nexport class GetDocumentCommand extends SanityCommand<typeof GetDocumentCommand> {\n static override args = {\n documentId: Args.string({\n description: 'Document ID to retrieve',\n required: true,\n }),\n }\n\n static override description = 'Get and print a document by ID'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> myDocId',\n description: 'Get the document with ID \"myDocId\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> myDocId --pretty',\n description: 'Get document with colorized JSON output',\n },\n {\n command: '<%= config.bin %> <%= command.id %> myDocId --dataset production',\n description: 'Get document from a specific dataset',\n },\n ]\n\n static override flags = {\n dataset: Flags.string({\n char: 'd',\n description: 'Dataset to get document from (overrides config)',\n }),\n pretty: Flags.boolean({\n default: false,\n description: 'Colorize JSON output',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(GetDocumentCommand)\n const {documentId} = args\n const {dataset, pretty} = flags\n\n // Get project configuration\n const cliConfig = await this.getCliConfig()\n const projectId = await this.getProjectId()\n\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n if (!cliConfig.api?.dataset && !dataset) {\n this.error(\n 'No dataset specified. Either configure a dataset in sanity.cli.ts or use the --dataset flag',\n {exit: 1},\n )\n }\n\n const targetDataset = dataset || cliConfig.api?.dataset\n\n try {\n const projectClient = await getProjectCliClient({\n apiVersion: DOCUMENTS_API_VERSION,\n dataset: targetDataset,\n projectId,\n requireUser: true,\n })\n\n const doc = await projectClient.getDocument(documentId)\n\n if (!doc) {\n this.error(`Document \"${documentId}\" not found in dataset \"${targetDataset}\"`, {exit: 1})\n }\n\n // Output the document\n if (pretty) {\n this.log(colorizeJson(doc))\n } else {\n this.log(JSON.stringify(doc, null, 2))\n }\n } catch (error) {\n const err = error as Error\n\n getDocumentDebug(`Error fetching document ${documentId}`, err)\n this.error(`Failed to fetch document: ${err.message}`, {exit: 1})\n }\n }\n}\n"],"names":["Args","Flags","colorizeJson","getProjectCliClient","SanityCommand","subdebug","DOCUMENTS_API_VERSION","NO_PROJECT_ID","getDocumentDebug","GetDocumentCommand","args","documentId","string","description","required","examples","command","flags","dataset","char","pretty","boolean","default","run","parse","cliConfig","getCliConfig","projectId","getProjectId","error","exit","api","targetDataset","projectClient","apiVersion","requireUser","doc","getDocument","log","JSON","stringify","err","message"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,YAAY,EAAEC,mBAAmB,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAE3F,SAAQC,qBAAqB,QAAO,uCAAsC;AAC1E,SAAQC,aAAa,QAAO,8BAA6B;AAEzD,MAAMC,mBAAmBH,SAAS;AAElC,OAAO,MAAMI,2BAA2BL;IACtC,OAAgBM,OAAO;QACrBC,YAAYX,KAAKY,MAAM,CAAC;YACtBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,iCAAgC;IAE9D,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtBC,SAASjB,MAAMW,MAAM,CAAC;YACpBO,MAAM;YACNN,aAAa;QACf;QACAO,QAAQnB,MAAMoB,OAAO,CAAC;YACpBC,SAAS;YACTT,aAAa;QACf;IACF,EAAC;IAED,MAAaU,MAAqB;QAChC,MAAM,EAACb,IAAI,EAAEO,KAAK,EAAC,GAAG,MAAM,IAAI,CAACO,KAAK,CAACf;QACvC,MAAM,EAACE,UAAU,EAAC,GAAGD;QACrB,MAAM,EAACQ,OAAO,EAAEE,MAAM,EAAC,GAAGH;QAE1B,4BAA4B;QAC5B,MAAMQ,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY;QAEzC,IAAI,CAACD,WAAW;YACd,IAAI,CAACE,KAAK,CAACtB,eAAe;gBAACuB,MAAM;YAAC;QACpC;QAEA,IAAI,CAACL,UAAUM,GAAG,EAAEb,WAAW,CAACA,SAAS;YACvC,IAAI,CAACW,KAAK,CACR,+FACA;gBAACC,MAAM;YAAC;QAEZ;QAEA,MAAME,gBAAgBd,WAAWO,UAAUM,GAAG,EAAEb;QAEhD,IAAI;YACF,MAAMe,gBAAgB,MAAM9B,oBAAoB;gBAC9C+B,YAAY5B;gBACZY,SAASc;gBACTL;gBACAQ,aAAa;YACf;YAEA,MAAMC,MAAM,MAAMH,cAAcI,WAAW,CAAC1B;YAE5C,IAAI,CAACyB,KAAK;gBACR,IAAI,CAACP,KAAK,CAAC,CAAC,UAAU,EAAElB,WAAW,wBAAwB,EAAEqB,cAAc,CAAC,CAAC,EAAE;oBAACF,MAAM;gBAAC;YACzF;YAEA,sBAAsB;YACtB,IAAIV,QAAQ;gBACV,IAAI,CAACkB,GAAG,CAACpC,aAAakC;YACxB,OAAO;gBACL,IAAI,CAACE,GAAG,CAACC,KAAKC,SAAS,CAACJ,KAAK,MAAM;YACrC;QACF,EAAE,OAAOP,OAAO;YACd,MAAMY,MAAMZ;YAEZrB,iBAAiB,CAAC,wBAAwB,EAAEG,YAAY,EAAE8B;YAC1D,IAAI,CAACZ,KAAK,CAAC,CAAC,0BAA0B,EAAEY,IAAIC,OAAO,EAAE,EAAE;gBAACZ,MAAM;YAAC;QACjE;IACF;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { colorizeJson, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { colorizeJson, getProjectCliClient, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
3
3
|
import { DOCUMENTS_API_VERSION } from '../../actions/documents/constants.js';
|
|
4
4
|
import { NO_PROJECT_ID } from '../../util/errorMessages.js';
|
|
5
5
|
const queryDocumentDebug = subdebug('documents:query');
|
|
@@ -72,8 +72,7 @@ export class QueryDocumentCommand extends SanityCommand {
|
|
|
72
72
|
this.warn(`--api-version not specified, using \`${DOCUMENTS_API_VERSION}\``);
|
|
73
73
|
}
|
|
74
74
|
try {
|
|
75
|
-
|
|
76
|
-
const projectClient = await this.getProjectApiClient({
|
|
75
|
+
const projectClient = await getProjectCliClient({
|
|
77
76
|
apiVersion: targetApiVersion,
|
|
78
77
|
dataset: targetDataset,
|
|
79
78
|
projectId: targetProject,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/documents/query.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {colorizeJson, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {DOCUMENTS_API_VERSION} from '../../actions/documents/constants.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst queryDocumentDebug = subdebug('documents:query')\n\nexport class QueryDocumentCommand extends SanityCommand<typeof QueryDocumentCommand> {\n static override args = {\n query: Args.string({\n description: 'GROQ query to run against the dataset',\n required: true,\n }),\n }\n\n static override description = 'Query for documents'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> \\'*[_type == \"movie\"][0..4]\\'',\n description: 'Fetch 5 documents of type \"movie\"',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> \\'*[_type == \"movie\"]|order(releaseDate asc)[0]{title}\\' --dataset staging',\n description: 'Fetch title of the oldest movie in the dataset named \"staging\"',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> \\'*[_id == \"header\"] { \"headerText\": pt::text(body) }\\' --api-version v2021-06-07',\n description: 'Use API version v2021-06-07 and do a query',\n },\n ]\n\n static override flags = {\n anonymous: Flags.boolean({\n default: false,\n description: 'Send the query without any authorization token',\n }),\n 'api-version': Flags.string({\n description: `API version to use (defaults to ${DOCUMENTS_API_VERSION})`,\n env: 'SANITY_CLI_QUERY_API_VERSION',\n }),\n dataset: Flags.string({\n char: 'd',\n description: 'Dataset to query (overrides config)',\n }),\n pretty: Flags.boolean({\n default: false,\n description: 'Colorize JSON output',\n }),\n project: Flags.string({\n char: 'p',\n description: 'Project ID to query (overrides config)',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(QueryDocumentCommand)\n const {query} = args\n const {anonymous, 'api-version': apiVersion, dataset, pretty, project} = flags\n\n // Get project configuration\n const cliConfig = await this.getCliConfig()\n const configProjectId = await this.getProjectId()\n\n const targetProject = project || configProjectId\n const requireUser = !anonymous\n\n if (!targetProject) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n if (!cliConfig.api?.dataset && !dataset) {\n this.error(\n 'No dataset specified. Either configure a dataset in sanity.cli.ts or use the --dataset flag',\n {exit: 1},\n )\n }\n\n const targetDataset = dataset || cliConfig.api?.dataset\n const targetApiVersion = apiVersion || DOCUMENTS_API_VERSION\n\n if (!apiVersion) {\n this.warn(`--api-version not specified, using \\`${DOCUMENTS_API_VERSION}\\``)\n }\n\n try {\n
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/documents/query.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {colorizeJson, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {DOCUMENTS_API_VERSION} from '../../actions/documents/constants.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst queryDocumentDebug = subdebug('documents:query')\n\nexport class QueryDocumentCommand extends SanityCommand<typeof QueryDocumentCommand> {\n static override args = {\n query: Args.string({\n description: 'GROQ query to run against the dataset',\n required: true,\n }),\n }\n\n static override description = 'Query for documents'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> \\'*[_type == \"movie\"][0..4]\\'',\n description: 'Fetch 5 documents of type \"movie\"',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> \\'*[_type == \"movie\"]|order(releaseDate asc)[0]{title}\\' --dataset staging',\n description: 'Fetch title of the oldest movie in the dataset named \"staging\"',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> \\'*[_id == \"header\"] { \"headerText\": pt::text(body) }\\' --api-version v2021-06-07',\n description: 'Use API version v2021-06-07 and do a query',\n },\n ]\n\n static override flags = {\n anonymous: Flags.boolean({\n default: false,\n description: 'Send the query without any authorization token',\n }),\n 'api-version': Flags.string({\n description: `API version to use (defaults to ${DOCUMENTS_API_VERSION})`,\n env: 'SANITY_CLI_QUERY_API_VERSION',\n }),\n dataset: Flags.string({\n char: 'd',\n description: 'Dataset to query (overrides config)',\n }),\n pretty: Flags.boolean({\n default: false,\n description: 'Colorize JSON output',\n }),\n project: Flags.string({\n char: 'p',\n description: 'Project ID to query (overrides config)',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(QueryDocumentCommand)\n const {query} = args\n const {anonymous, 'api-version': apiVersion, dataset, pretty, project} = flags\n\n // Get project configuration\n const cliConfig = await this.getCliConfig()\n const configProjectId = await this.getProjectId()\n\n const targetProject = project || configProjectId\n const requireUser = !anonymous\n\n if (!targetProject) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n if (!cliConfig.api?.dataset && !dataset) {\n this.error(\n 'No dataset specified. Either configure a dataset in sanity.cli.ts or use the --dataset flag',\n {exit: 1},\n )\n }\n\n const targetDataset = dataset || cliConfig.api?.dataset\n const targetApiVersion = apiVersion || DOCUMENTS_API_VERSION\n\n if (!apiVersion) {\n this.warn(`--api-version not specified, using \\`${DOCUMENTS_API_VERSION}\\``)\n }\n\n try {\n const projectClient = await getProjectCliClient({\n apiVersion: targetApiVersion,\n dataset: targetDataset,\n projectId: targetProject,\n requireUser,\n })\n\n const docs = await projectClient.fetch(query)\n\n if (!docs) {\n this.error('Query returned no results', {exit: 1})\n }\n\n // Output the query results\n if (pretty) {\n this.log(colorizeJson(docs))\n } else {\n this.log(JSON.stringify(docs, null, 2))\n }\n } catch (error) {\n const err = error as Error\n\n queryDocumentDebug(`Error running query: ${query}`, err)\n\n // Provide more context in error messages\n const errorMsg = err.message.toLowerCase().includes('syntax')\n ? `Invalid GROQ query syntax: ${err.message}`\n : `Failed to run query: ${err.message}`\n\n this.error(`${errorMsg}\\nQuery: ${query}`, {exit: 1})\n }\n }\n}\n"],"names":["Args","Flags","colorizeJson","getProjectCliClient","SanityCommand","subdebug","DOCUMENTS_API_VERSION","NO_PROJECT_ID","queryDocumentDebug","QueryDocumentCommand","args","query","string","description","required","examples","command","flags","anonymous","boolean","default","env","dataset","char","pretty","project","run","parse","apiVersion","cliConfig","getCliConfig","configProjectId","getProjectId","targetProject","requireUser","error","exit","api","targetDataset","targetApiVersion","warn","projectClient","projectId","docs","fetch","log","JSON","stringify","err","errorMsg","message","toLowerCase","includes"],"mappings":"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"}
|