@sanity/cli 6.0.0-alpha.5 → 6.0.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2907 -109
- 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/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 +1 -1
- 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/utils/uniqByProjectIdDataset.d.ts +1 -1
- package/dist/actions/telemetry/resolveConsent.d.ts +1 -9
- package/dist/actions/telemetry/resolveConsent.js +2 -2
- package/dist/actions/telemetry/resolveConsent.js.map +1 -1
- package/dist/actions/telemetry/setConsent.d.ts +1 -4
- package/dist/actions/telemetry/setConsent.js +4 -8
- package/dist/actions/telemetry/setConsent.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/debug.js +5 -9
- package/dist/commands/debug.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/telemetry/disable.js +0 -1
- package/dist/commands/telemetry/disable.js.map +1 -1
- package/dist/commands/telemetry/enable.js +0 -1
- package/dist/commands/telemetry/enable.js.map +1 -1
- package/dist/commands/telemetry/status.js +1 -3
- package/dist/commands/telemetry/status.js.map +1 -1
- package/dist/config/createCliConfig.d.ts +9 -0
- package/dist/hooks/prerun/flushTelemetry.worker.d.ts +2 -0
- package/dist/hooks/prerun/flushTelemetry.worker.js +22 -0
- package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -0
- package/dist/hooks/prerun/setupTelemetry.js +65 -1
- package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
- 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/organizations.d.ts +3 -1
- package/dist/services/organizations.js +2 -1
- package/dist/services/organizations.js.map +1 -1
- package/dist/services/telemetry.d.ts +2 -0
- package/dist/services/telemetry.js +20 -0
- package/dist/services/telemetry.js.map +1 -0
- package/dist/services/user.d.ts +5 -0
- package/dist/services/user.js +12 -1
- 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/telemetry/cli.telemetry.d.ts +20 -0
- package/dist/telemetry/cli.telemetry.js +8 -0
- package/dist/telemetry/cli.telemetry.js.map +1 -0
- package/dist/telemetry/store/cleanupOldTelemetryFiles.d.ts +5 -0
- package/dist/telemetry/store/cleanupOldTelemetryFiles.js +30 -0
- package/dist/telemetry/store/cleanupOldTelemetryFiles.js.map +1 -0
- package/dist/telemetry/store/createTelemetryStore.d.ts +39 -0
- package/dist/telemetry/store/createTelemetryStore.js +95 -0
- package/dist/telemetry/store/createTelemetryStore.js.map +1 -0
- package/dist/telemetry/store/createTraceId.d.ts +10 -0
- package/dist/telemetry/store/createTraceId.js +10 -0
- package/dist/telemetry/store/createTraceId.js.map +1 -0
- package/dist/telemetry/store/debug.d.ts +5 -0
- package/dist/telemetry/store/debug.js +7 -0
- package/dist/telemetry/store/debug.js.map +1 -0
- package/dist/telemetry/store/findTelemetryFiles.d.ts +13 -0
- package/dist/telemetry/store/findTelemetryFiles.js +34 -0
- package/dist/telemetry/store/findTelemetryFiles.js.map +1 -0
- package/dist/telemetry/store/flushTelemetryFiles.d.ts +20 -0
- package/dist/telemetry/store/flushTelemetryFiles.js +107 -0
- package/dist/telemetry/store/flushTelemetryFiles.js.map +1 -0
- package/dist/telemetry/store/generateTelemetryFilePath.d.ts +17 -0
- package/dist/telemetry/store/generateTelemetryFilePath.js +30 -0
- package/dist/telemetry/store/generateTelemetryFilePath.js.map +1 -0
- package/dist/telemetry/store/getTelemetryBaseInfo.d.ts +27 -0
- package/dist/telemetry/store/getTelemetryBaseInfo.js +34 -0
- package/dist/telemetry/store/getTelemetryBaseInfo.js.map +1 -0
- package/dist/telemetry/store/logger.d.ts +6 -0
- package/dist/telemetry/store/logger.js +54 -0
- package/dist/telemetry/store/logger.js.map +1 -0
- package/dist/telemetry/store/trace.d.ts +6 -0
- package/dist/telemetry/store/trace.js +150 -0
- package/dist/telemetry/store/trace.js.map +1 -0
- package/dist/telemetry/utils/readNDJSON.d.ts +10 -0
- package/dist/telemetry/utils/readNDJSON.js +18 -0
- package/dist/telemetry/utils/readNDJSON.js.map +1 -0
- package/dist/util/detectRuntime.d.ts +8 -0
- package/dist/util/detectRuntime.js +20 -0
- package/dist/util/detectRuntime.js.map +1 -0
- package/dist/util/isStaging.d.ts +7 -0
- package/dist/util/isStaging.js +10 -0
- package/dist/util/isStaging.js.map +1 -0
- package/dist/util/parseArguments.d.ts +35 -0
- package/dist/util/parseArguments.js +42 -0
- package/dist/util/parseArguments.js.map +1 -0
- package/oclif.manifest.json +7 -1
- package/package.json +25 -18
- 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/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__/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/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/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 -590
- package/dist/commands/__tests__/debug.test.js.map +0 -1
- package/dist/commands/__tests__/deploy.test.js +0 -1945
- package/dist/commands/__tests__/deploy.test.js.map +0 -1
- package/dist/commands/__tests__/dev.test.js +0 -453
- 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 -73
- package/dist/commands/__tests__/init/init.authentication.test.js.map +0 -1
- package/dist/commands/__tests__/init/init.create-new-project.test.js +0 -195
- package/dist/commands/__tests__/init/init.create-new-project.test.js.map +0 -1
- package/dist/commands/__tests__/init/init.plan.test.js +0 -279
- package/dist/commands/__tests__/init/init.plan.test.js.map +0 -1
- package/dist/commands/__tests__/init/init.setup.test.js +0 -335
- package/dist/commands/__tests__/init/init.setup.test.js.map +0 -1
- package/dist/commands/__tests__/install.test.js +0 -282
- 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 -91
- package/dist/commands/__tests__/logout.test.js.map +0 -1
- package/dist/commands/__tests__/manage.test.js +0 -110
- 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 -142
- package/dist/commands/__tests__/versions.test.js.map +0 -1
- package/dist/commands/backup/__tests__/disable.test.js +0 -204
- package/dist/commands/backup/__tests__/disable.test.js.map +0 -1
- package/dist/commands/backup/__tests__/download.test.js +0 -768
- package/dist/commands/backup/__tests__/download.test.js.map +0 -1
- package/dist/commands/backup/__tests__/enable.test.js +0 -286
- package/dist/commands/backup/__tests__/enable.test.js.map +0 -1
- package/dist/commands/backup/__tests__/list.test.js +0 -330
- package/dist/commands/backup/__tests__/list.test.js.map +0 -1
- package/dist/commands/cors/__tests__/add.test.js +0 -376
- package/dist/commands/cors/__tests__/add.test.js.map +0 -1
- package/dist/commands/cors/__tests__/delete.test.js +0 -308
- package/dist/commands/cors/__tests__/delete.test.js.map +0 -1
- package/dist/commands/cors/__tests__/list.test.js +0 -241
- package/dist/commands/cors/__tests__/list.test.js.map +0 -1
- package/dist/commands/dataset/__tests__/copy.test.js +0 -628
- package/dist/commands/dataset/__tests__/copy.test.js.map +0 -1
- package/dist/commands/dataset/__tests__/create.test.js +0 -342
- package/dist/commands/dataset/__tests__/create.test.js.map +0 -1
- package/dist/commands/dataset/__tests__/delete.test.js +0 -231
- package/dist/commands/dataset/__tests__/delete.test.js.map +0 -1
- package/dist/commands/dataset/__tests__/export.test.js +0 -601
- 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 -216
- package/dist/commands/dataset/__tests__/list.test.js.map +0 -1
- package/dist/commands/dataset/alias/__tests__/create.test.js +0 -339
- package/dist/commands/dataset/alias/__tests__/create.test.js.map +0 -1
- package/dist/commands/dataset/alias/__tests__/delete.test.js +0 -247
- package/dist/commands/dataset/alias/__tests__/delete.test.js.map +0 -1
- package/dist/commands/dataset/alias/__tests__/link.test.js +0 -376
- package/dist/commands/dataset/alias/__tests__/link.test.js.map +0 -1
- package/dist/commands/dataset/alias/__tests__/unlink.test.js +0 -313
- package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +0 -1
- package/dist/commands/dataset/visibility/__tests__/get.test.js +0 -128
- package/dist/commands/dataset/visibility/__tests__/get.test.js.map +0 -1
- package/dist/commands/dataset/visibility/__tests__/set.test.js +0 -198
- 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 -255
- package/dist/commands/docs/__tests__/search.test.js.map +0 -1
- package/dist/commands/documents/__tests__/create.test.js +0 -1030
- package/dist/commands/documents/__tests__/create.test.js.map +0 -1
- package/dist/commands/documents/__tests__/delete.test.js +0 -300
- package/dist/commands/documents/__tests__/delete.test.js.map +0 -1
- package/dist/commands/documents/__tests__/get.test.js +0 -182
- package/dist/commands/documents/__tests__/get.test.js.map +0 -1
- package/dist/commands/documents/__tests__/query.test.js +0 -300
- package/dist/commands/documents/__tests__/query.test.js.map +0 -1
- package/dist/commands/documents/__tests__/validate.test.js +0 -249
- package/dist/commands/documents/__tests__/validate.test.js.map +0 -1
- package/dist/commands/graphql/__tests__/list.test.js +0 -240
- package/dist/commands/graphql/__tests__/list.test.js.map +0 -1
- package/dist/commands/graphql/__tests__/undeploy.test.js +0 -410
- package/dist/commands/graphql/__tests__/undeploy.test.js.map +0 -1
- package/dist/commands/hook/__tests__/attempt.test.js +0 -275
- package/dist/commands/hook/__tests__/attempt.test.js.map +0 -1
- package/dist/commands/hook/__tests__/create.test.js +0 -119
- package/dist/commands/hook/__tests__/create.test.js.map +0 -1
- package/dist/commands/hook/__tests__/delete.test.js +0 -233
- package/dist/commands/hook/__tests__/delete.test.js.map +0 -1
- package/dist/commands/hook/__tests__/list.test.js +0 -145
- package/dist/commands/hook/__tests__/list.test.js.map +0 -1
- package/dist/commands/hook/__tests__/logs.test.js +0 -798
- package/dist/commands/hook/__tests__/logs.test.js.map +0 -1
- package/dist/commands/manifest/__tests__/extract.test.js +0 -132
- 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 -173
- package/dist/commands/media/__tests__/create-aspect.test.js.map +0 -1
- package/dist/commands/media/__tests__/delete-aspect.test.js +0 -342
- package/dist/commands/media/__tests__/delete-aspect.test.js.map +0 -1
- package/dist/commands/media/__tests__/deploy-aspect.test.js +0 -619
- package/dist/commands/media/__tests__/deploy-aspect.test.js.map +0 -1
- package/dist/commands/media/__tests__/export.test.js +0 -697
- package/dist/commands/media/__tests__/export.test.js.map +0 -1
- package/dist/commands/media/__tests__/import.test.js +0 -347
- 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 -154
- package/dist/commands/projects/__tests__/list.test.js.map +0 -1
- package/dist/commands/schema/__tests__/delete.test.js +0 -454
- package/dist/commands/schema/__tests__/delete.test.js.map +0 -1
- package/dist/commands/schema/__tests__/deploy.test.js +0 -348
- package/dist/commands/schema/__tests__/deploy.test.js.map +0 -1
- package/dist/commands/schema/__tests__/extract.test.js +0 -121
- package/dist/commands/schema/__tests__/extract.test.js.map +0 -1
- package/dist/commands/schema/__tests__/list.test.js +0 -399
- package/dist/commands/schema/__tests__/list.test.js.map +0 -1
- package/dist/commands/schema/__tests__/validate.test.js +0 -121
- package/dist/commands/schema/__tests__/validate.test.js.map +0 -1
- package/dist/commands/telemetry/__tests__/disable.test.js +0 -147
- package/dist/commands/telemetry/__tests__/disable.test.js.map +0 -1
- package/dist/commands/telemetry/__tests__/enable.test.js +0 -133
- package/dist/commands/telemetry/__tests__/enable.test.js.map +0 -1
- package/dist/commands/telemetry/__tests__/status.test.js +0 -155
- package/dist/commands/telemetry/__tests__/status.test.js.map +0 -1
- package/dist/commands/tokens/__tests__/add.test.js +0 -435
- package/dist/commands/tokens/__tests__/add.test.js.map +0 -1
- package/dist/commands/tokens/__tests__/delete.test.js +0 -405
- package/dist/commands/tokens/__tests__/delete.test.js.map +0 -1
- package/dist/commands/tokens/__tests__/list.test.js +0 -395
- package/dist/commands/tokens/__tests__/list.test.js.map +0 -1
- package/dist/commands/users/__tests__/invite.test.js +0 -362
- package/dist/commands/users/__tests__/invite.test.js.map +0 -1
- package/dist/commands/users/__tests__/list.test.js +0 -407
- 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,207 +0,0 @@
|
|
|
1
|
-
import { copyFile, mkdir, rm } from 'node:fs/promises';
|
|
2
|
-
import { tmpdir } from 'node:os';
|
|
3
|
-
import { join, resolve } from 'node:path';
|
|
4
|
-
import { runCommand } from '@oclif/test';
|
|
5
|
-
import { setConfig } from '@sanity/cli-core';
|
|
6
|
-
import { testCommand } from '@sanity/cli-test';
|
|
7
|
-
import { execa } from 'execa';
|
|
8
|
-
import { beforeEach, describe, expect, test } from 'vitest';
|
|
9
|
-
import { testExample } from '~test/helpers/testExample.js';
|
|
10
|
-
import { ExecCommand } from '../exec.js';
|
|
11
|
-
// Environment vars to set in setupTestAuth
|
|
12
|
-
const TEST_TOKEN = process.env.SANITY_API_TOKEN?.trim();
|
|
13
|
-
const TEST_CONFIG_DIR = join(tmpdir(), 'sanity-cli-test-exec');
|
|
14
|
-
const TEST_CONFIG_PATH = join(TEST_CONFIG_DIR, 'config.json');
|
|
15
|
-
// Test example and fixture directory paths
|
|
16
|
-
let exampleDir;
|
|
17
|
-
let fixtureDir;
|
|
18
|
-
let scriptPath;
|
|
19
|
-
// Helper to set up test authentication config
|
|
20
|
-
async function setupTestAuth(token) {
|
|
21
|
-
await mkdir(TEST_CONFIG_DIR, {
|
|
22
|
-
recursive: true
|
|
23
|
-
});
|
|
24
|
-
// Use cli-core's setConfig to write token to config file
|
|
25
|
-
// Need to set env vars so it writes to the test config path
|
|
26
|
-
const originalConfigPath = process.env.SANITY_CLI_CONFIG_PATH;
|
|
27
|
-
process.env.SANITY_CLI_CONFIG_PATH = TEST_CONFIG_PATH;
|
|
28
|
-
try {
|
|
29
|
-
await setConfig('authToken', token);
|
|
30
|
-
} finally{
|
|
31
|
-
// Restore original env vars
|
|
32
|
-
if (originalConfigPath) {
|
|
33
|
-
process.env.SANITY_CLI_CONFIG_PATH = originalConfigPath;
|
|
34
|
-
} else {
|
|
35
|
-
delete process.env.SANITY_CLI_CONFIG_PATH;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return {
|
|
39
|
-
cleanup: ()=>rm(TEST_CONFIG_DIR, {
|
|
40
|
-
force: true,
|
|
41
|
-
recursive: true
|
|
42
|
-
})
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
// Helper to run sanity exec command and capture output
|
|
46
|
-
async function runExecCommand(cwd, scriptPath, flags = [], customEnv) {
|
|
47
|
-
// Get repo root - go up from packages/@sanity/cli/src/commands/__tests__
|
|
48
|
-
const repoRoot = resolve(import.meta.dirname, '../../../../../../');
|
|
49
|
-
const cliPath = join(repoRoot, 'packages/@sanity/cli/bin/run.js');
|
|
50
|
-
try {
|
|
51
|
-
const result = await execa('node', [
|
|
52
|
-
cliPath,
|
|
53
|
-
'exec',
|
|
54
|
-
scriptPath,
|
|
55
|
-
...flags
|
|
56
|
-
], {
|
|
57
|
-
cwd,
|
|
58
|
-
env: {
|
|
59
|
-
...process.env,
|
|
60
|
-
SANITY_BASE_PATH: cwd,
|
|
61
|
-
...customEnv
|
|
62
|
-
},
|
|
63
|
-
reject: false
|
|
64
|
-
});
|
|
65
|
-
return {
|
|
66
|
-
exitCode: result.exitCode,
|
|
67
|
-
stderr: result.stderr,
|
|
68
|
-
stdout: result.stdout
|
|
69
|
-
};
|
|
70
|
-
} catch (error) {
|
|
71
|
-
if (error instanceof Error) {
|
|
72
|
-
throw new Error(`Command failed: ${error.message}`);
|
|
73
|
-
}
|
|
74
|
-
throw error;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
describe('#exec', ()=>{
|
|
78
|
-
beforeEach(async ()=>{
|
|
79
|
-
exampleDir = await testExample('basic-studio');
|
|
80
|
-
fixtureDir = resolve(import.meta.dirname, '../../../test/__fixtures__');
|
|
81
|
-
scriptPath = join(exampleDir, 'test-script.ts');
|
|
82
|
-
await copyFile(join(fixtureDir, 'exec-script.ts'), scriptPath);
|
|
83
|
-
});
|
|
84
|
-
test('help text is correct', async ()=>{
|
|
85
|
-
const { stdout } = await runCommand('exec --help');
|
|
86
|
-
expect(stdout).toMatchInlineSnapshot(`
|
|
87
|
-
"Executes a script within the Sanity Studio context
|
|
88
|
-
|
|
89
|
-
USAGE
|
|
90
|
-
$ sanity exec SCRIPT... [--mock-browser-env] [--with-user-token]
|
|
91
|
-
|
|
92
|
-
ARGUMENTS
|
|
93
|
-
SCRIPT... Path to the script to execute
|
|
94
|
-
|
|
95
|
-
FLAGS
|
|
96
|
-
--mock-browser-env Mocks a browser-like environment using jsdom
|
|
97
|
-
--with-user-token Prime access token from CLI config into getCliClient()
|
|
98
|
-
|
|
99
|
-
DESCRIPTION
|
|
100
|
-
Executes a script within the Sanity Studio context
|
|
101
|
-
|
|
102
|
-
EXAMPLES
|
|
103
|
-
Run the script at some/script.js in Sanity context
|
|
104
|
-
|
|
105
|
-
$ sanity exec some/script.js
|
|
106
|
-
|
|
107
|
-
Run the script at migrations/fullname.ts and configure \`getCliClient()\` from
|
|
108
|
-
\`sanity/cli\` to include the current user's token
|
|
109
|
-
|
|
110
|
-
$ sanity exec migrations/fullname.ts --with-user-token
|
|
111
|
-
|
|
112
|
-
Run the script at scripts/browserScript.js in a mock browser environment
|
|
113
|
-
|
|
114
|
-
$ sanity exec scripts/browserScript.js --mock-browser-env
|
|
115
|
-
|
|
116
|
-
Pass arbitrary arguments to scripts by separating them with a \`--\`.
|
|
117
|
-
Arguments are available in \`process.argv\` as they would in regular node
|
|
118
|
-
scripts (eg the following command would yield a \`process.argv\` of:
|
|
119
|
-
\`['/path/to/node', '/path/to/myscript.js', '--dry-run',
|
|
120
|
-
'positional-argument']\`)
|
|
121
|
-
|
|
122
|
-
$ sanity exec --mock-browser-env myscript.js -- --dry-run \\
|
|
123
|
-
positional-argument
|
|
124
|
-
|
|
125
|
-
"
|
|
126
|
-
`);
|
|
127
|
-
});
|
|
128
|
-
test('shows an error for invalid flags', async ()=>{
|
|
129
|
-
const { error } = await testCommand(ExecCommand, [
|
|
130
|
-
scriptPath,
|
|
131
|
-
'--invalid'
|
|
132
|
-
], {
|
|
133
|
-
config: {
|
|
134
|
-
root: exampleDir
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
expect(error?.message).toContain('Nonexistent flag: --invalid');
|
|
138
|
-
});
|
|
139
|
-
test('validates that script argument is required', async ()=>{
|
|
140
|
-
const { error } = await testCommand(ExecCommand, []);
|
|
141
|
-
expect(error?.message).toContain('Missing 1 required arg');
|
|
142
|
-
expect(error?.message).toContain('script');
|
|
143
|
-
});
|
|
144
|
-
test('validates that script file exists', async ()=>{
|
|
145
|
-
const nonExistentScript = join(exampleDir, 'non-existent-script.ts');
|
|
146
|
-
const { error } = await testCommand(ExecCommand, [
|
|
147
|
-
nonExistentScript
|
|
148
|
-
], {
|
|
149
|
-
config: {
|
|
150
|
-
root: exampleDir
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
expect(error?.message).toContain('No file found at');
|
|
154
|
-
});
|
|
155
|
-
describe('integration tests', ()=>{
|
|
156
|
-
test('executes script successfully', async ()=>{
|
|
157
|
-
const { exitCode, stdout } = await runExecCommand(exampleDir, scriptPath);
|
|
158
|
-
expect(exitCode).toBe(0);
|
|
159
|
-
// Parse the JSON output
|
|
160
|
-
const data = JSON.parse(stdout.trim());
|
|
161
|
-
expect(data.success).toBe(true);
|
|
162
|
-
expect(data.env.SANITY_BASE_PATH).toBe(exampleDir);
|
|
163
|
-
// Without token, API returns empty object rather than throwing error
|
|
164
|
-
expect(data.user).toEqual({});
|
|
165
|
-
});
|
|
166
|
-
test.skipIf(!TEST_TOKEN)('executes script with --with-user-token flag', async ()=>{
|
|
167
|
-
if (!TEST_TOKEN) return; // TypeScript guard
|
|
168
|
-
// Set up test auth config with token
|
|
169
|
-
const { cleanup } = await setupTestAuth(TEST_TOKEN);
|
|
170
|
-
try {
|
|
171
|
-
const { exitCode, stdout } = await runExecCommand(exampleDir, scriptPath, [
|
|
172
|
-
'--with-user-token'
|
|
173
|
-
], {
|
|
174
|
-
SANITY_CLI_CONFIG_PATH: TEST_CONFIG_PATH,
|
|
175
|
-
SANITY_INTERNAL_ENV: 'staging'
|
|
176
|
-
});
|
|
177
|
-
expect(exitCode).toBe(0);
|
|
178
|
-
// Parse the JSON output
|
|
179
|
-
const data = JSON.parse(stdout.trim());
|
|
180
|
-
expect(data.success).toBe(true);
|
|
181
|
-
expect(data.env.SANITY_BASE_PATH).toBe(exampleDir);
|
|
182
|
-
expect(data.user.id).toBeDefined();
|
|
183
|
-
expect(data.user.email).toBeDefined();
|
|
184
|
-
expect(data.user.id).not.toBe('unknown');
|
|
185
|
-
expect(data.user.email).not.toBe('unknown');
|
|
186
|
-
} finally{
|
|
187
|
-
// Clean up test config
|
|
188
|
-
await cleanup();
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
test('executes script with --mock-browser-env flag', async ()=>{
|
|
192
|
-
const { exitCode, stdout } = await runExecCommand(exampleDir, scriptPath, [
|
|
193
|
-
'--mock-browser-env'
|
|
194
|
-
]);
|
|
195
|
-
expect(exitCode).toBe(0);
|
|
196
|
-
// Parse the JSON output
|
|
197
|
-
const data = JSON.parse(stdout.trim());
|
|
198
|
-
expect(data.success).toBe(true);
|
|
199
|
-
// injected by mockBrowserEnvironment
|
|
200
|
-
expect(data.browser.intersectionObserver).toBe(true);
|
|
201
|
-
// injected by the command itself
|
|
202
|
-
expect(data.env.SANITY_BASE_PATH).toBe(exampleDir);
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
//# sourceMappingURL=exec.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/__tests__/exec.test.ts"],"sourcesContent":["import {copyFile, mkdir, rm} from 'node:fs/promises'\nimport {tmpdir} from 'node:os'\nimport {join, resolve} from 'node:path'\n\nimport {runCommand} from '@oclif/test'\nimport {setConfig} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport {execa} from 'execa'\nimport {beforeEach, describe, expect, test} from 'vitest'\nimport {testExample} from '~test/helpers/testExample.js'\n\nimport {ExecCommand} from '../exec.js'\n\n// Environment vars to set in setupTestAuth\nconst TEST_TOKEN = process.env.SANITY_API_TOKEN?.trim()\nconst TEST_CONFIG_DIR = join(tmpdir(), 'sanity-cli-test-exec')\nconst TEST_CONFIG_PATH = join(TEST_CONFIG_DIR, 'config.json')\n\n// Test example and fixture directory paths\nlet exampleDir: string\nlet fixtureDir: string\nlet scriptPath: string\n\n// Helper to set up test authentication config\nasync function setupTestAuth(token: string): Promise<{cleanup: () => Promise<void>}> {\n await mkdir(TEST_CONFIG_DIR, {recursive: true})\n\n // Use cli-core's setConfig to write token to config file\n // Need to set env vars so it writes to the test config path\n const originalConfigPath = process.env.SANITY_CLI_CONFIG_PATH\n\n process.env.SANITY_CLI_CONFIG_PATH = TEST_CONFIG_PATH\n\n try {\n await setConfig('authToken', token)\n } finally {\n // Restore original env vars\n if (originalConfigPath) {\n process.env.SANITY_CLI_CONFIG_PATH = originalConfigPath\n } else {\n delete process.env.SANITY_CLI_CONFIG_PATH\n }\n }\n\n return {cleanup: () => rm(TEST_CONFIG_DIR, {force: true, recursive: true})}\n}\n\n// Helper to run sanity exec command and capture output\nasync function runExecCommand(\n cwd: string,\n scriptPath: string,\n flags: string[] = [],\n customEnv?: Record<string, string>,\n): Promise<{exitCode: number | undefined; stderr: string; stdout: string}> {\n // Get repo root - go up from packages/@sanity/cli/src/commands/__tests__\n const repoRoot = resolve(import.meta.dirname, '../../../../../../')\n const cliPath = join(repoRoot, 'packages/@sanity/cli/bin/run.js')\n\n try {\n const result = await execa('node', [cliPath, 'exec', scriptPath, ...flags], {\n cwd,\n env: {...process.env, SANITY_BASE_PATH: cwd, ...customEnv},\n reject: false,\n })\n\n return {\n exitCode: result.exitCode,\n stderr: result.stderr,\n stdout: result.stdout,\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Command failed: ${error.message}`)\n }\n throw error\n }\n}\n\ndescribe('#exec', () => {\n beforeEach(async () => {\n exampleDir = await testExample('basic-studio')\n fixtureDir = resolve(import.meta.dirname, '../../../test/__fixtures__')\n scriptPath = join(exampleDir, 'test-script.ts')\n await copyFile(join(fixtureDir, 'exec-script.ts'), scriptPath)\n })\n\n test('help text is correct', async () => {\n const {stdout} = await runCommand('exec --help')\n expect(stdout).toMatchInlineSnapshot(`\n \"Executes a script within the Sanity Studio context\n\n USAGE\n $ sanity exec SCRIPT... [--mock-browser-env] [--with-user-token]\n\n ARGUMENTS\n SCRIPT... Path to the script to execute\n\n FLAGS\n --mock-browser-env Mocks a browser-like environment using jsdom\n --with-user-token Prime access token from CLI config into getCliClient()\n\n DESCRIPTION\n Executes a script within the Sanity Studio context\n\n EXAMPLES\n Run the script at some/script.js in Sanity context\n\n $ sanity exec some/script.js\n\n Run the script at migrations/fullname.ts and configure \\`getCliClient()\\` from\n \\`sanity/cli\\` to include the current user's token\n\n $ sanity exec migrations/fullname.ts --with-user-token\n\n Run the script at scripts/browserScript.js in a mock browser environment\n\n $ sanity exec scripts/browserScript.js --mock-browser-env\n\n Pass arbitrary arguments to scripts by separating them with a \\`--\\`.\n Arguments are available in \\`process.argv\\` as they would in regular node\n scripts (eg the following command would yield a \\`process.argv\\` of:\n \\`['/path/to/node', '/path/to/myscript.js', '--dry-run',\n 'positional-argument']\\`)\n\n $ sanity exec --mock-browser-env myscript.js -- --dry-run \\\\\n positional-argument\n\n \"\n `)\n })\n\n test('shows an error for invalid flags', async () => {\n const {error} = await testCommand(ExecCommand, [scriptPath, '--invalid'], {\n config: {root: exampleDir},\n })\n\n expect(error?.message).toContain('Nonexistent flag: --invalid')\n })\n\n test('validates that script argument is required', async () => {\n const {error} = await testCommand(ExecCommand, [])\n\n expect(error?.message).toContain('Missing 1 required arg')\n expect(error?.message).toContain('script')\n })\n\n test('validates that script file exists', async () => {\n const nonExistentScript = join(exampleDir, 'non-existent-script.ts')\n\n const {error} = await testCommand(ExecCommand, [nonExistentScript], {\n config: {root: exampleDir},\n })\n\n expect(error?.message).toContain('No file found at')\n })\n\n describe('integration tests', () => {\n test('executes script successfully', async () => {\n const {exitCode, stdout} = await runExecCommand(exampleDir, scriptPath)\n\n expect(exitCode).toBe(0)\n\n // Parse the JSON output\n const data = JSON.parse(stdout.trim())\n expect(data.success).toBe(true)\n expect(data.env.SANITY_BASE_PATH).toBe(exampleDir)\n // Without token, API returns empty object rather than throwing error\n expect(data.user).toEqual({})\n })\n\n test.skipIf(!TEST_TOKEN)('executes script with --with-user-token flag', async () => {\n if (!TEST_TOKEN) return // TypeScript guard\n\n // Set up test auth config with token\n const {cleanup} = await setupTestAuth(TEST_TOKEN)\n\n try {\n const {exitCode, stdout} = await runExecCommand(\n exampleDir,\n scriptPath,\n ['--with-user-token'],\n {\n SANITY_CLI_CONFIG_PATH: TEST_CONFIG_PATH,\n SANITY_INTERNAL_ENV: 'staging',\n },\n )\n\n expect(exitCode).toBe(0)\n\n // Parse the JSON output\n const data = JSON.parse(stdout.trim())\n expect(data.success).toBe(true)\n expect(data.env.SANITY_BASE_PATH).toBe(exampleDir)\n expect(data.user.id).toBeDefined()\n expect(data.user.email).toBeDefined()\n expect(data.user.id).not.toBe('unknown')\n expect(data.user.email).not.toBe('unknown')\n } finally {\n // Clean up test config\n await cleanup()\n }\n })\n\n test('executes script with --mock-browser-env flag', async () => {\n const {exitCode, stdout} = await runExecCommand(exampleDir, scriptPath, [\n '--mock-browser-env',\n ])\n\n expect(exitCode).toBe(0)\n\n // Parse the JSON output\n const data = JSON.parse(stdout.trim())\n expect(data.success).toBe(true)\n // injected by mockBrowserEnvironment\n expect(data.browser.intersectionObserver).toBe(true)\n // injected by the command itself\n expect(data.env.SANITY_BASE_PATH).toBe(exampleDir)\n })\n })\n})\n"],"names":["copyFile","mkdir","rm","tmpdir","join","resolve","runCommand","setConfig","testCommand","execa","beforeEach","describe","expect","test","testExample","ExecCommand","TEST_TOKEN","process","env","SANITY_API_TOKEN","trim","TEST_CONFIG_DIR","TEST_CONFIG_PATH","exampleDir","fixtureDir","scriptPath","setupTestAuth","token","recursive","originalConfigPath","SANITY_CLI_CONFIG_PATH","cleanup","force","runExecCommand","cwd","flags","customEnv","repoRoot","dirname","cliPath","result","SANITY_BASE_PATH","reject","exitCode","stderr","stdout","error","Error","message","toMatchInlineSnapshot","config","root","toContain","nonExistentScript","toBe","data","JSON","parse","success","user","toEqual","skipIf","SANITY_INTERNAL_ENV","id","toBeDefined","email","not","browser","intersectionObserver"],"mappings":"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"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { testCommand } from '@sanity/cli-test';
|
|
2
|
-
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
3
|
-
import { InitCommand } from '../../init';
|
|
4
|
-
const mockGetById = vi.hoisted(()=>vi.fn());
|
|
5
|
-
const mockLogin = vi.hoisted(()=>vi.fn());
|
|
6
|
-
vi.mock('@sanity/cli-core', async (importOriginal)=>{
|
|
7
|
-
const actual = await importOriginal();
|
|
8
|
-
return {
|
|
9
|
-
...actual,
|
|
10
|
-
getGlobalCliClient: vi.fn().mockResolvedValue({
|
|
11
|
-
users: {
|
|
12
|
-
getById: mockGetById
|
|
13
|
-
}
|
|
14
|
-
})
|
|
15
|
-
};
|
|
16
|
-
});
|
|
17
|
-
vi.mock('@vercel/fs-detectors', ()=>({
|
|
18
|
-
detectFrameworkRecord: vi.fn().mockResolvedValue({
|
|
19
|
-
name: 'Next.js',
|
|
20
|
-
slug: 'nextjs'
|
|
21
|
-
}),
|
|
22
|
-
LocalFileSystemDetector: vi.fn()
|
|
23
|
-
}));
|
|
24
|
-
vi.mock('../../../actions/auth/login/login.js', ()=>({
|
|
25
|
-
login: mockLogin
|
|
26
|
-
}));
|
|
27
|
-
describe('#init: authentication', ()=>{
|
|
28
|
-
afterEach(()=>{
|
|
29
|
-
vi.clearAllMocks();
|
|
30
|
-
});
|
|
31
|
-
test('user is authenticated with valid token', async ()=>{
|
|
32
|
-
mockGetById.mockResolvedValue({
|
|
33
|
-
email: 'test@example.com',
|
|
34
|
-
id: 'user-123',
|
|
35
|
-
name: 'Test User',
|
|
36
|
-
provider: 'saml-123'
|
|
37
|
-
});
|
|
38
|
-
const { error, stdout } = await testCommand(InitCommand, [], {
|
|
39
|
-
mocks: {
|
|
40
|
-
isInteractive: true,
|
|
41
|
-
token: 'test-token'
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
expect(error).toBeUndefined();
|
|
45
|
-
expect(stdout).toContain('You are logged in as test@example.com using SAML');
|
|
46
|
-
});
|
|
47
|
-
test('throws error if user is authenticated with invalid token in unattended mode', async ()=>{
|
|
48
|
-
mockGetById.mockRejectedValueOnce(new Error('Invalid token'));
|
|
49
|
-
const { error } = await testCommand(InitCommand, [
|
|
50
|
-
'--yes',
|
|
51
|
-
'--dataset=test',
|
|
52
|
-
'--project==test'
|
|
53
|
-
], {
|
|
54
|
-
mocks: {
|
|
55
|
-
token: 'test-token'
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
expect(error?.message).toContain('Must be logged in to run this command in unattended mode, run `sanity login`');
|
|
59
|
-
});
|
|
60
|
-
test('calls login when token invalid and not in unattended mode', async ()=>{
|
|
61
|
-
mockGetById.mockRejectedValueOnce(new Error('Invalid token'));
|
|
62
|
-
const { error } = await testCommand(InitCommand, [], {
|
|
63
|
-
mocks: {
|
|
64
|
-
isInteractive: true,
|
|
65
|
-
token: 'test-token'
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
expect(error).toBe(undefined);
|
|
69
|
-
expect(mockLogin).toHaveBeenCalled();
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
//# sourceMappingURL=init.authentication.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/__tests__/init/init.authentication.test.ts"],"sourcesContent":["import {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {InitCommand} from '../../init'\n\nconst mockGetById = vi.hoisted(() => vi.fn())\nconst mockLogin = vi.hoisted(() => vi.fn())\n\nvi.mock('@sanity/cli-core', async (importOriginal) => {\n const actual = await importOriginal<typeof import('@sanity/cli-core')>()\n return {\n ...actual,\n getGlobalCliClient: vi.fn().mockResolvedValue({\n users: {\n getById: mockGetById,\n } as never,\n }),\n }\n})\n\nvi.mock('@vercel/fs-detectors', () => ({\n detectFrameworkRecord: vi.fn().mockResolvedValue({\n name: 'Next.js',\n slug: 'nextjs',\n }),\n LocalFileSystemDetector: vi.fn(),\n}))\n\nvi.mock('../../../actions/auth/login/login.js', () => ({\n login: mockLogin,\n}))\n\ndescribe('#init: authentication', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('user is authenticated with valid token', async () => {\n mockGetById.mockResolvedValue({\n email: 'test@example.com',\n id: 'user-123',\n name: 'Test User',\n provider: 'saml-123',\n })\n\n const {error, stdout} = await testCommand(InitCommand, [], {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n })\n\n expect(error).toBeUndefined()\n expect(stdout).toContain('You are logged in as test@example.com using SAML')\n })\n\n test('throws error if user is authenticated with invalid token in unattended mode', async () => {\n mockGetById.mockRejectedValueOnce(new Error('Invalid token'))\n\n const {error} = await testCommand(InitCommand, ['--yes', '--dataset=test', '--project==test'], {\n mocks: {\n token: 'test-token',\n },\n })\n\n expect(error?.message).toContain(\n 'Must be logged in to run this command in unattended mode, run `sanity login`',\n )\n })\n\n test('calls login when token invalid and not in unattended mode', async () => {\n mockGetById.mockRejectedValueOnce(new Error('Invalid token'))\n\n const {error} = await testCommand(InitCommand, [], {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n })\n\n expect(error).toBe(undefined)\n expect(mockLogin).toHaveBeenCalled()\n })\n})\n"],"names":["testCommand","afterEach","describe","expect","test","vi","InitCommand","mockGetById","hoisted","fn","mockLogin","mock","importOriginal","actual","getGlobalCliClient","mockResolvedValue","users","getById","detectFrameworkRecord","name","slug","LocalFileSystemDetector","login","clearAllMocks","email","id","provider","error","stdout","mocks","isInteractive","token","toBeUndefined","toContain","mockRejectedValueOnce","Error","message","toBe","undefined","toHaveBeenCalled"],"mappings":"AAAA,SAAQA,WAAW,QAAO,mBAAkB;AAC5C,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,WAAW,QAAO,aAAY;AAEtC,MAAMC,cAAcF,GAAGG,OAAO,CAAC,IAAMH,GAAGI,EAAE;AAC1C,MAAMC,YAAYL,GAAGG,OAAO,CAAC,IAAMH,GAAGI,EAAE;AAExCJ,GAAGM,IAAI,CAAC,oBAAoB,OAAOC;IACjC,MAAMC,SAAS,MAAMD;IACrB,OAAO;QACL,GAAGC,MAAM;QACTC,oBAAoBT,GAAGI,EAAE,GAAGM,iBAAiB,CAAC;YAC5CC,OAAO;gBACLC,SAASV;YACX;QACF;IACF;AACF;AAEAF,GAAGM,IAAI,CAAC,wBAAwB,IAAO,CAAA;QACrCO,uBAAuBb,GAAGI,EAAE,GAAGM,iBAAiB,CAAC;YAC/CI,MAAM;YACNC,MAAM;QACR;QACAC,yBAAyBhB,GAAGI,EAAE;IAChC,CAAA;AAEAJ,GAAGM,IAAI,CAAC,wCAAwC,IAAO,CAAA;QACrDW,OAAOZ;IACT,CAAA;AAEAR,SAAS,yBAAyB;IAChCD,UAAU;QACRI,GAAGkB,aAAa;IAClB;IAEAnB,KAAK,0CAA0C;QAC7CG,YAAYQ,iBAAiB,CAAC;YAC5BS,OAAO;YACPC,IAAI;YACJN,MAAM;YACNO,UAAU;QACZ;QAEA,MAAM,EAACC,KAAK,EAAEC,MAAM,EAAC,GAAG,MAAM5B,YAAYM,aAAa,EAAE,EAAE;YACzDuB,OAAO;gBACLC,eAAe;gBACfC,OAAO;YACT;QACF;QAEA5B,OAAOwB,OAAOK,aAAa;QAC3B7B,OAAOyB,QAAQK,SAAS,CAAC;IAC3B;IAEA7B,KAAK,+EAA+E;QAClFG,YAAY2B,qBAAqB,CAAC,IAAIC,MAAM;QAE5C,MAAM,EAACR,KAAK,EAAC,GAAG,MAAM3B,YAAYM,aAAa;YAAC;YAAS;YAAkB;SAAkB,EAAE;YAC7FuB,OAAO;gBACLE,OAAO;YACT;QACF;QAEA5B,OAAOwB,OAAOS,SAASH,SAAS,CAC9B;IAEJ;IAEA7B,KAAK,6DAA6D;QAChEG,YAAY2B,qBAAqB,CAAC,IAAIC,MAAM;QAE5C,MAAM,EAACR,KAAK,EAAC,GAAG,MAAM3B,YAAYM,aAAa,EAAE,EAAE;YACjDuB,OAAO;gBACLC,eAAe;gBACfC,OAAO;YACT;QACF;QAEA5B,OAAOwB,OAAOU,IAAI,CAACC;QACnBnC,OAAOO,WAAW6B,gBAAgB;IACpC;AACF"}
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import * as cliUX from '@sanity/cli-core/ux';
|
|
2
|
-
import { createTestClient, mockApi, testCommand } from '@sanity/cli-test';
|
|
3
|
-
import nock from 'nock';
|
|
4
|
-
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
5
|
-
import { ORGANIZATIONS_API_VERSION } from '../../../services/organizations.js';
|
|
6
|
-
import { CREATE_PROJECT_API_VERSION } from '../../../services/projects.js';
|
|
7
|
-
import { InitCommand } from '../../init';
|
|
8
|
-
const mocks = vi.hoisted(()=>({
|
|
9
|
-
datasetsCreate: vi.fn(),
|
|
10
|
-
detectFrameworkRecord: vi.fn(),
|
|
11
|
-
getOrganizationChoices: vi.fn(),
|
|
12
|
-
getOrganizationsWithAttachGrantInfo: vi.fn(),
|
|
13
|
-
input: vi.fn(),
|
|
14
|
-
select: vi.fn(),
|
|
15
|
-
usersGetById: vi.fn()
|
|
16
|
-
}));
|
|
17
|
-
vi.mock('@vercel/fs-detectors', ()=>({
|
|
18
|
-
detectFrameworkRecord: mocks.detectFrameworkRecord,
|
|
19
|
-
LocalFileSystemDetector: vi.fn()
|
|
20
|
-
}));
|
|
21
|
-
vi.mock('@sanity/cli-core/ux', async ()=>{
|
|
22
|
-
const actual = await vi.importActual('@sanity/cli-core/ux');
|
|
23
|
-
return {
|
|
24
|
-
...actual,
|
|
25
|
-
input: mocks.input,
|
|
26
|
-
select: mocks.select
|
|
27
|
-
};
|
|
28
|
-
});
|
|
29
|
-
vi.mock('@sanity/cli-core', async (importOriginal)=>{
|
|
30
|
-
const actual = await importOriginal();
|
|
31
|
-
const testClient = createTestClient({
|
|
32
|
-
apiVersion: 'v2025-05-14',
|
|
33
|
-
token: 'test-token'
|
|
34
|
-
});
|
|
35
|
-
return {
|
|
36
|
-
...actual,
|
|
37
|
-
getGlobalCliClient: vi.fn().mockResolvedValue({
|
|
38
|
-
datasets: {
|
|
39
|
-
create: mocks.datasetsCreate
|
|
40
|
-
},
|
|
41
|
-
request: testClient.request,
|
|
42
|
-
users: {
|
|
43
|
-
getById: mocks.usersGetById
|
|
44
|
-
}
|
|
45
|
-
}),
|
|
46
|
-
getProjectCliClient: vi.fn().mockResolvedValue({
|
|
47
|
-
datasets: {
|
|
48
|
-
create: mocks.datasetsCreate
|
|
49
|
-
}
|
|
50
|
-
})
|
|
51
|
-
};
|
|
52
|
-
});
|
|
53
|
-
vi.mock('../../../actions/organizations/getOrganizationChoices.js', ()=>({
|
|
54
|
-
getOrganizationChoices: mocks.getOrganizationChoices
|
|
55
|
-
}));
|
|
56
|
-
vi.mock('../../../actions/organizations/getOrganizationsWithAttachGrantInfo.js', ()=>({
|
|
57
|
-
getOrganizationsWithAttachGrantInfo: mocks.getOrganizationsWithAttachGrantInfo
|
|
58
|
-
}));
|
|
59
|
-
mocks.usersGetById.mockResolvedValue({
|
|
60
|
-
email: 'test@example.com',
|
|
61
|
-
id: 'user-123',
|
|
62
|
-
name: 'Test User',
|
|
63
|
-
provider: 'saml-123'
|
|
64
|
-
});
|
|
65
|
-
describe('#init: create new project', ()=>{
|
|
66
|
-
afterEach(()=>{
|
|
67
|
-
vi.clearAllMocks();
|
|
68
|
-
const pending = nock.pendingMocks();
|
|
69
|
-
nock.cleanAll();
|
|
70
|
-
expect(pending, 'pending mocks').toEqual([]);
|
|
71
|
-
});
|
|
72
|
-
test('prompts user to create new organization if they have none', async ()=>{
|
|
73
|
-
mocks.detectFrameworkRecord.mockResolvedValueOnce(null);
|
|
74
|
-
mockApi({
|
|
75
|
-
apiVersion: ORGANIZATIONS_API_VERSION,
|
|
76
|
-
method: 'get',
|
|
77
|
-
uri: '/organizations'
|
|
78
|
-
}).reply(200, []);
|
|
79
|
-
mocks.input.mockResolvedValueOnce('My New Organization');
|
|
80
|
-
mockApi({
|
|
81
|
-
apiVersion: ORGANIZATIONS_API_VERSION,
|
|
82
|
-
method: 'post',
|
|
83
|
-
uri: '/organizations'
|
|
84
|
-
}).reply(200, {
|
|
85
|
-
createdByUserId: 'user-123',
|
|
86
|
-
defaultRoleName: null,
|
|
87
|
-
features: [],
|
|
88
|
-
id: 'org-123',
|
|
89
|
-
members: [],
|
|
90
|
-
name: 'My New Organization',
|
|
91
|
-
slug: 'my-new-organization'
|
|
92
|
-
});
|
|
93
|
-
mockApi({
|
|
94
|
-
apiVersion: CREATE_PROJECT_API_VERSION,
|
|
95
|
-
method: 'post',
|
|
96
|
-
uri: '/projects'
|
|
97
|
-
}).reply(200, {
|
|
98
|
-
displayName: 'Test Project',
|
|
99
|
-
projectId: 'project-123'
|
|
100
|
-
});
|
|
101
|
-
mocks.datasetsCreate.mockResolvedValueOnce(undefined);
|
|
102
|
-
const spinnerSpy = vi.spyOn(cliUX, 'spinner');
|
|
103
|
-
await testCommand(InitCommand, [
|
|
104
|
-
'--create-project=Test Project',
|
|
105
|
-
'--dataset=production',
|
|
106
|
-
'--output-path=./test-project'
|
|
107
|
-
], {
|
|
108
|
-
mocks: {
|
|
109
|
-
isInteractive: true,
|
|
110
|
-
token: 'test-token'
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
expect(mocks.input).toHaveBeenCalledWith(expect.objectContaining({
|
|
114
|
-
default: 'Test User',
|
|
115
|
-
message: 'Organization name:'
|
|
116
|
-
}));
|
|
117
|
-
expect(mocks.datasetsCreate).toHaveBeenCalledWith('production');
|
|
118
|
-
expect(spinnerSpy).toHaveBeenCalledWith('Creating organization');
|
|
119
|
-
expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset');
|
|
120
|
-
});
|
|
121
|
-
test('prompts user to select then create a new organization', async ()=>{
|
|
122
|
-
mocks.detectFrameworkRecord.mockResolvedValueOnce(null);
|
|
123
|
-
mockApi({
|
|
124
|
-
apiVersion: ORGANIZATIONS_API_VERSION,
|
|
125
|
-
method: 'get',
|
|
126
|
-
uri: '/organizations'
|
|
127
|
-
}).reply(200, [
|
|
128
|
-
{
|
|
129
|
-
id: 'existing-org-123',
|
|
130
|
-
name: 'Existing Organization',
|
|
131
|
-
slug: 'existing-organization'
|
|
132
|
-
}
|
|
133
|
-
]);
|
|
134
|
-
mocks.getOrganizationsWithAttachGrantInfo.mockResolvedValueOnce([
|
|
135
|
-
{
|
|
136
|
-
hasAttachGrant: true,
|
|
137
|
-
organization: {
|
|
138
|
-
id: 'existing-org-123',
|
|
139
|
-
name: 'Existing Organization',
|
|
140
|
-
slug: 'existing-organization'
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
]);
|
|
144
|
-
mocks.getOrganizationChoices.mockReturnValueOnce([
|
|
145
|
-
{
|
|
146
|
-
name: 'Existing Organization [existing-org-123]',
|
|
147
|
-
value: 'existing-org-123'
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
name: 'Create new organization',
|
|
151
|
-
value: '-new-'
|
|
152
|
-
}
|
|
153
|
-
]);
|
|
154
|
-
mocks.select.mockResolvedValueOnce('-new-');
|
|
155
|
-
mocks.input.mockResolvedValueOnce('Brand New Organization');
|
|
156
|
-
mockApi({
|
|
157
|
-
apiVersion: ORGANIZATIONS_API_VERSION,
|
|
158
|
-
method: 'post',
|
|
159
|
-
uri: '/organizations'
|
|
160
|
-
}).reply(200, {
|
|
161
|
-
createdByUserId: 'user-123',
|
|
162
|
-
defaultRoleName: null,
|
|
163
|
-
features: [],
|
|
164
|
-
id: 'new-org-456',
|
|
165
|
-
members: [],
|
|
166
|
-
name: 'Brand New Organization',
|
|
167
|
-
slug: 'brand-new-organization'
|
|
168
|
-
});
|
|
169
|
-
mockApi({
|
|
170
|
-
apiVersion: CREATE_PROJECT_API_VERSION,
|
|
171
|
-
method: 'post',
|
|
172
|
-
uri: '/projects'
|
|
173
|
-
}).reply(200, {
|
|
174
|
-
displayName: 'Test Project',
|
|
175
|
-
projectId: 'project-123'
|
|
176
|
-
});
|
|
177
|
-
mocks.datasetsCreate.mockResolvedValueOnce(undefined);
|
|
178
|
-
const spinnerSpy = vi.spyOn(cliUX, 'spinner');
|
|
179
|
-
await testCommand(InitCommand, [
|
|
180
|
-
'--create-project=Test Project',
|
|
181
|
-
'--dataset=production',
|
|
182
|
-
'--output-path=./test-project'
|
|
183
|
-
], {
|
|
184
|
-
mocks: {
|
|
185
|
-
isInteractive: true,
|
|
186
|
-
token: 'test-token'
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
expect(mocks.datasetsCreate).toHaveBeenCalledWith('production');
|
|
190
|
-
expect(spinnerSpy).toHaveBeenCalledWith('Creating organization');
|
|
191
|
-
expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset');
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
//# sourceMappingURL=init.create-new-project.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/__tests__/init/init.create-new-project.test.ts"],"sourcesContent":["import * as cliUX from '@sanity/cli-core/ux'\nimport {createTestClient, mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {ORGANIZATIONS_API_VERSION} from '../../../services/organizations.js'\nimport {CREATE_PROJECT_API_VERSION} from '../../../services/projects.js'\nimport {InitCommand} from '../../init'\n\nconst mocks = vi.hoisted(() => ({\n datasetsCreate: vi.fn(),\n detectFrameworkRecord: vi.fn(),\n getOrganizationChoices: vi.fn(),\n getOrganizationsWithAttachGrantInfo: vi.fn(),\n input: vi.fn(),\n select: vi.fn(),\n usersGetById: vi.fn(),\n}))\n\nvi.mock('@vercel/fs-detectors', () => ({\n detectFrameworkRecord: mocks.detectFrameworkRecord,\n LocalFileSystemDetector: vi.fn(),\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual('@sanity/cli-core/ux')\n\n return {\n ...actual,\n input: mocks.input,\n select: mocks.select,\n }\n})\n\nvi.mock('@sanity/cli-core', async (importOriginal) => {\n const actual = await importOriginal<typeof import('@sanity/cli-core')>()\n const testClient = createTestClient({\n apiVersion: 'v2025-05-14',\n token: 'test-token',\n })\n\n return {\n ...actual,\n getGlobalCliClient: vi.fn().mockResolvedValue({\n datasets: {\n create: mocks.datasetsCreate,\n } as never,\n request: testClient.request,\n users: {\n getById: mocks.usersGetById,\n } as never,\n }),\n getProjectCliClient: vi.fn().mockResolvedValue({\n datasets: {\n create: mocks.datasetsCreate,\n } as never,\n }),\n }\n})\n\nvi.mock('../../../actions/organizations/getOrganizationChoices.js', () => ({\n getOrganizationChoices: mocks.getOrganizationChoices,\n}))\n\nvi.mock('../../../actions/organizations/getOrganizationsWithAttachGrantInfo.js', () => ({\n getOrganizationsWithAttachGrantInfo: mocks.getOrganizationsWithAttachGrantInfo,\n}))\n\nmocks.usersGetById.mockResolvedValue({\n email: 'test@example.com',\n id: 'user-123',\n name: 'Test User',\n provider: 'saml-123',\n})\n\ndescribe('#init: create new project', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('prompts user to create new organization if they have none', async () => {\n mocks.detectFrameworkRecord.mockResolvedValueOnce(null)\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'get',\n uri: '/organizations',\n }).reply(200, [])\n\n mocks.input.mockResolvedValueOnce('My New Organization')\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'post',\n uri: '/organizations',\n }).reply(200, {\n createdByUserId: 'user-123',\n defaultRoleName: null,\n features: [],\n id: 'org-123',\n members: [],\n name: 'My New Organization',\n slug: 'my-new-organization',\n })\n\n mockApi({\n apiVersion: CREATE_PROJECT_API_VERSION,\n method: 'post',\n uri: '/projects',\n }).reply(200, {\n displayName: 'Test Project',\n projectId: 'project-123',\n })\n\n mocks.datasetsCreate.mockResolvedValueOnce(undefined)\n\n const spinnerSpy = vi.spyOn(cliUX, 'spinner')\n\n await testCommand(\n InitCommand,\n ['--create-project=Test Project', '--dataset=production', '--output-path=./test-project'],\n {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n },\n )\n\n expect(mocks.input).toHaveBeenCalledWith(\n expect.objectContaining({\n default: 'Test User',\n message: 'Organization name:',\n }),\n )\n\n expect(mocks.datasetsCreate).toHaveBeenCalledWith('production')\n\n expect(spinnerSpy).toHaveBeenCalledWith('Creating organization')\n expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset')\n })\n\n test('prompts user to select then create a new organization', async () => {\n mocks.detectFrameworkRecord.mockResolvedValueOnce(null)\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'get',\n uri: '/organizations',\n }).reply(200, [\n {\n id: 'existing-org-123',\n name: 'Existing Organization',\n slug: 'existing-organization',\n },\n ])\n\n mocks.getOrganizationsWithAttachGrantInfo.mockResolvedValueOnce([\n {\n hasAttachGrant: true,\n organization: {\n id: 'existing-org-123',\n name: 'Existing Organization',\n slug: 'existing-organization',\n },\n },\n ])\n\n mocks.getOrganizationChoices.mockReturnValueOnce([\n {name: 'Existing Organization [existing-org-123]', value: 'existing-org-123'},\n {name: 'Create new organization', value: '-new-'},\n ])\n\n mocks.select.mockResolvedValueOnce('-new-')\n\n mocks.input.mockResolvedValueOnce('Brand New Organization')\n\n mockApi({\n apiVersion: ORGANIZATIONS_API_VERSION,\n method: 'post',\n uri: '/organizations',\n }).reply(200, {\n createdByUserId: 'user-123',\n defaultRoleName: null,\n features: [],\n id: 'new-org-456',\n members: [],\n name: 'Brand New Organization',\n slug: 'brand-new-organization',\n })\n\n mockApi({\n apiVersion: CREATE_PROJECT_API_VERSION,\n method: 'post',\n uri: '/projects',\n }).reply(200, {\n displayName: 'Test Project',\n projectId: 'project-123',\n })\n\n mocks.datasetsCreate.mockResolvedValueOnce(undefined)\n\n const spinnerSpy = vi.spyOn(cliUX, 'spinner')\n\n await testCommand(\n InitCommand,\n ['--create-project=Test Project', '--dataset=production', '--output-path=./test-project'],\n {\n mocks: {\n isInteractive: true,\n token: 'test-token',\n },\n },\n )\n\n expect(mocks.datasetsCreate).toHaveBeenCalledWith('production')\n\n expect(spinnerSpy).toHaveBeenCalledWith('Creating organization')\n expect(spinnerSpy).toHaveBeenCalledWith('Creating dataset')\n })\n})\n"],"names":["cliUX","createTestClient","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","ORGANIZATIONS_API_VERSION","CREATE_PROJECT_API_VERSION","InitCommand","mocks","hoisted","datasetsCreate","fn","detectFrameworkRecord","getOrganizationChoices","getOrganizationsWithAttachGrantInfo","input","select","usersGetById","mock","LocalFileSystemDetector","actual","importActual","importOriginal","testClient","apiVersion","token","getGlobalCliClient","mockResolvedValue","datasets","create","request","users","getById","getProjectCliClient","email","id","name","provider","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","mockResolvedValueOnce","method","uri","reply","createdByUserId","defaultRoleName","features","members","slug","displayName","projectId","undefined","spinnerSpy","spyOn","isInteractive","toHaveBeenCalledWith","objectContaining","default","message","hasAttachGrant","organization","mockReturnValueOnce","value"],"mappings":"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"}
|