@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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/__tests__/deploy.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {confirm, input, select} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\nimport {testExample} from '~test/helpers/testExample.js'\n\nimport {buildApp} from '../../actions/build/buildApp.js'\nimport {buildStudio} from '../../actions/build/buildStudio.js'\nimport {checkDir} from '../../actions/deploy/checkDir.js'\nimport {USER_APPLICATIONS_API_VERSION} from '../../services/userApplications.js'\nimport {dirIsEmptyOrNonExistent} from '../../util/dirIsEmptyOrNonExistent.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {DeployCommand} from '../deploy.js'\n\nvi.mock('../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn(),\n}))\n\nvi.mock('../../util/readModuleVersion.js', () => ({\n readModuleVersion: vi.fn(),\n}))\n\nvi.mock('../../actions/build/buildApp.js', () => ({\n buildApp: vi.fn(),\n}))\n\nvi.mock('../../actions/build/buildStudio.js', () => ({\n buildStudio: vi.fn(),\n}))\n\nvi.mock('../../actions/deploy/checkDir.js', () => ({\n checkDir: vi.fn(),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n confirm: vi.fn(),\n input: vi.fn(),\n select: vi.fn(),\n }\n})\n\nvi.mock('../../util/dirIsEmptyOrNonExistent.js', () => ({\n dirIsEmptyOrNonExistent: vi.fn(() => true),\n}))\n\nvi.mock('tar-fs', () => ({\n pack: vi.fn(() => {\n return {\n pipe: vi.fn(),\n }\n }),\n}))\n\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockSelect = vi.mocked(select)\nconst mockConfirm = vi.mocked(confirm)\nconst mockInput = vi.mocked(input)\nconst mockCheckDir = vi.mocked(checkDir)\nconst mockDirIsEmptyOrNonExistent = vi.mocked(dirIsEmptyOrNonExistent)\nconst mockReadModuleVersion = vi.mocked(readModuleVersion)\nconst mockBuildStudio = vi.mocked(buildStudio)\nconst mockBuildApp = vi.mocked(buildApp)\n\ndescribe('#deploy', () => {\n beforeEach(async () => {\n // Set up default mocks\n mockReadModuleVersion.mockImplementation(async (sourceDir, moduleName) => {\n if (moduleName === 'sanity') return '3.0.0' // for studio deployments\n if (moduleName === '@sanity/sdk-react') return '1.0.0' // for app deployments\n return '1.0.0'\n })\n mockCheckDir.mockResolvedValue()\n })\n\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('help text is correct', async () => {\n const {stdout} = await runCommand('deploy --help')\n expect(stdout).toMatchInlineSnapshot(`\n \"Builds and deploys Sanity Studio or application to Sanity hosting\n\n USAGE\n $ sanity deploy [SOURCEDIR] [--auto-updates] [--build] [--minify]\n [--schema-required] [--source-maps] [--verbose] [-y]\n\n ARGUMENTS\n [SOURCEDIR] Source directory\n\n FLAGS\n -y, --yes Unattended mode, answers \"yes\" to any \"yes/no\" prompt\n and otherwise uses defaults\n --[no-]auto-updates Automatically update the studio to the latest version\n --[no-]build Don't build the studio prior to deploy, instead\n deploying the version currently in \\`dist/\\`\n --[no-]minify Skip minifying built JavaScript (speeds up build,\n increases size of bundle)\n --schema-required Fail-fast deployment if schema store fails\n --source-maps Enable source maps for built bundles (increases size\n of bundle)\n --verbose Enable verbose logging\n\n DESCRIPTION\n Builds and deploys Sanity Studio or application to Sanity hosting\n\n EXAMPLES\n Build the studio\n\n $ sanity deploy\n\n Deploys non-minified build with source maps\n\n $ sanity deploy --no-minify --source-maps\n\n Fail fast on schema store fails - for when other services rely on the stored\n schema\n\n $ sanity deploy --schema-required\n\n \"\n `)\n })\n test('shows an error for invalid flags', async () => {\n const {error} = await testCommand(DeployCommand, ['--invalid'])\n\n expect(error?.message).toContain('Nonexistent flag: --invalid')\n })\n\n test(\"should prompt to confirm deleting source directory if it's not empty\", async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n mockConfirm.mockResolvedValue(true)\n mockDirIsEmptyOrNonExistent.mockResolvedValue(false)\n\n const appId = 'app-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId: 'org-id',\n },\n deployment: {\n appId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${appId}`,\n }).reply(200, {\n appHost: 'existing-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: appId,\n organizationId: 'org-id',\n projectId: null,\n title: 'Existing App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${appId}/deployments`,\n }).reply(200, {\n id: 'deployment-id',\n })\n\n const {error} = await testCommand(DeployCommand, ['build'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(mockConfirm).toHaveBeenCalledWith({\n default: false,\n message: '\"./build\" is not empty, do you want to proceed?',\n })\n })\n\n test(\"should cancel the deployment if the user doesn't want to proceed\", async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n mockConfirm.mockResolvedValue(false)\n\n const appId = 'app-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId: 'org-id',\n },\n deployment: {\n appId,\n },\n })\n\n const {error} = await testCommand(DeployCommand, ['build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Cancelled.')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n describe('app', () => {\n test('should re-deploy app if it already exists', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const appId = 'app-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId: 'org-id',\n },\n deployment: {\n appId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${appId}`,\n }).reply(200, {\n appHost: 'existing-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: appId,\n organizationId: 'org-id',\n projectId: null,\n title: 'Existing App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${appId}/deployments`,\n }).reply(200, {\n id: 'deployment-id',\n })\n\n const {error, stderr, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n\n expect(stderr).toContain('Checking application info')\n expect(stderr).toContain('Verifying local content')\n expect(stderr).toContain('Deploying...')\n\n expect(stdout).toContain('Success! Application deployed')\n })\n\n test('should handle missing @sanity/sdk-react version', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const appId = 'app-id'\n const organizationId = 'org-id'\n\n mockReadModuleVersion.mockResolvedValue(null)\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId,\n },\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Failed to find installed @sanity/sdk-react version')\n })\n\n test('should create new user application if none exists', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n const newAppId = 'new-app-id'\n const deploymentId = 'deployment-id'\n\n mockInput.mockResolvedValue('Test App')\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, {\n appHost: 'generated-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: newAppId,\n organizationId,\n projectId: null,\n title: 'Test App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${newAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Application deployed')\n expect(stdout).toContain(\n `Add the deployment.appId to your sanity.cli.js or sanity.cli.ts file:`,\n )\n expect(stdout).toContain(`deployment: {\n appId: '${newAppId}',`)\n expect(mockInput).toHaveBeenCalledWith({\n message: 'Enter a title for your application:',\n validate: expect.any(Function),\n })\n })\n\n test('should skip build when --no-build flag is used', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const existingAppId = 'existing-app-id'\n const organizationId = 'org-id'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: existingAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}`,\n }).reply(200, {\n appHost: 'existing-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId,\n organizationId,\n projectId: null,\n title: 'Existing App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Application deployed')\n expect(mockBuildApp).not.toHaveBeenCalled()\n })\n\n test('should handle directory check errors', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const existingAppId = 'existing-app-id'\n const organizationId = 'org-id'\n\n mockCheckDir.mockRejectedValue(new Error('Directory check failed'))\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: existingAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}`,\n }).reply(200, {\n appHost: 'existing-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId,\n organizationId,\n projectId: null,\n title: 'Existing App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error checking directory')\n })\n\n test('should error when fetching user applications if user doesn’t have org access', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const appId = 'some-app-id'\n const organizationId = 'org-without-access'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId,\n },\n })\n\n // Simulate API returning 403 Forbidden for the given org\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${appId}`,\n }).reply(403, {\n error: 'Forbidden',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n `You don’t have permission to view applications for the configured organization ID (\"${organizationId}\")`,\n )\n })\n\n test('should handle user-applications endpoint errors', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const existingAppId = 'existing-app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: existingAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}`,\n }).reply(500, {\n error: 'Internal server error',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error deploying application')\n })\n\n test('should handle deployment API errors', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const existingAppId = 'existing-app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: existingAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}`,\n }).reply(200, {\n appHost: 'existing-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId,\n organizationId,\n projectId: null,\n title: 'Existing App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}/deployments`,\n }).reply(500, {\n error: 'Internal server error',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error deploying application')\n })\n\n test('should show an error if deployment.appId is configured but the application does not exist', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const nonExistentAppId = 'non-existent-app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: nonExistentAppId,\n },\n })\n\n // Simulate API returning no user application for the given app.id\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${nonExistentAppId}`,\n }).reply(404, {\n error: 'Not found',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n 'The `appId` provided in your configuration’s `deployment` object cannot be found in your organization',\n )\n })\n\n test('should show an error if deployment.appId and app.id (deprecated) are both in use', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const appId = 'app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n id: appId,\n organizationId,\n },\n deployment: {\n appId: appId,\n },\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n 'Found both app.id (deprecated) and deployment.appId in your application configuration.\\n\\nPlease remove app.id from your sanity.cli.js or sanity.cli.ts file.',\n )\n })\n\n test('should show a warning if app.id (deprecated) is used', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const appId = 'app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n id: appId,\n organizationId,\n },\n })\n\n const {stderr} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(stderr).toContain('The `app.id` config has moved to `deployment.appId`.')\n })\n\n test('should handle app creation with retry when host is taken', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n const newAppId = 'new-app-id'\n const deploymentId = 'deployment-id'\n\n mockInput.mockResolvedValue('Test App')\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n })\n .once()\n .reply(409, {\n message: 'App host already taken',\n statusCode: 409,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n })\n .once()\n .reply(200, {\n appHost: 'generated-host-2',\n createdAt: '2024-01-01T00:00:00Z',\n id: newAppId,\n organizationId,\n projectId: null,\n title: 'Test App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${newAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Application deployed')\n })\n\n test('should handle app creation failure with non-retryable error', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n\n mockInput.mockResolvedValue('Test App')\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(500, {\n message: 'Internal server error',\n statusCode: 500,\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error deploying application')\n })\n\n test('should handle findUserApplicationForApp API errors', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const existingAppId = 'existing-app-id'\n const organizationId = 'org-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n deployment: {\n appId: existingAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId}`,\n }).reply(500, {\n error: 'Internal server error',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error deploying application')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should test input validation for app title', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n const newAppId = 'new-app-id'\n const deploymentId = 'deployment-id'\n\n mockInput.mockResolvedValue('Valid App Title')\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, {\n appHost: 'generated-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: newAppId,\n organizationId,\n projectId: null,\n title: 'Valid App Title',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${newAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n\n expect(mockInput).toHaveBeenCalledWith({\n message: 'Enter a title for your application:',\n validate: expect.any(Function),\n })\n })\n\n test('should allow selecting from list of apps', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n const existingAppId1 = 'existing-app-id-1'\n const existingAppId2 = 'existing-app-id-2'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [\n {\n appHost: 'existing-host-1',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId1,\n organizationId,\n projectId: null,\n title: 'Existing App 1',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n {\n appHost: 'existing-host-2',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId2,\n organizationId,\n projectId: null,\n title: 'Existing App 2',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n ])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${existingAppId2}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n mockSelect.mockResolvedValue('existing-host-2')\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Application deployed')\n expect(stdout).toContain(\n `Add the deployment.appId to your sanity.cli.js or sanity.cli.ts file:`,\n )\n expect(stdout).toContain(`deployment: {\n appId: '${existingAppId2}',`)\n })\n\n test('should allow creating a new app by selecting from list of apps', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const organizationId = 'org-id'\n const existingAppId1 = 'existing-app-id-1'\n const existingAppId2 = 'existing-app-id-2'\n const newAppId = 'new-app-id'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, [\n {\n appHost: 'existing-host-1',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId1,\n organizationId,\n projectId: null,\n title: 'Existing App 1',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n {\n appHost: 'existing-host-2',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingAppId2,\n organizationId,\n projectId: null,\n title: 'Existing App 2',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n ])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n organizationId,\n },\n uri: `/user-applications`,\n }).reply(200, {\n appHost: 'generated-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: newAppId,\n organizationId,\n projectId: null,\n title: 'Test App',\n type: 'coreApp',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'coreApp',\n },\n uri: `/user-applications/${newAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n mockSelect.mockResolvedValue('NEW_APP')\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Application deployed')\n expect(stdout).toContain(\n `Add the deployment.appId to your sanity.cli.js or sanity.cli.ts file:`,\n )\n expect(stdout).toContain(`deployment: {\n appId: '${newAppId}',`)\n })\n\n test('should throw an error if organizationId is not set', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n mockGetCliConfig.mockResolvedValue({\n app: {\n organizationId: undefined,\n },\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n 'sanity.cli.ts does not contain an organization identifier (\"app.organizationId\"), which is required for the Sanity CLI to communicate with the Sanity API',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n\n describe('studio', () => {\n test('should handle missing sanity version', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockReadModuleVersion.mockResolvedValue(null)\n\n mockGetCliConfig.mockResolvedValue({\n studioHost: 'existing-studio',\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Failed to find installed sanity version')\n })\n\n test('should handle directory check errors', async () => {\n const cwd = await testExample('basic-app')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'existing-studio'\n const studioAppId = 'studio-app-id'\n\n mockCheckDir.mockRejectedValue(new Error('Directory check failed'))\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: studioHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'Existing Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n const {error} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error checking directory')\n })\n\n test('should re-deploy studio if it already exists', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'existing-studio'\n const studioAppId = 'studio-app-id'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: studioHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'Existing Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stderr, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stderr).toContain('Checking project info')\n expect(stderr).toContain('Verifying local content')\n expect(stderr).toContain('Deploying to sanity.studio')\n expect(stdout).toContain('Success! Studio deployed')\n })\n\n test('should create new studio hostname when studioHost is provided but does not exist', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: 'test-project-id',\n },\n studioHost: 'new-studio-host',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: 'new-studio-host',\n appType: 'studio',\n },\n uri: `/projects/test-project-id/user-applications`,\n }).reply(404, {\n message: 'Not found',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/test-project-id/user-applications`,\n }).reply(200, {\n appHost: 'new-studio-host',\n createdAt: '2024-01-01T00:00:00Z',\n id: 'new-studio-app-id',\n projectId: 'test-project-id',\n title: 'New Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/test-project-id/user-applications/new-studio-app-id/deployments`,\n }).reply(200, {\n id: 'deployment-id',\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed')\n expect(stdout).toContain('Your project has not been assigned a studio hostname')\n expect(stdout).toContain('Creating https://new-studio-host.sanity.studio')\n })\n\n test('should handle studio hostname creation failure when name is taken', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'taken-studio-host'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(404, {\n message: 'Not found',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(409, {\n message: 'Studio hostname already taken',\n statusCode: 409,\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Studio hostname already taken')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should allow selecting from existing studio hostnames', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n })\n\n const studioOneId = 'studio-one-id'\n const studioTwoId = 'studio-two-id'\n const deploymentId = 'deployment-id'\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, [\n {\n appHost: 'studio-one',\n createdAt: '2024-01-01T00:00:00Z',\n id: studioOneId,\n projectId,\n title: 'Studio One',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n {\n appHost: 'studio-two',\n createdAt: '2024-01-01T00:00:00Z',\n id: studioTwoId,\n projectId,\n title: 'Studio Two',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n ])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioTwoId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n location: 'https://studio-two.sanity.studio',\n })\n\n mockSelect.mockResolvedValue('studio-two')\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed to https://studio-two.sanity.studio')\n expect(mockSelect).toHaveBeenCalledWith({\n choices: [\n {name: 'Create new studio hostname', value: 'NEW_STUDIO'},\n expect.any(Object), // Separator\n {name: 'Studio One', value: 'studio-one'},\n {name: 'Studio Two', value: 'studio-two'},\n ],\n message: 'Select existing studio hostname, or create a new one',\n })\n })\n\n test('should allow creating new studio hostname from selection menu', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const existingStudioId = 'existing-studio-id'\n const newStudioFromMenuId = 'new-studio-from-menu-id'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n })\n .once()\n .reply(200, [\n {\n appHost: 'existing-studio',\n createdAt: '2024-01-01T00:00:00Z',\n id: existingStudioId,\n projectId,\n title: 'Existing Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n },\n ])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: 'new-studio-from-menu',\n createdAt: '2024-01-01T00:00:00Z',\n id: newStudioFromMenuId,\n projectId,\n title: 'New Studio From Menu',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${newStudioFromMenuId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n mockSelect.mockResolvedValue('NEW_STUDIO')\n mockInput.mockImplementation(({validate}) => {\n const promise = (async () => {\n if (validate) {\n await validate('new-studio-from-menu')\n }\n return 'new-studio-from-menu'\n })() as Promise<string> & {cancel: () => void}\n\n promise.cancel = () => {}\n return promise\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed')\n expect(mockInput).toHaveBeenCalledWith({\n message: 'Studio hostname (<value>.sanity.studio):',\n validate: expect.any(Function),\n })\n })\n\n test('should handle input validation with retry for studio hostname creation', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const validStudioId = 'valid-studio-id'\n const deploymentId = 'deployment-id'\n\n mockInput.mockImplementation(({validate}) => {\n const promise = (async () => {\n if (validate) {\n // First attempt with a name that will be taken (triggers 409)\n let result = await validate('taken-name')\n if (result !== true) {\n // Name was taken, try again with a valid name (triggers 200)\n result = await validate('valid-name')\n }\n }\n return 'valid-name'\n })() as Promise<string> & {cancel: () => void}\n\n promise.cancel = () => {}\n return promise\n })\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, [])\n\n // First API call fails (hostname taken)\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n })\n .once()\n .reply(409, {\n message: 'Studio hostname already taken',\n statusCode: 409,\n })\n\n // Second API call succeeds\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n })\n .once()\n .reply(200, {\n appHost: 'valid-name',\n createdAt: '2024-01-01T00:00:00Z',\n id: validStudioId,\n projectId,\n title: 'Valid Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${validStudioId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed')\n })\n\n test('should handle input validation fails with unknown error', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n\n mockInput.mockImplementation(({validate}) => {\n const promise = (async () => {\n if (validate) {\n // First attempt with a name that will be taken (triggers 409)\n let result = await validate('taken-name')\n if (result !== true) {\n // Name was taken, try again with a valid name (triggers 200)\n result = await validate('valid-name')\n }\n }\n return 'valid-name'\n })() as Promise<string> & {cancel: () => void}\n\n promise.cancel = () => {}\n return promise\n })\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, [])\n\n // First API call fails (hostname taken)\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n })\n .once()\n .reply(500, {\n message: 'Internal server error',\n statusCode: 500,\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error creating user application')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should throw error when no projectId is configured', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockGetCliConfig.mockResolvedValue({\n api: {},\n studioHost: 'some-studio',\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n 'sanity.cli.ts does not contain a project identifier (\"api.projectId\"), which is required for the Sanity CLI to communicate with the Sanity API',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should log a warning if the deprecated auto-updates flag is used', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const {stderr} = await testCommand(DeployCommand, ['--auto-updates'], {\n config: {root: cwd},\n })\n\n expect(stderr).toContain('Warning: The --auto-updates flag is deprecated')\n })\n\n test('should throw an error when both the current and deprecated autoUpdates config are used', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n mockGetCliConfig.mockResolvedValue({\n autoUpdates: true,\n deployment: {\n autoUpdates: true,\n },\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain(\n 'Found both `autoUpdates` (deprecated) and `deployment.autoUpdates` in sanity.cli.',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle general API errors when finding user application', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'existing-studio'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(500, {\n error: 'Internal server error',\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error finding user application')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle deployment API errors for studio', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'existing-studio'\n const studioAppId = 'studio-app-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: studioHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'Existing Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioAppId}/deployments`,\n }).reply(500, {\n error: 'Internal server error',\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error deploying studio')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle fatal errors during studio hostname creation', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'new-studio-host'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(404, {\n message: 'Not found',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(500, {\n message: 'Internal server error',\n statusCode: 500,\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error creating user application from config')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle no existing studio applications scenario', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const newStudioId = 'new-studio-id'\n const deploymentId = 'deployment-id'\n\n mockInput.mockImplementation(({validate}) => {\n const promise = (async () => {\n if (validate) {\n await validate('new-studio-name')\n }\n return 'new-studio-name'\n })() as Promise<string> & {cancel: () => void}\n\n promise.cancel = () => {}\n return promise\n })\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, [])\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: 'new-studio-name',\n createdAt: '2024-01-01T00:00:00Z',\n id: newStudioId,\n projectId,\n title: 'New Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${newStudioId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed')\n expect(mockInput).toHaveBeenCalledWith({\n message: 'Studio hostname (<value>.sanity.studio):',\n validate: expect.any(Function),\n })\n })\n\n test('should skip build when --no-build flag is used for studio', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioHost = 'existing-studio'\n const studioAppId = 'studio-app-id'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n studioHost,\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n query: {\n appHost: studioHost,\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications`,\n }).reply(200, {\n appHost: studioHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'Existing Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, ['--no-build'], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('Success! Studio deployed')\n expect(mockBuildStudio).not.toHaveBeenCalled()\n })\n\n test('should deploy studio using deployment.appId', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioAppId = 'studio-app-id'\n const appHost = 'my-studio'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n deployment: {\n appId: studioAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n uri: `/projects/${projectId}/user-applications/${studioAppId}`,\n }).reply(200, {\n appHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'My Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n location: `https://${appHost}.sanity.studio`,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain(`Success! Studio deployed to https://${appHost}.sanity.studio`)\n })\n\n test('should prioritize deployment.appId over studioHost when both are configured', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioAppId = 'studio-app-id'\n const studioHost = 'my-studio-host'\n const deploymentId = 'deployment-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n deployment: {\n appId: studioAppId,\n },\n studioHost,\n })\n\n // Should call by appId, NOT by appHost\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n uri: `/projects/${projectId}/user-applications/${studioAppId}`,\n }).reply(200, {\n appHost: studioHost,\n createdAt: '2024-01-01T00:00:00Z',\n id: studioAppId,\n projectId,\n title: 'My Studio',\n type: 'studio',\n updatedAt: '2024-01-01T00:00:00Z',\n urlType: 'internal',\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n method: 'post',\n query: {\n appType: 'studio',\n },\n uri: `/projects/${projectId}/user-applications/${studioAppId}/deployments`,\n }).reply(200, {\n id: deploymentId,\n location: `https://${studioHost}.sanity.studio`,\n })\n\n const {error, stdout} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain(`Success! Studio deployed to https://${studioHost}.sanity.studio`)\n })\n\n test('should handle error when deployment.appId does not exist for the org', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioAppId = 'non-existent-app-id'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n deployment: {\n appId: studioAppId,\n },\n })\n\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n uri: `/projects/${projectId}/user-applications/${studioAppId}`,\n }).reply(404, {\n message: 'Application not found',\n })\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error finding user application')\n expect(error?.message).toContain(`Cannot find app with app ID ${studioAppId}`)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should not fall back to studioHost when deployment.appId is configured but does not exist', async () => {\n const cwd = await testExample('basic-studio')\n process.cwd = () => cwd\n\n const projectId = 'test-project-id'\n const studioAppId = 'non-existent-app-id'\n const studioHost = 'valid-studio-host'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId,\n },\n deployment: {\n appId: studioAppId,\n },\n studioHost, // This should NOT be used as fallback\n })\n\n // appId lookup fails\n mockApi({\n apiVersion: USER_APPLICATIONS_API_VERSION,\n uri: `/projects/${projectId}/user-applications/${studioAppId}`,\n }).reply(404, {\n message: 'Application not found',\n })\n\n // Should NOT make a call to studioHost - if it does, this mock will remain unused\n // and cause the test to fail due to pending mocks check\n\n const {error} = await testCommand(DeployCommand, [], {\n config: {root: cwd},\n })\n\n expect(error?.message).toContain('Error finding user application')\n expect(error?.message).toContain(`Cannot find app with app ID ${studioAppId}`)\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n})\n"],"names":["runCommand","getCliConfig","confirm","input","select","mockApi","testCommand","nock","afterEach","beforeEach","describe","expect","test","vi","testExample","buildApp","buildStudio","checkDir","USER_APPLICATIONS_API_VERSION","dirIsEmptyOrNonExistent","readModuleVersion","DeployCommand","mock","fn","actual","importActual","pack","pipe","mockGetCliConfig","mocked","mockSelect","mockConfirm","mockInput","mockCheckDir","mockDirIsEmptyOrNonExistent","mockReadModuleVersion","mockBuildStudio","mockBuildApp","mockImplementation","sourceDir","moduleName","mockResolvedValue","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","error","message","toContain","cwd","process","appId","app","organizationId","deployment","apiVersion","query","appType","uri","reply","appHost","createdAt","id","projectId","title","type","updatedAt","urlType","method","config","root","toBeUndefined","toHaveBeenCalledWith","default","oclif","exit","toBe","stderr","newAppId","deploymentId","validate","any","Function","existingAppId","not","toHaveBeenCalled","mockRejectedValue","Error","nonExistentAppId","once","statusCode","existingAppId1","existingAppId2","undefined","studioHost","studioAppId","api","studioOneId","studioTwoId","location","choices","name","value","Object","existingStudioId","newStudioFromMenuId","promise","cancel","validStudioId","result","autoUpdates","newStudioId"],"mappings":"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"}
|
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
-
import { createServer } from 'node:http';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { runCommand } from '@oclif/test';
|
|
5
|
-
import { confirm } from '@sanity/cli-core/ux';
|
|
6
|
-
import { mockApi, testCommand } from '@sanity/cli-test';
|
|
7
|
-
import nock from 'nock';
|
|
8
|
-
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
9
|
-
import { testExample } from '~test/helpers/testExample.js';
|
|
10
|
-
import { checkRequiredDependencies } from '../../actions/build/checkRequiredDependencies.js';
|
|
11
|
-
import { compareDependencyVersions } from '../../util/compareDependencyVersions.js';
|
|
12
|
-
import { getPackageManagerChoice } from '../../util/packageManager/packageManagerChoice.js';
|
|
13
|
-
import { upgradePackages } from '../../util/packageManager/upgradePackages.js';
|
|
14
|
-
import { DevCommand } from '../dev.js';
|
|
15
|
-
vi.mock('../../actions/build/checkRequiredDependencies.js', ()=>({
|
|
16
|
-
checkRequiredDependencies: vi.fn().mockResolvedValue({
|
|
17
|
-
installedSanityVersion: '3.0.0'
|
|
18
|
-
})
|
|
19
|
-
}));
|
|
20
|
-
vi.mock('../../util/compareDependencyVersions.js', ()=>({
|
|
21
|
-
compareDependencyVersions: vi.fn().mockResolvedValue([])
|
|
22
|
-
}));
|
|
23
|
-
vi.mock('@sanity/cli-core/ux', async ()=>{
|
|
24
|
-
const actual = await vi.importActual('@sanity/cli-core/ux');
|
|
25
|
-
return {
|
|
26
|
-
...actual,
|
|
27
|
-
confirm: vi.fn()
|
|
28
|
-
};
|
|
29
|
-
});
|
|
30
|
-
vi.mock('../../../../cli-core/src/util/isInteractive.js', ()=>({
|
|
31
|
-
isInteractive: vi.fn().mockReturnValue(true)
|
|
32
|
-
}));
|
|
33
|
-
vi.mock('../../util/packageManager/upgradePackages.js');
|
|
34
|
-
vi.mock('../../util/packageManager/packageManagerChoice.js');
|
|
35
|
-
const mockCheckRequiredDependencies = vi.mocked(checkRequiredDependencies);
|
|
36
|
-
const mockCompareDependencyVersions = vi.mocked(compareDependencyVersions);
|
|
37
|
-
const mockConfirm = vi.mocked(confirm);
|
|
38
|
-
const mockUpgradePackages = vi.mocked(upgradePackages);
|
|
39
|
-
const mockGetPackageManagerChoice = vi.mocked(getPackageManagerChoice);
|
|
40
|
-
describe('#dev', ()=>{
|
|
41
|
-
afterEach(()=>{
|
|
42
|
-
const pending = nock.pendingMocks();
|
|
43
|
-
nock.cleanAll();
|
|
44
|
-
expect(pending, 'pending mocks').toEqual([]);
|
|
45
|
-
vi.clearAllMocks();
|
|
46
|
-
});
|
|
47
|
-
test('help text is correct', async ()=>{
|
|
48
|
-
const { stdout } = await runCommand([
|
|
49
|
-
'dev',
|
|
50
|
-
'--help'
|
|
51
|
-
]);
|
|
52
|
-
expect(stdout).toMatchInlineSnapshot(`
|
|
53
|
-
"Starts a local development server for Sanity Studio with live reloading
|
|
54
|
-
|
|
55
|
-
USAGE
|
|
56
|
-
$ sanity dev [--auto-updates] [--host <value>]
|
|
57
|
-
[--load-in-dashboard] [--port <value>]
|
|
58
|
-
|
|
59
|
-
FLAGS
|
|
60
|
-
--[no-]auto-updates Automatically update Sanity Studio dependencies.
|
|
61
|
-
--host=<value> [default: localhost] The local network interface at
|
|
62
|
-
which to listen.
|
|
63
|
-
--[no-]load-in-dashboard Load the app/studio in the Sanity dashboard.
|
|
64
|
-
--port=<value> [default: 3333] TCP port to start server on.
|
|
65
|
-
|
|
66
|
-
DESCRIPTION
|
|
67
|
-
Starts a local development server for Sanity Studio with live reloading
|
|
68
|
-
|
|
69
|
-
EXAMPLES
|
|
70
|
-
$ sanity dev --host=0.0.0.0
|
|
71
|
-
|
|
72
|
-
$ sanity dev --port=1942
|
|
73
|
-
|
|
74
|
-
$ sanity dev --load-in-dashboard
|
|
75
|
-
|
|
76
|
-
"
|
|
77
|
-
`);
|
|
78
|
-
});
|
|
79
|
-
test('shows an error for invalid flags', async ()=>{
|
|
80
|
-
const { error } = await testCommand(DevCommand, [
|
|
81
|
-
'--invalid'
|
|
82
|
-
]);
|
|
83
|
-
expect(error?.message).toContain('Nonexistent flag: --invalid');
|
|
84
|
-
});
|
|
85
|
-
describe('basic-app', ()=>{
|
|
86
|
-
test('should start the dev server for app', async ()=>{
|
|
87
|
-
const cwd = await testExample('basic-app');
|
|
88
|
-
process.cwd = ()=>cwd;
|
|
89
|
-
const { error, result, stderr, stdout } = await testCommand(DevCommand, [
|
|
90
|
-
'--port',
|
|
91
|
-
'5333'
|
|
92
|
-
], {
|
|
93
|
-
config: {
|
|
94
|
-
root: cwd
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
expect(error).toBeUndefined();
|
|
98
|
-
expect(stdout).toContain('Dev server started on port 5333');
|
|
99
|
-
expect(stdout).toContain('View your app in the Sanity dashboard here:');
|
|
100
|
-
expect(stderr).toContain('Checking configuration files');
|
|
101
|
-
await result.close?.();
|
|
102
|
-
});
|
|
103
|
-
test('should warn when --no-load-in-dashboard is used with app', async ()=>{
|
|
104
|
-
const cwd = await testExample('basic-app');
|
|
105
|
-
process.cwd = ()=>cwd;
|
|
106
|
-
const { error, result, stderr, stdout } = await testCommand(DevCommand, [
|
|
107
|
-
'--no-load-in-dashboard',
|
|
108
|
-
'--port',
|
|
109
|
-
'5334'
|
|
110
|
-
], {
|
|
111
|
-
config: {
|
|
112
|
-
root: cwd
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
expect(error).toBeUndefined();
|
|
116
|
-
expect(stderr).toContain('Apps cannot run without the Sanity dashboard');
|
|
117
|
-
expect(stderr).toContain('Starting dev server with the --load-in-dashboard flag set to true');
|
|
118
|
-
expect(stdout).toContain('Dev server started on port 5334');
|
|
119
|
-
await result.close?.();
|
|
120
|
-
});
|
|
121
|
-
test('should automatically change port if conflicted', async ()=>{
|
|
122
|
-
const cwd = await testExample('basic-app');
|
|
123
|
-
process.cwd = ()=>cwd;
|
|
124
|
-
// Create a server on port 5338 to block it
|
|
125
|
-
const server = createServer();
|
|
126
|
-
await new Promise((resolve)=>{
|
|
127
|
-
server.listen(5338, 'localhost', resolve);
|
|
128
|
-
});
|
|
129
|
-
try {
|
|
130
|
-
const { error, result, stdout } = await testCommand(DevCommand, [
|
|
131
|
-
'--port',
|
|
132
|
-
'5338'
|
|
133
|
-
], {
|
|
134
|
-
config: {
|
|
135
|
-
root: cwd
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
expect(error).toBeUndefined();
|
|
139
|
-
// Should automatically pick a different port
|
|
140
|
-
expect(stdout).toMatch(/Dev server started on port \d{4}/);
|
|
141
|
-
expect(stdout).not.toContain('Dev server started on port 5338');
|
|
142
|
-
expect(stdout).toContain('View your app in the Sanity dashboard here:');
|
|
143
|
-
await result.close?.();
|
|
144
|
-
} finally{
|
|
145
|
-
// Clean up the server
|
|
146
|
-
await new Promise((resolve, reject)=>{
|
|
147
|
-
server.close((err)=>{
|
|
148
|
-
if (err) reject(err);
|
|
149
|
-
else resolve();
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
test('should error when organizationId is missing from config', async ()=>{
|
|
155
|
-
const cwd = await testExample('basic-app');
|
|
156
|
-
process.cwd = ()=>cwd;
|
|
157
|
-
// Modify the config to remove organizationId
|
|
158
|
-
const configPath = join(cwd, 'sanity.cli.ts');
|
|
159
|
-
const existingConfig = await readFile(configPath, 'utf8');
|
|
160
|
-
const modifiedConfig = existingConfig.replace(/organizationId: '[^']*',?/, '');
|
|
161
|
-
await writeFile(configPath, modifiedConfig);
|
|
162
|
-
const { error } = await testCommand(DevCommand, [
|
|
163
|
-
'--port',
|
|
164
|
-
'5341'
|
|
165
|
-
], {
|
|
166
|
-
config: {
|
|
167
|
-
root: cwd
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
expect(error).toBeDefined();
|
|
171
|
-
expect(error?.message).toContain('Apps require an organization ID (orgId)');
|
|
172
|
-
expect(error?.oclif?.exit).toBe(1);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
describe('basic-studio', ()=>{
|
|
176
|
-
test('should start the dev server for studio', async ()=>{
|
|
177
|
-
const cwd = await testExample('basic-studio');
|
|
178
|
-
process.cwd = ()=>cwd;
|
|
179
|
-
const { error, result, stderr, stdout } = await testCommand(DevCommand, [
|
|
180
|
-
'--port',
|
|
181
|
-
'5335'
|
|
182
|
-
], {
|
|
183
|
-
config: {
|
|
184
|
-
root: cwd
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
expect(error).toBeUndefined();
|
|
188
|
-
expect(stdout).toContain('Sanity Studio using vite@');
|
|
189
|
-
expect(stdout).toContain('ready in');
|
|
190
|
-
expect(stdout).toContain('ms and running at http://localhost:5335');
|
|
191
|
-
expect(stderr).toContain('Checking configuration files');
|
|
192
|
-
await result.close?.();
|
|
193
|
-
});
|
|
194
|
-
test('should start with custom host configuration', async ()=>{
|
|
195
|
-
const cwd = await testExample('basic-studio');
|
|
196
|
-
process.cwd = ()=>cwd;
|
|
197
|
-
const { error, result, stdout } = await testCommand(DevCommand, [
|
|
198
|
-
'--host',
|
|
199
|
-
'127.0.0.1',
|
|
200
|
-
'--port',
|
|
201
|
-
'5336'
|
|
202
|
-
], {
|
|
203
|
-
config: {
|
|
204
|
-
root: cwd
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
expect(error).toBeUndefined();
|
|
208
|
-
expect(stdout).toContain('http://127.0.0.1:5336');
|
|
209
|
-
await result.close?.();
|
|
210
|
-
});
|
|
211
|
-
test('should start with load-in-dashboard', async ()=>{
|
|
212
|
-
const cwd = await testExample('basic-studio');
|
|
213
|
-
process.cwd = ()=>cwd;
|
|
214
|
-
const projectId = 'test-project';
|
|
215
|
-
// Need to modify the sanity config to include projectId for this test
|
|
216
|
-
const configPath = join(cwd, 'sanity.cli.ts');
|
|
217
|
-
const existingConfig = await readFile(configPath, 'utf8');
|
|
218
|
-
// Add projectId to the config
|
|
219
|
-
const modifiedConfig = existingConfig.replace(/projectId: '.*',/, `projectId: '${projectId}',`);
|
|
220
|
-
await writeFile(configPath, modifiedConfig);
|
|
221
|
-
mockApi({
|
|
222
|
-
apiVersion: 'v2025-08-25',
|
|
223
|
-
uri: `/projects/${projectId}`
|
|
224
|
-
}).reply(200, {
|
|
225
|
-
organizationId: 'test-org'
|
|
226
|
-
});
|
|
227
|
-
const { error, result, stderr, stdout } = await testCommand(DevCommand, [
|
|
228
|
-
'--load-in-dashboard',
|
|
229
|
-
'--port',
|
|
230
|
-
'5340'
|
|
231
|
-
], {
|
|
232
|
-
config: {
|
|
233
|
-
root: cwd
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
expect(error).toBeUndefined();
|
|
237
|
-
expect(stdout).toContain('Dev server started on port 5340');
|
|
238
|
-
expect(stdout).toContain('View your studio in the Sanity dashboard here:');
|
|
239
|
-
expect(stdout).toContain('https://www.sanity.io/@test-org?dev=http%3A%2F%2Flocalhost%3A5340');
|
|
240
|
-
expect(stderr).toContain('Checking configuration files');
|
|
241
|
-
await result.close?.();
|
|
242
|
-
});
|
|
243
|
-
test('should error when projectId is missing with --load-in-dashboard', async ()=>{
|
|
244
|
-
const cwd = await testExample('basic-studio');
|
|
245
|
-
process.cwd = ()=>cwd;
|
|
246
|
-
// Modify config to remove projectId
|
|
247
|
-
const configPath = join(cwd, 'sanity.cli.ts');
|
|
248
|
-
const existingConfig = await readFile(configPath, 'utf8');
|
|
249
|
-
const modifiedConfig = existingConfig.replace(/projectId: '[^']*',/, '');
|
|
250
|
-
await writeFile(configPath, modifiedConfig);
|
|
251
|
-
const { error } = await testCommand(DevCommand, [
|
|
252
|
-
'--load-in-dashboard',
|
|
253
|
-
'--port',
|
|
254
|
-
'5343'
|
|
255
|
-
], {
|
|
256
|
-
config: {
|
|
257
|
-
root: cwd
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
expect(error).toBeDefined();
|
|
261
|
-
expect(error?.message).toContain('Project Id is required to load in dashboard');
|
|
262
|
-
expect(error?.oclif?.exit).toBe(1);
|
|
263
|
-
});
|
|
264
|
-
test('should error when API fails to fetch organizationId', async ()=>{
|
|
265
|
-
const cwd = await testExample('basic-studio');
|
|
266
|
-
process.cwd = ()=>cwd;
|
|
267
|
-
const projectId = 'test-project';
|
|
268
|
-
const configPath = join(cwd, 'sanity.cli.ts');
|
|
269
|
-
const existingConfig = await readFile(configPath, 'utf8');
|
|
270
|
-
const modifiedConfig = existingConfig.replace(/projectId: '.*',/, `projectId: '${projectId}',`);
|
|
271
|
-
await writeFile(configPath, modifiedConfig);
|
|
272
|
-
mockApi({
|
|
273
|
-
apiVersion: 'v2025-08-25',
|
|
274
|
-
uri: `/projects/${projectId}`
|
|
275
|
-
}).reply(404, {
|
|
276
|
-
error: 'Project not found'
|
|
277
|
-
});
|
|
278
|
-
const { error } = await testCommand(DevCommand, [
|
|
279
|
-
'--load-in-dashboard',
|
|
280
|
-
'--port',
|
|
281
|
-
'5344'
|
|
282
|
-
], {
|
|
283
|
-
config: {
|
|
284
|
-
root: cwd
|
|
285
|
-
}
|
|
286
|
-
});
|
|
287
|
-
expect(error).toBeDefined();
|
|
288
|
-
expect(error?.message).toContain('Failed to get organization id from project id');
|
|
289
|
-
expect(error?.oclif?.exit).toBe(1);
|
|
290
|
-
});
|
|
291
|
-
test('should start dev server successfully when user declines auto-updates', async ()=>{
|
|
292
|
-
const cwd = await testExample('basic-studio');
|
|
293
|
-
process.cwd = ()=>cwd;
|
|
294
|
-
mockCompareDependencyVersions.mockResolvedValueOnce([
|
|
295
|
-
{
|
|
296
|
-
installed: '3.0.0',
|
|
297
|
-
pkg: 'sanity',
|
|
298
|
-
remote: '3.1.0'
|
|
299
|
-
}
|
|
300
|
-
]);
|
|
301
|
-
mockConfirm.mockResolvedValueOnce(false); // User declines upgrade
|
|
302
|
-
const { error, result, stderr, stdout } = await testCommand(DevCommand, [
|
|
303
|
-
'--auto-updates',
|
|
304
|
-
'--port',
|
|
305
|
-
'5346'
|
|
306
|
-
], {
|
|
307
|
-
config: {
|
|
308
|
-
root: cwd
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
expect(error).toBeUndefined();
|
|
312
|
-
// Check that the server started successfully with auto-updates flag
|
|
313
|
-
expect(stdout).toMatch(/running at http:\/\/localhost:5346/);
|
|
314
|
-
expect(stderr).toContain('Checking configuration files');
|
|
315
|
-
await result.close?.();
|
|
316
|
-
});
|
|
317
|
-
test('should handle auto-updates with version mismatch and user accepts upgrade', async ()=>{
|
|
318
|
-
const cwd = await testExample('basic-studio');
|
|
319
|
-
process.cwd = ()=>cwd;
|
|
320
|
-
mockCompareDependencyVersions.mockResolvedValueOnce([
|
|
321
|
-
{
|
|
322
|
-
installed: '3.0.0',
|
|
323
|
-
pkg: 'sanity',
|
|
324
|
-
remote: '3.1.0'
|
|
325
|
-
}
|
|
326
|
-
]);
|
|
327
|
-
mockConfirm.mockResolvedValueOnce(true); // User accepts upgrade
|
|
328
|
-
mockUpgradePackages.mockResolvedValueOnce(undefined);
|
|
329
|
-
mockGetPackageManagerChoice.mockResolvedValueOnce({
|
|
330
|
-
chosen: 'npm',
|
|
331
|
-
mostOptimal: 'npm'
|
|
332
|
-
});
|
|
333
|
-
const { error, result, stderr, stdout } = await testCommand(DevCommand, [
|
|
334
|
-
'--auto-updates',
|
|
335
|
-
'--port',
|
|
336
|
-
'5348'
|
|
337
|
-
], {
|
|
338
|
-
config: {
|
|
339
|
-
root: cwd
|
|
340
|
-
}
|
|
341
|
-
});
|
|
342
|
-
expect(error).toBeUndefined();
|
|
343
|
-
expect(stdout).toMatch(/running at http:\/\/localhost:5348/);
|
|
344
|
-
expect(stderr).toContain('Checking configuration files');
|
|
345
|
-
expect(mockUpgradePackages).toHaveBeenCalledWith({
|
|
346
|
-
packageManager: 'npm',
|
|
347
|
-
packages: [
|
|
348
|
-
[
|
|
349
|
-
'sanity',
|
|
350
|
-
'3.1.0'
|
|
351
|
-
]
|
|
352
|
-
]
|
|
353
|
-
}, {
|
|
354
|
-
output: expect.any(Object),
|
|
355
|
-
workDir: cwd
|
|
356
|
-
});
|
|
357
|
-
await result.close?.();
|
|
358
|
-
});
|
|
359
|
-
test('should handle invalid Sanity version during auto-updates', async ()=>{
|
|
360
|
-
const cwd = await testExample('basic-studio');
|
|
361
|
-
process.cwd = ()=>cwd;
|
|
362
|
-
mockCheckRequiredDependencies.mockResolvedValueOnce({
|
|
363
|
-
installedSanityVersion: 'invalid-version'
|
|
364
|
-
});
|
|
365
|
-
const { error } = await testCommand(DevCommand, [
|
|
366
|
-
'--auto-updates',
|
|
367
|
-
'--port',
|
|
368
|
-
'5347'
|
|
369
|
-
], {
|
|
370
|
-
config: {
|
|
371
|
-
root: cwd
|
|
372
|
-
}
|
|
373
|
-
});
|
|
374
|
-
expect(error).toBeDefined();
|
|
375
|
-
expect(error?.message).toContain('Failed to parse installed Sanity version');
|
|
376
|
-
});
|
|
377
|
-
});
|
|
378
|
-
test('should throw an error if port is already in use', async ()=>{
|
|
379
|
-
const cwd = await testExample('basic-studio');
|
|
380
|
-
process.cwd = ()=>cwd;
|
|
381
|
-
// Create a server on port 5337 to block it
|
|
382
|
-
const server = createServer();
|
|
383
|
-
await new Promise((resolve)=>{
|
|
384
|
-
server.listen(5337, 'localhost', resolve);
|
|
385
|
-
});
|
|
386
|
-
try {
|
|
387
|
-
const { error } = await testCommand(DevCommand, [
|
|
388
|
-
'--port',
|
|
389
|
-
'5337'
|
|
390
|
-
], {
|
|
391
|
-
config: {
|
|
392
|
-
root: cwd
|
|
393
|
-
}
|
|
394
|
-
});
|
|
395
|
-
expect(error).toBeDefined();
|
|
396
|
-
expect(error?.message).toContain('Port 5337 is already in use');
|
|
397
|
-
expect(error?.oclif?.exit).toBe(1);
|
|
398
|
-
} finally{
|
|
399
|
-
// Clean up the server
|
|
400
|
-
await new Promise((resolve, reject)=>{
|
|
401
|
-
server.close((err)=>{
|
|
402
|
-
if (err) reject(err);
|
|
403
|
-
else resolve();
|
|
404
|
-
});
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
});
|
|
408
|
-
});
|
|
409
|
-
|
|
410
|
-
//# sourceMappingURL=dev.test.js.map
|