@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
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { rm } from 'node:fs/promises';
|
|
2
|
+
import { catchError, defer, from, lastValueFrom, mergeMap, of, reduce, switchMap, tap } from 'rxjs';
|
|
3
|
+
import { readNDJSON } from '../utils/readNDJSON.js';
|
|
4
|
+
import { cleanupOldTelemetryFiles } from './cleanupOldTelemetryFiles.js';
|
|
5
|
+
import { telemetryStoreDebug } from './debug.js';
|
|
6
|
+
import { findTelemetryFiles } from './findTelemetryFiles.js';
|
|
7
|
+
/**
|
|
8
|
+
* Standalone, stateless function to flush telemetry files.
|
|
9
|
+
*
|
|
10
|
+
* This function can be used independently of the telemetry store, making it
|
|
11
|
+
* suitable for use in child processes or other contexts where store state
|
|
12
|
+
* is not available.
|
|
13
|
+
*
|
|
14
|
+
* @param options - Configuration for consent resolution and event sending
|
|
15
|
+
* @returns Promise that resolves when flush operation is complete
|
|
16
|
+
*
|
|
17
|
+
* @internal
|
|
18
|
+
*/ export async function flushTelemetryFiles(options) {
|
|
19
|
+
telemetryStoreDebug('Starting standalone flush operation');
|
|
20
|
+
// Helper function for deleting files with consistent error handling
|
|
21
|
+
const deleteFiles = (files, reason)=>{
|
|
22
|
+
if (files.length === 0) {
|
|
23
|
+
// of() is not same as of(undefined) in rxjs
|
|
24
|
+
// eslint-disable-next-line unicorn/no-useless-undefined
|
|
25
|
+
return of(undefined);
|
|
26
|
+
}
|
|
27
|
+
return from(files).pipe(mergeMap((filePath)=>from(rm(filePath, {
|
|
28
|
+
force: true
|
|
29
|
+
})).pipe(tap(()=>{
|
|
30
|
+
telemetryStoreDebug(`Deleted file ${reason}: %s`, filePath);
|
|
31
|
+
}), catchError((error)=>{
|
|
32
|
+
telemetryStoreDebug('Error deleting file %s: %o', filePath, error);
|
|
33
|
+
// of() is not same as of(undefined) in rxjs
|
|
34
|
+
// eslint-disable-next-line unicorn/no-useless-undefined
|
|
35
|
+
return of(undefined);
|
|
36
|
+
}))), // of() is not same as of(undefined) in rxjs
|
|
37
|
+
// eslint-disable-next-line unicorn/no-useless-undefined
|
|
38
|
+
switchMap(()=>of(undefined)));
|
|
39
|
+
};
|
|
40
|
+
const flush$ = defer(()=>from(options.resolveConsent())).pipe(tap((currentConsent)=>{
|
|
41
|
+
telemetryStoreDebug('Current consent status for flush: %s', currentConsent.status);
|
|
42
|
+
}), switchMap((currentConsent)=>{
|
|
43
|
+
// First cleanup old files, then process current files
|
|
44
|
+
return defer(()=>from(cleanupOldTelemetryFiles())).pipe(switchMap(()=>defer(()=>from(findTelemetryFiles()))), switchMap((filePaths)=>{
|
|
45
|
+
if (filePaths.length === 0) {
|
|
46
|
+
telemetryStoreDebug('No telemetry files found, nothing to flush');
|
|
47
|
+
return of({
|
|
48
|
+
allEvents: [],
|
|
49
|
+
consent: currentConsent,
|
|
50
|
+
filesToDelete: []
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
telemetryStoreDebug('Found %d telemetry files to process', filePaths.length);
|
|
54
|
+
return from(filePaths).pipe(mergeMap((filePath)=>{
|
|
55
|
+
return defer(()=>from(readNDJSON(filePath))).pipe(tap((events)=>{
|
|
56
|
+
telemetryStoreDebug('Read %d events from %s', events.length, filePath);
|
|
57
|
+
}), catchError((error)=>{
|
|
58
|
+
if (error.code === 'ENOENT') {
|
|
59
|
+
telemetryStoreDebug('File %s no longer exists, skipping', filePath);
|
|
60
|
+
return of([]);
|
|
61
|
+
}
|
|
62
|
+
telemetryStoreDebug('Error reading file %s: %o', filePath, error);
|
|
63
|
+
return of([]);
|
|
64
|
+
}), switchMap((events)=>of({
|
|
65
|
+
events,
|
|
66
|
+
filePath: events.length > 0 ? filePath : ''
|
|
67
|
+
})));
|
|
68
|
+
}), reduce((acc, current)=>{
|
|
69
|
+
if (current.filePath) {
|
|
70
|
+
acc.allEvents.push(...current.events);
|
|
71
|
+
acc.filesToDelete.push(current.filePath);
|
|
72
|
+
}
|
|
73
|
+
return acc;
|
|
74
|
+
}, {
|
|
75
|
+
allEvents: [],
|
|
76
|
+
filesToDelete: []
|
|
77
|
+
}), switchMap((result)=>of({
|
|
78
|
+
...result,
|
|
79
|
+
consent: currentConsent
|
|
80
|
+
})));
|
|
81
|
+
}));
|
|
82
|
+
}), switchMap(({ allEvents, consent, filesToDelete })=>{
|
|
83
|
+
telemetryStoreDebug('Found %d total events to flush from %d files', allEvents.length, filesToDelete.length);
|
|
84
|
+
if (consent.status !== 'granted' || allEvents.length === 0) {
|
|
85
|
+
if (consent.status === 'granted') {
|
|
86
|
+
telemetryStoreDebug('No events to send, cleaning up empty files');
|
|
87
|
+
return deleteFiles(filesToDelete, 'empty files');
|
|
88
|
+
} else {
|
|
89
|
+
telemetryStoreDebug('Consent not granted (%s), cleaning up %d files without sending events', consent.status, filesToDelete.length);
|
|
90
|
+
return deleteFiles(filesToDelete, `without sending (consent: ${consent.status})`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Send events and then delete files
|
|
94
|
+
telemetryStoreDebug('Sending %d events to backend', allEvents.length);
|
|
95
|
+
return defer(()=>from(options.sendEvents(allEvents))).pipe(tap(()=>{
|
|
96
|
+
telemetryStoreDebug('Successfully sent events, deleting %d files', filesToDelete.length);
|
|
97
|
+
}), switchMap(()=>deleteFiles(filesToDelete, 'after successful send')));
|
|
98
|
+
}), tap(()=>{
|
|
99
|
+
telemetryStoreDebug('Standalone flush operation completed successfully');
|
|
100
|
+
}), switchMap(()=>of(undefined)), catchError((error)=>{
|
|
101
|
+
telemetryStoreDebug('Error during standalone flush operation: %o', error);
|
|
102
|
+
throw error;
|
|
103
|
+
}));
|
|
104
|
+
return lastValueFrom(flush$);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=flushTelemetryFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/telemetry/store/flushTelemetryFiles.ts"],"sourcesContent":["import {rm} from 'node:fs/promises'\n\nimport {type TelemetryEvent} from '@sanity/telemetry'\nimport {catchError, defer, from, lastValueFrom, mergeMap, of, reduce, switchMap, tap} from 'rxjs'\n\nimport {type ConsentInformation} from '../../actions/telemetry/types.js'\nimport {readNDJSON} from '../utils/readNDJSON.js'\nimport {cleanupOldTelemetryFiles} from './cleanupOldTelemetryFiles.js'\nimport {telemetryStoreDebug} from './debug.js'\nimport {findTelemetryFiles} from './findTelemetryFiles.js'\n\ninterface FlushTelemetryFilesOptions {\n resolveConsent: () => Promise<ConsentInformation>\n sendEvents: (events: TelemetryEvent[]) => Promise<void>\n}\n\n/**\n * Standalone, stateless function to flush telemetry files.\n *\n * This function can be used independently of the telemetry store, making it\n * suitable for use in child processes or other contexts where store state\n * is not available.\n *\n * @param options - Configuration for consent resolution and event sending\n * @returns Promise that resolves when flush operation is complete\n *\n * @internal\n */\nexport async function flushTelemetryFiles(options: FlushTelemetryFilesOptions): Promise<void> {\n telemetryStoreDebug('Starting standalone flush operation')\n\n // Helper function for deleting files with consistent error handling\n const deleteFiles = (files: string[], reason: string) => {\n if (files.length === 0) {\n // of() is not same as of(undefined) in rxjs\n // eslint-disable-next-line unicorn/no-useless-undefined\n return of(undefined)\n }\n\n return from(files).pipe(\n mergeMap((filePath) =>\n from(rm(filePath, {force: true})).pipe(\n tap(() => {\n telemetryStoreDebug(`Deleted file ${reason}: %s`, filePath)\n }),\n catchError((error) => {\n telemetryStoreDebug('Error deleting file %s: %o', filePath, error)\n // of() is not same as of(undefined) in rxjs\n // eslint-disable-next-line unicorn/no-useless-undefined\n return of(undefined)\n }),\n ),\n ),\n // of() is not same as of(undefined) in rxjs\n // eslint-disable-next-line unicorn/no-useless-undefined\n switchMap(() => of(undefined)),\n )\n }\n\n const flush$ = defer(() => from(options.resolveConsent())).pipe(\n tap((currentConsent) => {\n telemetryStoreDebug('Current consent status for flush: %s', currentConsent.status)\n }),\n switchMap((currentConsent) => {\n // First cleanup old files, then process current files\n return defer(() => from(cleanupOldTelemetryFiles())).pipe(\n switchMap(() => defer(() => from(findTelemetryFiles()))),\n switchMap((filePaths) => {\n if (filePaths.length === 0) {\n telemetryStoreDebug('No telemetry files found, nothing to flush')\n return of({allEvents: [], consent: currentConsent, filesToDelete: []})\n }\n\n telemetryStoreDebug('Found %d telemetry files to process', filePaths.length)\n\n return from(filePaths).pipe(\n mergeMap((filePath) => {\n return defer(() => from(readNDJSON<TelemetryEvent>(filePath))).pipe(\n tap((events) => {\n telemetryStoreDebug('Read %d events from %s', events.length, filePath)\n }),\n catchError((error) => {\n if ((error as {code?: string}).code === 'ENOENT') {\n telemetryStoreDebug('File %s no longer exists, skipping', filePath)\n return of([])\n }\n telemetryStoreDebug('Error reading file %s: %o', filePath, error)\n return of([])\n }),\n switchMap((events) => of({events, filePath: events.length > 0 ? filePath : ''})),\n )\n }),\n reduce(\n (acc: {allEvents: TelemetryEvent[]; filesToDelete: string[]}, current) => {\n if (current.filePath) {\n acc.allEvents.push(...current.events)\n acc.filesToDelete.push(current.filePath)\n }\n return acc\n },\n {allEvents: [], filesToDelete: []},\n ),\n switchMap((result) => of({...result, consent: currentConsent})),\n )\n }),\n )\n }),\n switchMap(({allEvents, consent, filesToDelete}) => {\n telemetryStoreDebug(\n 'Found %d total events to flush from %d files',\n allEvents.length,\n filesToDelete.length,\n )\n\n if (consent.status !== 'granted' || allEvents.length === 0) {\n if (consent.status === 'granted') {\n telemetryStoreDebug('No events to send, cleaning up empty files')\n return deleteFiles(filesToDelete, 'empty files')\n } else {\n telemetryStoreDebug(\n 'Consent not granted (%s), cleaning up %d files without sending events',\n consent.status,\n filesToDelete.length,\n )\n return deleteFiles(filesToDelete, `without sending (consent: ${consent.status})`)\n }\n }\n\n // Send events and then delete files\n telemetryStoreDebug('Sending %d events to backend', allEvents.length)\n\n return defer(() => from(options.sendEvents(allEvents))).pipe(\n tap(() => {\n telemetryStoreDebug('Successfully sent events, deleting %d files', filesToDelete.length)\n }),\n switchMap(() => deleteFiles(filesToDelete, 'after successful send')),\n )\n }),\n tap(() => {\n telemetryStoreDebug('Standalone flush operation completed successfully')\n }),\n switchMap(() => of(undefined as void)),\n catchError((error) => {\n telemetryStoreDebug('Error during standalone flush operation: %o', error)\n throw error\n }),\n )\n\n return lastValueFrom(flush$)\n}\n"],"names":["rm","catchError","defer","from","lastValueFrom","mergeMap","of","reduce","switchMap","tap","readNDJSON","cleanupOldTelemetryFiles","telemetryStoreDebug","findTelemetryFiles","flushTelemetryFiles","options","deleteFiles","files","reason","length","undefined","pipe","filePath","force","error","flush$","resolveConsent","currentConsent","status","filePaths","allEvents","consent","filesToDelete","events","code","acc","current","push","result","sendEvents"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates a unique telemetry file path for a specific CLI session.
|
|
3
|
+
*
|
|
4
|
+
* File format: `telemetry-\{hashedToken\}-\{env\}-\{sessionId\}.ndjson`
|
|
5
|
+
*
|
|
6
|
+
* The sessionId ensures each CLI process writes to its own file, preventing:
|
|
7
|
+
* - File write conflicts when multiple CLI commands run concurrently
|
|
8
|
+
* - Race conditions during file operations
|
|
9
|
+
* - Data corruption from simultaneous writes
|
|
10
|
+
*
|
|
11
|
+
* During flush, all session files are discovered and aggregated together.
|
|
12
|
+
*
|
|
13
|
+
* @param sessionId - Unique identifier for this CLI session
|
|
14
|
+
* @returns Promise resolving to the full file path for this session's telemetry
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateTelemetryFilePath(sessionId: string): Promise<string>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { telemetryStoreDebug } from './debug.js';
|
|
3
|
+
import { getTelemetryBaseInfo } from './getTelemetryBaseInfo.js';
|
|
4
|
+
/**
|
|
5
|
+
* Generates a unique telemetry file path for a specific CLI session.
|
|
6
|
+
*
|
|
7
|
+
* File format: `telemetry-\{hashedToken\}-\{env\}-\{sessionId\}.ndjson`
|
|
8
|
+
*
|
|
9
|
+
* The sessionId ensures each CLI process writes to its own file, preventing:
|
|
10
|
+
* - File write conflicts when multiple CLI commands run concurrently
|
|
11
|
+
* - Race conditions during file operations
|
|
12
|
+
* - Data corruption from simultaneous writes
|
|
13
|
+
*
|
|
14
|
+
* During flush, all session files are discovered and aggregated together.
|
|
15
|
+
*
|
|
16
|
+
* @param sessionId - Unique identifier for this CLI session
|
|
17
|
+
* @returns Promise resolving to the full file path for this session's telemetry
|
|
18
|
+
* @internal
|
|
19
|
+
*/ export async function generateTelemetryFilePath(sessionId) {
|
|
20
|
+
telemetryStoreDebug('Generating telemetry file path for sessionId: %s', sessionId);
|
|
21
|
+
const { basePattern, directory, environment, hashedToken } = await getTelemetryBaseInfo();
|
|
22
|
+
telemetryStoreDebug('Generated token hash: %s', hashedToken);
|
|
23
|
+
telemetryStoreDebug('Detected environment: %s', environment);
|
|
24
|
+
const fileName = `${basePattern}-${sessionId}.ndjson`;
|
|
25
|
+
const filePath = join(directory, fileName);
|
|
26
|
+
telemetryStoreDebug('Telemetry file path: %s', filePath);
|
|
27
|
+
return filePath;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=generateTelemetryFilePath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/telemetry/store/generateTelemetryFilePath.ts"],"sourcesContent":["import {join} from 'node:path'\n\nimport {telemetryStoreDebug} from './debug.js'\nimport {getTelemetryBaseInfo} from './getTelemetryBaseInfo.js'\n\n/**\n * Generates a unique telemetry file path for a specific CLI session.\n *\n * File format: `telemetry-\\{hashedToken\\}-\\{env\\}-\\{sessionId\\}.ndjson`\n *\n * The sessionId ensures each CLI process writes to its own file, preventing:\n * - File write conflicts when multiple CLI commands run concurrently\n * - Race conditions during file operations\n * - Data corruption from simultaneous writes\n *\n * During flush, all session files are discovered and aggregated together.\n *\n * @param sessionId - Unique identifier for this CLI session\n * @returns Promise resolving to the full file path for this session's telemetry\n * @internal\n */\nexport async function generateTelemetryFilePath(sessionId: string): Promise<string> {\n telemetryStoreDebug('Generating telemetry file path for sessionId: %s', sessionId)\n\n const {basePattern, directory, environment, hashedToken} = await getTelemetryBaseInfo()\n\n telemetryStoreDebug('Generated token hash: %s', hashedToken)\n telemetryStoreDebug('Detected environment: %s', environment)\n\n const fileName = `${basePattern}-${sessionId}.ndjson`\n const filePath = join(directory, fileName)\n telemetryStoreDebug('Telemetry file path: %s', filePath)\n\n return filePath\n}\n"],"names":["join","telemetryStoreDebug","getTelemetryBaseInfo","generateTelemetryFilePath","sessionId","basePattern","directory","environment","hashedToken","fileName","filePath"],"mappings":"AAAA,SAAQA,IAAI,QAAO,YAAW;AAE9B,SAAQC,mBAAmB,QAAO,aAAY;AAC9C,SAAQC,oBAAoB,QAAO,4BAA2B;AAE9D;;;;;;;;;;;;;;;CAeC,GACD,OAAO,eAAeC,0BAA0BC,SAAiB;IAC/DH,oBAAoB,oDAAoDG;IAExE,MAAM,EAACC,WAAW,EAAEC,SAAS,EAAEC,WAAW,EAAEC,WAAW,EAAC,GAAG,MAAMN;IAEjED,oBAAoB,4BAA4BO;IAChDP,oBAAoB,4BAA4BM;IAEhD,MAAME,WAAW,GAAGJ,YAAY,CAAC,EAAED,UAAU,OAAO,CAAC;IACrD,MAAMM,WAAWV,KAAKM,WAAWG;IACjCR,oBAAoB,2BAA2BS;IAE/C,OAAOA;AACT"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base information needed for telemetry file operations.
|
|
3
|
+
* Contains common data used by both file path generation and pattern matching.
|
|
4
|
+
*/
|
|
5
|
+
interface TelemetryBaseInfo {
|
|
6
|
+
/** Base filename pattern without sessionId suffix */
|
|
7
|
+
basePattern: string;
|
|
8
|
+
/** Base directory where telemetry files are stored */
|
|
9
|
+
directory: string;
|
|
10
|
+
/** Environment: 'staging' or 'production' */
|
|
11
|
+
environment: string;
|
|
12
|
+
/** Hashed token (first 8 chars of SHA256) for privacy */
|
|
13
|
+
hashedToken: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Gets the base telemetry information needed for file operations.
|
|
17
|
+
*
|
|
18
|
+
* This shared utility extracts common logic used by:
|
|
19
|
+
* - `generateTelemetryFilePath` - for generating session-specific file paths
|
|
20
|
+
* - `findTelemetryFiles` - for discovering all telemetry files via glob patterns
|
|
21
|
+
*
|
|
22
|
+
* @returns Promise resolving to base telemetry information
|
|
23
|
+
* @throws Error if no auth token is found
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export declare function getTelemetryBaseInfo(): Promise<TelemetryBaseInfo>;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { getCliToken } from '@sanity/cli-core';
|
|
5
|
+
import { isStaging } from '../../util/isStaging.js';
|
|
6
|
+
/**
|
|
7
|
+
* Gets the base telemetry information needed for file operations.
|
|
8
|
+
*
|
|
9
|
+
* This shared utility extracts common logic used by:
|
|
10
|
+
* - `generateTelemetryFilePath` - for generating session-specific file paths
|
|
11
|
+
* - `findTelemetryFiles` - for discovering all telemetry files via glob patterns
|
|
12
|
+
*
|
|
13
|
+
* @returns Promise resolving to base telemetry information
|
|
14
|
+
* @throws Error if no auth token is found
|
|
15
|
+
* @internal
|
|
16
|
+
*/ export async function getTelemetryBaseInfo() {
|
|
17
|
+
const token = await getCliToken();
|
|
18
|
+
if (!token) {
|
|
19
|
+
throw new Error('No auth token found - user must be logged in for telemetry');
|
|
20
|
+
}
|
|
21
|
+
const hashedToken = createHash('sha256').update(token).digest('hex').slice(0, 8);
|
|
22
|
+
const environment = isStaging() ? 'staging' : 'production';
|
|
23
|
+
// TODO: Change to use temp directory
|
|
24
|
+
const directory = join(homedir(), '.config', 'sanity');
|
|
25
|
+
const basePattern = `telemetry-${hashedToken}-${environment}`;
|
|
26
|
+
return {
|
|
27
|
+
basePattern,
|
|
28
|
+
directory,
|
|
29
|
+
environment,
|
|
30
|
+
hashedToken
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=getTelemetryBaseInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/telemetry/store/getTelemetryBaseInfo.ts"],"sourcesContent":["import {createHash} from 'node:crypto'\nimport {homedir} from 'node:os'\nimport {join} from 'node:path'\n\nimport {getCliToken} from '@sanity/cli-core'\n\nimport {isStaging} from '../../util/isStaging.js'\n\n/**\n * Base information needed for telemetry file operations.\n * Contains common data used by both file path generation and pattern matching.\n */\ninterface TelemetryBaseInfo {\n /** Base filename pattern without sessionId suffix */\n basePattern: string\n /** Base directory where telemetry files are stored */\n directory: string\n /** Environment: 'staging' or 'production' */\n environment: string\n /** Hashed token (first 8 chars of SHA256) for privacy */\n hashedToken: string\n}\n\n/**\n * Gets the base telemetry information needed for file operations.\n *\n * This shared utility extracts common logic used by:\n * - `generateTelemetryFilePath` - for generating session-specific file paths\n * - `findTelemetryFiles` - for discovering all telemetry files via glob patterns\n *\n * @returns Promise resolving to base telemetry information\n * @throws Error if no auth token is found\n * @internal\n */\nexport async function getTelemetryBaseInfo(): Promise<TelemetryBaseInfo> {\n const token = await getCliToken()\n if (!token) {\n throw new Error('No auth token found - user must be logged in for telemetry')\n }\n\n const hashedToken = createHash('sha256').update(token).digest('hex').slice(0, 8)\n const environment = isStaging() ? 'staging' : 'production'\n // TODO: Change to use temp directory\n const directory = join(homedir(), '.config', 'sanity')\n const basePattern = `telemetry-${hashedToken}-${environment}`\n\n return {\n basePattern,\n directory,\n environment,\n hashedToken,\n }\n}\n"],"names":["createHash","homedir","join","getCliToken","isStaging","getTelemetryBaseInfo","token","Error","hashedToken","update","digest","slice","environment","directory","basePattern"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,OAAO,QAAO,UAAS;AAC/B,SAAQC,IAAI,QAAO,YAAW;AAE9B,SAAQC,WAAW,QAAO,mBAAkB;AAE5C,SAAQC,SAAS,QAAO,0BAAyB;AAiBjD;;;;;;;;;;CAUC,GACD,OAAO,eAAeC;IACpB,MAAMC,QAAQ,MAAMH;IACpB,IAAI,CAACG,OAAO;QACV,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAMC,cAAcR,WAAW,UAAUS,MAAM,CAACH,OAAOI,MAAM,CAAC,OAAOC,KAAK,CAAC,GAAG;IAC9E,MAAMC,cAAcR,cAAc,YAAY;IAC9C,qCAAqC;IACrC,MAAMS,YAAYX,KAAKD,WAAW,WAAW;IAC7C,MAAMa,cAAc,CAAC,UAAU,EAAEN,YAAY,CAAC,EAAEI,aAAa;IAE7D,OAAO;QACLE;QACAD;QACAD;QACAJ;IACF;AACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TelemetryEvent, type TelemetryLogger } from '@sanity/telemetry';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a telemetry logger that emits events via the provided emit function
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare function createLogger<UserProperties>(sessionId: string, emit: (event: TelemetryEvent) => void): TelemetryLogger<UserProperties>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { telemetryStoreDebug } from './debug.js';
|
|
2
|
+
import { createTrace } from './trace.js';
|
|
3
|
+
// Sample rate tracking for log events
|
|
4
|
+
const logSampleTracker = new Map();
|
|
5
|
+
/**
|
|
6
|
+
* Creates a telemetry logger that emits events via the provided emit function
|
|
7
|
+
* @internal
|
|
8
|
+
*/ export function createLogger(sessionId, emit) {
|
|
9
|
+
telemetryStoreDebug('Creating logger for session: %s', sessionId);
|
|
10
|
+
const log = (event, data)=>{
|
|
11
|
+
telemetryStoreDebug('Logging event: %s', event.name);
|
|
12
|
+
// Handle sampling if maxSampleRate is specified
|
|
13
|
+
if (event.maxSampleRate && event.maxSampleRate > 0) {
|
|
14
|
+
const now = Date.now();
|
|
15
|
+
const lastEmit = logSampleTracker.get(event.name) || 0;
|
|
16
|
+
if (now - lastEmit < event.maxSampleRate) {
|
|
17
|
+
telemetryStoreDebug('Skipping event %s due to sampling (maxSampleRate: %d)', event.name, event.maxSampleRate);
|
|
18
|
+
return; // Skip due to sampling
|
|
19
|
+
}
|
|
20
|
+
logSampleTracker.set(event.name, now);
|
|
21
|
+
telemetryStoreDebug('Event %s passed sampling check', event.name);
|
|
22
|
+
}
|
|
23
|
+
const logEvent = {
|
|
24
|
+
createdAt: new Date().toISOString(),
|
|
25
|
+
data: data ?? null,
|
|
26
|
+
name: event.name,
|
|
27
|
+
sessionId,
|
|
28
|
+
type: 'log',
|
|
29
|
+
version: event.version
|
|
30
|
+
};
|
|
31
|
+
emit(logEvent);
|
|
32
|
+
};
|
|
33
|
+
const trace = (event, context)=>{
|
|
34
|
+
telemetryStoreDebug('Creating trace: %s', event.name);
|
|
35
|
+
return createTrace(event, context, sessionId, emit, createLogger);
|
|
36
|
+
};
|
|
37
|
+
const updateUserProperties = (properties)=>{
|
|
38
|
+
telemetryStoreDebug('Updating user properties: %o', properties);
|
|
39
|
+
const userPropsEvent = {
|
|
40
|
+
createdAt: new Date().toISOString(),
|
|
41
|
+
properties,
|
|
42
|
+
sessionId,
|
|
43
|
+
type: 'userProperties'
|
|
44
|
+
};
|
|
45
|
+
emit(userPropsEvent);
|
|
46
|
+
};
|
|
47
|
+
return {
|
|
48
|
+
log,
|
|
49
|
+
trace,
|
|
50
|
+
updateUserProperties
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/telemetry/store/logger.ts"],"sourcesContent":["import {\n type DefinedTelemetryLog,\n type DefinedTelemetryTrace,\n type TelemetryEvent,\n type TelemetryLogger,\n type TelemetryTrace,\n} from '@sanity/telemetry'\n\nimport {telemetryStoreDebug} from './debug.js'\nimport {createTrace} from './trace.js'\n\n// Sample rate tracking for log events\nconst logSampleTracker = new Map<string, number>()\n\n/**\n * Creates a telemetry logger that emits events via the provided emit function\n * @internal\n */\nexport function createLogger<UserProperties>(\n sessionId: string,\n emit: (event: TelemetryEvent) => void,\n): TelemetryLogger<UserProperties> {\n telemetryStoreDebug('Creating logger for session: %s', sessionId)\n\n const log = <Data>(event: DefinedTelemetryLog<Data>, data?: Data) => {\n telemetryStoreDebug('Logging event: %s', event.name)\n\n // Handle sampling if maxSampleRate is specified\n if (event.maxSampleRate && event.maxSampleRate > 0) {\n const now = Date.now()\n const lastEmit = logSampleTracker.get(event.name) || 0\n\n if (now - lastEmit < event.maxSampleRate) {\n telemetryStoreDebug(\n 'Skipping event %s due to sampling (maxSampleRate: %d)',\n event.name,\n event.maxSampleRate,\n )\n return // Skip due to sampling\n }\n\n logSampleTracker.set(event.name, now)\n telemetryStoreDebug('Event %s passed sampling check', event.name)\n }\n\n const logEvent: TelemetryEvent = {\n createdAt: new Date().toISOString(),\n data: data ?? null,\n name: event.name,\n sessionId,\n type: 'log',\n version: event.version,\n }\n\n emit(logEvent)\n }\n\n const trace = <Data, Context = unknown>(\n event: DefinedTelemetryTrace<Data, Context>,\n context?: Context,\n ): TelemetryTrace<UserProperties, Data> => {\n telemetryStoreDebug('Creating trace: %s', event.name)\n return createTrace(event, context, sessionId, emit, createLogger)\n }\n\n const updateUserProperties = (properties: UserProperties) => {\n telemetryStoreDebug('Updating user properties: %o', properties)\n const userPropsEvent: TelemetryEvent = {\n createdAt: new Date().toISOString(),\n properties,\n sessionId,\n type: 'userProperties',\n }\n\n emit(userPropsEvent)\n }\n\n return {\n log,\n trace,\n updateUserProperties,\n }\n}\n"],"names":["telemetryStoreDebug","createTrace","logSampleTracker","Map","createLogger","sessionId","emit","log","event","data","name","maxSampleRate","now","Date","lastEmit","get","set","logEvent","createdAt","toISOString","type","version","trace","context","updateUserProperties","properties","userPropsEvent"],"mappings":"AAQA,SAAQA,mBAAmB,QAAO,aAAY;AAC9C,SAAQC,WAAW,QAAO,aAAY;AAEtC,sCAAsC;AACtC,MAAMC,mBAAmB,IAAIC;AAE7B;;;CAGC,GACD,OAAO,SAASC,aACdC,SAAiB,EACjBC,IAAqC;IAErCN,oBAAoB,mCAAmCK;IAEvD,MAAME,MAAM,CAAOC,OAAkCC;QACnDT,oBAAoB,qBAAqBQ,MAAME,IAAI;QAEnD,gDAAgD;QAChD,IAAIF,MAAMG,aAAa,IAAIH,MAAMG,aAAa,GAAG,GAAG;YAClD,MAAMC,MAAMC,KAAKD,GAAG;YACpB,MAAME,WAAWZ,iBAAiBa,GAAG,CAACP,MAAME,IAAI,KAAK;YAErD,IAAIE,MAAME,WAAWN,MAAMG,aAAa,EAAE;gBACxCX,oBACE,yDACAQ,MAAME,IAAI,EACVF,MAAMG,aAAa;gBAErB,QAAO,uBAAuB;YAChC;YAEAT,iBAAiBc,GAAG,CAACR,MAAME,IAAI,EAAEE;YACjCZ,oBAAoB,kCAAkCQ,MAAME,IAAI;QAClE;QAEA,MAAMO,WAA2B;YAC/BC,WAAW,IAAIL,OAAOM,WAAW;YACjCV,MAAMA,QAAQ;YACdC,MAAMF,MAAME,IAAI;YAChBL;YACAe,MAAM;YACNC,SAASb,MAAMa,OAAO;QACxB;QAEAf,KAAKW;IACP;IAEA,MAAMK,QAAQ,CACZd,OACAe;QAEAvB,oBAAoB,sBAAsBQ,MAAME,IAAI;QACpD,OAAOT,YAAYO,OAAOe,SAASlB,WAAWC,MAAMF;IACtD;IAEA,MAAMoB,uBAAuB,CAACC;QAC5BzB,oBAAoB,gCAAgCyB;QACpD,MAAMC,iBAAiC;YACrCR,WAAW,IAAIL,OAAOM,WAAW;YACjCM;YACApB;YACAe,MAAM;QACR;QAEAd,KAAKoB;IACP;IAEA,OAAO;QACLnB;QACAe;QACAE;IACF;AACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type DefinedTelemetryTrace, type TelemetryEvent, type TelemetryLogger, type TelemetryTrace } from '@sanity/telemetry';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a trace instance that can emit trace lifecycle events
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare function createTrace<Data, Context = unknown, UserProperties = unknown>(definition: DefinedTelemetryTrace<Data, Context>, context: Context | undefined, sessionId: string, emit: (event: TelemetryEvent) => void, createLoggerFn: <UserProperties>(sessionId: string, emit: (event: TelemetryEvent) => void) => TelemetryLogger<UserProperties>): TelemetryTrace<UserProperties, Data>;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { createTraceId } from './createTraceId.js';
|
|
2
|
+
import { telemetryStoreDebug } from './debug.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a trace instance that can emit trace lifecycle events
|
|
5
|
+
* @internal
|
|
6
|
+
*/ export function createTrace(definition, context, sessionId, emit, createLoggerFn) {
|
|
7
|
+
const traceId = createTraceId();
|
|
8
|
+
telemetryStoreDebug('Creating trace %s with traceId: %s', definition.name, traceId);
|
|
9
|
+
let isStarted = false;
|
|
10
|
+
let isCompleted = false;
|
|
11
|
+
const emitTraceEvent = (type, data)=>{
|
|
12
|
+
if (isCompleted && type !== 'trace.start') return;
|
|
13
|
+
const baseEvent = {
|
|
14
|
+
context: context,
|
|
15
|
+
createdAt: new Date().toISOString(),
|
|
16
|
+
name: definition.name,
|
|
17
|
+
sessionId,
|
|
18
|
+
traceId,
|
|
19
|
+
version: definition.version
|
|
20
|
+
};
|
|
21
|
+
let traceEvent;
|
|
22
|
+
switch(type){
|
|
23
|
+
case 'trace.complete':
|
|
24
|
+
{
|
|
25
|
+
traceEvent = {
|
|
26
|
+
...baseEvent,
|
|
27
|
+
type: 'trace.complete',
|
|
28
|
+
...data && {
|
|
29
|
+
data
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
case 'trace.error':
|
|
35
|
+
{
|
|
36
|
+
traceEvent = {
|
|
37
|
+
...baseEvent,
|
|
38
|
+
data,
|
|
39
|
+
type: 'trace.error'
|
|
40
|
+
};
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case 'trace.log':
|
|
44
|
+
{
|
|
45
|
+
traceEvent = {
|
|
46
|
+
...baseEvent,
|
|
47
|
+
data,
|
|
48
|
+
type: 'trace.log'
|
|
49
|
+
};
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case 'trace.start':
|
|
53
|
+
{
|
|
54
|
+
traceEvent = {
|
|
55
|
+
...baseEvent,
|
|
56
|
+
type: 'trace.start'
|
|
57
|
+
};
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
default:
|
|
61
|
+
{
|
|
62
|
+
return; // Unknown type
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
emit(traceEvent);
|
|
66
|
+
};
|
|
67
|
+
const start = ()=>{
|
|
68
|
+
if (isStarted) {
|
|
69
|
+
telemetryStoreDebug('Trace %s already started', traceId);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
telemetryStoreDebug('Starting trace %s', traceId);
|
|
73
|
+
isStarted = true;
|
|
74
|
+
emitTraceEvent('trace.start');
|
|
75
|
+
};
|
|
76
|
+
const log = (data)=>{
|
|
77
|
+
telemetryStoreDebug('Logging data for trace %s', traceId);
|
|
78
|
+
if (!isStarted) start();
|
|
79
|
+
emitTraceEvent('trace.log', data);
|
|
80
|
+
};
|
|
81
|
+
const complete = ()=>{
|
|
82
|
+
if (isCompleted) {
|
|
83
|
+
telemetryStoreDebug('Trace %s already completed', traceId);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
telemetryStoreDebug('Completing trace %s', traceId);
|
|
87
|
+
if (!isStarted) start();
|
|
88
|
+
emitTraceEvent('trace.complete');
|
|
89
|
+
isCompleted = true;
|
|
90
|
+
};
|
|
91
|
+
const error = (err)=>{
|
|
92
|
+
if (isCompleted) {
|
|
93
|
+
telemetryStoreDebug('Trace %s already completed, ignoring error', traceId);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
telemetryStoreDebug('Error in trace %s: %s', traceId, err.message);
|
|
97
|
+
if (!isStarted) start();
|
|
98
|
+
// Convert Error to serializable object
|
|
99
|
+
const errorData = {
|
|
100
|
+
message: err.message,
|
|
101
|
+
name: err.name,
|
|
102
|
+
stack: err.stack
|
|
103
|
+
};
|
|
104
|
+
emitTraceEvent('trace.error', errorData);
|
|
105
|
+
isCompleted = true;
|
|
106
|
+
};
|
|
107
|
+
const awaitPromise = (promise, finalData)=>{
|
|
108
|
+
if (!isStarted) start();
|
|
109
|
+
return promise.then((result)=>{
|
|
110
|
+
if (finalData !== undefined) {
|
|
111
|
+
log(finalData);
|
|
112
|
+
}
|
|
113
|
+
complete();
|
|
114
|
+
return result;
|
|
115
|
+
}).catch((err)=>{
|
|
116
|
+
error(err);
|
|
117
|
+
throw err;
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
const newContext = (name)=>{
|
|
121
|
+
const contextEmit = (event)=>{
|
|
122
|
+
// For trace events, we can add context, but for log events we need to be careful
|
|
123
|
+
if (event.type.startsWith('trace.')) {
|
|
124
|
+
const existingContext = event.context;
|
|
125
|
+
emit({
|
|
126
|
+
...event,
|
|
127
|
+
context: {
|
|
128
|
+
...typeof existingContext === 'object' && existingContext ? existingContext : {},
|
|
129
|
+
contextName: name
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
} else {
|
|
133
|
+
// For log events, we can't add context as it's not part of TelemetryLogEvent
|
|
134
|
+
// Just emit as-is
|
|
135
|
+
emit(event);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
return createLoggerFn(sessionId, contextEmit);
|
|
139
|
+
};
|
|
140
|
+
return {
|
|
141
|
+
await: awaitPromise,
|
|
142
|
+
complete,
|
|
143
|
+
error,
|
|
144
|
+
log,
|
|
145
|
+
newContext,
|
|
146
|
+
start
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/telemetry/store/trace.ts"],"sourcesContent":["import {\n type DefinedTelemetryTrace,\n type TelemetryEvent,\n type TelemetryLogger,\n type TelemetryTrace,\n} from '@sanity/telemetry'\n\nimport {createTraceId} from './createTraceId.js'\nimport {telemetryStoreDebug} from './debug.js'\n\n/**\n * Creates a trace instance that can emit trace lifecycle events\n * @internal\n */\nexport function createTrace<Data, Context = unknown, UserProperties = unknown>(\n definition: DefinedTelemetryTrace<Data, Context>,\n context: Context | undefined,\n sessionId: string,\n emit: (event: TelemetryEvent) => void,\n createLoggerFn: <UserProperties>(\n sessionId: string,\n emit: (event: TelemetryEvent) => void,\n ) => TelemetryLogger<UserProperties>,\n): TelemetryTrace<UserProperties, Data> {\n const traceId = createTraceId()\n telemetryStoreDebug('Creating trace %s with traceId: %s', definition.name, traceId)\n\n let isStarted = false\n let isCompleted = false\n\n const emitTraceEvent = (type: string, data?: Data | Error) => {\n if (isCompleted && type !== 'trace.start') return\n\n const baseEvent = {\n context: context as Context,\n createdAt: new Date().toISOString(),\n name: definition.name,\n sessionId,\n traceId,\n version: definition.version,\n }\n\n let traceEvent: TelemetryEvent\n\n switch (type) {\n case 'trace.complete': {\n traceEvent = {\n ...baseEvent,\n type: 'trace.complete',\n ...(data && {data}),\n } as TelemetryEvent\n\n break\n }\n case 'trace.error': {\n traceEvent = {\n ...baseEvent,\n data,\n type: 'trace.error',\n } as TelemetryEvent\n\n break\n }\n case 'trace.log': {\n traceEvent = {\n ...baseEvent,\n data,\n type: 'trace.log',\n } as TelemetryEvent\n\n break\n }\n case 'trace.start': {\n traceEvent = {\n ...baseEvent,\n type: 'trace.start',\n } as TelemetryEvent\n\n break\n }\n default: {\n return // Unknown type\n }\n }\n\n emit(traceEvent)\n }\n\n const start = () => {\n if (isStarted) {\n telemetryStoreDebug('Trace %s already started', traceId)\n return\n }\n telemetryStoreDebug('Starting trace %s', traceId)\n isStarted = true\n emitTraceEvent('trace.start')\n }\n\n const log = (data: Data) => {\n telemetryStoreDebug('Logging data for trace %s', traceId)\n if (!isStarted) start()\n emitTraceEvent('trace.log', data)\n }\n\n const complete = () => {\n if (isCompleted) {\n telemetryStoreDebug('Trace %s already completed', traceId)\n return\n }\n telemetryStoreDebug('Completing trace %s', traceId)\n if (!isStarted) start()\n emitTraceEvent('trace.complete')\n isCompleted = true\n }\n\n const error = (err: Error) => {\n if (isCompleted) {\n telemetryStoreDebug('Trace %s already completed, ignoring error', traceId)\n return\n }\n telemetryStoreDebug('Error in trace %s: %s', traceId, err.message)\n if (!isStarted) start()\n // Convert Error to serializable object\n const errorData = {\n message: err.message,\n name: err.name,\n stack: err.stack,\n }\n emitTraceEvent('trace.error', errorData)\n isCompleted = true\n }\n\n const awaitPromise = <P extends Promise<unknown>>(promise: P, finalData?: Data): P => {\n if (!isStarted) start()\n\n return promise\n .then((result) => {\n if (finalData !== undefined) {\n log(finalData)\n }\n complete()\n return result\n })\n .catch((err) => {\n error(err)\n throw err\n }) as P\n }\n\n const newContext = (name: string): TelemetryLogger<UserProperties> => {\n const contextEmit = (event: TelemetryEvent) => {\n // For trace events, we can add context, but for log events we need to be careful\n if (event.type.startsWith('trace.')) {\n const existingContext = (event as {context?: unknown}).context\n emit({\n ...event,\n context: {\n ...(typeof existingContext === 'object' && existingContext ? existingContext : {}),\n contextName: name,\n },\n } as TelemetryEvent)\n } else {\n // For log events, we can't add context as it's not part of TelemetryLogEvent\n // Just emit as-is\n emit(event)\n }\n }\n\n return createLoggerFn<UserProperties>(sessionId, contextEmit)\n }\n\n return {\n await: awaitPromise,\n complete,\n error,\n log,\n newContext,\n start,\n }\n}\n"],"names":["createTraceId","telemetryStoreDebug","createTrace","definition","context","sessionId","emit","createLoggerFn","traceId","name","isStarted","isCompleted","emitTraceEvent","type","data","baseEvent","createdAt","Date","toISOString","version","traceEvent","start","log","complete","error","err","message","errorData","stack","awaitPromise","promise","finalData","then","result","undefined","catch","newContext","contextEmit","event","startsWith","existingContext","contextName","await"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads and parses an NDJSON (newline-delimited JSON) file containing telemetry events.
|
|
3
|
+
*
|
|
4
|
+
* @param filePath - Path to the NDJSON file
|
|
5
|
+
* @returns Promise resolving to array of parsed telemetry events
|
|
6
|
+
* @throws Error if file cannot be read or contains invalid JSON
|
|
7
|
+
*
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export declare function readNDJSON<T>(filePath: string): Promise<T[]>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
/**
|
|
3
|
+
* Reads and parses an NDJSON (newline-delimited JSON) file containing telemetry events.
|
|
4
|
+
*
|
|
5
|
+
* @param filePath - Path to the NDJSON file
|
|
6
|
+
* @returns Promise resolving to array of parsed telemetry events
|
|
7
|
+
* @throws Error if file cannot be read or contains invalid JSON
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/ export async function readNDJSON(filePath) {
|
|
11
|
+
const content = await readFile(filePath, 'utf8');
|
|
12
|
+
if (!content.trim()) {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
return content.trim().split('\n').filter(Boolean).map((line)=>JSON.parse(line));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=readNDJSON.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/telemetry/utils/readNDJSON.ts"],"sourcesContent":["import {readFile} from 'node:fs/promises'\n\n/**\n * Reads and parses an NDJSON (newline-delimited JSON) file containing telemetry events.\n *\n * @param filePath - Path to the NDJSON file\n * @returns Promise resolving to array of parsed telemetry events\n * @throws Error if file cannot be read or contains invalid JSON\n *\n * @internal\n */\nexport async function readNDJSON<T>(filePath: string): Promise<T[]> {\n const content = await readFile(filePath, 'utf8')\n\n if (!content.trim()) {\n return []\n }\n\n return content\n .trim()\n .split('\\n')\n .filter(Boolean)\n .map((line) => JSON.parse(line) as T)\n}\n"],"names":["readFile","readNDJSON","filePath","content","trim","split","filter","Boolean","map","line","JSON","parse"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AAEzC;;;;;;;;CAQC,GACD,OAAO,eAAeC,WAAcC,QAAgB;IAClD,MAAMC,UAAU,MAAMH,SAASE,UAAU;IAEzC,IAAI,CAACC,QAAQC,IAAI,IAAI;QACnB,OAAO,EAAE;IACX;IAEA,OAAOD,QACJC,IAAI,GACJC,KAAK,CAAC,MACNC,MAAM,CAACC,SACPC,GAAG,CAAC,CAACC,OAASC,KAAKC,KAAK,CAACF;AAC9B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect the runtime environment.
|
|
3
|
+
*
|
|
4
|
+
* @returns The runtime environment.
|
|
5
|
+
*
|
|
6
|
+
* @internal
|
|
7
|
+
*/ export function detectRuntime() {
|
|
8
|
+
if ('Deno' in globalThis) {
|
|
9
|
+
return 'deno';
|
|
10
|
+
}
|
|
11
|
+
if ('Bun' in globalThis) {
|
|
12
|
+
return 'bun';
|
|
13
|
+
}
|
|
14
|
+
// Consider using a more reliable way of detecting that we're actually in Node.js
|
|
15
|
+
// I first attempted using https://www.npmjs.com/package/is-really-node, but it fails
|
|
16
|
+
// due to using top level await.
|
|
17
|
+
return 'node';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=detectRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/util/detectRuntime.ts"],"sourcesContent":["/**\n * Detect the runtime environment.\n *\n * @returns The runtime environment.\n *\n * @internal\n */\nexport function detectRuntime(): 'bun' | 'deno' | 'node' {\n if ('Deno' in globalThis) {\n return 'deno'\n }\n if ('Bun' in globalThis) {\n return 'bun'\n }\n // Consider using a more reliable way of detecting that we're actually in Node.js\n // I first attempted using https://www.npmjs.com/package/is-really-node, but it fails\n // due to using top level await.\n return 'node'\n}\n"],"names":["detectRuntime","globalThis"],"mappings":"AAAA;;;;;;CAMC,GACD,OAAO,SAASA;IACd,IAAI,UAAUC,YAAY;QACxB,OAAO;IACT;IACA,IAAI,SAASA,YAAY;QACvB,OAAO;IACT;IACA,iFAAiF;IACjF,qFAAqF;IACrF,gCAAgC;IAChC,OAAO;AACT"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks if the environment is staging.
|
|
3
|
+
*
|
|
4
|
+
* @returns True if the environment is staging, false otherwise
|
|
5
|
+
* @internal
|
|
6
|
+
*/ export function isStaging() {
|
|
7
|
+
return process.env.SANITY_INTERNAL_ENV === 'staging';
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=isStaging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/util/isStaging.ts"],"sourcesContent":["/**\n * Checks if the environment is staging.\n *\n * @returns True if the environment is staging, false otherwise\n * @internal\n */\nexport function isStaging(): boolean {\n return process.env.SANITY_INTERNAL_ENV === 'staging'\n}\n"],"names":["isStaging","process","env","SANITY_INTERNAL_ENV"],"mappings":"AAAA;;;;;CAKC,GACD,OAAO,SAASA;IACd,OAAOC,QAAQC,GAAG,CAACC,mBAAmB,KAAK;AAC7C"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
interface ParsedArguments<F = Record<string, string>> {
|
|
2
|
+
/**
|
|
3
|
+
* Command arguments, eg any arguments after `sanity <command>` (no flags)
|
|
4
|
+
*/
|
|
5
|
+
argsWithoutOptions: string[];
|
|
6
|
+
argv: string[];
|
|
7
|
+
/**
|
|
8
|
+
* Options mostly relevant for the core CLI runner
|
|
9
|
+
*/
|
|
10
|
+
coreOptions: {
|
|
11
|
+
debug: boolean;
|
|
12
|
+
help: boolean;
|
|
13
|
+
version: boolean;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Command flags, without the core options (help, debug, version etc)
|
|
17
|
+
*/
|
|
18
|
+
extOptions: F;
|
|
19
|
+
/**
|
|
20
|
+
* Arguments after the ended argument list (--)
|
|
21
|
+
*/
|
|
22
|
+
extraArguments: string[];
|
|
23
|
+
/**
|
|
24
|
+
* Group or command name, eg `dataset` (`sanity dataset`) or `import` (`sanity dataset import`)
|
|
25
|
+
*/
|
|
26
|
+
groupOrCommand: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse the arguments from the command line
|
|
30
|
+
*
|
|
31
|
+
* @param argv - The arguments from the command line
|
|
32
|
+
* @returns The parsed arguments
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseArguments(argv?: string[]): ParsedArguments;
|
|
35
|
+
export {};
|